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");