git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			242 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			242 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*++
 | 
						|
 | 
						|
Copyright (c) 2006, Intel Corporation                                                         
 | 
						|
All rights reserved. This program and the accompanying materials                          
 | 
						|
are licensed and made available under the terms and conditions of the BSD License         
 | 
						|
which accompanies this distribution.  The full text of the license may be found at        
 | 
						|
http://opensource.org/licenses/bsd-license.php                                            
 | 
						|
                                                                                          
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | 
						|
 | 
						|
Module Name:
 | 
						|
 | 
						|
  ScsiIo.h
 | 
						|
 | 
						|
Abstract:
 | 
						|
 | 
						|
  SCSI I/O protocol.
 | 
						|
 | 
						|
--*/
 | 
						|
 | 
						|
#ifndef __SCSI_IO_H__
 | 
						|
#define __SCSI_IO_H__
 | 
						|
 | 
						|
#define EFI_SCSI_IO_PROTOCOL_GUID \
 | 
						|
  { 0x403cd195, 0xf233, 0x48ec, {0x84, 0x55, 0xb2, 0xe5, 0x2f, 0x1d, 0x9e, 0x2  } }
 | 
						|
 | 
						|
//
 | 
						|
// Forward reference for pure ANSI compatability
 | 
						|
//
 | 
						|
typedef struct _EFI_SCSI_IO_PROTOCOL  EFI_SCSI_IO_PROTOCOL;
 | 
						|
 | 
						|
//
 | 
						|
// SCSI Host Adapter Status definition
 | 
						|
//
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_OK                     0x00
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_TIMEOUT_COMMAND        0x09    // timeout when processing the command
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_TIMEOUT                0x0b    // timeout when waiting for the command processing
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_MESSAGE_REJECT         0x0d    // a message reject was received when processing command
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_BUS_RESET              0x0e    // a bus reset was detected
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_PARITY_ERROR           0x0f
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_REQUEST_SENSE_FAILED   0x10    // the adapter failed in issuing request sense command
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_SELECTION_TIMEOUT      0x11    // selection timeout
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN  0x12    // data overrun or data underrun
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_BUS_FREE               0x13    // Unexepected bus free
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_PHASE_ERROR            0x14    // Target bus phase sequence failure
 | 
						|
#define EFI_SCSI_IO_STATUS_HOST_ADAPTER_OTHER                  0x7f
 | 
						|
 | 
						|
 | 
						|
//
 | 
						|
// SCSI Target Status definition
 | 
						|
//
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_GOOD                         0x00
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_CHECK_CONDITION              0x02    // check condition
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_CONDITION_MET                0x04    // condition met
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_BUSY                         0x08    // busy
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_INTERMEDIATE                 0x10    // intermediate
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_INTERMEDIATE_CONDITION_MET   0x14    // intermediate-condition met
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_RESERVATION_CONFLICT         0x18    // reservation conflict
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_COMMOND_TERMINATED           0x22    // command terminated
 | 
						|
#define EFI_SCSI_IO_STATUS_TARGET_QUEUE_FULL                   0x28    // queue full
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  UINT64      Timeout;
 | 
						|
  VOID        *DataBuffer;
 | 
						|
  VOID        *SenseData;
 | 
						|
  VOID        *Cdb;
 | 
						|
  UINT32      TransferLength;
 | 
						|
  UINT8       CdbLength;
 | 
						|
  UINT8       DataDirection;
 | 
						|
  UINT8       HostAdapterStatus;
 | 
						|
  UINT8       TargetStatus;
 | 
						|
  UINT8       SenseDataLength;
 | 
						|
}EFI_SCSI_IO_SCSI_REQUEST_PACKET;
 | 
						|
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SCSI_IO_PROTOCOL_GET_DEVICE_TYPE) (
 | 
						|
  IN EFI_SCSI_IO_PROTOCOL     *This,
 | 
						|
  OUT UINT8                           *DeviceType
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Retrieves the device type information of the SCSI Controller.
 | 
						|
    
 | 
						|
  Arguments:
 | 
						|
    This                  - Protocol instance pointer.
 | 
						|
    DeviceType            - A pointer to the device type information
 | 
						|
                            retrieved from the SCSI Controller. 
 | 
						|
 | 
						|
  Returns:
 | 
						|
    EFI_SUCCESS            - Retrieves the device type information successfully.
 | 
						|
    EFI_INVALID_PARAMETER  - The DeviceType is NULL.
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SCSI_IO_PROTOCOL_GET_DEVICE_LOCATION) (
 | 
						|
  IN EFI_SCSI_IO_PROTOCOL   *This,
 | 
						|
  OUT UINT32                        *Target,
 | 
						|
  OUT UINT64                        *Lun
 | 
						|
  )
 | 
						|
/*++
 | 
						|
  Routine Description:
 | 
						|
    Retrieves the device location in the SCSI channel.
 | 
						|
    
 | 
						|
  Arguments:
 | 
						|
    This                  - Protocol instance pointer.
 | 
						|
    Target                - A pointer to the Target ID of a SCSI device 
 | 
						|
                            on the SCSI channel. 
 | 
						|
    Lun                    - A pointer to the LUN of the SCSI device on 
 | 
						|
                            the SCSI channel.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    EFI_SUCCESS            - Retrieves the device location successfully.
 | 
						|
    EFI_INVALID_PARAMETER  - The Target or Lun is NULL.
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SCSI_IO_PROTOCOL_RESET_BUS) (
 | 
						|
  IN EFI_SCSI_IO_PROTOCOL     *This
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Resets the SCSI Bus that the SCSI Controller is attached to.
 | 
						|
    
 | 
						|
  Arguments:
 | 
						|
    This                  - Protocol instance pointer.
 | 
						|
 | 
						|
  Returns:
 | 
						|
    EFI_SUCCESS            - The SCSI bus is reset successfully.
 | 
						|
    EFI_DEVICE_ERROR      - Errors encountered when resetting the SCSI bus.
 | 
						|
    EFI_UNSUPPORTED        - The bus reset operation is not supported by the
 | 
						|
                            SCSI Host Controller.
 | 
						|
    EFI_TIMEOUT            - A timeout occurred while attempting to reset 
 | 
						|
                            the SCSI bus.
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SCSI_IO_PROTOCOL_RESET_DEVICE) (
 | 
						|
  IN EFI_SCSI_IO_PROTOCOL     *This
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Resets the SCSI Controller that the device handle specifies.
 | 
						|
    
 | 
						|
  Arguments:
 | 
						|
    This                  - Protocol instance pointer.
 | 
						|
    
 | 
						|
 | 
						|
  Returns:
 | 
						|
    EFI_SUCCESS            - Reset the SCSI controller successfully.
 | 
						|
    EFI_DEVICE_ERROR      - Errors are encountered when resetting the
 | 
						|
                            SCSI Controller.
 | 
						|
    EFI_UNSUPPORTED        - The SCSI bus does not support a device 
 | 
						|
                            reset operation.
 | 
						|
    EFI_TIMEOUT            - A timeout occurred while attempting to 
 | 
						|
                            reset the SCSI Controller.
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
 | 
						|
typedef
 | 
						|
EFI_STATUS
 | 
						|
(EFIAPI *EFI_SCSI_IO_PROTOCOL_EXEC_SCSI_CMD) (
 | 
						|
  IN EFI_SCSI_IO_PROTOCOL           *This,
 | 
						|
  IN OUT  EFI_SCSI_IO_SCSI_REQUEST_PACKET   *Packet,
 | 
						|
  IN EFI_EVENT                              Event  OPTIONAL
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
  Routine Description:
 | 
						|
    Sends a SCSI Request Packet to the SCSI Controller for execution.
 | 
						|
    
 | 
						|
  Arguments:
 | 
						|
    This                  - Protocol instance pointer.
 | 
						|
    Packet                - The SCSI request packet to send to the SCSI 
 | 
						|
                            Controller specified by the device handle.
 | 
						|
    Event                  - If the SCSI bus where the SCSI device is attached
 | 
						|
                            does not support non-blocking I/O, then Event is 
 | 
						|
                            ignored, and blocking I/O is performed.  
 | 
						|
                            If Event is NULL, then blocking I/O is performed.
 | 
						|
                            If Event is not NULL and non-blocking I/O is 
 | 
						|
                            supported, then non-blocking I/O is performed,
 | 
						|
                            and Event will be signaled when the SCSI Request
 | 
						|
                            Packet completes.
 | 
						|
  Returns:
 | 
						|
    EFI_SUCCESS            - The SCSI Request Packet was sent by the host 
 | 
						|
                            successfully, and TransferLength bytes were 
 | 
						|
                            transferred to/from DataBuffer.See 
 | 
						|
                            HostAdapterStatus, TargetStatus, 
 | 
						|
                            SenseDataLength, and SenseData in that order
 | 
						|
                            for additional status information.
 | 
						|
    EFI_WARN_BUFFER_TOO_SMALL  - The SCSI Request Packet was executed, 
 | 
						|
                            but the entire DataBuffer could not be transferred.
 | 
						|
                            The actual number of bytes transferred is returned
 | 
						|
                            in TransferLength. See HostAdapterStatus, 
 | 
						|
                            TargetStatus, SenseDataLength, and SenseData in 
 | 
						|
                            that order for additional status information.
 | 
						|
    EFI_NOT_READY          - The SCSI Request Packet could not be sent because 
 | 
						|
                            there are too many SCSI Command Packets already 
 | 
						|
                            queued.The caller may retry again later.
 | 
						|
    EFI_DEVICE_ERROR      - A device error occurred while attempting to send 
 | 
						|
                            the SCSI Request Packet. See HostAdapterStatus, 
 | 
						|
                            TargetStatus, SenseDataLength, and SenseData in 
 | 
						|
                            that order for additional status information.
 | 
						|
    EFI_INVALID_PARAMETER  - The contents of CommandPacket are invalid.  
 | 
						|
                            The SCSI Request Packet was not sent, so no 
 | 
						|
                            additional status information is available.
 | 
						|
    EFI_UNSUPPORTED        - The command described by the SCSI Request Packet
 | 
						|
                            is not supported by the SCSI initiator(i.e., SCSI 
 | 
						|
                            Host Controller). The SCSI Request Packet was not
 | 
						|
                            sent, so no additional status information is 
 | 
						|
                            available.
 | 
						|
    EFI_TIMEOUT            - A timeout occurred while waiting for the SCSI 
 | 
						|
                            Request Packet to execute. See HostAdapterStatus,
 | 
						|
                            TargetStatus, SenseDataLength, and SenseData in 
 | 
						|
                            that order for additional status information.
 | 
						|
--*/
 | 
						|
;
 | 
						|
 | 
						|
struct _EFI_SCSI_IO_PROTOCOL {
 | 
						|
    EFI_SCSI_IO_PROTOCOL_GET_DEVICE_TYPE      GetDeviceType;
 | 
						|
    EFI_SCSI_IO_PROTOCOL_GET_DEVICE_LOCATION  GetDeviceLocation;
 | 
						|
    EFI_SCSI_IO_PROTOCOL_RESET_BUS            ResetBus;
 | 
						|
    EFI_SCSI_IO_PROTOCOL_RESET_DEVICE         ResetDevice;
 | 
						|
    EFI_SCSI_IO_PROTOCOL_EXEC_SCSI_CMD        ExecuteSCSICommand;    
 | 
						|
};
 | 
						|
 | 
						|
extern EFI_GUID gEfiScsiIoProtocolGuid;
 | 
						|
 | 
						|
#endif
 | 
						|
 |