sfc: Hold MAC lock for longer in efx_init_port()

Although efx_init_port() is only called at probe time and so cannot
race with port reconfiguration, most of the functions it calls can
expect to be called with the MAC lock held.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Ben Hutchings 2009-11-25 16:11:19 +00:00 committed by David S. Miller
parent 26deba5013
commit 1dfc5ceacd

View file

@ -737,23 +737,27 @@ static int efx_init_port(struct efx_nic *efx)
EFX_LOG(efx, "init port\n"); EFX_LOG(efx, "init port\n");
mutex_lock(&efx->mac_lock);
rc = efx->phy_op->init(efx); rc = efx->phy_op->init(efx);
if (rc) if (rc)
return rc; goto fail1;
mutex_lock(&efx->mac_lock);
efx->phy_op->reconfigure(efx); efx->phy_op->reconfigure(efx);
rc = falcon_switch_mac(efx); rc = falcon_switch_mac(efx);
mutex_unlock(&efx->mac_lock);
if (rc) if (rc)
goto fail; goto fail2;
efx->mac_op->reconfigure(efx); efx->mac_op->reconfigure(efx);
efx->port_initialized = true; efx->port_initialized = true;
efx_stats_enable(efx); efx_stats_enable(efx);
mutex_unlock(&efx->mac_lock);
return 0; return 0;
fail: fail2:
efx->phy_op->fini(efx); efx->phy_op->fini(efx);
fail1:
mutex_unlock(&efx->mac_lock);
return rc; return rc;
} }