mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 17:41:44 +00:00
[BNX2]: Fix race conditions when calling register_netdev().
Hot-plug scripts can call bnx2_open() as soon as register_netdev() is called in bnx2_init_one(). We need to call pci_set_drvdata() and setup everything before calling register_netdev(). netif_carrier_off() also needs to be moved to bnx2_open() to avoid race conditions with the irq. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
40453c839f
commit
1b2f922f68
@ -4350,6 +4350,8 @@ bnx2_open(struct net_device *dev)
|
||||
struct bnx2 *bp = netdev_priv(dev);
|
||||
int rc;
|
||||
|
||||
netif_carrier_off(dev);
|
||||
|
||||
bnx2_set_power_state(bp, PCI_D0);
|
||||
bnx2_disable_int(bp);
|
||||
|
||||
@ -6086,6 +6088,18 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
dev->poll_controller = poll_bnx2;
|
||||
#endif
|
||||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
memcpy(dev->dev_addr, bp->mac_addr, 6);
|
||||
memcpy(dev->perm_addr, bp->mac_addr, 6);
|
||||
bp->name = board_info[ent->driver_data].name;
|
||||
|
||||
dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
|
||||
#ifdef BCM_VLAN
|
||||
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
|
||||
#endif
|
||||
dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
|
||||
|
||||
if ((rc = register_netdev(dev))) {
|
||||
dev_err(&pdev->dev, "Cannot register net device\n");
|
||||
if (bp->regview)
|
||||
@ -6097,11 +6111,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
return rc;
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, dev);
|
||||
|
||||
memcpy(dev->dev_addr, bp->mac_addr, 6);
|
||||
memcpy(dev->perm_addr, bp->mac_addr, 6);
|
||||
bp->name = board_info[ent->driver_data].name,
|
||||
printk(KERN_INFO "%s: %s (%c%d) PCI%s %s %dMHz found at mem %lx, "
|
||||
"IRQ %d, ",
|
||||
dev->name,
|
||||
@ -6119,15 +6128,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
printk("%2.2x", dev->dev_addr[i]);
|
||||
printk("\n");
|
||||
|
||||
dev->features |= NETIF_F_SG;
|
||||
dev->features |= NETIF_F_IP_CSUM;
|
||||
#ifdef BCM_VLAN
|
||||
dev->features |= NETIF_F_HW_VLAN_TX | NETIF_F_HW_VLAN_RX;
|
||||
#endif
|
||||
dev->features |= NETIF_F_TSO | NETIF_F_TSO_ECN;
|
||||
|
||||
netif_carrier_off(bp->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user