[Contents] [Index] [Help] [Retrace] [Browse <] [Browse >]

	IFND	DEVICES_SCSIDISK_I
DEVICES_SCSIDISK_I	EQU	1
**
**	$Filename: devices/scsidisk.i $
**	$Release: 2.04 Includes, V37.4 $
**	$Revision: 36.2 $
**	$Date: 90/11/07 $
**
**	SCSI exec-level device command
**
**	(C) Copyright 1988-1999 Amiga, Inc.
**	    All Rights Reserved
**


    IFND EXEC_TYPES_I
    INCLUDE "exec/types.i"
    ENDC ; EXEC_TYPES_I


;---------------------------------------------------------------------
;
;   SCSI Command
;	Several Amiga SCSI controller manufacturers are converging on
;	standard ways to talk to their controllers.  This include
;	file describes an exec-device command (e.g. for hddisk.device)
;	that can be used to issue SCSI commands
;
;   UNIT NUMBERS
;	Unit numbers to the OpenDevice call have encoded in them which
;	SCSI device is being referred to.  The three decimal digits of
;	the unit number refer to the SCSI Target ID (bus address) in
;	the 1's digit, the SCSI logical unit (LUN) in the 10's digit,
;	and the controller board in the 100's digit.
;
;	Examples:
;		  0	drive at address 0
;		 12	LUN 1 on multiple drive controller at address 2
;		104	second controller board, address 4
;		 88	not valid: both logical units and addresses
;			range from 0..7.
;
;   CAVEATS
;	Original 2090 code did not support this command.
;
;	Commodore 2090/2090A unit numbers are different.  The SCSI
;	logical unit is the 100's digit, and the SCSI Target ID
;	is a permuted 1's digit: Target ID 0..6 maps to unit 3..9
;	(7 is reserved for the controller).
;
;	    Examples:
;		  3	drive at address 0
;		109	drive at address 6, logical unit 1
;		  1	not valid: this is not a SCSI unit.  Perhaps
;			it's an ST506 unit.
;
;	Some controller boards generate a unique name (e.g. 2090A's
;	iddisk.device) for the second controller board, instead of
;	implementing the 100's digit.
;
;	There are optional restrictions on the alignment, bus
;	accessability, and size of the data for the data phase.
;	Be conservative to work with all manufacturer's controllers.
;
;---------------------------------------------------------------------

HD_SCSICMD	EQU	28	; issue a SCSI command to the unit
				; io_Data points to a SCSICmd
				; io_Length is sizeof(struct SCSICmd)
				; io_Actual and io_Offset are not used

 STRUCTURE	SCSICmd,0
    APTR    scsi_Data		; word aligned data for SCSI Data Phase
				; (optional) data need not be byte aligned
				; (optional) data need not be bus accessable
    ULONG   scsi_Length		; even length of Data area
				; (optional) data can have odd length
				; (optional) data length can be > 2**24
    ULONG   scsi_Actual		; actual Data used
    APTR    scsi_Command	; SCSI Command (same options as scsi_Data)
    UWORD   scsi_CmdLength	; length of Command
    UWORD   scsi_CmdActual	; actual Command used
    UBYTE   scsi_Flags		; includes intended data direction
    UBYTE   scsi_Status		; SCSI status of command
    APTR    scsi_SenseData	; sense data: filled if SCSIF_[OLD]AUTOSENSE
				; is set and scsi_Status has CHECK CONDITION
				; (bit 1) set
    UWORD   scsi_SenseLength	; size of scsi_SenseData, also bytes to
				; request w/ SCSIF_AUTOSENSE, must be 4..255
    UWORD   scsi_SenseActual	; amount actually fetched (0 means no sense)
    LABEL   scsi_SIZEOF


;------ scsi_Flags ------
SCSIF_WRITE		EQU	0	; intended data direction is out
SCSIF_READ		EQU	1	; intended data direction is in
SCSIB_READ_WRITE	EQU	0	; (the bit to test)

SCSIF_NOSENSE		EQU	0	; no automatic request sense
SCSIF_AUTOSENSE		EQU	2	; do standard extended request sense
					; on check condition
SCSIF_OLDAUTOSENSE	EQU	6	; do 4 byte non-extended request
					; sense on check condition
SCSIB_AUTOSENSE		EQU	1	; (the bit to test)
SCSIB_OLDAUTOSENSE	EQU	2	; (the bit to test)

;------ SCSI io_Error values ------
HFERR_SelfUnit		EQU	40	; cannot issue SCSI command to self
HFERR_DMA		EQU	41	; DMA error
HFERR_Phase		EQU	42	; illegal or unexpected SCSI phase
HFERR_Parity		EQU	43	; SCSI parity error
HFERR_SelTimeout	EQU	44	; Select timed out
HFERR_BadStatus		EQU	45	; status and/or sense error

;------ OpenDevice io_Error values ------
HFERR_NoBoard		EQU	50	; Open failed for non-existant board

	ENDC	; DEVICES_SCSIDISK_I