static int hclge_ieee_getpfc(struct hnae3_handle *h, struct ieee_pfc *pfc)
 {
-       u64 requests[HNAE3_MAX_TC], indications[HNAE3_MAX_TC];
        struct hclge_vport *vport = hclge_get_vport(h);
        struct hclge_dev *hdev = vport->back;
        int ret;
-       u8 i;
 
        memset(pfc, 0, sizeof(*pfc));
        pfc->pfc_cap = hdev->pfc_max;
        pfc->pfc_en = hdev->tm_info.pfc_en;
 
-       ret = hclge_pfc_tx_stats_get(hdev, requests);
-       if (ret)
+       ret = hclge_mac_update_stats(hdev);
+       if (ret) {
+               dev_err(&hdev->pdev->dev,
+                       "failed to update MAC stats, ret = %d.\n", ret);
                return ret;
+       }
 
-       ret = hclge_pfc_rx_stats_get(hdev, indications);
-       if (ret)
-               return ret;
+       hclge_pfc_tx_stats_get(hdev, pfc->requests);
+       hclge_pfc_rx_stats_get(hdev, pfc->indications);
 
-       for (i = 0; i < HCLGE_MAX_TC_NUM; i++) {
-               pfc->requests[i] = requests[i];
-               pfc->indications[i] = indications[i];
-       }
        return 0;
 }
 
 
        return 0;
 }
 
-static int hclge_pfc_stats_get(struct hclge_dev *hdev,
-                              enum hclge_opcode_type opcode, u64 *stats)
-{
-       struct hclge_desc desc[HCLGE_TM_PFC_PKT_GET_CMD_NUM];
-       int ret, i, j;
-
-       if (!(opcode == HCLGE_OPC_QUERY_PFC_RX_PKT_CNT ||
-             opcode == HCLGE_OPC_QUERY_PFC_TX_PKT_CNT))
-               return -EINVAL;
-
-       for (i = 0; i < HCLGE_TM_PFC_PKT_GET_CMD_NUM - 1; i++) {
-               hclge_cmd_setup_basic_desc(&desc[i], opcode, true);
-               desc[i].flag |= cpu_to_le16(HCLGE_CMD_FLAG_NEXT);
-       }
-
-       hclge_cmd_setup_basic_desc(&desc[i], opcode, true);
+static const u16 hclge_pfc_tx_stats_offset[] = {
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri0_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri1_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri2_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri3_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri4_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri5_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri6_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_tx_pfc_pri7_pkt_num)
+};
 
-       ret = hclge_cmd_send(&hdev->hw, desc, HCLGE_TM_PFC_PKT_GET_CMD_NUM);
-       if (ret)
-               return ret;
+static const u16 hclge_pfc_rx_stats_offset[] = {
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri0_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri1_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri2_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri3_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri4_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri5_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri6_pkt_num),
+       HCLGE_MAC_STATS_FIELD_OFF(mac_rx_pfc_pri7_pkt_num)
+};
 
-       for (i = 0; i < HCLGE_TM_PFC_PKT_GET_CMD_NUM; i++) {
-               struct hclge_pfc_stats_cmd *pfc_stats =
-                               (struct hclge_pfc_stats_cmd *)desc[i].data;
+static void hclge_pfc_stats_get(struct hclge_dev *hdev, bool tx, u64 *stats)
+{
+       const u16 *offset;
+       int i;
 
-               for (j = 0; j < HCLGE_TM_PFC_NUM_GET_PER_CMD; j++) {
-                       u32 index = i * HCLGE_TM_PFC_PKT_GET_CMD_NUM + j;
+       if (tx)
+               offset = hclge_pfc_tx_stats_offset;
+       else
+               offset = hclge_pfc_rx_stats_offset;
 
-                       if (index < HCLGE_MAX_TC_NUM)
-                               stats[index] =
-                                       le64_to_cpu(pfc_stats->pkt_num[j]);
-               }
-       }
-       return 0;
+       for (i = 0; i < HCLGE_MAX_TC_NUM; i++)
+               stats[i] = HCLGE_STATS_READ(&hdev->mac_stats, offset[i]);
 }
 
-int hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats)
+void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats)
 {
-       return hclge_pfc_stats_get(hdev, HCLGE_OPC_QUERY_PFC_RX_PKT_CNT, stats);
+       hclge_pfc_stats_get(hdev, false, stats);
 }
 
-int hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats)
+void hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats)
 {
-       return hclge_pfc_stats_get(hdev, HCLGE_OPC_QUERY_PFC_TX_PKT_CNT, stats);
+       hclge_pfc_stats_get(hdev, true, stats);
 }
 
 int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx)
 
 int hclge_tm_init_hw(struct hclge_dev *hdev, bool init);
 int hclge_mac_pause_en_cfg(struct hclge_dev *hdev, bool tx, bool rx);
 int hclge_pause_addr_cfg(struct hclge_dev *hdev, const u8 *mac_addr);
-int hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats);
-int hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats);
+void hclge_pfc_rx_stats_get(struct hclge_dev *hdev, u64 *stats);
+void hclge_pfc_tx_stats_get(struct hclge_dev *hdev, u64 *stats);
 int hclge_tm_qs_shaper_cfg(struct hclge_vport *vport, int max_tx_rate);
 int hclge_tm_get_qset_num(struct hclge_dev *hdev, u16 *qset_num);
 int hclge_tm_get_pri_num(struct hclge_dev *hdev, u8 *pri_num);