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: mark unexcuted loopback test result as UNEXECUTED
5
5
6
Jian Shen (1):
6
Jie Wang (1):
7
net: hns3: store rx VLAN tag offload state for VF
7
net: hns3: fix index limit to support all queue stats
8
8
9
Yonglong Liu (1):
9
Yonglong Liu (1):
10
net: hns3: fix a use of uninitialized variable problem
10
net: hns3: fix kernel crash when devlink reload during pf
11
initialization
11
12
12
.../hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
13
.../hns3/hns3_common/hclge_comm_tqp_stats.c | 2 +-
13
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++-----
14
.../net/ethernet/hisilicon/hns3/hns3_ethtool.c | 16 +++++++++++++++-
14
.../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++-
15
.../hisilicon/hns3/hns3pf/hclge_devlink.c | 5 +++--
15
.../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++---------
16
3 files changed, 19 insertions(+), 4 deletions(-)
16
4 files changed, 36 insertions(+), 21 deletions(-)
17
17
18
--
18
--
19
2.33.0
19
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 useless. So this patch remove 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>
7
---
9
---
8
.../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++---------
10
.../ethernet/hisilicon/hns3/hns3_common/hclge_comm_tqp_stats.c | 2 +-
9
1 file changed, 14 insertions(+), 13 deletions(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
10
12
11
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c
13
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
14
index XXXXXXX..XXXXXXX 100644
13
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c
15
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_tqp_stats.c
14
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c
16
+++ 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,
17
@@ -XXX,XX +XXX,XX @@ int hclge_comm_tqps_update_stats(struct hnae3_handle *handle,
16
18
        hclge_comm_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_TX_STATS,
17
    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
19
                        true);
18
    struct hnae3_queue *tqp;
20
19
-    int i, j, reg_um;
21
-        desc.data[0] = cpu_to_le32(tqp->index & 0x1ff);
20
+    int i, j, reg_num;
22
+        desc.data[0] = cpu_to_le32(tqp->index);
21
    u32 *reg = data;
23
        ret = hclge_comm_cmd_send(hw, &desc, 1);
22
24
        if (ret) {
23
    *version = hdev->fw_version;
25
            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
--
26
--
68
2.33.0
27
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 before the hardware initialize
5
not initialized.
5
done, so, if process the devlink reload during initializetion,
6
may lead the kernel crash. This patch check whether the NIC is
7
initialized to fix the problem.
6
8
7
Fixes: 67b0e1428e2f ("net: hns3: add support for user-def data of flow director")
9
Fixes: b741269b2759 ("net: hns3: add support for registering devlink for PF")
8
Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
10
Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
9
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
11
Signed-off-by: Jijie Shao <shaojijie@huawei.com>
10
---
12
---
11
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +-
13
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c | 5 +++--
12
1 file changed, 1 insertion(+), 1 deletion(-)
14
1 file changed, 3 insertions(+), 2 deletions(-)
13
15
14
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
16
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
15
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
16
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
18
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
17
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c
19
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_devlink.c
18
@@ -XXX,XX +XXX,XX @@ static int hclge_add_fd_entry(struct hnae3_handle *handle,
20
@@ -XXX,XX +XXX,XX @@ static int hclge_devlink_reload_down(struct devlink *devlink, bool netns_change,
19
             struct ethtool_rxnfc *cmd)
21
    struct pci_dev *pdev = hdev->pdev;
20
{
22
    int ret;
21
    struct hclge_vport *vport = hclge_get_vport(handle);
23
22
+    struct hclge_fd_user_def_info info = {0};
24
-    if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) {
23
    struct hclge_dev *hdev = vport->back;
25
-        dev_err(&pdev->dev, "reset is handling\n");
24
-    struct hclge_fd_user_def_info info;
26
+    if (test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state) ||
25
    u16 dst_vport_id = 0, q_index = 0;
27
+     !test_bit(HCLGE_STATE_NIC_REGISTERED, &hdev->state)) {
26
    struct ethtool_rx_flow_spec *fs;
28
+        dev_err(&pdev->dev, "reset is handling or driver removed\n");
27
    struct hclge_fd_rule *rule;
29
        return -EBUSY;
30
    }
31
28
--
32
--
29
2.33.0
33
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 maybe 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. Fixes it by set the flag and initialize the
6
reset. So if user disable rx VLAN tag offload, and trig reset,
6
value to be 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>
14
---
11
---
15
.../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++++-----
12
.../net/ethernet/hisilicon/hns3/hns3_ethtool.c | 16 +++++++++++++++-
16
.../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++-
13
1 file changed, 15 insertions(+), 1 deletion(-)
17
2 files changed, 21 insertions(+), 7 deletions(-)
18
14
19
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
15
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
16
index XXXXXXX..XXXXXXX 100644
21
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
17
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
22
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
18
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
23
@@ -XXX,XX +XXX,XX @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev)
19
@@ -XXX,XX +XXX,XX @@ static const struct hns3_stats hns3_rxq_stats[] = {
24
    rtnl_unlock();
20
#define HNS3_NIC_LB_TEST_NO_MEM_ERR    1
25
}
21
#define HNS3_NIC_LB_TEST_TX_CNT_ERR    2
26
22
#define HNS3_NIC_LB_TEST_RX_CNT_ERR    3
27
-static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
23
+#define HNS3_NIC_LB_TEST_UNEXECUTED    4
28
+static int hclgevf_en_hw_strip_rxvtag_cmd(struct hclgevf_dev *hdev, bool enable)
24
+
25
+static int hns3_get_sset_count(struct net_device *netdev, int stringset);
26
27
static int hns3_lp_setup(struct net_device *ndev, enum hnae3_loop loop, bool en)
29
{
28
{
30
-    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
29
@@ -XXX,XX +XXX,XX @@ static void hns3_do_external_lb(struct net_device *ndev,
31
    struct hclge_vf_to_pf_msg send_msg;
30
static void hns3_self_test(struct net_device *ndev,
32
31
             struct ethtool_test *eth_test, u64 *data)
33
    hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN,
32
{
34
@@ -XXX,XX +XXX,XX @@ static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
33
+    int cnt = hns3_get_sset_count(ndev, ETH_SS_TEST);
35
    return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0);
34
    struct hns3_nic_priv *priv = netdev_priv(ndev);
36
}
35
    struct hnae3_handle *h = priv->ae_handle;
37
36
    int st_param[HNAE3_LOOP_NONE][2];
38
+static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable)
37
    bool if_running = netif_running(ndev);
39
+{
38
+    int i;
40
+    struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle);
41
+    int ret;
42
+
39
+
43
+    ret = hclgevf_en_hw_strip_rxvtag_cmd(hdev, enable);
40
+    /* initialize the loopback test result, avoiding mark unexcuted loopback
44
+    if (ret)
41
+     * test as PASS.
45
+        return ret;
42
+     */
46
+
43
+    for (i = 0; i < cnt; i++)
47
+    hdev->rxvtag_strip_en = enable;
44
+        data[i] = HNS3_NIC_LB_TEST_UNEXECUTED;
48
+    return 0;
45
49
+}
46
    if (hns3_nic_resetting(ndev)) {
50
+
47
        netdev_err(ndev, "dev resetting!");
51
static int hclgevf_reset_tqp(struct hnae3_handle *handle)
48
+        eth_test->flags |= ETH_TEST_FL_FAILED;
52
{
49
        return;
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
    }
50
    }
82
51
83
-    ret = hclgevf_init_vlan_config(hdev);
52
-    if (!(eth_test->flags & ETH_TEST_FL_OFFLINE))
84
+    ret = hclgevf_init_vlan_config(hdev, true);
53
+    if (!(eth_test->flags & ETH_TEST_FL_OFFLINE)) {
85
    if (ret) {
54
+        eth_test->flags |= ETH_TEST_FL_FAILED;
86
        dev_err(&hdev->pdev->dev,
55
        return;
87
            "failed(%d) to initialize VLAN config\n", ret);
56
+    }
88
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
57
89
index XXXXXXX..XXXXXXX 100644
58
    if (netif_msg_ifdown(h))
90
--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.h
59
        netdev_info(ndev, "self test start\n");
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
--
60
--
103
2.33.0
61
2.30.0
diff view generated by jsdifflib