@@ -118,6 +118,12 @@ static const struct hclge_comm_stats_str g_mac_stats_string[] = {
118
118
HCLGE_MAC_STATS_FIELD_OFF (mac_tx_mac_pause_num )},
119
119
{"mac_rx_mac_pause_num" ,
120
120
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 )},
121
127
{"mac_tx_pfc_pri0_pkt_num" ,
122
128
HCLGE_MAC_STATS_FIELD_OFF (mac_tx_pfc_pri0_pkt_num )},
123
129
{"mac_tx_pfc_pri1_pkt_num" ,
@@ -134,6 +140,8 @@ static const struct hclge_comm_stats_str g_mac_stats_string[] = {
134
140
HCLGE_MAC_STATS_FIELD_OFF (mac_tx_pfc_pri6_pkt_num )},
135
141
{"mac_tx_pfc_pri7_pkt_num" ,
136
142
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 )},
137
145
{"mac_rx_pfc_pri0_pkt_num" ,
138
146
HCLGE_MAC_STATS_FIELD_OFF (mac_rx_pfc_pri0_pkt_num )},
139
147
{"mac_rx_pfc_pri1_pkt_num" ,
@@ -287,10 +295,9 @@ static const struct hclge_mac_mgr_tbl_entry_cmd hclge_mgr_table[] = {
287
295
},
288
296
};
289
297
290
- static int hclge_mac_update_stats (struct hclge_dev * hdev )
298
+ static int hclge_mac_update_stats_defective (struct hclge_dev * hdev )
291
299
{
292
300
#define HCLGE_MAC_CMD_NUM 21
293
- #define HCLGE_RTN_DATA_NUM 4
294
301
295
302
u64 * data = (u64 * )(& hdev -> hw_stats .mac_stats );
296
303
struct hclge_desc desc [HCLGE_MAC_CMD_NUM ];
@@ -308,22 +315,102 @@ static int hclge_mac_update_stats(struct hclge_dev *hdev)
308
315
}
309
316
310
317
for (i = 0 ; i < HCLGE_MAC_CMD_NUM ; i ++ ) {
318
+ /* for special opcode 0032, only the first desc has the head */
311
319
if (unlikely (i == 0 )) {
312
320
desc_data = (__le64 * )(& desc [i ].data [0 ]);
313
- n = HCLGE_RTN_DATA_NUM - 2 ;
321
+ n = HCLGE_RD_FIRST_STATS_NUM ;
314
322
} else {
315
323
desc_data = (__le64 * )(& desc [i ]);
316
- n = HCLGE_RTN_DATA_NUM ;
324
+ n = HCLGE_RD_OTHER_STATS_NUM ;
317
325
}
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
+
318
363
for (k = 0 ; k < n ; k ++ ) {
319
- * data ++ += le64_to_cpu (* desc_data );
364
+ * data += le64_to_cpu (* desc_data );
365
+ data ++ ;
320
366
desc_data ++ ;
321
367
}
322
368
}
323
369
370
+ kfree (desc );
371
+
324
372
return 0 ;
325
373
}
326
374
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
+
327
414
static int hclge_tqps_update_stats (struct hnae3_handle * handle )
328
415
{
329
416
struct hnae3_knic_private_info * kinfo = & handle -> kinfo ;
0 commit comments