struct safexcel_cipher_req {
        enum safexcel_cipher_direction direction;
+       /* Number of result descriptors associated to the request */
+       unsigned int rdescs;
        bool needs_inv;
 };
 
 
        *ret = 0;
 
-       do {
+       if (unlikely(!sreq->rdescs))
+               return 0;
+
+       while (sreq->rdescs--) {
                rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr);
                if (IS_ERR(rdesc)) {
                        dev_err(priv->dev,
                        *ret = safexcel_rdesc_check_errors(priv, rdesc);
 
                ndesc++;
-       } while (!rdesc->last_seg);
+       }
 
        safexcel_complete(priv, ring);
 
 static int safexcel_handle_inv_result(struct safexcel_crypto_priv *priv,
                                      int ring,
                                      struct crypto_async_request *base,
+                                     struct safexcel_cipher_req *sreq,
                                      bool *should_complete, int *ret)
 {
        struct safexcel_cipher_ctx *ctx = crypto_tfm_ctx(base->tfm);
 
        *ret = 0;
 
-       do {
+       if (unlikely(!sreq->rdescs))
+               return 0;
+
+       while (sreq->rdescs--) {
                rdesc = safexcel_ring_next_rptr(priv, &priv->ring[ring].rdr);
                if (IS_ERR(rdesc)) {
                        dev_err(priv->dev,
                        *ret = safexcel_rdesc_check_errors(priv, rdesc);
 
                ndesc++;
-       } while (!rdesc->last_seg);
+       }
 
        safexcel_complete(priv, ring);
 
 
        if (sreq->needs_inv) {
                sreq->needs_inv = false;
-               err = safexcel_handle_inv_result(priv, ring, async,
+               err = safexcel_handle_inv_result(priv, ring, async, sreq,
                                                 should_complete, ret);
        } else {
                err = safexcel_handle_req_result(priv, ring, async, req->src,
 
        if (sreq->needs_inv) {
                sreq->needs_inv = false;
-               err = safexcel_handle_inv_result(priv, ring, async,
+               err = safexcel_handle_inv_result(priv, ring, async, sreq,
                                                 should_complete, ret);
        } else {
                err = safexcel_handle_req_result(priv, ring, async, req->src,
                ret = safexcel_send_req(async, ring, sreq, req->src,
                                        req->dst, req->cryptlen, 0, 0, req->iv,
                                        commands, results);
+
+       sreq->rdescs = *results;
        return ret;
 }
 
                                        req->cryptlen, req->assoclen,
                                        crypto_aead_authsize(tfm), req->iv,
                                        commands, results);
+       sreq->rdescs = *results;
        return ret;
 }