cxgb3 - fix port up/down error path
Fix faiures path when ports are stopped and restarted in EEH recovery. Signed-off-by: Divy Le Ray <divy@chelsio.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
@@ -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)
|
|||||||
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,7 +903,8 @@ static int cxgb_up(struct adapter *adap)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
setup_rss(adap);
|
setup_rss(adap);
|
||||||
init_napi(adap);
|
if (!(adap->flags & NAPI_INIT))
|
||||||
|
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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 = {
|
||||||
|
Reference in New Issue
Block a user