[SCSI] qla2xxx: Fix for handling some error conditions in loopback.

Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index a551827..9a2e1fa 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -294,18 +294,21 @@
 	    "%04x %04x %04x %04x %04x %04x %04x.\n",
 	    event[aen & 0xff], mb[0], mb[1], mb[2], mb[3],
 	    mb[4], mb[5], mb[6]);
-
-	if (IS_QLA81XX(vha->hw)) {
-		/* Acknowledgement needed? [Notify && non-zero timeout]. */
-		timeout = (descr >> 8) & 0xf;
-		if (aen != MBA_IDC_NOTIFY || !timeout)
-			return;
-
-		ql_dbg(ql_dbg_async, vha, 0x5022,
-		    "%lu Inter-Driver Communication %s -- ACK timeout=%d.\n",
-		    vha->host_no, event[aen & 0xff], timeout);
+	if ((aen == MBA_IDC_COMPLETE && mb[1] >> 15)) {
+		vha->hw->flags.idc_compl_status = 1;
+		if (vha->hw->notify_dcbx_comp)
+			complete(&vha->hw->dcbx_comp);
 	}
 
+	/* Acknowledgement needed? [Notify && non-zero timeout]. */
+	timeout = (descr >> 8) & 0xf;
+	if (aen != MBA_IDC_NOTIFY || !timeout)
+		return;
+
+	ql_dbg(ql_dbg_async, vha, 0x5022,
+	    "%lu Inter-Driver Communication %s -- ACK timeout=%d.\n",
+	    vha->host_no, event[aen & 0xff], timeout);
+
 	rval = qla2x00_post_idc_ack_work(vha, mb);
 	if (rval != QLA_SUCCESS)
 		ql_log(ql_log_warn, vha, 0x5023,
@@ -989,13 +992,11 @@
 			if ((mb[2] & 0x7fff) == MBC_PORT_RESET ||
 			    (mb[2] & 0x7fff) == MBC_SET_PORT_CONFIG) {
 				set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags);
-				/* Ack that we have quiesced I/O */
-				qla81xx_idc_event(vha, mb[0], mb[1]);
 				qla2xxx_wake_dpc(vha);
 			}
 	case MBA_IDC_COMPLETE:
 	case MBA_IDC_TIME_EXT:
-		if (IS_QLA81XX(vha->hw))
+		if (IS_QLA81XX(vha->hw) || IS_QLA8031(vha->hw))
 			qla81xx_idc_event(vha, mb[0], mb[1]);
 		break;