We initialize the scatter gather walk lists needed for PIO mode and avoid all
DMA paths such as mapping/unmapping buffers by checking for the pio_only flag.

Signed-off-by: Joel Fernandes <jo...@ti.com>
---
 drivers/crypto/omap-aes.c |   43 ++++++++++++++++++++++++++++++-------------
 1 file changed, 30 insertions(+), 13 deletions(-)

diff --git a/drivers/crypto/omap-aes.c b/drivers/crypto/omap-aes.c
index 889dc99..62b3260 100644
--- a/drivers/crypto/omap-aes.c
+++ b/drivers/crypto/omap-aes.c
@@ -168,6 +168,7 @@ struct omap_aes_dev {
        struct dma_chan         *dma_lch_out;
        int                     in_sg_len;
        int                     out_sg_len;
+       int                     pio_only;
        const struct omap_aes_pdata     *pdata;
 };
 
@@ -413,6 +414,16 @@ static int omap_aes_crypt_dma(struct crypto_tfm *tfm,
        struct dma_slave_config cfg;
        int ret;
 
+       if (dd->pio_only) {
+               scatterwalk_start(&dd->in_walk, dd->in_sg);
+               scatterwalk_start(&dd->out_walk, dd->out_sg);
+
+               /* Enable DATAIN interrupt and let it take
+                  care of the rest */
+               omap_aes_write(dd, AES_REG_IRQ_ENABLE(dd), 0x2);
+               return 0;
+       }
+
        dma_sync_sg_for_device(dd->dev, dd->in_sg, in_sg_len, DMA_TO_DEVICE);
 
        memset(&cfg, 0, sizeof(cfg));
@@ -482,21 +493,25 @@ static int omap_aes_crypt_dma_start(struct omap_aes_dev 
*dd)
 
        pr_debug("total: %d\n", dd->total);
 
-       err = dma_map_sg(dd->dev, dd->in_sg, dd->in_sg_len, DMA_TO_DEVICE);
-       if (!err) {
-               dev_err(dd->dev, "dma_map_sg() error\n");
-               return -EINVAL;
-       }
+       if (!dd->pio_only) {
+               err = dma_map_sg(dd->dev, dd->in_sg, dd->in_sg_len,
+                                DMA_TO_DEVICE);
+               if (!err) {
+                       dev_err(dd->dev, "dma_map_sg() error\n");
+                       return -EINVAL;
+               }
 
-       err = dma_map_sg(dd->dev, dd->out_sg, dd->out_sg_len, DMA_FROM_DEVICE);
-       if (!err) {
-               dev_err(dd->dev, "dma_map_sg() error\n");
-               return -EINVAL;
+               err = dma_map_sg(dd->dev, dd->out_sg, dd->out_sg_len,
+                                DMA_FROM_DEVICE);
+               if (!err) {
+                       dev_err(dd->dev, "dma_map_sg() error\n");
+                       return -EINVAL;
+               }
        }
 
        err = omap_aes_crypt_dma(tfm, dd->in_sg, dd->out_sg, dd->in_sg_len,
                                 dd->out_sg_len);
-       if (err) {
+       if (err && !dd->pio_only) {
                dma_unmap_sg(dd->dev, dd->in_sg, dd->in_sg_len, DMA_TO_DEVICE);
                dma_unmap_sg(dd->dev, dd->out_sg, dd->out_sg_len,
                             DMA_FROM_DEVICE);
@@ -600,9 +615,11 @@ static void omap_aes_done_task(unsigned long data)
 
        pr_debug("enter done_task\n");
 
-       dma_sync_sg_for_cpu(dd->dev, dd->in_sg, dd->in_sg_len, DMA_FROM_DEVICE);
-
-       omap_aes_crypt_dma_stop(dd);
+       if (!dd->pio_only) {
+               dma_sync_sg_for_device(dd->dev, dd->out_sg, dd->out_sg_len,
+                                      DMA_FROM_DEVICE);
+               omap_aes_crypt_dma_stop(dd);
+       }
        omap_aes_finish_req(dd, 0);
        omap_aes_handle_queue(dd, NULL);
 
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to