unsigned char *input, int err)
 {
        struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+       struct chcr_context *ctx = c_ctx(tfm);
        struct uld_ctx *u_ctx = ULD_CTX(c_ctx(tfm));
        struct ablk_ctx *ablkctx = ABLK_CTX(c_ctx(tfm));
        struct sk_buff *skb;
        chcr_send_wr(skb);
        reqctx->last_req_len = bytes;
        reqctx->processed += bytes;
+       if (get_cryptoalg_subtype(tfm) ==
+               CRYPTO_ALG_SUB_TYPE_CBC && req->base.flags ==
+                       CRYPTO_TFM_REQ_MAY_SLEEP ) {
+               complete(&ctx->cbc_aes_aio_done);
+       }
        return 0;
 unmap:
        chcr_cipher_dma_unmap(&ULD_CTX(c_ctx(tfm))->lldi.pdev->dev, req);
 complete:
+       if (get_cryptoalg_subtype(tfm) ==
+               CRYPTO_ALG_SUB_TYPE_CBC && req->base.flags ==
+                       CRYPTO_TFM_REQ_MAY_SLEEP ) {
+               complete(&ctx->cbc_aes_aio_done);
+       }
        chcr_dec_wrcount(dev);
        req->base.complete(&req->base, err);
        return err;
 static int chcr_aes_encrypt(struct skcipher_request *req)
 {
        struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
+       struct chcr_context *ctx;
        struct chcr_dev *dev = c_ctx(tfm)->dev;
        struct sk_buff *skb = NULL;
        int err, isfull = 0;
        skb->dev = u_ctx->lldi.ports[0];
        set_wr_txq(skb, CPL_PRIORITY_DATA, c_ctx(tfm)->tx_qidx);
        chcr_send_wr(skb);
+       if (get_cryptoalg_subtype(tfm) ==
+               CRYPTO_ALG_SUB_TYPE_CBC && req->base.flags ==
+                       CRYPTO_TFM_REQ_MAY_SLEEP ) {
+                       ctx=c_ctx(tfm);
+                       wait_for_completion(&ctx->cbc_aes_aio_done);
+        }
        return isfull ? -EBUSY : -EINPROGRESS;
 error:
        chcr_dec_wrcount(dev);
                pr_err("failed to allocate fallback for %s\n", alg->base.cra_name);
                return PTR_ERR(ablkctx->sw_cipher);
        }
-
+       init_completion(&ctx->cbc_aes_aio_done);
        crypto_skcipher_set_reqsize(tfm, sizeof(struct chcr_skcipher_req_ctx));
 
        return chcr_device_init(ctx);