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
---
4
net: hns3: fix spelling mistake "reg_um" -> "reg_num"
4
changeLog:
5
v3 -> v4:
6
- Fixed an unclear sentence in commit log, suggested by Michal Kubiak
7
- Used devl_lock to disallow reload to race with initialization, suggested by Jiri Pirko
8
v3: https://lore.kernel.org/all/20240318132948.3624333-1-shaojijie@huawei.com/
9
v2 -> v3:
10
- Fixed a syntax error in commit log, suggested by Ratheesh Kannoth
11
v2: https://lore.kernel.org/all/20240316111057.277591-1-shaojijie@huawei.com/
12
v1 -> v2:
13
- Fixed some syntax errors in commit log and comments, suggested by Michal Kubiak
14
- Optimized the code by using a flag, suggested by Michal Kubiak
15
v1: https://lore.kernel.org/all/20240315100748.2913882-1-shaojijie@huawei.com/
16
---
5
17
6
Jian Shen (1):
18
Jian Shen (1):
7
net: hns3: store rx VLAN tag offload state for VF
19
net: hns3: mark unexcuted loopback test result as UNEXECUTED
20
21
Jie Wang (1):
22
net: hns3: fix index limit to support all queue stats
8
23
9
Yonglong Liu (1):
24
Yonglong Liu (1):
10
net: hns3: fix a use of uninitialized variable problem
25
net: hns3: fix kernel crash when devlink reload during pf
26
initialization
11
27
12
.../hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
28
.../hns3/hns3_common/hclge_comm_tqp_stats.c | 2 +-
13
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++-----
29
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 19 +++++++++++++++++--
14
.../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++-
30
.../hisilicon/hns3/hns3pf/hclge_main.c | 4 ++++
15
.../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++---------
31
3 files changed, 22 insertions(+), 3 deletions(-)
16
4 files changed, 36 insertions(+), 21 deletions(-)
17
32
18
--
33
--
19
2.33.0
34
2.30.0
diff view generated by jsdifflib
1
From: Hao Lan <lanhao@huawei.com>
1
From: Jie Wang <wangjie125@huawei.com>
2
2
3
There are spelling mistakes in hclgevf_get_regs. Fix them.
3
Currently, hns hardware supports more than 512 queues and the index limit
4
in hclge_comm_tqps_update_stats is wrong. So this patch removes it.
4
5
5
Signed-off-by: Hao Lan <lanhao@huawei.com>
6
Fixes: 287db5c40d15 ("net: hns3: create new set of common tqp stats APIs for PF and VF reuse")
7
Signed-off-by: Jie Wang <wangjie125@huawei.com>
6
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
8
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
9
Reviewed-by: Michal Kubiak <michal.kubiak@intel.com>
10
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
7
---
11
---
8
.../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++---------
12
.../ethernet/hisilicon/hns3/hns3_common/hclge_comm_tqp_stats.c | 2 +-
9
1 file changed, 14 insertions(+), 13 deletions(-)
13
1 file changed, 1 insertion(+), 1 deletion(-)
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_common/hclge_comm_tqp_stats.c b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_tqp_stats.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_common/hclge_comm_tqp_stats.c
14
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c
18
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_tqp_stats.c
15
@@ -XXX,XX +XXX,XX @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version,
19
@@ -XXX,XX +XXX,XX @@ int hclge_comm_tqps_update_stats(struct hnae3_handle *handle,
16
20
        hclge_comm_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_TX_STATS,
17
    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
21
                        true);
18
    struct hnae3_queue *tqp;
22
19
-    int i, j, reg_um;
23
-        desc.data[0] = cpu_to_le32(tqp->index & 0x1ff);
20
+    int i, j, reg_num;
24
+        desc.data[0] = cpu_to_le32(tqp->index);
21
    u32 *reg = data;
25
        ret = hclge_comm_cmd_send(hw, &desc, 1);
22
26
        if (ret) {
23
    *version = hdev->fw_version;
27
            dev_err(&hw->cmq.csq.pdev->dev,
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
    }
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
--
28
--
68
2.33.0
29
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
The devlink reload process will access the hardware resources,
4
m_ext is all zero, then some members of the local variable "info" are
4
but the register operation is done before the hardware is initialized.
5
not 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.
6
7
7
Fixes: 67b0e1428e2f ("net: hns3: add support for user-def data of flow director")
8
Fixes: b741269b2759 ("net: hns3: add support for registering devlink for PF")
8
Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
9
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 | 4 ++++
12
1 file changed, 1 insertion(+), 1 deletion(-)
13
1 file changed, 4 insertions(+)
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_init_ae_dev(struct hnae3_ae_dev *ae_dev)
19
             struct ethtool_rxnfc *cmd)
20
    if (ret)
20
{
21
        goto err_pci_uninit;
21
    struct hclge_vport *vport = hclge_get_vport(handle);
22
22
+    struct hclge_fd_user_def_info info = {0};
23
+    devl_lock(hdev->devlink);
23
    struct hclge_dev *hdev = vport->back;
24
+
24
-    struct hclge_fd_user_def_info info;
25
    /* Firmware command queue initialize */
25
    u16 dst_vport_id = 0, q_index = 0;
26
    ret = hclge_comm_cmd_queue_init(hdev->pdev, &hdev->hw.hw);
26
    struct ethtool_rx_flow_spec *fs;
27
    if (ret)
27
    struct hclge_fd_rule *rule;
28
@@ -XXX,XX +XXX,XX @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
29
30
    hclge_task_schedule(hdev, round_jiffies_relative(HZ));
31
32
+    devl_unlock(hdev->devlink);
33
    return 0;
34
35
err_mdiobus_unreg:
36
@@ -XXX,XX +XXX,XX @@ static int hclge_init_ae_dev(struct hnae3_ae_dev *ae_dev)
37
err_cmd_uninit:
38
    hclge_comm_cmd_uninit(hdev->ae_dev, &hdev->hw.hw);
39
err_devlink_uninit:
40
+    devl_unlock(hdev->devlink);
41
    hclge_devlink_uninit(hdev);
42
err_pci_uninit:
43
    pcim_iounmap(pdev, hdev->hw.hw.io_base);
28
--
44
--
29
2.33.0
45
2.30.0
diff view generated by jsdifflib
1
From: Jian Shen <shenjian15@huawei.com>
1
From: Jian Shen <shenjian15@huawei.com>
2
2
3
The VF driver missed to store the rx VLAN tag strip state when
3
Currently, loopback test may be skipped when resetting, but the test
4
user change the rx VLAN tag offload state. And it will default
4
result will still show as 'PASS', because the driver doesn't set
5
to enable the rx vlan tag strip when re-init VF device after
5
ETH_TEST_FL_FAILED flag. Fix it by setting the flag and
6
reset. So if user disable rx VLAN tag offload, and trig reset,
6
initializating the value to UNEXECUTED.
7
then the HW will still strip the VLAN tag from packet nad fill
8
into RX BD, but the VF driver will ignore it for rx VLAN tag
9
offload disabled. It may cause the rx VLAN tag dropped.
10
7
11
Fixes: b2641e2ad456 ("net: hns3: Add support of hardware rx-vlan-offload to HNS3 VF driver")
8
Fixes: 4c8dab1c709c ("net: hns3: reconstruct function hns3_self_test")
12
Signed-off-by: Jian Shen <shenjian15@huawei.com>
9
Signed-off-by: Jian Shen <shenjian15@huawei.com>
13
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
10
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
11
Reviewed-by: Michal Kubiak <michal.kubiak@intel.com>
14
---
12
---
15
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++++-----
13
.../ethernet/hisilicon/hns3/hns3_ethtool.c | 19 +++++++++++++++++--
16
.../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++-
14
1 file changed, 17 insertions(+), 2 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/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.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/hns3_ethtool.c
22
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
19
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
23
@@ -XXX,XX +XXX,XX @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev)
20
@@ -XXX,XX +XXX,XX @@ static const struct hns3_stats hns3_rxq_stats[] = {
24
    rtnl_unlock();
21
#define HNS3_NIC_LB_TEST_NO_MEM_ERR    1
22
#define HNS3_NIC_LB_TEST_TX_CNT_ERR    2
23
#define HNS3_NIC_LB_TEST_RX_CNT_ERR    3
24
+#define HNS3_NIC_LB_TEST_UNEXECUTED    4
25
+
26
+static int hns3_get_sset_count(struct net_device *netdev, int stringset);
27
28
static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
29
{
30
@@ -XXX,XX +XXX,XX @@ static void hns3_do_external_lb(struct net_device *ndev,
31
static void hns3_self_test(struct net_device *ndev,
32
             struct ethtool_test *eth_test, u64 *data)
33
{
34
+    int cnt = hns3_get_sset_count(ndev, ETH_SS_TEST);
35
    struct hns3_nic_priv *priv = netdev_priv(ndev);
36
    struct hnae3_handle *h = priv->ae_handle;
37
    int st_param[HNAE3_LOOP_NONE][2];
38
    bool if_running = netif_running(ndev);
39
+    int i;
40
+
41
+    /* initialize the loopback test result, avoid marking an unexcuted
42
+     * loopback test as PASS.
43
+     */
44
+    for (i = 0; i < cnt; i++)
45
+        data[i] = HNS3_NIC_LB_TEST_UNEXECUTED;
46
47
    if (hns3_nic_resetting(ndev)) {
48
        netdev_err(ndev, "dev resetting!");
49
-        return;
50
+        goto failure;
51
    }
52
53
    if (!(eth_test->flags & ETH_TEST_FL_OFFLINE))
54
-        return;
55
+        goto failure;
56
57
    if (netif_msg_ifdown(h))
58
        netdev_info(ndev, "self test start\n");
59
@@ -XXX,XX +XXX,XX @@ static void hns3_self_test(struct net_device *ndev,
60
61
    if (netif_msg_ifdown(h))
62
        netdev_info(ndev, "self test end\n");
63
+    return;
64
+
65
+failure:
66
+    eth_test->flags |= ETH_TEST_FL_FAILED;
25
}
67
}
26
68
27
-static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
69
static void hns3_update_limit_promisc_mode(struct net_device *netdev,
28
+static int hclgevf_en_hw_strip_rxvtag_cmd(struct hclgevf_dev *hdev, bool enable)
29
{
30
-    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
31
    struct hclge_vf_to_pf_msg send_msg;
32
33
    hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,
34
@@ -XXX,XX +XXX,XX @@ static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
35
    return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
36
}
37
38
+static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
39
+{
40
+    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
41
+    int ret;
42
+
43
+    ret = hclgevf_en_hw_strip_rxvtag_cmd(hdev, enable);
44
+    if (ret)
45
+        return ret;
46
+
47
+    hdev->rxvtag_strip_en = enable;
48
+    return 0;
49
+}
50
+
51
static int hclgevf_reset_tqp(struct hnae3_handle *handle)
52
{
53
#define HCLGEVF_RESET_ALL_QUEUE_DONE    1U
54
@@ -XXX,XX +XXX,XX @@ static int hclgevf_rss_init_hw(struct hclgevf_dev *hdev)
55
                     tc_valid, tc_size);
56
}
57
58
-static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev)
59
+static int hclgevf_init_vlan_config(struct hclgevf_dev *hdev,
60
+                 bool rxvtag_strip_en)
61
{
62
    struct hnae3_handle *nic = &hdev->nic;
63
    int ret;
64
65
-    ret = hclgevf_en_hw_strip_rxvtag(nic, true);
66
+    ret = hclgevf_en_hw_strip_rxvtag(nic, rxvtag_strip_en);
67
    if (ret) {
68
        dev_err(&hdev->pdev->dev,
69
            "failed to enable rx vlan offload, ret = %d\n", ret);
70
@@ -XXX,XX +XXX,XX @@ static int hclgevf_reset_hdev(struct hclgevf_dev *hdev)
71
    if (ret)
72
        return ret;
73
74
-    ret = hclgevf_init_vlan_config(hdev);
75
+    ret = hclgevf_init_vlan_config(hdev, hdev->rxvtag_strip_en);
76
    if (ret) {
77
        dev_err(&hdev->pdev->dev,
78
            "failed(%d) to initialize VLAN config\n", ret);
79
@@ -XXX,XX +XXX,XX @@ static int hclgevf_init_hdev(struct hclgevf_dev *hdev)
80
        goto err_config;
81
    }
82
83
-    ret = hclgevf_init_vlan_config(hdev);
84
+    ret = hclgevf_init_vlan_config(hdev, true);
85
    if (ret) {
86
        dev_err(&hdev->pdev->dev,
87
            "failed(%d) to initialize VLAN config\n", ret);
88
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
89
index XXXXXXX..XXXXXXX 100644
90
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
91
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
92
@@ -XXX,XX +XXX,XX @@ struct hclgevf_dev {
93
    u16 *vector_status;
94
    int *vector_irq;
95
96
-    bool gro_en;
97
+    u32 gro_en :1;
98
+    u32 rxvtag_strip_en :1;
99
100
    unsigned long vlan_del_fail_bmap[BITS_TO_LONGS(VLAN_N_VID)];
101
102
--
70
--
103
2.33.0
71
2.30.0
diff view generated by jsdifflib