Commit f00530bf authored by Edwin Peer's avatar Edwin Peer Committed by David S. Miller

bnxt_en: refactor bnxt_get_fw_speed()

It will be necessary to update more than one field in the link_info
structure when PAM4 speeds are added in a later patch. Instead of
merely translating ethtool speed values to firmware speed values,
change the responsiblity of this function to update all the necessary
link_info fields required to force the speed change to the desired
ethtool value. This also reduces code duplication somewhat at the two
call sites, which otherwise both have to independently update link_info
fields to turn off auto negotiation advertisements.

Also use the appropriate REQ_FORCE_LINK_SPEED definitions. These happen
to have the same values, but req_link_speed is utilimately passed as
force_link_speed in HWRM_PORT_PHY_CFG which is not defined in terms of
REQ_AUTO_LINK_SPEED.
Reviewed-by: default avatarScott Branden <scott.branden@broadcom.com>
Signed-off-by: default avatarEdwin Peer <edwin.peer@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent c916062a
...@@ -1636,55 +1636,63 @@ static int bnxt_get_link_ksettings(struct net_device *dev, ...@@ -1636,55 +1636,63 @@ static int bnxt_get_link_ksettings(struct net_device *dev,
return 0; return 0;
} }
static u32 bnxt_get_fw_speed(struct net_device *dev, u32 ethtool_speed) static int bnxt_force_link_speed(struct net_device *dev, u32 ethtool_speed)
{ {
struct bnxt *bp = netdev_priv(dev); struct bnxt *bp = netdev_priv(dev);
struct bnxt_link_info *link_info = &bp->link_info; struct bnxt_link_info *link_info = &bp->link_info;
u16 support_spds = link_info->support_speeds; u16 support_spds = link_info->support_speeds;
u32 fw_speed = 0; u16 fw_speed = 0;
switch (ethtool_speed) { switch (ethtool_speed) {
case SPEED_100: case SPEED_100:
if (support_spds & BNXT_LINK_SPEED_MSK_100MB) if (support_spds & BNXT_LINK_SPEED_MSK_100MB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_100MB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_100MB;
break; break;
case SPEED_1000: case SPEED_1000:
if (support_spds & BNXT_LINK_SPEED_MSK_1GB) if (support_spds & BNXT_LINK_SPEED_MSK_1GB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_1GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_1GB;
break; break;
case SPEED_2500: case SPEED_2500:
if (support_spds & BNXT_LINK_SPEED_MSK_2_5GB) if (support_spds & BNXT_LINK_SPEED_MSK_2_5GB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_2_5GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_2_5GB;
break; break;
case SPEED_10000: case SPEED_10000:
if (support_spds & BNXT_LINK_SPEED_MSK_10GB) if (support_spds & BNXT_LINK_SPEED_MSK_10GB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_10GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_10GB;
break; break;
case SPEED_20000: case SPEED_20000:
if (support_spds & BNXT_LINK_SPEED_MSK_20GB) if (support_spds & BNXT_LINK_SPEED_MSK_20GB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_20GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_20GB;
break; break;
case SPEED_25000: case SPEED_25000:
if (support_spds & BNXT_LINK_SPEED_MSK_25GB) if (support_spds & BNXT_LINK_SPEED_MSK_25GB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_25GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_25GB;
break; break;
case SPEED_40000: case SPEED_40000:
if (support_spds & BNXT_LINK_SPEED_MSK_40GB) if (support_spds & BNXT_LINK_SPEED_MSK_40GB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_40GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_40GB;
break; break;
case SPEED_50000: case SPEED_50000:
if (support_spds & BNXT_LINK_SPEED_MSK_50GB) if (support_spds & BNXT_LINK_SPEED_MSK_50GB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_50GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_50GB;
break; break;
case SPEED_100000: case SPEED_100000:
if (support_spds & BNXT_LINK_SPEED_MSK_100GB) if (support_spds & BNXT_LINK_SPEED_MSK_100GB)
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_100GB; fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_100GB;
break; break;
default: }
if (!fw_speed) {
netdev_err(dev, "unsupported speed!\n"); netdev_err(dev, "unsupported speed!\n");
break; return -EINVAL;
} }
return fw_speed;
link_info->req_link_speed = fw_speed;
link_info->req_duplex = BNXT_LINK_DUPLEX_FULL;
link_info->autoneg = 0;
link_info->advertising = 0;
return 0;
} }
u16 bnxt_get_fw_auto_link_speeds(u32 advertising) u16 bnxt_get_fw_auto_link_speeds(u32 advertising)
...@@ -1737,7 +1745,6 @@ static int bnxt_set_link_ksettings(struct net_device *dev, ...@@ -1737,7 +1745,6 @@ static int bnxt_set_link_ksettings(struct net_device *dev,
*/ */
set_pause = true; set_pause = true;
} else { } else {
u16 fw_speed;
u8 phy_type = link_info->phy_type; u8 phy_type = link_info->phy_type;
if (phy_type == PORT_PHY_QCFG_RESP_PHY_TYPE_BASET || if (phy_type == PORT_PHY_QCFG_RESP_PHY_TYPE_BASET ||
...@@ -1753,15 +1760,9 @@ static int bnxt_set_link_ksettings(struct net_device *dev, ...@@ -1753,15 +1760,9 @@ static int bnxt_set_link_ksettings(struct net_device *dev,
goto set_setting_exit; goto set_setting_exit;
} }
speed = base->speed; speed = base->speed;
fw_speed = bnxt_get_fw_speed(dev, speed); rc = bnxt_force_link_speed(dev, speed);
if (!fw_speed) { if (rc)
rc = -EINVAL;
goto set_setting_exit; goto set_setting_exit;
}
link_info->req_link_speed = fw_speed;
link_info->req_duplex = BNXT_LINK_DUPLEX_FULL;
link_info->autoneg = 0;
link_info->advertising = 0;
} }
if (netif_running(dev)) if (netif_running(dev))
......
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