summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKalesh AP <kalesh.purayil@emulex.com>2015-02-23 04:20:12 -0500
committerDavid S. Miller <davem@davemloft.net>2015-02-23 15:08:32 -0500
commitd0e1b319bbf345e8b8cc8bd7702cc6c33db074d9 (patch)
tree25e410f113ab6c28bf7f2870232e983a934714d1
parenteb7dd46c634fa5b2f2039791bd2e79343318d6e5 (diff)
downloadop-kernel-dev-d0e1b319bbf345e8b8cc8bd7702cc6c33db074d9.zip
op-kernel-dev-d0e1b319bbf345e8b8cc8bd7702cc6c33db074d9.tar.gz
be2net: refactor error detect/recovery function
Currently when an error is detected, the queue resources are being cleaned up in the recovery routine. The resources are better cleaned up in the error detection routine itself (similar to EEH code.) So, this patch re-factors error processing logic to follow the following sequence: - check if there is an error in adapter - if error, - cleanup resources - attempt recovery The patch renames lancer_recover_func() to be_err_recover() as this routine will be used in the future for error recovery on Skyhawk too. Signed-off-by: Kalesh AP <kalesh.purayil@emulex.com> Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index 74ba995..034ce70 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -2844,12 +2844,12 @@ void be_detect_error(struct be_adapter *adapter)
sliport_err2 = ioread32(adapter->db +
SLIPORT_ERROR2_OFFSET);
adapter->hw_error = true;
+ error_detected = true;
/* Do not log error messages if its a FW reset */
if (sliport_err1 == SLIPORT_ERROR_FW_RESET1 &&
sliport_err2 == SLIPORT_ERROR_FW_RESET2) {
dev_info(dev, "Firmware update in progress\n");
} else {
- error_detected = true;
dev_err(dev, "Error detected in the card\n");
dev_err(dev, "ERR: sliport status 0x%x\n",
sliport_status);
@@ -4903,8 +4903,9 @@ static void be_netdev_init(struct net_device *netdev)
netdev->ethtool_ops = &be_ethtool_ops;
}
-static int lancer_recover_func(struct be_adapter *adapter)
+static int be_err_recover(struct be_adapter *adapter)
{
+ struct net_device *netdev = adapter->netdev;
struct device *dev = &adapter->pdev->dev;
int status;
@@ -4912,23 +4913,20 @@ static int lancer_recover_func(struct be_adapter *adapter)
if (status)
goto err;
- if (netif_running(adapter->netdev))
- be_close(adapter->netdev);
-
- be_clear(adapter);
-
be_clear_all_error(adapter);
status = be_setup(adapter);
if (status)
goto err;
- if (netif_running(adapter->netdev)) {
- status = be_open(adapter->netdev);
+ if (netif_running(netdev)) {
+ status = be_open(netdev);
if (status)
goto err;
}
+ netif_device_attach(netdev);
+
dev_err(dev, "Adapter recovery successful\n");
return 0;
err:
@@ -4945,18 +4943,23 @@ static void be_err_detection_task(struct work_struct *work)
struct be_adapter *adapter =
container_of(work, struct be_adapter,
be_err_detection_work.work);
+ struct net_device *netdev = adapter->netdev;
int status = 0;
be_detect_error(adapter);
- if (adapter->hw_error && lancer_chip(adapter)) {
+ if (adapter->hw_error) {
rtnl_lock();
- netif_device_detach(adapter->netdev);
+ netif_device_detach(netdev);
+ if (netif_running(netdev))
+ be_close(netdev);
rtnl_unlock();
- status = lancer_recover_func(adapter);
- if (!status)
- netif_device_attach(adapter->netdev);
+ be_clear(adapter);
+
+ /* As of now error recovery support is in Lancer only */
+ if (lancer_chip(adapter))
+ status = be_err_recover(adapter);
}
/* In Lancer, for all errors other than provisioning error (-EAGAIN),
OpenPOWER on IntegriCloud