[SCSI] qla2xxx: Correct residual-count handling discrepancies during UNDERRUN handling.
authorAndrew Vasquez <andrew.vasquez@qlogic.com>
Fri, 19 Oct 2007 22:59:18 +0000 (15:59 -0700)
committerJames Bottomley <jejb@mulgrave.localdomain>
Tue, 23 Oct 2007 19:54:41 +0000 (15:54 -0400)
For recent ISPs, software during CS_UNDERRUN handling must
determine if the two residuals, firmware-calculated and FCP_RSP,
are different to recognize if a frame has been dropped.  Update
the driver to catch this condition, and clear the
SS_RESIDUAL_UNDER and lscsi_status bits.  This logic is
consistent with what earlier firmwares did by explicitly
cracking open the FCP_RSP statuses and clearing
SS_RESIDUAL_UNDER.

Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/qla2xxx/qla_isr.c

index c4768c4f39904f0fe80f53e0aeb5d17b01adde01..1104bd2eed405a0ce3432c702d8bdc804ad7edcc 100644 (file)
@@ -1012,8 +1012,14 @@ qla2x00_status_entry(scsi_qla_host_t *ha, void *pkt)
        case CS_DATA_UNDERRUN:
                resid = resid_len;
                /* Use F/W calculated residual length. */
-               if (IS_FWI2_CAPABLE(ha))
+               if (IS_FWI2_CAPABLE(ha)) {
+                       if (scsi_status & SS_RESIDUAL_UNDER &&
+                           resid != fw_resid_len) {
+                               scsi_status &= ~SS_RESIDUAL_UNDER;
+                               lscsi_status = 0;
+                       }
                        resid = fw_resid_len;
+               }
 
                if (scsi_status & SS_RESIDUAL_UNDER) {
                        scsi_set_resid(cp, resid);