1a51f06e1SSelvin Xavier /******************************************************************* 2a51f06e1SSelvin Xavier * This file is part of the Emulex RoCE Device Driver for * 3a51f06e1SSelvin Xavier * RoCE (RDMA over Converged Ethernet) adapters. * 4a51f06e1SSelvin Xavier * Copyright (C) 2008-2014 Emulex. All rights reserved. * 5a51f06e1SSelvin Xavier * EMULEX and SLI are trademarks of Emulex. * 6a51f06e1SSelvin Xavier * www.emulex.com * 7a51f06e1SSelvin Xavier * * 8a51f06e1SSelvin Xavier * This program is free software; you can redistribute it and/or * 9a51f06e1SSelvin Xavier * modify it under the terms of version 2 of the GNU General * 10a51f06e1SSelvin Xavier * Public License as published by the Free Software Foundation. * 11a51f06e1SSelvin Xavier * This program is distributed in the hope that it will be useful. * 12a51f06e1SSelvin Xavier * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * 13a51f06e1SSelvin Xavier * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * 14a51f06e1SSelvin Xavier * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE * 15a51f06e1SSelvin Xavier * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD * 16a51f06e1SSelvin Xavier * TO BE LEGALLY INVALID. See the GNU General Public License for * 17a51f06e1SSelvin Xavier * more details, a copy of which can be found in the file COPYING * 18a51f06e1SSelvin Xavier * included with this package. * 19a51f06e1SSelvin Xavier * 20a51f06e1SSelvin Xavier * Contact Information: 21a51f06e1SSelvin Xavier * linux-drivers@emulex.com 22a51f06e1SSelvin Xavier * 23a51f06e1SSelvin Xavier * Emulex 24a51f06e1SSelvin Xavier * 3333 Susan Street 25a51f06e1SSelvin Xavier * Costa Mesa, CA 92626 26a51f06e1SSelvin Xavier *******************************************************************/ 27a51f06e1SSelvin Xavier 28a51f06e1SSelvin Xavier #include <rdma/ib_addr.h> 29cad1fbb0SMitesh Ahuja #include <rdma/ib_pma.h> 30a51f06e1SSelvin Xavier #include "ocrdma_stats.h" 31a51f06e1SSelvin Xavier 32a51f06e1SSelvin Xavier static struct dentry *ocrdma_dbgfs_dir; 33a51f06e1SSelvin Xavier 34a51f06e1SSelvin Xavier static int ocrdma_add_stat(char *start, char *pcur, 35a51f06e1SSelvin Xavier char *name, u64 count) 36a51f06e1SSelvin Xavier { 37a51f06e1SSelvin Xavier char buff[128] = {0}; 38a51f06e1SSelvin Xavier int cpy_len = 0; 39a51f06e1SSelvin Xavier 40a51f06e1SSelvin Xavier snprintf(buff, 128, "%s: %llu\n", name, count); 41a51f06e1SSelvin Xavier cpy_len = strlen(buff); 42a51f06e1SSelvin Xavier 43a51f06e1SSelvin Xavier if (pcur + cpy_len > start + OCRDMA_MAX_DBGFS_MEM) { 44a51f06e1SSelvin Xavier pr_err("%s: No space in stats buff\n", __func__); 45a51f06e1SSelvin Xavier return 0; 46a51f06e1SSelvin Xavier } 47a51f06e1SSelvin Xavier 48a51f06e1SSelvin Xavier memcpy(pcur, buff, cpy_len); 49a51f06e1SSelvin Xavier return cpy_len; 50a51f06e1SSelvin Xavier } 51a51f06e1SSelvin Xavier 52a51f06e1SSelvin Xavier static bool ocrdma_alloc_stats_mem(struct ocrdma_dev *dev) 53a51f06e1SSelvin Xavier { 54a51f06e1SSelvin Xavier struct stats_mem *mem = &dev->stats_mem; 55a51f06e1SSelvin Xavier 56a51f06e1SSelvin Xavier /* Alloc mbox command mem*/ 57a51f06e1SSelvin Xavier mem->size = max_t(u32, sizeof(struct ocrdma_rdma_stats_req), 58a51f06e1SSelvin Xavier sizeof(struct ocrdma_rdma_stats_resp)); 59a51f06e1SSelvin Xavier 60a51f06e1SSelvin Xavier mem->va = dma_alloc_coherent(&dev->nic_info.pdev->dev, mem->size, 61a51f06e1SSelvin Xavier &mem->pa, GFP_KERNEL); 62a51f06e1SSelvin Xavier if (!mem->va) { 63a51f06e1SSelvin Xavier pr_err("%s: stats mbox allocation failed\n", __func__); 64a51f06e1SSelvin Xavier return false; 65a51f06e1SSelvin Xavier } 66a51f06e1SSelvin Xavier 67a51f06e1SSelvin Xavier memset(mem->va, 0, mem->size); 68a51f06e1SSelvin Xavier 69a51f06e1SSelvin Xavier /* Alloc debugfs mem */ 70a51f06e1SSelvin Xavier mem->debugfs_mem = kzalloc(OCRDMA_MAX_DBGFS_MEM, GFP_KERNEL); 71a51f06e1SSelvin Xavier if (!mem->debugfs_mem) { 72a51f06e1SSelvin Xavier pr_err("%s: stats debugfs mem allocation failed\n", __func__); 73a51f06e1SSelvin Xavier return false; 74a51f06e1SSelvin Xavier } 75a51f06e1SSelvin Xavier 76a51f06e1SSelvin Xavier return true; 77a51f06e1SSelvin Xavier } 78a51f06e1SSelvin Xavier 79a51f06e1SSelvin Xavier static void ocrdma_release_stats_mem(struct ocrdma_dev *dev) 80a51f06e1SSelvin Xavier { 81a51f06e1SSelvin Xavier struct stats_mem *mem = &dev->stats_mem; 82a51f06e1SSelvin Xavier 83a51f06e1SSelvin Xavier if (mem->va) 84a51f06e1SSelvin Xavier dma_free_coherent(&dev->nic_info.pdev->dev, mem->size, 85a51f06e1SSelvin Xavier mem->va, mem->pa); 86a51f06e1SSelvin Xavier kfree(mem->debugfs_mem); 87a51f06e1SSelvin Xavier } 88a51f06e1SSelvin Xavier 89a51f06e1SSelvin Xavier static char *ocrdma_resource_stats(struct ocrdma_dev *dev) 90a51f06e1SSelvin Xavier { 91a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 92a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 93a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 94a51f06e1SSelvin Xavier struct ocrdma_rsrc_stats *rsrc_stats = &rdma_stats->act_rsrc_stats; 95a51f06e1SSelvin Xavier 96a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 97a51f06e1SSelvin Xavier 98a51f06e1SSelvin Xavier pcur = stats; 99a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_dpp_pds", 100a51f06e1SSelvin Xavier (u64)rsrc_stats->dpp_pds); 101a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_non_dpp_pds", 102a51f06e1SSelvin Xavier (u64)rsrc_stats->non_dpp_pds); 103a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_rc_dpp_qps", 104a51f06e1SSelvin Xavier (u64)rsrc_stats->rc_dpp_qps); 105a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_uc_dpp_qps", 106a51f06e1SSelvin Xavier (u64)rsrc_stats->uc_dpp_qps); 107a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_ud_dpp_qps", 108a51f06e1SSelvin Xavier (u64)rsrc_stats->ud_dpp_qps); 109a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_rc_non_dpp_qps", 110a51f06e1SSelvin Xavier (u64)rsrc_stats->rc_non_dpp_qps); 111a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_uc_non_dpp_qps", 112a51f06e1SSelvin Xavier (u64)rsrc_stats->uc_non_dpp_qps); 113a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_ud_non_dpp_qps", 114a51f06e1SSelvin Xavier (u64)rsrc_stats->ud_non_dpp_qps); 115a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_srqs", 116a51f06e1SSelvin Xavier (u64)rsrc_stats->srqs); 117a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_rbqs", 118a51f06e1SSelvin Xavier (u64)rsrc_stats->rbqs); 119a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_64K_nsmr", 120a51f06e1SSelvin Xavier (u64)rsrc_stats->r64K_nsmr); 121a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_64K_to_2M_nsmr", 122a51f06e1SSelvin Xavier (u64)rsrc_stats->r64K_to_2M_nsmr); 123a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_2M_to_44M_nsmr", 124a51f06e1SSelvin Xavier (u64)rsrc_stats->r2M_to_44M_nsmr); 125a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_44M_to_1G_nsmr", 126a51f06e1SSelvin Xavier (u64)rsrc_stats->r44M_to_1G_nsmr); 127a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_1G_to_4G_nsmr", 128a51f06e1SSelvin Xavier (u64)rsrc_stats->r1G_to_4G_nsmr); 129a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_nsmr_count_4G_to_32G", 130a51f06e1SSelvin Xavier (u64)rsrc_stats->nsmr_count_4G_to_32G); 131a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_32G_to_64G_nsmr", 132a51f06e1SSelvin Xavier (u64)rsrc_stats->r32G_to_64G_nsmr); 133a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_64G_to_128G_nsmr", 134a51f06e1SSelvin Xavier (u64)rsrc_stats->r64G_to_128G_nsmr); 135a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_128G_to_higher_nsmr", 136a51f06e1SSelvin Xavier (u64)rsrc_stats->r128G_to_higher_nsmr); 137a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_embedded_nsmr", 138a51f06e1SSelvin Xavier (u64)rsrc_stats->embedded_nsmr); 139a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_frmr", 140a51f06e1SSelvin Xavier (u64)rsrc_stats->frmr); 141a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_prefetch_qps", 142a51f06e1SSelvin Xavier (u64)rsrc_stats->prefetch_qps); 143a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_ondemand_qps", 144a51f06e1SSelvin Xavier (u64)rsrc_stats->ondemand_qps); 145a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_phy_mr", 146a51f06e1SSelvin Xavier (u64)rsrc_stats->phy_mr); 147a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_mw", 148a51f06e1SSelvin Xavier (u64)rsrc_stats->mw); 149a51f06e1SSelvin Xavier 150a51f06e1SSelvin Xavier /* Print the threshold stats */ 151a51f06e1SSelvin Xavier rsrc_stats = &rdma_stats->th_rsrc_stats; 152a51f06e1SSelvin Xavier 153a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_dpp_pds", 154a51f06e1SSelvin Xavier (u64)rsrc_stats->dpp_pds); 155a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_non_dpp_pds", 156a51f06e1SSelvin Xavier (u64)rsrc_stats->non_dpp_pds); 157a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_rc_dpp_qps", 158a51f06e1SSelvin Xavier (u64)rsrc_stats->rc_dpp_qps); 159a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_uc_dpp_qps", 160a51f06e1SSelvin Xavier (u64)rsrc_stats->uc_dpp_qps); 161a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_ud_dpp_qps", 162a51f06e1SSelvin Xavier (u64)rsrc_stats->ud_dpp_qps); 163a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_rc_non_dpp_qps", 164a51f06e1SSelvin Xavier (u64)rsrc_stats->rc_non_dpp_qps); 165a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_uc_non_dpp_qps", 166a51f06e1SSelvin Xavier (u64)rsrc_stats->uc_non_dpp_qps); 167a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_ud_non_dpp_qps", 168a51f06e1SSelvin Xavier (u64)rsrc_stats->ud_non_dpp_qps); 169a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_srqs", 170a51f06e1SSelvin Xavier (u64)rsrc_stats->srqs); 171a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_rbqs", 172a51f06e1SSelvin Xavier (u64)rsrc_stats->rbqs); 173a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_64K_nsmr", 174a51f06e1SSelvin Xavier (u64)rsrc_stats->r64K_nsmr); 175a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_64K_to_2M_nsmr", 176a51f06e1SSelvin Xavier (u64)rsrc_stats->r64K_to_2M_nsmr); 177a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_2M_to_44M_nsmr", 178a51f06e1SSelvin Xavier (u64)rsrc_stats->r2M_to_44M_nsmr); 179a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_44M_to_1G_nsmr", 180a51f06e1SSelvin Xavier (u64)rsrc_stats->r44M_to_1G_nsmr); 181a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_1G_to_4G_nsmr", 182a51f06e1SSelvin Xavier (u64)rsrc_stats->r1G_to_4G_nsmr); 183a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_nsmr_count_4G_to_32G", 184a51f06e1SSelvin Xavier (u64)rsrc_stats->nsmr_count_4G_to_32G); 185a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_32G_to_64G_nsmr", 186a51f06e1SSelvin Xavier (u64)rsrc_stats->r32G_to_64G_nsmr); 187a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_64G_to_128G_nsmr", 188a51f06e1SSelvin Xavier (u64)rsrc_stats->r64G_to_128G_nsmr); 189a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_128G_to_higher_nsmr", 190a51f06e1SSelvin Xavier (u64)rsrc_stats->r128G_to_higher_nsmr); 191a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_embedded_nsmr", 192a51f06e1SSelvin Xavier (u64)rsrc_stats->embedded_nsmr); 193a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_frmr", 194a51f06e1SSelvin Xavier (u64)rsrc_stats->frmr); 195a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_prefetch_qps", 196a51f06e1SSelvin Xavier (u64)rsrc_stats->prefetch_qps); 197a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_ondemand_qps", 198a51f06e1SSelvin Xavier (u64)rsrc_stats->ondemand_qps); 199a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_phy_mr", 200a51f06e1SSelvin Xavier (u64)rsrc_stats->phy_mr); 201a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_mw", 202a51f06e1SSelvin Xavier (u64)rsrc_stats->mw); 203a51f06e1SSelvin Xavier return stats; 204a51f06e1SSelvin Xavier } 205a51f06e1SSelvin Xavier 206a51f06e1SSelvin Xavier static char *ocrdma_rx_stats(struct ocrdma_dev *dev) 207a51f06e1SSelvin Xavier { 208a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 209a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 210a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 211a51f06e1SSelvin Xavier struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats; 212a51f06e1SSelvin Xavier 213a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 214a51f06e1SSelvin Xavier 215a51f06e1SSelvin Xavier pcur = stats; 216a51f06e1SSelvin Xavier pcur += ocrdma_add_stat 217a51f06e1SSelvin Xavier (stats, pcur, "roce_frame_bytes", 218a51f06e1SSelvin Xavier convert_to_64bit(rx_stats->roce_frame_bytes_lo, 219a51f06e1SSelvin Xavier rx_stats->roce_frame_bytes_hi)); 220a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "roce_frame_icrc_drops", 221a51f06e1SSelvin Xavier (u64)rx_stats->roce_frame_icrc_drops); 222a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "roce_frame_payload_len_drops", 223a51f06e1SSelvin Xavier (u64)rx_stats->roce_frame_payload_len_drops); 224a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "ud_drops", 225a51f06e1SSelvin Xavier (u64)rx_stats->ud_drops); 226a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "qp1_drops", 227a51f06e1SSelvin Xavier (u64)rx_stats->qp1_drops); 228a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "psn_error_request_packets", 229a51f06e1SSelvin Xavier (u64)rx_stats->psn_error_request_packets); 230a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "psn_error_resp_packets", 231a51f06e1SSelvin Xavier (u64)rx_stats->psn_error_resp_packets); 232a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rnr_nak_timeouts", 233a51f06e1SSelvin Xavier (u64)rx_stats->rnr_nak_timeouts); 234a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rnr_nak_receives", 235a51f06e1SSelvin Xavier (u64)rx_stats->rnr_nak_receives); 236a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "roce_frame_rxmt_drops", 237a51f06e1SSelvin Xavier (u64)rx_stats->roce_frame_rxmt_drops); 238a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "nak_count_psn_sequence_errors", 239a51f06e1SSelvin Xavier (u64)rx_stats->nak_count_psn_sequence_errors); 240a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rc_drop_count_lookup_errors", 241a51f06e1SSelvin Xavier (u64)rx_stats->rc_drop_count_lookup_errors); 242a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rq_rnr_naks", 243a51f06e1SSelvin Xavier (u64)rx_stats->rq_rnr_naks); 244a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "srq_rnr_naks", 245a51f06e1SSelvin Xavier (u64)rx_stats->srq_rnr_naks); 246a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "roce_frames", 247a51f06e1SSelvin Xavier convert_to_64bit(rx_stats->roce_frames_lo, 248a51f06e1SSelvin Xavier rx_stats->roce_frames_hi)); 249a51f06e1SSelvin Xavier 250a51f06e1SSelvin Xavier return stats; 251a51f06e1SSelvin Xavier } 252a51f06e1SSelvin Xavier 253cad1fbb0SMitesh Ahuja static u64 ocrdma_sysfs_rcv_pkts(struct ocrdma_dev *dev) 254cad1fbb0SMitesh Ahuja { 255cad1fbb0SMitesh Ahuja struct ocrdma_rdma_stats_resp *rdma_stats = 256cad1fbb0SMitesh Ahuja (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 257cad1fbb0SMitesh Ahuja struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats; 258cad1fbb0SMitesh Ahuja 259cad1fbb0SMitesh Ahuja return convert_to_64bit(rx_stats->roce_frames_lo, 260cad1fbb0SMitesh Ahuja rx_stats->roce_frames_hi) + (u64)rx_stats->roce_frame_icrc_drops 261cad1fbb0SMitesh Ahuja + (u64)rx_stats->roce_frame_payload_len_drops; 262cad1fbb0SMitesh Ahuja } 263cad1fbb0SMitesh Ahuja 264cad1fbb0SMitesh Ahuja static u64 ocrdma_sysfs_rcv_data(struct ocrdma_dev *dev) 265cad1fbb0SMitesh Ahuja { 266cad1fbb0SMitesh Ahuja struct ocrdma_rdma_stats_resp *rdma_stats = 267cad1fbb0SMitesh Ahuja (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 268cad1fbb0SMitesh Ahuja struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats; 269cad1fbb0SMitesh Ahuja 270cad1fbb0SMitesh Ahuja return (convert_to_64bit(rx_stats->roce_frame_bytes_lo, 271cad1fbb0SMitesh Ahuja rx_stats->roce_frame_bytes_hi))/4; 272cad1fbb0SMitesh Ahuja } 273cad1fbb0SMitesh Ahuja 274a51f06e1SSelvin Xavier static char *ocrdma_tx_stats(struct ocrdma_dev *dev) 275a51f06e1SSelvin Xavier { 276a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 277a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 278a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 279a51f06e1SSelvin Xavier struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats; 280a51f06e1SSelvin Xavier 281a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 282a51f06e1SSelvin Xavier 283a51f06e1SSelvin Xavier pcur = stats; 284a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "send_pkts", 285a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->send_pkts_lo, 286a51f06e1SSelvin Xavier tx_stats->send_pkts_hi)); 287a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "write_pkts", 288a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->write_pkts_lo, 289a51f06e1SSelvin Xavier tx_stats->write_pkts_hi)); 290a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_pkts", 291a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->read_pkts_lo, 292a51f06e1SSelvin Xavier tx_stats->read_pkts_hi)); 293a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_rsp_pkts", 294a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->read_rsp_pkts_lo, 295a51f06e1SSelvin Xavier tx_stats->read_rsp_pkts_hi)); 296a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "ack_pkts", 297a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->ack_pkts_lo, 298a51f06e1SSelvin Xavier tx_stats->ack_pkts_hi)); 299a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "send_bytes", 300a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->send_bytes_lo, 301a51f06e1SSelvin Xavier tx_stats->send_bytes_hi)); 302a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "write_bytes", 303a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->write_bytes_lo, 304a51f06e1SSelvin Xavier tx_stats->write_bytes_hi)); 305a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_req_bytes", 306a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->read_req_bytes_lo, 307a51f06e1SSelvin Xavier tx_stats->read_req_bytes_hi)); 308a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_rsp_bytes", 309a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->read_rsp_bytes_lo, 310a51f06e1SSelvin Xavier tx_stats->read_rsp_bytes_hi)); 311a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "ack_timeouts", 312a51f06e1SSelvin Xavier (u64)tx_stats->ack_timeouts); 313a51f06e1SSelvin Xavier 314a51f06e1SSelvin Xavier return stats; 315a51f06e1SSelvin Xavier } 316a51f06e1SSelvin Xavier 317cad1fbb0SMitesh Ahuja static u64 ocrdma_sysfs_xmit_pkts(struct ocrdma_dev *dev) 318cad1fbb0SMitesh Ahuja { 319cad1fbb0SMitesh Ahuja struct ocrdma_rdma_stats_resp *rdma_stats = 320cad1fbb0SMitesh Ahuja (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 321cad1fbb0SMitesh Ahuja struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats; 322cad1fbb0SMitesh Ahuja 323cad1fbb0SMitesh Ahuja return (convert_to_64bit(tx_stats->send_pkts_lo, 324cad1fbb0SMitesh Ahuja tx_stats->send_pkts_hi) + 325cad1fbb0SMitesh Ahuja convert_to_64bit(tx_stats->write_pkts_lo, tx_stats->write_pkts_hi) + 326cad1fbb0SMitesh Ahuja convert_to_64bit(tx_stats->read_pkts_lo, tx_stats->read_pkts_hi) + 327cad1fbb0SMitesh Ahuja convert_to_64bit(tx_stats->read_rsp_pkts_lo, 328cad1fbb0SMitesh Ahuja tx_stats->read_rsp_pkts_hi) + 329cad1fbb0SMitesh Ahuja convert_to_64bit(tx_stats->ack_pkts_lo, tx_stats->ack_pkts_hi)); 330cad1fbb0SMitesh Ahuja } 331cad1fbb0SMitesh Ahuja 332cad1fbb0SMitesh Ahuja static u64 ocrdma_sysfs_xmit_data(struct ocrdma_dev *dev) 333cad1fbb0SMitesh Ahuja { 334cad1fbb0SMitesh Ahuja struct ocrdma_rdma_stats_resp *rdma_stats = 335cad1fbb0SMitesh Ahuja (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 336cad1fbb0SMitesh Ahuja struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats; 337cad1fbb0SMitesh Ahuja 338cad1fbb0SMitesh Ahuja return (convert_to_64bit(tx_stats->send_bytes_lo, 339cad1fbb0SMitesh Ahuja tx_stats->send_bytes_hi) + 340cad1fbb0SMitesh Ahuja convert_to_64bit(tx_stats->write_bytes_lo, 341cad1fbb0SMitesh Ahuja tx_stats->write_bytes_hi) + 342cad1fbb0SMitesh Ahuja convert_to_64bit(tx_stats->read_req_bytes_lo, 343cad1fbb0SMitesh Ahuja tx_stats->read_req_bytes_hi) + 344cad1fbb0SMitesh Ahuja convert_to_64bit(tx_stats->read_rsp_bytes_lo, 345cad1fbb0SMitesh Ahuja tx_stats->read_rsp_bytes_hi))/4; 346cad1fbb0SMitesh Ahuja } 347cad1fbb0SMitesh Ahuja 348a51f06e1SSelvin Xavier static char *ocrdma_wqe_stats(struct ocrdma_dev *dev) 349a51f06e1SSelvin Xavier { 350a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 351a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 352a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 353a51f06e1SSelvin Xavier struct ocrdma_wqe_stats *wqe_stats = &rdma_stats->wqe_stats; 354a51f06e1SSelvin Xavier 355a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 356a51f06e1SSelvin Xavier 357a51f06e1SSelvin Xavier pcur = stats; 358a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "large_send_rc_wqes", 359a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->large_send_rc_wqes_lo, 360a51f06e1SSelvin Xavier wqe_stats->large_send_rc_wqes_hi)); 361a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "large_write_rc_wqes", 362a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->large_write_rc_wqes_lo, 363a51f06e1SSelvin Xavier wqe_stats->large_write_rc_wqes_hi)); 364a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_wqes", 365a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->read_wqes_lo, 366a51f06e1SSelvin Xavier wqe_stats->read_wqes_hi)); 367a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "frmr_wqes", 368a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->frmr_wqes_lo, 369a51f06e1SSelvin Xavier wqe_stats->frmr_wqes_hi)); 370a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "mw_bind_wqes", 371a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->mw_bind_wqes_lo, 372a51f06e1SSelvin Xavier wqe_stats->mw_bind_wqes_hi)); 373a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "invalidate_wqes", 374a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->invalidate_wqes_lo, 375a51f06e1SSelvin Xavier wqe_stats->invalidate_wqes_hi)); 376a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "dpp_wqe_drops", 377a51f06e1SSelvin Xavier (u64)wqe_stats->dpp_wqe_drops); 378a51f06e1SSelvin Xavier return stats; 379a51f06e1SSelvin Xavier } 380a51f06e1SSelvin Xavier 381a51f06e1SSelvin Xavier static char *ocrdma_db_errstats(struct ocrdma_dev *dev) 382a51f06e1SSelvin Xavier { 383a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 384a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 385a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 386a51f06e1SSelvin Xavier struct ocrdma_db_err_stats *db_err_stats = &rdma_stats->db_err_stats; 387a51f06e1SSelvin Xavier 388a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 389a51f06e1SSelvin Xavier 390a51f06e1SSelvin Xavier pcur = stats; 391a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "sq_doorbell_errors", 392a51f06e1SSelvin Xavier (u64)db_err_stats->sq_doorbell_errors); 393a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "cq_doorbell_errors", 394a51f06e1SSelvin Xavier (u64)db_err_stats->cq_doorbell_errors); 395a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rq_srq_doorbell_errors", 396a51f06e1SSelvin Xavier (u64)db_err_stats->rq_srq_doorbell_errors); 397a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "cq_overflow_errors", 398a51f06e1SSelvin Xavier (u64)db_err_stats->cq_overflow_errors); 399a51f06e1SSelvin Xavier return stats; 400a51f06e1SSelvin Xavier } 401a51f06e1SSelvin Xavier 402a51f06e1SSelvin Xavier static char *ocrdma_rxqp_errstats(struct ocrdma_dev *dev) 403a51f06e1SSelvin Xavier { 404a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 405a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 406a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 407a51f06e1SSelvin Xavier struct ocrdma_rx_qp_err_stats *rx_qp_err_stats = 408a51f06e1SSelvin Xavier &rdma_stats->rx_qp_err_stats; 409a51f06e1SSelvin Xavier 410a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 411a51f06e1SSelvin Xavier 412a51f06e1SSelvin Xavier pcur = stats; 413a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "nak_invalid_requst_errors", 414a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->nak_invalid_requst_errors); 415a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "nak_remote_operation_errors", 416a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->nak_remote_operation_errors); 417a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "nak_count_remote_access_errors", 418a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->nak_count_remote_access_errors); 419a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_length_errors", 420a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->local_length_errors); 421a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_protection_errors", 422a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->local_protection_errors); 423a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_qp_operation_errors", 424a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->local_qp_operation_errors); 425a51f06e1SSelvin Xavier return stats; 426a51f06e1SSelvin Xavier } 427a51f06e1SSelvin Xavier 428a51f06e1SSelvin Xavier static char *ocrdma_txqp_errstats(struct ocrdma_dev *dev) 429a51f06e1SSelvin Xavier { 430a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 431a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 432a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 433a51f06e1SSelvin Xavier struct ocrdma_tx_qp_err_stats *tx_qp_err_stats = 434a51f06e1SSelvin Xavier &rdma_stats->tx_qp_err_stats; 435a51f06e1SSelvin Xavier 436a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 437a51f06e1SSelvin Xavier 438a51f06e1SSelvin Xavier pcur = stats; 439a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_length_errors", 440a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->local_length_errors); 441a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_protection_errors", 442a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->local_protection_errors); 443a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_qp_operation_errors", 444a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->local_qp_operation_errors); 445a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "retry_count_exceeded_errors", 446a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->retry_count_exceeded_errors); 447a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rnr_retry_count_exceeded_errors", 448a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->rnr_retry_count_exceeded_errors); 449a51f06e1SSelvin Xavier return stats; 450a51f06e1SSelvin Xavier } 451a51f06e1SSelvin Xavier 452a51f06e1SSelvin Xavier static char *ocrdma_tx_dbg_stats(struct ocrdma_dev *dev) 453a51f06e1SSelvin Xavier { 454a51f06e1SSelvin Xavier int i; 455a51f06e1SSelvin Xavier char *pstats = dev->stats_mem.debugfs_mem; 456a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 457a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 458a51f06e1SSelvin Xavier struct ocrdma_tx_dbg_stats *tx_dbg_stats = 459a51f06e1SSelvin Xavier &rdma_stats->tx_dbg_stats; 460a51f06e1SSelvin Xavier 461a51f06e1SSelvin Xavier memset(pstats, 0, (OCRDMA_MAX_DBGFS_MEM)); 462a51f06e1SSelvin Xavier 463a51f06e1SSelvin Xavier for (i = 0; i < 100; i++) 464a51f06e1SSelvin Xavier pstats += snprintf(pstats, 80, "DW[%d] = 0x%x\n", i, 465a51f06e1SSelvin Xavier tx_dbg_stats->data[i]); 466a51f06e1SSelvin Xavier 467a51f06e1SSelvin Xavier return dev->stats_mem.debugfs_mem; 468a51f06e1SSelvin Xavier } 469a51f06e1SSelvin Xavier 470a51f06e1SSelvin Xavier static char *ocrdma_rx_dbg_stats(struct ocrdma_dev *dev) 471a51f06e1SSelvin Xavier { 472a51f06e1SSelvin Xavier int i; 473a51f06e1SSelvin Xavier char *pstats = dev->stats_mem.debugfs_mem; 474a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 475a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 476a51f06e1SSelvin Xavier struct ocrdma_rx_dbg_stats *rx_dbg_stats = 477a51f06e1SSelvin Xavier &rdma_stats->rx_dbg_stats; 478a51f06e1SSelvin Xavier 479a51f06e1SSelvin Xavier memset(pstats, 0, (OCRDMA_MAX_DBGFS_MEM)); 480a51f06e1SSelvin Xavier 481a51f06e1SSelvin Xavier for (i = 0; i < 200; i++) 482a51f06e1SSelvin Xavier pstats += snprintf(pstats, 80, "DW[%d] = 0x%x\n", i, 483a51f06e1SSelvin Xavier rx_dbg_stats->data[i]); 484a51f06e1SSelvin Xavier 485a51f06e1SSelvin Xavier return dev->stats_mem.debugfs_mem; 486a51f06e1SSelvin Xavier } 487a51f06e1SSelvin Xavier 488a51f06e1SSelvin Xavier static void ocrdma_update_stats(struct ocrdma_dev *dev) 489a51f06e1SSelvin Xavier { 490a51f06e1SSelvin Xavier ulong now = jiffies, secs; 491a51f06e1SSelvin Xavier int status = 0; 4929ba1377dSMitesh Ahuja struct ocrdma_rdma_stats_resp *rdma_stats = 4939ba1377dSMitesh Ahuja (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 4949ba1377dSMitesh Ahuja struct ocrdma_rsrc_stats *rsrc_stats = &rdma_stats->act_rsrc_stats; 495a51f06e1SSelvin Xavier 496a51f06e1SSelvin Xavier secs = jiffies_to_msecs(now - dev->last_stats_time) / 1000U; 497a51f06e1SSelvin Xavier if (secs) { 498a51f06e1SSelvin Xavier /* update */ 499a51f06e1SSelvin Xavier status = ocrdma_mbx_rdma_stats(dev, false); 500a51f06e1SSelvin Xavier if (status) 501a51f06e1SSelvin Xavier pr_err("%s: stats mbox failed with status = %d\n", 502a51f06e1SSelvin Xavier __func__, status); 5039ba1377dSMitesh Ahuja /* Update PD counters from PD resource manager */ 5049ba1377dSMitesh Ahuja if (dev->pd_mgr->pd_prealloc_valid) { 5059ba1377dSMitesh Ahuja rsrc_stats->dpp_pds = dev->pd_mgr->pd_dpp_count; 5069ba1377dSMitesh Ahuja rsrc_stats->non_dpp_pds = dev->pd_mgr->pd_norm_count; 5079ba1377dSMitesh Ahuja /* Threshold stata*/ 5089ba1377dSMitesh Ahuja rsrc_stats = &rdma_stats->th_rsrc_stats; 5099ba1377dSMitesh Ahuja rsrc_stats->dpp_pds = dev->pd_mgr->pd_dpp_thrsh; 5109ba1377dSMitesh Ahuja rsrc_stats->non_dpp_pds = dev->pd_mgr->pd_norm_thrsh; 5119ba1377dSMitesh Ahuja } 512a51f06e1SSelvin Xavier dev->last_stats_time = jiffies; 513a51f06e1SSelvin Xavier } 514a51f06e1SSelvin Xavier } 515a51f06e1SSelvin Xavier 516cad1fbb0SMitesh Ahuja int ocrdma_pma_counters(struct ocrdma_dev *dev, 517cad1fbb0SMitesh Ahuja struct ib_mad *out_mad) 518cad1fbb0SMitesh Ahuja { 519cad1fbb0SMitesh Ahuja struct ib_pma_portcounters *pma_cnt; 520cad1fbb0SMitesh Ahuja 521cad1fbb0SMitesh Ahuja memset(out_mad->data, 0, sizeof out_mad->data); 522cad1fbb0SMitesh Ahuja pma_cnt = (void *)(out_mad->data + 40); 523cad1fbb0SMitesh Ahuja ocrdma_update_stats(dev); 524cad1fbb0SMitesh Ahuja 525cad1fbb0SMitesh Ahuja pma_cnt->port_xmit_data = cpu_to_be32(ocrdma_sysfs_xmit_data(dev)); 526cad1fbb0SMitesh Ahuja pma_cnt->port_rcv_data = cpu_to_be32(ocrdma_sysfs_rcv_data(dev)); 527cad1fbb0SMitesh Ahuja pma_cnt->port_xmit_packets = cpu_to_be32(ocrdma_sysfs_xmit_pkts(dev)); 528cad1fbb0SMitesh Ahuja pma_cnt->port_rcv_packets = cpu_to_be32(ocrdma_sysfs_rcv_pkts(dev)); 529cad1fbb0SMitesh Ahuja return 0; 530cad1fbb0SMitesh Ahuja } 531cad1fbb0SMitesh Ahuja 532a51f06e1SSelvin Xavier static ssize_t ocrdma_dbgfs_ops_read(struct file *filp, char __user *buffer, 533a51f06e1SSelvin Xavier size_t usr_buf_len, loff_t *ppos) 534a51f06e1SSelvin Xavier { 535a51f06e1SSelvin Xavier struct ocrdma_stats *pstats = filp->private_data; 536a51f06e1SSelvin Xavier struct ocrdma_dev *dev = pstats->dev; 537a51f06e1SSelvin Xavier ssize_t status = 0; 538a51f06e1SSelvin Xavier char *data = NULL; 539a51f06e1SSelvin Xavier 540a51f06e1SSelvin Xavier /* No partial reads */ 541a51f06e1SSelvin Xavier if (*ppos != 0) 542a51f06e1SSelvin Xavier return 0; 543a51f06e1SSelvin Xavier 544a51f06e1SSelvin Xavier mutex_lock(&dev->stats_lock); 545a51f06e1SSelvin Xavier 546a51f06e1SSelvin Xavier ocrdma_update_stats(dev); 547a51f06e1SSelvin Xavier 548a51f06e1SSelvin Xavier switch (pstats->type) { 549a51f06e1SSelvin Xavier case OCRDMA_RSRC_STATS: 550a51f06e1SSelvin Xavier data = ocrdma_resource_stats(dev); 551a51f06e1SSelvin Xavier break; 552a51f06e1SSelvin Xavier case OCRDMA_RXSTATS: 553a51f06e1SSelvin Xavier data = ocrdma_rx_stats(dev); 554a51f06e1SSelvin Xavier break; 555a51f06e1SSelvin Xavier case OCRDMA_WQESTATS: 556a51f06e1SSelvin Xavier data = ocrdma_wqe_stats(dev); 557a51f06e1SSelvin Xavier break; 558a51f06e1SSelvin Xavier case OCRDMA_TXSTATS: 559a51f06e1SSelvin Xavier data = ocrdma_tx_stats(dev); 560a51f06e1SSelvin Xavier break; 561a51f06e1SSelvin Xavier case OCRDMA_DB_ERRSTATS: 562a51f06e1SSelvin Xavier data = ocrdma_db_errstats(dev); 563a51f06e1SSelvin Xavier break; 564a51f06e1SSelvin Xavier case OCRDMA_RXQP_ERRSTATS: 565a51f06e1SSelvin Xavier data = ocrdma_rxqp_errstats(dev); 566a51f06e1SSelvin Xavier break; 567a51f06e1SSelvin Xavier case OCRDMA_TXQP_ERRSTATS: 568a51f06e1SSelvin Xavier data = ocrdma_txqp_errstats(dev); 569a51f06e1SSelvin Xavier break; 570a51f06e1SSelvin Xavier case OCRDMA_TX_DBG_STATS: 571a51f06e1SSelvin Xavier data = ocrdma_tx_dbg_stats(dev); 572a51f06e1SSelvin Xavier break; 573a51f06e1SSelvin Xavier case OCRDMA_RX_DBG_STATS: 574a51f06e1SSelvin Xavier data = ocrdma_rx_dbg_stats(dev); 575a51f06e1SSelvin Xavier break; 576a51f06e1SSelvin Xavier 577a51f06e1SSelvin Xavier default: 578a51f06e1SSelvin Xavier status = -EFAULT; 579a51f06e1SSelvin Xavier goto exit; 580a51f06e1SSelvin Xavier } 581a51f06e1SSelvin Xavier 582a51f06e1SSelvin Xavier if (usr_buf_len < strlen(data)) { 583a51f06e1SSelvin Xavier status = -ENOSPC; 584a51f06e1SSelvin Xavier goto exit; 585a51f06e1SSelvin Xavier } 586a51f06e1SSelvin Xavier 587a51f06e1SSelvin Xavier status = simple_read_from_buffer(buffer, usr_buf_len, ppos, data, 588a51f06e1SSelvin Xavier strlen(data)); 589a51f06e1SSelvin Xavier exit: 590a51f06e1SSelvin Xavier mutex_unlock(&dev->stats_lock); 591a51f06e1SSelvin Xavier return status; 592a51f06e1SSelvin Xavier } 593a51f06e1SSelvin Xavier 594a51f06e1SSelvin Xavier static const struct file_operations ocrdma_dbg_ops = { 595a51f06e1SSelvin Xavier .owner = THIS_MODULE, 5960cc65dd6SDuan Jiong .open = simple_open, 597a51f06e1SSelvin Xavier .read = ocrdma_dbgfs_ops_read, 598a51f06e1SSelvin Xavier }; 599a51f06e1SSelvin Xavier 600a51f06e1SSelvin Xavier void ocrdma_add_port_stats(struct ocrdma_dev *dev) 601a51f06e1SSelvin Xavier { 602a51f06e1SSelvin Xavier if (!ocrdma_dbgfs_dir) 603a51f06e1SSelvin Xavier return; 604a51f06e1SSelvin Xavier 605a51f06e1SSelvin Xavier /* Create post stats base dir */ 606a51f06e1SSelvin Xavier dev->dir = debugfs_create_dir(dev->ibdev.name, ocrdma_dbgfs_dir); 607a51f06e1SSelvin Xavier if (!dev->dir) 608a51f06e1SSelvin Xavier goto err; 609a51f06e1SSelvin Xavier 610a51f06e1SSelvin Xavier dev->rsrc_stats.type = OCRDMA_RSRC_STATS; 611a51f06e1SSelvin Xavier dev->rsrc_stats.dev = dev; 612a51f06e1SSelvin Xavier if (!debugfs_create_file("resource_stats", S_IRUSR, dev->dir, 613a51f06e1SSelvin Xavier &dev->rsrc_stats, &ocrdma_dbg_ops)) 614a51f06e1SSelvin Xavier goto err; 615a51f06e1SSelvin Xavier 616a51f06e1SSelvin Xavier dev->rx_stats.type = OCRDMA_RXSTATS; 617a51f06e1SSelvin Xavier dev->rx_stats.dev = dev; 618a51f06e1SSelvin Xavier if (!debugfs_create_file("rx_stats", S_IRUSR, dev->dir, 619a51f06e1SSelvin Xavier &dev->rx_stats, &ocrdma_dbg_ops)) 620a51f06e1SSelvin Xavier goto err; 621a51f06e1SSelvin Xavier 622a51f06e1SSelvin Xavier dev->wqe_stats.type = OCRDMA_WQESTATS; 623a51f06e1SSelvin Xavier dev->wqe_stats.dev = dev; 624a51f06e1SSelvin Xavier if (!debugfs_create_file("wqe_stats", S_IRUSR, dev->dir, 625a51f06e1SSelvin Xavier &dev->wqe_stats, &ocrdma_dbg_ops)) 626a51f06e1SSelvin Xavier goto err; 627a51f06e1SSelvin Xavier 628a51f06e1SSelvin Xavier dev->tx_stats.type = OCRDMA_TXSTATS; 629a51f06e1SSelvin Xavier dev->tx_stats.dev = dev; 630a51f06e1SSelvin Xavier if (!debugfs_create_file("tx_stats", S_IRUSR, dev->dir, 631a51f06e1SSelvin Xavier &dev->tx_stats, &ocrdma_dbg_ops)) 632a51f06e1SSelvin Xavier goto err; 633a51f06e1SSelvin Xavier 634a51f06e1SSelvin Xavier dev->db_err_stats.type = OCRDMA_DB_ERRSTATS; 635a51f06e1SSelvin Xavier dev->db_err_stats.dev = dev; 636a51f06e1SSelvin Xavier if (!debugfs_create_file("db_err_stats", S_IRUSR, dev->dir, 637a51f06e1SSelvin Xavier &dev->db_err_stats, &ocrdma_dbg_ops)) 638a51f06e1SSelvin Xavier goto err; 639a51f06e1SSelvin Xavier 640a51f06e1SSelvin Xavier 641a51f06e1SSelvin Xavier dev->tx_qp_err_stats.type = OCRDMA_TXQP_ERRSTATS; 642a51f06e1SSelvin Xavier dev->tx_qp_err_stats.dev = dev; 643a51f06e1SSelvin Xavier if (!debugfs_create_file("tx_qp_err_stats", S_IRUSR, dev->dir, 644a51f06e1SSelvin Xavier &dev->tx_qp_err_stats, &ocrdma_dbg_ops)) 645a51f06e1SSelvin Xavier goto err; 646a51f06e1SSelvin Xavier 647a51f06e1SSelvin Xavier dev->rx_qp_err_stats.type = OCRDMA_RXQP_ERRSTATS; 648a51f06e1SSelvin Xavier dev->rx_qp_err_stats.dev = dev; 649a51f06e1SSelvin Xavier if (!debugfs_create_file("rx_qp_err_stats", S_IRUSR, dev->dir, 650a51f06e1SSelvin Xavier &dev->rx_qp_err_stats, &ocrdma_dbg_ops)) 651a51f06e1SSelvin Xavier goto err; 652a51f06e1SSelvin Xavier 653a51f06e1SSelvin Xavier 654a51f06e1SSelvin Xavier dev->tx_dbg_stats.type = OCRDMA_TX_DBG_STATS; 655a51f06e1SSelvin Xavier dev->tx_dbg_stats.dev = dev; 656a51f06e1SSelvin Xavier if (!debugfs_create_file("tx_dbg_stats", S_IRUSR, dev->dir, 657a51f06e1SSelvin Xavier &dev->tx_dbg_stats, &ocrdma_dbg_ops)) 658a51f06e1SSelvin Xavier goto err; 659a51f06e1SSelvin Xavier 660a51f06e1SSelvin Xavier dev->rx_dbg_stats.type = OCRDMA_RX_DBG_STATS; 661a51f06e1SSelvin Xavier dev->rx_dbg_stats.dev = dev; 662a51f06e1SSelvin Xavier if (!debugfs_create_file("rx_dbg_stats", S_IRUSR, dev->dir, 663a51f06e1SSelvin Xavier &dev->rx_dbg_stats, &ocrdma_dbg_ops)) 664a51f06e1SSelvin Xavier goto err; 665a51f06e1SSelvin Xavier 666a51f06e1SSelvin Xavier /* Now create dma_mem for stats mbx command */ 667a51f06e1SSelvin Xavier if (!ocrdma_alloc_stats_mem(dev)) 668a51f06e1SSelvin Xavier goto err; 669a51f06e1SSelvin Xavier 670a51f06e1SSelvin Xavier mutex_init(&dev->stats_lock); 671a51f06e1SSelvin Xavier 672a51f06e1SSelvin Xavier return; 673a51f06e1SSelvin Xavier err: 674a51f06e1SSelvin Xavier ocrdma_release_stats_mem(dev); 675a51f06e1SSelvin Xavier debugfs_remove_recursive(dev->dir); 676a51f06e1SSelvin Xavier dev->dir = NULL; 677a51f06e1SSelvin Xavier } 678a51f06e1SSelvin Xavier 679a51f06e1SSelvin Xavier void ocrdma_rem_port_stats(struct ocrdma_dev *dev) 680a51f06e1SSelvin Xavier { 681a51f06e1SSelvin Xavier if (!dev->dir) 682a51f06e1SSelvin Xavier return; 683a51f06e1SSelvin Xavier mutex_destroy(&dev->stats_lock); 684a51f06e1SSelvin Xavier ocrdma_release_stats_mem(dev); 685a51f06e1SSelvin Xavier debugfs_remove(dev->dir); 686a51f06e1SSelvin Xavier } 687a51f06e1SSelvin Xavier 688a51f06e1SSelvin Xavier void ocrdma_init_debugfs(void) 689a51f06e1SSelvin Xavier { 690a51f06e1SSelvin Xavier /* Create base dir in debugfs root dir */ 691a51f06e1SSelvin Xavier ocrdma_dbgfs_dir = debugfs_create_dir("ocrdma", NULL); 692a51f06e1SSelvin Xavier } 693a51f06e1SSelvin Xavier 694a51f06e1SSelvin Xavier void ocrdma_rem_debugfs(void) 695a51f06e1SSelvin Xavier { 696a51f06e1SSelvin Xavier debugfs_remove_recursive(ocrdma_dbgfs_dir); 697a51f06e1SSelvin Xavier } 698