Commit aff399a6 authored by Jiaran Zhang's avatar Jiaran Zhang Committed by David S. Miller

net: hns3: add scheduling logic for error handling task

Error handling & recovery is done in context of reset task which
gets scheduled from misc interrupt handler in existing code. But
since error handling has been moved to new task, it should get
scheduled instead of the reset task from the interrupt handler.
Signed-off-by: default avatarJiaran Zhang <zhangjiaran@huawei.com>
Signed-off-by: default avatarSalil Mehta <salil.mehta@huawei.com>
Signed-off-by: default avatarYufeng Mo <moyufeng@huawei.com>
Signed-off-by: default avatarGuangbin Huang <huangguangbin2@huawei.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent d991452d
...@@ -3402,18 +3402,8 @@ static irqreturn_t hclge_misc_irq_handle(int irq, void *data) ...@@ -3402,18 +3402,8 @@ static irqreturn_t hclge_misc_irq_handle(int irq, void *data)
/* vector 0 interrupt is shared with reset and mailbox source events.*/ /* vector 0 interrupt is shared with reset and mailbox source events.*/
switch (event_cause) { switch (event_cause) {
case HCLGE_VECTOR0_EVENT_ERR: case HCLGE_VECTOR0_EVENT_ERR:
/* we do not know what type of reset is required now. This could hclge_errhand_task_schedule(hdev);
* only be decided after we fetch the type of errors which break;
* caused this event. Therefore, we will do below for now:
* 1. Assert HNAE3_UNKNOWN_RESET type of reset. This means we
* have defered type of reset to be used.
* 2. Schedule the reset service task.
* 3. When service task receives HNAE3_UNKNOWN_RESET type it
* will fetch the correct type of reset. This would be done
* by first decoding the types of errors.
*/
set_bit(HNAE3_UNKNOWN_RESET, &hdev->reset_request);
fallthrough;
case HCLGE_VECTOR0_EVENT_RST: case HCLGE_VECTOR0_EVENT_RST:
hclge_reset_task_schedule(hdev); hclge_reset_task_schedule(hdev);
break; break;
...@@ -4385,14 +4375,16 @@ static void hclge_service_task(struct work_struct *work) ...@@ -4385,14 +4375,16 @@ static void hclge_service_task(struct work_struct *work)
struct hclge_dev *hdev = struct hclge_dev *hdev =
container_of(work, struct hclge_dev, service_task.work); container_of(work, struct hclge_dev, service_task.work);
hclge_errhand_service_task(hdev);
hclge_reset_service_task(hdev); hclge_reset_service_task(hdev);
hclge_mailbox_service_task(hdev); hclge_mailbox_service_task(hdev);
hclge_periodic_service_task(hdev); hclge_periodic_service_task(hdev);
/* Handle reset and mbx again in case periodical task delays the /* Handle error recovery, reset and mbx again in case periodical task
* handling by calling hclge_task_schedule() in * delays the handling by calling hclge_task_schedule() in
* hclge_periodic_service_task(). * hclge_periodic_service_task().
*/ */
hclge_errhand_service_task(hdev);
hclge_reset_service_task(hdev); hclge_reset_service_task(hdev);
hclge_mailbox_service_task(hdev); hclge_mailbox_service_task(hdev);
} }
......
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