qla2xxx: Track the process when the ROM_LOCK failure happens
authorHiral Patel <hiral.patel@qlogic.com>
Fri, 11 Apr 2014 20:54:19 +0000 (16:54 -0400)
committerChristoph Hellwig <hch@lst.de>
Mon, 19 May 2014 11:31:01 +0000 (13:31 +0200)
Signed-off-by: Hiral Patel <hiral.patel@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/qla2xxx/qla_nx.c
drivers/scsi/qla2xxx/qla_nx.h

index 3c5819ae451ba2e038c75ed9d08755b5e83ade4a..61774bc2bb6265a6015789f8319bddd0618e5de1 100644 (file)
@@ -860,13 +860,14 @@ qla82xx_rom_lock(struct qla_hw_data *ha)
                }
                timeout++;
        }
-       qla82xx_wr_32(ha, QLA82XX_ROM_LOCK_ID, ROM_LOCK_DRIVER);
+       qla82xx_wr_32(ha, QLA82XX_ROM_LOCK_ID, ha->portnum);
        return 0;
 }
 
 static void
 qla82xx_rom_unlock(struct qla_hw_data *ha)
 {
+       qla82xx_wr_32(ha, QLA82XX_ROM_LOCK_ID, 0xffffffff);
        qla82xx_rd_32(ha, QLA82XX_PCIE_REG(PCIE_SEM2_UNLOCK));
 }
 
@@ -950,6 +951,7 @@ static int
 qla82xx_rom_fast_read(struct qla_hw_data *ha, int addr, int *valp)
 {
        int ret, loops = 0;
+       uint32_t lock_owner = 0;
        scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
 
        while ((qla82xx_rom_lock(ha) != 0) && (loops < 50000)) {
@@ -958,8 +960,10 @@ qla82xx_rom_fast_read(struct qla_hw_data *ha, int addr, int *valp)
                loops++;
        }
        if (loops >= 50000) {
+               lock_owner = qla82xx_rd_32(ha, QLA82XX_ROM_LOCK_ID);
                ql_log(ql_log_fatal, vha, 0x00b9,
-                   "Failed to acquire SEM2 lock.\n");
+                   "Failed to acquire SEM2 lock, Lock Owner %u.\n",
+                   lock_owner);
                return -1;
        }
        ret = qla82xx_do_rom_fast_read(ha, addr, valp);
@@ -1057,6 +1061,7 @@ static int
 ql82xx_rom_lock_d(struct qla_hw_data *ha)
 {
        int loops = 0;
+       uint32_t lock_owner = 0;
        scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
 
        while ((qla82xx_rom_lock(ha) != 0) && (loops < 50000)) {
@@ -1065,8 +1070,9 @@ ql82xx_rom_lock_d(struct qla_hw_data *ha)
                loops++;
        }
        if (loops >= 50000) {
+               lock_owner = qla82xx_rd_32(ha, QLA82XX_ROM_LOCK_ID);
                ql_log(ql_log_warn, vha, 0xb010,
-                   "ROM lock failed.\n");
+                   "ROM lock failed, Lock Owner %u.\n", lock_owner);
                return -1;
        }
        return 0;
@@ -2811,12 +2817,14 @@ static void
 qla82xx_rom_lock_recovery(struct qla_hw_data *ha)
 {
        scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
+       uint32_t lock_owner = 0;
 
-       if (qla82xx_rom_lock(ha))
+       if (qla82xx_rom_lock(ha)) {
+               lock_owner = qla82xx_rd_32(ha, QLA82XX_ROM_LOCK_ID);
                /* Someone else is holding the lock. */
                ql_log(ql_log_info, vha, 0xb022,
-                   "Resetting rom_lock.\n");
-
+                   "Resetting rom_lock, Lock Owner %u.\n", lock_owner);
+       }
        /*
         * Either we got the lock, or someone
         * else died while holding it.
index d57f6fef53bbd936166c5dcb59f7f07e7c73fea3..d978a5d2e11b75627d318be3d5574d7c4b56dffb 100644 (file)
 #define QLA82XX_ROMUSB_ROM_INSTR_OPCODE                (ROMUSB_ROM + 0x0004)
 #define QLA82XX_ROMUSB_GLB_CAS_RST             (ROMUSB_GLB + 0x0038)
 
-/* Lock IDs for ROM lock */
-#define ROM_LOCK_DRIVER       0x0d417340
-
 #define QLA82XX_PCI_CRB_WINDOWSIZE 0x00100000   /* all are 1MB windows */
 #define QLA82XX_PCI_CRB_WINDOW(A) \
        (QLA82XX_PCI_CRBSPACE + (A)*QLA82XX_PCI_CRB_WINDOWSIZE)