From f86ad8ba4bbb7fefe28e052d3d850fdf948da7cb Mon Sep 17 00:00:00 2001 From: costel-ignat Date: Tue, 8 Oct 2024 18:54:26 +0300 Subject: [PATCH] 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 --- .../Library/UfsBlockIoLib/UfsBlockIoLib.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/BootloaderCommonPkg/Library/UfsBlockIoLib/UfsBlockIoLib.c b/BootloaderCommonPkg/Library/UfsBlockIoLib/UfsBlockIoLib.c index 215ebbc5..8cc651cd 100644 --- a/BootloaderCommonPkg/Library/UfsBlockIoLib/UfsBlockIoLib.c +++ b/BootloaderCommonPkg/Library/UfsBlockIoLib/UfsBlockIoLib.c @@ -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));