sfc: Do not retry hardware probe if it schedules a reset

If efx_pci_probe_main() schedules an INVISIBLE or ALL reset (but
nothing more drastic), we retry it up to 5 times.  So far as I'm
aware, this was a workaround for bugs in Falcon A0 which were fixed
in production silicon.  Remove the retry.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
Ben Hutchings 2011-11-19 00:35:47 +00:00
parent d9ab70079a
commit fadac6aae1

View File

@ -2440,7 +2440,7 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
const struct efx_nic_type *type = (const struct efx_nic_type *) entry->driver_data; const struct efx_nic_type *type = (const struct efx_nic_type *) entry->driver_data;
struct net_device *net_dev; struct net_device *net_dev;
struct efx_nic *efx; struct efx_nic *efx;
int i, rc; int rc;
/* Allocate and initialise a struct net_device and struct efx_nic */ /* Allocate and initialise a struct net_device and struct efx_nic */
net_dev = alloc_etherdev_mqs(sizeof(*efx), EFX_MAX_CORE_TX_QUEUES, net_dev = alloc_etherdev_mqs(sizeof(*efx), EFX_MAX_CORE_TX_QUEUES,
@ -2473,39 +2473,22 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
if (rc) if (rc)
goto fail2; goto fail2;
/* No serialisation is required with the reset path because rc = efx_pci_probe_main(efx);
* we're in STATE_INIT. */
for (i = 0; i < 5; i++) {
rc = efx_pci_probe_main(efx);
/* Serialise against efx_reset(). No more resets will be /* Serialise against efx_reset(). No more resets will be
* scheduled since efx_stop_all() has been called, and we * scheduled since efx_stop_all() has been called, and we have
* have not and never have been registered with either * not and never have been registered.
* the rtnetlink or driverlink layers. */ */
cancel_work_sync(&efx->reset_work); cancel_work_sync(&efx->reset_work);
if (rc == 0) { if (rc)
if (efx->reset_pending) { goto fail3;
/* 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 there was a scheduled reset during probe, the NIC is
if (efx->reset_pending & * probably hosed anyway.
~(1 << RESET_TYPE_INVISIBLE | 1 << RESET_TYPE_ALL) || */
!efx->reset_pending) if (efx->reset_pending) {
goto fail3; rc = -EIO;
efx->reset_pending = 0;
}
if (rc) {
netif_err(efx, probe, efx->net_dev, "Could not reset NIC\n");
goto fail4; goto fail4;
} }
@ -2515,7 +2498,7 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
rc = efx_register_netdev(efx); rc = efx_register_netdev(efx);
if (rc) if (rc)
goto fail5; goto fail4;
netif_dbg(efx, probe, efx->net_dev, "initialisation successful\n"); netif_dbg(efx, probe, efx->net_dev, "initialisation successful\n");
@ -2524,9 +2507,8 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,
rtnl_unlock(); rtnl_unlock();
return 0; return 0;
fail5:
efx_pci_remove_main(efx);
fail4: fail4:
efx_pci_remove_main(efx);
fail3: fail3:
efx_fini_io(efx); efx_fini_io(efx);
fail2: fail2: