[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>
This commit is contained in:
parent
24fcad6b3c
commit
c49a1561ee
1 changed files with 4 additions and 4 deletions
|
@ -6981,6 +6981,8 @@ static int tg3_open(struct net_device *dev)
|
|||
struct tg3 *tp = netdev_priv(dev);
|
||||
int err;
|
||||
|
||||
netif_carrier_off(tp->dev);
|
||||
|
||||
tg3_full_lock(tp, 0);
|
||||
|
||||
err = tg3_set_power_state(tp, PCI_D0);
|
||||
|
@ -11920,6 +11922,8 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
|||
*/
|
||||
pci_save_state(tp->pdev);
|
||||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
printk(KERN_ERR PFX "Cannot register net device, "
|
||||
|
@ -11927,8 +11931,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
|||
goto err_out_iounmap;
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
printk(KERN_INFO "%s: Tigon3 [partno(%s) rev %04x PHY(%s)] (%s) %s Ethernet ",
|
||||
dev->name,
|
||||
tp->board_part_number,
|
||||
|
@ -11959,8 +11961,6 @@ static int __devinit tg3_init_one(struct pci_dev *pdev,
|
|||
(pdev->dma_mask == DMA_32BIT_MASK) ? 32 :
|
||||
(((u64) pdev->dma_mask == DMA_40BIT_MASK) ? 40 : 64));
|
||||
|
||||
netif_carrier_off(tp->dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_out_iounmap:
|
||||
|
|
Loading…
Reference in a new issue