Skip to content

Commit

Permalink
cxgb4: keep interrupts available when the ports are brought down
Browse files Browse the repository at this point in the history
The PF driver needs to remain alert while its ports are down to service
requests or errors from virtual functions or FW so keep interrupts and
queues available when the ports are brought down.  The change makes
open_device_map unnecessary so remove it.

Signed-off-by: Dimitris Michailidis <dm@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Dimitris Michailidis authored and David S. Miller committed May 18, 2010
1 parent b6bd29e commit aaefae9
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 28 deletions.
1 change: 0 additions & 1 deletion drivers/net/cxgb4/cxgb4.h
Original file line number Diff line number Diff line change
Expand Up @@ -477,7 +477,6 @@ struct adapter {
struct pci_dev *pdev;
struct device *pdev_dev;
unsigned long registered_device_map;
unsigned long open_device_map;
unsigned long flags;

const char *name;
Expand Down
49 changes: 22 additions & 27 deletions drivers/net/cxgb4/cxgb4_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2433,23 +2433,17 @@ EXPORT_SYMBOL(cxgb4_unregister_uld);
*/
static int cxgb_up(struct adapter *adap)
{
int err = 0;
int err;

if (!(adap->flags & FULL_INIT_DONE)) {
err = setup_sge_queues(adap);
if (err)
goto out;
err = setup_rss(adap);
if (err) {
t4_free_sge_resources(adap);
goto out;
}
if (adap->flags & USING_MSIX)
name_msix_vecs(adap);
adap->flags |= FULL_INIT_DONE;
}
err = setup_sge_queues(adap);
if (err)
goto out;
err = setup_rss(adap);
if (err)
goto freeq;

if (adap->flags & USING_MSIX) {
name_msix_vecs(adap);
err = request_irq(adap->msix_info[0].vec, t4_nondata_intr, 0,
adap->msix_info[0].desc, adap);
if (err)
Expand All @@ -2470,11 +2464,14 @@ static int cxgb_up(struct adapter *adap)
enable_rx(adap);
t4_sge_start(adap);
t4_intr_enable(adap);
adap->flags |= FULL_INIT_DONE;
notify_ulds(adap, CXGB4_STATE_UP);
out:
return err;
irq_err:
dev_err(adap->pdev_dev, "request_irq failed, err %d\n", err);
freeq:
t4_free_sge_resources(adap);
goto out;
}

Expand All @@ -2490,6 +2487,9 @@ static void cxgb_down(struct adapter *adapter)
} else
free_irq(adapter->pdev->irq, adapter);
quiesce_rx(adapter);
t4_sge_stop(adapter);
t4_free_sge_resources(adapter);
adapter->flags &= ~FULL_INIT_DONE;
}

/*
Expand All @@ -2501,31 +2501,26 @@ static int cxgb_open(struct net_device *dev)
struct port_info *pi = netdev_priv(dev);
struct adapter *adapter = pi->adapter;

if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0)
return err;
if (!(adapter->flags & FULL_INIT_DONE)) {
err = cxgb_up(adapter);
if (err < 0)
return err;
}

dev->real_num_tx_queues = pi->nqsets;
set_bit(pi->tx_chan, &adapter->open_device_map);
link_start(dev);
netif_tx_start_all_queues(dev);
return 0;
}

static int cxgb_close(struct net_device *dev)
{
int ret;
struct port_info *pi = netdev_priv(dev);
struct adapter *adapter = pi->adapter;

netif_tx_stop_all_queues(dev);
netif_carrier_off(dev);
ret = t4_enable_vi(adapter, 0, pi->viid, false, false);

clear_bit(pi->tx_chan, &adapter->open_device_map);

if (!adapter->open_device_map)
cxgb_down(adapter);
return 0;
return t4_enable_vi(adapter, 0, pi->viid, false, false);
}

static struct net_device_stats *cxgb_get_stats(struct net_device *dev)
Expand Down Expand Up @@ -3360,8 +3355,8 @@ static void __devexit remove_one(struct pci_dev *pdev)
if (adapter->debugfs_root)
debugfs_remove_recursive(adapter->debugfs_root);

t4_sge_stop(adapter);
t4_free_sge_resources(adapter);
if (adapter->flags & FULL_INIT_DONE)
cxgb_down(adapter);
t4_free_mem(adapter->l2t);
t4_free_mem(adapter->tids.tid_tab);
disable_msi(adapter);
Expand Down

0 comments on commit aaefae9

Please sign in to comment.