There can be either ATA or ATAPI devices connected to
each SATA port. We want to detect if the device is ATA
and create a SATA_DP path or a SCSI_DP for ATAPI devices.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jeremy Linton <jeremy.linton@arm.com>
---
.../Drivers/SataSiI3132Dxe/SiI3132AtaPassThru.c | 43 ++++++++++++++--------
1 file changed, 28 insertions(+), 15 deletions(-)
diff --git a/EmbeddedPkg/Drivers/SataSiI3132Dxe/SiI3132AtaPassThru.c b/EmbeddedPkg/Drivers/SataSiI3132Dxe/SiI3132AtaPassThru.c
index b14a8aa..8c65a73 100644
--- a/EmbeddedPkg/Drivers/SataSiI3132Dxe/SiI3132AtaPassThru.c
+++ b/EmbeddedPkg/Drivers/SataSiI3132Dxe/SiI3132AtaPassThru.c
@@ -521,16 +521,19 @@ SiI3132GetNextDevice (
SataPort = &(SataSiI3132Instance->Ports[Port]);
if (*PortMultiplierPort == 0xFFFF) {
+ SATA_TRACE ("SiI3132GetNextDevice() PortMultiplier");
List = SataPort->Devices.ForwardLink;
- if (List != &SataPort->Devices) {
+ if ((List != &SataPort->Devices) &&
+ (((SATA_SI3132_DEVICE*)List)->Atapi == FALSE)) {
// The list is not empty, return the first device
*PortMultiplierPort = ((SATA_SI3132_DEVICE*)List)->Index;
} else {
Status = EFI_NOT_FOUND;
}
} else {
+ SATA_TRACE ("SiI3132GetNextDevice()");
SataDevice = GetSataDevice (SataSiI3132Instance, Port, *PortMultiplierPort);
- if (SataDevice != NULL) {
+ if ((SataDevice != NULL) && (SataDevice->Atapi == FALSE)) {
// We have found the previous port multiplier, return the next one
List = SataDevice->Link.ForwardLink;
if (List != &SataPort->Devices) {
@@ -601,20 +604,30 @@ SiI3132BuildDevicePath (
return EFI_NOT_FOUND;
}
- SiI3132DevicePath = CreateDeviceNode (MESSAGING_DEVICE_PATH, MSG_SATA_DP, sizeof (SATA_DEVICE_PATH));
- if (SiI3132DevicePath == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
+ if (SataDevice->Atapi) {
+ SiI3132DevicePath = CreateDeviceNode (MESSAGING_DEVICE_PATH, MSG_SCSI_DP, sizeof (SCSI_DEVICE_PATH));
+ if (SiI3132DevicePath == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ ((SCSI_DEVICE_PATH*)SiI3132DevicePath)->Pun = Port;
+ ((SCSI_DEVICE_PATH*)SiI3132DevicePath)->Lun = 0;
- ((SATA_DEVICE_PATH*)SiI3132DevicePath)->HBAPortNumber = Port;
- if (FeaturePcdGet (PcdSataSiI3132FeaturePMPSupport)) {
- ((SATA_DEVICE_PATH*)SiI3132DevicePath)->PortMultiplierPortNumber = PortMultiplierPort;
- } else {
- //Temp:((SATA_DEVICE_PATH*)SiI3132DevicePath)->PortMultiplierPortNumber = SATA_HBA_DIRECT_CONNECT_FLAG;
- ((SATA_DEVICE_PATH*)SiI3132DevicePath)->PortMultiplierPortNumber = 0;
}
- ((SATA_DEVICE_PATH*)SiI3132DevicePath)->Lun = Port; //TODO: Search information how to define properly LUN (Logical Unit Number)
+ else {
+ SiI3132DevicePath = CreateDeviceNode (MESSAGING_DEVICE_PATH, MSG_SATA_DP, sizeof (SATA_DEVICE_PATH));
+ if (SiI3132DevicePath == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ ((SATA_DEVICE_PATH*)SiI3132DevicePath)->HBAPortNumber = Port;
+ if (FeaturePcdGet (PcdSataSiI3132FeaturePMPSupport)) {
+ ((SATA_DEVICE_PATH*)SiI3132DevicePath)->PortMultiplierPortNumber = PortMultiplierPort;
+ } else {
+ //Temp:((SATA_DEVICE_PATH*)SiI3132DevicePath)->PortMultiplierPortNumber = SATA_HBA_DIRECT_CONNECT_FLAG;
+ ((SATA_DEVICE_PATH*)SiI3132DevicePath)->PortMultiplierPortNumber = 0;
+ }
+ ((SATA_DEVICE_PATH*)SiI3132DevicePath)->Lun = 0; // Only support lun0 on ATA
+ }
*DevicePath = SiI3132DevicePath;
return EFI_SUCCESS;
}
@@ -680,7 +693,7 @@ SiI3132GetDevice (
return EFI_INVALID_PARAMETER;
}
- if (((SATA_DEVICE_PATH*)DevicePath)->Lun >= SATA_SII3132_MAXPORT) {
+ if (((SATA_DEVICE_PATH*)DevicePath)->HBAPortNumber >= SATA_SII3132_MAXPORT) {
return EFI_NOT_FOUND;
}
@@ -688,7 +701,7 @@ SiI3132GetDevice (
ASSERT (0); //TODO: Implement me!
return EFI_UNSUPPORTED;
} else {
- *Port = ((SATA_DEVICE_PATH*)DevicePath)->Lun;
+ *Port = ((SATA_DEVICE_PATH*)DevicePath)->HBAPortNumber;
// Return the first Sata Sevice as there should be only one directly connected
*PortMultiplierPort = ((SATA_SI3132_DEVICE*)SataSiI3132Instance->Ports[*Port].Devices.ForwardLink)->Index;
return EFI_SUCCESS;
--
2.9.3
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel