Skip to content

Commit e93530a

Browse files
Guangbin Huangdavem330
authored andcommitted
net: hns3: restore tm priority/qset to default settings when tc disabled
Currently, settings parameters of schedule mode, dwrr, shaper of tm priority or qset of one tc are only be set when tc is enabled, they are not restored to the default settings when tc is disabled. It confuses users when they cat tm_priority or tm_qset files of debugfs. So this patch fixes it. Fixes: 8484405 ("net: hns3: Add support of TX Scheduler & Shaper to HNS3 driver") Signed-off-by: Guangbin Huang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent cfd8068 commit e93530a

File tree

2 files changed

+65
-31
lines changed

2 files changed

+65
-31
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,7 @@ struct hnae3_tc_info {
769769
u8 prio_tc[HNAE3_MAX_USER_PRIO]; /* TC indexed by prio */
770770
u16 tqp_count[HNAE3_MAX_TC];
771771
u16 tqp_offset[HNAE3_MAX_TC];
772+
u8 max_tc; /* Total number of TCs */
772773
u8 num_tc; /* Total number of enabled TCs */
773774
bool mqprio_active;
774775
};

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

Lines changed: 64 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,8 @@ static int hclge_tm_pg_to_pri_map_cfg(struct hclge_dev *hdev,
282282
return hclge_cmd_send(&hdev->hw, &desc, 1);
283283
}
284284

285-
static int hclge_tm_qs_to_pri_map_cfg(struct hclge_dev *hdev,
286-
u16 qs_id, u8 pri)
285+
static int hclge_tm_qs_to_pri_map_cfg(struct hclge_dev *hdev, u16 qs_id, u8 pri,
286+
bool link_vld)
287287
{
288288
struct hclge_qs_to_pri_link_cmd *map;
289289
struct hclge_desc desc;
@@ -294,7 +294,7 @@ static int hclge_tm_qs_to_pri_map_cfg(struct hclge_dev *hdev,
294294

295295
map->qs_id = cpu_to_le16(qs_id);
296296
map->priority = pri;
297-
map->link_vld = HCLGE_TM_QS_PRI_LINK_VLD_MSK;
297+
map->link_vld = link_vld ? HCLGE_TM_QS_PRI_LINK_VLD_MSK : 0;
298298

299299
return hclge_cmd_send(&hdev->hw, &desc, 1);
300300
}
@@ -642,11 +642,13 @@ static void hclge_tm_update_kinfo_rss_size(struct hclge_vport *vport)
642642
* one tc for VF for simplicity. VF's vport_id is non zero.
643643
*/
644644
if (vport->vport_id) {
645+
kinfo->tc_info.max_tc = 1;
645646
kinfo->tc_info.num_tc = 1;
646647
vport->qs_offset = HNAE3_MAX_TC +
647648
vport->vport_id - HCLGE_VF_VPORT_START_NUM;
648649
vport_max_rss_size = hdev->vf_rss_size_max;
649650
} else {
651+
kinfo->tc_info.max_tc = hdev->tc_max;
650652
kinfo->tc_info.num_tc =
651653
min_t(u16, vport->alloc_tqps, hdev->tm_info.num_tc);
652654
vport->qs_offset = 0;
@@ -714,14 +716,22 @@ static void hclge_tm_vport_info_update(struct hclge_dev *hdev)
714716

715717
static void hclge_tm_tc_info_init(struct hclge_dev *hdev)
716718
{
717-
u8 i;
719+
u8 i, tc_sch_mode;
720+
u32 bw_limit;
721+
722+
for (i = 0; i < hdev->tc_max; i++) {
723+
if (i < hdev->tm_info.num_tc) {
724+
tc_sch_mode = HCLGE_SCH_MODE_DWRR;
725+
bw_limit = hdev->tm_info.pg_info[0].bw_limit;
726+
} else {
727+
tc_sch_mode = HCLGE_SCH_MODE_SP;
728+
bw_limit = 0;
729+
}
718730

719-
for (i = 0; i < hdev->tm_info.num_tc; i++) {
720731
hdev->tm_info.tc_info[i].tc_id = i;
721-
hdev->tm_info.tc_info[i].tc_sch_mode = HCLGE_SCH_MODE_DWRR;
732+
hdev->tm_info.tc_info[i].tc_sch_mode = tc_sch_mode;
722733
hdev->tm_info.tc_info[i].pgid = 0;
723-
hdev->tm_info.tc_info[i].bw_limit =
724-
hdev->tm_info.pg_info[0].bw_limit;
734+
hdev->tm_info.tc_info[i].bw_limit = bw_limit;
725735
}
726736

727737
for (i = 0; i < HNAE3_MAX_USER_PRIO; i++)
@@ -926,10 +936,13 @@ static int hclge_tm_pri_q_qs_cfg_tc_base(struct hclge_dev *hdev)
926936
for (k = 0; k < hdev->num_alloc_vport; k++) {
927937
struct hnae3_knic_private_info *kinfo = &vport[k].nic.kinfo;
928938

929-
for (i = 0; i < kinfo->tc_info.num_tc; i++) {
939+
for (i = 0; i < kinfo->tc_info.max_tc; i++) {
940+
u8 pri = i < kinfo->tc_info.num_tc ? i : 0;
941+
bool link_vld = i < kinfo->tc_info.num_tc;
942+
930943
ret = hclge_tm_qs_to_pri_map_cfg(hdev,
931944
vport[k].qs_offset + i,
932-
i);
945+
pri, link_vld);
933946
if (ret)
934947
return ret;
935948
}
@@ -949,7 +962,7 @@ static int hclge_tm_pri_q_qs_cfg_vnet_base(struct hclge_dev *hdev)
949962
for (i = 0; i < HNAE3_MAX_TC; i++) {
950963
ret = hclge_tm_qs_to_pri_map_cfg(hdev,
951964
vport[k].qs_offset + i,
952-
k);
965+
k, true);
953966
if (ret)
954967
return ret;
955968
}
@@ -989,33 +1002,39 @@ static int hclge_tm_pri_tc_base_shaper_cfg(struct hclge_dev *hdev)
9891002
{
9901003
u32 max_tm_rate = hdev->ae_dev->dev_specs.max_tm_rate;
9911004
struct hclge_shaper_ir_para ir_para;
992-
u32 shaper_para;
1005+
u32 shaper_para_c, shaper_para_p;
9931006
int ret;
9941007
u32 i;
9951008

996-
for (i = 0; i < hdev->tm_info.num_tc; i++) {
1009+
for (i = 0; i < hdev->tc_max; i++) {
9971010
u32 rate = hdev->tm_info.tc_info[i].bw_limit;
9981011

999-
ret = hclge_shaper_para_calc(rate, HCLGE_SHAPER_LVL_PRI,
1000-
&ir_para, max_tm_rate);
1001-
if (ret)
1002-
return ret;
1012+
if (rate) {
1013+
ret = hclge_shaper_para_calc(rate, HCLGE_SHAPER_LVL_PRI,
1014+
&ir_para, max_tm_rate);
1015+
if (ret)
1016+
return ret;
1017+
1018+
shaper_para_c = hclge_tm_get_shapping_para(0, 0, 0,
1019+
HCLGE_SHAPER_BS_U_DEF,
1020+
HCLGE_SHAPER_BS_S_DEF);
1021+
shaper_para_p = hclge_tm_get_shapping_para(ir_para.ir_b,
1022+
ir_para.ir_u,
1023+
ir_para.ir_s,
1024+
HCLGE_SHAPER_BS_U_DEF,
1025+
HCLGE_SHAPER_BS_S_DEF);
1026+
} else {
1027+
shaper_para_c = 0;
1028+
shaper_para_p = 0;
1029+
}
10031030

1004-
shaper_para = hclge_tm_get_shapping_para(0, 0, 0,
1005-
HCLGE_SHAPER_BS_U_DEF,
1006-
HCLGE_SHAPER_BS_S_DEF);
10071031
ret = hclge_tm_pri_shapping_cfg(hdev, HCLGE_TM_SHAP_C_BUCKET, i,
1008-
shaper_para, rate);
1032+
shaper_para_c, rate);
10091033
if (ret)
10101034
return ret;
10111035

1012-
shaper_para = hclge_tm_get_shapping_para(ir_para.ir_b,
1013-
ir_para.ir_u,
1014-
ir_para.ir_s,
1015-
HCLGE_SHAPER_BS_U_DEF,
1016-
HCLGE_SHAPER_BS_S_DEF);
10171036
ret = hclge_tm_pri_shapping_cfg(hdev, HCLGE_TM_SHAP_P_BUCKET, i,
1018-
shaper_para, rate);
1037+
shaper_para_p, rate);
10191038
if (ret)
10201039
return ret;
10211040
}
@@ -1125,7 +1144,7 @@ static int hclge_tm_pri_tc_base_dwrr_cfg(struct hclge_dev *hdev)
11251144
int ret;
11261145
u32 i, k;
11271146

1128-
for (i = 0; i < hdev->tm_info.num_tc; i++) {
1147+
for (i = 0; i < hdev->tc_max; i++) {
11291148
pg_info =
11301149
&hdev->tm_info.pg_info[hdev->tm_info.tc_info[i].pgid];
11311150
dwrr = pg_info->tc_dwrr[i];
@@ -1135,9 +1154,15 @@ static int hclge_tm_pri_tc_base_dwrr_cfg(struct hclge_dev *hdev)
11351154
return ret;
11361155

11371156
for (k = 0; k < hdev->num_alloc_vport; k++) {
1157+
struct hnae3_knic_private_info *kinfo = &vport[k].nic.kinfo;
1158+
1159+
if (i >= kinfo->tc_info.max_tc)
1160+
continue;
1161+
1162+
dwrr = i < kinfo->tc_info.num_tc ? vport[k].dwrr : 0;
11381163
ret = hclge_tm_qs_weight_cfg(
11391164
hdev, vport[k].qs_offset + i,
1140-
vport[k].dwrr);
1165+
dwrr);
11411166
if (ret)
11421167
return ret;
11431168
}
@@ -1303,16 +1328,24 @@ static int hclge_tm_schd_mode_tc_base_cfg(struct hclge_dev *hdev, u8 pri_id)
13031328
{
13041329
struct hclge_vport *vport = hdev->vport;
13051330
int ret;
1331+
u8 mode;
13061332
u16 i;
13071333

13081334
ret = hclge_tm_pri_schd_mode_cfg(hdev, pri_id);
13091335
if (ret)
13101336
return ret;
13111337

13121338
for (i = 0; i < hdev->num_alloc_vport; i++) {
1339+
struct hnae3_knic_private_info *kinfo = &vport[i].nic.kinfo;
1340+
1341+
if (pri_id >= kinfo->tc_info.max_tc)
1342+
continue;
1343+
1344+
mode = pri_id < kinfo->tc_info.num_tc ? HCLGE_SCH_MODE_DWRR :
1345+
HCLGE_SCH_MODE_SP;
13131346
ret = hclge_tm_qs_schd_mode_cfg(hdev,
13141347
vport[i].qs_offset + pri_id,
1315-
HCLGE_SCH_MODE_DWRR);
1348+
mode);
13161349
if (ret)
13171350
return ret;
13181351
}
@@ -1353,7 +1386,7 @@ static int hclge_tm_lvl34_schd_mode_cfg(struct hclge_dev *hdev)
13531386
u8 i;
13541387

13551388
if (hdev->tx_sch_mode == HCLGE_FLAG_TC_BASE_SCH_MODE) {
1356-
for (i = 0; i < hdev->tm_info.num_tc; i++) {
1389+
for (i = 0; i < hdev->tc_max; i++) {
13571390
ret = hclge_tm_schd_mode_tc_base_cfg(hdev, i);
13581391
if (ret)
13591392
return ret;

0 commit comments

Comments
 (0)