diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2009-11-25 17:11:19 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-11-27 00:59:32 +0100 |
commit | 1dfc5ceacd00365a9089e98643f4b26253d5a6aa (patch) | |
tree | 41dd6ca72a535d75e331d0df71a6fba26998af17 | |
parent | sfc: Only switch Falcon MAC clocks as necessary (diff) | |
download | linux-1dfc5ceacd00365a9089e98643f4b26253d5a6aa.tar.xz linux-1dfc5ceacd00365a9089e98643f4b26253d5a6aa.zip |
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>
-rw-r--r-- | drivers/net/sfc/efx.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/drivers/net/sfc/efx.c b/drivers/net/sfc/efx.c index 4ebad613e6de..155aa1cca366 100644 --- a/drivers/net/sfc/efx.c +++ b/drivers/net/sfc/efx.c @@ -737,23 +737,27 @@ static int efx_init_port(struct efx_nic *efx) EFX_LOG(efx, "init port\n"); + mutex_lock(&efx->mac_lock); + rc = efx->phy_op->init(efx); if (rc) - return rc; - mutex_lock(&efx->mac_lock); + goto fail1; efx->phy_op->reconfigure(efx); rc = falcon_switch_mac(efx); - mutex_unlock(&efx->mac_lock); if (rc) - goto fail; + goto fail2; efx->mac_op->reconfigure(efx); efx->port_initialized = true; efx_stats_enable(efx); + + mutex_unlock(&efx->mac_lock); return 0; -fail: +fail2: efx->phy_op->fini(efx); +fail1: + mutex_unlock(&efx->mac_lock); return rc; } |