[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>
This commit is contained in:
Andrew Vasquez 2006-05-17 15:09:06 -07:00 committed by James Bottomley
parent d1c61909c0
commit ffb39f0324

View File

@ -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);
}