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