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 | Jian Shen (2): |
4 | net: hns3: fix spelling mistake "reg_um" -> "reg_num" | 4 | net: hns3: fix add VLAN fail issue |
5 | net: hns3: fix incorrect capability bit display for copper port | ||
5 | 6 | ||
6 | Jian Shen (1): | 7 | Jijie Shao (2): |
7 | net: hns3: store rx VLAN tag offload state for VF | 8 | net: hns3: fix VF reset fail issue |
9 | net: hns3: fix VF wrong speed and duplex issue | ||
8 | 10 | ||
9 | Yonglong Liu (1): | 11 | Yonglong Liu (3): |
10 | net: hns3: fix a use of uninitialized variable problem | 12 | net: hns3: add barrier in vf mailbox reply process |
13 | net: hns3: fix out-of-bounds access may occur when coalesce info is | ||
14 | read via debugfs | ||
15 | net: hns3: fix variable may not initialized problem in | ||
16 | hns3_init_mac_addr() | ||
11 | 17 | ||
12 | .../hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 18 | .../ethernet/hisilicon/hns3/hns3_debugfs.c | 9 ++++--- |
13 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++----- | 19 | .../net/ethernet/hisilicon/hns3/hns3_enet.c | 2 +- |
14 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 20 | .../hisilicon/hns3/hns3pf/hclge_main.c | 26 ++++++++++++++----- |
15 | .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++--------- | 21 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 24 +++++++++++++---- |
16 | 4 files changed, 36 insertions(+), 21 deletions(-) | 22 | .../hisilicon/hns3/hns3vf/hclgevf_mbx.c | 7 +++++ |
23 | 5 files changed, 53 insertions(+), 15 deletions(-) | ||
17 | 24 | ||
18 | -- | 25 | -- |
19 | 2.33.0 | 26 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Jian Shen <shenjian15@huawei.com> | ||
1 | 2 | ||
3 | The hclge_sync_vlan_filter is called in periodic task, | ||
4 | trying to remove VLAN from vlan_del_fail_bmap. It can | ||
5 | be concurrence with VLAN adding operation from user. | ||
6 | So once user failed to delete a VLAN id, and add it | ||
7 | again soon, it may be removed by the periodic task, | ||
8 | which may cause the software configuration being | ||
9 | inconsistent with hardware. So add mutex handling | ||
10 | to avoid this. | ||
11 | |||
12 | user hns3 driver | ||
13 | |||
14 | periodic task | ||
15 | │ | ||
16 | add vlan 10 ───── hns3_vlan_rx_add_vid │ | ||
17 | │ (suppose success) │ | ||
18 | │ │ | ||
19 | del vlan 10 ───── hns3_vlan_rx_kill_vid │ | ||
20 | │ (suppose fail,add to │ | ||
21 | │ vlan_del_fail_bmap) │ | ||
22 | │ │ | ||
23 | add vlan 10 ───── hns3_vlan_rx_add_vid │ | ||
24 | (suppose success) │ | ||
25 | foreach vlan_del_fail_bmp | ||
26 | del vlan 10 | ||
27 | |||
28 | Fixes: fe4144d47eef ("net: hns3: sync VLAN filter entries when kill VLAN ID failed") | ||
29 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | ||
30 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
31 | --- | ||
32 | .../hisilicon/hns3/hns3pf/hclge_main.c | 21 +++++++++++++------ | ||
33 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 11 ++++++++-- | ||
34 | 2 files changed, 24 insertions(+), 8 deletions(-) | ||
35 | |||
36 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
37 | index XXXXXXX..XXXXXXX 100644 | ||
38 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
39 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
40 | @@ -XXX,XX +XXX,XX @@ static void hclge_rm_vport_vlan_table(struct hclge_vport *vport, u16 vlan_id, | ||
41 | struct hclge_vport_vlan_cfg *vlan, *tmp; | ||
42 | struct hclge_dev *hdev = vport->back; | ||
43 | |||
44 | - mutex_lock(&hdev->vport_lock); | ||
45 | - | ||
46 | list_for_each_entry_safe(vlan, tmp, &vport->vlan_list, node) { | ||
47 | if (vlan->vlan_id == vlan_id) { | ||
48 | if (is_write_tbl && vlan->hd_tbl_status) | ||
49 | @@ -XXX,XX +XXX,XX @@ static void hclge_rm_vport_vlan_table(struct hclge_vport *vport, u16 vlan_id, | ||
50 | break; | ||
51 | } | ||
52 | } | ||
53 | - | ||
54 | - mutex_unlock(&hdev->vport_lock); | ||
55 | } | ||
56 | |||
57 | void hclge_rm_vport_all_vlan_table(struct hclge_vport *vport, bool is_del_list) | ||
58 | @@ -XXX,XX +XXX,XX @@ int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto, | ||
59 | * handle mailbox. Just record the vlan id, and remove it after | ||
60 | * reset finished. | ||
61 | */ | ||
62 | + mutex_lock(&hdev->vport_lock); | ||
63 | if ((test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) || | ||
64 | test_bit(HCLGE_STATE_RST_FAIL, &hdev->state)) && is_kill) { | ||
65 | set_bit(vlan_id, vport->vlan_del_fail_bmap); | ||
66 | + mutex_unlock(&hdev->vport_lock); | ||
67 | return -EBUSY; | ||
68 | + } else if (!is_kill && test_bit(vlan_id, vport->vlan_del_fail_bmap)) { | ||
69 | + clear_bit(vlan_id, vport->vlan_del_fail_bmap); | ||
70 | } | ||
71 | + mutex_unlock(&hdev->vport_lock); | ||
72 | |||
73 | /* when port base vlan enabled, we use port base vlan as the vlan | ||
74 | * filter entry. In this case, we don't update vlan filter table | ||
75 | @@ -XXX,XX +XXX,XX @@ int hclge_set_vlan_filter(struct hnae3_handle *handle, __be16 proto, | ||
76 | * and try to remove it from hw later, to be consistence | ||
77 | * with stack | ||
78 | */ | ||
79 | + mutex_lock(&hdev->vport_lock); | ||
80 | set_bit(vlan_id, vport->vlan_del_fail_bmap); | ||
81 | + mutex_unlock(&hdev->vport_lock); | ||
82 | } | ||
83 | |||
84 | hclge_set_vport_vlan_fltr_change(vport); | ||
85 | @@ -XXX,XX +XXX,XX @@ static void hclge_sync_vlan_filter(struct hclge_dev *hdev) | ||
86 | int i, ret, sync_cnt = 0; | ||
87 | u16 vlan_id; | ||
88 | |||
89 | + mutex_lock(&hdev->vport_lock); | ||
90 | /* start from vport 1 for PF is always alive */ | ||
91 | for (i = 0; i < hdev->num_alloc_vport; i++) { | ||
92 | struct hclge_vport *vport = &hdev->vport[i]; | ||
93 | @@ -XXX,XX +XXX,XX @@ static void hclge_sync_vlan_filter(struct hclge_dev *hdev) | ||
94 | ret = hclge_set_vlan_filter_hw(hdev, htons(ETH_P_8021Q), | ||
95 | vport->vport_id, vlan_id, | ||
96 | true); | ||
97 | - if (ret && ret != -EINVAL) | ||
98 | + if (ret && ret != -EINVAL) { | ||
99 | + mutex_unlock(&hdev->vport_lock); | ||
100 | return; | ||
101 | + } | ||
102 | |||
103 | clear_bit(vlan_id, vport->vlan_del_fail_bmap); | ||
104 | hclge_rm_vport_vlan_table(vport, vlan_id, false); | ||
105 | hclge_set_vport_vlan_fltr_change(vport); | ||
106 | |||
107 | sync_cnt++; | ||
108 | - if (sync_cnt >= HCLGE_MAX_SYNC_COUNT) | ||
109 | + if (sync_cnt >= HCLGE_MAX_SYNC_COUNT) { | ||
110 | + mutex_unlock(&hdev->vport_lock); | ||
111 | return; | ||
112 | + } | ||
113 | |||
114 | vlan_id = find_first_bit(vport->vlan_del_fail_bmap, | ||
115 | VLAN_N_VID); | ||
116 | } | ||
117 | } | ||
118 | + mutex_unlock(&hdev->vport_lock); | ||
119 | |||
120 | hclge_sync_vlan_fltr_state(hdev); | ||
121 | } | ||
122 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | ||
123 | index XXXXXXX..XXXXXXX 100644 | ||
124 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | ||
125 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | ||
126 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_set_vlan_filter(struct hnae3_handle *handle, | ||
127 | test_bit(HCLGEVF_STATE_RST_FAIL, &hdev->state)) && is_kill) { | ||
128 | set_bit(vlan_id, hdev->vlan_del_fail_bmap); | ||
129 | return -EBUSY; | ||
130 | + } else if (!is_kill && test_bit(vlan_id, hdev->vlan_del_fail_bmap)) { | ||
131 | + clear_bit(vlan_id, hdev->vlan_del_fail_bmap); | ||
132 | } | ||
133 | |||
134 | hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN, | ||
135 | @@ -XXX,XX +XXX,XX @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev) | ||
136 | int ret, sync_cnt = 0; | ||
137 | u16 vlan_id; | ||
138 | |||
139 | + if (bitmap_empty(hdev->vlan_del_fail_bmap, VLAN_N_VID)) | ||
140 | + return; | ||
141 | + | ||
142 | + rtnl_lock(); | ||
143 | vlan_id = find_first_bit(hdev->vlan_del_fail_bmap, VLAN_N_VID); | ||
144 | while (vlan_id != VLAN_N_VID) { | ||
145 | ret = hclgevf_set_vlan_filter(handle, htons(ETH_P_8021Q), | ||
146 | vlan_id, true); | ||
147 | if (ret) | ||
148 | - return; | ||
149 | + break; | ||
150 | |||
151 | clear_bit(vlan_id, hdev->vlan_del_fail_bmap); | ||
152 | sync_cnt++; | ||
153 | if (sync_cnt >= HCLGEVF_MAX_SYNC_COUNT) | ||
154 | - return; | ||
155 | + break; | ||
156 | |||
157 | vlan_id = find_first_bit(hdev->vlan_del_fail_bmap, VLAN_N_VID); | ||
158 | } | ||
159 | + rtnl_unlock(); | ||
160 | } | ||
161 | |||
162 | static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | ||
163 | -- | ||
164 | 2.30.0 | ||
165 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Yonglong Liu <liuyonglong@huawei.com> | ||
1 | 2 | ||
3 | In hclgevf_mbx_handler() and hclgevf_get_mbx_resp() functions, | ||
4 | there is a typical store-store and load-load scenario between | ||
5 | received_resp and additional_info. This patch adds barrier | ||
6 | to fix the problem. | ||
7 | |||
8 | Fixes: 4671042f1ef0 ("net: hns3: add match_id to check mailbox response from PF to VF") | ||
9 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | ||
10 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
11 | --- | ||
12 | drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c | 7 +++++++ | ||
13 | 1 file changed, 7 insertions(+) | ||
14 | |||
15 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c | ||
16 | index XXXXXXX..XXXXXXX 100644 | ||
17 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c | ||
18 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_mbx.c | ||
19 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_get_mbx_resp(struct hclgevf_dev *hdev, u16 code0, u16 code1, | ||
20 | i++; | ||
21 | } | ||
22 | |||
23 | + /* ensure additional_info will be seen after received_resp */ | ||
24 | + smp_rmb(); | ||
25 | + | ||
26 | if (i >= HCLGEVF_MAX_TRY_TIMES) { | ||
27 | dev_err(&hdev->pdev->dev, | ||
28 | "VF could not get mbx(%u,%u) resp(=%d) from PF in %d tries\n", | ||
29 | @@ -XXX,XX +XXX,XX @@ static void hclgevf_handle_mbx_response(struct hclgevf_dev *hdev, | ||
30 | resp->resp_status = hclgevf_resp_to_errno(resp_status); | ||
31 | memcpy(resp->additional_info, req->msg.resp_data, | ||
32 | HCLGE_MBX_MAX_RESP_DATA_SIZE * sizeof(u8)); | ||
33 | + | ||
34 | + /* ensure additional_info will be seen before setting received_resp */ | ||
35 | + smp_wmb(); | ||
36 | + | ||
37 | if (match_id) { | ||
38 | /* If match_id is not zero, it means PF support match_id. | ||
39 | * if the match_id is right, VF get the right response, or | ||
40 | -- | ||
41 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Jian Shen <shenjian15@huawei.com> | ||
1 | 2 | ||
3 | Currently, the FEC capability bit is default set for device version V2. | ||
4 | It's incorrect for the copper port. Eventhough it doesn't make the nic | ||
5 | work abnormal, but the capability information display in debugfs may | ||
6 | confuse user. So clear it when driver get the port type inforamtion. | ||
7 | |||
8 | Fixes: 433ccce83504 ("net: hns3: use FEC capability queried from firmware") | ||
9 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | ||
10 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
11 | --- | ||
12 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 1 + | ||
13 | 1 file changed, 1 insertion(+) | ||
14 | |||
15 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
16 | index XXXXXXX..XXXXXXX 100644 | ||
17 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
18 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
19 | @@ -XXX,XX +XXX,XX @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) | ||
20 | goto err_msi_irq_uninit; | ||
21 | |||
22 | if (hdev->hw.mac.media_type == HNAE3_MEDIA_TYPE_COPPER) { | ||
23 | + clear_bit(HNAE3_DEV_SUPPORT_FEC_B, ae_dev->caps); | ||
24 | if (hnae3_dev_phy_imp_supported(hdev)) | ||
25 | ret = hclge_update_tp_port_info(hdev); | ||
26 | else | ||
27 | -- | ||
28 | 2.30.0 | diff view generated by jsdifflib |
1 | From: Hao Lan <lanhao@huawei.com> | 1 | From: Yonglong Liu <liuyonglong@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | There are spelling mistakes in hclgevf_get_regs. Fix them. | 3 | The hns3 driver define an array of string to show the coalesce |
4 | info, but if the kernel adds a new mode or a new state, | ||
5 | out-of-bounds access may occur when coalesce info is read via | ||
6 | debugfs, this patch fix the problem. | ||
4 | 7 | ||
5 | Signed-off-by: Hao Lan <lanhao@huawei.com> | 8 | Fixes: c99fead7cb07 ("net: hns3: add debugfs support for interrupt coalesce") |
9 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | ||
6 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 10 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
7 | --- | 11 | --- |
8 | .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++--------- | 12 | drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 9 ++++++--- |
9 | 1 file changed, 14 insertions(+), 13 deletions(-) | 13 | 1 file changed, 6 insertions(+), 3 deletions(-) |
10 | 14 | ||
11 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 15 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c |
12 | index XXXXXXX..XXXXXXX 100644 | 16 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 17 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c |
14 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 18 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c |
15 | @@ -XXX,XX +XXX,XX @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, | 19 | @@ -XXX,XX +XXX,XX @@ static void hns3_get_coal_info(struct hns3_enet_tqp_vector *tqp_vector, |
16 | |||
17 | struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | ||
18 | struct hnae3_queue *tqp; | ||
19 | - int i, j, reg_um; | ||
20 | + int i, j, reg_num; | ||
21 | u32 *reg = data; | ||
22 | |||
23 | *version = hdev->fw_version; | ||
24 | reg += hclgevf_reg_get_header(reg); | ||
25 | |||
26 | /* fetching per-VF registers values from VF PCIe register space */ | ||
27 | - reg_um = ARRAY_SIZE(cmdq_reg_addr_list); | ||
28 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_um, reg); | ||
29 | - for (i = 0; i < reg_um; i++) | ||
30 | + reg_num = ARRAY_SIZE(cmdq_reg_addr_list); | ||
31 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_num, reg); | ||
32 | + for (i = 0; i < reg_num; i++) | ||
33 | *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); | ||
34 | |||
35 | - reg_um = ARRAY_SIZE(common_reg_addr_list); | ||
36 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_um, reg); | ||
37 | - for (i = 0; i < reg_um; i++) | ||
38 | + reg_num = ARRAY_SIZE(common_reg_addr_list); | ||
39 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_num, reg); | ||
40 | + for (i = 0; i < reg_num; i++) | ||
41 | *reg++ = hclgevf_read_dev(&hdev->hw, common_reg_addr_list[i]); | ||
42 | |||
43 | - reg_um = ARRAY_SIZE(ring_reg_addr_list); | ||
44 | + reg_num = ARRAY_SIZE(ring_reg_addr_list); | ||
45 | for (j = 0; j < hdev->num_tqps; j++) { | ||
46 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg); | ||
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 | } | 20 | } |
55 | 21 | ||
56 | - reg_um = ARRAY_SIZE(tqp_intr_reg_addr_list); | 22 | sprintf(result[j++], "%d", i); |
57 | + reg_num = ARRAY_SIZE(tqp_intr_reg_addr_list); | 23 | - sprintf(result[j++], "%s", dim_state_str[dim->state]); |
58 | for (j = 0; j < hdev->num_msi_used - 1; j++) { | 24 | + sprintf(result[j++], "%s", dim->state < ARRAY_SIZE(dim_state_str) ? |
59 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, reg_um, reg); | 25 | + dim_state_str[dim->state] : "unknown"); |
60 | - for (i = 0; i < reg_um; i++) | 26 | sprintf(result[j++], "%u", dim->profile_ix); |
61 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, | 27 | - sprintf(result[j++], "%s", dim_cqe_mode_str[dim->mode]); |
62 | + reg_num, reg); | 28 | + sprintf(result[j++], "%s", dim->mode < ARRAY_SIZE(dim_cqe_mode_str) ? |
63 | + for (i = 0; i < reg_num; i++) | 29 | + dim_cqe_mode_str[dim->mode] : "unknown"); |
64 | *reg++ = hclgevf_read_dev(&hdev->hw, | 30 | sprintf(result[j++], "%s", |
65 | tqp_intr_reg_addr_list[i] + | 31 | - dim_tune_stat_str[dim->tune_state]); |
66 | HCLGEVF_RING_INT_REG_OFFSET * j); | 32 | + dim->tune_state < ARRAY_SIZE(dim_tune_stat_str) ? |
33 | + dim_tune_stat_str[dim->tune_state] : "unknown"); | ||
34 | sprintf(result[j++], "%u", dim->steps_left); | ||
35 | sprintf(result[j++], "%u", dim->steps_right); | ||
36 | sprintf(result[j++], "%u", dim->tired); | ||
67 | -- | 37 | -- |
68 | 2.33.0 | 38 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Yonglong Liu <liuyonglong@huawei.com> | ||
1 | 2 | ||
3 | When a VF is calling hns3_init_mac_addr(), get_mac_addr() may | ||
4 | return fail, then the value of mac_addr_temp is not initialized. | ||
5 | |||
6 | Fixes: 76ad4f0ee747 ("net: hns3: Add support of HNS3 Ethernet Driver for hip08 SoC") | ||
7 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | ||
8 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
9 | --- | ||
10 | drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 2 +- | ||
11 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
12 | |||
13 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
14 | index XXXXXXX..XXXXXXX 100644 | ||
15 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
16 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | ||
17 | @@ -XXX,XX +XXX,XX @@ static int hns3_init_mac_addr(struct net_device *netdev) | ||
18 | struct hns3_nic_priv *priv = netdev_priv(netdev); | ||
19 | char format_mac_addr[HNAE3_FORMAT_MAC_ADDR_LEN]; | ||
20 | struct hnae3_handle *h = priv->ae_handle; | ||
21 | - u8 mac_addr_temp[ETH_ALEN]; | ||
22 | + u8 mac_addr_temp[ETH_ALEN] = {0}; | ||
23 | int ret = 0; | ||
24 | |||
25 | if (h->ae_algo->ops->get_mac_addr) | ||
26 | -- | ||
27 | 2.30.0 | diff view generated by jsdifflib |
1 | From: Jian Shen <shenjian15@huawei.com> | 1 | Currently the reset process in hns3 and firmware watchdog init process is |
---|---|---|---|
2 | asynchronous. We think firmware watchdog initialization is completed | ||
3 | before VF clear the interrupt source. However, firmware initialization | ||
4 | may not complete early. So VF will receive multiple reset interrupts | ||
5 | and fail to reset. | ||
2 | 6 | ||
3 | The VF driver missed to store the rx VLAN tag strip state when | 7 | So we add delay before VF interrupt source and 5 ms delay |
4 | user change the rx VLAN tag offload state. And it will default | 8 | is enough to avoid second reset interrupt. |
5 | to enable the rx vlan tag strip when re-init VF device after | ||
6 | reset. So if user disable rx VLAN tag offload, and trig reset, | ||
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 | 9 | ||
11 | Fixes: b2641e2ad456 ("net: hns3: Add support of hardware rx-vlan-offload to HNS3 VF driver") | 10 | Fixes: 427900d27d86 ("net: hns3: fix the timing issue of VF clearing interrupt sources") |
12 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | ||
13 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 11 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
14 | --- | 12 | --- |
15 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++++----- | 13 | .../ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 13 ++++++++++--- |
16 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 14 | 1 file changed, 10 insertions(+), 3 deletions(-) |
17 | 2 files changed, 21 insertions(+), 7 deletions(-) | ||
18 | 15 | ||
19 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 16 | 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 | 17 | index XXXXXXX..XXXXXXX 100644 |
21 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 18 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
22 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 19 | +++ 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) | 20 | @@ -XXX,XX +XXX,XX @@ static void hclgevf_service_task(struct work_struct *work) |
24 | rtnl_unlock(); | 21 | hclgevf_mailbox_service_task(hdev); |
25 | } | 22 | } |
26 | 23 | ||
27 | -static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 24 | -static void hclgevf_clear_event_cause(struct hclgevf_dev *hdev, u32 regclr) |
28 | +static int hclgevf_en_hw_strip_rxvtag_cmd(struct hclgevf_dev *hdev, bool enable) | 25 | +static void hclgevf_clear_event_cause(struct hclgevf_dev *hdev, u32 regclr, |
26 | + bool need_dalay) | ||
29 | { | 27 | { |
30 | - struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 28 | +#define HCLGEVF_RESET_DELAY 5 |
31 | struct hclge_vf_to_pf_msg send_msg; | 29 | + |
32 | 30 | + if (need_dalay) | |
33 | hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN, | 31 | + mdelay(HCLGEVF_RESET_DELAY); |
34 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 32 | + |
35 | return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0); | 33 | hclgevf_write_dev(&hdev->hw, HCLGE_COMM_VECTOR0_CMDQ_SRC_REG, regclr); |
36 | } | 34 | } |
37 | 35 | ||
38 | +static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 36 | @@ -XXX,XX +XXX,XX @@ static irqreturn_t hclgevf_misc_irq_handle(int irq, void *data) |
39 | +{ | 37 | hclgevf_enable_vector(&hdev->misc_vector, false); |
40 | + struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 38 | event_cause = hclgevf_check_evt_cause(hdev, &clearval); |
41 | + int ret; | 39 | if (event_cause != HCLGEVF_VECTOR0_EVENT_OTHER) |
42 | + | 40 | - hclgevf_clear_event_cause(hdev, clearval); |
43 | + ret = hclgevf_en_hw_strip_rxvtag_cmd(hdev, enable); | 41 | + hclgevf_clear_event_cause(hdev, clearval, |
44 | + if (ret) | 42 | + event_cause == HCLGEVF_VECTOR0_EVENT_RST); |
45 | + return ret; | 43 | |
46 | + | 44 | switch (event_cause) { |
47 | + hdev->rxvtag_strip_en = enable; | 45 | case HCLGEVF_VECTOR0_EVENT_RST: |
48 | + return 0; | 46 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_misc_irq_init(struct hclgevf_dev *hdev) |
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; | 47 | 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 | } | 48 | } |
82 | 49 | ||
83 | - ret = hclgevf_init_vlan_config(hdev); | 50 | - hclgevf_clear_event_cause(hdev, 0); |
84 | + ret = hclgevf_init_vlan_config(hdev, true); | 51 | + hclgevf_clear_event_cause(hdev, 0, false); |
85 | if (ret) { | 52 | |
86 | dev_err(&hdev->pdev->dev, | 53 | /* enable misc. vector(vector 0) */ |
87 | "failed(%d) to initialize VLAN config\n", ret); | 54 | hclgevf_enable_vector(&hdev->misc_vector, true); |
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 | -- | 55 | -- |
103 | 2.33.0 | 56 | 2.30.0 | diff view generated by jsdifflib |
1 | From: Yonglong Liu <liuyonglong@huawei.com> | 1 | If PF is down, firmware will returns 10 Mbit/s rate and half-duplex mode |
---|---|---|---|
2 | when PF queries the port information from firmware. | ||
2 | 3 | ||
3 | In hclge_add_fd_entry(), if the flow type is FLOW_EXT, and the data of | 4 | After imp reset command is executed, PF status changes to down, |
4 | m_ext is all zero, then some members of the local variable "info" are | 5 | and PF will query link status and updates port information |
5 | not initialized. | 6 | from firmware in a periodic scheduled task. |
6 | 7 | ||
7 | Fixes: 67b0e1428e2f ("net: hns3: add support for user-def data of flow director") | 8 | However, there is a low probability that port information is updated |
8 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | 9 | when PF is down, and then PF link status changes to up. |
10 | In this case, PF synchronizes incorrect rate and duplex mode to VF. | ||
11 | |||
12 | This patch fixes it by updating port information before | ||
13 | PF synchronizes the rate and duplex to the VF | ||
14 | when PF changes to up. | ||
15 | |||
16 | Fixes: 18b6e31f8bf4 ("net: hns3: PF add support for pushing link status to VFs") | ||
9 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 17 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
10 | --- | 18 | --- |
11 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 19 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 ++++ |
12 | 1 file changed, 1 insertion(+), 1 deletion(-) | 20 | 1 file changed, 4 insertions(+) |
13 | 21 | ||
14 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 22 | 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 | 23 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 24 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
17 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 25 | +++ 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, | 26 | @@ -XXX,XX +XXX,XX @@ static void hclge_sync_fd_table(struct hclge_dev *hdev); |
19 | struct ethtool_rxnfc *cmd) | 27 | static void hclge_update_fec_stats(struct hclge_dev *hdev); |
20 | { | 28 | static int hclge_mac_link_status_wait(struct hclge_dev *hdev, int link_ret, |
21 | struct hclge_vport *vport = hclge_get_vport(handle); | 29 | int wait_cnt); |
22 | + struct hclge_fd_user_def_info info = {0}; | 30 | +static int hclge_update_port_info(struct hclge_dev *hdev); |
23 | struct hclge_dev *hdev = vport->back; | 31 | |
24 | - struct hclge_fd_user_def_info info; | 32 | static struct hnae3_ae_algo ae_algo; |
25 | u16 dst_vport_id = 0, q_index = 0; | 33 | |
26 | struct ethtool_rx_flow_spec *fs; | 34 | @@ -XXX,XX +XXX,XX @@ static void hclge_update_link_status(struct hclge_dev *hdev) |
27 | struct hclge_fd_rule *rule; | 35 | |
36 | if (state != hdev->hw.mac.link) { | ||
37 | hdev->hw.mac.link = state; | ||
38 | + if (state == HCLGE_LINK_STATUS_UP) | ||
39 | + hclge_update_port_info(hdev); | ||
40 | + | ||
41 | client->ops->link_status_change(handle, state); | ||
42 | hclge_config_mac_tnl_int(hdev, state); | ||
43 | if (rclient && rclient->ops->link_status_change) | ||
28 | -- | 44 | -- |
29 | 2.33.0 | 45 | 2.30.0 | diff view generated by jsdifflib |