#include <asm/neon.h>
 #include <asm/simd.h>
 #include <crypto/aes.h>
-#include <crypto/cbc.h>
 #include <crypto/ctr.h>
 #include <crypto/internal/simd.h>
 #include <crypto/internal/skcipher.h>
 
 struct aesbs_cbc_ctx {
        struct aesbs_ctx        key;
-       struct crypto_cipher    *enc_tfm;
+       struct crypto_skcipher  *enc_tfm;
 };
 
 struct aesbs_xts_ctx {
        kernel_neon_end();
        memzero_explicit(&rk, sizeof(rk));
 
-       return crypto_cipher_setkey(ctx->enc_tfm, in_key, key_len);
+       return crypto_skcipher_setkey(ctx->enc_tfm, in_key, key_len);
 }
 
-static void cbc_encrypt_one(struct crypto_skcipher *tfm, const u8 *src, u8 *dst)
+static int cbc_encrypt(struct skcipher_request *req)
 {
+       struct skcipher_request *subreq = skcipher_request_ctx(req);
+       struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
        struct aesbs_cbc_ctx *ctx = crypto_skcipher_ctx(tfm);
 
-       crypto_cipher_encrypt_one(ctx->enc_tfm, dst, src);
-}
+       skcipher_request_set_tfm(subreq, ctx->enc_tfm);
+       skcipher_request_set_callback(subreq,
+                                     skcipher_request_flags(req),
+                                     NULL, NULL);
+       skcipher_request_set_crypt(subreq, req->src, req->dst,
+                                  req->cryptlen, req->iv);
 
-static int cbc_encrypt(struct skcipher_request *req)
-{
-       return crypto_cbc_encrypt_walk(req, cbc_encrypt_one);
+       return crypto_skcipher_encrypt(subreq);
 }
 
 static int cbc_decrypt(struct skcipher_request *req)
        return err;
 }
 
-static int cbc_init(struct crypto_tfm *tfm)
+static int cbc_init(struct crypto_skcipher *tfm)
 {
-       struct aesbs_cbc_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct aesbs_cbc_ctx *ctx = crypto_skcipher_ctx(tfm);
+       unsigned int reqsize;
+
+       ctx->enc_tfm = crypto_alloc_skcipher("cbc(aes)", 0, CRYPTO_ALG_ASYNC);
+       if (IS_ERR(ctx->enc_tfm))
+               return PTR_ERR(ctx->enc_tfm);
 
-       ctx->enc_tfm = crypto_alloc_cipher("aes", 0, 0);
+       reqsize = sizeof(struct skcipher_request);
+       reqsize += crypto_skcipher_reqsize(ctx->enc_tfm);
+       crypto_skcipher_set_reqsize(tfm, reqsize);
 
-       return PTR_ERR_OR_ZERO(ctx->enc_tfm);
+       return 0;
 }
 
-static void cbc_exit(struct crypto_tfm *tfm)
+static void cbc_exit(struct crypto_skcipher *tfm)
 {
-       struct aesbs_cbc_ctx *ctx = crypto_tfm_ctx(tfm);
+       struct aesbs_cbc_ctx *ctx = crypto_skcipher_ctx(tfm);
 
-       crypto_free_cipher(ctx->enc_tfm);
+       crypto_free_skcipher(ctx->enc_tfm);
 }
 
 static int aesbs_ctr_setkey_sync(struct crypto_skcipher *tfm, const u8 *in_key,
        .base.cra_ctxsize       = sizeof(struct aesbs_cbc_ctx),
        .base.cra_module        = THIS_MODULE,
        .base.cra_flags         = CRYPTO_ALG_INTERNAL,
-       .base.cra_init          = cbc_init,
-       .base.cra_exit          = cbc_exit,
 
        .min_keysize            = AES_MIN_KEY_SIZE,
        .max_keysize            = AES_MAX_KEY_SIZE,
        .setkey                 = aesbs_cbc_setkey,
        .encrypt                = cbc_encrypt,
        .decrypt                = cbc_decrypt,
+       .init                   = cbc_init,
+       .exit                   = cbc_exit,
 }, {
        .base.cra_name          = "__ctr(aes)",
        .base.cra_driver_name   = "__ctr-aes-neonbs",