struct iwl_rx_mpdu_desc *desc = (void *)pkt->data;
        unsigned int headlen, fraglen, pad_len = 0;
        unsigned int hdrlen = ieee80211_hdrlen(hdr->frame_control);
+       u8 mic_crc_len = u8_get_bits(desc->mac_flags1,
+                                    IWL_RX_MPDU_MFLG1_MIC_CRC_LEN_MASK) << 1;
 
        if (desc->mac_flags2 & IWL_RX_MPDU_MFLG2_PAD) {
                len -= 2;
                pad_len = 2;
        }
 
+       /*
+        * For non monitor interface strip the bytes the RADA might not have
+        * removed. As monitor interface cannot exist with other interfaces
+        * this removal is safe.
+        */
+       if (mic_crc_len && !ieee80211_hw_check(mvm->hw, RX_INCLUDES_FCS)) {
+               u32 pkt_flags = le32_to_cpu(pkt->len_n_flags);
+
+               /*
+                * If RADA was not enabled then decryption was not performed so
+                * the MIC cannot be removed.
+                */
+               if (!(pkt_flags & FH_RSCSR_RADA_EN)) {
+                       if (WARN_ON(crypt_len > mic_crc_len))
+                               return -EINVAL;
+
+                       mic_crc_len -= crypt_len;
+               }
+
+               if (WARN_ON(mic_crc_len > len))
+                       return -EINVAL;
+
+               len -= mic_crc_len;
+       }
+
        /* If frame is small enough to fit in skb->head, pull it completely.
         * If not, only pull ieee80211_hdr (including crypto if present, and
         * an additional 8 bytes for SNAP/ethertype, see below) so that