Skip to content

Commit

Permalink
Merge branch 'net-phy-nxp-c45-tja11xx-add-errata-for-tja112xa-b'
Browse files Browse the repository at this point in the history
Andrei Botila says:

====================
net: phy: nxp-c45-tja11xx: add errata for TJA112XA/B

This patch series implements two errata for TJA1120 and TJA1121.

The first errata applicable to both RGMII and SGMII version
of TJA1120 and TJA1121 deals with achieving full silicon performance.
The workaround in this case is putting the PHY in managed mode and
applying a series of PHY writes before the link gest established.

The second errata applicable only to SGMII version of TJA1120 and
TJA1121 deals with achieving a stable operation of SGMII after a
startup event.
The workaround puts the SGMII PCS into power down mode and back up
after restart or wakeup from sleep.
====================

Link: https://patch.msgid.link/20250304160619.181046-1-andrei.botila@oss.nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Jakub Kicinski committed Mar 8, 2025
2 parents df8ce77 + 4893952 commit e6360f0
Showing 1 changed file with 68 additions and 0 deletions.
68 changes: 68 additions & 0 deletions drivers/net/phy/nxp-c45-tja11xx.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@
#define PHY_ID_TJA_1103 0x001BB010
#define PHY_ID_TJA_1120 0x001BB031

#define VEND1_DEVICE_ID3 0x0004
#define TJA1120_DEV_ID3_SILICON_VERSION GENMASK(15, 12)
#define TJA1120_DEV_ID3_SAMPLE_TYPE GENMASK(11, 8)
#define DEVICE_ID3_SAMPLE_TYPE_R 0x9

#define VEND1_DEVICE_CONTROL 0x0040
#define DEVICE_CONTROL_RESET BIT(15)
#define DEVICE_CONTROL_CONFIG_GLOBAL_EN BIT(14)
Expand Down Expand Up @@ -109,6 +114,9 @@
#define MII_BASIC_CONFIG_RMII 0x5
#define MII_BASIC_CONFIG_MII 0x4

#define VEND1_SGMII_BASIC_CONTROL 0xB000
#define SGMII_LPM BIT(11)

#define VEND1_SYMBOL_ERROR_CNT_XTD 0x8351
#define EXTENDED_CNT_EN BIT(15)
#define VEND1_MONITOR_STATUS 0xAC80
Expand Down Expand Up @@ -1593,6 +1601,63 @@ static int nxp_c45_set_phy_mode(struct phy_device *phydev)
return 0;
}

/* Errata: ES_TJA1120 and ES_TJA1121 Rev. 1.0 — 28 November 2024 Section 3.1 & 3.2 */
static void nxp_c45_tja1120_errata(struct phy_device *phydev)
{
bool macsec_ability, sgmii_ability;
int silicon_version, sample_type;
int phy_abilities;
int ret = 0;

ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, VEND1_DEVICE_ID3);
if (ret < 0)
return;

sample_type = FIELD_GET(TJA1120_DEV_ID3_SAMPLE_TYPE, ret);
if (sample_type != DEVICE_ID3_SAMPLE_TYPE_R)
return;

silicon_version = FIELD_GET(TJA1120_DEV_ID3_SILICON_VERSION, ret);

phy_abilities = phy_read_mmd(phydev, MDIO_MMD_VEND1,
VEND1_PORT_ABILITIES);
macsec_ability = !!(phy_abilities & MACSEC_ABILITY);
sgmii_ability = !!(phy_abilities & SGMII_ABILITY);
if ((!macsec_ability && silicon_version == 2) ||
(macsec_ability && silicon_version == 1)) {
/* TJA1120/TJA1121 PHY configuration errata workaround.
* Apply PHY writes sequence before link up.
*/
if (!macsec_ability) {
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x01F8, 0x4b95);
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x01F9, 0xf3cd);
} else {
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x01F8, 0x89c7);
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x01F9, 0x0893);
}

phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x0476, 0x58a0);

phy_write_mmd(phydev, MDIO_MMD_PMAPMD, 0x8921, 0xa3a);
phy_write_mmd(phydev, MDIO_MMD_PMAPMD, 0x89F1, 0x16c1);

phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x01F8, 0x0);
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x01F9, 0x0);

if (sgmii_ability) {
/* TJA1120B/TJA1121B SGMII PCS restart errata workaround.
* Put SGMII PCS into power down mode and back up.
*/
phy_set_bits_mmd(phydev, MDIO_MMD_VEND1,
VEND1_SGMII_BASIC_CONTROL,
SGMII_LPM);
phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1,
VEND1_SGMII_BASIC_CONTROL,
SGMII_LPM);
}
}
}

static int nxp_c45_config_init(struct phy_device *phydev)
{
int ret;
Expand All @@ -1609,6 +1674,9 @@ static int nxp_c45_config_init(struct phy_device *phydev)
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x01F8, 1);
phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x01F9, 2);

if (phy_id_compare(phydev->phy_id, PHY_ID_TJA_1120, GENMASK(31, 4)))
nxp_c45_tja1120_errata(phydev);

phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, VEND1_PHY_CONFIG,
PHY_CONFIG_AUTO);

Expand Down

0 comments on commit e6360f0

Please sign in to comment.