]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Read-Capacity16 command added for SCSI drivers
authorjji4 <jji4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 1 Apr 2009 08:25:36 +0000 (08:25 +0000)
committerjji4 <jji4@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 1 Apr 2009 08:25:36 +0000 (08:25 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8000 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c
MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.h

index a2ea44bd78f44d052e5db1feac2d77c4d4685f13..4278b9c4a58ad82b34abd50980e27d4ccc2ca86d 100644 (file)
@@ -921,9 +921,9 @@ ScsiDiskInquiryDevice (
   }\r
   \r
   //\r
-  // if goes here, meant SubmitInquiryCommand() failed.\r
+  // if goes here, meant ScsiInquiryCommand() failed.\r
   // if ScsiDiskRequestSenseKeys() succeeds at last,\r
-  // better retry SubmitInquiryCommand(). (by setting *NeedRetry = TRUE)\r
+  // better retry ScsiInquiryCommand(). (by setting *NeedRetry = TRUE)\r
   //\r
   MaxRetry = 3;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
@@ -1159,41 +1159,67 @@ ScsiDiskReadCapacity (
       OUT  UINTN                   *NumberOfSenseKeys\r
   )\r
 {\r
-  EFI_SCSI_DISK_CAPACITY_DATA CapacityData;\r
-  UINT32                      DataLength;\r
-  UINT8                       HostAdapterStatus;\r
-  UINT8                       TargetStatus;\r
-  EFI_STATUS                  CommandStatus;\r
-  EFI_STATUS                  Status;\r
-  UINT8                       Index;\r
-  UINT8                       MaxRetry;\r
-  UINT8                       SenseDataLength;\r
-\r
-  SenseDataLength = 0;\r
-  ZeroMem (&CapacityData, sizeof (EFI_SCSI_DISK_CAPACITY_DATA));\r
-  DataLength          = sizeof (EFI_SCSI_DISK_CAPACITY_DATA);\r
+  UINT8                         HostAdapterStatus;\r
+  UINT8                         TargetStatus;\r
+  EFI_STATUS                    CommandStatus;\r
+  EFI_STATUS                    Status;\r
+  UINT8                         Index;\r
+  UINT8                         MaxRetry;\r
+  UINT8                         SenseDataLength;\r
+  UINT8                         ScsiVersion;\r
+  UINT32                        DataLength10;\r
+  UINT32                        DataLength16;\r
+  EFI_SCSI_DISK_CAPACITY_DATA   CapacityData10;\r
+  EFI_SCSI_DISK_CAPACITY_DATA16 CapacityData16;\r
+\r
+\r
+  SenseDataLength       = 0;\r
+  DataLength10          = sizeof (EFI_SCSI_DISK_CAPACITY_DATA);\r
+  DataLength16          = sizeof (EFI_SCSI_DISK_CAPACITY_DATA16);\r
+  ZeroMem (&CapacityData10, sizeof (EFI_SCSI_DISK_CAPACITY_DATA));\r
+  ZeroMem (&CapacityData16, sizeof (EFI_SCSI_DISK_CAPACITY_DATA16));\r
 \r
   *NumberOfSenseKeys  = 0;\r
   *NeedRetry          = FALSE;\r
-  //\r
-  // submit Read Capacity Command. in this call,not request sense data\r
-  //\r
-  CommandStatus = ScsiReadCapacityCommand (\r
-                    ScsiDiskDevice->ScsiIo,\r
-                    EFI_TIMER_PERIOD_SECONDS (1),\r
-                    NULL,\r
-                    &SenseDataLength,\r
-                    &HostAdapterStatus,\r
-                    &TargetStatus,\r
-                    (VOID *) &CapacityData,\r
-                    &DataLength,\r
-                    FALSE\r
-                    );\r
-  //\r
+  ScsiVersion         = (UINT8)(ScsiDiskDevice->InquiryData.Version & 0x03);\r
+\r
+  if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+    //\r
+    // submit Read Capacity(10) Command. in this call,not request sense data\r
+    //\r
+    CommandStatus = ScsiReadCapacityCommand (\r
+                      ScsiDiskDevice->ScsiIo,\r
+                      EFI_TIMER_PERIOD_SECONDS(1),\r
+                      NULL,\r
+                      &SenseDataLength,\r
+                      &HostAdapterStatus,\r
+                      &TargetStatus,\r
+                      (VOID *) &CapacityData10,\r
+                      &DataLength10,\r
+                      FALSE\r
+                      );\r
+    } else {\r
+      //\r
+      // submit Read Capacity(16) Command to get parameter LogicalBlocksPerPhysicalBlock\r
+      // and LowestAlignedLba\r
+      //\r
+      CommandStatus = ScsiReadCapacity16Command (\r
+                        ScsiDiskDevice->ScsiIo,\r
+                        EFI_TIMER_PERIOD_SECONDS (1),\r
+                        NULL,\r
+                        &SenseDataLength,\r
+                        &HostAdapterStatus,\r
+                        &TargetStatus,\r
+                        (VOID *) &CapacityData16,\r
+                        &DataLength16,\r
+                        FALSE\r
+                        );\r
+    }\r
+    //\r
     // no need to check HostAdapterStatus and TargetStatus\r
     //\r
    if (CommandStatus == EFI_SUCCESS) {\r
-     GetMediaInfo (ScsiDiskDevice, &CapacityData);\r
+     GetMediaInfo (ScsiDiskDevice, &CapacityData10,&CapacityData16);\r
      return EFI_SUCCESS;\r
  \r
    } else if (CommandStatus == EFI_NOT_READY) {\r
@@ -1238,9 +1264,9 @@ ScsiDiskReadCapacity (
   }\r
   \r
   //\r
-  // if goes here, meant SubmitReadCapacityCommand() failed.\r
+  // if goes here, meant ScsiReadCapacityCommand() failed.\r
   // if ScsiDiskRequestSenseKeys() succeeds at last,\r
-  // better retry SubmitReadCapacityCommand(). (by setting *NeedRetry = TRUE)\r
+  // better retry ScsiReadCapacityCommand(). (by setting *NeedRetry = TRUE)\r
   //\r
   MaxRetry = 3;\r
   for (Index = 0; Index < MaxRetry; Index++) {\r
@@ -1457,19 +1483,54 @@ ScsiDiskRequestSenseKeys (
 VOID\r
 GetMediaInfo (\r
   IN  OUT  SCSI_DISK_DEV                 *ScsiDiskDevice,\r
-  IN       EFI_SCSI_DISK_CAPACITY_DATA   *Capacity\r
+  EFI_SCSI_DISK_CAPACITY_DATA     *Capacity10,\r
+  EFI_SCSI_DISK_CAPACITY_DATA16   *Capacity16\r
   )\r
 {\r
-  ScsiDiskDevice->BlkIo.Media->LastBlock =  (Capacity->LastLba3 << 24) |\r
-                                            (Capacity->LastLba2 << 16) |\r
-                                            (Capacity->LastLba1 << 8)  |\r
-                                             Capacity->LastLba0;\r
+  UINT8       ScsiVersion;\r
+  UINT8       *Ptr;\r
+\r
+  ScsiVersion    = (UINT8)(ScsiDiskDevice->InquiryData.Version & 0x03);\r
+  ScsiDiskDevice->BlkIo.Media->LowestAlignedLba               = 0;\r
+  ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock  = 1;\r
+  \r
+\r
+  if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+    ScsiDiskDevice->BlkIo.Media->LastBlock =  (Capacity10->LastLba3 << 24) |\r
+                                              (Capacity10->LastLba2 << 16) |\r
+                                              (Capacity10->LastLba1 << 8)  |\r
+                                               Capacity10->LastLba0;\r
+  \r
+    ScsiDiskDevice->BlkIo.Media->BlockSize = (Capacity10->BlockSize3 << 24) |\r
+                                             (Capacity10->BlockSize2 << 16) | \r
+                                             (Capacity10->BlockSize1 << 8)  |\r
+                                              Capacity10->BlockSize0;\r
+    ScsiDiskDevice->BlkIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION;      \r
+  } else {\r
+\r
+    Ptr = (UINT8*)&ScsiDiskDevice->BlkIo.Media->LastBlock;\r
+    *Ptr++ = Capacity16->LastLba0;\r
+    *Ptr++ = Capacity16->LastLba1;\r
+    *Ptr++ = Capacity16->LastLba2;\r
+    *Ptr++ = Capacity16->LastLba3;\r
+    *Ptr++ = Capacity16->LastLba4;\r
+    *Ptr++ = Capacity16->LastLba5;\r
+    *Ptr++ = Capacity16->LastLba6;\r
+    *Ptr   = Capacity16->LastLba7;\r
+  \r
+    ScsiDiskDevice->BlkIo.Media->BlockSize = (Capacity16->BlockSize3 << 24) |\r
+                                             (Capacity16->BlockSize2 << 16) | \r
+                                             (Capacity16->BlockSize1 << 8)  |\r
+                                              Capacity16->BlockSize0;\r
+\r
+    ScsiDiskDevice->BlkIo.Media->LowestAlignedLba = (Capacity16->LowestAlignLogic2 << 8)|(Capacity16->LowestAlignLogic1);\r
+    ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock  = Capacity16->LogicPerPhysical;\r
+    ScsiDiskDevice->BlkIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;  \r
+  }\r
+\r
 \r
   ScsiDiskDevice->BlkIo.Media->MediaPresent = TRUE;\r
-  ScsiDiskDevice->BlkIo.Media->BlockSize = (Capacity->BlockSize3 << 24) |\r
-                                           (Capacity->BlockSize2 << 16) | \r
-                                           (Capacity->BlockSize1 << 8)  |\r
-                                            Capacity->BlockSize0;\r
+  \r
   if (ScsiDiskDevice->DeviceType == EFI_SCSI_TYPE_DISK) {\r
     ScsiDiskDevice->BlkIo.Media->BlockSize = 0x200;\r
   }\r
index 213fb045df114f72825dee64e3ad58a015f8892e..3b5910bec9ded1d44f9f96ceac4311bcdf7fab39 100644 (file)
@@ -74,6 +74,11 @@ extern EFI_COMPONENT_NAME2_PROTOCOL  gScsiDiskComponentName2;
 #define ACTION_READ_CAPACITY        0x01\r
 #define ACTION_RETRY_COMMAND_LATER  0x02\r
 \r
+#define SCSI_COMMAND_VERSION_1      0x01\r
+#define SCSI_COMMAND_VERSION_2      0x02\r
+#define SCSI_COMMAND_VERSION_3      0x03\r
+\r
+\r
 /**\r
   Test to see if this driver supports ControllerHandle.\r
 \r
@@ -649,13 +654,14 @@ ScsiDiskWrite10 (
   Get information from media read capacity command.\r
 \r
   @param  ScsiDiskDevice  The pointer of SCSI_DISK_DEV\r
-  @param  Capacity        The pointer of EFI_SCSI_DISK_CAPACITY_DATA\r
-\r
+  @param  Capacity10      The pointer of EFI_SCSI_DISK_CAPACITY_DATA\r
+  @param  Capacity16      The pointer of EFI_SCSI_DISK_CAPACITY_DATA16\r
 **/\r
 VOID\r
 GetMediaInfo (\r
-  IN  OUT  SCSI_DISK_DEV                 *ScsiDiskDevice,\r
-  IN       EFI_SCSI_DISK_CAPACITY_DATA   *Capacity\r
+  SCSI_DISK_DEV                   *ScsiDiskDevice,\r
+  EFI_SCSI_DISK_CAPACITY_DATA     *Capacity10,\r
+  EFI_SCSI_DISK_CAPACITY_DATA16   *Capacity16\r
   );\r
 \r
 /**\r