// SPDX-License-Identifier: GPL-2.0+ // Copyright (c) 2021-2021 Hisilicon Limited. #include #include "hnae3.h" #include "hclge_comm_cmd.h" #include "hclge_comm_tqp_stats.h" u64 *hclge_comm_tqps_get_stats(struct hnae3_handle *handle, u64 *data) { struct hnae3_knic_private_info *kinfo = &handle->kinfo; struct hclge_comm_tqp *tqp; u64 *buff = data; u16 i; for (i = 0; i < kinfo->num_tqps; i++) { tqp = container_of(kinfo->tqp[i], struct hclge_comm_tqp, q); *buff++ = tqp->tqp_stats.rcb_tx_ring_pktnum_rcd; } for (i = 0; i < kinfo->num_tqps; i++) { tqp = container_of(kinfo->tqp[i], struct hclge_comm_tqp, q); *buff++ = tqp->tqp_stats.rcb_rx_ring_pktnum_rcd; } return buff; } int hclge_comm_tqps_get_sset_count(struct hnae3_handle *handle) { struct hnae3_knic_private_info *kinfo = &handle->kinfo; return kinfo->num_tqps * HCLGE_COMM_QUEUE_PAIR_SIZE; } u8 *hclge_comm_tqps_get_strings(struct hnae3_handle *handle, u8 *data) { struct hnae3_knic_private_info *kinfo = &handle->kinfo; u8 *buff = data; u16 i; for (i = 0; i < kinfo->num_tqps; i++) { struct hclge_comm_tqp *tqp = container_of(kinfo->tqp[i], struct hclge_comm_tqp, q); snprintf(buff, ETH_GSTRING_LEN, "txq%u_pktnum_rcd", tqp->index); buff += ETH_GSTRING_LEN; } for (i = 0; i < kinfo->num_tqps; i++) { struct hclge_comm_tqp *tqp = container_of(kinfo->tqp[i], struct hclge_comm_tqp, q); snprintf(buff, ETH_GSTRING_LEN, "rxq%u_pktnum_rcd", tqp->index); buff += ETH_GSTRING_LEN; } return buff; } int hclge_comm_tqps_update_stats(struct hnae3_handle *handle, struct hclge_comm_hw *hw) { struct hnae3_knic_private_info *kinfo = &handle->kinfo; struct hclge_comm_tqp *tqp; struct hclge_desc desc; int ret; u16 i; for (i = 0; i < kinfo->num_tqps; i++) { tqp = container_of(kinfo->tqp[i], struct hclge_comm_tqp, q); hclge_comm_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_RX_STATS, true); desc.data[0] = cpu_to_le32(tqp->index); ret = hclge_comm_cmd_send(hw, &desc, 1); if (ret) { dev_err(&hw->cmq.csq.pdev->dev, "failed to get tqp stat, ret = %d, rx = %u.\n", ret, i); return ret; } tqp->tqp_stats.rcb_rx_ring_pktnum_rcd += le32_to_cpu(desc.data[1]); hclge_comm_cmd_setup_basic_desc(&desc, HCLGE_OPC_QUERY_TX_STATS, true); desc.data[0] = cpu_to_le32(tqp->index & 0x1ff); ret = hclge_comm_cmd_send(hw, &desc, 1); if (ret) { dev_err(&hw->cmq.csq.pdev->dev, "failed to get tqp stat, ret = %d, tx = %u.\n", ret, i); return ret; } tqp->tqp_stats.rcb_tx_ring_pktnum_rcd += le32_to_cpu(desc.data[1]); } return 0; } void hclge_comm_reset_tqp_stats(struct hnae3_handle *handle) { struct hnae3_knic_private_info *kinfo = &handle->kinfo; struct hclge_comm_tqp *tqp; struct hnae3_queue *queue; u16 i; for (i = 0; i < kinfo->num_tqps; i++) { queue = kinfo->tqp[i]; tqp = container_of(queue, struct hclge_comm_tqp, q); memset(&tqp->tqp_stats, 0, sizeof(tqp->tqp_stats)); } }