summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_init.c
diff options
context:
space:
mode:
authorAndrew Vasquez <andrew.vasquez@qlogic.com>2006-05-17 15:09:06 -0700
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>2006-05-20 09:41:56 -0500
commitffb39f0324b56bacaabac26133143cf861d0e9f9 (patch)
tree3c4f1fd64e5199565637ff40b01228d3ec82a2fd /drivers/scsi/qla2xxx/qla_init.c
parentd1c61909c05ead100f855e640fba53925d0665ac (diff)
[SCSI] qla2xxx: ABBA lock ordering fix.
In qla2x00_reset_chip the driver first takes the hardware lock, and then later on takes the mbx lock. In the mailbox_command code.. it goes the other way around. Discovered with the lock validator. Cc: Ingo Molnar <mingo@elte.hu> Cc: Arjan van de Ven <arjan@infradead.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com> Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_init.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c15
1 files changed, 1 insertions, 14 deletions
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 1cf27fe92f4..1289a18e7ad 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -411,7 +411,6 @@ qla2x00_reset_chip(scsi_qla_host_t *ha)
unsigned long flags = 0;
struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
uint32_t cnt;
- unsigned long mbx_flags = 0;
uint16_t cmd;
ha->isp_ops.disable_intrs(ha);
@@ -519,20 +518,8 @@ qla2x00_reset_chip(scsi_qla_host_t *ha)
if (IS_QLA2100(ha) || IS_QLA2200(ha) || IS_QLA2300(ha)) {
for (cnt = 0; cnt < 30000; cnt++) {
- if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)))
- spin_lock_irqsave(&ha->mbx_reg_lock, mbx_flags);
-
- if (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY) {
- if (!(test_bit(ABORT_ISP_ACTIVE,
- &ha->dpc_flags)))
- spin_unlock_irqrestore(
- &ha->mbx_reg_lock, mbx_flags);
+ if (RD_MAILBOX_REG(ha, reg, 0) != MBS_BUSY)
break;
- }
-
- if (!(test_bit(ABORT_ISP_ACTIVE, &ha->dpc_flags)))
- spin_unlock_irqrestore(&ha->mbx_reg_lock,
- mbx_flags);
udelay(100);
}