#include "regs-v5.h"
 #include "sha.h"
 
-#define QCE_SECTOR_SIZE                512
-
 static inline u32 qce_read(struct qce_device *qce, u32 offset)
 {
        return readl(qce->base + offset);
 
 #include <crypto/hash.h>
 #include <crypto/internal/skcipher.h>
 
+/* xts du size */
+#define QCE_SECTOR_SIZE                        512
+
 /* key size in bytes */
 #define QCE_SHA_HMAC_KEY_SIZE          64
 #define QCE_MAX_CIPHER_KEY_SIZE                AES_KEYSIZE_256
 
        rctx->flags |= encrypt ? QCE_ENCRYPT : QCE_DECRYPT;
        keylen = IS_XTS(rctx->flags) ? ctx->enc_keylen >> 1 : ctx->enc_keylen;
 
+       /* qce is hanging when AES-XTS request len > QCE_SECTOR_SIZE and
+        * is not a multiple of it; pass such requests to the fallback
+        */
        if (IS_AES(rctx->flags) &&
-           ((keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_256) ||
-            req->cryptlen <= aes_sw_max_len)) {
+           (((keylen != AES_KEYSIZE_128 && keylen != AES_KEYSIZE_256) ||
+             req->cryptlen <= aes_sw_max_len) ||
+            (IS_XTS(rctx->flags) && req->cryptlen > QCE_SECTOR_SIZE &&
+             req->cryptlen % QCE_SECTOR_SIZE))) {
                SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, ctx->fallback);
 
                skcipher_request_set_sync_tfm(subreq, ctx->fallback);