aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sfc/efx.c
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2009-11-25 16:11:19 +0000
committerDavid S. Miller <davem@davemloft.net>2009-11-26 15:59:32 -0800
commit1dfc5ceacd00365a9089e98643f4b26253d5a6aa (patch)
tree41dd6ca72a535d75e331d0df71a6fba26998af17 /drivers/net/sfc/efx.c
parentsfc: Only switch Falcon MAC clocks as necessary (diff)
downloadlinux-dev-1dfc5ceacd00365a9089e98643f4b26253d5a6aa.tar.xz
linux-dev-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>
Diffstat (limited to 'drivers/net/sfc/efx.c')
-rw-r--r--drivers/net/sfc/efx.c14
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;
}