]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Change the check condition for 16 byte command, when HDD size is > 2TB, use 16 byte...
authorli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 23 Aug 2010 10:05:44 +0000 (10:05 +0000)
committerli-elvin <li-elvin@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 23 Aug 2010 10:05:44 +0000 (10:05 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10817 6f19259b-4bc3-4df7-8a09-765794883524

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

index 94f05a5e04934ea91dd1ea7214f4056f09199f40..72c9f9d0b5523d59b6f8277145eb8984491c9960 100644 (file)
@@ -1180,7 +1180,6 @@ ScsiDiskReadCapacity (
   UINT8                         Index;\r
   UINT8                         MaxRetry;\r
   UINT8                         SenseDataLength;\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
   UINT32                        DataLength10;\r
   UINT32                        DataLength16;\r
   EFI_SCSI_DISK_CAPACITY_DATA   CapacityData10;\r
@@ -1195,40 +1194,47 @@ ScsiDiskReadCapacity (
 \r
   *NumberOfSenseKeys  = 0;\r
   *NeedRetry          = FALSE;\r
 \r
   *NumberOfSenseKeys  = 0;\r
   *NeedRetry          = FALSE;\r
-  ScsiVersion         = (UINT8)(ScsiDiskDevice->InquiryData.Version & 0x07);\r
 \r
 \r
-  if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+  //\r
+  // submit Read Capacity(10) Command. If it returns capacity of FFFFFFFFh, \r
+  // 16 byte command should be used to access large hard disk >2TB\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
+\r
+  ScsiDiskDevice->Cdb16Byte = FALSE;\r
+  if ((!EFI_ERROR (CommandStatus)) && (CapacityData10.LastLba3 == 0xff) && (CapacityData10.LastLba2 == 0xff) &&\r
+      (CapacityData10.LastLba1 == 0xff) && (CapacityData10.LastLba0 == 0xff)) {\r
+    //\r
+    // use Read Capacity (16), Read (16) and Write (16) next when hard disk size > 2TB\r
+    //\r
+    ScsiDiskDevice->Cdb16Byte = TRUE;\r
     //\r
     //\r
-    // submit Read Capacity(10) Command. in this call,not request sense data\r
+    // submit Read Capacity(16) Command to get parameter LogicalBlocksPerPhysicalBlock\r
+    // and LowestAlignedLba\r
     //\r
     //\r
-    CommandStatus = ScsiReadCapacityCommand (\r
+    CommandStatus = ScsiReadCapacity16Command (\r
                       ScsiDiskDevice->ScsiIo,\r
                       ScsiDiskDevice->ScsiIo,\r
-                      EFI_TIMER_PERIOD_SECONDS(1),\r
+                      EFI_TIMER_PERIOD_SECONDS (1),\r
                       NULL,\r
                       &SenseDataLength,\r
                       &HostAdapterStatus,\r
                       &TargetStatus,\r
                       NULL,\r
                       &SenseDataLength,\r
                       &HostAdapterStatus,\r
                       &TargetStatus,\r
-                      (VOID *) &CapacityData10,\r
-                      &DataLength10,\r
+                      (VOID *) &CapacityData16,\r
+                      &DataLength16,\r
                       FALSE\r
                       );\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
+\r
     //\r
     // no need to check HostAdapterStatus and TargetStatus\r
     //\r
     //\r
     // no need to check HostAdapterStatus and TargetStatus\r
     //\r
@@ -1502,15 +1508,13 @@ GetMediaInfo (
   IN     EFI_SCSI_DISK_CAPACITY_DATA16  *Capacity16\r
   )\r
 {\r
   IN     EFI_SCSI_DISK_CAPACITY_DATA16  *Capacity16\r
   )\r
 {\r
-  UINT8       ScsiVersion;\r
   UINT8       *Ptr;\r
 \r
   UINT8       *Ptr;\r
 \r
-  ScsiVersion    = (UINT8)(ScsiDiskDevice->InquiryData.Version & 0x07);\r
   ScsiDiskDevice->BlkIo.Media->LowestAlignedLba               = 0;\r
   ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock  = 1;\r
   \r
 \r
   ScsiDiskDevice->BlkIo.Media->LowestAlignedLba               = 0;\r
   ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock  = 1;\r
   \r
 \r
-  if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+  if (!ScsiDiskDevice->Cdb16Byte) {\r
     ScsiDiskDevice->BlkIo.Media->LastBlock =  (Capacity10->LastLba3 << 24) |\r
                                               (Capacity10->LastLba2 << 16) |\r
                                               (Capacity10->LastLba1 << 8)  |\r
     ScsiDiskDevice->BlkIo.Media->LastBlock =  (Capacity10->LastLba3 << 24) |\r
                                               (Capacity10->LastLba2 << 16) |\r
                                               (Capacity10->LastLba1 << 8)  |\r
@@ -1603,7 +1607,6 @@ ScsiDiskReadSectors (
   BOOLEAN             NeedRetry;\r
   EFI_SCSI_SENSE_DATA *SenseData;\r
   UINTN               NumberOfSenseKeys;\r
   BOOLEAN             NeedRetry;\r
   EFI_SCSI_SENSE_DATA *SenseData;\r
   UINTN               NumberOfSenseKeys;\r
-  UINT8               ScsiVersion;\r
 \r
   SenseData         = NULL;\r
   NumberOfSenseKeys = 0;\r
 \r
   SenseData         = NULL;\r
   NumberOfSenseKeys = 0;\r
@@ -1612,12 +1615,11 @@ ScsiDiskReadSectors (
 \r
   BlocksRemaining   = NumberOfBlocks;\r
   BlockSize         = ScsiDiskDevice->BlkIo.Media->BlockSize;\r
 \r
   BlocksRemaining   = NumberOfBlocks;\r
   BlockSize         = ScsiDiskDevice->BlkIo.Media->BlockSize;\r
-  ScsiVersion       = (UINT8)(ScsiDiskDevice->InquiryData.Version & 0x07);\r
   \r
   //\r
   // limit the data bytes that can be transferred by one Read(10) or Read(16) Command\r
   //\r
   \r
   //\r
   // limit the data bytes that can be transferred by one Read(10) or Read(16) Command\r
   //\r
-  if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+  if (!ScsiDiskDevice->Cdb16Byte) {\r
     MaxBlock         = 0xFFFF;\r
   } else {\r
     MaxBlock         = 0xFFFFFFFF;\r
     MaxBlock         = 0xFFFF;\r
   } else {\r
     MaxBlock         = 0xFFFFFFFF;\r
@@ -1628,7 +1630,7 @@ ScsiDiskReadSectors (
   while (BlocksRemaining > 0) {\r
 \r
     if (BlocksRemaining <= MaxBlock) {\r
   while (BlocksRemaining > 0) {\r
 \r
     if (BlocksRemaining <= MaxBlock) {\r
-      if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+      if (!ScsiDiskDevice->Cdb16Byte) {\r
         SectorCount = (UINT16) BlocksRemaining;\r
       } else {\r
         SectorCount = (UINT32) BlocksRemaining;\r
         SectorCount = (UINT16) BlocksRemaining;\r
       } else {\r
         SectorCount = (UINT32) BlocksRemaining;\r
@@ -1642,8 +1644,8 @@ ScsiDiskReadSectors (
 \r
     MaxRetry  = 2;\r
     for (Index = 0; Index < MaxRetry; Index++) {\r
 \r
     MaxRetry  = 2;\r
     for (Index = 0; Index < MaxRetry; Index++) {\r
-      if (ScsiVersion >= SCSI_COMMAND_VERSION_3) {\r
-        Status = ScsiDiskRead16 (\r
+      if (!ScsiDiskDevice->Cdb16Byte) {\r
+        Status = ScsiDiskRead10 (\r
                   ScsiDiskDevice,\r
                   &NeedRetry,\r
                   &SenseData,\r
                   ScsiDiskDevice,\r
                   &NeedRetry,\r
                   &SenseData,\r
@@ -1651,11 +1653,11 @@ ScsiDiskReadSectors (
                   Timeout,\r
                   PtrBuffer,\r
                   &ByteCount,\r
                   Timeout,\r
                   PtrBuffer,\r
                   &ByteCount,\r
-                  Lba,\r
+                  (UINT32) Lba,\r
                   SectorCount\r
                   );\r
       } else {\r
                   SectorCount\r
                   );\r
       } else {\r
-        Status = ScsiDiskRead10 (\r
+        Status = ScsiDiskRead16 (\r
                   ScsiDiskDevice,\r
                   &NeedRetry,\r
                   &SenseData,\r
                   ScsiDiskDevice,\r
                   &NeedRetry,\r
                   &SenseData,\r
@@ -1663,7 +1665,7 @@ ScsiDiskReadSectors (
                   Timeout,\r
                   PtrBuffer,\r
                   &ByteCount,\r
                   Timeout,\r
                   PtrBuffer,\r
                   &ByteCount,\r
-                  (UINT32) Lba,\r
+                  Lba,\r
                   SectorCount\r
                   );\r
       }\r
                   SectorCount\r
                   );\r
       }\r
@@ -1727,7 +1729,6 @@ ScsiDiskWriteSectors (
   BOOLEAN             NeedRetry;\r
   EFI_SCSI_SENSE_DATA *SenseData;\r
   UINTN               NumberOfSenseKeys;\r
   BOOLEAN             NeedRetry;\r
   EFI_SCSI_SENSE_DATA *SenseData;\r
   UINTN               NumberOfSenseKeys;\r
-  UINT8               ScsiVersion;\r
 \r
   SenseData         = NULL;\r
   NumberOfSenseKeys = 0;\r
 \r
   SenseData         = NULL;\r
   NumberOfSenseKeys = 0;\r
@@ -1736,12 +1737,11 @@ ScsiDiskWriteSectors (
 \r
   BlocksRemaining   = NumberOfBlocks;\r
   BlockSize         = ScsiDiskDevice->BlkIo.Media->BlockSize;\r
 \r
   BlocksRemaining   = NumberOfBlocks;\r
   BlockSize         = ScsiDiskDevice->BlkIo.Media->BlockSize;\r
-  ScsiVersion       = (UINT8)(ScsiDiskDevice->InquiryData.Version & 0x07);\r
 \r
   //\r
   // limit the data bytes that can be transferred by one Read(10) or Read(16) Command\r
   //\r
 \r
   //\r
   // limit the data bytes that can be transferred by one Read(10) or Read(16) Command\r
   //\r
-  if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+  if (!ScsiDiskDevice->Cdb16Byte) {\r
     MaxBlock         = 0xFFFF;\r
   } else {\r
     MaxBlock         = 0xFFFFFFFF;\r
     MaxBlock         = 0xFFFF;\r
   } else {\r
     MaxBlock         = 0xFFFFFFFF;\r
@@ -1752,7 +1752,7 @@ ScsiDiskWriteSectors (
   while (BlocksRemaining > 0) {\r
 \r
     if (BlocksRemaining <= MaxBlock) {\r
   while (BlocksRemaining > 0) {\r
 \r
     if (BlocksRemaining <= MaxBlock) {\r
-      if (ScsiVersion < SCSI_COMMAND_VERSION_3) {\r
+      if (!ScsiDiskDevice->Cdb16Byte) {\r
         SectorCount = (UINT16) BlocksRemaining;\r
       } else {\r
         SectorCount = (UINT32) BlocksRemaining;\r
         SectorCount = (UINT16) BlocksRemaining;\r
       } else {\r
         SectorCount = (UINT32) BlocksRemaining;\r
@@ -1765,8 +1765,8 @@ ScsiDiskWriteSectors (
     Timeout   = EFI_TIMER_PERIOD_SECONDS (2);\r
     MaxRetry  = 2;\r
     for (Index = 0; Index < MaxRetry; Index++) {\r
     Timeout   = EFI_TIMER_PERIOD_SECONDS (2);\r
     MaxRetry  = 2;\r
     for (Index = 0; Index < MaxRetry; Index++) {\r
-      if (ScsiVersion >= SCSI_COMMAND_VERSION_3) {\r
-        Status = ScsiDiskWrite16 (\r
+      if (!ScsiDiskDevice->Cdb16Byte) {\r
+        Status = ScsiDiskWrite10 (\r
                   ScsiDiskDevice,\r
                   &NeedRetry,\r
                   &SenseData,\r
                   ScsiDiskDevice,\r
                   &NeedRetry,\r
                   &SenseData,\r
@@ -1774,11 +1774,11 @@ ScsiDiskWriteSectors (
                   Timeout,\r
                   PtrBuffer,\r
                   &ByteCount,\r
                   Timeout,\r
                   PtrBuffer,\r
                   &ByteCount,\r
-                  Lba,\r
+                  (UINT32) Lba,\r
                   SectorCount\r
                   SectorCount\r
-                  );        \r
+                  );\r
       } else {\r
       } else {\r
-        Status = ScsiDiskWrite10 (\r
+        Status = ScsiDiskWrite16 (\r
                   ScsiDiskDevice,\r
                   &NeedRetry,\r
                   &SenseData,\r
                   ScsiDiskDevice,\r
                   &NeedRetry,\r
                   &SenseData,\r
@@ -1786,9 +1786,9 @@ ScsiDiskWriteSectors (
                   Timeout,\r
                   PtrBuffer,\r
                   &ByteCount,\r
                   Timeout,\r
                   PtrBuffer,\r
                   &ByteCount,\r
-                  (UINT32) Lba,\r
+                  Lba,\r
                   SectorCount\r
                   SectorCount\r
-                  );\r
+                  );         \r
         }\r
       if (!EFI_ERROR (Status)) {\r
         break;\r
         }\r
       if (!EFI_ERROR (Status)) {\r
         break;\r
index d2f21139c037f61343f53e4ce46f17f7d2256d4f..850861ef025f12845d4b2caf3c9e29d4ceea30b2 100644 (file)
@@ -70,6 +70,11 @@ typedef struct {
   UINT32                    Channel;\r
   UINT32                    Device;\r
   ATAPI_IDENTIFY_DATA       IdentifyData;\r
   UINT32                    Channel;\r
   UINT32                    Device;\r
   ATAPI_IDENTIFY_DATA       IdentifyData;\r
+  \r
+  //\r
+  // The flag indicates if 16-byte command can be used\r
+  //\r
+  BOOLEAN                   Cdb16Byte;\r
 } SCSI_DISK_DEV;\r
 \r
 #define SCSI_DISK_DEV_FROM_THIS(a)  CR (a, SCSI_DISK_DEV, BlkIo, SCSI_DISK_DEV_SIGNATURE)\r
 } SCSI_DISK_DEV;\r
 \r
 #define SCSI_DISK_DEV_FROM_THIS(a)  CR (a, SCSI_DISK_DEV, BlkIo, SCSI_DISK_DEV_SIGNATURE)\r