blob: 833cfd7a22c1634619ed72f147a5c2e46178ef1f [file] [log] [blame]
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001#include "qlge.h"
2
Ron Mercera61f8022009-10-21 11:07:41 +00003
4static int ql_get_ets_regs(struct ql_adapter *qdev, u32 * buf)
5{
6 int status = 0;
7 int i;
8
9 for (i = 0; i < 8; i++, buf++) {
10 ql_write32(qdev, NIC_ETS, i << 29 | 0x08000000);
11 *buf = ql_read32(qdev, NIC_ETS);
12 }
13
14 for (i = 0; i < 2; i++, buf++) {
15 ql_write32(qdev, CNA_ETS, i << 29 | 0x08000000);
16 *buf = ql_read32(qdev, CNA_ETS);
17 }
18
19 return status;
20}
21
22static void ql_get_intr_states(struct ql_adapter *qdev, u32 * buf)
23{
24 int i;
25
26 for (i = 0; i < qdev->rx_ring_count; i++, buf++) {
27 ql_write32(qdev, INTR_EN,
28 qdev->intr_context[i].intr_read_mask);
29 *buf = ql_read32(qdev, INTR_EN);
30 }
31}
32
33static int ql_get_cam_entries(struct ql_adapter *qdev, u32 * buf)
34{
35 int i, status;
36 u32 value[3];
37
38 status = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
39 if (status)
40 return status;
41
42 for (i = 0; i < 16; i++) {
43 status = ql_get_mac_addr_reg(qdev,
44 MAC_ADDR_TYPE_CAM_MAC, i, value);
45 if (status) {
46 QPRINTK(qdev, DRV, ERR,
47 "Failed read of mac index register.\n");
48 goto err;
49 }
50 *buf++ = value[0]; /* lower MAC address */
51 *buf++ = value[1]; /* upper MAC address */
52 *buf++ = value[2]; /* output */
53 }
54 for (i = 0; i < 32; i++) {
55 status = ql_get_mac_addr_reg(qdev,
56 MAC_ADDR_TYPE_MULTI_MAC, i, value);
57 if (status) {
58 QPRINTK(qdev, DRV, ERR,
59 "Failed read of mac index register.\n");
60 goto err;
61 }
62 *buf++ = value[0]; /* lower Mcast address */
63 *buf++ = value[1]; /* upper Mcast address */
64 }
65err:
66 ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
67 return status;
68}
69
70static int ql_get_routing_entries(struct ql_adapter *qdev, u32 * buf)
71{
72 int status;
73 u32 value, i;
74
75 status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
76 if (status)
77 return status;
78
79 for (i = 0; i < 16; i++) {
80 status = ql_get_routing_reg(qdev, i, &value);
81 if (status) {
82 QPRINTK(qdev, DRV, ERR,
83 "Failed read of routing index register.\n");
84 goto err;
85 } else {
86 *buf++ = value;
87 }
88 }
89err:
90 ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
91 return status;
92}
93
Ron Mercer8aae2602010-01-15 13:31:28 +000094/* Read the MPI Processor shadow registers */
95static int ql_get_mpi_shadow_regs(struct ql_adapter *qdev, u32 * buf)
96{
97 u32 i;
98 int status;
99
100 for (i = 0; i < MPI_CORE_SH_REGS_CNT; i++, buf++) {
101 status = ql_write_mpi_reg(qdev, RISC_124,
102 (SHADOW_OFFSET | i << SHADOW_REG_SHIFT));
103 if (status)
104 goto end;
105 status = ql_read_mpi_reg(qdev, RISC_127, buf);
106 if (status)
107 goto end;
108 }
109end:
110 return status;
111}
112
113/* Read the MPI Processor core registers */
114static int ql_get_mpi_regs(struct ql_adapter *qdev, u32 * buf,
115 u32 offset, u32 count)
116{
117 int i, status = 0;
118 for (i = 0; i < count; i++, buf++) {
119 status = ql_read_mpi_reg(qdev, offset + i, buf);
120 if (status)
121 return status;
122 }
123 return status;
124}
125
Ron Mercerc89ec8b2010-01-15 13:31:29 +0000126/* Read the ASIC probe dump */
127static unsigned int *ql_get_probe(struct ql_adapter *qdev, u32 clock,
128 u32 valid, u32 *buf)
129{
130 u32 module, mux_sel, probe, lo_val, hi_val;
131
132 for (module = 0; module < PRB_MX_ADDR_MAX_MODS; module++) {
133 if (!((valid >> module) & 1))
134 continue;
135 for (mux_sel = 0; mux_sel < PRB_MX_ADDR_MAX_MUX; mux_sel++) {
136 probe = clock
137 | PRB_MX_ADDR_ARE
138 | mux_sel
139 | (module << PRB_MX_ADDR_MOD_SEL_SHIFT);
140 ql_write32(qdev, PRB_MX_ADDR, probe);
141 lo_val = ql_read32(qdev, PRB_MX_DATA);
142 if (mux_sel == 0) {
143 *buf = probe;
144 buf++;
145 }
146 probe |= PRB_MX_ADDR_UP;
147 ql_write32(qdev, PRB_MX_ADDR, probe);
148 hi_val = ql_read32(qdev, PRB_MX_DATA);
149 *buf = lo_val;
150 buf++;
151 *buf = hi_val;
152 buf++;
153 }
154 }
155 return buf;
156}
157
158static int ql_get_probe_dump(struct ql_adapter *qdev, unsigned int *buf)
159{
160 /* First we have to enable the probe mux */
161 ql_write_mpi_reg(qdev, MPI_TEST_FUNC_PRB_CTL, MPI_TEST_FUNC_PRB_EN);
162 buf = ql_get_probe(qdev, PRB_MX_ADDR_SYS_CLOCK,
163 PRB_MX_ADDR_VALID_SYS_MOD, buf);
164 buf = ql_get_probe(qdev, PRB_MX_ADDR_PCI_CLOCK,
165 PRB_MX_ADDR_VALID_PCI_MOD, buf);
166 buf = ql_get_probe(qdev, PRB_MX_ADDR_XGM_CLOCK,
167 PRB_MX_ADDR_VALID_XGM_MOD, buf);
168 buf = ql_get_probe(qdev, PRB_MX_ADDR_FC_CLOCK,
169 PRB_MX_ADDR_VALID_FC_MOD, buf);
170 return 0;
171
172}
Ron Mercer8aae2602010-01-15 13:31:28 +0000173
174/* Read out the routing index registers */
175static int ql_get_routing_index_registers(struct ql_adapter *qdev, u32 *buf)
176{
177 int status;
178 u32 type, index, index_max;
179 u32 result_index;
180 u32 result_data;
181 u32 val;
182
183 status = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
184 if (status)
185 return status;
186
187 for (type = 0; type < 4; type++) {
188 if (type < 2)
189 index_max = 8;
190 else
191 index_max = 16;
192 for (index = 0; index < index_max; index++) {
193 val = RT_IDX_RS
194 | (type << RT_IDX_TYPE_SHIFT)
195 | (index << RT_IDX_IDX_SHIFT);
196 ql_write32(qdev, RT_IDX, val);
197 result_index = 0;
198 while ((result_index & RT_IDX_MR) == 0)
199 result_index = ql_read32(qdev, RT_IDX);
200 result_data = ql_read32(qdev, RT_DATA);
201 *buf = type;
202 buf++;
203 *buf = index;
204 buf++;
205 *buf = result_index;
206 buf++;
207 *buf = result_data;
208 buf++;
209 }
210 }
211 ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
212 return status;
213}
214
215/* Read out the MAC protocol registers */
216static void ql_get_mac_protocol_registers(struct ql_adapter *qdev, u32 *buf)
217{
218 u32 result_index, result_data;
219 u32 type;
220 u32 index;
221 u32 offset;
222 u32 val;
223 u32 initial_val = MAC_ADDR_RS;
224 u32 max_index;
225 u32 max_offset;
226
227 for (type = 0; type < MAC_ADDR_TYPE_COUNT; type++) {
228 switch (type) {
229
230 case 0: /* CAM */
231 initial_val |= MAC_ADDR_ADR;
232 max_index = MAC_ADDR_MAX_CAM_ENTRIES;
233 max_offset = MAC_ADDR_MAX_CAM_WCOUNT;
234 break;
235 case 1: /* Multicast MAC Address */
236 max_index = MAC_ADDR_MAX_CAM_WCOUNT;
237 max_offset = MAC_ADDR_MAX_CAM_WCOUNT;
238 break;
239 case 2: /* VLAN filter mask */
240 case 3: /* MC filter mask */
241 max_index = MAC_ADDR_MAX_CAM_WCOUNT;
242 max_offset = MAC_ADDR_MAX_CAM_WCOUNT;
243 break;
244 case 4: /* FC MAC addresses */
245 max_index = MAC_ADDR_MAX_FC_MAC_ENTRIES;
246 max_offset = MAC_ADDR_MAX_FC_MAC_WCOUNT;
247 break;
248 case 5: /* Mgmt MAC addresses */
249 max_index = MAC_ADDR_MAX_MGMT_MAC_ENTRIES;
250 max_offset = MAC_ADDR_MAX_MGMT_MAC_WCOUNT;
251 break;
252 case 6: /* Mgmt VLAN addresses */
253 max_index = MAC_ADDR_MAX_MGMT_VLAN_ENTRIES;
254 max_offset = MAC_ADDR_MAX_MGMT_VLAN_WCOUNT;
255 break;
256 case 7: /* Mgmt IPv4 address */
257 max_index = MAC_ADDR_MAX_MGMT_V4_ENTRIES;
258 max_offset = MAC_ADDR_MAX_MGMT_V4_WCOUNT;
259 break;
260 case 8: /* Mgmt IPv6 address */
261 max_index = MAC_ADDR_MAX_MGMT_V6_ENTRIES;
262 max_offset = MAC_ADDR_MAX_MGMT_V6_WCOUNT;
263 break;
264 case 9: /* Mgmt TCP/UDP Dest port */
265 max_index = MAC_ADDR_MAX_MGMT_TU_DP_ENTRIES;
266 max_offset = MAC_ADDR_MAX_MGMT_TU_DP_WCOUNT;
267 break;
268 default:
269 printk(KERN_ERR"Bad type!!! 0x%08x\n", type);
270 max_index = 0;
271 max_offset = 0;
272 break;
273 }
274 for (index = 0; index < max_index; index++) {
275 for (offset = 0; offset < max_offset; offset++) {
276 val = initial_val
277 | (type << MAC_ADDR_TYPE_SHIFT)
278 | (index << MAC_ADDR_IDX_SHIFT)
279 | (offset);
280 ql_write32(qdev, MAC_ADDR_IDX, val);
281 result_index = 0;
282 while ((result_index & MAC_ADDR_MR) == 0) {
283 result_index = ql_read32(qdev,
284 MAC_ADDR_IDX);
285 }
286 result_data = ql_read32(qdev, MAC_ADDR_DATA);
287 *buf = result_index;
288 buf++;
289 *buf = result_data;
290 buf++;
291 }
292 }
293 }
294}
295
296static void ql_get_sem_registers(struct ql_adapter *qdev, u32 *buf)
297{
298 u32 func_num, reg, reg_val;
299 int status;
300
301 for (func_num = 0; func_num < MAX_SEMAPHORE_FUNCTIONS ; func_num++) {
302 reg = MPI_NIC_REG_BLOCK
303 | (func_num << MPI_NIC_FUNCTION_SHIFT)
304 | (SEM / 4);
305 status = ql_read_mpi_reg(qdev, reg, &reg_val);
306 *buf = reg_val;
307 /* if the read failed then dead fill the element. */
308 if (!status)
309 *buf = 0xdeadbeef;
310 buf++;
311 }
312}
313
Ron Mercera61f8022009-10-21 11:07:41 +0000314/* Create a coredump segment header */
315static void ql_build_coredump_seg_header(
316 struct mpi_coredump_segment_header *seg_hdr,
317 u32 seg_number, u32 seg_size, u8 *desc)
318{
319 memset(seg_hdr, 0, sizeof(struct mpi_coredump_segment_header));
320 seg_hdr->cookie = MPI_COREDUMP_COOKIE;
321 seg_hdr->segNum = seg_number;
322 seg_hdr->segSize = seg_size;
323 memcpy(seg_hdr->description, desc, (sizeof(seg_hdr->description)) - 1);
324}
325
Ron Mercer8aae2602010-01-15 13:31:28 +0000326/*
327 * This function should be called when a coredump / probedump
328 * is to be extracted from the HBA. It is assumed there is a
329 * qdev structure that contains the base address of the register
330 * space for this function as well as a coredump structure that
331 * will contain the dump.
332 */
333int ql_core_dump(struct ql_adapter *qdev, struct ql_mpi_coredump *mpi_coredump)
334{
335 int status;
336 int i;
337
338 if (!mpi_coredump) {
339 QPRINTK(qdev, DRV, ERR,
340 "No memory available.\n");
341 return -ENOMEM;
342 }
343
344 /* Try to get the spinlock, but dont worry if
345 * it isn't available. If the firmware died it
346 * might be holding the sem.
347 */
348 ql_sem_spinlock(qdev, SEM_PROC_REG_MASK);
349
350 status = ql_pause_mpi_risc(qdev);
351 if (status) {
352 QPRINTK(qdev, DRV, ERR,
353 "Failed RISC pause. Status = 0x%.08x\n", status);
354 goto err;
355 }
356
357 /* Insert the global header */
358 memset(&(mpi_coredump->mpi_global_header), 0,
359 sizeof(struct mpi_coredump_global_header));
360 mpi_coredump->mpi_global_header.cookie = MPI_COREDUMP_COOKIE;
361 mpi_coredump->mpi_global_header.headerSize =
362 sizeof(struct mpi_coredump_global_header);
363 mpi_coredump->mpi_global_header.imageSize =
364 sizeof(struct ql_mpi_coredump);
365 memcpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
366 sizeof(mpi_coredump->mpi_global_header.idString));
367
368 /* Get generic NIC reg dump */
369 ql_build_coredump_seg_header(&mpi_coredump->nic_regs_seg_hdr,
370 NIC1_CONTROL_SEG_NUM,
371 sizeof(struct mpi_coredump_segment_header) +
372 sizeof(mpi_coredump->nic_regs), "NIC1 Registers");
373
374 if (qdev->func & 1) {
375 /* Odd means our function is NIC 2 */
376 for (i = 0; i < NIC_REGS_DUMP_WORD_COUNT; i++)
377 mpi_coredump->nic2_regs[i] =
378 ql_read32(qdev, i * sizeof(u32));
379 } else {
380 /* Even means our function is NIC 1 */
381 for (i = 0; i < NIC_REGS_DUMP_WORD_COUNT; i++)
382 mpi_coredump->nic_regs[i] =
383 ql_read32(qdev, i * sizeof(u32));
384 }
385
386 ql_build_coredump_seg_header(&mpi_coredump->core_regs_seg_hdr,
387 CORE_SEG_NUM,
388 sizeof(mpi_coredump->core_regs_seg_hdr) +
389 sizeof(mpi_coredump->mpi_core_regs) +
390 sizeof(mpi_coredump->mpi_core_sh_regs),
391 "Core Registers");
392
393 /* Get the MPI Core Registers */
394 status = ql_get_mpi_regs(qdev, &mpi_coredump->mpi_core_regs[0],
395 MPI_CORE_REGS_ADDR, MPI_CORE_REGS_CNT);
396 if (status)
397 goto err;
398 /* Get the 16 MPI shadow registers */
399 status = ql_get_mpi_shadow_regs(qdev,
400 &mpi_coredump->mpi_core_sh_regs[0]);
401 if (status)
402 goto err;
403
404 /* Get the Test Logic Registers */
405 ql_build_coredump_seg_header(&mpi_coredump->test_logic_regs_seg_hdr,
406 TEST_LOGIC_SEG_NUM,
407 sizeof(struct mpi_coredump_segment_header)
408 + sizeof(mpi_coredump->test_logic_regs),
409 "Test Logic Regs");
410 status = ql_get_mpi_regs(qdev, &mpi_coredump->test_logic_regs[0],
411 TEST_REGS_ADDR, TEST_REGS_CNT);
412 if (status)
413 goto err;
414
415 /* Get the RMII Registers */
416 ql_build_coredump_seg_header(&mpi_coredump->rmii_regs_seg_hdr,
417 RMII_SEG_NUM,
418 sizeof(struct mpi_coredump_segment_header)
419 + sizeof(mpi_coredump->rmii_regs),
420 "RMII Registers");
421 status = ql_get_mpi_regs(qdev, &mpi_coredump->rmii_regs[0],
422 RMII_REGS_ADDR, RMII_REGS_CNT);
423 if (status)
424 goto err;
425
426 /* Get the FCMAC1 Registers */
427 ql_build_coredump_seg_header(&mpi_coredump->fcmac1_regs_seg_hdr,
428 FCMAC1_SEG_NUM,
429 sizeof(struct mpi_coredump_segment_header)
430 + sizeof(mpi_coredump->fcmac1_regs),
431 "FCMAC1 Registers");
432 status = ql_get_mpi_regs(qdev, &mpi_coredump->fcmac1_regs[0],
433 FCMAC1_REGS_ADDR, FCMAC_REGS_CNT);
434 if (status)
435 goto err;
436
437 /* Get the FCMAC2 Registers */
438
439 ql_build_coredump_seg_header(&mpi_coredump->fcmac2_regs_seg_hdr,
440 FCMAC2_SEG_NUM,
441 sizeof(struct mpi_coredump_segment_header)
442 + sizeof(mpi_coredump->fcmac2_regs),
443 "FCMAC2 Registers");
444
445 status = ql_get_mpi_regs(qdev, &mpi_coredump->fcmac2_regs[0],
446 FCMAC2_REGS_ADDR, FCMAC_REGS_CNT);
447 if (status)
448 goto err;
449
450 /* Get the FC1 MBX Registers */
451 ql_build_coredump_seg_header(&mpi_coredump->fc1_mbx_regs_seg_hdr,
452 FC1_MBOX_SEG_NUM,
453 sizeof(struct mpi_coredump_segment_header)
454 + sizeof(mpi_coredump->fc1_mbx_regs),
455 "FC1 MBox Regs");
456 status = ql_get_mpi_regs(qdev, &mpi_coredump->fc1_mbx_regs[0],
457 FC1_MBX_REGS_ADDR, FC_MBX_REGS_CNT);
458 if (status)
459 goto err;
460
461 /* Get the IDE Registers */
462 ql_build_coredump_seg_header(&mpi_coredump->ide_regs_seg_hdr,
463 IDE_SEG_NUM,
464 sizeof(struct mpi_coredump_segment_header)
465 + sizeof(mpi_coredump->ide_regs),
466 "IDE Registers");
467 status = ql_get_mpi_regs(qdev, &mpi_coredump->ide_regs[0],
468 IDE_REGS_ADDR, IDE_REGS_CNT);
469 if (status)
470 goto err;
471
472 /* Get the NIC1 MBX Registers */
473 ql_build_coredump_seg_header(&mpi_coredump->nic1_mbx_regs_seg_hdr,
474 NIC1_MBOX_SEG_NUM,
475 sizeof(struct mpi_coredump_segment_header)
476 + sizeof(mpi_coredump->nic1_mbx_regs),
477 "NIC1 MBox Regs");
478 status = ql_get_mpi_regs(qdev, &mpi_coredump->nic1_mbx_regs[0],
479 NIC1_MBX_REGS_ADDR, NIC_MBX_REGS_CNT);
480 if (status)
481 goto err;
482
483 /* Get the SMBus Registers */
484 ql_build_coredump_seg_header(&mpi_coredump->smbus_regs_seg_hdr,
485 SMBUS_SEG_NUM,
486 sizeof(struct mpi_coredump_segment_header)
487 + sizeof(mpi_coredump->smbus_regs),
488 "SMBus Registers");
489 status = ql_get_mpi_regs(qdev, &mpi_coredump->smbus_regs[0],
490 SMBUS_REGS_ADDR, SMBUS_REGS_CNT);
491 if (status)
492 goto err;
493
494 /* Get the FC2 MBX Registers */
495 ql_build_coredump_seg_header(&mpi_coredump->fc2_mbx_regs_seg_hdr,
496 FC2_MBOX_SEG_NUM,
497 sizeof(struct mpi_coredump_segment_header)
498 + sizeof(mpi_coredump->fc2_mbx_regs),
499 "FC2 MBox Regs");
500 status = ql_get_mpi_regs(qdev, &mpi_coredump->fc2_mbx_regs[0],
501 FC2_MBX_REGS_ADDR, FC_MBX_REGS_CNT);
502 if (status)
503 goto err;
504
505 /* Get the NIC2 MBX Registers */
506 ql_build_coredump_seg_header(&mpi_coredump->nic2_mbx_regs_seg_hdr,
507 NIC2_MBOX_SEG_NUM,
508 sizeof(struct mpi_coredump_segment_header)
509 + sizeof(mpi_coredump->nic2_mbx_regs),
510 "NIC2 MBox Regs");
511 status = ql_get_mpi_regs(qdev, &mpi_coredump->nic2_mbx_regs[0],
512 NIC2_MBX_REGS_ADDR, NIC_MBX_REGS_CNT);
513 if (status)
514 goto err;
515
516 /* Get the I2C Registers */
517 ql_build_coredump_seg_header(&mpi_coredump->i2c_regs_seg_hdr,
518 I2C_SEG_NUM,
519 sizeof(struct mpi_coredump_segment_header)
520 + sizeof(mpi_coredump->i2c_regs),
521 "I2C Registers");
522 status = ql_get_mpi_regs(qdev, &mpi_coredump->i2c_regs[0],
523 I2C_REGS_ADDR, I2C_REGS_CNT);
524 if (status)
525 goto err;
526
527 /* Get the MEMC Registers */
528 ql_build_coredump_seg_header(&mpi_coredump->memc_regs_seg_hdr,
529 MEMC_SEG_NUM,
530 sizeof(struct mpi_coredump_segment_header)
531 + sizeof(mpi_coredump->memc_regs),
532 "MEMC Registers");
533 status = ql_get_mpi_regs(qdev, &mpi_coredump->memc_regs[0],
534 MEMC_REGS_ADDR, MEMC_REGS_CNT);
535 if (status)
536 goto err;
537
538 /* Get the PBus Registers */
539 ql_build_coredump_seg_header(&mpi_coredump->pbus_regs_seg_hdr,
540 PBUS_SEG_NUM,
541 sizeof(struct mpi_coredump_segment_header)
542 + sizeof(mpi_coredump->pbus_regs),
543 "PBUS Registers");
544 status = ql_get_mpi_regs(qdev, &mpi_coredump->pbus_regs[0],
545 PBUS_REGS_ADDR, PBUS_REGS_CNT);
546 if (status)
547 goto err;
548
549 /* Get the MDE Registers */
550 ql_build_coredump_seg_header(&mpi_coredump->mde_regs_seg_hdr,
551 MDE_SEG_NUM,
552 sizeof(struct mpi_coredump_segment_header)
553 + sizeof(mpi_coredump->mde_regs),
554 "MDE Registers");
555 status = ql_get_mpi_regs(qdev, &mpi_coredump->mde_regs[0],
556 MDE_REGS_ADDR, MDE_REGS_CNT);
557 if (status)
558 goto err;
559
560 ql_build_coredump_seg_header(&mpi_coredump->misc_nic_seg_hdr,
561 MISC_NIC_INFO_SEG_NUM,
562 sizeof(struct mpi_coredump_segment_header)
563 + sizeof(mpi_coredump->misc_nic_info),
564 "MISC NIC INFO");
565 mpi_coredump->misc_nic_info.rx_ring_count = qdev->rx_ring_count;
566 mpi_coredump->misc_nic_info.tx_ring_count = qdev->tx_ring_count;
567 mpi_coredump->misc_nic_info.intr_count = qdev->intr_count;
568 mpi_coredump->misc_nic_info.function = qdev->func;
569
570 /* Segment 31 */
571 /* Get indexed register values. */
572 ql_build_coredump_seg_header(&mpi_coredump->intr_states_seg_hdr,
573 INTR_STATES_SEG_NUM,
574 sizeof(struct mpi_coredump_segment_header)
575 + sizeof(mpi_coredump->intr_states),
576 "INTR States");
577 ql_get_intr_states(qdev, &mpi_coredump->intr_states[0]);
578
579 ql_build_coredump_seg_header(&mpi_coredump->cam_entries_seg_hdr,
580 CAM_ENTRIES_SEG_NUM,
581 sizeof(struct mpi_coredump_segment_header)
582 + sizeof(mpi_coredump->cam_entries),
583 "CAM Entries");
584 status = ql_get_cam_entries(qdev, &mpi_coredump->cam_entries[0]);
585 if (status)
586 goto err;
587
588 ql_build_coredump_seg_header(&mpi_coredump->nic_routing_words_seg_hdr,
589 ROUTING_WORDS_SEG_NUM,
590 sizeof(struct mpi_coredump_segment_header)
591 + sizeof(mpi_coredump->nic_routing_words),
592 "Routing Words");
593 status = ql_get_routing_entries(qdev,
594 &mpi_coredump->nic_routing_words[0]);
595 if (status)
596 goto err;
597
598 /* Segment 34 (Rev C. step 23) */
599 ql_build_coredump_seg_header(&mpi_coredump->ets_seg_hdr,
600 ETS_SEG_NUM,
601 sizeof(struct mpi_coredump_segment_header)
602 + sizeof(mpi_coredump->ets),
603 "ETS Registers");
604 status = ql_get_ets_regs(qdev, &mpi_coredump->ets[0]);
605 if (status)
606 goto err;
607
Ron Mercerc89ec8b2010-01-15 13:31:29 +0000608 ql_build_coredump_seg_header(&mpi_coredump->probe_dump_seg_hdr,
609 PROBE_DUMP_SEG_NUM,
610 sizeof(struct mpi_coredump_segment_header)
611 + sizeof(mpi_coredump->probe_dump),
612 "Probe Dump");
613 ql_get_probe_dump(qdev, &mpi_coredump->probe_dump[0]);
614
Ron Mercer8aae2602010-01-15 13:31:28 +0000615 ql_build_coredump_seg_header(&mpi_coredump->routing_reg_seg_hdr,
616 ROUTING_INDEX_SEG_NUM,
617 sizeof(struct mpi_coredump_segment_header)
618 + sizeof(mpi_coredump->routing_regs),
619 "Routing Regs");
620 status = ql_get_routing_index_registers(qdev,
621 &mpi_coredump->routing_regs[0]);
622 if (status)
623 goto err;
624
625 ql_build_coredump_seg_header(&mpi_coredump->mac_prot_reg_seg_hdr,
626 MAC_PROTOCOL_SEG_NUM,
627 sizeof(struct mpi_coredump_segment_header)
628 + sizeof(mpi_coredump->mac_prot_regs),
629 "MAC Prot Regs");
630 ql_get_mac_protocol_registers(qdev, &mpi_coredump->mac_prot_regs[0]);
631
632 /* Get the semaphore registers for all 5 functions */
633 ql_build_coredump_seg_header(&mpi_coredump->sem_regs_seg_hdr,
634 SEM_REGS_SEG_NUM,
635 sizeof(struct mpi_coredump_segment_header) +
636 sizeof(mpi_coredump->sem_regs), "Sem Registers");
637
638 ql_get_sem_registers(qdev, &mpi_coredump->sem_regs[0]);
639
640 /* Prevent the mpi restarting while we dump the memory.*/
641 ql_write_mpi_reg(qdev, MPI_TEST_FUNC_RST_STS, MPI_TEST_FUNC_RST_FRC);
642
643 /* clear the pause */
644 status = ql_unpause_mpi_risc(qdev);
645 if (status) {
646 QPRINTK(qdev, DRV, ERR,
647 "Failed RISC unpause. Status = 0x%.08x\n", status);
648 goto err;
649 }
Ron Mercer2c1f73c2010-01-15 13:31:30 +0000650
651 /* Reset the RISC so we can dump RAM */
652 status = ql_hard_reset_mpi_risc(qdev);
653 if (status) {
654 QPRINTK(qdev, DRV, ERR,
655 "Failed RISC reset. Status = 0x%.08x\n", status);
656 goto err;
657 }
658
659 ql_build_coredump_seg_header(&mpi_coredump->code_ram_seg_hdr,
660 WCS_RAM_SEG_NUM,
661 sizeof(struct mpi_coredump_segment_header)
662 + sizeof(mpi_coredump->code_ram),
663 "WCS RAM");
664 status = ql_dump_risc_ram_area(qdev, &mpi_coredump->code_ram[0],
665 CODE_RAM_ADDR, CODE_RAM_CNT);
666 if (status) {
667 QPRINTK(qdev, DRV, ERR,
668 "Failed Dump of CODE RAM. Status = 0x%.08x\n", status);
669 goto err;
670 }
671
672 /* Insert the segment header */
673 ql_build_coredump_seg_header(&mpi_coredump->memc_ram_seg_hdr,
674 MEMC_RAM_SEG_NUM,
675 sizeof(struct mpi_coredump_segment_header)
676 + sizeof(mpi_coredump->memc_ram),
677 "MEMC RAM");
678 status = ql_dump_risc_ram_area(qdev, &mpi_coredump->memc_ram[0],
679 MEMC_RAM_ADDR, MEMC_RAM_CNT);
680 if (status) {
681 QPRINTK(qdev, DRV, ERR,
682 "Failed Dump of MEMC RAM. Status = 0x%.08x\n", status);
683 goto err;
684 }
Ron Mercer8aae2602010-01-15 13:31:28 +0000685err:
686 ql_sem_unlock(qdev, SEM_PROC_REG_MASK); /* does flush too */
687 return status;
688
689}
690
Ron Mercera61f8022009-10-21 11:07:41 +0000691void ql_gen_reg_dump(struct ql_adapter *qdev,
692 struct ql_reg_dump *mpi_coredump)
693{
694 int i, status;
695
696
697 memset(&(mpi_coredump->mpi_global_header), 0,
698 sizeof(struct mpi_coredump_global_header));
699 mpi_coredump->mpi_global_header.cookie = MPI_COREDUMP_COOKIE;
700 mpi_coredump->mpi_global_header.headerSize =
701 sizeof(struct mpi_coredump_global_header);
702 mpi_coredump->mpi_global_header.imageSize =
703 sizeof(struct ql_reg_dump);
704 memcpy(mpi_coredump->mpi_global_header.idString, "MPI Coredump",
705 sizeof(mpi_coredump->mpi_global_header.idString));
706
707
708 /* segment 16 */
709 ql_build_coredump_seg_header(&mpi_coredump->misc_nic_seg_hdr,
710 MISC_NIC_INFO_SEG_NUM,
711 sizeof(struct mpi_coredump_segment_header)
712 + sizeof(mpi_coredump->misc_nic_info),
713 "MISC NIC INFO");
714 mpi_coredump->misc_nic_info.rx_ring_count = qdev->rx_ring_count;
715 mpi_coredump->misc_nic_info.tx_ring_count = qdev->tx_ring_count;
716 mpi_coredump->misc_nic_info.intr_count = qdev->intr_count;
717 mpi_coredump->misc_nic_info.function = qdev->func;
718
719 /* Segment 16, Rev C. Step 18 */
720 ql_build_coredump_seg_header(&mpi_coredump->nic_regs_seg_hdr,
721 NIC1_CONTROL_SEG_NUM,
722 sizeof(struct mpi_coredump_segment_header)
723 + sizeof(mpi_coredump->nic_regs),
724 "NIC Registers");
725 /* Get generic reg dump */
726 for (i = 0; i < 64; i++)
727 mpi_coredump->nic_regs[i] = ql_read32(qdev, i * sizeof(u32));
728
729 /* Segment 31 */
730 /* Get indexed register values. */
731 ql_build_coredump_seg_header(&mpi_coredump->intr_states_seg_hdr,
732 INTR_STATES_SEG_NUM,
733 sizeof(struct mpi_coredump_segment_header)
734 + sizeof(mpi_coredump->intr_states),
735 "INTR States");
736 ql_get_intr_states(qdev, &mpi_coredump->intr_states[0]);
737
738 ql_build_coredump_seg_header(&mpi_coredump->cam_entries_seg_hdr,
739 CAM_ENTRIES_SEG_NUM,
740 sizeof(struct mpi_coredump_segment_header)
741 + sizeof(mpi_coredump->cam_entries),
742 "CAM Entries");
743 status = ql_get_cam_entries(qdev, &mpi_coredump->cam_entries[0]);
744 if (status)
745 return;
746
747 ql_build_coredump_seg_header(&mpi_coredump->nic_routing_words_seg_hdr,
748 ROUTING_WORDS_SEG_NUM,
749 sizeof(struct mpi_coredump_segment_header)
750 + sizeof(mpi_coredump->nic_routing_words),
751 "Routing Words");
752 status = ql_get_routing_entries(qdev,
753 &mpi_coredump->nic_routing_words[0]);
754 if (status)
755 return;
756
757 /* Segment 34 (Rev C. step 23) */
758 ql_build_coredump_seg_header(&mpi_coredump->ets_seg_hdr,
759 ETS_SEG_NUM,
760 sizeof(struct mpi_coredump_segment_header)
761 + sizeof(mpi_coredump->ets),
762 "ETS Registers");
763 status = ql_get_ets_regs(qdev, &mpi_coredump->ets[0]);
764 if (status)
765 return;
766}
767
Ron Mercer8aae2602010-01-15 13:31:28 +0000768/* Coredump to messages log file using separate worker thread */
769void ql_mpi_core_to_log(struct work_struct *work)
770{
771 struct ql_adapter *qdev =
772 container_of(work, struct ql_adapter, mpi_core_to_log.work);
773 u32 *tmp, count;
774 int i;
775
776 count = sizeof(struct ql_mpi_coredump) / sizeof(u32);
777 tmp = (u32 *)qdev->mpi_coredump;
778 QPRINTK(qdev, DRV, DEBUG, "Core is dumping to log file!\n");
779
780 for (i = 0; i < count; i += 8) {
781 printk(KERN_ERR "%.08x: %.08x %.08x %.08x %.08x %.08x "
782 "%.08x %.08x %.08x \n", i,
783 tmp[i + 0],
784 tmp[i + 1],
785 tmp[i + 2],
786 tmp[i + 3],
787 tmp[i + 4],
788 tmp[i + 5],
789 tmp[i + 6],
790 tmp[i + 7]);
791 msleep(5);
792 }
793}
794
Ron Mercerc4e84bd2008-09-18 11:56:28 -0400795#ifdef QL_REG_DUMP
796static void ql_dump_intr_states(struct ql_adapter *qdev)
797{
798 int i;
799 u32 value;
800 for (i = 0; i < qdev->intr_count; i++) {
801 ql_write32(qdev, INTR_EN, qdev->intr_context[i].intr_read_mask);
802 value = ql_read32(qdev, INTR_EN);
803 printk(KERN_ERR PFX
804 "%s: Interrupt %d is %s.\n",
805 qdev->ndev->name, i,
806 (value & INTR_EN_EN ? "enabled" : "disabled"));
807 }
808}
809
810void ql_dump_xgmac_control_regs(struct ql_adapter *qdev)
811{
812 u32 data;
813 if (ql_sem_spinlock(qdev, qdev->xg_sem_mask)) {
814 printk(KERN_ERR "%s: Couldn't get xgmac sem.\n", __func__);
815 return;
816 }
817 ql_read_xgmac_reg(qdev, PAUSE_SRC_LO, &data);
818 printk(KERN_ERR PFX "%s: PAUSE_SRC_LO = 0x%.08x.\n", qdev->ndev->name,
819 data);
820 ql_read_xgmac_reg(qdev, PAUSE_SRC_HI, &data);
821 printk(KERN_ERR PFX "%s: PAUSE_SRC_HI = 0x%.08x.\n", qdev->ndev->name,
822 data);
823 ql_read_xgmac_reg(qdev, GLOBAL_CFG, &data);
824 printk(KERN_ERR PFX "%s: GLOBAL_CFG = 0x%.08x.\n", qdev->ndev->name,
825 data);
826 ql_read_xgmac_reg(qdev, TX_CFG, &data);
827 printk(KERN_ERR PFX "%s: TX_CFG = 0x%.08x.\n", qdev->ndev->name, data);
828 ql_read_xgmac_reg(qdev, RX_CFG, &data);
829 printk(KERN_ERR PFX "%s: RX_CFG = 0x%.08x.\n", qdev->ndev->name, data);
830 ql_read_xgmac_reg(qdev, FLOW_CTL, &data);
831 printk(KERN_ERR PFX "%s: FLOW_CTL = 0x%.08x.\n", qdev->ndev->name,
832 data);
833 ql_read_xgmac_reg(qdev, PAUSE_OPCODE, &data);
834 printk(KERN_ERR PFX "%s: PAUSE_OPCODE = 0x%.08x.\n", qdev->ndev->name,
835 data);
836 ql_read_xgmac_reg(qdev, PAUSE_TIMER, &data);
837 printk(KERN_ERR PFX "%s: PAUSE_TIMER = 0x%.08x.\n", qdev->ndev->name,
838 data);
839 ql_read_xgmac_reg(qdev, PAUSE_FRM_DEST_LO, &data);
840 printk(KERN_ERR PFX "%s: PAUSE_FRM_DEST_LO = 0x%.08x.\n",
841 qdev->ndev->name, data);
842 ql_read_xgmac_reg(qdev, PAUSE_FRM_DEST_HI, &data);
843 printk(KERN_ERR PFX "%s: PAUSE_FRM_DEST_HI = 0x%.08x.\n",
844 qdev->ndev->name, data);
845 ql_read_xgmac_reg(qdev, MAC_TX_PARAMS, &data);
846 printk(KERN_ERR PFX "%s: MAC_TX_PARAMS = 0x%.08x.\n", qdev->ndev->name,
847 data);
848 ql_read_xgmac_reg(qdev, MAC_RX_PARAMS, &data);
849 printk(KERN_ERR PFX "%s: MAC_RX_PARAMS = 0x%.08x.\n", qdev->ndev->name,
850 data);
851 ql_read_xgmac_reg(qdev, MAC_SYS_INT, &data);
852 printk(KERN_ERR PFX "%s: MAC_SYS_INT = 0x%.08x.\n", qdev->ndev->name,
853 data);
854 ql_read_xgmac_reg(qdev, MAC_SYS_INT_MASK, &data);
855 printk(KERN_ERR PFX "%s: MAC_SYS_INT_MASK = 0x%.08x.\n",
856 qdev->ndev->name, data);
857 ql_read_xgmac_reg(qdev, MAC_MGMT_INT, &data);
858 printk(KERN_ERR PFX "%s: MAC_MGMT_INT = 0x%.08x.\n", qdev->ndev->name,
859 data);
860 ql_read_xgmac_reg(qdev, MAC_MGMT_IN_MASK, &data);
861 printk(KERN_ERR PFX "%s: MAC_MGMT_IN_MASK = 0x%.08x.\n",
862 qdev->ndev->name, data);
863 ql_read_xgmac_reg(qdev, EXT_ARB_MODE, &data);
864 printk(KERN_ERR PFX "%s: EXT_ARB_MODE = 0x%.08x.\n", qdev->ndev->name,
865 data);
866 ql_sem_unlock(qdev, qdev->xg_sem_mask);
867
868}
869
870static void ql_dump_ets_regs(struct ql_adapter *qdev)
871{
872}
873
874static void ql_dump_cam_entries(struct ql_adapter *qdev)
875{
876 int i;
877 u32 value[3];
Ron Mercercc288f52009-02-23 10:42:14 +0000878
879 i = ql_sem_spinlock(qdev, SEM_MAC_ADDR_MASK);
880 if (i)
881 return;
Ron Mercerc4e84bd2008-09-18 11:56:28 -0400882 for (i = 0; i < 4; i++) {
883 if (ql_get_mac_addr_reg(qdev, MAC_ADDR_TYPE_CAM_MAC, i, value)) {
884 printk(KERN_ERR PFX
885 "%s: Failed read of mac index register.\n",
886 __func__);
887 return;
888 } else {
889 if (value[0])
890 printk(KERN_ERR PFX
891 "%s: CAM index %d CAM Lookup Lower = 0x%.08x:%.08x, Output = 0x%.08x.\n",
892 qdev->ndev->name, i, value[1], value[0],
893 value[2]);
894 }
895 }
896 for (i = 0; i < 32; i++) {
897 if (ql_get_mac_addr_reg
898 (qdev, MAC_ADDR_TYPE_MULTI_MAC, i, value)) {
899 printk(KERN_ERR PFX
900 "%s: Failed read of mac index register.\n",
901 __func__);
902 return;
903 } else {
904 if (value[0])
905 printk(KERN_ERR PFX
906 "%s: MCAST index %d CAM Lookup Lower = 0x%.08x:%.08x.\n",
907 qdev->ndev->name, i, value[1], value[0]);
908 }
909 }
Ron Mercercc288f52009-02-23 10:42:14 +0000910 ql_sem_unlock(qdev, SEM_MAC_ADDR_MASK);
Ron Mercerc4e84bd2008-09-18 11:56:28 -0400911}
912
913void ql_dump_routing_entries(struct ql_adapter *qdev)
914{
915 int i;
916 u32 value;
Ron Mercercc288f52009-02-23 10:42:14 +0000917 i = ql_sem_spinlock(qdev, SEM_RT_IDX_MASK);
918 if (i)
919 return;
Ron Mercerc4e84bd2008-09-18 11:56:28 -0400920 for (i = 0; i < 16; i++) {
921 value = 0;
922 if (ql_get_routing_reg(qdev, i, &value)) {
923 printk(KERN_ERR PFX
924 "%s: Failed read of routing index register.\n",
925 __func__);
926 return;
927 } else {
928 if (value)
929 printk(KERN_ERR PFX
930 "%s: Routing Mask %d = 0x%.08x.\n",
931 qdev->ndev->name, i, value);
932 }
933 }
Ron Mercercc288f52009-02-23 10:42:14 +0000934 ql_sem_unlock(qdev, SEM_RT_IDX_MASK);
Ron Mercerc4e84bd2008-09-18 11:56:28 -0400935}
936
937void ql_dump_regs(struct ql_adapter *qdev)
938{
939 printk(KERN_ERR PFX "reg dump for function #%d.\n", qdev->func);
940 printk(KERN_ERR PFX "SYS = 0x%x.\n",
941 ql_read32(qdev, SYS));
942 printk(KERN_ERR PFX "RST_FO = 0x%x.\n",
943 ql_read32(qdev, RST_FO));
944 printk(KERN_ERR PFX "FSC = 0x%x.\n",
945 ql_read32(qdev, FSC));
946 printk(KERN_ERR PFX "CSR = 0x%x.\n",
947 ql_read32(qdev, CSR));
948 printk(KERN_ERR PFX "ICB_RID = 0x%x.\n",
949 ql_read32(qdev, ICB_RID));
950 printk(KERN_ERR PFX "ICB_L = 0x%x.\n",
951 ql_read32(qdev, ICB_L));
952 printk(KERN_ERR PFX "ICB_H = 0x%x.\n",
953 ql_read32(qdev, ICB_H));
954 printk(KERN_ERR PFX "CFG = 0x%x.\n",
955 ql_read32(qdev, CFG));
956 printk(KERN_ERR PFX "BIOS_ADDR = 0x%x.\n",
957 ql_read32(qdev, BIOS_ADDR));
958 printk(KERN_ERR PFX "STS = 0x%x.\n",
959 ql_read32(qdev, STS));
960 printk(KERN_ERR PFX "INTR_EN = 0x%x.\n",
961 ql_read32(qdev, INTR_EN));
962 printk(KERN_ERR PFX "INTR_MASK = 0x%x.\n",
963 ql_read32(qdev, INTR_MASK));
964 printk(KERN_ERR PFX "ISR1 = 0x%x.\n",
965 ql_read32(qdev, ISR1));
966 printk(KERN_ERR PFX "ISR2 = 0x%x.\n",
967 ql_read32(qdev, ISR2));
968 printk(KERN_ERR PFX "ISR3 = 0x%x.\n",
969 ql_read32(qdev, ISR3));
970 printk(KERN_ERR PFX "ISR4 = 0x%x.\n",
971 ql_read32(qdev, ISR4));
972 printk(KERN_ERR PFX "REV_ID = 0x%x.\n",
973 ql_read32(qdev, REV_ID));
974 printk(KERN_ERR PFX "FRC_ECC_ERR = 0x%x.\n",
975 ql_read32(qdev, FRC_ECC_ERR));
976 printk(KERN_ERR PFX "ERR_STS = 0x%x.\n",
977 ql_read32(qdev, ERR_STS));
978 printk(KERN_ERR PFX "RAM_DBG_ADDR = 0x%x.\n",
979 ql_read32(qdev, RAM_DBG_ADDR));
980 printk(KERN_ERR PFX "RAM_DBG_DATA = 0x%x.\n",
981 ql_read32(qdev, RAM_DBG_DATA));
982 printk(KERN_ERR PFX "ECC_ERR_CNT = 0x%x.\n",
983 ql_read32(qdev, ECC_ERR_CNT));
984 printk(KERN_ERR PFX "SEM = 0x%x.\n",
985 ql_read32(qdev, SEM));
986 printk(KERN_ERR PFX "GPIO_1 = 0x%x.\n",
987 ql_read32(qdev, GPIO_1));
988 printk(KERN_ERR PFX "GPIO_2 = 0x%x.\n",
989 ql_read32(qdev, GPIO_2));
990 printk(KERN_ERR PFX "GPIO_3 = 0x%x.\n",
991 ql_read32(qdev, GPIO_3));
992 printk(KERN_ERR PFX "XGMAC_ADDR = 0x%x.\n",
993 ql_read32(qdev, XGMAC_ADDR));
994 printk(KERN_ERR PFX "XGMAC_DATA = 0x%x.\n",
995 ql_read32(qdev, XGMAC_DATA));
996 printk(KERN_ERR PFX "NIC_ETS = 0x%x.\n",
997 ql_read32(qdev, NIC_ETS));
998 printk(KERN_ERR PFX "CNA_ETS = 0x%x.\n",
999 ql_read32(qdev, CNA_ETS));
1000 printk(KERN_ERR PFX "FLASH_ADDR = 0x%x.\n",
1001 ql_read32(qdev, FLASH_ADDR));
1002 printk(KERN_ERR PFX "FLASH_DATA = 0x%x.\n",
1003 ql_read32(qdev, FLASH_DATA));
1004 printk(KERN_ERR PFX "CQ_STOP = 0x%x.\n",
1005 ql_read32(qdev, CQ_STOP));
1006 printk(KERN_ERR PFX "PAGE_TBL_RID = 0x%x.\n",
1007 ql_read32(qdev, PAGE_TBL_RID));
1008 printk(KERN_ERR PFX "WQ_PAGE_TBL_LO = 0x%x.\n",
1009 ql_read32(qdev, WQ_PAGE_TBL_LO));
1010 printk(KERN_ERR PFX "WQ_PAGE_TBL_HI = 0x%x.\n",
1011 ql_read32(qdev, WQ_PAGE_TBL_HI));
1012 printk(KERN_ERR PFX "CQ_PAGE_TBL_LO = 0x%x.\n",
1013 ql_read32(qdev, CQ_PAGE_TBL_LO));
1014 printk(KERN_ERR PFX "CQ_PAGE_TBL_HI = 0x%x.\n",
1015 ql_read32(qdev, CQ_PAGE_TBL_HI));
1016 printk(KERN_ERR PFX "COS_DFLT_CQ1 = 0x%x.\n",
1017 ql_read32(qdev, COS_DFLT_CQ1));
1018 printk(KERN_ERR PFX "COS_DFLT_CQ2 = 0x%x.\n",
1019 ql_read32(qdev, COS_DFLT_CQ2));
1020 printk(KERN_ERR PFX "SPLT_HDR = 0x%x.\n",
1021 ql_read32(qdev, SPLT_HDR));
1022 printk(KERN_ERR PFX "FC_PAUSE_THRES = 0x%x.\n",
1023 ql_read32(qdev, FC_PAUSE_THRES));
1024 printk(KERN_ERR PFX "NIC_PAUSE_THRES = 0x%x.\n",
1025 ql_read32(qdev, NIC_PAUSE_THRES));
1026 printk(KERN_ERR PFX "FC_ETHERTYPE = 0x%x.\n",
1027 ql_read32(qdev, FC_ETHERTYPE));
1028 printk(KERN_ERR PFX "FC_RCV_CFG = 0x%x.\n",
1029 ql_read32(qdev, FC_RCV_CFG));
1030 printk(KERN_ERR PFX "NIC_RCV_CFG = 0x%x.\n",
1031 ql_read32(qdev, NIC_RCV_CFG));
1032 printk(KERN_ERR PFX "FC_COS_TAGS = 0x%x.\n",
1033 ql_read32(qdev, FC_COS_TAGS));
1034 printk(KERN_ERR PFX "NIC_COS_TAGS = 0x%x.\n",
1035 ql_read32(qdev, NIC_COS_TAGS));
1036 printk(KERN_ERR PFX "MGMT_RCV_CFG = 0x%x.\n",
1037 ql_read32(qdev, MGMT_RCV_CFG));
1038 printk(KERN_ERR PFX "XG_SERDES_ADDR = 0x%x.\n",
1039 ql_read32(qdev, XG_SERDES_ADDR));
1040 printk(KERN_ERR PFX "XG_SERDES_DATA = 0x%x.\n",
1041 ql_read32(qdev, XG_SERDES_DATA));
1042 printk(KERN_ERR PFX "PRB_MX_ADDR = 0x%x.\n",
1043 ql_read32(qdev, PRB_MX_ADDR));
1044 printk(KERN_ERR PFX "PRB_MX_DATA = 0x%x.\n",
1045 ql_read32(qdev, PRB_MX_DATA));
1046 ql_dump_intr_states(qdev);
1047 ql_dump_xgmac_control_regs(qdev);
1048 ql_dump_ets_regs(qdev);
1049 ql_dump_cam_entries(qdev);
1050 ql_dump_routing_entries(qdev);
1051}
1052#endif
1053
1054#ifdef QL_STAT_DUMP
1055void ql_dump_stat(struct ql_adapter *qdev)
1056{
1057 printk(KERN_ERR "%s: Enter.\n", __func__);
1058 printk(KERN_ERR "tx_pkts = %ld\n",
1059 (unsigned long)qdev->nic_stats.tx_pkts);
1060 printk(KERN_ERR "tx_bytes = %ld\n",
1061 (unsigned long)qdev->nic_stats.tx_bytes);
1062 printk(KERN_ERR "tx_mcast_pkts = %ld.\n",
1063 (unsigned long)qdev->nic_stats.tx_mcast_pkts);
1064 printk(KERN_ERR "tx_bcast_pkts = %ld.\n",
1065 (unsigned long)qdev->nic_stats.tx_bcast_pkts);
1066 printk(KERN_ERR "tx_ucast_pkts = %ld.\n",
1067 (unsigned long)qdev->nic_stats.tx_ucast_pkts);
1068 printk(KERN_ERR "tx_ctl_pkts = %ld.\n",
1069 (unsigned long)qdev->nic_stats.tx_ctl_pkts);
1070 printk(KERN_ERR "tx_pause_pkts = %ld.\n",
1071 (unsigned long)qdev->nic_stats.tx_pause_pkts);
1072 printk(KERN_ERR "tx_64_pkt = %ld.\n",
1073 (unsigned long)qdev->nic_stats.tx_64_pkt);
1074 printk(KERN_ERR "tx_65_to_127_pkt = %ld.\n",
1075 (unsigned long)qdev->nic_stats.tx_65_to_127_pkt);
1076 printk(KERN_ERR "tx_128_to_255_pkt = %ld.\n",
1077 (unsigned long)qdev->nic_stats.tx_128_to_255_pkt);
1078 printk(KERN_ERR "tx_256_511_pkt = %ld.\n",
1079 (unsigned long)qdev->nic_stats.tx_256_511_pkt);
1080 printk(KERN_ERR "tx_512_to_1023_pkt = %ld.\n",
1081 (unsigned long)qdev->nic_stats.tx_512_to_1023_pkt);
1082 printk(KERN_ERR "tx_1024_to_1518_pkt = %ld.\n",
1083 (unsigned long)qdev->nic_stats.tx_1024_to_1518_pkt);
1084 printk(KERN_ERR "tx_1519_to_max_pkt = %ld.\n",
1085 (unsigned long)qdev->nic_stats.tx_1519_to_max_pkt);
1086 printk(KERN_ERR "tx_undersize_pkt = %ld.\n",
1087 (unsigned long)qdev->nic_stats.tx_undersize_pkt);
1088 printk(KERN_ERR "tx_oversize_pkt = %ld.\n",
1089 (unsigned long)qdev->nic_stats.tx_oversize_pkt);
1090 printk(KERN_ERR "rx_bytes = %ld.\n",
1091 (unsigned long)qdev->nic_stats.rx_bytes);
1092 printk(KERN_ERR "rx_bytes_ok = %ld.\n",
1093 (unsigned long)qdev->nic_stats.rx_bytes_ok);
1094 printk(KERN_ERR "rx_pkts = %ld.\n",
1095 (unsigned long)qdev->nic_stats.rx_pkts);
1096 printk(KERN_ERR "rx_pkts_ok = %ld.\n",
1097 (unsigned long)qdev->nic_stats.rx_pkts_ok);
1098 printk(KERN_ERR "rx_bcast_pkts = %ld.\n",
1099 (unsigned long)qdev->nic_stats.rx_bcast_pkts);
1100 printk(KERN_ERR "rx_mcast_pkts = %ld.\n",
1101 (unsigned long)qdev->nic_stats.rx_mcast_pkts);
1102 printk(KERN_ERR "rx_ucast_pkts = %ld.\n",
1103 (unsigned long)qdev->nic_stats.rx_ucast_pkts);
1104 printk(KERN_ERR "rx_undersize_pkts = %ld.\n",
1105 (unsigned long)qdev->nic_stats.rx_undersize_pkts);
1106 printk(KERN_ERR "rx_oversize_pkts = %ld.\n",
1107 (unsigned long)qdev->nic_stats.rx_oversize_pkts);
1108 printk(KERN_ERR "rx_jabber_pkts = %ld.\n",
1109 (unsigned long)qdev->nic_stats.rx_jabber_pkts);
1110 printk(KERN_ERR "rx_undersize_fcerr_pkts = %ld.\n",
1111 (unsigned long)qdev->nic_stats.rx_undersize_fcerr_pkts);
1112 printk(KERN_ERR "rx_drop_events = %ld.\n",
1113 (unsigned long)qdev->nic_stats.rx_drop_events);
1114 printk(KERN_ERR "rx_fcerr_pkts = %ld.\n",
1115 (unsigned long)qdev->nic_stats.rx_fcerr_pkts);
1116 printk(KERN_ERR "rx_align_err = %ld.\n",
1117 (unsigned long)qdev->nic_stats.rx_align_err);
1118 printk(KERN_ERR "rx_symbol_err = %ld.\n",
1119 (unsigned long)qdev->nic_stats.rx_symbol_err);
1120 printk(KERN_ERR "rx_mac_err = %ld.\n",
1121 (unsigned long)qdev->nic_stats.rx_mac_err);
1122 printk(KERN_ERR "rx_ctl_pkts = %ld.\n",
1123 (unsigned long)qdev->nic_stats.rx_ctl_pkts);
1124 printk(KERN_ERR "rx_pause_pkts = %ld.\n",
1125 (unsigned long)qdev->nic_stats.rx_pause_pkts);
1126 printk(KERN_ERR "rx_64_pkts = %ld.\n",
1127 (unsigned long)qdev->nic_stats.rx_64_pkts);
1128 printk(KERN_ERR "rx_65_to_127_pkts = %ld.\n",
1129 (unsigned long)qdev->nic_stats.rx_65_to_127_pkts);
1130 printk(KERN_ERR "rx_128_255_pkts = %ld.\n",
1131 (unsigned long)qdev->nic_stats.rx_128_255_pkts);
1132 printk(KERN_ERR "rx_256_511_pkts = %ld.\n",
1133 (unsigned long)qdev->nic_stats.rx_256_511_pkts);
1134 printk(KERN_ERR "rx_512_to_1023_pkts = %ld.\n",
1135 (unsigned long)qdev->nic_stats.rx_512_to_1023_pkts);
1136 printk(KERN_ERR "rx_1024_to_1518_pkts = %ld.\n",
1137 (unsigned long)qdev->nic_stats.rx_1024_to_1518_pkts);
1138 printk(KERN_ERR "rx_1519_to_max_pkts = %ld.\n",
1139 (unsigned long)qdev->nic_stats.rx_1519_to_max_pkts);
1140 printk(KERN_ERR "rx_len_err_pkts = %ld.\n",
1141 (unsigned long)qdev->nic_stats.rx_len_err_pkts);
1142};
1143#endif
1144
1145#ifdef QL_DEV_DUMP
1146void ql_dump_qdev(struct ql_adapter *qdev)
1147{
1148 int i;
1149 printk(KERN_ERR PFX "qdev->flags = %lx.\n",
1150 qdev->flags);
1151 printk(KERN_ERR PFX "qdev->vlgrp = %p.\n",
1152 qdev->vlgrp);
1153 printk(KERN_ERR PFX "qdev->pdev = %p.\n",
1154 qdev->pdev);
1155 printk(KERN_ERR PFX "qdev->ndev = %p.\n",
1156 qdev->ndev);
1157 printk(KERN_ERR PFX "qdev->chip_rev_id = %d.\n",
1158 qdev->chip_rev_id);
1159 printk(KERN_ERR PFX "qdev->reg_base = %p.\n",
1160 qdev->reg_base);
1161 printk(KERN_ERR PFX "qdev->doorbell_area = %p.\n",
1162 qdev->doorbell_area);
1163 printk(KERN_ERR PFX "qdev->doorbell_area_size = %d.\n",
1164 qdev->doorbell_area_size);
1165 printk(KERN_ERR PFX "msg_enable = %x.\n",
1166 qdev->msg_enable);
1167 printk(KERN_ERR PFX "qdev->rx_ring_shadow_reg_area = %p.\n",
1168 qdev->rx_ring_shadow_reg_area);
David S. Miller53159d02008-09-19 16:13:05 -07001169 printk(KERN_ERR PFX "qdev->rx_ring_shadow_reg_dma = %llx.\n",
1170 (unsigned long long) qdev->rx_ring_shadow_reg_dma);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001171 printk(KERN_ERR PFX "qdev->tx_ring_shadow_reg_area = %p.\n",
1172 qdev->tx_ring_shadow_reg_area);
David S. Miller53159d02008-09-19 16:13:05 -07001173 printk(KERN_ERR PFX "qdev->tx_ring_shadow_reg_dma = %llx.\n",
1174 (unsigned long long) qdev->tx_ring_shadow_reg_dma);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001175 printk(KERN_ERR PFX "qdev->intr_count = %d.\n",
1176 qdev->intr_count);
1177 if (qdev->msi_x_entry)
1178 for (i = 0; i < qdev->intr_count; i++) {
1179 printk(KERN_ERR PFX
1180 "msi_x_entry.[%d]vector = %d.\n", i,
1181 qdev->msi_x_entry[i].vector);
1182 printk(KERN_ERR PFX
1183 "msi_x_entry.[%d]entry = %d.\n", i,
1184 qdev->msi_x_entry[i].entry);
1185 }
1186 for (i = 0; i < qdev->intr_count; i++) {
1187 printk(KERN_ERR PFX
1188 "intr_context[%d].qdev = %p.\n", i,
1189 qdev->intr_context[i].qdev);
1190 printk(KERN_ERR PFX
1191 "intr_context[%d].intr = %d.\n", i,
1192 qdev->intr_context[i].intr);
1193 printk(KERN_ERR PFX
1194 "intr_context[%d].hooked = %d.\n", i,
1195 qdev->intr_context[i].hooked);
1196 printk(KERN_ERR PFX
1197 "intr_context[%d].intr_en_mask = 0x%08x.\n", i,
1198 qdev->intr_context[i].intr_en_mask);
1199 printk(KERN_ERR PFX
1200 "intr_context[%d].intr_dis_mask = 0x%08x.\n", i,
1201 qdev->intr_context[i].intr_dis_mask);
1202 printk(KERN_ERR PFX
1203 "intr_context[%d].intr_read_mask = 0x%08x.\n", i,
1204 qdev->intr_context[i].intr_read_mask);
1205 }
1206 printk(KERN_ERR PFX "qdev->tx_ring_count = %d.\n", qdev->tx_ring_count);
1207 printk(KERN_ERR PFX "qdev->rx_ring_count = %d.\n", qdev->rx_ring_count);
1208 printk(KERN_ERR PFX "qdev->ring_mem_size = %d.\n", qdev->ring_mem_size);
1209 printk(KERN_ERR PFX "qdev->ring_mem = %p.\n", qdev->ring_mem);
1210 printk(KERN_ERR PFX "qdev->intr_count = %d.\n", qdev->intr_count);
1211 printk(KERN_ERR PFX "qdev->tx_ring = %p.\n",
1212 qdev->tx_ring);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001213 printk(KERN_ERR PFX "qdev->rss_ring_count = %d.\n",
1214 qdev->rss_ring_count);
1215 printk(KERN_ERR PFX "qdev->rx_ring = %p.\n", qdev->rx_ring);
1216 printk(KERN_ERR PFX "qdev->default_rx_queue = %d.\n",
1217 qdev->default_rx_queue);
1218 printk(KERN_ERR PFX "qdev->xg_sem_mask = 0x%08x.\n",
1219 qdev->xg_sem_mask);
1220 printk(KERN_ERR PFX "qdev->port_link_up = 0x%08x.\n",
1221 qdev->port_link_up);
1222 printk(KERN_ERR PFX "qdev->port_init = 0x%08x.\n",
1223 qdev->port_init);
1224
1225}
1226#endif
1227
1228#ifdef QL_CB_DUMP
1229void ql_dump_wqicb(struct wqicb *wqicb)
1230{
1231 printk(KERN_ERR PFX "Dumping wqicb stuff...\n");
1232 printk(KERN_ERR PFX "wqicb->len = 0x%x.\n", le16_to_cpu(wqicb->len));
1233 printk(KERN_ERR PFX "wqicb->flags = %x.\n", le16_to_cpu(wqicb->flags));
1234 printk(KERN_ERR PFX "wqicb->cq_id_rss = %d.\n",
1235 le16_to_cpu(wqicb->cq_id_rss));
1236 printk(KERN_ERR PFX "wqicb->rid = 0x%x.\n", le16_to_cpu(wqicb->rid));
Ron Mercer97345522009-01-09 11:31:50 +00001237 printk(KERN_ERR PFX "wqicb->wq_addr = 0x%llx.\n",
1238 (unsigned long long) le64_to_cpu(wqicb->addr));
1239 printk(KERN_ERR PFX "wqicb->wq_cnsmr_idx_addr = 0x%llx.\n",
1240 (unsigned long long) le64_to_cpu(wqicb->cnsmr_idx_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001241}
1242
1243void ql_dump_tx_ring(struct tx_ring *tx_ring)
1244{
1245 if (tx_ring == NULL)
1246 return;
1247 printk(KERN_ERR PFX
1248 "===================== Dumping tx_ring %d ===============.\n",
1249 tx_ring->wq_id);
1250 printk(KERN_ERR PFX "tx_ring->base = %p.\n", tx_ring->wq_base);
1251 printk(KERN_ERR PFX "tx_ring->base_dma = 0x%llx.\n",
David S. Miller53159d02008-09-19 16:13:05 -07001252 (unsigned long long) tx_ring->wq_base_dma);
Ron Mercerba7cd3b2009-01-09 11:31:49 +00001253 printk(KERN_ERR PFX
1254 "tx_ring->cnsmr_idx_sh_reg, addr = 0x%p, value = %d.\n",
1255 tx_ring->cnsmr_idx_sh_reg,
1256 tx_ring->cnsmr_idx_sh_reg
1257 ? ql_read_sh_reg(tx_ring->cnsmr_idx_sh_reg) : 0);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001258 printk(KERN_ERR PFX "tx_ring->size = %d.\n", tx_ring->wq_size);
1259 printk(KERN_ERR PFX "tx_ring->len = %d.\n", tx_ring->wq_len);
1260 printk(KERN_ERR PFX "tx_ring->prod_idx_db_reg = %p.\n",
1261 tx_ring->prod_idx_db_reg);
1262 printk(KERN_ERR PFX "tx_ring->valid_db_reg = %p.\n",
1263 tx_ring->valid_db_reg);
1264 printk(KERN_ERR PFX "tx_ring->prod_idx = %d.\n", tx_ring->prod_idx);
1265 printk(KERN_ERR PFX "tx_ring->cq_id = %d.\n", tx_ring->cq_id);
1266 printk(KERN_ERR PFX "tx_ring->wq_id = %d.\n", tx_ring->wq_id);
1267 printk(KERN_ERR PFX "tx_ring->q = %p.\n", tx_ring->q);
1268 printk(KERN_ERR PFX "tx_ring->tx_count = %d.\n",
1269 atomic_read(&tx_ring->tx_count));
1270}
1271
1272void ql_dump_ricb(struct ricb *ricb)
1273{
1274 int i;
1275 printk(KERN_ERR PFX
1276 "===================== Dumping ricb ===============.\n");
1277 printk(KERN_ERR PFX "Dumping ricb stuff...\n");
1278
1279 printk(KERN_ERR PFX "ricb->base_cq = %d.\n", ricb->base_cq & 0x1f);
1280 printk(KERN_ERR PFX "ricb->flags = %s%s%s%s%s%s%s%s%s.\n",
1281 ricb->base_cq & RSS_L4K ? "RSS_L4K " : "",
1282 ricb->flags & RSS_L6K ? "RSS_L6K " : "",
1283 ricb->flags & RSS_LI ? "RSS_LI " : "",
1284 ricb->flags & RSS_LB ? "RSS_LB " : "",
1285 ricb->flags & RSS_LM ? "RSS_LM " : "",
1286 ricb->flags & RSS_RI4 ? "RSS_RI4 " : "",
1287 ricb->flags & RSS_RT4 ? "RSS_RT4 " : "",
1288 ricb->flags & RSS_RI6 ? "RSS_RI6 " : "",
1289 ricb->flags & RSS_RT6 ? "RSS_RT6 " : "");
1290 printk(KERN_ERR PFX "ricb->mask = 0x%.04x.\n", le16_to_cpu(ricb->mask));
1291 for (i = 0; i < 16; i++)
1292 printk(KERN_ERR PFX "ricb->hash_cq_id[%d] = 0x%.08x.\n", i,
1293 le32_to_cpu(ricb->hash_cq_id[i]));
1294 for (i = 0; i < 10; i++)
1295 printk(KERN_ERR PFX "ricb->ipv6_hash_key[%d] = 0x%.08x.\n", i,
1296 le32_to_cpu(ricb->ipv6_hash_key[i]));
1297 for (i = 0; i < 4; i++)
1298 printk(KERN_ERR PFX "ricb->ipv4_hash_key[%d] = 0x%.08x.\n", i,
1299 le32_to_cpu(ricb->ipv4_hash_key[i]));
1300}
1301
1302void ql_dump_cqicb(struct cqicb *cqicb)
1303{
1304 printk(KERN_ERR PFX "Dumping cqicb stuff...\n");
1305
1306 printk(KERN_ERR PFX "cqicb->msix_vect = %d.\n", cqicb->msix_vect);
1307 printk(KERN_ERR PFX "cqicb->flags = %x.\n", cqicb->flags);
1308 printk(KERN_ERR PFX "cqicb->len = %d.\n", le16_to_cpu(cqicb->len));
Ron Mercer97345522009-01-09 11:31:50 +00001309 printk(KERN_ERR PFX "cqicb->addr = 0x%llx.\n",
1310 (unsigned long long) le64_to_cpu(cqicb->addr));
1311 printk(KERN_ERR PFX "cqicb->prod_idx_addr = 0x%llx.\n",
1312 (unsigned long long) le64_to_cpu(cqicb->prod_idx_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001313 printk(KERN_ERR PFX "cqicb->pkt_delay = 0x%.04x.\n",
1314 le16_to_cpu(cqicb->pkt_delay));
1315 printk(KERN_ERR PFX "cqicb->irq_delay = 0x%.04x.\n",
1316 le16_to_cpu(cqicb->irq_delay));
Ron Mercer97345522009-01-09 11:31:50 +00001317 printk(KERN_ERR PFX "cqicb->lbq_addr = 0x%llx.\n",
1318 (unsigned long long) le64_to_cpu(cqicb->lbq_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001319 printk(KERN_ERR PFX "cqicb->lbq_buf_size = 0x%.04x.\n",
1320 le16_to_cpu(cqicb->lbq_buf_size));
1321 printk(KERN_ERR PFX "cqicb->lbq_len = 0x%.04x.\n",
1322 le16_to_cpu(cqicb->lbq_len));
Ron Mercer97345522009-01-09 11:31:50 +00001323 printk(KERN_ERR PFX "cqicb->sbq_addr = 0x%llx.\n",
1324 (unsigned long long) le64_to_cpu(cqicb->sbq_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001325 printk(KERN_ERR PFX "cqicb->sbq_buf_size = 0x%.04x.\n",
1326 le16_to_cpu(cqicb->sbq_buf_size));
1327 printk(KERN_ERR PFX "cqicb->sbq_len = 0x%.04x.\n",
1328 le16_to_cpu(cqicb->sbq_len));
1329}
1330
1331void ql_dump_rx_ring(struct rx_ring *rx_ring)
1332{
1333 if (rx_ring == NULL)
1334 return;
1335 printk(KERN_ERR PFX
1336 "===================== Dumping rx_ring %d ===============.\n",
1337 rx_ring->cq_id);
1338 printk(KERN_ERR PFX "Dumping rx_ring %d, type = %s%s%s.\n",
1339 rx_ring->cq_id, rx_ring->type == DEFAULT_Q ? "DEFAULT" : "",
1340 rx_ring->type == TX_Q ? "OUTBOUND COMPLETIONS" : "",
1341 rx_ring->type == RX_Q ? "INBOUND_COMPLETIONS" : "");
1342 printk(KERN_ERR PFX "rx_ring->cqicb = %p.\n", &rx_ring->cqicb);
1343 printk(KERN_ERR PFX "rx_ring->cq_base = %p.\n", rx_ring->cq_base);
1344 printk(KERN_ERR PFX "rx_ring->cq_base_dma = %llx.\n",
David S. Miller53159d02008-09-19 16:13:05 -07001345 (unsigned long long) rx_ring->cq_base_dma);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001346 printk(KERN_ERR PFX "rx_ring->cq_size = %d.\n", rx_ring->cq_size);
1347 printk(KERN_ERR PFX "rx_ring->cq_len = %d.\n", rx_ring->cq_len);
1348 printk(KERN_ERR PFX
Ron Mercerba7cd3b2009-01-09 11:31:49 +00001349 "rx_ring->prod_idx_sh_reg, addr = 0x%p, value = %d.\n",
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001350 rx_ring->prod_idx_sh_reg,
Ron Mercerba7cd3b2009-01-09 11:31:49 +00001351 rx_ring->prod_idx_sh_reg
1352 ? ql_read_sh_reg(rx_ring->prod_idx_sh_reg) : 0);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001353 printk(KERN_ERR PFX "rx_ring->prod_idx_sh_reg_dma = %llx.\n",
David S. Miller53159d02008-09-19 16:13:05 -07001354 (unsigned long long) rx_ring->prod_idx_sh_reg_dma);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001355 printk(KERN_ERR PFX "rx_ring->cnsmr_idx_db_reg = %p.\n",
1356 rx_ring->cnsmr_idx_db_reg);
1357 printk(KERN_ERR PFX "rx_ring->cnsmr_idx = %d.\n", rx_ring->cnsmr_idx);
1358 printk(KERN_ERR PFX "rx_ring->curr_entry = %p.\n", rx_ring->curr_entry);
1359 printk(KERN_ERR PFX "rx_ring->valid_db_reg = %p.\n",
1360 rx_ring->valid_db_reg);
1361
1362 printk(KERN_ERR PFX "rx_ring->lbq_base = %p.\n", rx_ring->lbq_base);
1363 printk(KERN_ERR PFX "rx_ring->lbq_base_dma = %llx.\n",
David S. Miller53159d02008-09-19 16:13:05 -07001364 (unsigned long long) rx_ring->lbq_base_dma);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001365 printk(KERN_ERR PFX "rx_ring->lbq_base_indirect = %p.\n",
1366 rx_ring->lbq_base_indirect);
1367 printk(KERN_ERR PFX "rx_ring->lbq_base_indirect_dma = %llx.\n",
David S. Miller53159d02008-09-19 16:13:05 -07001368 (unsigned long long) rx_ring->lbq_base_indirect_dma);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001369 printk(KERN_ERR PFX "rx_ring->lbq = %p.\n", rx_ring->lbq);
1370 printk(KERN_ERR PFX "rx_ring->lbq_len = %d.\n", rx_ring->lbq_len);
1371 printk(KERN_ERR PFX "rx_ring->lbq_size = %d.\n", rx_ring->lbq_size);
1372 printk(KERN_ERR PFX "rx_ring->lbq_prod_idx_db_reg = %p.\n",
1373 rx_ring->lbq_prod_idx_db_reg);
1374 printk(KERN_ERR PFX "rx_ring->lbq_prod_idx = %d.\n",
1375 rx_ring->lbq_prod_idx);
1376 printk(KERN_ERR PFX "rx_ring->lbq_curr_idx = %d.\n",
1377 rx_ring->lbq_curr_idx);
1378 printk(KERN_ERR PFX "rx_ring->lbq_clean_idx = %d.\n",
1379 rx_ring->lbq_clean_idx);
1380 printk(KERN_ERR PFX "rx_ring->lbq_free_cnt = %d.\n",
1381 rx_ring->lbq_free_cnt);
1382 printk(KERN_ERR PFX "rx_ring->lbq_buf_size = %d.\n",
1383 rx_ring->lbq_buf_size);
1384
1385 printk(KERN_ERR PFX "rx_ring->sbq_base = %p.\n", rx_ring->sbq_base);
1386 printk(KERN_ERR PFX "rx_ring->sbq_base_dma = %llx.\n",
David S. Miller53159d02008-09-19 16:13:05 -07001387 (unsigned long long) rx_ring->sbq_base_dma);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001388 printk(KERN_ERR PFX "rx_ring->sbq_base_indirect = %p.\n",
1389 rx_ring->sbq_base_indirect);
1390 printk(KERN_ERR PFX "rx_ring->sbq_base_indirect_dma = %llx.\n",
David S. Miller53159d02008-09-19 16:13:05 -07001391 (unsigned long long) rx_ring->sbq_base_indirect_dma);
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001392 printk(KERN_ERR PFX "rx_ring->sbq = %p.\n", rx_ring->sbq);
1393 printk(KERN_ERR PFX "rx_ring->sbq_len = %d.\n", rx_ring->sbq_len);
1394 printk(KERN_ERR PFX "rx_ring->sbq_size = %d.\n", rx_ring->sbq_size);
1395 printk(KERN_ERR PFX "rx_ring->sbq_prod_idx_db_reg addr = %p.\n",
1396 rx_ring->sbq_prod_idx_db_reg);
1397 printk(KERN_ERR PFX "rx_ring->sbq_prod_idx = %d.\n",
1398 rx_ring->sbq_prod_idx);
1399 printk(KERN_ERR PFX "rx_ring->sbq_curr_idx = %d.\n",
1400 rx_ring->sbq_curr_idx);
1401 printk(KERN_ERR PFX "rx_ring->sbq_clean_idx = %d.\n",
1402 rx_ring->sbq_clean_idx);
1403 printk(KERN_ERR PFX "rx_ring->sbq_free_cnt = %d.\n",
1404 rx_ring->sbq_free_cnt);
1405 printk(KERN_ERR PFX "rx_ring->sbq_buf_size = %d.\n",
1406 rx_ring->sbq_buf_size);
1407 printk(KERN_ERR PFX "rx_ring->cq_id = %d.\n", rx_ring->cq_id);
1408 printk(KERN_ERR PFX "rx_ring->irq = %d.\n", rx_ring->irq);
1409 printk(KERN_ERR PFX "rx_ring->cpu = %d.\n", rx_ring->cpu);
1410 printk(KERN_ERR PFX "rx_ring->qdev = %p.\n", rx_ring->qdev);
1411}
1412
1413void ql_dump_hw_cb(struct ql_adapter *qdev, int size, u32 bit, u16 q_id)
1414{
1415 void *ptr;
1416
1417 printk(KERN_ERR PFX "%s: Enter.\n", __func__);
1418
1419 ptr = kmalloc(size, GFP_ATOMIC);
1420 if (ptr == NULL) {
1421 printk(KERN_ERR PFX "%s: Couldn't allocate a buffer.\n",
1422 __func__);
1423 return;
1424 }
1425
1426 if (ql_write_cfg(qdev, ptr, size, bit, q_id)) {
1427 printk(KERN_ERR "%s: Failed to upload control block!\n",
1428 __func__);
1429 goto fail_it;
1430 }
1431 switch (bit) {
1432 case CFG_DRQ:
1433 ql_dump_wqicb((struct wqicb *)ptr);
1434 break;
1435 case CFG_DCQ:
1436 ql_dump_cqicb((struct cqicb *)ptr);
1437 break;
1438 case CFG_DR:
1439 ql_dump_ricb((struct ricb *)ptr);
1440 break;
1441 default:
1442 printk(KERN_ERR PFX "%s: Invalid bit value = %x.\n",
1443 __func__, bit);
1444 break;
1445 }
1446fail_it:
1447 kfree(ptr);
1448}
1449#endif
1450
1451#ifdef QL_OB_DUMP
1452void ql_dump_tx_desc(struct tx_buf_desc *tbd)
1453{
1454 printk(KERN_ERR PFX "tbd->addr = 0x%llx\n",
1455 le64_to_cpu((u64) tbd->addr));
1456 printk(KERN_ERR PFX "tbd->len = %d\n",
1457 le32_to_cpu(tbd->len & TX_DESC_LEN_MASK));
1458 printk(KERN_ERR PFX "tbd->flags = %s %s\n",
1459 tbd->len & TX_DESC_C ? "C" : ".",
1460 tbd->len & TX_DESC_E ? "E" : ".");
1461 tbd++;
1462 printk(KERN_ERR PFX "tbd->addr = 0x%llx\n",
1463 le64_to_cpu((u64) tbd->addr));
1464 printk(KERN_ERR PFX "tbd->len = %d\n",
1465 le32_to_cpu(tbd->len & TX_DESC_LEN_MASK));
1466 printk(KERN_ERR PFX "tbd->flags = %s %s\n",
1467 tbd->len & TX_DESC_C ? "C" : ".",
1468 tbd->len & TX_DESC_E ? "E" : ".");
1469 tbd++;
1470 printk(KERN_ERR PFX "tbd->addr = 0x%llx\n",
1471 le64_to_cpu((u64) tbd->addr));
1472 printk(KERN_ERR PFX "tbd->len = %d\n",
1473 le32_to_cpu(tbd->len & TX_DESC_LEN_MASK));
1474 printk(KERN_ERR PFX "tbd->flags = %s %s\n",
1475 tbd->len & TX_DESC_C ? "C" : ".",
1476 tbd->len & TX_DESC_E ? "E" : ".");
1477
1478}
1479
1480void ql_dump_ob_mac_iocb(struct ob_mac_iocb_req *ob_mac_iocb)
1481{
1482 struct ob_mac_tso_iocb_req *ob_mac_tso_iocb =
1483 (struct ob_mac_tso_iocb_req *)ob_mac_iocb;
1484 struct tx_buf_desc *tbd;
1485 u16 frame_len;
1486
1487 printk(KERN_ERR PFX "%s\n", __func__);
1488 printk(KERN_ERR PFX "opcode = %s\n",
1489 (ob_mac_iocb->opcode == OPCODE_OB_MAC_IOCB) ? "MAC" : "TSO");
1490 printk(KERN_ERR PFX "flags1 = %s %s %s %s %s\n",
1491 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_OI ? "OI" : "",
1492 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_I ? "I" : "",
1493 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_D ? "D" : "",
1494 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_IP4 ? "IP4" : "",
1495 ob_mac_tso_iocb->flags1 & OB_MAC_TSO_IOCB_IP6 ? "IP6" : "");
1496 printk(KERN_ERR PFX "flags2 = %s %s %s\n",
1497 ob_mac_tso_iocb->flags2 & OB_MAC_TSO_IOCB_LSO ? "LSO" : "",
1498 ob_mac_tso_iocb->flags2 & OB_MAC_TSO_IOCB_UC ? "UC" : "",
1499 ob_mac_tso_iocb->flags2 & OB_MAC_TSO_IOCB_TC ? "TC" : "");
1500 printk(KERN_ERR PFX "flags3 = %s %s %s \n",
1501 ob_mac_tso_iocb->flags3 & OB_MAC_TSO_IOCB_IC ? "IC" : "",
1502 ob_mac_tso_iocb->flags3 & OB_MAC_TSO_IOCB_DFP ? "DFP" : "",
1503 ob_mac_tso_iocb->flags3 & OB_MAC_TSO_IOCB_V ? "V" : "");
1504 printk(KERN_ERR PFX "tid = %x\n", ob_mac_iocb->tid);
1505 printk(KERN_ERR PFX "txq_idx = %d\n", ob_mac_iocb->txq_idx);
1506 printk(KERN_ERR PFX "vlan_tci = %x\n", ob_mac_tso_iocb->vlan_tci);
1507 if (ob_mac_iocb->opcode == OPCODE_OB_MAC_TSO_IOCB) {
1508 printk(KERN_ERR PFX "frame_len = %d\n",
1509 le32_to_cpu(ob_mac_tso_iocb->frame_len));
1510 printk(KERN_ERR PFX "mss = %d\n",
1511 le16_to_cpu(ob_mac_tso_iocb->mss));
1512 printk(KERN_ERR PFX "prot_hdr_len = %d\n",
1513 le16_to_cpu(ob_mac_tso_iocb->total_hdrs_len));
1514 printk(KERN_ERR PFX "hdr_offset = 0x%.04x\n",
1515 le16_to_cpu(ob_mac_tso_iocb->net_trans_offset));
1516 frame_len = le32_to_cpu(ob_mac_tso_iocb->frame_len);
1517 } else {
1518 printk(KERN_ERR PFX "frame_len = %d\n",
1519 le16_to_cpu(ob_mac_iocb->frame_len));
1520 frame_len = le16_to_cpu(ob_mac_iocb->frame_len);
1521 }
1522 tbd = &ob_mac_iocb->tbd[0];
1523 ql_dump_tx_desc(tbd);
1524}
1525
1526void ql_dump_ob_mac_rsp(struct ob_mac_iocb_rsp *ob_mac_rsp)
1527{
1528 printk(KERN_ERR PFX "%s\n", __func__);
1529 printk(KERN_ERR PFX "opcode = %d\n", ob_mac_rsp->opcode);
1530 printk(KERN_ERR PFX "flags = %s %s %s %s %s %s %s\n",
1531 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_OI ? "OI" : ".",
1532 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_I ? "I" : ".",
1533 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_E ? "E" : ".",
1534 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_S ? "S" : ".",
1535 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_L ? "L" : ".",
1536 ob_mac_rsp->flags1 & OB_MAC_IOCB_RSP_P ? "P" : ".",
1537 ob_mac_rsp->flags2 & OB_MAC_IOCB_RSP_B ? "B" : ".");
1538 printk(KERN_ERR PFX "tid = %x\n", ob_mac_rsp->tid);
1539}
1540#endif
1541
1542#ifdef QL_IB_DUMP
1543void ql_dump_ib_mac_rsp(struct ib_mac_iocb_rsp *ib_mac_rsp)
1544{
1545 printk(KERN_ERR PFX "%s\n", __func__);
1546 printk(KERN_ERR PFX "opcode = 0x%x\n", ib_mac_rsp->opcode);
1547 printk(KERN_ERR PFX "flags1 = %s%s%s%s%s%s\n",
1548 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_OI ? "OI " : "",
1549 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_I ? "I " : "",
1550 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_TE ? "TE " : "",
1551 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_NU ? "NU " : "",
1552 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_IE ? "IE " : "",
1553 ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_B ? "B " : "");
1554
1555 if (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK)
1556 printk(KERN_ERR PFX "%s%s%s Multicast.\n",
1557 (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) ==
1558 IB_MAC_IOCB_RSP_M_HASH ? "Hash" : "",
1559 (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) ==
1560 IB_MAC_IOCB_RSP_M_REG ? "Registered" : "",
1561 (ib_mac_rsp->flags1 & IB_MAC_IOCB_RSP_M_MASK) ==
1562 IB_MAC_IOCB_RSP_M_PROM ? "Promiscuous" : "");
1563
1564 printk(KERN_ERR PFX "flags2 = %s%s%s%s%s\n",
1565 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_P) ? "P " : "",
1566 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V) ? "V " : "",
1567 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_U) ? "U " : "",
1568 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_T) ? "T " : "",
1569 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_FO) ? "FO " : "");
1570
1571 if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK)
1572 printk(KERN_ERR PFX "%s%s%s%s%s error.\n",
1573 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1574 IB_MAC_IOCB_RSP_ERR_OVERSIZE ? "oversize" : "",
1575 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1576 IB_MAC_IOCB_RSP_ERR_UNDERSIZE ? "undersize" : "",
1577 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1578 IB_MAC_IOCB_RSP_ERR_PREAMBLE ? "preamble" : "",
1579 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1580 IB_MAC_IOCB_RSP_ERR_FRAME_LEN ? "frame length" : "",
1581 (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_ERR_MASK) ==
1582 IB_MAC_IOCB_RSP_ERR_CRC ? "CRC" : "");
1583
1584 printk(KERN_ERR PFX "flags3 = %s%s.\n",
1585 ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_DS ? "DS " : "",
1586 ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_DL ? "DL " : "");
1587
1588 if (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK)
1589 printk(KERN_ERR PFX "RSS flags = %s%s%s%s.\n",
1590 ((ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK) ==
1591 IB_MAC_IOCB_RSP_M_IPV4) ? "IPv4 RSS" : "",
1592 ((ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK) ==
1593 IB_MAC_IOCB_RSP_M_IPV6) ? "IPv6 RSS " : "",
1594 ((ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK) ==
1595 IB_MAC_IOCB_RSP_M_TCP_V4) ? "TCP/IPv4 RSS" : "",
1596 ((ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK) ==
1597 IB_MAC_IOCB_RSP_M_TCP_V6) ? "TCP/IPv6 RSS" : "");
1598
1599 printk(KERN_ERR PFX "data_len = %d\n",
1600 le32_to_cpu(ib_mac_rsp->data_len));
Ron Mercer97345522009-01-09 11:31:50 +00001601 printk(KERN_ERR PFX "data_addr = 0x%llx\n",
1602 (unsigned long long) le64_to_cpu(ib_mac_rsp->data_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001603 if (ib_mac_rsp->flags3 & IB_MAC_IOCB_RSP_RSS_MASK)
1604 printk(KERN_ERR PFX "rss = %x\n",
1605 le32_to_cpu(ib_mac_rsp->rss));
1606 if (ib_mac_rsp->flags2 & IB_MAC_IOCB_RSP_V)
1607 printk(KERN_ERR PFX "vlan_id = %x\n",
1608 le16_to_cpu(ib_mac_rsp->vlan_id));
1609
1610 printk(KERN_ERR PFX "flags4 = %s%s%s.\n",
Ron Mercera303ce02009-01-05 18:18:22 -08001611 ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HV ? "HV " : "",
1612 ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HS ? "HS " : "",
1613 ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HL ? "HL " : "");
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001614
Ron Mercera303ce02009-01-05 18:18:22 -08001615 if (ib_mac_rsp->flags4 & IB_MAC_IOCB_RSP_HV) {
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001616 printk(KERN_ERR PFX "hdr length = %d.\n",
1617 le32_to_cpu(ib_mac_rsp->hdr_len));
Ron Mercer97345522009-01-09 11:31:50 +00001618 printk(KERN_ERR PFX "hdr addr = 0x%llx.\n",
1619 (unsigned long long) le64_to_cpu(ib_mac_rsp->hdr_addr));
Ron Mercerc4e84bd2008-09-18 11:56:28 -04001620 }
1621}
1622#endif
1623
1624#ifdef QL_ALL_DUMP
1625void ql_dump_all(struct ql_adapter *qdev)
1626{
1627 int i;
1628
1629 QL_DUMP_REGS(qdev);
1630 QL_DUMP_QDEV(qdev);
1631 for (i = 0; i < qdev->tx_ring_count; i++) {
1632 QL_DUMP_TX_RING(&qdev->tx_ring[i]);
1633 QL_DUMP_WQICB((struct wqicb *)&qdev->tx_ring[i]);
1634 }
1635 for (i = 0; i < qdev->rx_ring_count; i++) {
1636 QL_DUMP_RX_RING(&qdev->rx_ring[i]);
1637 QL_DUMP_CQICB((struct cqicb *)&qdev->rx_ring[i]);
1638 }
1639}
1640#endif