[edk2-devel] [PATCH 2/3] MdeModulePkg/UfsPassThruDxe: Improve Error handling of Ufs Pass Thru driver

Purna Chandra Rao Bandaru purna.chandra.rao.bandaru at intel.com
Mon Feb 22 17:02:35 UTC 2021


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.bandaru at intel.com>
Cc: Mateusz Albecki <mateusz.albecki at intel.com>
Cc: Ray Ni <ray.ni at intel.com>
Cc: Hao A Wu <hao.a.wu at 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/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list