Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 156913
b: refs/heads/master
c: a3059b1
h: refs/heads/master
i:
  156911: 5ca3b01
v: v3
  • Loading branch information
Michael Chan authored and David S. Miller committed Aug 16, 2009
1 parent 9d3f29f commit 3e408c3
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 14 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 64c6460875957502541a4ba30835ac625a0bee79
refs/heads/master: a3059b12adae868c42629ecf058a94195ef1e958
49 changes: 36 additions & 13 deletions trunk/drivers/net/cnic.c
Original file line number Diff line number Diff line change
Expand Up @@ -2393,21 +2393,45 @@ static int cnic_start_bnx2_hw(struct cnic_dev *dev)
return 0;
}

static int cnic_start_hw(struct cnic_dev *dev)
static int cnic_register_netdev(struct cnic_dev *dev)
{
struct cnic_local *cp = dev->cnic_priv;
struct cnic_eth_dev *ethdev = cp->ethdev;
int err;

if (test_bit(CNIC_F_CNIC_UP, &dev->flags))
return -EALREADY;
if (!ethdev)
return -ENODEV;

if (ethdev->drv_state & CNIC_DRV_STATE_REGD)
return 0;

err = ethdev->drv_register_cnic(dev->netdev, cp->cnic_ops, dev);
if (err) {
if (err)
printk(KERN_ERR PFX "%s: register_cnic failed\n",
dev->netdev->name);
goto err2;
}

return err;
}

static void cnic_unregister_netdev(struct cnic_dev *dev)
{
struct cnic_local *cp = dev->cnic_priv;
struct cnic_eth_dev *ethdev = cp->ethdev;

if (!ethdev)
return;

ethdev->drv_unregister_cnic(dev->netdev);
}

static int cnic_start_hw(struct cnic_dev *dev)
{
struct cnic_local *cp = dev->cnic_priv;
struct cnic_eth_dev *ethdev = cp->ethdev;
int err;

if (test_bit(CNIC_F_CNIC_UP, &dev->flags))
return -EALREADY;

dev->regview = ethdev->io_base;
cp->chip_id = ethdev->chip_id;
Expand Down Expand Up @@ -2438,18 +2462,13 @@ static int cnic_start_hw(struct cnic_dev *dev)
return 0;

err1:
ethdev->drv_unregister_cnic(dev->netdev);
cp->free_resc(dev);
pci_dev_put(dev->pcidev);
err2:
return err;
}

static void cnic_stop_bnx2_hw(struct cnic_dev *dev)
{
struct cnic_local *cp = dev->cnic_priv;
struct cnic_eth_dev *ethdev = cp->ethdev;

cnic_disable_bnx2_int_sync(dev);

cnic_reg_wr_ind(dev, BNX2_CP_SCRATCH + 0x20, 0);
Expand All @@ -2461,8 +2480,6 @@ static void cnic_stop_bnx2_hw(struct cnic_dev *dev)
cnic_setup_5709_context(dev, 0);
cnic_free_irq(dev);

ethdev->drv_unregister_cnic(dev->netdev);

cnic_free_resc(dev);
}

Expand Down Expand Up @@ -2646,6 +2663,10 @@ static int cnic_netdev_event(struct notifier_block *this, unsigned long event,
else if (event == NETDEV_UNREGISTER)
cnic_ulp_exit(dev);
else if (event == NETDEV_UP) {
if (cnic_register_netdev(dev) != 0) {
cnic_put(dev);
goto done;
}
mutex_lock(&cnic_lock);
if (!cnic_start_hw(dev))
cnic_ulp_start(dev);
Expand All @@ -2672,6 +2693,7 @@ static int cnic_netdev_event(struct notifier_block *this, unsigned long event,
cnic_ulp_stop(dev);
cnic_stop_hw(dev);
mutex_unlock(&cnic_lock);
cnic_unregister_netdev(dev);
} else if (event == NETDEV_UNREGISTER) {
write_lock(&cnic_dev_lock);
list_del_init(&dev->list);
Expand Down Expand Up @@ -2703,6 +2725,7 @@ static void cnic_release(void)
}

cnic_ulp_exit(dev);
cnic_unregister_netdev(dev);
list_del_init(&dev->list);
cnic_free_dev(dev);
}
Expand Down

0 comments on commit 3e408c3

Please sign in to comment.