Merge "platform: msm_shared: Fix max length for ADMA desc line"
diff --git a/platform/msm_shared/sdhci.c b/platform/msm_shared/sdhci.c
index 21e3097..417e0eb 100644
--- a/platform/msm_shared/sdhci.c
+++ b/platform/msm_shared/sdhci.c
@@ -493,7 +493,7 @@
 		}
 
 		sg_list[0].addr = (uint32_t)data;
-		sg_list[0].len = len;
+		sg_list[0].len = (len < SDHCI_ADMA_DESC_LINE_SZ) ? len : (SDHCI_ADMA_DESC_LINE_SZ & 0xffff);
 		sg_list[0].tran_att = SDHCI_ADMA_TRANS_VALID | SDHCI_ADMA_TRANS_DATA
 							  | SDHCI_ADMA_TRANS_END;
 
@@ -527,7 +527,13 @@
 		 */
 		for (i = 0; i < (sg_len - 1); i++) {
 				sg_list[i].addr = (uint32_t)data;
-				sg_list[i].len = SDHCI_ADMA_DESC_LINE_SZ;
+				/*
+				 * Length attribute is 16 bit value & max transfer size for one
+				 * descriptor line is 65536 bytes, As per SD Spec3.0 'len = 0'
+				 * implies 65536 bytes. Truncate the length to limit to 16 bit
+				 * range.
+				 */
+				sg_list[i].len = (SDHCI_ADMA_DESC_LINE_SZ & 0xffff);
 				sg_list[i].tran_att = SDHCI_ADMA_TRANS_VALID | SDHCI_ADMA_TRANS_DATA;
 				data += SDHCI_ADMA_DESC_LINE_SZ;
 				len -= SDHCI_ADMA_DESC_LINE_SZ;
@@ -537,7 +543,7 @@
 			 * attributes
 			 */
 			sg_list[sg_len - 1].addr = (uint32_t)data;
-			sg_list[sg_len - 1].len = len;
+			sg_list[sg_len - 1].len = (len < SDHCI_ADMA_DESC_LINE_SZ) ? len : (SDHCI_ADMA_DESC_LINE_SZ & 0xffff);
 			sg_list[sg_len - 1].tran_att = SDHCI_ADMA_TRANS_VALID | SDHCI_ADMA_TRANS_DATA |
 										   SDHCI_ADMA_TRANS_END;
 		}