Commit 83d8f5e9 authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Improve link up detection.

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: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent db038b1b
...@@ -9064,7 +9064,7 @@ static int bnxt_update_phy_setting(struct bnxt *bp) ...@@ -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 /* The last close may have shutdown the link, so need to call
* PHY_CFG to bring it back up. * PHY_CFG to bring it back up.
*/ */
if (!netif_carrier_ok(bp->dev)) if (!bp->link_info.link_up)
update_link = true; update_link = true;
if (!bnxt_eee_config_ok(bp)) if (!bnxt_eee_config_ok(bp))
......
...@@ -1462,15 +1462,15 @@ static int bnxt_get_link_ksettings(struct net_device *dev, ...@@ -1462,15 +1462,15 @@ static int bnxt_get_link_ksettings(struct net_device *dev,
ethtool_link_ksettings_add_link_mode(lk_ksettings, ethtool_link_ksettings_add_link_mode(lk_ksettings,
advertising, Autoneg); advertising, Autoneg);
base->autoneg = AUTONEG_ENABLE; 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); 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); 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 { } else {
base->autoneg = AUTONEG_DISABLE; base->autoneg = AUTONEG_DISABLE;
ethtool_speed = ethtool_speed =
...@@ -2707,7 +2707,7 @@ static int bnxt_disable_an_for_lpbk(struct bnxt *bp, ...@@ -2707,7 +2707,7 @@ static int bnxt_disable_an_for_lpbk(struct bnxt *bp,
return rc; return rc;
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_1GB; 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; fw_speed = bp->link_info.link_speed;
else if (fw_advertising & BNXT_LINK_SPEED_MSK_10GB) else if (fw_advertising & BNXT_LINK_SPEED_MSK_10GB)
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_10GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_10GB;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment