1250661Sdavidcs/*
2250661Sdavidcs * Copyright (c) 2013-2014 Qlogic Corporation
3250661Sdavidcs * All rights reserved.
4250661Sdavidcs *
5250661Sdavidcs *  Redistribution and use in source and binary forms, with or without
6250661Sdavidcs *  modification, are permitted provided that the following conditions
7250661Sdavidcs *  are met:
8250661Sdavidcs *
9250661Sdavidcs *  1. Redistributions of source code must retain the above copyright
10250661Sdavidcs *     notice, this list of conditions and the following disclaimer.
11250661Sdavidcs *  2. Redistributions in binary form must reproduce the above copyright
12250661Sdavidcs *     notice, this list of conditions and the following disclaimer in the
13250661Sdavidcs *     documentation and/or other materials provided with the distribution.
14250661Sdavidcs *
15250661Sdavidcs *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16250661Sdavidcs *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17250661Sdavidcs *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18250661Sdavidcs *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19250661Sdavidcs *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20250661Sdavidcs *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21250661Sdavidcs *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22250661Sdavidcs *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23250661Sdavidcs *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24250661Sdavidcs *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25250661Sdavidcs *  POSSIBILITY OF SUCH DAMAGE.
26250661Sdavidcs */
27250661Sdavidcs/*
28250661Sdavidcs * File : ql_dbg.c
29250661Sdavidcs * Author : David C Somayajulu, Qlogic Corporation, Aliso Viejo, CA 92656.
30250661Sdavidcs */
31250661Sdavidcs#include <sys/cdefs.h>
32250661Sdavidcs__FBSDID("$FreeBSD$");
33250661Sdavidcs
34250661Sdavidcs#include "ql_os.h"
35250661Sdavidcs#include "ql_hw.h"
36250661Sdavidcs#include "ql_def.h"
37250661Sdavidcs#include "ql_inline.h"
38250661Sdavidcs#include "ql_ver.h"
39250661Sdavidcs#include "ql_glbl.h"
40250661Sdavidcs#include "ql_dbg.h"
41250661Sdavidcs
42250661Sdavidcs/*
43250661Sdavidcs * Name: ql_dump_buf32
44250661Sdavidcs * Function: dumps a buffer as 32 bit words
45250661Sdavidcs */
46250661Sdavidcsvoid ql_dump_buf32(qla_host_t *ha, const char *msg, void *dbuf32, uint32_t len32)
47250661Sdavidcs{
48250661Sdavidcs        device_t dev;
49250661Sdavidcs	uint32_t i = 0;
50250661Sdavidcs	uint32_t *buf;
51250661Sdavidcs
52250661Sdavidcs        dev = ha->pci_dev;
53250661Sdavidcs	buf = dbuf32;
54250661Sdavidcs
55250661Sdavidcs	device_printf(dev, "%s: %s dump start\n", __func__, msg);
56250661Sdavidcs
57250661Sdavidcs	while (len32 >= 4) {
58250661Sdavidcs		device_printf(dev,"0x%08x: 0x%08x 0x%08x 0x%08x 0x%08x\n",
59250661Sdavidcs			i, buf[0], buf[1], buf[2], buf[3]);
60250661Sdavidcs		i += 4 * 4;
61250661Sdavidcs		len32 -= 4;
62250661Sdavidcs		buf += 4;
63250661Sdavidcs	}
64250661Sdavidcs	switch (len32) {
65250661Sdavidcs	case 1:
66250661Sdavidcs		device_printf(dev,"0x%08x: 0x%08x\n", i, buf[0]);
67250661Sdavidcs		break;
68250661Sdavidcs	case 2:
69250661Sdavidcs		device_printf(dev,"0x%08x: 0x%08x 0x%08x\n", i, buf[0], buf[1]);
70250661Sdavidcs		break;
71250661Sdavidcs	case 3:
72250661Sdavidcs		device_printf(dev,"0x%08x: 0x%08x 0x%08x 0x%08x\n",
73250661Sdavidcs			i, buf[0], buf[1], buf[2]);
74250661Sdavidcs		break;
75250661Sdavidcs	default:
76250661Sdavidcs		break;
77250661Sdavidcs	}
78250661Sdavidcs	device_printf(dev, "%s: %s dump end\n", __func__, msg);
79250661Sdavidcs}
80250661Sdavidcs
81250661Sdavidcs/*
82250661Sdavidcs * Name: ql_dump_buf16
83250661Sdavidcs * Function: dumps a buffer as 16 bit words
84250661Sdavidcs */
85250661Sdavidcsvoid ql_dump_buf16(qla_host_t *ha, const char *msg, void *dbuf16, uint32_t len16)
86250661Sdavidcs{
87250661Sdavidcs        device_t dev;
88250661Sdavidcs	uint32_t i = 0;
89250661Sdavidcs	uint16_t *buf;
90250661Sdavidcs
91250661Sdavidcs        dev = ha->pci_dev;
92250661Sdavidcs	buf = dbuf16;
93250661Sdavidcs
94250661Sdavidcs	device_printf(dev, "%s: %s dump start\n", __func__, msg);
95250661Sdavidcs
96250661Sdavidcs	while (len16 >= 8) {
97250661Sdavidcs		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x 0x%04x"
98250661Sdavidcs			" 0x%04x 0x%04x 0x%04x 0x%04x\n", i, buf[0],
99250661Sdavidcs			buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
100250661Sdavidcs		i += 16;
101250661Sdavidcs		len16 -= 8;
102250661Sdavidcs		buf += 8;
103250661Sdavidcs	}
104250661Sdavidcs	switch (len16) {
105250661Sdavidcs	case 1:
106250661Sdavidcs		device_printf(dev,"0x%08x: 0x%04x\n", i, buf[0]);
107250661Sdavidcs		break;
108250661Sdavidcs	case 2:
109250661Sdavidcs		device_printf(dev,"0x%08x: 0x%04x 0x%04x\n", i, buf[0], buf[1]);
110250661Sdavidcs		break;
111250661Sdavidcs	case 3:
112250661Sdavidcs		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x\n",
113250661Sdavidcs			i, buf[0], buf[1], buf[2]);
114250661Sdavidcs		break;
115250661Sdavidcs	case 4:
116250661Sdavidcs		device_printf(dev,"0x%08x: 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
117250661Sdavidcs			buf[0], buf[1], buf[2], buf[3]);
118250661Sdavidcs		break;
119250661Sdavidcs	case 5:
120250661Sdavidcs		device_printf(dev,"0x%08x:"
121250661Sdavidcs			" 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
122250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4]);
123250661Sdavidcs		break;
124250661Sdavidcs	case 6:
125250661Sdavidcs		device_printf(dev,"0x%08x:"
126250661Sdavidcs			" 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x 0x%04x\n", i,
127250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
128250661Sdavidcs		break;
129250661Sdavidcs	case 7:
130250661Sdavidcs		device_printf(dev,"0x%04x: 0x%04x 0x%04x 0x%04x 0x%04x"
131250661Sdavidcs			" 0x%04x 0x%04x 0x%04x\n", i, buf[0], buf[1],
132250661Sdavidcs			buf[2], buf[3], buf[4], buf[5], buf[6]);
133250661Sdavidcs		break;
134250661Sdavidcs	default:
135250661Sdavidcs		break;
136250661Sdavidcs	}
137250661Sdavidcs	device_printf(dev, "%s: %s dump end\n", __func__, msg);
138250661Sdavidcs}
139250661Sdavidcs
140250661Sdavidcs/*
141250661Sdavidcs * Name: ql_dump_buf8
142250661Sdavidcs * Function: dumps a buffer as bytes
143250661Sdavidcs */
144250661Sdavidcsvoid ql_dump_buf8(qla_host_t *ha, const char *msg, void *dbuf, uint32_t len)
145250661Sdavidcs{
146250661Sdavidcs        device_t dev;
147250661Sdavidcs	uint32_t i = 0;
148250661Sdavidcs	uint8_t *buf;
149250661Sdavidcs
150250661Sdavidcs        dev = ha->pci_dev;
151250661Sdavidcs	buf = dbuf;
152250661Sdavidcs
153250661Sdavidcs	device_printf(dev, "%s: %s 0x%x dump start\n", __func__, msg, len);
154250661Sdavidcs
155250661Sdavidcs	while (len >= 16) {
156250661Sdavidcs		device_printf(dev,"0x%08x:"
157250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
158250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x\n", i,
159250661Sdavidcs			buf[0], buf[1], buf[2], buf[3],
160250661Sdavidcs			buf[4], buf[5], buf[6], buf[7],
161250661Sdavidcs			buf[8], buf[9], buf[10], buf[11],
162250661Sdavidcs			buf[12], buf[13], buf[14], buf[15]);
163250661Sdavidcs		i += 16;
164250661Sdavidcs		len -= 16;
165250661Sdavidcs		buf += 16;
166250661Sdavidcs	}
167250661Sdavidcs	switch (len) {
168250661Sdavidcs	case 1:
169250661Sdavidcs		device_printf(dev,"0x%08x: %02x\n", i, buf[0]);
170250661Sdavidcs		break;
171250661Sdavidcs	case 2:
172250661Sdavidcs		device_printf(dev,"0x%08x: %02x %02x\n", i, buf[0], buf[1]);
173250661Sdavidcs		break;
174250661Sdavidcs	case 3:
175250661Sdavidcs		device_printf(dev,"0x%08x: %02x %02x %02x\n",
176250661Sdavidcs			i, buf[0], buf[1], buf[2]);
177250661Sdavidcs		break;
178250661Sdavidcs	case 4:
179250661Sdavidcs		device_printf(dev,"0x%08x: %02x %02x %02x %02x\n", i,
180250661Sdavidcs			buf[0], buf[1], buf[2], buf[3]);
181250661Sdavidcs		break;
182250661Sdavidcs	case 5:
183250661Sdavidcs		device_printf(dev,"0x%08x:"
184250661Sdavidcs			" %02x %02x %02x %02x %02x\n", i,
185250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4]);
186250661Sdavidcs		break;
187250661Sdavidcs	case 6:
188250661Sdavidcs		device_printf(dev,"0x%08x:"
189250661Sdavidcs			" %02x %02x %02x %02x %02x %02x\n", i,
190250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
191250661Sdavidcs		break;
192250661Sdavidcs	case 7:
193250661Sdavidcs		device_printf(dev,"0x%08x:"
194250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x\n", i,
195250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
196250661Sdavidcs		break;
197250661Sdavidcs	case 8:
198250661Sdavidcs		device_printf(dev,"0x%08x:"
199250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x\n", i,
200250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
201250661Sdavidcs			buf[7]);
202250661Sdavidcs		break;
203250661Sdavidcs	case 9:
204250661Sdavidcs		device_printf(dev,"0x%08x:"
205250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
206250661Sdavidcs			" %02x\n", i,
207250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
208250661Sdavidcs			buf[7], buf[8]);
209250661Sdavidcs		break;
210250661Sdavidcs	case 10:
211250661Sdavidcs		device_printf(dev,"0x%08x:"
212250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
213250661Sdavidcs			" %02x %02x\n", i,
214250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
215250661Sdavidcs			buf[7], buf[8], buf[9]);
216250661Sdavidcs		break;
217250661Sdavidcs	case 11:
218250661Sdavidcs		device_printf(dev,"0x%08x:"
219250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
220250661Sdavidcs			" %02x %02x %02x\n", i,
221250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
222250661Sdavidcs			buf[7], buf[8], buf[9], buf[10]);
223250661Sdavidcs		break;
224250661Sdavidcs	case 12:
225250661Sdavidcs		device_printf(dev,"0x%08x:"
226250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
227250661Sdavidcs			" %02x %02x %02x %02x\n", i,
228250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
229250661Sdavidcs			buf[7], buf[8], buf[9], buf[10], buf[11]);
230250661Sdavidcs		break;
231250661Sdavidcs	case 13:
232250661Sdavidcs		device_printf(dev,"0x%08x:"
233250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
234250661Sdavidcs			" %02x %02x %02x %02x %02x\n", i,
235250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
236250661Sdavidcs			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12]);
237250661Sdavidcs		break;
238250661Sdavidcs	case 14:
239250661Sdavidcs		device_printf(dev,"0x%08x:"
240250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
241250661Sdavidcs			" %02x %02x %02x %02x %02x %02x\n", i,
242250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
243250661Sdavidcs			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12],
244250661Sdavidcs			buf[13]);
245250661Sdavidcs		break;
246250661Sdavidcs	case 15:
247250661Sdavidcs		device_printf(dev,"0x%08x:"
248250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x %02x"
249250661Sdavidcs			" %02x %02x %02x %02x %02x %02x %02x\n", i,
250250661Sdavidcs			buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6],
251250661Sdavidcs			buf[7], buf[8], buf[9], buf[10], buf[11], buf[12],
252250661Sdavidcs			buf[13], buf[14]);
253250661Sdavidcs		break;
254250661Sdavidcs	default:
255250661Sdavidcs		break;
256250661Sdavidcs	}
257250661Sdavidcs
258250661Sdavidcs	device_printf(dev, "%s: %s dump end\n", __func__, msg);
259250661Sdavidcs}
260250661Sdavidcs
261