Skip to content

Commit 6d23361

Browse files
Hao Landavem330
authored andcommitted
net: hns3: add tm flush when setting tm
When the tm module is configured with traffic, traffic may be abnormal. This patch fixes this problem. Before the tm module is configured, traffic processing should be stopped. After the tm module is configured, traffic processing is enabled. Signed-off-by: Hao Lan <[email protected]> Signed-off-by: Jijie Shao <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent b27d023 commit 6d23361

File tree

7 files changed

+73
-6
lines changed

7 files changed

+73
-6
lines changed

drivers/net/ethernet/hisilicon/hns3/hnae3.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ enum HNAE3_DEV_CAP_BITS {
102102
HNAE3_DEV_SUPPORT_FEC_STATS_B,
103103
HNAE3_DEV_SUPPORT_LANE_NUM_B,
104104
HNAE3_DEV_SUPPORT_WOL_B,
105+
HNAE3_DEV_SUPPORT_TM_FLUSH_B,
105106
};
106107

107108
#define hnae3_ae_dev_fd_supported(ae_dev) \
@@ -173,6 +174,9 @@ enum HNAE3_DEV_CAP_BITS {
173174
#define hnae3_ae_dev_wol_supported(ae_dev) \
174175
test_bit(HNAE3_DEV_SUPPORT_WOL_B, (ae_dev)->caps)
175176

177+
#define hnae3_ae_dev_tm_flush_supported(hdev) \
178+
test_bit(HNAE3_DEV_SUPPORT_TM_FLUSH_B, (hdev)->ae_dev->caps)
179+
176180
enum HNAE3_PF_CAP_BITS {
177181
HNAE3_PF_SUPPORT_VLAN_FLTR_MDF_B = 0,
178182
};

drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ static const struct hclge_comm_caps_bit_map hclge_pf_cmd_caps[] = {
156156
{HCLGE_COMM_CAP_FEC_STATS_B, HNAE3_DEV_SUPPORT_FEC_STATS_B},
157157
{HCLGE_COMM_CAP_LANE_NUM_B, HNAE3_DEV_SUPPORT_LANE_NUM_B},
158158
{HCLGE_COMM_CAP_WOL_B, HNAE3_DEV_SUPPORT_WOL_B},
159+
{HCLGE_COMM_CAP_TM_FLUSH_B, HNAE3_DEV_SUPPORT_TM_FLUSH_B},
159160
};
160161

161162
static const struct hclge_comm_caps_bit_map hclge_vf_cmd_caps[] = {

drivers/net/ethernet/hisilicon/hns3/hns3_common/hclge_comm_cmd.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ enum hclge_opcode_type {
153153
HCLGE_OPC_TM_INTERNAL_STS = 0x0850,
154154
HCLGE_OPC_TM_INTERNAL_CNT = 0x0851,
155155
HCLGE_OPC_TM_INTERNAL_STS_1 = 0x0852,
156+
HCLGE_OPC_TM_FLUSH = 0x0872,
156157

157158
/* Packet buffer allocate commands */
158159
HCLGE_OPC_TX_BUFF_ALLOC = 0x0901,
@@ -349,6 +350,7 @@ enum HCLGE_COMM_CAP_BITS {
349350
HCLGE_COMM_CAP_FEC_STATS_B = 25,
350351
HCLGE_COMM_CAP_LANE_NUM_B = 27,
351352
HCLGE_COMM_CAP_WOL_B = 28,
353+
HCLGE_COMM_CAP_TM_FLUSH_B = 31,
352354
};
353355

354356
enum HCLGE_COMM_API_CAP_BITS {

drivers/net/ethernet/hisilicon/hns3/hns3_debugfs.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,9 @@ static struct hns3_dbg_cap_info hns3_dbg_cap[] = {
411411
}, {
412412
.name = "support wake on lan",
413413
.cap_bit = HNAE3_DEV_SUPPORT_WOL_B,
414+
}, {
415+
.name = "support tm flush",
416+
.cap_bit = HNAE3_DEV_SUPPORT_TM_FLUSH_B,
414417
}
415418
};
416419

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,10 @@ static int hclge_notify_down_uinit(struct hclge_dev *hdev)
216216
if (ret)
217217
return ret;
218218

219+
ret = hclge_tm_flush_cfg(hdev, true);
220+
if (ret)
221+
return ret;
222+
219223
return hclge_notify_client(hdev, HNAE3_UNINIT_CLIENT);
220224
}
221225

@@ -227,6 +231,10 @@ static int hclge_notify_init_up(struct hclge_dev *hdev)
227231
if (ret)
228232
return ret;
229233

234+
ret = hclge_tm_flush_cfg(hdev, false);
235+
if (ret)
236+
return ret;
237+
230238
return hclge_notify_client(hdev, HNAE3_UP_CLIENT);
231239
}
232240

@@ -313,6 +321,7 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
313321
struct net_device *netdev = h->kinfo.netdev;
314322
struct hclge_dev *hdev = vport->back;
315323
u8 i, j, pfc_map, *prio_tc;
324+
int last_bad_ret = 0;
316325
int ret;
317326

318327
if (!(hdev->dcbx_cap & DCB_CAP_DCBX_VER_IEEE))
@@ -350,13 +359,28 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
350359
if (ret)
351360
return ret;
352361

353-
ret = hclge_buffer_alloc(hdev);
354-
if (ret) {
355-
hclge_notify_client(hdev, HNAE3_UP_CLIENT);
362+
ret = hclge_tm_flush_cfg(hdev, true);
363+
if (ret)
356364
return ret;
357-
}
358365

359-
return hclge_notify_client(hdev, HNAE3_UP_CLIENT);
366+
/* No matter whether the following operations are performed
367+
* successfully or not, disabling the tm flush and notify
368+
* the network status to up are necessary.
369+
* Do not return immediately.
370+
*/
371+
ret = hclge_buffer_alloc(hdev);
372+
if (ret)
373+
last_bad_ret = ret;
374+
375+
ret = hclge_tm_flush_cfg(hdev, false);
376+
if (ret)
377+
last_bad_ret = ret;
378+
379+
ret = hclge_notify_client(hdev, HNAE3_UP_CLIENT);
380+
if (ret)
381+
last_bad_ret = ret;
382+
383+
return last_bad_ret;
360384
}
361385

362386
static int hclge_ieee_setapp(struct hnae3_handle *h, struct dcb_app *app)

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1484,7 +1484,11 @@ int hclge_tm_schd_setup_hw(struct hclge_dev *hdev)
14841484
return ret;
14851485

14861486
/* Cfg schd mode for each level schd */
1487-
return hclge_tm_schd_mode_hw(hdev);
1487+
ret = hclge_tm_schd_mode_hw(hdev);
1488+
if (ret)
1489+
return ret;
1490+
1491+
return hclge_tm_flush_cfg(hdev, false);
14881492
}
14891493

14901494
static int hclge_pause_param_setup_hw(struct hclge_dev *hdev)
@@ -2113,3 +2117,28 @@ int hclge_tm_get_port_shaper(struct hclge_dev *hdev,
21132117

21142118
return 0;
21152119
}
2120+
2121+
int hclge_tm_flush_cfg(struct hclge_dev *hdev, bool enable)
2122+
{
2123+
struct hclge_desc desc;
2124+
int ret;
2125+
2126+
if (!hnae3_ae_dev_tm_flush_supported(hdev))
2127+
return 0;
2128+
2129+
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_TM_FLUSH, false);
2130+
2131+
desc.data[0] = cpu_to_le32(enable ? HCLGE_TM_FLUSH_EN_MSK : 0);
2132+
2133+
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
2134+
if (ret) {
2135+
dev_err(&hdev->pdev->dev,
2136+
"failed to config tm flush, ret = %d\n", ret);
2137+
return ret;
2138+
}
2139+
2140+
if (enable)
2141+
msleep(HCLGE_TM_FLUSH_TIME_MS);
2142+
2143+
return ret;
2144+
}

drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ enum hclge_opcode_type;
3333
#define HCLGE_DSCP_MAP_TC_BD_NUM 2
3434
#define HCLGE_DSCP_TC_SHIFT(n) (((n) & 1) * 4)
3535

36+
#define HCLGE_TM_FLUSH_TIME_MS 10
37+
#define HCLGE_TM_FLUSH_EN_MSK BIT(0)
38+
3639
struct hclge_pg_to_pri_link_cmd {
3740
u8 pg_id;
3841
u8 rsvd1[3];
@@ -272,4 +275,5 @@ int hclge_tm_get_port_shaper(struct hclge_dev *hdev,
272275
struct hclge_tm_shaper_para *para);
273276
int hclge_up_to_tc_map(struct hclge_dev *hdev);
274277
int hclge_dscp_to_tc_map(struct hclge_dev *hdev);
278+
int hclge_tm_flush_cfg(struct hclge_dev *hdev, bool enable);
275279
#endif

0 commit comments

Comments
 (0)