]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
amd-xgbe: align CL37 AN sequence as per databook
authorRaju Rangoju <Raju.Rangoju@amd.com>
Mon, 30 Jun 2025 19:26:36 +0000 (00:56 +0530)
committerJakub Kicinski <kuba@kernel.org>
Wed, 2 Jul 2025 00:37:41 +0000 (17:37 -0700)
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: 1bf40ada6290 ("amd-xgbe: Add support for clause 37 auto-negotiation")
Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
Link: https://patch.msgid.link/20250630192636.3838291-1-Raju.Rangoju@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/amd/xgbe/xgbe-common.h
drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
drivers/net/ethernet/amd/xgbe/xgbe.h

index e1296cbf4ff309893233fcc648386e92892962d4..9316de4126cf17687a13bf07014fa8822267f6b9 100644 (file)
 #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)
index 71449edbb76de053faa6d816ec7cc8b5254b52e0..fb5b7eceb73f7eefec29b230d6b02f15e2094989 100644 (file)
@@ -266,6 +266,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)
@@ -894,6 +898,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)
index 6359bb87dc13e3d58078f2754b535a75b2fec29e..057379cd43baeb0c3e02013a9339abb00ebf246f 100644 (file)
 #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_10    0x00
 #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