Commit 972f37b4 authored by Padmanabh Ratnakar's avatar Padmanabh Ratnakar Committed by David S. Miller

be2net: Add retry in case of error recovery failure

Retry error recovery MAX_ERR_RECOVERY_RETRY_COUNT times in case of
failure during error recovery.
Signed-off-by: default avatarPadmanabh Ratnakar <padmanabh.ratnakar@broadcom.com>
Signed-off-by: default avatarSriharsha Basavapatna <sriharsha.basavapatna@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1babbad4
...@@ -397,6 +397,10 @@ enum vf_state { ...@@ -397,6 +397,10 @@ enum vf_state {
#define BE_UC_PMAC_COUNT 30 #define BE_UC_PMAC_COUNT 30
#define BE_VF_UC_PMAC_COUNT 2 #define BE_VF_UC_PMAC_COUNT 2
#define MAX_ERR_RECOVERY_RETRY_COUNT 3
#define ERR_DETECTION_DELAY 1000
#define ERR_RECOVERY_RETRY_DELAY 30000
/* Ethtool set_dump flags */ /* Ethtool set_dump flags */
#define LANCER_INITIATE_FW_DUMP 0x1 #define LANCER_INITIATE_FW_DUMP 0x1
#define LANCER_DELETE_FW_DUMP 0x2 #define LANCER_DELETE_FW_DUMP 0x2
...@@ -534,6 +538,7 @@ struct be_adapter { ...@@ -534,6 +538,7 @@ struct be_adapter {
u16 work_counter; u16 work_counter;
struct delayed_work be_err_detection_work; struct delayed_work be_err_detection_work;
u8 recovery_retries;
u8 err_flags; u8 err_flags;
u32 flags; u32 flags;
u32 cmd_privileges; u32 cmd_privileges;
......
...@@ -4265,10 +4265,10 @@ static void be_schedule_worker(struct be_adapter *adapter) ...@@ -4265,10 +4265,10 @@ static void be_schedule_worker(struct be_adapter *adapter)
adapter->flags |= BE_FLAGS_WORKER_SCHEDULED; adapter->flags |= BE_FLAGS_WORKER_SCHEDULED;
} }
static void be_schedule_err_detection(struct be_adapter *adapter) static void be_schedule_err_detection(struct be_adapter *adapter, u32 delay)
{ {
schedule_delayed_work(&adapter->be_err_detection_work, schedule_delayed_work(&adapter->be_err_detection_work,
msecs_to_jiffies(1000)); msecs_to_jiffies(delay));
adapter->flags |= BE_FLAGS_ERR_DETECTION_SCHEDULED; adapter->flags |= BE_FLAGS_ERR_DETECTION_SCHEDULED;
} }
...@@ -4890,6 +4890,7 @@ static void be_err_detection_task(struct work_struct *work) ...@@ -4890,6 +4890,7 @@ static void be_err_detection_task(struct work_struct *work)
be_err_detection_work.work); be_err_detection_work.work);
struct device *dev = &adapter->pdev->dev; struct device *dev = &adapter->pdev->dev;
int recovery_status; int recovery_status;
int delay = ERR_DETECTION_DELAY;
be_detect_error(adapter); be_detect_error(adapter);
...@@ -4899,6 +4900,7 @@ static void be_err_detection_task(struct work_struct *work) ...@@ -4899,6 +4900,7 @@ static void be_err_detection_task(struct work_struct *work)
goto reschedule_task; goto reschedule_task;
if (!recovery_status) { if (!recovery_status) {
adapter->recovery_retries = 0;
dev_info(dev, "Adapter recovery successful\n"); dev_info(dev, "Adapter recovery successful\n");
goto reschedule_task; goto reschedule_task;
} else if (be_virtfn(adapter)) { } else if (be_virtfn(adapter)) {
...@@ -4907,13 +4909,22 @@ static void be_err_detection_task(struct work_struct *work) ...@@ -4907,13 +4909,22 @@ static void be_err_detection_task(struct work_struct *work)
*/ */
dev_err(dev, "Re-trying adapter recovery\n"); dev_err(dev, "Re-trying adapter recovery\n");
goto reschedule_task; goto reschedule_task;
} else if (adapter->recovery_retries++ <
MAX_ERR_RECOVERY_RETRY_COUNT) {
/* In case of another error during recovery, it takes 30 sec
* for adapter to come out of error. Retry error recovery after
* this time interval.
*/
dev_err(&adapter->pdev->dev, "Re-trying adapter recovery\n");
delay = ERR_RECOVERY_RETRY_DELAY;
goto reschedule_task;
} else { } else {
dev_err(dev, "Adapter recovery failed\n"); dev_err(dev, "Adapter recovery failed\n");
} }
return; return;
reschedule_task: reschedule_task:
be_schedule_err_detection(adapter); be_schedule_err_detection(adapter, delay);
} }
static void be_log_sfp_info(struct be_adapter *adapter) static void be_log_sfp_info(struct be_adapter *adapter)
...@@ -5309,7 +5320,7 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id) ...@@ -5309,7 +5320,7 @@ static int be_probe(struct pci_dev *pdev, const struct pci_device_id *pdev_id)
be_roce_dev_add(adapter); be_roce_dev_add(adapter);
be_schedule_err_detection(adapter); be_schedule_err_detection(adapter, ERR_DETECTION_DELAY);
/* On Die temperature not supported for VF. */ /* On Die temperature not supported for VF. */
if (be_physfn(adapter) && IS_ENABLED(CONFIG_BE2NET_HWMON)) { if (be_physfn(adapter) && IS_ENABLED(CONFIG_BE2NET_HWMON)) {
...@@ -5376,7 +5387,7 @@ static int be_pci_resume(struct pci_dev *pdev) ...@@ -5376,7 +5387,7 @@ static int be_pci_resume(struct pci_dev *pdev)
if (status) if (status)
return status; return status;
be_schedule_err_detection(adapter); be_schedule_err_detection(adapter, ERR_DETECTION_DELAY);
if (adapter->wol_en) if (adapter->wol_en)
be_setup_wol(adapter, false); be_setup_wol(adapter, false);
...@@ -5476,7 +5487,7 @@ static void be_eeh_resume(struct pci_dev *pdev) ...@@ -5476,7 +5487,7 @@ static void be_eeh_resume(struct pci_dev *pdev)
if (status) if (status)
goto err; goto err;
be_schedule_err_detection(adapter); be_schedule_err_detection(adapter, ERR_DETECTION_DELAY);
return; return;
err: err:
dev_err(&adapter->pdev->dev, "EEH resume failed\n"); dev_err(&adapter->pdev->dev, "EEH resume failed\n");
......
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