]> git.proxmox.com Git - mirror_edk2.git/blobdiff - DuetPkg/SataControllerDxe/SataController.c
DuetPkg: SataControllerDxe: fix private array subscripting
[mirror_edk2.git] / DuetPkg / SataControllerDxe / SataController.c
index e78915ad31652a7145db3b51e32be9ef4782f3c3..e5d10e234e88c3135892b9b400c5db409e4f4504 100644 (file)
@@ -600,6 +600,37 @@ SataControllerStop (
                 );\r
 }\r
 \r
+/**\r
+  Calculate the flat array subscript of a (Channel, Device) pair.\r
+\r
+  @param[in] SataPrivateData  The private data structure corresponding to the\r
+                              SATA controller that attaches the device for\r
+                              which the flat array subscript is being\r
+                              calculated.\r
+\r
+  @param[in] Channel          The channel (ie. port) number on the SATA\r
+                              controller that the device is attached to.\r
+\r
+  @param[in] Device           The device number on the channel.\r
+\r
+  @return  The flat array subscript suitable for indexing DisqualifiedModes,\r
+           IdentifyData, and IdentifyValid.\r
+**/\r
+STATIC\r
+UINTN\r
+FlatDeviceIndex (\r
+  IN CONST EFI_SATA_CONTROLLER_PRIVATE_DATA  *SataPrivateData,\r
+  IN UINTN                                   Channel,\r
+  IN UINTN                                   Device\r
+  )\r
+{\r
+  ASSERT (SataPrivateData != NULL);\r
+  ASSERT (Channel < SataPrivateData->IdeInit.ChannelCount);\r
+  ASSERT (Device < SataPrivateData->DeviceCount);\r
+\r
+  return Channel * SataPrivateData->DeviceCount + Device;\r
+}\r
+\r
 //\r
 // Interface functions of IDE_CONTROLLER_INIT protocol\r
 //\r
@@ -746,6 +777,8 @@ IdeInitSubmitData (
   )\r
 {\r
   EFI_SATA_CONTROLLER_PRIVATE_DATA  *SataPrivateData;\r
+  UINTN                             DeviceIndex;\r
+\r
   SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This);\r
   ASSERT (SataPrivateData != NULL);\r
 \r
@@ -753,19 +786,21 @@ IdeInitSubmitData (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  DeviceIndex = FlatDeviceIndex (SataPrivateData, Channel, Device);\r
+\r
   //\r
   // Make a local copy of device's IdentifyData and mark the valid flag\r
   //\r
   if (IdentifyData != NULL) {\r
     CopyMem (\r
-      &(SataPrivateData->IdentifyData[Channel * Device]),\r
+      &(SataPrivateData->IdentifyData[DeviceIndex]),\r
       IdentifyData,\r
       sizeof (EFI_IDENTIFY_DATA)\r
       );\r
 \r
-    SataPrivateData->IdentifyValid[Channel * Device] = TRUE;\r
+    SataPrivateData->IdentifyValid[DeviceIndex] = TRUE;\r
   } else {\r
-    SataPrivateData->IdentifyValid[Channel * Device] = FALSE;\r
+    SataPrivateData->IdentifyValid[DeviceIndex] = FALSE;\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -821,6 +856,8 @@ IdeInitDisqualifyMode (
   )\r
 {\r
   EFI_SATA_CONTROLLER_PRIVATE_DATA  *SataPrivateData;\r
+  UINTN                             DeviceIndex;\r
+\r
   SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This);\r
   ASSERT (SataPrivateData != NULL);\r
 \r
@@ -828,12 +865,14 @@ IdeInitDisqualifyMode (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  DeviceIndex = FlatDeviceIndex (SataPrivateData, Channel, Device);\r
+\r
   //\r
   // Record the disqualified modes per channel per device. From ATA/ATAPI spec,\r
   // if a mode is not supported, the modes higher than it is also not supported.\r
   //\r
   CopyMem (\r
-    &(SataPrivateData->DisqualifiedModes[Channel * Device]),\r
+    &(SataPrivateData->DisqualifiedModes[DeviceIndex]),\r
     BadModes,\r
     sizeof (EFI_ATA_COLLECTIVE_MODE)\r
     );\r
@@ -910,6 +949,7 @@ IdeInitCalculateMode (
   EFI_ATA_COLLECTIVE_MODE           *DisqualifiedModes;\r
   UINT16                            SelectedMode;\r
   EFI_STATUS                        Status;\r
+  UINTN                             DeviceIndex;\r
 \r
   SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This);\r
   ASSERT (SataPrivateData != NULL);\r
@@ -924,9 +964,11 @@ IdeInitCalculateMode (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  IdentifyData = &(SataPrivateData->IdentifyData[Channel * Device]);\r
-  IdentifyValid = SataPrivateData->IdentifyValid[Channel * Device];\r
-  DisqualifiedModes = &(SataPrivateData->DisqualifiedModes[Channel * Device]);\r
+  DeviceIndex = FlatDeviceIndex (SataPrivateData, Channel, Device);\r
+\r
+  IdentifyData = &(SataPrivateData->IdentifyData[DeviceIndex]);\r
+  IdentifyValid = SataPrivateData->IdentifyValid[DeviceIndex];\r
+  DisqualifiedModes = &(SataPrivateData->DisqualifiedModes[DeviceIndex]);\r
 \r
   //\r
   // Make sure we've got the valid identify data of the device from SubmitData()\r