crypto: Clean-up support for 32KB+ packet

For some large (32KB+) packets for AES CCM algorithms,
depending on assoc data length, padding, actual data,
the ce_in_dst_desc, ce_out_src_desc are found to be
incorrect. This patch clears up the supports for 32KB+
and makes it more generic (not cipher/hash specific)

Relocate where the following are being processed
for 32KB+ packets
- ce_in_dst_desc from chain_sg_buffer_in() to ce_in_final()
- ce_out_src_desc from chain_sg_buffer_out() to ce_out_final()

With the above the AES-CCM algorithms passes all scenarios.

Signed-off-by: Mona Hossain <mhossain@codeaurora.org>
diff --git a/drivers/crypto/msm/qce40.c b/drivers/crypto/msm/qce40.c
index 24bf895..90a7889 100644
--- a/drivers/crypto/msm/qce40.c
+++ b/drivers/crypto/msm/qce40.c
@@ -736,14 +736,6 @@
 	unsigned int dlen;
 	struct dmov_desc *pdesc;
 
-	pdesc = pce_dev->ce_dm.ce_in_dst_desc +
-				pce_dev->ce_dm.ce_in_dst_desc_index;
-	if (nbytes > QCE_FIFO_SIZE)
-		qce_split_and_insert_dm_desc(pdesc, nbytes, 0,
-				&pce_dev->ce_dm.ce_in_dst_desc_index);
-	else
-		pdesc->len = nbytes;
-
 	pdesc = pce_dev->ce_dm.ce_in_src_desc +
 				pce_dev->ce_dm.ce_in_src_desc_index;
 	/*
@@ -809,10 +801,6 @@
 		pdesc->len = nbytes;
 		pdesc->addr = pmem;
 	}
-	pdesc = pce_dev->ce_dm.ce_in_dst_desc +
-				pce_dev->ce_dm.ce_in_dst_desc_index;
-	pdesc->len += nbytes;
-
 	return 0;
 }
 
@@ -834,12 +822,16 @@
 	pdesc = pce_dev->ce_dm.ce_in_src_desc +
 				pce_dev->ce_dm.ce_in_src_desc_index;
 	pdesc->len |= ADM_DESC_LAST;
-	pdesc = pce_dev->ce_dm.ce_in_dst_desc +
-				pce_dev->ce_dm.ce_in_dst_desc_index;
-	if (total)
-		pdesc->len = ADM_DESC_LAST | total;
-	else
+
+	pdesc = pce_dev->ce_dm.ce_in_dst_desc;
+	if (total > QCE_FIFO_SIZE) {
+		qce_split_and_insert_dm_desc(pdesc, total, 0,
+				&pce_dev->ce_dm.ce_in_dst_desc_index);
+		pdesc = pce_dev->ce_dm.ce_in_dst_desc +
+					pce_dev->ce_dm.ce_in_dst_desc_index;
 		pdesc->len |= ADM_DESC_LAST;
+	} else
+		pdesc->len = ADM_DESC_LAST | total;
 
 	pcmd = (dmov_sg *) pce_dev->ce_dm.cmdlist.ce_data_in;
 	pcmd->cmd |= CMD_LC;
@@ -905,14 +897,6 @@
 	unsigned int dlen;
 	struct dmov_desc *pdesc;
 
-	pdesc = pce_dev->ce_dm.ce_out_src_desc +
-				pce_dev->ce_dm.ce_out_src_desc_index;
-	if (nbytes > QCE_FIFO_SIZE)
-		qce_split_and_insert_dm_desc(pdesc, nbytes, 0,
-				&pce_dev->ce_dm.ce_out_src_desc_index);
-	else
-		pdesc->len = nbytes;
-
 	pdesc = pce_dev->ce_dm.ce_out_dst_desc +
 				pce_dev->ce_dm.ce_out_dst_desc_index;
 	/*
@@ -980,10 +964,6 @@
 		pdesc->len = nbytes;
 		pdesc->addr = pmem;
 	}
-	pdesc = pce_dev->ce_dm.ce_out_src_desc +
-				pce_dev->ce_dm.ce_out_src_desc_index;
-	pdesc->len += nbytes;
-
 	return 0;
 };
 
@@ -1005,12 +985,17 @@
 	pdesc = pce_dev->ce_dm.ce_out_dst_desc +
 				pce_dev->ce_dm.ce_out_dst_desc_index;
 	pdesc->len |= ADM_DESC_LAST;
+
 	pdesc = pce_dev->ce_dm.ce_out_src_desc +
 				pce_dev->ce_dm.ce_out_src_desc_index;
-	if (total)
-		pdesc->len = ADM_DESC_LAST | total;
-	else
+	if (total > QCE_FIFO_SIZE) {
+		qce_split_and_insert_dm_desc(pdesc, total, 0,
+				&pce_dev->ce_dm.ce_out_src_desc_index);
+		pdesc = pce_dev->ce_dm.ce_out_src_desc +
+				pce_dev->ce_dm.ce_out_src_desc_index;
 		pdesc->len |= ADM_DESC_LAST;
+	} else
+		pdesc->len = ADM_DESC_LAST | total;
 
 	pcmd = (dmov_sg *) pce_dev->ce_dm.cmdlist.ce_data_out;
 	pcmd->cmd |= CMD_LC;
@@ -2258,8 +2243,8 @@
 	}
 
 	/* finalize the ce_in and ce_out channels command lists */
-	_ce_in_final(pce_dev, 0);
-	_ce_out_final(pce_dev, 0);
+	_ce_in_final(pce_dev, areq->nbytes + pad_len);
+	_ce_out_final(pce_dev, areq->nbytes + pad_len);
 
 	_ce_in_dump(pce_dev);
 	_ce_out_dump(pce_dev);
@@ -2330,7 +2315,7 @@
 				goto bad;
 			}
 	}
-	 _ce_in_final(pce_dev, 0);
+	 _ce_in_final(pce_dev, sreq->size + pad_len);
 
 	_ce_in_dump(pce_dev);
 
@@ -2544,4 +2529,4 @@
 MODULE_LICENSE("GPL v2");
 MODULE_AUTHOR("Mona Hossain <mhossain@codeaurora.org>");
 MODULE_DESCRIPTION("Crypto Engine driver");
-MODULE_VERSION("2.10");
+MODULE_VERSION("2.11");