[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