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);
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;
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:
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),