|
@@ -2805,7 +2805,7 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
|
|
|
val & ~DRV_FLAGS_CAPABILITIES_LOADED_L2);
|
|
|
}
|
|
|
|
|
|
- if (IS_PF(bp) &&
|
|
|
+ if (IS_PF(bp) && bp->recovery_state != BNX2X_RECOVERY_DONE &&
|
|
|
(bp->state == BNX2X_STATE_CLOSED ||
|
|
|
bp->state == BNX2X_STATE_ERROR)) {
|
|
|
/* We can get here if the driver has been unloaded
|
|
@@ -2825,8 +2825,16 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * It's important to set the bp->state to the value different from
|
|
|
+ /* Nothing to do during unload if previous bnx2x_nic_load()
|
|
|
+ * have not completed succesfully - all resourses are released.
|
|
|
+ *
|
|
|
+ * we can get here only after unsuccessful ndo_* callback, during which
|
|
|
+ * dev->IFF_UP flag is still on.
|
|
|
+ */
|
|
|
+ if (bp->state == BNX2X_STATE_CLOSED || bp->state == BNX2X_STATE_ERROR)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ /* It's important to set the bp->state to the value different from
|
|
|
* BNX2X_STATE_OPEN and only then stop the Tx. Otherwise bnx2x_tx_int()
|
|
|
* may restart the Tx from the NAPI context (see bnx2x_tx_int()).
|
|
|
*/
|