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 |