xref: /linux/drivers/scsi/qla2xxx/qla_dbg.c (revision de2fe5e07d58424bc286fff3fd3c1b0bf933cd58)
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->host_status = RD_REG_DWORD(&reg->host_status);
1007 
1008 	/* Pause RISC. */
1009 	if ((RD_REG_DWORD(&reg->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 	if (rval == QLA_SUCCESS) {
1025 		/* Host interface registers. */
1026 		dmp_reg = (uint32_t __iomem *)(reg + 0);
1027 		for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++)
1028 			fw->host_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1029 
1030 		/* Disable interrupts. */
1031 		WRT_REG_DWORD(&reg->ictrl, 0);
1032 		RD_REG_DWORD(&reg->ictrl);
1033 
1034 		/* Shadow registers. */
1035 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
1036 		RD_REG_DWORD(&reg->iobase_addr);
1037 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1038 		WRT_REG_DWORD(dmp_reg, 0xB0000000);
1039 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1040 		fw->shadow_reg[0] = RD_REG_DWORD(dmp_reg);
1041 
1042 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1043 		WRT_REG_DWORD(dmp_reg, 0xB0100000);
1044 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1045 		fw->shadow_reg[1] = RD_REG_DWORD(dmp_reg);
1046 
1047 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1048 		WRT_REG_DWORD(dmp_reg, 0xB0200000);
1049 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1050 		fw->shadow_reg[2] = RD_REG_DWORD(dmp_reg);
1051 
1052 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1053 		WRT_REG_DWORD(dmp_reg, 0xB0300000);
1054 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1055 		fw->shadow_reg[3] = RD_REG_DWORD(dmp_reg);
1056 
1057 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1058 		WRT_REG_DWORD(dmp_reg, 0xB0400000);
1059 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1060 		fw->shadow_reg[4] = RD_REG_DWORD(dmp_reg);
1061 
1062 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1063 		WRT_REG_DWORD(dmp_reg, 0xB0500000);
1064 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1065 		fw->shadow_reg[5] = RD_REG_DWORD(dmp_reg);
1066 
1067 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
1068 		WRT_REG_DWORD(dmp_reg, 0xB0600000);
1069 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
1070 		fw->shadow_reg[6] = RD_REG_DWORD(dmp_reg);
1071 
1072 		/* Mailbox registers. */
1073 		mbx_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
1074 		for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
1075 			fw->mailbox_reg[cnt] = RD_REG_WORD(mbx_reg++);
1076 
1077 		/* Transfer sequence registers. */
1078 		iter_reg = fw->xseq_gp_reg;
1079 		WRT_REG_DWORD(&reg->iobase_addr, 0xBF00);
1080 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1081 		for (cnt = 0; cnt < 16; cnt++)
1082 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1083 
1084 		WRT_REG_DWORD(&reg->iobase_addr, 0xBF10);
1085 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1086 		for (cnt = 0; cnt < 16; cnt++)
1087 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1088 
1089 		WRT_REG_DWORD(&reg->iobase_addr, 0xBF20);
1090 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1091 		for (cnt = 0; cnt < 16; cnt++)
1092 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1093 
1094 		WRT_REG_DWORD(&reg->iobase_addr, 0xBF30);
1095 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1096 		for (cnt = 0; cnt < 16; cnt++)
1097 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1098 
1099 		WRT_REG_DWORD(&reg->iobase_addr, 0xBF40);
1100 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1101 		for (cnt = 0; cnt < 16; cnt++)
1102 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1103 
1104 		WRT_REG_DWORD(&reg->iobase_addr, 0xBF50);
1105 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1106 		for (cnt = 0; cnt < 16; cnt++)
1107 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1108 
1109 		WRT_REG_DWORD(&reg->iobase_addr, 0xBF60);
1110 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1111 		for (cnt = 0; cnt < 16; cnt++)
1112 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1113 
1114 		WRT_REG_DWORD(&reg->iobase_addr, 0xBF70);
1115 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1116 		for (cnt = 0; cnt < 16; cnt++)
1117 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1118 
1119 		WRT_REG_DWORD(&reg->iobase_addr, 0xBFE0);
1120 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1121 		for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++)
1122 			fw->xseq_0_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1123 
1124 		WRT_REG_DWORD(&reg->iobase_addr, 0xBFF0);
1125 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1126 		for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++)
1127 			fw->xseq_1_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1128 
1129 		/* Receive sequence registers. */
1130 		iter_reg = fw->rseq_gp_reg;
1131 		WRT_REG_DWORD(&reg->iobase_addr, 0xFF00);
1132 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1133 		for (cnt = 0; cnt < 16; cnt++)
1134 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1135 
1136 		WRT_REG_DWORD(&reg->iobase_addr, 0xFF10);
1137 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1138 		for (cnt = 0; cnt < 16; cnt++)
1139 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1140 
1141 		WRT_REG_DWORD(&reg->iobase_addr, 0xFF20);
1142 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1143 		for (cnt = 0; cnt < 16; cnt++)
1144 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1145 
1146 		WRT_REG_DWORD(&reg->iobase_addr, 0xFF30);
1147 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1148 		for (cnt = 0; cnt < 16; cnt++)
1149 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1150 
1151 		WRT_REG_DWORD(&reg->iobase_addr, 0xFF40);
1152 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1153 		for (cnt = 0; cnt < 16; cnt++)
1154 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1155 
1156 		WRT_REG_DWORD(&reg->iobase_addr, 0xFF50);
1157 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1158 		for (cnt = 0; cnt < 16; cnt++)
1159 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1160 
1161 		WRT_REG_DWORD(&reg->iobase_addr, 0xFF60);
1162 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1163 		for (cnt = 0; cnt < 16; cnt++)
1164 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1165 
1166 		WRT_REG_DWORD(&reg->iobase_addr, 0xFF70);
1167 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1168 		for (cnt = 0; cnt < 16; cnt++)
1169 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1170 
1171 		WRT_REG_DWORD(&reg->iobase_addr, 0xFFD0);
1172 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1173 		for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++)
1174 			fw->rseq_0_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1175 
1176 		WRT_REG_DWORD(&reg->iobase_addr, 0xFFE0);
1177 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1178 		for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++)
1179 			fw->rseq_1_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1180 
1181 		WRT_REG_DWORD(&reg->iobase_addr, 0xFFF0);
1182 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1183 		for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++)
1184 			fw->rseq_2_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1185 
1186 		/* Command DMA registers. */
1187 		WRT_REG_DWORD(&reg->iobase_addr, 0x7100);
1188 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1189 		for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++)
1190 			fw->cmd_dma_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1191 
1192 		/* Queues. */
1193 		iter_reg = fw->req0_dma_reg;
1194 		WRT_REG_DWORD(&reg->iobase_addr, 0x7200);
1195 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1196 		for (cnt = 0; cnt < 8; cnt++)
1197 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1198 
1199 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
1200 		for (cnt = 0; cnt < 7; cnt++)
1201 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1202 
1203 		iter_reg = fw->resp0_dma_reg;
1204 		WRT_REG_DWORD(&reg->iobase_addr, 0x7300);
1205 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1206 		for (cnt = 0; cnt < 8; cnt++)
1207 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1208 
1209 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
1210 		for (cnt = 0; cnt < 7; cnt++)
1211 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1212 
1213 		iter_reg = fw->req1_dma_reg;
1214 		WRT_REG_DWORD(&reg->iobase_addr, 0x7400);
1215 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1216 		for (cnt = 0; cnt < 8; cnt++)
1217 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1218 
1219 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
1220 		for (cnt = 0; cnt < 7; cnt++)
1221 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1222 
1223 		/* Transmit DMA registers. */
1224 		iter_reg = fw->xmt0_dma_reg;
1225 		WRT_REG_DWORD(&reg->iobase_addr, 0x7600);
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 		WRT_REG_DWORD(&reg->iobase_addr, 0x7610);
1231 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1232 		for (cnt = 0; cnt < 16; cnt++)
1233 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1234 
1235 		iter_reg = fw->xmt1_dma_reg;
1236 		WRT_REG_DWORD(&reg->iobase_addr, 0x7620);
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, 0x7630);
1242 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1243 		for (cnt = 0; cnt < 16; cnt++)
1244 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1245 
1246 		iter_reg = fw->xmt2_dma_reg;
1247 		WRT_REG_DWORD(&reg->iobase_addr, 0x7640);
1248 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1249 		for (cnt = 0; cnt < 16; cnt++)
1250 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1251 
1252 		WRT_REG_DWORD(&reg->iobase_addr, 0x7650);
1253 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1254 		for (cnt = 0; cnt < 16; cnt++)
1255 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1256 
1257 		iter_reg = fw->xmt3_dma_reg;
1258 		WRT_REG_DWORD(&reg->iobase_addr, 0x7660);
1259 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1260 		for (cnt = 0; cnt < 16; cnt++)
1261 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1262 
1263 		WRT_REG_DWORD(&reg->iobase_addr, 0x7670);
1264 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1265 		for (cnt = 0; cnt < 16; cnt++)
1266 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1267 
1268 		iter_reg = fw->xmt4_dma_reg;
1269 		WRT_REG_DWORD(&reg->iobase_addr, 0x7680);
1270 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1271 		for (cnt = 0; cnt < 16; cnt++)
1272 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1273 
1274 		WRT_REG_DWORD(&reg->iobase_addr, 0x7690);
1275 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1276 		for (cnt = 0; cnt < 16; cnt++)
1277 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1278 
1279 		WRT_REG_DWORD(&reg->iobase_addr, 0x76A0);
1280 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1281 		for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++)
1282 			fw->xmt_data_dma_reg[cnt] = RD_REG_DWORD(dmp_reg++);
1283 
1284 		/* Receive DMA registers. */
1285 		iter_reg = fw->rcvt0_data_dma_reg;
1286 		WRT_REG_DWORD(&reg->iobase_addr, 0x7700);
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, 0x7710);
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 		iter_reg = fw->rcvt1_data_dma_reg;
1297 		WRT_REG_DWORD(&reg->iobase_addr, 0x7720);
1298 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1299 		for (cnt = 0; cnt < 16; cnt++)
1300 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1301 
1302 		WRT_REG_DWORD(&reg->iobase_addr, 0x7730);
1303 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1304 		for (cnt = 0; cnt < 16; cnt++)
1305 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1306 
1307 		/* RISC registers. */
1308 		iter_reg = fw->risc_gp_reg;
1309 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F00);
1310 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1311 		for (cnt = 0; cnt < 16; cnt++)
1312 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1313 
1314 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F10);
1315 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1316 		for (cnt = 0; cnt < 16; cnt++)
1317 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1318 
1319 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F20);
1320 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1321 		for (cnt = 0; cnt < 16; cnt++)
1322 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1323 
1324 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F30);
1325 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1326 		for (cnt = 0; cnt < 16; cnt++)
1327 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1328 
1329 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F40);
1330 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1331 		for (cnt = 0; cnt < 16; cnt++)
1332 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1333 
1334 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F50);
1335 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1336 		for (cnt = 0; cnt < 16; cnt++)
1337 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1338 
1339 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F60);
1340 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1341 		for (cnt = 0; cnt < 16; cnt++)
1342 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1343 
1344 		WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
1345 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1346 		for (cnt = 0; cnt < 16; cnt++)
1347 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1348 
1349 		/* Local memory controller registers. */
1350 		iter_reg = fw->lmc_reg;
1351 		WRT_REG_DWORD(&reg->iobase_addr, 0x3000);
1352 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1353 		for (cnt = 0; cnt < 16; cnt++)
1354 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1355 
1356 		WRT_REG_DWORD(&reg->iobase_addr, 0x3010);
1357 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1358 		for (cnt = 0; cnt < 16; cnt++)
1359 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1360 
1361 		WRT_REG_DWORD(&reg->iobase_addr, 0x3020);
1362 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1363 		for (cnt = 0; cnt < 16; cnt++)
1364 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1365 
1366 		WRT_REG_DWORD(&reg->iobase_addr, 0x3030);
1367 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1368 		for (cnt = 0; cnt < 16; cnt++)
1369 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1370 
1371 		WRT_REG_DWORD(&reg->iobase_addr, 0x3040);
1372 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1373 		for (cnt = 0; cnt < 16; cnt++)
1374 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1375 
1376 		WRT_REG_DWORD(&reg->iobase_addr, 0x3050);
1377 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1378 		for (cnt = 0; cnt < 16; cnt++)
1379 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1380 
1381 		WRT_REG_DWORD(&reg->iobase_addr, 0x3060);
1382 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1383 		for (cnt = 0; cnt < 16; cnt++)
1384 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1385 
1386 		/* Fibre Protocol Module registers. */
1387 		iter_reg = fw->fpm_hdw_reg;
1388 		WRT_REG_DWORD(&reg->iobase_addr, 0x4000);
1389 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1390 		for (cnt = 0; cnt < 16; cnt++)
1391 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1392 
1393 		WRT_REG_DWORD(&reg->iobase_addr, 0x4010);
1394 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1395 		for (cnt = 0; cnt < 16; cnt++)
1396 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1397 
1398 		WRT_REG_DWORD(&reg->iobase_addr, 0x4020);
1399 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1400 		for (cnt = 0; cnt < 16; cnt++)
1401 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1402 
1403 		WRT_REG_DWORD(&reg->iobase_addr, 0x4030);
1404 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1405 		for (cnt = 0; cnt < 16; cnt++)
1406 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1407 
1408 		WRT_REG_DWORD(&reg->iobase_addr, 0x4040);
1409 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1410 		for (cnt = 0; cnt < 16; cnt++)
1411 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1412 
1413 		WRT_REG_DWORD(&reg->iobase_addr, 0x4050);
1414 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1415 		for (cnt = 0; cnt < 16; cnt++)
1416 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1417 
1418 		WRT_REG_DWORD(&reg->iobase_addr, 0x4060);
1419 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1420 		for (cnt = 0; cnt < 16; cnt++)
1421 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1422 
1423 		WRT_REG_DWORD(&reg->iobase_addr, 0x4070);
1424 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1425 		for (cnt = 0; cnt < 16; cnt++)
1426 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1427 
1428 		WRT_REG_DWORD(&reg->iobase_addr, 0x4080);
1429 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1430 		for (cnt = 0; cnt < 16; cnt++)
1431 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1432 
1433 		WRT_REG_DWORD(&reg->iobase_addr, 0x4090);
1434 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1435 		for (cnt = 0; cnt < 16; cnt++)
1436 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1437 
1438 		WRT_REG_DWORD(&reg->iobase_addr, 0x40A0);
1439 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1440 		for (cnt = 0; cnt < 16; cnt++)
1441 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1442 
1443 		WRT_REG_DWORD(&reg->iobase_addr, 0x40B0);
1444 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1445 		for (cnt = 0; cnt < 16; cnt++)
1446 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1447 
1448 		/* Frame Buffer registers. */
1449 		iter_reg = fw->fb_hdw_reg;
1450 		WRT_REG_DWORD(&reg->iobase_addr, 0x6000);
1451 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1452 		for (cnt = 0; cnt < 16; cnt++)
1453 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1454 
1455 		WRT_REG_DWORD(&reg->iobase_addr, 0x6010);
1456 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1457 		for (cnt = 0; cnt < 16; cnt++)
1458 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1459 
1460 		WRT_REG_DWORD(&reg->iobase_addr, 0x6020);
1461 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1462 		for (cnt = 0; cnt < 16; cnt++)
1463 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1464 
1465 		WRT_REG_DWORD(&reg->iobase_addr, 0x6030);
1466 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1467 		for (cnt = 0; cnt < 16; cnt++)
1468 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1469 
1470 		WRT_REG_DWORD(&reg->iobase_addr, 0x6040);
1471 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1472 		for (cnt = 0; cnt < 16; cnt++)
1473 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1474 
1475 		WRT_REG_DWORD(&reg->iobase_addr, 0x6100);
1476 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1477 		for (cnt = 0; cnt < 16; cnt++)
1478 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1479 
1480 		WRT_REG_DWORD(&reg->iobase_addr, 0x6130);
1481 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1482 		for (cnt = 0; cnt < 16; cnt++)
1483 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1484 
1485 		WRT_REG_DWORD(&reg->iobase_addr, 0x6150);
1486 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1487 		for (cnt = 0; cnt < 16; cnt++)
1488 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1489 
1490 		WRT_REG_DWORD(&reg->iobase_addr, 0x6170);
1491 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1492 		for (cnt = 0; cnt < 16; cnt++)
1493 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1494 
1495 		WRT_REG_DWORD(&reg->iobase_addr, 0x6190);
1496 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1497 		for (cnt = 0; cnt < 16; cnt++)
1498 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1499 
1500 		WRT_REG_DWORD(&reg->iobase_addr, 0x61B0);
1501 		dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
1502 		for (cnt = 0; cnt < 16; cnt++)
1503 			*iter_reg++ = RD_REG_DWORD(dmp_reg++);
1504 
1505 		/* Reset RISC. */
1506 		WRT_REG_DWORD(&reg->ctrl_status,
1507 		    CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
1508 		for (cnt = 0; cnt < 30000; cnt++) {
1509 			if ((RD_REG_DWORD(&reg->ctrl_status) &
1510 			    CSRX_DMA_ACTIVE) == 0)
1511 				break;
1512 
1513 			udelay(10);
1514 		}
1515 
1516 		WRT_REG_DWORD(&reg->ctrl_status,
1517 		    CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
1518 		pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
1519 
1520 		udelay(100);
1521 		/* Wait for firmware to complete NVRAM accesses. */
1522 		mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1523 		for (cnt = 10000 ; cnt && mb[0]; cnt--) {
1524 			udelay(5);
1525 			mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1526 			barrier();
1527 		}
1528 
1529 		/* Wait for soft-reset to complete. */
1530 		for (cnt = 0; cnt < 30000; cnt++) {
1531 			if ((RD_REG_DWORD(&reg->ctrl_status) &
1532 			    CSRX_ISP_SOFT_RESET) == 0)
1533 				break;
1534 
1535 			udelay(10);
1536 		}
1537 		WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
1538 		RD_REG_DWORD(&reg->hccr);             /* PCI Posting. */
1539 	}
1540 
1541 	for (cnt = 30000; RD_REG_WORD(&reg->mailbox0) != 0 &&
1542 	    rval == QLA_SUCCESS; cnt--) {
1543 		if (cnt)
1544 			udelay(100);
1545 		else
1546 			rval = QLA_FUNCTION_TIMEOUT;
1547 	}
1548 
1549 	/* Memory. */
1550 	if (rval == QLA_SUCCESS) {
1551 		/* Code RAM. */
1552 		risc_address = 0x20000;
1553 		WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_EXTENDED);
1554 		clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
1555 	}
1556 	for (cnt = 0; cnt < sizeof(fw->code_ram) / 4 && rval == QLA_SUCCESS;
1557 	    cnt++, risc_address++) {
1558 		WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
1559 		WRT_REG_WORD(&reg->mailbox8, MSW(risc_address));
1560 		RD_REG_WORD(&reg->mailbox8);
1561 		WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
1562 
1563 		for (timer = 6000000; timer; timer--) {
1564 			/* Check for pending interrupts. */
1565 			stat = RD_REG_DWORD(&reg->host_status);
1566 			if (stat & HSRX_RISC_INT) {
1567 				stat &= 0xff;
1568 
1569 				if (stat == 0x1 || stat == 0x2 ||
1570 				    stat == 0x10 || stat == 0x11) {
1571 					set_bit(MBX_INTERRUPT,
1572 					    &ha->mbx_cmd_flags);
1573 
1574 					mb[0] = RD_REG_WORD(&reg->mailbox0);
1575 					mb[2] = RD_REG_WORD(&reg->mailbox2);
1576 					mb[3] = RD_REG_WORD(&reg->mailbox3);
1577 
1578 					WRT_REG_DWORD(&reg->hccr,
1579 					    HCCRX_CLR_RISC_INT);
1580 					RD_REG_DWORD(&reg->hccr);
1581 					break;
1582 				}
1583 
1584 				/* Clear this intr; it wasn't a mailbox intr */
1585 				WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
1586 				RD_REG_DWORD(&reg->hccr);
1587 			}
1588 			udelay(5);
1589 		}
1590 
1591 		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
1592 			rval = mb[0] & MBS_MASK;
1593 			fw->code_ram[cnt] = (mb[3] << 16) | mb[2];
1594 		} else {
1595 			rval = QLA_FUNCTION_FAILED;
1596 		}
1597 	}
1598 
1599 	if (rval == QLA_SUCCESS) {
1600 		/* External Memory. */
1601 		risc_address = 0x100000;
1602 		ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1;
1603 		WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_EXTENDED);
1604 		clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
1605 	}
1606 	for (cnt = 0; cnt < ext_mem_cnt && rval == QLA_SUCCESS;
1607 	    cnt++, risc_address++) {
1608 		WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
1609 		WRT_REG_WORD(&reg->mailbox8, MSW(risc_address));
1610 		RD_REG_WORD(&reg->mailbox8);
1611 		WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
1612 
1613 		for (timer = 6000000; timer; timer--) {
1614 			/* Check for pending interrupts. */
1615 			stat = RD_REG_DWORD(&reg->host_status);
1616 			if (stat & HSRX_RISC_INT) {
1617 				stat &= 0xff;
1618 
1619 				if (stat == 0x1 || stat == 0x2 ||
1620 				    stat == 0x10 || stat == 0x11) {
1621 					set_bit(MBX_INTERRUPT,
1622 					    &ha->mbx_cmd_flags);
1623 
1624 					mb[0] = RD_REG_WORD(&reg->mailbox0);
1625 					mb[2] = RD_REG_WORD(&reg->mailbox2);
1626 					mb[3] = RD_REG_WORD(&reg->mailbox3);
1627 
1628 					WRT_REG_DWORD(&reg->hccr,
1629 					    HCCRX_CLR_RISC_INT);
1630 					RD_REG_DWORD(&reg->hccr);
1631 					break;
1632 				}
1633 
1634 				/* Clear this intr; it wasn't a mailbox intr */
1635 				WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
1636 				RD_REG_DWORD(&reg->hccr);
1637 			}
1638 			udelay(5);
1639 		}
1640 
1641 		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
1642 			rval = mb[0] & MBS_MASK;
1643 			fw->ext_mem[cnt] = (mb[3] << 16) | mb[2];
1644 		} else {
1645 			rval = QLA_FUNCTION_FAILED;
1646 		}
1647 	}
1648 
1649 	if (rval != QLA_SUCCESS) {
1650 		qla_printk(KERN_WARNING, ha,
1651 		    "Failed to dump firmware (%x)!!!\n", rval);
1652 		ha->fw_dumped = 0;
1653 
1654 	} else {
1655 		qla_printk(KERN_INFO, ha,
1656 		    "Firmware dump saved to temp buffer (%ld/%p).\n",
1657 		    ha->host_no, ha->fw_dump24);
1658 		ha->fw_dumped = 1;
1659 	}
1660 
1661 qla24xx_fw_dump_failed:
1662 	if (!hardware_locked)
1663 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
1664 }
1665 
1666 void
1667 qla24xx_ascii_fw_dump(scsi_qla_host_t *ha)
1668 {
1669 	uint32_t cnt;
1670 	char *uiter;
1671 	struct qla24xx_fw_dump *fw;
1672 	uint32_t ext_mem_cnt;
1673 
1674 	uiter = ha->fw_dump_buffer;
1675 	fw = ha->fw_dump24;
1676 
1677 	qla_uprintf(&uiter, "ISP FW Version %d.%02d.%02d Attributes %04x\n",
1678 	    ha->fw_major_version, ha->fw_minor_version,
1679 	    ha->fw_subminor_version, ha->fw_attributes);
1680 
1681 	qla_uprintf(&uiter, "\nR2H Status Register\n%04x\n", fw->host_status);
1682 
1683 	qla_uprintf(&uiter, "\nHost Interface Registers");
1684 	for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) {
1685 		if (cnt % 8 == 0)
1686 			qla_uprintf(&uiter, "\n");
1687 
1688 		qla_uprintf(&uiter, "%08x ", fw->host_reg[cnt]);
1689 	}
1690 
1691 	qla_uprintf(&uiter, "\n\nShadow Registers");
1692 	for (cnt = 0; cnt < sizeof(fw->shadow_reg) / 4; cnt++) {
1693 		if (cnt % 8 == 0)
1694 			qla_uprintf(&uiter, "\n");
1695 
1696 		qla_uprintf(&uiter, "%08x ", fw->shadow_reg[cnt]);
1697 	}
1698 
1699 	qla_uprintf(&uiter, "\n\nMailbox Registers");
1700 	for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) {
1701 		if (cnt % 8 == 0)
1702 			qla_uprintf(&uiter, "\n");
1703 
1704 		qla_uprintf(&uiter, "%08x ", fw->mailbox_reg[cnt]);
1705 	}
1706 
1707 	qla_uprintf(&uiter, "\n\nXSEQ GP Registers");
1708 	for (cnt = 0; cnt < sizeof(fw->xseq_gp_reg) / 4; cnt++) {
1709 		if (cnt % 8 == 0)
1710 			qla_uprintf(&uiter, "\n");
1711 
1712 		qla_uprintf(&uiter, "%08x ", fw->xseq_gp_reg[cnt]);
1713 	}
1714 
1715 	qla_uprintf(&uiter, "\n\nXSEQ-0 Registers");
1716 	for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++) {
1717 		if (cnt % 8 == 0)
1718 			qla_uprintf(&uiter, "\n");
1719 
1720 		qla_uprintf(&uiter, "%08x ", fw->xseq_0_reg[cnt]);
1721 	}
1722 
1723 	qla_uprintf(&uiter, "\n\nXSEQ-1 Registers");
1724 	for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++) {
1725 		if (cnt % 8 == 0)
1726 			qla_uprintf(&uiter, "\n");
1727 
1728 		qla_uprintf(&uiter, "%08x ", fw->xseq_1_reg[cnt]);
1729 	}
1730 
1731 	qla_uprintf(&uiter, "\n\nRSEQ GP Registers");
1732 	for (cnt = 0; cnt < sizeof(fw->rseq_gp_reg) / 4; cnt++) {
1733 		if (cnt % 8 == 0)
1734 			qla_uprintf(&uiter, "\n");
1735 
1736 		qla_uprintf(&uiter, "%08x ", fw->rseq_gp_reg[cnt]);
1737 	}
1738 
1739 	qla_uprintf(&uiter, "\n\nRSEQ-0 Registers");
1740 	for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++) {
1741 		if (cnt % 8 == 0)
1742 			qla_uprintf(&uiter, "\n");
1743 
1744 		qla_uprintf(&uiter, "%08x ", fw->rseq_0_reg[cnt]);
1745 	}
1746 
1747 	qla_uprintf(&uiter, "\n\nRSEQ-1 Registers");
1748 	for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++) {
1749 		if (cnt % 8 == 0)
1750 			qla_uprintf(&uiter, "\n");
1751 
1752 		qla_uprintf(&uiter, "%08x ", fw->rseq_1_reg[cnt]);
1753 	}
1754 
1755 	qla_uprintf(&uiter, "\n\nRSEQ-2 Registers");
1756 	for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++) {
1757 		if (cnt % 8 == 0)
1758 			qla_uprintf(&uiter, "\n");
1759 
1760 		qla_uprintf(&uiter, "%08x ", fw->rseq_2_reg[cnt]);
1761 	}
1762 
1763 	qla_uprintf(&uiter, "\n\nCommand DMA Registers");
1764 	for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++) {
1765 		if (cnt % 8 == 0)
1766 			qla_uprintf(&uiter, "\n");
1767 
1768 		qla_uprintf(&uiter, "%08x ", fw->cmd_dma_reg[cnt]);
1769 	}
1770 
1771 	qla_uprintf(&uiter, "\n\nRequest0 Queue DMA Channel Registers");
1772 	for (cnt = 0; cnt < sizeof(fw->req0_dma_reg) / 4; cnt++) {
1773 		if (cnt % 8 == 0)
1774 			qla_uprintf(&uiter, "\n");
1775 
1776 		qla_uprintf(&uiter, "%08x ", fw->req0_dma_reg[cnt]);
1777 	}
1778 
1779 	qla_uprintf(&uiter, "\n\nResponse0 Queue DMA Channel Registers");
1780 	for (cnt = 0; cnt < sizeof(fw->resp0_dma_reg) / 4; cnt++) {
1781 		if (cnt % 8 == 0)
1782 			qla_uprintf(&uiter, "\n");
1783 
1784 		qla_uprintf(&uiter, "%08x ", fw->resp0_dma_reg[cnt]);
1785 	}
1786 
1787 	qla_uprintf(&uiter, "\n\nRequest1 Queue DMA Channel Registers");
1788 	for (cnt = 0; cnt < sizeof(fw->req1_dma_reg) / 4; cnt++) {
1789 		if (cnt % 8 == 0)
1790 			qla_uprintf(&uiter, "\n");
1791 
1792 		qla_uprintf(&uiter, "%08x ", fw->req1_dma_reg[cnt]);
1793 	}
1794 
1795 	qla_uprintf(&uiter, "\n\nXMT0 Data DMA Registers");
1796 	for (cnt = 0; cnt < sizeof(fw->xmt0_dma_reg) / 4; cnt++) {
1797 		if (cnt % 8 == 0)
1798 			qla_uprintf(&uiter, "\n");
1799 
1800 		qla_uprintf(&uiter, "%08x ", fw->xmt0_dma_reg[cnt]);
1801 	}
1802 
1803 	qla_uprintf(&uiter, "\n\nXMT1 Data DMA Registers");
1804 	for (cnt = 0; cnt < sizeof(fw->xmt1_dma_reg) / 4; cnt++) {
1805 		if (cnt % 8 == 0)
1806 			qla_uprintf(&uiter, "\n");
1807 
1808 		qla_uprintf(&uiter, "%08x ", fw->xmt1_dma_reg[cnt]);
1809 	}
1810 
1811 	qla_uprintf(&uiter, "\n\nXMT2 Data DMA Registers");
1812 	for (cnt = 0; cnt < sizeof(fw->xmt2_dma_reg) / 4; cnt++) {
1813 		if (cnt % 8 == 0)
1814 			qla_uprintf(&uiter, "\n");
1815 
1816 		qla_uprintf(&uiter, "%08x ", fw->xmt2_dma_reg[cnt]);
1817 	}
1818 
1819 	qla_uprintf(&uiter, "\n\nXMT3 Data DMA Registers");
1820 	for (cnt = 0; cnt < sizeof(fw->xmt3_dma_reg) / 4; cnt++) {
1821 		if (cnt % 8 == 0)
1822 			qla_uprintf(&uiter, "\n");
1823 
1824 		qla_uprintf(&uiter, "%08x ", fw->xmt3_dma_reg[cnt]);
1825 	}
1826 
1827 	qla_uprintf(&uiter, "\n\nXMT4 Data DMA Registers");
1828 	for (cnt = 0; cnt < sizeof(fw->xmt4_dma_reg) / 4; cnt++) {
1829 		if (cnt % 8 == 0)
1830 			qla_uprintf(&uiter, "\n");
1831 
1832 		qla_uprintf(&uiter, "%08x ", fw->xmt4_dma_reg[cnt]);
1833 	}
1834 
1835 	qla_uprintf(&uiter, "\n\nXMT Data DMA Common Registers");
1836 	for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++) {
1837 		if (cnt % 8 == 0)
1838 			qla_uprintf(&uiter, "\n");
1839 
1840 		qla_uprintf(&uiter, "%08x ", fw->xmt_data_dma_reg[cnt]);
1841 	}
1842 
1843 	qla_uprintf(&uiter, "\n\nRCV Thread 0 Data DMA Registers");
1844 	for (cnt = 0; cnt < sizeof(fw->rcvt0_data_dma_reg) / 4; cnt++) {
1845 		if (cnt % 8 == 0)
1846 			qla_uprintf(&uiter, "\n");
1847 
1848 		qla_uprintf(&uiter, "%08x ", fw->rcvt0_data_dma_reg[cnt]);
1849 	}
1850 
1851 	qla_uprintf(&uiter, "\n\nRCV Thread 1 Data DMA Registers");
1852 	for (cnt = 0; cnt < sizeof(fw->rcvt1_data_dma_reg) / 4; cnt++) {
1853 		if (cnt % 8 == 0)
1854 			qla_uprintf(&uiter, "\n");
1855 
1856 		qla_uprintf(&uiter, "%08x ", fw->rcvt1_data_dma_reg[cnt]);
1857 	}
1858 
1859 	qla_uprintf(&uiter, "\n\nRISC GP Registers");
1860 	for (cnt = 0; cnt < sizeof(fw->risc_gp_reg) / 4; cnt++) {
1861 		if (cnt % 8 == 0)
1862 			qla_uprintf(&uiter, "\n");
1863 
1864 		qla_uprintf(&uiter, "%08x ", fw->risc_gp_reg[cnt]);
1865 	}
1866 
1867 	qla_uprintf(&uiter, "\n\nLMC Registers");
1868 	for (cnt = 0; cnt < sizeof(fw->lmc_reg) / 4; cnt++) {
1869 		if (cnt % 8 == 0)
1870 			qla_uprintf(&uiter, "\n");
1871 
1872 		qla_uprintf(&uiter, "%08x ", fw->lmc_reg[cnt]);
1873 	}
1874 
1875 	qla_uprintf(&uiter, "\n\nFPM Hardware Registers");
1876 	for (cnt = 0; cnt < sizeof(fw->fpm_hdw_reg) / 4; cnt++) {
1877 		if (cnt % 8 == 0)
1878 			qla_uprintf(&uiter, "\n");
1879 
1880 		qla_uprintf(&uiter, "%08x ", fw->fpm_hdw_reg[cnt]);
1881 	}
1882 
1883 	qla_uprintf(&uiter, "\n\nFB Hardware Registers");
1884 	for (cnt = 0; cnt < sizeof(fw->fb_hdw_reg) / 4; cnt++) {
1885 		if (cnt % 8 == 0)
1886 			qla_uprintf(&uiter, "\n");
1887 
1888 		qla_uprintf(&uiter, "%08x ", fw->fb_hdw_reg[cnt]);
1889 	}
1890 
1891 	qla_uprintf(&uiter, "\n\nCode RAM");
1892 	for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
1893 		if (cnt % 8 == 0) {
1894 			qla_uprintf(&uiter, "\n%08x: ", cnt + 0x20000);
1895 		}
1896 		qla_uprintf(&uiter, "%08x ", fw->code_ram[cnt]);
1897 	}
1898 
1899 	qla_uprintf(&uiter, "\n\nExternal Memory");
1900 	ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1;
1901 	for (cnt = 0; cnt < ext_mem_cnt; cnt++) {
1902 		if (cnt % 8 == 0) {
1903 			qla_uprintf(&uiter, "\n%08x: ", cnt + 0x100000);
1904 		}
1905 		qla_uprintf(&uiter, "%08x ", fw->ext_mem[cnt]);
1906 	}
1907 
1908 	qla_uprintf(&uiter, "\n[<==END] ISP Debug Dump");
1909 }
1910 
1911 
1912 /****************************************************************************/
1913 /*                         Driver Debug Functions.                          */
1914 /****************************************************************************/
1915 
1916 void
1917 qla2x00_dump_regs(scsi_qla_host_t *ha)
1918 {
1919 	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
1920 
1921 	printk("Mailbox registers:\n");
1922 	printk("scsi(%ld): mbox 0 0x%04x \n",
1923 	    ha->host_no, RD_MAILBOX_REG(ha, reg, 0));
1924 	printk("scsi(%ld): mbox 1 0x%04x \n",
1925 	    ha->host_no, RD_MAILBOX_REG(ha, reg, 1));
1926 	printk("scsi(%ld): mbox 2 0x%04x \n",
1927 	    ha->host_no, RD_MAILBOX_REG(ha, reg, 2));
1928 	printk("scsi(%ld): mbox 3 0x%04x \n",
1929 	    ha->host_no, RD_MAILBOX_REG(ha, reg, 3));
1930 	printk("scsi(%ld): mbox 4 0x%04x \n",
1931 	    ha->host_no, RD_MAILBOX_REG(ha, reg, 4));
1932 	printk("scsi(%ld): mbox 5 0x%04x \n",
1933 	    ha->host_no, RD_MAILBOX_REG(ha, reg, 5));
1934 }
1935 
1936 
1937 void
1938 qla2x00_dump_buffer(uint8_t * b, uint32_t size)
1939 {
1940 	uint32_t cnt;
1941 	uint8_t c;
1942 
1943 	printk(" 0   1   2   3   4   5   6   7   8   9  "
1944 	    "Ah  Bh  Ch  Dh  Eh  Fh\n");
1945 	printk("----------------------------------------"
1946 	    "----------------------\n");
1947 
1948 	for (cnt = 0; cnt < size;) {
1949 		c = *b++;
1950 		printk("%02x",(uint32_t) c);
1951 		cnt++;
1952 		if (!(cnt % 16))
1953 			printk("\n");
1954 		else
1955 			printk("  ");
1956 	}
1957 	if (cnt % 16)
1958 		printk("\n");
1959 }
1960 
1961 /**************************************************************************
1962  *   qla2x00_print_scsi_cmd
1963  *	 Dumps out info about the scsi cmd and srb.
1964  *   Input
1965  *	 cmd : struct scsi_cmnd
1966  **************************************************************************/
1967 void
1968 qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
1969 {
1970 	int i;
1971 	struct scsi_qla_host *ha;
1972 	srb_t *sp;
1973 
1974 	ha = (struct scsi_qla_host *)cmd->device->host->hostdata;
1975 
1976 	sp = (srb_t *) cmd->SCp.ptr;
1977 	printk("SCSI Command @=0x%p, Handle=0x%p\n", cmd, cmd->host_scribble);
1978 	printk("  chan=0x%02x, target=0x%02x, lun=0x%02x, cmd_len=0x%02x\n",
1979 	    cmd->device->channel, cmd->device->id, cmd->device->lun,
1980 	    cmd->cmd_len);
1981 	printk(" CDB: ");
1982 	for (i = 0; i < cmd->cmd_len; i++) {
1983 		printk("0x%02x ", cmd->cmnd[i]);
1984 	}
1985 	printk("\n  seg_cnt=%d, allowed=%d, retries=%d\n",
1986 	    cmd->use_sg, cmd->allowed, cmd->retries);
1987 	printk("  request buffer=0x%p, request buffer len=0x%x\n",
1988 	    cmd->request_buffer, cmd->request_bufflen);
1989 	printk("  tag=%d, transfersize=0x%x\n",
1990 	    cmd->tag, cmd->transfersize);
1991 	printk("  serial_number=%lx, SP=%p\n", cmd->serial_number, sp);
1992 	printk("  data direction=%d\n", cmd->sc_data_direction);
1993 
1994 	if (!sp)
1995 		return;
1996 
1997 	printk("  sp flags=0x%x\n", sp->flags);
1998 	printk("  state=%d\n", sp->state);
1999 }
2000 
2001 void
2002 qla2x00_dump_pkt(void *pkt)
2003 {
2004 	uint32_t i;
2005 	uint8_t *data = (uint8_t *) pkt;
2006 
2007 	for (i = 0; i < 64; i++) {
2008 		if (!(i % 4))
2009 			printk("\n%02x: ", i);
2010 
2011 		printk("%02x ", data[i]);
2012 	}
2013 	printk("\n");
2014 }
2015 
2016 #if defined(QL_DEBUG_ROUTINES)
2017 /*
2018  * qla2x00_formatted_dump_buffer
2019  *       Prints string plus buffer.
2020  *
2021  * Input:
2022  *       string  = Null terminated string (no newline at end).
2023  *       buffer  = buffer address.
2024  *       wd_size = word size 8, 16, 32 or 64 bits
2025  *       count   = number of words.
2026  */
2027 void
2028 qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer,
2029 				uint8_t wd_size, uint32_t count)
2030 {
2031 	uint32_t cnt;
2032 	uint16_t *buf16;
2033 	uint32_t *buf32;
2034 
2035 	if (strcmp(string, "") != 0)
2036 		printk("%s\n",string);
2037 
2038 	switch (wd_size) {
2039 		case 8:
2040 			printk(" 0    1    2    3    4    5    6    7    "
2041 				"8    9    Ah   Bh   Ch   Dh   Eh   Fh\n");
2042 			printk("-----------------------------------------"
2043 				"-------------------------------------\n");
2044 
2045 			for (cnt = 1; cnt <= count; cnt++, buffer++) {
2046 				printk("%02x",*buffer);
2047 				if (cnt % 16 == 0)
2048 					printk("\n");
2049 				else
2050 					printk("  ");
2051 			}
2052 			if (cnt % 16 != 0)
2053 				printk("\n");
2054 			break;
2055 		case 16:
2056 			printk("   0      2      4      6      8      Ah "
2057 				"	Ch     Eh\n");
2058 			printk("-----------------------------------------"
2059 				"-------------\n");
2060 
2061 			buf16 = (uint16_t *) buffer;
2062 			for (cnt = 1; cnt <= count; cnt++, buf16++) {
2063 				printk("%4x",*buf16);
2064 
2065 				if (cnt % 8 == 0)
2066 					printk("\n");
2067 				else if (*buf16 < 10)
2068 					printk("   ");
2069 				else
2070 					printk("  ");
2071 			}
2072 			if (cnt % 8 != 0)
2073 				printk("\n");
2074 			break;
2075 		case 32:
2076 			printk("       0          4          8          Ch\n");
2077 			printk("------------------------------------------\n");
2078 
2079 			buf32 = (uint32_t *) buffer;
2080 			for (cnt = 1; cnt <= count; cnt++, buf32++) {
2081 				printk("%8x", *buf32);
2082 
2083 				if (cnt % 4 == 0)
2084 					printk("\n");
2085 				else if (*buf32 < 10)
2086 					printk("   ");
2087 				else
2088 					printk("  ");
2089 			}
2090 			if (cnt % 4 != 0)
2091 				printk("\n");
2092 			break;
2093 		default:
2094 			break;
2095 	}
2096 }
2097 #endif
2098