R(RX_DROP_U_MIC_FAIL)                   \
        R(RX_DROP_U_REPLAY)                     \
        R(RX_DROP_U_BAD_MMIE)                   \
+       R(RX_DROP_U_DUP)                        \
+       R(RX_DROP_U_SPURIOUS)                   \
+       R(RX_DROP_U_DECRYPT_FAIL)               \
+       R(RX_DROP_U_NO_KEY_ID)                  \
+       R(RX_DROP_U_BAD_CIPHER)                 \
+       R(RX_DROP_U_OOM)                        \
+       R(RX_DROP_U_NONSEQ_PN)                  \
+       R(RX_DROP_U_BAD_KEY_COLOR)              \
+       R(RX_DROP_U_BAD_4ADDR)                  \
+       R(RX_DROP_U_BAD_AMSDU)                  \
+       R(RX_DROP_U_BAD_AMSDU_CIPHER)           \
+       R(RX_DROP_U_INVALID_8023)               \
+       R(RX_DROP_U_RUNT_ACTION)                \
+       R(RX_DROP_U_UNPROT_ACTION)              \
+       R(RX_DROP_U_ACTION_UNKNOWN_SRC)         \
+       R(RX_DROP_U_REJECTED_ACTION_RESPONSE)   \
+       R(RX_DROP_U_EXPECT_DEFRAG_PROT)         \
+       R(RX_DROP_U_WEP_DEC_FAIL)               \
+       R(RX_DROP_U_NO_IV)                      \
+       R(RX_DROP_U_NO_ICV)                     \
+       R(RX_DROP_U_AP_RX_GROUPCAST)            \
+       R(RX_DROP_U_SHORT_MMIC)                 \
+       R(RX_DROP_U_MMIC_FAIL)                  \
+       R(RX_DROP_U_SHORT_TKIP)                 \
+       R(RX_DROP_U_TKIP_FAIL)                  \
+       R(RX_DROP_U_SHORT_CCMP)                 \
+       R(RX_DROP_U_SHORT_CCMP_MIC)             \
+       R(RX_DROP_U_SHORT_GCMP)                 \
+       R(RX_DROP_U_SHORT_GCMP_MIC)             \
+       R(RX_DROP_U_SHORT_CMAC)                 \
+       R(RX_DROP_U_SHORT_CMAC256)              \
+       R(RX_DROP_U_SHORT_GMAC)                 \
 /* this line for the trailing \ - add before this */
 
 /* having two enums allows for checking ieee80211_rx_result use with sparse */
        RX_CONTINUE      = (__force ieee80211_rx_result)___RX_CONTINUE,
        RX_QUEUED        = (__force ieee80211_rx_result)___RX_QUEUED,
        RX_DROP_MONITOR  = (__force ieee80211_rx_result)___RX_DROP_MONITOR,
-       RX_DROP_UNUSABLE = (__force ieee80211_rx_result)___RX_DROP_UNUSABLE,
 #define DEF(x) x = (__force ieee80211_rx_result)___ ## x,
        MAC80211_DROP_REASONS_MONITOR(DEF)
        MAC80211_DROP_REASONS_UNUSABLE(DEF)
 
                     rx->sta->last_seq_ctrl[rx->seqno_idx] == hdr->seq_ctrl)) {
                I802_DEBUG_INC(rx->local->dot11FrameDuplicateCount);
                rx->link_sta->rx_stats.num_duplicates++;
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_DUP;
        } else if (!(status->flag & RX_FLAG_AMSDU_MORE)) {
                rx->sta->last_seq_ctrl[rx->seqno_idx] = hdr->seq_ctrl;
        }
                    cfg80211_rx_spurious_frame(rx->sdata->dev,
                                               hdr->addr2,
                                               GFP_ATOMIC))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_SPURIOUS;
 
                return RX_DROP_MONITOR;
        }
        struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
        struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
        int keyidx;
-       ieee80211_rx_result result = RX_DROP_UNUSABLE;
+       ieee80211_rx_result result = RX_DROP_U_DECRYPT_FAIL;
        struct ieee80211_key *sta_ptk = NULL;
        struct ieee80211_key *ptk_idx = NULL;
        int mmie_keyidx = -1;
                        keyid = ieee80211_get_keyid(rx->skb);
 
                        if (unlikely(keyid < 0))
-                               return RX_DROP_UNUSABLE;
+                               return RX_DROP_U_NO_KEY_ID;
 
                        ptk_idx = rcu_dereference(rx->sta->ptk[keyid]);
                }
                keyidx = ieee80211_get_keyid(rx->skb);
 
                if (unlikely(keyidx < 0))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_NO_KEY_ID;
 
                /* check per-station GTK first, if multicast packet */
                if (is_multicast_ether_addr(hdr->addr1) && rx->link_sta)
                result = ieee80211_crypto_gcmp_decrypt(rx);
                break;
        default:
-               result = RX_DROP_UNUSABLE;
+               result = RX_DROP_U_BAD_CIPHER;
        }
 
        /* the hdr variable is invalid after the decrypt handlers */
        I802_DEBUG_INC(rx->local->rx_handlers_fragments);
 
        if (skb_linearize(rx->skb))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_OOM;
 
        /*
         *  skb_linearize() might change the skb->data and
                u8 pn[IEEE80211_CCMP_PN_LEN], *rpn;
 
                if (!requires_sequential_pn(rx, fc))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_NONSEQ_PN;
 
                /* Prevent mixed key and fragment cache attacks */
                if (entry->key_color != rx->key->color)
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_BAD_KEY_COLOR;
 
                memcpy(pn, entry->last_pn, IEEE80211_CCMP_PN_LEN);
                for (i = IEEE80211_CCMP_PN_LEN - 1; i >= 0; i--) {
 
                rpn = rx->ccm_gcm.pn;
                if (memcmp(pn, rpn, IEEE80211_CCMP_PN_LEN))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_REPLAY;
                memcpy(entry->last_pn, pn, IEEE80211_CCMP_PN_LEN);
        } else if (entry->is_protected &&
                   (!rx->key ||
                 * if for TKIP Michael MIC should protect us, and WEP is a
                 * lost cause anyway.
                 */
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_EXPECT_DEFRAG_PROT;
        } else if (entry->is_protected && rx->key &&
                   entry->key_color != rx->key->color &&
                   (status->flag & RX_FLAG_DECRYPTED)) {
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_BAD_KEY_COLOR;
        }
 
        skb_pull(rx->skb, ieee80211_hdrlen(fc));
                                              GFP_ATOMIC))) {
                        I802_DEBUG_INC(rx->local->rx_handlers_drop_defrag);
                        __skb_queue_purge(&entry->skb_list);
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_OOM;
                }
        }
        while ((skb = __skb_dequeue(&entry->skb_list))) {
                skb = NULL;
 
                if (skb_cow_head(fwd_skb, hdrlen - sizeof(struct ethhdr)))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_OOM;
 
                if (skb_linearize(fwd_skb))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_OOM;
        }
 
        fwd_hdr = skb_push(fwd_skb, hdrlen - sizeof(struct ethhdr));
                                          rx->sdata->vif.addr,
                                          rx->sdata->vif.type,
                                          data_offset, true))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_BAD_AMSDU;
 
        if (rx->sta->amsdu_mesh_control < 0) {
                s8 valid = -1;
                switch (rx->sdata->vif.type) {
                case NL80211_IFTYPE_AP_VLAN:
                        if (!rx->sdata->u.vlan.sta)
-                               return RX_DROP_UNUSABLE;
+                               return RX_DROP_U_BAD_4ADDR;
                        break;
                case NL80211_IFTYPE_STATION:
                        if (!rx->sdata->u.mgd.use_4addr)
-                               return RX_DROP_UNUSABLE;
+                               return RX_DROP_U_BAD_4ADDR;
                        break;
                case NL80211_IFTYPE_MESH_POINT:
                        break;
                default:
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_BAD_4ADDR;
                }
        }
 
        if (is_multicast_ether_addr(hdr->addr1) || !rx->sta)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_BAD_AMSDU;
 
        if (rx->key) {
                /*
                case WLAN_CIPHER_SUITE_WEP40:
                case WLAN_CIPHER_SUITE_WEP104:
                case WLAN_CIPHER_SUITE_TKIP:
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_BAD_AMSDU_CIPHER;
                default:
                        break;
                }
 
        err = __ieee80211_data_to_8023(rx, &port_control);
        if (unlikely(err))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_INVALID_8023;
 
        res = ieee80211_rx_mesh_data(rx->sdata, rx->sta, rx->skb);
        if (res != RX_CONTINUE)
        /* drop too small action frames */
        if (ieee80211_is_action(mgmt->frame_control) &&
            rx->skb->len < IEEE80211_MIN_ACTION_SIZE)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_RUNT_ACTION;
 
        if (rx->sdata->vif.type == NL80211_IFTYPE_AP &&
            ieee80211_is_beacon(mgmt->frame_control) &&
        }
 
        if (ieee80211_drop_unencrypted_mgmt(rx))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_UNPROT_ACTION;
 
        return RX_CONTINUE;
 }
        if (!rx->sta && mgmt->u.action.category != WLAN_CATEGORY_PUBLIC &&
            mgmt->u.action.category != WLAN_CATEGORY_SELF_PROTECTED &&
            mgmt->u.action.category != WLAN_CATEGORY_SPECTRUM_MGMT)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_ACTION_UNKNOWN_SRC;
 
        switch (mgmt->u.action.category) {
        case WLAN_CATEGORY_HT:
 
        /* do not return rejected action frames */
        if (mgmt->u.action.category & 0x80)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_REJECTED_ACTION_RESPONSE;
 
        nskb = skb_copy_expand(rx->skb, local->hw.extra_tx_headroom, 0,
                               GFP_ATOMIC);
 
  * Software WEP encryption implementation
  * Copyright 2002, Jouni Malinen <jkmaline@cc.hut.fi>
  * Copyright 2003, Instant802 Networks, Inc.
+ * Copyright (C) 2023 Intel Corporation
  */
 
 #include <linux/netdevice.h>
 
        if (!(status->flag & RX_FLAG_DECRYPTED)) {
                if (skb_linearize(rx->skb))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_OOM;
                if (ieee80211_wep_decrypt(rx->local, rx->skb, rx->key))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_WEP_DEC_FAIL;
        } else if (!(status->flag & RX_FLAG_IV_STRIPPED)) {
                if (!pskb_may_pull(rx->skb, ieee80211_hdrlen(fc) +
                                            IEEE80211_WEP_IV_LEN))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_NO_IV;
                ieee80211_wep_remove_iv(rx->local, rx->skb, rx->key);
                /* remove ICV */
                if (!(status->flag & RX_FLAG_ICV_STRIPPED) &&
                    pskb_trim(rx->skb, rx->skb->len - IEEE80211_WEP_ICV_LEN))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_NO_ICV;
        }
 
        return RX_CONTINUE;
 
  * Copyright 2002-2004, Instant802 Networks, Inc.
  * Copyright 2008, Jouni Malinen <j@w1.fi>
  * Copyright (C) 2016-2017 Intel Deutschland GmbH
- * Copyright (C) 2020-2022 Intel Corporation
+ * Copyright (C) 2020-2023 Intel Corporation
  */
 
 #include <linux/netdevice.h>
                 * group keys and only the AP is sending real multicast
                 * frames in the BSS.
                 */
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_AP_RX_GROUPCAST;
        }
 
        if (status->flag & RX_FLAG_MMIC_ERROR)
 
        hdrlen = ieee80211_hdrlen(hdr->frame_control);
        if (skb->len < hdrlen + MICHAEL_MIC_LEN)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_MMIC;
 
        if (skb_linearize(rx->skb))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_OOM;
        hdr = (void *)skb->data;
 
        data = skb->data + hdrlen;
                                     NL80211_KEYTYPE_PAIRWISE,
                                     rx->key ? rx->key->conf.keyidx : -1,
                                     NULL, GFP_ATOMIC);
-       return RX_DROP_UNUSABLE;
+       return RX_DROP_U_MMIC_FAIL;
 }
 
 static int tkip_encrypt_skb(struct ieee80211_tx_data *tx, struct sk_buff *skb)
                return RX_CONTINUE;
 
        if (!rx->sta || skb->len - hdrlen < 12)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_TKIP;
 
        /* it may be possible to optimize this a bit more */
        if (skb_linearize(rx->skb))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_OOM;
        hdr = (void *)skb->data;
 
        /*
                                          &rx->tkip.iv32,
                                          &rx->tkip.iv16);
        if (res != TKIP_DECRYPT_OK)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_TKIP_FAIL;
 
        /* Trim ICV */
        if (!(status->flag & RX_FLAG_ICV_STRIPPED))
 
        if (status->flag & RX_FLAG_DECRYPTED) {
                if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_CCMP_HDR_LEN))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_SHORT_CCMP;
                if (status->flag & RX_FLAG_MIC_STRIPPED)
                        mic_len = 0;
        } else {
                if (skb_linearize(rx->skb))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_OOM;
        }
 
        /* reload hdr - skb might have been reallocated */
 
        data_len = skb->len - hdrlen - IEEE80211_CCMP_HDR_LEN - mic_len;
        if (!rx->sta || data_len < 0)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_CCMP;
 
        if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
                int res;
 
        /* Remove CCMP header and MIC */
        if (pskb_trim(skb, skb->len - mic_len))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_CCMP_MIC;
        memmove(skb->data + IEEE80211_CCMP_HDR_LEN, skb->data, hdrlen);
        skb_pull(skb, IEEE80211_CCMP_HDR_LEN);
 
 
        if (status->flag & RX_FLAG_DECRYPTED) {
                if (!pskb_may_pull(rx->skb, hdrlen + IEEE80211_GCMP_HDR_LEN))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_SHORT_GCMP;
                if (status->flag & RX_FLAG_MIC_STRIPPED)
                        mic_len = 0;
        } else {
                if (skb_linearize(rx->skb))
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_OOM;
        }
 
        /* reload hdr - skb might have been reallocated */
 
        data_len = skb->len - hdrlen - IEEE80211_GCMP_HDR_LEN - mic_len;
        if (!rx->sta || data_len < 0)
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_GCMP;
 
        if (!(status->flag & RX_FLAG_PN_VALIDATED)) {
                int res;
 
        /* Remove GCMP header and MIC */
        if (pskb_trim(skb, skb->len - mic_len))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_GCMP_MIC;
        memmove(skb->data + IEEE80211_GCMP_HDR_LEN, skb->data, hdrlen);
        skb_pull(skb, IEEE80211_GCMP_HDR_LEN);
 
        /* management frames are already linear */
 
        if (skb->len < 24 + sizeof(*mmie))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_CMAC;
 
        mmie = (struct ieee80211_mmie *)
                (skb->data + skb->len - sizeof(*mmie));
        /* management frames are already linear */
 
        if (skb->len < 24 + sizeof(*mmie))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_CMAC256;
 
        mmie = (struct ieee80211_mmie_16 *)
                (skb->data + skb->len - sizeof(*mmie));
        if (mmie->element_id != WLAN_EID_MMIE ||
            mmie->length != sizeof(*mmie) - 2)
-               return RX_DROP_UNUSABLE; /* Invalid MMIE */
+               return RX_DROP_U_BAD_MMIE; /* Invalid MMIE */
 
        bip_ipn_swap(ipn, mmie->sequence_number);
 
        /* management frames are already linear */
 
        if (skb->len < 24 + sizeof(*mmie))
-               return RX_DROP_UNUSABLE;
+               return RX_DROP_U_SHORT_GMAC;
 
        mmie = (struct ieee80211_mmie_16 *)
                (skb->data + skb->len - sizeof(*mmie));
 
                mic = kmalloc(GMAC_MIC_LEN, GFP_ATOMIC);
                if (!mic)
-                       return RX_DROP_UNUSABLE;
+                       return RX_DROP_U_OOM;
                if (ieee80211_aes_gmac(key->u.aes_gmac.tfm, aad, nonce,
                                       skb->data + 24, skb->len - 24,
                                       mic) < 0 ||