aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sfc
diff options
context:
space:
mode:
authorSteve Hodgson <shodgson@solarflare.com>2008-12-13 01:08:16 -0500
committerDavid S. Miller <davem@davemloft.net>2008-12-13 01:08:16 -0500
commitfa402b2ea9cacd1ec94fa77e3efb506a5d034da6 (patch)
treeded41421f45edc98d40ce729d61bfea3d91e0d53 /drivers/net/sfc
parentab377358701a981e7fae1332e76b1e5d3b3b313d (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.c13
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))