1252206Sdavidcs/*
2252206Sdavidcs * Copyright (c) 2013-2014 Qlogic Corporation
3252206Sdavidcs * All rights reserved.
4252206Sdavidcs *
5252206Sdavidcs *  Redistribution and use in source and binary forms, with or without
6252206Sdavidcs *  modification, are permitted provided that the following conditions
7252206Sdavidcs *  are met:
8252206Sdavidcs *
9252206Sdavidcs *  1. Redistributions of source code must retain the above copyright
10252206Sdavidcs *     notice, this list of conditions and the following disclaimer.
11252206Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12252206Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13252206Sdavidcs *     documentation and/or other materials provided with the distribution.
14252206Sdavidcs *
15252206Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16252206Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17252206Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18252206Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19252206Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20252206Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21252206Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22252206Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23252206Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24252206Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25252206Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26252206Sdavidcs */
27252206Sdavidcs/*
28252206Sdavidcs * File : qls_dbg.c
29252206Sdavidcs * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656.
30252206Sdavidcs */
31252206Sdavidcs#include <sys/cdefs.h>
32252206Sdavidcs__FBSDID("$FreeBSD: releng/11.0/sys/dev/qlxge/qls_dbg.c 252206 2013-06-25 17:50:22Z davidcs $");
33252206Sdavidcs
34252206Sdavidcs#include "qls_os.h"
35252206Sdavidcs#include "qls_hw.h"
36252206Sdavidcs#include "qls_def.h"
37252206Sdavidcs#include "qls_inline.h"
38252206Sdavidcs#include "qls_ver.h"
39252206Sdavidcs#include "qls_glbl.h"
40252206Sdavidcs#include "qls_dbg.h"
41252206Sdavidcs
42252206Sdavidcs
43252206Sdavidcsuint32_t qls_dbg_level = 0 ;
44252206Sdavidcs/*
45252206Sdavidcs * Name: qls_dump_buf32
46252206Sdavidcs * Function: dumps a buffer as 32 bit words
47252206Sdavidcs */
48252206Sdavidcsvoid
49252206Sdavidcsqls_dump_buf32(qla_host_t *ha, const char *msg, void *dbuf32, uint32_t len32)
50252206Sdavidcs{
51252206Sdavidcs        device_t dev;
52252206Sdavidcs	uint32_t i = 0;
53252206Sdavidcs	uint32_t *buf;
54252206Sdavidcs
55252206Sdavidcs        dev = ha->pci_dev;
56252206Sdavidcs	buf = dbuf32;
57252206Sdavidcs
58252206Sdavidcs	device_printf(dev, "%s: %s dump start\n", __func__, msg);
59252206Sdavidcs
60252206Sdavidcs	while (len32 >= 4) {
61252206Sdavidcs		device_printf(dev,"0x%08x:\t0x%08x, 0x%08x, 0x%08x, 0x%08x,\n",
62252206Sdavidcs			i, buf[0], buf[1], buf[2], buf[3]);
63252206Sdavidcs		i += 4 * 4;
64252206Sdavidcs		len32 -= 4;
65252206Sdavidcs		buf += 4;
66252206Sdavidcs	}
67252206Sdavidcs	switch (len32) {
68252206Sdavidcs	case 1:
69252206Sdavidcs		device_printf(dev,"0x%08x: 0x%08x\n", i, buf[0]);
70252206Sdavidcs		break;
71252206Sdavidcs	case 2:
72252206Sdavidcs		device_printf(dev,"0x%08x: 0x%08x 0x%08x\n", i, buf[0], buf[1]);
73252206Sdavidcs		break;
74252206Sdavidcs	case 3:
75252206Sdavidcs		device_printf(dev,"0x%08x: 0x%08x 0x%08x 0x%08x\n",
76252206Sdavidcs			i, buf[0], buf[1], buf[2]);
77252206Sdavidcs		break;
78252206Sdavidcs	default:
79252206Sdavidcs		break;
80252206Sdavidcs	}
81252206Sdavidcs	device_printf(dev, "%s: %s dump end\n", __func__, msg);
82252206Sdavidcs
83252206Sdavidcs	return;
84252206Sdavidcs}
85252206Sdavidcs
86252206Sdavidcs/*
87252206Sdavidcs * Name: qls_dump_buf16
88252206Sdavidcs * Function: dumps a buffer as 16 bit words
89252206Sdavidcs */
90252206Sdavidcsvoid
91252206Sdavidcsqls_dump_buf16(qla_host_t *ha, const char *msg, void *dbuf16, uint32_t len16)
92252206Sdavidcs{
93252206Sdavidcs        device_t dev;
94252206Sdavidcs	uint32_t i = 0;
95252206Sdavidcs	uint16_t *buf;
96252206Sdavidcs
97252206Sdavidcs        dev = ha->pci_dev;
98252206Sdavidcs	buf = dbuf16;
99252206Sdavidcs
100252206Sdavidcs	device_printf(dev, "%s: %s dump start\n", __func__, msg);
101252206Sdavidcs
102252206Sdavidcs	while (len16 >= 8) {
103252206Sdavidcs		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x 0x%04x"
104252206Sdavidcs			" 0x%04x 0x%04x 0x%04x 0x%04x\n", i, buf[0],
105252206Sdavidcs			buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
106252206Sdavidcs		i += 16;
107252206Sdavidcs		len16 -= 8;
108252206Sdavidcs		buf += 8;
109252206Sdavidcs	}
110252206Sdavidcs	switch (len16) {
111252206Sdavidcs	case 1:
112252206Sdavidcs		device_printf(dev,"0x%08x: 0x%04x\n", i, buf[0]);
113252206Sdavidcs		break;
114252206Sdavidcs	case 2:
115252206Sdavidcs		device_printf(dev,"0x%08x: 0x%04x 0x%04x\n", i, buf[0], buf[1]);
116252206Sdavidcs		break;
117252206Sdavidcs	case 3:
118252206Sdavidcs		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x\n",
119252206Sdavidcs			i, buf[0], buf[1], buf[2]);
120252206Sdavidcs		break;
121252206Sdavidcs	case 4:
122252206Sdavidcs		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
123252206Sdavidcs			buf[0], buf[1], buf[2], buf[3]);
124252206Sdavidcs		break;
125252206Sdavidcs	case 5:
126252206Sdavidcs		device_printf(dev,"0x%08x:"
127252206Sdavidcs			" 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
128252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4]);
129252206Sdavidcs		break;
130252206Sdavidcs	case 6:
131252206Sdavidcs		device_printf(dev,"0x%08x:"
132252206Sdavidcs			" 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
133252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
134252206Sdavidcs		break;
135252206Sdavidcs	case 7:
136252206Sdavidcs		device_printf(dev,"0x%04x: 0x%04x 0x%04x 0x%04x 0x%04x"
137252206Sdavidcs			" 0x%04x 0x%04x 0x%04x\n", i, buf[0], buf[1],
138252206Sdavidcs			buf[2], buf[3], buf[4], buf[5], buf[6]);
139252206Sdavidcs		break;
140252206Sdavidcs	default:
141252206Sdavidcs		break;
142252206Sdavidcs	}
143252206Sdavidcs	device_printf(dev, "%s: %s dump end\n", __func__, msg);
144252206Sdavidcs
145252206Sdavidcs	return;
146252206Sdavidcs}
147252206Sdavidcs
148252206Sdavidcs/*
149252206Sdavidcs * Name: qls_dump_buf8
150252206Sdavidcs * Function: dumps a buffer as bytes
151252206Sdavidcs */
152252206Sdavidcsvoid
153252206Sdavidcsqls_dump_buf8(qla_host_t *ha, const char *msg, void *dbuf, uint32_t len)
154252206Sdavidcs{
155252206Sdavidcs        device_t dev;
156252206Sdavidcs	uint32_t i = 0;
157252206Sdavidcs	uint8_t *buf;
158252206Sdavidcs
159252206Sdavidcs        dev = ha->pci_dev;
160252206Sdavidcs	buf = dbuf;
161252206Sdavidcs
162252206Sdavidcs	device_printf(dev, "%s: %s 0x%x dump start\n", __func__, msg, len);
163252206Sdavidcs
164252206Sdavidcs	while (len >= 16) {
165252206Sdavidcs		device_printf(dev,"0x%08x:"
166252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
167252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x\n", i,
168252206Sdavidcs			buf[0], buf[1], buf[2], buf[3],
169252206Sdavidcs			buf[4], buf[5], buf[6], buf[7],
170252206Sdavidcs			buf[8], buf[9], buf[10], buf[11],
171252206Sdavidcs			buf[12], buf[13], buf[14], buf[15]);
172252206Sdavidcs		i += 16;
173252206Sdavidcs		len -= 16;
174252206Sdavidcs		buf += 16;
175252206Sdavidcs	}
176252206Sdavidcs	switch (len) {
177252206Sdavidcs	case 1:
178252206Sdavidcs		device_printf(dev,"0x%08x: %02x\n", i, buf[0]);
179252206Sdavidcs		break;
180252206Sdavidcs	case 2:
181252206Sdavidcs		device_printf(dev,"0x%08x: %02x %02x\n", i, buf[0], buf[1]);
182252206Sdavidcs		break;
183252206Sdavidcs	case 3:
184252206Sdavidcs		device_printf(dev,"0x%08x: %02x %02x %02x\n",
185252206Sdavidcs			i, buf[0], buf[1], buf[2]);
186252206Sdavidcs		break;
187252206Sdavidcs	case 4:
188252206Sdavidcs		device_printf(dev,"0x%08x: %02x %02x %02x %02x\n", i,
189252206Sdavidcs			buf[0], buf[1], buf[2], buf[3]);
190252206Sdavidcs		break;
191252206Sdavidcs	case 5:
192252206Sdavidcs		device_printf(dev,"0x%08x:"
193252206Sdavidcs			" %02x %02x %02x %02x %02x\n", i,
194252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4]);
195252206Sdavidcs		break;
196252206Sdavidcs	case 6:
197252206Sdavidcs		device_printf(dev,"0x%08x:"
198252206Sdavidcs			" %02x %02x %02x %02x %02x %02x\n", i,
199252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
200252206Sdavidcs		break;
201252206Sdavidcs	case 7:
202252206Sdavidcs		device_printf(dev,"0x%08x:"
203252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x\n", i,
204252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
205252206Sdavidcs		break;
206252206Sdavidcs	case 8:
207252206Sdavidcs		device_printf(dev,"0x%08x:"
208252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x\n", i,
209252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
210252206Sdavidcs			buf[7]);
211252206Sdavidcs		break;
212252206Sdavidcs	case 9:
213252206Sdavidcs		device_printf(dev,"0x%08x:"
214252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
215252206Sdavidcs			" %02x\n", i,
216252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
217252206Sdavidcs			buf[7], buf[8]);
218252206Sdavidcs		break;
219252206Sdavidcs	case 10:
220252206Sdavidcs		device_printf(dev,"0x%08x:"
221252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
222252206Sdavidcs			" %02x %02x\n", i,
223252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
224252206Sdavidcs			buf[7], buf[8], buf[9]);
225252206Sdavidcs		break;
226252206Sdavidcs	case 11:
227252206Sdavidcs		device_printf(dev,"0x%08x:"
228252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
229252206Sdavidcs			" %02x %02x %02x\n", i,
230252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
231252206Sdavidcs			buf[7], buf[8], buf[9], buf[10]);
232252206Sdavidcs		break;
233252206Sdavidcs	case 12:
234252206Sdavidcs		device_printf(dev,"0x%08x:"
235252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
236252206Sdavidcs			" %02x %02x %02x %02x\n", i,
237252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
238252206Sdavidcs			buf[7], buf[8], buf[9], buf[10], buf[11]);
239252206Sdavidcs		break;
240252206Sdavidcs	case 13:
241252206Sdavidcs		device_printf(dev,"0x%08x:"
242252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
243252206Sdavidcs			" %02x %02x %02x %02x %02x\n", i,
244252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
245252206Sdavidcs			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12]);
246252206Sdavidcs		break;
247252206Sdavidcs	case 14:
248252206Sdavidcs		device_printf(dev,"0x%08x:"
249252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
250252206Sdavidcs			" %02x %02x %02x %02x %02x %02x\n", i,
251252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
252252206Sdavidcs			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12],
253252206Sdavidcs			buf[13]);
254252206Sdavidcs		break;
255252206Sdavidcs	case 15:
256252206Sdavidcs		device_printf(dev,"0x%08x:"
257252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
258252206Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x\n", i,
259252206Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
260252206Sdavidcs			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12],
261252206Sdavidcs			buf[13], buf[14]);
262252206Sdavidcs		break;
263252206Sdavidcs	default:
264252206Sdavidcs		break;
265252206Sdavidcs	}
266252206Sdavidcs
267252206Sdavidcs	device_printf(dev, "%s: %s dump end\n", __func__, msg);
268252206Sdavidcs
269252206Sdavidcs	return;
270252206Sdavidcs}
271252206Sdavidcs
272252206Sdavidcsvoid
273252206Sdavidcsqls_dump_cq(qla_host_t *ha)
274252206Sdavidcs{
275252206Sdavidcs	qls_dump_buf32(ha, "cq_icb", ha->rx_ring[0].cq_icb_vaddr,
276252206Sdavidcs		(sizeof (q81_cq_icb_t) >> 2));
277252206Sdavidcs
278252206Sdavidcs	device_printf(ha->pci_dev, "%s: lbq_addr_tbl_paddr  %p\n", __func__,
279252206Sdavidcs		(void *)ha->rx_ring[0].lbq_addr_tbl_paddr);
280252206Sdavidcs
281252206Sdavidcs	qls_dump_buf32(ha, "lbq_addr_tbl", ha->rx_ring[0].lbq_addr_tbl_vaddr,
282252206Sdavidcs		(PAGE_SIZE >> 2));
283252206Sdavidcs
284252206Sdavidcs	device_printf(ha->pci_dev, "%s: lbq_paddr  %p\n", __func__,
285252206Sdavidcs		(void *)ha->rx_ring[0].lbq_paddr);
286252206Sdavidcs
287252206Sdavidcs	qls_dump_buf32(ha, "lbq", ha->rx_ring[0].lbq_vaddr,
288252206Sdavidcs		(QLA_LBQ_SIZE >> 2));
289252206Sdavidcs
290252206Sdavidcs	device_printf(ha->pci_dev, "%s: sbq_addr_tbl_paddr  %p\n", __func__,
291252206Sdavidcs		(void *)ha->rx_ring[0].sbq_addr_tbl_paddr);
292252206Sdavidcs
293252206Sdavidcs	qls_dump_buf32(ha, "sbq_addr_tbl", ha->rx_ring[0].sbq_addr_tbl_vaddr,
294252206Sdavidcs		(PAGE_SIZE >> 2));
295252206Sdavidcs
296252206Sdavidcs	device_printf(ha->pci_dev, "%s: sbq_paddr  %p\n", __func__,
297252206Sdavidcs		(void *)ha->rx_ring[0].sbq_paddr);
298252206Sdavidcs
299252206Sdavidcs	qls_dump_buf32(ha, "sbq", ha->rx_ring[0].sbq_vaddr,
300252206Sdavidcs		(QLA_SBQ_SIZE >> 2) );
301252206Sdavidcs
302252206Sdavidcs	device_printf(ha->pci_dev, "%s: lb_paddr  %p\n", __func__,
303252206Sdavidcs		(void *)ha->rx_ring[0].lb_paddr);
304252206Sdavidcs
305252206Sdavidcs	return;
306252206Sdavidcs}
307252206Sdavidcs
308