Commit 6cb3ffe100ef4c6d5be0bfe4f8ac6d4227bb91bd
Committed by
Herbert Xu
1 parent
171cb9a280
Exists in
master
and in
6 other branches
crypto: omap-sham - remove dedicated queue handling tasklet
Calling omap_sham_handle_queue from "done" tasklet should be done after irq scheduled tasklet completes. Having additional tasklet does not solve that issue because it might be execute before. So queue handling tasklet has been removed and functionality integrated into single tasklet. Signed-off-by: Dmitry Kasatkin <dmitry.kasatkin@nokia.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Showing 1 changed file with 9 additions and 15 deletions Side-by-side Diff
drivers/crypto/omap-sham.c
... | ... | @@ -146,7 +146,6 @@ |
146 | 146 | int dma; |
147 | 147 | int dma_lch; |
148 | 148 | struct tasklet_struct done_task; |
149 | - struct tasklet_struct queue_task; | |
150 | 149 | |
151 | 150 | unsigned long flags; |
152 | 151 | struct crypto_queue queue; |
... | ... | @@ -653,6 +652,9 @@ |
653 | 652 | |
654 | 653 | if (req->base.complete) |
655 | 654 | req->base.complete(&req->base, err); |
655 | + | |
656 | + /* handle new request */ | |
657 | + tasklet_schedule(&dd->done_task); | |
656 | 658 | } |
657 | 659 | |
658 | 660 | static int omap_sham_handle_queue(struct omap_sham_dev *dd, |
659 | 661 | |
... | ... | @@ -716,11 +718,9 @@ |
716 | 718 | err = omap_sham_final_req(dd); |
717 | 719 | } |
718 | 720 | err1: |
719 | - if (err != -EINPROGRESS) { | |
721 | + if (err != -EINPROGRESS) | |
720 | 722 | /* done_task will not finish it, so do it here */ |
721 | 723 | omap_sham_finish_req(req, err); |
722 | - tasklet_schedule(&dd->queue_task); | |
723 | - } | |
724 | 724 | |
725 | 725 | dev_dbg(dd->dev, "exit, err: %d\n", err); |
726 | 726 | |
... | ... | @@ -1035,6 +1035,11 @@ |
1035 | 1035 | struct omap_sham_dev *dd = (struct omap_sham_dev *)data; |
1036 | 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 | 1043 | if (test_and_clear_bit(FLAGS_OUTPUT_READY, &dd->flags)) |
1039 | 1044 | ready = 1; |
1040 | 1045 | |
1041 | 1046 | |
... | ... | @@ -1050,18 +1055,9 @@ |
1050 | 1055 | dev_dbg(dd->dev, "update done: err: %d\n", err); |
1051 | 1056 | /* finish curent request */ |
1052 | 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 | |
1058 | -static 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 | - | |
1065 | 1061 | static irqreturn_t omap_sham_irq(int irq, void *dev_id) |
1066 | 1062 | { |
1067 | 1063 | struct omap_sham_dev *dd = dev_id; |
... | ... | @@ -1137,7 +1133,6 @@ |
1137 | 1133 | INIT_LIST_HEAD(&dd->list); |
1138 | 1134 | spin_lock_init(&dd->lock); |
1139 | 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 | 1136 | crypto_init_queue(&dd->queue, OMAP_SHAM_QUEUE_LENGTH); |
1142 | 1137 | |
1143 | 1138 | dd->irq = -1; |
... | ... | @@ -1246,7 +1241,6 @@ |
1246 | 1241 | for (i = 0; i < ARRAY_SIZE(algs); i++) |
1247 | 1242 | crypto_unregister_ahash(&algs[i]); |
1248 | 1243 | tasklet_kill(&dd->done_task); |
1249 | - tasklet_kill(&dd->queue_task); | |
1250 | 1244 | iounmap(dd->io_base); |
1251 | 1245 | clk_put(dd->iclk); |
1252 | 1246 | omap_sham_dma_cleanup(dd); |