[prev in list] [next in list] [prev in thread] [next in thread]
List: openbsd-tech
Subject: Re: allow "underruns" on mpii controllers
From: David Gwynne <loki () animata ! net>
Date: 2011-02-22 2:24:27
Message-ID: C01417AA-A662-4877-A53A-A8DB88B24D10 () animata ! net
[Download RAW message or body]
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) {
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic