Commit fadac6aa authored by Ben Hutchings's avatar Ben Hutchings
Browse files

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: default avatarBen Hutchings <bhutchings@solarflare.com>
parent d9ab7007
Loading
Loading
Loading
Loading
+16 −34
Original line number Diff line number Diff line
@@ -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;
	struct net_device *net_dev;
	struct efx_nic *efx;
	int i, rc;
	int rc;

	/* Allocate and initialise a struct net_device and struct efx_nic */
	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)
		goto fail2;

	/* No serialisation is required with the reset path because
	 * 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
		 * scheduled since efx_stop_all() has been called, and we
		 * have not and never have been registered with either
		 * the rtnetlink or driverlink layers. */
	 * scheduled since efx_stop_all() has been called, and we have
	 * not and never have been registered.
	 */
	cancel_work_sync(&efx->reset_work);

		if (rc == 0) {
			if (efx->reset_pending) {
				/* 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 &
		    ~(1 << RESET_TYPE_INVISIBLE | 1 << RESET_TYPE_ALL) ||
		    !efx->reset_pending)
	if (rc)
		goto fail3;

		efx->reset_pending = 0;
	}

	if (rc) {
		netif_err(efx, probe, efx->net_dev, "Could not reset NIC\n");
	/* If there was a scheduled reset during probe, the NIC is
	 * probably hosed anyway.
	 */
	if (efx->reset_pending) {
		rc = -EIO;
		goto fail4;
	}

@@ -2515,7 +2498,7 @@ static int __devinit efx_pci_probe(struct pci_dev *pci_dev,

	rc = efx_register_netdev(efx);
	if (rc)
		goto fail5;
		goto fail4;

	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();
	return 0;

 fail5:
	efx_pci_remove_main(efx);
 fail4:
	efx_pci_remove_main(efx);
 fail3:
	efx_fini_io(efx);
 fail2: