Home | History | Annotate | Download | only in AtaAtapiPassThru
      1 /** @file
      2   Header file for ATA/ATAPI PASS THRU driver.
      3 
      4   Copyright (c) 2010 - 2016, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 #ifndef __ATA_ATAPI_PASS_THRU_H__
     15 #define __ATA_ATAPI_PASS_THRU_H__
     16 
     17 #include <Uefi.h>
     18 
     19 #include <IndustryStandard/Pci.h>
     20 #include <IndustryStandard/Atapi.h>
     21 #include <IndustryStandard/Scsi.h>
     22 
     23 #include <Protocol/PciIo.h>
     24 #include <Protocol/IdeControllerInit.h>
     25 #include <Protocol/AtaPassThru.h>
     26 #include <Protocol/ScsiPassThruExt.h>
     27 
     28 #include <Library/DebugLib.h>
     29 #include <Library/BaseLib.h>
     30 #include <Library/BaseMemoryLib.h>
     31 #include <Library/UefiDriverEntryPoint.h>
     32 #include <Library/UefiBootServicesTableLib.h>
     33 #include <Library/UefiLib.h>
     34 #include <Library/PciLib.h>
     35 #include <Library/PcdLib.h>
     36 #include <Library/TimerLib.h>
     37 #include <Library/MemoryAllocationLib.h>
     38 #include <Library/ReportStatusCodeLib.h>
     39 #include <Library/DevicePathLib.h>
     40 
     41 #include "IdeMode.h"
     42 #include "AhciMode.h"
     43 
     44 extern EFI_DRIVER_BINDING_PROTOCOL  gAtaAtapiPassThruDriverBinding;
     45 extern EFI_COMPONENT_NAME_PROTOCOL  gAtaAtapiPassThruComponentName;
     46 extern EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2;
     47 
     48 #define ATA_ATAPI_PASS_THRU_SIGNATURE  SIGNATURE_32 ('a', 'a', 'p', 't')
     49 #define ATA_ATAPI_DEVICE_SIGNATURE     SIGNATURE_32 ('a', 'd', 'e', 'v')
     50 #define ATA_NONBLOCKING_TASK_SIGNATURE  SIGNATURE_32 ('a', 't', 's', 'k')
     51 
     52 typedef struct _ATA_NONBLOCK_TASK ATA_NONBLOCK_TASK;
     53 
     54 typedef enum {
     55   EfiAtaIdeMode,
     56   EfiAtaAhciMode,
     57   EfiAtaRaidMode,
     58   EfiAtaUnknownMode
     59 } EFI_ATA_HC_WORK_MODE;
     60 
     61 typedef enum {
     62   EfiIdeCdrom,                  /* ATAPI CDROM */
     63   EfiIdeHarddisk,               /* Hard Disk */
     64   EfiPortMultiplier,            /* Port Multiplier */
     65   EfiIdeUnknown
     66 } EFI_ATA_DEVICE_TYPE;
     67 
     68 //
     69 // Ahci mode device info
     70 //
     71 typedef struct {
     72   UINT32                            Signature;
     73   LIST_ENTRY                        Link;
     74 
     75   UINT16                            Port;
     76   UINT16                            PortMultiplier;
     77   EFI_ATA_DEVICE_TYPE               Type;
     78 
     79   EFI_IDENTIFY_DATA                 *IdentifyData;
     80 } EFI_ATA_DEVICE_INFO;
     81 
     82 typedef struct {
     83   UINT32                            Signature;
     84 
     85   EFI_HANDLE                        ControllerHandle;
     86   EFI_PCI_IO_PROTOCOL               *PciIo;
     87   EFI_IDE_CONTROLLER_INIT_PROTOCOL  *IdeControllerInit;
     88 
     89   EFI_ATA_PASS_THRU_MODE            AtaPassThruMode;
     90   EFI_ATA_PASS_THRU_PROTOCOL        AtaPassThru;
     91   EFI_EXT_SCSI_PASS_THRU_MODE       ExtScsiPassThruMode;
     92   EFI_EXT_SCSI_PASS_THRU_PROTOCOL   ExtScsiPassThru;
     93 
     94   EFI_ATA_HC_WORK_MODE              Mode;
     95 
     96   EFI_IDE_REGISTERS                 IdeRegisters[EfiIdeMaxChannel];
     97   EFI_AHCI_REGISTERS                AhciRegisters;
     98 
     99   //
    100   // The attached device list
    101   //
    102   LIST_ENTRY                        DeviceList;
    103   UINT64                            OriginalPciAttributes;
    104 
    105   //
    106   // For AtaPassThru protocol, using the following bytes to record the previous call in
    107   // GetNextPort()/GetNextDevice().
    108   //
    109   UINT16                            PreviousPort;
    110   UINT16                            PreviousPortMultiplier;
    111   //
    112   // For ExtScsiPassThru protocol, using the following bytes to record the previous call in
    113   // GetNextTarget()/GetNextTargetLun().
    114   //
    115   UINT16                            PreviousTargetId;
    116   UINT64                            PreviousLun;
    117 
    118   //
    119   // For Non-blocking.
    120   //
    121   EFI_EVENT                         TimerEvent;
    122   LIST_ENTRY                        NonBlockingTaskList;
    123 } ATA_ATAPI_PASS_THRU_INSTANCE;
    124 
    125 //
    126 // Task for Non-blocking mode.
    127 //
    128 struct _ATA_NONBLOCK_TASK {
    129   UINT32                            Signature;
    130   LIST_ENTRY                        Link;
    131 
    132   UINT16                            Port;
    133   UINT16                            PortMultiplier;
    134   EFI_ATA_PASS_THRU_COMMAND_PACKET  *Packet;
    135   BOOLEAN                           IsStart;
    136   EFI_EVENT                         Event;
    137   UINT64                            RetryTimes;
    138   BOOLEAN                           InfiniteWait;
    139   VOID                              *Map;            // Pointer to map.
    140   VOID                              *TableMap;       // Pointer to PRD table map.
    141   EFI_ATA_DMA_PRD                   *MapBaseAddress; //  Pointer to range Base address for Map.
    142   UINTN                             PageCount;       //  The page numbers used by PCIO freebuffer.
    143 };
    144 
    145 //
    146 // Timeout value which uses 100ns as a unit.
    147 // It means 3 second span.
    148 //
    149 #define ATA_ATAPI_TIMEOUT           EFI_TIMER_PERIOD_SECONDS(3)
    150 
    151 #define IS_ALIGNED(addr, size)      (((UINTN) (addr) & (size - 1)) == 0)
    152 
    153 #define ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS(a) \
    154   CR (a, \
    155       ATA_ATAPI_PASS_THRU_INSTANCE, \
    156       AtaPassThru, \
    157       ATA_ATAPI_PASS_THRU_SIGNATURE \
    158       )
    159 
    160 #define EXT_SCSI_PASS_THRU_PRIVATE_DATA_FROM_THIS(a) \
    161   CR (a, \
    162       ATA_ATAPI_PASS_THRU_INSTANCE, \
    163       ExtScsiPassThru, \
    164       ATA_ATAPI_PASS_THRU_SIGNATURE \
    165       )
    166 
    167 #define ATA_ATAPI_DEVICE_INFO_FROM_THIS(a) \
    168   CR (a, \
    169       EFI_ATA_DEVICE_INFO, \
    170       Link, \
    171       ATA_ATAPI_DEVICE_SIGNATURE \
    172       );
    173 
    174 #define ATA_NON_BLOCK_TASK_FROM_ENTRY(a) \
    175   CR (a, \
    176       ATA_NONBLOCK_TASK, \
    177       Link, \
    178       ATA_NONBLOCKING_TASK_SIGNATURE \
    179       );
    180 
    181 /**
    182   Retrieves a Unicode string that is the user readable name of the driver.
    183 
    184   This function retrieves the user readable name of a driver in the form of a
    185   Unicode string. If the driver specified by This has a user readable name in
    186   the language specified by Language, then a pointer to the driver name is
    187   returned in DriverName, and EFI_SUCCESS is returned. If the driver specified
    188   by This does not support the language specified by Language,
    189   then EFI_UNSUPPORTED is returned.
    190 
    191   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
    192                                 EFI_COMPONENT_NAME_PROTOCOL instance.
    193 
    194   @param  Language[in]          A pointer to a Null-terminated ASCII string
    195                                 array indicating the language. This is the
    196                                 language of the driver name that the caller is
    197                                 requesting, and it must match one of the
    198                                 languages specified in SupportedLanguages. The
    199                                 number of languages supported by a driver is up
    200                                 to the driver writer. Language is specified
    201                                 in RFC 4646 or ISO 639-2 language code format.
    202 
    203   @param  DriverName[out]       A pointer to the Unicode string to return.
    204                                 This Unicode string is the name of the
    205                                 driver specified by This in the language
    206                                 specified by Language.
    207 
    208   @retval EFI_SUCCESS           The Unicode string for the Driver specified by
    209                                 This and the language specified by Language was
    210                                 returned in DriverName.
    211 
    212   @retval EFI_INVALID_PARAMETER Language is NULL.
    213 
    214   @retval EFI_INVALID_PARAMETER DriverName is NULL.
    215 
    216   @retval EFI_UNSUPPORTED       The driver specified by This does not support
    217                                 the language specified by Language.
    218 
    219 **/
    220 EFI_STATUS
    221 EFIAPI
    222 AtaAtapiPassThruComponentNameGetDriverName (
    223   IN  EFI_COMPONENT_NAME_PROTOCOL  *This,
    224   IN  CHAR8                        *Language,
    225   OUT CHAR16                       **DriverName
    226   );
    227 
    228 /**
    229   Retrieves a Unicode string that is the user readable name of the controller
    230   that is being managed by a driver.
    231 
    232   This function retrieves the user readable name of the controller specified by
    233   ControllerHandle and ChildHandle in the form of a Unicode string. If the
    234   driver specified by This has a user readable name in the language specified by
    235   Language, then a pointer to the controller name is returned in ControllerName,
    236   and EFI_SUCCESS is returned.  If the driver specified by This is not currently
    237   managing the controller specified by ControllerHandle and ChildHandle,
    238   then EFI_UNSUPPORTED is returned.  If the driver specified by This does not
    239   support the language specified by Language, then EFI_UNSUPPORTED is returned.
    240 
    241   @param  This[in]              A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or
    242                                 EFI_COMPONENT_NAME_PROTOCOL instance.
    243 
    244   @param  ControllerHandle[in]  The handle of a controller that the driver
    245                                 specified by This is managing.  This handle
    246                                 specifies the controller whose name is to be
    247                                 returned.
    248 
    249   @param  ChildHandle[in]       The handle of the child controller to retrieve
    250                                 the name of.  This is an optional parameter that
    251                                 may be NULL.  It will be NULL for device
    252                                 drivers.  It will also be NULL for a bus drivers
    253                                 that wish to retrieve the name of the bus
    254                                 controller.  It will not be NULL for a bus
    255                                 driver that wishes to retrieve the name of a
    256                                 child controller.
    257 
    258   @param  Language[in]          A pointer to a Null-terminated ASCII string
    259                                 array indicating the language.  This is the
    260                                 language of the driver name that the caller is
    261                                 requesting, and it must match one of the
    262                                 languages specified in SupportedLanguages. The
    263                                 number of languages supported by a driver is up
    264                                 to the driver writer. Language is specified in
    265                                 RFC 4646 or ISO 639-2 language code format.
    266 
    267   @param  ControllerName[out]   A pointer to the Unicode string to return.
    268                                 This Unicode string is the name of the
    269                                 controller specified by ControllerHandle and
    270                                 ChildHandle in the language specified by
    271                                 Language from the point of view of the driver
    272                                 specified by This.
    273 
    274   @retval EFI_SUCCESS           The Unicode string for the user readable name in
    275                                 the language specified by Language for the
    276                                 driver specified by This was returned in
    277                                 DriverName.
    278 
    279   @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
    280 
    281   @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
    282                                 EFI_HANDLE.
    283 
    284   @retval EFI_INVALID_PARAMETER Language is NULL.
    285 
    286   @retval EFI_INVALID_PARAMETER ControllerName is NULL.
    287 
    288   @retval EFI_UNSUPPORTED       The driver specified by This is not currently
    289                                 managing the controller specified by
    290                                 ControllerHandle and ChildHandle.
    291 
    292   @retval EFI_UNSUPPORTED       The driver specified by This does not support
    293                                 the language specified by Language.
    294 
    295 **/
    296 EFI_STATUS
    297 EFIAPI
    298 AtaAtapiPassThruComponentNameGetControllerName (
    299   IN  EFI_COMPONENT_NAME_PROTOCOL                     *This,
    300   IN  EFI_HANDLE                                      ControllerHandle,
    301   IN  EFI_HANDLE                                      ChildHandle        OPTIONAL,
    302   IN  CHAR8                                           *Language,
    303   OUT CHAR16                                          **ControllerName
    304   );
    305 
    306 /**
    307   Tests to see if this driver supports a given controller. If a child device is provided,
    308   it further tests to see if this driver supports creating a handle for the specified child device.
    309 
    310   This function checks to see if the driver specified by This supports the device specified by
    311   ControllerHandle. Drivers will typically use the device path attached to
    312   ControllerHandle and/or the services from the bus I/O abstraction attached to
    313   ControllerHandle to determine if the driver supports ControllerHandle. This function
    314   may be called many times during platform initialization. In order to reduce boot times, the tests
    315   performed by this function must be very small, and take as little time as possible to execute. This
    316   function must not change the state of any hardware devices, and this function must be aware that the
    317   device specified by ControllerHandle may already be managed by the same driver or a
    318   different driver. This function must match its calls to AllocatePages() with FreePages(),
    319   AllocatePool() with FreePool(), and OpenProtocol() with CloseProtocol().
    320   Because ControllerHandle may have been previously started by the same driver, if a protocol is
    321   already in the opened state, then it must not be closed with CloseProtocol(). This is required
    322   to guarantee the state of ControllerHandle is not modified by this function.
    323 
    324   @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
    325   @param[in]  ControllerHandle     The handle of the controller to test. This handle
    326                                    must support a protocol interface that supplies
    327                                    an I/O abstraction to the driver.
    328   @param[in]  RemainingDevicePath  A pointer to the remaining portion of a device path.  This
    329                                    parameter is ignored by device drivers, and is optional for bus
    330                                    drivers. For bus drivers, if this parameter is not NULL, then
    331                                    the bus driver must determine if the bus controller specified
    332                                    by ControllerHandle and the child controller specified
    333                                    by RemainingDevicePath are both supported by this
    334                                    bus driver.
    335 
    336   @retval EFI_SUCCESS              The device specified by ControllerHandle and
    337                                    RemainingDevicePath is supported by the driver specified by This.
    338   @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle and
    339                                    RemainingDevicePath is already being managed by the driver
    340                                    specified by This.
    341   @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle and
    342                                    RemainingDevicePath is already being managed by a different
    343                                    driver or an application that requires exclusive access.
    344                                    Currently not implemented.
    345   @retval EFI_UNSUPPORTED          The device specified by ControllerHandle and
    346                                    RemainingDevicePath is not supported by the driver specified by This.
    347 **/
    348 EFI_STATUS
    349 EFIAPI
    350 AtaAtapiPassThruSupported (
    351   IN EFI_DRIVER_BINDING_PROTOCOL       *This,
    352   IN EFI_HANDLE                        Controller,
    353   IN EFI_DEVICE_PATH_PROTOCOL          *RemainingDevicePath
    354   );
    355 
    356 /**
    357   Starts a device controller or a bus controller.
    358 
    359   The Start() function is designed to be invoked from the EFI boot service ConnectController().
    360   As a result, much of the error checking on the parameters to Start() has been moved into this
    361   common boot service. It is legal to call Start() from other locations,
    362   but the following calling restrictions must be followed, or the system behavior will not be deterministic.
    363   1. ControllerHandle must be a valid EFI_HANDLE.
    364   2. If RemainingDevicePath is not NULL, then it must be a pointer to a naturally aligned
    365      EFI_DEVICE_PATH_PROTOCOL.
    366   3. Prior to calling Start(), the Supported() function for the driver specified by This must
    367      have been called with the same calling parameters, and Supported() must have returned EFI_SUCCESS.
    368 
    369   @param[in]  This                 A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
    370   @param[in]  ControllerHandle     The handle of the controller to start. This handle
    371                                    must support a protocol interface that supplies
    372                                    an I/O abstraction to the driver.
    373   @param[in]  RemainingDevicePath  A pointer to the remaining portion of a device path.  This
    374                                    parameter is ignored by device drivers, and is optional for bus
    375                                    drivers. For a bus driver, if this parameter is NULL, then handles
    376                                    for all the children of Controller are created by this driver.
    377                                    If this parameter is not NULL and the first Device Path Node is
    378                                    not the End of Device Path Node, then only the handle for the
    379                                    child device specified by the first Device Path Node of
    380                                    RemainingDevicePath is created by this driver.
    381                                    If the first Device Path Node of RemainingDevicePath is
    382                                    the End of Device Path Node, no child handle is created by this
    383                                    driver.
    384 
    385   @retval EFI_SUCCESS              The device was started.
    386   @retval EFI_DEVICE_ERROR         The device could not be started due to a device error.Currently not implemented.
    387   @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to a lack of resources.
    388   @retval Others                   The driver failded to start the device.
    389 
    390 **/
    391 EFI_STATUS
    392 EFIAPI
    393 AtaAtapiPassThruStart (
    394   IN EFI_DRIVER_BINDING_PROTOCOL        *This,
    395   IN EFI_HANDLE                         Controller,
    396   IN EFI_DEVICE_PATH_PROTOCOL           *RemainingDevicePath
    397   );
    398 
    399 /**
    400   Stops a device controller or a bus controller.
    401 
    402   The Stop() function is designed to be invoked from the EFI boot service DisconnectController().
    403   As a result, much of the error checking on the parameters to Stop() has been moved
    404   into this common boot service. It is legal to call Stop() from other locations,
    405   but the following calling restrictions must be followed, or the system behavior will not be deterministic.
    406   1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous call to this
    407      same driver's Start() function.
    408   2. The first NumberOfChildren handles of ChildHandleBuffer must all be a valid
    409      EFI_HANDLE. In addition, all of these handles must have been created in this driver's
    410      Start() function, and the Start() function must have called OpenProtocol() on
    411      ControllerHandle with an Attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
    412 
    413   @param[in]  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance.
    414   @param[in]  ControllerHandle  A handle to the device being stopped. The handle must
    415                                 support a bus specific I/O protocol for the driver
    416                                 to use to stop the device.
    417   @param[in]  NumberOfChildren  The number of child device handles in ChildHandleBuffer.
    418   @param[in]  ChildHandleBuffer An array of child handles to be freed. May be NULL
    419                                 if NumberOfChildren is 0.
    420 
    421   @retval EFI_SUCCESS           The device was stopped.
    422   @retval EFI_DEVICE_ERROR      The device could not be stopped due to a device error.
    423 
    424 **/
    425 EFI_STATUS
    426 EFIAPI
    427 AtaAtapiPassThruStop (
    428   IN  EFI_DRIVER_BINDING_PROTOCOL       *This,
    429   IN  EFI_HANDLE                        Controller,
    430   IN  UINTN                             NumberOfChildren,
    431   IN  EFI_HANDLE                        *ChildHandleBuffer
    432   );
    433 
    434 /**
    435   Traverse the attached ATA devices list to find out the device to access.
    436 
    437   @param[in]  Instance            A pointer to the ATA_ATAPI_PASS_THRU_INSTANCE instance.
    438   @param[in]  Port                The port number of the ATA device to send the command.
    439   @param[in]  PortMultiplierPort  The port multiplier port number of the ATA device to send the command.
    440                                   If there is no port multiplier, then specify 0xFFFF.
    441   @param[in]  DeviceType          The device type of the ATA device.
    442 
    443   @retval     The pointer to the data structure of the device info to access.
    444 
    445 **/
    446 LIST_ENTRY *
    447 EFIAPI
    448 SearchDeviceInfoList (
    449   IN  ATA_ATAPI_PASS_THRU_INSTANCE  *Instance,
    450   IN  UINT16                         Port,
    451   IN  UINT16                         PortMultiplier,
    452   IN  EFI_ATA_DEVICE_TYPE            DeviceType
    453   );
    454 
    455 /**
    456   Allocate device info data structure to contain device info.
    457   And insert the data structure to the tail of device list for tracing.
    458 
    459   @param[in]  Instance            A pointer to the ATA_ATAPI_PASS_THRU_INSTANCE instance.
    460   @param[in]  Port                The port number of the ATA device to send the command.
    461   @param[in]  PortMultiplierPort  The port multiplier port number of the ATA device to send the command.
    462                                   If there is no port multiplier, then specify 0xFFFF.
    463   @param[in]  DeviceType          The device type of the ATA device.
    464   @param[in]  IdentifyData        The data buffer to store the output of the IDENTIFY cmd.
    465 
    466   @retval EFI_SUCCESS             Successfully insert the ata device to the tail of device list.
    467   @retval EFI_OUT_OF_RESOURCES    Can not allocate enough resource for use.
    468 
    469 **/
    470 EFI_STATUS
    471 EFIAPI
    472 CreateNewDeviceInfo (
    473   IN  ATA_ATAPI_PASS_THRU_INSTANCE  *Instance,
    474   IN  UINT16                         Port,
    475   IN  UINT16                         PortMultiplier,
    476   IN  EFI_ATA_DEVICE_TYPE            DeviceType,
    477   IN  EFI_IDENTIFY_DATA              *IdentifyData
    478   );
    479 
    480 /**
    481   Destroy all attached ATA devices info.
    482 
    483   @param[in]  Instance          A pointer to the ATA_ATAPI_PASS_THRU_INSTANCE instance.
    484 
    485 **/
    486 VOID
    487 EFIAPI
    488 DestroyDeviceInfoList (
    489   IN  ATA_ATAPI_PASS_THRU_INSTANCE  *Instance
    490   );
    491 
    492 /**
    493   Destroy all pending non blocking tasks.
    494 
    495   @param[in]  Instance    A pointer to the ATA_ATAPI_PASS_THRU_INSTANCE instance.
    496   @param[in]  IsSigEvent  Indicate whether signal the task event when remove the
    497                           task.
    498 
    499 **/
    500 VOID
    501 EFIAPI
    502 DestroyAsynTaskList (
    503   IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
    504   IN BOOLEAN                       IsSigEvent
    505   );
    506 
    507 /**
    508   Enumerate all attached ATA devices at IDE mode or AHCI mode separately.
    509 
    510   The function is designed to enumerate all attached ATA devices.
    511 
    512   @param[in]  Instance          A pointer to the ATA_ATAPI_PASS_THRU_INSTANCE instance.
    513 
    514   @retval EFI_SUCCESS           Successfully enumerate attached ATA devices.
    515   @retval EFI_DEVICE_ERROR      The device could not be stopped due to a device error.
    516 
    517 **/
    518 EFI_STATUS
    519 EFIAPI
    520 EnumerateAttachedDevice (
    521   IN  ATA_ATAPI_PASS_THRU_INSTANCE      *Instance
    522   );
    523 
    524 /**
    525   Call back funtion when the timer event is signaled.
    526 
    527   @param[in]  Event     The Event this notify function registered to.
    528   @param[in]  Context   Pointer to the context data registered to the
    529                         Event.
    530 
    531 **/
    532 VOID
    533 EFIAPI
    534 AsyncNonBlockingTransferRoutine (
    535   EFI_EVENT  Event,
    536   VOID*      Context
    537   );
    538 
    539 /**
    540   Sends an ATA command to an ATA device that is attached to the ATA controller. This function
    541   supports both blocking I/O and non-blocking I/O. The blocking I/O functionality is required,
    542   and the non-blocking I/O functionality is optional.
    543 
    544   @param[in]      This               A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
    545   @param[in]      Port               The port number of the ATA device to send the command.
    546   @param[in]      PortMultiplierPort The port multiplier port number of the ATA device to send the command.
    547                                      If there is no port multiplier, then specify 0xFFFF.
    548   @param[in, out] Packet             A pointer to the ATA command to send to the ATA device specified by Port
    549                                      and PortMultiplierPort.
    550   @param[in]      Event              If non-blocking I/O is not supported then Event is ignored, and blocking
    551                                      I/O is performed. If Event is NULL, then blocking I/O is performed. If
    552                                      Event is not NULL and non blocking I/O is supported, then non-blocking
    553                                      I/O is performed, and Event will be signaled when the ATA command completes.
    554 
    555   @retval EFI_SUCCESS                The ATA command was sent by the host. For bi-directional commands,
    556                                      InTransferLength bytes were transferred from InDataBuffer. For write and
    557                                      bi-directional commands, OutTransferLength bytes were transferred by OutDataBuffer.
    558   @retval EFI_BAD_BUFFER_SIZE        The ATA command was not executed. The number of bytes that could be transferred
    559                                      is returned in InTransferLength. For write and bi-directional commands,
    560                                      OutTransferLength bytes were transferred by OutDataBuffer.
    561   @retval EFI_NOT_READY              The ATA command could not be sent because there are too many ATA commands
    562                                      already queued. The caller may retry again later.
    563   @retval EFI_DEVICE_ERROR           A device error occurred while attempting to send the ATA command.
    564   @retval EFI_INVALID_PARAMETER      Port, PortMultiplierPort, or the contents of Acb are invalid. The ATA
    565                                      command was not sent, so no additional status information is available.
    566 
    567 **/
    568 EFI_STATUS
    569 EFIAPI
    570 AtaPassThruPassThru (
    571   IN     EFI_ATA_PASS_THRU_PROTOCOL       *This,
    572   IN     UINT16                           Port,
    573   IN     UINT16                           PortMultiplierPort,
    574   IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet,
    575   IN     EFI_EVENT                        Event OPTIONAL
    576   );
    577 
    578 /**
    579   Used to retrieve the list of legal port numbers for ATA devices on an ATA controller.
    580   These can either be the list of ports where ATA devices are actually present or the
    581   list of legal port numbers for the ATA controller. Regardless, the caller of this
    582   function must probe the port number returned to see if an ATA device is actually
    583   present at that location on the ATA controller.
    584 
    585   The GetNextPort() function retrieves the port number on an ATA controller. If on input
    586   Port is 0xFFFF, then the port number of the first port on the ATA controller is returned
    587   in Port and EFI_SUCCESS is returned.
    588 
    589   If Port is a port number that was returned on a previous call to GetNextPort(), then the
    590   port number of the next port on the ATA controller is returned in Port, and EFI_SUCCESS
    591   is returned. If Port is not 0xFFFF and Port was not returned on a previous call to
    592   GetNextPort(), then EFI_INVALID_PARAMETER is returned.
    593 
    594   If Port is the port number of the last port on the ATA controller, then EFI_NOT_FOUND is
    595   returned.
    596 
    597   @param[in]      This          A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
    598   @param[in, out] Port          On input, a pointer to the port number on the ATA controller.
    599                                 On output, a pointer to the next port number on the ATA
    600                                 controller. An input value of 0xFFFF retrieves the first port
    601                                 number on the ATA controller.
    602 
    603   @retval EFI_SUCCESS           The next port number on the ATA controller was returned in Port.
    604   @retval EFI_NOT_FOUND         There are no more ports on this ATA controller.
    605   @retval EFI_INVALID_PARAMETER Port is not 0xFFFF and Port was not returned on a previous call
    606                                 to GetNextPort().
    607 
    608 **/
    609 EFI_STATUS
    610 EFIAPI
    611 AtaPassThruGetNextPort (
    612   IN EFI_ATA_PASS_THRU_PROTOCOL *This,
    613   IN OUT UINT16                 *Port
    614   );
    615 
    616 /**
    617   Used to retrieve the list of legal port multiplier port numbers for ATA devices on a port of an ATA
    618   controller. These can either be the list of port multiplier ports where ATA devices are actually
    619   present on port or the list of legal port multiplier ports on that port. Regardless, the caller of this
    620   function must probe the port number and port multiplier port number returned to see if an ATA
    621   device is actually present.
    622 
    623   The GetNextDevice() function retrieves the port multiplier port number of an ATA device
    624   present on a port of an ATA controller.
    625 
    626   If PortMultiplierPort points to a port multiplier port number value that was returned on a
    627   previous call to GetNextDevice(), then the port multiplier port number of the next ATA device
    628   on the port of the ATA controller is returned in PortMultiplierPort, and EFI_SUCCESS is
    629   returned.
    630 
    631   If PortMultiplierPort points to 0xFFFF, then the port multiplier port number of the first
    632   ATA device on port of the ATA controller is returned in PortMultiplierPort and
    633   EFI_SUCCESS is returned.
    634 
    635   If PortMultiplierPort is not 0xFFFF and the value pointed to by PortMultiplierPort
    636   was not returned on a previous call to GetNextDevice(), then EFI_INVALID_PARAMETER
    637   is returned.
    638 
    639   If PortMultiplierPort is the port multiplier port number of the last ATA device on the port of
    640   the ATA controller, then EFI_NOT_FOUND is returned.
    641 
    642   @param[in]      This               A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
    643   @param[in]      Port               The port number present on the ATA controller.
    644   @param[in, out] PortMultiplierPort On input, a pointer to the port multiplier port number of an
    645                                      ATA device present on the ATA controller.
    646                                      If on input a PortMultiplierPort of 0xFFFF is specified,
    647                                      then the port multiplier port number of the first ATA device
    648                                      is returned. On output, a pointer to the port multiplier port
    649                                      number of the next ATA device present on an ATA controller.
    650 
    651   @retval EFI_SUCCESS                The port multiplier port number of the next ATA device on the port
    652                                      of the ATA controller was returned in PortMultiplierPort.
    653   @retval EFI_NOT_FOUND              There are no more ATA devices on this port of the ATA controller.
    654   @retval EFI_INVALID_PARAMETER      PortMultiplierPort is not 0xFFFF, and PortMultiplierPort was not
    655                                      returned on a previous call to GetNextDevice().
    656 
    657 **/
    658 EFI_STATUS
    659 EFIAPI
    660 AtaPassThruGetNextDevice (
    661   IN EFI_ATA_PASS_THRU_PROTOCOL *This,
    662   IN UINT16                     Port,
    663   IN OUT UINT16                 *PortMultiplierPort
    664   );
    665 
    666 /**
    667   Used to allocate and build a device path node for an ATA device on an ATA controller.
    668 
    669   The BuildDevicePath() function allocates and builds a single device node for the ATA
    670   device specified by Port and PortMultiplierPort. If the ATA device specified by Port and
    671   PortMultiplierPort is not present on the ATA controller, then EFI_NOT_FOUND is returned.
    672   If DevicePath is NULL, then EFI_INVALID_PARAMETER is returned. If there are not enough
    673   resources to allocate the device path node, then EFI_OUT_OF_RESOURCES is returned.
    674 
    675   Otherwise, DevicePath is allocated with the boot service AllocatePool(), the contents of
    676   DevicePath are initialized to describe the ATA device specified by Port and PortMultiplierPort,
    677   and EFI_SUCCESS is returned.
    678 
    679   @param[in]      This               A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
    680   @param[in]      Port               Port specifies the port number of the ATA device for which a
    681                                      device path node is to be allocated and built.
    682   @param[in]      PortMultiplierPort The port multiplier port number of the ATA device for which a
    683                                      device path node is to be allocated and built. If there is no
    684                                      port multiplier, then specify 0xFFFF.
    685   @param[in, out] DevicePath         A pointer to a single device path node that describes the ATA
    686                                      device specified by Port and PortMultiplierPort. This function
    687                                      is responsible for allocating the buffer DevicePath with the
    688                                      boot service AllocatePool(). It is the caller's responsibility
    689                                      to free DevicePath when the caller is finished with DevicePath.
    690   @retval EFI_SUCCESS                The device path node that describes the ATA device specified by
    691                                      Port and PortMultiplierPort was allocated and returned in DevicePath.
    692   @retval EFI_NOT_FOUND              The ATA device specified by Port and PortMultiplierPort does not
    693                                      exist on the ATA controller.
    694   @retval EFI_INVALID_PARAMETER      DevicePath is NULL.
    695   @retval EFI_OUT_OF_RESOURCES       There are not enough resources to allocate DevicePath.
    696 
    697 **/
    698 EFI_STATUS
    699 EFIAPI
    700 AtaPassThruBuildDevicePath (
    701   IN     EFI_ATA_PASS_THRU_PROTOCOL *This,
    702   IN     UINT16                     Port,
    703   IN     UINT16                     PortMultiplierPort,
    704   IN OUT EFI_DEVICE_PATH_PROTOCOL   **DevicePath
    705   );
    706 
    707 /**
    708   Used to translate a device path node to a port number and port multiplier port number.
    709 
    710   The GetDevice() function determines the port and port multiplier port number associated with
    711   the ATA device described by DevicePath. If DevicePath is a device path node type that the
    712   ATA Pass Thru driver supports, then the ATA Pass Thru driver will attempt to translate the contents
    713   DevicePath into a port number and port multiplier port number.
    714 
    715   If this translation is successful, then that port number and port multiplier port number are returned
    716   in Port and PortMultiplierPort, and EFI_SUCCESS is returned.
    717 
    718   If DevicePath, Port, or PortMultiplierPort are NULL, then EFI_INVALID_PARAMETER is returned.
    719 
    720   If DevicePath is not a device path node type that the ATA Pass Thru driver supports, then
    721   EFI_UNSUPPORTED is returned.
    722 
    723   If DevicePath is a device path node type that the ATA Pass Thru driver supports, but there is not
    724   a valid translation from DevicePath to a port number and port multiplier port number, then
    725   EFI_NOT_FOUND is returned.
    726 
    727   @param[in]  This                A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
    728   @param[in]  DevicePath          A pointer to the device path node that describes an ATA device on the
    729                                   ATA controller.
    730   @param[out] Port                On return, points to the port number of an ATA device on the ATA controller.
    731   @param[out] PortMultiplierPort  On return, points to the port multiplier port number of an ATA device
    732                                   on the ATA controller.
    733 
    734   @retval EFI_SUCCESS             DevicePath was successfully translated to a port number and port multiplier
    735                                   port number, and they were returned in Port and PortMultiplierPort.
    736   @retval EFI_INVALID_PARAMETER   DevicePath is NULL.
    737   @retval EFI_INVALID_PARAMETER   Port is NULL.
    738   @retval EFI_INVALID_PARAMETER   PortMultiplierPort is NULL.
    739   @retval EFI_UNSUPPORTED         This driver does not support the device path node type in DevicePath.
    740   @retval EFI_NOT_FOUND           A valid translation from DevicePath to a port number and port multiplier
    741                                   port number does not exist.
    742 
    743 **/
    744 EFI_STATUS
    745 EFIAPI
    746 AtaPassThruGetDevice (
    747   IN  EFI_ATA_PASS_THRU_PROTOCOL *This,
    748   IN  EFI_DEVICE_PATH_PROTOCOL   *DevicePath,
    749   OUT UINT16                     *Port,
    750   OUT UINT16                     *PortMultiplierPort
    751   );
    752 
    753 /**
    754   Resets a specific port on the ATA controller. This operation also resets all the ATA devices
    755   connected to the port.
    756 
    757   The ResetChannel() function resets an a specific port on an ATA controller. This operation
    758   resets all the ATA devices connected to that port. If this ATA controller does not support
    759   a reset port operation, then EFI_UNSUPPORTED is returned.
    760 
    761   If a device error occurs while executing that port reset operation, then EFI_DEVICE_ERROR is
    762   returned.
    763 
    764   If a timeout occurs during the execution of the port reset operation, then EFI_TIMEOUT is returned.
    765 
    766   If the port reset operation is completed, then EFI_SUCCESS is returned.
    767 
    768   @param[in]  This          A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
    769   @param[in]  Port          The port number on the ATA controller.
    770 
    771   @retval EFI_SUCCESS       The ATA controller port was reset.
    772   @retval EFI_UNSUPPORTED   The ATA controller does not support a port reset operation.
    773   @retval EFI_DEVICE_ERROR  A device error occurred while attempting to reset the ATA port.
    774   @retval EFI_TIMEOUT       A timeout occurred while attempting to reset the ATA port.
    775 
    776 **/
    777 EFI_STATUS
    778 EFIAPI
    779 AtaPassThruResetPort (
    780   IN EFI_ATA_PASS_THRU_PROTOCOL *This,
    781   IN UINT16                     Port
    782   );
    783 
    784 /**
    785   Resets an ATA device that is connected to an ATA controller.
    786 
    787   The ResetDevice() function resets the ATA device specified by Port and PortMultiplierPort.
    788   If this ATA controller does not support a device reset operation, then EFI_UNSUPPORTED is
    789   returned.
    790 
    791   If Port or PortMultiplierPort are not in a valid range for this ATA controller, then
    792   EFI_INVALID_PARAMETER is returned.
    793 
    794   If a device error occurs while executing that device reset operation, then EFI_DEVICE_ERROR
    795   is returned.
    796 
    797   If a timeout occurs during the execution of the device reset operation, then EFI_TIMEOUT is
    798   returned.
    799 
    800   If the device reset operation is completed, then EFI_SUCCESS is returned.
    801 
    802   @param[in] This                A pointer to the EFI_ATA_PASS_THRU_PROTOCOL instance.
    803   @param[in] Port                Port represents the port number of the ATA device to be reset.
    804   @param[in] PortMultiplierPort  The port multiplier port number of the ATA device to reset.
    805                                  If there is no port multiplier, then specify 0xFFFF.
    806   @retval EFI_SUCCESS            The ATA device specified by Port and PortMultiplierPort was reset.
    807   @retval EFI_UNSUPPORTED        The ATA controller does not support a device reset operation.
    808   @retval EFI_INVALID_PARAMETER  Port or PortMultiplierPort are invalid.
    809   @retval EFI_DEVICE_ERROR       A device error occurred while attempting to reset the ATA device
    810                                  specified by Port and PortMultiplierPort.
    811   @retval EFI_TIMEOUT            A timeout occurred while attempting to reset the ATA device
    812                                  specified by Port and PortMultiplierPort.
    813 
    814 **/
    815 EFI_STATUS
    816 EFIAPI
    817 AtaPassThruResetDevice (
    818   IN EFI_ATA_PASS_THRU_PROTOCOL *This,
    819   IN UINT16                     Port,
    820   IN UINT16                     PortMultiplierPort
    821   );
    822 
    823 /**
    824   Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel. This function
    825   supports both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the
    826   nonblocking I/O functionality is optional.
    827 
    828   @param  This    A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
    829   @param  Target  The Target is an array of size TARGET_MAX_BYTES and it represents
    830                   the id of the SCSI device to send the SCSI Request Packet. Each
    831                   transport driver may choose to utilize a subset of this size to suit the needs
    832                   of transport target representation. For example, a Fibre Channel driver
    833                   may use only 8 bytes (WWN) to represent an FC target.
    834   @param  Lun     The LUN of the SCSI device to send the SCSI Request Packet.
    835   @param  Packet  A pointer to the SCSI Request Packet to send to the SCSI device
    836                   specified by Target and Lun.
    837   @param  Event   If nonblocking I/O is not supported then Event is ignored, and blocking
    838                   I/O is performed. If Event is NULL, then blocking I/O is performed. If
    839                   Event is not NULL and non blocking I/O is supported, then
    840                   nonblocking I/O is performed, and Event will be signaled when the
    841                   SCSI Request Packet completes.
    842 
    843   @retval EFI_SUCCESS           The SCSI Request Packet was sent by the host. For bi-directional
    844                                 commands, InTransferLength bytes were transferred from
    845                                 InDataBuffer. For write and bi-directional commands,
    846                                 OutTransferLength bytes were transferred by
    847                                 OutDataBuffer.
    848   @retval EFI_BAD_BUFFER_SIZE   The SCSI Request Packet was not executed. The number of bytes that
    849                                 could be transferred is returned in InTransferLength. For write
    850                                 and bi-directional commands, OutTransferLength bytes were
    851                                 transferred by OutDataBuffer.
    852   @retval EFI_NOT_READY         The SCSI Request Packet could not be sent because there are too many
    853                                 SCSI Request Packets already queued. The caller may retry again later.
    854   @retval EFI_DEVICE_ERROR      A device error occurred while attempting to send the SCSI Request
    855                                 Packet.
    856   @retval EFI_INVALID_PARAMETER Target, Lun, or the contents of ScsiRequestPacket are invalid.
    857   @retval EFI_UNSUPPORTED       The command described by the SCSI Request Packet is not supported
    858                                 by the host adapter. This includes the case of Bi-directional SCSI
    859                                 commands not supported by the implementation. The SCSI Request
    860                                 Packet was not sent, so no additional status information is available.
    861   @retval EFI_TIMEOUT           A timeout occurred while waiting for the SCSI Request Packet to execute.
    862 
    863 **/
    864 EFI_STATUS
    865 EFIAPI
    866 ExtScsiPassThruPassThru (
    867   IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL                    *This,
    868   IN UINT8                                              *Target,
    869   IN UINT64                                             Lun,
    870   IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET     *Packet,
    871   IN EFI_EVENT                                          Event OPTIONAL
    872   );
    873 
    874 /**
    875   Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on a SCSI channel. These
    876   can either be the list SCSI devices that are actually present on the SCSI channel, or the list of legal
    877   Target Ids and LUNs for the SCSI channel. Regardless, the caller of this function must probe the
    878   Target ID and LUN returned to see if a SCSI device is actually present at that location on the SCSI
    879   channel.
    880 
    881   @param  This   A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
    882   @param  Target On input, a pointer to the Target ID (an array of size
    883                  TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel.
    884                  On output, a pointer to the Target ID (an array of
    885                  TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
    886                  channel. An input value of 0xF(all bytes in the array are 0xF) in the
    887                  Target array retrieves the Target ID of the first SCSI device present on a
    888                  SCSI channel.
    889   @param  Lun    On input, a pointer to the LUN of a SCSI device present on the SCSI
    890                  channel. On output, a pointer to the LUN of the next SCSI device present
    891                  on a SCSI channel.
    892 
    893   @retval EFI_SUCCESS           The Target ID and LUN of the next SCSI device on the SCSI
    894                                 channel was returned in Target and Lun.
    895   @retval EFI_INVALID_PARAMETER Target array is not all 0xF, and Target and Lun were
    896                                 not returned on a previous call to GetNextTargetLun().
    897   @retval EFI_NOT_FOUND         There are no more SCSI devices on this SCSI channel.
    898 
    899 **/
    900 EFI_STATUS
    901 EFIAPI
    902 ExtScsiPassThruGetNextTargetLun (
    903   IN  EFI_EXT_SCSI_PASS_THRU_PROTOCOL    *This,
    904   IN OUT UINT8                           **Target,
    905   IN OUT UINT64                          *Lun
    906   );
    907 
    908 /**
    909   Used to allocate and build a device path node for a SCSI device on a SCSI channel.
    910 
    911   @param  This       A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
    912   @param  Target     The Target is an array of size TARGET_MAX_BYTES and it specifies the
    913                      Target ID of the SCSI device for which a device path node is to be
    914                      allocated and built. Transport drivers may chose to utilize a subset of
    915                      this size to suit the representation of targets. For example, a Fibre
    916                      Channel driver may use only 8 bytes (WWN) in the array to represent a
    917                      FC target.
    918   @param  Lun        The LUN of the SCSI device for which a device path node is to be
    919                      allocated and built.
    920   @param  DevicePath A pointer to a single device path node that describes the SCSI device
    921                      specified by Target and Lun. This function is responsible for
    922                      allocating the buffer DevicePath with the boot service
    923                      AllocatePool(). It is the caller's responsibility to free
    924                      DevicePath when the caller is finished with DevicePath.
    925 
    926   @retval EFI_SUCCESS           The device path node that describes the SCSI device specified by
    927                                 Target and Lun was allocated and returned in
    928                                 DevicePath.
    929   @retval EFI_INVALID_PARAMETER DevicePath is NULL.
    930   @retval EFI_NOT_FOUND         The SCSI devices specified by Target and Lun does not exist
    931                                 on the SCSI channel.
    932   @retval EFI_OUT_OF_RESOURCES  There are not enough resources to allocate DevicePath.
    933 
    934 **/
    935 EFI_STATUS
    936 EFIAPI
    937 ExtScsiPassThruBuildDevicePath (
    938   IN     EFI_EXT_SCSI_PASS_THRU_PROTOCOL    *This,
    939   IN     UINT8                              *Target,
    940   IN     UINT64                             Lun,
    941   IN OUT EFI_DEVICE_PATH_PROTOCOL           **DevicePath
    942   );
    943 
    944 /**
    945   Used to translate a device path node to a Target ID and LUN.
    946 
    947   @param  This       A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
    948   @param  DevicePath A pointer to a single device path node that describes the SCSI device
    949                      on the SCSI channel.
    950   @param  Target     A pointer to the Target Array which represents the ID of a SCSI device
    951                      on the SCSI channel.
    952   @param  Lun        A pointer to the LUN of a SCSI device on the SCSI channel.
    953 
    954   @retval EFI_SUCCESS           DevicePath was successfully translated to a Target ID and
    955                                 LUN, and they were returned in Target and Lun.
    956   @retval EFI_INVALID_PARAMETER DevicePath or Target or Lun is NULL.
    957   @retval EFI_NOT_FOUND         A valid translation from DevicePath to a Target ID and LUN
    958                                 does not exist.
    959   @retval EFI_UNSUPPORTED       This driver does not support the device path node type in
    960                                  DevicePath.
    961 
    962 **/
    963 EFI_STATUS
    964 EFIAPI
    965 ExtScsiPassThruGetTargetLun (
    966   IN  EFI_EXT_SCSI_PASS_THRU_PROTOCOL    *This,
    967   IN  EFI_DEVICE_PATH_PROTOCOL           *DevicePath,
    968   OUT UINT8                              **Target,
    969   OUT UINT64                             *Lun
    970   );
    971 
    972 /**
    973   Resets a SCSI channel. This operation resets all the SCSI devices connected to the SCSI channel.
    974 
    975   @param  This A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
    976 
    977   @retval EFI_SUCCESS      The SCSI channel was reset.
    978   @retval EFI_DEVICE_ERROR A device error occurred while attempting to reset the SCSI channel.
    979   @retval EFI_TIMEOUT      A timeout occurred while attempting to reset the SCSI channel.
    980   @retval EFI_UNSUPPORTED  The SCSI channel does not support a channel reset operation.
    981 
    982 **/
    983 EFI_STATUS
    984 EFIAPI
    985 ExtScsiPassThruResetChannel (
    986   IN  EFI_EXT_SCSI_PASS_THRU_PROTOCOL   *This
    987   );
    988 
    989 /**
    990   Resets a SCSI logical unit that is connected to a SCSI channel.
    991 
    992   @param  This   A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
    993   @param  Target The Target is an array of size TARGET_MAX_BYTE and it represents the
    994                  target port ID of the SCSI device containing the SCSI logical unit to
    995                  reset. Transport drivers may chose to utilize a subset of this array to suit
    996                  the representation of their targets.
    997   @param  Lun    The LUN of the SCSI device to reset.
    998 
    999   @retval EFI_SUCCESS           The SCSI device specified by Target and Lun was reset.
   1000   @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
   1001   @retval EFI_TIMEOUT           A timeout occurred while attempting to reset the SCSI device
   1002                                 specified by Target and Lun.
   1003   @retval EFI_UNSUPPORTED       The SCSI channel does not support a target reset operation.
   1004   @retval EFI_DEVICE_ERROR      A device error occurred while attempting to reset the SCSI device
   1005                                  specified by Target and Lun.
   1006 
   1007 **/
   1008 EFI_STATUS
   1009 EFIAPI
   1010 ExtScsiPassThruResetTargetLun (
   1011   IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL    *This,
   1012   IN UINT8                              *Target,
   1013   IN UINT64                             Lun
   1014   );
   1015 
   1016 /**
   1017   Used to retrieve the list of legal Target IDs for SCSI devices on a SCSI channel. These can either
   1018   be the list SCSI devices that are actually present on the SCSI channel, or the list of legal Target IDs
   1019   for the SCSI channel. Regardless, the caller of this function must probe the Target ID returned to
   1020   see if a SCSI device is actually present at that location on the SCSI channel.
   1021 
   1022   @param  This   A pointer to the EFI_EXT_SCSI_PASS_THRU_PROTOCOL instance.
   1023   @param  Target (TARGET_MAX_BYTES) of a SCSI device present on the SCSI channel.
   1024                  On output, a pointer to the Target ID (an array of
   1025                  TARGET_MAX_BYTES) of the next SCSI device present on a SCSI
   1026                  channel. An input value of 0xF(all bytes in the array are 0xF) in the
   1027                  Target array retrieves the Target ID of the first SCSI device present on a
   1028                  SCSI channel.
   1029 
   1030   @retval EFI_SUCCESS           The Target ID of the next SCSI device on the SCSI
   1031                                 channel was returned in Target.
   1032   @retval EFI_INVALID_PARAMETER Target or Lun is NULL.
   1033   @retval EFI_TIMEOUT           Target array is not all 0xF, and Target was not
   1034                                 returned on a previous call to GetNextTarget().
   1035   @retval EFI_NOT_FOUND         There are no more SCSI devices on this SCSI channel.
   1036 
   1037 **/
   1038 EFI_STATUS
   1039 EFIAPI
   1040 ExtScsiPassThruGetNextTarget (
   1041   IN  EFI_EXT_SCSI_PASS_THRU_PROTOCOL    *This,
   1042   IN OUT UINT8                           **Target
   1043   );
   1044 
   1045 /**
   1046   Initialize ATA host controller at IDE mode.
   1047 
   1048   The function is designed to initialize ATA host controller.
   1049 
   1050   @param[in]  Instance          A pointer to the ATA_ATAPI_PASS_THRU_INSTANCE instance.
   1051 
   1052 **/
   1053 EFI_STATUS
   1054 EFIAPI
   1055 IdeModeInitialization (
   1056   IN  ATA_ATAPI_PASS_THRU_INSTANCE    *Instance
   1057   );
   1058 
   1059 /**
   1060   Initialize ATA host controller at AHCI mode.
   1061 
   1062   The function is designed to initialize ATA host controller.
   1063 
   1064   @param[in]  Instance          A pointer to the ATA_ATAPI_PASS_THRU_INSTANCE instance.
   1065 
   1066 **/
   1067 EFI_STATUS
   1068 EFIAPI
   1069 AhciModeInitialization (
   1070   IN  ATA_ATAPI_PASS_THRU_INSTANCE    *Instance
   1071   );
   1072 
   1073 /**
   1074   Start a non data transfer on specific port.
   1075 
   1076   @param[in]       PciIo               The PCI IO protocol instance.
   1077   @param[in]       AhciRegisters       The pointer to the EFI_AHCI_REGISTERS.
   1078   @param[in]       Port                The number of port.
   1079   @param[in]       PortMultiplier      The timeout value of stop.
   1080   @param[in]       AtapiCommand        The atapi command will be used for the
   1081                                        transfer.
   1082   @param[in]       AtapiCommandLength  The length of the atapi command.
   1083   @param[in]       AtaCommandBlock     The EFI_ATA_COMMAND_BLOCK data.
   1084   @param[in, out]  AtaStatusBlock      The EFI_ATA_STATUS_BLOCK data.
   1085   @param[in]       Timeout             The timeout value of non data transfer, uses 100ns as a unit.
   1086   @param[in]       Task                Optional. Pointer to the ATA_NONBLOCK_TASK
   1087                                        used by non-blocking mode.
   1088 
   1089   @retval EFI_DEVICE_ERROR    The non data transfer abort with error occurs.
   1090   @retval EFI_TIMEOUT         The operation is time out.
   1091   @retval EFI_UNSUPPORTED     The device is not ready for transfer.
   1092   @retval EFI_SUCCESS         The non data transfer executes successfully.
   1093 
   1094 **/
   1095 EFI_STATUS
   1096 EFIAPI
   1097 AhciNonDataTransfer (
   1098   IN     EFI_PCI_IO_PROTOCOL           *PciIo,
   1099   IN     EFI_AHCI_REGISTERS            *AhciRegisters,
   1100   IN     UINT8                         Port,
   1101   IN     UINT8                         PortMultiplier,
   1102   IN     EFI_AHCI_ATAPI_COMMAND        *AtapiCommand OPTIONAL,
   1103   IN     UINT8                         AtapiCommandLength,
   1104   IN     EFI_ATA_COMMAND_BLOCK         *AtaCommandBlock,
   1105   IN OUT EFI_ATA_STATUS_BLOCK          *AtaStatusBlock,
   1106   IN     UINT64                        Timeout,
   1107   IN     ATA_NONBLOCK_TASK             *Task
   1108   );
   1109 
   1110 /**
   1111   Start a DMA data transfer on specific port
   1112 
   1113   @param[in]       Instance            The ATA_ATAPI_PASS_THRU_INSTANCE protocol instance.
   1114   @param[in]       AhciRegisters       The pointer to the EFI_AHCI_REGISTERS.
   1115   @param[in]       Port                The number of port.
   1116   @param[in]       PortMultiplier      The timeout value of stop.
   1117   @param[in]       AtapiCommand        The atapi command will be used for the
   1118                                        transfer.
   1119   @param[in]       AtapiCommandLength  The length of the atapi command.
   1120   @param[in]       Read                The transfer direction.
   1121   @param[in]       AtaCommandBlock     The EFI_ATA_COMMAND_BLOCK data.
   1122   @param[in, out]  AtaStatusBlock      The EFI_ATA_STATUS_BLOCK data.
   1123   @param[in, out]  MemoryAddr          The pointer to the data buffer.
   1124   @param[in]       DataCount           The data count to be transferred.
   1125   @param[in]       Timeout             The timeout value of non data transfer, uses 100ns as a unit.
   1126   @param[in]       Task                Optional. Pointer to the ATA_NONBLOCK_TASK
   1127                                        used by non-blocking mode.
   1128 
   1129   @retval EFI_DEVICE_ERROR    The DMA data transfer abort with error occurs.
   1130   @retval EFI_TIMEOUT         The operation is time out.
   1131   @retval EFI_UNSUPPORTED     The device is not ready for transfer.
   1132   @retval EFI_SUCCESS         The DMA data transfer executes successfully.
   1133 
   1134 **/
   1135 EFI_STATUS
   1136 EFIAPI
   1137 AhciDmaTransfer (
   1138   IN     ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
   1139   IN     EFI_AHCI_REGISTERS           *AhciRegisters,
   1140   IN     UINT8                        Port,
   1141   IN     UINT8                        PortMultiplier,
   1142   IN     EFI_AHCI_ATAPI_COMMAND       *AtapiCommand OPTIONAL,
   1143   IN     UINT8                        AtapiCommandLength,
   1144   IN     BOOLEAN                      Read,
   1145   IN     EFI_ATA_COMMAND_BLOCK        *AtaCommandBlock,
   1146   IN OUT EFI_ATA_STATUS_BLOCK         *AtaStatusBlock,
   1147   IN OUT VOID                         *MemoryAddr,
   1148   IN     UINT32                       DataCount,
   1149   IN     UINT64                       Timeout,
   1150   IN     ATA_NONBLOCK_TASK            *Task
   1151   );
   1152 
   1153 /**
   1154   Start a PIO data transfer on specific port.
   1155 
   1156   @param[in]       PciIo               The PCI IO protocol instance.
   1157   @param[in]       AhciRegisters       The pointer to the EFI_AHCI_REGISTERS.
   1158   @param[in]       Port                The number of port.
   1159   @param[in]       PortMultiplier      The timeout value of stop.
   1160   @param[in]       AtapiCommand        The atapi command will be used for the
   1161                                        transfer.
   1162   @param[in]       AtapiCommandLength  The length of the atapi command.
   1163   @param[in]       Read                The transfer direction.
   1164   @param[in]       AtaCommandBlock     The EFI_ATA_COMMAND_BLOCK data.
   1165   @param[in, out]  AtaStatusBlock      The EFI_ATA_STATUS_BLOCK data.
   1166   @param[in, out]  MemoryAddr          The pointer to the data buffer.
   1167   @param[in]       DataCount           The data count to be transferred.
   1168   @param[in]       Timeout             The timeout value of non data transfer, uses 100ns as a unit.
   1169   @param[in]       Task                Optional. Pointer to the ATA_NONBLOCK_TASK
   1170                                        used by non-blocking mode.
   1171 
   1172   @retval EFI_DEVICE_ERROR    The PIO data transfer abort with error occurs.
   1173   @retval EFI_TIMEOUT         The operation is time out.
   1174   @retval EFI_UNSUPPORTED     The device is not ready for transfer.
   1175   @retval EFI_SUCCESS         The PIO data transfer executes successfully.
   1176 
   1177 **/
   1178 EFI_STATUS
   1179 EFIAPI
   1180 AhciPioTransfer (
   1181   IN     EFI_PCI_IO_PROTOCOL        *PciIo,
   1182   IN     EFI_AHCI_REGISTERS         *AhciRegisters,
   1183   IN     UINT8                      Port,
   1184   IN     UINT8                      PortMultiplier,
   1185   IN     EFI_AHCI_ATAPI_COMMAND     *AtapiCommand OPTIONAL,
   1186   IN     UINT8                      AtapiCommandLength,
   1187   IN     BOOLEAN                    Read,
   1188   IN     EFI_ATA_COMMAND_BLOCK      *AtaCommandBlock,
   1189   IN OUT EFI_ATA_STATUS_BLOCK       *AtaStatusBlock,
   1190   IN OUT VOID                       *MemoryAddr,
   1191   IN     UINT32                     DataCount,
   1192   IN     UINT64                     Timeout,
   1193   IN     ATA_NONBLOCK_TASK          *Task
   1194   );
   1195 
   1196 /**
   1197   Send ATA command into device with NON_DATA protocol
   1198 
   1199   @param[in]      PciIo            A pointer to ATA_ATAPI_PASS_THRU_INSTANCE
   1200                                    data structure.
   1201   @param[in]      IdeRegisters     A pointer to EFI_IDE_REGISTERS data structure.
   1202   @param[in]      AtaCommandBlock  A pointer to EFI_ATA_COMMAND_BLOCK data
   1203                                    structure.
   1204   @param[in, out] AtaStatusBlock   A pointer to EFI_ATA_STATUS_BLOCK data structure.
   1205   @param[in]      Timeout          The time to complete the command, uses 100ns as a unit.
   1206   @param[in]      Task             Optional. Pointer to the ATA_NONBLOCK_TASK
   1207                                    used by non-blocking mode.
   1208 
   1209   @retval  EFI_SUCCESS Reading succeed
   1210   @retval  EFI_ABORTED Command failed
   1211   @retval  EFI_DEVICE_ERROR Device status error.
   1212 
   1213 **/
   1214 EFI_STATUS
   1215 EFIAPI
   1216 AtaNonDataCommandIn (
   1217   IN     EFI_PCI_IO_PROTOCOL       *PciIo,
   1218   IN     EFI_IDE_REGISTERS         *IdeRegisters,
   1219   IN     EFI_ATA_COMMAND_BLOCK     *AtaCommandBlock,
   1220   IN OUT EFI_ATA_STATUS_BLOCK      *AtaStatusBlock,
   1221   IN     UINT64                    Timeout,
   1222   IN     ATA_NONBLOCK_TASK         *Task
   1223   );
   1224 
   1225 /**
   1226   Perform an ATA Udma operation (Read, ReadExt, Write, WriteExt).
   1227 
   1228   @param[in]      Instance         A pointer to ATA_ATAPI_PASS_THRU_INSTANCE data
   1229                                    structure.
   1230   @param[in]      IdeRegisters     A pointer to EFI_IDE_REGISTERS data structure.
   1231   @param[in]      Read             Flag used to determine the data transfer
   1232                                    direction. Read equals 1, means data transferred
   1233                                    from device to host;Read equals 0, means data
   1234                                    transferred from host to device.
   1235   @param[in]      DataBuffer       A pointer to the source buffer for the data.
   1236   @param[in]      DataLength       The length of  the data.
   1237   @param[in]      AtaCommandBlock  A pointer to EFI_ATA_COMMAND_BLOCK data structure.
   1238   @param[in, out] AtaStatusBlock   A pointer to EFI_ATA_STATUS_BLOCK data structure.
   1239   @param[in]      Timeout          The time to complete the command, uses 100ns as a unit.
   1240   @param[in]      Task             Optional. Pointer to the ATA_NONBLOCK_TASK
   1241                                    used by non-blocking mode.
   1242 
   1243   @retval EFI_SUCCESS          the operation is successful.
   1244   @retval EFI_OUT_OF_RESOURCES Build PRD table failed
   1245   @retval EFI_UNSUPPORTED      Unknown channel or operations command
   1246   @retval EFI_DEVICE_ERROR     Ata command execute failed
   1247 
   1248 **/
   1249 EFI_STATUS
   1250 EFIAPI
   1251 AtaUdmaInOut (
   1252   IN     ATA_ATAPI_PASS_THRU_INSTANCE  *Instance,
   1253   IN     EFI_IDE_REGISTERS             *IdeRegisters,
   1254   IN     BOOLEAN                       Read,
   1255   IN     VOID                          *DataBuffer,
   1256   IN     UINT64                        DataLength,
   1257   IN     EFI_ATA_COMMAND_BLOCK         *AtaCommandBlock,
   1258   IN OUT EFI_ATA_STATUS_BLOCK          *AtaStatusBlock,
   1259   IN     UINT64                        Timeout,
   1260   IN     ATA_NONBLOCK_TASK             *Task
   1261   );
   1262 
   1263 /**
   1264   This function is used to send out ATA commands conforms to the PIO Data In Protocol.
   1265 
   1266   @param[in]      PciIo            A pointer to ATA_ATAPI_PASS_THRU_INSTANCE data
   1267                                    structure.
   1268   @param[in]      IdeRegisters     A pointer to EFI_IDE_REGISTERS data structure.
   1269   @param[in, out] Buffer           A pointer to the source buffer for the data.
   1270   @param[in]      ByteCount        The length of  the data.
   1271   @param[in] Read                  Flag used to determine the data transfer direction.
   1272                                    Read equals 1, means data transferred from device
   1273                                    to host;Read equals 0, means data transferred
   1274                                    from host to device.
   1275   @param[in]      AtaCommandBlock  A pointer to EFI_ATA_COMMAND_BLOCK data structure.
   1276   @param[in, out] AtaStatusBlock   A pointer to EFI_ATA_STATUS_BLOCK data structure.
   1277   @param[in]      Timeout          The time to complete the command, uses 100ns as a unit.
   1278   @param[in]      Task             Optional. Pointer to the ATA_NONBLOCK_TASK
   1279                                    used by non-blocking mode.
   1280 
   1281   @retval EFI_SUCCESS      send out the ATA command and device send required data successfully.
   1282   @retval EFI_DEVICE_ERROR command sent failed.
   1283 
   1284 **/
   1285 EFI_STATUS
   1286 EFIAPI
   1287 AtaPioDataInOut (
   1288   IN     EFI_PCI_IO_PROTOCOL       *PciIo,
   1289   IN     EFI_IDE_REGISTERS         *IdeRegisters,
   1290   IN OUT VOID                      *Buffer,
   1291   IN     UINT64                    ByteCount,
   1292   IN     BOOLEAN                   Read,
   1293   IN     EFI_ATA_COMMAND_BLOCK     *AtaCommandBlock,
   1294   IN OUT EFI_ATA_STATUS_BLOCK      *AtaStatusBlock,
   1295   IN     UINT64                    Timeout,
   1296   IN     ATA_NONBLOCK_TASK         *Task
   1297   );
   1298 
   1299 #endif
   1300 
   1301