aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto/omap-sham.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/crypto/omap-sham.c')
-rw-r--r--drivers/crypto/omap-sham.c24
1 files changed, 9 insertions, 15 deletions
diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c
index 84e5890c57e9..24de4ace9783 100644
--- a/drivers/crypto/omap-sham.c
+++ b/drivers/crypto/omap-sham.c
@@ -146,7 +146,6 @@ struct omap_sham_dev {
146 int dma; 146 int dma;
147 int dma_lch; 147 int dma_lch;
148 struct tasklet_struct done_task; 148 struct tasklet_struct done_task;
149 struct tasklet_struct queue_task;
150 149
151 unsigned long flags; 150 unsigned long flags;
152 struct crypto_queue queue; 151 struct crypto_queue queue;
@@ -653,6 +652,9 @@ static void omap_sham_finish_req(struct ahash_request *req, int err)
653 652
654 if (req->base.complete) 653 if (req->base.complete)
655 req->base.complete(&req->base, err); 654 req->base.complete(&req->base, err);
655
656 /* handle new request */
657 tasklet_schedule(&dd->done_task);
656} 658}
657 659
658static int omap_sham_handle_queue(struct omap_sham_dev *dd, 660static int omap_sham_handle_queue(struct omap_sham_dev *dd,
@@ -716,11 +718,9 @@ static int omap_sham_handle_queue(struct omap_sham_dev *dd,
716 err = omap_sham_final_req(dd); 718 err = omap_sham_final_req(dd);
717 } 719 }
718err1: 720err1:
719 if (err != -EINPROGRESS) { 721 if (err != -EINPROGRESS)
720 /* done_task will not finish it, so do it here */ 722 /* done_task will not finish it, so do it here */
721 omap_sham_finish_req(req, err); 723 omap_sham_finish_req(req, err);
722 tasklet_schedule(&dd->queue_task);
723 }
724 724
725 dev_dbg(dd->dev, "exit, err: %d\n", err); 725 dev_dbg(dd->dev, "exit, err: %d\n", err);
726 726
@@ -1035,6 +1035,11 @@ static void omap_sham_done_task(unsigned long data)
1035 struct omap_sham_dev *dd = (struct omap_sham_dev *)data; 1035 struct omap_sham_dev *dd = (struct omap_sham_dev *)data;
1036 int ready = 0, err = 0; 1036 int ready = 0, err = 0;
1037 1037
1038 if (!test_bit(FLAGS_BUSY, &dd->flags)) {
1039 omap_sham_handle_queue(dd, NULL);
1040 return;
1041 }
1042
1038 if (test_and_clear_bit(FLAGS_OUTPUT_READY, &dd->flags)) 1043 if (test_and_clear_bit(FLAGS_OUTPUT_READY, &dd->flags))
1039 ready = 1; 1044 ready = 1;
1040 1045
@@ -1050,18 +1055,9 @@ static void omap_sham_done_task(unsigned long data)
1050 dev_dbg(dd->dev, "update done: err: %d\n", err); 1055 dev_dbg(dd->dev, "update done: err: %d\n", err);
1051 /* finish curent request */ 1056 /* finish curent request */
1052 omap_sham_finish_req(dd->req, err); 1057 omap_sham_finish_req(dd->req, err);
1053 /* start new request */
1054 omap_sham_handle_queue(dd, NULL);
1055 } 1058 }
1056} 1059}
1057 1060
1058static void omap_sham_queue_task(unsigned long data)
1059{
1060 struct omap_sham_dev *dd = (struct omap_sham_dev *)data;
1061
1062 omap_sham_handle_queue(dd, NULL);
1063}
1064
1065static irqreturn_t omap_sham_irq(int irq, void *dev_id) 1061static irqreturn_t omap_sham_irq(int irq, void *dev_id)
1066{ 1062{
1067 struct omap_sham_dev *dd = dev_id; 1063 struct omap_sham_dev *dd = dev_id;
@@ -1137,7 +1133,6 @@ static int __devinit omap_sham_probe(struct platform_device *pdev)
1137 INIT_LIST_HEAD(&dd->list); 1133 INIT_LIST_HEAD(&dd->list);
1138 spin_lock_init(&dd->lock); 1134 spin_lock_init(&dd->lock);
1139 tasklet_init(&dd->done_task, omap_sham_done_task, (unsigned long)dd); 1135 tasklet_init(&dd->done_task, omap_sham_done_task, (unsigned long)dd);
1140 tasklet_init(&dd->queue_task, omap_sham_queue_task, (unsigned long)dd);
1141 crypto_init_queue(&dd->queue, OMAP_SHAM_QUEUE_LENGTH); 1136 crypto_init_queue(&dd->queue, OMAP_SHAM_QUEUE_LENGTH);
1142 1137
1143 dd->irq = -1; 1138 dd->irq = -1;
@@ -1246,7 +1241,6 @@ static int __devexit omap_sham_remove(struct platform_device *pdev)
1246 for (i = 0; i < ARRAY_SIZE(algs); i++) 1241 for (i = 0; i < ARRAY_SIZE(algs); i++)
1247 crypto_unregister_ahash(&algs[i]); 1242 crypto_unregister_ahash(&algs[i]);
1248 tasklet_kill(&dd->done_task); 1243 tasklet_kill(&dd->done_task);
1249 tasklet_kill(&dd->queue_task);
1250 iounmap(dd->io_base); 1244 iounmap(dd->io_base);
1251 clk_put(dd->iclk); 1245 clk_put(dd->iclk);
1252 omap_sham_dma_cleanup(dd); 1246 omap_sham_dma_cleanup(dd);