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> 29a51f06e1SSelvin Xavier #include "ocrdma_stats.h" 30a51f06e1SSelvin Xavier 31a51f06e1SSelvin Xavier static struct dentry *ocrdma_dbgfs_dir; 32a51f06e1SSelvin Xavier 33a51f06e1SSelvin Xavier static int ocrdma_add_stat(char *start, char *pcur, 34a51f06e1SSelvin Xavier char *name, u64 count) 35a51f06e1SSelvin Xavier { 36a51f06e1SSelvin Xavier char buff[128] = {0}; 37a51f06e1SSelvin Xavier int cpy_len = 0; 38a51f06e1SSelvin Xavier 39a51f06e1SSelvin Xavier snprintf(buff, 128, "%s: %llu\n", name, count); 40a51f06e1SSelvin Xavier cpy_len = strlen(buff); 41a51f06e1SSelvin Xavier 42a51f06e1SSelvin Xavier if (pcur + cpy_len > start + OCRDMA_MAX_DBGFS_MEM) { 43a51f06e1SSelvin Xavier pr_err("%s: No space in stats buff\n", __func__); 44a51f06e1SSelvin Xavier return 0; 45a51f06e1SSelvin Xavier } 46a51f06e1SSelvin Xavier 47a51f06e1SSelvin Xavier memcpy(pcur, buff, cpy_len); 48a51f06e1SSelvin Xavier return cpy_len; 49a51f06e1SSelvin Xavier } 50a51f06e1SSelvin Xavier 51a51f06e1SSelvin Xavier static bool ocrdma_alloc_stats_mem(struct ocrdma_dev *dev) 52a51f06e1SSelvin Xavier { 53a51f06e1SSelvin Xavier struct stats_mem *mem = &dev->stats_mem; 54a51f06e1SSelvin Xavier 55a51f06e1SSelvin Xavier /* Alloc mbox command mem*/ 56a51f06e1SSelvin Xavier mem->size = max_t(u32, sizeof(struct ocrdma_rdma_stats_req), 57a51f06e1SSelvin Xavier sizeof(struct ocrdma_rdma_stats_resp)); 58a51f06e1SSelvin Xavier 59a51f06e1SSelvin Xavier mem->va = dma_alloc_coherent(&dev->nic_info.pdev->dev, mem->size, 60a51f06e1SSelvin Xavier &mem->pa, GFP_KERNEL); 61a51f06e1SSelvin Xavier if (!mem->va) { 62a51f06e1SSelvin Xavier pr_err("%s: stats mbox allocation failed\n", __func__); 63a51f06e1SSelvin Xavier return false; 64a51f06e1SSelvin Xavier } 65a51f06e1SSelvin Xavier 66a51f06e1SSelvin Xavier memset(mem->va, 0, mem->size); 67a51f06e1SSelvin Xavier 68a51f06e1SSelvin Xavier /* Alloc debugfs mem */ 69a51f06e1SSelvin Xavier mem->debugfs_mem = kzalloc(OCRDMA_MAX_DBGFS_MEM, GFP_KERNEL); 70a51f06e1SSelvin Xavier if (!mem->debugfs_mem) { 71a51f06e1SSelvin Xavier pr_err("%s: stats debugfs mem allocation failed\n", __func__); 72a51f06e1SSelvin Xavier return false; 73a51f06e1SSelvin Xavier } 74a51f06e1SSelvin Xavier 75a51f06e1SSelvin Xavier return true; 76a51f06e1SSelvin Xavier } 77a51f06e1SSelvin Xavier 78a51f06e1SSelvin Xavier static void ocrdma_release_stats_mem(struct ocrdma_dev *dev) 79a51f06e1SSelvin Xavier { 80a51f06e1SSelvin Xavier struct stats_mem *mem = &dev->stats_mem; 81a51f06e1SSelvin Xavier 82a51f06e1SSelvin Xavier if (mem->va) 83a51f06e1SSelvin Xavier dma_free_coherent(&dev->nic_info.pdev->dev, mem->size, 84a51f06e1SSelvin Xavier mem->va, mem->pa); 85a51f06e1SSelvin Xavier kfree(mem->debugfs_mem); 86a51f06e1SSelvin Xavier } 87a51f06e1SSelvin Xavier 88a51f06e1SSelvin Xavier static char *ocrdma_resource_stats(struct ocrdma_dev *dev) 89a51f06e1SSelvin Xavier { 90a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 91a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 92a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 93a51f06e1SSelvin Xavier struct ocrdma_rsrc_stats *rsrc_stats = &rdma_stats->act_rsrc_stats; 94a51f06e1SSelvin Xavier 95a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 96a51f06e1SSelvin Xavier 97a51f06e1SSelvin Xavier pcur = stats; 98a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_dpp_pds", 99a51f06e1SSelvin Xavier (u64)rsrc_stats->dpp_pds); 100a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_non_dpp_pds", 101a51f06e1SSelvin Xavier (u64)rsrc_stats->non_dpp_pds); 102a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_rc_dpp_qps", 103a51f06e1SSelvin Xavier (u64)rsrc_stats->rc_dpp_qps); 104a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_uc_dpp_qps", 105a51f06e1SSelvin Xavier (u64)rsrc_stats->uc_dpp_qps); 106a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_ud_dpp_qps", 107a51f06e1SSelvin Xavier (u64)rsrc_stats->ud_dpp_qps); 108a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_rc_non_dpp_qps", 109a51f06e1SSelvin Xavier (u64)rsrc_stats->rc_non_dpp_qps); 110a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_uc_non_dpp_qps", 111a51f06e1SSelvin Xavier (u64)rsrc_stats->uc_non_dpp_qps); 112a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_ud_non_dpp_qps", 113a51f06e1SSelvin Xavier (u64)rsrc_stats->ud_non_dpp_qps); 114a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_srqs", 115a51f06e1SSelvin Xavier (u64)rsrc_stats->srqs); 116a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_rbqs", 117a51f06e1SSelvin Xavier (u64)rsrc_stats->rbqs); 118a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_64K_nsmr", 119a51f06e1SSelvin Xavier (u64)rsrc_stats->r64K_nsmr); 120a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_64K_to_2M_nsmr", 121a51f06e1SSelvin Xavier (u64)rsrc_stats->r64K_to_2M_nsmr); 122a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_2M_to_44M_nsmr", 123a51f06e1SSelvin Xavier (u64)rsrc_stats->r2M_to_44M_nsmr); 124a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_44M_to_1G_nsmr", 125a51f06e1SSelvin Xavier (u64)rsrc_stats->r44M_to_1G_nsmr); 126a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_1G_to_4G_nsmr", 127a51f06e1SSelvin Xavier (u64)rsrc_stats->r1G_to_4G_nsmr); 128a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_nsmr_count_4G_to_32G", 129a51f06e1SSelvin Xavier (u64)rsrc_stats->nsmr_count_4G_to_32G); 130a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_32G_to_64G_nsmr", 131a51f06e1SSelvin Xavier (u64)rsrc_stats->r32G_to_64G_nsmr); 132a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_64G_to_128G_nsmr", 133a51f06e1SSelvin Xavier (u64)rsrc_stats->r64G_to_128G_nsmr); 134a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_128G_to_higher_nsmr", 135a51f06e1SSelvin Xavier (u64)rsrc_stats->r128G_to_higher_nsmr); 136a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_embedded_nsmr", 137a51f06e1SSelvin Xavier (u64)rsrc_stats->embedded_nsmr); 138a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_frmr", 139a51f06e1SSelvin Xavier (u64)rsrc_stats->frmr); 140a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_prefetch_qps", 141a51f06e1SSelvin Xavier (u64)rsrc_stats->prefetch_qps); 142a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_ondemand_qps", 143a51f06e1SSelvin Xavier (u64)rsrc_stats->ondemand_qps); 144a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_phy_mr", 145a51f06e1SSelvin Xavier (u64)rsrc_stats->phy_mr); 146a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "active_mw", 147a51f06e1SSelvin Xavier (u64)rsrc_stats->mw); 148a51f06e1SSelvin Xavier 149a51f06e1SSelvin Xavier /* Print the threshold stats */ 150a51f06e1SSelvin Xavier rsrc_stats = &rdma_stats->th_rsrc_stats; 151a51f06e1SSelvin Xavier 152a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_dpp_pds", 153a51f06e1SSelvin Xavier (u64)rsrc_stats->dpp_pds); 154a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_non_dpp_pds", 155a51f06e1SSelvin Xavier (u64)rsrc_stats->non_dpp_pds); 156a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_rc_dpp_qps", 157a51f06e1SSelvin Xavier (u64)rsrc_stats->rc_dpp_qps); 158a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_uc_dpp_qps", 159a51f06e1SSelvin Xavier (u64)rsrc_stats->uc_dpp_qps); 160a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_ud_dpp_qps", 161a51f06e1SSelvin Xavier (u64)rsrc_stats->ud_dpp_qps); 162a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_rc_non_dpp_qps", 163a51f06e1SSelvin Xavier (u64)rsrc_stats->rc_non_dpp_qps); 164a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_uc_non_dpp_qps", 165a51f06e1SSelvin Xavier (u64)rsrc_stats->uc_non_dpp_qps); 166a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_ud_non_dpp_qps", 167a51f06e1SSelvin Xavier (u64)rsrc_stats->ud_non_dpp_qps); 168a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_srqs", 169a51f06e1SSelvin Xavier (u64)rsrc_stats->srqs); 170a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_rbqs", 171a51f06e1SSelvin Xavier (u64)rsrc_stats->rbqs); 172a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_64K_nsmr", 173a51f06e1SSelvin Xavier (u64)rsrc_stats->r64K_nsmr); 174a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_64K_to_2M_nsmr", 175a51f06e1SSelvin Xavier (u64)rsrc_stats->r64K_to_2M_nsmr); 176a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_2M_to_44M_nsmr", 177a51f06e1SSelvin Xavier (u64)rsrc_stats->r2M_to_44M_nsmr); 178a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_44M_to_1G_nsmr", 179a51f06e1SSelvin Xavier (u64)rsrc_stats->r44M_to_1G_nsmr); 180a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_1G_to_4G_nsmr", 181a51f06e1SSelvin Xavier (u64)rsrc_stats->r1G_to_4G_nsmr); 182a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_nsmr_count_4G_to_32G", 183a51f06e1SSelvin Xavier (u64)rsrc_stats->nsmr_count_4G_to_32G); 184a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_32G_to_64G_nsmr", 185a51f06e1SSelvin Xavier (u64)rsrc_stats->r32G_to_64G_nsmr); 186a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_64G_to_128G_nsmr", 187a51f06e1SSelvin Xavier (u64)rsrc_stats->r64G_to_128G_nsmr); 188a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_128G_to_higher_nsmr", 189a51f06e1SSelvin Xavier (u64)rsrc_stats->r128G_to_higher_nsmr); 190a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_embedded_nsmr", 191a51f06e1SSelvin Xavier (u64)rsrc_stats->embedded_nsmr); 192a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_frmr", 193a51f06e1SSelvin Xavier (u64)rsrc_stats->frmr); 194a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_prefetch_qps", 195a51f06e1SSelvin Xavier (u64)rsrc_stats->prefetch_qps); 196a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_ondemand_qps", 197a51f06e1SSelvin Xavier (u64)rsrc_stats->ondemand_qps); 198a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_phy_mr", 199a51f06e1SSelvin Xavier (u64)rsrc_stats->phy_mr); 200a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "threshold_mw", 201a51f06e1SSelvin Xavier (u64)rsrc_stats->mw); 202a51f06e1SSelvin Xavier return stats; 203a51f06e1SSelvin Xavier } 204a51f06e1SSelvin Xavier 205a51f06e1SSelvin Xavier static char *ocrdma_rx_stats(struct ocrdma_dev *dev) 206a51f06e1SSelvin Xavier { 207a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 208a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 209a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 210a51f06e1SSelvin Xavier struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats; 211a51f06e1SSelvin Xavier 212a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 213a51f06e1SSelvin Xavier 214a51f06e1SSelvin Xavier pcur = stats; 215a51f06e1SSelvin Xavier pcur += ocrdma_add_stat 216a51f06e1SSelvin Xavier (stats, pcur, "roce_frame_bytes", 217a51f06e1SSelvin Xavier convert_to_64bit(rx_stats->roce_frame_bytes_lo, 218a51f06e1SSelvin Xavier rx_stats->roce_frame_bytes_hi)); 219a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "roce_frame_icrc_drops", 220a51f06e1SSelvin Xavier (u64)rx_stats->roce_frame_icrc_drops); 221a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "roce_frame_payload_len_drops", 222a51f06e1SSelvin Xavier (u64)rx_stats->roce_frame_payload_len_drops); 223a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "ud_drops", 224a51f06e1SSelvin Xavier (u64)rx_stats->ud_drops); 225a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "qp1_drops", 226a51f06e1SSelvin Xavier (u64)rx_stats->qp1_drops); 227a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "psn_error_request_packets", 228a51f06e1SSelvin Xavier (u64)rx_stats->psn_error_request_packets); 229a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "psn_error_resp_packets", 230a51f06e1SSelvin Xavier (u64)rx_stats->psn_error_resp_packets); 231a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rnr_nak_timeouts", 232a51f06e1SSelvin Xavier (u64)rx_stats->rnr_nak_timeouts); 233a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rnr_nak_receives", 234a51f06e1SSelvin Xavier (u64)rx_stats->rnr_nak_receives); 235a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "roce_frame_rxmt_drops", 236a51f06e1SSelvin Xavier (u64)rx_stats->roce_frame_rxmt_drops); 237a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "nak_count_psn_sequence_errors", 238a51f06e1SSelvin Xavier (u64)rx_stats->nak_count_psn_sequence_errors); 239a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rc_drop_count_lookup_errors", 240a51f06e1SSelvin Xavier (u64)rx_stats->rc_drop_count_lookup_errors); 241a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rq_rnr_naks", 242a51f06e1SSelvin Xavier (u64)rx_stats->rq_rnr_naks); 243a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "srq_rnr_naks", 244a51f06e1SSelvin Xavier (u64)rx_stats->srq_rnr_naks); 245a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "roce_frames", 246a51f06e1SSelvin Xavier convert_to_64bit(rx_stats->roce_frames_lo, 247a51f06e1SSelvin Xavier rx_stats->roce_frames_hi)); 248a51f06e1SSelvin Xavier 249a51f06e1SSelvin Xavier return stats; 250a51f06e1SSelvin Xavier } 251a51f06e1SSelvin Xavier 252a51f06e1SSelvin Xavier static char *ocrdma_tx_stats(struct ocrdma_dev *dev) 253a51f06e1SSelvin Xavier { 254a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 255a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 256a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 257a51f06e1SSelvin Xavier struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats; 258a51f06e1SSelvin Xavier 259a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 260a51f06e1SSelvin Xavier 261a51f06e1SSelvin Xavier pcur = stats; 262a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "send_pkts", 263a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->send_pkts_lo, 264a51f06e1SSelvin Xavier tx_stats->send_pkts_hi)); 265a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "write_pkts", 266a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->write_pkts_lo, 267a51f06e1SSelvin Xavier tx_stats->write_pkts_hi)); 268a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_pkts", 269a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->read_pkts_lo, 270a51f06e1SSelvin Xavier tx_stats->read_pkts_hi)); 271a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_rsp_pkts", 272a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->read_rsp_pkts_lo, 273a51f06e1SSelvin Xavier tx_stats->read_rsp_pkts_hi)); 274a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "ack_pkts", 275a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->ack_pkts_lo, 276a51f06e1SSelvin Xavier tx_stats->ack_pkts_hi)); 277a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "send_bytes", 278a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->send_bytes_lo, 279a51f06e1SSelvin Xavier tx_stats->send_bytes_hi)); 280a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "write_bytes", 281a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->write_bytes_lo, 282a51f06e1SSelvin Xavier tx_stats->write_bytes_hi)); 283a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_req_bytes", 284a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->read_req_bytes_lo, 285a51f06e1SSelvin Xavier tx_stats->read_req_bytes_hi)); 286a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_rsp_bytes", 287a51f06e1SSelvin Xavier convert_to_64bit(tx_stats->read_rsp_bytes_lo, 288a51f06e1SSelvin Xavier tx_stats->read_rsp_bytes_hi)); 289a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "ack_timeouts", 290a51f06e1SSelvin Xavier (u64)tx_stats->ack_timeouts); 291a51f06e1SSelvin Xavier 292a51f06e1SSelvin Xavier return stats; 293a51f06e1SSelvin Xavier } 294a51f06e1SSelvin Xavier 295a51f06e1SSelvin Xavier static char *ocrdma_wqe_stats(struct ocrdma_dev *dev) 296a51f06e1SSelvin Xavier { 297a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 298a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 299a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 300a51f06e1SSelvin Xavier struct ocrdma_wqe_stats *wqe_stats = &rdma_stats->wqe_stats; 301a51f06e1SSelvin Xavier 302a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 303a51f06e1SSelvin Xavier 304a51f06e1SSelvin Xavier pcur = stats; 305a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "large_send_rc_wqes", 306a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->large_send_rc_wqes_lo, 307a51f06e1SSelvin Xavier wqe_stats->large_send_rc_wqes_hi)); 308a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "large_write_rc_wqes", 309a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->large_write_rc_wqes_lo, 310a51f06e1SSelvin Xavier wqe_stats->large_write_rc_wqes_hi)); 311a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "read_wqes", 312a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->read_wqes_lo, 313a51f06e1SSelvin Xavier wqe_stats->read_wqes_hi)); 314a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "frmr_wqes", 315a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->frmr_wqes_lo, 316a51f06e1SSelvin Xavier wqe_stats->frmr_wqes_hi)); 317a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "mw_bind_wqes", 318a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->mw_bind_wqes_lo, 319a51f06e1SSelvin Xavier wqe_stats->mw_bind_wqes_hi)); 320a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "invalidate_wqes", 321a51f06e1SSelvin Xavier convert_to_64bit(wqe_stats->invalidate_wqes_lo, 322a51f06e1SSelvin Xavier wqe_stats->invalidate_wqes_hi)); 323a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "dpp_wqe_drops", 324a51f06e1SSelvin Xavier (u64)wqe_stats->dpp_wqe_drops); 325a51f06e1SSelvin Xavier return stats; 326a51f06e1SSelvin Xavier } 327a51f06e1SSelvin Xavier 328a51f06e1SSelvin Xavier static char *ocrdma_db_errstats(struct ocrdma_dev *dev) 329a51f06e1SSelvin Xavier { 330a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 331a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 332a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 333a51f06e1SSelvin Xavier struct ocrdma_db_err_stats *db_err_stats = &rdma_stats->db_err_stats; 334a51f06e1SSelvin Xavier 335a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 336a51f06e1SSelvin Xavier 337a51f06e1SSelvin Xavier pcur = stats; 338a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "sq_doorbell_errors", 339a51f06e1SSelvin Xavier (u64)db_err_stats->sq_doorbell_errors); 340a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "cq_doorbell_errors", 341a51f06e1SSelvin Xavier (u64)db_err_stats->cq_doorbell_errors); 342a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rq_srq_doorbell_errors", 343a51f06e1SSelvin Xavier (u64)db_err_stats->rq_srq_doorbell_errors); 344a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "cq_overflow_errors", 345a51f06e1SSelvin Xavier (u64)db_err_stats->cq_overflow_errors); 346a51f06e1SSelvin Xavier return stats; 347a51f06e1SSelvin Xavier } 348a51f06e1SSelvin Xavier 349a51f06e1SSelvin Xavier static char *ocrdma_rxqp_errstats(struct ocrdma_dev *dev) 350a51f06e1SSelvin Xavier { 351a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 352a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 353a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 354a51f06e1SSelvin Xavier struct ocrdma_rx_qp_err_stats *rx_qp_err_stats = 355a51f06e1SSelvin Xavier &rdma_stats->rx_qp_err_stats; 356a51f06e1SSelvin Xavier 357a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 358a51f06e1SSelvin Xavier 359a51f06e1SSelvin Xavier pcur = stats; 360a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "nak_invalid_requst_errors", 361a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->nak_invalid_requst_errors); 362a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "nak_remote_operation_errors", 363a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->nak_remote_operation_errors); 364a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "nak_count_remote_access_errors", 365a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->nak_count_remote_access_errors); 366a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_length_errors", 367a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->local_length_errors); 368a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_protection_errors", 369a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->local_protection_errors); 370a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_qp_operation_errors", 371a51f06e1SSelvin Xavier (u64)rx_qp_err_stats->local_qp_operation_errors); 372a51f06e1SSelvin Xavier return stats; 373a51f06e1SSelvin Xavier } 374a51f06e1SSelvin Xavier 375a51f06e1SSelvin Xavier static char *ocrdma_txqp_errstats(struct ocrdma_dev *dev) 376a51f06e1SSelvin Xavier { 377a51f06e1SSelvin Xavier char *stats = dev->stats_mem.debugfs_mem, *pcur; 378a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 379a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 380a51f06e1SSelvin Xavier struct ocrdma_tx_qp_err_stats *tx_qp_err_stats = 381a51f06e1SSelvin Xavier &rdma_stats->tx_qp_err_stats; 382a51f06e1SSelvin Xavier 383a51f06e1SSelvin Xavier memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM)); 384a51f06e1SSelvin Xavier 385a51f06e1SSelvin Xavier pcur = stats; 386a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_length_errors", 387a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->local_length_errors); 388a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_protection_errors", 389a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->local_protection_errors); 390a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "local_qp_operation_errors", 391a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->local_qp_operation_errors); 392a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "retry_count_exceeded_errors", 393a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->retry_count_exceeded_errors); 394a51f06e1SSelvin Xavier pcur += ocrdma_add_stat(stats, pcur, "rnr_retry_count_exceeded_errors", 395a51f06e1SSelvin Xavier (u64)tx_qp_err_stats->rnr_retry_count_exceeded_errors); 396a51f06e1SSelvin Xavier return stats; 397a51f06e1SSelvin Xavier } 398a51f06e1SSelvin Xavier 399a51f06e1SSelvin Xavier static char *ocrdma_tx_dbg_stats(struct ocrdma_dev *dev) 400a51f06e1SSelvin Xavier { 401a51f06e1SSelvin Xavier int i; 402a51f06e1SSelvin Xavier char *pstats = dev->stats_mem.debugfs_mem; 403a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 404a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 405a51f06e1SSelvin Xavier struct ocrdma_tx_dbg_stats *tx_dbg_stats = 406a51f06e1SSelvin Xavier &rdma_stats->tx_dbg_stats; 407a51f06e1SSelvin Xavier 408a51f06e1SSelvin Xavier memset(pstats, 0, (OCRDMA_MAX_DBGFS_MEM)); 409a51f06e1SSelvin Xavier 410a51f06e1SSelvin Xavier for (i = 0; i < 100; i++) 411a51f06e1SSelvin Xavier pstats += snprintf(pstats, 80, "DW[%d] = 0x%x\n", i, 412a51f06e1SSelvin Xavier tx_dbg_stats->data[i]); 413a51f06e1SSelvin Xavier 414a51f06e1SSelvin Xavier return dev->stats_mem.debugfs_mem; 415a51f06e1SSelvin Xavier } 416a51f06e1SSelvin Xavier 417a51f06e1SSelvin Xavier static char *ocrdma_rx_dbg_stats(struct ocrdma_dev *dev) 418a51f06e1SSelvin Xavier { 419a51f06e1SSelvin Xavier int i; 420a51f06e1SSelvin Xavier char *pstats = dev->stats_mem.debugfs_mem; 421a51f06e1SSelvin Xavier struct ocrdma_rdma_stats_resp *rdma_stats = 422a51f06e1SSelvin Xavier (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va; 423a51f06e1SSelvin Xavier struct ocrdma_rx_dbg_stats *rx_dbg_stats = 424a51f06e1SSelvin Xavier &rdma_stats->rx_dbg_stats; 425a51f06e1SSelvin Xavier 426a51f06e1SSelvin Xavier memset(pstats, 0, (OCRDMA_MAX_DBGFS_MEM)); 427a51f06e1SSelvin Xavier 428a51f06e1SSelvin Xavier for (i = 0; i < 200; i++) 429a51f06e1SSelvin Xavier pstats += snprintf(pstats, 80, "DW[%d] = 0x%x\n", i, 430a51f06e1SSelvin Xavier rx_dbg_stats->data[i]); 431a51f06e1SSelvin Xavier 432a51f06e1SSelvin Xavier return dev->stats_mem.debugfs_mem; 433a51f06e1SSelvin Xavier } 434a51f06e1SSelvin Xavier 435a51f06e1SSelvin Xavier static void ocrdma_update_stats(struct ocrdma_dev *dev) 436a51f06e1SSelvin Xavier { 437a51f06e1SSelvin Xavier ulong now = jiffies, secs; 438a51f06e1SSelvin Xavier int status = 0; 439a51f06e1SSelvin Xavier 440a51f06e1SSelvin Xavier secs = jiffies_to_msecs(now - dev->last_stats_time) / 1000U; 441a51f06e1SSelvin Xavier if (secs) { 442a51f06e1SSelvin Xavier /* update */ 443a51f06e1SSelvin Xavier status = ocrdma_mbx_rdma_stats(dev, false); 444a51f06e1SSelvin Xavier if (status) 445a51f06e1SSelvin Xavier pr_err("%s: stats mbox failed with status = %d\n", 446a51f06e1SSelvin Xavier __func__, status); 447a51f06e1SSelvin Xavier dev->last_stats_time = jiffies; 448a51f06e1SSelvin Xavier } 449a51f06e1SSelvin Xavier } 450a51f06e1SSelvin Xavier 451a51f06e1SSelvin Xavier static ssize_t ocrdma_dbgfs_ops_read(struct file *filp, char __user *buffer, 452a51f06e1SSelvin Xavier size_t usr_buf_len, loff_t *ppos) 453a51f06e1SSelvin Xavier { 454a51f06e1SSelvin Xavier struct ocrdma_stats *pstats = filp->private_data; 455a51f06e1SSelvin Xavier struct ocrdma_dev *dev = pstats->dev; 456a51f06e1SSelvin Xavier ssize_t status = 0; 457a51f06e1SSelvin Xavier char *data = NULL; 458a51f06e1SSelvin Xavier 459a51f06e1SSelvin Xavier /* No partial reads */ 460a51f06e1SSelvin Xavier if (*ppos != 0) 461a51f06e1SSelvin Xavier return 0; 462a51f06e1SSelvin Xavier 463a51f06e1SSelvin Xavier mutex_lock(&dev->stats_lock); 464a51f06e1SSelvin Xavier 465a51f06e1SSelvin Xavier ocrdma_update_stats(dev); 466a51f06e1SSelvin Xavier 467a51f06e1SSelvin Xavier switch (pstats->type) { 468a51f06e1SSelvin Xavier case OCRDMA_RSRC_STATS: 469a51f06e1SSelvin Xavier data = ocrdma_resource_stats(dev); 470a51f06e1SSelvin Xavier break; 471a51f06e1SSelvin Xavier case OCRDMA_RXSTATS: 472a51f06e1SSelvin Xavier data = ocrdma_rx_stats(dev); 473a51f06e1SSelvin Xavier break; 474a51f06e1SSelvin Xavier case OCRDMA_WQESTATS: 475a51f06e1SSelvin Xavier data = ocrdma_wqe_stats(dev); 476a51f06e1SSelvin Xavier break; 477a51f06e1SSelvin Xavier case OCRDMA_TXSTATS: 478a51f06e1SSelvin Xavier data = ocrdma_tx_stats(dev); 479a51f06e1SSelvin Xavier break; 480a51f06e1SSelvin Xavier case OCRDMA_DB_ERRSTATS: 481a51f06e1SSelvin Xavier data = ocrdma_db_errstats(dev); 482a51f06e1SSelvin Xavier break; 483a51f06e1SSelvin Xavier case OCRDMA_RXQP_ERRSTATS: 484a51f06e1SSelvin Xavier data = ocrdma_rxqp_errstats(dev); 485a51f06e1SSelvin Xavier break; 486a51f06e1SSelvin Xavier case OCRDMA_TXQP_ERRSTATS: 487a51f06e1SSelvin Xavier data = ocrdma_txqp_errstats(dev); 488a51f06e1SSelvin Xavier break; 489a51f06e1SSelvin Xavier case OCRDMA_TX_DBG_STATS: 490a51f06e1SSelvin Xavier data = ocrdma_tx_dbg_stats(dev); 491a51f06e1SSelvin Xavier break; 492a51f06e1SSelvin Xavier case OCRDMA_RX_DBG_STATS: 493a51f06e1SSelvin Xavier data = ocrdma_rx_dbg_stats(dev); 494a51f06e1SSelvin Xavier break; 495a51f06e1SSelvin Xavier 496a51f06e1SSelvin Xavier default: 497a51f06e1SSelvin Xavier status = -EFAULT; 498a51f06e1SSelvin Xavier goto exit; 499a51f06e1SSelvin Xavier } 500a51f06e1SSelvin Xavier 501a51f06e1SSelvin Xavier if (usr_buf_len < strlen(data)) { 502a51f06e1SSelvin Xavier status = -ENOSPC; 503a51f06e1SSelvin Xavier goto exit; 504a51f06e1SSelvin Xavier } 505a51f06e1SSelvin Xavier 506a51f06e1SSelvin Xavier status = simple_read_from_buffer(buffer, usr_buf_len, ppos, data, 507a51f06e1SSelvin Xavier strlen(data)); 508a51f06e1SSelvin Xavier exit: 509a51f06e1SSelvin Xavier mutex_unlock(&dev->stats_lock); 510a51f06e1SSelvin Xavier return status; 511a51f06e1SSelvin Xavier } 512a51f06e1SSelvin Xavier 513a51f06e1SSelvin Xavier static const struct file_operations ocrdma_dbg_ops = { 514a51f06e1SSelvin Xavier .owner = THIS_MODULE, 5150cc65dd6SDuan Jiong .open = simple_open, 516a51f06e1SSelvin Xavier .read = ocrdma_dbgfs_ops_read, 517a51f06e1SSelvin Xavier }; 518a51f06e1SSelvin Xavier 519a51f06e1SSelvin Xavier void ocrdma_add_port_stats(struct ocrdma_dev *dev) 520a51f06e1SSelvin Xavier { 521a51f06e1SSelvin Xavier if (!ocrdma_dbgfs_dir) 522a51f06e1SSelvin Xavier return; 523a51f06e1SSelvin Xavier 524a51f06e1SSelvin Xavier /* Create post stats base dir */ 525a51f06e1SSelvin Xavier dev->dir = debugfs_create_dir(dev->ibdev.name, ocrdma_dbgfs_dir); 526a51f06e1SSelvin Xavier if (!dev->dir) 527a51f06e1SSelvin Xavier goto err; 528a51f06e1SSelvin Xavier 529a51f06e1SSelvin Xavier dev->rsrc_stats.type = OCRDMA_RSRC_STATS; 530a51f06e1SSelvin Xavier dev->rsrc_stats.dev = dev; 531a51f06e1SSelvin Xavier if (!debugfs_create_file("resource_stats", S_IRUSR, dev->dir, 532a51f06e1SSelvin Xavier &dev->rsrc_stats, &ocrdma_dbg_ops)) 533a51f06e1SSelvin Xavier goto err; 534a51f06e1SSelvin Xavier 535a51f06e1SSelvin Xavier dev->rx_stats.type = OCRDMA_RXSTATS; 536a51f06e1SSelvin Xavier dev->rx_stats.dev = dev; 537a51f06e1SSelvin Xavier if (!debugfs_create_file("rx_stats", S_IRUSR, dev->dir, 538a51f06e1SSelvin Xavier &dev->rx_stats, &ocrdma_dbg_ops)) 539a51f06e1SSelvin Xavier goto err; 540a51f06e1SSelvin Xavier 541a51f06e1SSelvin Xavier dev->wqe_stats.type = OCRDMA_WQESTATS; 542a51f06e1SSelvin Xavier dev->wqe_stats.dev = dev; 543a51f06e1SSelvin Xavier if (!debugfs_create_file("wqe_stats", S_IRUSR, dev->dir, 544a51f06e1SSelvin Xavier &dev->wqe_stats, &ocrdma_dbg_ops)) 545a51f06e1SSelvin Xavier goto err; 546a51f06e1SSelvin Xavier 547a51f06e1SSelvin Xavier dev->tx_stats.type = OCRDMA_TXSTATS; 548a51f06e1SSelvin Xavier dev->tx_stats.dev = dev; 549a51f06e1SSelvin Xavier if (!debugfs_create_file("tx_stats", S_IRUSR, dev->dir, 550a51f06e1SSelvin Xavier &dev->tx_stats, &ocrdma_dbg_ops)) 551a51f06e1SSelvin Xavier goto err; 552a51f06e1SSelvin Xavier 553a51f06e1SSelvin Xavier dev->db_err_stats.type = OCRDMA_DB_ERRSTATS; 554a51f06e1SSelvin Xavier dev->db_err_stats.dev = dev; 555a51f06e1SSelvin Xavier if (!debugfs_create_file("db_err_stats", S_IRUSR, dev->dir, 556a51f06e1SSelvin Xavier &dev->db_err_stats, &ocrdma_dbg_ops)) 557a51f06e1SSelvin Xavier goto err; 558a51f06e1SSelvin Xavier 559a51f06e1SSelvin Xavier 560a51f06e1SSelvin Xavier dev->tx_qp_err_stats.type = OCRDMA_TXQP_ERRSTATS; 561a51f06e1SSelvin Xavier dev->tx_qp_err_stats.dev = dev; 562a51f06e1SSelvin Xavier if (!debugfs_create_file("tx_qp_err_stats", S_IRUSR, dev->dir, 563a51f06e1SSelvin Xavier &dev->tx_qp_err_stats, &ocrdma_dbg_ops)) 564a51f06e1SSelvin Xavier goto err; 565a51f06e1SSelvin Xavier 566a51f06e1SSelvin Xavier dev->rx_qp_err_stats.type = OCRDMA_RXQP_ERRSTATS; 567a51f06e1SSelvin Xavier dev->rx_qp_err_stats.dev = dev; 568a51f06e1SSelvin Xavier if (!debugfs_create_file("rx_qp_err_stats", S_IRUSR, dev->dir, 569a51f06e1SSelvin Xavier &dev->rx_qp_err_stats, &ocrdma_dbg_ops)) 570a51f06e1SSelvin Xavier goto err; 571a51f06e1SSelvin Xavier 572a51f06e1SSelvin Xavier 573a51f06e1SSelvin Xavier dev->tx_dbg_stats.type = OCRDMA_TX_DBG_STATS; 574a51f06e1SSelvin Xavier dev->tx_dbg_stats.dev = dev; 575a51f06e1SSelvin Xavier if (!debugfs_create_file("tx_dbg_stats", S_IRUSR, dev->dir, 576a51f06e1SSelvin Xavier &dev->tx_dbg_stats, &ocrdma_dbg_ops)) 577a51f06e1SSelvin Xavier goto err; 578a51f06e1SSelvin Xavier 579a51f06e1SSelvin Xavier dev->rx_dbg_stats.type = OCRDMA_RX_DBG_STATS; 580a51f06e1SSelvin Xavier dev->rx_dbg_stats.dev = dev; 581a51f06e1SSelvin Xavier if (!debugfs_create_file("rx_dbg_stats", S_IRUSR, dev->dir, 582a51f06e1SSelvin Xavier &dev->rx_dbg_stats, &ocrdma_dbg_ops)) 583a51f06e1SSelvin Xavier goto err; 584a51f06e1SSelvin Xavier 585a51f06e1SSelvin Xavier /* Now create dma_mem for stats mbx command */ 586a51f06e1SSelvin Xavier if (!ocrdma_alloc_stats_mem(dev)) 587a51f06e1SSelvin Xavier goto err; 588a51f06e1SSelvin Xavier 589a51f06e1SSelvin Xavier mutex_init(&dev->stats_lock); 590a51f06e1SSelvin Xavier 591a51f06e1SSelvin Xavier return; 592a51f06e1SSelvin Xavier err: 593a51f06e1SSelvin Xavier ocrdma_release_stats_mem(dev); 594a51f06e1SSelvin Xavier debugfs_remove_recursive(dev->dir); 595a51f06e1SSelvin Xavier dev->dir = NULL; 596a51f06e1SSelvin Xavier } 597a51f06e1SSelvin Xavier 598a51f06e1SSelvin Xavier void ocrdma_rem_port_stats(struct ocrdma_dev *dev) 599a51f06e1SSelvin Xavier { 600a51f06e1SSelvin Xavier if (!dev->dir) 601a51f06e1SSelvin Xavier return; 602a51f06e1SSelvin Xavier mutex_destroy(&dev->stats_lock); 603a51f06e1SSelvin Xavier ocrdma_release_stats_mem(dev); 604a51f06e1SSelvin Xavier debugfs_remove(dev->dir); 605a51f06e1SSelvin Xavier } 606a51f06e1SSelvin Xavier 607a51f06e1SSelvin Xavier void ocrdma_init_debugfs(void) 608a51f06e1SSelvin Xavier { 609a51f06e1SSelvin Xavier /* Create base dir in debugfs root dir */ 610a51f06e1SSelvin Xavier ocrdma_dbgfs_dir = debugfs_create_dir("ocrdma", NULL); 611a51f06e1SSelvin Xavier } 612a51f06e1SSelvin Xavier 613a51f06e1SSelvin Xavier void ocrdma_rem_debugfs(void) 614a51f06e1SSelvin Xavier { 615a51f06e1SSelvin Xavier debugfs_remove_recursive(ocrdma_dbgfs_dir); 616a51f06e1SSelvin Xavier } 617