1 | There are some bugfix for the HNS3 ethernet driver | 1 | There are some bugfix for the HNS3 ethernet driver |
---|---|---|---|
2 | 2 | ||
3 | Hao Lan (1): | 3 | Jie Wang (2): |
4 | net: hns3: fix spelling mistake "reg_um" -> "reg_num" | 4 | net: hns3: fix a deadlock problem when config TC during resetting |
5 | net: hns3: fix wrong use of semaphore up | ||
5 | 6 | ||
6 | Jian Shen (1): | 7 | Peiyang Wang (3): |
7 | net: hns3: store rx VLAN tag offload state for VF | 8 | net: hns3: use the user's cfg after reset |
9 | net: hns3: void array out of bound when loop tnl_num | ||
10 | net: hns3: use correct release function during uninitialization | ||
8 | 11 | ||
9 | Yonglong Liu (1): | 12 | .../net/ethernet/hisilicon/hns3/hns3_enet.c | 3 ++ |
10 | net: hns3: fix a use of uninitialized variable problem | 13 | .../hisilicon/hns3/hns3pf/hclge_err.c | 6 ++-- |
11 | 14 | .../hisilicon/hns3/hns3pf/hclge_main.c | 30 +++++++++++++------ | |
12 | .../hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 15 | .../hisilicon/hns3/hns3pf/hclge_mdio.c | 3 ++ |
13 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++----- | 16 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 4 +-- |
14 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 17 | 5 files changed, 32 insertions(+), 14 deletions(-) |
15 | .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++--------- | ||
16 | 4 files changed, 36 insertions(+), 21 deletions(-) | ||
17 | 18 | ||
18 | -- | 19 | -- |
19 | 2.33.0 | 20 | 2.33.0 | diff view generated by jsdifflib |
1 | From: Jian Shen <shenjian15@huawei.com> | 1 | From: Jie Wang <wangjie125@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | The VF driver missed to store the rx VLAN tag strip state when | 3 | Currently, if hns3 PF or VF FLR reset failed after five times retry, |
4 | user change the rx VLAN tag offload state. And it will default | 4 | the reset done process will directly release the semaphore |
5 | to enable the rx vlan tag strip when re-init VF device after | 5 | which has already released in hclge_reset_prepare_general. |
6 | reset. So if user disable rx VLAN tag offload, and trig reset, | 6 | This will cause down operation fail. |
7 | then the HW will still strip the VLAN tag from packet nad fill | ||
8 | into RX BD, but the VF driver will ignore it for rx VLAN tag | ||
9 | offload disabled. It may cause the rx VLAN tag dropped. | ||
10 | 7 | ||
11 | Fixes: b2641e2ad456 ("net: hns3: Add support of hardware rx-vlan-offload to HNS3 VF driver") | 8 | So this patch fixes it by adding reset state judgement. The up operation is |
12 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | 9 | only called after successful PF FLR reset. |
10 | |||
11 | Fixes: 8627bdedc435 ("net: hns3: refactor the precedure of PF FLR") | ||
12 | Fixes: f28368bb4542 ("net: hns3: refactor the procedure of VF FLR") | ||
13 | Signed-off-by: Jie Wang <wangjie125@huawei.com> | ||
13 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 14 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
14 | --- | 15 | --- |
15 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++++----- | 16 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 ++-- |
16 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 17 | drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 4 ++-- |
17 | 2 files changed, 21 insertions(+), 7 deletions(-) | 18 | 2 files changed, 4 insertions(+), 4 deletions(-) |
18 | 19 | ||
20 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
21 | index XXXXXXX..XXXXXXX 100644 | ||
22 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
23 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
24 | @@ -XXX,XX +XXX,XX @@ static void hclge_reset_done(struct hnae3_ae_dev *ae_dev) | ||
25 | dev_err(&hdev->pdev->dev, "fail to rebuild, ret=%d\n", ret); | ||
26 | |||
27 | hdev->reset_type = HNAE3_NONE_RESET; | ||
28 | - clear_bit(HCLGE_STATE_RST_HANDLING, &hdev->state); | ||
29 | - up(&hdev->reset_sem); | ||
30 | + if (test_and_clear_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) | ||
31 | + up(&hdev->reset_sem); | ||
32 | } | ||
33 | |||
34 | static void hclge_clear_resetting_state(struct hclge_dev *hdev) | ||
19 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 35 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
20 | index XXXXXXX..XXXXXXX 100644 | 36 | index XXXXXXX..XXXXXXX 100644 |
21 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 37 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
22 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 38 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
23 | @@ -XXX,XX +XXX,XX @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev) | 39 | @@ -XXX,XX +XXX,XX @@ static void hclgevf_reset_done(struct hnae3_ae_dev *ae_dev) |
24 | rtnl_unlock(); | 40 | ret); |
41 | |||
42 | hdev->reset_type = HNAE3_NONE_RESET; | ||
43 | - clear_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state); | ||
44 | - up(&hdev->reset_sem); | ||
45 | + if (test_and_clear_bit(HCLGEVF_STATE_RST_HANDLING, &hdev->state)) | ||
46 | + up(&hdev->reset_sem); | ||
25 | } | 47 | } |
26 | 48 | ||
27 | -static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 49 | static u32 hclgevf_get_fw_version(struct hnae3_handle *handle) |
28 | +static int hclgevf_en_hw_strip_rxvtag_cmd(struct hclgevf_dev *hdev, bool enable) | ||
29 | { | ||
30 | - struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | ||
31 | struct hclge_vf_to_pf_msg send_msg; | ||
32 | |||
33 | hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN, | ||
34 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | ||
35 | return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0); | ||
36 | } | ||
37 | |||
38 | +static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | ||
39 | +{ | ||
40 | + struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | ||
41 | + int ret; | ||
42 | + | ||
43 | + ret = hclgevf_en_hw_strip_rxvtag_cmd(hdev, enable); | ||
44 | + if (ret) | ||
45 | + return ret; | ||
46 | + | ||
47 | + hdev->rxvtag_strip_en = enable; | ||
48 | + return 0; | ||
49 | +} | ||
50 | + | ||
51 | static int hclgevf_reset_tqp(struct hnae3_handle *handle) | ||
52 | { | ||
53 | #define HCLGEVF_RESET_ALL_QUEUE_DONE 1U | ||
54 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev) | ||
55 | tc_valid, tc_size); | ||
56 | } | ||
57 | |||
58 | -static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev) | ||
59 | +static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev, | ||
60 | + bool rxvtag_strip_en) | ||
61 | { | ||
62 | struct hnae3_handle *nic = &hdev->nic; | ||
63 | int ret; | ||
64 | |||
65 | - ret = hclgevf_en_hw_strip_rxvtag(nic, true); | ||
66 | + ret = hclgevf_en_hw_strip_rxvtag(nic, rxvtag_strip_en); | ||
67 | if (ret) { | ||
68 | dev_err(&hdev->pdev->dev, | ||
69 | "failed to enable rx vlan offload, ret = %d\n", ret); | ||
70 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev) | ||
71 | if (ret) | ||
72 | return ret; | ||
73 | |||
74 | - ret = hclgevf_init_vlan_config(hdev); | ||
75 | + ret = hclgevf_init_vlan_config(hdev, hdev->rxvtag_strip_en); | ||
76 | if (ret) { | ||
77 | dev_err(&hdev->pdev->dev, | ||
78 | "failed(%d) to initialize VLAN config\n", ret); | ||
79 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) | ||
80 | goto err_config; | ||
81 | } | ||
82 | |||
83 | - ret = hclgevf_init_vlan_config(hdev); | ||
84 | + ret = hclgevf_init_vlan_config(hdev, true); | ||
85 | if (ret) { | ||
86 | dev_err(&hdev->pdev->dev, | ||
87 | "failed(%d) to initialize VLAN config\n", ret); | ||
88 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | ||
89 | index XXXXXXX..XXXXXXX 100644 | ||
90 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | ||
91 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | ||
92 | @@ -XXX,XX +XXX,XX @@ struct hclgevf_dev { | ||
93 | u16 *vector_status; | ||
94 | int *vector_irq; | ||
95 | |||
96 | - bool gro_en; | ||
97 | + u32 gro_en :1; | ||
98 | + u32 rxvtag_strip_en :1; | ||
99 | |||
100 | unsigned long vlan_del_fail_bmap[BITS_TO_LONGS(VLAN_N_VID)]; | ||
101 | |||
102 | -- | 50 | -- |
103 | 2.33.0 | 51 | 2.33.0 | diff view generated by jsdifflib |
1 | From: Hao Lan <lanhao@huawei.com> | 1 | From: Peiyang Wang <wangpeiyang1@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | There are spelling mistakes in hclgevf_get_regs. Fix them. | 3 | Consider the followed case that the user change speed and reset the net |
4 | interface. Before the hw change speed successfully, the driver get old | ||
5 | old speed from hw by timer task. After reset, the previous speed is config | ||
6 | to hw. As a result, the new speed is configed successfully but lost after | ||
7 | PF reset. The followed pictured shows more dirrectly. | ||
4 | 8 | ||
5 | Signed-off-by: Hao Lan <lanhao@huawei.com> | 9 | +------+ +----+ +----+ |
10 | | USER | | PF | | HW | | ||
11 | +---+--+ +-+--+ +-+--+ | ||
12 | | ethtool -s 100G | | | ||
13 | +------------------>| set speed 100G | | ||
14 | | +--------------------->| | ||
15 | | | set successfully | | ||
16 | | |<---------------------+---+ | ||
17 | | |query cfg (timer task)| | | ||
18 | | +--------------------->| | handle speed | ||
19 | | | return 200G | | changing event | ||
20 | | ethtool --reset |<---------------------+ | (100G) | ||
21 | +------------------>| cfg previous speed |<--+ | ||
22 | | | after reset (200G) | | ||
23 | | +--------------------->| | ||
24 | | | +---+ | ||
25 | | |query cfg (timer task)| | | ||
26 | | +--------------------->| | handle speed | ||
27 | | | return 100G | | changing event | ||
28 | | |<---------------------+ | (200G) | ||
29 | | | |<--+ | ||
30 | | |query cfg (timer task)| | ||
31 | | +--------------------->| | ||
32 | | | return 200G | | ||
33 | | |<---------------------+ | ||
34 | | | | | ||
35 | v v v | ||
36 | |||
37 | This patch save new speed if hw change speed successfully, which will be | ||
38 | used after reset successfully. | ||
39 | |||
40 | Fixes: 2d03eacc0b7e ("net: hns3: Only update mac configuation when necessary") | ||
41 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> | ||
6 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 42 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
7 | --- | 43 | --- |
8 | .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++--------- | 44 | .../hisilicon/hns3/hns3pf/hclge_main.c | 24 ++++++++++++++----- |
9 | 1 file changed, 14 insertions(+), 13 deletions(-) | 45 | .../hisilicon/hns3/hns3pf/hclge_mdio.c | 3 +++ |
46 | 2 files changed, 21 insertions(+), 6 deletions(-) | ||
10 | 47 | ||
11 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 48 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
12 | index XXXXXXX..XXXXXXX 100644 | 49 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 50 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
14 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 51 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
15 | @@ -XXX,XX +XXX,XX @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, | 52 | @@ -XXX,XX +XXX,XX @@ static int hclge_cfg_mac_speed_dup_h(struct hnae3_handle *handle, int speed, |
16 | 53 | { | |
17 | struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 54 | struct hclge_vport *vport = hclge_get_vport(handle); |
18 | struct hnae3_queue *tqp; | 55 | struct hclge_dev *hdev = vport->back; |
19 | - int i, j, reg_um; | 56 | + int ret; |
20 | + int i, j, reg_num; | 57 | + |
21 | u32 *reg = data; | 58 | + ret = hclge_cfg_mac_speed_dup(hdev, speed, duplex, lane_num); |
22 | 59 | ||
23 | *version = hdev->fw_version; | 60 | - return hclge_cfg_mac_speed_dup(hdev, speed, duplex, lane_num); |
24 | reg += hclgevf_reg_get_header(reg); | 61 | + if (ret) |
25 | 62 | + return ret; | |
26 | /* fetching per-VF registers values from VF PCIe register space */ | 63 | + |
27 | - reg_um = ARRAY_SIZE(cmdq_reg_addr_list); | 64 | + hdev->hw.mac.req_speed = speed; |
28 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_um, reg); | 65 | + hdev->hw.mac.req_duplex = duplex; |
29 | - for (i = 0; i < reg_um; i++) | 66 | + |
30 | + reg_num = ARRAY_SIZE(cmdq_reg_addr_list); | 67 | + return 0; |
31 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_num, reg); | 68 | } |
32 | + for (i = 0; i < reg_num; i++) | 69 | |
33 | *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); | 70 | static int hclge_set_autoneg_en(struct hclge_dev *hdev, bool enable) |
34 | 71 | @@ -XXX,XX +XXX,XX @@ static int hclge_mac_init(struct hclge_dev *hdev) | |
35 | - reg_um = ARRAY_SIZE(common_reg_addr_list); | 72 | if (!test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) |
36 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_um, reg); | 73 | hdev->hw.mac.duplex = HCLGE_MAC_FULL; |
37 | - for (i = 0; i < reg_um; i++) | 74 | |
38 | + reg_num = ARRAY_SIZE(common_reg_addr_list); | 75 | - ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed, |
39 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_num, reg); | 76 | - hdev->hw.mac.duplex, hdev->hw.mac.lane_num); |
40 | + for (i = 0; i < reg_num; i++) | 77 | - if (ret) |
41 | *reg++ = hclgevf_read_dev(&hdev->hw, common_reg_addr_list[i]); | 78 | - return ret; |
42 | 79 | - | |
43 | - reg_um = ARRAY_SIZE(ring_reg_addr_list); | 80 | if (hdev->hw.mac.support_autoneg) { |
44 | + reg_num = ARRAY_SIZE(ring_reg_addr_list); | 81 | ret = hclge_set_autoneg_en(hdev, hdev->hw.mac.autoneg); |
45 | for (j = 0; j < hdev->num_tqps; j++) { | 82 | if (ret) |
46 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg); | 83 | return ret; |
47 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_num, reg); | ||
48 | tqp = &hdev->htqp[j].q; | ||
49 | - for (i = 0; i < reg_um; i++) | ||
50 | + for (i = 0; i < reg_num; i++) | ||
51 | *reg++ = readl_relaxed(tqp->io_base - | ||
52 | HCLGEVF_TQP_REG_OFFSET + | ||
53 | ring_reg_addr_list[i]); | ||
54 | } | 84 | } |
55 | 85 | ||
56 | - reg_um = ARRAY_SIZE(tqp_intr_reg_addr_list); | 86 | + if (!hdev->hw.mac.autoneg) { |
57 | + reg_num = ARRAY_SIZE(tqp_intr_reg_addr_list); | 87 | + ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.req_speed, |
58 | for (j = 0; j < hdev->num_msi_used - 1; j++) { | 88 | + hdev->hw.mac.req_duplex, |
59 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, reg_um, reg); | 89 | + hdev->hw.mac.lane_num); |
60 | - for (i = 0; i < reg_um; i++) | 90 | + if (ret) |
61 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, | 91 | + return ret; |
62 | + reg_num, reg); | 92 | + } |
63 | + for (i = 0; i < reg_num; i++) | 93 | + |
64 | *reg++ = hclgevf_read_dev(&hdev->hw, | 94 | mac->link = 0; |
65 | tqp_intr_reg_addr_list[i] + | 95 | |
66 | HCLGEVF_RING_INT_REG_OFFSET * j); | 96 | if (mac->user_fec_mode & BIT(HNAE3_FEC_USER_DEF)) { |
97 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c | ||
98 | index XXXXXXX..XXXXXXX 100644 | ||
99 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c | ||
100 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mdio.c | ||
101 | @@ -XXX,XX +XXX,XX @@ static void hclge_mac_adjust_link(struct net_device *netdev) | ||
102 | if (ret) | ||
103 | netdev_err(netdev, "failed to adjust link.\n"); | ||
104 | |||
105 | + hdev->hw.mac.req_speed = (u32)speed; | ||
106 | + hdev->hw.mac.req_duplex = (u8)duplex; | ||
107 | + | ||
108 | ret = hclge_cfg_flowctrl(hdev); | ||
109 | if (ret) | ||
110 | netdev_err(netdev, "failed to configure flow control.\n"); | ||
67 | -- | 111 | -- |
68 | 2.33.0 | 112 | 2.33.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Jie Wang <wangjie125@huawei.com> | ||
1 | 2 | ||
3 | When config TC during the reset process, may cause a deadlock, the flow is | ||
4 | as below: | ||
5 | pf reset start | ||
6 | │ | ||
7 | ▼ | ||
8 | ...... | ||
9 | setup tc │ | ||
10 | │ ▼ | ||
11 | ▼ DOWN: napi_disable() | ||
12 | napi_disable()(skip) │ | ||
13 | │ │ | ||
14 | ▼ ▼ | ||
15 | ...... ...... | ||
16 | │ │ | ||
17 | ▼ │ | ||
18 | napi_enable() │ | ||
19 | ▼ | ||
20 | UINIT: netif_napi_del() | ||
21 | │ | ||
22 | ▼ | ||
23 | ...... | ||
24 | │ | ||
25 | ▼ | ||
26 | INIT: netif_napi_add() | ||
27 | │ | ||
28 | ▼ | ||
29 | ...... global reset start | ||
30 | │ │ | ||
31 | ▼ ▼ | ||
32 | UP: napi_enable()(skip) ...... | ||
33 | │ │ | ||
34 | ▼ ▼ | ||
35 | ...... napi_disable() | ||
36 | |||
37 | In reset process, the driver will DOWN the port and then UINIT, in this | ||
38 | case, the setup tc process will UP the port before UINIT, so cause the | ||
39 | problem. Adds a DOWN process in UINIT to fix it. | ||
40 | |||
41 | Fixes: bb6b94a896d4 ("net: hns3: Add reset interface implementation in client") | ||
42 | Signed-off-by: Jie Wang <wangjie125@huawei.com> | ||
43 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
44 | --- | ||
45 | drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 3 +++ | ||
46 | 1 file changed, 3 insertions(+) | ||
47 | |||
48 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
49 | index XXXXXXX..XXXXXXX 100644 | ||
50 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
51 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
52 | @@ -XXX,XX +XXX,XX @@ static int hns3_reset_notify_uninit_enet(struct hnae3_handle *handle) | ||
53 | struct net_device *netdev = handle->kinfo.netdev; | ||
54 | struct hns3_nic_priv *priv = netdev_priv(netdev); | ||
55 | |||
56 | + if (!test_bit(HNS3_NIC_STATE_DOWN, &priv->state)) | ||
57 | + hns3_nic_net_stop(netdev); | ||
58 | + | ||
59 | if (!test_and_clear_bit(HNS3_NIC_STATE_INITED, &priv->state)) { | ||
60 | netdev_warn(netdev, "already uninitialized\n"); | ||
61 | return 0; | ||
62 | -- | ||
63 | 2.33.0 | ||
64 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Peiyang Wang <wangpeiyang1@huawei.com> | ||
1 | 2 | ||
3 | When query reg inf of SSU, it loops tnl_num times. However, tnl_num comes | ||
4 | from hardware and the length of array is a fixed value. To void array out | ||
5 | of bound, make sure the loop time is not greater than the length of array | ||
6 | |||
7 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> | ||
8 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
9 | --- | ||
10 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | 6 +++--- | ||
11 | 1 file changed, 3 insertions(+), 3 deletions(-) | ||
12 | |||
13 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | ||
16 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_err.c | ||
17 | @@ -XXX,XX +XXX,XX @@ static void hclge_query_reg_info_of_ssu(struct hclge_dev *hdev) | ||
18 | { | ||
19 | u32 loop_para[HCLGE_MOD_MSG_PARA_ARRAY_MAX_SIZE] = {0}; | ||
20 | struct hclge_mod_reg_common_msg msg; | ||
21 | - u8 i, j, num; | ||
22 | - u32 loop_time; | ||
23 | + u8 i, j, num, loop_time; | ||
24 | |||
25 | num = ARRAY_SIZE(hclge_ssu_reg_common_msg); | ||
26 | for (i = 0; i < num; i++) { | ||
27 | @@ -XXX,XX +XXX,XX @@ static void hclge_query_reg_info_of_ssu(struct hclge_dev *hdev) | ||
28 | loop_time = 1; | ||
29 | loop_para[0] = 0; | ||
30 | if (msg.need_para) { | ||
31 | - loop_time = hdev->ae_dev->dev_specs.tnl_num; | ||
32 | + loop_time = min(hdev->ae_dev->dev_specs.tnl_num, | ||
33 | + HCLGE_MOD_MSG_PARA_ARRAY_MAX_SIZE); | ||
34 | for (j = 0; j < loop_time; j++) | ||
35 | loop_para[j] = j + 1; | ||
36 | } | ||
37 | -- | ||
38 | 2.33.0 | diff view generated by jsdifflib |
1 | From: Yonglong Liu <liuyonglong@huawei.com> | 1 | From: Peiyang Wang <wangpeiyang1@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | In hclge_add_fd_entry(), if the flow type is FLOW_EXT, and the data of | 3 | pci_request_regions is called to apply for PCI I/O and memory resources |
4 | m_ext is all zero, then some members of the local variable "info" are | 4 | when the driver is initialized, Therefore, when the driver is uninstalled, |
5 | not initialized. | 5 | pci_release_regions should be used to release PCI I/O and memory resources |
6 | instead of pci_release_mem_regions is used to release memory reasouces | ||
7 | only. | ||
6 | 8 | ||
7 | Fixes: 67b0e1428e2f ("net: hns3: add support for user-def data of flow director") | 9 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> |
8 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | ||
9 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 10 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
10 | --- | 11 | --- |
11 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 12 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +- |
12 | 1 file changed, 1 insertion(+), 1 deletion(-) | 13 | 1 file changed, 1 insertion(+), 1 deletion(-) |
13 | 14 | ||
14 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 15 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
15 | index XXXXXXX..XXXXXXX 100644 | 16 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 17 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
17 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 18 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
18 | @@ -XXX,XX +XXX,XX @@ static int hclge_add_fd_entry(struct hnae3_handle *handle, | 19 | @@ -XXX,XX +XXX,XX @@ static void hclge_pci_uninit(struct hclge_dev *hdev) |
19 | struct ethtool_rxnfc *cmd) | 20 | |
20 | { | 21 | pcim_iounmap(pdev, hdev->hw.hw.io_base); |
21 | struct hclge_vport *vport = hclge_get_vport(handle); | 22 | pci_free_irq_vectors(pdev); |
22 | + struct hclge_fd_user_def_info info = {0}; | 23 | - pci_release_mem_regions(pdev); |
23 | struct hclge_dev *hdev = vport->back; | 24 | + pci_release_regions(pdev); |
24 | - struct hclge_fd_user_def_info info; | 25 | pci_disable_device(pdev); |
25 | u16 dst_vport_id = 0, q_index = 0; | 26 | } |
26 | struct ethtool_rx_flow_spec *fs; | 27 | |
27 | struct hclge_fd_rule *rule; | ||
28 | -- | 28 | -- |
29 | 2.33.0 | 29 | 2.33.0 | diff view generated by jsdifflib |