fix:[common] Extend Ufs devices waiting for fDeviceInit.

- UFS device would clear fDeviceInit flag once the device initialization
   is completed.
 - This change is polling to check the flag is cleared or not with
   specific timeout (UFS_INIT_COMPLETION_TIMEOUT - 600ms).

Signed-off-by: costel-ignat <costel.ignat@intel.com>
This commit is contained in:
costel-ignat
2024-10-08 18:54:26 +03:00
committed by Guo Dong
parent bd93a3c092
commit f86ad8ba4b

View File

@@ -1293,8 +1293,8 @@ UfsFinishDeviceInitialization (
)
{
EFI_STATUS Status;
UINT8 DeviceInitStatus;
UINT8 Timeout;
UINT8 DeviceInitStatus;
UINT32 Timeout;
DeviceInitStatus = 0xFF;
@@ -1306,7 +1306,7 @@ UfsFinishDeviceInitialization (
return Status;
}
Timeout = 5;
Timeout = UFS_INIT_COMPLETION_TIMEOUT;
do {
Status = UfsReadFlag (Private, UfsFlagDevInit, &DeviceInitStatus);
if (EFI_ERROR (Status)) {
@@ -1316,7 +1316,13 @@ UfsFinishDeviceInitialization (
Timeout--;
} while (DeviceInitStatus != 0 && Timeout != 0);
return EFI_SUCCESS;
if (Timeout == 0) {
DEBUG ((DEBUG_ERROR, "%a: DeviceInitStatus = %x EFI_TIMEOUT \n", __func__, DeviceInitStatus));
return EFI_TIMEOUT;
} else {
DEBUG ((DEBUG_INFO, "%a: Timeout left = %x EFI_SUCCESS \n", __func__, Timeout));
return EFI_SUCCESS;
}
}
/**
@@ -1496,6 +1502,9 @@ InitializeUfs (
continue;
}
//
// Check the UFS device is initialized completed.
//
Status = UfsFinishDeviceInitialization (Private);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "Device failed to finish initialization, Status = %r\n", Status));