mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-15 21:56:40 +07:00
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:
parent
d9ab70079a
commit
fadac6aae1
@ -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:
|
||||||
|
Loading…
Reference in New Issue
Block a user