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