On 22/02/2011, at 3:44 AM, Miod Vallat wrote:

>> 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 */ ?

no, because xs->resid will be overwritten.

> 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.

the solaris code only lets this through if the scsi status was OK. perhaps
this is better reflects that:

        case MPII_IOCSTATUS_SCSI_DATA_UNDERRUN:
                switch (xs->status) {
                case SCSI_OK:
                        xs->resid = xs->datalen -
letoh32(sie->transfer_count);
                        break;
                default:
                        xs->error = XS_DRIVER_STUFFUP;
                        break;
                }
                break;


>
>> 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) {

Reply via email to