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