Commit 0d8abf02 authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Cleanup and Fix flow control setup logic

Cleanup bnxt_probe_phy() to cleanly separate 2 code blocks for autoneg
on and off.  Autoneg flow control is possible only if autoneg is enabled.

In bnxt_get_settings(), Pause and Asym_Pause are always supported.
Only the advertisement bits change depending on the ethtool -A setting
in auto mode.
Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b763499e
...@@ -5670,22 +5670,16 @@ static int bnxt_probe_phy(struct bnxt *bp) ...@@ -5670,22 +5670,16 @@ static int bnxt_probe_phy(struct bnxt *bp)
} }
/*initialize the ethool setting copy with NVM settings */ /*initialize the ethool setting copy with NVM settings */
if (BNXT_AUTO_MODE(link_info->auto_mode)) if (BNXT_AUTO_MODE(link_info->auto_mode)) {
link_info->autoneg |= BNXT_AUTONEG_SPEED; link_info->autoneg = BNXT_AUTONEG_SPEED |
BNXT_AUTONEG_FLOW_CTRL;
if (link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH) { link_info->advertising = link_info->auto_link_speeds;
if (link_info->auto_pause_setting == BNXT_LINK_PAUSE_BOTH)
link_info->autoneg |= BNXT_AUTONEG_FLOW_CTRL;
link_info->req_flow_ctrl = link_info->auto_pause_setting; link_info->req_flow_ctrl = link_info->auto_pause_setting;
} else if (link_info->force_pause_setting & BNXT_LINK_PAUSE_BOTH) { } else {
link_info->req_link_speed = link_info->force_link_speed;
link_info->req_duplex = link_info->duplex_setting;
link_info->req_flow_ctrl = link_info->force_pause_setting; link_info->req_flow_ctrl = link_info->force_pause_setting;
} }
link_info->req_duplex = link_info->duplex_setting;
if (link_info->autoneg & BNXT_AUTONEG_SPEED)
link_info->req_link_speed = link_info->auto_link_speed;
else
link_info->req_link_speed = link_info->force_link_speed;
link_info->advertising = link_info->auto_link_speeds;
snprintf(phy_ver, PHY_VER_STR_LEN, " ph %d.%d.%d", snprintf(phy_ver, PHY_VER_STR_LEN, " ph %d.%d.%d",
link_info->phy_ver[0], link_info->phy_ver[0],
link_info->phy_ver[1], link_info->phy_ver[1],
......
...@@ -557,6 +557,7 @@ static int bnxt_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -557,6 +557,7 @@ static int bnxt_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
u16 ethtool_speed; u16 ethtool_speed;
cmd->supported = bnxt_fw_to_ethtool_support_spds(link_info); cmd->supported = bnxt_fw_to_ethtool_support_spds(link_info);
cmd->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
if (link_info->auto_link_speeds) if (link_info->auto_link_speeds)
cmd->supported |= SUPPORTED_Autoneg; cmd->supported |= SUPPORTED_Autoneg;
...@@ -570,28 +571,16 @@ static int bnxt_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) ...@@ -570,28 +571,16 @@ static int bnxt_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
cmd->autoneg = AUTONEG_DISABLE; cmd->autoneg = AUTONEG_DISABLE;
cmd->advertising = 0; cmd->advertising = 0;
} }
if (link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH) { if (link_info->autoneg & BNXT_AUTONEG_FLOW_CTRL) {
if ((link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH) == if ((link_info->auto_pause_setting & BNXT_LINK_PAUSE_BOTH) ==
BNXT_LINK_PAUSE_BOTH) { BNXT_LINK_PAUSE_BOTH) {
cmd->advertising |= ADVERTISED_Pause; cmd->advertising |= ADVERTISED_Pause;
cmd->supported |= SUPPORTED_Pause;
} else { } else {
cmd->advertising |= ADVERTISED_Asym_Pause; cmd->advertising |= ADVERTISED_Asym_Pause;
cmd->supported |= SUPPORTED_Asym_Pause;
if (link_info->auto_pause_setting & if (link_info->auto_pause_setting &
BNXT_LINK_PAUSE_RX) BNXT_LINK_PAUSE_RX)
cmd->advertising |= ADVERTISED_Pause; cmd->advertising |= ADVERTISED_Pause;
} }
} else if (link_info->force_pause_setting & BNXT_LINK_PAUSE_BOTH) {
if ((link_info->force_pause_setting & BNXT_LINK_PAUSE_BOTH) ==
BNXT_LINK_PAUSE_BOTH) {
cmd->supported |= SUPPORTED_Pause;
} else {
cmd->supported |= SUPPORTED_Asym_Pause;
if (link_info->force_pause_setting &
BNXT_LINK_PAUSE_RX)
cmd->supported |= SUPPORTED_Pause;
}
} }
cmd->port = PORT_NONE; cmd->port = PORT_NONE;
......
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