]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Change Partition/ScsiDxe driver to produce Block IO revision 3.
authorniruiyu <niruiyu@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 23 May 2011 07:47:19 +0000 (07:47 +0000)
committerniruiyu <niruiyu@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 23 May 2011 07:47:19 +0000 (07:47 +0000)
Signed-off-by: niruiyu
Reviewed-by: erictian
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11692 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.c
MdeModulePkg/Universal/Disk/PartitionDxe/Partition.c

index fd63857a5e29db96b90ec27c9527edfedc5ad55c..f0e10997daa885ea9c39099ae5ae5c7d9bdd27b9 100644 (file)
@@ -187,6 +187,7 @@ ScsiDiskDriverBindingStart (
 \r
   ScsiDiskDevice->Signature         = SCSI_DISK_DEV_SIGNATURE;\r
   ScsiDiskDevice->ScsiIo            = ScsiIo;\r
+  ScsiDiskDevice->BlkIo.Revision    = EFI_BLOCK_IO_PROTOCOL_REVISION3;\r
   ScsiDiskDevice->BlkIo.Media       = &ScsiDiskDevice->BlkIoMedia;\r
   ScsiDiskDevice->BlkIo.Reset       = ScsiDiskReset;\r
   ScsiDiskDevice->BlkIo.ReadBlocks  = ScsiDiskReadBlocks;\r
@@ -875,15 +876,18 @@ ScsiDiskInquiryDevice (
      OUT  BOOLEAN         *NeedRetry\r
   )\r
 {\r
-  UINT32              InquiryDataLength;\r
-  UINT8               SenseDataLength;\r
-  UINT8               HostAdapterStatus;\r
-  UINT8               TargetStatus;\r
-  EFI_SCSI_SENSE_DATA *SenseDataArray;\r
-  UINTN               NumberOfSenseKeys;\r
-  EFI_STATUS          Status;\r
-  UINT8               MaxRetry;\r
-  UINT8               Index;\r
+  UINT32                                InquiryDataLength;\r
+  UINT8                                 SenseDataLength;\r
+  UINT8                                 HostAdapterStatus;\r
+  UINT8                                 TargetStatus;\r
+  EFI_SCSI_SENSE_DATA                   *SenseDataArray;\r
+  UINTN                                 NumberOfSenseKeys;\r
+  EFI_STATUS                            Status;\r
+  UINT8                                 MaxRetry;\r
+  UINT8                                 Index;\r
+  EFI_SCSI_SUPPORTED_VPD_PAGES_VPD_PAGE SupportedVpdPages;\r
+  EFI_SCSI_BLOCK_LIMITS_VPD_PAGE        BlockLimits;\r
+  UINTN                                 PageLength;\r
 \r
   InquiryDataLength = sizeof (EFI_SCSI_INQUIRY_DATA);\r
   SenseDataLength   = 0;\r
@@ -903,27 +907,86 @@ ScsiDiskInquiryDevice (
     // no need to check HostAdapterStatus and TargetStatus\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
+    ParseInquiryData (ScsiDiskDevice);\r
+\r
+    if (ScsiDiskDevice->DeviceType == EFI_SCSI_TYPE_DISK) {\r
+      //\r
+      // Check whether the device supports Block Limits VPD page (0xB0)\r
+      //\r
+      ZeroMem (&SupportedVpdPages, sizeof (SupportedVpdPages));\r
+      InquiryDataLength = sizeof (SupportedVpdPages);\r
+      SenseDataLength   = 0;\r
+      Status = ScsiInquiryCommandEx (\r
+                 ScsiDiskDevice->ScsiIo,\r
+                 EFI_TIMER_PERIOD_SECONDS (1),\r
+                 NULL,\r
+                 &SenseDataLength,\r
+                 &HostAdapterStatus,\r
+                 &TargetStatus,\r
+                 (VOID *) &SupportedVpdPages,\r
+                 &InquiryDataLength,\r
+                 TRUE,\r
+                 EFI_SCSI_PAGE_CODE_SUPPORTED_VPD\r
+                 );\r
+      if (!EFI_ERROR (Status)) {\r
+        PageLength = (SupportedVpdPages.PageLength2 << 8)\r
+                   |  SupportedVpdPages.PageLength1;\r
+        for (Index = 0; Index < PageLength; Index++) {\r
+          if (SupportedVpdPages.SupportedVpdPageList[Index] == EFI_SCSI_PAGE_CODE_BLOCK_LIMITS_VPD) {\r
+            break;\r
+          }\r
+        }\r
+\r
+        //\r
+        // Query the Block Limits VPD page\r
+        //\r
+        if (Index < PageLength) {\r
+          ZeroMem (&BlockLimits, sizeof (BlockLimits));\r
+          InquiryDataLength = sizeof (BlockLimits);\r
+          SenseDataLength   = 0;\r
+          Status = ScsiInquiryCommandEx (\r
+                     ScsiDiskDevice->ScsiIo,\r
+                     EFI_TIMER_PERIOD_SECONDS (1),\r
+                     NULL,\r
+                     &SenseDataLength,\r
+                     &HostAdapterStatus,\r
+                     &TargetStatus,\r
+                     (VOID *) &BlockLimits,\r
+                     &InquiryDataLength,\r
+                     TRUE,\r
+                     EFI_SCSI_PAGE_CODE_BLOCK_LIMITS_VPD\r
+                     );\r
+          if (!EFI_ERROR (Status)) {\r
+            ScsiDiskDevice->BlkIo.Media->OptimalTransferLengthGranularity = \r
+              (BlockLimits.OptimalTransferLengthGranularity2 << 8) |\r
+               BlockLimits.OptimalTransferLengthGranularity1;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    return EFI_SUCCESS;\r
+\r
+  } else if (Status == EFI_NOT_READY) {\r
+    *NeedRetry = TRUE;\r
+    return 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
+  } 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
@@ -1522,10 +1585,6 @@ GetMediaInfo (
 {\r
   UINT8       *Ptr;\r
 \r
-  ScsiDiskDevice->BlkIo.Media->LowestAlignedLba               = 0;\r
-  ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock  = 1;\r
-  \r
-\r
   if (!ScsiDiskDevice->Cdb16Byte) {\r
     ScsiDiskDevice->BlkIo.Media->LastBlock =  (Capacity10->LastLba3 << 24) |\r
                                               (Capacity10->LastLba2 << 16) |\r
@@ -1536,9 +1595,9 @@ GetMediaInfo (
                                              (Capacity10->BlockSize2 << 16) | \r
                                              (Capacity10->BlockSize1 << 8)  |\r
                                               Capacity10->BlockSize0;\r
-    ScsiDiskDevice->BlkIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION;      \r
+    ScsiDiskDevice->BlkIo.Media->LowestAlignedLba               = 0;\r
+    ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock  = 0;\r
   } else {\r
-\r
     Ptr = (UINT8*)&ScsiDiskDevice->BlkIo.Media->LastBlock;\r
     *Ptr++ = Capacity16->LastLba0;\r
     *Ptr++ = Capacity16->LastLba1;\r
@@ -1548,18 +1607,17 @@ GetMediaInfo (
     *Ptr++ = Capacity16->LastLba5;\r
     *Ptr++ = Capacity16->LastLba6;\r
     *Ptr   = Capacity16->LastLba7;\r
-  \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
+    ScsiDiskDevice->BlkIo.Media->LowestAlignedLba = (Capacity16->LowestAlignLogic2 << 8) |\r
+                                                     Capacity16->LowestAlignLogic1;\r
+    ScsiDiskDevice->BlkIo.Media->LogicalBlocksPerPhysicalBlock  = (1 << Capacity16->LogicPerPhysical);\r
   }\r
 \r
-\r
   ScsiDiskDevice->BlkIo.Media->MediaPresent = TRUE;\r
   \r
   if (ScsiDiskDevice->DeviceType == EFI_SCSI_TYPE_DISK) {\r
index a4ddc5dc084e903d7cbcfceb8be0a576b599d43b..dd621717490d59a51dfe3300bd6f2ea55458dbe1 100644 (file)
@@ -1049,12 +1049,18 @@ PartitionInstallChildHandle (
   Private->Media2.BlockSize = (UINT32) BlockSize;\r
 \r
   //\r
-  // Per UEFI Spec, LowestAlignedLba and LogicalBlocksPerPhysicalBlock must be 0\r
+  // Per UEFI Spec, LowestAlignedLba, LogicalBlocksPerPhysicalBlock and OptimalTransferLengthGranularity must be 0\r
   //  for logical partitions.\r
   //\r
   if (Private->BlockIo.Revision >= EFI_BLOCK_IO_PROTOCOL_REVISION2) {\r
-    Private->BlockIo.Media->LowestAlignedLba              = 0;\r
-    Private->BlockIo.Media->LogicalBlocksPerPhysicalBlock = 0;\r
+    Private->BlockIo.Media->LowestAlignedLba               = 0;\r
+    Private->BlockIo.Media->LogicalBlocksPerPhysicalBlock  = 0;\r
+    Private->BlockIo2.Media->LowestAlignedLba              = 0;\r
+    Private->BlockIo2.Media->LogicalBlocksPerPhysicalBlock = 0;\r
+    if (Private->BlockIo.Revision >= EFI_BLOCK_IO_PROTOCOL_REVISION3) {\r
+      Private->BlockIo.Media->OptimalTransferLengthGranularity  = 0;\r
+      Private->BlockIo2.Media->OptimalTransferLengthGranularity = 0;\r
+    }\r
   }\r
 \r
   Private->DevicePath     = AppendDevicePathNode (ParentDevicePath, DevicePathNode);\r