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]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to