Merge git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
[linux-2.6-microblaze.git] / drivers / scsi / qla2xxx / qla_dbg.c
index c7533fa..9e80646 100644 (file)
@@ -111,30 +111,25 @@ int
 qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
        uint32_t ram_dwords, void **nxt)
 {
-       int rval;
-       uint32_t cnt, stat, timer, dwords, idx;
-       uint16_t mb0;
        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
        dma_addr_t dump_dma = ha->gid_list_dma;
-       uint32_t *dump = (uint32_t *)ha->gid_list;
-
-       rval = QLA_SUCCESS;
-       mb0 = 0;
+       uint32_t *chunk = (void *)ha->gid_list;
+       uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
+       uint32_t stat;
+       ulong i, j, timer = 6000000;
+       int rval = QLA_FUNCTION_FAILED;
 
-       WRT_REG_WORD(&reg->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
        clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+       for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
+               if (i + dwords > ram_dwords)
+                       dwords = ram_dwords - i;
 
-       dwords = qla2x00_gid_list_size(ha) / 4;
-       for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
-           cnt += dwords, addr += dwords) {
-               if (cnt + dwords > ram_dwords)
-                       dwords = ram_dwords - cnt;
-
+               WRT_REG_WORD(&reg->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
                WRT_REG_WORD(&reg->mailbox1, LSW(addr));
                WRT_REG_WORD(&reg->mailbox8, MSW(addr));
 
-               WRT_REG_WORD(&reg->mailbox2, MSW(dump_dma));
-               WRT_REG_WORD(&reg->mailbox3, LSW(dump_dma));
+               WRT_REG_WORD(&reg->mailbox2, MSW(LSD(dump_dma)));
+               WRT_REG_WORD(&reg->mailbox3, LSW(LSD(dump_dma)));
                WRT_REG_WORD(&reg->mailbox6, MSW(MSD(dump_dma)));
                WRT_REG_WORD(&reg->mailbox7, LSW(MSD(dump_dma)));
 
@@ -145,76 +140,76 @@ qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
                WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
 
                ha->flags.mbox_int = 0;
-               for (timer = 6000000; timer; timer--) {
-                       /* Check for pending interrupts. */
-                       stat = RD_REG_DWORD(&reg->host_status);
-                       if (stat & HSRX_RISC_INT) {
-                               stat &= 0xff;
-
-                               if (stat == 0x1 || stat == 0x2 ||
-                                   stat == 0x10 || stat == 0x11) {
-                                       set_bit(MBX_INTERRUPT,
-                                           &ha->mbx_cmd_flags);
+               while (timer--) {
+                       udelay(5);
 
-                                       mb0 = RD_REG_WORD(&reg->mailbox0);
-                                       RD_REG_WORD(&reg->mailbox1);
+                       stat = RD_REG_DWORD(&reg->host_status);
+                       /* Check for pending interrupts. */
+                       if (!(stat & HSRX_RISC_INT))
+                               continue;
 
-                                       WRT_REG_DWORD(&reg->hccr,
-                                           HCCRX_CLR_RISC_INT);
-                                       RD_REG_DWORD(&reg->hccr);
-                                       break;
-                               }
+                       stat &= 0xff;
+                       if (stat != 0x1 && stat != 0x2 &&
+                           stat != 0x10 && stat != 0x11) {
 
                                /* Clear this intr; it wasn't a mailbox intr */
                                WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
                                RD_REG_DWORD(&reg->hccr);
+                               continue;
                        }
-                       udelay(5);
+
+                       set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+                       rval = RD_REG_WORD(&reg->mailbox0) & MBS_MASK;
+                       WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
+                       RD_REG_DWORD(&reg->hccr);
+                       break;
                }
                ha->flags.mbox_int = 1;
+               *nxt = ram + i;
 
-               if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
-                       rval = mb0 & MBS_MASK;
-                       for (idx = 0; idx < dwords; idx++)
-                               ram[cnt + idx] = IS_QLA27XX(ha) ?
-                                   le32_to_cpu(dump[idx]) : swab32(dump[idx]);
-               } else {
-                       rval = QLA_FUNCTION_FAILED;
+               if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
+                       /* no interrupt, timed out*/
+                       return rval;
+               }
+               if (rval) {
+                       /* error completion status */
+                       return rval;
+               }
+               for (j = 0; j < dwords; j++) {
+                       ram[i + j] =
+                           (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ?
+                           chunk[j] : swab32(chunk[j]);
                }
        }
 
-       *nxt = rval == QLA_SUCCESS ? &ram[cnt] : NULL;
-       return rval;
+       *nxt = ram + i;
+       return QLA_SUCCESS;
 }
 
 int
 qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
     uint32_t ram_dwords, void **nxt)
 {
-       int rval;
-       uint32_t cnt, stat, timer, dwords, idx;
-       uint16_t mb0;
+       int rval = QLA_FUNCTION_FAILED;
        struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
        dma_addr_t dump_dma = ha->gid_list_dma;
-       uint32_t *dump = (uint32_t *)ha->gid_list;
+       uint32_t *chunk = (void *)ha->gid_list;
+       uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
+       uint32_t stat;
+       ulong i, j, timer = 6000000;
 
-       rval = QLA_SUCCESS;
-       mb0 = 0;
-
-       WRT_REG_WORD(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
        clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
 
-       dwords = qla2x00_gid_list_size(ha) / 4;
-       for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
-           cnt += dwords, addr += dwords) {
-               if (cnt + dwords > ram_dwords)
-                       dwords = ram_dwords - cnt;
+       for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
+               if (i + dwords > ram_dwords)
+                       dwords = ram_dwords - i;
 
+               WRT_REG_WORD(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
                WRT_REG_WORD(&reg->mailbox1, LSW(addr));
                WRT_REG_WORD(&reg->mailbox8, MSW(addr));
 
-               WRT_REG_WORD(&reg->mailbox2, MSW(dump_dma));
-               WRT_REG_WORD(&reg->mailbox3, LSW(dump_dma));
+               WRT_REG_WORD(&reg->mailbox2, MSW(LSD(dump_dma)));
+               WRT_REG_WORD(&reg->mailbox3, LSW(LSD(dump_dma)));
                WRT_REG_WORD(&reg->mailbox6, MSW(MSD(dump_dma)));
                WRT_REG_WORD(&reg->mailbox7, LSW(MSD(dump_dma)));
 
@@ -223,45 +218,48 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
                WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
 
                ha->flags.mbox_int = 0;
-               for (timer = 6000000; timer; timer--) {
-                       /* Check for pending interrupts. */
+               while (timer--) {
+                       udelay(5);
                        stat = RD_REG_DWORD(&reg->host_status);
-                       if (stat & HSRX_RISC_INT) {
-                               stat &= 0xff;
 
-                               if (stat == 0x1 || stat == 0x2 ||
-                                   stat == 0x10 || stat == 0x11) {
-                                       set_bit(MBX_INTERRUPT,
-                                           &ha->mbx_cmd_flags);
-
-                                       mb0 = RD_REG_WORD(&reg->mailbox0);
-
-                                       WRT_REG_DWORD(&reg->hccr,
-                                           HCCRX_CLR_RISC_INT);
-                                       RD_REG_DWORD(&reg->hccr);
-                                       break;
-                               }
+                       /* Check for pending interrupts. */
+                       if (!(stat & HSRX_RISC_INT))
+                               continue;
 
-                               /* Clear this intr; it wasn't a mailbox intr */
+                       stat &= 0xff;
+                       if (stat != 0x1 && stat != 0x2 &&
+                           stat != 0x10 && stat != 0x11) {
                                WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
                                RD_REG_DWORD(&reg->hccr);
+                               continue;
                        }
-                       udelay(5);
+
+                       set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
+                       rval = RD_REG_WORD(&reg->mailbox0) & MBS_MASK;
+                       WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
+                       RD_REG_DWORD(&reg->hccr);
+                       break;
                }
                ha->flags.mbox_int = 1;
+               *nxt = ram + i;
 
-               if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
-                       rval = mb0 & MBS_MASK;
-                       for (idx = 0; idx < dwords; idx++)
-                               ram[cnt + idx] = IS_QLA27XX(ha) ?
-                                   le32_to_cpu(dump[idx]) : swab32(dump[idx]);
-               } else {
-                       rval = QLA_FUNCTION_FAILED;
+               if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
+                       /* no interrupt, timed out*/
+                       return rval;
+               }
+               if (rval) {
+                       /* error completion status */
+                       return rval;
+               }
+               for (j = 0; j < dwords; j++) {
+                       ram[i + j] =
+                           (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ?
+                           chunk[j] : swab32(chunk[j]);
                }
        }
 
-       *nxt = rval == QLA_SUCCESS ? &ram[cnt]: NULL;
-       return rval;
+       *nxt = ram + i;
+       return QLA_SUCCESS;
 }
 
 static int
@@ -447,7 +445,7 @@ qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint16_t *ram,
                }
        }
 
-       *nxt = rval == QLA_SUCCESS ? &ram[cnt]: NULL;
+       *nxt = rval == QLA_SUCCESS ? &ram[cnt] : NULL;
        return rval;
 }
 
@@ -669,7 +667,8 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain)
        struct qla2xxx_mq_chain *mq = ptr;
        device_reg_t *reg;
 
-       if (!ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha))
+       if (!ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha) ||
+           IS_QLA28XX(ha))
                return ptr;
 
        mq = ptr;
@@ -2521,7 +2520,7 @@ qla83xx_fw_dump_failed:
 /****************************************************************************/
 
 static inline int
-ql_mask_match(uint32_t level)
+ql_mask_match(uint level)
 {
        return (level & ql2xextended_error_logging) == level;
 }
@@ -2540,7 +2539,7 @@ ql_mask_match(uint32_t level)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
        va_list va;
        struct va_format vaf;
@@ -2583,8 +2582,7 @@ ql_dbg(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-          const char *fmt, ...)
+ql_dbg_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
        va_list va;
        struct va_format vaf;
@@ -2620,7 +2618,7 @@ ql_dbg_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
  * msg:   The message to be displayed.
  */
 void
-ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
+ql_log(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
 {
        va_list va;
        struct va_format vaf;
@@ -2678,8 +2676,7 @@ ql_log(uint32_t level, scsi_qla_host_t *vha, int32_t id, const char *fmt, ...)
  * msg:   The message to be displayed.
  */
 void
-ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
-          const char *fmt, ...)
+ql_log_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
 {
        va_list va;
        struct va_format vaf;
@@ -2719,7 +2716,7 @@ ql_log_pci(uint32_t level, struct pci_dev *pdev, int32_t id,
 }
 
 void
-ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, int32_t id)
+ql_dump_regs(uint level, scsi_qla_host_t *vha, uint id)
 {
        int i;
        struct qla_hw_data *ha = vha->hw;
@@ -2741,13 +2738,12 @@ ql_dump_regs(uint32_t level, scsi_qla_host_t *vha, int32_t id)
        ql_dbg(level, vha, id, "Mailbox registers:\n");
        for (i = 0; i < 6; i++, mbx_reg++)
                ql_dbg(level, vha, id,
-                   "mbox[%d] 0x%04x\n", i, RD_REG_WORD(mbx_reg));
+                   "mbox[%d] %#04x\n", i, RD_REG_WORD(mbx_reg));
 }
 
 
 void
-ql_dump_buffer(uint32_t level, scsi_qla_host_t *vha, int32_t id,
-       uint8_t *buf, uint size)
+ql_dump_buffer(uint level, scsi_qla_host_t *vha, uint id, void *buf, uint size)
 {
        uint cnt;