@@ -6947,6 +6947,8 @@ static int __bnxt_hwrm_func_qcaps(struct bnxt *bp)
6947
6947
bp -> fw_cap |= BNXT_FW_CAP_EXT_STATS_SUPPORTED ;
6948
6948
if (flags & FUNC_QCAPS_RESP_FLAGS_ERROR_RECOVERY_CAPABLE )
6949
6949
bp -> fw_cap |= BNXT_FW_CAP_ERROR_RECOVERY ;
6950
+ if (flags & FUNC_QCAPS_RESP_FLAGS_ERR_RECOVER_RELOAD )
6951
+ bp -> fw_cap |= BNXT_FW_CAP_ERR_RECOVER_RELOAD ;
6950
6952
6951
6953
bp -> tx_push_thresh = 0 ;
6952
6954
if (flags & FUNC_QCAPS_RESP_FLAGS_PUSH_MODE_SUPPORTED )
@@ -9557,14 +9559,16 @@ static bool bnxt_uc_list_updated(struct bnxt *bp)
9557
9559
static void bnxt_set_rx_mode (struct net_device * dev )
9558
9560
{
9559
9561
struct bnxt * bp = netdev_priv (dev );
9560
- struct bnxt_vnic_info * vnic = & bp -> vnic_info [0 ];
9561
- u32 mask = vnic -> rx_mask ;
9562
+ struct bnxt_vnic_info * vnic ;
9562
9563
bool mc_update = false;
9563
9564
bool uc_update ;
9565
+ u32 mask ;
9564
9566
9565
- if (!netif_running ( dev ))
9567
+ if (!test_bit ( BNXT_STATE_OPEN , & bp -> state ))
9566
9568
return ;
9567
9569
9570
+ vnic = & bp -> vnic_info [0 ];
9571
+ mask = vnic -> rx_mask ;
9568
9572
mask &= ~(CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS |
9569
9573
CFA_L2_SET_RX_MASK_REQ_MASK_MCAST |
9570
9574
CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST |
@@ -10095,6 +10099,8 @@ static void bnxt_force_fw_reset(struct bnxt *bp)
10095
10099
wait_dsecs = fw_health -> normal_func_wait_dsecs ;
10096
10100
bp -> fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV ;
10097
10101
}
10102
+
10103
+ bp -> fw_reset_min_dsecs = fw_health -> post_reset_wait_dsecs ;
10098
10104
bp -> fw_reset_max_dsecs = fw_health -> post_reset_max_wait_dsecs ;
10099
10105
bnxt_queue_fw_reset_work (bp , wait_dsecs * HZ / 10 );
10100
10106
}
@@ -10136,7 +10142,7 @@ void bnxt_fw_reset(struct bnxt *bp)
10136
10142
bnxt_rtnl_lock_sp (bp );
10137
10143
if (test_bit (BNXT_STATE_OPEN , & bp -> state ) &&
10138
10144
!test_bit (BNXT_STATE_IN_FW_RESET , & bp -> state )) {
10139
- int n = 0 ;
10145
+ int n = 0 , tmo ;
10140
10146
10141
10147
set_bit (BNXT_STATE_IN_FW_RESET , & bp -> state );
10142
10148
if (bp -> pf .active_vfs &&
@@ -10159,8 +10165,14 @@ void bnxt_fw_reset(struct bnxt *bp)
10159
10165
goto fw_reset_exit ;
10160
10166
}
10161
10167
bnxt_fw_reset_close (bp );
10162
- bp -> fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV ;
10163
- bnxt_queue_fw_reset_work (bp , bp -> fw_reset_min_dsecs * HZ / 10 );
10168
+ if (bp -> fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD ) {
10169
+ bp -> fw_reset_state = BNXT_FW_RESET_STATE_POLL_FW_DOWN ;
10170
+ tmo = HZ / 10 ;
10171
+ } else {
10172
+ bp -> fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV ;
10173
+ tmo = bp -> fw_reset_min_dsecs * HZ / 10 ;
10174
+ }
10175
+ bnxt_queue_fw_reset_work (bp , tmo );
10164
10176
}
10165
10177
fw_reset_exit :
10166
10178
bnxt_rtnl_unlock_sp (bp );
@@ -10603,6 +10615,7 @@ static void bnxt_fw_reset_task(struct work_struct *work)
10603
10615
switch (bp -> fw_reset_state ) {
10604
10616
case BNXT_FW_RESET_STATE_POLL_VF : {
10605
10617
int n = bnxt_get_registered_vfs (bp );
10618
+ int tmo ;
10606
10619
10607
10620
if (n < 0 ) {
10608
10621
netdev_err (bp -> dev , "Firmware reset aborted, subsequent func_qcfg cmd failed, rc = %d, %d msecs since reset timestamp\n" ,
@@ -10624,11 +10637,38 @@ static void bnxt_fw_reset_task(struct work_struct *work)
10624
10637
bp -> fw_reset_timestamp = jiffies ;
10625
10638
rtnl_lock ();
10626
10639
bnxt_fw_reset_close (bp );
10627
- bp -> fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV ;
10640
+ if (bp -> fw_cap & BNXT_FW_CAP_ERR_RECOVER_RELOAD ) {
10641
+ bp -> fw_reset_state = BNXT_FW_RESET_STATE_POLL_FW_DOWN ;
10642
+ tmo = HZ / 10 ;
10643
+ } else {
10644
+ bp -> fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV ;
10645
+ tmo = bp -> fw_reset_min_dsecs * HZ / 10 ;
10646
+ }
10628
10647
rtnl_unlock ();
10629
- bnxt_queue_fw_reset_work (bp , bp -> fw_reset_min_dsecs * HZ / 10 );
10648
+ bnxt_queue_fw_reset_work (bp , tmo );
10630
10649
return ;
10631
10650
}
10651
+ case BNXT_FW_RESET_STATE_POLL_FW_DOWN : {
10652
+ u32 val ;
10653
+
10654
+ val = bnxt_fw_health_readl (bp , BNXT_FW_HEALTH_REG );
10655
+ if (!(val & BNXT_FW_STATUS_SHUTDOWN ) &&
10656
+ !time_after (jiffies , bp -> fw_reset_timestamp +
10657
+ (bp -> fw_reset_max_dsecs * HZ / 10 ))) {
10658
+ bnxt_queue_fw_reset_work (bp , HZ / 5 );
10659
+ return ;
10660
+ }
10661
+
10662
+ if (!bp -> fw_health -> master ) {
10663
+ u32 wait_dsecs = bp -> fw_health -> normal_func_wait_dsecs ;
10664
+
10665
+ bp -> fw_reset_state = BNXT_FW_RESET_STATE_ENABLE_DEV ;
10666
+ bnxt_queue_fw_reset_work (bp , wait_dsecs * HZ / 10 );
10667
+ return ;
10668
+ }
10669
+ bp -> fw_reset_state = BNXT_FW_RESET_STATE_RESET_FW ;
10670
+ }
10671
+ /* fall through */
10632
10672
case BNXT_FW_RESET_STATE_RESET_FW : {
10633
10673
u32 wait_dsecs = bp -> fw_health -> post_reset_wait_dsecs ;
10634
10674
0 commit comments