[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