Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 02478969 authored by Raju Rangoju's avatar Raju Rangoju Committed by Greg Kroah-Hartman
Browse files

amd-xgbe: align CL37 AN sequence as per databook



[ Upstream commit 42fd432fe6d320323215ebdf4de4d0d7e56e6792 ]

Update the Clause 37 Auto-Negotiation implementation to properly align
with the PCS hardware specifications:
- Fix incorrect bit settings in Link Status and Link Duplex fields
- Implement missing sequence steps 2 and 7

These changes ensure CL37 auto-negotiation protocol follows the exact
sequence patterns as specified in the hardware databook.

Fixes: 1bf40ada ("amd-xgbe: Add support for clause 37 auto-negotiation")
Signed-off-by: default avatarRaju Rangoju <Raju.Rangoju@amd.com>
Link: https://patch.msgid.link/20250630192636.3838291-1-Raju.Rangoju@amd.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 80e9028f
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -1355,6 +1355,8 @@
#define MDIO_VEND2_CTRL1_SS13		BIT(13)
#endif

#define XGBE_VEND2_MAC_AUTO_SW		BIT(9)

/* MDIO mask values */
#define XGBE_AN_CL73_INT_CMPLT		BIT(0)
#define XGBE_AN_CL73_INC_LINK		BIT(1)
+9 −0
Original line number Diff line number Diff line
@@ -363,6 +363,10 @@ static void xgbe_an37_set(struct xgbe_prv_data *pdata, bool enable,
		reg |= MDIO_VEND2_CTRL1_AN_RESTART;

	XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_CTRL1, reg);

	reg = XMDIO_READ(pdata, MDIO_MMD_VEND2, MDIO_PCS_DIG_CTRL);
	reg |= XGBE_VEND2_MAC_AUTO_SW;
	XMDIO_WRITE(pdata, MDIO_MMD_VEND2, MDIO_PCS_DIG_CTRL, reg);
}

static void xgbe_an37_restart(struct xgbe_prv_data *pdata)
@@ -991,6 +995,11 @@ static void xgbe_an37_init(struct xgbe_prv_data *pdata)

	netif_dbg(pdata, link, pdata->netdev, "CL37 AN (%s) initialized\n",
		  (pdata->an_mode == XGBE_AN_MODE_CL37) ? "BaseX" : "SGMII");

	reg = XMDIO_READ(pdata, MDIO_MMD_AN, MDIO_CTRL1);
	reg &= ~MDIO_AN_CTRL1_ENABLE;
	XMDIO_WRITE(pdata, MDIO_MMD_AN, MDIO_CTRL1, reg);

}

static void xgbe_an73_init(struct xgbe_prv_data *pdata)
+2 −2
Original line number Diff line number Diff line
@@ -292,11 +292,11 @@
#define XGBE_LINK_TIMEOUT		5
#define XGBE_KR_TRAINING_WAIT_ITER	50

#define XGBE_SGMII_AN_LINK_STATUS	BIT(1)
#define XGBE_SGMII_AN_LINK_DUPLEX	BIT(1)
#define XGBE_SGMII_AN_LINK_SPEED	(BIT(2) | BIT(3))
#define XGBE_SGMII_AN_LINK_SPEED_100	0x04
#define XGBE_SGMII_AN_LINK_SPEED_1000	0x08
#define XGBE_SGMII_AN_LINK_DUPLEX	BIT(4)
#define XGBE_SGMII_AN_LINK_STATUS	BIT(4)

/* ECC correctable error notification window (seconds) */
#define XGBE_ECC_LIMIT			60