Skip to content

Commit 9d9cee0

Browse files
Michael Chandavem330
authored andcommitted
bnxt_en: Check for valid forced speed during ethtool -s.
Check that the forced speed is a valid speed supported by firmware. If not supported, return -EINVAL. Signed-off-by: Michael Chan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 4bb13ab commit 9d9cee0

File tree

1 file changed

+38
-10
lines changed

1 file changed

+38
-10
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

Lines changed: 38 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -739,28 +739,49 @@ static int bnxt_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
739739

740740
static u32 bnxt_get_fw_speed(struct net_device *dev, u16 ethtool_speed)
741741
{
742+
struct bnxt *bp = netdev_priv(dev);
743+
struct bnxt_link_info *link_info = &bp->link_info;
744+
u16 support_spds = link_info->support_speeds;
745+
u32 fw_speed = 0;
746+
742747
switch (ethtool_speed) {
743748
case SPEED_100:
744-
return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_100MB;
749+
if (support_spds & BNXT_LINK_SPEED_MSK_100MB)
750+
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_100MB;
751+
break;
745752
case SPEED_1000:
746-
return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_1GB;
753+
if (support_spds & BNXT_LINK_SPEED_MSK_1GB)
754+
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_1GB;
755+
break;
747756
case SPEED_2500:
748-
return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_2_5GB;
757+
if (support_spds & BNXT_LINK_SPEED_MSK_2_5GB)
758+
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_2_5GB;
759+
break;
749760
case SPEED_10000:
750-
return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_10GB;
761+
if (support_spds & BNXT_LINK_SPEED_MSK_10GB)
762+
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_10GB;
763+
break;
751764
case SPEED_20000:
752-
return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_20GB;
765+
if (support_spds & BNXT_LINK_SPEED_MSK_20GB)
766+
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_20GB;
767+
break;
753768
case SPEED_25000:
754-
return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_25GB;
769+
if (support_spds & BNXT_LINK_SPEED_MSK_25GB)
770+
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_25GB;
771+
break;
755772
case SPEED_40000:
756-
return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_40GB;
773+
if (support_spds & BNXT_LINK_SPEED_MSK_40GB)
774+
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_40GB;
775+
break;
757776
case SPEED_50000:
758-
return PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_50GB;
777+
if (support_spds & BNXT_LINK_SPEED_MSK_50GB)
778+
fw_speed = PORT_PHY_CFG_REQ_AUTO_LINK_SPEED_50GB;
779+
break;
759780
default:
760781
netdev_err(dev, "unsupported speed!\n");
761782
break;
762783
}
763-
return 0;
784+
return fw_speed;
764785
}
765786

766787
u16 bnxt_get_fw_auto_link_speeds(u32 advertising)
@@ -823,6 +844,8 @@ static int bnxt_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
823844
*/
824845
set_pause = true;
825846
} else {
847+
u16 fw_speed;
848+
826849
/* TODO: currently don't support half duplex */
827850
if (cmd->duplex == DUPLEX_HALF) {
828851
netdev_err(dev, "HALF DUPLEX is not supported!\n");
@@ -833,7 +856,12 @@ static int bnxt_set_settings(struct net_device *dev, struct ethtool_cmd *cmd)
833856
if (cmd->duplex == DUPLEX_UNKNOWN)
834857
cmd->duplex = DUPLEX_FULL;
835858
speed = ethtool_cmd_speed(cmd);
836-
link_info->req_link_speed = bnxt_get_fw_speed(dev, speed);
859+
fw_speed = bnxt_get_fw_speed(dev, speed);
860+
if (!fw_speed) {
861+
rc = -EINVAL;
862+
goto set_setting_exit;
863+
}
864+
link_info->req_link_speed = fw_speed;
837865
link_info->req_duplex = BNXT_LINK_DUPLEX_FULL;
838866
link_info->autoneg = 0;
839867
link_info->advertising = 0;

0 commit comments

Comments
 (0)