[7202] in linux-scsi channel archive

home help back first fref pref prev next nref lref last post

Re: Fixing SCSI Layer

daemon@ATHENA.MIT.EDU (Kenneth D. Merry)
Fri Sep 10 15:53:57 1999

In-Reply-To: <37D82020.A00A6F73@ampex.com> from Tony Chung at "Sep 9, 1999 02:01:21 pm"
To:     chungto@ampex.com (Tony Chung)
Date:   Fri, 10 Sep 1999 13:18:08 -0600 (MDT)
Cc:     linux-scsi@vger.rutgers.edu
From:   "Kenneth D. Merry" <ken@kdm.org>

Tony Chung wrote...
> 
> 
> >
> > 1 - Add a 'direction' field to the scsi command structure that can be
> >     filled with the following values:
> >       DIR_INPUT, DIR_OUTPUT, DIR_NONE and DIR_UNKNOWN=0
> >       Set this field to DIR_UNKNOWN=0 by default.
> >
> 
> >From Digital Unix  /usr/include/io/cam.h:
> 
> /* Defines for the CAM flags field in the CCB header. */
> 
> #define CAM_DIR_RESV       0x00000000   /* Data direction (00: reserved) */
> #define CAM_DIR_IN         0x00000040   /* Data direction (01: DATA IN) */
> #define CAM_DIR_OUT        0x00000080   /* Data direction (10: DATA OUT) */
> #define CAM_DIR_NONE       0x000000C0   /* Data direction (11: no data) */
> 
> While UDI scsi spec has:
> #define UDI_SCSI_DATA_IN   (1U<<0)
> #define UDI_SCSI_DATA_OUT (1U<<1)
> 
> Basically, it can't be UNKNOWN because the Peripheral Driver must specify the
> buffer address and total transfer size. Any  inconsistencies should return error
> 
> or let the host adaptor card simply return data overrun or data underrun.
> 
> 
> I found CAM_DIR_NONE is potential hazard because
> if some one specify CAM_DIR_NONE, another person
> may mistakenly check for:
>         If (flags & CAM_DIR_OUT) ...../* condition true and do something wrong
> */

In FreeBSD/CAM, we added a mask:

        CAM_DIR_RESV            = 0x00000000,/* Data direction (00:reserved)  */
        CAM_DIR_IN              = 0x00000040,/* Data direction (01:DATA IN)   */
        CAM_DIR_OUT             = 0x00000080,/* Data direction (10:DATA OUT)  */
        CAM_DIR_NONE            = 0x000000C0,/* Data direction (11:no data)   */
        CAM_DIR_MASK            = 0x000000C0,/* Data direction Mask           */

So to determine the data direction:

if ((flags & CAM_DIR_MASK) == CAM_DIR_OUT)
	...

Ken
-- 
Kenneth Merry
ken@kdm.org

-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.rutgers.edu

home help back first fref pref prev next nref lref last post