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