sfc: Treat probe as unsuccessful if it scheduled a reset
authorSteve Hodgson <shodgson@solarflare.com>
Sat, 13 Dec 2008 06:08:16 +0000 (22:08 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 13 Dec 2008 06:08:16 +0000 (22:08 -0800)
From: Steve Hodgson <shodgson@solarflare.com>

efx_pci_probe_main() can return success despite a reset being scheduled.
Catch this and retry or abort probe depending on the reset type.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sfc/efx.c

index ce1c7d3cd12ee5eba330e2ffec79d91c0a5008b3..8f832bf1e4d229711afe0944fe075d774472bf3a 100644 (file)
@@ -2112,8 +2112,6 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
         * we're in STATE_INIT. */
        for (i = 0; i < 5; i++) {
                rc = efx_pci_probe_main(efx);
-               if (rc == 0)
-                       break;
 
                /* Serialise against efx_reset(). No more resets will be
                 * scheduled since efx_stop_all() has been called, and we
@@ -2121,6 +2119,17 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
                 * the rtnetlink or driverlink layers. */
                cancel_work_sync(&efx->reset_work);
 
+               if (rc == 0) {
+                       if (efx->reset_pending != RESET_TYPE_NONE) {
+                               /* If there was a scheduled reset during
+                                * probe, the NIC is probably hosed anyway */
+                               efx_pci_remove_main(efx);
+                               rc = -EIO;
+                       } else {
+                               break;
+                       }
+               }
+
                /* Retry if a recoverably reset event has been scheduled */
                if ((efx->reset_pending != RESET_TYPE_INVISIBLE) &&
                    (efx->reset_pending != RESET_TYPE_ALL))