]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1. Set the Target array to zero before fill the target id.
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 20 Sep 2007 10:06:50 +0000 (10:06 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 20 Sep 2007 10:06:50 +0000 (10:06 +0000)
2. Get the command/control register base address for each channel through IDE common registers.
3. Correctify some return status to sync with newest Uefi Spec 2.1

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3901 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.c
MdeModulePkg/Bus/Pci/AtapiPassThruDxe/AtapiPassThru.h
MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.c
MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.h
MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ComponentName.c
MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c
MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h

index f14d9e34820fe3a3eb3e04be88f25924b9ac6d3b..b6dceeb83a91d8890cf4ed5bf63cac2abb947402 100644 (file)
 \r
 #include "AtapiPassThru.h"\r
 \r
 \r
 #include "AtapiPassThru.h"\r
 \r
-///\r
-/// IDE registers' fixed address\r
-///\r
-static IDE_BASE_REGISTERS   gAtapiIoPortRegisters[2] = {\r
-  { 0x1f0, { 0x1f1 }, 0x1f2, 0x1f3, 0x1f4, 0x1f5, 0x1f6, { 0x1f7 }, { 0x3f6 }, 0x3f7, 0 },\r
-  { 0x170, { 0x171 }, 0x172, 0x173, 0x174, 0x175, 0x176, { 0x177 }, { 0x376 }, 0x377, 0 } \r
-};\r
 \r
 static SCSI_COMMAND_SET     gEndTable = { 0xff, (DATA_DIRECTION) 0xff };\r
 \r
 \r
 static SCSI_COMMAND_SET     gEndTable = { 0xff, (DATA_DIRECTION) 0xff };\r
 \r
@@ -97,6 +90,7 @@ AtapiScsiPassThruDriverBindingSupported (
   EFI_PCI_IO_PROTOCOL *PciIo;\r
   PCI_TYPE00          Pci;\r
 \r
   EFI_PCI_IO_PROTOCOL *PciIo;\r
   PCI_TYPE00          Pci;\r
 \r
+\r
   //\r
   // Open the IO Abstraction(s) needed to perform the supported test\r
   //\r
   //\r
   // Open the IO Abstraction(s) needed to perform the supported test\r
   //\r
@@ -125,11 +119,11 @@ AtapiScsiPassThruDriverBindingSupported (
                         );\r
   if (EFI_ERROR (Status)) {\r
     gBS->CloseProtocol (\r
                         );\r
   if (EFI_ERROR (Status)) {\r
     gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiPciIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
+           Controller,\r
+           &gEfiPciIoProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Controller\r
+           );\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
@@ -139,11 +133,11 @@ AtapiScsiPassThruDriverBindingSupported (
   }\r
 \r
   gBS->CloseProtocol (\r
   }\r
 \r
   gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiPciIoProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
+         Controller,\r
+         &gEfiPciIoProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         Controller\r
+         );\r
 \r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
@@ -169,7 +163,9 @@ AtapiScsiPassThruDriverBindingStart (
   )\r
 {\r
   EFI_STATUS          Status;\r
   )\r
 {\r
   EFI_STATUS          Status;\r
+  EFI_STATUS          DisableStatus;\r
   EFI_PCI_IO_PROTOCOL *PciIo;\r
   EFI_PCI_IO_PROTOCOL *PciIo;\r
+  UINT64              Supports;\r
 \r
   PciIo = NULL;\r
   Status = gBS->OpenProtocol (\r
 \r
   PciIo = NULL;\r
   Status = gBS->OpenProtocol (\r
@@ -186,10 +182,21 @@ AtapiScsiPassThruDriverBindingStart (
 \r
   Status = PciIo->Attributes (\r
                     PciIo,\r
 \r
   Status = PciIo->Attributes (\r
                     PciIo,\r
-                    EfiPciIoAttributeOperationEnable,\r
-                    EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO | EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO | EFI_PCI_DEVICE_ENABLE,\r
-                    NULL\r
+                    EfiPciIoAttributeOperationSupported,\r
+                    0,\r
+                    &Supports\r
                     );\r
                     );\r
+  if (!EFI_ERROR (Status)) {\r
+    Supports &= (EFI_PCI_DEVICE_ENABLE               |\r
+                 EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO |\r
+                 EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO);\r
+    Status = PciIo->Attributes (\r
+                      PciIo,\r
+                      EfiPciIoAttributeOperationEnable,\r
+                      Supports,\r
+                      NULL\r
+                      );\r
+  }\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
@@ -202,20 +209,31 @@ AtapiScsiPassThruDriverBindingStart (
 Done:\r
   if (EFI_ERROR (Status)) {\r
     if (PciIo) {\r
 Done:\r
   if (EFI_ERROR (Status)) {\r
     if (PciIo) {\r
-      PciIo->Attributes (\r
-              PciIo,\r
-              EfiPciIoAttributeOperationDisable,\r
-              EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO | EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO | EFI_PCI_DEVICE_ENABLE,\r
-              NULL\r
-              );\r
+      DisableStatus = PciIo->Attributes (\r
+                               PciIo,\r
+                               EfiPciIoAttributeOperationSupported,\r
+                               0,\r
+                               &Supports\r
+                               );\r
+      if (!EFI_ERROR (DisableStatus)) {\r
+        Supports &= (EFI_PCI_DEVICE_ENABLE               |\r
+                     EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO |\r
+                     EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO);\r
+        DisableStatus = PciIo->Attributes (\r
+                                 PciIo,\r
+                                 EfiPciIoAttributeOperationDisable,\r
+                                 Supports,\r
+                                 NULL\r
+                                 );\r
+      }\r
     }\r
 \r
     gBS->CloseProtocol (\r
     }\r
 \r
     gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiPciIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
+           Controller,\r
+           &gEfiPciIoProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Controller\r
+           );\r
   }\r
 \r
   return Status;\r
   }\r
 \r
   return Status;\r
@@ -246,6 +264,7 @@ AtapiScsiPassThruDriverBindingStop (
   EFI_STATUS                  Status;\r
   EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru;\r
   ATAPI_SCSI_PASS_THRU_DEV    *AtapiScsiPrivate;\r
   EFI_STATUS                  Status;\r
   EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru;\r
   ATAPI_SCSI_PASS_THRU_DEV    *AtapiScsiPrivate;\r
+  UINT64                      Supports;\r
 \r
   Status = gBS->OpenProtocol (\r
                   Controller,\r
 \r
   Status = gBS->OpenProtocol (\r
                   Controller,\r
@@ -272,19 +291,30 @@ AtapiScsiPassThruDriverBindingStop (
   //\r
   // Release Pci Io protocol on the controller handle.\r
   //\r
   //\r
   // Release Pci Io protocol on the controller handle.\r
   //\r
-  AtapiScsiPrivate->PciIo->Attributes (\r
-                            AtapiScsiPrivate->PciIo,\r
-                            EfiPciIoAttributeOperationDisable,\r
-                            EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO | EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO | EFI_PCI_DEVICE_ENABLE,\r
-                            NULL\r
-                            );\r
+  Status = AtapiScsiPrivate->PciIo->Attributes (\r
+                                      AtapiScsiPrivate->PciIo,\r
+                                      EfiPciIoAttributeOperationSupported,\r
+                                      0,\r
+                                      &Supports\r
+                                      );\r
+  if (!EFI_ERROR (Status)) {\r
+    Supports &= (EFI_PCI_DEVICE_ENABLE               |\r
+                 EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO |\r
+                 EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO);\r
+    Status = AtapiScsiPrivate->PciIo->Attributes (\r
+                                        AtapiScsiPrivate->PciIo,\r
+                                        EfiPciIoAttributeOperationDisable,\r
+                                        Supports,\r
+                                        NULL\r
+                                        );\r
+  }\r
 \r
   gBS->CloseProtocol (\r
 \r
   gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiPciIoProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
+         Controller,\r
+         &gEfiPciIoProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         Controller\r
+         );\r
 \r
   gBS->FreePool (AtapiScsiPrivate);\r
 \r
 \r
   gBS->FreePool (AtapiScsiPrivate);\r
 \r
@@ -313,20 +343,36 @@ RegisterAtapiScsiPassThru (
 {\r
   EFI_STATUS                Status;\r
   ATAPI_SCSI_PASS_THRU_DEV  *AtapiScsiPrivate;\r
 {\r
   EFI_STATUS                Status;\r
   ATAPI_SCSI_PASS_THRU_DEV  *AtapiScsiPrivate;\r
-  UINT64                    Attributes;\r
+  UINT64                    Supports;\r
+  IDE_REGISTERS_BASE_ADDR   IdeRegsBaseAddr[ATAPI_MAX_CHANNEL];\r
 \r
   AtapiScsiPrivate = AllocateZeroPool (sizeof (ATAPI_SCSI_PASS_THRU_DEV));\r
   if (AtapiScsiPrivate == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
 \r
   AtapiScsiPrivate = AllocateZeroPool (sizeof (ATAPI_SCSI_PASS_THRU_DEV));\r
   if (AtapiScsiPrivate == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  Attributes = EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO | EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO | EFI_PCI_DEVICE_ENABLE;\r
   CopyMem (AtapiScsiPrivate->ChannelName, gAtapiChannelString, sizeof (gAtapiChannelString));\r
 \r
   //\r
   // Enable channel\r
   //\r
   CopyMem (AtapiScsiPrivate->ChannelName, gAtapiChannelString, sizeof (gAtapiChannelString));\r
 \r
   //\r
   // Enable channel\r
   //\r
-  PciIo->Attributes (PciIo, EfiPciIoAttributeOperationSet, Attributes, NULL);\r
+  Status = PciIo->Attributes (\r
+                    PciIo,\r
+                    EfiPciIoAttributeOperationSupported,\r
+                    0,\r
+                    &Supports\r
+                    );\r
+  if (!EFI_ERROR (Status)) {\r
+    Supports &= (EFI_PCI_DEVICE_ENABLE               |\r
+                 EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO |\r
+                 EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO);\r
+    Status = PciIo->Attributes (\r
+                      PciIo,\r
+                      EfiPciIoAttributeOperationEnable,\r
+                      Supports,\r
+                      NULL\r
+                      );\r
+  }\r
 \r
   AtapiScsiPrivate->Signature = ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE;\r
   AtapiScsiPrivate->Handle    = Controller;\r
 \r
   AtapiScsiPrivate->Signature = ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE;\r
   AtapiScsiPrivate->Handle    = Controller;\r
@@ -334,10 +380,19 @@ RegisterAtapiScsiPassThru (
   //\r
   // will reset the IoPort inside each API function.\r
   //\r
   //\r
   // will reset the IoPort inside each API function.\r
   //\r
-  AtapiScsiPrivate->IoPort  = gAtapiIoPortRegisters;\r
+  AtapiScsiPrivate->IoPort  = NULL;\r
   AtapiScsiPrivate->PciIo   = PciIo;\r
 \r
   //\r
   AtapiScsiPrivate->PciIo   = PciIo;\r
 \r
   //\r
+  // Obtain IDE IO port registers' base addresses\r
+  //\r
+  Status = GetIdeRegistersBaseAddr (PciIo, IdeRegsBaseAddr);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  InitAtapiIoPortRegisters(AtapiScsiPrivate, IdeRegsBaseAddr);\r
+\r
   // initialize SCSI Pass Thru Protocol interface\r
   //\r
   AtapiScsiPrivate->ScsiPassThru.Mode             = &AtapiScsiPrivate->ScsiPassThruMode;\r
   // initialize SCSI Pass Thru Protocol interface\r
   //\r
   AtapiScsiPrivate->ScsiPassThru.Mode             = &AtapiScsiPrivate->ScsiPassThruMode;\r
@@ -364,9 +419,9 @@ RegisterAtapiScsiPassThru (
   AtapiScsiPrivate->ScsiPassThruMode.IoAlign = 0;\r
 \r
   //\r
   AtapiScsiPrivate->ScsiPassThruMode.IoAlign = 0;\r
 \r
   //\r
-  // Initialize the LatestTargetId to 0xFFFFFFFF (for the GetNextDevice() call).\r
+  // Initialize the LatestTargetId.\r
   //\r
   //\r
-  AtapiScsiPrivate->LatestTargetId  = 0xFFFFFFFF;\r
+  AtapiScsiPrivate->LatestTargetId  = 4;\r
   AtapiScsiPrivate->LatestLun       = 0;\r
 \r
   Status = gBS->InstallProtocolInterface (\r
   AtapiScsiPrivate->LatestLun       = 0;\r
 \r
   Status = gBS->InstallProtocolInterface (\r
@@ -411,15 +466,15 @@ AtapiScsiPassThruFunction (
   IN EFI_EVENT                                          Event OPTIONAL\r
   )\r
 {\r
   IN EFI_EVENT                                          Event OPTIONAL\r
   )\r
 {\r
-  ATAPI_SCSI_PASS_THRU_DEV  *AtapiScsiPrivate;\r
-  EFI_STATUS                Status;\r
+  ATAPI_SCSI_PASS_THRU_DEV               *AtapiScsiPrivate;\r
+  EFI_STATUS                             Status;\r
 \r
   AtapiScsiPrivate = ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS (This);\r
 \r
   //\r
   // Target is not allowed beyond MAX_TARGET_ID\r
   //\r
 \r
   AtapiScsiPrivate = ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS (This);\r
 \r
   //\r
   // Target is not allowed beyond MAX_TARGET_ID\r
   //\r
-  if (Target > MAX_TARGET_ID) {\r
+  if ((Target > MAX_TARGET_ID) || (Lun != 0)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   \r
     return EFI_INVALID_PARAMETER;\r
   }\r
   \r
@@ -442,13 +497,15 @@ AtapiScsiPassThruFunction (
   \r
   //\r
   // According to Target ID, reset the Atapi I/O Register mapping\r
   \r
   //\r
   // According to Target ID, reset the Atapi I/O Register mapping\r
-  // (Target Id in [0,1] area, using gAtapiIoPortRegisters[0],\r
-  //  Target Id in [2,3] area, using gAtapiIoPortRegisters[1]\r
+  // (Target Id in [0,1] area, using AtapiIoPortRegisters[0],\r
+  //  Target Id in [2,3] area, using AtapiIoPortRegisters[1]\r
   //\r
   if ((Target / 2) == 0) {\r
   //\r
   if ((Target / 2) == 0) {\r
-    AtapiScsiPrivate->IoPort = &gAtapiIoPortRegisters[0];\r
+    Target = Target % 2;\r
+    AtapiScsiPrivate->IoPort = &AtapiScsiPrivate->AtapiIoPortRegisters[0];\r
   } else {\r
   } else {\r
-    AtapiScsiPrivate->IoPort = &gAtapiIoPortRegisters[1];\r
+    Target = Target % 2;\r
+    AtapiScsiPrivate->IoPort = &AtapiScsiPrivate->AtapiIoPortRegisters[1];\r
   }\r
   \r
   //\r
   }\r
   \r
   //\r
@@ -572,6 +629,7 @@ AtapiScsiPassThruBuildDevicePath (
 {\r
   EFI_DEV_PATH              *Node;\r
 \r
 {\r
   EFI_DEV_PATH              *Node;\r
 \r
+\r
   //\r
   // Validate parameters passed in.\r
   //\r
   //\r
   // Validate parameters passed in.\r
   //\r
@@ -691,8 +749,10 @@ AtapiScsiPassThruResetChannel (
   UINT8                     DeviceControlValue;\r
   ATAPI_SCSI_PASS_THRU_DEV  *AtapiScsiPrivate;\r
   UINT8                     Index;\r
   UINT8                     DeviceControlValue;\r
   ATAPI_SCSI_PASS_THRU_DEV  *AtapiScsiPrivate;\r
   UINT8                     Index;\r
+  BOOLEAN                   ResetFlag;\r
 \r
   AtapiScsiPrivate = ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS (This);\r
 \r
   AtapiScsiPrivate = ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS (This);\r
+  ResetFlag = FALSE;\r
 \r
   //\r
   // Reset both Primary channel and Secondary channel.\r
 \r
   //\r
   // Reset both Primary channel and Secondary channel.\r
@@ -702,7 +762,7 @@ AtapiScsiPassThruResetChannel (
     //\r
     // Reset\r
     //\r
     //\r
     // Reset\r
     //\r
-    AtapiScsiPrivate->IoPort  = &gAtapiIoPortRegisters[Index];\r
+    AtapiScsiPrivate->IoPort  = &AtapiScsiPrivate->AtapiIoPortRegisters[Index];\r
 \r
     DeviceControlValue        = 0;\r
     //\r
 \r
     DeviceControlValue        = 0;\r
     //\r
@@ -735,12 +795,16 @@ AtapiScsiPassThruResetChannel (
     //\r
     // slave device needs at most 31s to clear BSY\r
     //\r
     //\r
     // slave device needs at most 31s to clear BSY\r
     //\r
-    if (StatusWaitForBSYClear (AtapiScsiPrivate, 31000) == EFI_TIMEOUT) {\r
-      return EFI_DEVICE_ERROR;\r
+    if (StatusWaitForBSYClear (AtapiScsiPrivate, 31000000) != EFI_TIMEOUT) {\r
+      ResetFlag = TRUE;\r
     }\r
   }\r
 \r
     }\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  if (ResetFlag) {\r
+    return EFI_SUCCESS;\r
+  }\r
+  \r
+  return EFI_TIMEOUT;\r
 }\r
 \r
 /**\r
 }\r
 \r
 /**\r
@@ -776,7 +840,7 @@ AtapiScsiPassThruResetTarget (
 \r
   AtapiScsiPrivate = ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS (This);\r
 \r
 \r
   AtapiScsiPrivate = ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS (This);\r
 \r
-  if (Target > MAX_TARGET_ID) {\r
+  if ((Target > MAX_TARGET_ID) || (Lun != 0)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   //\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   //\r
@@ -788,13 +852,13 @@ AtapiScsiPassThruResetTarget (
   \r
   //\r
   // According to Target ID, reset the Atapi I/O Register mapping\r
   \r
   //\r
   // According to Target ID, reset the Atapi I/O Register mapping\r
-  // (Target Id in [0,1] area, using gAtapiIoPortRegisters[0],\r
-  //  Target Id in [2,3] area, using gAtapiIoPortRegisters[1]\r
+  // (Target Id in [0,1] area, using AtapiIoPortRegisters[0],\r
+  //  Target Id in [2,3] area, using AtapiIoPortRegisters[1]\r
   //\r
   if ((Target / 2) == 0) {\r
   //\r
   if ((Target / 2) == 0) {\r
-    AtapiScsiPrivate->IoPort = &gAtapiIoPortRegisters[0];\r
+    AtapiScsiPrivate->IoPort = &AtapiScsiPrivate->AtapiIoPortRegisters[0];\r
   } else {\r
   } else {\r
-    AtapiScsiPrivate->IoPort = &gAtapiIoPortRegisters[1];\r
+    AtapiScsiPrivate->IoPort = &AtapiScsiPrivate->AtapiIoPortRegisters[1];\r
   }\r
   \r
   //\r
   }\r
   \r
   //\r
@@ -813,8 +877,8 @@ AtapiScsiPassThruResetTarget (
   // when reset is complete.\r
   // slave device needs at most 31s to clear BSY\r
   //\r
   // when reset is complete.\r
   // slave device needs at most 31s to clear BSY\r
   //\r
-  if (EFI_ERROR (StatusWaitForBSYClear (AtapiScsiPrivate, 31000))) {\r
-    return EFI_DEVICE_ERROR;\r
+  if (EFI_ERROR (StatusWaitForBSYClear (AtapiScsiPrivate, 31000000))) {\r
+    return EFI_TIMEOUT;\r
   }\r
   \r
   //\r
   }\r
   \r
   //\r
@@ -825,25 +889,159 @@ AtapiScsiPassThruResetTarget (
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
+EFI_STATUS\r
+GetIdeRegistersBaseAddr (\r
+  IN  EFI_PCI_IO_PROTOCOL         *PciIo,\r
+  OUT IDE_REGISTERS_BASE_ADDR     *IdeRegsBaseAddr\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Get IDE IO port registers' base addresses by mode. In 'Compatibility' mode,\r
+  use fixed addresses. In Native-PCI mode, get base addresses from BARs in\r
+  the PCI IDE controller's Configuration Space.\r
+\r
+Arguments:\r
+  PciIo             - Pointer to the EFI_PCI_IO_PROTOCOL instance\r
+  IdeRegsBaseAddr   - Pointer to IDE_REGISTERS_BASE_ADDR to \r
+                      receive IDE IO port registers' base addresses\r
+                      \r
+Returns:\r
+\r
+  EFI_STATUS\r
     \r
     \r
-/**\r
-  Checks the parameters in the SCSI Request Packet to make sure\r
-  they are valid for a SCSI Pass Thru request.\r
+--*/\r
+{\r
+  EFI_STATUS  Status;\r
+  PCI_TYPE00  PciData;\r
 \r
 \r
-  @todo function comment is missing 'Routine Description:'\r
-  @todo function comment is missing 'Arguments:'\r
-  @todo function comment is missing 'Returns:'\r
-  @todo    Packet - add argument and description to function comment\r
-  @todo    EFI_INVALID_PARAMETER - add return value to function comment\r
-  @todo    EFI_INVALID_PARAMETER - add return value to function comment\r
-  @todo    EFI_INVALID_PARAMETER - add return value to function comment\r
-  @todo    EFI_UNSUPPORTED - add return value to function comment\r
-  @todo    EFI_SUCCESS - add return value to function comment\r
-**/\r
+  Status = PciIo->Pci.Read (\r
+                        PciIo,\r
+                        EfiPciIoWidthUint8,\r
+                        0,\r
+                        sizeof (PciData),\r
+                        &PciData\r
+                        );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  if ((PciData.Hdr.ClassCode[0] & IDE_PRIMARY_OPERATING_MODE) == 0) {\r
+    IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr  = 0x1f0;\r
+    IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr  = 0x3f6;\r
+  } else {\r
+    //\r
+    // The BARs should be of IO type\r
+    //\r
+    if ((PciData.Device.Bar[0] & BIT0) == 0 || \r
+        (PciData.Device.Bar[1] & BIT0) == 0) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    IdeRegsBaseAddr[IdePrimary].CommandBlockBaseAddr  =\r
+    (UINT16) (PciData.Device.Bar[0] & 0x0000fff8);\r
+    IdeRegsBaseAddr[IdePrimary].ControlBlockBaseAddr  =\r
+    (UINT16) ((PciData.Device.Bar[1] & 0x0000fffc) + 2);\r
+  }\r
+\r
+  if ((PciData.Hdr.ClassCode[0] & IDE_SECONDARY_OPERATING_MODE) == 0) {\r
+    IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr  = 0x170;\r
+    IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr  = 0x376;\r
+  } else {\r
+    //\r
+    // The BARs should be of IO type\r
+    //\r
+    if ((PciData.Device.Bar[2] & BIT0) == 0 ||\r
+        (PciData.Device.Bar[3] & BIT0) == 0) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    IdeRegsBaseAddr[IdeSecondary].CommandBlockBaseAddr  =\r
+    (UINT16) (PciData.Device.Bar[2] & 0x0000fff8);\r
+    IdeRegsBaseAddr[IdeSecondary].ControlBlockBaseAddr  =\r
+    (UINT16) ((PciData.Device.Bar[3] & 0x0000fffc) + 2);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+VOID\r
+InitAtapiIoPortRegisters (\r
+  IN  ATAPI_SCSI_PASS_THRU_DEV     *AtapiScsiPrivate,\r
+  IN  IDE_REGISTERS_BASE_ADDR      *IdeRegsBaseAddr\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Initialize each Channel's Base Address of CommandBlock and ControlBlock.\r
+\r
+Arguments:\r
+    \r
+  AtapiScsiPrivate            - The pointer of ATAPI_SCSI_PASS_THRU_DEV\r
+  IdeRegsBaseAddr             - The pointer of IDE_REGISTERS_BASE_ADDR\r
+  \r
+Returns:\r
+  \r
+  None\r
+\r
+--*/  \r
+{\r
+  \r
+  UINT8               IdeChannel;\r
+  UINT16              CommandBlockBaseAddr;\r
+  UINT16              ControlBlockBaseAddr;\r
+  IDE_BASE_REGISTERS  *RegisterPointer;\r
+\r
+  \r
+  for (IdeChannel = 0; IdeChannel < ATAPI_MAX_CHANNEL; IdeChannel++) {\r
+\r
+    RegisterPointer =  &AtapiScsiPrivate->AtapiIoPortRegisters[IdeChannel];\r
+\r
+    //\r
+    // Initialize IDE IO port addresses, including Command Block registers\r
+    // and Control Block registers\r
+    //\r
+    CommandBlockBaseAddr = IdeRegsBaseAddr[IdeChannel].CommandBlockBaseAddr;\r
+    ControlBlockBaseAddr = IdeRegsBaseAddr[IdeChannel].ControlBlockBaseAddr;\r
+  \r
+    RegisterPointer->Data = CommandBlockBaseAddr;\r
+    (*(UINT16 *) &RegisterPointer->Reg1) = (UINT16) (CommandBlockBaseAddr + 0x01);\r
+    RegisterPointer->SectorCount = (UINT16) (CommandBlockBaseAddr + 0x02);\r
+    RegisterPointer->SectorNumber = (UINT16) (CommandBlockBaseAddr + 0x03);\r
+    RegisterPointer->CylinderLsb = (UINT16) (CommandBlockBaseAddr + 0x04);\r
+    RegisterPointer->CylinderMsb = (UINT16) (CommandBlockBaseAddr + 0x05);\r
+    RegisterPointer->Head = (UINT16) (CommandBlockBaseAddr + 0x06);\r
+    (*(UINT16 *) &RegisterPointer->Reg) = (UINT16) (CommandBlockBaseAddr + 0x07);\r
+  \r
+    (*(UINT16 *) &RegisterPointer->Alt) = ControlBlockBaseAddr;\r
+    RegisterPointer->DriveAddress = (UINT16) (ControlBlockBaseAddr + 0x01);\r
+  }\r
+\r
+}\r
+\r
+    \r
 EFI_STATUS\r
 CheckSCSIRequestPacket (\r
   EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET      *Packet\r
   )\r
 EFI_STATUS\r
 CheckSCSIRequestPacket (\r
   EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET      *Packet\r
   )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Checks the parameters in the SCSI Request Packet to make sure\r
+  they are valid for a SCSI Pass Thru request.\r
+\r
+Arguments:\r
+\r
+  Packet         -  The pointer of EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET   \r
+\r
+Returns:\r
+\r
+  EFI_STATUS\r
+\r
+--*/\r
 {\r
   if (Packet == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
 {\r
   if (Packet == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -971,11 +1169,23 @@ SubmitBlockingIoCommand (
     Packet->SenseDataLength = 0;\r
     return PacketCommandStatus;\r
   }\r
     Packet->SenseDataLength = 0;\r
     return PacketCommandStatus;\r
   }\r
+  \r
+  //\r
+  // Check if SenseData meets the alignment requirement.\r
+  //\r
+  if ((AtapiScsiPrivate->ScsiPassThru.Mode->IoAlign != 0)     \\r
+    && (AtapiScsiPrivate->ScsiPassThru.Mode->IoAlign != 1)) {\r
+    if (((UINTN)Packet->SenseData % AtapiScsiPrivate->ScsiPassThru.Mode->IoAlign) != 0) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
+\r
+  \r
   //\r
   // Return SenseData if PacketCommandStatus matches\r
   // the following return codes.\r
   //\r
   //\r
   // Return SenseData if PacketCommandStatus matches\r
   // the following return codes.\r
   //\r
-  if ((PacketCommandStatus == EFI_WARN_BUFFER_TOO_SMALL) ||\r
+  if ((PacketCommandStatus ==  EFI_BAD_BUFFER_SIZE) ||\r
       (PacketCommandStatus == EFI_DEVICE_ERROR) ||\r
       (PacketCommandStatus == EFI_TIMEOUT)) {\r
     \r
       (PacketCommandStatus == EFI_DEVICE_ERROR) ||\r
       (PacketCommandStatus == EFI_TIMEOUT)) {\r
     \r
@@ -1096,18 +1306,25 @@ AtapiPacketCommand (
   EFI_STATUS  Status;\r
 \r
   //\r
   EFI_STATUS  Status;\r
 \r
   //\r
-  // Set all the command parameters by fill related registers.\r
-  // Before write to all the following registers, BSY and DRQ must be 0.\r
+  // Check if the buffer meets the alignment requirement.\r
   //\r
   //\r
-  Status = StatusDRQClear (AtapiScsiPrivate, TimeoutInMicroSeconds);\r
-  if (EFI_ERROR (Status)) {\r
-    if (Status == EFI_ABORTED) {\r
-      Status = EFI_DEVICE_ERROR;\r
+  if ((AtapiScsiPrivate->ScsiPassThru.Mode->IoAlign != 0)     \\r
+    && (AtapiScsiPrivate->ScsiPassThru.Mode->IoAlign != 1)) {\r
+    if (((UINTN)Buffer % AtapiScsiPrivate->ScsiPassThru.Mode->IoAlign) != 0) {\r
+      return EFI_INVALID_PARAMETER;\r
     }\r
     }\r
+  }\r
 \r
 \r
-    *ByteCount = 0;\r
-    return Status;\r
+  //\r
+  // Set all the command parameters by fill related registers.\r
+  // Before write to all the following registers, BSY must be 0.\r
+  //\r
+  Status = StatusWaitForBSYClear (AtapiScsiPrivate, TimeoutInMicroSeconds);\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_DEVICE_ERROR;\r
   }\r
   }\r
+\r
+\r
   //\r
   // Select device via Device/Head Register.\r
   // "Target = 0" indicates device 0; "Target = 1" indicates device 1\r
   //\r
   // Select device via Device/Head Register.\r
   // "Target = 0" indicates device 0; "Target = 1" indicates device 1\r
@@ -1118,6 +1335,20 @@ AtapiPacketCommand (
     (UINT8) ((Target << 4) | DEFAULT_CMD) // DEFAULT_CMD: 0xa0 (1010,0000)\r
     );\r
 \r
     (UINT8) ((Target << 4) | DEFAULT_CMD) // DEFAULT_CMD: 0xa0 (1010,0000)\r
     );\r
 \r
+  //\r
+  // Set all the command parameters by fill related registers.\r
+  // Before write to all the following registers, BSY DRQ must be 0.\r
+  //\r
+   Status =  StatusDRQClear(AtapiScsiPrivate,  TimeoutInMicroSeconds);\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    if (Status == EFI_ABORTED) {\r
+      Status = EFI_DEVICE_ERROR;\r
+    }\r
+    *ByteCount = 0;\r
+    return Status;\r
+  }\r
+\r
   //\r
   // No OVL; No DMA (by setting feature register)\r
   //\r
   //\r
   // No OVL; No DMA (by setting feature register)\r
   //\r
@@ -1282,7 +1513,7 @@ AtapiPassThruPioReadWriteData (
       // ActualWordCount > 0\r
       //\r
       if (ActualWordCount < RequiredWordCount) {\r
       // ActualWordCount > 0\r
       //\r
       if (ActualWordCount < RequiredWordCount) {\r
-        return EFI_WARN_BUFFER_TOO_SMALL;\r
+        return EFI_BAD_BUFFER_SIZE;\r
       }\r
     }\r
     //\r
       }\r
     }\r
     //\r
index d61c27bd11417fd522f0f6783349b8862b39d4ea..0cb169786a284861cb5874b27284c52108b236ce 100644 (file)
@@ -56,6 +56,28 @@ typedef union {
   UINT16  DeviceControl;  /* when write */\r
 } IDE_AltStatus_OR_DeviceControl;\r
 \r
   UINT16  DeviceControl;  /* when write */\r
 } IDE_AltStatus_OR_DeviceControl;\r
 \r
+\r
+typedef enum {\r
+  IdePrimary    = 0,\r
+  IdeSecondary  = 1,\r
+  IdeMaxChannel = 2\r
+} EFI_IDE_CHANNEL;\r
+\r
+///\r
+\r
+\r
+//\r
+// Bit definitions in Programming Interface byte of the Class Code field\r
+// in PCI IDE controller's Configuration Space\r
+//\r
+#define IDE_PRIMARY_OPERATING_MODE            BIT0\r
+#define IDE_PRIMARY_PROGRAMMABLE_INDICATOR    BIT1\r
+#define IDE_SECONDARY_OPERATING_MODE          BIT2\r
+#define IDE_SECONDARY_PROGRAMMABLE_INDICATOR  BIT3\r
+\r
+\r
+#define ATAPI_MAX_CHANNEL 2\r
+\r
 ///\r
 /// IDE registers set\r
 ///\r
 ///\r
 /// IDE registers set\r
 ///\r
@@ -68,36 +90,37 @@ typedef struct {
   UINT16                          CylinderMsb;\r
   UINT16                          Head;\r
   IDE_CMD_OR_STATUS               Reg;\r
   UINT16                          CylinderMsb;\r
   UINT16                          Head;\r
   IDE_CMD_OR_STATUS               Reg;\r
-\r
   IDE_AltStatus_OR_DeviceControl  Alt;\r
   UINT16                          DriveAddress;\r
   IDE_AltStatus_OR_DeviceControl  Alt;\r
   UINT16                          DriveAddress;\r
-\r
-  UINT16                          MasterSlave;\r
 } IDE_BASE_REGISTERS;\r
 \r
 #define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE  EFI_SIGNATURE_32 ('a', 's', 'p', 't')\r
 \r
 typedef struct {\r
 } IDE_BASE_REGISTERS;\r
 \r
 #define ATAPI_SCSI_PASS_THRU_DEV_SIGNATURE  EFI_SIGNATURE_32 ('a', 's', 'p', 't')\r
 \r
 typedef struct {\r
-  UINTN                       Signature;\r
-\r
-  EFI_HANDLE                  Handle;\r
-  EFI_SCSI_PASS_THRU_PROTOCOL ScsiPassThru;\r
-  EFI_SCSI_PASS_THRU_MODE     ScsiPassThruMode;\r
-  EFI_PCI_IO_PROTOCOL         *PciIo;\r
-\r
+  UINTN                            Signature;\r
+  EFI_HANDLE                       Handle;\r
+  EFI_SCSI_PASS_THRU_PROTOCOL      ScsiPassThru;\r
+  EFI_SCSI_PASS_THRU_MODE          ScsiPassThruMode;\r
+  EFI_PCI_IO_PROTOCOL              *PciIo;\r
   //\r
   // Local Data goes here\r
   //\r
   //\r
   // Local Data goes here\r
   //\r
-  IDE_BASE_REGISTERS          *IoPort;\r
-\r
-  CHAR16                      ControllerName[100];\r
-  CHAR16                      ChannelName[100];\r
-\r
-  UINT32                      LatestTargetId;\r
-  UINT64                      LatestLun;\r
-\r
+  IDE_BASE_REGISTERS               *IoPort;\r
+  IDE_BASE_REGISTERS               AtapiIoPortRegisters[2];\r
+  CHAR16                           ControllerName[100];\r
+  CHAR16                           ChannelName[100];\r
+  UINT32                           LatestTargetId;\r
+  UINT64                           LatestLun;\r
 } ATAPI_SCSI_PASS_THRU_DEV;\r
 \r
 } ATAPI_SCSI_PASS_THRU_DEV;\r
 \r
+//\r
+// IDE registers' base addresses\r
+//\r
+typedef struct {\r
+  UINT16  CommandBlockBaseAddr;\r
+  UINT16  ControlBlockBaseAddr;\r
+} IDE_REGISTERS_BASE_ADDR;\r
+\r
 #define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \\r
   CR (a, \\r
       ATAPI_SCSI_PASS_THRU_DEV, \\r
 #define ATAPI_SCSI_PASS_THRU_DEV_FROM_THIS(a) \\r
   CR (a, \\r
       ATAPI_SCSI_PASS_THRU_DEV, \\r
@@ -824,4 +847,51 @@ AtapiPassThruCheckErrorStatus (
   ATAPI_SCSI_PASS_THRU_DEV        *AtapiScsiPrivate\r
   )\r
 ;\r
   ATAPI_SCSI_PASS_THRU_DEV        *AtapiScsiPrivate\r
   )\r
 ;\r
+EFI_STATUS\r
+GetIdeRegistersBaseAddr (\r
+  IN  EFI_PCI_IO_PROTOCOL         *PciIo,\r
+  OUT IDE_REGISTERS_BASE_ADDR     *IdeRegsBaseAddr\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Get IDE IO port registers' base addresses by mode. In 'Compatibility' mode,\r
+  use fixed addresses. In Native-PCI mode, get base addresses from BARs in\r
+  the PCI IDE controller's Configuration Space.\r
+\r
+Arguments:\r
+  PciIo             - Pointer to the EFI_PCI_IO_PROTOCOL instance\r
+  IdeRegsBaseAddr   - Pointer to IDE_REGISTERS_BASE_ADDR to \r
+                      receive IDE IO port registers' base addresses\r
+                      \r
+Returns:\r
+\r
+  EFI_STATUS\r
+    \r
+--*/\r
+;\r
+\r
+VOID\r
+InitAtapiIoPortRegisters (\r
+  IN  ATAPI_SCSI_PASS_THRU_DEV     *AtapiScsiPrivate,\r
+  IN  IDE_REGISTERS_BASE_ADDR      *IdeRegsBaseAddr\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Initialize each Channel's Base Address of CommandBlock and ControlBlock.\r
+\r
+Arguments:\r
+    \r
+  AtapiScsiPrivate            - The pointer of ATAPI_SCSI_PASS_THRU_DEV\r
+  IdeRegsBaseAddr             - The pointer of IDE_REGISTERS_BASE_ADDR\r
+  \r
+Returns:\r
+  \r
+  None\r
+\r
+--*/  \r
+;\r
+\r
 #endif\r
 #endif\r
index 1110310f92e8bfa9a32c0c935c77848bf8e678b6..2ad32d2b086c459b608b4e2738fb4a894449e393 100644 (file)
@@ -120,7 +120,6 @@ InitializeScsiBus(
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -231,124 +230,156 @@ Returns:
   EFI_DEVICE_ERROR    - This driver cannot be started due to device Error\r
 \r
 --*/\r
   EFI_DEVICE_ERROR    - This driver cannot be started due to device Error\r
 \r
 --*/\r
-// TODO:    This - add argument and description to function comment\r
-// TODO:    Controller - add argument and description to function comment\r
-// TODO:    RemainingDevicePath - add argument and description to function comment\r
 {\r
 {\r
-  EFI_STATUS                  Status;\r
-  UINT64                      Lun;\r
-  BOOLEAN                     ScanOtherPuns;\r
-  SCSI_BUS_DEVICE             *ScsiBusDev;\r
-  BOOLEAN                     FromFirstTarget;\r
-  SCSI_TARGET_ID              *ScsiTargetId;\r
-  UINT8                       *TargetId;\r
-\r
-  TargetId = NULL;\r
-  ScanOtherPuns = TRUE;\r
+  UINT64                                Lun;\r
+  UINT8                                 *TargetId;\r
+  BOOLEAN                               ScanOtherPuns;\r
+  BOOLEAN                               FromFirstTarget;\r
+  BOOLEAN                               ExtScsiSupport;\r
+  EFI_STATUS                            Status;\r
+  EFI_STATUS                            DevicePathStatus;\r
+  EFI_STATUS                            PassThruStatus;\r
+  SCSI_BUS_DEVICE                       *ScsiBusDev;\r
+  SCSI_TARGET_ID                        *ScsiTargetId;\r
+  EFI_DEVICE_PATH_PROTOCOL              *ParentDevicePath;\r
+  EFI_SCSI_PASS_THRU_PROTOCOL           *ScsiInterface;\r
+  EFI_EXT_SCSI_PASS_THRU_PROTOCOL       *ExtScsiInterface;\r
+  EFI_SCSI_BUS_PROTOCOL                 *BusIdentify;\r
+\r
+  TargetId        = NULL;\r
+  ScsiTargetId    = NULL;\r
+  ScanOtherPuns   = TRUE;\r
   FromFirstTarget = FALSE;\r
   FromFirstTarget = FALSE;\r
-  //\r
-  // Allocate SCSI_BUS_DEVICE structure\r
-  //\r
-  ScsiBusDev = NULL;\r
-  ScsiBusDev = AllocateZeroPool (sizeof (SCSI_BUS_DEVICE));\r
-  if (ScsiBusDev == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  ScsiTargetId = NULL;\r
-  ScsiTargetId = AllocateZeroPool (sizeof (SCSI_TARGET_ID));\r
+  ExtScsiSupport  = FALSE;\r
+  PassThruStatus  = EFI_SUCCESS;\r
+    \r
+  ScsiTargetId = AllocateZeroPool(sizeof(SCSI_TARGET_ID));\r
   if (ScsiTargetId == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   TargetId = &ScsiTargetId->ScsiId.ExtScsi[0];\r
   if (ScsiTargetId == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   TargetId = &ScsiTargetId->ScsiId.ExtScsi[0];\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  Controller,\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  (VOID **) &(ScsiBusDev->DevicePath),\r
-                  This->DriverBindingHandle,\r
-                  Controller,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-  if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {\r
-    gBS->FreePool (ScsiBusDev);\r
-    return Status;\r
+  \r
+  DevicePathStatus = gBS->OpenProtocol (\r
+                            Controller,\r
+                            &gEfiDevicePathProtocolGuid,\r
+                            (VOID **) &ParentDevicePath,\r
+                            This->DriverBindingHandle,\r
+                            Controller,\r
+                            EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                            );\r
+  if (EFI_ERROR (DevicePathStatus) && (DevicePathStatus != EFI_ALREADY_STARTED)) {\r
+    return DevicePathStatus;\r
   }\r
 \r
   //\r
   }\r
 \r
   //\r
-  // First consume Extended SCSI Pass Thru protocol, if fail, then consume\r
-  // SCSI Pass Thru protocol\r
+  // To keep backward compatibility, UEFI ExtPassThru Protocol is supported as well as \r
+  // EFI PassThru Protocol. From priority perspective, ExtPassThru Protocol is firstly\r
+  // tried to open on host controller handle. If fails, then PassThru Protocol is tried instead.\r
   //\r
   Status = gBS->OpenProtocol (\r
                   Controller,\r
                   &gEfiExtScsiPassThruProtocolGuid,\r
   //\r
   Status = gBS->OpenProtocol (\r
                   Controller,\r
                   &gEfiExtScsiPassThruProtocolGuid,\r
-                  (VOID **) &(ScsiBusDev->ExtScsiInterface),\r
+                  (VOID **) &ExtScsiInterface,\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
                   This->DriverBindingHandle,\r
                   Controller,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
                   );\r
-  if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {\r
+  //\r
+  // Fail to open UEFI ExtendPassThru Protocol, then try to open EFI PassThru Protocol instead.\r
+  //\r
+  if (EFI_ERROR(Status) && (Status != EFI_ALREADY_STARTED)) {\r
     Status = gBS->OpenProtocol (\r
                     Controller,\r
                     &gEfiScsiPassThruProtocolGuid,\r
     Status = gBS->OpenProtocol (\r
                     Controller,\r
                     &gEfiScsiPassThruProtocolGuid,\r
-                    (VOID **) &(ScsiBusDev->ScsiInterface),\r
+                    (VOID **) &ScsiInterface,\r
                     This->DriverBindingHandle,\r
                     Controller,\r
                     EFI_OPEN_PROTOCOL_BY_DRIVER\r
                     );\r
                     This->DriverBindingHandle,\r
                     Controller,\r
                     EFI_OPEN_PROTOCOL_BY_DRIVER\r
                     );\r
-    if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) {\r
-      gBS->CloseProtocol (\r
-             Controller,\r
-             &gEfiDevicePathProtocolGuid,\r
-             This->DriverBindingHandle,\r
-             Controller\r
-             );\r
-      gBS->FreePool (ScsiBusDev);\r
+    //\r
+    // Fail to open EFI PassThru Protocol, Close the DevicePathProtocol if it is opened by this time.\r
+    //\r
+    if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {\r
+      if (!EFI_ERROR(DevicePathStatus)) {\r
+        gBS->CloseProtocol (\r
+               Controller,\r
+               &gEfiDevicePathProtocolGuid,\r
+               This->DriverBindingHandle,\r
+               Controller\r
+               );\r
+      } \r
       return Status;\r
       return Status;\r
-    }\r
-    DEBUG ((EFI_D_INFO, "Open Scsi Pass Thrugh Protocol\n"));\r
-    ScsiBusDev->ExtScsiSupport  = FALSE;\r
+    } \r
   } else {\r
   } else {\r
-    DEBUG ((EFI_D_INFO, "Open Extended Scsi Pass Thrugh Protocol\n"));\r
-    ScsiBusDev->ExtScsiSupport  = TRUE;\r
+    //\r
+    // Succeed to open ExtPassThru Protocol, and meanwhile open PassThru Protocol \r
+    // with BY_DRIVER if it is also present on the handle. The intent is to prevent \r
+    // another SCSI Bus Driver to work on the same host handle.\r
+    //\r
+    ExtScsiSupport = TRUE;\r
+    PassThruStatus = gBS->OpenProtocol (\r
+                            Controller,\r
+                            &gEfiScsiPassThruProtocolGuid,\r
+                            (VOID **) &ScsiInterface,\r
+                            This->DriverBindingHandle,\r
+                            Controller,\r
+                            EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                            );\r
   }\r
   }\r
-\r
-  ScsiBusDev->Signature = SCSI_BUS_DEVICE_SIGNATURE;\r
-  //\r
-  // Attach EFI_SCSI_BUS_PROTOCOL to controller handle\r
-  //\r
-  Status = gBS->InstallProtocolInterface (\r
-                  &Controller,\r
-                  &mScsiBusProtocolGuid,\r
-                  EFI_NATIVE_INTERFACE,\r
-                  &ScsiBusDev->BusIdentify\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    gBS->CloseProtocol (\r
-           Controller,\r
-           &gEfiDevicePathProtocolGuid,\r
-           This->DriverBindingHandle,\r
-           Controller\r
-           );\r
+    \r
+  if (Status != EFI_ALREADY_STARTED) {\r
+    //\r
+    // Go through here means either ExtPassThru or PassThru Protocol is successfully opened\r
+    // on this handle for this time. Then construct Host controller private data.\r
+    //\r
+    ScsiBusDev = NULL;\r
+    ScsiBusDev = AllocateZeroPool(sizeof(SCSI_BUS_DEVICE));\r
+    if (ScsiBusDev == NULL) {\r
+      Status = EFI_OUT_OF_RESOURCES;\r
+      goto ErrorExit;\r
+    }\r
+    ScsiBusDev->Signature        = SCSI_BUS_DEVICE_SIGNATURE;\r
+    ScsiBusDev->ExtScsiSupport   = ExtScsiSupport;\r
+    ScsiBusDev->DevicePath       = ParentDevicePath;\r
     if (ScsiBusDev->ExtScsiSupport) {\r
     if (ScsiBusDev->ExtScsiSupport) {\r
-      gBS->CloseProtocol (\r
-             Controller,\r
-             &gEfiExtScsiPassThruProtocolGuid,\r
-             This->DriverBindingHandle,\r
-             Controller\r
-             );\r
+      ScsiBusDev->ExtScsiInterface = ExtScsiInterface;\r
     } else {\r
     } else {\r
-      gBS->CloseProtocol (\r
-             Controller,\r
-             &gEfiScsiPassThruProtocolGuid,\r
-             This->DriverBindingHandle,\r
-             Controller\r
-             );\r
+      ScsiBusDev->ScsiInterface    = ScsiInterface;    \r
     }\r
     }\r
-    gBS->FreePool (ScsiBusDev);\r
-    return Status;\r
+\r
+    //\r
+    // Install EFI_SCSI_BUS_PROTOCOL to the controller handle, So ScsiBusDev could be\r
+    // retrieved on this controller handle. With ScsiBusDev, we can know which PassThru\r
+    // Protocol is present on the handle, UEFI ExtPassThru Protocol or EFI PassThru Protocol.\r
+    // \r
+    Status = gBS->InstallProtocolInterface (\r
+                    &Controller,\r
+                    &mScsiBusProtocolGuid,\r
+                    EFI_NATIVE_INTERFACE,\r
+                    &ScsiBusDev->BusIdentify\r
+                    );\r
+    if (EFI_ERROR (Status)) {\r
+      goto ErrorExit;\r
+    }\r
+  } else {\r
+    //\r
+    // Go through here means Start() is re-invoked again, nothing special is required to do except\r
+    // picking up Host controller private information.\r
+    //\r
+    Status = gBS->OpenProtocol (\r
+                    Controller,\r
+                    &mScsiBusProtocolGuid,\r
+                    (VOID **) &BusIdentify,\r
+                    This->DriverBindingHandle,\r
+                    Controller,\r
+                    EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                    );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
+    ScsiBusDev = SCSI_BUS_CONTROLLER_DEVICE_FROM_THIS (BusIdentify);\r
   }\r
 \r
   if (RemainingDevicePath == NULL) {\r
   }\r
 \r
   if (RemainingDevicePath == NULL) {\r
@@ -357,7 +388,7 @@ Returns:
     FromFirstTarget = TRUE;\r
   } else {\r
     if (ScsiBusDev->ExtScsiSupport) {\r
     FromFirstTarget = TRUE;\r
   } else {\r
     if (ScsiBusDev->ExtScsiSupport) {\r
-      ScsiBusDev->ExtScsiInterface->GetTargetLun (ScsiBusDev->ExtScsiInterface, RemainingDevicePath, &TargetId, &Lun);\r
+      ScsiBusDev->ExtScsiInterface->GetTargetLun (ScsiBusDev->ExtScsiInterface, RemainingDevicePath, &TargetId, &Lun);  \r
     } else {\r
       ScsiBusDev->ScsiInterface->GetTargetLun (ScsiBusDev->ScsiInterface, RemainingDevicePath, &ScsiTargetId->ScsiId.Scsi, &Lun);\r
     }\r
     } else {\r
       ScsiBusDev->ScsiInterface->GetTargetLun (ScsiBusDev->ScsiInterface, RemainingDevicePath, &ScsiTargetId->ScsiId.Scsi, &Lun);\r
     }\r
@@ -401,6 +432,38 @@ Returns:
     //\r
     Status = ScsiScanCreateDevice (This, Controller, ScsiTargetId, Lun, ScsiBusDev);\r
   }\r
     //\r
     Status = ScsiScanCreateDevice (This, Controller, ScsiTargetId, Lun, ScsiBusDev);\r
   }\r
+  gBS->FreePool (ScsiTargetId);\r
+  return EFI_SUCCESS;\r
+  \r
+ErrorExit:\r
+  \r
+  if (ScsiBusDev != NULL) {\r
+    gBS->FreePool (ScsiBusDev);\r
+  }\r
+  \r
+  if (ExtScsiSupport) {\r
+    gBS->CloseProtocol (\r
+           Controller,\r
+           &gEfiExtScsiPassThruProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Controller\r
+           );\r
+    if (!EFI_ERROR (PassThruStatus)) {\r
+      gBS->CloseProtocol (\r
+             Controller,\r
+             &gEfiScsiPassThruProtocolGuid,\r
+             This->DriverBindingHandle,\r
+             Controller\r
+             );\r
+    }\r
+  } else {\r
+    gBS->CloseProtocol (\r
+           Controller,\r
+           &gEfiScsiPassThruProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Controller\r
+           );\r
+  }\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -414,20 +477,23 @@ SCSIBusDriverBindingStop (
   )\r
 /*++\r
 \r
   )\r
 /*++\r
 \r
-  Routine Description:\r
+Routine Description:\r
 \r
 \r
-  Arguments:\r
+  Stop this driver on ControllerHandle. Support stoping any child handles\r
+  created by this driver.\r
 \r
 \r
-  Returns:\r
+Arguments:\r
 \r
 \r
+  This              - Protocol instance pointer.\r
+  Controller        - Handle of device to stop driver on\r
+  NumberOfChildren  - Number of Children in the ChildHandleBuffer\r
+  ChildHandleBuffer - List of handles for the children we need to stop.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS\r
+  Others\r
 --*/\r
 --*/\r
-// TODO:    This - add argument and description to function comment\r
-// TODO:    Controller - add argument and description to function comment\r
-// TODO:    NumberOfChildren - add argument and description to function comment\r
-// TODO:    ChildHandleBuffer - add argument and description to function comment\r
-// TODO:    EFI_SUCCESS - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS                  Status;\r
   BOOLEAN                     AllChildrenStopped;\r
 {\r
   EFI_STATUS                  Status;\r
   BOOLEAN                     AllChildrenStopped;\r
@@ -582,17 +648,21 @@ ScsiGetDeviceType (
   )\r
 /*++\r
 \r
   )\r
 /*++\r
 \r
-  Routine Description:\r
-    Retrieves the device type information of the SCSI Controller.\r
+Routine Description:\r
 \r
 \r
-  Arguments:\r
-    This                  - Protocol instance pointer.\r
-    DeviceType            - A pointer to the device type information\r
-                            retrieved from the SCSI Controller.\r
+  Retrieves the device type information of the SCSI Controller.\r
+    \r
+Arguments:\r
 \r
 \r
-  Returns:\r
-    EFI_SUCCESS           - Retrieves the device type information successfully.\r
-    EFI_INVALID_PARAMETER - The DeviceType is NULL.\r
+  This                  - Protocol instance pointer.\r
+  DeviceType            - A pointer to the device type information\r
+                            retrieved from the SCSI Controller. \r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - Retrieves the device type information successfully.\r
+  EFI_INVALID_PARAMETER - The DeviceType is NULL.\r
+  \r
 --*/\r
 {\r
   SCSI_IO_DEV *ScsiIoDevice;\r
 --*/\r
 {\r
   SCSI_IO_DEV *ScsiIoDevice;\r
@@ -614,19 +684,24 @@ ScsiGetDeviceLocation (
   OUT UINT64                  *Lun\r
   )\r
 /*++\r
   OUT UINT64                  *Lun\r
   )\r
 /*++\r
-  Routine Description:\r
-    Retrieves the device location in the SCSI channel.\r
-\r
-  Arguments:\r
-    This                  - Protocol instance pointer.\r
-    Target                - A pointer to the Target ID of a SCSI device\r
-                            on the SCSI channel.\r
-    Lun                   - A pointer to the LUN of the SCSI device on\r
-                            the SCSI channel.\r
-\r
-  Returns:\r
-    EFI_SUCCESS           - Retrieves the device location successfully.\r
-    EFI_INVALID_PARAMETER - The Target or Lun is NULL.\r
+\r
+Routine Description:\r
+\r
+  Retrieves the device location in the SCSI channel.\r
+    \r
+Arguments:\r
+\r
+  This                  - Protocol instance pointer.\r
+  Target                - A pointer to the Target Array which represents ID of a SCSI device \r
+                          on the SCSI channel. \r
+  Lun                   - A pointer to the LUN of the SCSI device on \r
+                          the SCSI channel.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - Retrieves the device location successfully.\r
+  EFI_INVALID_PARAMETER - The Target or Lun is NULL.\r
+\r
 --*/\r
 {\r
   SCSI_IO_DEV *ScsiIoDevice;\r
 --*/\r
 {\r
   SCSI_IO_DEV *ScsiIoDevice;\r
@@ -635,11 +710,11 @@ ScsiGetDeviceLocation (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  ScsiIoDevice  = SCSI_IO_DEV_FROM_THIS (This);\r
+  ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This);\r
 \r
   CopyMem (*Target,&ScsiIoDevice->Pun, TARGET_MAX_BYTES);\r
 \r
 \r
   CopyMem (*Target,&ScsiIoDevice->Pun, TARGET_MAX_BYTES);\r
 \r
-  *Lun          = ScsiIoDevice->Lun;\r
+  *Lun         = ScsiIoDevice->Lun;\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -651,19 +726,22 @@ ScsiResetBus (
   )\r
 /*++\r
 \r
   )\r
 /*++\r
 \r
-  Routine Description:\r
-    Resets the SCSI Bus that the SCSI Controller is attached to.\r
+Routine Description:\r
 \r
 \r
-  Arguments:\r
-    This                  - Protocol instance pointer.\r
+  Resets the SCSI Bus that the SCSI Controller is attached to.\r
+    \r
+Arguments:\r
 \r
 \r
-  Returns:\r
-    EFI_SUCCESS           - The SCSI bus is reset successfully.\r
-    EFI_DEVICE_ERROR      - Errors encountered when resetting the SCSI bus.\r
-    EFI_UNSUPPORTED       - The bus reset operation is not supported by the\r
-                            SCSI Host Controller.\r
-    EFI_TIMEOUT           - A timeout occurred while attempting to reset\r
-                            the SCSI bus.\r
+  This                  - Protocol instance pointer.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - The SCSI bus is reset successfully.\r
+  EFI_DEVICE_ERROR      - Errors encountered when resetting the SCSI bus.\r
+  EFI_UNSUPPORTED       - The bus reset operation is not supported by the\r
+                          SCSI Host Controller.\r
+  EFI_TIMEOUT           - A timeout occurred while attempting to reset \r
+                          the SCSI bus.\r
 --*/\r
 {\r
   SCSI_IO_DEV *ScsiIoDevice;\r
 --*/\r
 {\r
   SCSI_IO_DEV *ScsiIoDevice;\r
@@ -684,24 +762,26 @@ ScsiResetDevice (
   )\r
 /*++\r
 \r
   )\r
 /*++\r
 \r
-  Routine Description:\r
-    Resets the SCSI Controller that the device handle specifies.\r
+Routine Description:\r
 \r
 \r
-  Arguments:\r
-    This                  - Protocol instance pointer.\r
+  Resets the SCSI Controller that the device handle specifies.\r
+    \r
+Arguments:\r
 \r
 \r
+  This                  - Protocol instance pointer.\r
+    \r
+Returns:\r
 \r
 \r
-  Returns:\r
-    EFI_SUCCESS           - Reset the SCSI controller successfully.\r
-    EFI_DEVICE_ERROR      - Errors are encountered when resetting the\r
-                            SCSI Controller.\r
-    EFI_UNSUPPORTED       - The SCSI bus does not support a device\r
-                            reset operation.\r
-    EFI_TIMEOUT           - A timeout occurred while attempting to\r
-                            reset the SCSI Controller.\r
+  EFI_SUCCESS           - Reset the SCSI controller successfully.\r
+  EFI_DEVICE_ERROR      - Errors are encountered when resetting the\r
+                          SCSI Controller.\r
+  EFI_UNSUPPORTED       - The SCSI bus does not support a device \r
+                          reset operation.\r
+  EFI_TIMEOUT           - A timeout occurred while attempting to \r
+                          reset the SCSI Controller.\r
 --*/\r
 {\r
 --*/\r
 {\r
-  SCSI_IO_DEV *ScsiIoDevice;\r
+  SCSI_IO_DEV  *ScsiIoDevice;\r
   UINT8        Target[TARGET_MAX_BYTES];\r
 \r
   ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This);\r
   UINT8        Target[TARGET_MAX_BYTES];\r
 \r
   ScsiIoDevice = SCSI_IO_DEV_FROM_THIS (This);\r
@@ -732,64 +812,67 @@ ScsiExecuteSCSICommand (
   )\r
 /*++\r
 \r
   )\r
 /*++\r
 \r
-  Routine Description:\r
-    Sends a SCSI Request Packet to the SCSI Controller for execution.\r
-\r
-  Arguments:\r
-    This                  - Protocol instance pointer.\r
-    Packet                - The SCSI request packet to send to the SCSI\r
-                            Controller specified by the device handle.\r
-    Event                 - If the SCSI bus where the SCSI device is attached\r
-                            does not support non-blocking I/O, then Event is\r
-                            ignored, and blocking I/O is performed.\r
-                            If Event is NULL, then blocking I/O is performed.\r
-                            If Event is not NULL and non-blocking I/O is\r
-                            supported, then non-blocking I/O is performed,\r
-                            and Event will be signaled when the SCSI Request\r
-                            Packet completes.\r
-  Returns:\r
-    EFI_SUCCESS           - The SCSI Request Packet was sent by the host\r
-                            successfully, and TransferLength bytes were\r
-                            transferred to/from DataBuffer.See\r
-                            HostAdapterStatus, TargetStatus,\r
-                            SenseDataLength, and SenseData in that order\r
-                            for additional status information.\r
-    EFI_WARN_BUFFER_TOO_SMALL - The SCSI Request Packet was executed,\r
-                            but the entire DataBuffer could not be transferred.\r
-                            The actual number of bytes transferred is returned\r
-                            in TransferLength. See HostAdapterStatus,\r
-                            TargetStatus, SenseDataLength, and SenseData in\r
-                            that order for additional status information.\r
-    EFI_NOT_READY         - The SCSI Request Packet could not be sent because\r
-                            there are too many SCSI Command Packets already\r
-                            queued.The caller may retry again later.\r
-    EFI_DEVICE_ERROR      - A device error occurred while attempting to send\r
-                            the SCSI Request Packet. See HostAdapterStatus,\r
-                            TargetStatus, SenseDataLength, and SenseData in\r
-                            that order for additional status information.\r
-    EFI_INVALID_PARAMETER - The contents of CommandPacket are invalid.\r
-                            The SCSI Request Packet was not sent, so no\r
-                            additional status information is available.\r
-    EFI_UNSUPPORTED       - The command described by the SCSI Request Packet\r
-                            is not supported by the SCSI initiator(i.e., SCSI\r
-                            Host Controller). The SCSI Request Packet was not\r
-                            sent, so no additional status information is\r
-                            available.\r
-    EFI_TIMEOUT           - A timeout occurred while waiting for the SCSI\r
-                            Request Packet to execute. See HostAdapterStatus,\r
-                            TargetStatus, SenseDataLength, and SenseData in\r
-                            that order for additional status information.\r
+Routine Description:\r
+\r
+  Sends a SCSI Request Packet to the SCSI Controller for execution.\r
+    \r
+Arguments:\r
+\r
+  This                  - Protocol instance pointer.\r
+  Packet                - The SCSI request packet to send to the SCSI \r
+                          Controller specified by the device handle.\r
+  Event                 - If the SCSI bus where the SCSI device is attached\r
+                          does not support non-blocking I/O, then Event is \r
+                          ignored, and blocking I/O is performed.  \r
+                          If Event is NULL, then blocking I/O is performed.\r
+                          If Event is not NULL and non-blocking I/O is \r
+                          supported, then non-blocking I/O is performed,\r
+                          and Event will be signaled when the SCSI Request\r
+                          Packet completes.\r
+Returns:\r
+\r
+  EFI_SUCCESS           - The SCSI Request Packet was sent by the host \r
+                          successfully, and TransferLength bytes were \r
+                          transferred to/from DataBuffer.See \r
+                          HostAdapterStatus, TargetStatus, \r
+                          SenseDataLength, and SenseData in that order\r
+                          for additional status information.\r
+  EFI_BAD_BUFFER_SIZE  - The SCSI Request Packet was executed, \r
+                          but the entire DataBuffer could not be transferred.\r
+                          The actual number of bytes transferred is returned\r
+                          in TransferLength. See HostAdapterStatus, \r
+                          TargetStatus, SenseDataLength, and SenseData in \r
+                          that order for additional status information.\r
+  EFI_NOT_READY         - The SCSI Request Packet could not be sent because \r
+                          there are too many SCSI Command Packets already \r
+                          queued.The caller may retry again later.\r
+  EFI_DEVICE_ERROR      - A device error occurred while attempting to send \r
+                          the SCSI Request Packet. See HostAdapterStatus, \r
+                          TargetStatus, SenseDataLength, and SenseData in \r
+                          that order for additional status information.\r
+  EFI_INVALID_PARAMETER - The contents of CommandPacket are invalid.  \r
+                          The SCSI Request Packet was not sent, so no \r
+                          additional status information is available.\r
+  EFI_UNSUPPORTED       - The command described by the SCSI Request Packet\r
+                          is not supported by the SCSI initiator(i.e., SCSI \r
+                          Host Controller). The SCSI Request Packet was not\r
+                          sent, so no additional status information is \r
+                          available.\r
+  EFI_TIMEOUT           - A timeout occurred while waiting for the SCSI \r
+                          Request Packet to execute. See HostAdapterStatus,\r
+                          TargetStatus, SenseDataLength, and SenseData in \r
+                          that order for additional status information.\r
 --*/\r
 {\r
 --*/\r
 {\r
-  SCSI_IO_DEV                             *ScsiIoDevice;\r
-  EFI_STATUS                              Status;\r
+  SCSI_IO_DEV                                 *ScsiIoDevice;\r
+  EFI_STATUS                                  Status;\r
   UINT8                                       Target[TARGET_MAX_BYTES];\r
   EFI_EVENT                                   PacketEvent;\r
   EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *ExtRequestPacket;\r
   UINT8                                       Target[TARGET_MAX_BYTES];\r
   EFI_EVENT                                   PacketEvent;\r
   EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET  *ExtRequestPacket;\r
-  SCSI_EVENT_DATA                             EventData;\r
+  SCSI_EVENT_DATA                             EventData;                                     \r
 \r
   PacketEvent = NULL;\r
 \r
   PacketEvent = NULL;\r
-\r
+  \r
   if (Packet == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   if (Packet == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
index be13755707fcc135b502af6ddb55b323750f8c35..e6210773ce76dd77a09dd8211b5371224612a19d 100644 (file)
@@ -18,9 +18,8 @@ Abstract:
     Header file for SCSI Bus Driver.\r
 \r
 Revision History\r
     Header file for SCSI Bus Driver.\r
 \r
 Revision History\r
-++*/\r
+--*/\r
 \r
 \r
-// TODO: fix comment to end with --*/\r
 #ifndef _SCSI_BUS_H\r
 #define _SCSI_BUS_H\r
 \r
 #ifndef _SCSI_BUS_H\r
 #define _SCSI_BUS_H\r
 \r
@@ -325,77 +324,16 @@ DiscoverScsiDevice (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ScsiIoDevice  - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-GetLunList (\r
-  EFI_SCSI_PASS_THRU_PROTOCOL *ScsiPassThru,\r
-  UINT32                      Target,\r
-  UINT64                      **LunArray,\r
-  UINTN                       *NumberOfLuns\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
-\r
-Arguments:\r
-\r
-  ScsiPassThru  - TODO: add argument description\r
-  Target        - TODO: add argument description\r
-  LunArray      - TODO: add argument description\r
-  NumberOfLuns  - TODO: add argument description\r
-\r
-Returns:\r
-\r
-  TODO: add return values\r
-\r
---*/\r
-;\r
-\r
-EFI_STATUS\r
-ScsiBusSubmitReportLunCommand (\r
-  EFI_SCSI_PASS_THRU_PROTOCOL   *ScsiPassThru,\r
-  UINT32                        Target,\r
-  UINTN                         AllocationLength,\r
-  VOID                          *Buffer,\r
-  EFI_SCSI_SENSE_DATA           *SenseData,\r
-  UINT8                         *SenseDataLength,\r
-  UINT8                         *HostAdapterStatus,\r
-  UINT8                         *TargetStatus\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  TODO: Add function description\r
+  Discovery SCSI Device\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiPassThru      - TODO: add argument description\r
-  Target            - TODO: add argument description\r
-  AllocationLength  - TODO: add argument description\r
-  Buffer            - TODO: add argument description\r
-  SenseData         - TODO: add argument description\r
-  SenseDataLength   - TODO: add argument description\r
-  HostAdapterStatus - TODO: add argument description\r
-  TargetStatus      - TODO: add argument description\r
+  ScsiIoDevice    - The pointer of SCSI_IO_DEV\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  TRUE            - Find SCSI Device and verify it.\r
+  FALSE           - Unable to find SCSI Device.  \r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
index 334aae58afe65d5c2917758e443b740fb91952a1..939af33ba1931dc2dec1ab5806481919e29733d4 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2007, 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
 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
index 61d6e4068efd1ffe7b506fca412fdafa97eedb90..100ebf6d62d4a15b71d63419b79f2fdb34972335 100644 (file)
@@ -24,6 +24,7 @@ Abstract:
 #include <Protocol/ComponentName.h>\r
 #include <Protocol/BlockIo.h>\r
 #include <Protocol/DriverBinding.h>\r
 #include <Protocol/ComponentName.h>\r
 #include <Protocol/BlockIo.h>\r
 #include <Protocol/DriverBinding.h>\r
+#include <Protocol/ScsiPassThruExt.h>\r
 \r
 #include <Library/DebugLib.h>\r
 #include <Library/UefiDriverEntryPoint.h>\r
 \r
 #include <Library/DebugLib.h>\r
 #include <Library/UefiDriverEntryPoint.h>\r
@@ -88,17 +89,25 @@ ScsiDiskDriverBindingSupported (
   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
   )\r
 /*++\r
   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
   )\r
 /*++\r
+\r
+Routine Description:\r
+\r
+  Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
+  that has ScsiIoProtocol installed will be supported.\r
+\r
+Arguments:\r
+\r
+  This                - Protocol instance pointer.\r
+  Controller          - Handle of device to test\r
+  RemainingDevicePath - Not used\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS         - This driver supports this device.\r
+  EFI_UNSUPPORTED     - This driver does not support this device.\r
   \r
   \r
-  Routine Description:\r
-  \r
-  Arguments:\r
-  \r
-  Returns:\r
   \r
 --*/\r
   \r
 --*/\r
-// TODO:    This - add argument and description to function comment\r
-// TODO:    Controller - add argument and description to function comment\r
-// TODO:    RemainingDevicePath - add argument and description to function comment\r
 {\r
   EFI_STATUS            Status;\r
   EFI_SCSI_IO_PROTOCOL  *ScsiIo;\r
 {\r
   EFI_STATUS            Status;\r
   EFI_SCSI_IO_PROTOCOL  *ScsiIo;\r
@@ -126,11 +135,11 @@ ScsiDiskDriverBindingSupported (
   }\r
 \r
   gBS->CloseProtocol (\r
   }\r
 \r
   gBS->CloseProtocol (\r
-        Controller,\r
-        &gEfiScsiIoProtocolGuid,\r
-        This->DriverBindingHandle,\r
-        Controller\r
-        );\r
+         Controller,\r
+         &gEfiScsiIoProtocolGuid,\r
+         This->DriverBindingHandle,\r
+         Controller\r
+         );\r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -142,19 +151,24 @@ ScsiDiskDriverBindingStart (
   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
   )\r
 /*++\r
   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
   )\r
 /*++\r
+\r
+Routine Description:\r
+\r
+  Start SCSI Disk Driver, and attach BlockIoProtocol to it.\r
   \r
   \r
-  Routine Description:\r
-  \r
-  Arguments:\r
+Arguments:\r
+\r
+  This                - Protocol instance pointer.\r
+  Controller          - Handle of device to test\r
+  RemainingDevicePath - Not used\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS         - This driver supports this device.\r
+  EFI_UNSUPPORTED     - This driver does not support this device.\r
   \r
   \r
-  Returns:\r
   \r
 --*/\r
   \r
 --*/\r
-// TODO:    This - add argument and description to function comment\r
-// TODO:    Controller - add argument and description to function comment\r
-// TODO:    RemainingDevicePath - add argument and description to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS            Status;\r
   EFI_SCSI_IO_PROTOCOL  *ScsiIo;\r
 {\r
   EFI_STATUS            Status;\r
   EFI_SCSI_IO_PROTOCOL  *ScsiIo;\r
@@ -245,11 +259,11 @@ ScsiDiskDriverBindingStart (
     if (!NeedRetry) {\r
       gBS->FreePool (ScsiDiskDevice->SenseData);\r
       gBS->CloseProtocol (\r
     if (!NeedRetry) {\r
       gBS->FreePool (ScsiDiskDevice->SenseData);\r
       gBS->CloseProtocol (\r
-            Controller,\r
-            &gEfiScsiIoProtocolGuid,\r
-            This->DriverBindingHandle,\r
-            Controller\r
-            );\r
+             Controller,\r
+             &gEfiScsiIoProtocolGuid,\r
+             This->DriverBindingHandle,\r
+             Controller\r
+             );\r
       gBS->FreePool (ScsiDiskDevice);\r
       return EFI_DEVICE_ERROR;\r
     }\r
       gBS->FreePool (ScsiDiskDevice);\r
       return EFI_DEVICE_ERROR;\r
     }\r
@@ -271,11 +285,11 @@ ScsiDiskDriverBindingStart (
   if (EFI_ERROR (Status)) {\r
     gBS->FreePool (ScsiDiskDevice->SenseData);\r
     gBS->CloseProtocol (\r
   if (EFI_ERROR (Status)) {\r
     gBS->FreePool (ScsiDiskDevice->SenseData);\r
     gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiScsiIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
+           Controller,\r
+           &gEfiScsiIoProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Controller\r
+           );\r
     gBS->FreePool (ScsiDiskDevice);\r
     return Status;\r
   }\r
     gBS->FreePool (ScsiDiskDevice);\r
     return Status;\r
   }\r
@@ -285,7 +299,7 @@ ScsiDiskDriverBindingStart (
     "eng",\r
     gScsiDiskComponentName.SupportedLanguages,\r
     &ScsiDiskDevice->ControllerNameTable,\r
     "eng",\r
     gScsiDiskComponentName.SupportedLanguages,\r
     &ScsiDiskDevice->ControllerNameTable,\r
-    (CHAR16 *) L"SCSI Disk Device"\r
+    L"SCSI Disk Device"\r
     );\r
 \r
   return EFI_SUCCESS;\r
     );\r
 \r
   return EFI_SUCCESS;\r
@@ -301,19 +315,26 @@ ScsiDiskDriverBindingStop (
   IN  EFI_HANDLE                      *ChildHandleBuffer\r
   )\r
 /*++\r
   IN  EFI_HANDLE                      *ChildHandleBuffer\r
   )\r
 /*++\r
-  \r
-  Routine Description:\r
-  \r
-  Arguments:\r
-  \r
-  Returns:\r
+\r
+Routine Description:\r
+\r
+    Stop this driver on ControllerHandle. Support stoping any child handles\r
+    created by this driver.\r
+\r
+Arguments:\r
+\r
+    This              - Protocol instance pointer.\r
+    Controller        - Handle of device to stop driver on\r
+    NumberOfChildren  - Number of Children in the ChildHandleBuffer\r
+    ChildHandleBuffer - List of handles for the children we need to stop.\r
+\r
+Returns:\r
+\r
+    EFI_SUCCESS\r
+    EFI_DEVICE_ERROR\r
+    others\r
   \r
 --*/\r
   \r
 --*/\r
-// TODO:    This - add argument and description to function comment\r
-// TODO:    Controller - add argument and description to function comment\r
-// TODO:    NumberOfChildren - add argument and description to function comment\r
-// TODO:    ChildHandleBuffer - add argument and description to function comment\r
-// TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
   SCSI_DISK_DEV         *ScsiDiskDevice;\r
 {\r
   EFI_BLOCK_IO_PROTOCOL *BlkIo;\r
   SCSI_DISK_DEV         *ScsiDiskDevice;\r
@@ -339,11 +360,11 @@ ScsiDiskDriverBindingStop (
                   );\r
   if (!EFI_ERROR (Status)) {\r
     gBS->CloseProtocol (\r
                   );\r
   if (!EFI_ERROR (Status)) {\r
     gBS->CloseProtocol (\r
-          Controller,\r
-          &gEfiScsiIoProtocolGuid,\r
-          This->DriverBindingHandle,\r
-          Controller\r
-          );\r
+           Controller,\r
+           &gEfiScsiIoProtocolGuid,\r
+           This->DriverBindingHandle,\r
+           Controller\r
+           );\r
 \r
     ReleaseScsiDiskDeviceResources (ScsiDiskDevice);\r
 \r
 \r
     ReleaseScsiDiskDeviceResources (ScsiDiskDevice);\r
 \r
@@ -355,9 +376,6 @@ ScsiDiskDriverBindingStop (
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
-//\r
-// Block I/O Protocol Interface\r
-//\r
 \r
 EFI_STATUS\r
 EFIAPI\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -369,22 +387,22 @@ ScsiDiskReset (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Reset SCSI Disk  \r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  This                  - TODO: add argument description\r
-  ExtendedVerification  - TODO: add argument description\r
+  This                  - The pointer of EFI_BLOCK_IO_PROTOCOL\r
+  ExtendedVerification  - The flag about if extend verificate\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_STATUS\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
+  EFI_TPL       OldTpl;\r
   SCSI_DISK_DEV *ScsiDiskDevice;\r
   EFI_STATUS    Status;\r
   SCSI_DISK_DEV *ScsiDiskDevice;\r
   EFI_STATUS    Status;\r
-  EFI_TPL       OldTpl;\r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
 \r
   OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
@@ -416,27 +434,24 @@ ScsiDiskReadBlocks (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  The function is to Read Block from SCSI Disk\r
 \r
 Arguments:\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
+  This        - The pointer of EFI_BLOCK_IO_PROTOCOL\r
+  MediaId     - The Id of Media detected\r
+  LBA         - The logic block address\r
+  BufferSize  - The size of Buffer\r
+  Buffer      - The buffer to fill the read out data\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_NO_MEDIA - TODO: Add description for return value\r
-  EFI_MEDIA_CHANGED - TODO: Add description for return value\r
-  EFI_BAD_BUFFER_SIZE - TODO: Add description for return value\r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
+  EFI_INVALID_PARAMETER - Invalid parameter passed in.\r
+  EFI_SUCCESS           - Successfully to read out block.\r
+  EFI_DEVICE_ERROR      - Fail to detect media.\r
+  EFI_NO_MEDIA          - Media is not present.\r
+  EFI_MEDIA_CHANGED     - Media has changed.\r
+  EFI_BAD_BUFFER_SIZE   - The buffer size is not multiple of BlockSize.\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -515,9 +530,9 @@ Returns:
     Status = EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
     Status = EFI_INVALID_PARAMETER;\r
     goto Done;\r
   }\r
-  \r
+\r
   //\r
   //\r
-  // if all the parameters are valid, then perform read sectors command\r
+  // If all the parameters are valid, then perform read sectors command\r
   // to transfer data from device to host.\r
   //\r
   Status = ScsiDiskReadSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);\r
   // to transfer data from device to host.\r
   //\r
   Status = ScsiDiskReadSectors (ScsiDiskDevice, Buffer, LBA, NumberOfBlocks);\r
@@ -540,27 +555,24 @@ ScsiDiskWriteBlocks (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  The function is to Write Block to SCSI Disk\r
 \r
 Arguments:\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
+  This        - The pointer of EFI_BLOCK_IO_PROTOCOL\r
+  MediaId     - The Id of Media detected\r
+  LBA         - The logic block address\r
+  BufferSize  - The size of Buffer\r
+  Buffer      - The buffer to fill the read out data\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_NO_MEDIA - TODO: Add description for return value\r
-  EFI_MEDIA_CHANGED - TODO: Add description for return value\r
-  EFI_BAD_BUFFER_SIZE - TODO: Add description for return value\r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
-  EFI_INVALID_PARAMETER - TODO: Add description for return value\r
+  EFI_INVALID_PARAMETER - Invalid parameter passed in.\r
+  EFI_SUCCESS           - Successfully to read out block.\r
+  EFI_DEVICE_ERROR      - Fail to detect media.\r
+  EFI_NO_MEDIA          - Media is not present.\r
+  EFI_MEDIA_CHANGED     - Media has changed.\r
+  EFI_BAD_BUFFER_SIZE   - The buffer size is not multiple of BlockSize.\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -647,7 +659,6 @@ Returns:
 \r
 Done:\r
   gBS->RestoreTPL (OldTpl);\r
 \r
 Done:\r
   gBS->RestoreTPL (OldTpl);\r
-  \r
   return Status;\r
 }\r
 \r
   return Status;\r
 }\r
 \r
@@ -660,15 +671,15 @@ ScsiDiskFlushBlocks (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Flush Block to Disk\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  This  - TODO: add argument description\r
+  This  - The pointer of EFI_BLOCK_IO_PROTOCOL\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_SUCCESS - TODO: Add description for return value\r
+  EFI_SUCCESS \r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -688,20 +699,18 @@ ScsiDiskDetectMedia (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Dectect Device and read out capacity ,if error occurs, parse the sense key.\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice    - TODO: add argument description\r
-  MustReadCapacity  - TODO: add argument description\r
-  MediaChange       - TODO: add argument description\r
+  ScsiDiskDevice     - The pointer of SCSI_DISK_DEV\r
+  MustReadCapacity   - The flag about reading device capacity\r
+  MediaChange        - The pointer of flag indicates if media has changed \r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to detect media\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -722,11 +731,9 @@ Returns:
   NumberOfSenseKeys   = 0;\r
   NeedReadCapacity    = FALSE;\r
   CopyMem (&OldMedia, ScsiDiskDevice->BlkIo.Media, sizeof (OldMedia));\r
   NumberOfSenseKeys   = 0;\r
   NeedReadCapacity    = FALSE;\r
   CopyMem (&OldMedia, ScsiDiskDevice->BlkIo.Media, sizeof (OldMedia));\r
-  // OldMedia            = *(ScsiDiskDevice->BlkIo.Media);\r
-\r
   *MediaChange        = FALSE;\r
   *MediaChange        = FALSE;\r
-\r
   MaxRetry            = 3;\r
   MaxRetry            = 3;\r
+\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
     Status = ScsiDiskTestUnitReady (\r
               ScsiDiskDevice,\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
     Status = ScsiDiskTestUnitReady (\r
               ScsiDiskDevice,\r
@@ -765,13 +772,12 @@ Returns:
   } else {\r
     NeedReadCapacity = TRUE;\r
   }\r
   } else {\r
     NeedReadCapacity = TRUE;\r
   }\r
-  \r
+\r
   //\r
   // either NeedReadCapacity is TRUE, or MustReadCapacity is TRUE,\r
   // retrieve capacity via Read Capacity command\r
   //\r
   if (NeedReadCapacity || MustReadCapacity) {\r
   //\r
   // either NeedReadCapacity is TRUE, or MustReadCapacity is TRUE,\r
   // retrieve capacity via Read Capacity command\r
   //\r
   if (NeedReadCapacity || MustReadCapacity) {\r
-    \r
     //\r
     // retrieve media information\r
     //\r
     //\r
     // retrieve media information\r
     //\r
@@ -885,25 +891,17 @@ ScsiDiskInquiryDevice (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Send out Inquiry command to Device\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  NeedRetry       - TODO: add argument description\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
+  NeedRetry       - Indicates if needs try again when error happens\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to detect media\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -931,37 +929,34 @@ Returns:
             &InquiryDataLength,\r
             FALSE\r
             );\r
             &InquiryDataLength,\r
             FALSE\r
             );\r
-  if ((Status == EFI_SUCCESS) || (Status == EFI_WARN_BUFFER_TOO_SMALL)) {\r
     //\r
     // no need to check HostAdapterStatus and TargetStatus\r
     //\r
     //\r
     // no need to check HostAdapterStatus and TargetStatus\r
     //\r
-    ParseInquiryData (ScsiDiskDevice);\r
-    return EFI_SUCCESS;\r
-  } else if (Status == EFI_NOT_READY) {\r
-    //\r
-    // no need to check HostAdapterStatus and TargetStatus\r
-    //\r
-    *NeedRetry = TRUE;\r
-    return EFI_DEVICE_ERROR;\r
-  } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {\r
-    //\r
-    // no need to check HostAdapterStatus and TargetStatus\r
-    //\r
-    *NeedRetry = FALSE;\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // go ahead to check HostAdapterStatus and TargetStatus\r
-  // (EFI_TIMEOUT, EFI_DEVICE_ERROR)\r
-  //\r
-  Status = CheckHostAdapterStatus (HostAdapterStatus);\r
-  if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {\r
-    *NeedRetry = TRUE;\r
-    return EFI_DEVICE_ERROR;\r
-  } else if (Status == EFI_DEVICE_ERROR) {\r
-    //\r
-    // reset the scsi channel\r
-    //\r
+  if ((Status == EFI_SUCCESS) || (Status == EFI_WARN_BUFFER_TOO_SMALL)) {\r
+     ParseInquiryData (ScsiDiskDevice);\r
+     return EFI_SUCCESS;\r
\r
+   } else if (Status == EFI_NOT_READY) {\r
+     *NeedRetry = TRUE;\r
+     return EFI_DEVICE_ERROR;\r
\r
+   } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {\r
+     *NeedRetry = FALSE;\r
+     return EFI_DEVICE_ERROR;\r
+   }\r
+   //\r
+   // go ahead to check HostAdapterStatus and TargetStatus\r
+   // (EFI_TIMEOUT, EFI_DEVICE_ERROR)\r
+   //\r
\r
+   Status = CheckHostAdapterStatus (HostAdapterStatus);\r
+   if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {\r
+     *NeedRetry = TRUE;\r
+     return EFI_DEVICE_ERROR;\r
+   } else if (Status == EFI_DEVICE_ERROR) {\r
+      //\r
+      // reset the scsi channel\r
+      //\r
     ScsiDiskDevice->ScsiIo->ResetBus (ScsiDiskDevice->ScsiIo);\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
     ScsiDiskDevice->ScsiIo->ResetBus (ScsiDiskDevice->ScsiIo);\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
@@ -975,19 +970,19 @@ Returns:
     ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
     ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
+\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
   }\r
   \r
   //\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
   }\r
   \r
   //\r
-  // if goes here, meant ScsiInquiryCommand() failed.\r
+  // if goes here, meant SubmitInquiryCommand() failed.\r
   // if ScsiDiskRequestSenseKeys() succeeds at last,\r
   // if ScsiDiskRequestSenseKeys() succeeds at last,\r
-  // better retry ScsiInquiryCommand(). (by setting *NeedRetry = TRUE)\r
+  // better retry SubmitInquiryCommand(). (by setting *NeedRetry = TRUE)\r
   //\r
   MaxRetry = 3;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
   //\r
   MaxRetry = 3;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
-\r
     Status = ScsiDiskRequestSenseKeys (\r
               ScsiDiskDevice,\r
               NeedRetry,\r
     Status = ScsiDiskRequestSenseKeys (\r
               ScsiDiskDevice,\r
               NeedRetry,\r
@@ -1019,30 +1014,27 @@ ScsiDiskTestUnitReady (
   EFI_SCSI_SENSE_DATA   **SenseDataArray,\r
   UINTN                 *NumberOfSenseKeys\r
   )\r
   EFI_SCSI_SENSE_DATA   **SenseDataArray,\r
   UINTN                 *NumberOfSenseKeys\r
   )\r
-// TODO: function comment should start with '/*++'\r
-/*\r
-  When Test Unit Ready command succeeds,\r
-  retrieve Sense Keys via Request Sense;\r
+ /*++\r
+\r
+Routine Description:\r
+\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
   When Test Unit Ready command encounters any error caused by host adapter or\r
   target, return error without retrieving Sense Keys.\r
-*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Routine Description:'\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO: function comment is missing 'Returns:'\r
-// TODO:    ScsiDiskDevice - add argument and description to function comment\r
-// TODO:    NeedRetry - add argument and description to function comment\r
-// TODO:    SenseDataArray - add argument and description to function comment\r
-// TODO:    NumberOfSenseKeys - add argument and description to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_SUCCESS - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
+  \r
+Arguments:\r
+\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
+  NeedRetry       - The pointer of flag indicates try again\r
+  SenseDataArray  - The pointer of an array of sense data\r
+  NumberOfSenseKeys - The pointer of the number of sense data array\r
+  \r
+Returns:\r
+\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to test unit\r
+\r
+--*/\r
 {\r
   EFI_STATUS  Status;\r
   UINT8       SenseDataLength;\r
 {\r
   EFI_STATUS  Status;\r
   UINT8       SenseDataLength;\r
@@ -1065,26 +1057,26 @@ ScsiDiskTestUnitReady (
             &HostAdapterStatus,\r
             &TargetStatus\r
             );\r
             &HostAdapterStatus,\r
             &TargetStatus\r
             );\r
+  //\r
+  // no need to check HostAdapterStatus and TargetStatus\r
+  //\r
   if (Status == EFI_NOT_READY) {\r
   if (Status == EFI_NOT_READY) {\r
-    //\r
-    // no need to check HostAdapterStatus and TargetStatus\r
-    //\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
+\r
   } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {\r
   } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {\r
-    //\r
-    // no need to check HostAdapterStatus and TargetStatus\r
-    //\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
   }\r
   //\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
   }\r
   //\r
-  // go ahead to check HostAdapterStatus and TargetStatus\r
+  // go ahead to check HostAdapterStatus and TargetStatus(in case of EFI_DEVICE_ERROR)\r
   //\r
   //\r
+\r
   Status = CheckHostAdapterStatus (HostAdapterStatus);\r
   if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
   Status = CheckHostAdapterStatus (HostAdapterStatus);\r
   if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
+\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     //\r
     // reset the scsi channel\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     //\r
     // reset the scsi channel\r
@@ -1102,6 +1094,7 @@ ScsiDiskTestUnitReady (
     ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
     ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
+\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
@@ -1109,7 +1102,6 @@ ScsiDiskTestUnitReady (
 \r
   MaxRetry = 3;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
 \r
   MaxRetry = 3;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
-\r
     Status = ScsiDiskRequestSenseKeys (\r
               ScsiDiskDevice,\r
               NeedRetry,\r
     Status = ScsiDiskRequestSenseKeys (\r
               ScsiDiskDevice,\r
               NeedRetry,\r
@@ -1144,26 +1136,19 @@ DetectMediaParsingSenseKeys (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
-\r
+  Parsing Sense Keys which got from request sense command.\r
+  \r
 Arguments:\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
+  ScsiDiskDevice    - The pointer of SCSI_DISK_DEV\r
+  SenseData         - The pointer of EFI_SCSI_SENSE_DATA\r
+  NumberOfSenseKeys - The number of sense key  \r
+  Action            - The pointer of action which indicates what is need to do next\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to complete the parsing\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -1232,27 +1217,19 @@ ScsiDiskReadCapacity (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Send read capacity command to device and get the device parameter\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\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
+  ScsiDiskDevice     -  The pointer of SCSI_DISK_DEV\r
+  NeedRetry          -  The pointer of flag indicates if need a retry\r
+  SenseDataArray     -  The pointer of an array of sense data\r
+  NumberOfSenseKeys  -  The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to read capacity\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -1286,35 +1263,32 @@ Returns:
                     &DataLength,\r
                     FALSE\r
                     );\r
                     &DataLength,\r
                     FALSE\r
                     );\r
-  if (CommandStatus == EFI_SUCCESS) {\r
-    //\r
-    // no need to check HostAdapterStatus and TargetStatus\r
-    //\r
-    GetMediaInfo (ScsiDiskDevice, &CapacityData);\r
-    return EFI_SUCCESS;\r
-  } else if (CommandStatus == EFI_NOT_READY) {\r
-    //\r
-    // no need to check HostAdapterStatus and TargetStatus\r
-    //\r
-    *NeedRetry = TRUE;\r
-    return EFI_DEVICE_ERROR;\r
-  } else if ((CommandStatus == EFI_INVALID_PARAMETER) || (CommandStatus == EFI_UNSUPPORTED)) {\r
-    //\r
+  //\r
     // no need to check HostAdapterStatus and TargetStatus\r
     //\r
     // no need to check HostAdapterStatus and TargetStatus\r
     //\r
-    *NeedRetry = FALSE;\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-  //\r
-  // go ahead to check HostAdapterStatus and TargetStatus\r
-  // (EFI_TIMEOUT, EFI_DEVICE_ERROR, EFI_WARN_BUFFER_TOO_SMALL)\r
-  //\r
-  \r
-  Status = CheckHostAdapterStatus (HostAdapterStatus);\r
-  if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {\r
-    *NeedRetry = TRUE;\r
-    return EFI_DEVICE_ERROR;\r
-  } else if (Status == EFI_DEVICE_ERROR) {\r
+   if (CommandStatus == EFI_SUCCESS) {\r
+     GetMediaInfo (ScsiDiskDevice, &CapacityData);\r
+     return EFI_SUCCESS;\r
\r
+   } else if (CommandStatus == EFI_NOT_READY) {\r
+     *NeedRetry = TRUE;\r
+     return EFI_DEVICE_ERROR;\r
\r
+   } else if ((CommandStatus == EFI_INVALID_PARAMETER) || (CommandStatus == EFI_UNSUPPORTED)) {\r
+     *NeedRetry = FALSE;\r
+     return EFI_DEVICE_ERROR;\r
+   }\r
+   //\r
+   // go ahead to check HostAdapterStatus and TargetStatus\r
+   // (EFI_TIMEOUT, EFI_DEVICE_ERROR, EFI_WARN_BUFFER_TOO_SMALL)\r
+   //\r
\r
+   Status = CheckHostAdapterStatus (HostAdapterStatus);\r
+   if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {\r
+     *NeedRetry = TRUE;\r
+     return EFI_DEVICE_ERROR;\r
\r
+   } else if (Status == EFI_DEVICE_ERROR) {\r
     //\r
     // reset the scsi channel\r
     //\r
     //\r
     // reset the scsi channel\r
     //\r
@@ -1331,15 +1305,16 @@ Returns:
     ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
     ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
     *NeedRetry = TRUE;\r
     return EFI_DEVICE_ERROR;\r
+\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
   }\r
   \r
   //\r
   } else if (Status == EFI_DEVICE_ERROR) {\r
     *NeedRetry = FALSE;\r
     return EFI_DEVICE_ERROR;\r
   }\r
   \r
   //\r
-  // if goes here, meant ScsiReadCapacityCommand() failed.\r
+  // if goes here, meant SubmitReadCapacityCommand() failed.\r
   // if ScsiDiskRequestSenseKeys() succeeds at last,\r
   // if ScsiDiskRequestSenseKeys() succeeds at last,\r
-  // better retry ScsiReadCapacityCommand(). (by setting *NeedRetry = TRUE)\r
+  // better retry SubmitReadCapacityCommand(). (by setting *NeedRetry = TRUE)\r
   //\r
   MaxRetry = 3;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
   //\r
   MaxRetry = 3;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
@@ -1376,40 +1351,39 @@ CheckHostAdapterStatus (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
-\r
+  Check the HostAdapter status\r
+  \r
 Arguments:\r
 \r
 Arguments:\r
 \r
-  HostAdapterStatus - TODO: add argument description\r
+  HostAdapterStatus - Host Adapter status\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_TIMEOUT - TODO: Add description for return value\r
-  EFI_NOT_READY - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
+  EFI_SUCCESS       \r
+  EFI_TIMEOUT       \r
+  EFI_NOT_READY     \r
+  EFI_DEVICE_ERROR  \r
 \r
 --*/\r
 {\r
   switch (HostAdapterStatus) {\r
 \r
 --*/\r
 {\r
   switch (HostAdapterStatus) {\r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_OK:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OK:\r
     return EFI_SUCCESS;\r
 \r
     return EFI_SUCCESS;\r
 \r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_SELECTION_TIMEOUT:\r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_TIMEOUT:\r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_TIMEOUT_COMMAND:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_SELECTION_TIMEOUT:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_TIMEOUT:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_TIMEOUT_COMMAND:\r
     return EFI_TIMEOUT;\r
 \r
     return EFI_TIMEOUT;\r
 \r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_MESSAGE_REJECT:\r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_PARITY_ERROR:\r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_REQUEST_SENSE_FAILED:\r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN:\r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_BUS_RESET:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_MESSAGE_REJECT:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_PARITY_ERROR:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_REQUEST_SENSE_FAILED:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_BUS_RESET:\r
     return EFI_NOT_READY;\r
 \r
     return EFI_NOT_READY;\r
 \r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_BUS_FREE:\r
-  case EFI_SCSI_IO_STATUS_HOST_ADAPTER_PHASE_ERROR:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_BUS_FREE:\r
+  case EFI_EXT_SCSI_STATUS_HOST_ADAPTER_PHASE_ERROR:\r
     return EFI_DEVICE_ERROR;\r
 \r
   default:\r
     return EFI_DEVICE_ERROR;\r
 \r
   default:\r
@@ -1425,35 +1399,33 @@ CheckTargetStatus (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
-\r
+  Check the target status\r
+  \r
 Arguments:\r
 \r
 Arguments:\r
 \r
-  TargetStatus  - TODO: add argument description\r
+  TargetStatus  - Target status\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_SUCCESS - TODO: Add description for return value\r
-  EFI_NOT_READY - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
+  EFI_NOT_READY  \r
+  EFI_DEVICE_ERROR \r
+  EFI_SUCCESS\r
 \r
 --*/\r
 {\r
   switch (TargetStatus) {\r
 \r
 --*/\r
 {\r
   switch (TargetStatus) {\r
-  case EFI_SCSI_IO_STATUS_TARGET_GOOD:\r
-  case EFI_SCSI_IO_STATUS_TARGET_CHECK_CONDITION:\r
-  case EFI_SCSI_IO_STATUS_TARGET_CONDITION_MET:\r
+  case EFI_EXT_SCSI_STATUS_TARGET_GOOD:\r
+  case EFI_EXT_SCSI_STATUS_TARGET_CHECK_CONDITION:\r
+  case EFI_EXT_SCSI_STATUS_TARGET_CONDITION_MET:\r
     return EFI_SUCCESS;\r
 \r
     return EFI_SUCCESS;\r
 \r
-  case EFI_SCSI_IO_STATUS_TARGET_INTERMEDIATE:\r
-  case EFI_SCSI_IO_STATUS_TARGET_INTERMEDIATE_CONDITION_MET:\r
-  case EFI_SCSI_IO_STATUS_TARGET_BUSY:\r
-  case EFI_SCSI_IO_STATUS_TARGET_COMMOND_TERMINATED:\r
-  case EFI_SCSI_IO_STATUS_TARGET_QUEUE_FULL:\r
+  case EFI_EXT_SCSI_STATUS_TARGET_INTERMEDIATE:\r
+  case EFI_EXT_SCSI_STATUS_TARGET_INTERMEDIATE_CONDITION_MET:\r
+  case EFI_EXT_SCSI_STATUS_TARGET_BUSY:\r
+  case EFI_EXT_SCSI_STATUS_TARGET_TASK_SET_FULL:\r
     return EFI_NOT_READY;\r
 \r
     return EFI_NOT_READY;\r
 \r
-  case EFI_SCSI_IO_STATUS_TARGET_RESERVATION_CONFLICT:\r
+  case EFI_EXT_SCSI_STATUS_TARGET_RESERVATION_CONFLICT:\r
     return EFI_DEVICE_ERROR;\r
     break;\r
 \r
     return EFI_DEVICE_ERROR;\r
     break;\r
 \r
@@ -1470,27 +1442,31 @@ ScsiDiskRequestSenseKeys (
   UINTN                   *NumberOfSenseKeys,\r
   BOOLEAN                 AskResetIfError\r
   )\r
   UINTN                   *NumberOfSenseKeys,\r
   BOOLEAN                 AskResetIfError\r
   )\r
-// TODO: function comment should start with '/*++'\r
-/*\r
+/*++\r
+\r
+Routine Description:\r
+\r
   Retrieve all sense keys from the device.\r
   When encountering error during the process,\r
   if retrieve sense keys before error encounterred,\r
   return the sense keys with return status set to EFI_SUCCESS,\r
   and NeedRetry set to FALSE; otherwize, return the proper return\r
   status.\r
   Retrieve all sense keys from the device.\r
   When encountering error during the process,\r
   if retrieve sense keys before error encounterred,\r
   return the sense keys with return status set to EFI_SUCCESS,\r
   and NeedRetry set to FALSE; otherwize, return the proper return\r
   status.\r
-*/\r
-// TODO: function comment should end with '--*/'\r
-// TODO: function comment is missing 'Routine Description:'\r
-// TODO: function comment is missing 'Arguments:'\r
-// TODO: function comment is missing 'Returns:'\r
-// TODO:    ScsiDiskDevice - add argument and description to function comment\r
-// TODO:    NeedRetry - add argument and description to function comment\r
-// TODO:    SenseDataArray - add argument and description to function comment\r
-// TODO:    NumberOfSenseKeys - add argument and description to function comment\r
-// TODO:    AskResetIfError - add argument and description to function comment\r
-// TODO:    EFI_SUCCESS - add return value to function comment\r
-// TODO:    EFI_DEVICE_ERROR - add return value to function comment\r
-// TODO:    EFI_SUCCESS - add return value to function comment\r
+\r
+Arguments:\r
+\r
+  ScsiDiskDevice     -  The pointer of SCSI_DISK_DEV\r
+  NeedRetry          -  The pointer of flag indicates if need a retry\r
+  SenseDataArray     -  The pointer of an array of sense data\r
+  NumberOfSenseKeys  -  The number of sense key\r
+  AskResetIfError    -  The flag indicates if need reset when error occurs\r
+  \r
+Returns:\r
+\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to request sense key\r
+\r
+--*/\r
 {\r
   EFI_SCSI_SENSE_DATA *PtrSenseData;\r
   UINT8               SenseDataLength;\r
 {\r
   EFI_SCSI_SENSE_DATA *PtrSenseData;\r
   UINT8               SenseDataLength;\r
@@ -1513,7 +1489,6 @@ ScsiDiskRequestSenseKeys (
   PtrSenseData        = ScsiDiskDevice->SenseData;\r
 \r
   for (SenseReq = TRUE; SenseReq;) {\r
   PtrSenseData        = ScsiDiskDevice->SenseData;\r
 \r
   for (SenseReq = TRUE; SenseReq;) {\r
-\r
     Status = ScsiRequestSenseCommand (\r
               ScsiDiskDevice->ScsiIo,\r
               EfiScsiStallSeconds (2),\r
     Status = ScsiRequestSenseCommand (\r
               ScsiDiskDevice->ScsiIo,\r
               EfiScsiStallSeconds (2),\r
@@ -1522,20 +1497,23 @@ ScsiDiskRequestSenseKeys (
               &HostAdapterStatus,\r
               &TargetStatus\r
               );\r
               &HostAdapterStatus,\r
               &TargetStatus\r
               );\r
-    if ((Status == EFI_SUCCESS) || (Status == EFI_WARN_BUFFER_TOO_SMALL)) {\r
-      FallStatus = EFI_SUCCESS;\r
-    } else if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) { \r
-      *NeedRetry  = TRUE;\r
-      FallStatus  = EFI_DEVICE_ERROR;\r
-    } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {\r
-      *NeedRetry  = FALSE;\r
-      FallStatus  = EFI_DEVICE_ERROR;\r
-    } else if (Status == EFI_DEVICE_ERROR) {\r
-      if (AskResetIfError) {\r
-        ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
-      }\r
-\r
-      FallStatus = EFI_DEVICE_ERROR;\r
+     if ((Status == EFI_SUCCESS) || (Status == EFI_WARN_BUFFER_TOO_SMALL)) {\r
+        FallStatus = EFI_SUCCESS;\r
+  \r
+     } else if ((Status == EFI_TIMEOUT) || (Status == EFI_NOT_READY)) {\r
+       *NeedRetry  = TRUE;\r
+       FallStatus  = EFI_DEVICE_ERROR;\r
\r
+     } else if ((Status == EFI_INVALID_PARAMETER) || (Status == EFI_UNSUPPORTED)) {\r
+       *NeedRetry  = FALSE;\r
+       FallStatus  = EFI_DEVICE_ERROR;\r
\r
+     } else if (Status == EFI_DEVICE_ERROR) {\r
+        if (AskResetIfError) {\r
+          ScsiDiskDevice->ScsiIo->ResetDevice (ScsiDiskDevice->ScsiIo);\r
+        }\r
+  \r
+        FallStatus = EFI_DEVICE_ERROR;\r
     }\r
 \r
     if (EFI_ERROR (FallStatus)) {\r
     }\r
 \r
     if (EFI_ERROR (FallStatus)) {\r
@@ -1557,11 +1535,8 @@ ScsiDiskRequestSenseKeys (
         (*NumberOfSenseKeys == ScsiDiskDevice->SenseDataNumber)) {\r
       SenseReq = FALSE;\r
     }\r
         (*NumberOfSenseKeys == ScsiDiskDevice->SenseDataNumber)) {\r
       SenseReq = FALSE;\r
     }\r
-\r
     PtrSenseData += 1;\r
     PtrSenseData += 1;\r
-\r
   }\r
   }\r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1574,16 +1549,16 @@ GetMediaInfo (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Get information from media read capacity command\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  Capacity        - TODO: add argument description\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
+  Capacity        - The pointer of EFI_SCSI_DISK_CAPACITY_DATA\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  NONE\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -1614,15 +1589,15 @@ ParseInquiryData (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Parse Inquiry data\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  NONE\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -1631,6 +1606,7 @@ Returns:
 }\r
 \r
 EFI_STATUS\r
 }\r
 \r
 EFI_STATUS\r
+EFIAPI\r
 ScsiDiskReadSectors (\r
   SCSI_DISK_DEV     *ScsiDiskDevice,\r
   VOID              *Buffer,\r
 ScsiDiskReadSectors (\r
   SCSI_DISK_DEV     *ScsiDiskDevice,\r
   VOID              *Buffer,\r
@@ -1641,20 +1617,19 @@ ScsiDiskReadSectors (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Read sector from SCSI Disk\r
 \r
 Arguments:\r
 \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
+  ScsiDiskDevice  - The poiniter of SCSI_DISK_DEV\r
+  Buffer          - The buffer to fill in the read out data\r
+  Lba             - Logic block address\r
+  NumberOfBlocks  - The number of blocks to read\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR\r
+  EFI_SUCCESS\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -1753,20 +1728,19 @@ ScsiDiskWriteSectors (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Write SCSI Disk sectors\r
 \r
 Arguments:\r
 \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
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
+  Buffer          - The data buffer to write sector\r
+  Lba             - Logic block address\r
+  NumberOfBlocks  - The number of blocks to write\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_DEVICE_ERROR - TODO: Add description for return value\r
-  EFI_SUCCESS - TODO: Add description for return value\r
+  EFI_DEVICE_ERROR \r
+  EFI_SUCCESS\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -1866,24 +1840,24 @@ ScsiDiskRead10 (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Sumbmit Read command \r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\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
+  ScsiDiskDevice    - The pointer of ScsiDiskDevice\r
+  NeedRetry         - The pointer of flag indicates if needs retry if error happens\r
+  SenseDataArray    - The pointer of an array of sense data\r
+  NumberOfSenseKeys - The number of sense key\r
+  Timeout           - The time to complete the command\r
+  DataBuffer        - The buffer to fill with the read out data\r
+  DataLength        - The length of buffer\r
+  StartLba          - The start logic block address\r
+  SectorSize        - The size of sector\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
-\r
+  EFI_STATUS\r
+  \r
 --*/\r
 {\r
   UINT8       SenseDataLength;\r
 --*/\r
 {\r
   UINT8       SenseDataLength;\r
@@ -1925,23 +1899,23 @@ ScsiDiskWrite10 (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Submit Write Command\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\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
+  ScsiDiskDevice    - The pointer of ScsiDiskDevice\r
+  NeedRetry         - The pointer of flag indicates if needs retry if error happens\r
+  SenseDataArray    - The pointer of an array of sense data\r
+  NumberOfSenseKeys - The number of sense key\r
+  Timeout           - The time to complete the command\r
+  DataBuffer        - The buffer to fill with the read out data\r
+  DataLength        - The length of buffer\r
+  StartLba          - The start logic block address\r
+  SectorSize        - The size of sector\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_STATUS\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -1977,16 +1951,16 @@ ScsiDiskIsNoMedia (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if media presents\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -1998,7 +1972,6 @@ Returns:
   SensePtr  = SenseData;\r
 \r
   for (Index = 0; Index < SenseCounts; Index++) {\r
   SensePtr  = SenseData;\r
 \r
   for (Index = 0; Index < SenseCounts; Index++) {\r
-\r
     //\r
     // Sense Key is EFI_SCSI_SK_NOT_READY (0x2),\r
     // Additional Sense Code is ASC_NO_MEDIA (0x3A)\r
     //\r
     // Sense Key is EFI_SCSI_SK_NOT_READY (0x2),\r
     // Additional Sense Code is ASC_NO_MEDIA (0x3A)\r
@@ -2007,7 +1980,6 @@ Returns:
         (SensePtr->Addnl_Sense_Code == EFI_SCSI_ASC_NO_MEDIA)) {\r
       IsNoMedia = TRUE;\r
     }\r
         (SensePtr->Addnl_Sense_Code == EFI_SCSI_ASC_NO_MEDIA)) {\r
       IsNoMedia = TRUE;\r
     }\r
-\r
     SensePtr++;\r
   }\r
 \r
     SensePtr++;\r
   }\r
 \r
@@ -2023,16 +1995,16 @@ ScsiDiskIsMediaError (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Parse sense key\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -2113,16 +2085,16 @@ ScsiDiskIsHardwareError (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if hardware error happens\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -2157,16 +2129,16 @@ ScsiDiskIsMediaChange (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+ Check sense key to find if media has changed\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -2202,16 +2174,16 @@ ScsiDiskIsResetBefore (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if reset happens\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -2249,17 +2221,17 @@ ScsiDiskIsDriveReady (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if the drive is ready\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
-  RetryLater  - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
+  RetryLater  - The flag means if need a retry \r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -2325,16 +2297,16 @@ ScsiDiskHaveSenseKey (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if it has sense key\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
@@ -2374,15 +2346,15 @@ ReleaseScsiDiskDeviceResources (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Release resource about disk device\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  NONE\r
 \r
 --*/\r
 {\r
 \r
 --*/\r
 {\r
index 675c643eff1c33b96dfe299b4fee7615d0657e33..971df28a2bd92ecb5441ac66688500d49f12feef 100644 (file)
@@ -1,6 +1,6 @@
 /*++\r
 \r
 /*++\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
+Copyright (c) 2004 - 2007, 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
 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
@@ -119,16 +119,16 @@ ScsiDiskReset (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Reset SCSI Disk  \r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  This                  - TODO: add argument description\r
-  ExtendedVerification  - TODO: add argument description\r
+  This                  - The pointer of EFI_BLOCK_IO_PROTOCOL\r
+  ExtendedVerification  - The flag about if extend verificate\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_STATUS\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -146,19 +146,24 @@ ScsiDiskReadBlocks (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  The function is to Read Block from SCSI Disk\r
 \r
 Arguments:\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
+  This        - The pointer of EFI_BLOCK_IO_PROTOCOL\r
+  MediaId     - The Id of Media detected\r
+  LBA         - The logic block address\r
+  BufferSize  - The size of Buffer\r
+  Buffer      - The buffer to fill the read out data\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_INVALID_PARAMETER - Invalid parameter passed in.\r
+  EFI_SUCCESS           - Successfully to read out block.\r
+  EFI_DEVICE_ERROR      - Fail to detect media.\r
+  EFI_NO_MEDIA          - Media is not present.\r
+  EFI_MEDIA_CHANGED     - Media has changed.\r
+  EFI_BAD_BUFFER_SIZE   - The buffer size is not multiple of BlockSize.\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -176,19 +181,24 @@ ScsiDiskWriteBlocks (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  The function is to Write Block to SCSI Disk\r
 \r
 Arguments:\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
+  This        - The pointer of EFI_BLOCK_IO_PROTOCOL\r
+  MediaId     - The Id of Media detected\r
+  LBA         - The logic block address\r
+  BufferSize  - The size of Buffer\r
+  Buffer      - The buffer to fill the read out data\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_INVALID_PARAMETER - Invalid parameter passed in.\r
+  EFI_SUCCESS           - Successfully to read out block.\r
+  EFI_DEVICE_ERROR      - Fail to detect media.\r
+  EFI_NO_MEDIA          - Media is not present.\r
+  EFI_MEDIA_CHANGED     - Media has changed.\r
+  EFI_BAD_BUFFER_SIZE   - The buffer size is not multiple of BlockSize.\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -202,15 +212,15 @@ ScsiDiskFlushBlocks (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Flush Block to Disk\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  This  - TODO: add argument description\r
+  This  - The pointer of EFI_BLOCK_IO_PROTOCOL\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_SUCCESS \r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -225,44 +235,48 @@ ScsiDiskDetectMedia (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Dectect Device and read out capacity ,if error occurs, parse the sense key.\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  MustReadCap     - TODO: add argument description\r
-  MediaChange     - TODO: add argument description\r
+  ScsiDiskDevice     - The pointer of SCSI_DISK_DEV\r
+  MustReadCapacity   - The flag about reading device capacity\r
+  MediaChange        - The pointer of flag indicates if media has changed \r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to detect media\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
-  \r
+\r
 EFI_STATUS\r
 ScsiDiskTestUnitReady (\r
 EFI_STATUS\r
 ScsiDiskTestUnitReady (\r
-  SCSI_DISK_DEV        *ScsiDiskDevice,\r
-  BOOLEAN              *NeedRetry,\r
-  EFI_SCSI_SENSE_DATA  **SenseDataArray,\r
-  UINTN                *NumberOfSenseKeys\r
+  SCSI_DISK_DEV       *ScsiDiskDevice,\r
+  BOOLEAN             *NeedRetry,\r
+  EFI_SCSI_SENSE_DATA **SenseDataArray,\r
+  UINTN               *NumberOfSenseKeys\r
   )\r
 /*++\r
 \r
 Routine Description:\r
 \r
   )\r
 /*++\r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
-\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
 \r
 Arguments:\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
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
+  NeedRetry       - The pointer of flag indicates try again\r
+  SenseDataArray  - The pointer of an array of sense data\r
+  NumberOfSenseKeys - The pointer of the number of sense data array\r
+  \r
 Returns:\r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to test unit\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -278,45 +292,47 @@ DetectMediaParsingSenseKeys (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
-\r
+  Parsing Sense Keys which got from request sense command.\r
+  \r
 Arguments:\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
+  ScsiDiskDevice    - The pointer of SCSI_DISK_DEV\r
+  SenseData         - The pointer of EFI_SCSI_SENSE_DATA\r
+  NumberOfSenseKeys - The number of sense key  \r
+  Action            - The pointer of action which indicates what is need to do next\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to complete the parsing\r
 \r
 --*/\r
 ;\r
 \r
 EFI_STATUS\r
 ScsiDiskReadCapacity (\r
 \r
 --*/\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
+  SCSI_DISK_DEV       *ScsiDiskDevice,\r
+  BOOLEAN             *NeedRetry,\r
+  EFI_SCSI_SENSE_DATA **SenseDataArray,\r
+  UINTN               *NumberOfSenseKeys\r
   )\r
 /*++\r
 \r
 Routine Description:\r
 \r
   )\r
 /*++\r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Send read capacity command to device and get the device parameter\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\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
+  ScsiDiskDevice     -  The pointer of SCSI_DISK_DEV\r
+  NeedRetry          -  The pointer of flag indicates if need a retry\r
+  SenseDataArray     -  The pointer of an array of sense data\r
+  NumberOfSenseKeys  -  The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to read capacity\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -329,15 +345,18 @@ CheckHostAdapterStatus (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
-\r
+  Check the HostAdapter status\r
+  \r
 Arguments:\r
 \r
 Arguments:\r
 \r
-  HostAdapterStatus - TODO: add argument description\r
+  HostAdapterStatus - Host Adapter status\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_SUCCESS       \r
+  EFI_TIMEOUT       \r
+  EFI_NOT_READY     \r
+  EFI_DEVICE_ERROR  \r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -350,15 +369,17 @@ CheckTargetStatus (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
-\r
+  Check the target status\r
+  \r
 Arguments:\r
 \r
 Arguments:\r
 \r
-  TargetStatus  - TODO: add argument description\r
+  TargetStatus  - Target status\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_NOT_READY  \r
+  EFI_DEVICE_ERROR \r
+  EFI_SUCCESS\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -375,19 +396,25 @@ ScsiDiskRequestSenseKeys (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Retrieve all sense keys from the device.\r
+  When encountering error during the process,\r
+  if retrieve sense keys before error encounterred,\r
+  return the sense keys with return status set to EFI_SUCCESS,\r
+  and NeedRetry set to FALSE; otherwize, return the proper return\r
+  status.\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\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
+  ScsiDiskDevice     -  The pointer of SCSI_DISK_DEV\r
+  NeedRetry          -  The pointer of flag indicates if need a retry\r
+  SenseDataArray     -  The pointer of an array of sense data\r
+  NumberOfSenseKeys  -  The number of sense key\r
+  AskResetIfError    -  The flag indicates if need reset when error occurs\r
+  \r
 Returns:\r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to request sense key\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -401,16 +428,17 @@ ScsiDiskInquiryDevice (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Send out Inquiry command to Device\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  NeedRetry       - TODO: add argument description\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
+  NeedRetry       - Indicates if needs try again when error happens\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_DEVICE_ERROR   - Indicates that error occurs\r
+  EFI_SUCCESS        - Successfully to detect media\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -423,15 +451,15 @@ ParseInquiryData (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Parse Inquiry data\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  NONE\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -447,18 +475,19 @@ ScsiDiskReadSectors (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Read sector from SCSI Disk\r
 \r
 Arguments:\r
 \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
+  ScsiDiskDevice  - The poiniter of SCSI_DISK_DEV\r
+  Buffer          - The buffer to fill in the read out data\r
+  Lba             - Logic block address\r
+  NumberOfBlocks  - The number of blocks to read\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_DEVICE_ERROR\r
+  EFI_SUCCESS\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -474,18 +503,19 @@ ScsiDiskWriteSectors (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Write SCSI Disk sectors\r
 \r
 Arguments:\r
 \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
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
+  Buffer          - The data buffer to write sector\r
+  Lba             - Logic block address\r
+  NumberOfBlocks  - The number of blocks to write\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_DEVICE_ERROR \r
+  EFI_SUCCESS\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -506,23 +536,23 @@ ScsiDiskRead10 (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Sumbmit Read command \r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\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
+  ScsiDiskDevice    - The pointer of ScsiDiskDevice\r
+  NeedRetry         - The pointer of flag indicates if needs retry if error happens\r
+  SenseDataArray    - The pointer of an array of sense data\r
+  NumberOfSenseKeys - The number of sense key\r
+  Timeout           - The time to complete the command\r
+  DataBuffer        - The buffer to fill with the read out data\r
+  DataLength        - The length of buffer\r
+  StartLba          - The start logic block address\r
+  SectorSize        - The size of sector\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_STATUS\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -543,23 +573,23 @@ ScsiDiskWrite10 (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Submit Write Command\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\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
+  ScsiDiskDevice    - The pointer of ScsiDiskDevice\r
+  NeedRetry         - The pointer of flag indicates if needs retry if error happens\r
+  SenseDataArray    - The pointer of an array of sense data\r
+  NumberOfSenseKeys - The number of sense key\r
+  Timeout           - The time to complete the command\r
+  DataBuffer        - The buffer to fill with the read out data\r
+  DataLength        - The length of buffer\r
+  StartLba          - The start logic block address\r
+  SectorSize        - The size of sector\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  EFI_STATUS\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -573,16 +603,16 @@ GetMediaInfo (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Get information from media read capacity command\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
-  Capacity        - TODO: add argument description\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
+  Capacity        - The pointer of EFI_SCSI_DISK_CAPACITY_DATA\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  NONE\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -596,16 +626,16 @@ ScsiDiskIsNoMedia (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if media presents\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -619,16 +649,16 @@ ScsiDiskIsMediaError (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Parse sense key\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -642,16 +672,16 @@ ScsiDiskIsHardwareError (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if hardware error happens\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -665,16 +695,18 @@ ScsiDiskIsMediaChange (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+Routine Description:\r
+\r
+ Check sense key to find if media has changed\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -688,16 +720,16 @@ ScsiDiskIsResetBefore (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if reset happens\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -712,17 +744,17 @@ ScsiDiskIsDriveReady (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if the drive is ready\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
-  NeedRetry   - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
+  RetryLater  - The flag means if need a retry \r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -736,16 +768,16 @@ ScsiDiskHaveSenseKey (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Check sense key to find if it has sense key\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  SenseData   - TODO: add argument description\r
-  SenseCounts - TODO: add argument description\r
+  SenseData   - The pointer of EFI_SCSI_SENSE_DATA\r
+  SenseCounts - The number of sense key\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  BOOLEAN\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r
@@ -758,15 +790,15 @@ ReleaseScsiDiskDeviceResources (
 \r
 Routine Description:\r
 \r
 \r
 Routine Description:\r
 \r
-  TODO: Add function description\r
+  Release resource about disk device\r
 \r
 Arguments:\r
 \r
 \r
 Arguments:\r
 \r
-  ScsiDiskDevice  - TODO: add argument description\r
+  ScsiDiskDevice  - The pointer of SCSI_DISK_DEV\r
 \r
 Returns:\r
 \r
 \r
 Returns:\r
 \r
-  TODO: add return values\r
+  NONE\r
 \r
 --*/\r
 ;\r
 \r
 --*/\r
 ;\r