|
@@ -51,8 +51,12 @@ static s32 fm10k_reset_hw_pf(struct fm10k_hw *hw)
|
|
|
|
|
|
/* shut down all rings */
|
|
|
err = fm10k_disable_queues_generic(hw, FM10K_MAX_QUEUES);
|
|
|
- if (err)
|
|
|
+ if (err == FM10K_ERR_REQUESTS_PENDING) {
|
|
|
+ hw->mac.reset_while_pending++;
|
|
|
+ goto force_reset;
|
|
|
+ } else if (err) {
|
|
|
return err;
|
|
|
+ }
|
|
|
|
|
|
/* Verify that DMA is no longer active */
|
|
|
reg = fm10k_read_reg(hw, FM10K_DMA_CTRL);
|
|
@@ -62,27 +66,27 @@ static s32 fm10k_reset_hw_pf(struct fm10k_hw *hw)
|
|
|
/* verify the switch is ready for reset */
|
|
|
reg = fm10k_read_reg(hw, FM10K_DMA_CTRL2);
|
|
|
if (!(reg & FM10K_DMA_CTRL2_SWITCH_READY))
|
|
|
- goto out;
|
|
|
+ return FM10K_ERR_DMA_PENDING;
|
|
|
|
|
|
+force_reset:
|
|
|
/* Inititate data path reset */
|
|
|
- reg |= FM10K_DMA_CTRL_DATAPATH_RESET;
|
|
|
+ reg = FM10K_DMA_CTRL_DATAPATH_RESET;
|
|
|
fm10k_write_reg(hw, FM10K_DMA_CTRL, reg);
|
|
|
|
|
|
/* Flush write and allow 100us for reset to complete */
|
|
|
fm10k_write_flush(hw);
|
|
|
udelay(FM10K_RESET_TIMEOUT);
|
|
|
|
|
|
- /* Verify we made it out of reset */
|
|
|
- reg = fm10k_read_reg(hw, FM10K_IP);
|
|
|
- if (!(reg & FM10K_IP_NOTINRESET))
|
|
|
- err = FM10K_ERR_RESET_FAILED;
|
|
|
-
|
|
|
/* Reset mailbox global interrupts */
|
|
|
reg = FM10K_MBX_GLOBAL_REQ_INTERRUPT | FM10K_MBX_GLOBAL_ACK_INTERRUPT;
|
|
|
fm10k_write_reg(hw, FM10K_GMBX, reg);
|
|
|
|
|
|
-out:
|
|
|
- return err;
|
|
|
+ /* Verify we made it out of reset */
|
|
|
+ reg = fm10k_read_reg(hw, FM10K_IP);
|
|
|
+ if (!(reg & FM10K_IP_NOTINRESET))
|
|
|
+ return FM10K_ERR_RESET_FAILED;
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
/**
|