Skip to content

Commit 67bf254

Browse files
Yunsheng Lindavem330
Yunsheng Lin
authored andcommitted
net: hns3: Fixes the back pressure setting when sriov is enabled
When sriov is enabled, the Qset and tc mapping is not longer one to one relation. This patch fixes it by mapping all pf and vf's Qset to tc. Fixes: 8484405 ("net: hns3: Add support of TX Scheduler & Shaper to HNS3 driver") Signed-off-by: Yunsheng Lin <[email protected]> Signed-off-by: Peng Li <[email protected]> Signed-off-by: Salil Mehta <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0c69825 commit 67bf254

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

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

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,8 @@ static int hclge_tm_qs_schd_mode_cfg(struct hclge_dev *hdev, u16 qs_id, u8 mode)
500500
return hclge_cmd_send(&hdev->hw, &desc, 1);
501501
}
502502

503-
static int hclge_tm_qs_bp_cfg(struct hclge_dev *hdev, u8 tc)
503+
static int hclge_tm_qs_bp_cfg(struct hclge_dev *hdev, u8 tc, u8 grp_id,
504+
u32 bit_map)
504505
{
505506
struct hclge_bp_to_qs_map_cmd *bp_to_qs_map_cmd;
506507
struct hclge_desc desc;
@@ -511,9 +512,8 @@ static int hclge_tm_qs_bp_cfg(struct hclge_dev *hdev, u8 tc)
511512
bp_to_qs_map_cmd = (struct hclge_bp_to_qs_map_cmd *)desc.data;
512513

513514
bp_to_qs_map_cmd->tc_id = tc;
514-
515-
/* Qset and tc is one by one mapping */
516-
bp_to_qs_map_cmd->qs_bit_map = cpu_to_le32(1 << tc);
515+
bp_to_qs_map_cmd->qs_group_id = grp_id;
516+
bp_to_qs_map_cmd->qs_bit_map = cpu_to_le32(bit_map);
517517

518518
return hclge_cmd_send(&hdev->hw, &desc, 1);
519519
}
@@ -1167,6 +1167,41 @@ static int hclge_pfc_setup_hw(struct hclge_dev *hdev)
11671167
hdev->tm_info.hw_pfc_map);
11681168
}
11691169

1170+
/* Each Tc has a 1024 queue sets to backpress, it divides to
1171+
* 32 group, each group contains 32 queue sets, which can be
1172+
* represented by u32 bitmap.
1173+
*/
1174+
static int hclge_bp_setup_hw(struct hclge_dev *hdev, u8 tc)
1175+
{
1176+
struct hclge_vport *vport = hdev->vport;
1177+
u32 i, k, qs_bitmap;
1178+
int ret;
1179+
1180+
for (i = 0; i < HCLGE_BP_GRP_NUM; i++) {
1181+
qs_bitmap = 0;
1182+
1183+
for (k = 0; k < hdev->num_alloc_vport; k++) {
1184+
u16 qs_id = vport->qs_offset + tc;
1185+
u8 grp, sub_grp;
1186+
1187+
grp = hnae_get_field(qs_id, HCLGE_BP_GRP_ID_M,
1188+
HCLGE_BP_GRP_ID_S);
1189+
sub_grp = hnae_get_field(qs_id, HCLGE_BP_SUB_GRP_ID_M,
1190+
HCLGE_BP_SUB_GRP_ID_S);
1191+
if (i == grp)
1192+
qs_bitmap |= (1 << sub_grp);
1193+
1194+
vport++;
1195+
}
1196+
1197+
ret = hclge_tm_qs_bp_cfg(hdev, tc, i, qs_bitmap);
1198+
if (ret)
1199+
return ret;
1200+
}
1201+
1202+
return 0;
1203+
}
1204+
11701205
static int hclge_mac_pause_setup_hw(struct hclge_dev *hdev)
11711206
{
11721207
bool tx_en, rx_en;
@@ -1218,7 +1253,7 @@ int hclge_pause_setup_hw(struct hclge_dev *hdev)
12181253
dev_warn(&hdev->pdev->dev, "set pfc pause failed:%d\n", ret);
12191254

12201255
for (i = 0; i < hdev->tm_info.num_tc; i++) {
1221-
ret = hclge_tm_qs_bp_cfg(hdev, i);
1256+
ret = hclge_bp_setup_hw(hdev, i);
12221257
if (ret)
12231258
return ret;
12241259
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ struct hclge_pg_shapping_cmd {
8989
__le32 pg_shapping_para;
9090
};
9191

92+
#define HCLGE_BP_GRP_NUM 32
93+
#define HCLGE_BP_SUB_GRP_ID_S 0
94+
#define HCLGE_BP_SUB_GRP_ID_M GENMASK(4, 0)
95+
#define HCLGE_BP_GRP_ID_S 5
96+
#define HCLGE_BP_GRP_ID_M GENMASK(9, 5)
9297
struct hclge_bp_to_qs_map_cmd {
9398
u8 tc_id;
9499
u8 rsvd[2];

0 commit comments

Comments
 (0)