Execute SCSI I/O Command

Prototype: DWORD SendASPI32Command(lpSRB)

Declaration: LPSRB lpSRB;

The SendASPI32Command function with command code SC_EXEC_SCSI_CMD is used to execute a SCSI I/O command. Once an ASPI client has initialized, virtually all I/O is performed with this command.

Parameter

Description

lpSRB

Points to the following SCSI request block



typedef struct {

 BYTE  SRB_Cmd;      // ASPI command code = SC_EXEC_SCSI_CMD
 BYTE  SRB_Status;     // ASPI command status byte
 BYTE  SRB_HaId;      // ASPI host adapter number
 BYTE  SRB_Flags;     // ASPI request flags
 DWORD  SRB_Hdr_Rsvd;    // Reserved
 BYTE  SRB_Target;     // Target's SCSI ID
 BYTE  SRB_Lun;      // Target's LUN number
 WORD  SRB_Rsvd1;     // Reserved for Alignment
 DWORD  SRB_BufLen;     // Data Allocation Length
 BYTE  *SRB_BufPointer;    // Data Buffer Point
 BYTE  SRB_SenseLen;    // Sense Allocation Length
 BYTE  SRB_CDBLen;     // CDB Length
 BYTE  SRB_HaStat;     // Host Adapter Status
 BYTE  SRB_TargStat;    // Target Status
 void  (*SRB_PostProc)();   // Post routine
 void  *SRB_Rsvd2;     // Reserved
 BYTE  SRB_Rsvd3[16];    // Reserved for expansion
 BYTE  CDBByte[16];     // SCSI CDB
 BYTE  SenseArea[SENSE_LEN+2]; // Request Sense buffer

} SRB_ExecSCSICmd, *PSRB_ExecSCSICmd;

Table 4-6. Execute SCSI I/O Command

Member

Description

SRB_Cmd

[IN] This field must contain SC_EXEC_SCSI_CMD.

SRB_Status

[OUT]This field returns one of the following statuses:


SS_PENDING

SCSI request is in progress.

SS_COMP

SCSI/ASPI request has completed without error.

SS_ABORTED

SCSI command has been aborted.

SS_ABORT_FAIL

SCSI command abort failed.

SS_ERR

SCSI command completed with an error.

SS_INVALID_SRB

One or more parameters in the SCSI Request Block (SRB) are set incorrectly.

SS_INVALID_PATH_ID

SCSI ID and LUN are invalid.

SS_BUFFER_TO_BIG

The ASPI manager cannot handle the given transfer size.

SS_BUFFER_ALIGN

The ASPI manager cannot handle the alignment on this buffer. You must force the buffer into the alignment specified by the alignment mask returned as part of the SC_HA_INQUIRY command.

SS_SECURITY_VIOLATION

The application does not have the security privileges needed to perform the operation for the device.


SRB_HaId

[IN] This field specifies which installed host adapter the request is intended for. Host adapter numbers are always assigned by the SCSI manager layer beginning with zero.

SRB_Flags

[IN] The SRB flags field is defined as follows:


SRB_DIR_IN

Data transfer from SCSI target to host. Mutually exclusive with SRB_DIR_OUT.

SRB_DIR_OUT

Transfer from host to SCSI target. Mutually exclusive with SRB_DIR_IN.

SRB_EVENT_NOTIFY

Enable ASPI command event notification. This flag and the SRB_POSTING flag are mutually exclusive.

SRB_POSTING

Enable ASPI command completion posting. This flag and the SRB_EVENT_NOTIFY flag are mutually exclusive.

SRB_ENABLE_RESIDUAL COUNT

Enables reporting of residual byte count. This bit is only significant if the host adapter reports support for residual byte count from the SC_HA_INQUIRY command. Whenever a data underrun occurs, the SRB_BufLen field is updated to reflect the remaining bytes to transfer.


SRB_Hdr_Rsvd

Reserved = 0

SRB_Target

[IN] SCSI ID of target device.

SRB_Lun

[IN] Logical Unit Number (LUN) of device.

SRB_BufLen

[IN] This field indicates the number of bytes to be transferred. If the SCSI command to be executed does not transfer data (e.g., Test Unit Ready, Rewind, etc.), this field must be set to zero. If residual byte length is supported and selected, this field is returned with the residual number of bytes (usually 0).

SRB_BufPointer

[IN] This field is a pointer to the data buffer.

SRB_SenseLen

[IN] This field indicates the number of bytes allocated at the end of the SRB for sense data. A request sense is automatically generated if a check condition is presented at the end of a SCSI command.

SRB_CDBLen

[IN] This field establishes the length, in bytes, of the SCSI Command Descriptor Block (CDB). This value is typically 6 or 10.

SRB_HaStat

[OUT] Upon completion of the SCSI command, the ASPI manager sets this field with the host adapter status as follows:


HASTAT_OK

Host adapter did not detect an error.

HASTAT_TIMEOUT

The time allocated for the transaction ran out.

HASTAT_COMMAND_TIMEOUT

SRB expired while waiting to be processed.

HASTAT_SEL_TO

Selection of target timed out.

HASTAT_MESSAGE_REJECT

While processing SRB, the adapter received a MESSAGE REJECT.

HASTAT_BUS_RESET

A bus reset was detected.

HASTAT_PARITY_ERROR

A parity error was detected.

HASTAT_REQUEST_SENSE_FAILED

The adapter failed in issuing a Request Sense after a check condition was reported by the target device.

HASTAT_DO_DU

Data overrun/underrun.

HASTAT_BUS_FREE

Unexpected Bus Free.

HASTAT_PHASE_ERR

Target Bus phase sequence failure.


SRB_TargStat

[OUT] Upon completion of the SCSI command, the ASPI manager will record the specific status returned by the SCSI target:


STATUS_GOOD

No target status.

STATUS_CHKCOND

Check status (sense data is in SenseArea).

STATUS_BUSY

Specified Target/LUN is busy.

STATUS_RESCONF

Reservation conflict.


SRB_PostProc

[IN] If posting is enabled (SRB_POSTING flag), this field contains a pointer to a function. ASPI for Win32 calls this function upon completion of an ASPI request. If event notification is enabled (SRB_EVENT_NOTIFY flag), this field contains a handle to an event. ASPI for Win32 signals this event upon completion of an ASPI request.

CDBByte[..]

[IN] This field contains the CDB as defined by the target's SCSI command set. The length of the SCSI CDB is specified in the SRB_CDBLen field.

SenseArea[..]

[OUT] The SenseArea is filled with the sense data on a check condition. The maximum length of this field is specified in the SRB_SenseLen field. Note that the target can return fewer than the number of sense bytes requested.


Table 4-7. Return Values from Execute SCSI I/O Command

Value

Meaning

SS_PENDING

SCSI request is in progress.


Example

This example sends a SCSI Inquiry command to host adapter #0, target #0, LUN #0.


 SRB_ExecSCSICmd MySRB;
 DWORD ASPIStatus;
 char InquiryBuffer[32];   
  .
  .
  .
 MySRB.SRB_Header    = SC_EXEC_SCSI_CMD;
 MySRB.SRB_HaId    = 0;
 MySRB.SRB_Flags    = SRB_DIR_IN | SRB_POSTING;
 MySRB.SRB_Hdr_Rsvd   = 0;
 MySRB.SRB_Target    = 0;
 MySRB.SRB_Lun    = 0;
 MySRB.SRB_BufLen    = 32;
 MySRB.SRB_SenseLen   = SENSE_LEN;
 MySRB.SRB_BufPointer  = InquiryBuffer;
 MySRB.SRB_CDBLen    = 6;
 MySRB.RB_PostProc   = PostProcedure;
 MySRB.CDBByte[0]    = SCSI_INQUIRY;
 MySRB.CDBByte[1]    = 0;
 MySRB.CDBByte[2]    = 0;
 MySRB.CDBByte[3]    = 0;
 MySRB.CDBByte[4]    = 32;
 MySRB.CDBByte[5]    = 0; 
  .
 /***************************************************/
 /* Make sure all other reserved fields are zeroed
 /* before passing the SRB to ASPI for Win32
 /***************************************************/
  .
 ASPIStatus = SendASPI32Command ( (LPSRB) &MySRB );
  .
  .