bnxt_en: Improve link up detection.
authorMichael Chan <michael.chan@broadcom.com>
Mon, 27 Jan 2020 09:56:13 +0000 (04:56 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 27 Jan 2020 10:33:28 +0000 (11:33 +0100)
In bnxt_update_phy_setting(), ethtool_get_link_ksettings() and
bnxt_disable_an_for_lpbk(), we inconsistently use netif_carrier_ok()
to determine link.  Instead, we should use bp->link_info.link_up
which has the true link state.  The netif_carrier state may be off
during self-test and while the device is being reset and may not always
reflect the true link state.

By always using bp->link_info.link_up, the code is now more
consistent and more correct.  Some unnecessary link toggles are
now prevented with this patch.

Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 198c69dceeef15d10e43ea62b5f7f5bafbc6a2ad..4b6f746c43571b2e8dc2980a3b7fdd32b6d1f0b6 100644 (file)
@@ -9064,7 +9064,7 @@ static int bnxt_update_phy_setting(struct bnxt *bp)
        /* The last close may have shutdown the link, so need to call
         * PHY_CFG to bring it back up.
         */
-       if (!netif_carrier_ok(bp->dev))
+       if (!bp->link_info.link_up)
                update_link = true;
 
        if (!bnxt_eee_config_ok(bp))
index 08d56ec7b68a503003c6cab305d56630803687ff..6171fa8b3677b4097d3a10278dced2693b5a340b 100644 (file)
@@ -1462,15 +1462,15 @@ static int bnxt_get_link_ksettings(struct net_device *dev,
                ethtool_link_ksettings_add_link_mode(lk_ksettings,
                                                     advertising, Autoneg);
                base->autoneg = AUTONEG_ENABLE;
-               if (link_info->phy_link_status == BNXT_LINK_LINK)
+               base->duplex = DUPLEX_UNKNOWN;
+               if (link_info->phy_link_status == BNXT_LINK_LINK) {
                        bnxt_fw_to_ethtool_lp_adv(link_info, lk_ksettings);
+                       if (link_info->duplex & BNXT_LINK_DUPLEX_FULL)
+                               base->duplex = DUPLEX_FULL;
+                       else
+                               base->duplex = DUPLEX_HALF;
+               }
                ethtool_speed = bnxt_fw_to_ethtool_speed(link_info->link_speed);
-               if (!netif_carrier_ok(dev))
-                       base->duplex = DUPLEX_UNKNOWN;
-               else if (link_info->duplex & BNXT_LINK_DUPLEX_FULL)
-                       base->duplex = DUPLEX_FULL;
-               else
-                       base->duplex = DUPLEX_HALF;
        } else {
                base->autoneg = AUTONEG_DISABLE;
                ethtool_speed =
@@ -2707,7 +2707,7 @@ static int bnxt_disable_an_for_lpbk(struct bnxt *bp,
                return rc;
 
        fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_1GB;
-       if (netif_carrier_ok(bp->dev))
+       if (bp->link_info.link_up)
                fw_speed = bp->link_info.link_speed;
        else if (fw_advertising & BNXT_LINK_SPEED_MSK_10GB)
                fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_10GB;