From 7456990e8eebe3b935447253bb6d1d3129839122 Mon Sep 17 00:00:00 2001 From: "Bandaru, Purna Chandra Rao" Date: Fri, 25 Mar 2022 20:18:00 +0800 Subject: [PATCH] MdeModulePkg/Ufs: bRefClkFreq attribute be programmed after fDeviceInit REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3886 bRefClkFreq UFS card attribute need to be read and written after successful fDeviceInit and NOP response so that link will be stable. Cc: Wu Hao A Cc: Albecki Mateusz Cc: Liming Gao Cc: Zhiguang Liu Signed-off-by: Purna Chandra Rao Bandaru Reviewed-by: Hao A Wu --- .../Bus/Ufs/UfsPassThruDxe/UfsPassThru.c | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c index dc78e09678..ae593ff03a 100644 --- a/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c +++ b/MdeModulePkg/Bus/Ufs/UfsPassThruDxe/UfsPassThru.c @@ -919,6 +919,23 @@ UfsPassThruDriverBindingStart ( goto Error; } + // + // UFS 2.0 spec Section 13.1.3.3: + // At the end of the UFS Interconnect Layer initialization on both host and device side, + // the host shall send a NOP OUT UPIU to verify that the device UTP Layer is ready. + // + Status = UfsExecNopCmds (Private); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Ufs Sending NOP IN command Error, Status = %r\n", Status)); + goto Error; + } + + Status = UfsFinishDeviceInitialization (Private); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Device failed to finish initialization, Status = %r\n", Status)); + goto Error; + } + if ((mUfsHcPlatform != NULL) && ((mUfsHcPlatform->RefClkFreq == EdkiiUfsCardRefClkFreq19p2Mhz) || (mUfsHcPlatform->RefClkFreq == EdkiiUfsCardRefClkFreq26Mhz) || @@ -967,23 +984,6 @@ UfsPassThruDriverBindingStart ( } } - // - // UFS 2.0 spec Section 13.1.3.3: - // At the end of the UFS Interconnect Layer initialization on both host and device side, - // the host shall send a NOP OUT UPIU to verify that the device UTP Layer is ready. - // - Status = UfsExecNopCmds (Private); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Ufs Sending NOP IN command Error, Status = %r\n", Status)); - goto Error; - } - - Status = UfsFinishDeviceInitialization (Private); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "Device failed to finish initialization, Status = %r\n", Status)); - goto Error; - } - // // Check if 8 common luns are active and set corresponding bit mask. // -- 2.39.2