1/*
2 * Copyright (c) 2013-2014 Qlogic Corporation
3 * All rights reserved.
4 *
5 *  Redistribution and use in source and binary forms, with or without
6 *  modification, are permitted provided that the following conditions
7 *  are met:
8 *
9 *  1. Redistributions of source code must retain the above copyright
10 *     notice, this list of conditions and the following disclaimer.
11 *  2. Redistributions in binary form must reproduce the above copyright
12 *     notice, this list of conditions and the following disclaimer in the
13 *     documentation and/or other materials provided with the distribution.
14 *
15 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 *  POSSIBILITY OF SUCH DAMAGE.
26 */
27/*
28 * File : qls_dbg.c
29 * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656.
30 */
31#include <sys/cdefs.h>
32__FBSDID("$FreeBSD$");
33
34#include "qls_os.h"
35#include "qls_hw.h"
36#include "qls_def.h"
37#include "qls_inline.h"
38#include "qls_ver.h"
39#include "qls_glbl.h"
40#include "qls_dbg.h"
41
42
43uint32_t qls_dbg_level = 0 ;
44/*
45 * Name: qls_dump_buf32
46 * Function: dumps a buffer as 32 bit words
47 */
48void
49qls_dump_buf32(qla_host_t *ha, const char *msg, void *dbuf32, uint32_t len32)
50{
51        device_t dev;
52	uint32_t i = 0;
53	uint32_t *buf;
54
55        dev = ha->pci_dev;
56	buf = dbuf32;
57
58	device_printf(dev, "%s: %s dump start\n", __func__, msg);
59
60	while (len32 >= 4) {
61		device_printf(dev,"0x%08x:\t0x%08x, 0x%08x, 0x%08x, 0x%08x,\n",
62			i, buf[0], buf[1], buf[2], buf[3]);
63		i += 4 * 4;
64		len32 -= 4;
65		buf += 4;
66	}
67	switch (len32) {
68	case 1:
69		device_printf(dev,"0x%08x: 0x%08x\n", i, buf[0]);
70		break;
71	case 2:
72		device_printf(dev,"0x%08x: 0x%08x 0x%08x\n", i, buf[0], buf[1]);
73		break;
74	case 3:
75		device_printf(dev,"0x%08x: 0x%08x 0x%08x 0x%08x\n",
76			i, buf[0], buf[1], buf[2]);
77		break;
78	default:
79		break;
80	}
81	device_printf(dev, "%s: %s dump end\n", __func__, msg);
82
83	return;
84}
85
86/*
87 * Name: qls_dump_buf16
88 * Function: dumps a buffer as 16 bit words
89 */
90void
91qls_dump_buf16(qla_host_t *ha, const char *msg, void *dbuf16, uint32_t len16)
92{
93        device_t dev;
94	uint32_t i = 0;
95	uint16_t *buf;
96
97        dev = ha->pci_dev;
98	buf = dbuf16;
99
100	device_printf(dev, "%s: %s dump start\n", __func__, msg);
101
102	while (len16 >= 8) {
103		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x 0x%04x"
104			" 0x%04x 0x%04x 0x%04x 0x%04x\n", i, buf[0],
105			buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
106		i += 16;
107		len16 -= 8;
108		buf += 8;
109	}
110	switch (len16) {
111	case 1:
112		device_printf(dev,"0x%08x: 0x%04x\n", i, buf[0]);
113		break;
114	case 2:
115		device_printf(dev,"0x%08x: 0x%04x 0x%04x\n", i, buf[0], buf[1]);
116		break;
117	case 3:
118		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x\n",
119			i, buf[0], buf[1], buf[2]);
120		break;
121	case 4:
122		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
123			buf[0], buf[1], buf[2], buf[3]);
124		break;
125	case 5:
126		device_printf(dev,"0x%08x:"
127			" 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
128			buf[0], buf[1], buf[2], buf[3], buf[4]);
129		break;
130	case 6:
131		device_printf(dev,"0x%08x:"
132			" 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
133			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
134		break;
135	case 7:
136		device_printf(dev,"0x%04x: 0x%04x 0x%04x 0x%04x 0x%04x"
137			" 0x%04x 0x%04x 0x%04x\n", i, buf[0], buf[1],
138			buf[2], buf[3], buf[4], buf[5], buf[6]);
139		break;
140	default:
141		break;
142	}
143	device_printf(dev, "%s: %s dump end\n", __func__, msg);
144
145	return;
146}
147
148/*
149 * Name: qls_dump_buf8
150 * Function: dumps a buffer as bytes
151 */
152void
153qls_dump_buf8(qla_host_t *ha, const char *msg, void *dbuf, uint32_t len)
154{
155        device_t dev;
156	uint32_t i = 0;
157	uint8_t *buf;
158
159        dev = ha->pci_dev;
160	buf = dbuf;
161
162	device_printf(dev, "%s: %s 0x%x dump start\n", __func__, msg, len);
163
164	while (len >= 16) {
165		device_printf(dev,"0x%08x:"
166			" %02x %02x %02x %02x %02x %02x %02x %02x"
167			" %02x %02x %02x %02x %02x %02x %02x %02x\n", i,
168			buf[0], buf[1], buf[2], buf[3],
169			buf[4], buf[5], buf[6], buf[7],
170			buf[8], buf[9], buf[10], buf[11],
171			buf[12], buf[13], buf[14], buf[15]);
172		i += 16;
173		len -= 16;
174		buf += 16;
175	}
176	switch (len) {
177	case 1:
178		device_printf(dev,"0x%08x: %02x\n", i, buf[0]);
179		break;
180	case 2:
181		device_printf(dev,"0x%08x: %02x %02x\n", i, buf[0], buf[1]);
182		break;
183	case 3:
184		device_printf(dev,"0x%08x: %02x %02x %02x\n",
185			i, buf[0], buf[1], buf[2]);
186		break;
187	case 4:
188		device_printf(dev,"0x%08x: %02x %02x %02x %02x\n", i,
189			buf[0], buf[1], buf[2], buf[3]);
190		break;
191	case 5:
192		device_printf(dev,"0x%08x:"
193			" %02x %02x %02x %02x %02x\n", i,
194			buf[0], buf[1], buf[2], buf[3], buf[4]);
195		break;
196	case 6:
197		device_printf(dev,"0x%08x:"
198			" %02x %02x %02x %02x %02x %02x\n", i,
199			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
200		break;
201	case 7:
202		device_printf(dev,"0x%08x:"
203			" %02x %02x %02x %02x %02x %02x %02x\n", i,
204			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
205		break;
206	case 8:
207		device_printf(dev,"0x%08x:"
208			" %02x %02x %02x %02x %02x %02x %02x %02x\n", i,
209			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
210			buf[7]);
211		break;
212	case 9:
213		device_printf(dev,"0x%08x:"
214			" %02x %02x %02x %02x %02x %02x %02x %02x"
215			" %02x\n", i,
216			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
217			buf[7], buf[8]);
218		break;
219	case 10:
220		device_printf(dev,"0x%08x:"
221			" %02x %02x %02x %02x %02x %02x %02x %02x"
222			" %02x %02x\n", i,
223			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
224			buf[7], buf[8], buf[9]);
225		break;
226	case 11:
227		device_printf(dev,"0x%08x:"
228			" %02x %02x %02x %02x %02x %02x %02x %02x"
229			" %02x %02x %02x\n", i,
230			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
231			buf[7], buf[8], buf[9], buf[10]);
232		break;
233	case 12:
234		device_printf(dev,"0x%08x:"
235			" %02x %02x %02x %02x %02x %02x %02x %02x"
236			" %02x %02x %02x %02x\n", i,
237			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
238			buf[7], buf[8], buf[9], buf[10], buf[11]);
239		break;
240	case 13:
241		device_printf(dev,"0x%08x:"
242			" %02x %02x %02x %02x %02x %02x %02x %02x"
243			" %02x %02x %02x %02x %02x\n", i,
244			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
245			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12]);
246		break;
247	case 14:
248		device_printf(dev,"0x%08x:"
249			" %02x %02x %02x %02x %02x %02x %02x %02x"
250			" %02x %02x %02x %02x %02x %02x\n", i,
251			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
252			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12],
253			buf[13]);
254		break;
255	case 15:
256		device_printf(dev,"0x%08x:"
257			" %02x %02x %02x %02x %02x %02x %02x %02x"
258			" %02x %02x %02x %02x %02x %02x %02x\n", i,
259			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
260			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12],
261			buf[13], buf[14]);
262		break;
263	default:
264		break;
265	}
266
267	device_printf(dev, "%s: %s dump end\n", __func__, msg);
268
269	return;
270}
271
272void
273qls_dump_cq(qla_host_t *ha)
274{
275	qls_dump_buf32(ha, "cq_icb", ha->rx_ring[0].cq_icb_vaddr,
276		(sizeof (q81_cq_icb_t) >> 2));
277
278	device_printf(ha->pci_dev, "%s: lbq_addr_tbl_paddr  %p\n", __func__,
279		(void *)ha->rx_ring[0].lbq_addr_tbl_paddr);
280
281	qls_dump_buf32(ha, "lbq_addr_tbl", ha->rx_ring[0].lbq_addr_tbl_vaddr,
282		(PAGE_SIZE >> 2));
283
284	device_printf(ha->pci_dev, "%s: lbq_paddr  %p\n", __func__,
285		(void *)ha->rx_ring[0].lbq_paddr);
286
287	qls_dump_buf32(ha, "lbq", ha->rx_ring[0].lbq_vaddr,
288		(QLA_LBQ_SIZE >> 2));
289
290	device_printf(ha->pci_dev, "%s: sbq_addr_tbl_paddr  %p\n", __func__,
291		(void *)ha->rx_ring[0].sbq_addr_tbl_paddr);
292
293	qls_dump_buf32(ha, "sbq_addr_tbl", ha->rx_ring[0].sbq_addr_tbl_vaddr,
294		(PAGE_SIZE >> 2));
295
296	device_printf(ha->pci_dev, "%s: sbq_paddr  %p\n", __func__,
297		(void *)ha->rx_ring[0].sbq_paddr);
298
299	qls_dump_buf32(ha, "sbq", ha->rx_ring[0].sbq_vaddr,
300		(QLA_SBQ_SIZE >> 2) );
301
302	device_printf(ha->pci_dev, "%s: lb_paddr  %p\n", __func__,
303		(void *)ha->rx_ring[0].lb_paddr);
304
305	return;
306}
307
308