Skip to content

Commit 35d93a3

Browse files
Huazhong Tandavem330
authored andcommitted
net: hns3: adjust the process of PF reset
When doing PF reset, the driver needs to do some preparatory work before asserting PF reset. Since when hardware is resetting, it is necessary to stop tx/rx queue, clear hardware table, etc, otherwise hardware may run into unrecoverable state if there is still IO running when the hardware is resetting. Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 0742ed7 commit 35d93a3

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,7 +2396,6 @@ static void hclge_do_reset(struct hclge_dev *hdev)
23962396
break;
23972397
case HNAE3_FUNC_RESET:
23982398
dev_info(&pdev->dev, "PF Reset requested\n");
2399-
hclge_func_reset_cmd(hdev, 0);
24002399
/* schedule again to check later */
24012400
set_bit(HNAE3_FUNC_RESET, &hdev->reset_pending);
24022401
hclge_reset_task_schedule(hdev);
@@ -2462,6 +2461,35 @@ static void hclge_clear_reset_cause(struct hclge_dev *hdev)
24622461
hclge_enable_vector(&hdev->misc_vector, true);
24632462
}
24642463

2464+
static int hclge_reset_prepare_wait(struct hclge_dev *hdev)
2465+
{
2466+
int ret = 0;
2467+
2468+
switch (hdev->reset_type) {
2469+
case HNAE3_FUNC_RESET:
2470+
ret = hclge_func_reset_cmd(hdev, 0);
2471+
if (ret) {
2472+
dev_err(&hdev->pdev->dev,
2473+
"assertting function reset fail %d!\n", ret);
2474+
return ret;
2475+
}
2476+
2477+
/* After performaning pf reset, it is not necessary to do the
2478+
* mailbox handling or send any command to firmware, because
2479+
* any mailbox handling or command to firmware is only valid
2480+
* after hclge_cmd_init is called.
2481+
*/
2482+
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
2483+
break;
2484+
default:
2485+
break;
2486+
}
2487+
2488+
dev_info(&hdev->pdev->dev, "prepare wait ok\n");
2489+
2490+
return ret;
2491+
}
2492+
24652493
static void hclge_reset(struct hclge_dev *hdev)
24662494
{
24672495
struct hnae3_ae_dev *ae_dev = pci_get_drvdata(hdev->pdev);
@@ -2477,6 +2505,8 @@ static void hclge_reset(struct hclge_dev *hdev)
24772505
hclge_notify_client(hdev, HNAE3_DOWN_CLIENT);
24782506
rtnl_unlock();
24792507

2508+
hclge_reset_prepare_wait(hdev);
2509+
24802510
if (!hclge_reset_wait(hdev)) {
24812511
rtnl_lock();
24822512
hclge_notify_client(hdev, HNAE3_UNINIT_CLIENT);
@@ -4873,7 +4903,11 @@ static void hclge_ae_stop(struct hnae3_handle *handle)
48734903
cancel_work_sync(&hdev->service_task);
48744904
clear_bit(HCLGE_STATE_SERVICE_SCHED, &hdev->state);
48754905

4876-
if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) {
4906+
/* If it is not PF reset, the firmware will disable the MAC,
4907+
* so it only need to stop phy here.
4908+
*/
4909+
if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) &&
4910+
hdev->reset_type != HNAE3_FUNC_RESET) {
48774911
hclge_mac_stop_phy(hdev);
48784912
return;
48794913
}

0 commit comments

Comments
 (0)