aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2006-12-17 20:07:29 -0500
committerDavid S. Miller <davem@sunset.davemloft.net>2006-12-18 00:59:20 -0500
commitc49a1561ee4b663d2819b5bea3e4684eae217b19 (patch)
tree59909de4a5cba3bb84ee4b09fd793af46efc0f4f
parent24fcad6b3ca3bdbbb4614de3edc1ff16f594ba9a (diff)
[TG3]: Fix race condition when calling register_netdev().
Hot-plug scripts can call tg3_open() as soon as register_netdev() is called in tg3_init_one(). We need to call pci_set_drvdata() before register_netdev(), and netif_carrier_off() needs to be moved to tg3_open() to avoid race conditions. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/tg3.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index e47a9c1f35cb..501ea6da03cc 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -6981,6 +6981,8 @@ static int tg3_open(struct net_device *dev)
6981 struct tg3 *tp = netdev_priv(dev); 6981 struct tg3 *tp = netdev_priv(dev);
6982 int err; 6982 int err;
6983 6983
6984 netif_carrier_off(tp->dev);
6985
6984 tg3_full_lock(tp, 0); 6986 tg3_full_lock(tp, 0);
6985 6987
6986 err = tg3_set_power_state(tp, PCI_D0); 6988 err = tg3_set_power_state(tp, PCI_D0);
@@ -11920,6 +11922,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
11920 */ 11922 */
11921 pci_save_state(tp->pdev); 11923 pci_save_state(tp->pdev);
11922 11924
11925 pci_set_drvdata(pdev, dev);
11926
11923 err = register_netdev(dev); 11927 err = register_netdev(dev);
11924 if (err) { 11928 if (err) {
11925 printk(KERN_ERR PFX "Cannot register net device, " 11929 printk(KERN_ERR PFX "Cannot register net device, "
@@ -11927,8 +11931,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
11927 goto err_out_iounmap; 11931 goto err_out_iounmap;
11928 } 11932 }
11929 11933
11930 pci_set_drvdata(pdev, dev);
11931
11932 printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %s Ethernet ", 11934 printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %s Ethernet ",
11933 dev->name, 11935 dev->name,
11934 tp->board_part_number, 11936 tp->board_part_number,
@@ -11959,8 +11961,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
11959 (pdev->dma_mask == DMA_32BIT_MASK) ? 32 : 11961 (pdev->dma_mask == DMA_32BIT_MASK) ? 32 :
11960 (((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64)); 11962 (((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64));
11961 11963
11962 netif_carrier_off(tp->dev);
11963
11964 return 0; 11964 return 0;
11965 11965
11966err_out_iounmap: 11966err_out_iounmap: