bnx2x: Modify unload conditions
authorYuval Mintz <yuvalmin@broadcom.com>
Wed, 23 Jan 2013 03:21:49 +0000 (03:21 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 23 Jan 2013 18:58:29 +0000 (13:58 -0500)
Don't unload the bnx2x driver if its in a recovery process, or if
the previous load have failed.

Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Ariel Elior <ariele@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c

index bcb2b64..a461138 100644 (file)
@@ -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()).
         */