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: restore user pause configure when disable autoneg |
5 | 5 | ||
6 | Jian Shen (1): | 6 | Jie Wang (2): |
7 | net: hns3: store rx VLAN tag offload state for VF | 7 | net: hns3: refactor hclge_mac_link_status_wait for interface reuse |
8 | net: hns3: add wait until mac link down | ||
8 | 9 | ||
9 | Yonglong Liu (1): | 10 | Peiyang Wang (1): |
10 | net: hns3: fix a use of uninitialized variable problem | 11 | net: hns3: fix wrong print link down up |
11 | 12 | ||
12 | .../hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 13 | Yonglong Liu (2): |
13 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++----- | 14 | net: hns3: fix side effects passed to min_t() |
14 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 15 | net: hns3: fix deadlock issue when externel_lb and reset are executed |
15 | .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++--------- | 16 | together |
16 | 4 files changed, 36 insertions(+), 21 deletions(-) | 17 | |
18 | .../net/ethernet/hisilicon/hns3/hns3_enet.c | 17 ++++++++-- | ||
19 | .../hisilicon/hns3/hns3pf/hclge_main.c | 32 ++++++++++++++----- | ||
20 | .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 2 +- | ||
21 | .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | 1 + | ||
22 | 4 files changed, 41 insertions(+), 11 deletions(-) | ||
17 | 23 | ||
18 | -- | 24 | -- |
19 | 2.33.0 | 25 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Yonglong Liu <liuyonglong@huawei.com> | ||
1 | 2 | ||
3 | num_online_cpus() may call more than once when passing to min_t(), | ||
4 | between calls, it may return different values, so move num_online_cpus() | ||
5 | out of min_t(). | ||
6 | |||
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 | 3 ++- | ||
11 | 1 file changed, 2 insertions(+), 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_nic_alloc_vector_data(struct hns3_nic_priv *priv) | ||
18 | { | ||
19 | struct hnae3_handle *h = priv->ae_handle; | ||
20 | struct hns3_enet_tqp_vector *tqp_vector; | ||
21 | + u32 online_cpus = num_online_cpus(); | ||
22 | struct hnae3_vector_info *vector; | ||
23 | struct pci_dev *pdev = h->pdev; | ||
24 | u16 tqp_num = h->kinfo.num_tqps; | ||
25 | @@ -XXX,XX +XXX,XX @@ static int hns3_nic_alloc_vector_data(struct hns3_nic_priv *priv) | ||
26 | |||
27 | /* RSS size, cpu online and vector_num should be the same */ | ||
28 | /* Should consider 2p/4p later */ | ||
29 | - vector_num = min_t(u16, num_online_cpus(), tqp_num); | ||
30 | + vector_num = min_t(u16, online_cpus, tqp_num); | ||
31 | |||
32 | vector = devm_kcalloc(&pdev->dev, vector_num, sizeof(*vector), | ||
33 | GFP_KERNEL); | ||
34 | -- | ||
35 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Jian Shen <shenjian15@huawei.com> | ||
1 | 2 | ||
3 | Restore the mac pause state to user configuration when autoneg is disabled | ||
4 | |||
5 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | ||
6 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> | ||
7 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
8 | --- | ||
9 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 5 ++++- | ||
10 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 2 +- | ||
11 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | 1 + | ||
12 | 3 files changed, 6 insertions(+), 2 deletions(-) | ||
13 | |||
14 | 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 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
17 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
18 | @@ -XXX,XX +XXX,XX @@ int hclge_cfg_flowctrl(struct hclge_dev *hdev) | ||
19 | u32 rx_pause, tx_pause; | ||
20 | u8 flowctl; | ||
21 | |||
22 | - if (!phydev->link || !phydev->autoneg) | ||
23 | + if (!phydev->link) | ||
24 | return 0; | ||
25 | |||
26 | + if (!phydev->autoneg) | ||
27 | + return hclge_mac_pause_setup_hw(hdev); | ||
28 | + | ||
29 | local_advertising = linkmode_adv_to_lcl_adv_t(phydev->advertising); | ||
30 | |||
31 | if (phydev->pause) | ||
32 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | ||
33 | index XXXXXXX..XXXXXXX 100644 | ||
34 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | ||
35 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | ||
36 | @@ -XXX,XX +XXX,XX @@ static int hclge_bp_setup_hw(struct hclge_dev *hdev, u8 tc) | ||
37 | return 0; | ||
38 | } | ||
39 | |||
40 | -static int hclge_mac_pause_setup_hw(struct hclge_dev *hdev) | ||
41 | +int hclge_mac_pause_setup_hw(struct hclge_dev *hdev) | ||
42 | { | ||
43 | bool tx_en, rx_en; | ||
44 | |||
45 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | ||
46 | index XXXXXXX..XXXXXXX 100644 | ||
47 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | ||
48 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | ||
49 | @@ -XXX,XX +XXX,XX @@ int hclge_pfc_pause_en_cfg(struct hclge_dev *hdev, u8 tx_rx_bitmap, | ||
50 | u8 pfc_bitmap); | ||
51 | int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx); | ||
52 | int hclge_pause_addr_cfg(struct hclge_dev *hdev, const u8 *mac_addr); | ||
53 | +int hclge_mac_pause_setup_hw(struct hclge_dev *hdev); | ||
54 | void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats); | ||
55 | void hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats); | ||
56 | int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate); | ||
57 | -- | ||
58 | 2.30.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 | Some nic configurations could only be performed after link is down. So this |
4 | user change the rx VLAN tag offload state. And it will default | 4 | patch refactor this API for reuse. |
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 | Signed-off-by: Jie Wang <wangjie125@huawei.com> |
12 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | ||
13 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 7 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
14 | --- | 8 | --- |
15 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++++----- | 9 | .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 14 +++++++++----- |
16 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 10 | 1 file changed, 9 insertions(+), 5 deletions(-) |
17 | 2 files changed, 21 insertions(+), 7 deletions(-) | ||
18 | 11 | ||
19 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 12 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
20 | index XXXXXXX..XXXXXXX 100644 | 13 | index XXXXXXX..XXXXXXX 100644 |
21 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 14 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
22 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 15 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
23 | @@ -XXX,XX +XXX,XX @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev) | 16 | @@ -XXX,XX +XXX,XX @@ static void hclge_restore_hw_table(struct hclge_dev *hdev); |
24 | rtnl_unlock(); | 17 | static void hclge_sync_promisc_mode(struct hclge_dev *hdev); |
18 | static void hclge_sync_fd_table(struct hclge_dev *hdev); | ||
19 | static void hclge_update_fec_stats(struct hclge_dev *hdev); | ||
20 | +static int hclge_mac_link_status_wait(struct hclge_dev *hdev, int link_ret, | ||
21 | + int wait_cnt); | ||
22 | |||
23 | static struct hnae3_ae_algo ae_algo; | ||
24 | |||
25 | @@ -XXX,XX +XXX,XX @@ static void hclge_phy_link_status_wait(struct hclge_dev *hdev, | ||
26 | } while (++i < HCLGE_PHY_LINK_STATUS_NUM); | ||
25 | } | 27 | } |
26 | 28 | ||
27 | -static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 29 | -static int hclge_mac_link_status_wait(struct hclge_dev *hdev, int link_ret) |
28 | +static int hclgevf_en_hw_strip_rxvtag_cmd(struct hclgevf_dev *hdev, bool enable) | 30 | +static int hclge_mac_link_status_wait(struct hclge_dev *hdev, int link_ret, |
31 | + int wait_cnt) | ||
29 | { | 32 | { |
30 | - struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 33 | -#define HCLGE_MAC_LINK_STATUS_NUM 100 |
31 | struct hclge_vf_to_pf_msg send_msg; | 34 | - |
32 | 35 | int link_status; | |
33 | hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN, | 36 | int i = 0; |
34 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 37 | int ret; |
35 | return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0); | 38 | @@ -XXX,XX +XXX,XX @@ static int hclge_mac_link_status_wait(struct hclge_dev *hdev, int link_ret) |
39 | return 0; | ||
40 | |||
41 | msleep(HCLGE_LINK_STATUS_MS); | ||
42 | - } while (++i < HCLGE_MAC_LINK_STATUS_NUM); | ||
43 | + } while (++i < wait_cnt); | ||
44 | return -EBUSY; | ||
36 | } | 45 | } |
37 | 46 | ||
38 | +static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 47 | static int hclge_mac_phy_link_status_wait(struct hclge_dev *hdev, bool en, |
39 | +{ | 48 | bool is_phy) |
40 | + struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 49 | { |
41 | + int ret; | 50 | +#define HCLGE_MAC_LINK_STATUS_NUM 100 |
42 | + | 51 | + |
43 | + ret = hclgevf_en_hw_strip_rxvtag_cmd(hdev, enable); | 52 | int link_ret; |
44 | + if (ret) | 53 | |
45 | + return ret; | 54 | link_ret = en ? HCLGE_LINK_STATUS_UP : HCLGE_LINK_STATUS_DOWN; |
46 | + | 55 | @@ -XXX,XX +XXX,XX @@ static int hclge_mac_phy_link_status_wait(struct hclge_dev *hdev, bool en, |
47 | + hdev->rxvtag_strip_en = enable; | 56 | if (is_phy) |
48 | + return 0; | 57 | hclge_phy_link_status_wait(hdev, link_ret); |
49 | +} | 58 | |
50 | + | 59 | - return hclge_mac_link_status_wait(hdev, link_ret); |
51 | static int hclgevf_reset_tqp(struct hnae3_handle *handle) | 60 | + return hclge_mac_link_status_wait(hdev, link_ret, |
52 | { | 61 | + HCLGE_MAC_LINK_STATUS_NUM); |
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 | } | 62 | } |
57 | 63 | ||
58 | -static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev) | 64 | static int hclge_set_app_loopback(struct hclge_dev *hdev, bool en) |
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 | -- | 65 | -- |
103 | 2.33.0 | 66 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Jie Wang <wangjie125@huawei.com> | ||
1 | 2 | ||
3 | In some configure flow of hns3 driver, for example, change mtu, it will | ||
4 | disable MAC through firmware before configuration. But firmware disables | ||
5 | MAC asynchronously. The rx traffic may be not stopped in this case. | ||
6 | |||
7 | So fixes it by waiting until mac link is down. | ||
8 | |||
9 | Fixes: a9775bb64aa7 ("net: hns3: fix set and get link ksettings issue") | ||
10 | Signed-off-by: Jie Wang <wangjie125@huawei.com> | ||
11 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
12 | --- | ||
13 | .../net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 10 +++++++++- | ||
14 | 1 file changed, 9 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 void hclge_enable_fd(struct hnae3_handle *handle, bool enable) | ||
21 | |||
22 | static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable) | ||
23 | { | ||
24 | +#define HCLGE_LINK_STATUS_WAIT_CNT 3 | ||
25 | + | ||
26 | struct hclge_desc desc; | ||
27 | struct hclge_config_mac_mode_cmd *req = | ||
28 | (struct hclge_config_mac_mode_cmd *)desc.data; | ||
29 | @@ -XXX,XX +XXX,XX @@ static void hclge_cfg_mac_mode(struct hclge_dev *hdev, bool enable) | ||
30 | req->txrx_pad_fcs_loop_en = cpu_to_le32(loop_en); | ||
31 | |||
32 | ret = hclge_cmd_send(&hdev->hw, &desc, 1); | ||
33 | - if (ret) | ||
34 | + if (ret) { | ||
35 | dev_err(&hdev->pdev->dev, | ||
36 | "mac enable fail, ret =%d.\n", ret); | ||
37 | + return; | ||
38 | + } | ||
39 | + | ||
40 | + if (!enable) | ||
41 | + hclge_mac_link_status_wait(hdev, HCLGE_LINK_STATUS_DOWN, | ||
42 | + HCLGE_LINK_STATUS_WAIT_CNT); | ||
43 | } | ||
44 | |||
45 | static int hclge_config_switch_param(struct hclge_dev *hdev, int vfid, | ||
46 | -- | ||
47 | 2.30.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 | This patch will fix a wrong print "device link down/up". Consider a case |
4 | m_ext is all zero, then some members of the local variable "info" are | 4 | that set autoneg to off with same speed and duplex configuration. The link |
5 | not initialized. | 5 | is always up while the phy state is set to PHY_UP and set back to |
6 | PHY_RUNNING later. It will print link down when the phy state is not | ||
7 | PHY_RUNNING. To avoid that, the condition should include PHY_UP. | ||
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 | 3 ++- |
12 | 1 file changed, 1 insertion(+), 1 deletion(-) | 13 | 1 file changed, 2 insertions(+), 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 int hclge_get_mac_phy_link(struct hclge_dev *hdev, int *link_status) |
19 | struct ethtool_rxnfc *cmd) | 20 | if (test_bit(HCLGE_STATE_DOWN, &hdev->state)) |
20 | { | 21 | return 0; |
21 | struct hclge_vport *vport = hclge_get_vport(handle); | 22 | |
22 | + struct hclge_fd_user_def_info info = {0}; | 23 | - if (phydev && (phydev->state != PHY_RUNNING || !phydev->link)) |
23 | struct hclge_dev *hdev = vport->back; | 24 | + if (phydev && ((phydev->state != PHY_UP && |
24 | - struct hclge_fd_user_def_info info; | 25 | + phydev->state != PHY_RUNNING) || !phydev->link)) |
25 | u16 dst_vport_id = 0, q_index = 0; | 26 | return 0; |
26 | struct ethtool_rx_flow_spec *fs; | 27 | |
27 | struct hclge_fd_rule *rule; | 28 | return hclge_get_mac_link_status(hdev, link_status); |
28 | -- | 29 | -- |
29 | 2.33.0 | 30 | 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 | When externel_lb and reset are executed together, a deadlock may |
4 | occur: | ||
5 | [ 3147.217009] INFO: task kworker/u321:0:7 blocked for more than 120 seconds. | ||
6 | [ 3147.230483] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. | ||
7 | [ 3147.238999] task:kworker/u321:0 state:D stack: 0 pid: 7 ppid: 2 flags:0x00000008 | ||
8 | [ 3147.248045] Workqueue: hclge hclge_service_task [hclge] | ||
9 | [ 3147.253957] Call trace: | ||
10 | [ 3147.257093] __switch_to+0x7c/0xbc | ||
11 | [ 3147.261183] __schedule+0x338/0x6f0 | ||
12 | [ 3147.265357] schedule+0x50/0xe0 | ||
13 | [ 3147.269185] schedule_preempt_disabled+0x18/0x24 | ||
14 | [ 3147.274488] __mutex_lock.constprop.0+0x1d4/0x5dc | ||
15 | [ 3147.279880] __mutex_lock_slowpath+0x1c/0x30 | ||
16 | [ 3147.284839] mutex_lock+0x50/0x60 | ||
17 | [ 3147.288841] rtnl_lock+0x20/0x2c | ||
18 | [ 3147.292759] hclge_reset_prepare+0x68/0x90 [hclge] | ||
19 | [ 3147.298239] hclge_reset_subtask+0x88/0xe0 [hclge] | ||
20 | [ 3147.303718] hclge_reset_service_task+0x84/0x120 [hclge] | ||
21 | [ 3147.309718] hclge_service_task+0x2c/0x70 [hclge] | ||
22 | [ 3147.315109] process_one_work+0x1d0/0x490 | ||
23 | [ 3147.319805] worker_thread+0x158/0x3d0 | ||
24 | [ 3147.324240] kthread+0x108/0x13c | ||
25 | [ 3147.328154] ret_from_fork+0x10/0x18 | ||
4 | 26 | ||
5 | Signed-off-by: Hao Lan <lanhao@huawei.com> | 27 | In externel_lb process, the hns3 driver call napi_disable() |
28 | first, then the reset happen, then the restore process of the | ||
29 | externel_lb will fail, and will not call napi_enable(). When | ||
30 | doing externel_lb again, napi_disable() will be double call, | ||
31 | cause a deadlock of rtnl_lock(). | ||
32 | |||
33 | This patch use the HNS3_NIC_STATE_DOWN state to protect the | ||
34 | calling of napi_disable() and napi_enable() in externel_lb | ||
35 | process, just as the usage in ndo_stop() and ndo_start(). | ||
36 | |||
37 | Fixes: 04b6ba143521 ("net: hns3: add support for external loopback test") | ||
38 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | ||
6 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 39 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
7 | --- | 40 | --- |
8 | .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++--------- | 41 | drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 14 +++++++++++++- |
9 | 1 file changed, 14 insertions(+), 13 deletions(-) | 42 | 1 file changed, 13 insertions(+), 1 deletion(-) |
10 | 43 | ||
11 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 44 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
12 | index XXXXXXX..XXXXXXX 100644 | 45 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 46 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
14 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 47 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c |
15 | @@ -XXX,XX +XXX,XX @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, | 48 | @@ -XXX,XX +XXX,XX @@ void hns3_external_lb_prepare(struct net_device *ndev, bool if_running) |
16 | 49 | if (!if_running) | |
17 | struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 50 | return; |
18 | struct hnae3_queue *tqp; | 51 | |
19 | - int i, j, reg_um; | 52 | + if (test_and_set_bit(HNS3_NIC_STATE_DOWN, &priv->state)) |
20 | + int i, j, reg_num; | 53 | + return; |
21 | u32 *reg = data; | 54 | + |
22 | 55 | netif_carrier_off(ndev); | |
23 | *version = hdev->fw_version; | 56 | netif_tx_disable(ndev); |
24 | reg += hclgevf_reg_get_header(reg); | 57 | |
25 | 58 | @@ -XXX,XX +XXX,XX @@ void hns3_external_lb_restore(struct net_device *ndev, bool if_running) | |
26 | /* fetching per-VF registers values from VF PCIe register space */ | 59 | if (!if_running) |
27 | - reg_um = ARRAY_SIZE(cmdq_reg_addr_list); | 60 | return; |
28 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_um, reg); | 61 | |
29 | - for (i = 0; i < reg_um; i++) | 62 | - hns3_nic_reset_all_ring(priv->ae_handle); |
30 | + reg_num = ARRAY_SIZE(cmdq_reg_addr_list); | 63 | + if (hns3_nic_resetting(ndev)) |
31 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_num, reg); | 64 | + return; |
32 | + for (i = 0; i < reg_num; i++) | 65 | + |
33 | *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); | 66 | + if (!test_bit(HNS3_NIC_STATE_DOWN, &priv->state)) |
34 | 67 | + return; | |
35 | - reg_um = ARRAY_SIZE(common_reg_addr_list); | 68 | + |
36 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_um, reg); | 69 | + if (hns3_nic_reset_all_ring(priv->ae_handle)) |
37 | - for (i = 0; i < reg_um; i++) | 70 | + return; |
38 | + reg_num = ARRAY_SIZE(common_reg_addr_list); | 71 | + |
39 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_num, reg); | 72 | + clear_bit(HNS3_NIC_STATE_DOWN, &priv->state); |
40 | + for (i = 0; i < reg_num; i++) | 73 | |
41 | *reg++ = hclgevf_read_dev(&hdev->hw, common_reg_addr_list[i]); | 74 | for (i = 0; i < priv->vector_num; i++) |
42 | 75 | hns3_vector_enable(&priv->tqp_vector[i]); | |
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 | -- | 76 | -- |
68 | 2.33.0 | 77 | 2.30.0 | diff view generated by jsdifflib |