@@ -446,6 +446,7 @@ enum ixbgevf_state_t {
__IXGBEVF_SERVICE_INITED,
__IXGBEVF_RESET_REQUESTED,
__IXGBEVF_QUEUE_RESET_REQUESTED,
+ __IXGBEVF_HW_RESETTING,
};
enum ixgbevf_boards {
@@ -2795,9 +2795,10 @@ static void ixgbevf_check_hang_subtask(struct ixgbevf_adapter *adapter)
u32 eics = 0;
int i;
- /* If we're down or resetting, just bail */
+ /* If we're down, resetting or hw resetting, just bail */
if (test_bit(__IXGBEVF_DOWN, &adapter->state) ||
- test_bit(__IXGBEVF_RESETTING, &adapter->state))
+ test_bit(__IXGBEVF_RESETTING, &adapter->state) ||
+ test_bit(__IXGBEVF_HW_RESETTING, &adapter->state))
return;
/* Force detection of hung controller */
@@ -80,6 +80,9 @@ static s32 ixgbevf_reset_hw_vf(struct ixgbe_hw *hw)
s32 ret_val = IXGBE_ERR_INVALID_MAC_ADDR;
u32 msgbuf[IXGBE_VF_PERMADDR_MSG_LEN];
u8 *addr = (u8 *)(&msgbuf[1]);
+ struct ixgbevf_adapter *adapter = hw->back;
+
+ set_bit(__IXGBEVF_HW_RESETTING, &adapter->state);
/* Call adapter stop to disable tx/rx and clear interrupts */
hw->mac.ops.stop_adapter(hw);
@@ -128,6 +131,8 @@ static s32 ixgbevf_reset_hw_vf(struct ixgbe_hw *hw)
hw->mac.mc_filter_type = msgbuf[IXGBE_VF_MC_TYPE_WORD];
+ clear_bit(__IXGBEVF_HW_RESETTING, &adapter->state);
+
return 0;
}