staging: rtl8723au: Get rid of ClearMFrag/SetMFrag
[firefly-linux-kernel-4.4.55.git] / drivers / staging / rtl8723au / core / rtw_xmit.c
index 1ab7ded5679d2f3482390f1338cdcb9d444c9b6b..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);
@@ -200,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:
 
@@ -216,8 +213,6 @@ void _rtw_free_xmit_priv23a (struct xmit_priv *pxmitpriv)
        struct xmit_buf *pxmitbuf;
        struct list_head *plist, *ptmp;
 
-       rtw_hal_free_xmit_priv23a(padapter);
-
        list_for_each_safe(plist, ptmp, &pxmitpriv->free_xmit_queue.queue) {
                pxframe = container_of(plist, struct xmit_frame, list);
                list_del_init(&pxframe->list);
@@ -301,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;
                        }
@@ -400,6 +396,7 @@ u8 qos_acm23a(u8 acm_mask, u8 priority)
        default:
                DBG_8723A("qos_acm23a(): invalid pattrib->priority: %d!!!\n",
                          priority);
+               change_priority = 0;
                break;
        }
 
@@ -410,7 +407,7 @@ static void set_qos(struct sk_buff *skb, struct pkt_attrib *pattrib)
 {
        u8 *pframe = skb->data;
        struct iphdr *ip_hdr;
-       s32 UserPriority = 0;
+       u8 UserPriority = 0;
 
        /*  get UserPriority from IP hdr */
        if (pattrib->ether_type == ETH_P_IP) {
@@ -428,7 +425,7 @@ static void set_qos(struct sk_buff *skb, struct pkt_attrib *pattrib)
        pattrib->subtype = WIFI_QOS_DATA_TYPE;
 }
 
-static s32 update_attrib(struct rtw_adapter *padapter,
+static int update_attrib(struct rtw_adapter *padapter,
                         struct sk_buff *skb, struct pkt_attrib *pattrib)
 {
        struct sta_info *psta = NULL;
@@ -598,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;
@@ -634,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",
@@ -651,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;
@@ -684,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,
@@ -827,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;
@@ -838,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:
@@ -860,7 +858,7 @@ 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;
@@ -958,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) {
@@ -990,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,
@@ -1051,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;
@@ -1069,12 +1072,13 @@ 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 *skb,
+int rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
                              struct xmit_frame *pxmitframe)
 {
        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;
@@ -1082,7 +1086,7 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
        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)
                psta = pattrib->psta;
@@ -1133,8 +1137,7 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
                mpdu_len = frg_len;
 
                pframe = mem_start;
-
-               SetMFrag(mem_start);
+               hdr = (struct ieee80211_hdr *)mem_start;
 
                pframe += pattrib->hdrlen;
                mpdu_len -= pattrib->hdrlen;
@@ -1143,12 +1146,12 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
                if (pattrib->iv_len) {
                        if (psta) {
                                switch (pattrib->encrypt) {
-                               case _WEP40_:
-                               case _WEP104_:
+                               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,
@@ -1157,7 +1160,7 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
                                                TKIP_IV(pattrib->iv,
                                                        psta->dot11txpn, 0);
                                        break;
-                               case _AES_:
+                               case WLAN_CIPHER_SUITE_CCMP:
                                        if (bmcst)
                                                AES_IV(pattrib->iv,
                                                       psta->dot11txpn,
@@ -1217,8 +1220,8 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
                                                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 {
@@ -1226,6 +1229,7 @@ s32 rtw_xmitframe_coalesce23a(struct rtw_adapter *padapter, struct sk_buff *skb,
                                 ("%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);
@@ -1362,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;
@@ -1416,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;
@@ -1486,7 +1491,7 @@ static struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)
 
        spin_lock_bh(&pfree_xmit_queue->lock);
 
-       if (_rtw_queue_empty23a(pfree_xmit_queue) == true) {
+       if (list_empty(&pfree_xmit_queue->queue)) {
                RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
                         ("rtw_alloc_xmitframe:%d\n",
                          pxmitpriv->free_xmitframe_cnt));
@@ -1520,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 {
@@ -1606,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) {
@@ -1679,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;
                        }
@@ -1728,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;
@@ -1906,7 +1913,7 @@ 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_xmitframe(pxmitpriv);
 
@@ -1938,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;
@@ -1956,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;
@@ -2210,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) {
@@ -2257,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);
@@ -2331,7 +2338,7 @@ 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)) {