2 * QLOGIC LINUX SOFTWARE
4 * QLogic ISP2x00 device driver for Linux 2.6.x
5 * Copyright (C) 2003-2004 QLogic Corporation
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2, or (at your option) any
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
21 #include <linux/delay.h>
23 static int qla_uprintf(char **, char *, ...);
26 * qla2300_fw_dump() - Dumps binary data from the 2300 firmware.
28 * @hardware_locked: Called with the hardware_lock
31 qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
35 uint32_t risc_address;
42 struct qla2300_fw_dump *fw;
43 uint32_t dump_size, data_ram_cnt;
46 risc_address = data_ram_cnt = 0;
51 spin_lock_irqsave(&ha->hardware_lock, flags);
53 if (ha->fw_dump != NULL) {
54 qla_printk(KERN_WARNING, ha,
55 "Firmware has been previously dumped (%p) -- ignoring "
56 "request...\n", ha->fw_dump);
57 goto qla2300_fw_dump_failed;
60 /* Allocate (large) dump buffer. */
61 dump_size = sizeof(struct qla2300_fw_dump);
62 dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t);
63 ha->fw_dump_order = get_order(dump_size);
64 ha->fw_dump = (struct qla2300_fw_dump *) __get_free_pages(GFP_ATOMIC,
66 if (ha->fw_dump == NULL) {
67 qla_printk(KERN_WARNING, ha,
68 "Unable to allocated memory for firmware dump (%d/%d).\n",
69 ha->fw_dump_order, dump_size);
70 goto qla2300_fw_dump_failed;
75 fw->hccr = RD_REG_WORD(®->hccr);
78 WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC);
81 (RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
82 rval == QLA_SUCCESS; cnt--) {
86 rval = QLA_FUNCTION_TIMEOUT;
92 if (rval == QLA_SUCCESS) {
93 dmp_reg = (uint16_t *)(reg + 0);
94 for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
95 fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++);
97 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x10);
98 for (cnt = 0; cnt < sizeof(fw->risc_host_reg) / 2; cnt++)
99 fw->risc_host_reg[cnt] = RD_REG_WORD(dmp_reg++);
101 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x40);
102 for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
103 fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++);
105 WRT_REG_WORD(®->ctrl_status, 0x40);
106 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
107 for (cnt = 0; cnt < sizeof(fw->resp_dma_reg) / 2; cnt++)
108 fw->resp_dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
110 WRT_REG_WORD(®->ctrl_status, 0x50);
111 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
112 for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
113 fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
115 WRT_REG_WORD(®->ctrl_status, 0x00);
116 dmp_reg = (uint16_t *)((uint8_t *)reg + 0xA0);
117 for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
118 fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
120 WRT_REG_WORD(®->pcr, 0x2000);
121 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
122 for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
123 fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++);
125 WRT_REG_WORD(®->pcr, 0x2200);
126 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
127 for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
128 fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++);
130 WRT_REG_WORD(®->pcr, 0x2400);
131 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
132 for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
133 fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++);
135 WRT_REG_WORD(®->pcr, 0x2600);
136 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
137 for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
138 fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++);
140 WRT_REG_WORD(®->pcr, 0x2800);
141 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
142 for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
143 fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++);
145 WRT_REG_WORD(®->pcr, 0x2A00);
146 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
147 for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
148 fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++);
150 WRT_REG_WORD(®->pcr, 0x2C00);
151 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
152 for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
153 fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++);
155 WRT_REG_WORD(®->pcr, 0x2E00);
156 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
157 for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
158 fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++);
160 WRT_REG_WORD(®->ctrl_status, 0x10);
161 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
162 for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
163 fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
165 WRT_REG_WORD(®->ctrl_status, 0x20);
166 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
167 for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
168 fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++);
170 WRT_REG_WORD(®->ctrl_status, 0x30);
171 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
172 for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
173 fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++);
176 WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET);
177 for (cnt = 0; cnt < 30000; cnt++) {
178 if ((RD_REG_WORD(®->ctrl_status) &
179 CSR_ISP_SOFT_RESET) == 0)
186 if (!IS_QLA2300(ha)) {
187 for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
188 rval == QLA_SUCCESS; cnt--) {
192 rval = QLA_FUNCTION_TIMEOUT;
196 if (rval == QLA_SUCCESS) {
198 risc_address = 0x800;
199 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
200 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
202 for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
203 cnt++, risc_address++) {
204 WRT_MAILBOX_REG(ha, reg, 1, (uint16_t)risc_address);
205 WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT);
207 for (timer = 6000000; timer; timer--) {
208 /* Check for pending interrupts. */
209 stat = RD_REG_DWORD(®->u.isp2300.host_status);
210 if (stat & HSR_RISC_INT) {
213 if (stat == 0x1 || stat == 0x2) {
214 set_bit(MBX_INTERRUPT,
217 mb0 = RD_MAILBOX_REG(ha, reg, 0);
218 mb2 = RD_MAILBOX_REG(ha, reg, 2);
220 /* Release mailbox registers. */
221 WRT_REG_WORD(®->semaphore, 0);
222 WRT_REG_WORD(®->hccr,
225 } else if (stat == 0x10 || stat == 0x11) {
226 set_bit(MBX_INTERRUPT,
229 mb0 = RD_MAILBOX_REG(ha, reg, 0);
230 mb2 = RD_MAILBOX_REG(ha, reg, 2);
232 WRT_REG_WORD(®->hccr,
237 /* clear this intr; it wasn't a mailbox intr */
238 WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT);
243 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
244 rval = mb0 & MBS_MASK;
245 fw->risc_ram[cnt] = mb2;
247 rval = QLA_FUNCTION_FAILED;
251 if (rval == QLA_SUCCESS) {
252 /* Get stack SRAM. */
253 risc_address = 0x10000;
254 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
255 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
257 for (cnt = 0; cnt < sizeof(fw->stack_ram) / 2 && rval == QLA_SUCCESS;
258 cnt++, risc_address++) {
259 WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
260 WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
261 WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT);
263 for (timer = 6000000; timer; timer--) {
264 /* Check for pending interrupts. */
265 stat = RD_REG_DWORD(®->u.isp2300.host_status);
266 if (stat & HSR_RISC_INT) {
269 if (stat == 0x1 || stat == 0x2) {
270 set_bit(MBX_INTERRUPT,
273 mb0 = RD_MAILBOX_REG(ha, reg, 0);
274 mb2 = RD_MAILBOX_REG(ha, reg, 2);
276 /* Release mailbox registers. */
277 WRT_REG_WORD(®->semaphore, 0);
278 WRT_REG_WORD(®->hccr,
281 } else if (stat == 0x10 || stat == 0x11) {
282 set_bit(MBX_INTERRUPT,
285 mb0 = RD_MAILBOX_REG(ha, reg, 0);
286 mb2 = RD_MAILBOX_REG(ha, reg, 2);
288 WRT_REG_WORD(®->hccr,
293 /* clear this intr; it wasn't a mailbox intr */
294 WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT);
299 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
300 rval = mb0 & MBS_MASK;
301 fw->stack_ram[cnt] = mb2;
303 rval = QLA_FUNCTION_FAILED;
307 if (rval == QLA_SUCCESS) {
309 risc_address = 0x11000;
310 data_ram_cnt = ha->fw_memory_size - risc_address + 1;
311 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
312 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
314 for (cnt = 0; cnt < data_ram_cnt && rval == QLA_SUCCESS;
315 cnt++, risc_address++) {
316 WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
317 WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
318 WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT);
320 for (timer = 6000000; timer; timer--) {
321 /* Check for pending interrupts. */
322 stat = RD_REG_DWORD(®->u.isp2300.host_status);
323 if (stat & HSR_RISC_INT) {
326 if (stat == 0x1 || stat == 0x2) {
327 set_bit(MBX_INTERRUPT,
330 mb0 = RD_MAILBOX_REG(ha, reg, 0);
331 mb2 = RD_MAILBOX_REG(ha, reg, 2);
333 /* Release mailbox registers. */
334 WRT_REG_WORD(®->semaphore, 0);
335 WRT_REG_WORD(®->hccr,
338 } else if (stat == 0x10 || stat == 0x11) {
339 set_bit(MBX_INTERRUPT,
342 mb0 = RD_MAILBOX_REG(ha, reg, 0);
343 mb2 = RD_MAILBOX_REG(ha, reg, 2);
345 WRT_REG_WORD(®->hccr,
350 /* clear this intr; it wasn't a mailbox intr */
351 WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT);
356 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
357 rval = mb0 & MBS_MASK;
358 fw->data_ram[cnt] = mb2;
360 rval = QLA_FUNCTION_FAILED;
365 if (rval != QLA_SUCCESS) {
366 qla_printk(KERN_WARNING, ha,
367 "Failed to dump firmware (%x)!!!\n", rval);
369 free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
372 qla_printk(KERN_INFO, ha,
373 "Firmware dump saved to temp buffer (%ld/%p).\n",
374 ha->host_no, ha->fw_dump);
377 qla2300_fw_dump_failed:
378 if (!hardware_locked)
379 spin_unlock_irqrestore(&ha->hardware_lock, flags);
383 * qla2300_ascii_fw_dump() - Converts a binary firmware dump to ASCII.
387 qla2300_ascii_fw_dump(scsi_qla_host_t *ha)
392 struct qla2300_fw_dump *fw;
393 uint32_t data_ram_cnt;
395 uiter = ha->fw_dump_buffer;
398 qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number,
399 qla2x00_get_fw_version_str(ha, fw_info));
401 qla_uprintf(&uiter, "\n[==>BEG]\n");
403 qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr);
405 qla_uprintf(&uiter, "PBIU Registers:");
406 for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {
408 qla_uprintf(&uiter, "\n");
410 qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]);
413 qla_uprintf(&uiter, "\n\nReqQ-RspQ-Risc2Host Status registers:");
414 for (cnt = 0; cnt < sizeof (fw->risc_host_reg) / 2; cnt++) {
416 qla_uprintf(&uiter, "\n");
418 qla_uprintf(&uiter, "%04x ", fw->risc_host_reg[cnt]);
421 qla_uprintf(&uiter, "\n\nMailbox Registers:");
422 for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
424 qla_uprintf(&uiter, "\n");
426 qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]);
429 qla_uprintf(&uiter, "\n\nAuto Request Response DMA Registers:");
430 for (cnt = 0; cnt < sizeof (fw->resp_dma_reg) / 2; cnt++) {
432 qla_uprintf(&uiter, "\n");
434 qla_uprintf(&uiter, "%04x ", fw->resp_dma_reg[cnt]);
437 qla_uprintf(&uiter, "\n\nDMA Registers:");
438 for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) {
440 qla_uprintf(&uiter, "\n");
442 qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]);
445 qla_uprintf(&uiter, "\n\nRISC Hardware Registers:");
446 for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) {
448 qla_uprintf(&uiter, "\n");
450 qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]);
453 qla_uprintf(&uiter, "\n\nRISC GP0 Registers:");
454 for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) {
456 qla_uprintf(&uiter, "\n");
458 qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]);
461 qla_uprintf(&uiter, "\n\nRISC GP1 Registers:");
462 for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) {
464 qla_uprintf(&uiter, "\n");
466 qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]);
469 qla_uprintf(&uiter, "\n\nRISC GP2 Registers:");
470 for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) {
472 qla_uprintf(&uiter, "\n");
474 qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]);
477 qla_uprintf(&uiter, "\n\nRISC GP3 Registers:");
478 for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) {
480 qla_uprintf(&uiter, "\n");
482 qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]);
485 qla_uprintf(&uiter, "\n\nRISC GP4 Registers:");
486 for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) {
488 qla_uprintf(&uiter, "\n");
490 qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]);
493 qla_uprintf(&uiter, "\n\nRISC GP5 Registers:");
494 for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) {
496 qla_uprintf(&uiter, "\n");
498 qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]);
501 qla_uprintf(&uiter, "\n\nRISC GP6 Registers:");
502 for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) {
504 qla_uprintf(&uiter, "\n");
506 qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]);
509 qla_uprintf(&uiter, "\n\nRISC GP7 Registers:");
510 for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {
512 qla_uprintf(&uiter, "\n");
514 qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]);
517 qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:");
518 for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
520 qla_uprintf(&uiter, "\n");
522 qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]);
525 qla_uprintf(&uiter, "\n\nFPM B0 Registers:");
526 for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {
528 qla_uprintf(&uiter, "\n");
530 qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]);
533 qla_uprintf(&uiter, "\n\nFPM B1 Registers:");
534 for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {
536 qla_uprintf(&uiter, "\n");
538 qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]);
541 qla_uprintf(&uiter, "\n\nCode RAM Dump:");
542 for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
544 qla_uprintf(&uiter, "\n%04x: ", cnt + 0x0800);
546 qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]);
549 qla_uprintf(&uiter, "\n\nStack RAM Dump:");
550 for (cnt = 0; cnt < sizeof (fw->stack_ram) / 2; cnt++) {
552 qla_uprintf(&uiter, "\n%05x: ", cnt + 0x10000);
554 qla_uprintf(&uiter, "%04x ", fw->stack_ram[cnt]);
557 qla_uprintf(&uiter, "\n\nData RAM Dump:");
558 data_ram_cnt = ha->fw_memory_size - 0x11000 + 1;
559 for (cnt = 0; cnt < data_ram_cnt; cnt++) {
561 qla_uprintf(&uiter, "\n%05x: ", cnt + 0x11000);
563 qla_uprintf(&uiter, "%04x ", fw->data_ram[cnt]);
566 qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump.");
570 * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware.
572 * @hardware_locked: Called with the hardware_lock
575 qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
579 uint16_t risc_address;
585 struct qla2100_fw_dump *fw;
592 if (!hardware_locked)
593 spin_lock_irqsave(&ha->hardware_lock, flags);
595 if (ha->fw_dump != NULL) {
596 qla_printk(KERN_WARNING, ha,
597 "Firmware has been previously dumped (%p) -- ignoring "
598 "request...\n", ha->fw_dump);
599 goto qla2100_fw_dump_failed;
602 /* Allocate (large) dump buffer. */
603 ha->fw_dump_order = get_order(sizeof(struct qla2100_fw_dump));
604 ha->fw_dump = (struct qla2100_fw_dump *) __get_free_pages(GFP_ATOMIC,
606 if (ha->fw_dump == NULL) {
607 qla_printk(KERN_WARNING, ha,
608 "Unable to allocated memory for firmware dump (%d/%Zd).\n",
609 ha->fw_dump_order, sizeof(struct qla2100_fw_dump));
610 goto qla2100_fw_dump_failed;
615 fw->hccr = RD_REG_WORD(®->hccr);
618 WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC);
619 for (cnt = 30000; (RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
620 rval == QLA_SUCCESS; cnt--) {
624 rval = QLA_FUNCTION_TIMEOUT;
626 if (rval == QLA_SUCCESS) {
627 dmp_reg = (uint16_t *)(reg + 0);
628 for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
629 fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++);
631 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x10);
632 for (cnt = 0; cnt < ha->mbx_count; cnt++) {
634 dmp_reg = (uint16_t *)((uint8_t *)reg + 0xe0);
636 fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++);
639 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x20);
640 for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
641 fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
643 WRT_REG_WORD(®->ctrl_status, 0x00);
644 dmp_reg = (uint16_t *)((uint8_t *)reg + 0xA0);
645 for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
646 fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
648 WRT_REG_WORD(®->pcr, 0x2000);
649 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
650 for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
651 fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++);
653 WRT_REG_WORD(®->pcr, 0x2100);
654 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
655 for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
656 fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++);
658 WRT_REG_WORD(®->pcr, 0x2200);
659 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
660 for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
661 fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++);
663 WRT_REG_WORD(®->pcr, 0x2300);
664 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
665 for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
666 fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++);
668 WRT_REG_WORD(®->pcr, 0x2400);
669 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
670 for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
671 fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++);
673 WRT_REG_WORD(®->pcr, 0x2500);
674 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
675 for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
676 fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++);
678 WRT_REG_WORD(®->pcr, 0x2600);
679 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
680 for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
681 fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++);
683 WRT_REG_WORD(®->pcr, 0x2700);
684 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
685 for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
686 fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++);
688 WRT_REG_WORD(®->ctrl_status, 0x10);
689 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
690 for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
691 fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
693 WRT_REG_WORD(®->ctrl_status, 0x20);
694 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
695 for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
696 fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++);
698 WRT_REG_WORD(®->ctrl_status, 0x30);
699 dmp_reg = (uint16_t *)((uint8_t *)reg + 0x80);
700 for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
701 fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++);
704 WRT_REG_WORD(®->ctrl_status, CSR_ISP_SOFT_RESET);
707 for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
708 rval == QLA_SUCCESS; cnt--) {
712 rval = QLA_FUNCTION_TIMEOUT;
716 if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&
717 (RD_REG_WORD(®->mctr) & (BIT_1 | BIT_0)) != 0))) {
719 WRT_REG_WORD(®->hccr, HCCR_PAUSE_RISC);
721 (RD_REG_WORD(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
722 rval == QLA_SUCCESS; cnt--) {
726 rval = QLA_FUNCTION_TIMEOUT;
728 if (rval == QLA_SUCCESS) {
729 /* Set memory configuration and timing. */
731 WRT_REG_WORD(®->mctr, 0xf1);
733 WRT_REG_WORD(®->mctr, 0xf2);
736 WRT_REG_WORD(®->hccr, HCCR_RELEASE_RISC);
740 if (rval == QLA_SUCCESS) {
742 risc_address = 0x1000;
743 WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
744 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
746 for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
747 cnt++, risc_address++) {
748 WRT_MAILBOX_REG(ha, reg, 1, risc_address);
749 WRT_REG_WORD(®->hccr, HCCR_SET_HOST_INT);
751 for (timer = 6000000; timer != 0; timer--) {
752 /* Check for pending interrupts. */
753 if (RD_REG_WORD(®->istatus) & ISR_RISC_INT) {
754 if (RD_REG_WORD(®->semaphore) & BIT_0) {
755 set_bit(MBX_INTERRUPT,
758 mb0 = RD_MAILBOX_REG(ha, reg, 0);
759 mb2 = RD_MAILBOX_REG(ha, reg, 2);
761 WRT_REG_WORD(®->semaphore, 0);
762 WRT_REG_WORD(®->hccr,
766 WRT_REG_WORD(®->hccr, HCCR_CLR_RISC_INT);
771 if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
772 rval = mb0 & MBS_MASK;
773 fw->risc_ram[cnt] = mb2;
775 rval = QLA_FUNCTION_FAILED;
779 if (rval != QLA_SUCCESS) {
780 qla_printk(KERN_WARNING, ha,
781 "Failed to dump firmware (%x)!!!\n", rval);
783 free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
786 qla_printk(KERN_INFO, ha,
787 "Firmware dump saved to temp buffer (%ld/%p).\n",
788 ha->host_no, ha->fw_dump);
791 qla2100_fw_dump_failed:
792 if (!hardware_locked)
793 spin_unlock_irqrestore(&ha->hardware_lock, flags);
797 * qla2100_ascii_fw_dump() - Converts a binary firmware dump to ASCII.
801 qla2100_ascii_fw_dump(scsi_qla_host_t *ha)
806 struct qla2100_fw_dump *fw;
808 uiter = ha->fw_dump_buffer;
811 qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number,
812 qla2x00_get_fw_version_str(ha, fw_info));
814 qla_uprintf(&uiter, "\n[==>BEG]\n");
816 qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr);
818 qla_uprintf(&uiter, "PBIU Registers:");
819 for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {
821 qla_uprintf(&uiter, "\n");
823 qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]);
826 qla_uprintf(&uiter, "\n\nMailbox Registers:");
827 for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
829 qla_uprintf(&uiter, "\n");
831 qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]);
834 qla_uprintf(&uiter, "\n\nDMA Registers:");
835 for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) {
837 qla_uprintf(&uiter, "\n");
839 qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]);
842 qla_uprintf(&uiter, "\n\nRISC Hardware Registers:");
843 for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) {
845 qla_uprintf(&uiter, "\n");
847 qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]);
850 qla_uprintf(&uiter, "\n\nRISC GP0 Registers:");
851 for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) {
853 qla_uprintf(&uiter, "\n");
855 qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]);
858 qla_uprintf(&uiter, "\n\nRISC GP1 Registers:");
859 for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) {
861 qla_uprintf(&uiter, "\n");
863 qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]);
866 qla_uprintf(&uiter, "\n\nRISC GP2 Registers:");
867 for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) {
869 qla_uprintf(&uiter, "\n");
871 qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]);
874 qla_uprintf(&uiter, "\n\nRISC GP3 Registers:");
875 for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) {
877 qla_uprintf(&uiter, "\n");
879 qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]);
882 qla_uprintf(&uiter, "\n\nRISC GP4 Registers:");
883 for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) {
885 qla_uprintf(&uiter, "\n");
887 qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]);
890 qla_uprintf(&uiter, "\n\nRISC GP5 Registers:");
891 for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) {
893 qla_uprintf(&uiter, "\n");
895 qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]);
898 qla_uprintf(&uiter, "\n\nRISC GP6 Registers:");
899 for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) {
901 qla_uprintf(&uiter, "\n");
903 qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]);
906 qla_uprintf(&uiter, "\n\nRISC GP7 Registers:");
907 for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {
909 qla_uprintf(&uiter, "\n");
911 qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]);
914 qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:");
915 for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
917 qla_uprintf(&uiter, "\n");
919 qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]);
922 qla_uprintf(&uiter, "\n\nFPM B0 Registers:");
923 for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {
925 qla_uprintf(&uiter, "\n");
927 qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]);
930 qla_uprintf(&uiter, "\n\nFPM B1 Registers:");
931 for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {
933 qla_uprintf(&uiter, "\n");
935 qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]);
938 qla_uprintf(&uiter, "\n\nRISC SRAM:");
939 for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
941 qla_uprintf(&uiter, "\n%04x: ", cnt + 0x1000);
943 qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]);
946 qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump.");
952 qla_uprintf(char **uiter, char *fmt, ...)
959 len = vsprintf(buf, fmt, args);
962 for (iter = 0; iter < len; iter++, *uiter += 1)
963 *uiter[0] = buf[iter];
970 /****************************************************************************/
971 /* Driver Debug Functions. */
972 /****************************************************************************/
975 qla2x00_dump_regs(scsi_qla_host_t *ha)
981 printk("Mailbox registers:\n");
982 printk("scsi(%ld): mbox 0 0x%04x \n",
983 ha->host_no, RD_MAILBOX_REG(ha, reg, 0));
984 printk("scsi(%ld): mbox 1 0x%04x \n",
985 ha->host_no, RD_MAILBOX_REG(ha, reg, 1));
986 printk("scsi(%ld): mbox 2 0x%04x \n",
987 ha->host_no, RD_MAILBOX_REG(ha, reg, 2));
988 printk("scsi(%ld): mbox 3 0x%04x \n",
989 ha->host_no, RD_MAILBOX_REG(ha, reg, 3));
990 printk("scsi(%ld): mbox 4 0x%04x \n",
991 ha->host_no, RD_MAILBOX_REG(ha, reg, 4));
992 printk("scsi(%ld): mbox 5 0x%04x \n",
993 ha->host_no, RD_MAILBOX_REG(ha, reg, 5));
998 qla2x00_dump_buffer(uint8_t * b, uint32_t size)
1003 printk(" 0 1 2 3 4 5 6 7 8 9 "
1004 "Ah Bh Ch Dh Eh Fh\n");
1005 printk("----------------------------------------"
1006 "----------------------\n");
1008 for (cnt = 0; cnt < size;) {
1010 printk("%02x",(uint32_t) c);
1021 /**************************************************************************
1022 * qla2x00_print_scsi_cmd
1023 * Dumps out info about the scsi cmd and srb.
1025 * cmd : struct scsi_cmnd
1026 **************************************************************************/
1028 qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
1031 struct scsi_qla_host *ha;
1034 ha = (struct scsi_qla_host *)cmd->device->host->hostdata;
1036 sp = (srb_t *) cmd->SCp.ptr;
1037 printk("SCSI Command @=0x%p, Handle=0x%p\n", cmd, cmd->host_scribble);
1038 printk(" chan=0x%02x, target=0x%02x, lun=0x%02x, cmd_len=0x%02x\n",
1039 cmd->device->channel, cmd->device->id, cmd->device->lun,
1042 for (i = 0; i < cmd->cmd_len; i++) {
1043 printk("0x%02x ", cmd->cmnd[i]);
1045 printk("\n seg_cnt=%d, allowed=%d, retries=%d, "
1046 "serial_number_at_timeout=0x%lx\n",
1047 cmd->use_sg, cmd->allowed, cmd->retries,
1048 cmd->serial_number_at_timeout);
1049 printk(" request buffer=0x%p, request buffer len=0x%x\n",
1050 cmd->request_buffer, cmd->request_bufflen);
1051 printk(" tag=%d, transfersize=0x%x\n",
1052 cmd->tag, cmd->transfersize);
1053 printk(" serial_number=%lx, SP=%p\n", cmd->serial_number, sp);
1054 printk(" data direction=%d\n", cmd->sc_data_direction);
1059 printk(" sp flags=0x%x\n", sp->flags);
1060 printk(" r_start=0x%lx, u_start=0x%lx, f_start=0x%lx, state=%d\n",
1061 sp->r_start, sp->u_start, sp->f_start, sp->state);
1063 printk(" e_start= 0x%lx, ext_history=%d, fo retry=%d, loopid=%x, "
1064 "port path=%d\n", sp->e_start, sp->ext_history, sp->fo_retry_cnt,
1065 sp->lun_queue->fclun->fcport->loop_id,
1066 sp->lun_queue->fclun->fcport->cur_path);
1069 #if defined(QL_DEBUG_ROUTINES)
1071 * qla2x00_formatted_dump_buffer
1072 * Prints string plus buffer.
1075 * string = Null terminated string (no newline at end).
1076 * buffer = buffer address.
1077 * wd_size = word size 8, 16, 32 or 64 bits
1078 * count = number of words.
1081 qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer,
1082 uint8_t wd_size, uint32_t count)
1088 if (strcmp(string, "") != 0)
1089 printk("%s\n",string);
1093 printk(" 0 1 2 3 4 5 6 7 "
1094 "8 9 Ah Bh Ch Dh Eh Fh\n");
1095 printk("-----------------------------------------"
1096 "-------------------------------------\n");
1098 for (cnt = 1; cnt <= count; cnt++, buffer++) {
1099 printk("%02x",*buffer);
1109 printk(" 0 2 4 6 8 Ah "
1111 printk("-----------------------------------------"
1114 buf16 = (uint16_t *) buffer;
1115 for (cnt = 1; cnt <= count; cnt++, buf16++) {
1116 printk("%4x",*buf16);
1120 else if (*buf16 < 10)
1129 printk(" 0 4 8 Ch\n");
1130 printk("------------------------------------------\n");
1132 buf32 = (uint32_t *) buffer;
1133 for (cnt = 1; cnt <= count; cnt++, buf32++) {
1134 printk("%8x", *buf32);
1138 else if (*buf32 < 10)