> we do some scsi ops where we give a device a large buffer and expect > it to only fill part of it because we dont know how big that part > will be. > > the underrun handling in mpii always caused this to fail, so devices > relying on this didnt work as expected (eg, ses). > > according to the solaris driver we only get underruns on ok scsi > commands, so we dont have to check the NO_SCSI_STATUS bit, we can > trust that its ok but with a residual calculation. > > tests please :)
Are you sure you don't want to /* FALLTHROUGH */ ? It would probably be better to do something like set xs->resid if (NO_SCSI_STATUS) xs->status = SCSI_OK; /* otherwise nonsensical value */ /* FALLTHROUGH */ instead. > Index: mpii.c > =================================================================== > RCS file: /cvs/src/sys/dev/pci/mpii.c,v > retrieving revision 1.38 > diff -u -p -r1.38 mpii.c > --- mpii.c 21 Feb 2011 09:36:15 -0000 1.38 > +++ mpii.c 21 Feb 2011 13:03:15 -0000 > @@ -4649,11 +4649,7 @@ mpii_scsi_cmd_done(struct mpii_ccb *ccb) > switch (letoh16(sie->ioc_status) & MPII_IOCSTATUS_MASK) { > case MPII_IOCSTATUS_SCSI_DATA_UNDERRUN: > xs->resid = xs->datalen - letoh32(sie->transfer_count); > - if (sie->scsi_state & MPII_SCSIIO_ERR_STATE_NO_SCSI_STATUS) { > - xs->error = XS_DRIVER_STUFFUP; > - break; > - } > - /* FALLTHROUGH */ > + break; > case MPII_IOCSTATUS_SUCCESS: > case MPII_IOCSTATUS_SCSI_RECOVERED_ERROR: > switch (xs->status) {