@@ -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
715717static 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