Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-for-linus-2.6
[deliverable/linux.git] / drivers / scsi / qla2xxx / qla_dbg.c
1 /*
2 * QLogic Fibre Channel HBA Driver
3 * Copyright (c) 2003-2005 QLogic Corporation
4 *
5 * See LICENSE.qla2xxx for copyright and licensing details.
6 */
7 #include "qla_def.h"
8
9 #include <linux/delay.h>
10
11 static int qla_uprintf(char **, char *, ...);
12
13 /**
14 * qla2300_fw_dump() - Dumps binary data from the 2300 firmware.
15 * @ha: HA context
16 * @hardware_locked: Called with the hardware_lock
17 */
18 void
19 qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
20 {
21 int rval;
22 uint32_t cnt, timer;
23 uint32_t risc_address;
24 uint16_t mb0, mb2;
25
26 uint32_t stat;
27 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
28 uint16_t __iomem *dmp_reg;
29 unsigned long flags;
30 struct qla2300_fw_dump *fw;
31 uint32_t dump_size, data_ram_cnt;
32
33 risc_address = data_ram_cnt = 0;
34 mb0 = mb2 = 0;
35 flags = 0;
36
37 if (!hardware_locked)
38 spin_lock_irqsave(&ha->hardware_lock, flags);
39
40 if (ha->fw_dump != NULL) {
41 qla_printk(KERN_WARNING, ha,
42 "Firmware has been previously dumped (%p) -- ignoring "
43 "request...\n", ha->fw_dump);
44 goto qla2300_fw_dump_failed;
45 }
46
47 /* Allocate (large) dump buffer. */
48 dump_size = sizeof(struct qla2300_fw_dump);
49 dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t);
50 ha->fw_dump_order = get_order(dump_size);
51 ha->fw_dump = (struct qla2300_fw_dump *) __get_free_pages(GFP_ATOMIC,
52 ha->fw_dump_order);
53 if (ha->fw_dump == NULL) {
54 qla_printk(KERN_WARNING, ha,
55 "Unable to allocated memory for firmware dump (%d/%d).\n",
56 ha->fw_dump_order, dump_size);
57 goto qla2300_fw_dump_failed;
58 }
59 fw = ha->fw_dump;
60
61 rval = QLA_SUCCESS;
62 fw->hccr = RD_REG_WORD(&reg->hccr);
63
64 /* Pause RISC. */
65 WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
66 if (IS_QLA2300(ha)) {
67 for (cnt = 30000;
68 (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
69 rval == QLA_SUCCESS; cnt--) {
70 if (cnt)
71 udelay(100);
72 else
73 rval = QLA_FUNCTION_TIMEOUT;
74 }
75 } else {
76 RD_REG_WORD(&reg->hccr); /* PCI Posting. */
77 udelay(10);
78 }
79
80 if (rval == QLA_SUCCESS) {
81 dmp_reg = (uint16_t __iomem *)(reg + 0);
82 for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
83 fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++);
84
85 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10);
86 for (cnt = 0; cnt < sizeof(fw->risc_host_reg) / 2; cnt++)
87 fw->risc_host_reg[cnt] = RD_REG_WORD(dmp_reg++);
88
89 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x40);
90 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
91 fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++);
92
93 WRT_REG_WORD(&reg->ctrl_status, 0x40);
94 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
95 for (cnt = 0; cnt < sizeof(fw->resp_dma_reg) / 2; cnt++)
96 fw->resp_dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
97
98 WRT_REG_WORD(&reg->ctrl_status, 0x50);
99 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
100 for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
101 fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
102
103 WRT_REG_WORD(&reg->ctrl_status, 0x00);
104 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0);
105 for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
106 fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
107
108 WRT_REG_WORD(&reg->pcr, 0x2000);
109 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
110 for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
111 fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++);
112
113 WRT_REG_WORD(&reg->pcr, 0x2200);
114 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
115 for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
116 fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++);
117
118 WRT_REG_WORD(&reg->pcr, 0x2400);
119 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
120 for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
121 fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++);
122
123 WRT_REG_WORD(&reg->pcr, 0x2600);
124 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
125 for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
126 fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++);
127
128 WRT_REG_WORD(&reg->pcr, 0x2800);
129 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
130 for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
131 fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++);
132
133 WRT_REG_WORD(&reg->pcr, 0x2A00);
134 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
135 for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
136 fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++);
137
138 WRT_REG_WORD(&reg->pcr, 0x2C00);
139 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
140 for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
141 fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++);
142
143 WRT_REG_WORD(&reg->pcr, 0x2E00);
144 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
145 for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
146 fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++);
147
148 WRT_REG_WORD(&reg->ctrl_status, 0x10);
149 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
150 for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
151 fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
152
153 WRT_REG_WORD(&reg->ctrl_status, 0x20);
154 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
155 for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
156 fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++);
157
158 WRT_REG_WORD(&reg->ctrl_status, 0x30);
159 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
160 for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
161 fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++);
162
163 /* Reset RISC. */
164 WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
165 for (cnt = 0; cnt < 30000; cnt++) {
166 if ((RD_REG_WORD(&reg->ctrl_status) &
167 CSR_ISP_SOFT_RESET) == 0)
168 break;
169
170 udelay(10);
171 }
172 }
173
174 if (!IS_QLA2300(ha)) {
175 for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
176 rval == QLA_SUCCESS; cnt--) {
177 if (cnt)
178 udelay(100);
179 else
180 rval = QLA_FUNCTION_TIMEOUT;
181 }
182 }
183
184 if (rval == QLA_SUCCESS) {
185 /* Get RISC SRAM. */
186 risc_address = 0x800;
187 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
188 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
189 }
190 for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
191 cnt++, risc_address++) {
192 WRT_MAILBOX_REG(ha, reg, 1, (uint16_t)risc_address);
193 WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
194
195 for (timer = 6000000; timer; timer--) {
196 /* Check for pending interrupts. */
197 stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
198 if (stat & HSR_RISC_INT) {
199 stat &= 0xff;
200
201 if (stat == 0x1 || stat == 0x2) {
202 set_bit(MBX_INTERRUPT,
203 &ha->mbx_cmd_flags);
204
205 mb0 = RD_MAILBOX_REG(ha, reg, 0);
206 mb2 = RD_MAILBOX_REG(ha, reg, 2);
207
208 /* Release mailbox registers. */
209 WRT_REG_WORD(&reg->semaphore, 0);
210 WRT_REG_WORD(&reg->hccr,
211 HCCR_CLR_RISC_INT);
212 RD_REG_WORD(&reg->hccr);
213 break;
214 } else if (stat == 0x10 || stat == 0x11) {
215 set_bit(MBX_INTERRUPT,
216 &ha->mbx_cmd_flags);
217
218 mb0 = RD_MAILBOX_REG(ha, reg, 0);
219 mb2 = RD_MAILBOX_REG(ha, reg, 2);
220
221 WRT_REG_WORD(&reg->hccr,
222 HCCR_CLR_RISC_INT);
223 RD_REG_WORD(&reg->hccr);
224 break;
225 }
226
227 /* clear this intr; it wasn't a mailbox intr */
228 WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
229 RD_REG_WORD(&reg->hccr);
230 }
231 udelay(5);
232 }
233
234 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
235 rval = mb0 & MBS_MASK;
236 fw->risc_ram[cnt] = mb2;
237 } else {
238 rval = QLA_FUNCTION_FAILED;
239 }
240 }
241
242 if (rval == QLA_SUCCESS) {
243 /* Get stack SRAM. */
244 risc_address = 0x10000;
245 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
246 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
247 }
248 for (cnt = 0; cnt < sizeof(fw->stack_ram) / 2 && rval == QLA_SUCCESS;
249 cnt++, risc_address++) {
250 WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
251 WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
252 WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
253
254 for (timer = 6000000; timer; timer--) {
255 /* Check for pending interrupts. */
256 stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
257 if (stat & HSR_RISC_INT) {
258 stat &= 0xff;
259
260 if (stat == 0x1 || stat == 0x2) {
261 set_bit(MBX_INTERRUPT,
262 &ha->mbx_cmd_flags);
263
264 mb0 = RD_MAILBOX_REG(ha, reg, 0);
265 mb2 = RD_MAILBOX_REG(ha, reg, 2);
266
267 /* Release mailbox registers. */
268 WRT_REG_WORD(&reg->semaphore, 0);
269 WRT_REG_WORD(&reg->hccr,
270 HCCR_CLR_RISC_INT);
271 RD_REG_WORD(&reg->hccr);
272 break;
273 } else if (stat == 0x10 || stat == 0x11) {
274 set_bit(MBX_INTERRUPT,
275 &ha->mbx_cmd_flags);
276
277 mb0 = RD_MAILBOX_REG(ha, reg, 0);
278 mb2 = RD_MAILBOX_REG(ha, reg, 2);
279
280 WRT_REG_WORD(&reg->hccr,
281 HCCR_CLR_RISC_INT);
282 RD_REG_WORD(&reg->hccr);
283 break;
284 }
285
286 /* clear this intr; it wasn't a mailbox intr */
287 WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
288 RD_REG_WORD(&reg->hccr);
289 }
290 udelay(5);
291 }
292
293 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
294 rval = mb0 & MBS_MASK;
295 fw->stack_ram[cnt] = mb2;
296 } else {
297 rval = QLA_FUNCTION_FAILED;
298 }
299 }
300
301 if (rval == QLA_SUCCESS) {
302 /* Get data SRAM. */
303 risc_address = 0x11000;
304 data_ram_cnt = ha->fw_memory_size - risc_address + 1;
305 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
306 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
307 }
308 for (cnt = 0; cnt < data_ram_cnt && rval == QLA_SUCCESS;
309 cnt++, risc_address++) {
310 WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
311 WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
312 WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
313
314 for (timer = 6000000; timer; timer--) {
315 /* Check for pending interrupts. */
316 stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
317 if (stat & HSR_RISC_INT) {
318 stat &= 0xff;
319
320 if (stat == 0x1 || stat == 0x2) {
321 set_bit(MBX_INTERRUPT,
322 &ha->mbx_cmd_flags);
323
324 mb0 = RD_MAILBOX_REG(ha, reg, 0);
325 mb2 = RD_MAILBOX_REG(ha, reg, 2);
326
327 /* Release mailbox registers. */
328 WRT_REG_WORD(&reg->semaphore, 0);
329 WRT_REG_WORD(&reg->hccr,
330 HCCR_CLR_RISC_INT);
331 RD_REG_WORD(&reg->hccr);
332 break;
333 } else if (stat == 0x10 || stat == 0x11) {
334 set_bit(MBX_INTERRUPT,
335 &ha->mbx_cmd_flags);
336
337 mb0 = RD_MAILBOX_REG(ha, reg, 0);
338 mb2 = RD_MAILBOX_REG(ha, reg, 2);
339
340 WRT_REG_WORD(&reg->hccr,
341 HCCR_CLR_RISC_INT);
342 RD_REG_WORD(&reg->hccr);
343 break;
344 }
345
346 /* clear this intr; it wasn't a mailbox intr */
347 WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
348 RD_REG_WORD(&reg->hccr);
349 }
350 udelay(5);
351 }
352
353 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
354 rval = mb0 & MBS_MASK;
355 fw->data_ram[cnt] = mb2;
356 } else {
357 rval = QLA_FUNCTION_FAILED;
358 }
359 }
360
361
362 if (rval != QLA_SUCCESS) {
363 qla_printk(KERN_WARNING, ha,
364 "Failed to dump firmware (%x)!!!\n", rval);
365
366 free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
367 ha->fw_dump = NULL;
368 } else {
369 qla_printk(KERN_INFO, ha,
370 "Firmware dump saved to temp buffer (%ld/%p).\n",
371 ha->host_no, ha->fw_dump);
372 }
373
374 qla2300_fw_dump_failed:
375 if (!hardware_locked)
376 spin_unlock_irqrestore(&ha->hardware_lock, flags);
377 }
378
379 /**
380 * qla2300_ascii_fw_dump() - Converts a binary firmware dump to ASCII.
381 * @ha: HA context
382 */
383 void
384 qla2300_ascii_fw_dump(scsi_qla_host_t *ha)
385 {
386 uint32_t cnt;
387 char *uiter;
388 char fw_info[30];
389 struct qla2300_fw_dump *fw;
390 uint32_t data_ram_cnt;
391
392 uiter = ha->fw_dump_buffer;
393 fw = ha->fw_dump;
394
395 qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number,
396 ha->isp_ops.fw_version_str(ha, fw_info));
397
398 qla_uprintf(&uiter, "\n[==>BEG]\n");
399
400 qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr);
401
402 qla_uprintf(&uiter, "PBIU Registers:");
403 for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {
404 if (cnt % 8 == 0) {
405 qla_uprintf(&uiter, "\n");
406 }
407 qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]);
408 }
409
410 qla_uprintf(&uiter, "\n\nReqQ-RspQ-Risc2Host Status registers:");
411 for (cnt = 0; cnt < sizeof (fw->risc_host_reg) / 2; cnt++) {
412 if (cnt % 8 == 0) {
413 qla_uprintf(&uiter, "\n");
414 }
415 qla_uprintf(&uiter, "%04x ", fw->risc_host_reg[cnt]);
416 }
417
418 qla_uprintf(&uiter, "\n\nMailbox Registers:");
419 for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
420 if (cnt % 8 == 0) {
421 qla_uprintf(&uiter, "\n");
422 }
423 qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]);
424 }
425
426 qla_uprintf(&uiter, "\n\nAuto Request Response DMA Registers:");
427 for (cnt = 0; cnt < sizeof (fw->resp_dma_reg) / 2; cnt++) {
428 if (cnt % 8 == 0) {
429 qla_uprintf(&uiter, "\n");
430 }
431 qla_uprintf(&uiter, "%04x ", fw->resp_dma_reg[cnt]);
432 }
433
434 qla_uprintf(&uiter, "\n\nDMA Registers:");
435 for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) {
436 if (cnt % 8 == 0) {
437 qla_uprintf(&uiter, "\n");
438 }
439 qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]);
440 }
441
442 qla_uprintf(&uiter, "\n\nRISC Hardware Registers:");
443 for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) {
444 if (cnt % 8 == 0) {
445 qla_uprintf(&uiter, "\n");
446 }
447 qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]);
448 }
449
450 qla_uprintf(&uiter, "\n\nRISC GP0 Registers:");
451 for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) {
452 if (cnt % 8 == 0) {
453 qla_uprintf(&uiter, "\n");
454 }
455 qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]);
456 }
457
458 qla_uprintf(&uiter, "\n\nRISC GP1 Registers:");
459 for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) {
460 if (cnt % 8 == 0) {
461 qla_uprintf(&uiter, "\n");
462 }
463 qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]);
464 }
465
466 qla_uprintf(&uiter, "\n\nRISC GP2 Registers:");
467 for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) {
468 if (cnt % 8 == 0) {
469 qla_uprintf(&uiter, "\n");
470 }
471 qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]);
472 }
473
474 qla_uprintf(&uiter, "\n\nRISC GP3 Registers:");
475 for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) {
476 if (cnt % 8 == 0) {
477 qla_uprintf(&uiter, "\n");
478 }
479 qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]);
480 }
481
482 qla_uprintf(&uiter, "\n\nRISC GP4 Registers:");
483 for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) {
484 if (cnt % 8 == 0) {
485 qla_uprintf(&uiter, "\n");
486 }
487 qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]);
488 }
489
490 qla_uprintf(&uiter, "\n\nRISC GP5 Registers:");
491 for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) {
492 if (cnt % 8 == 0) {
493 qla_uprintf(&uiter, "\n");
494 }
495 qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]);
496 }
497
498 qla_uprintf(&uiter, "\n\nRISC GP6 Registers:");
499 for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) {
500 if (cnt % 8 == 0) {
501 qla_uprintf(&uiter, "\n");
502 }
503 qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]);
504 }
505
506 qla_uprintf(&uiter, "\n\nRISC GP7 Registers:");
507 for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {
508 if (cnt % 8 == 0) {
509 qla_uprintf(&uiter, "\n");
510 }
511 qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]);
512 }
513
514 qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:");
515 for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
516 if (cnt % 8 == 0) {
517 qla_uprintf(&uiter, "\n");
518 }
519 qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]);
520 }
521
522 qla_uprintf(&uiter, "\n\nFPM B0 Registers:");
523 for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {
524 if (cnt % 8 == 0) {
525 qla_uprintf(&uiter, "\n");
526 }
527 qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]);
528 }
529
530 qla_uprintf(&uiter, "\n\nFPM B1 Registers:");
531 for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {
532 if (cnt % 8 == 0) {
533 qla_uprintf(&uiter, "\n");
534 }
535 qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]);
536 }
537
538 qla_uprintf(&uiter, "\n\nCode RAM Dump:");
539 for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
540 if (cnt % 8 == 0) {
541 qla_uprintf(&uiter, "\n%04x: ", cnt + 0x0800);
542 }
543 qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]);
544 }
545
546 qla_uprintf(&uiter, "\n\nStack RAM Dump:");
547 for (cnt = 0; cnt < sizeof (fw->stack_ram) / 2; cnt++) {
548 if (cnt % 8 == 0) {
549 qla_uprintf(&uiter, "\n%05x: ", cnt + 0x10000);
550 }
551 qla_uprintf(&uiter, "%04x ", fw->stack_ram[cnt]);
552 }
553
554 qla_uprintf(&uiter, "\n\nData RAM Dump:");
555 data_ram_cnt = ha->fw_memory_size - 0x11000 + 1;
556 for (cnt = 0; cnt < data_ram_cnt; cnt++) {
557 if (cnt % 8 == 0) {
558 qla_uprintf(&uiter, "\n%05x: ", cnt + 0x11000);
559 }
560 qla_uprintf(&uiter, "%04x ", fw->data_ram[cnt]);
561 }
562
563 qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump.");
564 }
565
566 /**
567 * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware.
568 * @ha: HA context
569 * @hardware_locked: Called with the hardware_lock
570 */
571 void
572 qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
573 {
574 int rval;
575 uint32_t cnt, timer;
576 uint16_t risc_address;
577 uint16_t mb0, mb2;
578 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
579 uint16_t __iomem *dmp_reg;
580 unsigned long flags;
581 struct qla2100_fw_dump *fw;
582
583 risc_address = 0;
584 mb0 = mb2 = 0;
585 flags = 0;
586
587 if (!hardware_locked)
588 spin_lock_irqsave(&ha->hardware_lock, flags);
589
590 if (ha->fw_dump != NULL) {
591 qla_printk(KERN_WARNING, ha,
592 "Firmware has been previously dumped (%p) -- ignoring "
593 "request...\n", ha->fw_dump);
594 goto qla2100_fw_dump_failed;
595 }
596
597 /* Allocate (large) dump buffer. */
598 ha->fw_dump_order = get_order(sizeof(struct qla2100_fw_dump));
599 ha->fw_dump = (struct qla2100_fw_dump *) __get_free_pages(GFP_ATOMIC,
600 ha->fw_dump_order);
601 if (ha->fw_dump == NULL) {
602 qla_printk(KERN_WARNING, ha,
603 "Unable to allocated memory for firmware dump (%d/%Zd).\n",
604 ha->fw_dump_order, sizeof(struct qla2100_fw_dump));
605 goto qla2100_fw_dump_failed;
606 }
607 fw = ha->fw_dump;
608
609 rval = QLA_SUCCESS;
610 fw->hccr = RD_REG_WORD(&reg->hccr);
611
612 /* Pause RISC. */
613 WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
614 for (cnt = 30000; (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
615 rval == QLA_SUCCESS; cnt--) {
616 if (cnt)
617 udelay(100);
618 else
619 rval = QLA_FUNCTION_TIMEOUT;
620 }
621 if (rval == QLA_SUCCESS) {
622 dmp_reg = (uint16_t __iomem *)(reg + 0);
623 for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
624 fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++);
625
626 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10);
627 for (cnt = 0; cnt < ha->mbx_count; cnt++) {
628 if (cnt == 8) {
629 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xe0);
630 }
631 fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++);
632 }
633
634 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x20);
635 for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
636 fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
637
638 WRT_REG_WORD(&reg->ctrl_status, 0x00);
639 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0);
640 for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
641 fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
642
643 WRT_REG_WORD(&reg->pcr, 0x2000);
644 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
645 for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
646 fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++);
647
648 WRT_REG_WORD(&reg->pcr, 0x2100);
649 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
650 for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
651 fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++);
652
653 WRT_REG_WORD(&reg->pcr, 0x2200);
654 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
655 for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
656 fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++);
657
658 WRT_REG_WORD(&reg->pcr, 0x2300);
659 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
660 for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
661 fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++);
662
663 WRT_REG_WORD(&reg->pcr, 0x2400);
664 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
665 for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
666 fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++);
667
668 WRT_REG_WORD(&reg->pcr, 0x2500);
669 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
670 for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
671 fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++);
672
673 WRT_REG_WORD(&reg->pcr, 0x2600);
674 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
675 for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
676 fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++);
677
678 WRT_REG_WORD(&reg->pcr, 0x2700);
679 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
680 for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
681 fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++);
682
683 WRT_REG_WORD(&reg->ctrl_status, 0x10);
684 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
685 for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
686 fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
687
688 WRT_REG_WORD(&reg->ctrl_status, 0x20);
689 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
690 for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
691 fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++);
692
693 WRT_REG_WORD(&reg->ctrl_status, 0x30);
694 dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
695 for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
696 fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++);
697
698 /* Reset the ISP. */
699 WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
700 }
701
702 for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
703 rval == QLA_SUCCESS; cnt--) {
704 if (cnt)
705 udelay(100);
706 else
707 rval = QLA_FUNCTION_TIMEOUT;
708 }
709
710 /* Pause RISC. */
711 if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&
712 (RD_REG_WORD(&reg->mctr) & (BIT_1 | BIT_0)) != 0))) {
713
714 WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
715 for (cnt = 30000;
716 (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
717 rval == QLA_SUCCESS; cnt--) {
718 if (cnt)
719 udelay(100);
720 else
721 rval = QLA_FUNCTION_TIMEOUT;
722 }
723 if (rval == QLA_SUCCESS) {
724 /* Set memory configuration and timing. */
725 if (IS_QLA2100(ha))
726 WRT_REG_WORD(&reg->mctr, 0xf1);
727 else
728 WRT_REG_WORD(&reg->mctr, 0xf2);
729 RD_REG_WORD(&reg->mctr); /* PCI Posting. */
730
731 /* Release RISC. */
732 WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
733 }
734 }
735
736 if (rval == QLA_SUCCESS) {
737 /* Get RISC SRAM. */
738 risc_address = 0x1000;
739 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
740 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
741 }
742 for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
743 cnt++, risc_address++) {
744 WRT_MAILBOX_REG(ha, reg, 1, risc_address);
745 WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
746
747 for (timer = 6000000; timer != 0; timer--) {
748 /* Check for pending interrupts. */
749 if (RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) {
750 if (RD_REG_WORD(&reg->semaphore) & BIT_0) {
751 set_bit(MBX_INTERRUPT,
752 &ha->mbx_cmd_flags);
753
754 mb0 = RD_MAILBOX_REG(ha, reg, 0);
755 mb2 = RD_MAILBOX_REG(ha, reg, 2);
756
757 WRT_REG_WORD(&reg->semaphore, 0);
758 WRT_REG_WORD(&reg->hccr,
759 HCCR_CLR_RISC_INT);
760 RD_REG_WORD(&reg->hccr);
761 break;
762 }
763 WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
764 RD_REG_WORD(&reg->hccr);
765 }
766 udelay(5);
767 }
768
769 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
770 rval = mb0 & MBS_MASK;
771 fw->risc_ram[cnt] = mb2;
772 } else {
773 rval = QLA_FUNCTION_FAILED;
774 }
775 }
776
777 if (rval != QLA_SUCCESS) {
778 qla_printk(KERN_WARNING, ha,
779 "Failed to dump firmware (%x)!!!\n", rval);
780
781 free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
782 ha->fw_dump = NULL;
783 } else {
784 qla_printk(KERN_INFO, ha,
785 "Firmware dump saved to temp buffer (%ld/%p).\n",
786 ha->host_no, ha->fw_dump);
787 }
788
789 qla2100_fw_dump_failed:
790 if (!hardware_locked)
791 spin_unlock_irqrestore(&ha->hardware_lock, flags);
792 }
793
794 /**
795 * qla2100_ascii_fw_dump() - Converts a binary firmware dump to ASCII.
796 * @ha: HA context
797 */
798 void
799 qla2100_ascii_fw_dump(scsi_qla_host_t *ha)
800 {
801 uint32_t cnt;
802 char *uiter;
803 char fw_info[30];
804 struct qla2100_fw_dump *fw;
805
806 uiter = ha->fw_dump_buffer;
807 fw = ha->fw_dump;
808
809 qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number,
810 ha->isp_ops.fw_version_str(ha, fw_info));
811
812 qla_uprintf(&uiter, "\n[==>BEG]\n");
813
814 qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr);
815
816 qla_uprintf(&uiter, "PBIU Registers:");
817 for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {
818 if (cnt % 8 == 0) {
819 qla_uprintf(&uiter, "\n");
820 }
821 qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]);
822 }
823
824 qla_uprintf(&uiter, "\n\nMailbox Registers:");
825 for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
826 if (cnt % 8 == 0) {
827 qla_uprintf(&uiter, "\n");
828 }
829 qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]);
830 }
831
832 qla_uprintf(&uiter, "\n\nDMA Registers:");
833 for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) {
834 if (cnt % 8 == 0) {
835 qla_uprintf(&uiter, "\n");
836 }
837 qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]);
838 }
839
840 qla_uprintf(&uiter, "\n\nRISC Hardware Registers:");
841 for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) {
842 if (cnt % 8 == 0) {
843 qla_uprintf(&uiter, "\n");
844 }
845 qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]);
846 }
847
848 qla_uprintf(&uiter, "\n\nRISC GP0 Registers:");
849 for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) {
850 if (cnt % 8 == 0) {
851 qla_uprintf(&uiter, "\n");
852 }
853 qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]);
854 }
855
856 qla_uprintf(&uiter, "\n\nRISC GP1 Registers:");
857 for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) {
858 if (cnt % 8 == 0) {
859 qla_uprintf(&uiter, "\n");
860 }
861 qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]);
862 }
863
864 qla_uprintf(&uiter, "\n\nRISC GP2 Registers:");
865 for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) {
866 if (cnt % 8 == 0) {
867 qla_uprintf(&uiter, "\n");
868 }
869 qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]);
870 }
871
872 qla_uprintf(&uiter, "\n\nRISC GP3 Registers:");
873 for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) {
874 if (cnt % 8 == 0) {
875 qla_uprintf(&uiter, "\n");
876 }
877 qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]);
878 }
879
880 qla_uprintf(&uiter, "\n\nRISC GP4 Registers:");
881 for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) {
882 if (cnt % 8 == 0) {
883 qla_uprintf(&uiter, "\n");
884 }
885 qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]);
886 }
887
888 qla_uprintf(&uiter, "\n\nRISC GP5 Registers:");
889 for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) {
890 if (cnt % 8 == 0) {
891 qla_uprintf(&uiter, "\n");
892 }
893 qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]);
894 }
895
896 qla_uprintf(&uiter, "\n\nRISC GP6 Registers:");
897 for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) {
898 if (cnt % 8 == 0) {
899 qla_uprintf(&uiter, "\n");
900 }
901 qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]);
902 }
903
904 qla_uprintf(&uiter, "\n\nRISC GP7 Registers:");
905 for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {
906 if (cnt % 8 == 0) {
907 qla_uprintf(&uiter, "\n");
908 }
909 qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]);
910 }
911
912 qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:");
913 for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
914 if (cnt % 8 == 0) {
915 qla_uprintf(&uiter, "\n");
916 }
917 qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]);
918 }
919
920 qla_uprintf(&uiter, "\n\nFPM B0 Registers:");
921 for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {
922 if (cnt % 8 == 0) {
923 qla_uprintf(&uiter, "\n");
924 }
925 qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]);
926 }
927
928 qla_uprintf(&uiter, "\n\nFPM B1 Registers:");
929 for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {
930 if (cnt % 8 == 0) {
931 qla_uprintf(&uiter, "\n");
932 }
933 qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]);
934 }
935
936 qla_uprintf(&uiter, "\n\nRISC SRAM:");
937 for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
938 if (cnt % 8 == 0) {
939 qla_uprintf(&uiter, "\n%04x: ", cnt + 0x1000);
940 }
941 qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]);
942 }
943
944 qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump.");
945
946 return;
947 }
948
949 static int
950 qla_uprintf(char **uiter, char *fmt, ...)
951 {
952 int iter, len;
953 char buf[128];
954 va_list args;
955
956 va_start(args, fmt);
957 len = vsprintf(buf, fmt, args);
958 va_end(args);
959
960 for (iter = 0; iter < len; iter++, *uiter += 1)
961 *uiter[0] = buf[iter];
962
963 return (len);
964 }
965
966
967 void
968 qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
969 {
970 int rval;
971 uint32_t cnt, timer;
972 uint32_t risc_address;
973 uint16_t mb[4], wd;
974
975 uint32_t stat;
976 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
977 uint32_t __iomem *dmp_reg;
978 uint32_t *iter_reg;
979 uint16_t __iomem *mbx_reg;
980 unsigned long flags;
981 struct qla24xx_fw_dump *fw;
982 uint32_t ext_mem_cnt;
983
984 risc_address = ext_mem_cnt = 0;
985 memset(mb, 0, sizeof(mb));
986 flags = 0;
987
988 if (!hardware_locked)
989 spin_lock_irqsave(&ha->hardware_lock, flags);
990
991 if (!ha->fw_dump24) {
992 qla_printk(KERN_WARNING, ha,
993 "No buffer available for dump!!!\n");
994 goto qla24xx_fw_dump_failed;
995 }
996
997 if (ha->fw_dumped) {
998 qla_printk(KERN_WARNING, ha,
999 "Firmware has been previously dumped (%p) -- ignoring "
1000 "request...\n", ha->fw_dump24);
1001 goto qla24xx_fw_dump_failed;
1002 }
1003 fw = (struct qla24xx_fw_dump *) ha->fw_dump24;
1004
1005 rval = QLA_SUCCESS;
1006 fw->hccr = RD_REG_DWORD(&reg->hccr);
1007
1008 /* Pause RISC. */
1009 if ((fw->hccr & HCCRX_RISC_PAUSE) == 0) {
1010 WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET |
1011 HCCRX_CLR_HOST_INT);
1012 RD_REG_DWORD(&reg->hccr); /* PCI Posting. */
1013 WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_PAUSE);
1014 for (cnt = 30000;
1015 (RD_REG_DWORD(&reg->hccr) & HCCRX_RISC_PAUSE) == 0 &&
1016 rval == QLA_SUCCESS; cnt--) {
1017 if (cnt)
1018 udelay(100);
1019 else
1020 rval = QLA_FUNCTION_TIMEOUT;
1021 }
1022 }
1023
1024 /* Disable interrupts. */
1025 WRT_REG_DWORD(&reg->ictrl, 0);
1026 RD_REG_DWORD(&reg->ictrl);
1027
1028 if (rval == QLA_SUCCESS) {
1029 /* Host interface registers. */
1030 dmp_reg = (uint32_t __iomem *)(reg + 0);
1031 for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++)
1032 fw->host_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1033
1034 /* Mailbox registers. */
1035 mbx_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
1036 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
1037 fw->mailbox_reg[cnt] = RD_REG_WORD(mbx_reg++);
1038
1039 /* Transfer sequence registers. */
1040 iter_reg = fw->xseq_gp_reg;
1041 WRT_REG_DWORD(&reg->iobase_addr, 0xBF00);
1042 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1043 for (cnt = 0; cnt < 16; cnt++)
1044 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1045
1046 WRT_REG_DWORD(&reg->iobase_addr, 0xBF10);
1047 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1048 for (cnt = 0; cnt < 16; cnt++)
1049 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1050
1051 WRT_REG_DWORD(&reg->iobase_addr, 0xBF20);
1052 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1053 for (cnt = 0; cnt < 16; cnt++)
1054 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1055
1056 WRT_REG_DWORD(&reg->iobase_addr, 0xBF30);
1057 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1058 for (cnt = 0; cnt < 16; cnt++)
1059 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1060
1061 WRT_REG_DWORD(&reg->iobase_addr, 0xBF40);
1062 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1063 for (cnt = 0; cnt < 16; cnt++)
1064 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1065
1066 WRT_REG_DWORD(&reg->iobase_addr, 0xBF50);
1067 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1068 for (cnt = 0; cnt < 16; cnt++)
1069 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1070
1071 WRT_REG_DWORD(&reg->iobase_addr, 0xBF60);
1072 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1073 for (cnt = 0; cnt < 16; cnt++)
1074 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1075
1076 WRT_REG_DWORD(&reg->iobase_addr, 0xBF70);
1077 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1078 for (cnt = 0; cnt < 16; cnt++)
1079 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1080
1081 WRT_REG_DWORD(&reg->iobase_addr, 0xBFE0);
1082 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1083 for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++)
1084 fw->xseq_0_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1085
1086 WRT_REG_DWORD(&reg->iobase_addr, 0xBFF0);
1087 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1088 for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++)
1089 fw->xseq_1_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1090
1091 /* Receive sequence registers. */
1092 iter_reg = fw->rseq_gp_reg;
1093 WRT_REG_DWORD(&reg->iobase_addr, 0xFF00);
1094 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1095 for (cnt = 0; cnt < 16; cnt++)
1096 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1097
1098 WRT_REG_DWORD(&reg->iobase_addr, 0xFF10);
1099 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1100 for (cnt = 0; cnt < 16; cnt++)
1101 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1102
1103 WRT_REG_DWORD(&reg->iobase_addr, 0xFF20);
1104 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1105 for (cnt = 0; cnt < 16; cnt++)
1106 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1107
1108 WRT_REG_DWORD(&reg->iobase_addr, 0xFF30);
1109 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1110 for (cnt = 0; cnt < 16; cnt++)
1111 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1112
1113 WRT_REG_DWORD(&reg->iobase_addr, 0xFF40);
1114 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1115 for (cnt = 0; cnt < 16; cnt++)
1116 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1117
1118 WRT_REG_DWORD(&reg->iobase_addr, 0xFF50);
1119 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1120 for (cnt = 0; cnt < 16; cnt++)
1121 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1122
1123 WRT_REG_DWORD(&reg->iobase_addr, 0xFF60);
1124 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1125 for (cnt = 0; cnt < 16; cnt++)
1126 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1127
1128 WRT_REG_DWORD(&reg->iobase_addr, 0xFF70);
1129 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1130 for (cnt = 0; cnt < 16; cnt++)
1131 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1132
1133 WRT_REG_DWORD(&reg->iobase_addr, 0xFFD0);
1134 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1135 for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++)
1136 fw->rseq_0_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1137
1138 WRT_REG_DWORD(&reg->iobase_addr, 0xFFE0);
1139 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1140 for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++)
1141 fw->rseq_1_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1142
1143 WRT_REG_DWORD(&reg->iobase_addr, 0xFFF0);
1144 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1145 for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++)
1146 fw->rseq_2_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1147
1148 /* Command DMA registers. */
1149 WRT_REG_DWORD(&reg->iobase_addr, 0x7100);
1150 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1151 for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++)
1152 fw->cmd_dma_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1153
1154 /* Queues. */
1155 iter_reg = fw->req0_dma_reg;
1156 WRT_REG_DWORD(&reg->iobase_addr, 0x7200);
1157 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1158 for (cnt = 0; cnt < 8; cnt++)
1159 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1160
1161 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
1162 for (cnt = 0; cnt < 7; cnt++)
1163 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1164
1165 iter_reg = fw->resp0_dma_reg;
1166 WRT_REG_DWORD(&reg->iobase_addr, 0x7300);
1167 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1168 for (cnt = 0; cnt < 8; cnt++)
1169 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1170
1171 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
1172 for (cnt = 0; cnt < 7; cnt++)
1173 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1174
1175 iter_reg = fw->req1_dma_reg;
1176 WRT_REG_DWORD(&reg->iobase_addr, 0x7400);
1177 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1178 for (cnt = 0; cnt < 8; cnt++)
1179 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1180
1181 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
1182 for (cnt = 0; cnt < 7; cnt++)
1183 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1184
1185 /* Transmit DMA registers. */
1186 iter_reg = fw->xmt0_dma_reg;
1187 WRT_REG_DWORD(&reg->iobase_addr, 0x7600);
1188 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1189 for (cnt = 0; cnt < 16; cnt++)
1190 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1191
1192 WRT_REG_DWORD(&reg->iobase_addr, 0x7610);
1193 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1194 for (cnt = 0; cnt < 16; cnt++)
1195 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1196
1197 iter_reg = fw->xmt1_dma_reg;
1198 WRT_REG_DWORD(&reg->iobase_addr, 0x7620);
1199 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1200 for (cnt = 0; cnt < 16; cnt++)
1201 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1202
1203 WRT_REG_DWORD(&reg->iobase_addr, 0x7630);
1204 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1205 for (cnt = 0; cnt < 16; cnt++)
1206 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1207
1208 iter_reg = fw->xmt2_dma_reg;
1209 WRT_REG_DWORD(&reg->iobase_addr, 0x7640);
1210 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1211 for (cnt = 0; cnt < 16; cnt++)
1212 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1213
1214 WRT_REG_DWORD(&reg->iobase_addr, 0x7650);
1215 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1216 for (cnt = 0; cnt < 16; cnt++)
1217 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1218
1219 iter_reg = fw->xmt3_dma_reg;
1220 WRT_REG_DWORD(&reg->iobase_addr, 0x7660);
1221 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1222 for (cnt = 0; cnt < 16; cnt++)
1223 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1224
1225 WRT_REG_DWORD(&reg->iobase_addr, 0x7670);
1226 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1227 for (cnt = 0; cnt < 16; cnt++)
1228 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1229
1230 iter_reg = fw->xmt4_dma_reg;
1231 WRT_REG_DWORD(&reg->iobase_addr, 0x7680);
1232 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1233 for (cnt = 0; cnt < 16; cnt++)
1234 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1235
1236 WRT_REG_DWORD(&reg->iobase_addr, 0x7690);
1237 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1238 for (cnt = 0; cnt < 16; cnt++)
1239 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1240
1241 WRT_REG_DWORD(&reg->iobase_addr, 0x76A0);
1242 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1243 for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++)
1244 fw->xmt_data_dma_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1245
1246 /* Receive DMA registers. */
1247 iter_reg = fw->rcvt0_data_dma_reg;
1248 WRT_REG_DWORD(&reg->iobase_addr, 0x7700);
1249 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1250 for (cnt = 0; cnt < 16; cnt++)
1251 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1252
1253 WRT_REG_DWORD(&reg->iobase_addr, 0x7710);
1254 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1255 for (cnt = 0; cnt < 16; cnt++)
1256 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1257
1258 iter_reg = fw->rcvt1_data_dma_reg;
1259 WRT_REG_DWORD(&reg->iobase_addr, 0x7720);
1260 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1261 for (cnt = 0; cnt < 16; cnt++)
1262 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1263
1264 WRT_REG_DWORD(&reg->iobase_addr, 0x7730);
1265 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1266 for (cnt = 0; cnt < 16; cnt++)
1267 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1268
1269 /* RISC registers. */
1270 iter_reg = fw->risc_gp_reg;
1271 WRT_REG_DWORD(&reg->iobase_addr, 0x0F00);
1272 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1273 for (cnt = 0; cnt < 16; cnt++)
1274 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1275
1276 WRT_REG_DWORD(&reg->iobase_addr, 0x0F10);
1277 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1278 for (cnt = 0; cnt < 16; cnt++)
1279 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1280
1281 WRT_REG_DWORD(&reg->iobase_addr, 0x0F20);
1282 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1283 for (cnt = 0; cnt < 16; cnt++)
1284 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1285
1286 WRT_REG_DWORD(&reg->iobase_addr, 0x0F30);
1287 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1288 for (cnt = 0; cnt < 16; cnt++)
1289 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1290
1291 WRT_REG_DWORD(&reg->iobase_addr, 0x0F40);
1292 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1293 for (cnt = 0; cnt < 16; cnt++)
1294 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1295
1296 WRT_REG_DWORD(&reg->iobase_addr, 0x0F50);
1297 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1298 for (cnt = 0; cnt < 16; cnt++)
1299 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1300
1301 WRT_REG_DWORD(&reg->iobase_addr, 0x0F60);
1302 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1303 for (cnt = 0; cnt < 16; cnt++)
1304 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1305
1306 WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
1307 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1308 for (cnt = 0; cnt < 16; cnt++)
1309 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1310
1311 WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
1312 RD_REG_DWORD(&reg->iobase_addr);
1313 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1314 WRT_REG_DWORD(dmp_reg, 0xB0000000);
1315 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1316 fw->shadow_reg[0] = RD_REG_DWORD(dmp_reg);
1317
1318 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1319 WRT_REG_DWORD(dmp_reg, 0xB0100000);
1320 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1321 fw->shadow_reg[1] = RD_REG_DWORD(dmp_reg);
1322
1323 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1324 WRT_REG_DWORD(dmp_reg, 0xB0200000);
1325 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1326 fw->shadow_reg[2] = RD_REG_DWORD(dmp_reg);
1327
1328 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1329 WRT_REG_DWORD(dmp_reg, 0xB0300000);
1330 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1331 fw->shadow_reg[3] = RD_REG_DWORD(dmp_reg);
1332
1333 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1334 WRT_REG_DWORD(dmp_reg, 0xB0400000);
1335 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1336 fw->shadow_reg[4] = RD_REG_DWORD(dmp_reg);
1337
1338 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1339 WRT_REG_DWORD(dmp_reg, 0xB0500000);
1340 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1341 fw->shadow_reg[5] = RD_REG_DWORD(dmp_reg);
1342
1343 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1344 WRT_REG_DWORD(dmp_reg, 0xB0600000);
1345 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1346 fw->shadow_reg[6] = RD_REG_DWORD(dmp_reg);
1347
1348 /* Local memory controller registers. */
1349 iter_reg = fw->lmc_reg;
1350 WRT_REG_DWORD(&reg->iobase_addr, 0x3000);
1351 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1352 for (cnt = 0; cnt < 16; cnt++)
1353 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1354
1355 WRT_REG_DWORD(&reg->iobase_addr, 0x3010);
1356 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1357 for (cnt = 0; cnt < 16; cnt++)
1358 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1359
1360 WRT_REG_DWORD(&reg->iobase_addr, 0x3020);
1361 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1362 for (cnt = 0; cnt < 16; cnt++)
1363 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1364
1365 WRT_REG_DWORD(&reg->iobase_addr, 0x3030);
1366 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1367 for (cnt = 0; cnt < 16; cnt++)
1368 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1369
1370 WRT_REG_DWORD(&reg->iobase_addr, 0x3040);
1371 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1372 for (cnt = 0; cnt < 16; cnt++)
1373 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1374
1375 WRT_REG_DWORD(&reg->iobase_addr, 0x3050);
1376 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1377 for (cnt = 0; cnt < 16; cnt++)
1378 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1379
1380 WRT_REG_DWORD(&reg->iobase_addr, 0x3060);
1381 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1382 for (cnt = 0; cnt < 16; cnt++)
1383 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1384
1385 /* Fibre Protocol Module registers. */
1386 iter_reg = fw->fpm_hdw_reg;
1387 WRT_REG_DWORD(&reg->iobase_addr, 0x4000);
1388 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1389 for (cnt = 0; cnt < 16; cnt++)
1390 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1391
1392 WRT_REG_DWORD(&reg->iobase_addr, 0x4010);
1393 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1394 for (cnt = 0; cnt < 16; cnt++)
1395 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1396
1397 WRT_REG_DWORD(&reg->iobase_addr, 0x4020);
1398 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1399 for (cnt = 0; cnt < 16; cnt++)
1400 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1401
1402 WRT_REG_DWORD(&reg->iobase_addr, 0x4030);
1403 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1404 for (cnt = 0; cnt < 16; cnt++)
1405 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1406
1407 WRT_REG_DWORD(&reg->iobase_addr, 0x4040);
1408 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1409 for (cnt = 0; cnt < 16; cnt++)
1410 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1411
1412 WRT_REG_DWORD(&reg->iobase_addr, 0x4050);
1413 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1414 for (cnt = 0; cnt < 16; cnt++)
1415 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1416
1417 WRT_REG_DWORD(&reg->iobase_addr, 0x4060);
1418 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1419 for (cnt = 0; cnt < 16; cnt++)
1420 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1421
1422 WRT_REG_DWORD(&reg->iobase_addr, 0x4070);
1423 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1424 for (cnt = 0; cnt < 16; cnt++)
1425 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1426
1427 WRT_REG_DWORD(&reg->iobase_addr, 0x4080);
1428 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1429 for (cnt = 0; cnt < 16; cnt++)
1430 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1431
1432 WRT_REG_DWORD(&reg->iobase_addr, 0x4090);
1433 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1434 for (cnt = 0; cnt < 16; cnt++)
1435 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1436
1437 WRT_REG_DWORD(&reg->iobase_addr, 0x40A0);
1438 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1439 for (cnt = 0; cnt < 16; cnt++)
1440 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1441
1442 WRT_REG_DWORD(&reg->iobase_addr, 0x40B0);
1443 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1444 for (cnt = 0; cnt < 16; cnt++)
1445 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1446
1447 /* Frame Buffer registers. */
1448 iter_reg = fw->fb_hdw_reg;
1449 WRT_REG_DWORD(&reg->iobase_addr, 0x6000);
1450 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1451 for (cnt = 0; cnt < 16; cnt++)
1452 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1453
1454 WRT_REG_DWORD(&reg->iobase_addr, 0x6010);
1455 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1456 for (cnt = 0; cnt < 16; cnt++)
1457 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1458
1459 WRT_REG_DWORD(&reg->iobase_addr, 0x6020);
1460 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1461 for (cnt = 0; cnt < 16; cnt++)
1462 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1463
1464 WRT_REG_DWORD(&reg->iobase_addr, 0x6030);
1465 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1466 for (cnt = 0; cnt < 16; cnt++)
1467 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1468
1469 WRT_REG_DWORD(&reg->iobase_addr, 0x6040);
1470 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1471 for (cnt = 0; cnt < 16; cnt++)
1472 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1473
1474 WRT_REG_DWORD(&reg->iobase_addr, 0x6100);
1475 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1476 for (cnt = 0; cnt < 16; cnt++)
1477 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1478
1479 WRT_REG_DWORD(&reg->iobase_addr, 0x6130);
1480 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1481 for (cnt = 0; cnt < 16; cnt++)
1482 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1483
1484 WRT_REG_DWORD(&reg->iobase_addr, 0x6150);
1485 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1486 for (cnt = 0; cnt < 16; cnt++)
1487 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1488
1489 WRT_REG_DWORD(&reg->iobase_addr, 0x6170);
1490 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1491 for (cnt = 0; cnt < 16; cnt++)
1492 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1493
1494 WRT_REG_DWORD(&reg->iobase_addr, 0x6190);
1495 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1496 for (cnt = 0; cnt < 16; cnt++)
1497 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1498
1499 WRT_REG_DWORD(&reg->iobase_addr, 0x61B0);
1500 dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1501 for (cnt = 0; cnt < 16; cnt++)
1502 *iter_reg++ = RD_REG_DWORD(dmp_reg++);
1503
1504 /* Reset RISC. */
1505 WRT_REG_DWORD(&reg->ctrl_status,
1506 CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
1507 for (cnt = 0; cnt < 30000; cnt++) {
1508 if ((RD_REG_DWORD(&reg->ctrl_status) &
1509 CSRX_DMA_ACTIVE) == 0)
1510 break;
1511
1512 udelay(10);
1513 }
1514
1515 WRT_REG_DWORD(&reg->ctrl_status,
1516 CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
1517 pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
1518
1519 udelay(100);
1520 /* Wait for firmware to complete NVRAM accesses. */
1521 mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1522 for (cnt = 10000 ; cnt && mb[0]; cnt--) {
1523 udelay(5);
1524 mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1525 barrier();
1526 }
1527
1528 /* Wait for soft-reset to complete. */
1529 for (cnt = 0; cnt < 30000; cnt++) {
1530 if ((RD_REG_DWORD(&reg->ctrl_status) &
1531 CSRX_ISP_SOFT_RESET) == 0)
1532 break;
1533
1534 udelay(10);
1535 }
1536 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
1537 RD_REG_DWORD(&reg->hccr); /* PCI Posting. */
1538 }
1539
1540 for (cnt = 30000; RD_REG_WORD(&reg->mailbox0) != 0 &&
1541 rval == QLA_SUCCESS; cnt--) {
1542 if (cnt)
1543 udelay(100);
1544 else
1545 rval = QLA_FUNCTION_TIMEOUT;
1546 }
1547
1548 /* Memory. */
1549 if (rval == QLA_SUCCESS) {
1550 /* Code RAM. */
1551 risc_address = 0x20000;
1552 WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_EXTENDED);
1553 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
1554 }
1555 for (cnt = 0; cnt < sizeof(fw->code_ram) / 4 && rval == QLA_SUCCESS;
1556 cnt++, risc_address++) {
1557 WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
1558 WRT_REG_WORD(&reg->mailbox8, MSW(risc_address));
1559 RD_REG_WORD(&reg->mailbox8);
1560 WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
1561
1562 for (timer = 6000000; timer; timer--) {
1563 /* Check for pending interrupts. */
1564 stat = RD_REG_DWORD(&reg->host_status);
1565 if (stat & HSRX_RISC_INT) {
1566 stat &= 0xff;
1567
1568 if (stat == 0x1 || stat == 0x2 ||
1569 stat == 0x10 || stat == 0x11) {
1570 set_bit(MBX_INTERRUPT,
1571 &ha->mbx_cmd_flags);
1572
1573 mb[0] = RD_REG_WORD(&reg->mailbox0);
1574 mb[2] = RD_REG_WORD(&reg->mailbox2);
1575 mb[3] = RD_REG_WORD(&reg->mailbox3);
1576
1577 WRT_REG_DWORD(&reg->hccr,
1578 HCCRX_CLR_RISC_INT);
1579 RD_REG_DWORD(&reg->hccr);
1580 break;
1581 }
1582
1583 /* Clear this intr; it wasn't a mailbox intr */
1584 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
1585 RD_REG_DWORD(&reg->hccr);
1586 }
1587 udelay(5);
1588 }
1589
1590 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
1591 rval = mb[0] & MBS_MASK;
1592 fw->code_ram[cnt] = (mb[3] << 16) | mb[2];
1593 } else {
1594 rval = QLA_FUNCTION_FAILED;
1595 }
1596 }
1597
1598 if (rval == QLA_SUCCESS) {
1599 /* External Memory. */
1600 risc_address = 0x100000;
1601 ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1;
1602 WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_EXTENDED);
1603 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
1604 }
1605 for (cnt = 0; cnt < ext_mem_cnt && rval == QLA_SUCCESS;
1606 cnt++, risc_address++) {
1607 WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
1608 WRT_REG_WORD(&reg->mailbox8, MSW(risc_address));
1609 RD_REG_WORD(&reg->mailbox8);
1610 WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
1611
1612 for (timer = 6000000; timer; timer--) {
1613 /* Check for pending interrupts. */
1614 stat = RD_REG_DWORD(&reg->host_status);
1615 if (stat & HSRX_RISC_INT) {
1616 stat &= 0xff;
1617
1618 if (stat == 0x1 || stat == 0x2 ||
1619 stat == 0x10 || stat == 0x11) {
1620 set_bit(MBX_INTERRUPT,
1621 &ha->mbx_cmd_flags);
1622
1623 mb[0] = RD_REG_WORD(&reg->mailbox0);
1624 mb[2] = RD_REG_WORD(&reg->mailbox2);
1625 mb[3] = RD_REG_WORD(&reg->mailbox3);
1626
1627 WRT_REG_DWORD(&reg->hccr,
1628 HCCRX_CLR_RISC_INT);
1629 RD_REG_DWORD(&reg->hccr);
1630 break;
1631 }
1632
1633 /* Clear this intr; it wasn't a mailbox intr */
1634 WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
1635 RD_REG_DWORD(&reg->hccr);
1636 }
1637 udelay(5);
1638 }
1639
1640 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
1641 rval = mb[0] & MBS_MASK;
1642 fw->ext_mem[cnt] = (mb[3] << 16) | mb[2];
1643 } else {
1644 rval = QLA_FUNCTION_FAILED;
1645 }
1646 }
1647
1648 if (rval != QLA_SUCCESS) {
1649 qla_printk(KERN_WARNING, ha,
1650 "Failed to dump firmware (%x)!!!\n", rval);
1651 ha->fw_dumped = 0;
1652
1653 } else {
1654 qla_printk(KERN_INFO, ha,
1655 "Firmware dump saved to temp buffer (%ld/%p).\n",
1656 ha->host_no, ha->fw_dump24);
1657 ha->fw_dumped = 1;
1658 }
1659
1660 qla24xx_fw_dump_failed:
1661 if (!hardware_locked)
1662 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1663 }
1664
1665 void
1666 qla24xx_ascii_fw_dump(scsi_qla_host_t *ha)
1667 {
1668 uint32_t cnt;
1669 char *uiter;
1670 struct qla24xx_fw_dump *fw;
1671 uint32_t ext_mem_cnt;
1672
1673 uiter = ha->fw_dump_buffer;
1674 fw = ha->fw_dump24;
1675
1676 qla_uprintf(&uiter, "ISP FW Version %d.%02d.%02d Attributes %04x\n",
1677 ha->fw_major_version, ha->fw_minor_version,
1678 ha->fw_subminor_version, ha->fw_attributes);
1679
1680 qla_uprintf(&uiter, "\nHCCR Register\n%04x\n", fw->hccr);
1681
1682 qla_uprintf(&uiter, "\nHost Interface Registers");
1683 for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) {
1684 if (cnt % 8 == 0)
1685 qla_uprintf(&uiter, "\n");
1686
1687 qla_uprintf(&uiter, "%08x ", fw->host_reg[cnt]);
1688 }
1689
1690 qla_uprintf(&uiter, "\n\nMailbox Registers");
1691 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) {
1692 if (cnt % 8 == 0)
1693 qla_uprintf(&uiter, "\n");
1694
1695 qla_uprintf(&uiter, "%08x ", fw->mailbox_reg[cnt]);
1696 }
1697
1698 qla_uprintf(&uiter, "\n\nXSEQ GP Registers");
1699 for (cnt = 0; cnt < sizeof(fw->xseq_gp_reg) / 4; cnt++) {
1700 if (cnt % 8 == 0)
1701 qla_uprintf(&uiter, "\n");
1702
1703 qla_uprintf(&uiter, "%08x ", fw->xseq_gp_reg[cnt]);
1704 }
1705
1706 qla_uprintf(&uiter, "\n\nXSEQ-0 Registers");
1707 for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++) {
1708 if (cnt % 8 == 0)
1709 qla_uprintf(&uiter, "\n");
1710
1711 qla_uprintf(&uiter, "%08x ", fw->xseq_0_reg[cnt]);
1712 }
1713
1714 qla_uprintf(&uiter, "\n\nXSEQ-1 Registers");
1715 for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++) {
1716 if (cnt % 8 == 0)
1717 qla_uprintf(&uiter, "\n");
1718
1719 qla_uprintf(&uiter, "%08x ", fw->xseq_1_reg[cnt]);
1720 }
1721
1722 qla_uprintf(&uiter, "\n\nRSEQ GP Registers");
1723 for (cnt = 0; cnt < sizeof(fw->rseq_gp_reg) / 4; cnt++) {
1724 if (cnt % 8 == 0)
1725 qla_uprintf(&uiter, "\n");
1726
1727 qla_uprintf(&uiter, "%08x ", fw->rseq_gp_reg[cnt]);
1728 }
1729
1730 qla_uprintf(&uiter, "\n\nRSEQ-0 Registers");
1731 for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++) {
1732 if (cnt % 8 == 0)
1733 qla_uprintf(&uiter, "\n");
1734
1735 qla_uprintf(&uiter, "%08x ", fw->rseq_0_reg[cnt]);
1736 }
1737
1738 qla_uprintf(&uiter, "\n\nRSEQ-1 Registers");
1739 for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++) {
1740 if (cnt % 8 == 0)
1741 qla_uprintf(&uiter, "\n");
1742
1743 qla_uprintf(&uiter, "%08x ", fw->rseq_1_reg[cnt]);
1744 }
1745
1746 qla_uprintf(&uiter, "\n\nRSEQ-2 Registers");
1747 for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++) {
1748 if (cnt % 8 == 0)
1749 qla_uprintf(&uiter, "\n");
1750
1751 qla_uprintf(&uiter, "%08x ", fw->rseq_2_reg[cnt]);
1752 }
1753
1754 qla_uprintf(&uiter, "\n\nCommand DMA Registers");
1755 for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++) {
1756 if (cnt % 8 == 0)
1757 qla_uprintf(&uiter, "\n");
1758
1759 qla_uprintf(&uiter, "%08x ", fw->cmd_dma_reg[cnt]);
1760 }
1761
1762 qla_uprintf(&uiter, "\n\nRequest0 Queue DMA Channel Registers");
1763 for (cnt = 0; cnt < sizeof(fw->req0_dma_reg) / 4; cnt++) {
1764 if (cnt % 8 == 0)
1765 qla_uprintf(&uiter, "\n");
1766
1767 qla_uprintf(&uiter, "%08x ", fw->req0_dma_reg[cnt]);
1768 }
1769
1770 qla_uprintf(&uiter, "\n\nResponse0 Queue DMA Channel Registers");
1771 for (cnt = 0; cnt < sizeof(fw->resp0_dma_reg) / 4; cnt++) {
1772 if (cnt % 8 == 0)
1773 qla_uprintf(&uiter, "\n");
1774
1775 qla_uprintf(&uiter, "%08x ", fw->resp0_dma_reg[cnt]);
1776 }
1777
1778 qla_uprintf(&uiter, "\n\nRequest1 Queue DMA Channel Registers");
1779 for (cnt = 0; cnt < sizeof(fw->req1_dma_reg) / 4; cnt++) {
1780 if (cnt % 8 == 0)
1781 qla_uprintf(&uiter, "\n");
1782
1783 qla_uprintf(&uiter, "%08x ", fw->req1_dma_reg[cnt]);
1784 }
1785
1786 qla_uprintf(&uiter, "\n\nXMT0 Data DMA Registers");
1787 for (cnt = 0; cnt < sizeof(fw->xmt0_dma_reg) / 4; cnt++) {
1788 if (cnt % 8 == 0)
1789 qla_uprintf(&uiter, "\n");
1790
1791 qla_uprintf(&uiter, "%08x ", fw->xmt0_dma_reg[cnt]);
1792 }
1793
1794 qla_uprintf(&uiter, "\n\nXMT1 Data DMA Registers");
1795 for (cnt = 0; cnt < sizeof(fw->xmt1_dma_reg) / 4; cnt++) {
1796 if (cnt % 8 == 0)
1797 qla_uprintf(&uiter, "\n");
1798
1799 qla_uprintf(&uiter, "%08x ", fw->xmt1_dma_reg[cnt]);
1800 }
1801
1802 qla_uprintf(&uiter, "\n\nXMT2 Data DMA Registers");
1803 for (cnt = 0; cnt < sizeof(fw->xmt2_dma_reg) / 4; cnt++) {
1804 if (cnt % 8 == 0)
1805 qla_uprintf(&uiter, "\n");
1806
1807 qla_uprintf(&uiter, "%08x ", fw->xmt2_dma_reg[cnt]);
1808 }
1809
1810 qla_uprintf(&uiter, "\n\nXMT3 Data DMA Registers");
1811 for (cnt = 0; cnt < sizeof(fw->xmt3_dma_reg) / 4; cnt++) {
1812 if (cnt % 8 == 0)
1813 qla_uprintf(&uiter, "\n");
1814
1815 qla_uprintf(&uiter, "%08x ", fw->xmt3_dma_reg[cnt]);
1816 }
1817
1818 qla_uprintf(&uiter, "\n\nXMT4 Data DMA Registers");
1819 for (cnt = 0; cnt < sizeof(fw->xmt4_dma_reg) / 4; cnt++) {
1820 if (cnt % 8 == 0)
1821 qla_uprintf(&uiter, "\n");
1822
1823 qla_uprintf(&uiter, "%08x ", fw->xmt4_dma_reg[cnt]);
1824 }
1825
1826 qla_uprintf(&uiter, "\n\nXMT Data DMA Common Registers");
1827 for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++) {
1828 if (cnt % 8 == 0)
1829 qla_uprintf(&uiter, "\n");
1830
1831 qla_uprintf(&uiter, "%08x ", fw->xmt_data_dma_reg[cnt]);
1832 }
1833
1834 qla_uprintf(&uiter, "\n\nRCV Thread 0 Data DMA Registers");
1835 for (cnt = 0; cnt < sizeof(fw->rcvt0_data_dma_reg) / 4; cnt++) {
1836 if (cnt % 8 == 0)
1837 qla_uprintf(&uiter, "\n");
1838
1839 qla_uprintf(&uiter, "%08x ", fw->rcvt0_data_dma_reg[cnt]);
1840 }
1841
1842 qla_uprintf(&uiter, "\n\nRCV Thread 1 Data DMA Registers");
1843 for (cnt = 0; cnt < sizeof(fw->rcvt1_data_dma_reg) / 4; cnt++) {
1844 if (cnt % 8 == 0)
1845 qla_uprintf(&uiter, "\n");
1846
1847 qla_uprintf(&uiter, "%08x ", fw->rcvt1_data_dma_reg[cnt]);
1848 }
1849
1850 qla_uprintf(&uiter, "\n\nRISC GP Registers");
1851 for (cnt = 0; cnt < sizeof(fw->risc_gp_reg) / 4; cnt++) {
1852 if (cnt % 8 == 0)
1853 qla_uprintf(&uiter, "\n");
1854
1855 qla_uprintf(&uiter, "%08x ", fw->risc_gp_reg[cnt]);
1856 }
1857
1858 qla_uprintf(&uiter, "\n\nShadow Registers");
1859 for (cnt = 0; cnt < sizeof(fw->shadow_reg) / 4; cnt++) {
1860 if (cnt % 8 == 0)
1861 qla_uprintf(&uiter, "\n");
1862
1863 qla_uprintf(&uiter, "%08x ", fw->shadow_reg[cnt]);
1864 }
1865
1866 qla_uprintf(&uiter, "\n\nLMC Registers");
1867 for (cnt = 0; cnt < sizeof(fw->lmc_reg) / 4; cnt++) {
1868 if (cnt % 8 == 0)
1869 qla_uprintf(&uiter, "\n");
1870
1871 qla_uprintf(&uiter, "%08x ", fw->lmc_reg[cnt]);
1872 }
1873
1874 qla_uprintf(&uiter, "\n\nFPM Hardware Registers");
1875 for (cnt = 0; cnt < sizeof(fw->fpm_hdw_reg) / 4; cnt++) {
1876 if (cnt % 8 == 0)
1877 qla_uprintf(&uiter, "\n");
1878
1879 qla_uprintf(&uiter, "%08x ", fw->fpm_hdw_reg[cnt]);
1880 }
1881
1882 qla_uprintf(&uiter, "\n\nFB Hardware Registers");
1883 for (cnt = 0; cnt < sizeof(fw->fb_hdw_reg) / 4; cnt++) {
1884 if (cnt % 8 == 0)
1885 qla_uprintf(&uiter, "\n");
1886
1887 qla_uprintf(&uiter, "%08x ", fw->fb_hdw_reg[cnt]);
1888 }
1889
1890 qla_uprintf(&uiter, "\n\nCode RAM");
1891 for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
1892 if (cnt % 8 == 0) {
1893 qla_uprintf(&uiter, "\n%08x: ", cnt + 0x20000);
1894 }
1895 qla_uprintf(&uiter, "%08x ", fw->code_ram[cnt]);
1896 }
1897
1898 qla_uprintf(&uiter, "\n\nExternal Memory");
1899 ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1;
1900 for (cnt = 0; cnt < ext_mem_cnt; cnt++) {
1901 if (cnt % 8 == 0) {
1902 qla_uprintf(&uiter, "\n%08x: ", cnt + 0x100000);
1903 }
1904 qla_uprintf(&uiter, "%08x ", fw->ext_mem[cnt]);
1905 }
1906
1907 qla_uprintf(&uiter, "\n[<==END] ISP Debug Dump");
1908 }
1909
1910
1911 /****************************************************************************/
1912 /* Driver Debug Functions. */
1913 /****************************************************************************/
1914
1915 void
1916 qla2x00_dump_regs(scsi_qla_host_t *ha)
1917 {
1918 struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
1919
1920 printk("Mailbox registers:\n");
1921 printk("scsi(%ld): mbox 0 0x%04x \n",
1922 ha->host_no, RD_MAILBOX_REG(ha, reg, 0));
1923 printk("scsi(%ld): mbox 1 0x%04x \n",
1924 ha->host_no, RD_MAILBOX_REG(ha, reg, 1));
1925 printk("scsi(%ld): mbox 2 0x%04x \n",
1926 ha->host_no, RD_MAILBOX_REG(ha, reg, 2));
1927 printk("scsi(%ld): mbox 3 0x%04x \n",
1928 ha->host_no, RD_MAILBOX_REG(ha, reg, 3));
1929 printk("scsi(%ld): mbox 4 0x%04x \n",
1930 ha->host_no, RD_MAILBOX_REG(ha, reg, 4));
1931 printk("scsi(%ld): mbox 5 0x%04x \n",
1932 ha->host_no, RD_MAILBOX_REG(ha, reg, 5));
1933 }
1934
1935
1936 void
1937 qla2x00_dump_buffer(uint8_t * b, uint32_t size)
1938 {
1939 uint32_t cnt;
1940 uint8_t c;
1941
1942 printk(" 0 1 2 3 4 5 6 7 8 9 "
1943 "Ah Bh Ch Dh Eh Fh\n");
1944 printk("----------------------------------------"
1945 "----------------------\n");
1946
1947 for (cnt = 0; cnt < size;) {
1948 c = *b++;
1949 printk("%02x",(uint32_t) c);
1950 cnt++;
1951 if (!(cnt % 16))
1952 printk("\n");
1953 else
1954 printk(" ");
1955 }
1956 if (cnt % 16)
1957 printk("\n");
1958 }
1959
1960 /**************************************************************************
1961 * qla2x00_print_scsi_cmd
1962 * Dumps out info about the scsi cmd and srb.
1963 * Input
1964 * cmd : struct scsi_cmnd
1965 **************************************************************************/
1966 void
1967 qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
1968 {
1969 int i;
1970 struct scsi_qla_host *ha;
1971 srb_t *sp;
1972
1973 ha = (struct scsi_qla_host *)cmd->device->host->hostdata;
1974
1975 sp = (srb_t *) cmd->SCp.ptr;
1976 printk("SCSI Command @=0x%p, Handle=0x%p\n", cmd, cmd->host_scribble);
1977 printk(" chan=0x%02x, target=0x%02x, lun=0x%02x, cmd_len=0x%02x\n",
1978 cmd->device->channel, cmd->device->id, cmd->device->lun,
1979 cmd->cmd_len);
1980 printk(" CDB: ");
1981 for (i = 0; i < cmd->cmd_len; i++) {
1982 printk("0x%02x ", cmd->cmnd[i]);
1983 }
1984 printk("\n seg_cnt=%d, allowed=%d, retries=%d\n",
1985 cmd->use_sg, cmd->allowed, cmd->retries);
1986 printk(" request buffer=0x%p, request buffer len=0x%x\n",
1987 cmd->request_buffer, cmd->request_bufflen);
1988 printk(" tag=%d, transfersize=0x%x\n",
1989 cmd->tag, cmd->transfersize);
1990 printk(" serial_number=%lx, SP=%p\n", cmd->serial_number, sp);
1991 printk(" data direction=%d\n", cmd->sc_data_direction);
1992
1993 if (!sp)
1994 return;
1995
1996 printk(" sp flags=0x%x\n", sp->flags);
1997 printk(" state=%d\n", sp->state);
1998 }
1999
2000 void
2001 qla2x00_dump_pkt(void *pkt)
2002 {
2003 uint32_t i;
2004 uint8_t *data = (uint8_t *) pkt;
2005
2006 for (i = 0; i < 64; i++) {
2007 if (!(i % 4))
2008 printk("\n%02x: ", i);
2009
2010 printk("%02x ", data[i]);
2011 }
2012 printk("\n");
2013 }
2014
2015 #if defined(QL_DEBUG_ROUTINES)
2016 /*
2017 * qla2x00_formatted_dump_buffer
2018 * Prints string plus buffer.
2019 *
2020 * Input:
2021 * string = Null terminated string (no newline at end).
2022 * buffer = buffer address.
2023 * wd_size = word size 8, 16, 32 or 64 bits
2024 * count = number of words.
2025 */
2026 void
2027 qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer,
2028 uint8_t wd_size, uint32_t count)
2029 {
2030 uint32_t cnt;
2031 uint16_t *buf16;
2032 uint32_t *buf32;
2033
2034 if (strcmp(string, "") != 0)
2035 printk("%s\n",string);
2036
2037 switch (wd_size) {
2038 case 8:
2039 printk(" 0 1 2 3 4 5 6 7 "
2040 "8 9 Ah Bh Ch Dh Eh Fh\n");
2041 printk("-----------------------------------------"
2042 "-------------------------------------\n");
2043
2044 for (cnt = 1; cnt <= count; cnt++, buffer++) {
2045 printk("%02x",*buffer);
2046 if (cnt % 16 == 0)
2047 printk("\n");
2048 else
2049 printk(" ");
2050 }
2051 if (cnt % 16 != 0)
2052 printk("\n");
2053 break;
2054 case 16:
2055 printk(" 0 2 4 6 8 Ah "
2056 " Ch Eh\n");
2057 printk("-----------------------------------------"
2058 "-------------\n");
2059
2060 buf16 = (uint16_t *) buffer;
2061 for (cnt = 1; cnt <= count; cnt++, buf16++) {
2062 printk("%4x",*buf16);
2063
2064 if (cnt % 8 == 0)
2065 printk("\n");
2066 else if (*buf16 < 10)
2067 printk(" ");
2068 else
2069 printk(" ");
2070 }
2071 if (cnt % 8 != 0)
2072 printk("\n");
2073 break;
2074 case 32:
2075 printk(" 0 4 8 Ch\n");
2076 printk("------------------------------------------\n");
2077
2078 buf32 = (uint32_t *) buffer;
2079 for (cnt = 1; cnt <= count; cnt++, buf32++) {
2080 printk("%8x", *buf32);
2081
2082 if (cnt % 4 == 0)
2083 printk("\n");
2084 else if (*buf32 < 10)
2085 printk(" ");
2086 else
2087 printk(" ");
2088 }
2089 if (cnt % 4 != 0)
2090 printk("\n");
2091 break;
2092 default:
2093 break;
2094 }
2095 }
2096 #endif
This page took 0.084425 seconds and 6 git commands to generate.