Skip to content

Commit d174ea7

Browse files
liuzhongzhudavem330
authored andcommitted
net: hns3: add statistics for PFC frames and MAC control frames
In the old firmware version, statistics acquisition of PFC frames and MAC control frames is not supported. Add command retrieves statistics for PFC frames and MAC control frames from the firmware. Signed-off-by: liuzhongzhu <liuzhongzhu@huawei.com> Signed-off-by: Peng Li <lipeng321@huawei.com> Signed-off-by: Huazhong Tan <tanhuazhong@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 330baff commit d174ea7

File tree

4 files changed

+109
-7
lines changed

4 files changed

+109
-7
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,12 @@ static bool hclge_is_special_opcode(u16 opcode)
170170
/* these commands have several descriptors,
171171
* and use the first one to save opcode and return value
172172
*/
173-
u16 spec_opcode[3] = {HCLGE_OPC_STATS_64_BIT,
174-
HCLGE_OPC_STATS_32_BIT, HCLGE_OPC_STATS_MAC};
173+
u16 spec_opcode[] = {HCLGE_OPC_STATS_64_BIT,
174+
HCLGE_OPC_STATS_32_BIT,
175+
HCLGE_OPC_STATS_MAC,
176+
HCLGE_OPC_STATS_MAC_ALL,
177+
HCLGE_OPC_QUERY_32_BIT_REG,
178+
HCLGE_OPC_QUERY_64_BIT_REG};
175179
int i;
176180

177181
for (i = 0; i < ARRAY_SIZE(spec_opcode); i++) {
@@ -259,6 +263,8 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num)
259263

260264
if (desc_ret == HCLGE_CMD_EXEC_SUCCESS)
261265
retval = 0;
266+
else if (desc_ret == HCLGE_CMD_NO_AUTH)
267+
retval = -EPERM;
262268
else if (desc_ret == HCLGE_CMD_NOT_SUPPORTED)
263269
retval = -EOPNOTSUPP;
264270
else

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ enum hclge_opcode_type {
8282
HCLGE_OPC_STATS_64_BIT = 0x0030,
8383
HCLGE_OPC_STATS_32_BIT = 0x0031,
8484
HCLGE_OPC_STATS_MAC = 0x0032,
85+
HCLGE_OPC_QUERY_MAC_REG_NUM = 0x0033,
86+
HCLGE_OPC_STATS_MAC_ALL = 0x0034,
8587

8688
HCLGE_OPC_QUERY_REG_NUM = 0x0040,
8789
HCLGE_OPC_QUERY_32_BIT_REG = 0x0041,

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

Lines changed: 92 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@ static const struct hclge_comm_stats_str g_mac_stats_string[] = {
118118
HCLGE_MAC_STATS_FIELD_OFF(mac_tx_mac_pause_num)},
119119
{"mac_rx_mac_pause_num",
120120
HCLGE_MAC_STATS_FIELD_OFF(mac_rx_mac_pause_num)},
121+
{"mac_tx_control_pkt_num",
122+
HCLGE_MAC_STATS_FIELD_OFF(mac_tx_ctrl_pkt_num)},
123+
{"mac_rx_control_pkt_num",
124+
HCLGE_MAC_STATS_FIELD_OFF(mac_rx_ctrl_pkt_num)},
125+
{"mac_tx_pfc_pkt_num",
126+
HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pause_pkt_num)},
121127
{"mac_tx_pfc_pri0_pkt_num",
122128
HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri0_pkt_num)},
123129
{"mac_tx_pfc_pri1_pkt_num",
@@ -134,6 +140,8 @@ static const struct hclge_comm_stats_str g_mac_stats_string[] = {
134140
HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri6_pkt_num)},
135141
{"mac_tx_pfc_pri7_pkt_num",
136142
HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri7_pkt_num)},
143+
{"mac_rx_pfc_pkt_num",
144+
HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pause_pkt_num)},
137145
{"mac_rx_pfc_pri0_pkt_num",
138146
HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri0_pkt_num)},
139147
{"mac_rx_pfc_pri1_pkt_num",
@@ -287,10 +295,9 @@ static const struct hclge_mac_mgr_tbl_entry_cmd hclge_mgr_table[] = {
287295
},
288296
};
289297

290-
static int hclge_mac_update_stats(struct hclge_dev *hdev)
298+
static int hclge_mac_update_stats_defective(struct hclge_dev *hdev)
291299
{
292300
#define HCLGE_MAC_CMD_NUM 21
293-
#define HCLGE_RTN_DATA_NUM 4
294301

295302
u64 *data = (u64 *)(&hdev->hw_stats.mac_stats);
296303
struct hclge_desc desc[HCLGE_MAC_CMD_NUM];
@@ -308,22 +315,102 @@ static int hclge_mac_update_stats(struct hclge_dev *hdev)
308315
}
309316

310317
for (i = 0; i < HCLGE_MAC_CMD_NUM; i++) {
318+
/* for special opcode 0032, only the first desc has the head */
311319
if (unlikely(i == 0)) {
312320
desc_data = (__le64 *)(&desc[i].data[0]);
313-
n = HCLGE_RTN_DATA_NUM - 2;
321+
n = HCLGE_RD_FIRST_STATS_NUM;
314322
} else {
315323
desc_data = (__le64 *)(&desc[i]);
316-
n = HCLGE_RTN_DATA_NUM;
324+
n = HCLGE_RD_OTHER_STATS_NUM;
317325
}
326+
327+
for (k = 0; k < n; k++) {
328+
*data += le64_to_cpu(*desc_data);
329+
data++;
330+
desc_data++;
331+
}
332+
}
333+
334+
return 0;
335+
}
336+
337+
static int hclge_mac_update_stats_complete(struct hclge_dev *hdev, u32 desc_num)
338+
{
339+
u64 *data = (u64 *)(&hdev->hw_stats.mac_stats);
340+
struct hclge_desc *desc;
341+
__le64 *desc_data;
342+
u16 i, k, n;
343+
int ret;
344+
345+
desc = kcalloc(desc_num, sizeof(struct hclge_desc), GFP_KERNEL);
346+
hclge_cmd_setup_basic_desc(&desc[0], HCLGE_OPC_STATS_MAC_ALL, true);
347+
ret = hclge_cmd_send(&hdev->hw, desc, desc_num);
348+
if (ret) {
349+
kfree(desc);
350+
return ret;
351+
}
352+
353+
for (i = 0; i < desc_num; i++) {
354+
/* for special opcode 0034, only the first desc has the head */
355+
if (i == 0) {
356+
desc_data = (__le64 *)(&desc[i].data[0]);
357+
n = HCLGE_RD_FIRST_STATS_NUM;
358+
} else {
359+
desc_data = (__le64 *)(&desc[i]);
360+
n = HCLGE_RD_OTHER_STATS_NUM;
361+
}
362+
318363
for (k = 0; k < n; k++) {
319-
*data++ += le64_to_cpu(*desc_data);
364+
*data += le64_to_cpu(*desc_data);
365+
data++;
320366
desc_data++;
321367
}
322368
}
323369

370+
kfree(desc);
371+
324372
return 0;
325373
}
326374

375+
static int hclge_mac_query_reg_num(struct hclge_dev *hdev, u32 *desc_num)
376+
{
377+
struct hclge_desc desc;
378+
__le32 *desc_data;
379+
u32 reg_num;
380+
int ret;
381+
382+
hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_MAC_REG_NUM, true);
383+
ret = hclge_cmd_send(&hdev->hw, &desc, 1);
384+
if (ret)
385+
return ret;
386+
387+
desc_data = (__le32 *)(&desc.data[0]);
388+
reg_num = le32_to_cpu(*desc_data);
389+
390+
*desc_num = 1 + ((reg_num - 3) >> 2) +
391+
(u32)(((reg_num - 3) & 0x3) ? 1 : 0);
392+
393+
return 0;
394+
}
395+
396+
static int hclge_mac_update_stats(struct hclge_dev *hdev)
397+
{
398+
u32 desc_num;
399+
int ret;
400+
401+
ret = hclge_mac_query_reg_num(hdev, &desc_num);
402+
403+
/* The firmware supports the new statistics acquisition method */
404+
if (!ret)
405+
ret = hclge_mac_update_stats_complete(hdev, desc_num);
406+
else if (ret == -EOPNOTSUPP)
407+
ret = hclge_mac_update_stats_defective(hdev);
408+
else
409+
dev_err(&hdev->pdev->dev, "query mac reg num fail!\n");
410+
411+
return ret;
412+
}
413+
327414
static int hclge_tqps_update_stats(struct hnae3_handle *handle)
328415
{
329416
struct hnae3_knic_private_info *kinfo = &handle->kinfo;

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616

1717
#define HCLGE_MAX_PF_NUM 8
1818

19+
#define HCLGE_RD_FIRST_STATS_NUM 2
20+
#define HCLGE_RD_OTHER_STATS_NUM 4
21+
1922
#define HCLGE_INVALID_VPORT 0xffff
2023

2124
#define HCLGE_PF_CFG_BLOCK_SIZE 32
@@ -415,6 +418,10 @@ struct hclge_mac_stats {
415418
u64 mac_rx_fcs_err_pkt_num;
416419
u64 mac_rx_send_app_good_pkt_num;
417420
u64 mac_rx_send_app_bad_pkt_num;
421+
u64 mac_tx_pfc_pause_pkt_num;
422+
u64 mac_rx_pfc_pause_pkt_num;
423+
u64 mac_tx_ctrl_pkt_num;
424+
u64 mac_rx_ctrl_pkt_num;
418425
};
419426

420427
#define HCLGE_STATS_TIMER_INTERVAL (60 * 5)

0 commit comments

Comments
 (0)