staging: rtl8723au: Get rid of ClearMFrag/SetMFrag
[firefly-linux-kernel-4.4.55.git] / drivers / staging / rtl8723au / core / rtw_xmit.c
index 0f10cfa10d39e42c93af988ee1a3d6c89dc0a559..a75ca65e76e6564110ce242bf66e2168931f7012 100644 (file)
@@ -20,6 +20,7 @@
 #include <osdep_intf.h>
 #include <linux/ip.h>
 #include <usb_ops.h>
+#include <rtl8723a_xmit.h>
 
 static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
 static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
@@ -50,27 +51,21 @@ void        _rtw_init_sta_xmit_priv23a(struct sta_xmit_priv *psta_xmitpriv)
 
 }
 
-s32    _rtw_init_xmit_priv23a(struct xmit_priv *pxmitpriv, struct rtw_adapter *padapter)
+int _rtw_init_xmit_priv23a(struct xmit_priv *pxmitpriv,
+                          struct rtw_adapter *padapter)
 {
        int i;
        struct xmit_buf *pxmitbuf;
        struct xmit_frame *pxframe;
-       int     res = _SUCCESS;
+       int res = _SUCCESS;
        u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
        u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
 
-       /*  We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */
-       /* memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv)); */
-
        spin_lock_init(&pxmitpriv->lock);
        spin_lock_init(&pxmitpriv->lock_sctx);
        sema_init(&pxmitpriv->xmit_sema, 0);
        sema_init(&pxmitpriv->terminate_xmitthread_sema, 0);
 
-       /*
-       Please insert all the queue initializaiton using _rtw_init_queue23a below
-       */
-
        pxmitpriv->adapter = padapter;
 
        _rtw_init_queue23a(&pxmitpriv->be_pending);
@@ -81,42 +76,21 @@ s32 _rtw_init_xmit_priv23a(struct xmit_priv *pxmitpriv, struct rtw_adapter *pada
 
        _rtw_init_queue23a(&pxmitpriv->free_xmit_queue);
 
-       /*
-       Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
-       and initialize free_xmit_frame below.
-       Please also apply  free_txobj to link_up all the xmit_frames...
-       */
-
-       pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
-
-       if (pxmitpriv->pallocated_frame_buf  == NULL) {
-               pxmitpriv->pxmit_frame_buf = NULL;
-               RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("alloc xmit_frame fail!\n"));
-               res = _FAIL;
-               goto exit;
-       }
-       pxmitpriv->pxmit_frame_buf = PTR_ALIGN(pxmitpriv->pallocated_frame_buf, 4);
-
-       pxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
-
        for (i = 0; i < NR_XMITFRAME; i++) {
+               pxframe = (struct xmit_frame *)
+                       kzalloc(sizeof(struct xmit_frame), GFP_KERNEL);
+               if (!pxframe)
+                       break;
                INIT_LIST_HEAD(&pxframe->list);
 
                pxframe->padapter = padapter;
                pxframe->frame_tag = NULL_FRAMETAG;
 
-               pxframe->pkt = NULL;
-
-               pxframe->buf_addr = NULL;
-               pxframe->pxmitbuf = NULL;
-
                list_add_tail(&pxframe->list,
                              &pxmitpriv->free_xmit_queue.queue);
-
-               pxframe++;
        }
 
-       pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;
+       pxmitpriv->free_xmitframe_cnt = i;
 
        pxmitpriv->frag_len = MAX_FRAG_THRESHOLD;
 
@@ -152,18 +126,11 @@ s32       _rtw_init_xmit_priv23a(struct xmit_priv *pxmitpriv, struct rtw_adapter *pada
        /* init xframe_ext queue,  the same count as extbuf  */
        _rtw_init_queue23a(&pxmitpriv->free_xframe_ext_queue);
 
-       pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_frame) + 4);
-
-       if (pxmitpriv->xframe_ext_alloc_addr  == NULL) {
-               pxmitpriv->xframe_ext = NULL;
-               RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("alloc xframe_ext fail!\n"));
-               res = _FAIL;
-               goto exit;
-       }
-       pxmitpriv->xframe_ext = PTR_ALIGN(pxmitpriv->xframe_ext_alloc_addr, 4);
-       pxframe = (struct xmit_frame*)pxmitpriv->xframe_ext;
-
        for (i = 0; i < num_xmit_extbuf; i++) {
+               pxframe = (struct xmit_frame *)
+                       kzalloc(sizeof(struct xmit_frame), GFP_KERNEL);
+               if (!pxframe)
+                       break;
                INIT_LIST_HEAD(&pxframe->list);
 
                pxframe->padapter = padapter;
@@ -178,10 +145,8 @@ s32        _rtw_init_xmit_priv23a(struct xmit_priv *pxmitpriv, struct rtw_adapter *pada
 
                list_add_tail(&pxframe->list,
                              &pxmitpriv->free_xframe_ext_queue.queue);
-
-               pxframe++;
        }
-       pxmitpriv->free_xframe_ext_cnt = num_xmit_extbuf;
+       pxmitpriv->free_xframe_ext_cnt = i;
 
        /*  Init xmit extension buff */
        _rtw_init_queue23a(&pxmitpriv->free_xmit_extbuf_queue);
@@ -230,7 +195,9 @@ s32 _rtw_init_xmit_priv23a(struct xmit_priv *pxmitpriv, struct rtw_adapter *pada
        pxmitpriv->ack_tx = false;
        mutex_init(&pxmitpriv->ack_tx_mutex);
        rtw_sctx_init23a(&pxmitpriv->ack_tx_ops, 0);
-       rtw_hal_init23a_xmit_priv(padapter);
+       tasklet_init(&padapter->xmitpriv.xmit_tasklet,
+                    (void(*)(unsigned long))rtl8723au_xmit_tasklet,
+                    (unsigned long)padapter);
 
 exit:
 
@@ -242,19 +209,15 @@ fail:
 void _rtw_free_xmit_priv23a (struct xmit_priv *pxmitpriv)
 {
        struct rtw_adapter *padapter = pxmitpriv->adapter;
-       struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
+       struct xmit_frame *pxframe;
        struct xmit_buf *pxmitbuf;
        struct list_head *plist, *ptmp;
-       u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
-       int i;
-
-       rtw_hal_free_xmit_priv23a(padapter);
 
-       if (pxmitpriv->pxmit_frame_buf == NULL)
-               return;
-       for (i = 0; i < NR_XMITFRAME; i++) {
-               rtw_os_xmit_complete23a(padapter, pxmitframe);
-               pxmitframe++;
+       list_for_each_safe(plist, ptmp, &pxmitpriv->free_xmit_queue.queue) {
+               pxframe = container_of(plist, struct xmit_frame, list);
+               list_del_init(&pxframe->list);
+               rtw_os_xmit_complete23a(padapter, pxframe);
+               kfree(pxframe);
        }
 
        list_for_each_safe(plist, ptmp, &pxmitpriv->xmitbuf_list) {
@@ -264,19 +227,14 @@ void _rtw_free_xmit_priv23a (struct xmit_priv *pxmitpriv)
                kfree(pxmitbuf);
        }
 
-       if (pxmitpriv->pallocated_frame_buf) {
-               rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
-       }
-
        /* free xframe_ext queue,  the same count as extbuf  */
-       if ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) {
-               for (i = 0; i<num_xmit_extbuf; i++) {
-                       rtw_os_xmit_complete23a(padapter, pxmitframe);
-                       pxmitframe++;
-               }
+       list_for_each_safe(plist, ptmp,
+                          &pxmitpriv->free_xframe_ext_queue.queue) {
+               pxframe = container_of(plist, struct xmit_frame, list);
+               list_del_init(&pxframe->list);
+               rtw_os_xmit_complete23a(padapter, pxframe);
+               kfree(pxframe);
        }
-       if (pxmitpriv->xframe_ext_alloc_addr)
-               rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, num_xmit_extbuf * sizeof(struct xmit_frame) + 4);
 
        /*  free xmit extension buff */
        list_for_each_safe(plist, ptmp, &pxmitpriv->xmitextbuf_list) {
@@ -338,9 +296,10 @@ static void update_attrib_vcs_info(struct rtw_adapter *padapter, struct xmit_fra
        } else {
                while (true) {
                        /* IOT action */
-                       if ((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) &&
-                           (pattrib->ampdu_en) &&
-                           (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)) {
+                       if (pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS &&
+                           pattrib->ampdu_en &&
+                           padapter->securitypriv.dot11PrivacyAlgrthm ==
+                           WLAN_CIPHER_SUITE_CCMP) {
                                pattrib->vcs_mode = CTS_TO_SELF;
                                break;
                        }
@@ -437,27 +396,24 @@ u8 qos_acm23a(u8 acm_mask, u8 priority)
        default:
                DBG_8723A("qos_acm23a(): invalid pattrib->priority: %d!!!\n",
                          priority);
+               change_priority = 0;
                break;
        }
 
        return change_priority;
 }
 
-static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
+static void set_qos(struct sk_buff *skb, struct pkt_attrib *pattrib)
 {
-       struct ethhdr etherhdr;
-       struct iphdr ip_hdr;
-       s32 UserPriority = 0;
-
-       _rtw_open_pktfile23a(ppktfile->pkt, ppktfile);
-       _rtw_pktfile_read23a(ppktfile, (unsigned char*)&etherhdr, ETH_HLEN);
+       u8 *pframe = skb->data;
+       struct iphdr *ip_hdr;
+       u8 UserPriority = 0;
 
        /*  get UserPriority from IP hdr */
-       if (pattrib->ether_type == 0x0800) {
-               _rtw_pktfile_read23a(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr));
-/*             UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3; */
-               UserPriority = ip_hdr.tos >> 5;
-       } else if (pattrib->ether_type == 0x888e) {
+       if (pattrib->ether_type == ETH_P_IP) {
+               ip_hdr = (struct iphdr *)(pframe + ETH_HLEN);
+               UserPriority = ip_hdr->tos >> 5;
+       } else if (pattrib->ether_type == ETH_P_PAE) {
                /*  "When priority processing of data frames is supported, */
                /*  a STA's SME should send EAPOL-Key frames at the highest
                    priority." */
@@ -469,58 +425,53 @@ static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
        pattrib->subtype = WIFI_QOS_DATA_TYPE;
 }
 
-static s32 update_attrib(struct rtw_adapter *padapter,
-                        struct sk_buff *pkt, struct pkt_attrib *pattrib)
+static int update_attrib(struct rtw_adapter *padapter,
+                        struct sk_buff *skb, struct pkt_attrib *pattrib)
 {
-       uint i;
-       struct pkt_file pktfile;
        struct sta_info *psta = NULL;
-       struct ethhdr etherhdr;
-
        int bmcast;
        struct sta_priv *pstapriv = &padapter->stapriv;
        struct security_priv *psecuritypriv = &padapter->securitypriv;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct qos_priv *pqospriv = &pmlmepriv->qospriv;
        int res = _SUCCESS;
+       struct ethhdr *ehdr = (struct ethhdr *) skb->data;
 
-       _rtw_open_pktfile23a(pkt, &pktfile);
-       i = _rtw_pktfile_read23a(&pktfile, (u8*)&etherhdr, ETH_HLEN);
+       pattrib->ether_type = ntohs(ehdr->h_proto);
 
-       pattrib->ether_type = ntohs(etherhdr.h_proto);
-
-       memcpy(pattrib->dst, &etherhdr.h_dest, ETH_ALEN);
-       memcpy(pattrib->src, &etherhdr.h_source, ETH_ALEN);
+       ether_addr_copy(pattrib->dst, ehdr->h_dest);
+       ether_addr_copy(pattrib->src, ehdr->h_source);
 
        pattrib->pctrl = 0;
 
        if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == true) ||
                (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == true)) {
-               memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
-               memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+               ether_addr_copy(pattrib->ra, pattrib->dst);
+               ether_addr_copy(pattrib->ta, pattrib->src);
        }
        else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
-               memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
-               memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
+               ether_addr_copy(pattrib->ra, get_bssid(pmlmepriv));
+               ether_addr_copy(pattrib->ta, pattrib->src);
        }
        else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
-               memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
-               memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
+               ether_addr_copy(pattrib->ra, pattrib->dst);
+               ether_addr_copy(pattrib->ta, get_bssid(pmlmepriv));
        }
 
-       pattrib->pktlen = pktfile.pkt_len;
+       pattrib->pktlen = skb->len - ETH_HLEN;
 
        if (pattrib->ether_type == ETH_P_IP) {
                /*  The following is for DHCP and ARP packet, we use cck1M
                    to tx these packets and let LPS awake some time */
                /*  to prevent DHCP protocol fail */
-               u8 tmp[24];
-               _rtw_pktfile_read23a(&pktfile, &tmp[0], 24);
                pattrib->dhcp_pkt = 0;
-               if (pktfile.pkt_len > 282) {/* MINIMUM_DHCP_PACKET_SIZE) { */
-                       if (ETH_P_IP == pattrib->ether_type) {/*  IP header */
-                               if (((tmp[21] == 68) && (tmp[23] == 67)) ||
-                                   ((tmp[21] == 67) && (tmp[23] == 68))) {
+               /* MINIMUM_DHCP_PACKET_SIZE) { */
+               if (pattrib->pktlen > 282 + 24) {
+                       if (pattrib->ether_type == ETH_P_IP) {/*  IP header */
+                               u8 *pframe = skb->data;
+                               pframe += ETH_HLEN;
+
+                               if ((pframe[21] == 68 && pframe[23] == 67) ||
+                                   (pframe[21] == 67 && pframe[23] == 68)) {
                                        /*  68 : UDP BOOTP client */
                                        /*  67 : UDP BOOTP server */
                                        RT_TRACE(_module_rtl871x_xmit_c_,
@@ -532,17 +483,17 @@ static s32 update_attrib(struct rtw_adapter *padapter,
                                }
                        }
                }
-       } else if (0x888e == pattrib->ether_type) {
+       } else if (pattrib->ether_type == ETH_P_PAE) {
                DBG_8723A_LEVEL(_drv_always_, "send eapol packet\n");
        }
 
-       if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) {
+       if ((pattrib->ether_type == ETH_P_PAE) || (pattrib->dhcp_pkt == 1)) {
                rtw_set_scan_deny(padapter, 3000);
        }
 
        /*  If EAPOL , ARP , OR DHCP packet, driver must be in active mode. */
-       if ((pattrib->ether_type == 0x0806) ||
-           (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1)) {
+       if ((pattrib->ether_type == ETH_P_ARP) ||
+           (pattrib->ether_type == ETH_P_PAE) || (pattrib->dhcp_pkt == 1)) {
                rtw_lps_ctrl_wk_cmd23a(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
        }
 
@@ -592,10 +543,10 @@ static s32 update_attrib(struct rtw_adapter *padapter,
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE | WIFI_ADHOC_STATE |
                          WIFI_ADHOC_MASTER_STATE)) {
                if (psta->qos_option)
-                       set_qos(&pktfile, pattrib);
+                       set_qos(skb, pattrib);
        } else {
-               if (pqospriv->qos_option) {
-                       set_qos(&pktfile, pattrib);
+               if (pmlmepriv->qos_option) {
+                       set_qos(skb, pattrib);
 
                        if (pmlmepriv->acm_mask != 0) {
                                pattrib->priority = qos_acm23a(pmlmepriv->acm_mask,
@@ -610,7 +561,7 @@ static s32 update_attrib(struct rtw_adapter *padapter,
 
                pattrib->encrypt = 0;
 
-               if ((pattrib->ether_type != 0x888e) &&
+               if ((pattrib->ether_type != ETH_P_PAE) &&
                    (check_fwstate(pmlmepriv, WIFI_MP_STATE) == false)) {
                        RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
                                 ("\npsta->ieee8021x_blocked == true,  "
@@ -644,29 +595,30 @@ static s32 update_attrib(struct rtw_adapter *padapter,
        }
 
        switch (pattrib->encrypt) {
-       case _WEP40_:
-       case _WEP104_:
+       case WLAN_CIPHER_SUITE_WEP40:
+       case WLAN_CIPHER_SUITE_WEP104:
                pattrib->iv_len = 4;
                pattrib->icv_len = 4;
                break;
 
-       case _TKIP_:
+       case WLAN_CIPHER_SUITE_TKIP:
                pattrib->iv_len = 8;
                pattrib->icv_len = 4;
 
-               if (padapter->securitypriv.busetkipkey == _FAIL) {
+               if (!padapter->securitypriv.busetkipkey) {
                        RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
                                 ("\npadapter->securitypriv.busetkip"
-                                 "key(%d) == _FAIL drop packet\n",
+                                 "key(%d) == false drop packet\n",
                                  padapter->securitypriv.busetkipkey));
                        res = _FAIL;
                        goto exit;
                }
 
                break;
-       case _AES_:
+       case WLAN_CIPHER_SUITE_CCMP:
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
-                        ("pattrib->encrypt =%d (_AES_)\n", pattrib->encrypt));
+                        ("pattrib->encrypt =%d (WLAN_CIPHER_SUITE_CCMP)\n",
+                         pattrib->encrypt));
                pattrib->iv_len = 8;
                pattrib->icv_len = 8;
                break;
@@ -680,7 +632,7 @@ static s32 update_attrib(struct rtw_adapter *padapter,
        RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
                 ("update_attrib: encrypt =%d\n", pattrib->encrypt));
 
-       if (pattrib->encrypt && psecuritypriv->hw_decrypted == false) {
+       if (pattrib->encrypt && !psecuritypriv->hw_decrypted) {
                pattrib->bswenc = true;
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
                         ("update_attrib: encrypt =%d bswenc = true\n",
@@ -697,7 +649,7 @@ exit:
        return res;
 }
 
-static s32 xmitframe_addmic(struct rtw_adapter *padapter,
+static int xmitframe_addmic(struct rtw_adapter *padapter,
                            struct xmit_frame *pxmitframe) {
        struct mic_data micdata;
        struct sta_info *stainfo;
@@ -730,7 +682,7 @@ static s32 xmitframe_addmic(struct rtw_adapter *padapter,
 
        hw_hdr_offset = TXDESC_OFFSET;
 
-       if (pattrib->encrypt == _TKIP_) {
+       if (pattrib->encrypt == WLAN_CIPHER_SUITE_TKIP) {
                /* encode mic code */
                if (stainfo) {
                        u8 null_key[16]={0x0, 0x0, 0x0, 0x0,
@@ -775,7 +727,7 @@ static s32 xmitframe_addmic(struct rtw_adapter *padapter,
                                                         &pframe[10], 6);
                        }
 
-                       /* if (pqospriv->qos_option == 1) */
+                       /* if (pmlmepriv->qos_option == 1) */
                        if (pattrib->qos_en)
                                priority[0] = (u8)pxmitframe->attrib.priority;
 
@@ -873,7 +825,7 @@ static s32 xmitframe_addmic(struct rtw_adapter *padapter,
        return _SUCCESS;
 }
 
-static s32 xmitframe_swencrypt(struct rtw_adapter *padapter,
+static int xmitframe_swencrypt(struct rtw_adapter *padapter,
                               struct xmit_frame *pxmitframe)
 {
        struct pkt_attrib *pattrib = &pxmitframe->attrib;
@@ -884,14 +836,14 @@ static s32 xmitframe_swencrypt(struct rtw_adapter *padapter,
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_,
                         ("### xmitframe_swencrypt\n"));
                switch (pattrib->encrypt) {
-               case _WEP40_:
-               case _WEP104_:
+               case WLAN_CIPHER_SUITE_WEP40:
+               case WLAN_CIPHER_SUITE_WEP104:
                        rtw_wep_encrypt23a(padapter, pxmitframe);
                        break;
-               case _TKIP_:
+               case WLAN_CIPHER_SUITE_TKIP:
                        rtw_tkip_encrypt23a(padapter, pxmitframe);
                        break;
-               case _AES_:
+               case WLAN_CIPHER_SUITE_CCMP:
                        rtw_aes_encrypt23a(padapter, pxmitframe);
                        break;
                default:
@@ -906,17 +858,16 @@ static s32 xmitframe_swencrypt(struct rtw_adapter *padapter,
        return _SUCCESS;
 }
 
-s32 rtw_make_wlanhdr23a(struct rtw_adapter *padapter, u8 *hdr,
+int rtw_make_wlanhdr23a(struct rtw_adapter *padapter, u8 *hdr,
                        struct pkt_attrib *pattrib)
 {
        u16 *qc;
 
        struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr;
        struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
-       struct qos_priv *pqospriv = &pmlmepriv->qospriv;
        u8 qos_option = false;
        int res = _SUCCESS;
-       u16 *fctrl = &pwlanhdr->frame_control;
+       __le16 *fctrl = &pwlanhdr->frame_control;
 
        struct sta_info *psta;
 
@@ -956,7 +907,7 @@ s32 rtw_make_wlanhdr23a(struct rtw_adapter *padapter, u8 *hdr,
                        memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
                        memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
 
-                       if (pqospriv->qos_option)
+                       if (pmlmepriv->qos_option)
                                qos_option = true;
 
                }
@@ -1005,8 +956,13 @@ s32 rtw_make_wlanhdr23a(struct rtw_adapter *padapter, u8 *hdr,
                        SetSeqNum(hdr, pattrib->seqnum);
                        /* check if enable ampdu */
                        if (pattrib->ht_en && psta->htpriv.ampdu_enable) {
-                               if (psta->htpriv.agg_enable_bitmap & CHKBIT(pattrib->priority))
-                               pattrib->ampdu_en = true;
+                               if (pattrib->priority >= 16)
+                                       printk(KERN_WARNING "%s: Invalid "
+                                              "pattrib->priority %i\n",
+                                              __func__, pattrib->priority);
+                               if (psta->htpriv.agg_enable_bitmap &
+                                   BIT(pattrib->priority))
+                                       pattrib->ampdu_en = true;
                        }
                        /* re-check if enable ampdu by BA_starting_seqctrl */
                        if (pattrib->ampdu_en) {
@@ -1037,10 +993,10 @@ s32 rtw_txframes_pending23a(struct rtw_adapter *padapter)
 {
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
 
-       return (!_rtw_queue_empty23a(&pxmitpriv->be_pending)) ||
-              (!_rtw_queue_empty23a(&pxmitpriv->bk_pending)) ||
-              (!_rtw_queue_empty23a(&pxmitpriv->vi_pending)) ||
-              (!_rtw_queue_empty23a(&pxmitpriv->vo_pending));
+       return (!list_empty(&pxmitpriv->be_pending.queue)) ||
+               (!list_empty(&pxmitpriv->bk_pending.queue)) ||
+               (!list_empty(&pxmitpriv->vi_pending.queue)) ||
+               (!list_empty(&pxmitpriv->vo_pending.queue));
 }
 
 s32 rtw_txframes_sta_ac_pending23a(struct rtw_adapter *padapter,
@@ -1098,7 +1054,7 @@ u32 rtw_calculate_wlan_pkt_size_by_attribue23a(struct pkt_attrib *pattrib)
        len = pattrib->hdrlen + pattrib->iv_len; /*  WLAN Header and IV */
        len += SNAP_SIZE + sizeof(u16); /*  LLC */
        len += pattrib->pktlen;
-       if (pattrib->encrypt == _TKIP_) len += 8; /*  MIC */
+       if (pattrib->encrypt == WLAN_CIPHER_SUITE_TKIP) len += 8; /*  MIC */
        len += ((pattrib->bswenc) ? pattrib->icv_len : 0); /*  ICV */
 
        return len;
@@ -1116,39 +1072,41 @@ This sub-routine will perform all the following:
 6. apply sw-encrypt, if necessary.
 
 */
-s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
+int rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
                              struct xmit_frame *pxmitframe)
 {
-       struct pkt_file pktfile;
-       struct sta_info         *psta;
-       struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
-       struct pkt_attrib       *pattrib = &pxmitframe->attrib;
+       struct sta_info *psta;
+       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+       struct pkt_attrib *pattrib = &pxmitframe->attrib;
+       struct ieee80211_hdr *hdr;
        s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
        u8 *pframe, *mem_start;
        u8 hw_hdr_offset;
        u8 *pbuf_start;
-
+       u8 *pdata = skb->data;
+       int data_len = skb->len;
        s32 bmcst = is_multicast_ether_addr(pattrib->ra);
-       s32 res = _SUCCESS;
+       int res = _SUCCESS;
 
-       if (pattrib->psta) {
+       if (pattrib->psta)
                psta = pattrib->psta;
-       else {
+       else {
                DBG_8723A("%s, call rtw_get_stainfo23a()\n", __func__);
                psta = rtw_get_stainfo23a(&padapter->stapriv, pattrib->ra);
        }
 
-       if (psta == NULL) {
+       if (!psta) {
                DBG_8723A("%s, psta == NUL\n", __func__);
                return _FAIL;
        }
 
        if (!(psta->state &_FW_LINKED)) {
-               DBG_8723A("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
+               DBG_8723A("%s, psta->state(0x%x) != _FW_LINKED\n",
+                         __func__, psta->state);
                return _FAIL;
        }
 
-       if (pxmitframe->buf_addr == NULL) {
+       if (!pxmitframe->buf_addr) {
                DBG_8723A("==> %s buf_addr == NULL\n", __func__);
                return _FAIL;
        }
@@ -1157,7 +1115,7 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
 
        hw_hdr_offset = TXDESC_OFFSET;
 
-       mem_start = pbuf_start +        hw_hdr_offset;
+       mem_start = pbuf_start + hw_hdr_offset;
 
        if (rtw_make_wlanhdr23a(padapter, mem_start, pattrib) == _FAIL) {
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
@@ -1167,8 +1125,8 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
                goto exit;
        }
 
-       _rtw_open_pktfile23a(pkt, &pktfile);
-       _rtw_pktfile_read23a(&pktfile, NULL, pattrib->pkt_hdrlen);
+       pdata += pattrib->pkt_hdrlen;
+       data_len -= pattrib->pkt_hdrlen;
 
        frg_inx = 0;
        frg_len = pxmitpriv->frag_len - 4;/* 2346-4 = 2342 */
@@ -1179,31 +1137,37 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
                mpdu_len = frg_len;
 
                pframe = mem_start;
-
-               SetMFrag(mem_start);
+               hdr = (struct ieee80211_hdr *)mem_start;
 
                pframe += pattrib->hdrlen;
                mpdu_len -= pattrib->hdrlen;
 
                /* adding icv, if necessary... */
                if (pattrib->iv_len) {
-                       if (psta != NULL) {
+                       if (psta) {
                                switch (pattrib->encrypt) {
-                               case _WEP40_:
-                               case _WEP104_:
-                                       WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
+                               case WLAN_CIPHER_SUITE_WEP40:
+                               case WLAN_CIPHER_SUITE_WEP104:
+                                       WEP_IV(pattrib->iv, psta->dot11txpn,
+                                              pattrib->key_idx);
                                        break;
-                               case _TKIP_:
+                               case WLAN_CIPHER_SUITE_TKIP:
                                        if (bmcst)
-                                               TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
+                                               TKIP_IV(pattrib->iv,
+                                                       psta->dot11txpn,
+                                                       pattrib->key_idx);
                                        else
-                                               TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
+                                               TKIP_IV(pattrib->iv,
+                                                       psta->dot11txpn, 0);
                                        break;
-                               case _AES_:
+                               case WLAN_CIPHER_SUITE_CCMP:
                                        if (bmcst)
-                                               AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
+                                               AES_IV(pattrib->iv,
+                                                      psta->dot11txpn,
+                                                      pattrib->key_idx);
                                        else
-                                               AES_IV(pattrib->iv, psta->dot11txpn, 0);
+                                               AES_IV(pattrib->iv,
+                                                      psta->dot11txpn, 0);
                                        break;
                                }
                        }
@@ -1225,16 +1189,20 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
                        mpdu_len -= llc_sz;
                }
 
-               if ((pattrib->icv_len >0) && (pattrib->bswenc))
+               if (pattrib->icv_len > 0 && pattrib->bswenc)
                        mpdu_len -= pattrib->icv_len;
 
-               if (bmcst) {
+               if (bmcst)
                        /*  don't do fragment to broadcat/multicast packets */
-                       mem_sz = _rtw_pktfile_read23a(&pktfile, pframe, pattrib->pktlen);
-               } else {
-                       mem_sz = _rtw_pktfile_read23a(&pktfile, pframe, mpdu_len);
-               }
+                       mem_sz = min_t(s32, data_len, pattrib->pktlen);
+               else
+                       mem_sz = min_t(s32, data_len, mpdu_len);
+
+               memcpy(pframe, pdata, mem_sz);
+
                pframe += mem_sz;
+               pdata += mem_sz;
+               data_len -= mem_sz;
 
                if ((pattrib->icv_len >0) && (pattrib->bswenc)) {
                        memcpy(pframe, pattrib->icv, pattrib->icv_len);
@@ -1243,7 +1211,7 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
 
                frg_inx++;
 
-               if (bmcst || (rtw_endofpktfile23a(&pktfile))) {
+               if (bmcst || data_len <= 0) {
                        pattrib->nr_frags = frg_inx;
 
                        pattrib->last_txcmdsz = pattrib->hdrlen +
@@ -1252,21 +1220,24 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *pkt,
                                                llc_sz : 0) +
                                                ((pattrib->bswenc) ?
                                                pattrib->icv_len : 0) + mem_sz;
-
-                       ClearMFrag(mem_start);
+                       hdr->frame_control &=
+                               ~cpu_to_le16(IEEE80211_FCTL_MOREFRAGS);
 
                        break;
                } else {
-                       RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("%s: There're still something in packet!\n", __func__));
+                       RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
+                                ("%s: There're still something in packet!\n",
+                                 __func__));
                }
+               hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_MOREFRAGS);
 
                mem_start = PTR_ALIGN(pframe, 4) + hw_hdr_offset;
                memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);
-
        }
 
        if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) {
-               RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n"));
+               RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
+                        ("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n"));
                DBG_8723A("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n");
                res = _FAIL;
                goto exit;
@@ -1313,11 +1284,10 @@ s32 rtw_put_snap23a(u8 *data, u16 h_proto)
 
 void rtw_update_protection23a(struct rtw_adapter *padapter, u8 *ie, uint ie_len)
 {
-       struct  xmit_priv *pxmitpriv = &padapter->xmitpriv;
-       struct  registry_priv *pregistrypriv = &padapter->registrypriv;
-       uint    protection;
-       u8      *perp;
-       int      erp_len;
+       struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
+       struct registry_priv *pregistrypriv = &padapter->registrypriv;
+       uint protection;
+       const u8 *p;
 
        switch (pxmitpriv->vcs_setting) {
        case DISABLE_VCS:
@@ -1327,11 +1297,11 @@ void rtw_update_protection23a(struct rtw_adapter *padapter, u8 *ie, uint ie_len)
                break;
        case AUTO_VCS:
        default:
-               perp = rtw_get_ie23a(ie, _ERPINFO_IE_, &erp_len, ie_len);
-               if (perp == NULL) {
+               p = cfg80211_find_ie(WLAN_EID_ERP_INFO, ie, ie_len);
+               if (!p)
                        pxmitpriv->vcs = NONE_VCS;
-               else {
-                       protection = (*(perp + 2)) & BIT(1);
+               else {
+                       protection = (*(p + 2)) & BIT(1);
                        if (protection) {
                                if (pregistrypriv->vcs_type == RTS_CTS)
                                        pxmitpriv->vcs = RTS_CTS;
@@ -1396,7 +1366,8 @@ struct xmit_buf *rtw_alloc_xmitbuf23a_ext(struct xmit_priv *pxmitpriv)
        return pxmitbuf;
 }
 
-s32 rtw_free_xmitbuf_ext23a(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
+int rtw_free_xmitbuf_ext23a(struct xmit_priv *pxmitpriv,
+                           struct xmit_buf *pxmitbuf)
 {
        unsigned long irqL;
        struct rtw_queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
@@ -1450,7 +1421,7 @@ struct xmit_buf *rtw_alloc_xmitbuf23a(struct xmit_priv *pxmitpriv)
        return pxmitbuf;
 }
 
-s32 rtw_free_xmitbuf23a(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
+int rtw_free_xmitbuf23a(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
 {
        unsigned long irqL;
        struct rtw_queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
@@ -1512,22 +1483,18 @@ Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
 Must be very very cautious...
 
 */
-struct xmit_frame *rtw_alloc_xmitframe23a(struct xmit_priv *pxmitpriv)/* _queue *pfree_xmit_queue) */
+static struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)
 {
-       /*
-               Please remember to use all the osdep_service api,
-               and lock/unlock or _enter/_exit critical to protect
-               pfree_xmit_queue
-       */
-
        struct xmit_frame *pxframe = NULL;
        struct list_head *plist, *phead;
        struct rtw_queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
 
        spin_lock_bh(&pfree_xmit_queue->lock);
 
-       if (_rtw_queue_empty23a(pfree_xmit_queue) == true) {
-               RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe23a:%d\n", pxmitpriv->free_xmitframe_cnt));
+       if (list_empty(&pfree_xmit_queue->queue)) {
+               RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
+                        ("rtw_alloc_xmitframe:%d\n",
+                         pxmitpriv->free_xmitframe_cnt));
                pxframe =  NULL;
        } else {
                phead = get_list_head(pfree_xmit_queue);
@@ -1538,7 +1505,9 @@ struct xmit_frame *rtw_alloc_xmitframe23a(struct xmit_priv *pxmitpriv)/* _queue
 
                list_del_init(&pxframe->list);
                pxmitpriv->free_xmitframe_cnt--;
-               RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe23a():free_xmitframe_cnt =%d\n", pxmitpriv->free_xmitframe_cnt));
+               RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
+                        ("rtw_alloc_xmitframe():free_xmitframe_cnt =%d\n",
+                         pxmitpriv->free_xmitframe_cnt));
        }
 
        spin_unlock_bh(&pfree_xmit_queue->lock);
@@ -1556,7 +1525,7 @@ struct xmit_frame *rtw_alloc_xmitframe23a_ext(struct xmit_priv *pxmitpriv)
 
        spin_lock_bh(&queue->lock);
 
-       if (_rtw_queue_empty23a(queue) == true) {
+       if (list_empty(&queue->queue)) {
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe23a_ext:%d\n", pxmitpriv->free_xframe_ext_cnt));
                pxframe =  NULL;
        } else {
@@ -1642,7 +1611,7 @@ void rtw_free_xmitframe_queue23a(struct xmit_priv *pxmitpriv,
 
 }
 
-s32 rtw_xmitframe_enqueue23a(struct rtw_adapter *padapter,
+int rtw_xmitframe_enqueue23a(struct rtw_adapter *padapter,
                             struct xmit_frame *pxmitframe)
 {
        if (rtw_xmit23a_classifier(padapter, pxmitframe) == _FAIL) {
@@ -1715,7 +1684,9 @@ rtw_dequeue_xframe23a(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i,
                                phwxmit->accnt--;
 
                                /* Remove sta node when there is no pending packets. */
-                               if (_rtw_queue_empty23a(pframe_queue)) /* must be done after get_next and before break */
+                               /* must be done after get_next and
+                                  before break */
+                               if (list_empty(&pframe_queue->queue))
                                        list_del_init(&ptxservq->tx_pending);
                                goto exit;
                        }
@@ -1764,8 +1735,8 @@ struct tx_servq *rtw_get_sta_pending23a(struct rtw_adapter *padapter, struct sta
  * Will enqueue pxmitframe to the proper queue,
  * and indicate it to xx_pending list.....
  */
-s32 rtw_xmit23a_classifier(struct rtw_adapter *padapter,
-                       struct xmit_frame *pxmitframe)
+int rtw_xmit23a_classifier(struct rtw_adapter *padapter,
+                          struct xmit_frame *pxmitframe)
 {
        struct sta_info *psta;
        struct tx_servq *ptxservq;
@@ -1942,9 +1913,9 @@ int rtw_xmit23a(struct rtw_adapter *padapter, struct sk_buff *skb)
 {
        struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
        struct xmit_frame *pxmitframe = NULL;
-       s32 res;
+       int res;
 
-       pxmitframe = rtw_alloc_xmitframe23a(pxmitpriv);
+       pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
 
        if (pxmitframe == NULL) {
                RT_TRACE(_module_xmit_osdep_c_, _drv_err_,
@@ -1974,7 +1945,7 @@ int rtw_xmit23a(struct rtw_adapter *padapter, struct sk_buff *skb)
        spin_unlock_bh(&pxmitpriv->lock);
 #endif
 
-       if (rtw_hal_xmit23a(padapter, pxmitframe) == false)
+       if (rtl8723au_hal_xmit(padapter, pxmitframe) == false)
                return 1;
 
        return 0;
@@ -1992,7 +1963,7 @@ int xmitframe_enqueue_for_sleeping_sta23a(struct rtw_adapter *padapter, struct x
        int bmcst = is_multicast_ether_addr(pattrib->ra);
 
        if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == false)
-           return ret;
+               return ret;
 
        if (pattrib->psta) {
                psta = pattrib->psta;
@@ -2036,7 +2007,8 @@ int xmitframe_enqueue_for_sleeping_sta23a(struct rtw_adapter *padapter, struct x
 
                        /* DBG_8723A("enqueue, sq_len =%d, tim =%x\n", psta->sleepq_len, pstapriv->tim_bitmap); */
 
-                       update_beacon23a(padapter, _TIM_IE_, NULL, false);/* tx bc/mc packets after upate bcn */
+                       /* tx bc/mc packets after upate bcn */
+                       update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
 
                        /* spin_unlock_bh(&psta->sleep_q.lock); */
 
@@ -2093,7 +2065,8 @@ int xmitframe_enqueue_for_sleeping_sta23a(struct rtw_adapter *padapter, struct x
 
                                if (psta->sleepq_len == 1) {
                                        /* upate BCN for TIM IE */
-                                       update_beacon23a(padapter, _TIM_IE_, NULL, false);
+                                       update_beacon23a(padapter, WLAN_EID_TIM,
+                                                        NULL, false);
                                }
                        }
 
@@ -2244,7 +2217,7 @@ void wakeup_sta_to_xmit23a(struct rtw_adapter *padapter, struct sta_info *psta)
                }
 
                pxmitframe->attrib.triggered = 1;
-               rtw_hal_xmit23aframe_enqueue(padapter, pxmitframe);
+               rtl8723au_hal_xmitframe_enqueue(padapter, pxmitframe);
        }
 
        if (psta->sleepq_len == 0) {
@@ -2291,7 +2264,7 @@ void wakeup_sta_to_xmit23a(struct rtw_adapter *padapter, struct sta_info *psta)
                                pxmitframe->attrib.mdata = 0;
 
                        pxmitframe->attrib.triggered = 1;
-                       rtw_hal_xmit23aframe_enqueue(padapter, pxmitframe);
+                       rtl8723au_hal_xmitframe_enqueue(padapter, pxmitframe);
                }
                if (psta_bmc->sleepq_len == 0) {
                        pstapriv->tim_bitmap &= ~BIT(0);
@@ -2307,7 +2280,7 @@ void wakeup_sta_to_xmit23a(struct rtw_adapter *padapter, struct sta_info *psta)
        }
 
        if (update_mask)
-               update_beacon23a(padapter, _TIM_IE_, NULL, false);
+               update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
 }
 
 void xmit_delivery_enabled_frames23a(struct rtw_adapter *padapter,
@@ -2365,14 +2338,14 @@ void xmit_delivery_enabled_frames23a(struct rtw_adapter *padapter,
 
                pxmitframe->attrib.triggered = 1;
 
-               rtw_hal_xmit23aframe_enqueue(padapter, pxmitframe);
+               rtl8723au_hal_xmitframe_enqueue(padapter, pxmitframe);
 
                if ((psta->sleepq_ac_len == 0) && (!psta->has_legacy_ac) &&
                    (wmmps_ac)) {
                        pstapriv->tim_bitmap &= ~CHKBIT(psta->aid);
 
                        /* upate BCN for TIM IE */
-                       update_beacon23a(padapter, _TIM_IE_, NULL, false);
+                       update_beacon23a(padapter, WLAN_EID_TIM, NULL, false);
                }
        }
        spin_unlock_bh(&pxmitpriv->lock);