@@ -739,28 +739,49 @@ static int bnxt_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
739
739
740
740
static u32 bnxt_get_fw_speed (struct net_device * dev , u16 ethtool_speed )
741
741
{
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
+
742
747
switch (ethtool_speed ) {
743
748
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 ;
745
752
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 ;
747
756
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 ;
749
760
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 ;
751
764
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 ;
753
768
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 ;
755
772
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 ;
757
776
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 ;
759
780
default :
760
781
netdev_err (dev , "unsupported speed!\n" );
761
782
break ;
762
783
}
763
- return 0 ;
784
+ return fw_speed ;
764
785
}
765
786
766
787
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)
823
844
*/
824
845
set_pause = true;
825
846
} else {
847
+ u16 fw_speed ;
848
+
826
849
/* TODO: currently don't support half duplex */
827
850
if (cmd -> duplex == DUPLEX_HALF ) {
828
851
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)
833
856
if (cmd -> duplex == DUPLEX_UNKNOWN )
834
857
cmd -> duplex = DUPLEX_FULL ;
835
858
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 ;
837
865
link_info -> req_duplex = BNXT_LINK_DUPLEX_FULL ;
838
866
link_info -> autoneg = 0 ;
839
867
link_info -> advertising = 0 ;
0 commit comments