]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
amd-xgbe: do not double read link status
authorRaju Rangoju <Raju.Rangoju@amd.com>
Tue, 1 Jul 2025 06:50:16 +0000 (12:20 +0530)
committerJakub Kicinski <kuba@kernel.org>
Wed, 2 Jul 2025 21:44:24 +0000 (14:44 -0700)
The link status is latched low so that momentary link drops
can be detected. Always double-reading the status defeats this
design feature. Only double read if link was already down

This prevents unnecessary duplicate readings of the link status.

Fixes: 4f3b20bfbb75 ("amd-xgbe: add support for rx-adaptation")
Signed-off-by: Raju Rangoju <Raju.Rangoju@amd.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250701065016.4140707-1-Raju.Rangoju@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c

index fb5b7eceb73f7eefec29b230d6b02f15e2094989..1a37ec45e650201272c5031873cb6ba9137f0471 100644 (file)
@@ -1304,6 +1304,10 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata)
 
        pdata->phy.link = pdata->phy_if.phy_impl.link_status(pdata,
                                                             &an_restart);
+       /* bail out if the link status register read fails */
+       if (pdata->phy.link < 0)
+               return;
+
        if (an_restart) {
                xgbe_phy_config_aneg(pdata);
                goto adjust_link;
index 7a4dfa4e19c73817d801a21c15b0b5e673b4d0cb..23c39e92e783f1f407378f536a96f8ae30daad44 100644 (file)
@@ -2746,8 +2746,7 @@ static bool xgbe_phy_valid_speed(struct xgbe_prv_data *pdata, int speed)
 static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
 {
        struct xgbe_phy_data *phy_data = pdata->phy_data;
-       unsigned int reg;
-       int ret;
+       int reg, ret;
 
        *an_restart = 0;
 
@@ -2781,11 +2780,20 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
                        return 0;
        }
 
-       /* Link status is latched low, so read once to clear
-        * and then read again to get current state
-        */
-       reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
        reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
+       if (reg < 0)
+               return reg;
+
+       /* Link status is latched low so that momentary link drops
+        * can be detected. If link was already down read again
+        * to get the latest state.
+        */
+
+       if (!pdata->phy.link && !(reg & MDIO_STAT1_LSTATUS)) {
+               reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
+               if (reg < 0)
+                       return reg;
+       }
 
        if (pdata->en_rx_adap) {
                /* if the link is available and adaptation is done,
@@ -2804,9 +2812,7 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
                        xgbe_phy_set_mode(pdata, phy_data->cur_mode);
                }
 
-               /* check again for the link and adaptation status */
-               reg = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_STAT1);
-               if ((reg & MDIO_STAT1_LSTATUS) && pdata->rx_adapt_done)
+               if (pdata->rx_adapt_done)
                        return 1;
        } else if (reg & MDIO_STAT1_LSTATUS)
                return 1;