sfc: Fix ordering of device registration and initial netif_carrier_off()
Subsystems (2)
PATCH 1/7 sfc: Fix ordering of device registration and initial netif_carrier_off()
We must call netif_carrier_off() after the device is registered, not before, to set the operational state and user-space IFF_RUNNING flag correctly.
Since we don't want observers to see an intermediate state, open-code register_netdev() and add efx_update_name() and netif_carrier_off() into the locked region.
--- drivers/net/sfc/efx.c | 26 +++++++++++++++++--------- 1 files changed, 17 insertions(+), 9 deletions(-)
drivers/net/sfc/efx.c +17 -9
@@ -1614,21 +1614,24 @@ static int efx_register_netdev(struct efx_nic *efx)SET_NETDEV_DEV (net_dev, &efx->pci_dev->dev);SET_ETHTOOL_OPS (net_dev, &efx_ethtool_ops); -/* Always start with carrier off; PHY events will detect the link */ -netif_carrier_off (efx->net_dev); -/* Clear MAC statistics */ efx->mac_op->update_stats (efx);memset (&efx->mac_stats,0 ,sizeof (efx->mac_stats)); - rc =register_netdev (net_dev); -if (rc) { -EFX_ERR (efx,"could not register net dev\n" ); -return rc; - } -rtnl_lock (); + + rc =dev_alloc_name (net_dev, net_dev->name); +if (rc <0 ) + goto fail_locked;efx_update_name (efx); + + rc =register_netdevice (net_dev); +if (rc) + goto fail_locked; + +/* Always start with carrier off; PHY events will detect the link */ +netif_carrier_off (efx->net_dev); +rtnl_unlock (); rc =device_create_file (&efx->pci_dev->dev, &dev_attr_phy_type);
@@ -1639,6 +1642,11 @@ static int efx_register_netdev(struct efx_nic *efx)return 0 ; +fail_locked: +rtnl_unlock (); +EFX_ERR (efx,"could not register net dev\n" ); +return rc; + fail_registered:unregister_netdev (net_dev);return rc;
Signature · 3 lines
Ben Hutchings, Senior Software Engineer, Solarflare Communications Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
From: Ben Hutchings <[email protected]>
Date: Wed, 26 Aug 2009 19:16:27 +0100
Quoted 9 lines
We must call
netif_carrier_off()after the device is registered, not before, to set the operational state and user-spaceIFF_RUNNINGflag correctly.Since we don't want observers to see an intermediate state, open-code
register_netdev()and addefx_update_name()andnetif_carrier_off()into the locked region.Signed-off-by Ben Hutchings <[email protected]>
Applied.