diff options
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c index e077d2508727..6af310195bae 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | |||
@@ -9122,13 +9122,34 @@ static int __devinit bnx2x_prev_unload_common(struct bnx2x *bp) | |||
9122 | return bnx2x_prev_mcp_done(bp); | 9122 | return bnx2x_prev_mcp_done(bp); |
9123 | } | 9123 | } |
9124 | 9124 | ||
9125 | /* previous driver DMAE transaction may have occurred when pre-boot stage ended | ||
9126 | * and boot began, or when kdump kernel was loaded. Either case would invalidate | ||
9127 | * the addresses of the transaction, resulting in was-error bit set in the pci | ||
9128 | * causing all hw-to-host pcie transactions to timeout. If this happened we want | ||
9129 | * to clear the interrupt which detected this from the pglueb and the was done | ||
9130 | * bit | ||
9131 | */ | ||
9132 | static void __devinit bnx2x_prev_interrupted_dmae(struct bnx2x *bp) | ||
9133 | { | ||
9134 | u32 val = REG_RD(bp, PGLUE_B_REG_PGLUE_B_INT_STS); | ||
9135 | if (val & PGLUE_B_PGLUE_B_INT_STS_REG_WAS_ERROR_ATTN) { | ||
9136 | BNX2X_ERR("was error bit was found to be set in pglueb upon startup. Clearing"); | ||
9137 | REG_WR(bp, PGLUE_B_REG_WAS_ERROR_PF_7_0_CLR, 1 << BP_FUNC(bp)); | ||
9138 | } | ||
9139 | } | ||
9140 | |||
9125 | static int __devinit bnx2x_prev_unload(struct bnx2x *bp) | 9141 | static int __devinit bnx2x_prev_unload(struct bnx2x *bp) |
9126 | { | 9142 | { |
9127 | int time_counter = 10; | 9143 | int time_counter = 10; |
9128 | u32 rc, fw, hw_lock_reg, hw_lock_val; | 9144 | u32 rc, fw, hw_lock_reg, hw_lock_val; |
9129 | BNX2X_DEV_INFO("Entering Previous Unload Flow\n"); | 9145 | BNX2X_DEV_INFO("Entering Previous Unload Flow\n"); |
9130 | 9146 | ||
9131 | /* Release previously held locks */ | 9147 | /* clear hw from errors which may have resulted from an interrupted |
9148 | * dmae transaction. | ||
9149 | */ | ||
9150 | bnx2x_prev_interrupted_dmae(bp); | ||
9151 | |||
9152 | /* Release previously held locks */ | ||
9132 | hw_lock_reg = (BP_FUNC(bp) <= 5) ? | 9153 | hw_lock_reg = (BP_FUNC(bp) <= 5) ? |
9133 | (MISC_REG_DRIVER_CONTROL_1 + BP_FUNC(bp) * 8) : | 9154 | (MISC_REG_DRIVER_CONTROL_1 + BP_FUNC(bp) * 8) : |
9134 | (MISC_REG_DRIVER_CONTROL_7 + (BP_FUNC(bp) - 6) * 8); | 9155 | (MISC_REG_DRIVER_CONTROL_7 + (BP_FUNC(bp) - 6) * 8); |