Commit 48c4b6db authored by Divy Le Ray's avatar Divy Le Ray Committed by Jeff Garzik

cxgb3 - fix port up/down error path

Fix faiures path when ports are stopped and restarted
in EEH recovery.
Signed-off-by: default avatarDivy Le Ray <divy@chelsio.com>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 014377a1
...@@ -71,6 +71,7 @@ enum { /* adapter flags */ ...@@ -71,6 +71,7 @@ enum { /* adapter flags */
USING_MSIX = (1 << 2), USING_MSIX = (1 << 2),
QUEUES_BOUND = (1 << 3), QUEUES_BOUND = (1 << 3),
TP_PARITY_INIT = (1 << 4), TP_PARITY_INIT = (1 << 4),
NAPI_INIT = (1 << 5),
}; };
struct fl_pg_chunk { struct fl_pg_chunk {
......
...@@ -421,6 +421,13 @@ static void init_napi(struct adapter *adap) ...@@ -421,6 +421,13 @@ static void init_napi(struct adapter *adap)
netif_napi_add(qs->netdev, &qs->napi, qs->napi.poll, netif_napi_add(qs->netdev, &qs->napi, qs->napi.poll,
64); 64);
} }
/*
* netif_napi_add() can be called only once per napi_struct because it
* adds each new napi_struct to a list. Be careful not to call it a
* second time, e.g., during EEH recovery, by making a note of it.
*/
adap->flags |= NAPI_INIT;
} }
/* /*
...@@ -896,6 +903,7 @@ static int cxgb_up(struct adapter *adap) ...@@ -896,6 +903,7 @@ static int cxgb_up(struct adapter *adap)
goto out; goto out;
setup_rss(adap); setup_rss(adap);
if (!(adap->flags & NAPI_INIT))
init_napi(adap); init_napi(adap);
adap->flags |= FULL_INIT_DONE; adap->flags |= FULL_INIT_DONE;
} }
...@@ -999,7 +1007,7 @@ static int offload_open(struct net_device *dev) ...@@ -999,7 +1007,7 @@ static int offload_open(struct net_device *dev)
return 0; return 0;
if (!adap_up && (err = cxgb_up(adapter)) < 0) if (!adap_up && (err = cxgb_up(adapter)) < 0)
return err; goto out;
t3_tp_set_offload_mode(adapter, 1); t3_tp_set_offload_mode(adapter, 1);
tdev->lldev = adapter->port[0]; tdev->lldev = adapter->port[0];
...@@ -1061,10 +1069,8 @@ static int cxgb_open(struct net_device *dev) ...@@ -1061,10 +1069,8 @@ static int cxgb_open(struct net_device *dev)
int other_ports = adapter->open_device_map & PORT_MASK; int other_ports = adapter->open_device_map & PORT_MASK;
int err; int err;
if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0) { if (!adapter->open_device_map && (err = cxgb_up(adapter)) < 0)
quiesce_rx(adapter);
return err; return err;
}
set_bit(pi->port_id, &adapter->open_device_map); set_bit(pi->port_id, &adapter->open_device_map);
if (is_offload(adapter) && !ofld_disable) { if (is_offload(adapter) && !ofld_disable) {
...@@ -2431,7 +2437,7 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev, ...@@ -2431,7 +2437,7 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev,
pci_disable_device(pdev); pci_disable_device(pdev);
/* Request a slot slot reset. */ /* Request a slot reset. */
return PCI_ERS_RESULT_NEED_RESET; return PCI_ERS_RESULT_NEED_RESET;
} }
...@@ -2448,13 +2454,16 @@ static pci_ers_result_t t3_io_slot_reset(struct pci_dev *pdev) ...@@ -2448,13 +2454,16 @@ static pci_ers_result_t t3_io_slot_reset(struct pci_dev *pdev)
if (pci_enable_device(pdev)) { if (pci_enable_device(pdev)) {
dev_err(&pdev->dev, dev_err(&pdev->dev,
"Cannot re-enable PCI device after reset.\n"); "Cannot re-enable PCI device after reset.\n");
return PCI_ERS_RESULT_DISCONNECT; goto err;
} }
pci_set_master(pdev); pci_set_master(pdev);
t3_prep_adapter(adapter, adapter->params.info, 1); if (t3_prep_adapter(adapter, adapter->params.info, 1))
goto err;
return PCI_ERS_RESULT_RECOVERED; return PCI_ERS_RESULT_RECOVERED;
err:
return PCI_ERS_RESULT_DISCONNECT;
} }
/** /**
...@@ -2483,13 +2492,6 @@ static void t3_io_resume(struct pci_dev *pdev) ...@@ -2483,13 +2492,6 @@ static void t3_io_resume(struct pci_dev *pdev)
netif_device_attach(netdev); netif_device_attach(netdev);
} }
} }
if (is_offload(adapter)) {
__set_bit(OFFLOAD_DEVMAP_BIT, &adapter->registered_device_map);
if (offload_open(adapter->port[0]))
printk(KERN_WARNING
"Could not bring back offload capabilities\n");
}
} }
static struct pci_error_handlers t3_err_handler = { static struct pci_error_handlers t3_err_handler = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment