Skip to content

Commit 5af82f5

Browse files
committed
Merge branch 'hns3-next'
Huazhong Tan says: ==================== code optimizations & bugfixes for HNS3 driver This patchset includes bugfixes and code optimizations for the HNS3 ethernet controller driver. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 0ed8c3d + e233516 commit 5af82f5

File tree

5 files changed

+59
-14
lines changed

5 files changed

+59
-14
lines changed

drivers/net/ethernet/hisilicon/hns3/hns3_enet.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3718,13 +3718,13 @@ static void hns3_client_uninit(struct hnae3_handle *handle, bool reset)
37183718
struct hns3_nic_priv *priv = netdev_priv(netdev);
37193719
int ret;
37203720

3721-
hns3_client_stop(handle);
3722-
37233721
hns3_remove_hw_addr(netdev);
37243722

37253723
if (netdev->reg_state != NETREG_UNINITIALIZED)
37263724
unregister_netdev(netdev);
37273725

3726+
hns3_client_stop(handle);
3727+
37283728
if (!test_and_clear_bit(HNS3_NIC_STATE_INITED, &priv->state)) {
37293729
netdev_warn(netdev, "already uninitialized\n");
37303730
goto out_netdev_free;
@@ -4075,10 +4075,18 @@ static int hns3_reset_notify_init_enet(struct hnae3_handle *handle)
40754075
if (ret)
40764076
goto err_uninit_vector;
40774077

4078+
ret = hns3_client_start(handle);
4079+
if (ret) {
4080+
dev_err(priv->dev, "hns3_client_start fail! ret=%d\n", ret);
4081+
goto err_uninit_ring;
4082+
}
4083+
40784084
set_bit(HNS3_NIC_STATE_INITED, &priv->state);
40794085

40804086
return ret;
40814087

4088+
err_uninit_ring:
4089+
hns3_uninit_all_ring(priv);
40824090
err_uninit_vector:
40834091
hns3_nic_uninit_vector_data(priv);
40844092
priv->ring_data = NULL;

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,21 +373,26 @@ int hclge_cmd_init(struct hclge_dev *hdev)
373373
* reset may happen when lower level reset is being processed.
374374
*/
375375
if ((hclge_is_reset_pending(hdev))) {
376-
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
377-
return -EBUSY;
376+
ret = -EBUSY;
377+
goto err_cmd_init;
378378
}
379379

380380
ret = hclge_cmd_query_firmware_version(&hdev->hw, &version);
381381
if (ret) {
382382
dev_err(&hdev->pdev->dev,
383383
"firmware version query failed %d\n", ret);
384-
return ret;
384+
goto err_cmd_init;
385385
}
386386
hdev->fw_version = version;
387387

388388
dev_info(&hdev->pdev->dev, "The firmware version is %08x\n", version);
389389

390390
return 0;
391+
392+
err_cmd_init:
393+
set_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state);
394+
395+
return ret;
391396
}
392397

393398
static void hclge_cmd_uninit_regs(struct hclge_hw *hw)

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

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
static int hclge_set_mac_mtu(struct hclge_dev *hdev, int new_mps);
3333
static int hclge_init_vlan_config(struct hclge_dev *hdev);
3434
static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev);
35+
static bool hclge_get_hw_reset_stat(struct hnae3_handle *handle);
3536
static int hclge_set_umv_space(struct hclge_dev *hdev, u16 space_size,
3637
u16 *allocated_size, bool is_alloc);
3738

@@ -2163,7 +2164,8 @@ static int hclge_mac_init(struct hclge_dev *hdev)
21632164

21642165
static void hclge_mbx_task_schedule(struct hclge_dev *hdev)
21652166
{
2166-
if (!test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state))
2167+
if (!test_bit(HCLGE_STATE_CMD_DISABLE, &hdev->state) &&
2168+
!test_and_set_bit(HCLGE_STATE_MBX_SERVICE_SCHED, &hdev->state))
21672169
schedule_work(&hdev->mbx_service_task);
21682170
}
21692171

@@ -2677,7 +2679,7 @@ static int hclge_set_all_vf_rst(struct hclge_dev *hdev, bool reset)
26772679
return ret;
26782680
}
26792681

2680-
if (!reset)
2682+
if (!reset || !test_bit(HCLGE_VPORT_STATE_ALIVE, &vport->state))
26812683
continue;
26822684

26832685
/* Inform VF to process the reset.
@@ -2714,9 +2716,18 @@ int hclge_func_reset_cmd(struct hclge_dev *hdev, int func_id)
27142716

27152717
static void hclge_do_reset(struct hclge_dev *hdev)
27162718
{
2719+
struct hnae3_handle *handle = &hdev->vport[0].nic;
27172720
struct pci_dev *pdev = hdev->pdev;
27182721
u32 val;
27192722

2723+
if (hclge_get_hw_reset_stat(handle)) {
2724+
dev_info(&pdev->dev, "Hardware reset not finish\n");
2725+
dev_info(&pdev->dev, "func_rst_reg:0x%x, global_rst_reg:0x%x\n",
2726+
hclge_read_dev(&hdev->hw, HCLGE_FUN_RST_ING),
2727+
hclge_read_dev(&hdev->hw, HCLGE_GLOBAL_RESET_REG));
2728+
return;
2729+
}
2730+
27202731
switch (hdev->reset_type) {
27212732
case HNAE3_GLOBAL_RESET:
27222733
val = hclge_read_dev(&hdev->hw, HCLGE_GLOBAL_RESET_REG);
@@ -2795,6 +2806,10 @@ static enum hnae3_reset_type hclge_get_reset_level(struct hclge_dev *hdev,
27952806
clear_bit(HNAE3_FLR_RESET, addr);
27962807
}
27972808

2809+
if (hdev->reset_type != HNAE3_NONE_RESET &&
2810+
rst_level < hdev->reset_type)
2811+
return HNAE3_NONE_RESET;
2812+
27982813
return rst_level;
27992814
}
28002815

@@ -3022,6 +3037,7 @@ static void hclge_reset(struct hclge_dev *hdev)
30223037
hdev->last_reset_time = jiffies;
30233038
hdev->reset_fail_cnt = 0;
30243039
ae_dev->reset_type = HNAE3_NONE_RESET;
3040+
del_timer(&hdev->reset_timer);
30253041

30263042
return;
30273043

@@ -7732,7 +7748,7 @@ static void hclge_reset_vport_state(struct hclge_dev *hdev)
77327748
int i;
77337749

77347750
for (i = 0; i < hdev->num_alloc_vport; i++) {
7735-
hclge_vport_start(vport);
7751+
hclge_vport_stop(vport);
77367752
vport++;
77377753
}
77387754
}

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_cmd.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -357,22 +357,27 @@ int hclgevf_cmd_init(struct hclgevf_dev *hdev)
357357
* reset may happen when lower level reset is being processed.
358358
*/
359359
if (hclgevf_is_reset_pending(hdev)) {
360-
set_bit(HCLGEVF_STATE_CMD_DISABLE, &hdev->state);
361-
return -EBUSY;
360+
ret = -EBUSY;
361+
goto err_cmd_init;
362362
}
363363

364364
/* get firmware version */
365365
ret = hclgevf_cmd_query_firmware_version(&hdev->hw, &version);
366366
if (ret) {
367367
dev_err(&hdev->pdev->dev,
368368
"failed(%d) to query firmware version\n", ret);
369-
return ret;
369+
goto err_cmd_init;
370370
}
371371
hdev->fw_version = version;
372372

373373
dev_info(&hdev->pdev->dev, "The firmware version is %08x\n", version);
374374

375375
return 0;
376+
377+
err_cmd_init:
378+
set_bit(HCLGEVF_STATE_CMD_DISABLE, &hdev->state);
379+
380+
return ret;
376381
}
377382

378383
static void hclgevf_cmd_uninit_regs(struct hclgevf_hw *hw)

drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1474,6 +1474,8 @@ static int hclgevf_reset(struct hclgevf_dev *hdev)
14741474
*/
14751475
hclgevf_cmd_init(hdev);
14761476
dev_err(&hdev->pdev->dev, "failed to reset VF\n");
1477+
if (hclgevf_is_reset_pending(hdev))
1478+
hclgevf_reset_task_schedule(hdev);
14771479

14781480
return ret;
14791481
}
@@ -1583,8 +1585,7 @@ static void hclgevf_get_misc_vector(struct hclgevf_dev *hdev)
15831585

15841586
void hclgevf_reset_task_schedule(struct hclgevf_dev *hdev)
15851587
{
1586-
if (!test_bit(HCLGEVF_STATE_RST_SERVICE_SCHED, &hdev->state) &&
1587-
!test_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state)) {
1588+
if (!test_bit(HCLGEVF_STATE_RST_SERVICE_SCHED, &hdev->state)) {
15881589
set_bit(HCLGEVF_STATE_RST_SERVICE_SCHED, &hdev->state);
15891590
schedule_work(&hdev->rst_service_task);
15901591
}
@@ -2030,9 +2031,15 @@ static int hclgevf_set_alive(struct hnae3_handle *handle, bool alive)
20302031
static int hclgevf_client_start(struct hnae3_handle *handle)
20312032
{
20322033
struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
2034+
int ret;
2035+
2036+
ret = hclgevf_set_alive(handle, true);
2037+
if (ret)
2038+
return ret;
20332039

20342040
mod_timer(&hdev->keep_alive_timer, jiffies + 2 * HZ);
2035-
return hclgevf_set_alive(handle, true);
2041+
2042+
return 0;
20362043
}
20372044

20382045
static void hclgevf_client_stop(struct hnae3_handle *handle)
@@ -2074,6 +2081,10 @@ static void hclgevf_state_uninit(struct hclgevf_dev *hdev)
20742081
{
20752082
set_bit(HCLGEVF_STATE_DOWN, &hdev->state);
20762083

2084+
if (hdev->keep_alive_timer.function)
2085+
del_timer_sync(&hdev->keep_alive_timer);
2086+
if (hdev->keep_alive_task.func)
2087+
cancel_work_sync(&hdev->keep_alive_task);
20772088
if (hdev->service_timer.function)
20782089
del_timer_sync(&hdev->service_timer);
20792090
if (hdev->service_task.func)

0 commit comments

Comments
 (0)