/* Get final MAC result */
        hw_desc_init(&desc[idx]);
-       set_cipher_mode(&desc[idx], ctx->hw_mode);
+       set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
        /* TODO */
        set_dout_dlli(&desc[idx], state->digest_result_dma_addr, digestsize,
                      NS_BIT, 1);
         * digest
         */
        hw_desc_init(&desc[idx]);
-       set_cipher_mode(&desc[idx], ctx->hw_mode);
+       set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
        if (is_hmac) {
                set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
                             ctx->inter_digestsize, NS_BIT);
 
        /* Load the hash current length */
        hw_desc_init(&desc[idx]);
-       set_cipher_mode(&desc[idx], ctx->hw_mode);
+       set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
 
        if (is_hmac) {
                set_din_type(&desc[idx], DMA_DLLI,
 {
        /* Restore hash digest */
        hw_desc_init(&desc[idx]);
-       set_cipher_mode(&desc[idx], ctx->hw_mode);
+       set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
        set_din_type(&desc[idx], DMA_DLLI, state->digest_buff_dma_addr,
                     ctx->inter_digestsize, NS_BIT);
        set_flow_mode(&desc[idx], S_DIN_to_HASH);
 
        /* Restore hash current length */
        hw_desc_init(&desc[idx]);
-       set_cipher_mode(&desc[idx], ctx->hw_mode);
+       set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
        set_cipher_config1(&desc[idx], HASH_PADDING_DISABLED);
        set_din_type(&desc[idx], DMA_DLLI, state->digest_bytes_len_dma_addr,
                     ctx->hash_len, NS_BIT);
 
        /* store the hash digest result in context */
        hw_desc_init(&desc[idx]);
-       set_cipher_mode(&desc[idx], ctx->hw_mode);
+       set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
        set_dout_dlli(&desc[idx], state->digest_buff_dma_addr,
                      ctx->inter_digestsize, NS_BIT, 0);
        set_flow_mode(&desc[idx], S_HASH_to_DOUT);
 
        /* store current hash length in context */
        hw_desc_init(&desc[idx]);
-       set_cipher_mode(&desc[idx], ctx->hw_mode);
+       set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
        set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
                      ctx->hash_len, NS_BIT, 1);
        set_queue_last_ind(ctx->drvdata, &desc[idx]);
        /* Pad the hash */
        hw_desc_init(&desc[idx]);
        set_cipher_do(&desc[idx], DO_PAD);
-       set_cipher_mode(&desc[idx], ctx->hw_mode);
+       set_hash_cipher_mode(&desc[idx], ctx->hw_mode, ctx->hash_mode);
        set_dout_dlli(&desc[idx], state->digest_bytes_len_dma_addr,
                      ctx->hash_len, NS_BIT, 0);
        set_setup_mode(&desc[idx], SETUP_WRITE_STATE1);
                                            XCBC_MAC_K1_OFFSET),
                     CC_AES_128_BIT_KEY_SIZE, NS_BIT);
        set_setup_mode(&desc[idx], SETUP_LOAD_KEY0);
-       set_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC);
+       set_hash_cipher_mode(&desc[idx], DRV_CIPHER_XCBC_MAC, ctx->hash_mode);
        set_cipher_config0(&desc[idx], DESC_DIRECTION_ENCRYPT_ENCRYPT);
        set_key_size_aes(&desc[idx], CC_AES_128_BIT_KEY_SIZE);
        set_flow_mode(&desc[idx], S_DIN_to_AES);