Merge "platform: msm_shared: Add timeout for utp command completions"
diff --git a/platform/msm_shared/include/utp.h b/platform/msm_shared/include/utp.h
index e7a6df9..ff55f22 100644
--- a/platform/msm_shared/include/utp.h
+++ b/platform/msm_shared/include/utp.h
@@ -47,6 +47,7 @@
#define UTP_MUTEX_ACQUIRE_TIMEOUT 0x100000
#define UTP_GENERIC_CMD_TIMEOUT 40000
+#define UTP_MAX_COMMAND_RETRY 5000000
struct utp_prdt_entry
{
diff --git a/platform/msm_shared/utp.c b/platform/msm_shared/utp.c
index 0c0e14b..317cd69 100644
--- a/platform/msm_shared/utp.c
+++ b/platform/msm_shared/utp.c
@@ -220,7 +220,7 @@
{
int ret;
struct ufs_req_irq_type irq;
- uint32_t val, base;
+ uint32_t val, base, retry = 0;
base = dev->base;
val = readl(UFS_IS(base));
irq.irq_handled = 0;
@@ -228,6 +228,13 @@
while(((val & UFS_IS_UTRCS) == 0) && ((val & UFS_IS_UTMRCS) == 0))
{
val = readl(UFS_IS(base));
+ retry++;
+ udelay(1);
+ if(retry == UTP_MAX_COMMAND_RETRY)
+ {
+ dprintf(CRITICAL, "UTP command never completed.\n");
+ return 1;
+ }
#ifdef DEBUG_UFS
dprintf(INFO, "Waiting for UTRCS/URMRCS Completion...\n");
#endif