]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Bus / Scsi / ScsiDiskDxe / ScsiDisk.h
index 675c643eff1c33b96dfe299b4fee7615d0657e33..42c0aaaa95c99ecaeec59899ef8fe548d5634815 100644 (file)
@@ -1,33 +1,50 @@
-/*++\r
+/** @file\r
+  Header file for SCSI Disk Driver.\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
-All rights reserved. This program and the accompanying materials                          \r
-are licensed and made available under the terms and conditions of the BSD License         \r
-which accompanies this distribution.  The full text of the license may be found at        \r
-http://opensource.org/licenses/bsd-license.php                                            \r
-                                                                                          \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
-Module Name:\r
+**/\r
 \r
-  ScsiDisk.h\r
+#ifndef _SCSI_DISK_H_\r
+#define _SCSI_DISK_H_\r
 \r
-Abstract:\r
-  \r
-  Header file for SCSI Disk Driver.\r
 \r
---*/\r
+#include <Uefi.h>\r
 \r
-#ifndef _SCSI_DISK_H\r
-#define _SCSI_DISK_H\r
 \r
+#include <Protocol/ScsiIo.h>\r
+#include <Protocol/ComponentName.h>\r
+#include <Protocol/BlockIo.h>\r
+#include <Protocol/BlockIo2.h>\r
+#include <Protocol/EraseBlock.h>\r
+#include <Protocol/DriverBinding.h>\r
+#include <Protocol/ScsiPassThruExt.h>\r
+#include <Protocol/ScsiPassThru.h>\r
+#include <Protocol/DiskInfo.h>\r
 \r
-#include <IndustryStandard/scsi.h>\r
 \r
-#define IsDeviceFixed(a)        (a)->FixedDevice ? 1 : 0\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiScsiLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/DevicePathLib.h>\r
 \r
-#define SCSI_DISK_DEV_SIGNATURE EFI_SIGNATURE_32 ('s', 'c', 'd', 'k')\r
+#include <IndustryStandard/Scsi.h>\r
+#include <IndustryStandard/Atapi.h>\r
+\r
+#define IS_DEVICE_FIXED(a)        (a)->FixedDevice ? 1 : 0\r
+\r
+typedef struct {\r
+  UINT32                    MaxLbaCnt;\r
+  UINT32                    MaxBlkDespCnt;\r
+  UINT32                    GranularityAlignment;\r
+} SCSI_UNMAP_PARAM_INFO;\r
+\r
+#define SCSI_DISK_DEV_SIGNATURE SIGNATURE_32 ('s', 'c', 'd', 'k')\r
 \r
 typedef struct {\r
   UINT32                    Signature;\r
@@ -35,7 +52,9 @@ typedef struct {
   EFI_HANDLE                Handle;\r
 \r
   EFI_BLOCK_IO_PROTOCOL     BlkIo;\r
+  EFI_BLOCK_IO2_PROTOCOL    BlkIo2;\r
   EFI_BLOCK_IO_MEDIA        BlkIoMedia;\r
+  EFI_ERASE_BLOCK_PROTOCOL  EraseBlock;\r
   EFI_SCSI_IO_PROTOCOL      *ScsiIo;\r
   UINT8                     DeviceType;\r
   BOOLEAN                   FixedDevice;\r
@@ -47,50 +66,247 @@ typedef struct {
 \r
   EFI_UNICODE_STRING_TABLE  *ControllerNameTable;\r
 \r
+  EFI_DISK_INFO_PROTOCOL    DiskInfo;\r
+\r
+  //\r
+  // The following fields are only valid for ATAPI/SATA device\r
+  //\r
+  UINT32                    Channel;\r
+  UINT32                    Device;\r
+  ATAPI_IDENTIFY_DATA       IdentifyData;\r
+\r
+  //\r
+  // Scsi UNMAP command parameters information\r
+  //\r
+  SCSI_UNMAP_PARAM_INFO     UnmapInfo;\r
+  BOOLEAN                   BlockLimitsVpdSupported;\r
+\r
+  //\r
+  // The flag indicates if 16-byte command can be used\r
+  //\r
+  BOOLEAN                   Cdb16Byte;\r
+\r
+  //\r
+  // The queue for asynchronous task requests\r
+  //\r
+  LIST_ENTRY                AsyncTaskQueue;\r
 } SCSI_DISK_DEV;\r
 \r
-#define SCSI_DISK_DEV_FROM_THIS(a)  CR (a, SCSI_DISK_DEV, BlkIo, SCSI_DISK_DEV_SIGNATURE)\r
+#define SCSI_DISK_DEV_FROM_BLKIO(a)  CR (a, SCSI_DISK_DEV, BlkIo, SCSI_DISK_DEV_SIGNATURE)\r
+#define SCSI_DISK_DEV_FROM_BLKIO2(a)  CR (a, SCSI_DISK_DEV, BlkIo2, SCSI_DISK_DEV_SIGNATURE)\r
+#define SCSI_DISK_DEV_FROM_ERASEBLK(a)  CR (a, SCSI_DISK_DEV, EraseBlock, SCSI_DISK_DEV_SIGNATURE)\r
+\r
+#define SCSI_DISK_DEV_FROM_DISKINFO(a) CR (a, SCSI_DISK_DEV, DiskInfo, SCSI_DISK_DEV_SIGNATURE)\r
+\r
+//\r
+// Asynchronous I/O request\r
+//\r
+//\r
+// Private data structure for a BlockIo2 request\r
+//\r
+typedef struct {\r
+  EFI_BLOCK_IO2_TOKEN                  *Token;\r
+  //\r
+  // The flag indicates if the last Scsi Read/Write sub-task for a BlockIo2\r
+  // request is sent to device\r
+  //\r
+  BOOLEAN                              LastScsiRW;\r
+\r
+  //\r
+  // The queue for Scsi Read/Write sub-tasks of a BlockIo2 request\r
+  //\r
+  LIST_ENTRY                           ScsiRWQueue;\r
+\r
+  LIST_ENTRY                           Link;\r
+} SCSI_BLKIO2_REQUEST;\r
+\r
+//\r
+// Private data structure for a SCSI Read/Write request\r
+//\r
+typedef struct {\r
+  SCSI_DISK_DEV                        *ScsiDiskDevice;\r
+  UINT64                               Timeout;\r
+  EFI_SCSI_SENSE_DATA                  *SenseData;\r
+  UINT8                                SenseDataLength;\r
+  UINT8                                HostAdapterStatus;\r
+  UINT8                                TargetStatus;\r
+  UINT8                                *InBuffer;\r
+  UINT8                                *OutBuffer;\r
+  UINT32                               DataLength;\r
+  UINT64                               StartLba;\r
+  UINT32                               SectorCount;\r
+  UINT8                                TimesRetry;\r
+\r
+  //\r
+  // The BlockIo2 request this SCSI command belongs to\r
+  //\r
+  SCSI_BLKIO2_REQUEST                  *BlkIo2Req;\r
+\r
+  LIST_ENTRY                           Link;\r
+} SCSI_ASYNC_RW_REQUEST;\r
+\r
+//\r
+// Private data structure for an EraseBlock request\r
+//\r
+typedef struct {\r
+  EFI_ERASE_BLOCK_TOKEN                *Token;\r
+\r
+  EFI_SCSI_IO_SCSI_REQUEST_PACKET      CommandPacket;\r
+\r
+  LIST_ENTRY                           Link;\r
+} SCSI_ERASEBLK_REQUEST;\r
 \r
 //\r
 // Global Variables\r
 //\r
-extern EFI_DRIVER_BINDING_PROTOCOL  gScsiDiskDriverBinding;\r
-extern EFI_COMPONENT_NAME_PROTOCOL  gScsiDiskComponentName;\r
+extern EFI_DRIVER_BINDING_PROTOCOL   gScsiDiskDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL   gScsiDiskComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL  gScsiDiskComponentName2;\r
 //\r
 // action code used in detect media process\r
 //\r
-#define ACTION_NO_ACTION            0x00\r
-#define ACTION_READ_CAPACITY        0x01\r
-#define ACTION_RETRY_COMMAND_LATER  0x02\r
+#define ACTION_NO_ACTION               0x00\r
+#define ACTION_READ_CAPACITY           0x01\r
+#define ACTION_RETRY_COMMAND_LATER     0x02\r
+#define ACTION_RETRY_WITH_BACKOFF_ALGO 0x03\r
 \r
+#define SCSI_COMMAND_VERSION_1      0x01\r
+#define SCSI_COMMAND_VERSION_2      0x02\r
+#define SCSI_COMMAND_VERSION_3      0x03\r
+\r
+//\r
+// SCSI Disk Timeout Experience Value\r
+//\r
+// As ScsiDisk and ScsiBus driver are used to manage SCSI or ATAPI devices, the timout\r
+// value is updated to 30s to follow ATA/ATAPI spec in which the device may take up to 30s\r
+// to respond command.\r
+//\r
+#define SCSI_DISK_TIMEOUT           EFI_TIMER_PERIOD_SECONDS (30)\r
+\r
+/**\r
+  Test to see if this driver supports ControllerHandle.\r
+\r
+  This service is called by the EFI boot service ConnectController(). In order\r
+  to make drivers as small as possible, there are a few calling restrictions for\r
+  this service. ConnectController() must follow these calling restrictions.\r
+  If any other agent wishes to call Supported() it must also follow these\r
+  calling restrictions.\r
+\r
+  @param  This                Protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
+\r
+  @retval EFI_SUCCESS         This driver supports this device\r
+  @retval EFI_ALREADY_STARTED This driver is already running on this device\r
+  @retval other               This driver does not support this device\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskDriverBindingSupported (\r
   IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN EFI_HANDLE                   Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath   OPTIONAL\r
   );\r
 \r
+/**\r
+  Start this driver on ControllerHandle.\r
+\r
+  This service is called by the EFI boot service ConnectController(). In order\r
+  to make drivers as small as possible, there are a few calling restrictions for\r
+  this service. ConnectController() must follow these calling restrictions. If\r
+  any other agent wishes to call Start() it must also follow these calling\r
+  restrictions.\r
+\r
+  @param  This                 Protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
+\r
+  @retval EFI_SUCCESS          This driver is added to ControllerHandle\r
+  @retval EFI_ALREADY_STARTED  This driver is already running on ControllerHandle\r
+  @retval other                This driver does not support this device\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskDriverBindingStart (\r
   IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
   IN EFI_HANDLE                   Controller,\r
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath   OPTIONAL\r
   );\r
 \r
+/**\r
+  Stop this driver on ControllerHandle.\r
+\r
+  This service is called by the EFI boot service DisconnectController().\r
+  In order to make drivers as small as possible, there are a few calling\r
+  restrictions for this service. DisconnectController() must follow these\r
+  calling restrictions. If any other agent wishes to call Stop() it must\r
+  also follow these calling restrictions.\r
+\r
+  @param  This              Protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskDriverBindingStop (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,\r
   IN  EFI_HANDLE                      Controller,\r
   IN  UINTN                           NumberOfChildren,\r
-  IN  EFI_HANDLE                      *ChildHandleBuffer\r
+  IN  EFI_HANDLE                      *ChildHandleBuffer   OPTIONAL\r
   );\r
 \r
 //\r
 // EFI Component Name Functions\r
 //\r
+/**\r
+  Retrieves a Unicode string that is the user readable name of the driver.\r
+\r
+  This function retrieves the user readable name of a driver in the form of a\r
+  Unicode string. If the driver specified by This has a user readable name in\r
+  the language specified by Language, then a pointer to the driver name is\r
+  returned in DriverName, and EFI_SUCCESS is returned. If the driver specified\r
+  by This does not support the language specified by Language,\r
+  then EFI_UNSUPPORTED is returned.\r
+\r
+  @param  This                  A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
+                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
+\r
+  @param  Language              A pointer to a Null-terminated ASCII string\r
+                                array indicating the language. This is the\r
+                                language of the driver name that the caller is\r
+                                requesting, and it must match one of the\r
+                                languages specified in SupportedLanguages. The\r
+                                number of languages supported by a driver is up\r
+                                to the driver writer. Language is specified\r
+                                in RFC 4646 or ISO 639-2 language code format.\r
+\r
+  @param  DriverName            A pointer to the Unicode string to return.\r
+                                This Unicode string is the name of the\r
+                                driver specified by This in the language\r
+                                specified by Language.\r
+\r
+  @retval EFI_SUCCESS           The Unicode string for the Driver specified by\r
+                                This and the language specified by Language was\r
+                                returned in DriverName.\r
+\r
+  @retval EFI_INVALID_PARAMETER Language is NULL.\r
+\r
+  @retval EFI_INVALID_PARAMETER DriverName is NULL.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
+                                the language specified by Language.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskComponentNameGetDriverName (\r
@@ -99,6 +315,75 @@ ScsiDiskComponentNameGetDriverName (
   OUT CHAR16                       **DriverName\r
   );\r
 \r
+\r
+/**\r
+  Retrieves a Unicode string that is the user readable name of the controller\r
+  that is being managed by a driver.\r
+\r
+  This function retrieves the user readable name of the controller specified by\r
+  ControllerHandle and ChildHandle in the form of a Unicode string. If the\r
+  driver specified by This has a user readable name in the language specified by\r
+  Language, then a pointer to the controller name is returned in ControllerName,\r
+  and EFI_SUCCESS is returned.  If the driver specified by This is not currently\r
+  managing the controller specified by ControllerHandle and ChildHandle,\r
+  then EFI_UNSUPPORTED is returned.  If the driver specified by This does not\r
+  support the language specified by Language, then EFI_UNSUPPORTED is returned.\r
+\r
+  @param  This                  A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or\r
+                                EFI_COMPONENT_NAME_PROTOCOL instance.\r
+\r
+  @param  ControllerHandle      The handle of a controller that the driver\r
+                                specified by This is managing.  This handle\r
+                                specifies the controller whose name is to be\r
+                                returned.\r
+\r
+  @param  ChildHandle           The handle of the child controller to retrieve\r
+                                the name of.  This is an optional parameter that\r
+                                may be NULL.  It will be NULL for device\r
+                                drivers.  It will also be NULL for a bus drivers\r
+                                that wish to retrieve the name of the bus\r
+                                controller.  It will not be NULL for a bus\r
+                                driver that wishes to retrieve the name of a\r
+                                child controller.\r
+\r
+  @param  Language              A pointer to a Null-terminated ASCII string\r
+                                array indicating the language.  This is the\r
+                                language of the driver name that the caller is\r
+                                requesting, and it must match one of the\r
+                                languages specified in SupportedLanguages. The\r
+                                number of languages supported by a driver is up\r
+                                to the driver writer. Language is specified in\r
+                                RFC 4646 or ISO 639-2 language code format.\r
+\r
+  @param  ControllerName        A pointer to the Unicode string to return.\r
+                                This Unicode string is the name of the\r
+                                controller specified by ControllerHandle and\r
+                                ChildHandle in the language specified by\r
+                                Language from the point of view of the driver\r
+                                specified by This.\r
+\r
+  @retval EFI_SUCCESS           The Unicode string for the user readable name in\r
+                                the language specified by Language for the\r
+                                driver specified by This was returned in\r
+                                DriverName.\r
+\r
+  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.\r
+\r
+  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid\r
+                                EFI_HANDLE.\r
+\r
+  @retval EFI_INVALID_PARAMETER Language is NULL.\r
+\r
+  @retval EFI_INVALID_PARAMETER ControllerName is NULL.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This is not currently\r
+                                managing the controller specified by\r
+                                ControllerHandle and ChildHandle.\r
+\r
+  @retval EFI_UNSUPPORTED       The driver specified by This does not support\r
+                                the language specified by Language.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskComponentNameGetControllerName (\r
@@ -109,666 +394,1038 @@ ScsiDiskComponentNameGetControllerName (
   OUT CHAR16                                          **ControllerName\r
   );\r
 \r
+/**\r
+  Reset SCSI Disk.\r
+\r
+\r
+  @param  This                 The pointer of EFI_BLOCK_IO_PROTOCOL\r
+  @param  ExtendedVerification The flag about if extend verificate\r
+\r
+  @retval EFI_SUCCESS          The device was reset.\r
+  @retval EFI_DEVICE_ERROR     The device is not functioning properly and could\r
+                               not be reset.\r
+  @return EFI_STATUS is retured from EFI_SCSI_IO_PROTOCOL.ResetDevice().\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskReset (\r
   IN  EFI_BLOCK_IO_PROTOCOL   *This,\r
   IN  BOOLEAN                 ExtendedVerification\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
+  );\r
 \r
-  This                  - TODO: add argument description\r
-  ExtendedVerification  - TODO: add argument description\r
 \r
-Returns:\r
+/**\r
+  The function is to Read Block from SCSI Disk.\r
 \r
-  TODO: add return values\r
+  @param  This       The pointer of EFI_BLOCK_IO_PROTOCOL.\r
+  @param  MediaId    The Id of Media detected\r
+  @param  Lba        The logic block address\r
+  @param  BufferSize The size of Buffer\r
+  @param  Buffer     The buffer to fill the read out data\r
 \r
---*/\r
-;\r
+  @retval EFI_SUCCESS           Successfully to read out block.\r
+  @retval EFI_DEVICE_ERROR      Fail to detect media.\r
+  @retval EFI_NO_MEDIA          Media is not present.\r
+  @retval EFI_MEDIA_CHANGED     Media has changed.\r
+  @retval EFI_BAD_BUFFER_SIZE   The Buffer was not a multiple of the block size of the device.\r
+  @retval EFI_INVALID_PARAMETER Invalid parameter passed in.\r
 \r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskReadBlocks (\r
   IN  EFI_BLOCK_IO_PROTOCOL   *This,\r
   IN  UINT32                  MediaId,\r
-  IN  EFI_LBA                 LBA,\r
+  IN  EFI_LBA                 Lba,\r
   IN  UINTN                   BufferSize,\r
   OUT VOID                    *Buffer\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
+  );\r
 \r
-  This        - TODO: add argument description\r
-  MediaId     - TODO: add argument description\r
-  LBA         - TODO: add argument description\r
-  BufferSize  - TODO: add argument description\r
-  Buffer      - TODO: add argument description\r
 \r
-Returns:\r
+/**\r
+  The function is to Write Block to SCSI Disk.\r
 \r
-  TODO: add return values\r
+  @param  This       The pointer of EFI_BLOCK_IO_PROTOCOL\r
+  @param  MediaId    The Id of Media detected\r
+  @param  Lba        The logic block address\r
+  @param  BufferSize The size of Buffer\r
+  @param  Buffer     The buffer to fill the read out data\r
 \r
---*/\r
-;\r
+  @retval EFI_SUCCESS           Successfully to read out block.\r
+  @retval EFI_WRITE_PROTECTED   The device can not be written to.\r
+  @retval EFI_DEVICE_ERROR      Fail to detect media.\r
+  @retval EFI_NO_MEDIA          Media is not present.\r
+  @retval EFI_MEDIA_CHNAGED     Media has changed.\r
+  @retval EFI_BAD_BUFFER_SIZE   The Buffer was not a multiple of the block size of the device.\r
+  @retval EFI_INVALID_PARAMETER Invalid parameter passed in.\r
 \r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskWriteBlocks (\r
   IN  EFI_BLOCK_IO_PROTOCOL   *This,\r
   IN  UINT32                  MediaId,\r
-  IN  EFI_LBA                 LBA,\r
+  IN  EFI_LBA                 Lba,\r
   IN  UINTN                   BufferSize,\r
   IN  VOID                    *Buffer\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
+  );\r
 \r
-Arguments:\r
 \r
-  This        - TODO: add argument description\r
-  MediaId     - TODO: add argument description\r
-  LBA         - TODO: add argument description\r
-  BufferSize  - TODO: add argument description\r
-  Buffer      - TODO: add argument description\r
+/**\r
+  Flush Block to Disk.\r
 \r
-Returns:\r
+  EFI_SUCCESS is returned directly.\r
 \r
-  TODO: add return values\r
+  @param  This              The pointer of EFI_BLOCK_IO_PROTOCOL\r
 \r
---*/\r
-;\r
+  @retval EFI_SUCCESS       All outstanding data was written to the device\r
 \r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 ScsiDiskFlushBlocks (\r
   IN  EFI_BLOCK_IO_PROTOCOL   *This\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
+  );\r
 \r
-  TODO: Add function description\r
 \r
-Arguments:\r
+/**\r
+  Reset SCSI Disk.\r
 \r
-  This  - TODO: add argument description\r
+  @param  This                 The pointer of EFI_BLOCK_IO2_PROTOCOL.\r
+  @param  ExtendedVerification The flag about if extend verificate.\r
 \r
-Returns:\r
+  @retval EFI_SUCCESS          The device was reset.\r
+  @retval EFI_DEVICE_ERROR     The device is not functioning properly and could\r
+                               not be reset.\r
+  @return EFI_STATUS is returned from EFI_SCSI_IO_PROTOCOL.ResetDevice().\r
 \r
-  TODO: add return values\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ScsiDiskResetEx (\r
+  IN  EFI_BLOCK_IO2_PROTOCOL  *This,\r
+  IN  BOOLEAN                 ExtendedVerification\r
+  );\r
 \r
---*/\r
-;\r
+/**\r
+  The function is to Read Block from SCSI Disk.\r
+\r
+  @param  This       The pointer of EFI_BLOCK_IO_PROTOCOL.\r
+  @param  MediaId    The Id of Media detected.\r
+  @param  Lba        The logic block address.\r
+  @param  Token      A pointer to the token associated with the transaction.\r
+  @param  BufferSize The size of Buffer.\r
+  @param  Buffer     The buffer to fill the read out data.\r
+\r
+  @retval EFI_SUCCESS           The read request was queued if Token-> Event is\r
+                                not NULL. The data was read correctly from the\r
+                                device if theToken-> Event is NULL.\r
+  @retval EFI_DEVICE_ERROR      The device reported an error while attempting\r
+                                to perform the read operation.\r
+  @retval EFI_NO_MEDIA          There is no media in the device.\r
+  @retval EFI_MEDIA_CHANGED     The MediaId is not for the current media.\r
+  @retval EFI_BAD_BUFFER_SIZE   The BufferSize parameter is not a multiple of\r
+                                the intrinsic block size of the device.\r
+  @retval EFI_INVALID_PARAMETER The read request contains LBAs that are not\r
+                                valid, or the buffer is not on proper\r
+                                alignment.\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a\r
+                                lack of resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ScsiDiskReadBlocksEx (\r
+  IN     EFI_BLOCK_IO2_PROTOCOL   *This,\r
+  IN     UINT32                   MediaId,\r
+  IN     EFI_LBA                  Lba,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN      *Token,\r
+  IN     UINTN                    BufferSize,\r
+  OUT    VOID                     *Buffer\r
+  );\r
 \r
+/**\r
+  The function is to Write Block to SCSI Disk.\r
+\r
+  @param  This       The pointer of EFI_BLOCK_IO_PROTOCOL.\r
+  @param  MediaId    The Id of Media detected.\r
+  @param  Lba        The logic block address.\r
+  @param  Token      A pointer to the token associated with the transaction.\r
+  @param  BufferSize The size of Buffer.\r
+  @param  Buffer     The buffer to fill the read out data.\r
+\r
+  @retval EFI_SUCCESS           The data were written correctly to the device.\r
+  @retval EFI_WRITE_PROTECTED   The device cannot be written to.\r
+  @retval EFI_NO_MEDIA          There is no media in the device.\r
+  @retval EFI_MEDIA_CHANGED     The MediaId is not for the current media.\r
+  @retval EFI_DEVICE_ERROR      The device reported an error while attempting\r
+                                to perform the write operation.\r
+  @retval EFI_BAD_BUFFER_SIZE   The BufferSize parameter is not a multiple of\r
+                                the intrinsic block size of the device.\r
+  @retval EFI_INVALID_PARAMETER The write request contains LBAs that are not\r
+                                valid, or the buffer is not on proper\r
+                                alignment.\r
+\r
+**/\r
 EFI_STATUS\r
-ScsiDiskDetectMedia (\r
-  SCSI_DISK_DEV   *ScsiDiskDevice,\r
-  BOOLEAN         MustReadCap,\r
-  BOOLEAN         *MediaChange\r
-  )\r
-/*++\r
+EFIAPI\r
+ScsiDiskWriteBlocksEx (\r
+  IN     EFI_BLOCK_IO2_PROTOCOL *This,\r
+  IN     UINT32                 MediaId,\r
+  IN     EFI_LBA                Lba,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN    *Token,\r
+  IN     UINTN                  BufferSize,\r
+  IN     VOID                   *Buffer\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  Flush the Block Device.\r
 \r
-  TODO: Add function description\r
+  @param  This       Indicates a pointer to the calling context.\r
+  @param  Token      A pointer to the token associated with the transaction.\r
 \r
-Arguments:\r
+  @retval EFI_SUCCESS         All outstanding data was written to the device.\r
+  @retval EFI_DEVICE_ERROR    The device reported an error while attempting to\r
+                              write data.\r
+  @retval EFI_WRITE_PROTECTED The device cannot be written to.\r
+  @retval EFI_NO_MEDIA        There is no media in the device.\r
+  @retval EFI_MEDIA_CHANGED   The MediaId is not for the current media.\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  MustReadCap     - TODO: add argument description\r
-  MediaChange     - TODO: add argument description\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ScsiDiskFlushBlocksEx (\r
+  IN     EFI_BLOCK_IO2_PROTOCOL  *This,\r
+  IN OUT EFI_BLOCK_IO2_TOKEN     *Token\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Erase a specified number of device blocks.\r
+\r
+  @param[in]       This           Indicates a pointer to the calling context.\r
+  @param[in]       MediaId        The media ID that the erase request is for.\r
+  @param[in]       Lba            The starting logical block address to be\r
+                                  erased. The caller is responsible for erasing\r
+                                  only legitimate locations.\r
+  @param[in, out]  Token          A pointer to the token associated with the\r
+                                  transaction.\r
+  @param[in]       Size           The size in bytes to be erased. This must be\r
+                                  a multiple of the physical block size of the\r
+                                  device.\r
+\r
+  @retval EFI_SUCCESS             The erase request was queued if Event is not\r
+                                  NULL. The data was erased correctly to the\r
+                                  device if the Event is NULL.to the device.\r
+  @retval EFI_WRITE_PROTECTED     The device cannot be erased due to write\r
+                                  protection.\r
+  @retval EFI_DEVICE_ERROR        The device reported an error while attempting\r
+                                  to perform the erase operation.\r
+  @retval EFI_INVALID_PARAMETER   The erase request contains LBAs that are not\r
+                                  valid.\r
+  @retval EFI_NO_MEDIA            There is no media in the device.\r
+  @retval EFI_MEDIA_CHANGED       The MediaId is not for the current media.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ScsiDiskEraseBlocks (\r
+  IN     EFI_ERASE_BLOCK_PROTOCOL      *This,\r
+  IN     UINT32                        MediaId,\r
+  IN     EFI_LBA                       Lba,\r
+  IN OUT EFI_ERASE_BLOCK_TOKEN         *Token,\r
+  IN     UINTN                         Size\r
+  );\r
 \r
-  TODO: add return values\r
 \r
---*/\r
-;\r
-  \r
-EFI_STATUS\r
-ScsiDiskTestUnitReady (\r
-  SCSI_DISK_DEV        *ScsiDiskDevice,\r
-  BOOLEAN              *NeedRetry,\r
-  EFI_SCSI_SENSE_DATA  **SenseDataArray,\r
-  UINTN                *NumberOfSenseKeys\r
-  )\r
-/*++\r
+/**\r
+  Provides inquiry information for the controller type.\r
 \r
-Routine Description:\r
+  This function is used by the IDE bus driver to get inquiry data.  Data format\r
+  of Identify data is defined by the Interface GUID.\r
 \r
-  TODO: Add function description\r
+  @param[in]      This              Pointer to the EFI_DISK_INFO_PROTOCOL instance.\r
+  @param[in, out] InquiryData       Pointer to a buffer for the inquiry data.\r
+  @param[in, out] InquiryDataSize   Pointer to the value for the inquiry data size.\r
 \r
-Arguments:\r
+  @retval EFI_SUCCESS            The command was accepted without any errors.\r
+  @retval EFI_NOT_FOUND          Device does not support this data class\r
+  @retval EFI_DEVICE_ERROR       Error reading InquiryData from device\r
+  @retval EFI_BUFFER_TOO_SMALL   InquiryDataSize not big enough\r
 \r
-  ScsiDiskDevice    - TODO: add argument description\r
-  NeedRetry         - TODO: add argument description\r
-  SenseDataArray    - TODO: add argument description\r
-  NumberOfSenseKeys - TODO: add argument description\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ScsiDiskInfoInquiry (\r
+  IN     EFI_DISK_INFO_PROTOCOL   *This,\r
+  IN OUT VOID                     *InquiryData,\r
+  IN OUT UINT32                   *InquiryDataSize\r
+  );\r
 \r
-Returns:\r
 \r
-  TODO: add return values\r
+/**\r
+  Provides identify information for the controller type.\r
 \r
---*/\r
-;\r
+  This function is used by the IDE bus driver to get identify data.  Data format\r
+  of Identify data is defined by the Interface GUID.\r
 \r
-EFI_STATUS\r
-DetectMediaParsingSenseKeys (\r
-  SCSI_DISK_DEV           *ScsiDiskDevice,\r
-  EFI_SCSI_SENSE_DATA     *SenseData,\r
-  UINTN                   NumberOfSenseKeys,\r
-  UINTN                   *Action\r
-  )\r
-/*++\r
+  @param[in]     This               Pointer to the EFI_DISK_INFO_PROTOCOL\r
+                                    instance.\r
+  @param[in, out] IdentifyData      Pointer to a buffer for the identify data.\r
+  @param[in, out] IdentifyDataSize  Pointer to the value for the identify data\r
+                                    size.\r
 \r
-Routine Description:\r
+  @retval EFI_SUCCESS            The command was accepted without any errors.\r
+  @retval EFI_NOT_FOUND          Device does not support this data class\r
+  @retval EFI_DEVICE_ERROR       Error reading IdentifyData from device\r
+  @retval EFI_BUFFER_TOO_SMALL   IdentifyDataSize not big enough\r
 \r
-  TODO: Add function description\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ScsiDiskInfoIdentify (\r
+  IN     EFI_DISK_INFO_PROTOCOL   *This,\r
+  IN OUT VOID                     *IdentifyData,\r
+  IN OUT UINT32                   *IdentifyDataSize\r
+  );\r
 \r
-Arguments:\r
 \r
-  ScsiDiskDevice    - TODO: add argument description\r
-  SenseData         - TODO: add argument description\r
-  NumberOfSenseKeys - TODO: add argument description\r
-  Action            - TODO: add argument description\r
+/**\r
+  Provides sense data information for the controller type.\r
 \r
-Returns:\r
+  This function is used by the IDE bus driver to get sense data.\r
+  Data format of Sense data is defined by the Interface GUID.\r
 \r
-  TODO: add return values\r
+  @param[in]      This              Pointer to the EFI_DISK_INFO_PROTOCOL instance.\r
+  @param[in, out] SenseData         Pointer to the SenseData.\r
+  @param[in, out] SenseDataSize     Size of SenseData in bytes.\r
+  @param[out]     SenseDataNumber   Pointer to the value for the sense data size.\r
 \r
---*/\r
-;\r
+  @retval EFI_SUCCESS            The command was accepted without any errors.\r
+  @retval EFI_NOT_FOUND          Device does not support this data class.\r
+  @retval EFI_DEVICE_ERROR       Error reading SenseData from device.\r
+  @retval EFI_BUFFER_TOO_SMALL   SenseDataSize not big enough.\r
 \r
+**/\r
 EFI_STATUS\r
-ScsiDiskReadCapacity (\r
-  SCSI_DISK_DEV           *ScsiDiskDevice,\r
-  BOOLEAN                 *NeedRetry,\r
-  EFI_SCSI_SENSE_DATA     **SenseDataArray,\r
-  UINTN                   *NumberOfSenseKeys\r
-  )\r
-/*++\r
+EFIAPI\r
+ScsiDiskInfoSenseData (\r
+  IN     EFI_DISK_INFO_PROTOCOL   *This,\r
+  IN OUT VOID                     *SenseData,\r
+  IN OUT UINT32                   *SenseDataSize,\r
+  OUT    UINT8                    *SenseDataNumber\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  This function is used by the IDE bus driver to get controller information.\r
 \r
-  TODO: Add function description\r
+  @param[in]  This         Pointer to the EFI_DISK_INFO_PROTOCOL instance.\r
+  @param[out] IdeChannel   Pointer to the Ide Channel number.  Primary or secondary.\r
+  @param[out] IdeDevice    Pointer to the Ide Device number.  Master or slave.\r
 \r
-Arguments:\r
+  @retval EFI_SUCCESS       IdeChannel and IdeDevice are valid.\r
+  @retval EFI_UNSUPPORTED   This is not an IDE device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ScsiDiskInfoWhichIde (\r
+  IN  EFI_DISK_INFO_PROTOCOL   *This,\r
+  OUT UINT32                   *IdeChannel,\r
+  OUT UINT32                   *IdeDevice\r
+  );\r
 \r
-  ScsiDiskDevice    - TODO: add argument description\r
-  NeedRetry         - TODO: add argument description\r
-  SenseDataArray    - TODO: add argument description\r
-  NumberOfSenseKeys - TODO: add argument description\r
 \r
-Returns:\r
+/**\r
+  Detect Device and read out capacity ,if error occurs, parse the sense key.\r
 \r
-  TODO: add return values\r
+  @param  ScsiDiskDevice    The pointer of SCSI_DISK_DEV\r
+  @param  MustReadCapacity  The flag about reading device capacity\r
+  @param  MediaChange       The pointer of flag indicates if media has changed\r
 \r
---*/\r
-;\r
+  @retval EFI_DEVICE_ERROR  Indicates that error occurs\r
+  @retval EFI_SUCCESS       Successfully to detect media\r
 \r
+**/\r
 EFI_STATUS\r
-CheckHostAdapterStatus (\r
-  UINT8   HostAdapterStatus\r
-  )\r
-/*++\r
+ScsiDiskDetectMedia (\r
+  IN   SCSI_DISK_DEV   *ScsiDiskDevice,\r
+  IN   BOOLEAN         MustReadCapacity,\r
+  OUT  BOOLEAN         *MediaChange\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  To test device.\r
 \r
-  TODO: Add function description\r
+  When Test Unit Ready command succeeds, retrieve Sense Keys via Request Sense;\r
+  When Test Unit Ready command encounters any error caused by host adapter or\r
+  target, return error without retrieving Sense Keys.\r
 \r
-Arguments:\r
+  @param  ScsiDiskDevice     The pointer of SCSI_DISK_DEV\r
+  @param  NeedRetry          The pointer of flag indicates try again\r
+  @param  SenseDataArray     The pointer of an array of sense data\r
+  @param  NumberOfSenseKeys  The pointer of the number of sense data array\r
 \r
-  HostAdapterStatus - TODO: add argument description\r
+  @retval EFI_DEVICE_ERROR   Indicates that error occurs\r
+  @retval EFI_SUCCESS        Successfully to test unit\r
 \r
-Returns:\r
+**/\r
+EFI_STATUS\r
+ScsiDiskTestUnitReady (\r
+  IN  SCSI_DISK_DEV         *ScsiDiskDevice,\r
+  OUT BOOLEAN               *NeedRetry,\r
+  OUT EFI_SCSI_SENSE_DATA   **SenseDataArray,\r
+  OUT UINTN                 *NumberOfSenseKeys\r
+  );\r
 \r
-  TODO: add return values\r
 \r
---*/\r
-;\r
+/**\r
+  Parsing Sense Keys which got from request sense command.\r
 \r
-EFI_STATUS\r
-CheckTargetStatus (\r
-  UINT8   TargetStatus\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
+  @param  ScsiDiskDevice     The pointer of SCSI_DISK_DEV\r
+  @param  SenseData          The pointer of EFI_SCSI_SENSE_DATA\r
+  @param  NumberOfSenseKeys  The number of sense key\r
+  @param  Action             The pointer of action which indicates what is need to do next\r
 \r
-  TODO: Add function description\r
+  @retval EFI_DEVICE_ERROR   Indicates that error occurs\r
+  @retval EFI_SUCCESS        Successfully to complete the parsing\r
 \r
-Arguments:\r
+**/\r
+EFI_STATUS\r
+DetectMediaParsingSenseKeys (\r
+  OUT  SCSI_DISK_DEV           *ScsiDiskDevice,\r
+  IN   EFI_SCSI_SENSE_DATA     *SenseData,\r
+  IN   UINTN                   NumberOfSenseKeys,\r
+  OUT  UINTN                   *Action\r
+  );\r
 \r
-  TargetStatus  - TODO: add argument description\r
 \r
-Returns:\r
+/**\r
+  Send read capacity command to device and get the device parameter.\r
 \r
-  TODO: add return values\r
+  @param  ScsiDiskDevice     The pointer of SCSI_DISK_DEV\r
+  @param  NeedRetry          The pointer of flag indicates if need a retry\r
+  @param  SenseDataArray     The pointer of an array of sense data\r
+  @param  NumberOfSenseKeys  The number of sense key\r
 \r
---*/\r
-;\r
+  @retval EFI_DEVICE_ERROR   Indicates that error occurs\r
+  @retval EFI_SUCCESS        Successfully to read capacity\r
 \r
+**/\r
 EFI_STATUS\r
-ScsiDiskRequestSenseKeys (\r
-  SCSI_DISK_DEV           *ScsiDiskDevice,\r
-  BOOLEAN                 *NeedRetry,\r
-  EFI_SCSI_SENSE_DATA     **SenseDataArray,\r
-  UINTN                   *NumberOfSenseKeys,\r
-  BOOLEAN                 AskResetIfError\r
-  )\r
-/*++\r
+ScsiDiskReadCapacity (\r
+  IN  OUT  SCSI_DISK_DEV           *ScsiDiskDevice,\r
+      OUT  BOOLEAN                 *NeedRetry,\r
+      OUT  EFI_SCSI_SENSE_DATA     **SenseDataArray,\r
+      OUT  UINTN                   *NumberOfSenseKeys\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  Check the HostAdapter status and re-interpret it in EFI_STATUS.\r
 \r
-  TODO: Add function description\r
+  @param  HostAdapterStatus  Host Adapter status\r
 \r
-Arguments:\r
+  @retval  EFI_SUCCESS       Host adapter is OK.\r
+  @retval  EFI_TIMEOUT       Timeout.\r
+  @retval  EFI_NOT_READY     Adapter NOT ready.\r
+  @retval  EFI_DEVICE_ERROR  Adapter device error.\r
 \r
-  ScsiDiskDevice    - TODO: add argument description\r
-  NeedRetry         - TODO: add argument description\r
-  SenseDataArray    - TODO: add argument description\r
-  NumberOfSenseKeys - TODO: add argument description\r
-  AskResetIfError   - TODO: add argument description\r
+**/\r
+EFI_STATUS\r
+CheckHostAdapterStatus (\r
+  IN UINT8   HostAdapterStatus\r
+  );\r
 \r
-Returns:\r
 \r
-  TODO: add return values\r
+/**\r
+  Check the target status and re-interpret it in EFI_STATUS.\r
 \r
---*/\r
-;\r
+  @param  TargetStatus  Target status\r
 \r
+  @retval EFI_NOT_READY       Device is NOT ready.\r
+  @retval EFI_DEVICE_ERROR\r
+  @retval EFI_SUCCESS\r
+\r
+**/\r
 EFI_STATUS\r
-ScsiDiskInquiryDevice (\r
-  SCSI_DISK_DEV   *ScsiDiskDevice,\r
-  BOOLEAN         *NeedRetry\r
-  )\r
-/*++\r
+CheckTargetStatus (\r
+  IN  UINT8   TargetStatus\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  Retrieve all sense keys from the device.\r
 \r
-  TODO: Add function description\r
+  When encountering error during the process, if retrieve sense keys before\r
+  error encountered, it returns the sense keys with return status set to EFI_SUCCESS,\r
+  and NeedRetry set to FALSE; otherwize, return the proper return status.\r
 \r
-Arguments:\r
+  @param  ScsiDiskDevice     The pointer of SCSI_DISK_DEV\r
+  @param  NeedRetry          The pointer of flag indicates if need a retry\r
+  @param  SenseDataArray     The pointer of an array of sense data\r
+  @param  NumberOfSenseKeys  The number of sense key\r
+  @param  AskResetIfError    The flag indicates if need reset when error occurs\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  NeedRetry       - TODO: add argument description\r
+  @retval EFI_DEVICE_ERROR   Indicates that error occurs\r
+  @retval EFI_SUCCESS        Successfully to request sense key\r
 \r
-Returns:\r
+**/\r
+EFI_STATUS\r
+ScsiDiskRequestSenseKeys (\r
+  IN  OUT  SCSI_DISK_DEV           *ScsiDiskDevice,\r
+      OUT  BOOLEAN                 *NeedRetry,\r
+      OUT  EFI_SCSI_SENSE_DATA     **SenseDataArray,\r
+      OUT  UINTN                   *NumberOfSenseKeys,\r
+  IN       BOOLEAN                 AskResetIfError\r
+  );\r
 \r
-  TODO: add return values\r
+/**\r
+  Send out Inquiry command to Device.\r
 \r
---*/\r
-;\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV\r
+  @param  NeedRetry       Indicates if needs try again when error happens\r
 \r
-VOID\r
-ParseInquiryData (\r
-  SCSI_DISK_DEV   *ScsiDiskDevice\r
-  )\r
-/*++\r
+  @retval  EFI_DEVICE_ERROR  Indicates that error occurs\r
+  @retval  EFI_SUCCESS       Successfully to detect media\r
 \r
-Routine Description:\r
+**/\r
+EFI_STATUS\r
+ScsiDiskInquiryDevice (\r
+  IN OUT  SCSI_DISK_DEV   *ScsiDiskDevice,\r
+     OUT  BOOLEAN         *NeedRetry\r
+  );\r
 \r
-  TODO: Add function description\r
+/**\r
+  Parse Inquiry data.\r
 \r
-Arguments:\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
+**/\r
+VOID\r
+ParseInquiryData (\r
+  IN OUT SCSI_DISK_DEV   *ScsiDiskDevice\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Read sector from SCSI Disk.\r
 \r
-  TODO: add return values\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV\r
+  @param  Buffer          The buffer to fill in the read out data\r
+  @param  Lba             Logic block address\r
+  @param  NumberOfBlocks  The number of blocks to read\r
 \r
---*/\r
-;\r
+  @retval EFI_DEVICE_ERROR  Indicates a device error.\r
+  @retval EFI_SUCCESS       Operation is successful.\r
 \r
+**/\r
 EFI_STATUS\r
 ScsiDiskReadSectors (\r
-  SCSI_DISK_DEV     *ScsiDiskDevice,\r
-  VOID              *Buffer,\r
-  EFI_LBA           Lba,\r
-  UINTN             NumberOfBlocks\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ScsiDiskDevice  - TODO: add argument description\r
-  Buffer          - TODO: add argument description\r
-  Lba             - TODO: add argument description\r
-  NumberOfBlocks  - TODO: add argument description\r
+  IN   SCSI_DISK_DEV     *ScsiDiskDevice,\r
+  OUT  VOID              *Buffer,\r
+  IN   EFI_LBA           Lba,\r
+  IN   UINTN             NumberOfBlocks\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Write sector to SCSI Disk.\r
 \r
-  TODO: add return values\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV\r
+  @param  Buffer          The buffer of data to be written into SCSI Disk\r
+  @param  Lba             Logic block address\r
+  @param  NumberOfBlocks  The number of blocks to read\r
 \r
---*/\r
-;\r
+  @retval EFI_DEVICE_ERROR  Indicates a device error.\r
+  @retval EFI_SUCCESS       Operation is successful.\r
 \r
+**/\r
 EFI_STATUS\r
 ScsiDiskWriteSectors (\r
-  SCSI_DISK_DEV     *ScsiDiskDevice,\r
-  VOID              *Buffer,\r
-  EFI_LBA           Lba,\r
-  UINTN             NumberOfBlocks\r
-  )\r
-/*++\r
+  IN  SCSI_DISK_DEV     *ScsiDiskDevice,\r
+  IN  VOID              *Buffer,\r
+  IN  EFI_LBA           Lba,\r
+  IN  UINTN             NumberOfBlocks\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  Asynchronously read sector from SCSI Disk.\r
 \r
-  TODO: Add function description\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV.\r
+  @param  Buffer          The buffer to fill in the read out data.\r
+  @param  Lba             Logic block address.\r
+  @param  NumberOfBlocks  The number of blocks to read.\r
+  @param  Token           A pointer to the token associated with the\r
+                          non-blocking read request.\r
 \r
-Arguments:\r
+  @retval EFI_INVALID_PARAMETER  Token is NULL or Token->Event is NULL.\r
+  @retval EFI_DEVICE_ERROR       Indicates a device error.\r
+  @retval EFI_SUCCESS            Operation is successful.\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  Buffer          - TODO: add argument description\r
-  Lba             - TODO: add argument description\r
-  NumberOfBlocks  - TODO: add argument description\r
+**/\r
+EFI_STATUS\r
+ScsiDiskAsyncReadSectors (\r
+  IN   SCSI_DISK_DEV         *ScsiDiskDevice,\r
+  OUT  VOID                  *Buffer,\r
+  IN   EFI_LBA               Lba,\r
+  IN   UINTN                 NumberOfBlocks,\r
+  IN   EFI_BLOCK_IO2_TOKEN   *Token\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Asynchronously write sector to SCSI Disk.\r
 \r
-  TODO: add return values\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV.\r
+  @param  Buffer          The buffer of data to be written into SCSI Disk.\r
+  @param  Lba             Logic block address.\r
+  @param  NumberOfBlocks  The number of blocks to read.\r
+  @param  Token           A pointer to the token associated with the\r
+                          non-blocking read request.\r
 \r
---*/\r
-;\r
+  @retval EFI_INVALID_PARAMETER  Token is NULL or Token->Event is NULL\r
+  @retval EFI_DEVICE_ERROR  Indicates a device error.\r
+  @retval EFI_SUCCESS       Operation is successful.\r
 \r
+**/\r
 EFI_STATUS\r
-ScsiDiskRead10 (\r
-  SCSI_DISK_DEV         *ScsiDiskDevice,\r
-  BOOLEAN               *NeedRetry,\r
-  EFI_SCSI_SENSE_DATA   **SenseDataArray,\r
-  UINTN                 *NumberOfSenseKeys,\r
-  UINT64                Timeout,\r
-  UINT8                 *DataBuffer,\r
-  UINT32                *DataLength,\r
-  UINT32                StartLba,\r
-  UINT32                SectorSize\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
+ScsiDiskAsyncWriteSectors (\r
+  IN  SCSI_DISK_DEV          *ScsiDiskDevice,\r
+  IN  VOID                   *Buffer,\r
+  IN  EFI_LBA                Lba,\r
+  IN  UINTN                  NumberOfBlocks,\r
+  IN  EFI_BLOCK_IO2_TOKEN    *Token\r
+  );\r
 \r
-  TODO: Add function description\r
+/**\r
+  Submit Read(10) command.\r
 \r
-Arguments:\r
+  @param  ScsiDiskDevice     The pointer of ScsiDiskDevice\r
+  @param  NeedRetry          The pointer of flag indicates if needs retry if error happens\r
+  @param  Timeout            The time to complete the command\r
+  @param  DataBuffer         The buffer to fill with the read out data\r
+  @param  DataLength         The length of buffer\r
+  @param  StartLba           The start logic block address\r
+  @param  SectorCount        The number of blocks to read\r
 \r
-  ScsiDiskDevice    - TODO: add argument description\r
-  NeedRetry         - TODO: add argument description\r
-  SenseDataArray    - TODO: add argument description\r
-  NumberOfSenseKeys - TODO: add argument description\r
-  Timeout           - TODO: add argument description\r
-  DataBuffer        - TODO: add argument description\r
-  DataLength        - TODO: add argument description\r
-  StartLba          - TODO: add argument description\r
-  SectorSize        - TODO: add argument description\r
+  @return  EFI_STATUS is returned by calling ScsiRead10Command().\r
+**/\r
+EFI_STATUS\r
+ScsiDiskRead10 (\r
+  IN     SCSI_DISK_DEV         *ScsiDiskDevice,\r
+     OUT BOOLEAN               *NeedRetry,\r
+  IN     UINT64                Timeout,\r
+     OUT UINT8                 *DataBuffer,\r
+  IN OUT UINT32                *DataLength,\r
+  IN     UINT32                StartLba,\r
+  IN     UINT32                SectorCount\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Submit Write(10) Command.\r
 \r
-  TODO: add return values\r
+  @param  ScsiDiskDevice     The pointer of ScsiDiskDevice\r
+  @param  NeedRetry          The pointer of flag indicates if needs retry if error happens\r
+  @param  Timeout            The time to complete the command\r
+  @param  DataBuffer         The buffer to fill with the read out data\r
+  @param  DataLength         The length of buffer\r
+  @param  StartLba           The start logic block address\r
+  @param  SectorCount        The number of blocks to write\r
 \r
---*/\r
-;\r
+  @return  EFI_STATUS is returned by calling ScsiWrite10Command().\r
 \r
+**/\r
 EFI_STATUS\r
 ScsiDiskWrite10 (\r
-  SCSI_DISK_DEV         *ScsiDiskDevice,\r
-  BOOLEAN               *NeedRetry,\r
-  EFI_SCSI_SENSE_DATA   **SenseDataArray,\r
-  UINTN                 *NumberOfSenseKeys,\r
-  UINT64                Timeout,\r
-  UINT8                 *DataBuffer,\r
-  UINT32                *DataLength,\r
-  UINT32                StartLba,\r
-  UINT32                SectorSize\r
-  )\r
-/*++\r
+  IN     SCSI_DISK_DEV         *ScsiDiskDevice,\r
+     OUT BOOLEAN               *NeedRetry,\r
+  IN     UINT64                Timeout,\r
+  IN     UINT8                 *DataBuffer,\r
+  IN OUT UINT32                *DataLength,\r
+  IN     UINT32                StartLba,\r
+  IN     UINT32                SectorCount\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  Submit Read(16) command.\r
 \r
-  TODO: Add function description\r
+  @param  ScsiDiskDevice     The pointer of ScsiDiskDevice\r
+  @param  NeedRetry          The pointer of flag indicates if needs retry if error happens\r
+  @param  Timeout            The time to complete the command\r
+  @param  DataBuffer         The buffer to fill with the read out data\r
+  @param  DataLength         The length of buffer\r
+  @param  StartLba           The start logic block address\r
+  @param  SectorCount        The number of blocks to read\r
 \r
-Arguments:\r
+  @return  EFI_STATUS is returned by calling ScsiRead16Command().\r
+**/\r
+EFI_STATUS\r
+ScsiDiskRead16 (\r
+  IN     SCSI_DISK_DEV         *ScsiDiskDevice,\r
+     OUT BOOLEAN               *NeedRetry,\r
+  IN     UINT64                Timeout,\r
+     OUT UINT8                 *DataBuffer,\r
+  IN OUT UINT32                *DataLength,\r
+  IN     UINT64                StartLba,\r
+  IN     UINT32                SectorCount\r
+  );\r
 \r
-  ScsiDiskDevice    - TODO: add argument description\r
-  NeedRetry         - TODO: add argument description\r
-  SenseDataArray    - TODO: add argument description\r
-  NumberOfSenseKeys - TODO: add argument description\r
-  Timeout           - TODO: add argument description\r
-  DataBuffer        - TODO: add argument description\r
-  DataLength        - TODO: add argument description\r
-  StartLba          - TODO: add argument description\r
-  SectorSize        - TODO: add argument description\r
+/**\r
+  Submit Write(16) Command.\r
 \r
-Returns:\r
+  @param  ScsiDiskDevice     The pointer of ScsiDiskDevice\r
+  @param  NeedRetry          The pointer of flag indicates if needs retry if error happens\r
+  @param  Timeout            The time to complete the command\r
+  @param  DataBuffer         The buffer to fill with the read out data\r
+  @param  DataLength         The length of buffer\r
+  @param  StartLba           The start logic block address\r
+  @param  SectorCount        The number of blocks to write\r
 \r
-  TODO: add return values\r
+  @return  EFI_STATUS is returned by calling ScsiWrite16Command().\r
 \r
---*/\r
-;\r
+**/\r
+EFI_STATUS\r
+ScsiDiskWrite16 (\r
+  IN     SCSI_DISK_DEV         *ScsiDiskDevice,\r
+     OUT BOOLEAN               *NeedRetry,\r
+  IN     UINT64                Timeout,\r
+  IN     UINT8                 *DataBuffer,\r
+  IN OUT UINT32                *DataLength,\r
+  IN     UINT64                StartLba,\r
+  IN     UINT32                SectorCount\r
+  );\r
 \r
-VOID\r
-GetMediaInfo (\r
-  SCSI_DISK_DEV                 *ScsiDiskDevice,\r
-  EFI_SCSI_DISK_CAPACITY_DATA   *Capacity\r
-  )\r
-/*++\r
+/**\r
+  Submit Async Read(10) command.\r
+\r
+  @param  ScsiDiskDevice     The pointer of ScsiDiskDevice.\r
+  @param  Timeout            The time to complete the command.\r
+  @param  TimesRetry         The number of times the command has been retried.\r
+  @param  DataBuffer         The buffer to fill with the read out data.\r
+  @param  DataLength         The length of buffer.\r
+  @param  StartLba           The start logic block address.\r
+  @param  SectorCount        The number of blocks to read.\r
+  @param  BlkIo2Req          The upstream BlockIo2 request.\r
+  @param  Token              The pointer to the token associated with the\r
+                             non-blocking read request.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a\r
+                                lack of resources.\r
+  @return others                Status returned by calling\r
+                                ScsiRead10CommandEx().\r
+\r
+**/\r
+EFI_STATUS\r
+ScsiDiskAsyncRead10 (\r
+  IN     SCSI_DISK_DEV         *ScsiDiskDevice,\r
+  IN     UINT64                Timeout,\r
+  IN     UINT8                 TimesRetry,\r
+     OUT UINT8                 *DataBuffer,\r
+  IN     UINT32                DataLength,\r
+  IN     UINT32                StartLba,\r
+  IN     UINT32                SectorCount,\r
+  IN OUT SCSI_BLKIO2_REQUEST   *BlkIo2Req,\r
+  IN     EFI_BLOCK_IO2_TOKEN   *Token\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  Submit Async Write(10) command.\r
+\r
+  @param  ScsiDiskDevice     The pointer of ScsiDiskDevice.\r
+  @param  Timeout            The time to complete the command.\r
+  @param  TimesRetry         The number of times the command has been retried.\r
+  @param  DataBuffer         The buffer contains the data to write.\r
+  @param  DataLength         The length of buffer.\r
+  @param  StartLba           The start logic block address.\r
+  @param  SectorCount        The number of blocks to write.\r
+  @param  BlkIo2Req          The upstream BlockIo2 request.\r
+  @param  Token              The pointer to the token associated with the\r
+                             non-blocking read request.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a\r
+                                lack of resources.\r
+  @return others                Status returned by calling\r
+                                ScsiWrite10CommandEx().\r
+\r
+**/\r
+EFI_STATUS\r
+ScsiDiskAsyncWrite10 (\r
+  IN     SCSI_DISK_DEV         *ScsiDiskDevice,\r
+  IN     UINT64                Timeout,\r
+  IN     UINT8                 TimesRetry,\r
+  IN     UINT8                 *DataBuffer,\r
+  IN     UINT32                DataLength,\r
+  IN     UINT32                StartLba,\r
+  IN     UINT32                SectorCount,\r
+  IN OUT SCSI_BLKIO2_REQUEST   *BlkIo2Req,\r
+  IN     EFI_BLOCK_IO2_TOKEN   *Token\r
+  );\r
 \r
-  TODO: Add function description\r
+/**\r
+  Submit Async Read(16) command.\r
+\r
+  @param  ScsiDiskDevice     The pointer of ScsiDiskDevice.\r
+  @param  Timeout            The time to complete the command.\r
+  @param  TimesRetry         The number of times the command has been retried.\r
+  @param  DataBuffer         The buffer to fill with the read out data.\r
+  @param  DataLength         The length of buffer.\r
+  @param  StartLba           The start logic block address.\r
+  @param  SectorCount        The number of blocks to read.\r
+  @param  BlkIo2Req          The upstream BlockIo2 request.\r
+  @param  Token              The pointer to the token associated with the\r
+                             non-blocking read request.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a\r
+                                lack of resources.\r
+  @return others                Status returned by calling\r
+                                ScsiRead16CommandEx().\r
+\r
+**/\r
+EFI_STATUS\r
+ScsiDiskAsyncRead16 (\r
+  IN     SCSI_DISK_DEV         *ScsiDiskDevice,\r
+  IN     UINT64                Timeout,\r
+  IN     UINT8                 TimesRetry,\r
+     OUT UINT8                 *DataBuffer,\r
+  IN     UINT32                DataLength,\r
+  IN     UINT64                StartLba,\r
+  IN     UINT32                SectorCount,\r
+  IN OUT SCSI_BLKIO2_REQUEST   *BlkIo2Req,\r
+  IN     EFI_BLOCK_IO2_TOKEN   *Token\r
+  );\r
 \r
-Arguments:\r
+/**\r
+  Submit Async Write(16) command.\r
+\r
+  @param  ScsiDiskDevice     The pointer of ScsiDiskDevice.\r
+  @param  Timeout            The time to complete the command.\r
+  @param  TimesRetry         The number of times the command has been retried.\r
+  @param  DataBuffer         The buffer contains the data to write.\r
+  @param  DataLength         The length of buffer.\r
+  @param  StartLba           The start logic block address.\r
+  @param  SectorCount        The number of blocks to write.\r
+  @param  BlkIo2Req          The upstream BlockIo2 request.\r
+  @param  Token              The pointer to the token associated with the\r
+                             non-blocking read request.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a\r
+                                lack of resources.\r
+  @return others                Status returned by calling\r
+                                ScsiWrite16CommandEx().\r
+\r
+**/\r
+EFI_STATUS\r
+ScsiDiskAsyncWrite16 (\r
+  IN     SCSI_DISK_DEV         *ScsiDiskDevice,\r
+  IN     UINT64                Timeout,\r
+  IN     UINT8                 TimesRetry,\r
+  IN     UINT8                 *DataBuffer,\r
+  IN     UINT32                DataLength,\r
+  IN     UINT64                StartLba,\r
+  IN     UINT32                SectorCount,\r
+  IN OUT SCSI_BLKIO2_REQUEST   *BlkIo2Req,\r
+  IN     EFI_BLOCK_IO2_TOKEN   *Token\r
+  );\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  Capacity        - TODO: add argument description\r
+/**\r
+  Get information from media read capacity command.\r
 \r
-Returns:\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV\r
+  @param  Capacity10      The pointer of EFI_SCSI_DISK_CAPACITY_DATA\r
+  @param  Capacity16      The pointer of EFI_SCSI_DISK_CAPACITY_DATA16\r
+**/\r
+VOID\r
+GetMediaInfo (\r
+  IN OUT SCSI_DISK_DEV                  *ScsiDiskDevice,\r
+  IN     EFI_SCSI_DISK_CAPACITY_DATA    *Capacity10,\r
+  IN     EFI_SCSI_DISK_CAPACITY_DATA16  *Capacity16\r
+  );\r
 \r
-  TODO: add return values\r
+/**\r
+  Check sense key to find if media presents.\r
 \r
---*/\r
-;\r
+  @param  SenseData   The pointer of EFI_SCSI_SENSE_DATA\r
+  @param  SenseCounts The number of sense key\r
 \r
+  @retval TRUE    NOT any media\r
+  @retval FALSE   Media presents\r
+**/\r
 BOOLEAN\r
 ScsiDiskIsNoMedia (\r
   IN  EFI_SCSI_SENSE_DATA   *SenseData,\r
   IN  UINTN                 SenseCounts\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Parse sense key.\r
 \r
-  TODO: add return values\r
+  @param  SenseData    The pointer of EFI_SCSI_SENSE_DATA\r
+  @param  SenseCounts  The number of sense key\r
 \r
---*/\r
-;\r
+  @retval TRUE   Error\r
+  @retval FALSE  NOT error\r
 \r
+**/\r
 BOOLEAN\r
 ScsiDiskIsMediaError (\r
   IN  EFI_SCSI_SENSE_DATA   *SenseData,\r
   IN  UINTN                 SenseCounts\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Check sense key to find if hardware error happens.\r
 \r
-  TODO: add return values\r
+  @param  SenseData     The pointer of EFI_SCSI_SENSE_DATA\r
+  @param  SenseCounts   The number of sense key\r
 \r
---*/\r
-;\r
+  @retval TRUE  Hardware error exits.\r
+  @retval FALSE NO error.\r
 \r
+**/\r
 BOOLEAN\r
 ScsiDiskIsHardwareError (\r
   IN  EFI_SCSI_SENSE_DATA   *SenseData,\r
   IN  UINTN                 SenseCounts\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
-\r
-Returns:\r
+  );\r
 \r
-  TODO: add return values\r
+/**\r
+  Check sense key to find if media has changed.\r
 \r
---*/\r
-;\r
+  @param  SenseData    The pointer of EFI_SCSI_SENSE_DATA\r
+  @param  SenseCounts  The number of sense key\r
 \r
+  @retval TRUE   Media is changed.\r
+  @retval FALSE  Medit is NOT changed.\r
+**/\r
 BOOLEAN\r
 ScsiDiskIsMediaChange (\r
   IN  EFI_SCSI_SENSE_DATA   *SenseData,\r
   IN  UINTN                 SenseCounts\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Check sense key to find if reset happens.\r
 \r
-  TODO: add return values\r
+  @param  SenseData    The pointer of EFI_SCSI_SENSE_DATA\r
+  @param  SenseCounts  The number of sense key\r
 \r
---*/\r
-;\r
+  @retval TRUE  It is reset before.\r
+  @retval FALSE It is NOT reset before.\r
 \r
+**/\r
 BOOLEAN\r
 ScsiDiskIsResetBefore (\r
   IN  EFI_SCSI_SENSE_DATA   *SenseData,\r
   IN  UINTN                 SenseCounts\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Check sense key to find if the drive is ready.\r
 \r
-  TODO: add return values\r
+  @param  SenseData    The pointer of EFI_SCSI_SENSE_DATA\r
+  @param  SenseCounts  The number of sense key\r
+  @param  RetryLater   The flag means if need a retry\r
 \r
---*/\r
-;\r
+  @retval TRUE  Drive is ready.\r
+  @retval FALSE Drive is NOT ready.\r
 \r
+**/\r
 BOOLEAN\r
 ScsiDiskIsDriveReady (\r
   IN  EFI_SCSI_SENSE_DATA   *SenseData,\r
   IN  UINTN                 SenseCounts,\r
-  OUT BOOLEAN               *NeedRetry\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
-  NeedRetry   - TODO: add argument description\r
+  OUT BOOLEAN               *RetryLater\r
+  );\r
 \r
-Returns:\r
+/**\r
+  Check sense key to find if it has sense key.\r
 \r
-  TODO: add return values\r
+  @param  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  @param  SenseCounts - The number of sense key\r
 \r
---*/\r
-;\r
+  @retval TRUE  It has sense key.\r
+  @retval FALSE It has NOT any sense key.\r
 \r
+**/\r
 BOOLEAN\r
 ScsiDiskHaveSenseKey (\r
   IN  EFI_SCSI_SENSE_DATA   *SenseData,\r
   IN  UINTN                 SenseCounts\r
-  )\r
-/*++\r
+  );\r
 \r
-Routine Description:\r
+/**\r
+  Release resource about disk device.\r
 \r
-  TODO: Add function description\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV\r
 \r
-Arguments:\r
+**/\r
+VOID\r
+ReleaseScsiDiskDeviceResources (\r
+  IN  SCSI_DISK_DEV   *ScsiDiskDevice\r
+  );\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+/**\r
+  Determine if Block Io should be produced.\r
 \r
-Returns:\r
 \r
-  TODO: add return values\r
+  @param  ChildHandle  Child Handle to retrieve Parent information.\r
 \r
---*/\r
-;\r
+  @retval  TRUE    Should produce Block Io.\r
+  @retval  FALSE   Should not produce Block Io.\r
 \r
+**/\r
+BOOLEAN\r
+DetermineInstallBlockIo (\r
+  IN  EFI_HANDLE      ChildHandle\r
+  );\r
+\r
+/**\r
+  Initialize the installation of DiskInfo protocol.\r
+\r
+  This function prepares for the installation of DiskInfo protocol on the child handle.\r
+  By default, it installs DiskInfo protocol with SCSI interface GUID. If it further\r
+  detects that the physical device is an ATAPI/AHCI device, it then updates interface GUID\r
+  to be IDE/AHCI interface GUID.\r
+\r
+  @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV.\r
+  @param  ChildHandle     Child handle to install DiskInfo protocol.\r
+\r
+**/\r
 VOID\r
-ReleaseScsiDiskDeviceResources (\r
-  IN  SCSI_DISK_DEV   *ScsiDiskDevice\r
-  )\r
-/*++\r
+InitializeInstallDiskInfo (\r
+  IN  SCSI_DISK_DEV   *ScsiDiskDevice,\r
+  IN  EFI_HANDLE      ChildHandle\r
+  );\r
+\r
+/**\r
+  Search protocol database and check to see if the protocol\r
+  specified by ProtocolGuid is present on a ControllerHandle and opened by\r
+  ChildHandle with an attribute of EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.\r
+  If the ControllerHandle is found, then the protocol specified by ProtocolGuid\r
+  will be opened on it.\r
 \r
-Routine Description:\r
 \r
-  TODO: Add function description\r
+  @param  ProtocolGuid   ProtocolGuid pointer.\r
+  @param  ChildHandle    Child Handle to retrieve Parent information.\r
 \r
-Arguments:\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetParentProtocol (\r
+  IN  EFI_GUID                          *ProtocolGuid,\r
+  IN  EFI_HANDLE                        ChildHandle\r
+  );\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
+/**\r
+  Determine if EFI Erase Block Protocol should be produced.\r
 \r
-Returns:\r
+  @param   ScsiDiskDevice    The pointer of SCSI_DISK_DEV.\r
+  @param   ChildHandle       Handle of device.\r
 \r
-  TODO: add return values\r
+  @retval  TRUE    Should produce EFI Erase Block Protocol.\r
+  @retval  FALSE   Should not produce EFI Erase Block Protocol.\r
 \r
---*/\r
-;\r
+**/\r
+BOOLEAN\r
+DetermineInstallEraseBlock (\r
+  IN  SCSI_DISK_DEV          *ScsiDiskDevice,\r
+  IN  EFI_HANDLE             ChildHandle\r
+  );\r
 \r
 #endif\r