Skip to content

Commit

Permalink
net: hns3: activate reset timer when calling reset_event
Browse files Browse the repository at this point in the history
When calling hclge_reset_event() within HCLGE_RESET_INTERVAL,
it returns directly now. If no one call it again, then the
error which needs a reset to fix it can not be fixed.

So this patch activates the reset timer for this case, and
adds checking in the end of the reset procedure to make this
error fixed earlier.

Signed-off-by: Huazhong Tan <[email protected]>
Reviewed-by: Peng Li <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Huazhong Tan authored and davem330 committed Aug 1, 2019
1 parent 72e2fb0 commit 012fcb5
Showing 1 changed file with 18 additions and 3 deletions.
21 changes: 18 additions & 3 deletions drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -3517,7 +3517,15 @@ static void hclge_reset(struct hclge_dev *hdev)
hdev->reset_fail_cnt = 0;
hdev->rst_stats.reset_done_cnt++;
ae_dev->reset_type = HNAE3_NONE_RESET;
del_timer(&hdev->reset_timer);

/* if default_reset_request has a higher level reset request,
* it should be handled as soon as possible. since some errors
* need this kind of reset to fix.
*/
hdev->reset_level = hclge_get_reset_level(ae_dev,
&hdev->default_reset_request);
if (hdev->reset_level != HNAE3_NONE_RESET)
set_bit(hdev->reset_level, &hdev->reset_request);

return;

Expand Down Expand Up @@ -3552,9 +3560,10 @@ static void hclge_reset_event(struct pci_dev *pdev, struct hnae3_handle *handle)
handle = &hdev->vport[0].nic;

if (time_before(jiffies, (hdev->last_reset_time +
HCLGE_RESET_INTERVAL)))
HCLGE_RESET_INTERVAL))) {
mod_timer(&hdev->reset_timer, jiffies + HCLGE_RESET_INTERVAL);
return;
else if (hdev->default_reset_request)
} else if (hdev->default_reset_request)
hdev->reset_level =
hclge_get_reset_level(ae_dev,
&hdev->default_reset_request);
Expand Down Expand Up @@ -3584,6 +3593,12 @@ static void hclge_reset_timer(struct timer_list *t)
{
struct hclge_dev *hdev = from_timer(hdev, t, reset_timer);

/* if default_reset_request has no value, it means that this reset
* request has already be handled, so just return here
*/
if (!hdev->default_reset_request)
return;

dev_info(&hdev->pdev->dev,
"triggering reset in reset timer\n");
hclge_reset_event(hdev->pdev, NULL);
Expand Down

0 comments on commit 012fcb5

Please sign in to comment.