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