mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
Merge branch 'net-phy-microchip_t1s-add-support-for-lan867x-rev-d0-phy'
Parthiban Veerasooran says: ==================== net: phy: microchip_t1s: Add support for LAN867x Rev.D0 PHY This patch series adds support for the latest Microchip LAN8670/1/2 Rev.D0 10BASE-T1S PHYs to the microchip_t1s driver. The new Rev.D0 silicon introduces updated initialization requirements and link status handling behavior compared to earlier revisions (Rev.C2 and below). These updates are necessary for full compliance with the OPEN Alliance 10BASE-T1S specification and are documented in Microchip Application Note AN1699 Revision G (DS60001699G – October 2025). Summary of changes: - Implements Rev.D0-specific configuration sequence as described in AN1699 Rev.G. - Introduces link status control configuration for LAN867x Rev.D0. ==================== Link: https://patch.msgid.link/20251030102258.180061-1-parthiban.veerasooran@microchip.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
@@ -308,7 +308,7 @@ config MICREL_PHY
|
||||
config MICROCHIP_T1S_PHY
|
||||
tristate "Microchip 10BASE-T1S Ethernet PHYs"
|
||||
help
|
||||
Currently supports the LAN8670/1/2 Rev.B1/C1/C2 and
|
||||
Currently supports the LAN8670/1/2 Rev.B1/C1/C2/D0 and
|
||||
LAN8650/1 Rev.B0/B1 Internal PHYs.
|
||||
|
||||
config MICROCHIP_PHY
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
* Driver for Microchip 10BASE-T1S PHYs
|
||||
*
|
||||
* Support: Microchip Phys:
|
||||
* lan8670/1/2 Rev.B1/C1/C2
|
||||
* lan8670/1/2 Rev.B1/C1/C2/D0
|
||||
* lan8650/1 Rev.B0/B1 Internal PHYs
|
||||
*/
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#define PHY_ID_LAN867X_REVB1 0x0007C162
|
||||
#define PHY_ID_LAN867X_REVC1 0x0007C164
|
||||
#define PHY_ID_LAN867X_REVC2 0x0007C165
|
||||
#define PHY_ID_LAN867X_REVD0 0x0007C166
|
||||
/* Both Rev.B0 and B1 clause 22 PHYID's are same due to B1 chip limitation */
|
||||
#define PHY_ID_LAN865X_REVB 0x0007C1B3
|
||||
|
||||
@@ -32,6 +33,17 @@
|
||||
#define COL_DET_ENABLE BIT(15)
|
||||
#define COL_DET_DISABLE 0x0000
|
||||
|
||||
/* LAN8670/1/2 Rev.D0 Link Status Selection Register */
|
||||
#define LAN867X_REG_LINK_STATUS_CTRL 0x0012
|
||||
#define LINK_STATUS_CONFIGURATION GENMASK(12, 11)
|
||||
#define LINK_STATUS_SEMAPHORE BIT(0)
|
||||
|
||||
/* Link Status Configuration */
|
||||
#define LINK_STATUS_CONFIG_PLCA_STATUS 0x1
|
||||
#define LINK_STATUS_CONFIG_SEMAPHORE 0x2
|
||||
|
||||
#define LINK_STATUS_SEMAPHORE_SET 0x1
|
||||
|
||||
#define LAN865X_CFGPARAM_READ_ENABLE BIT(1)
|
||||
|
||||
/* The arrays below are pulled from the following table from AN1699
|
||||
@@ -109,6 +121,21 @@ static const u16 lan865x_revb_sqi_fixup_cfg_regs[3] = {
|
||||
0x00AD, 0x00AE, 0x00AF,
|
||||
};
|
||||
|
||||
/* LAN867x Rev.D0 configuration parameters from AN1699
|
||||
* As per the Configuration Application Note AN1699 published in the below link,
|
||||
* https://www.microchip.com/en-us/application-notes/an1699
|
||||
* Revision G (DS60001699G - October 2025)
|
||||
*/
|
||||
static const u16 lan867x_revd0_fixup_regs[8] = {
|
||||
0x0037, 0x008A, 0x0118, 0x00D6,
|
||||
0x0082, 0x00FD, 0x00FD, 0x0091,
|
||||
};
|
||||
|
||||
static const u16 lan867x_revd0_fixup_values[8] = {
|
||||
0x0800, 0xBFC0, 0x029C, 0x1001,
|
||||
0x001C, 0x0C0B, 0x8C07, 0x9660,
|
||||
};
|
||||
|
||||
/* Pulled from AN1760 describing 'indirect read'
|
||||
*
|
||||
* write_register(0x4, 0x00D8, addr)
|
||||
@@ -377,6 +404,32 @@ static int lan867x_revb1_config_init(struct phy_device *phydev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lan867x_revd0_link_active_selection(struct phy_device *phydev,
|
||||
bool plca_enabled)
|
||||
{
|
||||
u16 value;
|
||||
|
||||
if (plca_enabled) {
|
||||
/* 0x1 - When PLCA is enabled: link status reflects plca_status.
|
||||
*/
|
||||
value = FIELD_PREP(LINK_STATUS_CONFIGURATION,
|
||||
LINK_STATUS_CONFIG_PLCA_STATUS);
|
||||
} else {
|
||||
/* 0x2 - Link status is controlled by the value written into the
|
||||
* LINK_STATUS_SEMAPHORE bit written. Here the link semaphore
|
||||
* bit is written with 0x1 to set the link always active in
|
||||
* CSMA/CD mode as it doesn't support autoneg.
|
||||
*/
|
||||
value = FIELD_PREP(LINK_STATUS_CONFIGURATION,
|
||||
LINK_STATUS_CONFIG_SEMAPHORE) |
|
||||
FIELD_PREP(LINK_STATUS_SEMAPHORE,
|
||||
LINK_STATUS_SEMAPHORE_SET);
|
||||
}
|
||||
|
||||
return phy_write_mmd(phydev, MDIO_MMD_VEND2,
|
||||
LAN867X_REG_LINK_STATUS_CTRL, value);
|
||||
}
|
||||
|
||||
/* As per LAN8650/1 Rev.B0/B1 AN1760 (Revision F (DS60001760G - June 2024)) and
|
||||
* LAN8670/1/2 Rev.C1/C2 AN1699 (Revision E (DS60001699F - June 2024)), under
|
||||
* normal operation, the device should be operated in PLCA mode. Disabling
|
||||
@@ -393,6 +446,14 @@ static int lan86xx_plca_set_cfg(struct phy_device *phydev,
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Link status selection must be configured for LAN8670/1/2 Rev.D0 */
|
||||
if (phydev->phy_id == PHY_ID_LAN867X_REVD0) {
|
||||
ret = lan867x_revd0_link_active_selection(phydev,
|
||||
plca_cfg->enabled);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = genphy_c45_plca_set_cfg(phydev, plca_cfg);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -407,6 +468,29 @@ static int lan86xx_plca_set_cfg(struct phy_device *phydev,
|
||||
COL_DET_CTRL0_ENABLE_BIT_MASK, COL_DET_ENABLE);
|
||||
}
|
||||
|
||||
static int lan867x_revd0_config_init(struct phy_device *phydev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = lan867x_check_reset_complete(phydev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (int i = 0; i < ARRAY_SIZE(lan867x_revd0_fixup_regs); i++) {
|
||||
ret = phy_write_mmd(phydev, MDIO_MMD_VEND2,
|
||||
lan867x_revd0_fixup_regs[i],
|
||||
lan867x_revd0_fixup_values[i]);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Initially the PHY will be in CSMA/CD mode by default. So it is
|
||||
* required to set the link always active as it doesn't support
|
||||
* autoneg.
|
||||
*/
|
||||
return lan867x_revd0_link_active_selection(phydev, false);
|
||||
}
|
||||
|
||||
static int lan86xx_read_status(struct phy_device *phydev)
|
||||
{
|
||||
/* The phy has some limitations, namely:
|
||||
@@ -481,6 +565,15 @@ static struct phy_driver microchip_t1s_driver[] = {
|
||||
.set_plca_cfg = lan86xx_plca_set_cfg,
|
||||
.get_plca_status = genphy_c45_plca_get_status,
|
||||
},
|
||||
{
|
||||
PHY_ID_MATCH_EXACT(PHY_ID_LAN867X_REVD0),
|
||||
.name = "LAN867X Rev.D0",
|
||||
.features = PHY_BASIC_T1S_P2MP_FEATURES,
|
||||
.config_init = lan867x_revd0_config_init,
|
||||
.get_plca_cfg = genphy_c45_plca_get_cfg,
|
||||
.set_plca_cfg = lan86xx_plca_set_cfg,
|
||||
.get_plca_status = genphy_c45_plca_get_status,
|
||||
},
|
||||
{
|
||||
PHY_ID_MATCH_EXACT(PHY_ID_LAN865X_REVB),
|
||||
.name = "LAN865X Rev.B0/B1 Internal Phy",
|
||||
@@ -501,6 +594,7 @@ static const struct mdio_device_id __maybe_unused tbl[] = {
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_LAN867X_REVB1) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_LAN867X_REVC1) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_LAN867X_REVC2) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_LAN867X_REVD0) },
|
||||
{ PHY_ID_MATCH_EXACT(PHY_ID_LAN865X_REVB) },
|
||||
{ }
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user