|
@@ -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),
|