typo fixes: aquire -> acquire
[safe/jmp/linux-2.6] / drivers / scsi / qla2xxx / qla_dbg.c
index d5107aa..74e5471 100644 (file)
@@ -1,20 +1,8 @@
 /*
- *                  QLOGIC LINUX SOFTWARE
- *
- * QLogic ISP2x00 device driver for Linux 2.6.x
- * Copyright (C) 2003-2004 QLogic Corporation
- * (www.qlogic.com)
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2, or (at your option) any
- * later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
+ * QLogic Fibre Channel HBA Driver
+ * Copyright (c)  2003-2005 QLogic Corporation
  *
+ * See LICENSE.qla2xxx for copyright and licensing details.
  */
 #include "qla_def.h"
 
@@ -40,7 +28,7 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        uint16_t __iomem *dmp_reg;
        unsigned long   flags;
        struct qla2300_fw_dump  *fw;
-       uint32_t        dump_size, data_ram_cnt;
+       uint32_t        data_ram_cnt;
 
        risc_address = data_ram_cnt = 0;
        mb0 = mb2 = 0;
@@ -49,23 +37,16 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        if (!hardware_locked)
                spin_lock_irqsave(&ha->hardware_lock, flags);
 
-       if (ha->fw_dump != NULL) {
+       if (!ha->fw_dump) {
                qla_printk(KERN_WARNING, ha,
-                   "Firmware has been previously dumped (%p) -- ignoring "
-                   "request...\n", ha->fw_dump);
+                   "No buffer available for dump!!!\n");
                goto qla2300_fw_dump_failed;
        }
 
-       /* Allocate (large) dump buffer. */
-       dump_size = sizeof(struct qla2300_fw_dump);
-       dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t);
-       ha->fw_dump_order = get_order(dump_size);
-       ha->fw_dump = (struct qla2300_fw_dump *) __get_free_pages(GFP_ATOMIC,
-           ha->fw_dump_order);
-       if (ha->fw_dump == NULL) {
+       if (ha->fw_dumped) {
                qla_printk(KERN_WARNING, ha,
-                   "Unable to allocated memory for firmware dump (%d/%d).\n",
-                   ha->fw_dump_order, dump_size);
+                   "Firmware has been previously dumped (%p) -- ignoring "
+                   "request...\n", ha->fw_dump);
                goto qla2300_fw_dump_failed;
        }
        fw = ha->fw_dump;
@@ -370,17 +351,16 @@ qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
                }
        }
 
-
        if (rval != QLA_SUCCESS) {
                qla_printk(KERN_WARNING, ha,
                    "Failed to dump firmware (%x)!!!\n", rval);
+               ha->fw_dumped = 0;
 
-               free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
-               ha->fw_dump = NULL;
        } else {
                qla_printk(KERN_INFO, ha,
                    "Firmware dump saved to temp buffer (%ld/%p).\n",
                    ha->host_no, ha->fw_dump);
+               ha->fw_dumped = 1;
        }
 
 qla2300_fw_dump_failed:
@@ -599,21 +579,16 @@ qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        if (!hardware_locked)
                spin_lock_irqsave(&ha->hardware_lock, flags);
 
-       if (ha->fw_dump != NULL) {
+       if (!ha->fw_dump) {
                qla_printk(KERN_WARNING, ha,
-                   "Firmware has been previously dumped (%p) -- ignoring "
-                   "request...\n", ha->fw_dump);
+                   "No buffer available for dump!!!\n");
                goto qla2100_fw_dump_failed;
        }
 
-       /* Allocate (large) dump buffer. */
-       ha->fw_dump_order = get_order(sizeof(struct qla2100_fw_dump));
-       ha->fw_dump = (struct qla2100_fw_dump *) __get_free_pages(GFP_ATOMIC,
-           ha->fw_dump_order);
-       if (ha->fw_dump == NULL) {
+       if (ha->fw_dumped) {
                qla_printk(KERN_WARNING, ha,
-                   "Unable to allocated memory for firmware dump (%d/%Zd).\n",
-                   ha->fw_dump_order, sizeof(struct qla2100_fw_dump));
+                   "Firmware has been previously dumped (%p) -- ignoring "
+                   "request...\n", ha->fw_dump);
                goto qla2100_fw_dump_failed;
        }
        fw = ha->fw_dump;
@@ -789,13 +764,13 @@ qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        if (rval != QLA_SUCCESS) {
                qla_printk(KERN_WARNING, ha,
                    "Failed to dump firmware (%x)!!!\n", rval);
+               ha->fw_dumped = 0;
 
-               free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
-               ha->fw_dump = NULL;
        } else {
                qla_printk(KERN_INFO, ha,
                    "Firmware dump saved to temp buffer (%ld/%p).\n",
                    ha->host_no, ha->fw_dump);
+               ha->fw_dumped = 1;
        }
 
 qla2100_fw_dump_failed:
@@ -982,7 +957,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        int             rval;
        uint32_t        cnt, timer;
        uint32_t        risc_address;
-       uint16_t        mb[4];
+       uint16_t        mb[4], wd;
 
        uint32_t        stat;
        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
@@ -1000,7 +975,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        if (!hardware_locked)
                spin_lock_irqsave(&ha->hardware_lock, flags);
 
-       if (!ha->fw_dump24) {
+       if (!ha->fw_dump) {
                qla_printk(KERN_WARNING, ha,
                    "No buffer available for dump!!!\n");
                goto qla24xx_fw_dump_failed;
@@ -1009,16 +984,16 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        if (ha->fw_dumped) {
                qla_printk(KERN_WARNING, ha,
                    "Firmware has been previously dumped (%p) -- ignoring "
-                   "request...\n", ha->fw_dump24);
+                   "request...\n", ha->fw_dump);
                goto qla24xx_fw_dump_failed;
        }
-       fw = (struct qla24xx_fw_dump *) ha->fw_dump24;
+       fw = ha->fw_dump;
 
        rval = QLA_SUCCESS;
-       fw->hccr = RD_REG_DWORD(&reg->hccr);
+       fw->host_status = RD_REG_DWORD(&reg->host_status);
 
        /* Pause RISC. */
-       if ((fw->hccr & HCCRX_RISC_PAUSE) == 0) {
+       if ((RD_REG_DWORD(&reg->hccr) & HCCRX_RISC_PAUSE) == 0) {
                WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET |
                    HCCRX_CLR_HOST_INT);
                RD_REG_DWORD(&reg->hccr);               /* PCI Posting. */
@@ -1033,16 +1008,54 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
                }
        }
 
-       /* Disable interrupts. */
-       WRT_REG_DWORD(&reg->ictrl, 0);
-       RD_REG_DWORD(&reg->ictrl);
-
        if (rval == QLA_SUCCESS) {
                /* Host interface registers. */
                dmp_reg = (uint32_t __iomem *)(reg + 0);
                for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++)
                        fw->host_reg[cnt] = RD_REG_DWORD(dmp_reg++);
 
+               /* Disable interrupts. */
+               WRT_REG_DWORD(&reg->ictrl, 0);
+               RD_REG_DWORD(&reg->ictrl);
+
+               /* Shadow registers. */
+               WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
+               RD_REG_DWORD(&reg->iobase_addr);
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
+               WRT_REG_DWORD(dmp_reg, 0xB0000000);
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
+               fw->shadow_reg[0] = RD_REG_DWORD(dmp_reg);
+
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
+               WRT_REG_DWORD(dmp_reg, 0xB0100000);
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
+               fw->shadow_reg[1] = RD_REG_DWORD(dmp_reg);
+
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
+               WRT_REG_DWORD(dmp_reg, 0xB0200000);
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
+               fw->shadow_reg[2] = RD_REG_DWORD(dmp_reg);
+
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
+               WRT_REG_DWORD(dmp_reg, 0xB0300000);
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
+               fw->shadow_reg[3] = RD_REG_DWORD(dmp_reg);
+
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
+               WRT_REG_DWORD(dmp_reg, 0xB0400000);
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
+               fw->shadow_reg[4] = RD_REG_DWORD(dmp_reg);
+
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
+               WRT_REG_DWORD(dmp_reg, 0xB0500000);
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
+               fw->shadow_reg[5] = RD_REG_DWORD(dmp_reg);
+
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
+               WRT_REG_DWORD(dmp_reg, 0xB0600000);
+               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
+               fw->shadow_reg[6] = RD_REG_DWORD(dmp_reg);
+
                /* Mailbox registers. */
                mbx_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
                for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
@@ -1320,43 +1333,6 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
                for (cnt = 0; cnt < 16; cnt++)
                        *iter_reg++ = RD_REG_DWORD(dmp_reg++);
 
-               WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
-               RD_REG_DWORD(&reg->iobase_addr);
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
-               WRT_REG_DWORD(dmp_reg, 0xB0000000);
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
-               fw->shadow_reg[0] = RD_REG_DWORD(dmp_reg);
-
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
-               WRT_REG_DWORD(dmp_reg, 0xB0100000);
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
-               fw->shadow_reg[1] = RD_REG_DWORD(dmp_reg);
-
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
-               WRT_REG_DWORD(dmp_reg, 0xB0200000);
-               dmp_reg = (uint32_t *)((uint8_t *)reg + 0xFC);
-               fw->shadow_reg[2] = RD_REG_DWORD(dmp_reg);
-
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
-               WRT_REG_DWORD(dmp_reg, 0xB0300000);
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
-               fw->shadow_reg[3] = RD_REG_DWORD(dmp_reg);
-
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
-               WRT_REG_DWORD(dmp_reg, 0xB0400000);
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
-               fw->shadow_reg[4] = RD_REG_DWORD(dmp_reg);
-
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
-               WRT_REG_DWORD(dmp_reg, 0xB0500000);
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
-               fw->shadow_reg[5] = RD_REG_DWORD(dmp_reg);
-
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
-               WRT_REG_DWORD(dmp_reg, 0xB0600000);
-               dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
-               fw->shadow_reg[6] = RD_REG_DWORD(dmp_reg);
-
                /* Local memory controller registers. */
                iter_reg = fw->lmc_reg;
                WRT_REG_DWORD(&reg->iobase_addr, 0x3000);
@@ -1526,7 +1502,18 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
 
                WRT_REG_DWORD(&reg->ctrl_status,
                    CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
-               udelay(20);
+               pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
+
+               udelay(100);
+               /* Wait for firmware to complete NVRAM accesses. */
+               mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
+               for (cnt = 10000 ; cnt && mb[0]; cnt--) {
+                       udelay(5);
+                       mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
+                       barrier();
+               }
+
+               /* Wait for soft-reset to complete. */
                for (cnt = 0; cnt < 30000; cnt++) {
                        if ((RD_REG_DWORD(&reg->ctrl_status) &
                            CSRX_ISP_SOFT_RESET) == 0)
@@ -1654,7 +1641,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
        } else {
                qla_printk(KERN_INFO, ha,
                    "Firmware dump saved to temp buffer (%ld/%p).\n",
-                   ha->host_no, ha->fw_dump24);
+                   ha->host_no, ha->fw_dump);
                ha->fw_dumped = 1;
        }
 
@@ -1672,13 +1659,13 @@ qla24xx_ascii_fw_dump(scsi_qla_host_t *ha)
        uint32_t ext_mem_cnt;
 
        uiter = ha->fw_dump_buffer;
-       fw = ha->fw_dump24;
+       fw = ha->fw_dump;
 
        qla_uprintf(&uiter, "ISP FW Version %d.%02d.%02d Attributes %04x\n",
            ha->fw_major_version, ha->fw_minor_version,
            ha->fw_subminor_version, ha->fw_attributes);
 
-       qla_uprintf(&uiter, "\nHCCR Register\n%04x\n", fw->hccr);
+       qla_uprintf(&uiter, "\nR2H Status Register\n%04x\n", fw->host_status);
 
        qla_uprintf(&uiter, "\nHost Interface Registers");
        for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) {
@@ -1688,6 +1675,14 @@ qla24xx_ascii_fw_dump(scsi_qla_host_t *ha)
                qla_uprintf(&uiter, "%08x ", fw->host_reg[cnt]);
        }
 
+       qla_uprintf(&uiter, "\n\nShadow Registers");
+       for (cnt = 0; cnt < sizeof(fw->shadow_reg) / 4; cnt++) {
+               if (cnt % 8 == 0)
+                       qla_uprintf(&uiter, "\n");
+
+               qla_uprintf(&uiter, "%08x ", fw->shadow_reg[cnt]);
+       }
+
        qla_uprintf(&uiter, "\n\nMailbox Registers");
        for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) {
                if (cnt % 8 == 0)
@@ -1856,14 +1851,6 @@ qla24xx_ascii_fw_dump(scsi_qla_host_t *ha)
                qla_uprintf(&uiter, "%08x ", fw->risc_gp_reg[cnt]);
        }
 
-       qla_uprintf(&uiter, "\n\nShadow Registers");
-       for (cnt = 0; cnt < sizeof(fw->shadow_reg) / 4; cnt++) {
-               if (cnt % 8 == 0)
-                       qla_uprintf(&uiter, "\n");
-
-               qla_uprintf(&uiter, "%08x ", fw->shadow_reg[cnt]);
-       }
-
        qla_uprintf(&uiter, "\n\nLMC Registers");
        for (cnt = 0; cnt < sizeof(fw->lmc_reg) / 4; cnt++) {
                if (cnt % 8 == 0)
@@ -1995,7 +1982,6 @@ qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
                return;
 
        printk("  sp flags=0x%x\n", sp->flags);
-       printk("  state=%d\n", sp->state);
 }
 
 void