brintos

brintos / linux-shallow public Read only

0
0
Text · 28.9 KiB · 0834416 Raw
839 lines · c
1/* This file is part of the Emulex RoCE Device Driver for2 * RoCE (RDMA over Converged Ethernet) adapters.3 * Copyright (C) 2012-2015 Emulex. All rights reserved.4 * EMULEX and SLI are trademarks of Emulex.5 * www.emulex.com6 *7 * This software is available to you under a choice of one of two licenses.8 * You may choose to be licensed under the terms of the GNU General Public9 * License (GPL) Version 2, available from the file COPYING in the main10 * directory of this source tree, or the BSD license below:11 *12 * Redistribution and use in source and binary forms, with or without13 * modification, are permitted provided that the following conditions14 * are met:15 *16 * - Redistributions of source code must retain the above copyright notice,17 *   this list of conditions and the following disclaimer.18 *19 * - Redistributions in binary form must reproduce the above copyright20 *   notice, this list of conditions and the following disclaimer in21 *   the documentation and/or other materials provided with the distribution.22 *23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,THE25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR32 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.34 *35 * Contact Information:36 * linux-drivers@emulex.com37 *38 * Emulex39 * 3333 Susan Street40 * Costa Mesa, CA 9262641 */42 43#include <rdma/ib_addr.h>44#include <rdma/ib_pma.h>45#include "ocrdma_stats.h"46 47static struct dentry *ocrdma_dbgfs_dir;48 49static noinline_for_stack int ocrdma_add_stat(char *start, char *pcur,50				char *name, u64 count)51{52	char buff[128] = {0};53	int cpy_len = 0;54 55	snprintf(buff, 128, "%s: %llu\n", name, count);56	cpy_len = strlen(buff);57 58	if (pcur + cpy_len > start + OCRDMA_MAX_DBGFS_MEM) {59		pr_err("%s: No space in stats buff\n", __func__);60		return 0;61	}62 63	memcpy(pcur, buff, cpy_len);64	return cpy_len;65}66 67bool ocrdma_alloc_stats_resources(struct ocrdma_dev *dev)68{69	struct stats_mem *mem = &dev->stats_mem;70 71	mutex_init(&dev->stats_lock);72	/* Alloc mbox command mem*/73	mem->size = max_t(u32, sizeof(struct ocrdma_rdma_stats_req),74			sizeof(struct ocrdma_rdma_stats_resp));75 76	mem->va = dma_alloc_coherent(&dev->nic_info.pdev->dev, mem->size,77				     &mem->pa, GFP_KERNEL);78	if (!mem->va) {79		pr_err("%s: stats mbox allocation failed\n", __func__);80		return false;81	}82 83	/* Alloc debugfs mem */84	mem->debugfs_mem = kzalloc(OCRDMA_MAX_DBGFS_MEM, GFP_KERNEL);85	if (!mem->debugfs_mem)86		return false;87 88	return true;89}90 91void ocrdma_release_stats_resources(struct ocrdma_dev *dev)92{93	struct stats_mem *mem = &dev->stats_mem;94 95	if (mem->va)96		dma_free_coherent(&dev->nic_info.pdev->dev, mem->size,97				  mem->va, mem->pa);98	mem->va = NULL;99	kfree(mem->debugfs_mem);100}101 102static noinline_for_stack char *ocrdma_resource_stats(struct ocrdma_dev *dev)103{104	char *stats = dev->stats_mem.debugfs_mem, *pcur;105	struct ocrdma_rdma_stats_resp *rdma_stats =106			(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;107	struct ocrdma_rsrc_stats *rsrc_stats = &rdma_stats->act_rsrc_stats;108 109	memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM));110 111	pcur = stats;112	pcur += ocrdma_add_stat(stats, pcur, "active_dpp_pds",113				(u64)rsrc_stats->dpp_pds);114	pcur += ocrdma_add_stat(stats, pcur, "active_non_dpp_pds",115				(u64)rsrc_stats->non_dpp_pds);116	pcur += ocrdma_add_stat(stats, pcur, "active_rc_dpp_qps",117				(u64)rsrc_stats->rc_dpp_qps);118	pcur += ocrdma_add_stat(stats, pcur, "active_uc_dpp_qps",119				(u64)rsrc_stats->uc_dpp_qps);120	pcur += ocrdma_add_stat(stats, pcur, "active_ud_dpp_qps",121				(u64)rsrc_stats->ud_dpp_qps);122	pcur += ocrdma_add_stat(stats, pcur, "active_rc_non_dpp_qps",123				(u64)rsrc_stats->rc_non_dpp_qps);124	pcur += ocrdma_add_stat(stats, pcur, "active_uc_non_dpp_qps",125				(u64)rsrc_stats->uc_non_dpp_qps);126	pcur += ocrdma_add_stat(stats, pcur, "active_ud_non_dpp_qps",127				(u64)rsrc_stats->ud_non_dpp_qps);128	pcur += ocrdma_add_stat(stats, pcur, "active_srqs",129				(u64)rsrc_stats->srqs);130	pcur += ocrdma_add_stat(stats, pcur, "active_rbqs",131				(u64)rsrc_stats->rbqs);132	pcur += ocrdma_add_stat(stats, pcur, "active_64K_nsmr",133				(u64)rsrc_stats->r64K_nsmr);134	pcur += ocrdma_add_stat(stats, pcur, "active_64K_to_2M_nsmr",135				(u64)rsrc_stats->r64K_to_2M_nsmr);136	pcur += ocrdma_add_stat(stats, pcur, "active_2M_to_44M_nsmr",137				(u64)rsrc_stats->r2M_to_44M_nsmr);138	pcur += ocrdma_add_stat(stats, pcur, "active_44M_to_1G_nsmr",139				(u64)rsrc_stats->r44M_to_1G_nsmr);140	pcur += ocrdma_add_stat(stats, pcur, "active_1G_to_4G_nsmr",141				(u64)rsrc_stats->r1G_to_4G_nsmr);142	pcur += ocrdma_add_stat(stats, pcur, "active_nsmr_count_4G_to_32G",143				(u64)rsrc_stats->nsmr_count_4G_to_32G);144	pcur += ocrdma_add_stat(stats, pcur, "active_32G_to_64G_nsmr",145				(u64)rsrc_stats->r32G_to_64G_nsmr);146	pcur += ocrdma_add_stat(stats, pcur, "active_64G_to_128G_nsmr",147				(u64)rsrc_stats->r64G_to_128G_nsmr);148	pcur += ocrdma_add_stat(stats, pcur, "active_128G_to_higher_nsmr",149				(u64)rsrc_stats->r128G_to_higher_nsmr);150	pcur += ocrdma_add_stat(stats, pcur, "active_embedded_nsmr",151				(u64)rsrc_stats->embedded_nsmr);152	pcur += ocrdma_add_stat(stats, pcur, "active_frmr",153				(u64)rsrc_stats->frmr);154	pcur += ocrdma_add_stat(stats, pcur, "active_prefetch_qps",155				(u64)rsrc_stats->prefetch_qps);156	pcur += ocrdma_add_stat(stats, pcur, "active_ondemand_qps",157				(u64)rsrc_stats->ondemand_qps);158	pcur += ocrdma_add_stat(stats, pcur, "active_phy_mr",159				(u64)rsrc_stats->phy_mr);160	pcur += ocrdma_add_stat(stats, pcur, "active_mw",161				(u64)rsrc_stats->mw);162 163	/* Print the threshold stats */164	rsrc_stats = &rdma_stats->th_rsrc_stats;165 166	pcur += ocrdma_add_stat(stats, pcur, "threshold_dpp_pds",167				(u64)rsrc_stats->dpp_pds);168	pcur += ocrdma_add_stat(stats, pcur, "threshold_non_dpp_pds",169				(u64)rsrc_stats->non_dpp_pds);170	pcur += ocrdma_add_stat(stats, pcur, "threshold_rc_dpp_qps",171				(u64)rsrc_stats->rc_dpp_qps);172	pcur += ocrdma_add_stat(stats, pcur, "threshold_uc_dpp_qps",173				(u64)rsrc_stats->uc_dpp_qps);174	pcur += ocrdma_add_stat(stats, pcur, "threshold_ud_dpp_qps",175				(u64)rsrc_stats->ud_dpp_qps);176	pcur += ocrdma_add_stat(stats, pcur, "threshold_rc_non_dpp_qps",177				(u64)rsrc_stats->rc_non_dpp_qps);178	pcur += ocrdma_add_stat(stats, pcur, "threshold_uc_non_dpp_qps",179				(u64)rsrc_stats->uc_non_dpp_qps);180	pcur += ocrdma_add_stat(stats, pcur, "threshold_ud_non_dpp_qps",181				(u64)rsrc_stats->ud_non_dpp_qps);182	pcur += ocrdma_add_stat(stats, pcur, "threshold_srqs",183				(u64)rsrc_stats->srqs);184	pcur += ocrdma_add_stat(stats, pcur, "threshold_rbqs",185				(u64)rsrc_stats->rbqs);186	pcur += ocrdma_add_stat(stats, pcur, "threshold_64K_nsmr",187				(u64)rsrc_stats->r64K_nsmr);188	pcur += ocrdma_add_stat(stats, pcur, "threshold_64K_to_2M_nsmr",189				(u64)rsrc_stats->r64K_to_2M_nsmr);190	pcur += ocrdma_add_stat(stats, pcur, "threshold_2M_to_44M_nsmr",191				(u64)rsrc_stats->r2M_to_44M_nsmr);192	pcur += ocrdma_add_stat(stats, pcur, "threshold_44M_to_1G_nsmr",193				(u64)rsrc_stats->r44M_to_1G_nsmr);194	pcur += ocrdma_add_stat(stats, pcur, "threshold_1G_to_4G_nsmr",195				(u64)rsrc_stats->r1G_to_4G_nsmr);196	pcur += ocrdma_add_stat(stats, pcur, "threshold_nsmr_count_4G_to_32G",197				(u64)rsrc_stats->nsmr_count_4G_to_32G);198	pcur += ocrdma_add_stat(stats, pcur, "threshold_32G_to_64G_nsmr",199				(u64)rsrc_stats->r32G_to_64G_nsmr);200	pcur += ocrdma_add_stat(stats, pcur, "threshold_64G_to_128G_nsmr",201				(u64)rsrc_stats->r64G_to_128G_nsmr);202	pcur += ocrdma_add_stat(stats, pcur, "threshold_128G_to_higher_nsmr",203				(u64)rsrc_stats->r128G_to_higher_nsmr);204	pcur += ocrdma_add_stat(stats, pcur, "threshold_embedded_nsmr",205				(u64)rsrc_stats->embedded_nsmr);206	pcur += ocrdma_add_stat(stats, pcur, "threshold_frmr",207				(u64)rsrc_stats->frmr);208	pcur += ocrdma_add_stat(stats, pcur, "threshold_prefetch_qps",209				(u64)rsrc_stats->prefetch_qps);210	pcur += ocrdma_add_stat(stats, pcur, "threshold_ondemand_qps",211				(u64)rsrc_stats->ondemand_qps);212	pcur += ocrdma_add_stat(stats, pcur, "threshold_phy_mr",213				(u64)rsrc_stats->phy_mr);214	pcur += ocrdma_add_stat(stats, pcur, "threshold_mw",215				(u64)rsrc_stats->mw);216	return stats;217}218 219static noinline_for_stack char *ocrdma_rx_stats(struct ocrdma_dev *dev)220{221	char *stats = dev->stats_mem.debugfs_mem, *pcur;222	struct ocrdma_rdma_stats_resp *rdma_stats =223		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;224	struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats;225 226	memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM));227 228	pcur = stats;229	pcur += ocrdma_add_stat230		(stats, pcur, "roce_frame_bytes",231		 convert_to_64bit(rx_stats->roce_frame_bytes_lo,232		 rx_stats->roce_frame_bytes_hi));233	pcur += ocrdma_add_stat(stats, pcur, "roce_frame_icrc_drops",234				(u64)rx_stats->roce_frame_icrc_drops);235	pcur += ocrdma_add_stat(stats, pcur, "roce_frame_payload_len_drops",236				(u64)rx_stats->roce_frame_payload_len_drops);237	pcur += ocrdma_add_stat(stats, pcur, "ud_drops",238				(u64)rx_stats->ud_drops);239	pcur += ocrdma_add_stat(stats, pcur, "qp1_drops",240				(u64)rx_stats->qp1_drops);241	pcur += ocrdma_add_stat(stats, pcur, "psn_error_request_packets",242				(u64)rx_stats->psn_error_request_packets);243	pcur += ocrdma_add_stat(stats, pcur, "psn_error_resp_packets",244				(u64)rx_stats->psn_error_resp_packets);245	pcur += ocrdma_add_stat(stats, pcur, "rnr_nak_timeouts",246				(u64)rx_stats->rnr_nak_timeouts);247	pcur += ocrdma_add_stat(stats, pcur, "rnr_nak_receives",248				(u64)rx_stats->rnr_nak_receives);249	pcur += ocrdma_add_stat(stats, pcur, "roce_frame_rxmt_drops",250				(u64)rx_stats->roce_frame_rxmt_drops);251	pcur += ocrdma_add_stat(stats, pcur, "nak_count_psn_sequence_errors",252				(u64)rx_stats->nak_count_psn_sequence_errors);253	pcur += ocrdma_add_stat(stats, pcur, "rc_drop_count_lookup_errors",254				(u64)rx_stats->rc_drop_count_lookup_errors);255	pcur += ocrdma_add_stat(stats, pcur, "rq_rnr_naks",256				(u64)rx_stats->rq_rnr_naks);257	pcur += ocrdma_add_stat(stats, pcur, "srq_rnr_naks",258				(u64)rx_stats->srq_rnr_naks);259	pcur += ocrdma_add_stat(stats, pcur, "roce_frames",260				convert_to_64bit(rx_stats->roce_frames_lo,261						 rx_stats->roce_frames_hi));262 263	return stats;264}265 266static u64 ocrdma_sysfs_rcv_pkts(struct ocrdma_dev *dev)267{268	struct ocrdma_rdma_stats_resp *rdma_stats =269		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;270	struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats;271 272	return convert_to_64bit(rx_stats->roce_frames_lo,273		rx_stats->roce_frames_hi) + (u64)rx_stats->roce_frame_icrc_drops274		+ (u64)rx_stats->roce_frame_payload_len_drops;275}276 277static u64 ocrdma_sysfs_rcv_data(struct ocrdma_dev *dev)278{279	struct ocrdma_rdma_stats_resp *rdma_stats =280		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;281	struct ocrdma_rx_stats *rx_stats = &rdma_stats->rx_stats;282 283	return (convert_to_64bit(rx_stats->roce_frame_bytes_lo,284		rx_stats->roce_frame_bytes_hi))/4;285}286 287static noinline_for_stack char *ocrdma_tx_stats(struct ocrdma_dev *dev)288{289	char *stats = dev->stats_mem.debugfs_mem, *pcur;290	struct ocrdma_rdma_stats_resp *rdma_stats =291		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;292	struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats;293 294	memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM));295 296	pcur = stats;297	pcur += ocrdma_add_stat(stats, pcur, "send_pkts",298				convert_to_64bit(tx_stats->send_pkts_lo,299						 tx_stats->send_pkts_hi));300	pcur += ocrdma_add_stat(stats, pcur, "write_pkts",301				convert_to_64bit(tx_stats->write_pkts_lo,302						 tx_stats->write_pkts_hi));303	pcur += ocrdma_add_stat(stats, pcur, "read_pkts",304				convert_to_64bit(tx_stats->read_pkts_lo,305						 tx_stats->read_pkts_hi));306	pcur += ocrdma_add_stat(stats, pcur, "read_rsp_pkts",307				convert_to_64bit(tx_stats->read_rsp_pkts_lo,308						 tx_stats->read_rsp_pkts_hi));309	pcur += ocrdma_add_stat(stats, pcur, "ack_pkts",310				convert_to_64bit(tx_stats->ack_pkts_lo,311						 tx_stats->ack_pkts_hi));312	pcur += ocrdma_add_stat(stats, pcur, "send_bytes",313				convert_to_64bit(tx_stats->send_bytes_lo,314						 tx_stats->send_bytes_hi));315	pcur += ocrdma_add_stat(stats, pcur, "write_bytes",316				convert_to_64bit(tx_stats->write_bytes_lo,317						 tx_stats->write_bytes_hi));318	pcur += ocrdma_add_stat(stats, pcur, "read_req_bytes",319				convert_to_64bit(tx_stats->read_req_bytes_lo,320						 tx_stats->read_req_bytes_hi));321	pcur += ocrdma_add_stat(stats, pcur, "read_rsp_bytes",322				convert_to_64bit(tx_stats->read_rsp_bytes_lo,323						 tx_stats->read_rsp_bytes_hi));324	pcur += ocrdma_add_stat(stats, pcur, "ack_timeouts",325				(u64)tx_stats->ack_timeouts);326 327	return stats;328}329 330static u64 ocrdma_sysfs_xmit_pkts(struct ocrdma_dev *dev)331{332	struct ocrdma_rdma_stats_resp *rdma_stats =333		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;334	struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats;335 336	return (convert_to_64bit(tx_stats->send_pkts_lo,337				 tx_stats->send_pkts_hi) +338	convert_to_64bit(tx_stats->write_pkts_lo, tx_stats->write_pkts_hi) +339	convert_to_64bit(tx_stats->read_pkts_lo, tx_stats->read_pkts_hi) +340	convert_to_64bit(tx_stats->read_rsp_pkts_lo,341			 tx_stats->read_rsp_pkts_hi) +342	convert_to_64bit(tx_stats->ack_pkts_lo, tx_stats->ack_pkts_hi));343}344 345static u64 ocrdma_sysfs_xmit_data(struct ocrdma_dev *dev)346{347	struct ocrdma_rdma_stats_resp *rdma_stats =348		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;349	struct ocrdma_tx_stats *tx_stats = &rdma_stats->tx_stats;350 351	return (convert_to_64bit(tx_stats->send_bytes_lo,352				 tx_stats->send_bytes_hi) +353		convert_to_64bit(tx_stats->write_bytes_lo,354				 tx_stats->write_bytes_hi) +355		convert_to_64bit(tx_stats->read_req_bytes_lo,356				 tx_stats->read_req_bytes_hi) +357		convert_to_64bit(tx_stats->read_rsp_bytes_lo,358				 tx_stats->read_rsp_bytes_hi))/4;359}360 361static noinline_for_stack char *ocrdma_wqe_stats(struct ocrdma_dev *dev)362{363	char *stats = dev->stats_mem.debugfs_mem, *pcur;364	struct ocrdma_rdma_stats_resp *rdma_stats =365		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;366	struct ocrdma_wqe_stats	*wqe_stats = &rdma_stats->wqe_stats;367 368	memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM));369 370	pcur = stats;371	pcur += ocrdma_add_stat(stats, pcur, "large_send_rc_wqes",372		convert_to_64bit(wqe_stats->large_send_rc_wqes_lo,373				 wqe_stats->large_send_rc_wqes_hi));374	pcur += ocrdma_add_stat(stats, pcur, "large_write_rc_wqes",375		convert_to_64bit(wqe_stats->large_write_rc_wqes_lo,376				 wqe_stats->large_write_rc_wqes_hi));377	pcur += ocrdma_add_stat(stats, pcur, "read_wqes",378				convert_to_64bit(wqe_stats->read_wqes_lo,379						 wqe_stats->read_wqes_hi));380	pcur += ocrdma_add_stat(stats, pcur, "frmr_wqes",381				convert_to_64bit(wqe_stats->frmr_wqes_lo,382						 wqe_stats->frmr_wqes_hi));383	pcur += ocrdma_add_stat(stats, pcur, "mw_bind_wqes",384				convert_to_64bit(wqe_stats->mw_bind_wqes_lo,385						 wqe_stats->mw_bind_wqes_hi));386	pcur += ocrdma_add_stat(stats, pcur, "invalidate_wqes",387		convert_to_64bit(wqe_stats->invalidate_wqes_lo,388				 wqe_stats->invalidate_wqes_hi));389	pcur += ocrdma_add_stat(stats, pcur, "dpp_wqe_drops",390				(u64)wqe_stats->dpp_wqe_drops);391	return stats;392}393 394static noinline_for_stack char *ocrdma_db_errstats(struct ocrdma_dev *dev)395{396	char *stats = dev->stats_mem.debugfs_mem, *pcur;397	struct ocrdma_rdma_stats_resp *rdma_stats =398		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;399	struct ocrdma_db_err_stats *db_err_stats = &rdma_stats->db_err_stats;400 401	memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM));402 403	pcur = stats;404	pcur += ocrdma_add_stat(stats, pcur, "sq_doorbell_errors",405				(u64)db_err_stats->sq_doorbell_errors);406	pcur += ocrdma_add_stat(stats, pcur, "cq_doorbell_errors",407				(u64)db_err_stats->cq_doorbell_errors);408	pcur += ocrdma_add_stat(stats, pcur, "rq_srq_doorbell_errors",409				(u64)db_err_stats->rq_srq_doorbell_errors);410	pcur += ocrdma_add_stat(stats, pcur, "cq_overflow_errors",411				(u64)db_err_stats->cq_overflow_errors);412	return stats;413}414 415static noinline_for_stack char *ocrdma_rxqp_errstats(struct ocrdma_dev *dev)416{417	char *stats = dev->stats_mem.debugfs_mem, *pcur;418	struct ocrdma_rdma_stats_resp *rdma_stats =419		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;420	struct ocrdma_rx_qp_err_stats *rx_qp_err_stats =421		 &rdma_stats->rx_qp_err_stats;422 423	memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM));424 425	pcur = stats;426	pcur += ocrdma_add_stat(stats, pcur, "nak_invalid_request_errors",427			(u64)rx_qp_err_stats->nak_invalid_request_errors);428	pcur += ocrdma_add_stat(stats, pcur, "nak_remote_operation_errors",429			(u64)rx_qp_err_stats->nak_remote_operation_errors);430	pcur += ocrdma_add_stat(stats, pcur, "nak_count_remote_access_errors",431			(u64)rx_qp_err_stats->nak_count_remote_access_errors);432	pcur += ocrdma_add_stat(stats, pcur, "local_length_errors",433			(u64)rx_qp_err_stats->local_length_errors);434	pcur += ocrdma_add_stat(stats, pcur, "local_protection_errors",435			(u64)rx_qp_err_stats->local_protection_errors);436	pcur += ocrdma_add_stat(stats, pcur, "local_qp_operation_errors",437			(u64)rx_qp_err_stats->local_qp_operation_errors);438	return stats;439}440 441static noinline_for_stack char *ocrdma_txqp_errstats(struct ocrdma_dev *dev)442{443	char *stats = dev->stats_mem.debugfs_mem, *pcur;444	struct ocrdma_rdma_stats_resp *rdma_stats =445		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;446	struct ocrdma_tx_qp_err_stats *tx_qp_err_stats =447		&rdma_stats->tx_qp_err_stats;448 449	memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM));450 451	pcur = stats;452	pcur += ocrdma_add_stat(stats, pcur, "local_length_errors",453			(u64)tx_qp_err_stats->local_length_errors);454	pcur += ocrdma_add_stat(stats, pcur, "local_protection_errors",455			(u64)tx_qp_err_stats->local_protection_errors);456	pcur += ocrdma_add_stat(stats, pcur, "local_qp_operation_errors",457			(u64)tx_qp_err_stats->local_qp_operation_errors);458	pcur += ocrdma_add_stat(stats, pcur, "retry_count_exceeded_errors",459			(u64)tx_qp_err_stats->retry_count_exceeded_errors);460	pcur += ocrdma_add_stat(stats, pcur, "rnr_retry_count_exceeded_errors",461			(u64)tx_qp_err_stats->rnr_retry_count_exceeded_errors);462	return stats;463}464 465static noinline_for_stack char *ocrdma_tx_dbg_stats(struct ocrdma_dev *dev)466{467	int i;468	char *pstats = dev->stats_mem.debugfs_mem;469	struct ocrdma_rdma_stats_resp *rdma_stats =470		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;471	struct ocrdma_tx_dbg_stats *tx_dbg_stats =472		&rdma_stats->tx_dbg_stats;473 474	memset(pstats, 0, (OCRDMA_MAX_DBGFS_MEM));475 476	for (i = 0; i < 100; i++)477		pstats += snprintf(pstats, 80, "DW[%d] = 0x%x\n", i,478				 tx_dbg_stats->data[i]);479 480	return dev->stats_mem.debugfs_mem;481}482 483static noinline_for_stack char *ocrdma_rx_dbg_stats(struct ocrdma_dev *dev)484{485	int i;486	char *pstats = dev->stats_mem.debugfs_mem;487	struct ocrdma_rdma_stats_resp *rdma_stats =488		(struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;489	struct ocrdma_rx_dbg_stats *rx_dbg_stats =490		&rdma_stats->rx_dbg_stats;491 492	memset(pstats, 0, (OCRDMA_MAX_DBGFS_MEM));493 494	for (i = 0; i < 200; i++)495		pstats += snprintf(pstats, 80, "DW[%d] = 0x%x\n", i,496				 rx_dbg_stats->data[i]);497 498	return dev->stats_mem.debugfs_mem;499}500 501static noinline_for_stack char *ocrdma_driver_dbg_stats(struct ocrdma_dev *dev)502{503	char *stats = dev->stats_mem.debugfs_mem, *pcur;504 505 506	memset(stats, 0, (OCRDMA_MAX_DBGFS_MEM));507 508	pcur = stats;509	pcur += ocrdma_add_stat(stats, pcur, "async_cq_err",510				(u64)(dev->async_err_stats511				[OCRDMA_CQ_ERROR].counter));512	pcur += ocrdma_add_stat(stats, pcur, "async_cq_overrun_err",513				(u64)dev->async_err_stats514				[OCRDMA_CQ_OVERRUN_ERROR].counter);515	pcur += ocrdma_add_stat(stats, pcur, "async_cq_qpcat_err",516				(u64)dev->async_err_stats517				[OCRDMA_CQ_QPCAT_ERROR].counter);518	pcur += ocrdma_add_stat(stats, pcur, "async_qp_access_err",519				(u64)dev->async_err_stats520				[OCRDMA_QP_ACCESS_ERROR].counter);521	pcur += ocrdma_add_stat(stats, pcur, "async_qp_commm_est_evt",522				(u64)dev->async_err_stats523				[OCRDMA_QP_COMM_EST_EVENT].counter);524	pcur += ocrdma_add_stat(stats, pcur, "async_sq_drained_evt",525				(u64)dev->async_err_stats526				[OCRDMA_SQ_DRAINED_EVENT].counter);527	pcur += ocrdma_add_stat(stats, pcur, "async_dev_fatal_evt",528				(u64)dev->async_err_stats529				[OCRDMA_DEVICE_FATAL_EVENT].counter);530	pcur += ocrdma_add_stat(stats, pcur, "async_srqcat_err",531				(u64)dev->async_err_stats532				[OCRDMA_SRQCAT_ERROR].counter);533	pcur += ocrdma_add_stat(stats, pcur, "async_srq_limit_evt",534				(u64)dev->async_err_stats535				[OCRDMA_SRQ_LIMIT_EVENT].counter);536	pcur += ocrdma_add_stat(stats, pcur, "async_qp_last_wqe_evt",537				(u64)dev->async_err_stats538				[OCRDMA_QP_LAST_WQE_EVENT].counter);539 540	pcur += ocrdma_add_stat(stats, pcur, "cqe_loc_len_err",541				(u64)dev->cqe_err_stats542				[OCRDMA_CQE_LOC_LEN_ERR].counter);543	pcur += ocrdma_add_stat(stats, pcur, "cqe_loc_qp_op_err",544				(u64)dev->cqe_err_stats545				[OCRDMA_CQE_LOC_QP_OP_ERR].counter);546	pcur += ocrdma_add_stat(stats, pcur, "cqe_loc_eec_op_err",547				(u64)dev->cqe_err_stats548				[OCRDMA_CQE_LOC_EEC_OP_ERR].counter);549	pcur += ocrdma_add_stat(stats, pcur, "cqe_loc_prot_err",550				(u64)dev->cqe_err_stats551				[OCRDMA_CQE_LOC_PROT_ERR].counter);552	pcur += ocrdma_add_stat(stats, pcur, "cqe_wr_flush_err",553				(u64)dev->cqe_err_stats554				[OCRDMA_CQE_WR_FLUSH_ERR].counter);555	pcur += ocrdma_add_stat(stats, pcur, "cqe_mw_bind_err",556				(u64)dev->cqe_err_stats557				[OCRDMA_CQE_MW_BIND_ERR].counter);558	pcur += ocrdma_add_stat(stats, pcur, "cqe_bad_resp_err",559				(u64)dev->cqe_err_stats560				[OCRDMA_CQE_BAD_RESP_ERR].counter);561	pcur += ocrdma_add_stat(stats, pcur, "cqe_loc_access_err",562				(u64)dev->cqe_err_stats563				[OCRDMA_CQE_LOC_ACCESS_ERR].counter);564	pcur += ocrdma_add_stat(stats, pcur, "cqe_rem_inv_req_err",565				(u64)dev->cqe_err_stats566				[OCRDMA_CQE_REM_INV_REQ_ERR].counter);567	pcur += ocrdma_add_stat(stats, pcur, "cqe_rem_access_err",568				(u64)dev->cqe_err_stats569				[OCRDMA_CQE_REM_ACCESS_ERR].counter);570	pcur += ocrdma_add_stat(stats, pcur, "cqe_rem_op_err",571				(u64)dev->cqe_err_stats572				[OCRDMA_CQE_REM_OP_ERR].counter);573	pcur += ocrdma_add_stat(stats, pcur, "cqe_retry_exc_err",574				(u64)dev->cqe_err_stats575				[OCRDMA_CQE_RETRY_EXC_ERR].counter);576	pcur += ocrdma_add_stat(stats, pcur, "cqe_rnr_retry_exc_err",577				(u64)dev->cqe_err_stats578				[OCRDMA_CQE_RNR_RETRY_EXC_ERR].counter);579	pcur += ocrdma_add_stat(stats, pcur, "cqe_loc_rdd_viol_err",580				(u64)dev->cqe_err_stats581				[OCRDMA_CQE_LOC_RDD_VIOL_ERR].counter);582	pcur += ocrdma_add_stat(stats, pcur, "cqe_rem_inv_rd_req_err",583				(u64)dev->cqe_err_stats584				[OCRDMA_CQE_REM_INV_RD_REQ_ERR].counter);585	pcur += ocrdma_add_stat(stats, pcur, "cqe_rem_abort_err",586				(u64)dev->cqe_err_stats587				[OCRDMA_CQE_REM_ABORT_ERR].counter);588	pcur += ocrdma_add_stat(stats, pcur, "cqe_inv_eecn_err",589				(u64)dev->cqe_err_stats590				[OCRDMA_CQE_INV_EECN_ERR].counter);591	pcur += ocrdma_add_stat(stats, pcur, "cqe_inv_eec_state_err",592				(u64)dev->cqe_err_stats593				[OCRDMA_CQE_INV_EEC_STATE_ERR].counter);594	pcur += ocrdma_add_stat(stats, pcur, "cqe_fatal_err",595				(u64)dev->cqe_err_stats596				[OCRDMA_CQE_FATAL_ERR].counter);597	pcur += ocrdma_add_stat(stats, pcur, "cqe_resp_timeout_err",598				(u64)dev->cqe_err_stats599				[OCRDMA_CQE_RESP_TIMEOUT_ERR].counter);600	pcur += ocrdma_add_stat(stats, pcur, "cqe_general_err",601				(u64)dev->cqe_err_stats602				[OCRDMA_CQE_GENERAL_ERR].counter);603	return stats;604}605 606static void ocrdma_update_stats(struct ocrdma_dev *dev)607{608	ulong now = jiffies, secs;609	int status;610	struct ocrdma_rdma_stats_resp *rdma_stats =611		      (struct ocrdma_rdma_stats_resp *)dev->stats_mem.va;612	struct ocrdma_rsrc_stats *rsrc_stats = &rdma_stats->act_rsrc_stats;613 614	secs = jiffies_to_msecs(now - dev->last_stats_time) / 1000U;615	if (secs) {616		/* update */617		status = ocrdma_mbx_rdma_stats(dev, false);618		if (status)619			pr_err("%s: stats mbox failed with status = %d\n",620			       __func__, status);621		/* Update PD counters from PD resource manager */622		if (dev->pd_mgr->pd_prealloc_valid) {623			rsrc_stats->dpp_pds = dev->pd_mgr->pd_dpp_count;624			rsrc_stats->non_dpp_pds = dev->pd_mgr->pd_norm_count;625			/* Threshold stata*/626			rsrc_stats = &rdma_stats->th_rsrc_stats;627			rsrc_stats->dpp_pds = dev->pd_mgr->pd_dpp_thrsh;628			rsrc_stats->non_dpp_pds = dev->pd_mgr->pd_norm_thrsh;629		}630		dev->last_stats_time = jiffies;631	}632}633 634static ssize_t ocrdma_dbgfs_ops_write(struct file *filp,635					const char __user *buffer,636					size_t count, loff_t *ppos)637{638	char tmp_str[32];639	long reset;640	int status;641	struct ocrdma_stats *pstats = filp->private_data;642	struct ocrdma_dev *dev = pstats->dev;643 644	if (*ppos != 0 || count == 0 || count > sizeof(tmp_str))645		goto err;646 647	if (copy_from_user(tmp_str, buffer, count))648		goto err;649 650	tmp_str[count-1] = '\0';651	if (kstrtol(tmp_str, 10, &reset))652		goto err;653 654	switch (pstats->type) {655	case OCRDMA_RESET_STATS:656		if (reset) {657			status = ocrdma_mbx_rdma_stats(dev, true);658			if (status) {659				pr_err("Failed to reset stats = %d\n", status);660				goto err;661			}662		}663		break;664	default:665		goto err;666	}667 668	return count;669err:670	return -EFAULT;671}672 673void ocrdma_pma_counters(struct ocrdma_dev *dev, struct ib_mad *out_mad)674{675	struct ib_pma_portcounters *pma_cnt;676 677	pma_cnt = (void *)(out_mad->data + 40);678	ocrdma_update_stats(dev);679 680	pma_cnt->port_xmit_data    = cpu_to_be32(ocrdma_sysfs_xmit_data(dev));681	pma_cnt->port_rcv_data     = cpu_to_be32(ocrdma_sysfs_rcv_data(dev));682	pma_cnt->port_xmit_packets = cpu_to_be32(ocrdma_sysfs_xmit_pkts(dev));683	pma_cnt->port_rcv_packets  = cpu_to_be32(ocrdma_sysfs_rcv_pkts(dev));684}685 686static ssize_t ocrdma_dbgfs_ops_read(struct file *filp, char __user *buffer,687					size_t usr_buf_len, loff_t *ppos)688{689	struct ocrdma_stats *pstats = filp->private_data;690	struct ocrdma_dev *dev = pstats->dev;691	ssize_t status = 0;692	char *data = NULL;693 694	/* No partial reads */695	if (*ppos != 0)696		return 0;697 698	mutex_lock(&dev->stats_lock);699 700	ocrdma_update_stats(dev);701 702	switch (pstats->type) {703	case OCRDMA_RSRC_STATS:704		data = ocrdma_resource_stats(dev);705		break;706	case OCRDMA_RXSTATS:707		data = ocrdma_rx_stats(dev);708		break;709	case OCRDMA_WQESTATS:710		data = ocrdma_wqe_stats(dev);711		break;712	case OCRDMA_TXSTATS:713		data = ocrdma_tx_stats(dev);714		break;715	case OCRDMA_DB_ERRSTATS:716		data = ocrdma_db_errstats(dev);717		break;718	case OCRDMA_RXQP_ERRSTATS:719		data = ocrdma_rxqp_errstats(dev);720		break;721	case OCRDMA_TXQP_ERRSTATS:722		data = ocrdma_txqp_errstats(dev);723		break;724	case OCRDMA_TX_DBG_STATS:725		data = ocrdma_tx_dbg_stats(dev);726		break;727	case OCRDMA_RX_DBG_STATS:728		data = ocrdma_rx_dbg_stats(dev);729		break;730	case OCRDMA_DRV_STATS:731		data = ocrdma_driver_dbg_stats(dev);732		break;733 734	default:735		status = -EFAULT;736		goto exit;737	}738 739	if (usr_buf_len < strlen(data)) {740		status = -ENOSPC;741		goto exit;742	}743 744	status = simple_read_from_buffer(buffer, usr_buf_len, ppos, data,745					 strlen(data));746exit:747	mutex_unlock(&dev->stats_lock);748	return status;749}750 751static const struct file_operations ocrdma_dbg_ops = {752	.owner = THIS_MODULE,753	.open = simple_open,754	.read = ocrdma_dbgfs_ops_read,755	.write = ocrdma_dbgfs_ops_write,756};757 758void ocrdma_add_port_stats(struct ocrdma_dev *dev)759{760	const struct pci_dev *pdev = dev->nic_info.pdev;761 762	if (!ocrdma_dbgfs_dir)763		return;764 765	/* Create post stats base dir */766	dev->dir = debugfs_create_dir(pci_name(pdev), ocrdma_dbgfs_dir);767 768	dev->rsrc_stats.type = OCRDMA_RSRC_STATS;769	dev->rsrc_stats.dev = dev;770	debugfs_create_file("resource_stats", S_IRUSR, dev->dir,771			    &dev->rsrc_stats, &ocrdma_dbg_ops);772 773	dev->rx_stats.type = OCRDMA_RXSTATS;774	dev->rx_stats.dev = dev;775	debugfs_create_file("rx_stats", S_IRUSR, dev->dir, &dev->rx_stats,776			    &ocrdma_dbg_ops);777 778	dev->wqe_stats.type = OCRDMA_WQESTATS;779	dev->wqe_stats.dev = dev;780	debugfs_create_file("wqe_stats", S_IRUSR, dev->dir, &dev->wqe_stats,781			    &ocrdma_dbg_ops);782 783	dev->tx_stats.type = OCRDMA_TXSTATS;784	dev->tx_stats.dev = dev;785	debugfs_create_file("tx_stats", S_IRUSR, dev->dir, &dev->tx_stats,786			    &ocrdma_dbg_ops);787 788	dev->db_err_stats.type = OCRDMA_DB_ERRSTATS;789	dev->db_err_stats.dev = dev;790	debugfs_create_file("db_err_stats", S_IRUSR, dev->dir,791			    &dev->db_err_stats, &ocrdma_dbg_ops);792 793	dev->tx_qp_err_stats.type = OCRDMA_TXQP_ERRSTATS;794	dev->tx_qp_err_stats.dev = dev;795	debugfs_create_file("tx_qp_err_stats", S_IRUSR, dev->dir,796			    &dev->tx_qp_err_stats, &ocrdma_dbg_ops);797 798	dev->rx_qp_err_stats.type = OCRDMA_RXQP_ERRSTATS;799	dev->rx_qp_err_stats.dev = dev;800	debugfs_create_file("rx_qp_err_stats", S_IRUSR, dev->dir,801			    &dev->rx_qp_err_stats, &ocrdma_dbg_ops);802 803	dev->tx_dbg_stats.type = OCRDMA_TX_DBG_STATS;804	dev->tx_dbg_stats.dev = dev;805	debugfs_create_file("tx_dbg_stats", S_IRUSR, dev->dir,806			    &dev->tx_dbg_stats, &ocrdma_dbg_ops);807 808	dev->rx_dbg_stats.type = OCRDMA_RX_DBG_STATS;809	dev->rx_dbg_stats.dev = dev;810	debugfs_create_file("rx_dbg_stats", S_IRUSR, dev->dir,811			    &dev->rx_dbg_stats, &ocrdma_dbg_ops);812 813	dev->driver_stats.type = OCRDMA_DRV_STATS;814	dev->driver_stats.dev = dev;815	debugfs_create_file("driver_dbg_stats", S_IRUSR, dev->dir,816			    &dev->driver_stats, &ocrdma_dbg_ops);817 818	dev->reset_stats.type = OCRDMA_RESET_STATS;819	dev->reset_stats.dev = dev;820	debugfs_create_file("reset_stats", 0200, dev->dir, &dev->reset_stats,821			    &ocrdma_dbg_ops);822}823 824void ocrdma_rem_port_stats(struct ocrdma_dev *dev)825{826	debugfs_remove_recursive(dev->dir);827}828 829void ocrdma_init_debugfs(void)830{831	/* Create base dir in debugfs root dir */832	ocrdma_dbgfs_dir = debugfs_create_dir("ocrdma", NULL);833}834 835void ocrdma_rem_debugfs(void)836{837	debugfs_remove_recursive(ocrdma_dbgfs_dir);838}839