sfc: Use netif_device_{detach,attach}() around reset and self-test
We need to keep the TX queues stopped throughout a reset, without triggering the TX watchdog and regardless of the link state. The proper way to do this is to use netif_device_{detach,attach}() just as we do around suspend/resume, rather than the current bodge of faking link-down. Since we also need to do this during an offline self-test and we perform a reset during that, add these function calls outside of efx_reset_down() and efx_reset_up(). Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
This commit is contained in:
@@ -798,11 +798,6 @@ void efx_link_status_changed(struct efx_nic *efx)
|
||||
if (!netif_running(efx->net_dev))
|
||||
return;
|
||||
|
||||
if (efx->port_inhibited) {
|
||||
netif_carrier_off(efx->net_dev);
|
||||
return;
|
||||
}
|
||||
|
||||
if (link_state->up != netif_carrier_ok(efx->net_dev)) {
|
||||
efx->n_link_state_changes++;
|
||||
|
||||
@@ -1450,7 +1445,7 @@ static void efx_start_all(struct efx_nic *efx)
|
||||
* restart the transmit interface early so the watchdog timer stops */
|
||||
efx_start_port(efx);
|
||||
|
||||
if (efx_dev_registered(efx) && !efx->port_inhibited)
|
||||
if (efx_dev_registered(efx) && netif_device_present(efx->net_dev))
|
||||
netif_tx_wake_all_queues(efx->net_dev);
|
||||
|
||||
efx_for_each_channel(channel, efx)
|
||||
@@ -2114,6 +2109,7 @@ int efx_reset(struct efx_nic *efx, enum reset_type method)
|
||||
netif_info(efx, drv, efx->net_dev, "resetting (%s)\n",
|
||||
RESET_TYPE(method));
|
||||
|
||||
netif_device_detach(efx->net_dev);
|
||||
efx_reset_down(efx, method);
|
||||
|
||||
rc = efx->type->reset(efx, method);
|
||||
@@ -2147,6 +2143,7 @@ out:
|
||||
efx->state = STATE_DISABLED;
|
||||
} else {
|
||||
netif_dbg(efx, drv, efx->net_dev, "reset complete\n");
|
||||
netif_device_attach(efx->net_dev);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
Reference in New Issue
Block a user