skb_pull(skb, sizeof(*tr) - hdrlen);
 }
 
-static inline void mwl8k_add_dma_header(struct sk_buff *skb)
+static void
+mwl8k_add_dma_header(struct sk_buff *skb, int tail_pad)
 {
        struct ieee80211_hdr *wh;
        int hdrlen;
+       int reqd_hdrlen;
        struct mwl8k_dma_data *tr;
 
        /*
        wh = (struct ieee80211_hdr *)skb->data;
 
        hdrlen = ieee80211_hdrlen(wh->frame_control);
-       if (hdrlen != sizeof(*tr))
-               skb_push(skb, sizeof(*tr) - hdrlen);
+       reqd_hdrlen = sizeof(*tr);
+
+       if (hdrlen != reqd_hdrlen)
+               skb_push(skb, reqd_hdrlen - hdrlen);
 
        if (ieee80211_is_data_qos(wh->frame_control))
-               hdrlen -= 2;
+               hdrlen -= IEEE80211_QOS_CTL_LEN;
 
        tr = (struct mwl8k_dma_data *)skb->data;
        if (wh != &tr->wh)
         * payload".  That is, everything except for the 802.11 header.
         * This includes all crypto material including the MIC.
         */
-       tr->fwlen = cpu_to_le16(skb->len - sizeof(*tr));
+       tr->fwlen = cpu_to_le16(skb->len - sizeof(*tr) + tail_pad);
 }
 
 
        else
                qos = 0;
 
-       mwl8k_add_dma_header(skb);
+       mwl8k_add_dma_header(skb, 0);
        wh = &((struct mwl8k_dma_data *)skb->data)->wh;
 
        tx_info = IEEE80211_SKB_CB(skb);