diff options
author | Steve Hodgson <shodgson@solarflare.com> | 2008-12-13 01:08:16 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-13 01:08:16 -0500 |
commit | fa402b2ea9cacd1ec94fa77e3efb506a5d034da6 (patch) | |
tree | ded41421f45edc98d40ce729d61bfea3d91e0d53 /drivers/net/sfc | |
parent | ab377358701a981e7fae1332e76b1e5d3b3b313d (diff) |
sfc: Treat probe as unsuccessful if it scheduled a reset
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>
Diffstat (limited to 'drivers/net/sfc')
-rw-r--r-- | drivers/net/sfc/efx.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index ce1c7d3cd12e..8f832bf1e4d2 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c | |||
@@ -2112,8 +2112,6 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev, | |||
2112 | * we're in STATE_INIT. */ | 2112 | * we're in STATE_INIT. */ |
2113 | for (i = 0; i < 5; i++) { | 2113 | for (i = 0; i < 5; i++) { |
2114 | rc = efx_pci_probe_main(efx); | 2114 | rc = efx_pci_probe_main(efx); |
2115 | if (rc == 0) | ||
2116 | break; | ||
2117 | 2115 | ||
2118 | /* Serialise against efx_reset(). No more resets will be | 2116 | /* Serialise against efx_reset(). No more resets will be |
2119 | * scheduled since efx_stop_all() has been called, and we | 2117 | * 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, | |||
2121 | * the rtnetlink or driverlink layers. */ | 2119 | * the rtnetlink or driverlink layers. */ |
2122 | cancel_work_sync(&efx->reset_work); | 2120 | cancel_work_sync(&efx->reset_work); |
2123 | 2121 | ||
2122 | if (rc == 0) { | ||
2123 | if (efx->reset_pending != RESET_TYPE_NONE) { | ||
2124 | /* If there was a scheduled reset during | ||
2125 | * probe, the NIC is probably hosed anyway */ | ||
2126 | efx_pci_remove_main(efx); | ||
2127 | rc = -EIO; | ||
2128 | } else { | ||
2129 | break; | ||
2130 | } | ||
2131 | } | ||
2132 | |||
2124 | /* Retry if a recoverably reset event has been scheduled */ | 2133 | /* Retry if a recoverably reset event has been scheduled */ |
2125 | if ((efx->reset_pending != RESET_TYPE_INVISIBLE) && | 2134 | if ((efx->reset_pending != RESET_TYPE_INVISIBLE) && |
2126 | (efx->reset_pending != RESET_TYPE_ALL)) | 2135 | (efx->reset_pending != RESET_TYPE_ALL)) |