diff options
author | Zain Wang <wzz@rock-chips.com> | 2017-08-15 09:48:15 +0200 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-08-22 08:54:54 +0200 |
commit | 5a7801f6634b1e2888bcb1a85bedc50e46dcd757 (patch) | |
tree | 8ce1aca11dfb13223b75f49efcdba7303e8c6805 /drivers/crypto/rockchip/rk3288_crypto.h | |
parent | crypto: cavium - add release_firmware to all return case (diff) | |
download | linux-5a7801f6634b1e2888bcb1a85bedc50e46dcd757.tar.xz linux-5a7801f6634b1e2888bcb1a85bedc50e46dcd757.zip |
crypto: rockchip - Don't dequeue the request when device is busy
The device can only process one request at a time. So if multiple
requests came at the same time, we can enqueue them first, and
dequeue them one by one when the device is idle.
Signed-off-by: zain wang <wzz@rock-chips.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/rockchip/rk3288_crypto.h')
-rw-r--r-- | drivers/crypto/rockchip/rk3288_crypto.h | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/crypto/rockchip/rk3288_crypto.h b/drivers/crypto/rockchip/rk3288_crypto.h index 65ad1c261949..ab6a1b4c40f0 100644 --- a/drivers/crypto/rockchip/rk3288_crypto.h +++ b/drivers/crypto/rockchip/rk3288_crypto.h @@ -192,8 +192,7 @@ struct rk_crypto_info { struct crypto_queue queue; struct tasklet_struct queue_task; struct tasklet_struct done_task; - struct ablkcipher_request *ablk_req; - struct ahash_request *ahash_req; + struct crypto_async_request *async_req; int err; /* device lock */ spinlock_t lock; @@ -210,18 +209,20 @@ struct rk_crypto_info { size_t nents; unsigned int total; unsigned int count; - u32 mode; dma_addr_t addr_in; dma_addr_t addr_out; + bool busy; int (*start)(struct rk_crypto_info *dev); int (*update)(struct rk_crypto_info *dev); - void (*complete)(struct rk_crypto_info *dev, int err); + void (*complete)(struct crypto_async_request *base, int err); int (*enable_clk)(struct rk_crypto_info *dev); void (*disable_clk)(struct rk_crypto_info *dev); int (*load_data)(struct rk_crypto_info *dev, struct scatterlist *sg_src, struct scatterlist *sg_dst); void (*unload_data)(struct rk_crypto_info *dev); + int (*enqueue)(struct rk_crypto_info *dev, + struct crypto_async_request *async_req); }; /* the private variable of hash */ @@ -234,12 +235,14 @@ struct rk_ahash_ctx { /* the privete variable of hash for fallback */ struct rk_ahash_rctx { struct ahash_request fallback_req; + u32 mode; }; /* the private variable of cipher */ struct rk_cipher_ctx { struct rk_crypto_info *dev; unsigned int keylen; + u32 mode; }; enum alg_type { |