@@ -2129,6 +2129,48 @@ static u16 bnxt_agg_ring_id_to_grp_idx(struct bnxt *bp, u16 ring_id)
2129
2129
return INVALID_HW_RING_ID ;
2130
2130
}
2131
2131
2132
+ static u16 bnxt_get_force_speed (struct bnxt_link_info * link_info )
2133
+ {
2134
+ if (link_info -> req_signal_mode == BNXT_SIG_MODE_PAM4 )
2135
+ return link_info -> force_pam4_link_speed ;
2136
+ return link_info -> force_link_speed ;
2137
+ }
2138
+
2139
+ static void bnxt_set_force_speed (struct bnxt_link_info * link_info )
2140
+ {
2141
+ link_info -> req_link_speed = link_info -> force_link_speed ;
2142
+ link_info -> req_signal_mode = BNXT_SIG_MODE_NRZ ;
2143
+ if (link_info -> force_pam4_link_speed ) {
2144
+ link_info -> req_link_speed = link_info -> force_pam4_link_speed ;
2145
+ link_info -> req_signal_mode = BNXT_SIG_MODE_PAM4 ;
2146
+ }
2147
+ }
2148
+
2149
+ static void bnxt_set_auto_speed (struct bnxt_link_info * link_info )
2150
+ {
2151
+ link_info -> advertising = link_info -> auto_link_speeds ;
2152
+ link_info -> advertising_pam4 = link_info -> auto_pam4_link_speeds ;
2153
+ }
2154
+
2155
+ static bool bnxt_force_speed_updated (struct bnxt_link_info * link_info )
2156
+ {
2157
+ if (link_info -> req_signal_mode == BNXT_SIG_MODE_NRZ &&
2158
+ link_info -> req_link_speed != link_info -> force_link_speed )
2159
+ return true;
2160
+ if (link_info -> req_signal_mode == BNXT_SIG_MODE_PAM4 &&
2161
+ link_info -> req_link_speed != link_info -> force_pam4_link_speed )
2162
+ return true;
2163
+ return false;
2164
+ }
2165
+
2166
+ static bool bnxt_auto_speed_updated (struct bnxt_link_info * link_info )
2167
+ {
2168
+ if (link_info -> advertising != link_info -> auto_link_speeds ||
2169
+ link_info -> advertising_pam4 != link_info -> auto_pam4_link_speeds )
2170
+ return true;
2171
+ return false;
2172
+ }
2173
+
2132
2174
#define BNXT_EVENT_THERMAL_CURRENT_TEMP (data2 ) \
2133
2175
((data2) & \
2134
2176
ASYNC_EVENT_CMPL_ERROR_REPORT_THERMAL_EVENT_DATA2_CURRENT_TEMP_MASK)
@@ -2255,7 +2297,7 @@ static int bnxt_async_event_process(struct bnxt *bp,
2255
2297
/* print unsupported speed warning in forced speed mode only */
2256
2298
if (!(link_info -> autoneg & BNXT_AUTONEG_SPEED ) &&
2257
2299
(data1 & 0x20000 )) {
2258
- u16 fw_speed = link_info -> force_link_speed ;
2300
+ u16 fw_speed = bnxt_get_force_speed ( link_info ) ;
2259
2301
u32 speed = bnxt_fw_to_ethtool_speed (fw_speed );
2260
2302
2261
2303
if (speed != SPEED_UNKNOWN )
@@ -9689,13 +9731,31 @@ static bool bnxt_support_dropped(u16 advertising, u16 supported)
9689
9731
return ((supported | diff ) != supported );
9690
9732
}
9691
9733
9734
+ static bool bnxt_support_speed_dropped (struct bnxt_link_info * link_info )
9735
+ {
9736
+ /* Check if any advertised speeds are no longer supported. The caller
9737
+ * holds the link_lock mutex, so we can modify link_info settings.
9738
+ */
9739
+ if (bnxt_support_dropped (link_info -> advertising ,
9740
+ link_info -> support_auto_speeds )) {
9741
+ link_info -> advertising = link_info -> support_auto_speeds ;
9742
+ return true;
9743
+ }
9744
+ if (bnxt_support_dropped (link_info -> advertising_pam4 ,
9745
+ link_info -> support_pam4_auto_speeds )) {
9746
+ link_info -> advertising_pam4 = link_info -> support_pam4_auto_speeds ;
9747
+ return true;
9748
+ }
9749
+ return false;
9750
+ }
9751
+
9692
9752
int bnxt_update_link (struct bnxt * bp , bool chng_link_state )
9693
9753
{
9694
9754
struct bnxt_link_info * link_info = & bp -> link_info ;
9695
9755
struct hwrm_port_phy_qcfg_output * resp ;
9696
9756
struct hwrm_port_phy_qcfg_input * req ;
9697
9757
u8 link_state = link_info -> link_state ;
9698
- bool support_changed = false ;
9758
+ bool support_changed ;
9699
9759
int rc ;
9700
9760
9701
9761
rc = hwrm_req_init (bp , req , HWRM_PORT_PHY_QCFG );
@@ -9809,19 +9869,7 @@ int bnxt_update_link(struct bnxt *bp, bool chng_link_state)
9809
9869
if (!BNXT_PHY_CFG_ABLE (bp ))
9810
9870
return 0 ;
9811
9871
9812
- /* Check if any advertised speeds are no longer supported. The caller
9813
- * holds the link_lock mutex, so we can modify link_info settings.
9814
- */
9815
- if (bnxt_support_dropped (link_info -> advertising ,
9816
- link_info -> support_auto_speeds )) {
9817
- link_info -> advertising = link_info -> support_auto_speeds ;
9818
- support_changed = true;
9819
- }
9820
- if (bnxt_support_dropped (link_info -> advertising_pam4 ,
9821
- link_info -> support_pam4_auto_speeds )) {
9822
- link_info -> advertising_pam4 = link_info -> support_pam4_auto_speeds ;
9823
- support_changed = true;
9824
- }
9872
+ support_changed = bnxt_support_speed_dropped (link_info );
9825
9873
if (support_changed && (link_info -> autoneg & BNXT_AUTONEG_SPEED ))
9826
9874
bnxt_hwrm_set_link_setting (bp , true, false);
9827
9875
return 0 ;
@@ -10362,19 +10410,14 @@ static int bnxt_update_phy_setting(struct bnxt *bp)
10362
10410
if (!(link_info -> autoneg & BNXT_AUTONEG_SPEED )) {
10363
10411
if (BNXT_AUTO_MODE (link_info -> auto_mode ))
10364
10412
update_link = true;
10365
- if (link_info -> req_signal_mode == BNXT_SIG_MODE_NRZ &&
10366
- link_info -> req_link_speed != link_info -> force_link_speed )
10367
- update_link = true;
10368
- else if (link_info -> req_signal_mode == BNXT_SIG_MODE_PAM4 &&
10369
- link_info -> req_link_speed != link_info -> force_pam4_link_speed )
10413
+ if (bnxt_force_speed_updated (link_info ))
10370
10414
update_link = true;
10371
10415
if (link_info -> req_duplex != link_info -> duplex_setting )
10372
10416
update_link = true;
10373
10417
} else {
10374
10418
if (link_info -> auto_mode == BNXT_LINK_AUTO_NONE )
10375
10419
update_link = true;
10376
- if (link_info -> advertising != link_info -> auto_link_speeds ||
10377
- link_info -> advertising_pam4 != link_info -> auto_pam4_link_speeds )
10420
+ if (bnxt_auto_speed_updated (link_info ))
10378
10421
update_link = true;
10379
10422
}
10380
10423
@@ -11992,16 +12035,9 @@ static void bnxt_init_ethtool_link_settings(struct bnxt *bp)
11992
12035
} else {
11993
12036
link_info -> autoneg |= BNXT_AUTONEG_FLOW_CTRL ;
11994
12037
}
11995
- link_info -> advertising = link_info -> auto_link_speeds ;
11996
- link_info -> advertising_pam4 = link_info -> auto_pam4_link_speeds ;
12038
+ bnxt_set_auto_speed (link_info );
11997
12039
} else {
11998
- link_info -> req_link_speed = link_info -> force_link_speed ;
11999
- link_info -> req_signal_mode = BNXT_SIG_MODE_NRZ ;
12000
- if (link_info -> force_pam4_link_speed ) {
12001
- link_info -> req_link_speed =
12002
- link_info -> force_pam4_link_speed ;
12003
- link_info -> req_signal_mode = BNXT_SIG_MODE_PAM4 ;
12004
- }
12040
+ bnxt_set_force_speed (link_info );
12005
12041
link_info -> req_duplex = link_info -> duplex_setting ;
12006
12042
}
12007
12043
if (link_info -> autoneg & BNXT_AUTONEG_FLOW_CTRL )
0 commit comments