@@ -2019,13 +2019,15 @@ static int bnxt_get_link_ksettings(struct net_device *dev,
2019
2019
return 0 ;
2020
2020
}
2021
2021
2022
- static int bnxt_force_link_speed (struct net_device * dev , u32 ethtool_speed )
2022
+ static int
2023
+ bnxt_force_link_speed (struct net_device * dev , u32 ethtool_speed , u32 lanes )
2023
2024
{
2024
2025
struct bnxt * bp = netdev_priv (dev );
2025
2026
struct bnxt_link_info * link_info = & bp -> link_info ;
2026
2027
u16 support_pam4_spds = link_info -> support_pam4_speeds ;
2027
2028
u16 support_spds = link_info -> support_speeds ;
2028
2029
u8 sig_mode = BNXT_SIG_MODE_NRZ ;
2030
+ u32 lanes_needed = 1 ;
2029
2031
u16 fw_speed = 0 ;
2030
2032
2031
2033
switch (ethtool_speed ) {
@@ -2046,37 +2048,46 @@ static int bnxt_force_link_speed(struct net_device *dev, u32 ethtool_speed)
2046
2048
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_10GB ;
2047
2049
break ;
2048
2050
case SPEED_20000 :
2049
- if (support_spds & BNXT_LINK_SPEED_MSK_20GB )
2051
+ if (support_spds & BNXT_LINK_SPEED_MSK_20GB ) {
2050
2052
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_20GB ;
2053
+ lanes_needed = 2 ;
2054
+ }
2051
2055
break ;
2052
2056
case SPEED_25000 :
2053
2057
if (support_spds & BNXT_LINK_SPEED_MSK_25GB )
2054
2058
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_25GB ;
2055
2059
break ;
2056
2060
case SPEED_40000 :
2057
- if (support_spds & BNXT_LINK_SPEED_MSK_40GB )
2061
+ if (support_spds & BNXT_LINK_SPEED_MSK_40GB ) {
2058
2062
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_40GB ;
2063
+ lanes_needed = 4 ;
2064
+ }
2059
2065
break ;
2060
2066
case SPEED_50000 :
2061
- if (support_spds & BNXT_LINK_SPEED_MSK_50GB ) {
2067
+ if (( support_spds & BNXT_LINK_SPEED_MSK_50GB ) && lanes != 1 ) {
2062
2068
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_50GB ;
2069
+ lanes_needed = 2 ;
2063
2070
} else if (support_pam4_spds & BNXT_LINK_PAM4_SPEED_MSK_50GB ) {
2064
2071
fw_speed = PORT_PHY_CFG_REQ_FORCE_PAM4_LINK_SPEED_50GB ;
2065
2072
sig_mode = BNXT_SIG_MODE_PAM4 ;
2066
2073
}
2067
2074
break ;
2068
2075
case SPEED_100000 :
2069
- if (support_spds & BNXT_LINK_SPEED_MSK_100GB ) {
2076
+ if ((support_spds & BNXT_LINK_SPEED_MSK_100GB ) &&
2077
+ lanes != 2 && lanes != 1 ) {
2070
2078
fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_100GB ;
2079
+ lanes_needed = 4 ;
2071
2080
} else if (support_pam4_spds & BNXT_LINK_PAM4_SPEED_MSK_100GB ) {
2072
2081
fw_speed = PORT_PHY_CFG_REQ_FORCE_PAM4_LINK_SPEED_100GB ;
2073
2082
sig_mode = BNXT_SIG_MODE_PAM4 ;
2083
+ lanes_needed = 2 ;
2074
2084
}
2075
2085
break ;
2076
2086
case SPEED_200000 :
2077
2087
if (support_pam4_spds & BNXT_LINK_PAM4_SPEED_MSK_200GB ) {
2078
2088
fw_speed = PORT_PHY_CFG_REQ_FORCE_PAM4_LINK_SPEED_200GB ;
2079
2089
sig_mode = BNXT_SIG_MODE_PAM4 ;
2090
+ lanes_needed = 4 ;
2080
2091
}
2081
2092
break ;
2082
2093
}
@@ -2086,6 +2097,11 @@ static int bnxt_force_link_speed(struct net_device *dev, u32 ethtool_speed)
2086
2097
return - EINVAL ;
2087
2098
}
2088
2099
2100
+ if (lanes && lanes != lanes_needed ) {
2101
+ netdev_err (dev , "unsupported number of lanes for speed\n" );
2102
+ return - EINVAL ;
2103
+ }
2104
+
2089
2105
if (link_info -> req_link_speed == fw_speed &&
2090
2106
link_info -> req_signal_mode == sig_mode &&
2091
2107
link_info -> autoneg == 0 )
@@ -2130,7 +2146,7 @@ static int bnxt_set_link_ksettings(struct net_device *dev,
2130
2146
struct bnxt_link_info * link_info = & bp -> link_info ;
2131
2147
const struct ethtool_link_settings * base = & lk_ksettings -> base ;
2132
2148
bool set_pause = false;
2133
- u32 speed ;
2149
+ u32 speed , lanes = 0 ;
2134
2150
int rc = 0 ;
2135
2151
2136
2152
if (!BNXT_PHY_CFG_ABLE (bp ))
@@ -2171,7 +2187,8 @@ static int bnxt_set_link_ksettings(struct net_device *dev,
2171
2187
goto set_setting_exit ;
2172
2188
}
2173
2189
speed = base -> speed ;
2174
- rc = bnxt_force_link_speed (dev , speed );
2190
+ lanes = lk_ksettings -> lanes ;
2191
+ rc = bnxt_force_link_speed (dev , speed , lanes );
2175
2192
if (rc ) {
2176
2193
if (rc == - EALREADY )
2177
2194
rc = 0 ;
@@ -4377,6 +4394,7 @@ void bnxt_ethtool_free(struct bnxt *bp)
4377
4394
}
4378
4395
4379
4396
const struct ethtool_ops bnxt_ethtool_ops = {
4397
+ .cap_link_lanes_supported = 1 ,
4380
4398
.supported_coalesce_params = ETHTOOL_COALESCE_USECS |
4381
4399
ETHTOOL_COALESCE_MAX_FRAMES |
4382
4400
ETHTOOL_COALESCE_USECS_IRQ |
0 commit comments