blob: 458d55ba423f599ec824dc327f248a9b64d8af96 [file] [log] [blame]
Joe Perches2037d5a2010-07-21 14:44:18 -07001#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
2
Tejun Heo5a0e3ad2010-03-24 17:04:11 +09003#include <linux/slab.h>
4
Ron Mercerc4e84bd2008-09-18 11:56:28 -04005#include "qlge.h"
6
Ron Mercer24bb55b2010-01-15 13:31:31 +00007/* Read a NIC register from the alternate function. */
8static u32 ql_read_other_func_reg(struct ql_adapter *qdev,
9 u32 reg)
10{
11 u32 register_to_read;
12 u32 reg_val;
13 unsigned int status = 0;
14
15 register_to_read = MPI_NIC_REG_BLOCK
16 | MPI_NIC_READ
17 | (qdev->alt_func << MPI_NIC_FUNCTION_SHIFT)
18 | reg;
19 status = ql_read_mpi_reg(qdev, register_to_read, &reg_val);
20 if (status != 0)
21 return 0xffffffff;
22
23 return reg_val;
24}
Ron Mercera61f8022009-10-21 11:07:41 +000025
Ron Mercera48c86f2010-01-15 13:31:32 +000026/* Write a NIC register from the alternate function. */
27static int ql_write_other_func_reg(struct ql_adapter *qdev,
28 u32 reg, u32 reg_val)
29{
30 u32 register_to_read;
31 int status = 0;
32
33 register_to_read = MPI_NIC_REG_BLOCK
34 | MPI_NIC_READ
35 | (qdev->alt_func << MPI_NIC_FUNCTION_SHIFT)
36 | reg;
37 status = ql_write_mpi_reg(qdev, register_to_read, reg_val);
38
39 return status;
40}
41
42static int ql_wait_other_func_reg_rdy(struct ql_adapter *qdev, u32 reg,
43 u32 bit, u32 err_bit)
44{
45 u32 temp;
46 int count = 10;
47
48 while (count) {
49 temp = ql_read_other_func_reg(qdev, reg);
50
51 /* check for errors */
52 if (temp & err_bit)
53 return -1;
54 else if (temp & bit)
55 return 0;
56 mdelay(10);
57 count--;
58 }
59 return -1;
60}
61
62static int ql_read_other_func_serdes_reg(struct ql_adapter *qdev, u32 reg,
63 u32 *data)
64{
65 int status;
66
67 /* wait for reg to come ready */
68 status = ql_wait_other_func_reg_rdy(qdev, XG_SERDES_ADDR / 4,
69 XG_SERDES_ADDR_RDY, 0);
70 if (status)
71 goto exit;
72
73 /* set up for reg read */
74 ql_write_other_func_reg(qdev, XG_SERDES_ADDR/4, reg | PROC_ADDR_R);
75
76 /* wait for reg to come ready */
77 status = ql_wait_other_func_reg_rdy(qdev, XG_SERDES_ADDR / 4,
78 XG_SERDES_ADDR_RDY, 0);
79 if (status)
80 goto exit;
81
82 /* get the data */
83 *data = ql_read_other_func_reg(qdev, (XG_SERDES_DATA / 4));
84exit:
85 return status;
86}
87
88/* Read out the SERDES registers */
Kumar Amit Mehtab82cf962012-11-04 19:11:32 +000089static int ql_read_serdes_reg(struct ql_adapter *qdev, u32 reg, u32 *data)
Ron Mercera48c86f2010-01-15 13:31:32 +000090{
91 int status;
92
93 /* wait for reg to come ready */
94 status = ql_wait_reg_rdy(qdev, XG_SERDES_ADDR, XG_SERDES_ADDR_RDY, 0);
95 if (status)
96 goto exit;
97
98 /* set up for reg read */
99 ql_write32(qdev, XG_SERDES_ADDR, reg | PROC_ADDR_R);
100
101 /* wait for reg to come ready */
102 status = ql_wait_reg_rdy(qdev, XG_SERDES_ADDR, XG_SERDES_ADDR_RDY, 0);
103 if (status)
104 goto exit;
105
106 /* get the data */
107 *data = ql_read32(qdev, XG_SERDES_DATA);
108exit:
109 return status;
110}
111
112static void ql_get_both_serdes(struct ql_adapter *qdev, u32 addr,
113 u32 *direct_ptr, u32 *indirect_ptr,
114 unsigned int direct_valid, unsigned int indirect_valid)
115{
116 unsigned int status;
117
118 status = 1;
119 if (direct_valid)
120 status = ql_read_serdes_reg(qdev, addr, direct_ptr);
121 /* Dead fill any failures or invalids. */
122 if (status)
123 *direct_ptr = 0xDEADBEEF;
124
125 status = 1;
126 if (indirect_valid)
127 status = ql_read_other_func_serdes_reg(
128 qdev, addr, indirect_ptr);
129 /* Dead fill any failures or invalids. */
130 if (status)
131 *indirect_ptr = 0xDEADBEEF;
132}
133
134static int ql_get_serdes_regs(struct ql_adapter *qdev,
135 struct ql_mpi_coredump *mpi_coredump)
136{
137 int status;
138 unsigned int xfi_direct_valid, xfi_indirect_valid, xaui_direct_valid;
139 unsigned int xaui_indirect_valid, i;
140 u32 *direct_ptr, temp;
141 u32 *indirect_ptr;
142
143 xfi_direct_valid = xfi_indirect_valid = 0;
144 xaui_direct_valid = xaui_indirect_valid = 1;
145
146 /* The XAUI needs to be read out per port */
Gustavo A. R. Silva4db93fb2017-08-12 20:58:40 -0500147 status = ql_read_other_func_serdes_reg(qdev,
148 XG_SERDES_XAUI_HSS_PCS_START, &temp);
149 if (status)
150 temp = XG_SERDES_ADDR_XAUI_PWR_DOWN;
Ron Mercera48c86f2010-01-15 13:31:32 +0000151
Gustavo A. R. Silva4db93fb2017-08-12 20:58:40 -0500152 if ((temp & XG_SERDES_ADDR_XAUI_PWR_DOWN) ==
153 XG_SERDES_ADDR_XAUI_PWR_DOWN)
154 xaui_indirect_valid = 0;
Ron Mercera48c86f2010-01-15 13:31:32 +0000155
Gustavo A. R. Silva4db93fb2017-08-12 20:58:40 -0500156 status = ql_read_serdes_reg(qdev, XG_SERDES_XAUI_HSS_PCS_START, &temp);
Ron Mercera48c86f2010-01-15 13:31:32 +0000157
Gustavo A. R. Silva4db93fb2017-08-12 20:58:40 -0500158 if (status)
159 temp = XG_SERDES_ADDR_XAUI_PWR_DOWN;
160
161 if ((temp & XG_SERDES_ADDR_XAUI_PWR_DOWN) ==
162 XG_SERDES_ADDR_XAUI_PWR_DOWN)
163 xaui_direct_valid = 0;
Ron Mercera48c86f2010-01-15 13:31:32 +0000164
165 /*
166 * XFI register is shared so only need to read one
167 * functions and then check the bits.
168 */
169 status = ql_read_serdes_reg(qdev, XG_SERDES_ADDR_STS, &temp);
170 if (status)
171 temp = 0;
172
173 if ((temp & XG_SERDES_ADDR_XFI1_PWR_UP) ==
174 XG_SERDES_ADDR_XFI1_PWR_UP) {
175 /* now see if i'm NIC 1 or NIC 2 */
176 if (qdev->func & 1)
177 /* I'm NIC 2, so the indirect (NIC1) xfi is up. */
178 xfi_indirect_valid = 1;
179 else
180 xfi_direct_valid = 1;
181 }
182 if ((temp & XG_SERDES_ADDR_XFI2_PWR_UP) ==
183 XG_SERDES_ADDR_XFI2_PWR_UP) {
184 /* now see if i'm NIC 1 or NIC 2 */
185 if (qdev->func & 1)
186 /* I'm NIC 2, so the indirect (NIC1) xfi is up. */
187 xfi_direct_valid = 1;
188 else
189 xfi_indirect_valid = 1;
190 }
191
192 /* Get XAUI_AN register block. */
193 if (qdev->func & 1) {
194 /* Function 2 is direct */
195 direct_ptr = mpi_coredump->serdes2_xaui_an;
196 indirect_ptr = mpi_coredump->serdes_xaui_an;
197 } else {
198 /* Function 1 is direct */
199 direct_ptr = mpi_coredump->serdes_xaui_an;
200 indirect_ptr = mpi_coredump->serdes2_xaui_an;
201 }
202
203 for (i = 0; i <= 0x000000034; i += 4, direct_ptr++, indirect_ptr++)
204 ql_get_both_serdes(qdev, i, direct_ptr, indirect_ptr,
205 xaui_direct_valid, xaui_indirect_valid);
206
207 /* Get XAUI_HSS_PCS register block. */
208 if (qdev->func & 1) {
209 direct_ptr =
210 mpi_coredump->serdes2_xaui_hss_pcs;
211 indirect_ptr =
212 mpi_coredump->serdes_xaui_hss_pcs;
213 } else {
214 direct_ptr =
215 mpi_coredump->serdes_xaui_hss_pcs;
216 indirect_ptr =
217 mpi_coredump->serdes2_xaui_hss_pcs;
218 }
219
220 for (i = 0x800; i <= 0x880; i += 4, direct_ptr++, indirect_ptr++)
221 ql_get_both_serdes(qdev, i, direct_ptr, indirect_ptr,
222 xaui_direct_valid, xaui_indirect_valid);
223
224 /* Get XAUI_XFI_AN register block. */
225 if (qdev->func & 1) {
226 direct_ptr = mpi_coredump->serdes2_xfi_an;
227 indirect_ptr = mpi_coredump->serdes_xfi_an;
228 } else {
229 direct_ptr = mpi_coredump->serdes_xfi_an;
230 indirect_ptr = mpi_coredump->serdes2_xfi_an;
231 }
232
233 for (i = 0x1000; i <= 0x1034; i += 4, direct_ptr++, indirect_ptr++)
234 ql_get_both_serdes(qdev, i, direct_ptr, indirect_ptr,
235 xfi_direct_valid, xfi_indirect_valid);
236
237 /* Get XAUI_XFI_TRAIN register block. */
238 if (qdev->func & 1) {
239 direct_ptr = mpi_coredump->serdes2_xfi_train;
240 indirect_ptr =
241 mpi_coredump->serdes_xfi_train;
242 } else {
243 direct_ptr = mpi_coredump->serdes_xfi_train;
244 indirect_ptr =
245 mpi_coredump->serdes2_xfi_train;
246 }
247
248 for (i = 0x1050; i <= 0x107c; i += 4, direct_ptr++, indirect_ptr++)
249 ql_get_both_serdes(qdev, i, direct_ptr, indirect_ptr,
250 xfi_direct_valid, xfi_indirect_valid);
251
252 /* Get XAUI_XFI_HSS_PCS register block. */
253 if (qdev->func & 1) {
254 direct_ptr =
255 mpi_coredump->serdes2_xfi_hss_pcs;
256 indirect_ptr =
257 mpi_coredump->serdes_xfi_hss_pcs;
258 } else {
259 direct_ptr =
260 mpi_coredump->serdes_xfi_hss_pcs;
261 indirect_ptr =
262 mpi_coredump->serdes2_xfi_hss_pcs;
263 }
264
265 for (i = 0x1800; i <= 0x1838; i += 4, direct_ptr++, indirect_ptr++)
266 ql_get_both_serdes(qdev, i, direct_ptr, indirect_ptr,
267 xfi_direct_valid, xfi_indirect_valid);
268
269 /* Get XAUI_XFI_HSS_TX register block. */
270 if (qdev->func & 1) {
271 direct_ptr =
272 mpi_coredump->serdes2_xfi_hss_tx;
273 indirect_ptr =
274 mpi_coredump->serdes_xfi_hss_tx;
275 } else {
276 direct_ptr = mpi_coredump->serdes_xfi_hss_tx;
277 indirect_ptr =
278 mpi_coredump->serdes2_xfi_hss_tx;
279 }
280 for (i = 0x1c00; i <= 0x1c1f; i++, direct_ptr++, indirect_ptr++)
281 ql_get_both_serdes(qdev, i, direct_ptr, indirect_ptr,
282 xfi_direct_valid, xfi_indirect_valid);
283
284 /* Get XAUI_XFI_HSS_RX register block. */
285 if (qdev->func & 1) {
286 direct_ptr =
287 mpi_coredump->serdes2_xfi_hss_rx;
288 indirect_ptr =
289 mpi_coredump->serdes_xfi_hss_rx;
290 } else {
291 direct_ptr = mpi_coredump->serdes_xfi_hss_rx;
292 indirect_ptr =
293 mpi_coredump->serdes2_xfi_hss_rx;
294 }
295
296 for (i = 0x1c40; i <= 0x1c5f; i++, direct_ptr++, indirect_ptr++)
297 ql_get_both_serdes(qdev, i, direct_ptr, indirect_ptr,
298 xfi_direct_valid, xfi_indirect_valid);
299
300
301 /* Get XAUI_XFI_HSS_PLL register block. */
302 if (qdev->func & 1) {
303 direct_ptr =
304 mpi_coredump->serdes2_xfi_hss_pll;
305 indirect_ptr =
306 mpi_coredump->serdes_xfi_hss_pll;
307 } else {
308 direct_ptr =
309 mpi_coredump->serdes_xfi_hss_pll;
310 indirect_ptr =
311 mpi_coredump->serdes2_xfi_hss_pll;
312 }
313 for (i = 0x1e00; i <= 0x1e1f; i++, direct_ptr++, indirect_ptr++)
314 ql_get_both_serdes(qdev, i, direct_ptr, indirect_ptr,
315 xfi_direct_valid, xfi_indirect_valid);
316 return 0;
317}
318
Ron Mercera2f98232010-01-15 13:31:33 +0000319static int ql_read_other_func_xgmac_reg(struct ql_adapter *qdev, u32 reg,
320 u32 *data)
321{
322 int status = 0;
323
324 /* wait for reg to come ready */
325 status = ql_wait_other_func_reg_rdy(qdev, XGMAC_ADDR / 4,
326 XGMAC_ADDR_RDY, XGMAC_ADDR_XME);
327 if (status)
328 goto exit;
329
330 /* set up for reg read */
331 ql_write_other_func_reg(qdev, XGMAC_ADDR / 4, reg | XGMAC_ADDR_R);
332
333 /* wait for reg to come ready */
334 status = ql_wait_other_func_reg_rdy(qdev, XGMAC_ADDR / 4,
335 XGMAC_ADDR_RDY, XGMAC_ADDR_XME);
336 if (status)
337 goto exit;
338
339 /* get the data */
340 *data = ql_read_other_func_reg(qdev, XGMAC_DATA / 4);
341exit:
342 return status;
343}
344
345/* Read the 400 xgmac control/statistics registers
346 * skipping unused locations.
347 */
Kumar Amit Mehtab82cf962012-11-04 19:11:32 +0000348static int ql_get_xgmac_regs(struct ql_adapter *qdev, u32 *buf,
Ron Mercera2f98232010-01-15 13:31:33 +0000349 unsigned int other_function)
350{
351 int status = 0;
352 int i;
353
354 for (i = PAUSE_SRC_LO; i < XGMAC_REGISTER_END; i += 4, buf++) {
355 /* We're reading 400 xgmac registers, but we filter out
356 * serveral locations that are non-responsive to reads.
357 */
358 if ((i == 0x00000114) ||
359 (i == 0x00000118) ||
360 (i == 0x0000013c) ||
361 (i == 0x00000140) ||
362 (i > 0x00000150 && i < 0x000001fc) ||
363 (i > 0x00000278 && i < 0x000002a0) ||
364 (i > 0x000002c0 && i < 0x000002cf) ||
365 (i > 0x000002dc && i < 0x000002f0) ||
366 (i > 0x000003c8 && i < 0x00000400) ||
367 (i > 0x00000400 && i < 0x00000410) ||
368 (i > 0x00000410 && i < 0x00000420) ||
369 (i > 0x00000420 && i < 0x00000430) ||
370 (i > 0x00000430 && i < 0x00000440) ||
371 (i > 0x00000440 && i < 0x00000450) ||
372 (i > 0x00000450 && i < 0x00000500) ||
373 (i > 0x0000054c && i < 0x00000568) ||
374 (i > 0x000005c8 && i < 0x00000600)) {
375 if (other_function)
376 status =
377 ql_read_other_func_xgmac_reg(qdev, i, buf);
378 else
379 status = ql_read_xgmac_reg(qdev, i, buf);
380
381 if (status)
382 *buf = 0xdeadbeef;
383 break;
384 }
385 }
386 return status;
387}
388
Kumar Amit Mehtab82cf962012-11-04 19:11:32 +0000389static int ql_get_ets_regs(struct ql_adapter *qdev, u32 *buf)
Ron Mercera61f8022009-10-21 11:07:41 +0000390{
391 int status = 0;
392 int i;
393
394 for (i = 0; i < 8; i++, buf++) {
395 ql_write32(qdev, NIC_ETS, i << 29 | 0x08000000);
396 *buf = ql_read32(qdev, NIC_ETS);
397 }
398
399 for (i = 0; i < 2; i++, buf++) {
400 ql_write32(qdev, CNA_ETS, i << 29 | 0x08000000);
401 *buf = ql_read32(qdev, CNA_ETS);
402 }
403
404 return status;
405}
406
Kumar Amit Mehtab82cf962012-11-04 19:11:32 +0000407static void ql_get_intr_states(struct ql_adapter *qdev, u32 *buf)
Ron Mercera61f8022009-10-21 11:07:41 +0000408{
409 int i;
410
411 for (i = 0; i < qdev->rx_ring_count; i++, buf++) {
412 ql_write32(qdev, INTR_EN,
413 qdev->intr_context[i].intr_read_mask);
414 *buf = ql_read32(qdev, INTR_EN);
415 }
416}
417
Kumar Amit Mehtab82cf962012-11-04 19:11:32 +0000418static int ql_get_cam_entries(struct ql_adapter *qdev, u32 *buf)
Ron Mercera61f8022009-10-21 11:07:41 +0000419{
420 int i, status;
421 u32 value[3];
422
423 status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
424 if (status)
425 return status;
426
427 for (i = 0; i < 16; i++) {
428 status = ql_get_mac_addr_reg(qdev,
429 MAC_ADDR_TYPE_CAM_MAC, i, value);
430 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +0000431 netif_err(qdev, drv, qdev->ndev,
Joe Perches2037d5a2010-07-21 14:44:18 -0700432 "Failed read of mac index register\n");
Ron Mercera61f8022009-10-21 11:07:41 +0000433 goto err;
434 }
435 *buf++ = value[0]; /* lower MAC address */
436 *buf++ = value[1]; /* upper MAC address */
437 *buf++ = value[2]; /* output */
438 }
439 for (i = 0; i < 32; i++) {
440 status = ql_get_mac_addr_reg(qdev,
441 MAC_ADDR_TYPE_MULTI_MAC, i, value);
442 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +0000443 netif_err(qdev, drv, qdev->ndev,
Joe Perches2037d5a2010-07-21 14:44:18 -0700444 "Failed read of mac index register\n");
Ron Mercera61f8022009-10-21 11:07:41 +0000445 goto err;
446 }
447 *buf++ = value[0]; /* lower Mcast address */
448 *buf++ = value[1]; /* upper Mcast address */
449 }
450err:
451 ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
452 return status;
453}
454
Kumar Amit Mehtab82cf962012-11-04 19:11:32 +0000455static int ql_get_routing_entries(struct ql_adapter *qdev, u32 *buf)
Ron Mercera61f8022009-10-21 11:07:41 +0000456{
457 int status;
458 u32 value, i;
459
460 status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
461 if (status)
462 return status;
463
464 for (i = 0; i < 16; i++) {
465 status = ql_get_routing_reg(qdev, i, &value);
466 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +0000467 netif_err(qdev, drv, qdev->ndev,
Joe Perches2037d5a2010-07-21 14:44:18 -0700468 "Failed read of routing index register\n");
Ron Mercera61f8022009-10-21 11:07:41 +0000469 goto err;
470 } else {
471 *buf++ = value;
472 }
473 }
474err:
475 ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
476 return status;
477}
478
Ron Mercer8aae2602010-01-15 13:31:28 +0000479/* Read the MPI Processor shadow registers */
Kumar Amit Mehtab82cf962012-11-04 19:11:32 +0000480static int ql_get_mpi_shadow_regs(struct ql_adapter *qdev, u32 *buf)
Ron Mercer8aae2602010-01-15 13:31:28 +0000481{
482 u32 i;
483 int status;
484
485 for (i = 0; i < MPI_CORE_SH_REGS_CNT; i++, buf++) {
486 status = ql_write_mpi_reg(qdev, RISC_124,
487 (SHADOW_OFFSET | i << SHADOW_REG_SHIFT));
488 if (status)
489 goto end;
490 status = ql_read_mpi_reg(qdev, RISC_127, buf);
491 if (status)
492 goto end;
493 }
494end:
495 return status;
496}
497
498/* Read the MPI Processor core registers */
Kumar Amit Mehtab82cf962012-11-04 19:11:32 +0000499static int ql_get_mpi_regs(struct ql_adapter *qdev, u32 *buf,
Ron Mercer8aae2602010-01-15 13:31:28 +0000500 u32 offset, u32 count)
501{
502 int i, status = 0;
503 for (i = 0; i < count; i++, buf++) {
504 status = ql_read_mpi_reg(qdev, offset + i, buf);
505 if (status)
506 return status;
507 }
508 return status;
509}
510
Ron Mercerc89ec8b2010-01-15 13:31:29 +0000511/* Read the ASIC probe dump */
512static unsigned int *ql_get_probe(struct ql_adapter *qdev, u32 clock,
513 u32 valid, u32 *buf)
514{
515 u32 module, mux_sel, probe, lo_val, hi_val;
516
517 for (module = 0; module < PRB_MX_ADDR_MAX_MODS; module++) {
518 if (!((valid >> module) & 1))
519 continue;
520 for (mux_sel = 0; mux_sel < PRB_MX_ADDR_MAX_MUX; mux_sel++) {
521 probe = clock
522 | PRB_MX_ADDR_ARE
523 | mux_sel
524 | (module << PRB_MX_ADDR_MOD_SEL_SHIFT);
525 ql_write32(qdev, PRB_MX_ADDR, probe);
526 lo_val = ql_read32(qdev, PRB_MX_DATA);
527 if (mux_sel == 0) {
528 *buf = probe;
529 buf++;
530 }
531 probe |= PRB_MX_ADDR_UP;
532 ql_write32(qdev, PRB_MX_ADDR, probe);
533 hi_val = ql_read32(qdev, PRB_MX_DATA);
534 *buf = lo_val;
535 buf++;
536 *buf = hi_val;
537 buf++;
538 }
539 }
540 return buf;
541}
542
543static int ql_get_probe_dump(struct ql_adapter *qdev, unsigned int *buf)
544{
545 /* First we have to enable the probe mux */
546 ql_write_mpi_reg(qdev, MPI_TEST_FUNC_PRB_CTL, MPI_TEST_FUNC_PRB_EN);
547 buf = ql_get_probe(qdev, PRB_MX_ADDR_SYS_CLOCK,
548 PRB_MX_ADDR_VALID_SYS_MOD, buf);
549 buf = ql_get_probe(qdev, PRB_MX_ADDR_PCI_CLOCK,
550 PRB_MX_ADDR_VALID_PCI_MOD, buf);
551 buf = ql_get_probe(qdev, PRB_MX_ADDR_XGM_CLOCK,
552 PRB_MX_ADDR_VALID_XGM_MOD, buf);
553 buf = ql_get_probe(qdev, PRB_MX_ADDR_FC_CLOCK,
554 PRB_MX_ADDR_VALID_FC_MOD, buf);
555 return 0;
556
557}
Ron Mercer8aae2602010-01-15 13:31:28 +0000558
559/* Read out the routing index registers */
560static int ql_get_routing_index_registers(struct ql_adapter *qdev, u32 *buf)
561{
562 int status;
563 u32 type, index, index_max;
564 u32 result_index;
565 u32 result_data;
566 u32 val;
567
568 status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
569 if (status)
570 return status;
571
572 for (type = 0; type < 4; type++) {
573 if (type < 2)
574 index_max = 8;
575 else
576 index_max = 16;
577 for (index = 0; index < index_max; index++) {
578 val = RT_IDX_RS
579 | (type << RT_IDX_TYPE_SHIFT)
580 | (index << RT_IDX_IDX_SHIFT);
581 ql_write32(qdev, RT_IDX, val);
582 result_index = 0;
583 while ((result_index & RT_IDX_MR) == 0)
584 result_index = ql_read32(qdev, RT_IDX);
585 result_data = ql_read32(qdev, RT_DATA);
586 *buf = type;
587 buf++;
588 *buf = index;
589 buf++;
590 *buf = result_index;
591 buf++;
592 *buf = result_data;
593 buf++;
594 }
595 }
596 ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
597 return status;
598}
599
600/* Read out the MAC protocol registers */
601static void ql_get_mac_protocol_registers(struct ql_adapter *qdev, u32 *buf)
602{
603 u32 result_index, result_data;
604 u32 type;
605 u32 index;
606 u32 offset;
607 u32 val;
608 u32 initial_val = MAC_ADDR_RS;
609 u32 max_index;
610 u32 max_offset;
611
612 for (type = 0; type < MAC_ADDR_TYPE_COUNT; type++) {
613 switch (type) {
614
615 case 0: /* CAM */
616 initial_val |= MAC_ADDR_ADR;
617 max_index = MAC_ADDR_MAX_CAM_ENTRIES;
618 max_offset = MAC_ADDR_MAX_CAM_WCOUNT;
619 break;
620 case 1: /* Multicast MAC Address */
621 max_index = MAC_ADDR_MAX_CAM_WCOUNT;
622 max_offset = MAC_ADDR_MAX_CAM_WCOUNT;
623 break;
624 case 2: /* VLAN filter mask */
625 case 3: /* MC filter mask */
626 max_index = MAC_ADDR_MAX_CAM_WCOUNT;
627 max_offset = MAC_ADDR_MAX_CAM_WCOUNT;
628 break;
629 case 4: /* FC MAC addresses */
630 max_index = MAC_ADDR_MAX_FC_MAC_ENTRIES;
631 max_offset = MAC_ADDR_MAX_FC_MAC_WCOUNT;
632 break;
633 case 5: /* Mgmt MAC addresses */
634 max_index = MAC_ADDR_MAX_MGMT_MAC_ENTRIES;
635 max_offset = MAC_ADDR_MAX_MGMT_MAC_WCOUNT;
636 break;
637 case 6: /* Mgmt VLAN addresses */
638 max_index = MAC_ADDR_MAX_MGMT_VLAN_ENTRIES;
639 max_offset = MAC_ADDR_MAX_MGMT_VLAN_WCOUNT;
640 break;
641 case 7: /* Mgmt IPv4 address */
642 max_index = MAC_ADDR_MAX_MGMT_V4_ENTRIES;
643 max_offset = MAC_ADDR_MAX_MGMT_V4_WCOUNT;
644 break;
645 case 8: /* Mgmt IPv6 address */
646 max_index = MAC_ADDR_MAX_MGMT_V6_ENTRIES;
647 max_offset = MAC_ADDR_MAX_MGMT_V6_WCOUNT;
648 break;
649 case 9: /* Mgmt TCP/UDP Dest port */
650 max_index = MAC_ADDR_MAX_MGMT_TU_DP_ENTRIES;
651 max_offset = MAC_ADDR_MAX_MGMT_TU_DP_WCOUNT;
652 break;
653 default:
Joe Perches2037d5a2010-07-21 14:44:18 -0700654 pr_err("Bad type!!! 0x%08x\n", type);
Ron Mercer8aae2602010-01-15 13:31:28 +0000655 max_index = 0;
656 max_offset = 0;
657 break;
658 }
659 for (index = 0; index < max_index; index++) {
660 for (offset = 0; offset < max_offset; offset++) {
661 val = initial_val
662 | (type << MAC_ADDR_TYPE_SHIFT)
663 | (index << MAC_ADDR_IDX_SHIFT)
664 | (offset);
665 ql_write32(qdev, MAC_ADDR_IDX, val);
666 result_index = 0;
667 while ((result_index & MAC_ADDR_MR) == 0) {
668 result_index = ql_read32(qdev,
669 MAC_ADDR_IDX);
670 }
671 result_data = ql_read32(qdev, MAC_ADDR_DATA);
672 *buf = result_index;
673 buf++;
674 *buf = result_data;
675 buf++;
676 }
677 }
678 }
679}
680
681static void ql_get_sem_registers(struct ql_adapter *qdev, u32 *buf)
682{
683 u32 func_num, reg, reg_val;
684 int status;
685
686 for (func_num = 0; func_num < MAX_SEMAPHORE_FUNCTIONS ; func_num++) {
687 reg = MPI_NIC_REG_BLOCK
688 | (func_num << MPI_NIC_FUNCTION_SHIFT)
689 | (SEM / 4);
690 status = ql_read_mpi_reg(qdev, reg, &reg_val);
691 *buf = reg_val;
692 /* if the read failed then dead fill the element. */
693 if (!status)
694 *buf = 0xdeadbeef;
695 buf++;
696 }
697}
698
Ron Mercera61f8022009-10-21 11:07:41 +0000699/* Create a coredump segment header */
700static void ql_build_coredump_seg_header(
701 struct mpi_coredump_segment_header *seg_hdr,
702 u32 seg_number, u32 seg_size, u8 *desc)
703{
704 memset(seg_hdr, 0, sizeof(struct mpi_coredump_segment_header));
705 seg_hdr->cookie = MPI_COREDUMP_COOKIE;
706 seg_hdr->segNum = seg_number;
707 seg_hdr->segSize = seg_size;
708 memcpy(seg_hdr->description, desc, (sizeof(seg_hdr->description)) - 1);
709}
710
Ron Mercer8aae2602010-01-15 13:31:28 +0000711/*
712 * This function should be called when a coredump / probedump
713 * is to be extracted from the HBA. It is assumed there is a
714 * qdev structure that contains the base address of the register
715 * space for this function as well as a coredump structure that
716 * will contain the dump.
717 */
718int ql_core_dump(struct ql_adapter *qdev, struct ql_mpi_coredump *mpi_coredump)
719{
720 int status;
721 int i;
722
723 if (!mpi_coredump) {
malahal@us.ibm.com3db91802013-09-20 16:21:17 -0500724 netif_err(qdev, drv, qdev->ndev, "No memory allocated\n");
725 return -EINVAL;
Ron Mercer8aae2602010-01-15 13:31:28 +0000726 }
727
728 /* Try to get the spinlock, but dont worry if
729 * it isn't available. If the firmware died it
730 * might be holding the sem.
731 */
732 ql_sem_spinlock(qdev, SEM_PROC_REG_MASK);
733
734 status = ql_pause_mpi_risc(qdev);
735 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +0000736 netif_err(qdev, drv, qdev->ndev,
737 "Failed RISC pause. Status = 0x%.08x\n", status);
Ron Mercer8aae2602010-01-15 13:31:28 +0000738 goto err;
739 }
740
741 /* Insert the global header */
742 memset(&(mpi_coredump->mpi_global_header), 0,
743 sizeof(struct mpi_coredump_global_header));
744 mpi_coredump->mpi_global_header.cookie = MPI_COREDUMP_COOKIE;
745 mpi_coredump->mpi_global_header.headerSize =
746 sizeof(struct mpi_coredump_global_header);
747 mpi_coredump->mpi_global_header.imageSize =
748 sizeof(struct ql_mpi_coredump);
Kees Cookdf5303a2017-05-05 15:34:34 -0700749 strncpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
Ron Mercer8aae2602010-01-15 13:31:28 +0000750 sizeof(mpi_coredump->mpi_global_header.idString));
751
752 /* Get generic NIC reg dump */
753 ql_build_coredump_seg_header(&mpi_coredump->nic_regs_seg_hdr,
754 NIC1_CONTROL_SEG_NUM,
755 sizeof(struct mpi_coredump_segment_header) +
756 sizeof(mpi_coredump->nic_regs), "NIC1 Registers");
757
Ron Mercer24bb55b2010-01-15 13:31:31 +0000758 ql_build_coredump_seg_header(&mpi_coredump->nic2_regs_seg_hdr,
759 NIC2_CONTROL_SEG_NUM,
760 sizeof(struct mpi_coredump_segment_header) +
761 sizeof(mpi_coredump->nic2_regs), "NIC2 Registers");
762
Ron Mercera2f98232010-01-15 13:31:33 +0000763 /* Get XGMac registers. (Segment 18, Rev C. step 21) */
764 ql_build_coredump_seg_header(&mpi_coredump->xgmac1_seg_hdr,
765 NIC1_XGMAC_SEG_NUM,
766 sizeof(struct mpi_coredump_segment_header) +
767 sizeof(mpi_coredump->xgmac1), "NIC1 XGMac Registers");
768
769 ql_build_coredump_seg_header(&mpi_coredump->xgmac2_seg_hdr,
770 NIC2_XGMAC_SEG_NUM,
771 sizeof(struct mpi_coredump_segment_header) +
772 sizeof(mpi_coredump->xgmac2), "NIC2 XGMac Registers");
773
Ron Mercer8aae2602010-01-15 13:31:28 +0000774 if (qdev->func & 1) {
775 /* Odd means our function is NIC 2 */
776 for (i = 0; i < NIC_REGS_DUMP_WORD_COUNT; i++)
777 mpi_coredump->nic2_regs[i] =
778 ql_read32(qdev, i * sizeof(u32));
Ron Mercer24bb55b2010-01-15 13:31:31 +0000779
780 for (i = 0; i < NIC_REGS_DUMP_WORD_COUNT; i++)
781 mpi_coredump->nic_regs[i] =
782 ql_read_other_func_reg(qdev, (i * sizeof(u32)) / 4);
Ron Mercera2f98232010-01-15 13:31:33 +0000783
784 ql_get_xgmac_regs(qdev, &mpi_coredump->xgmac2[0], 0);
785 ql_get_xgmac_regs(qdev, &mpi_coredump->xgmac1[0], 1);
Ron Mercer8aae2602010-01-15 13:31:28 +0000786 } else {
787 /* Even means our function is NIC 1 */
788 for (i = 0; i < NIC_REGS_DUMP_WORD_COUNT; i++)
789 mpi_coredump->nic_regs[i] =
790 ql_read32(qdev, i * sizeof(u32));
Ron Mercer24bb55b2010-01-15 13:31:31 +0000791 for (i = 0; i < NIC_REGS_DUMP_WORD_COUNT; i++)
792 mpi_coredump->nic2_regs[i] =
793 ql_read_other_func_reg(qdev, (i * sizeof(u32)) / 4);
Ron Mercera2f98232010-01-15 13:31:33 +0000794
795 ql_get_xgmac_regs(qdev, &mpi_coredump->xgmac1[0], 0);
796 ql_get_xgmac_regs(qdev, &mpi_coredump->xgmac2[0], 1);
Ron Mercer8aae2602010-01-15 13:31:28 +0000797 }
798
Ron Mercera48c86f2010-01-15 13:31:32 +0000799 /* Rev C. Step 20a */
800 ql_build_coredump_seg_header(&mpi_coredump->xaui_an_hdr,
801 XAUI_AN_SEG_NUM,
802 sizeof(struct mpi_coredump_segment_header) +
803 sizeof(mpi_coredump->serdes_xaui_an),
804 "XAUI AN Registers");
805
806 /* Rev C. Step 20b */
807 ql_build_coredump_seg_header(&mpi_coredump->xaui_hss_pcs_hdr,
808 XAUI_HSS_PCS_SEG_NUM,
809 sizeof(struct mpi_coredump_segment_header) +
810 sizeof(mpi_coredump->serdes_xaui_hss_pcs),
811 "XAUI HSS PCS Registers");
812
813 ql_build_coredump_seg_header(&mpi_coredump->xfi_an_hdr, XFI_AN_SEG_NUM,
814 sizeof(struct mpi_coredump_segment_header) +
815 sizeof(mpi_coredump->serdes_xfi_an),
816 "XFI AN Registers");
817
818 ql_build_coredump_seg_header(&mpi_coredump->xfi_train_hdr,
819 XFI_TRAIN_SEG_NUM,
820 sizeof(struct mpi_coredump_segment_header) +
821 sizeof(mpi_coredump->serdes_xfi_train),
822 "XFI TRAIN Registers");
823
824 ql_build_coredump_seg_header(&mpi_coredump->xfi_hss_pcs_hdr,
825 XFI_HSS_PCS_SEG_NUM,
826 sizeof(struct mpi_coredump_segment_header) +
827 sizeof(mpi_coredump->serdes_xfi_hss_pcs),
828 "XFI HSS PCS Registers");
829
830 ql_build_coredump_seg_header(&mpi_coredump->xfi_hss_tx_hdr,
831 XFI_HSS_TX_SEG_NUM,
832 sizeof(struct mpi_coredump_segment_header) +
833 sizeof(mpi_coredump->serdes_xfi_hss_tx),
834 "XFI HSS TX Registers");
835
836 ql_build_coredump_seg_header(&mpi_coredump->xfi_hss_rx_hdr,
837 XFI_HSS_RX_SEG_NUM,
838 sizeof(struct mpi_coredump_segment_header) +
839 sizeof(mpi_coredump->serdes_xfi_hss_rx),
840 "XFI HSS RX Registers");
841
842 ql_build_coredump_seg_header(&mpi_coredump->xfi_hss_pll_hdr,
843 XFI_HSS_PLL_SEG_NUM,
844 sizeof(struct mpi_coredump_segment_header) +
845 sizeof(mpi_coredump->serdes_xfi_hss_pll),
846 "XFI HSS PLL Registers");
847
848 ql_build_coredump_seg_header(&mpi_coredump->xaui2_an_hdr,
849 XAUI2_AN_SEG_NUM,
850 sizeof(struct mpi_coredump_segment_header) +
851 sizeof(mpi_coredump->serdes2_xaui_an),
852 "XAUI2 AN Registers");
853
854 ql_build_coredump_seg_header(&mpi_coredump->xaui2_hss_pcs_hdr,
855 XAUI2_HSS_PCS_SEG_NUM,
856 sizeof(struct mpi_coredump_segment_header) +
857 sizeof(mpi_coredump->serdes2_xaui_hss_pcs),
858 "XAUI2 HSS PCS Registers");
859
860 ql_build_coredump_seg_header(&mpi_coredump->xfi2_an_hdr,
861 XFI2_AN_SEG_NUM,
862 sizeof(struct mpi_coredump_segment_header) +
863 sizeof(mpi_coredump->serdes2_xfi_an),
864 "XFI2 AN Registers");
865
866 ql_build_coredump_seg_header(&mpi_coredump->xfi2_train_hdr,
867 XFI2_TRAIN_SEG_NUM,
868 sizeof(struct mpi_coredump_segment_header) +
869 sizeof(mpi_coredump->serdes2_xfi_train),
870 "XFI2 TRAIN Registers");
871
872 ql_build_coredump_seg_header(&mpi_coredump->xfi2_hss_pcs_hdr,
873 XFI2_HSS_PCS_SEG_NUM,
874 sizeof(struct mpi_coredump_segment_header) +
875 sizeof(mpi_coredump->serdes2_xfi_hss_pcs),
876 "XFI2 HSS PCS Registers");
877
878 ql_build_coredump_seg_header(&mpi_coredump->xfi2_hss_tx_hdr,
879 XFI2_HSS_TX_SEG_NUM,
880 sizeof(struct mpi_coredump_segment_header) +
881 sizeof(mpi_coredump->serdes2_xfi_hss_tx),
882 "XFI2 HSS TX Registers");
883
884 ql_build_coredump_seg_header(&mpi_coredump->xfi2_hss_rx_hdr,
885 XFI2_HSS_RX_SEG_NUM,
886 sizeof(struct mpi_coredump_segment_header) +
887 sizeof(mpi_coredump->serdes2_xfi_hss_rx),
888 "XFI2 HSS RX Registers");
889
890 ql_build_coredump_seg_header(&mpi_coredump->xfi2_hss_pll_hdr,
891 XFI2_HSS_PLL_SEG_NUM,
892 sizeof(struct mpi_coredump_segment_header) +
893 sizeof(mpi_coredump->serdes2_xfi_hss_pll),
894 "XFI2 HSS PLL Registers");
895
896 status = ql_get_serdes_regs(qdev, mpi_coredump);
897 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +0000898 netif_err(qdev, drv, qdev->ndev,
899 "Failed Dump of Serdes Registers. Status = 0x%.08x\n",
900 status);
Ron Mercera48c86f2010-01-15 13:31:32 +0000901 goto err;
902 }
903
Ron Mercer8aae2602010-01-15 13:31:28 +0000904 ql_build_coredump_seg_header(&mpi_coredump->core_regs_seg_hdr,
905 CORE_SEG_NUM,
906 sizeof(mpi_coredump->core_regs_seg_hdr) +
907 sizeof(mpi_coredump->mpi_core_regs) +
908 sizeof(mpi_coredump->mpi_core_sh_regs),
909 "Core Registers");
910
911 /* Get the MPI Core Registers */
912 status = ql_get_mpi_regs(qdev, &mpi_coredump->mpi_core_regs[0],
913 MPI_CORE_REGS_ADDR, MPI_CORE_REGS_CNT);
914 if (status)
915 goto err;
916 /* Get the 16 MPI shadow registers */
917 status = ql_get_mpi_shadow_regs(qdev,
918 &mpi_coredump->mpi_core_sh_regs[0]);
919 if (status)
920 goto err;
921
922 /* Get the Test Logic Registers */
923 ql_build_coredump_seg_header(&mpi_coredump->test_logic_regs_seg_hdr,
924 TEST_LOGIC_SEG_NUM,
925 sizeof(struct mpi_coredump_segment_header)
926 + sizeof(mpi_coredump->test_logic_regs),
927 "Test Logic Regs");
928 status = ql_get_mpi_regs(qdev, &mpi_coredump->test_logic_regs[0],
929 TEST_REGS_ADDR, TEST_REGS_CNT);
930 if (status)
931 goto err;
932
933 /* Get the RMII Registers */
934 ql_build_coredump_seg_header(&mpi_coredump->rmii_regs_seg_hdr,
935 RMII_SEG_NUM,
936 sizeof(struct mpi_coredump_segment_header)
937 + sizeof(mpi_coredump->rmii_regs),
938 "RMII Registers");
939 status = ql_get_mpi_regs(qdev, &mpi_coredump->rmii_regs[0],
940 RMII_REGS_ADDR, RMII_REGS_CNT);
941 if (status)
942 goto err;
943
944 /* Get the FCMAC1 Registers */
945 ql_build_coredump_seg_header(&mpi_coredump->fcmac1_regs_seg_hdr,
946 FCMAC1_SEG_NUM,
947 sizeof(struct mpi_coredump_segment_header)
948 + sizeof(mpi_coredump->fcmac1_regs),
949 "FCMAC1 Registers");
950 status = ql_get_mpi_regs(qdev, &mpi_coredump->fcmac1_regs[0],
951 FCMAC1_REGS_ADDR, FCMAC_REGS_CNT);
952 if (status)
953 goto err;
954
955 /* Get the FCMAC2 Registers */
956
957 ql_build_coredump_seg_header(&mpi_coredump->fcmac2_regs_seg_hdr,
958 FCMAC2_SEG_NUM,
959 sizeof(struct mpi_coredump_segment_header)
960 + sizeof(mpi_coredump->fcmac2_regs),
961 "FCMAC2 Registers");
962
963 status = ql_get_mpi_regs(qdev, &mpi_coredump->fcmac2_regs[0],
964 FCMAC2_REGS_ADDR, FCMAC_REGS_CNT);
965 if (status)
966 goto err;
967
968 /* Get the FC1 MBX Registers */
969 ql_build_coredump_seg_header(&mpi_coredump->fc1_mbx_regs_seg_hdr,
970 FC1_MBOX_SEG_NUM,
971 sizeof(struct mpi_coredump_segment_header)
972 + sizeof(mpi_coredump->fc1_mbx_regs),
973 "FC1 MBox Regs");
974 status = ql_get_mpi_regs(qdev, &mpi_coredump->fc1_mbx_regs[0],
975 FC1_MBX_REGS_ADDR, FC_MBX_REGS_CNT);
976 if (status)
977 goto err;
978
979 /* Get the IDE Registers */
980 ql_build_coredump_seg_header(&mpi_coredump->ide_regs_seg_hdr,
981 IDE_SEG_NUM,
982 sizeof(struct mpi_coredump_segment_header)
983 + sizeof(mpi_coredump->ide_regs),
984 "IDE Registers");
985 status = ql_get_mpi_regs(qdev, &mpi_coredump->ide_regs[0],
986 IDE_REGS_ADDR, IDE_REGS_CNT);
987 if (status)
988 goto err;
989
990 /* Get the NIC1 MBX Registers */
991 ql_build_coredump_seg_header(&mpi_coredump->nic1_mbx_regs_seg_hdr,
992 NIC1_MBOX_SEG_NUM,
993 sizeof(struct mpi_coredump_segment_header)
994 + sizeof(mpi_coredump->nic1_mbx_regs),
995 "NIC1 MBox Regs");
996 status = ql_get_mpi_regs(qdev, &mpi_coredump->nic1_mbx_regs[0],
997 NIC1_MBX_REGS_ADDR, NIC_MBX_REGS_CNT);
998 if (status)
999 goto err;
1000
1001 /* Get the SMBus Registers */
1002 ql_build_coredump_seg_header(&mpi_coredump->smbus_regs_seg_hdr,
1003 SMBUS_SEG_NUM,
1004 sizeof(struct mpi_coredump_segment_header)
1005 + sizeof(mpi_coredump->smbus_regs),
1006 "SMBus Registers");
1007 status = ql_get_mpi_regs(qdev, &mpi_coredump->smbus_regs[0],
1008 SMBUS_REGS_ADDR, SMBUS_REGS_CNT);
1009 if (status)
1010 goto err;
1011
1012 /* Get the FC2 MBX Registers */
1013 ql_build_coredump_seg_header(&mpi_coredump->fc2_mbx_regs_seg_hdr,
1014 FC2_MBOX_SEG_NUM,
1015 sizeof(struct mpi_coredump_segment_header)
1016 + sizeof(mpi_coredump->fc2_mbx_regs),
1017 "FC2 MBox Regs");
1018 status = ql_get_mpi_regs(qdev, &mpi_coredump->fc2_mbx_regs[0],
1019 FC2_MBX_REGS_ADDR, FC_MBX_REGS_CNT);
1020 if (status)
1021 goto err;
1022
1023 /* Get the NIC2 MBX Registers */
1024 ql_build_coredump_seg_header(&mpi_coredump->nic2_mbx_regs_seg_hdr,
1025 NIC2_MBOX_SEG_NUM,
1026 sizeof(struct mpi_coredump_segment_header)
1027 + sizeof(mpi_coredump->nic2_mbx_regs),
1028 "NIC2 MBox Regs");
1029 status = ql_get_mpi_regs(qdev, &mpi_coredump->nic2_mbx_regs[0],
1030 NIC2_MBX_REGS_ADDR, NIC_MBX_REGS_CNT);
1031 if (status)
1032 goto err;
1033
1034 /* Get the I2C Registers */
1035 ql_build_coredump_seg_header(&mpi_coredump->i2c_regs_seg_hdr,
1036 I2C_SEG_NUM,
1037 sizeof(struct mpi_coredump_segment_header)
1038 + sizeof(mpi_coredump->i2c_regs),
1039 "I2C Registers");
1040 status = ql_get_mpi_regs(qdev, &mpi_coredump->i2c_regs[0],
1041 I2C_REGS_ADDR, I2C_REGS_CNT);
1042 if (status)
1043 goto err;
1044
1045 /* Get the MEMC Registers */
1046 ql_build_coredump_seg_header(&mpi_coredump->memc_regs_seg_hdr,
1047 MEMC_SEG_NUM,
1048 sizeof(struct mpi_coredump_segment_header)
1049 + sizeof(mpi_coredump->memc_regs),
1050 "MEMC Registers");
1051 status = ql_get_mpi_regs(qdev, &mpi_coredump->memc_regs[0],
1052 MEMC_REGS_ADDR, MEMC_REGS_CNT);
1053 if (status)
1054 goto err;
1055
1056 /* Get the PBus Registers */
1057 ql_build_coredump_seg_header(&mpi_coredump->pbus_regs_seg_hdr,
1058 PBUS_SEG_NUM,
1059 sizeof(struct mpi_coredump_segment_header)
1060 + sizeof(mpi_coredump->pbus_regs),
1061 "PBUS Registers");
1062 status = ql_get_mpi_regs(qdev, &mpi_coredump->pbus_regs[0],
1063 PBUS_REGS_ADDR, PBUS_REGS_CNT);
1064 if (status)
1065 goto err;
1066
1067 /* Get the MDE Registers */
1068 ql_build_coredump_seg_header(&mpi_coredump->mde_regs_seg_hdr,
1069 MDE_SEG_NUM,
1070 sizeof(struct mpi_coredump_segment_header)
1071 + sizeof(mpi_coredump->mde_regs),
1072 "MDE Registers");
1073 status = ql_get_mpi_regs(qdev, &mpi_coredump->mde_regs[0],
1074 MDE_REGS_ADDR, MDE_REGS_CNT);
1075 if (status)
1076 goto err;
1077
1078 ql_build_coredump_seg_header(&mpi_coredump->misc_nic_seg_hdr,
1079 MISC_NIC_INFO_SEG_NUM,
1080 sizeof(struct mpi_coredump_segment_header)
1081 + sizeof(mpi_coredump->misc_nic_info),
1082 "MISC NIC INFO");
1083 mpi_coredump->misc_nic_info.rx_ring_count = qdev->rx_ring_count;
1084 mpi_coredump->misc_nic_info.tx_ring_count = qdev->tx_ring_count;
1085 mpi_coredump->misc_nic_info.intr_count = qdev->intr_count;
1086 mpi_coredump->misc_nic_info.function = qdev->func;
1087
1088 /* Segment 31 */
1089 /* Get indexed register values. */
1090 ql_build_coredump_seg_header(&mpi_coredump->intr_states_seg_hdr,
1091 INTR_STATES_SEG_NUM,
1092 sizeof(struct mpi_coredump_segment_header)
1093 + sizeof(mpi_coredump->intr_states),
1094 "INTR States");
1095 ql_get_intr_states(qdev, &mpi_coredump->intr_states[0]);
1096
1097 ql_build_coredump_seg_header(&mpi_coredump->cam_entries_seg_hdr,
1098 CAM_ENTRIES_SEG_NUM,
1099 sizeof(struct mpi_coredump_segment_header)
1100 + sizeof(mpi_coredump->cam_entries),
1101 "CAM Entries");
1102 status = ql_get_cam_entries(qdev, &mpi_coredump->cam_entries[0]);
1103 if (status)
1104 goto err;
1105
1106 ql_build_coredump_seg_header(&mpi_coredump->nic_routing_words_seg_hdr,
1107 ROUTING_WORDS_SEG_NUM,
1108 sizeof(struct mpi_coredump_segment_header)
1109 + sizeof(mpi_coredump->nic_routing_words),
1110 "Routing Words");
1111 status = ql_get_routing_entries(qdev,
1112 &mpi_coredump->nic_routing_words[0]);
1113 if (status)
1114 goto err;
1115
1116 /* Segment 34 (Rev C. step 23) */
1117 ql_build_coredump_seg_header(&mpi_coredump->ets_seg_hdr,
1118 ETS_SEG_NUM,
1119 sizeof(struct mpi_coredump_segment_header)
1120 + sizeof(mpi_coredump->ets),
1121 "ETS Registers");
1122 status = ql_get_ets_regs(qdev, &mpi_coredump->ets[0]);
1123 if (status)
1124 goto err;
1125
Ron Mercerc89ec8b2010-01-15 13:31:29 +00001126 ql_build_coredump_seg_header(&mpi_coredump->probe_dump_seg_hdr,
1127 PROBE_DUMP_SEG_NUM,
1128 sizeof(struct mpi_coredump_segment_header)
1129 + sizeof(mpi_coredump->probe_dump),
1130 "Probe Dump");
1131 ql_get_probe_dump(qdev, &mpi_coredump->probe_dump[0]);
1132
Ron Mercer8aae2602010-01-15 13:31:28 +00001133 ql_build_coredump_seg_header(&mpi_coredump->routing_reg_seg_hdr,
1134 ROUTING_INDEX_SEG_NUM,
1135 sizeof(struct mpi_coredump_segment_header)
1136 + sizeof(mpi_coredump->routing_regs),
1137 "Routing Regs");
1138 status = ql_get_routing_index_registers(qdev,
1139 &mpi_coredump->routing_regs[0]);
1140 if (status)
1141 goto err;
1142
1143 ql_build_coredump_seg_header(&mpi_coredump->mac_prot_reg_seg_hdr,
1144 MAC_PROTOCOL_SEG_NUM,
1145 sizeof(struct mpi_coredump_segment_header)
1146 + sizeof(mpi_coredump->mac_prot_regs),
1147 "MAC Prot Regs");
1148 ql_get_mac_protocol_registers(qdev, &mpi_coredump->mac_prot_regs[0]);
1149
1150 /* Get the semaphore registers for all 5 functions */
1151 ql_build_coredump_seg_header(&mpi_coredump->sem_regs_seg_hdr,
1152 SEM_REGS_SEG_NUM,
1153 sizeof(struct mpi_coredump_segment_header) +
1154 sizeof(mpi_coredump->sem_regs), "Sem Registers");
1155
1156 ql_get_sem_registers(qdev, &mpi_coredump->sem_regs[0]);
1157
1158 /* Prevent the mpi restarting while we dump the memory.*/
1159 ql_write_mpi_reg(qdev, MPI_TEST_FUNC_RST_STS, MPI_TEST_FUNC_RST_FRC);
1160
1161 /* clear the pause */
1162 status = ql_unpause_mpi_risc(qdev);
1163 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +00001164 netif_err(qdev, drv, qdev->ndev,
1165 "Failed RISC unpause. Status = 0x%.08x\n", status);
Ron Mercer8aae2602010-01-15 13:31:28 +00001166 goto err;
1167 }
Ron Mercer2c1f73c2010-01-15 13:31:30 +00001168
1169 /* Reset the RISC so we can dump RAM */
1170 status = ql_hard_reset_mpi_risc(qdev);
1171 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +00001172 netif_err(qdev, drv, qdev->ndev,
1173 "Failed RISC reset. Status = 0x%.08x\n", status);
Ron Mercer2c1f73c2010-01-15 13:31:30 +00001174 goto err;
1175 }
1176
1177 ql_build_coredump_seg_header(&mpi_coredump->code_ram_seg_hdr,
1178 WCS_RAM_SEG_NUM,
1179 sizeof(struct mpi_coredump_segment_header)
1180 + sizeof(mpi_coredump->code_ram),
1181 "WCS RAM");
1182 status = ql_dump_risc_ram_area(qdev, &mpi_coredump->code_ram[0],
1183 CODE_RAM_ADDR, CODE_RAM_CNT);
1184 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +00001185 netif_err(qdev, drv, qdev->ndev,
1186 "Failed Dump of CODE RAM. Status = 0x%.08x\n",
1187 status);
Ron Mercer2c1f73c2010-01-15 13:31:30 +00001188 goto err;
1189 }
1190
1191 /* Insert the segment header */
1192 ql_build_coredump_seg_header(&mpi_coredump->memc_ram_seg_hdr,
1193 MEMC_RAM_SEG_NUM,
1194 sizeof(struct mpi_coredump_segment_header)
1195 + sizeof(mpi_coredump->memc_ram),
1196 "MEMC RAM");
1197 status = ql_dump_risc_ram_area(qdev, &mpi_coredump->memc_ram[0],
1198 MEMC_RAM_ADDR, MEMC_RAM_CNT);
1199 if (status) {
Joe Perchesae9540f72010-02-09 11:49:52 +00001200 netif_err(qdev, drv, qdev->ndev,
1201 "Failed Dump of MEMC RAM. Status = 0x%.08x\n",
1202 status);
Ron Mercer2c1f73c2010-01-15 13:31:30 +00001203 goto err;
1204 }
Ron Mercer8aae2602010-01-15 13:31:28 +00001205err:
1206 ql_sem_unlock(qdev, SEM_PROC_REG_MASK); /* does flush too */
1207 return status;
1208
1209}
1210
Ron Mercerd5c1da52010-01-15 13:31:34 +00001211static void ql_get_core_dump(struct ql_adapter *qdev)
1212{
1213 if (!ql_own_firmware(qdev)) {
Joe Perchesae9540f72010-02-09 11:49:52 +00001214 netif_err(qdev, drv, qdev->ndev, "Don't own firmware!\n");
Ron Mercerd5c1da52010-01-15 13:31:34 +00001215 return;
1216 }
1217
1218 if (!netif_running(qdev->ndev)) {
Joe Perchesae9540f72010-02-09 11:49:52 +00001219 netif_err(qdev, ifup, qdev->ndev,
Joe Perches2037d5a2010-07-21 14:44:18 -07001220 "Force Coredump can only be done from interface that is up\n");
Ron Mercerd5c1da52010-01-15 13:31:34 +00001221 return;
1222 }
Ron Mercerfc312ec2010-07-05 12:19:38 +00001223 ql_queue_fw_error(qdev);
Ron Mercerd5c1da52010-01-15 13:31:34 +00001224}
1225
stephen hemminger306d7f72013-12-26 10:28:11 -08001226static void ql_gen_reg_dump(struct ql_adapter *qdev,
1227 struct ql_reg_dump *mpi_coredump)
Ron Mercera61f8022009-10-21 11:07:41 +00001228{
1229 int i, status;
1230
1231
1232 memset(&(mpi_coredump->mpi_global_header), 0,
1233 sizeof(struct mpi_coredump_global_header));
1234 mpi_coredump->mpi_global_header.cookie = MPI_COREDUMP_COOKIE;
1235 mpi_coredump->mpi_global_header.headerSize =
1236 sizeof(struct mpi_coredump_global_header);
1237 mpi_coredump->mpi_global_header.imageSize =
1238 sizeof(struct ql_reg_dump);
Kees Cookdf5303a2017-05-05 15:34:34 -07001239 strncpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
Ron Mercera61f8022009-10-21 11:07:41 +00001240 sizeof(mpi_coredump->mpi_global_header.idString));
1241
1242
1243 /* segment 16 */
1244 ql_build_coredump_seg_header(&mpi_coredump->misc_nic_seg_hdr,
1245 MISC_NIC_INFO_SEG_NUM,
1246 sizeof(struct mpi_coredump_segment_header)
1247 + sizeof(mpi_coredump->misc_nic_info),
1248 "MISC NIC INFO");
1249 mpi_coredump->misc_nic_info.rx_ring_count = qdev->rx_ring_count;
1250 mpi_coredump->misc_nic_info.tx_ring_count = qdev->tx_ring_count;
1251 mpi_coredump->misc_nic_info.intr_count = qdev->intr_count;
1252 mpi_coredump->misc_nic_info.function = qdev->func;
1253
1254 /* Segment 16, Rev C. Step 18 */
1255 ql_build_coredump_seg_header(&mpi_coredump->nic_regs_seg_hdr,
1256 NIC1_CONTROL_SEG_NUM,
1257 sizeof(struct mpi_coredump_segment_header)
1258 + sizeof(mpi_coredump->nic_regs),
1259 "NIC Registers");
1260 /* Get generic reg dump */
1261 for (i = 0; i < 64; i++)
1262 mpi_coredump->nic_regs[i] = ql_read32(qdev, i * sizeof(u32));
1263
1264 /* Segment 31 */
1265 /* Get indexed register values. */
1266 ql_build_coredump_seg_header(&mpi_coredump->intr_states_seg_hdr,
1267 INTR_STATES_SEG_NUM,
1268 sizeof(struct mpi_coredump_segment_header)
1269 + sizeof(mpi_coredump->intr_states),
1270 "INTR States");
1271 ql_get_intr_states(qdev, &mpi_coredump->intr_states[0]);
1272
1273 ql_build_coredump_seg_header(&mpi_coredump->cam_entries_seg_hdr,
1274 CAM_ENTRIES_SEG_NUM,
1275 sizeof(struct mpi_coredump_segment_header)
1276 + sizeof(mpi_coredump->cam_entries),
1277 "CAM Entries");
1278 status = ql_get_cam_entries(qdev, &mpi_coredump->cam_entries[0]);
1279 if (status)
1280 return;
1281
1282 ql_build_coredump_seg_header(&mpi_coredump->nic_routing_words_seg_hdr,
1283 ROUTING_WORDS_SEG_NUM,
1284 sizeof(struct mpi_coredump_segment_header)
1285 + sizeof(mpi_coredump->nic_routing_words),
1286 "Routing Words");
1287 status = ql_get_routing_entries(qdev,
1288 &mpi_coredump->nic_routing_words[0]);
1289 if (status)
1290 return;
1291
1292 /* Segment 34 (Rev C. step 23) */
1293 ql_build_coredump_seg_header(&mpi_coredump->ets_seg_hdr,
1294 ETS_SEG_NUM,
1295 sizeof(struct mpi_coredump_segment_header)
1296 + sizeof(mpi_coredump->ets),
1297 "ETS Registers");
1298 status = ql_get_ets_regs(qdev, &mpi_coredump->ets[0]);
1299 if (status)
1300 return;
Ron Mercer673483c2010-11-10 09:29:45 +00001301}
Ron Mercerd5c1da52010-01-15 13:31:34 +00001302
Ron Mercer673483c2010-11-10 09:29:45 +00001303void ql_get_dump(struct ql_adapter *qdev, void *buff)
1304{
1305 /*
1306 * If the dump has already been taken and is stored
1307 * in our internal buffer and if force dump is set then
1308 * just start the spool to dump it to the log file
1309 * and also, take a snapshot of the general regs to
1310 * to the user's buffer or else take complete dump
1311 * to the user's buffer if force is not set.
1312 */
1313
1314 if (!test_bit(QL_FRC_COREDUMP, &qdev->flags)) {
1315 if (!ql_core_dump(qdev, buff))
1316 ql_soft_reset_mpi_risc(qdev);
1317 else
1318 netif_err(qdev, drv, qdev->ndev, "coredump failed!\n");
1319 } else {
1320 ql_gen_reg_dump(qdev, buff);
Ron Mercerd5c1da52010-01-15 13:31:34 +00001321 ql_get_core_dump(qdev);
Ron Mercer673483c2010-11-10 09:29:45 +00001322 }
Ron Mercera61f8022009-10-21 11:07:41 +00001323}
1324
Ron Mercer8aae2602010-01-15 13:31:28 +00001325/* Coredump to messages log file using separate worker thread */
1326void ql_mpi_core_to_log(struct work_struct *work)
1327{
1328 struct ql_adapter *qdev =
1329 container_of(work, struct ql_adapter, mpi_core_to_log.work);
1330 u32 *tmp, count;
1331 int i;
1332
1333 count = sizeof(struct ql_mpi_coredump) / sizeof(u32);
1334 tmp = (u32 *)qdev->mpi_coredump;
Joe Perchesae9540f72010-02-09 11:49:52 +00001335 netif_printk(qdev, drv, KERN_DEBUG, qdev->ndev,
1336 "Core is dumping to log file!\n");
Ron Mercer8aae2602010-01-15 13:31:28 +00001337
1338 for (i = 0; i < count; i += 8) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001339 pr_err("%.08x: %.08x %.08x %.08x %.08x %.08x "
Frans Pop2381a552010-03-24 07:57:36 +00001340 "%.08x %.08x %.08x\n", i,
Ron Mercer8aae2602010-01-15 13:31:28 +00001341 tmp[i + 0],
1342 tmp[i + 1],
1343 tmp[i + 2],
1344 tmp[i + 3],
1345 tmp[i + 4],
1346 tmp[i + 5],
1347 tmp[i + 6],
1348 tmp[i + 7]);
1349 msleep(5);
1350 }
1351}
1352
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001353#ifdef QL_REG_DUMP
1354static void ql_dump_intr_states(struct ql_adapter *qdev)
1355{
1356 int i;
1357 u32 value;
1358 for (i = 0; i < qdev->intr_count; i++) {
1359 ql_write32(qdev, INTR_EN, qdev->intr_context[i].intr_read_mask);
1360 value = ql_read32(qdev, INTR_EN);
Joe Perches2037d5a2010-07-21 14:44:18 -07001361 pr_err("%s: Interrupt %d is %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001362 qdev->ndev->name, i,
1363 (value & INTR_EN_EN ? "enabled" : "disabled"));
1364 }
1365}
1366
Joe Perches2037d5a2010-07-21 14:44:18 -07001367#define DUMP_XGMAC(qdev, reg) \
1368do { \
1369 u32 data; \
1370 ql_read_xgmac_reg(qdev, reg, &data); \
1371 pr_err("%s: %s = 0x%.08x\n", qdev->ndev->name, #reg, data); \
1372} while (0)
1373
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001374void ql_dump_xgmac_control_regs(struct ql_adapter *qdev)
1375{
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001376 if (ql_sem_spinlock(qdev, qdev->xg_sem_mask)) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001377 pr_err("%s: Couldn't get xgmac sem\n", __func__);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001378 return;
1379 }
Joe Perches2037d5a2010-07-21 14:44:18 -07001380 DUMP_XGMAC(qdev, PAUSE_SRC_LO);
1381 DUMP_XGMAC(qdev, PAUSE_SRC_HI);
1382 DUMP_XGMAC(qdev, GLOBAL_CFG);
1383 DUMP_XGMAC(qdev, TX_CFG);
1384 DUMP_XGMAC(qdev, RX_CFG);
1385 DUMP_XGMAC(qdev, FLOW_CTL);
1386 DUMP_XGMAC(qdev, PAUSE_OPCODE);
1387 DUMP_XGMAC(qdev, PAUSE_TIMER);
1388 DUMP_XGMAC(qdev, PAUSE_FRM_DEST_LO);
1389 DUMP_XGMAC(qdev, PAUSE_FRM_DEST_HI);
1390 DUMP_XGMAC(qdev, MAC_TX_PARAMS);
1391 DUMP_XGMAC(qdev, MAC_RX_PARAMS);
1392 DUMP_XGMAC(qdev, MAC_SYS_INT);
1393 DUMP_XGMAC(qdev, MAC_SYS_INT_MASK);
1394 DUMP_XGMAC(qdev, MAC_MGMT_INT);
1395 DUMP_XGMAC(qdev, MAC_MGMT_IN_MASK);
1396 DUMP_XGMAC(qdev, EXT_ARB_MODE);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001397 ql_sem_unlock(qdev, qdev->xg_sem_mask);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001398}
1399
1400static void ql_dump_ets_regs(struct ql_adapter *qdev)
1401{
1402}
1403
1404static void ql_dump_cam_entries(struct ql_adapter *qdev)
1405{
1406 int i;
1407 u32 value[3];
Ron Mercercc288f52009-02-23 10:42:14 +00001408
1409 i = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
1410 if (i)
1411 return;
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001412 for (i = 0; i < 4; i++) {
1413 if (ql_get_mac_addr_reg(qdev, MAC_ADDR_TYPE_CAM_MAC, i, value)) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001414 pr_err("%s: Failed read of mac index register\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001415 __func__);
1416 return;
1417 } else {
1418 if (value[0])
Joe Perches2037d5a2010-07-21 14:44:18 -07001419 pr_err("%s: CAM index %d CAM Lookup Lower = 0x%.08x:%.08x, Output = 0x%.08x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001420 qdev->ndev->name, i, value[1], value[0],
1421 value[2]);
1422 }
1423 }
1424 for (i = 0; i < 32; i++) {
1425 if (ql_get_mac_addr_reg
1426 (qdev, MAC_ADDR_TYPE_MULTI_MAC, i, value)) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001427 pr_err("%s: Failed read of mac index register\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001428 __func__);
1429 return;
1430 } else {
1431 if (value[0])
Joe Perches2037d5a2010-07-21 14:44:18 -07001432 pr_err("%s: MCAST index %d CAM Lookup Lower = 0x%.08x:%.08x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001433 qdev->ndev->name, i, value[1], value[0]);
1434 }
1435 }
Ron Mercercc288f52009-02-23 10:42:14 +00001436 ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001437}
1438
1439void ql_dump_routing_entries(struct ql_adapter *qdev)
1440{
1441 int i;
1442 u32 value;
Ron Mercercc288f52009-02-23 10:42:14 +00001443 i = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
1444 if (i)
1445 return;
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001446 for (i = 0; i < 16; i++) {
1447 value = 0;
1448 if (ql_get_routing_reg(qdev, i, &value)) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001449 pr_err("%s: Failed read of routing index register\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001450 __func__);
1451 return;
1452 } else {
1453 if (value)
Joe Perches2037d5a2010-07-21 14:44:18 -07001454 pr_err("%s: Routing Mask %d = 0x%.08x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001455 qdev->ndev->name, i, value);
1456 }
1457 }
Ron Mercercc288f52009-02-23 10:42:14 +00001458 ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001459}
1460
Joe Perches2037d5a2010-07-21 14:44:18 -07001461#define DUMP_REG(qdev, reg) \
1462 pr_err("%-32s= 0x%x\n", #reg, ql_read32(qdev, reg))
1463
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001464void ql_dump_regs(struct ql_adapter *qdev)
1465{
Joe Perches2037d5a2010-07-21 14:44:18 -07001466 pr_err("reg dump for function #%d\n", qdev->func);
1467 DUMP_REG(qdev, SYS);
1468 DUMP_REG(qdev, RST_FO);
1469 DUMP_REG(qdev, FSC);
1470 DUMP_REG(qdev, CSR);
1471 DUMP_REG(qdev, ICB_RID);
1472 DUMP_REG(qdev, ICB_L);
1473 DUMP_REG(qdev, ICB_H);
1474 DUMP_REG(qdev, CFG);
1475 DUMP_REG(qdev, BIOS_ADDR);
1476 DUMP_REG(qdev, STS);
1477 DUMP_REG(qdev, INTR_EN);
1478 DUMP_REG(qdev, INTR_MASK);
1479 DUMP_REG(qdev, ISR1);
1480 DUMP_REG(qdev, ISR2);
1481 DUMP_REG(qdev, ISR3);
1482 DUMP_REG(qdev, ISR4);
1483 DUMP_REG(qdev, REV_ID);
1484 DUMP_REG(qdev, FRC_ECC_ERR);
1485 DUMP_REG(qdev, ERR_STS);
1486 DUMP_REG(qdev, RAM_DBG_ADDR);
1487 DUMP_REG(qdev, RAM_DBG_DATA);
1488 DUMP_REG(qdev, ECC_ERR_CNT);
1489 DUMP_REG(qdev, SEM);
1490 DUMP_REG(qdev, GPIO_1);
1491 DUMP_REG(qdev, GPIO_2);
1492 DUMP_REG(qdev, GPIO_3);
1493 DUMP_REG(qdev, XGMAC_ADDR);
1494 DUMP_REG(qdev, XGMAC_DATA);
1495 DUMP_REG(qdev, NIC_ETS);
1496 DUMP_REG(qdev, CNA_ETS);
1497 DUMP_REG(qdev, FLASH_ADDR);
1498 DUMP_REG(qdev, FLASH_DATA);
1499 DUMP_REG(qdev, CQ_STOP);
1500 DUMP_REG(qdev, PAGE_TBL_RID);
1501 DUMP_REG(qdev, WQ_PAGE_TBL_LO);
1502 DUMP_REG(qdev, WQ_PAGE_TBL_HI);
1503 DUMP_REG(qdev, CQ_PAGE_TBL_LO);
1504 DUMP_REG(qdev, CQ_PAGE_TBL_HI);
1505 DUMP_REG(qdev, COS_DFLT_CQ1);
1506 DUMP_REG(qdev, COS_DFLT_CQ2);
1507 DUMP_REG(qdev, SPLT_HDR);
1508 DUMP_REG(qdev, FC_PAUSE_THRES);
1509 DUMP_REG(qdev, NIC_PAUSE_THRES);
1510 DUMP_REG(qdev, FC_ETHERTYPE);
1511 DUMP_REG(qdev, FC_RCV_CFG);
1512 DUMP_REG(qdev, NIC_RCV_CFG);
1513 DUMP_REG(qdev, FC_COS_TAGS);
1514 DUMP_REG(qdev, NIC_COS_TAGS);
1515 DUMP_REG(qdev, MGMT_RCV_CFG);
1516 DUMP_REG(qdev, XG_SERDES_ADDR);
1517 DUMP_REG(qdev, XG_SERDES_DATA);
1518 DUMP_REG(qdev, PRB_MX_ADDR);
1519 DUMP_REG(qdev, PRB_MX_DATA);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001520 ql_dump_intr_states(qdev);
1521 ql_dump_xgmac_control_regs(qdev);
1522 ql_dump_ets_regs(qdev);
1523 ql_dump_cam_entries(qdev);
1524 ql_dump_routing_entries(qdev);
1525}
1526#endif
1527
1528#ifdef QL_STAT_DUMP
Joe Perches2037d5a2010-07-21 14:44:18 -07001529
1530#define DUMP_STAT(qdev, stat) \
1531 pr_err("%s = %ld\n", #stat, (unsigned long)qdev->nic_stats.stat)
1532
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001533void ql_dump_stat(struct ql_adapter *qdev)
1534{
Joe Perches2037d5a2010-07-21 14:44:18 -07001535 pr_err("%s: Enter\n", __func__);
1536 DUMP_STAT(qdev, tx_pkts);
1537 DUMP_STAT(qdev, tx_bytes);
1538 DUMP_STAT(qdev, tx_mcast_pkts);
1539 DUMP_STAT(qdev, tx_bcast_pkts);
1540 DUMP_STAT(qdev, tx_ucast_pkts);
1541 DUMP_STAT(qdev, tx_ctl_pkts);
1542 DUMP_STAT(qdev, tx_pause_pkts);
1543 DUMP_STAT(qdev, tx_64_pkt);
1544 DUMP_STAT(qdev, tx_65_to_127_pkt);
1545 DUMP_STAT(qdev, tx_128_to_255_pkt);
1546 DUMP_STAT(qdev, tx_256_511_pkt);
1547 DUMP_STAT(qdev, tx_512_to_1023_pkt);
1548 DUMP_STAT(qdev, tx_1024_to_1518_pkt);
1549 DUMP_STAT(qdev, tx_1519_to_max_pkt);
1550 DUMP_STAT(qdev, tx_undersize_pkt);
1551 DUMP_STAT(qdev, tx_oversize_pkt);
1552 DUMP_STAT(qdev, rx_bytes);
1553 DUMP_STAT(qdev, rx_bytes_ok);
1554 DUMP_STAT(qdev, rx_pkts);
1555 DUMP_STAT(qdev, rx_pkts_ok);
1556 DUMP_STAT(qdev, rx_bcast_pkts);
1557 DUMP_STAT(qdev, rx_mcast_pkts);
1558 DUMP_STAT(qdev, rx_ucast_pkts);
1559 DUMP_STAT(qdev, rx_undersize_pkts);
1560 DUMP_STAT(qdev, rx_oversize_pkts);
1561 DUMP_STAT(qdev, rx_jabber_pkts);
1562 DUMP_STAT(qdev, rx_undersize_fcerr_pkts);
1563 DUMP_STAT(qdev, rx_drop_events);
1564 DUMP_STAT(qdev, rx_fcerr_pkts);
1565 DUMP_STAT(qdev, rx_align_err);
1566 DUMP_STAT(qdev, rx_symbol_err);
1567 DUMP_STAT(qdev, rx_mac_err);
1568 DUMP_STAT(qdev, rx_ctl_pkts);
1569 DUMP_STAT(qdev, rx_pause_pkts);
1570 DUMP_STAT(qdev, rx_64_pkts);
1571 DUMP_STAT(qdev, rx_65_to_127_pkts);
1572 DUMP_STAT(qdev, rx_128_255_pkts);
1573 DUMP_STAT(qdev, rx_256_511_pkts);
1574 DUMP_STAT(qdev, rx_512_to_1023_pkts);
1575 DUMP_STAT(qdev, rx_1024_to_1518_pkts);
1576 DUMP_STAT(qdev, rx_1519_to_max_pkts);
1577 DUMP_STAT(qdev, rx_len_err_pkts);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001578};
1579#endif
1580
1581#ifdef QL_DEV_DUMP
Joe Perches2037d5a2010-07-21 14:44:18 -07001582
1583#define DUMP_QDEV_FIELD(qdev, type, field) \
1584 pr_err("qdev->%-24s = " type "\n", #field, qdev->field)
1585#define DUMP_QDEV_DMA_FIELD(qdev, field) \
1586 pr_err("qdev->%-24s = %llx\n", #field, (unsigned long long)qdev->field)
1587#define DUMP_QDEV_ARRAY(qdev, type, array, index, field) \
1588 pr_err("%s[%d].%s = " type "\n", \
1589 #array, index, #field, qdev->array[index].field);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001590void ql_dump_qdev(struct ql_adapter *qdev)
1591{
1592 int i;
Joe Perches2037d5a2010-07-21 14:44:18 -07001593 DUMP_QDEV_FIELD(qdev, "%lx", flags);
1594 DUMP_QDEV_FIELD(qdev, "%p", vlgrp);
1595 DUMP_QDEV_FIELD(qdev, "%p", pdev);
1596 DUMP_QDEV_FIELD(qdev, "%p", ndev);
1597 DUMP_QDEV_FIELD(qdev, "%d", chip_rev_id);
1598 DUMP_QDEV_FIELD(qdev, "%p", reg_base);
1599 DUMP_QDEV_FIELD(qdev, "%p", doorbell_area);
1600 DUMP_QDEV_FIELD(qdev, "%d", doorbell_area_size);
1601 DUMP_QDEV_FIELD(qdev, "%x", msg_enable);
1602 DUMP_QDEV_FIELD(qdev, "%p", rx_ring_shadow_reg_area);
1603 DUMP_QDEV_DMA_FIELD(qdev, rx_ring_shadow_reg_dma);
1604 DUMP_QDEV_FIELD(qdev, "%p", tx_ring_shadow_reg_area);
1605 DUMP_QDEV_DMA_FIELD(qdev, tx_ring_shadow_reg_dma);
1606 DUMP_QDEV_FIELD(qdev, "%d", intr_count);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001607 if (qdev->msi_x_entry)
1608 for (i = 0; i < qdev->intr_count; i++) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001609 DUMP_QDEV_ARRAY(qdev, "%d", msi_x_entry, i, vector);
1610 DUMP_QDEV_ARRAY(qdev, "%d", msi_x_entry, i, entry);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001611 }
1612 for (i = 0; i < qdev->intr_count; i++) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001613 DUMP_QDEV_ARRAY(qdev, "%p", intr_context, i, qdev);
1614 DUMP_QDEV_ARRAY(qdev, "%d", intr_context, i, intr);
1615 DUMP_QDEV_ARRAY(qdev, "%d", intr_context, i, hooked);
1616 DUMP_QDEV_ARRAY(qdev, "0x%08x", intr_context, i, intr_en_mask);
1617 DUMP_QDEV_ARRAY(qdev, "0x%08x", intr_context, i, intr_dis_mask);
1618 DUMP_QDEV_ARRAY(qdev, "0x%08x", intr_context, i, intr_read_mask);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001619 }
Joe Perches2037d5a2010-07-21 14:44:18 -07001620 DUMP_QDEV_FIELD(qdev, "%d", tx_ring_count);
1621 DUMP_QDEV_FIELD(qdev, "%d", rx_ring_count);
1622 DUMP_QDEV_FIELD(qdev, "%d", ring_mem_size);
1623 DUMP_QDEV_FIELD(qdev, "%p", ring_mem);
1624 DUMP_QDEV_FIELD(qdev, "%d", intr_count);
1625 DUMP_QDEV_FIELD(qdev, "%p", tx_ring);
1626 DUMP_QDEV_FIELD(qdev, "%d", rss_ring_count);
1627 DUMP_QDEV_FIELD(qdev, "%p", rx_ring);
1628 DUMP_QDEV_FIELD(qdev, "%d", default_rx_queue);
1629 DUMP_QDEV_FIELD(qdev, "0x%08x", xg_sem_mask);
1630 DUMP_QDEV_FIELD(qdev, "0x%08x", port_link_up);
1631 DUMP_QDEV_FIELD(qdev, "0x%08x", port_init);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001632}
1633#endif
1634
1635#ifdef QL_CB_DUMP
1636void ql_dump_wqicb(struct wqicb *wqicb)
1637{
Joe Perches2037d5a2010-07-21 14:44:18 -07001638 pr_err("Dumping wqicb stuff...\n");
1639 pr_err("wqicb->len = 0x%x\n", le16_to_cpu(wqicb->len));
1640 pr_err("wqicb->flags = %x\n", le16_to_cpu(wqicb->flags));
1641 pr_err("wqicb->cq_id_rss = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001642 le16_to_cpu(wqicb->cq_id_rss));
Joe Perches2037d5a2010-07-21 14:44:18 -07001643 pr_err("wqicb->rid = 0x%x\n", le16_to_cpu(wqicb->rid));
1644 pr_err("wqicb->wq_addr = 0x%llx\n",
Ron Mercer97345522009-01-09 11:31:50 +00001645 (unsigned long long) le64_to_cpu(wqicb->addr));
Joe Perches2037d5a2010-07-21 14:44:18 -07001646 pr_err("wqicb->wq_cnsmr_idx_addr = 0x%llx\n",
Ron Mercer97345522009-01-09 11:31:50 +00001647 (unsigned long long) le64_to_cpu(wqicb->cnsmr_idx_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001648}
1649
1650void ql_dump_tx_ring(struct tx_ring *tx_ring)
1651{
1652 if (tx_ring == NULL)
1653 return;
Joe Perches2037d5a2010-07-21 14:44:18 -07001654 pr_err("===================== Dumping tx_ring %d ===============\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001655 tx_ring->wq_id);
Joe Perches2037d5a2010-07-21 14:44:18 -07001656 pr_err("tx_ring->base = %p\n", tx_ring->wq_base);
1657 pr_err("tx_ring->base_dma = 0x%llx\n",
David S. Miller53159d02008-09-19 16:13:05 -07001658 (unsigned long long) tx_ring->wq_base_dma);
Joe Perches2037d5a2010-07-21 14:44:18 -07001659 pr_err("tx_ring->cnsmr_idx_sh_reg, addr = 0x%p, value = %d\n",
Ron Mercerba7cd3b2009-01-09 11:31:49 +00001660 tx_ring->cnsmr_idx_sh_reg,
1661 tx_ring->cnsmr_idx_sh_reg
1662 ? ql_read_sh_reg(tx_ring->cnsmr_idx_sh_reg) : 0);
Joe Perches2037d5a2010-07-21 14:44:18 -07001663 pr_err("tx_ring->size = %d\n", tx_ring->wq_size);
1664 pr_err("tx_ring->len = %d\n", tx_ring->wq_len);
1665 pr_err("tx_ring->prod_idx_db_reg = %p\n", tx_ring->prod_idx_db_reg);
1666 pr_err("tx_ring->valid_db_reg = %p\n", tx_ring->valid_db_reg);
1667 pr_err("tx_ring->prod_idx = %d\n", tx_ring->prod_idx);
1668 pr_err("tx_ring->cq_id = %d\n", tx_ring->cq_id);
1669 pr_err("tx_ring->wq_id = %d\n", tx_ring->wq_id);
1670 pr_err("tx_ring->q = %p\n", tx_ring->q);
1671 pr_err("tx_ring->tx_count = %d\n", atomic_read(&tx_ring->tx_count));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001672}
1673
1674void ql_dump_ricb(struct ricb *ricb)
1675{
1676 int i;
Joe Perches2037d5a2010-07-21 14:44:18 -07001677 pr_err("===================== Dumping ricb ===============\n");
1678 pr_err("Dumping ricb stuff...\n");
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001679
Joe Perches2037d5a2010-07-21 14:44:18 -07001680 pr_err("ricb->base_cq = %d\n", ricb->base_cq & 0x1f);
1681 pr_err("ricb->flags = %s%s%s%s%s%s%s%s%s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001682 ricb->base_cq & RSS_L4K ? "RSS_L4K " : "",
1683 ricb->flags & RSS_L6K ? "RSS_L6K " : "",
1684 ricb->flags & RSS_LI ? "RSS_LI " : "",
1685 ricb->flags & RSS_LB ? "RSS_LB " : "",
1686 ricb->flags & RSS_LM ? "RSS_LM " : "",
1687 ricb->flags & RSS_RI4 ? "RSS_RI4 " : "",
1688 ricb->flags & RSS_RT4 ? "RSS_RT4 " : "",
1689 ricb->flags & RSS_RI6 ? "RSS_RI6 " : "",
1690 ricb->flags & RSS_RT6 ? "RSS_RT6 " : "");
Joe Perches2037d5a2010-07-21 14:44:18 -07001691 pr_err("ricb->mask = 0x%.04x\n", le16_to_cpu(ricb->mask));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001692 for (i = 0; i < 16; i++)
Joe Perches2037d5a2010-07-21 14:44:18 -07001693 pr_err("ricb->hash_cq_id[%d] = 0x%.08x\n", i,
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001694 le32_to_cpu(ricb->hash_cq_id[i]));
1695 for (i = 0; i < 10; i++)
Joe Perches2037d5a2010-07-21 14:44:18 -07001696 pr_err("ricb->ipv6_hash_key[%d] = 0x%.08x\n", i,
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001697 le32_to_cpu(ricb->ipv6_hash_key[i]));
1698 for (i = 0; i < 4; i++)
Joe Perches2037d5a2010-07-21 14:44:18 -07001699 pr_err("ricb->ipv4_hash_key[%d] = 0x%.08x\n", i,
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001700 le32_to_cpu(ricb->ipv4_hash_key[i]));
1701}
1702
1703void ql_dump_cqicb(struct cqicb *cqicb)
1704{
Joe Perches2037d5a2010-07-21 14:44:18 -07001705 pr_err("Dumping cqicb stuff...\n");
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001706
Joe Perches2037d5a2010-07-21 14:44:18 -07001707 pr_err("cqicb->msix_vect = %d\n", cqicb->msix_vect);
1708 pr_err("cqicb->flags = %x\n", cqicb->flags);
1709 pr_err("cqicb->len = %d\n", le16_to_cpu(cqicb->len));
1710 pr_err("cqicb->addr = 0x%llx\n",
Ron Mercer97345522009-01-09 11:31:50 +00001711 (unsigned long long) le64_to_cpu(cqicb->addr));
Joe Perches2037d5a2010-07-21 14:44:18 -07001712 pr_err("cqicb->prod_idx_addr = 0x%llx\n",
Ron Mercer97345522009-01-09 11:31:50 +00001713 (unsigned long long) le64_to_cpu(cqicb->prod_idx_addr));
Joe Perches2037d5a2010-07-21 14:44:18 -07001714 pr_err("cqicb->pkt_delay = 0x%.04x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001715 le16_to_cpu(cqicb->pkt_delay));
Joe Perches2037d5a2010-07-21 14:44:18 -07001716 pr_err("cqicb->irq_delay = 0x%.04x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001717 le16_to_cpu(cqicb->irq_delay));
Joe Perches2037d5a2010-07-21 14:44:18 -07001718 pr_err("cqicb->lbq_addr = 0x%llx\n",
Ron Mercer97345522009-01-09 11:31:50 +00001719 (unsigned long long) le64_to_cpu(cqicb->lbq_addr));
Joe Perches2037d5a2010-07-21 14:44:18 -07001720 pr_err("cqicb->lbq_buf_size = 0x%.04x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001721 le16_to_cpu(cqicb->lbq_buf_size));
Joe Perches2037d5a2010-07-21 14:44:18 -07001722 pr_err("cqicb->lbq_len = 0x%.04x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001723 le16_to_cpu(cqicb->lbq_len));
Joe Perches2037d5a2010-07-21 14:44:18 -07001724 pr_err("cqicb->sbq_addr = 0x%llx\n",
Ron Mercer97345522009-01-09 11:31:50 +00001725 (unsigned long long) le64_to_cpu(cqicb->sbq_addr));
Joe Perches2037d5a2010-07-21 14:44:18 -07001726 pr_err("cqicb->sbq_buf_size = 0x%.04x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001727 le16_to_cpu(cqicb->sbq_buf_size));
Joe Perches2037d5a2010-07-21 14:44:18 -07001728 pr_err("cqicb->sbq_len = 0x%.04x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001729 le16_to_cpu(cqicb->sbq_len));
1730}
1731
1732void ql_dump_rx_ring(struct rx_ring *rx_ring)
1733{
1734 if (rx_ring == NULL)
1735 return;
Joe Perches2037d5a2010-07-21 14:44:18 -07001736 pr_err("===================== Dumping rx_ring %d ===============\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001737 rx_ring->cq_id);
Joe Perches2037d5a2010-07-21 14:44:18 -07001738 pr_err("Dumping rx_ring %d, type = %s%s%s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001739 rx_ring->cq_id, rx_ring->type == DEFAULT_Q ? "DEFAULT" : "",
1740 rx_ring->type == TX_Q ? "OUTBOUND COMPLETIONS" : "",
1741 rx_ring->type == RX_Q ? "INBOUND_COMPLETIONS" : "");
Joe Perches2037d5a2010-07-21 14:44:18 -07001742 pr_err("rx_ring->cqicb = %p\n", &rx_ring->cqicb);
1743 pr_err("rx_ring->cq_base = %p\n", rx_ring->cq_base);
1744 pr_err("rx_ring->cq_base_dma = %llx\n",
David S. Miller53159d02008-09-19 16:13:05 -07001745 (unsigned long long) rx_ring->cq_base_dma);
Joe Perches2037d5a2010-07-21 14:44:18 -07001746 pr_err("rx_ring->cq_size = %d\n", rx_ring->cq_size);
1747 pr_err("rx_ring->cq_len = %d\n", rx_ring->cq_len);
1748 pr_err("rx_ring->prod_idx_sh_reg, addr = 0x%p, value = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001749 rx_ring->prod_idx_sh_reg,
Ron Mercerba7cd3b2009-01-09 11:31:49 +00001750 rx_ring->prod_idx_sh_reg
1751 ? ql_read_sh_reg(rx_ring->prod_idx_sh_reg) : 0);
Joe Perches2037d5a2010-07-21 14:44:18 -07001752 pr_err("rx_ring->prod_idx_sh_reg_dma = %llx\n",
David S. Miller53159d02008-09-19 16:13:05 -07001753 (unsigned long long) rx_ring->prod_idx_sh_reg_dma);
Joe Perches2037d5a2010-07-21 14:44:18 -07001754 pr_err("rx_ring->cnsmr_idx_db_reg = %p\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001755 rx_ring->cnsmr_idx_db_reg);
Joe Perches2037d5a2010-07-21 14:44:18 -07001756 pr_err("rx_ring->cnsmr_idx = %d\n", rx_ring->cnsmr_idx);
1757 pr_err("rx_ring->curr_entry = %p\n", rx_ring->curr_entry);
1758 pr_err("rx_ring->valid_db_reg = %p\n", rx_ring->valid_db_reg);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001759
Joe Perches2037d5a2010-07-21 14:44:18 -07001760 pr_err("rx_ring->lbq_base = %p\n", rx_ring->lbq_base);
1761 pr_err("rx_ring->lbq_base_dma = %llx\n",
David S. Miller53159d02008-09-19 16:13:05 -07001762 (unsigned long long) rx_ring->lbq_base_dma);
Joe Perches2037d5a2010-07-21 14:44:18 -07001763 pr_err("rx_ring->lbq_base_indirect = %p\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001764 rx_ring->lbq_base_indirect);
Joe Perches2037d5a2010-07-21 14:44:18 -07001765 pr_err("rx_ring->lbq_base_indirect_dma = %llx\n",
David S. Miller53159d02008-09-19 16:13:05 -07001766 (unsigned long long) rx_ring->lbq_base_indirect_dma);
Joe Perches2037d5a2010-07-21 14:44:18 -07001767 pr_err("rx_ring->lbq = %p\n", rx_ring->lbq);
1768 pr_err("rx_ring->lbq_len = %d\n", rx_ring->lbq_len);
1769 pr_err("rx_ring->lbq_size = %d\n", rx_ring->lbq_size);
1770 pr_err("rx_ring->lbq_prod_idx_db_reg = %p\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001771 rx_ring->lbq_prod_idx_db_reg);
Joe Perches2037d5a2010-07-21 14:44:18 -07001772 pr_err("rx_ring->lbq_prod_idx = %d\n", rx_ring->lbq_prod_idx);
1773 pr_err("rx_ring->lbq_curr_idx = %d\n", rx_ring->lbq_curr_idx);
1774 pr_err("rx_ring->lbq_clean_idx = %d\n", rx_ring->lbq_clean_idx);
1775 pr_err("rx_ring->lbq_free_cnt = %d\n", rx_ring->lbq_free_cnt);
1776 pr_err("rx_ring->lbq_buf_size = %d\n", rx_ring->lbq_buf_size);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001777
Joe Perches2037d5a2010-07-21 14:44:18 -07001778 pr_err("rx_ring->sbq_base = %p\n", rx_ring->sbq_base);
1779 pr_err("rx_ring->sbq_base_dma = %llx\n",
David S. Miller53159d02008-09-19 16:13:05 -07001780 (unsigned long long) rx_ring->sbq_base_dma);
Joe Perches2037d5a2010-07-21 14:44:18 -07001781 pr_err("rx_ring->sbq_base_indirect = %p\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001782 rx_ring->sbq_base_indirect);
Joe Perches2037d5a2010-07-21 14:44:18 -07001783 pr_err("rx_ring->sbq_base_indirect_dma = %llx\n",
David S. Miller53159d02008-09-19 16:13:05 -07001784 (unsigned long long) rx_ring->sbq_base_indirect_dma);
Joe Perches2037d5a2010-07-21 14:44:18 -07001785 pr_err("rx_ring->sbq = %p\n", rx_ring->sbq);
1786 pr_err("rx_ring->sbq_len = %d\n", rx_ring->sbq_len);
1787 pr_err("rx_ring->sbq_size = %d\n", rx_ring->sbq_size);
1788 pr_err("rx_ring->sbq_prod_idx_db_reg addr = %p\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001789 rx_ring->sbq_prod_idx_db_reg);
Joe Perches2037d5a2010-07-21 14:44:18 -07001790 pr_err("rx_ring->sbq_prod_idx = %d\n", rx_ring->sbq_prod_idx);
1791 pr_err("rx_ring->sbq_curr_idx = %d\n", rx_ring->sbq_curr_idx);
1792 pr_err("rx_ring->sbq_clean_idx = %d\n", rx_ring->sbq_clean_idx);
1793 pr_err("rx_ring->sbq_free_cnt = %d\n", rx_ring->sbq_free_cnt);
1794 pr_err("rx_ring->sbq_buf_size = %d\n", rx_ring->sbq_buf_size);
1795 pr_err("rx_ring->cq_id = %d\n", rx_ring->cq_id);
1796 pr_err("rx_ring->irq = %d\n", rx_ring->irq);
1797 pr_err("rx_ring->cpu = %d\n", rx_ring->cpu);
1798 pr_err("rx_ring->qdev = %p\n", rx_ring->qdev);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001799}
1800
1801void ql_dump_hw_cb(struct ql_adapter *qdev, int size, u32 bit, u16 q_id)
1802{
1803 void *ptr;
1804
Joe Perches2037d5a2010-07-21 14:44:18 -07001805 pr_err("%s: Enter\n", __func__);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001806
1807 ptr = kmalloc(size, GFP_ATOMIC);
Joe Perchese404dec2012-01-29 12:56:23 +00001808 if (ptr == NULL)
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001809 return;
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001810
1811 if (ql_write_cfg(qdev, ptr, size, bit, q_id)) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001812 pr_err("%s: Failed to upload control block!\n", __func__);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001813 goto fail_it;
1814 }
1815 switch (bit) {
1816 case CFG_DRQ:
1817 ql_dump_wqicb((struct wqicb *)ptr);
1818 break;
1819 case CFG_DCQ:
1820 ql_dump_cqicb((struct cqicb *)ptr);
1821 break;
1822 case CFG_DR:
1823 ql_dump_ricb((struct ricb *)ptr);
1824 break;
1825 default:
Joe Perches2037d5a2010-07-21 14:44:18 -07001826 pr_err("%s: Invalid bit value = %x\n", __func__, bit);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001827 break;
1828 }
1829fail_it:
1830 kfree(ptr);
1831}
1832#endif
1833
1834#ifdef QL_OB_DUMP
1835void ql_dump_tx_desc(struct tx_buf_desc *tbd)
1836{
Joe Perches2037d5a2010-07-21 14:44:18 -07001837 pr_err("tbd->addr = 0x%llx\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001838 le64_to_cpu((u64) tbd->addr));
Joe Perches2037d5a2010-07-21 14:44:18 -07001839 pr_err("tbd->len = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001840 le32_to_cpu(tbd->len & TX_DESC_LEN_MASK));
Joe Perches2037d5a2010-07-21 14:44:18 -07001841 pr_err("tbd->flags = %s %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001842 tbd->len & TX_DESC_C ? "C" : ".",
1843 tbd->len & TX_DESC_E ? "E" : ".");
1844 tbd++;
Joe Perches2037d5a2010-07-21 14:44:18 -07001845 pr_err("tbd->addr = 0x%llx\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001846 le64_to_cpu((u64) tbd->addr));
Joe Perches2037d5a2010-07-21 14:44:18 -07001847 pr_err("tbd->len = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001848 le32_to_cpu(tbd->len & TX_DESC_LEN_MASK));
Joe Perches2037d5a2010-07-21 14:44:18 -07001849 pr_err("tbd->flags = %s %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001850 tbd->len & TX_DESC_C ? "C" : ".",
1851 tbd->len & TX_DESC_E ? "E" : ".");
1852 tbd++;
Joe Perches2037d5a2010-07-21 14:44:18 -07001853 pr_err("tbd->addr = 0x%llx\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001854 le64_to_cpu((u64) tbd->addr));
Joe Perches2037d5a2010-07-21 14:44:18 -07001855 pr_err("tbd->len = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001856 le32_to_cpu(tbd->len & TX_DESC_LEN_MASK));
Joe Perches2037d5a2010-07-21 14:44:18 -07001857 pr_err("tbd->flags = %s %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001858 tbd->len & TX_DESC_C ? "C" : ".",
1859 tbd->len & TX_DESC_E ? "E" : ".");
1860
1861}
1862
1863void ql_dump_ob_mac_iocb(struct ob_mac_iocb_req *ob_mac_iocb)
1864{
1865 struct ob_mac_tso_iocb_req *ob_mac_tso_iocb =
1866 (struct ob_mac_tso_iocb_req *)ob_mac_iocb;
1867 struct tx_buf_desc *tbd;
1868 u16 frame_len;
1869
Joe Perches2037d5a2010-07-21 14:44:18 -07001870 pr_err("%s\n", __func__);
1871 pr_err("opcode = %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001872 (ob_mac_iocb->opcode == OPCODE_OB_MAC_IOCB) ? "MAC" : "TSO");
Joe Perches2037d5a2010-07-21 14:44:18 -07001873 pr_err("flags1 = %s %s %s %s %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001874 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_OI ? "OI" : "",
1875 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_I ? "I" : "",
1876 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_D ? "D" : "",
1877 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_IP4 ? "IP4" : "",
1878 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_IP6 ? "IP6" : "");
Joe Perches2037d5a2010-07-21 14:44:18 -07001879 pr_err("flags2 = %s %s %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001880 ob_mac_tso_iocb->flags2 & OB_MAC_TSO_IOCB_LSO ? "LSO" : "",
1881 ob_mac_tso_iocb->flags2 & OB_MAC_TSO_IOCB_UC ? "UC" : "",
1882 ob_mac_tso_iocb->flags2 & OB_MAC_TSO_IOCB_TC ? "TC" : "");
Joe Perches2037d5a2010-07-21 14:44:18 -07001883 pr_err("flags3 = %s %s %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001884 ob_mac_tso_iocb->flags3 & OB_MAC_TSO_IOCB_IC ? "IC" : "",
1885 ob_mac_tso_iocb->flags3 & OB_MAC_TSO_IOCB_DFP ? "DFP" : "",
1886 ob_mac_tso_iocb->flags3 & OB_MAC_TSO_IOCB_V ? "V" : "");
Joe Perches2037d5a2010-07-21 14:44:18 -07001887 pr_err("tid = %x\n", ob_mac_iocb->tid);
1888 pr_err("txq_idx = %d\n", ob_mac_iocb->txq_idx);
1889 pr_err("vlan_tci = %x\n", ob_mac_tso_iocb->vlan_tci);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001890 if (ob_mac_iocb->opcode == OPCODE_OB_MAC_TSO_IOCB) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001891 pr_err("frame_len = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001892 le32_to_cpu(ob_mac_tso_iocb->frame_len));
Joe Perches2037d5a2010-07-21 14:44:18 -07001893 pr_err("mss = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001894 le16_to_cpu(ob_mac_tso_iocb->mss));
Joe Perches2037d5a2010-07-21 14:44:18 -07001895 pr_err("prot_hdr_len = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001896 le16_to_cpu(ob_mac_tso_iocb->total_hdrs_len));
Joe Perches2037d5a2010-07-21 14:44:18 -07001897 pr_err("hdr_offset = 0x%.04x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001898 le16_to_cpu(ob_mac_tso_iocb->net_trans_offset));
1899 frame_len = le32_to_cpu(ob_mac_tso_iocb->frame_len);
1900 } else {
Joe Perches2037d5a2010-07-21 14:44:18 -07001901 pr_err("frame_len = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001902 le16_to_cpu(ob_mac_iocb->frame_len));
1903 frame_len = le16_to_cpu(ob_mac_iocb->frame_len);
1904 }
1905 tbd = &ob_mac_iocb->tbd[0];
1906 ql_dump_tx_desc(tbd);
1907}
1908
1909void ql_dump_ob_mac_rsp(struct ob_mac_iocb_rsp *ob_mac_rsp)
1910{
Joe Perches2037d5a2010-07-21 14:44:18 -07001911 pr_err("%s\n", __func__);
1912 pr_err("opcode = %d\n", ob_mac_rsp->opcode);
1913 pr_err("flags = %s %s %s %s %s %s %s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001914 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_OI ? "OI" : ".",
1915 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_I ? "I" : ".",
1916 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_E ? "E" : ".",
1917 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_S ? "S" : ".",
1918 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_L ? "L" : ".",
1919 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_P ? "P" : ".",
1920 ob_mac_rsp->flags2 & OB_MAC_IOCB_RSP_B ? "B" : ".");
Joe Perches2037d5a2010-07-21 14:44:18 -07001921 pr_err("tid = %x\n", ob_mac_rsp->tid);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001922}
1923#endif
1924
1925#ifdef QL_IB_DUMP
1926void ql_dump_ib_mac_rsp(struct ib_mac_iocb_rsp *ib_mac_rsp)
1927{
Joe Perches2037d5a2010-07-21 14:44:18 -07001928 pr_err("%s\n", __func__);
1929 pr_err("opcode = 0x%x\n", ib_mac_rsp->opcode);
1930 pr_err("flags1 = %s%s%s%s%s%s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001931 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_OI ? "OI " : "",
1932 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_I ? "I " : "",
1933 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_TE ? "TE " : "",
1934 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_NU ? "NU " : "",
1935 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_IE ? "IE " : "",
1936 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_B ? "B " : "");
1937
1938 if (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK)
Joe Perches2037d5a2010-07-21 14:44:18 -07001939 pr_err("%s%s%s Multicast\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001940 (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) ==
1941 IB_MAC_IOCB_RSP_M_HASH ? "Hash" : "",
1942 (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) ==
1943 IB_MAC_IOCB_RSP_M_REG ? "Registered" : "",
1944 (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) ==
1945 IB_MAC_IOCB_RSP_M_PROM ? "Promiscuous" : "");
1946
Joe Perches2037d5a2010-07-21 14:44:18 -07001947 pr_err("flags2 = %s%s%s%s%s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001948 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_P) ? "P " : "",
1949 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) ? "V " : "",
1950 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) ? "U " : "",
1951 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) ? "T " : "",
1952 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_FO) ? "FO " : "");
1953
1954 if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK)
Joe Perches2037d5a2010-07-21 14:44:18 -07001955 pr_err("%s%s%s%s%s error\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001956 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1957 IB_MAC_IOCB_RSP_ERR_OVERSIZE ? "oversize" : "",
1958 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1959 IB_MAC_IOCB_RSP_ERR_UNDERSIZE ? "undersize" : "",
1960 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1961 IB_MAC_IOCB_RSP_ERR_PREAMBLE ? "preamble" : "",
1962 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1963 IB_MAC_IOCB_RSP_ERR_FRAME_LEN ? "frame length" : "",
1964 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1965 IB_MAC_IOCB_RSP_ERR_CRC ? "CRC" : "");
1966
Joe Perches2037d5a2010-07-21 14:44:18 -07001967 pr_err("flags3 = %s%s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001968 ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_DS ? "DS " : "",
1969 ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_DL ? "DL " : "");
1970
1971 if (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK)
Joe Perches2037d5a2010-07-21 14:44:18 -07001972 pr_err("RSS flags = %s%s%s%s\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001973 ((ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK) ==
1974 IB_MAC_IOCB_RSP_M_IPV4) ? "IPv4 RSS" : "",
1975 ((ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK) ==
1976 IB_MAC_IOCB_RSP_M_IPV6) ? "IPv6 RSS " : "",
1977 ((ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK) ==
1978 IB_MAC_IOCB_RSP_M_TCP_V4) ? "TCP/IPv4 RSS" : "",
1979 ((ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK) ==
1980 IB_MAC_IOCB_RSP_M_TCP_V6) ? "TCP/IPv6 RSS" : "");
1981
Joe Perches2037d5a2010-07-21 14:44:18 -07001982 pr_err("data_len = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001983 le32_to_cpu(ib_mac_rsp->data_len));
Joe Perches2037d5a2010-07-21 14:44:18 -07001984 pr_err("data_addr = 0x%llx\n",
Ron Mercer97345522009-01-09 11:31:50 +00001985 (unsigned long long) le64_to_cpu(ib_mac_rsp->data_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001986 if (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK)
Joe Perches2037d5a2010-07-21 14:44:18 -07001987 pr_err("rss = %x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001988 le32_to_cpu(ib_mac_rsp->rss));
1989 if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V)
Joe Perches2037d5a2010-07-21 14:44:18 -07001990 pr_err("vlan_id = %x\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001991 le16_to_cpu(ib_mac_rsp->vlan_id));
1992
Joe Perches2037d5a2010-07-21 14:44:18 -07001993 pr_err("flags4 = %s%s%s\n",
Ron Mercera303ce02009-01-05 18:18:22 -08001994 ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HV ? "HV " : "",
1995 ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HS ? "HS " : "",
1996 ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HL ? "HL " : "");
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001997
Ron Mercera303ce02009-01-05 18:18:22 -08001998 if (ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HV) {
Joe Perches2037d5a2010-07-21 14:44:18 -07001999 pr_err("hdr length = %d\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04002000 le32_to_cpu(ib_mac_rsp->hdr_len));
Joe Perches2037d5a2010-07-21 14:44:18 -07002001 pr_err("hdr addr = 0x%llx\n",
Ron Mercer97345522009-01-09 11:31:50 +00002002 (unsigned long long) le64_to_cpu(ib_mac_rsp->hdr_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04002003 }
2004}
2005#endif
2006
2007#ifdef QL_ALL_DUMP
2008void ql_dump_all(struct ql_adapter *qdev)
2009{
2010 int i;
2011
2012 QL_DUMP_REGS(qdev);
2013 QL_DUMP_QDEV(qdev);
2014 for (i = 0; i < qdev->tx_ring_count; i++) {
2015 QL_DUMP_TX_RING(&qdev->tx_ring[i]);
2016 QL_DUMP_WQICB((struct wqicb *)&qdev->tx_ring[i]);
2017 }
2018 for (i = 0; i < qdev->rx_ring_count; i++) {
2019 QL_DUMP_RX_RING(&qdev->rx_ring[i]);
2020 QL_DUMP_CQICB((struct cqicb *)&qdev->rx_ring[i]);
2021 }
2022}
2023#endif