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