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 (1): |
4 | net: hns3: fix spelling mistake "reg_um" -> "reg_num" | 4 | net: hns3: direct return when receive a unknown mailbox message |
5 | 5 | ||
6 | Jian Shen (1): | 6 | Peiyang Wang (4): |
7 | net: hns3: store rx VLAN tag offload state for VF | 7 | net: hns3: change type of numa_node_mask as nodemask_t |
8 | net: hns3: release PTP resources if pf initialization failed | ||
9 | net: hns3: use appropriate barrier function after setting a bit value | ||
10 | net: hns3: using user configure after hardware reset | ||
8 | 11 | ||
9 | Yonglong Liu (1): | 12 | Yonglong Liu (2): |
10 | net: hns3: fix a use of uninitialized variable problem | 13 | net: hns3: fix port vlan filter not disabled issue |
14 | net: hns3: fix kernel crash when devlink reload during vf | ||
15 | initialization | ||
11 | 16 | ||
12 | .../hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 17 | drivers/net/ethernet/hisilicon/hns3/hnae3.h | 2 +- |
13 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++----- | 18 | .../hisilicon/hns3/hns3pf/hclge_main.c | 35 ++++++++++++------- |
14 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 19 | .../hisilicon/hns3/hns3pf/hclge_main.h | 5 ++- |
15 | .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++--------- | 20 | .../hisilicon/hns3/hns3pf/hclge_mbx.c | 7 ++-- |
16 | 4 files changed, 36 insertions(+), 21 deletions(-) | 21 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 14 +++++--- |
22 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 2 +- | ||
23 | 6 files changed, 42 insertions(+), 23 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 | Currently, the driver didn't return when receive a unknown | ||
4 | mailbox message, and continue checking whether need to | ||
5 | generate a response. It's unnecessary and may be incorrect. | ||
6 | |||
7 | Fixes: bb5790b71bad ("net: hns3: refactor mailbox response scheme between PF and VF") | ||
8 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | ||
9 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
10 | --- | ||
11 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 7 ++++--- | ||
12 | 1 file changed, 4 insertions(+), 3 deletions(-) | ||
13 | |||
14 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | ||
15 | index XXXXXXX..XXXXXXX 100644 | ||
16 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | ||
17 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | ||
18 | @@ -XXX,XX +XXX,XX @@ static void hclge_mbx_request_handling(struct hclge_mbx_ops_param *param) | ||
19 | |||
20 | hdev = param->vport->back; | ||
21 | cmd_func = hclge_mbx_ops_list[param->req->msg.code]; | ||
22 | - if (cmd_func) | ||
23 | - ret = cmd_func(param); | ||
24 | - else | ||
25 | + if (!cmd_func) { | ||
26 | dev_err(&hdev->pdev->dev, | ||
27 | "un-supported mailbox message, code = %u\n", | ||
28 | param->req->msg.code); | ||
29 | + return; | ||
30 | + } | ||
31 | + ret = cmd_func(param); | ||
32 | |||
33 | /* PF driver should not reply IMP */ | ||
34 | if (hnae3_get_bit(param->req->mbx_need_resp, HCLGE_MBX_NEED_RESP_B) && | ||
35 | -- | ||
36 | 2.30.0 | diff view generated by jsdifflib |
1 | From: Jian Shen <shenjian15@huawei.com> | 1 | From: Peiyang Wang <wangpeiyang1@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | The VF driver missed to store the rx VLAN tag strip state when | 3 | It provides nodemask_t to describe the numa node mask in kernel. To |
4 | user change the rx VLAN tag offload state. And it will default | 4 | improve transportability, change the type of numa_node_mask as nodemask_t. |
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 | 5 | ||
11 | Fixes: b2641e2ad456 ("net: hns3: Add support of hardware rx-vlan-offload to HNS3 VF driver") | 6 | Fixes: 38caee9d3ee8 ("net: hns3: Add support of the HNAE3 framework") |
12 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | 7 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> |
13 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 8 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
14 | --- | 9 | --- |
15 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++++----- | 10 | drivers/net/ethernet/hisilicon/hns3/hnae3.h | 2 +- |
16 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 11 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 6 ++++-- |
17 | 2 files changed, 21 insertions(+), 7 deletions(-) | 12 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 2 +- |
13 | drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 7 ++++--- | ||
14 | drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | 2 +- | ||
15 | 5 files changed, 11 insertions(+), 8 deletions(-) | ||
18 | 16 | ||
17 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h | ||
18 | index XXXXXXX..XXXXXXX 100644 | ||
19 | --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h | ||
20 | +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h | ||
21 | @@ -XXX,XX +XXX,XX @@ struct hnae3_handle { | ||
22 | struct hnae3_roce_private_info rinfo; | ||
23 | }; | ||
24 | |||
25 | - u32 numa_node_mask; /* for multi-chip support */ | ||
26 | + nodemask_t numa_node_mask; /* for multi-chip support */ | ||
27 | |||
28 | enum hnae3_port_base_vlan_state port_base_vlan_state; | ||
29 | |||
30 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
31 | index XXXXXXX..XXXXXXX 100644 | ||
32 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
33 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
34 | @@ -XXX,XX +XXX,XX @@ static int hclge_vport_setup(struct hclge_vport *vport, u16 num_tqps) | ||
35 | |||
36 | nic->pdev = hdev->pdev; | ||
37 | nic->ae_algo = &ae_algo; | ||
38 | - nic->numa_node_mask = hdev->numa_node_mask; | ||
39 | + bitmap_copy(nic->numa_node_mask.bits, hdev->numa_node_mask.bits, | ||
40 | + MAX_NUMNODES); | ||
41 | nic->kinfo.io_base = hdev->hw.hw.io_base; | ||
42 | |||
43 | ret = hclge_knic_setup(vport, num_tqps, | ||
44 | @@ -XXX,XX +XXX,XX @@ static int hclge_init_roce_base_info(struct hclge_vport *vport) | ||
45 | |||
46 | roce->pdev = nic->pdev; | ||
47 | roce->ae_algo = nic->ae_algo; | ||
48 | - roce->numa_node_mask = nic->numa_node_mask; | ||
49 | + bitmap_copy(roce->numa_node_mask.bits, nic->numa_node_mask.bits, | ||
50 | + MAX_NUMNODES); | ||
51 | |||
52 | return 0; | ||
53 | } | ||
54 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
55 | index XXXXXXX..XXXXXXX 100644 | ||
56 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
57 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
58 | @@ -XXX,XX +XXX,XX @@ struct hclge_dev { | ||
59 | |||
60 | u16 fdir_pf_filter_count; /* Num of guaranteed filters for this PF */ | ||
61 | u16 num_alloc_vport; /* Num vports this driver supports */ | ||
62 | - u32 numa_node_mask; | ||
63 | + nodemask_t numa_node_mask; | ||
64 | u16 rx_buf_len; | ||
65 | u16 num_tx_desc; /* desc num of per tx queue */ | ||
66 | u16 num_rx_desc; /* desc num of per rx queue */ | ||
19 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 67 | 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 | 68 | index XXXXXXX..XXXXXXX 100644 |
21 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 69 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
22 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 70 | +++ 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) | 71 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_set_handle_info(struct hclgevf_dev *hdev) |
24 | rtnl_unlock(); | 72 | |
73 | nic->ae_algo = &ae_algovf; | ||
74 | nic->pdev = hdev->pdev; | ||
75 | - nic->numa_node_mask = hdev->numa_node_mask; | ||
76 | + bitmap_copy(nic->numa_node_mask.bits, hdev->numa_node_mask.bits, | ||
77 | + MAX_NUMNODES); | ||
78 | nic->flags |= HNAE3_SUPPORT_VF; | ||
79 | nic->kinfo.io_base = hdev->hw.hw.io_base; | ||
80 | |||
81 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_init_roce_base_info(struct hclgevf_dev *hdev) | ||
82 | |||
83 | roce->pdev = nic->pdev; | ||
84 | roce->ae_algo = nic->ae_algo; | ||
85 | - roce->numa_node_mask = nic->numa_node_mask; | ||
86 | - | ||
87 | + bitmap_copy(roce->numa_node_mask.bits, nic->numa_node_mask.bits, | ||
88 | + MAX_NUMNODES); | ||
89 | return 0; | ||
25 | } | 90 | } |
26 | 91 | ||
27 | -static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | ||
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 | 92 | 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 | 93 | index XXXXXXX..XXXXXXX 100644 |
90 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | 94 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h |
91 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h | 95 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h |
92 | @@ -XXX,XX +XXX,XX @@ struct hclgevf_dev { | 96 | @@ -XXX,XX +XXX,XX @@ struct hclgevf_dev { |
93 | u16 *vector_status; | 97 | u16 rss_size_max; /* HW defined max RSS task queue */ |
94 | int *vector_irq; | 98 | |
95 | 99 | u16 num_alloc_vport; /* num vports this driver supports */ | |
96 | - bool gro_en; | 100 | - u32 numa_node_mask; |
97 | + u32 gro_en :1; | 101 | + nodemask_t numa_node_mask; |
98 | + u32 rxvtag_strip_en :1; | 102 | u16 rx_buf_len; |
99 | 103 | u16 num_tx_desc; /* desc num of per tx queue */ | |
100 | unsigned long vlan_del_fail_bmap[BITS_TO_LONGS(VLAN_N_VID)]; | 104 | u16 num_rx_desc; /* desc num of per rx queue */ |
101 | |||
102 | -- | 105 | -- |
103 | 2.33.0 | 106 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Peiyang Wang <wangpeiyang1@huawei.com> | ||
1 | 2 | ||
3 | During the PF initialization process, hclge_update_port_info may return an | ||
4 | error code for some reason. At this point, the ptp initialization has been | ||
5 | completed. To void memory leaks, the resources that are applied by ptp | ||
6 | should be released. Therefore, when hclge_update_port_info returns an error | ||
7 | code, hclge_ptp_uninit is called to release the corresponding resources. | ||
8 | |||
9 | Fixes: eaf83ae59e18 ("net: hns3: add querying fec ability from firmware") | ||
10 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> | ||
11 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
12 | --- | ||
13 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 +++- | ||
14 | 1 file changed, 3 insertions(+), 1 deletion(-) | ||
15 | |||
16 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
17 | index XXXXXXX..XXXXXXX 100644 | ||
18 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
19 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
20 | @@ -XXX,XX +XXX,XX @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) | ||
21 | |||
22 | ret = hclge_update_port_info(hdev); | ||
23 | if (ret) | ||
24 | - goto err_mdiobus_unreg; | ||
25 | + goto err_ptp_uninit; | ||
26 | |||
27 | INIT_KFIFO(hdev->mac_tnl_log); | ||
28 | |||
29 | @@ -XXX,XX +XXX,XX @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev) | ||
30 | devl_unlock(hdev->devlink); | ||
31 | return 0; | ||
32 | |||
33 | +err_ptp_uninit: | ||
34 | + hclge_ptp_uninit(hdev); | ||
35 | err_mdiobus_unreg: | ||
36 | if (hdev->hw.mac.phydev) | ||
37 | mdiobus_unregister(hdev->hw.mac.mdio_bus); | ||
38 | -- | ||
39 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Peiyang Wang <wangpeiyang1@huawei.com> | ||
1 | 2 | ||
3 | There is a memory barrier in followed case. When set the port down, | ||
4 | hclgevf_set_timmer will set DOWN in state. Meanwhile, the service task has | ||
5 | different behaviour based on whether the state is DOWN. Thus, to make sure | ||
6 | service task see DOWN, use smp_mb__after_atomic after calling set_bit(). | ||
7 | |||
8 | CPU0 CPU1 | ||
9 | ========================== =================================== | ||
10 | hclgevf_set_timer_task() hclgevf_periodic_service_task() | ||
11 | set_bit(DOWN,state) test_bit(DOWN,state) | ||
12 | |||
13 | pf also has this issue. | ||
14 | |||
15 | Fixes: ff200099d271 ("net: hns3: remove unnecessary work in hclgevf_main") | ||
16 | Fixes: 1c6dfe6fc6f7 ("net: hns3: remove mailbox and reset work in hclge_main") | ||
17 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> | ||
18 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
19 | --- | ||
20 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 3 +-- | ||
21 | drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 3 +-- | ||
22 | 2 files changed, 2 insertions(+), 4 deletions(-) | ||
23 | |||
24 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
25 | index XXXXXXX..XXXXXXX 100644 | ||
26 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
27 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
28 | @@ -XXX,XX +XXX,XX @@ static void hclge_set_timer_task(struct hnae3_handle *handle, bool enable) | ||
29 | /* Set the DOWN flag here to disable link updating */ | ||
30 | set_bit(HCLGE_STATE_DOWN, &hdev->state); | ||
31 | |||
32 | - /* flush memory to make sure DOWN is seen by service task */ | ||
33 | - smp_mb__before_atomic(); | ||
34 | + smp_mb__after_atomic(); /* flush memory to make sure DOWN is seen by service task */ | ||
35 | hclge_flush_link_update(hdev); | ||
36 | } | ||
37 | } | ||
38 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | ||
39 | index XXXXXXX..XXXXXXX 100644 | ||
40 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | ||
41 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | ||
42 | @@ -XXX,XX +XXX,XX @@ static void hclgevf_set_timer_task(struct hnae3_handle *handle, bool enable) | ||
43 | } else { | ||
44 | set_bit(HCLGEVF_STATE_DOWN, &hdev->state); | ||
45 | |||
46 | - /* flush memory to make sure DOWN is seen by service task */ | ||
47 | - smp_mb__before_atomic(); | ||
48 | + smp_mb__after_atomic(); /* flush memory to make sure DOWN is seen by service task */ | ||
49 | hclgevf_flush_link_update(hdev); | ||
50 | } | ||
51 | } | ||
52 | -- | ||
53 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Peiyang Wang <wangpeiyang1@huawei.com> | ||
1 | 2 | ||
3 | When a reset occurring, it's supposed to recover user's configuration. | ||
4 | Currently, the port info(speed, duplex and autoneg) is stored in hclge_mac | ||
5 | and will be scheduled updated. Consider the case that reset was happened | ||
6 | consecutively. During the first reset, the port info is configured with | ||
7 | a temporary value cause the PHY is reset and looking for best link config. | ||
8 | Second reset start and use pervious configuration which is not the user's. | ||
9 | The specific process is as follows: | ||
10 | |||
11 | +------+ +----+ +----+ | ||
12 | | USER | | PF | | HW | | ||
13 | +---+--+ +-+--+ +-+--+ | ||
14 | | ethtool --reset | | | ||
15 | +------------------->| reset command | | ||
16 | | ethtool --reset +-------------------->| | ||
17 | +------------------->| +---+ | ||
18 | | +---+ | | | ||
19 | | | |reset currently | | HW RESET | ||
20 | | | |and wait to do | | | ||
21 | | |<--+ | | | ||
22 | | | send pervious cfg |<--+ | ||
23 | | | (1000M FULL AN_ON) | | ||
24 | | +-------------------->| | ||
25 | | | read cfg(time task) | | ||
26 | | | (10M HALF AN_OFF) +---+ | ||
27 | | |<--------------------+ | cfg take effect | ||
28 | | | reset command |<--+ | ||
29 | | +-------------------->| | ||
30 | | | +---+ | ||
31 | | | send pervious cfg | | HW RESET | ||
32 | | | (10M HALF AN_OFF) |<--+ | ||
33 | | +-------------------->| | ||
34 | | | read cfg(time task) | | ||
35 | | | (10M HALF AN_OFF) +---+ | ||
36 | | |<--------------------+ | cfg take effect | ||
37 | | | | | | ||
38 | | | read cfg(time task) |<--+ | ||
39 | | | (10M HALF AN_OFF) | | ||
40 | | |<--------------------+ | ||
41 | | | | | ||
42 | v v v | ||
43 | |||
44 | To avoid aboved situation, this patch introduced req_speed, req_duplex, | ||
45 | req_autoneg to store user's configuration and it only be used after | ||
46 | hardware reset and to recover user's configuration | ||
47 | |||
48 | Fixes: f5f2b3e4dcc0 ("net: hns3: add support for imp-controlled PHYs") | ||
49 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> | ||
50 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
51 | --- | ||
52 | .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 15 +++++++++------ | ||
53 | .../ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 3 +++ | ||
54 | 2 files changed, 12 insertions(+), 6 deletions(-) | ||
55 | |||
56 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
57 | index XXXXXXX..XXXXXXX 100644 | ||
58 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
59 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
60 | @@ -XXX,XX +XXX,XX @@ static int hclge_configure(struct hclge_dev *hdev) | ||
61 | cfg.default_speed, ret); | ||
62 | return ret; | ||
63 | } | ||
64 | + hdev->hw.mac.req_speed = hdev->hw.mac.speed; | ||
65 | + hdev->hw.mac.req_autoneg = AUTONEG_ENABLE; | ||
66 | + hdev->hw.mac.req_duplex = DUPLEX_FULL; | ||
67 | |||
68 | hclge_parse_link_mode(hdev, cfg.speed_ability); | ||
69 | |||
70 | @@ -XXX,XX +XXX,XX @@ hclge_set_phy_link_ksettings(struct hnae3_handle *handle, | ||
71 | return ret; | ||
72 | } | ||
73 | |||
74 | - hdev->hw.mac.autoneg = cmd->base.autoneg; | ||
75 | - hdev->hw.mac.speed = cmd->base.speed; | ||
76 | - hdev->hw.mac.duplex = cmd->base.duplex; | ||
77 | + hdev->hw.mac.req_autoneg = cmd->base.autoneg; | ||
78 | + hdev->hw.mac.req_speed = cmd->base.speed; | ||
79 | + hdev->hw.mac.req_duplex = cmd->base.duplex; | ||
80 | linkmode_copy(hdev->hw.mac.advertising, cmd->link_modes.advertising); | ||
81 | |||
82 | return 0; | ||
83 | @@ -XXX,XX +XXX,XX @@ static int hclge_update_tp_port_info(struct hclge_dev *hdev) | ||
84 | if (ret) | ||
85 | return ret; | ||
86 | |||
87 | - hdev->hw.mac.autoneg = cmd.base.autoneg; | ||
88 | - hdev->hw.mac.speed = cmd.base.speed; | ||
89 | - hdev->hw.mac.duplex = cmd.base.duplex; | ||
90 | + cmd.base.autoneg = hdev->hw.mac.req_autoneg; | ||
91 | + cmd.base.speed = hdev->hw.mac.req_speed; | ||
92 | + cmd.base.duplex = hdev->hw.mac.req_duplex; | ||
93 | linkmode_copy(hdev->hw.mac.advertising, cmd.link_modes.advertising); | ||
94 | |||
95 | return 0; | ||
96 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
97 | index XXXXXXX..XXXXXXX 100644 | ||
98 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
99 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
100 | @@ -XXX,XX +XXX,XX @@ struct hclge_mac { | ||
101 | u8 media_type; /* port media type, e.g. fibre/copper/backplane */ | ||
102 | u8 mac_addr[ETH_ALEN]; | ||
103 | u8 autoneg; | ||
104 | + u8 req_autoneg; | ||
105 | u8 duplex; | ||
106 | + u8 req_duplex; | ||
107 | u8 support_autoneg; | ||
108 | u8 speed_type; /* 0: sfp speed, 1: active speed */ | ||
109 | u8 lane_num; | ||
110 | u32 speed; | ||
111 | + u32 req_speed; | ||
112 | u32 max_speed; | ||
113 | u32 speed_ability; /* speed ability supported by current media */ | ||
114 | u32 module_type; /* sub media type, e.g. kr/cr/sr/lr */ | ||
115 | -- | ||
116 | 2.30.0 | diff view generated by jsdifflib |
1 | From: Yonglong Liu <liuyonglong@huawei.com> | 1 | From: Yonglong Liu <liuyonglong@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | In hclge_add_fd_entry(), if the flow type is FLOW_EXT, and the data of | 3 | According to hardware limitation, for device support modify |
4 | m_ext is all zero, then some members of the local variable "info" are | 4 | VLAN filter state but not support bypass port VLAN filter, |
5 | not initialized. | 5 | it should always disable the port VLAN filter. but the driver |
6 | enables port VLAN filter when initializing, if there is no | ||
7 | VLAN(except VLAN 0) id added, the driver will disable it | ||
8 | in service task. In most time, it works fine. But there is | ||
9 | a time window before the service task shceduled and net device | ||
10 | being registered. So if user adds VLAN at this time, the driver | ||
11 | will not update the VLAN filter state, and the port VLAN filter | ||
12 | remains enabled. | ||
6 | 13 | ||
7 | Fixes: 67b0e1428e2f ("net: hns3: add support for user-def data of flow director") | 14 | To fix the problem, if support modify VLAN filter state but not |
15 | support bypass port VLAN filter, set the port vlan filter to "off". | ||
16 | |||
17 | Fixes: 184cd221a863 ("net: hns3: disable port VLAN filter when support function level VLAN filter control") | ||
18 | Fixes: 2ba306627f59 ("net: hns3: add support for modify VLAN filter state") | ||
8 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | 19 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> |
9 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 20 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
10 | --- | 21 | --- |
11 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 22 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 7 ++++++- |
12 | 1 file changed, 1 insertion(+), 1 deletion(-) | 23 | 1 file changed, 6 insertions(+), 1 deletion(-) |
13 | 24 | ||
14 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 25 | 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 | 26 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 27 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
17 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 28 | +++ 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, | 29 | @@ -XXX,XX +XXX,XX @@ static int hclge_set_vlan_protocol_type(struct hclge_dev *hdev) |
19 | struct ethtool_rxnfc *cmd) | 30 | static int hclge_init_vlan_filter(struct hclge_dev *hdev) |
20 | { | 31 | { |
21 | struct hclge_vport *vport = hclge_get_vport(handle); | 32 | struct hclge_vport *vport; |
22 | + struct hclge_fd_user_def_info info = {0}; | 33 | + bool enable = true; |
23 | struct hclge_dev *hdev = vport->back; | 34 | int ret; |
24 | - struct hclge_fd_user_def_info info; | 35 | int i; |
25 | u16 dst_vport_id = 0, q_index = 0; | 36 | |
26 | struct ethtool_rx_flow_spec *fs; | 37 | @@ -XXX,XX +XXX,XX @@ static int hclge_init_vlan_filter(struct hclge_dev *hdev) |
27 | struct hclge_fd_rule *rule; | 38 | vport->cur_vlan_fltr_en = true; |
39 | } | ||
40 | |||
41 | + if (test_bit(HNAE3_DEV_SUPPORT_VLAN_FLTR_MDF_B, hdev->ae_dev->caps) && | ||
42 | + !test_bit(HNAE3_DEV_SUPPORT_PORT_VLAN_BYPASS_B, hdev->ae_dev->caps)) | ||
43 | + enable = false; | ||
44 | + | ||
45 | return hclge_set_vlan_filter_ctrl(hdev, HCLGE_FILTER_TYPE_PORT, | ||
46 | - HCLGE_FILTER_FE_INGRESS, true, 0); | ||
47 | + HCLGE_FILTER_FE_INGRESS, enable, 0); | ||
48 | } | ||
49 | |||
50 | static int hclge_init_vlan_type(struct hclge_dev *hdev) | ||
28 | -- | 51 | -- |
29 | 2.33.0 | 52 | 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 devlink reload process will access the hardware resources, |
4 | but the register operation is done before the hardware is initialized. | ||
5 | So, processing the devlink reload during initialization may lead to kernel | ||
6 | crash. This patch fixes this by taking devl_lock during initialization. | ||
4 | 7 | ||
5 | Signed-off-by: Hao Lan <lanhao@huawei.com> | 8 | Fixes: cd6242991d2e ("net: hns3: add support for registering devlink for VF") |
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/hns3vf/hclgevf_main.c | 4 ++++ |
9 | 1 file changed, 14 insertions(+), 13 deletions(-) | 13 | 1 file changed, 4 insertions(+) |
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/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.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/hns3vf/hclgevf_main.c |
14 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 18 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c |
15 | @@ -XXX,XX +XXX,XX @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, | 19 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) |
16 | 20 | if (ret) | |
17 | struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 21 | goto err_devlink_init; |
18 | struct hnae3_queue *tqp; | 22 | |
19 | - int i, j, reg_um; | 23 | + devl_lock(hdev->devlink); |
20 | + int i, j, reg_num; | 24 | + |
21 | u32 *reg = data; | 25 | ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw); |
22 | 26 | if (ret) | |
23 | *version = hdev->fw_version; | 27 | goto err_cmd_queue_init; |
24 | reg += hclgevf_reg_get_header(reg); | 28 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) |
25 | 29 | hclgevf_task_schedule(hdev, round_jiffies_relative(HZ)); | |
26 | /* fetching per-VF registers values from VF PCIe register space */ | 30 | timer_setup(&hdev->reset_timer, hclgevf_reset_timer, 0); |
27 | - reg_um = ARRAY_SIZE(cmdq_reg_addr_list); | 31 | |
28 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_um, reg); | 32 | + devl_unlock(hdev->devlink); |
29 | - for (i = 0; i < reg_um; i++) | 33 | return 0; |
30 | + reg_num = ARRAY_SIZE(cmdq_reg_addr_list); | 34 | |
31 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_num, reg); | 35 | err_config: |
32 | + for (i = 0; i < reg_num; i++) | 36 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev) |
33 | *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); | 37 | err_cmd_init: |
34 | 38 | hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw); | |
35 | - reg_um = ARRAY_SIZE(common_reg_addr_list); | 39 | err_cmd_queue_init: |
36 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_um, reg); | 40 | + devl_unlock(hdev->devlink); |
37 | - for (i = 0; i < reg_um; i++) | 41 | hclgevf_devlink_uninit(hdev); |
38 | + reg_num = ARRAY_SIZE(common_reg_addr_list); | 42 | err_devlink_init: |
39 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_num, reg); | 43 | hclgevf_pci_uninit(hdev); |
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 | } | ||
55 | |||
56 | - reg_um = ARRAY_SIZE(tqp_intr_reg_addr_list); | ||
57 | + reg_num = ARRAY_SIZE(tqp_intr_reg_addr_list); | ||
58 | for (j = 0; j < hdev->num_msi_used - 1; j++) { | ||
59 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, reg_um, reg); | ||
60 | - for (i = 0; i < reg_um; i++) | ||
61 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, | ||
62 | + reg_num, reg); | ||
63 | + for (i = 0; i < reg_num; i++) | ||
64 | *reg++ = hclgevf_read_dev(&hdev->hw, | ||
65 | tqp_intr_reg_addr_list[i] + | ||
66 | HCLGEVF_RING_INT_REG_OFFSET * j); | ||
67 | -- | 44 | -- |
68 | 2.33.0 | 45 | 2.30.0 | diff view generated by jsdifflib |