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