);\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
)\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
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
)\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
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
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
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