https://bugzilla.tianocore.org/show_bug.cgi?id=3217
Add UFS host conctroller reset in the last retry of the Link start up to allow scope for recovery of the Link. Signed-off-by: Bandaru <purna.chandra.rao.band...@intel.com> Cc: Mateusz Albecki <mateusz.albe...@intel.com> Cc: Ray Ni <ray...@intel.com> Cc: Hao A Wu <hao.a...@intel.com> Change-Id: Iecc87be51c557ec07890e2d700d6912ddf16adbd --- MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c | 45 +++++++++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 20 deletions(-) diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c index 0b1030ab47..e1416696d4 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThruHci.c @@ -2,7 +2,7 @@ UfsPassThruDxe driver is used to produce EFI_EXT_SCSI_PASS_THRU protocol interface for upper layer application to execute UFS-supported SCSI cmds. - Copyright (c) 2014 - 2019, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2014 - 2021, Intel Corporation. All rights reserved.<BR> Copyright (c) Microsoft Corporation.<BR> SPDX-License-Identifier: BSD-2-Clause-Patent @@ -1929,37 +1929,42 @@ UfsDeviceDetection ( // // Start UFS device detection. - // Try up to 3 times for establishing data link with device. + // Try up to 4 times for establishing data link with device. // - for (Retry = 0; Retry < 3; Retry++) { + for (Retry = 0; Retry < 4; Retry++) { LinkStartupCommand.Opcode = UfsUicDmeLinkStartup; LinkStartupCommand.Arg1 = 0; LinkStartupCommand.Arg2 = 0; LinkStartupCommand.Arg3 = 0; Status = UfsExecUicCommands (Private, &LinkStartupCommand); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - Status = UfsMmioRead32 (Private, UFS_HC_STATUS_OFFSET, &Data); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - if ((Data & UFS_HC_HCS_DP) == 0) { - Status = UfsWaitMemSet (Private, UFS_HC_IS_OFFSET, UFS_HC_IS_ULSS, UFS_HC_IS_ULSS, UFS_TIMEOUT); + if (!EFI_ERROR (Status)) { + Status = UfsMmioRead32 (Private, UFS_HC_STATUS_OFFSET, &Data); if (EFI_ERROR (Status)) { return EFI_DEVICE_ERROR; } - } else { - if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) { - Status = mUfsHcPlatform->Callback (Private->Handle, EdkiiUfsHcPostLinkStartup, &Private->UfsHcDriverInterface); + + if ((Data & UFS_HC_HCS_DP) == 0) { + Status = UfsWaitMemSet (Private, UFS_HC_IS_OFFSET, UFS_HC_IS_ULSS, UFS_HC_IS_ULSS, UFS_TIMEOUT); if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Failure from platform driver during EdkiiUfsHcPostLinkStartup, Status = %r\n", Status)); - return Status; + return EFI_DEVICE_ERROR; + } + } else { + if (mUfsHcPlatform != NULL && mUfsHcPlatform->Callback != NULL) { + Status = mUfsHcPlatform->Callback (Private->Handle, EdkiiUfsHcPostLinkStartup, &Private->UfsHcDriverInterface); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failure from platform driver during EdkiiUfsHcPostLinkStartup, Status = %r\n", Status)); + return Status; + } } + return EFI_SUCCESS; + } + } + if (Retry == 2) { + Status = UfsEnableHostController (Private); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "UfsDeviceDetection: Enable Host Controller Fails, Status = %r\n", Status)); + return Status; } - return EFI_SUCCESS; } } -- 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#72009): https://edk2.groups.io/g/devel/message/72009 Mute This Topic: https://groups.io/mt/80841260/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-