#include "mvm.h"
 #include "fw-api.h"
 
-static void *iwl_mvm_skb_get_hdr(struct sk_buff *skb)
-{
-       struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
-       u8 *data = skb->data;
-
-       /* Alignment concerns */
-       BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he) % 4);
-       BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_he_mu) % 4);
-       BUILD_BUG_ON(sizeof(struct ieee80211_radiotap_lsig) % 4);
-       BUILD_BUG_ON(sizeof(struct ieee80211_vendor_radiotap) % 4);
-
-       if (rx_status->flag & RX_FLAG_RADIOTAP_HE)
-               data += sizeof(struct ieee80211_radiotap_he);
-       if (rx_status->flag & RX_FLAG_RADIOTAP_HE_MU)
-               data += sizeof(struct ieee80211_radiotap_he_mu);
-       if (rx_status->flag & RX_FLAG_RADIOTAP_LSIG)
-               data += sizeof(struct ieee80211_radiotap_lsig);
-       if (rx_status->flag & RX_FLAG_RADIOTAP_VENDOR_DATA) {
-               struct ieee80211_vendor_radiotap *radiotap = (void *)data;
-
-               data += sizeof(*radiotap) + radiotap->len + radiotap->pad;
-       }
-
-       return data;
-}
-
 static inline int iwl_mvm_check_pn(struct iwl_mvm *mvm, struct sk_buff *skb,
                                   int queue, struct ieee80211_sta *sta)
 {
        struct iwl_mvm_sta *mvmsta;
-       struct ieee80211_hdr *hdr = iwl_mvm_skb_get_hdr(skb);
+       struct ieee80211_hdr *hdr = (void *)skb_mac_header(skb);
        struct ieee80211_rx_status *stats = IEEE80211_SKB_RXCB(skb);
        struct iwl_mvm_key_pn *ptk_pn;
        int res;
        if (unlikely(headlen < hdrlen))
                return -EINVAL;
 
+       /* Since data doesn't move data while putting data on skb and that is
+        * the only way we use, data + len is the next place that hdr would be put
+        */
+       skb_set_mac_header(skb, skb->len);
        skb_put_data(skb, hdr, hdrlen);
        skb_put_data(skb, (u8 *)hdr + hdrlen + pad_len, headlen - hdrlen);
 
                            struct iwl_rx_mpdu_desc *desc)
 {
        struct ieee80211_rx_status *rx_status = IEEE80211_SKB_RXCB(skb);
-       struct ieee80211_hdr *hdr = iwl_mvm_skb_get_hdr(skb);
+       struct ieee80211_hdr *hdr = (void *)skb_mac_header(skb);
        struct iwl_mvm_sta *mvm_sta;
        struct iwl_mvm_baid_data *baid_data;
        struct iwl_mvm_reorder_buffer *buffer;
 
        iwl_mvm_rx_fill_status(mvm, skb, &phy_data, queue);
 
+       /* no more radio tap info should be put after this point.
+        *
+        * We mark it as mac header, for upper layers to know where
+        * all radio tap header ends.
+        *
+        * Since data doesn't move data while putting data on skb and that is
+        * the only way we use, data + len is the next place that hdr would be put
+        */
+       skb_set_mac_header(skb, skb->len);
+
        /*
         * Override the nss from the rx_vec since the rate_n_flags has
         * only 2 bits for the nss which gives a max of 4 ss but there