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 | Hao Lan (2): |
4 | net: hns3: fix spelling mistake "reg_um" -> "reg_num" | 4 | net: hns3: add new 200G link modes for hisilicon device |
5 | net: hns3: Disable SerDes serial loopback for HiLink H60 | ||
5 | 6 | ||
6 | Jian Shen (1): | 7 | Jian Shen (1): |
7 | net: hns3: store rx VLAN tag offload state for VF | 8 | net: hns3: add checking for vf id of mailbox |
9 | |||
10 | Jie Wang (1): | ||
11 | net: hns3: fix port duplex configure error in IMP reset | ||
12 | |||
13 | Jijie Shao (2): | ||
14 | net: hns3: fix wrong judgment condition issue | ||
15 | net: hns3: fix delete tc fail issue | ||
16 | |||
17 | Peiyang Wang (1): | ||
18 | net: hns3: fix reset timeout under full functions and queues | ||
8 | 19 | ||
9 | Yonglong Liu (1): | 20 | Yonglong Liu (1): |
10 | net: hns3: fix a use of uninitialized variable problem | 21 | net: hns3: fix kernel crash when 1588 is received on HIP08 devices |
11 | 22 | ||
12 | .../hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 23 | drivers/net/ethernet/hisilicon/hns3/hnae3.h | 2 + |
13 | .../hisilicon/hns3/hns3vf/hclgevf_main.c | 25 ++++++++++++----- | 24 | .../hns3/hns3_common/hclge_comm_cmd.c | 2 +- |
14 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 25 | .../hns3/hns3_common/hclge_comm_cmd.h | 2 +- |
15 | .../hisilicon/hns3/hns3vf/hclgevf_regs.c | 27 ++++++++++--------- | 26 | .../net/ethernet/hisilicon/hns3/hns3_dcbnl.c | 2 +- |
16 | 4 files changed, 36 insertions(+), 21 deletions(-) | 27 | .../ethernet/hisilicon/hns3/hns3_debugfs.c | 2 + |
28 | .../hisilicon/hns3/hns3pf/hclge_cmd.h | 3 +- | ||
29 | .../hisilicon/hns3/hns3pf/hclge_dcb.c | 2 + | ||
30 | .../hisilicon/hns3/hns3pf/hclge_main.c | 44 +++++++++++++------ | ||
31 | .../hisilicon/hns3/hns3pf/hclge_main.h | 11 ++++- | ||
32 | .../hisilicon/hns3/hns3pf/hclge_mbx.c | 7 +-- | ||
33 | .../hisilicon/hns3/hns3pf/hclge_ptp.c | 2 +- | ||
34 | .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 16 +++++++ | ||
35 | .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | 1 + | ||
36 | 13 files changed, 74 insertions(+), 22 deletions(-) | ||
17 | 37 | ||
18 | -- | 38 | -- |
19 | 2.33.0 | 39 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | In hns3_dcbnl_ieee_delapp, should check ieee_delapp not ieee_setapp. | ||
2 | This path fix the wrong judgment. | ||
1 | 3 | ||
4 | Fixes: 0ba22bcb222d ("net: hns3: add support config dscp map to tc") | ||
5 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
6 | --- | ||
7 | drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c | 2 +- | ||
8 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
9 | |||
10 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c b/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c | ||
11 | index XXXXXXX..XXXXXXX 100644 | ||
12 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c | ||
13 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_dcbnl.c | ||
14 | @@ -XXX,XX +XXX,XX @@ static int hns3_dcbnl_ieee_delapp(struct net_device *ndev, struct dcb_app *app) | ||
15 | if (hns3_nic_resetting(ndev)) | ||
16 | return -EBUSY; | ||
17 | |||
18 | - if (h->kinfo.dcb_ops->ieee_setapp) | ||
19 | + if (h->kinfo.dcb_ops->ieee_delapp) | ||
20 | return h->kinfo.dcb_ops->ieee_delapp(h, app); | ||
21 | |||
22 | return -EOPNOTSUPP; | ||
23 | -- | ||
24 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Hao Lan <lanhao@huawei.com> | ||
1 | 2 | ||
3 | The hisilicon device now supports a new 200G link interface, | ||
4 | which query from firmware in a new bit. Therefore, | ||
5 | the HCLGE_SUPPORT_200G_R4_BIT capability bit has been added. | ||
6 | The HCLGE_SUPPORT_200G_BIT has been renamed as | ||
7 | HCLGE_SUPPORT_200G_R4_EXT_BIT, and the firmware has | ||
8 | extended support for this mode. | ||
9 | |||
10 | Fixes: ae6f010cb1a7 ("net: hns3: add support for 200G device") | ||
11 | Signed-off-by: Hao Lan <lanhao@huawei.com> | ||
12 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
13 | --- | ||
14 | .../hisilicon/hns3/hns3pf/hclge_main.c | 28 ++++++++++++------- | ||
15 | .../hisilicon/hns3/hns3pf/hclge_main.h | 5 +++- | ||
16 | 2 files changed, 22 insertions(+), 11 deletions(-) | ||
17 | |||
18 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
19 | index XXXXXXX..XXXXXXX 100644 | ||
20 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
21 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
22 | @@ -XXX,XX +XXX,XX @@ static const struct hclge_speed_bit_map speed_bit_map[] = { | ||
23 | {HCLGE_MAC_SPEED_40G, HCLGE_SUPPORT_40G_BIT}, | ||
24 | {HCLGE_MAC_SPEED_50G, HCLGE_SUPPORT_50G_BITS}, | ||
25 | {HCLGE_MAC_SPEED_100G, HCLGE_SUPPORT_100G_BITS}, | ||
26 | - {HCLGE_MAC_SPEED_200G, HCLGE_SUPPORT_200G_BIT}, | ||
27 | + {HCLGE_MAC_SPEED_200G, HCLGE_SUPPORT_200G_BITS}, | ||
28 | }; | ||
29 | |||
30 | static int hclge_get_speed_bit(u32 speed, u32 *speed_bit) | ||
31 | @@ -XXX,XX +XXX,XX @@ static void hclge_update_fec_support(struct hclge_mac *mac) | ||
32 | mac->supported); | ||
33 | } | ||
34 | |||
35 | -static const struct hclge_link_mode_bmap hclge_sr_link_mode_bmap[8] = { | ||
36 | +static const struct hclge_link_mode_bmap hclge_sr_link_mode_bmap[] = { | ||
37 | {HCLGE_SUPPORT_10G_BIT, ETHTOOL_LINK_MODE_10000baseSR_Full_BIT}, | ||
38 | {HCLGE_SUPPORT_25G_BIT, ETHTOOL_LINK_MODE_25000baseSR_Full_BIT}, | ||
39 | {HCLGE_SUPPORT_40G_BIT, ETHTOOL_LINK_MODE_40000baseSR4_Full_BIT}, | ||
40 | @@ -XXX,XX +XXX,XX @@ static const struct hclge_link_mode_bmap hclge_sr_link_mode_bmap[8] = { | ||
41 | {HCLGE_SUPPORT_50G_R1_BIT, ETHTOOL_LINK_MODE_50000baseSR_Full_BIT}, | ||
42 | {HCLGE_SUPPORT_100G_R4_BIT, ETHTOOL_LINK_MODE_100000baseSR4_Full_BIT}, | ||
43 | {HCLGE_SUPPORT_100G_R2_BIT, ETHTOOL_LINK_MODE_100000baseSR2_Full_BIT}, | ||
44 | - {HCLGE_SUPPORT_200G_BIT, ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT}, | ||
45 | + {HCLGE_SUPPORT_200G_R4_EXT_BIT, | ||
46 | + ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT}, | ||
47 | + {HCLGE_SUPPORT_200G_R4_BIT, ETHTOOL_LINK_MODE_200000baseSR4_Full_BIT}, | ||
48 | }; | ||
49 | |||
50 | -static const struct hclge_link_mode_bmap hclge_lr_link_mode_bmap[6] = { | ||
51 | +static const struct hclge_link_mode_bmap hclge_lr_link_mode_bmap[] = { | ||
52 | {HCLGE_SUPPORT_10G_BIT, ETHTOOL_LINK_MODE_10000baseLR_Full_BIT}, | ||
53 | {HCLGE_SUPPORT_40G_BIT, ETHTOOL_LINK_MODE_40000baseLR4_Full_BIT}, | ||
54 | {HCLGE_SUPPORT_50G_R1_BIT, ETHTOOL_LINK_MODE_50000baseLR_ER_FR_Full_BIT}, | ||
55 | @@ -XXX,XX +XXX,XX @@ static const struct hclge_link_mode_bmap hclge_lr_link_mode_bmap[6] = { | ||
56 | ETHTOOL_LINK_MODE_100000baseLR4_ER4_Full_BIT}, | ||
57 | {HCLGE_SUPPORT_100G_R2_BIT, | ||
58 | ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT}, | ||
59 | - {HCLGE_SUPPORT_200G_BIT, | ||
60 | + {HCLGE_SUPPORT_200G_R4_EXT_BIT, | ||
61 | + ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT}, | ||
62 | + {HCLGE_SUPPORT_200G_R4_BIT, | ||
63 | ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT}, | ||
64 | }; | ||
65 | |||
66 | -static const struct hclge_link_mode_bmap hclge_cr_link_mode_bmap[8] = { | ||
67 | +static const struct hclge_link_mode_bmap hclge_cr_link_mode_bmap[] = { | ||
68 | {HCLGE_SUPPORT_10G_BIT, ETHTOOL_LINK_MODE_10000baseCR_Full_BIT}, | ||
69 | {HCLGE_SUPPORT_25G_BIT, ETHTOOL_LINK_MODE_25000baseCR_Full_BIT}, | ||
70 | {HCLGE_SUPPORT_40G_BIT, ETHTOOL_LINK_MODE_40000baseCR4_Full_BIT}, | ||
71 | @@ -XXX,XX +XXX,XX @@ static const struct hclge_link_mode_bmap hclge_cr_link_mode_bmap[8] = { | ||
72 | {HCLGE_SUPPORT_50G_R1_BIT, ETHTOOL_LINK_MODE_50000baseCR_Full_BIT}, | ||
73 | {HCLGE_SUPPORT_100G_R4_BIT, ETHTOOL_LINK_MODE_100000baseCR4_Full_BIT}, | ||
74 | {HCLGE_SUPPORT_100G_R2_BIT, ETHTOOL_LINK_MODE_100000baseCR2_Full_BIT}, | ||
75 | - {HCLGE_SUPPORT_200G_BIT, ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT}, | ||
76 | + {HCLGE_SUPPORT_200G_R4_EXT_BIT, | ||
77 | + ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT}, | ||
78 | + {HCLGE_SUPPORT_200G_R4_BIT, ETHTOOL_LINK_MODE_200000baseCR4_Full_BIT}, | ||
79 | }; | ||
80 | |||
81 | -static const struct hclge_link_mode_bmap hclge_kr_link_mode_bmap[9] = { | ||
82 | +static const struct hclge_link_mode_bmap hclge_kr_link_mode_bmap[] = { | ||
83 | {HCLGE_SUPPORT_1G_BIT, ETHTOOL_LINK_MODE_1000baseKX_Full_BIT}, | ||
84 | {HCLGE_SUPPORT_10G_BIT, ETHTOOL_LINK_MODE_10000baseKR_Full_BIT}, | ||
85 | {HCLGE_SUPPORT_25G_BIT, ETHTOOL_LINK_MODE_25000baseKR_Full_BIT}, | ||
86 | @@ -XXX,XX +XXX,XX @@ static const struct hclge_link_mode_bmap hclge_kr_link_mode_bmap[9] = { | ||
87 | {HCLGE_SUPPORT_50G_R1_BIT, ETHTOOL_LINK_MODE_50000baseKR_Full_BIT}, | ||
88 | {HCLGE_SUPPORT_100G_R4_BIT, ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT}, | ||
89 | {HCLGE_SUPPORT_100G_R2_BIT, ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT}, | ||
90 | - {HCLGE_SUPPORT_200G_BIT, ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT}, | ||
91 | + {HCLGE_SUPPORT_200G_R4_EXT_BIT, | ||
92 | + ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT}, | ||
93 | + {HCLGE_SUPPORT_200G_R4_BIT, ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT}, | ||
94 | }; | ||
95 | |||
96 | static void hclge_convert_setting_sr(u16 speed_ability, | ||
97 | @@ -XXX,XX +XXX,XX @@ static void hclge_parse_link_mode(struct hclge_dev *hdev, u16 speed_ability) | ||
98 | |||
99 | static u32 hclge_get_max_speed(u16 speed_ability) | ||
100 | { | ||
101 | - if (speed_ability & HCLGE_SUPPORT_200G_BIT) | ||
102 | + if (speed_ability & HCLGE_SUPPORT_200G_BITS) | ||
103 | return HCLGE_MAC_SPEED_200G; | ||
104 | |||
105 | if (speed_ability & HCLGE_SUPPORT_100G_BITS) | ||
106 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
107 | index XXXXXXX..XXXXXXX 100644 | ||
108 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
109 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
110 | @@ -XXX,XX +XXX,XX @@ enum HLCGE_PORT_TYPE { | ||
111 | #define HCLGE_SUPPORT_40G_BIT BIT(5) | ||
112 | #define HCLGE_SUPPORT_100M_BIT BIT(6) | ||
113 | #define HCLGE_SUPPORT_10M_BIT BIT(7) | ||
114 | -#define HCLGE_SUPPORT_200G_BIT BIT(8) | ||
115 | +#define HCLGE_SUPPORT_200G_R4_EXT_BIT BIT(8) | ||
116 | #define HCLGE_SUPPORT_50G_R1_BIT BIT(9) | ||
117 | #define HCLGE_SUPPORT_100G_R2_BIT BIT(10) | ||
118 | +#define HCLGE_SUPPORT_200G_R4_BIT BIT(11) | ||
119 | |||
120 | #define HCLGE_SUPPORT_GE \ | ||
121 | (HCLGE_SUPPORT_1G_BIT | HCLGE_SUPPORT_100M_BIT | HCLGE_SUPPORT_10M_BIT) | ||
122 | @@ -XXX,XX +XXX,XX @@ enum HLCGE_PORT_TYPE { | ||
123 | (HCLGE_SUPPORT_50G_R2_BIT | HCLGE_SUPPORT_50G_R1_BIT) | ||
124 | #define HCLGE_SUPPORT_100G_BITS \ | ||
125 | (HCLGE_SUPPORT_100G_R4_BIT | HCLGE_SUPPORT_100G_R2_BIT) | ||
126 | +#define HCLGE_SUPPORT_200G_BITS \ | ||
127 | + (HCLGE_SUPPORT_200G_R4_EXT_BIT | HCLGE_SUPPORT_200G_R4_BIT) | ||
128 | |||
129 | enum HCLGE_DEV_STATE { | ||
130 | HCLGE_STATE_REINITING, | ||
131 | -- | ||
132 | 2.30.0 | diff view generated by jsdifflib |
1 | From: Hao Lan <lanhao@huawei.com> | 1 | From: Hao Lan <lanhao@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | There are spelling mistakes in hclgevf_get_regs. Fix them. | 3 | When the hilink version is H60, the serdes serial loopback test is not |
4 | supported. This patch add hilink version detection. When the version | ||
5 | is H60, the serdes serial loopback test will be disable. | ||
4 | 6 | ||
5 | Signed-off-by: Hao Lan <lanhao@huawei.com> | 7 | Signed-off-by: Hao Lan <lanhao@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 | drivers/net/ethernet/hisilicon/hns3/hnae3.h | 1 + |
9 | 1 file changed, 14 insertions(+), 13 deletions(-) | 11 | drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | 2 ++ |
12 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | 3 ++- | ||
13 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 9 +++++++-- | ||
14 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | 6 ++++++ | ||
15 | 5 files changed, 18 insertions(+), 3 deletions(-) | ||
10 | 16 | ||
11 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 17 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h |
12 | index XXXXXXX..XXXXXXX 100644 | 18 | index XXXXXXX..XXXXXXX 100644 |
13 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 19 | --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h |
14 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_regs.c | 20 | +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h |
15 | @@ -XXX,XX +XXX,XX @@ void hclgevf_get_regs(struct hnae3_handle *handle, u32 *version, | 21 | @@ -XXX,XX +XXX,XX @@ struct hnae3_dev_specs { |
16 | 22 | u16 mc_mac_size; | |
17 | struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 23 | u32 mac_stats_num; |
18 | struct hnae3_queue *tqp; | 24 | u8 tnl_num; |
19 | - int i, j, reg_um; | 25 | + u8 hilink_version; |
20 | + int i, j, reg_num; | 26 | }; |
21 | u32 *reg = data; | 27 | |
22 | 28 | struct hnae3_client_ops { | |
23 | *version = hdev->fw_version; | 29 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c |
24 | reg += hclgevf_reg_get_header(reg); | 30 | index XXXXXXX..XXXXXXX 100644 |
25 | 31 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c | |
26 | /* fetching per-VF registers values from VF PCIe register space */ | 32 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c |
27 | - reg_um = ARRAY_SIZE(cmdq_reg_addr_list); | 33 | @@ -XXX,XX +XXX,XX @@ hns3_dbg_dev_specs(struct hnae3_handle *h, char *buf, int len, int *pos) |
28 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_um, reg); | 34 | *pos += scnprintf(buf + *pos, len - *pos, |
29 | - for (i = 0; i < reg_um; i++) | 35 | "TX timeout threshold: %d seconds\n", |
30 | + reg_num = ARRAY_SIZE(cmdq_reg_addr_list); | 36 | dev->watchdog_timeo / HZ); |
31 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_CMDQ, reg_num, reg); | 37 | + *pos += scnprintf(buf + *pos, len - *pos, "Hilink Version: %u\n", |
32 | + for (i = 0; i < reg_num; i++) | 38 | + dev_specs->hilink_version); |
33 | *reg++ = hclgevf_read_dev(&hdev->hw, cmdq_reg_addr_list[i]); | 39 | } |
34 | 40 | ||
35 | - reg_um = ARRAY_SIZE(common_reg_addr_list); | 41 | static int hns3_dbg_dev_info(struct hnae3_handle *h, char *buf, int len) |
36 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_um, reg); | 42 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h |
37 | - for (i = 0; i < reg_um; i++) | 43 | index XXXXXXX..XXXXXXX 100644 |
38 | + reg_num = ARRAY_SIZE(common_reg_addr_list); | 44 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h |
39 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_COMMON, reg_num, reg); | 45 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h |
40 | + for (i = 0; i < reg_num; i++) | 46 | @@ -XXX,XX +XXX,XX @@ struct hclge_dev_specs_1_cmd { |
41 | *reg++ = hclgevf_read_dev(&hdev->hw, common_reg_addr_list[i]); | 47 | __le16 mc_mac_size; |
42 | 48 | u8 rsv1[6]; | |
43 | - reg_um = ARRAY_SIZE(ring_reg_addr_list); | 49 | u8 tnl_num; |
44 | + reg_num = ARRAY_SIZE(ring_reg_addr_list); | 50 | - u8 rsv2[5]; |
45 | for (j = 0; j < hdev->num_tqps; j++) { | 51 | + u8 hilink_version; |
46 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_um, reg); | 52 | + u8 rsv2[4]; |
47 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_RING, reg_num, reg); | 53 | }; |
48 | tqp = &hdev->htqp[j].q; | 54 | |
49 | - for (i = 0; i < reg_um; i++) | 55 | /* mac speed type defined in firmware command */ |
50 | + for (i = 0; i < reg_num; i++) | 56 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
51 | *reg++ = readl_relaxed(tqp->io_base - | 57 | index XXXXXXX..XXXXXXX 100644 |
52 | HCLGEVF_TQP_REG_OFFSET + | 58 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
53 | ring_reg_addr_list[i]); | 59 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
54 | } | 60 | @@ -XXX,XX +XXX,XX @@ static int hclge_get_sset_count(struct hnae3_handle *handle, int stringset) |
55 | 61 | handle->flags |= HNAE3_SUPPORT_APP_LOOPBACK; | |
56 | - reg_um = ARRAY_SIZE(tqp_intr_reg_addr_list); | 62 | } |
57 | + reg_num = ARRAY_SIZE(tqp_intr_reg_addr_list); | 63 | |
58 | for (j = 0; j < hdev->num_msi_used - 1; j++) { | 64 | - count += 1; |
59 | - reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, reg_um, reg); | 65 | - handle->flags |= HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK; |
60 | - for (i = 0; i < reg_um; i++) | 66 | + if (hdev->ae_dev->dev_specs.hilink_version != |
61 | + reg += hclgevf_reg_get_tlv(HCLGEVF_REG_TAG_TQP_INTR, | 67 | + HCLGE_HILINK_H60) { |
62 | + reg_num, reg); | 68 | + count += 1; |
63 | + for (i = 0; i < reg_num; i++) | 69 | + handle->flags |= HNAE3_SUPPORT_SERDES_SERIAL_LOOPBACK; |
64 | *reg++ = hclgevf_read_dev(&hdev->hw, | 70 | + } |
65 | tqp_intr_reg_addr_list[i] + | 71 | + |
66 | HCLGEVF_RING_INT_REG_OFFSET * j); | 72 | count += 1; |
73 | handle->flags |= HNAE3_SUPPORT_SERDES_PARALLEL_LOOPBACK; | ||
74 | count += 1; | ||
75 | @@ -XXX,XX +XXX,XX @@ static void hclge_parse_dev_specs(struct hclge_dev *hdev, | ||
76 | ae_dev->dev_specs.umv_size = le16_to_cpu(req1->umv_size); | ||
77 | ae_dev->dev_specs.mc_mac_size = le16_to_cpu(req1->mc_mac_size); | ||
78 | ae_dev->dev_specs.tnl_num = req1->tnl_num; | ||
79 | + ae_dev->dev_specs.hilink_version = req1->hilink_version; | ||
80 | } | ||
81 | |||
82 | static void hclge_check_dev_specs(struct hclge_dev *hdev) | ||
83 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
84 | index XXXXXXX..XXXXXXX 100644 | ||
85 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
86 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | ||
87 | @@ -XXX,XX +XXX,XX @@ enum HCLGE_MAC_DUPLEX { | ||
88 | HCLGE_MAC_FULL | ||
89 | }; | ||
90 | |||
91 | +/* hilink version */ | ||
92 | +enum hclge_hilink_version { | ||
93 | + HCLGE_HILINK_H32 = 0, | ||
94 | + HCLGE_HILINK_H60 = 1, | ||
95 | +}; | ||
96 | + | ||
97 | #define QUERY_SFP_SPEED 0 | ||
98 | #define QUERY_ACTIVE_SPEED 1 | ||
99 | |||
67 | -- | 100 | -- |
68 | 2.33.0 | 101 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Yonglong Liu <liuyonglong@huawei.com> | ||
1 | 2 | ||
3 | The HIP08 devices does not register the ptp devices, so the | ||
4 | hdev->ptp is NULL, but the hardware can receive 1588 messages, | ||
5 | and set the HNS3_RXD_TS_VLD_B bit, so, if match this case, the | ||
6 | access of hdev->ptp->flags will cause a kernel crash: | ||
7 | |||
8 | [ 5888.946472] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000018 | ||
9 | [ 5888.946475] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000018 | ||
10 | ... | ||
11 | [ 5889.266118] pc : hclge_ptp_get_rx_hwts+0x40/0x170 [hclge] | ||
12 | [ 5889.272612] lr : hclge_ptp_get_rx_hwts+0x34/0x170 [hclge] | ||
13 | [ 5889.279101] sp : ffff800012c3bc50 | ||
14 | [ 5889.283516] x29: ffff800012c3bc50 x28: ffff2040002be040 | ||
15 | [ 5889.289927] x27: ffff800009116484 x26: 0000000080007500 | ||
16 | [ 5889.296333] x25: 0000000000000000 x24: ffff204001c6f000 | ||
17 | [ 5889.302738] x23: ffff204144f53c00 x22: 0000000000000000 | ||
18 | [ 5889.309134] x21: 0000000000000000 x20: ffff204004220080 | ||
19 | [ 5889.315520] x19: ffff204144f53c00 x18: 0000000000000000 | ||
20 | [ 5889.321897] x17: 0000000000000000 x16: 0000000000000000 | ||
21 | [ 5889.328263] x15: 0000004000140ec8 x14: 0000000000000000 | ||
22 | [ 5889.334617] x13: 0000000000000000 x12: 00000000010011df | ||
23 | [ 5889.340965] x11: bbfeff4d22000000 x10: 0000000000000000 | ||
24 | [ 5889.347303] x9 : ffff800009402124 x8 : 0200f78811dfbb4d | ||
25 | [ 5889.353637] x7 : 2200000000191b01 x6 : ffff208002a7d480 | ||
26 | [ 5889.359959] x5 : 0000000000000000 x4 : 0000000000000000 | ||
27 | [ 5889.366271] x3 : 0000000000000000 x2 : 0000000000000000 | ||
28 | [ 5889.372567] x1 : 0000000000000000 x0 : ffff20400095c080 | ||
29 | [ 5889.378857] Call trace: | ||
30 | [ 5889.382285] hclge_ptp_get_rx_hwts+0x40/0x170 [hclge] | ||
31 | [ 5889.388304] hns3_handle_bdinfo+0x324/0x410 [hns3] | ||
32 | [ 5889.394055] hns3_handle_rx_bd+0x60/0x150 [hns3] | ||
33 | [ 5889.399624] hns3_clean_rx_ring+0x84/0x170 [hns3] | ||
34 | [ 5889.405270] hns3_nic_common_poll+0xa8/0x220 [hns3] | ||
35 | [ 5889.411084] napi_poll+0xcc/0x264 | ||
36 | [ 5889.415329] net_rx_action+0xd4/0x21c | ||
37 | [ 5889.419911] __do_softirq+0x130/0x358 | ||
38 | [ 5889.424484] irq_exit+0x134/0x154 | ||
39 | [ 5889.428700] __handle_domain_irq+0x88/0xf0 | ||
40 | [ 5889.433684] gic_handle_irq+0x78/0x2c0 | ||
41 | [ 5889.438319] el1_irq+0xb8/0x140 | ||
42 | [ 5889.442354] arch_cpu_idle+0x18/0x40 | ||
43 | [ 5889.446816] default_idle_call+0x5c/0x1c0 | ||
44 | [ 5889.451714] cpuidle_idle_call+0x174/0x1b0 | ||
45 | [ 5889.456692] do_idle+0xc8/0x160 | ||
46 | [ 5889.460717] cpu_startup_entry+0x30/0xfc | ||
47 | [ 5889.465523] secondary_start_kernel+0x158/0x1ec | ||
48 | [ 5889.470936] Code: 97ffab78 f9411c14 91408294 f9457284 (f9400c80) | ||
49 | [ 5889.477950] SMP: stopping secondary CPUs | ||
50 | [ 5890.514626] SMP: failed to stop secondary CPUs 0-69,71-95 | ||
51 | [ 5890.522951] Starting crashdump kernel... | ||
52 | |||
53 | Fixes: 0bf5eb788512 ("net: hns3: add support for PTP") | ||
54 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | ||
55 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
56 | --- | ||
57 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | 2 +- | ||
58 | 1 file changed, 1 insertion(+), 1 deletion(-) | ||
59 | |||
60 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | ||
61 | index XXXXXXX..XXXXXXX 100644 | ||
62 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | ||
63 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_ptp.c | ||
64 | @@ -XXX,XX +XXX,XX @@ void hclge_ptp_get_rx_hwts(struct hnae3_handle *handle, struct sk_buff *skb, | ||
65 | u64 ns = nsec; | ||
66 | u32 sec_h; | ||
67 | |||
68 | - if (!test_bit(HCLGE_PTP_FLAG_RX_EN, &hdev->ptp->flags)) | ||
69 | + if (!hdev->ptp || !test_bit(HCLGE_PTP_FLAG_RX_EN, &hdev->ptp->flags)) | ||
70 | return; | ||
71 | |||
72 | /* Since the BD does not have enough space for the higher 16 bits of | ||
73 | -- | ||
74 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | When the tc is removed during reset, hns3 driver will return a errcode. | ||
2 | But kernel ignores this errcode, As a result, | ||
3 | the driver status is inconsistent with the kernel status. | ||
1 | 4 | ||
5 | This patch retains the deletion status when the deletion fails | ||
6 | and continues to delete after the reset to ensure that | ||
7 | the status of the driver is consistent with that of kernel. | ||
8 | |||
9 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
10 | --- | ||
11 | drivers/net/ethernet/hisilicon/hns3/hnae3.h | 1 + | ||
12 | .../ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c | 2 ++ | ||
13 | .../ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 ++ | ||
14 | .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | 16 ++++++++++++++++ | ||
15 | .../ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | 1 + | ||
16 | 5 files changed, 22 insertions(+) | ||
17 | |||
18 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hnae3.h b/drivers/net/ethernet/hisilicon/hns3/hnae3.h | ||
19 | index XXXXXXX..XXXXXXX 100644 | ||
20 | --- a/drivers/net/ethernet/hisilicon/hns3/hnae3.h | ||
21 | +++ b/drivers/net/ethernet/hisilicon/hns3/hnae3.h | ||
22 | @@ -XXX,XX +XXX,XX @@ struct hnae3_tc_info { | ||
23 | u8 max_tc; /* Total number of TCs */ | ||
24 | u8 num_tc; /* Total number of enabled TCs */ | ||
25 | bool mqprio_active; | ||
26 | + bool mqprio_destroy; | ||
27 | bool dcb_ets_active; | ||
28 | }; | ||
29 | |||
30 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c | ||
31 | index XXXXXXX..XXXXXXX 100644 | ||
32 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c | ||
33 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c | ||
34 | @@ -XXX,XX +XXX,XX @@ static int hclge_setup_tc(struct hnae3_handle *h, | ||
35 | return ret; | ||
36 | } | ||
37 | |||
38 | + kinfo->tc_info.mqprio_destroy = !tc; | ||
39 | + | ||
40 | ret = hclge_notify_down_uinit(hdev); | ||
41 | if (ret) | ||
42 | return ret; | ||
43 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
44 | index XXXXXXX..XXXXXXX 100644 | ||
45 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
46 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | ||
47 | @@ -XXX,XX +XXX,XX @@ static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev) | ||
48 | return ret; | ||
49 | } | ||
50 | |||
51 | + hclge_reset_tc_config(hdev); | ||
52 | + | ||
53 | ret = hclge_tm_init_hw(hdev, true); | ||
54 | if (ret) { | ||
55 | dev_err(&pdev->dev, "tm init hw fail, ret =%d\n", ret); | ||
56 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | ||
57 | index XXXXXXX..XXXXXXX 100644 | ||
58 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | ||
59 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c | ||
60 | @@ -XXX,XX +XXX,XX @@ int hclge_tm_flush_cfg(struct hclge_dev *hdev, bool enable) | ||
61 | |||
62 | return ret; | ||
63 | } | ||
64 | + | ||
65 | +void hclge_reset_tc_config(struct hclge_dev *hdev) | ||
66 | +{ | ||
67 | + struct hclge_vport *vport = &hdev->vport[0]; | ||
68 | + struct hnae3_knic_private_info *kinfo; | ||
69 | + | ||
70 | + kinfo = &vport->nic.kinfo; | ||
71 | + | ||
72 | + if (!kinfo->tc_info.mqprio_destroy) | ||
73 | + return; | ||
74 | + | ||
75 | + /* clear tc info, including mqprio_destroy and mqprio_active */ | ||
76 | + memset(&kinfo->tc_info, 0, sizeof(kinfo->tc_info)); | ||
77 | + hclge_tm_schd_info_update(hdev, 0); | ||
78 | + hclge_comm_rss_indir_init_cfg(hdev->ae_dev, &hdev->rss_cfg); | ||
79 | +} | ||
80 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | ||
81 | index XXXXXXX..XXXXXXX 100644 | ||
82 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | ||
83 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h | ||
84 | @@ -XXX,XX +XXX,XX @@ int hclge_tm_get_port_shaper(struct hclge_dev *hdev, | ||
85 | int hclge_up_to_tc_map(struct hclge_dev *hdev); | ||
86 | int hclge_dscp_to_tc_map(struct hclge_dev *hdev); | ||
87 | int hclge_tm_flush_cfg(struct hclge_dev *hdev, bool enable); | ||
88 | +void hclge_reset_tc_config(struct hclge_dev *hdev); | ||
89 | #endif | ||
90 | -- | ||
91 | 2.30.0 | diff view generated by jsdifflib |
New patch | |||
---|---|---|---|
1 | From: Peiyang Wang <wangpeiyang1@huawei.com> | ||
1 | 2 | ||
3 | The cmdq reset command times out when all VFs are enabled and the queue is | ||
4 | full. The hardware processing time exceeds the timeout set by the driver. | ||
5 | In order to avoid the above extreme situations, the driver extends the | ||
6 | reset timeout to 1 second. | ||
7 | |||
8 | Signed-off-by: Peiyang Wang <wangpeiyang1@huawei.com> | ||
9 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | ||
10 | --- | ||
11 | .../net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c | 2 +- | ||
12 | .../net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h | 2 +- | ||
13 | 2 files changed, 2 insertions(+), 2 deletions(-) | ||
14 | |||
15 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c | ||
16 | index XXXXXXX..XXXXXXX 100644 | ||
17 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c | ||
18 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c | ||
19 | @@ -XXX,XX +XXX,XX @@ static int hclge_comm_cmd_csq_done(struct hclge_comm_hw *hw) | ||
20 | static u32 hclge_get_cmdq_tx_timeout(u16 opcode, u32 tx_timeout) | ||
21 | { | ||
22 | static const struct hclge_cmdq_tx_timeout_map cmdq_tx_timeout_map[] = { | ||
23 | - {HCLGE_OPC_CFG_RST_TRIGGER, HCLGE_COMM_CMDQ_TX_TIMEOUT_500MS}, | ||
24 | + {HCLGE_OPC_CFG_RST_TRIGGER, HCLGE_COMM_CMDQ_CFG_RST_TIMEOUT}, | ||
25 | }; | ||
26 | u32 i; | ||
27 | |||
28 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h | ||
29 | index XXXXXXX..XXXXXXX 100644 | ||
30 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h | ||
31 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h | ||
32 | @@ -XXX,XX +XXX,XX @@ | ||
33 | #define HCLGE_COMM_NIC_CMQ_DESC_NUM_S 3 | ||
34 | #define HCLGE_COMM_NIC_CMQ_DESC_NUM 1024 | ||
35 | #define HCLGE_COMM_CMDQ_TX_TIMEOUT_DEFAULT 30000 | ||
36 | -#define HCLGE_COMM_CMDQ_TX_TIMEOUT_500MS 500000 | ||
37 | +#define HCLGE_COMM_CMDQ_CFG_RST_TIMEOUT 1000000 | ||
38 | |||
39 | enum hclge_opcode_type { | ||
40 | /* Generic commands */ | ||
41 | -- | ||
42 | 2.30.0 | diff view generated by jsdifflib |
1 | From: Yonglong Liu <liuyonglong@huawei.com> | 1 | From: Jie Wang <wangjie125@huawei.com> |
---|---|---|---|
2 | 2 | ||
3 | In hclge_add_fd_entry(), if the flow type is FLOW_EXT, and the data of | 3 | Currently, the mac port is fixed to configured as full dplex mode in |
4 | m_ext is all zero, then some members of the local variable "info" are | 4 | hclge_mac_init() when driver initialization or reset restore. Users may |
5 | not initialized. | 5 | change the mode to half duplex with ethtool, so it may cause the user |
6 | configuration dropped after reset. | ||
6 | 7 | ||
7 | Fixes: 67b0e1428e2f ("net: hns3: add support for user-def data of flow director") | 8 | To fix it, don't change the duplex mode when resetting. |
8 | Signed-off-by: Yonglong Liu <liuyonglong@huawei.com> | 9 | |
10 | Fixes: 2d03eacc0b7e ("net: hns3: Only update mac configuation when necessary") | ||
11 | Signed-off-by: Jie Wang <wangjie125@huawei.com> | ||
9 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> | 12 | Signed-off-by: Jijie Shao <shaojijie@huawei.com> |
10 | --- | 13 | --- |
11 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 2 +- | 14 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 5 ++++- |
12 | 1 file changed, 1 insertion(+), 1 deletion(-) | 15 | 1 file changed, 4 insertions(+), 1 deletion(-) |
13 | 16 | ||
14 | diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 17 | 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 | 18 | index XXXXXXX..XXXXXXX 100644 |
16 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 19 | --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c |
17 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 20 | +++ 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, | 21 | @@ -XXX,XX +XXX,XX @@ static int hclge_mac_init(struct hclge_dev *hdev) |
19 | struct ethtool_rxnfc *cmd) | 22 | int ret; |
20 | { | 23 | |
21 | struct hclge_vport *vport = hclge_get_vport(handle); | 24 | hdev->support_sfp_query = true; |
22 | + struct hclge_fd_user_def_info info = {0}; | 25 | - hdev->hw.mac.duplex = HCLGE_MAC_FULL; |
23 | struct hclge_dev *hdev = vport->back; | 26 | + |
24 | - struct hclge_fd_user_def_info info; | 27 | + if (!test_bit(HCLGE_STATE_RST_HANDLING, &hdev->state)) |
25 | u16 dst_vport_id = 0, q_index = 0; | 28 | + hdev->hw.mac.duplex = HCLGE_MAC_FULL; |
26 | struct ethtool_rx_flow_spec *fs; | 29 | + |
27 | struct hclge_fd_rule *rule; | 30 | ret = hclge_cfg_mac_speed_dup_hw(hdev, hdev->hw.mac.speed, |
31 | hdev->hw.mac.duplex, hdev->hw.mac.lane_num); | ||
32 | if (ret) | ||
28 | -- | 33 | -- |
29 | 2.33.0 | 34 | 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 | Add checking for vf id of mailbox, in order to avoid array |
4 | user change the rx VLAN tag offload state. And it will default | 4 | out-of-bounds risk. |
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") | ||
12 | Signed-off-by: Jian Shen <shenjian15@huawei.com> | 6 | 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 | drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c | 7 ++++--- |
16 | .../hisilicon/hns3/hns3vf/hclgevf_main.h | 3 ++- | 10 | 1 file changed, 4 insertions(+), 3 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_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.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_mbx.c |
22 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c | 15 | +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c |
23 | @@ -XXX,XX +XXX,XX @@ static void hclgevf_sync_vlan_filter(struct hclgevf_dev *hdev) | 16 | @@ -XXX,XX +XXX,XX @@ void hclge_mbx_handler(struct hclge_dev *hdev) |
24 | rtnl_unlock(); | 17 | req = (struct hclge_mbx_vf_to_pf_cmd *)desc->data; |
25 | } | 18 | |
26 | 19 | flag = le16_to_cpu(crq->desc[crq->next_to_use].flag); | |
27 | -static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 20 | - if (unlikely(!hnae3_get_bit(flag, HCLGE_CMDQ_RX_OUTVLD_B))) { |
28 | +static int hclgevf_en_hw_strip_rxvtag_cmd(struct hclgevf_dev *hdev, bool enable) | 21 | + if (unlikely(!hnae3_get_bit(flag, HCLGE_CMDQ_RX_OUTVLD_B) || |
29 | { | 22 | + req->mbx_src_vfid > hdev->num_req_vfs)) { |
30 | - struct hclgevf_dev *hdev = hclgevf_ae_get_hdev(handle); | 23 | dev_warn(&hdev->pdev->dev, |
31 | struct hclge_vf_to_pf_msg send_msg; | 24 | - "dropped invalid mailbox message, code = %u\n", |
32 | 25 | - req->msg.code); | |
33 | hclgevf_build_send_msg(&send_msg, HCLGE_MBX_SET_VLAN, | 26 | + "dropped invalid mailbox message, code = %u, vfid = %u\n", |
34 | @@ -XXX,XX +XXX,XX @@ static int hclgevf_en_hw_strip_rxvtag(struct hnae3_handle *handle, bool enable) | 27 | + req->msg.code, req->mbx_src_vfid); |
35 | return hclgevf_send_mbx_msg(hdev, &send_msg, false, NULL, 0); | 28 | |
36 | } | 29 | /* dropping/not processing this invalid message */ |
37 | 30 | crq->desc[crq->next_to_use].flag = 0; | |
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 | -- | 31 | -- |
103 | 2.33.0 | 32 | 2.30.0 | diff view generated by jsdifflib |