Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[cascardo/linux.git] / drivers / staging / rtl8723au / core / rtw_recv.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  ******************************************************************************/
15 #define _RTW_RECV_C_
16 #include <osdep_service.h>
17 #include <drv_types.h>
18 #include <recv_osdep.h>
19 #include <mlme_osdep.h>
20 #include <linux/ip.h>
21 #include <linux/if_ether.h>
22 #include <usb_ops.h>
23 #include <linux/ieee80211.h>
24 #include <wifi.h>
25 #include <rtl8723a_recv.h>
26 #include <rtl8723a_xmit.h>
27
28 void rtw_signal_stat_timer_hdl23a(unsigned long data);
29
30 void _rtw_init_sta_recv_priv23a(struct sta_recv_priv *psta_recvpriv)
31 {
32
33
34
35         spin_lock_init(&psta_recvpriv->lock);
36
37         /* for (i = 0; i<MAX_RX_NUMBLKS; i++) */
38         /*      _rtw_init_queue23a(&psta_recvpriv->blk_strms[i]); */
39
40         _rtw_init_queue23a(&psta_recvpriv->defrag_q);
41
42
43 }
44
45 int _rtw_init_recv_priv23a(struct recv_priv *precvpriv,
46                         struct rtw_adapter *padapter)
47 {
48         struct recv_frame *precvframe;
49         int i;
50         int res = _SUCCESS;
51
52         spin_lock_init(&precvpriv->lock);
53
54         _rtw_init_queue23a(&precvpriv->free_recv_queue);
55         _rtw_init_queue23a(&precvpriv->recv_pending_queue);
56         _rtw_init_queue23a(&precvpriv->uc_swdec_pending_queue);
57
58         precvpriv->adapter = padapter;
59
60         for (i = 0; i < NR_RECVFRAME ; i++) {
61                 precvframe = kzalloc(sizeof(struct recv_frame), GFP_KERNEL);
62                 if (!precvframe)
63                         break;
64                 INIT_LIST_HEAD(&precvframe->list);
65
66                 list_add_tail(&precvframe->list,
67                               &precvpriv->free_recv_queue.queue);
68
69                 precvframe->adapter = padapter;
70                 precvframe++;
71         }
72
73         precvpriv->free_recvframe_cnt = i;
74         precvpriv->rx_pending_cnt = 1;
75
76         res = rtl8723au_init_recv_priv(padapter);
77
78         setup_timer(&precvpriv->signal_stat_timer, rtw_signal_stat_timer_hdl23a,
79                     (unsigned long)padapter);
80
81         precvpriv->signal_stat_sampling_interval = 1000; /* ms */
82
83         rtw_set_signal_stat_timer(precvpriv);
84
85         return res;
86 }
87
88 void _rtw_free_recv_priv23a(struct recv_priv *precvpriv)
89 {
90         struct rtw_adapter *padapter = precvpriv->adapter;
91         struct recv_frame *precvframe, *ptmp;
92
93         rtw_free_uc_swdec_pending_queue23a(padapter);
94
95         list_for_each_entry_safe(precvframe, ptmp,
96                                  &precvpriv->free_recv_queue.queue, list) {
97                 list_del_init(&precvframe->list);
98                 kfree(precvframe);
99         }
100
101         rtl8723au_free_recv_priv(padapter);
102 }
103
104 struct recv_frame *rtw_alloc_recvframe23a(struct rtw_queue *pfree_recv_queue)
105 {
106         struct recv_frame *pframe;
107         struct rtw_adapter *padapter;
108         struct recv_priv *precvpriv;
109
110         spin_lock_bh(&pfree_recv_queue->lock);
111
112         pframe = list_first_entry_or_null(&pfree_recv_queue->queue,
113                                           struct recv_frame, list);
114         if (pframe) {
115                 list_del_init(&pframe->list);
116                 padapter = pframe->adapter;
117                 if (padapter) {
118                         precvpriv = &padapter->recvpriv;
119                         if (pfree_recv_queue == &precvpriv->free_recv_queue)
120                                 precvpriv->free_recvframe_cnt--;
121                 }
122         }
123
124         spin_unlock_bh(&pfree_recv_queue->lock);
125
126         return pframe;
127 }
128
129 int rtw_free_recvframe23a(struct recv_frame *precvframe)
130 {
131         struct rtw_adapter *padapter = precvframe->adapter;
132         struct recv_priv *precvpriv = &padapter->recvpriv;
133         struct rtw_queue *pfree_recv_queue;
134
135         if (precvframe->pkt) {
136                 dev_kfree_skb_any(precvframe->pkt);/* free skb by driver */
137                 precvframe->pkt = NULL;
138         }
139
140         pfree_recv_queue = &precvpriv->free_recv_queue;
141         spin_lock_bh(&pfree_recv_queue->lock);
142
143         list_del_init(&precvframe->list);
144
145         list_add_tail(&precvframe->list, get_list_head(pfree_recv_queue));
146
147         if (padapter) {
148                 if (pfree_recv_queue == &precvpriv->free_recv_queue)
149                         precvpriv->free_recvframe_cnt++;
150         }
151
152         spin_unlock_bh(&pfree_recv_queue->lock);
153
154
155
156         return _SUCCESS;
157 }
158
159 int rtw_enqueue_recvframe23a(struct recv_frame *precvframe, struct rtw_queue *queue)
160 {
161         struct rtw_adapter *padapter = precvframe->adapter;
162         struct recv_priv *precvpriv = &padapter->recvpriv;
163
164         spin_lock_bh(&queue->lock);
165
166         list_del_init(&precvframe->list);
167
168         list_add_tail(&precvframe->list, get_list_head(queue));
169
170         if (padapter) {
171                 if (queue == &precvpriv->free_recv_queue)
172                         precvpriv->free_recvframe_cnt++;
173         }
174
175         spin_unlock_bh(&queue->lock);
176
177         return _SUCCESS;
178 }
179
180 /*
181 caller : defrag ; recvframe_chk_defrag23a in recv_thread  (passive)
182 pframequeue: defrag_queue : will be accessed in recv_thread  (passive)
183
184 using spinlock to protect
185
186 */
187
188 static void rtw_free_recvframe23a_queue(struct rtw_queue *pframequeue)
189 {
190         struct recv_frame *hdr, *ptmp;
191         struct list_head *phead;
192
193         spin_lock(&pframequeue->lock);
194         phead = get_list_head(pframequeue);
195         list_for_each_entry_safe(hdr, ptmp, phead, list)
196                 rtw_free_recvframe23a(hdr);
197         spin_unlock(&pframequeue->lock);
198 }
199
200 u32 rtw_free_uc_swdec_pending_queue23a(struct rtw_adapter *adapter)
201 {
202         u32 cnt = 0;
203         struct recv_frame *pending_frame;
204
205         while ((pending_frame = rtw_alloc_recvframe23a(&adapter->recvpriv.uc_swdec_pending_queue))) {
206                 rtw_free_recvframe23a(pending_frame);
207                 DBG_8723A("%s: dequeue uc_swdec_pending_queue\n", __func__);
208                 cnt++;
209         }
210
211         return cnt;
212 }
213
214 struct recv_buf *rtw_dequeue_recvbuf23a (struct rtw_queue *queue)
215 {
216         unsigned long irqL;
217         struct recv_buf *precvbuf;
218
219         spin_lock_irqsave(&queue->lock, irqL);
220
221         precvbuf = list_first_entry_or_null(&queue->queue,
222                                             struct recv_buf, list);
223         if (precvbuf)
224                 list_del_init(&precvbuf->list);
225
226         spin_unlock_irqrestore(&queue->lock, irqL);
227
228         return precvbuf;
229 }
230
231 int recvframe_chkmic(struct rtw_adapter *adapter,
232                      struct recv_frame *precvframe);
233 int recvframe_chkmic(struct rtw_adapter *adapter,
234                      struct recv_frame *precvframe) {
235
236         int     i, res = _SUCCESS;
237         u32     datalen;
238         u8      miccode[8];
239         u8      bmic_err = false, brpt_micerror = true;
240         u8      *pframe, *payload, *pframemic;
241         u8      *mickey;
242         struct  sta_info *stainfo;
243         struct  rx_pkt_attrib *prxattrib = &precvframe->attrib;
244         struct  security_priv *psecuritypriv = &adapter->securitypriv;
245
246         struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
247         struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
248
249
250         stainfo = rtw_get_stainfo23a(&adapter->stapriv, &prxattrib->ta[0]);
251
252         if (prxattrib->encrypt == WLAN_CIPHER_SUITE_TKIP) {
253                 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
254                          "recvframe_chkmic:prxattrib->encrypt == WLAN_CIPHER_SUITE_TKIP\n");
255                 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
256                          "recvframe_chkmic:da = %pM\n", prxattrib->ra);
257
258                 /* calculate mic code */
259                 if (stainfo != NULL) {
260                         if (is_multicast_ether_addr(prxattrib->ra)) {
261                                 mickey = &psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0];
262
263                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
264                                          "recvframe_chkmic: bcmc key\n");
265
266                                 if (!psecuritypriv->binstallGrpkey) {
267                                         res = _FAIL;
268                                         RT_TRACE(_module_rtl871x_recv_c_,
269                                                  _drv_err_,
270                                                  "recvframe_chkmic:didn't install group key!\n");
271                                         DBG_8723A("\n recvframe_chkmic:didn't "
272                                                   "install group key!!!!!!\n");
273                                         goto exit;
274                                 }
275                         } else {
276                                 mickey = &stainfo->dot11tkiprxmickey.skey[0];
277                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
278                                          "recvframe_chkmic: unicast key\n");
279                         }
280
281                         /* icv_len included the mic code */
282                         datalen = precvframe->pkt->len-prxattrib->
283                                 hdrlen-prxattrib->iv_len-prxattrib->icv_len - 8;
284                         pframe = precvframe->pkt->data;
285                         payload = pframe + prxattrib->hdrlen +
286                                 prxattrib->iv_len;
287
288                         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
289                                  "prxattrib->iv_len =%d prxattrib->icv_len =%d\n",
290                                  prxattrib->iv_len, prxattrib->icv_len);
291
292                         /* care the length of the data */
293                         rtw_seccalctkipmic23a(mickey, pframe, payload,
294                                            datalen, &miccode[0],
295                                            (unsigned char)prxattrib->priority);
296
297                         pframemic = payload + datalen;
298
299                         bmic_err = false;
300
301                         for (i = 0; i < 8; i++) {
302                                 if (miccode[i] != *(pframemic + i)) {
303                                         RT_TRACE(_module_rtl871x_recv_c_,
304                                                  _drv_err_,
305                                                  "recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x)\n",
306                                                  i, miccode[i],
307                                                  i, *(pframemic + i));
308                                         bmic_err = true;
309                                 }
310                         }
311
312                         if (bmic_err == true) {
313                                 int i;
314
315                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
316                                          "*(pframemic-8)-*(pframemic-1) =%*phC\n",
317                                          8, pframemic - 8);
318                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
319                                          "*(pframemic-16)-*(pframemic-9) =%*phC\n",
320                                          8, pframemic - 16);
321
322                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
323                                          "====== demp packet (len =%d) ======\n",
324                                          precvframe->pkt->len);
325                                 for (i = 0; i < precvframe->pkt->len; i = i + 8) {
326                                         RT_TRACE(_module_rtl871x_recv_c_,
327                                                  _drv_err_, "%*phC\n",
328                                                  8, precvframe->pkt->data + i);
329                                 }
330                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
331                                          "====== demp packet end [len =%d]======\n",
332                                          precvframe->pkt->len);
333                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
334                                          "hrdlen =%d\n", prxattrib->hdrlen);
335
336                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
337                                          "ra = %pM psecuritypriv->binstallGrpkey =%d\n",
338                                          prxattrib->ra,
339                                          psecuritypriv->binstallGrpkey);
340
341                                 /*  double check key_index for some timing
342                                     issue, cannot compare with
343                                     psecuritypriv->dot118021XGrpKeyid also
344                                     cause timing issue */
345                                 if ((is_multicast_ether_addr(prxattrib->ra)) &&
346                                     (prxattrib->key_index !=
347                                      pmlmeinfo->key_index))
348                                         brpt_micerror = false;
349
350                                 if ((prxattrib->bdecrypted == true) &&
351                                     (brpt_micerror == true)) {
352                                         rtw_handle_tkip_mic_err23a(adapter, (u8)is_multicast_ether_addr(prxattrib->ra));
353                                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
354                                                  "mic error :prxattrib->bdecrypted =%d\n",
355                                                  prxattrib->bdecrypted);
356                                         DBG_8723A(" mic error :prxattrib->"
357                                                   "bdecrypted =%d\n",
358                                                   prxattrib->bdecrypted);
359                                 } else {
360                                         RT_TRACE(_module_rtl871x_recv_c_,
361                                                  _drv_err_,
362                                                  "mic error :prxattrib->bdecrypted =%d\n",
363                                                  prxattrib->bdecrypted);
364                                         DBG_8723A(" mic error :prxattrib->"
365                                                   "bdecrypted =%d\n",
366                                                   prxattrib->bdecrypted);
367                                 }
368
369                                 res = _FAIL;
370                         } else {
371                                 /* mic checked ok */
372                                 if (!psecuritypriv->bcheck_grpkey &&
373                                     is_multicast_ether_addr(prxattrib->ra)) {
374                                         psecuritypriv->bcheck_grpkey = 1;
375                                         RT_TRACE(_module_rtl871x_recv_c_,
376                                                  _drv_err_,
377                                                  "psecuritypriv->bcheck_grpkey = true\n");
378                                 }
379                         }
380                 } else {
381                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
382                                  "recvframe_chkmic: rtw_get_stainfo23a ==NULL!!!\n");
383                 }
384
385                 skb_trim(precvframe->pkt, precvframe->pkt->len - 8);
386         }
387
388 exit:
389
390
391
392         return res;
393 }
394
395 /* decrypt and set the ivlen, icvlen of the recv_frame */
396 struct recv_frame *decryptor(struct rtw_adapter *padapter,
397                              struct recv_frame *precv_frame);
398 struct recv_frame *decryptor(struct rtw_adapter *padapter,
399                              struct recv_frame *precv_frame)
400 {
401         struct rx_pkt_attrib *prxattrib = &precv_frame->attrib;
402         struct security_priv *psecuritypriv = &padapter->securitypriv;
403         struct recv_frame *return_packet = precv_frame;
404         int res = _SUCCESS;
405
406         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
407                  "prxstat->decrypted =%x prxattrib->encrypt = 0x%03x\n",
408                  prxattrib->bdecrypted, prxattrib->encrypt);
409
410         if (prxattrib->encrypt > 0) {
411                 u8 *iv = precv_frame->pkt->data + prxattrib->hdrlen;
412
413                 prxattrib->key_index = (((iv[3]) >> 6) & 0x3);
414
415                 if (prxattrib->key_index > WEP_KEYS) {
416                         DBG_8723A("prxattrib->key_index(%d) > WEP_KEYS\n",
417                                   prxattrib->key_index);
418
419                         switch (prxattrib->encrypt) {
420                         case WLAN_CIPHER_SUITE_WEP40:
421                         case WLAN_CIPHER_SUITE_WEP104:
422                                 prxattrib->key_index =
423                                         psecuritypriv->dot11PrivacyKeyIndex;
424                                 break;
425                         case WLAN_CIPHER_SUITE_TKIP:
426                         case WLAN_CIPHER_SUITE_CCMP:
427                         default:
428                                 prxattrib->key_index =
429                                         psecuritypriv->dot118021XGrpKeyid;
430                                 break;
431                         }
432                 }
433         }
434
435         if ((prxattrib->encrypt > 0) && ((prxattrib->bdecrypted == 0))) {
436                 psecuritypriv->hw_decrypted = 0;
437                 switch (prxattrib->encrypt) {
438                 case WLAN_CIPHER_SUITE_WEP40:
439                 case WLAN_CIPHER_SUITE_WEP104:
440                         rtw_wep_decrypt23a(padapter, precv_frame);
441                         break;
442                 case WLAN_CIPHER_SUITE_TKIP:
443                         res = rtw_tkip_decrypt23a(padapter, precv_frame);
444                         break;
445                 case WLAN_CIPHER_SUITE_CCMP:
446                         res = rtw_aes_decrypt23a(padapter, precv_frame);
447                         break;
448                 default:
449                         break;
450                 }
451         } else if (prxattrib->bdecrypted == 1 && prxattrib->encrypt > 0 &&
452                    (psecuritypriv->busetkipkey == 1 ||
453                     prxattrib->encrypt != WLAN_CIPHER_SUITE_TKIP)) {
454                         psecuritypriv->hw_decrypted = 1;
455         }
456
457         if (res == _FAIL) {
458                 rtw_free_recvframe23a(return_packet);
459                 return_packet = NULL;
460         }
461
462
463
464         return return_packet;
465 }
466
467 /* set the security information in the recv_frame */
468 static struct recv_frame *portctrl(struct rtw_adapter *adapter,
469                                    struct recv_frame *precv_frame)
470 {
471         u8 *psta_addr, *ptr;
472         uint auth_alg;
473         struct recv_frame *pfhdr;
474         struct sta_info *psta;
475         struct sta_priv *pstapriv ;
476         struct recv_frame *prtnframe;
477         u16 ether_type;
478         u16 eapol_type = ETH_P_PAE;/* for Funia BD's WPA issue */
479         struct rx_pkt_attrib *pattrib;
480
481         pstapriv = &adapter->stapriv;
482
483         auth_alg = adapter->securitypriv.dot11AuthAlgrthm;
484
485         pfhdr = precv_frame;
486         pattrib = &pfhdr->attrib;
487         psta_addr = pattrib->ta;
488         psta = rtw_get_stainfo23a(pstapriv, psta_addr);
489
490         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
491                  "########portctrl:adapter->securitypriv.dot11AuthAlgrthm =%d\n",
492                  adapter->securitypriv.dot11AuthAlgrthm);
493
494         prtnframe = precv_frame;
495
496         if (auth_alg == dot11AuthAlgrthm_8021X) {
497                 /* get ether_type */
498                 ptr = pfhdr->pkt->data + pfhdr->attrib.hdrlen;
499
500                 ether_type = (ptr[6] << 8) | ptr[7];
501
502                 if (psta && psta->ieee8021x_blocked) {
503                         /* blocked */
504                         /* only accept EAPOL frame */
505                         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
506                                  "########portctrl:psta->ieee8021x_blocked ==1\n");
507
508                         if (ether_type != eapol_type) {
509                                 /* free this frame */
510                                 rtw_free_recvframe23a(precv_frame);
511                                 prtnframe = NULL;
512                         }
513                 }
514         }
515
516         return prtnframe;
517 }
518
519 int recv_decache(struct recv_frame *precv_frame, u8 bretry,
520                  struct stainfo_rxcache *prxcache);
521 int recv_decache(struct recv_frame *precv_frame, u8 bretry,
522                  struct stainfo_rxcache *prxcache)
523 {
524         int tid = precv_frame->attrib.priority;
525
526         u16 seq_ctrl = ((precv_frame->attrib.seq_num & 0xffff) << 4) |
527                 (precv_frame->attrib.frag_num & 0xf);
528
529
530
531         if (tid > 15) {
532                 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
533                          "recv_decache, (tid>15)! seq_ctrl = 0x%x, tid = 0x%x\n",
534                          seq_ctrl, tid);
535
536                 return _FAIL;
537         }
538
539         if (1) { /* if (bretry) */
540                 if (seq_ctrl == prxcache->tid_rxseq[tid]) {
541                         RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
542                                  "recv_decache, seq_ctrl = 0x%x, tid = 0x%x, tid_rxseq = 0x%x\n",
543                                  seq_ctrl, tid, prxcache->tid_rxseq[tid]);
544
545                         return _FAIL;
546                 }
547         }
548
549         prxcache->tid_rxseq[tid] = seq_ctrl;
550
551
552
553         return _SUCCESS;
554 }
555
556 void process23a_pwrbit_data(struct rtw_adapter *padapter,
557                          struct recv_frame *precv_frame);
558 void process23a_pwrbit_data(struct rtw_adapter *padapter,
559                          struct recv_frame *precv_frame)
560 {
561 #ifdef CONFIG_8723AU_AP_MODE
562         unsigned char pwrbit;
563         struct sk_buff *skb = precv_frame->pkt;
564         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
565         struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
566         struct sta_priv *pstapriv = &padapter->stapriv;
567         struct sta_info *psta;
568
569         psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
570
571         if (psta) {
572                 pwrbit = ieee80211_has_pm(hdr->frame_control);
573
574                 if (pwrbit) {
575                         if (!(psta->state & WIFI_SLEEP_STATE))
576                                 stop_sta_xmit23a(padapter, psta);
577                 } else {
578                         if (psta->state & WIFI_SLEEP_STATE)
579                                 wakeup_sta_to_xmit23a(padapter, psta);
580                 }
581         }
582
583 #endif
584 }
585
586 void process_wmmps_data(struct rtw_adapter *padapter,
587                         struct recv_frame *precv_frame);
588 void process_wmmps_data(struct rtw_adapter *padapter,
589                         struct recv_frame *precv_frame)
590 {
591 #ifdef CONFIG_8723AU_AP_MODE
592         struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
593         struct sta_priv *pstapriv = &padapter->stapriv;
594         struct sta_info *psta;
595
596         psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
597
598         if (!psta)
599                 return;
600
601
602         if (!psta->qos_option)
603                 return;
604
605         if (!(psta->qos_info & 0xf))
606                 return;
607
608         if (psta->state & WIFI_SLEEP_STATE) {
609                 u8 wmmps_ac = 0;
610
611                 switch (pattrib->priority) {
612                 case 1:
613                 case 2:
614                         wmmps_ac = psta->uapsd_bk & BIT(1);
615                         break;
616                 case 4:
617                 case 5:
618                         wmmps_ac = psta->uapsd_vi & BIT(1);
619                         break;
620                 case 6:
621                 case 7:
622                         wmmps_ac = psta->uapsd_vo & BIT(1);
623                         break;
624                 case 0:
625                 case 3:
626                 default:
627                         wmmps_ac = psta->uapsd_be & BIT(1);
628                         break;
629                 }
630
631                 if (wmmps_ac) {
632                         if (psta->sleepq_ac_len > 0) {
633                                 /* process received triggered frame */
634                                 xmit_delivery_enabled_frames23a(padapter, psta);
635                         } else {
636                                 /* issue one qos null frame with More data bit = 0 and the EOSP bit set (= 1) */
637                                 issue_qos_nulldata23a(padapter, psta->hwaddr,
638                                                    (u16)pattrib->priority,
639                                                    0, 0);
640                         }
641                 }
642         }
643
644 #endif
645 }
646
647 static void count_rx_stats(struct rtw_adapter *padapter,
648                            struct recv_frame *prframe, struct sta_info *sta)
649 {
650         int sz;
651         struct sta_info *psta = NULL;
652         struct stainfo_stats *pstats = NULL;
653         struct rx_pkt_attrib *pattrib = & prframe->attrib;
654         struct recv_priv *precvpriv = &padapter->recvpriv;
655
656         sz = prframe->pkt->len;
657         precvpriv->rx_bytes += sz;
658
659         padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++;
660
661         if ((!is_broadcast_ether_addr(pattrib->dst)) &&
662             (!is_multicast_ether_addr(pattrib->dst)))
663                 padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++;
664
665         if (sta)
666                 psta = sta;
667         else
668                 psta = prframe->psta;
669
670         if (psta) {
671                 pstats = &psta->sta_stats;
672
673                 pstats->rx_data_pkts++;
674                 pstats->rx_bytes += sz;
675         }
676 }
677
678 static int sta2sta_data_frame(struct rtw_adapter *adapter,
679                               struct recv_frame *precv_frame,
680                               struct sta_info**psta)
681 {
682         struct sk_buff *skb = precv_frame->pkt;
683         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
684         int ret = _SUCCESS;
685         struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
686         struct sta_priv *pstapriv = &adapter->stapriv;
687         struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
688         u8 *mybssid  = get_bssid(pmlmepriv);
689         u8 *myhwaddr = myid(&adapter->eeprompriv);
690         u8 *sta_addr = NULL;
691         int bmcast = is_multicast_ether_addr(pattrib->dst);
692
693
694
695         if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
696             check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
697
698                 /*  filter packets that SA is myself or multicast or broadcast */
699                 if (ether_addr_equal(myhwaddr, pattrib->src)) {
700                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
701                                  "SA == myself\n");
702                         ret = _FAIL;
703                         goto exit;
704                 }
705
706                 if (!ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
707                         ret = _FAIL;
708                         goto exit;
709                 }
710
711                 if (ether_addr_equal(pattrib->bssid, "\x0\x0\x0\x0\x0\x0") ||
712                     ether_addr_equal(mybssid, "\x0\x0\x0\x0\x0\x0") ||
713                     !ether_addr_equal(pattrib->bssid, mybssid)) {
714                         ret = _FAIL;
715                         goto exit;
716                 }
717
718                 sta_addr = pattrib->src;
719         } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
720                 /*  For Station mode, sa and bssid should always be BSSID,
721                     and DA is my mac-address */
722                 if (!ether_addr_equal(pattrib->bssid, pattrib->src)) {
723                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
724                                  "bssid != TA under STATION_MODE; drop pkt\n");
725                         ret = _FAIL;
726                         goto exit;
727                 }
728
729                 sta_addr = pattrib->bssid;
730
731         } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
732                 if (bmcast) {
733                         /*  For AP mode, if DA == MCAST, then BSSID should be also MCAST */
734                         if (!is_multicast_ether_addr(pattrib->bssid)) {
735                                 ret = _FAIL;
736                                 goto exit;
737                         }
738                 } else { /*  not mc-frame */
739                         /*  For AP mode, if DA is non-MCAST, then it must
740                             be BSSID, and bssid == BSSID */
741                         if (!ether_addr_equal(pattrib->bssid, pattrib->dst)) {
742                                 ret = _FAIL;
743                                 goto exit;
744                         }
745
746                         sta_addr = pattrib->src;
747                 }
748         } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
749                 ether_addr_copy(pattrib->dst, hdr->addr1);
750                 ether_addr_copy(pattrib->src, hdr->addr2);
751                 ether_addr_copy(pattrib->bssid, hdr->addr3);
752                 ether_addr_copy(pattrib->ra, pattrib->dst);
753                 ether_addr_copy(pattrib->ta, pattrib->src);
754
755                 sta_addr = mybssid;
756         } else {
757                 ret  = _FAIL;
758         }
759
760         if (bmcast)
761                 *psta = rtw_get_bcmc_stainfo23a(adapter);
762         else
763                 *psta = rtw_get_stainfo23a(pstapriv, sta_addr); /*  get ap_info */
764
765         if (*psta == NULL) {
766                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
767                          "can't get psta under sta2sta_data_frame ; drop pkt\n");
768                 ret = _FAIL;
769                 goto exit;
770         }
771
772 exit:
773
774         return ret;
775 }
776
777 int ap2sta_data_frame(struct rtw_adapter *adapter,
778                       struct recv_frame *precv_frame,
779                       struct sta_info **psta);
780 int ap2sta_data_frame(struct rtw_adapter *adapter,
781                       struct recv_frame *precv_frame,
782                       struct sta_info **psta)
783 {
784         struct sk_buff *skb = precv_frame->pkt;
785         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
786         struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
787         int ret = _SUCCESS;
788         struct sta_priv *pstapriv = &adapter->stapriv;
789         struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
790         u8 *mybssid  = get_bssid(pmlmepriv);
791         u8 *myhwaddr = myid(&adapter->eeprompriv);
792         int bmcast = is_multicast_ether_addr(pattrib->dst);
793
794
795
796         if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) &&
797             (check_fwstate(pmlmepriv, _FW_LINKED) ||
798              check_fwstate(pmlmepriv, _FW_UNDER_LINKING))) {
799
800                 /* filter packets that SA is myself or multicast or broadcast */
801                 if (ether_addr_equal(myhwaddr, pattrib->src)) {
802                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
803                                  "SA == myself\n");
804                         ret = _FAIL;
805                         goto exit;
806                 }
807
808                 /*  da should be for me */
809                 if (!ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
810                         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
811                                  "ap2sta_data_frame:  compare DA failed; DA=%pM\n",
812                                  pattrib->dst);
813                         ret = _FAIL;
814                         goto exit;
815                 }
816
817                 /*  check BSSID */
818                 if (ether_addr_equal(pattrib->bssid, "\x0\x0\x0\x0\x0\x0") ||
819                     ether_addr_equal(mybssid, "\x0\x0\x0\x0\x0\x0") ||
820                     !ether_addr_equal(pattrib->bssid, mybssid)) {
821                         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
822                                  "ap2sta_data_frame:  compare BSSID failed; BSSID=%pM\n",
823                                  pattrib->bssid);
824                         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
825                                  "mybssid=%pM\n", mybssid);
826
827                         if (!bmcast) {
828                                 DBG_8723A("issue_deauth23a to the nonassociated ap=%pM for the reason(7)\n",
829                                           pattrib->bssid);
830                                 issue_deauth23a(adapter, pattrib->bssid,
831                                              WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
832                         }
833
834                         ret = _FAIL;
835                         goto exit;
836                 }
837
838                 if (bmcast)
839                         *psta = rtw_get_bcmc_stainfo23a(adapter);
840                 else
841                         /*  get ap_info */
842                         *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
843
844                 if (*psta == NULL) {
845                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
846                                  "ap2sta: can't get psta under STATION_MODE; drop pkt\n");
847                         ret = _FAIL;
848                         goto exit;
849                 }
850
851                 if (ieee80211_is_nullfunc(hdr->frame_control)) {
852                         /* No data, will not indicate to upper layer,
853                            temporily count it here */
854                         count_rx_stats(adapter, precv_frame, *psta);
855                         ret = RTW_RX_HANDLED;
856                         goto exit;
857                 }
858
859         } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) &&
860                    check_fwstate(pmlmepriv, _FW_LINKED)) {
861                 ether_addr_copy(pattrib->dst, hdr->addr1);
862                 ether_addr_copy(pattrib->src, hdr->addr2);
863                 ether_addr_copy(pattrib->bssid, hdr->addr3);
864                 ether_addr_copy(pattrib->ra, pattrib->dst);
865                 ether_addr_copy(pattrib->ta, pattrib->src);
866
867                 /*  */
868                 ether_addr_copy(pattrib->bssid,  mybssid);
869
870                 /*  get sta_info */
871                 *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
872                 if (*psta == NULL) {
873                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
874                                  "can't get psta under MP_MODE ; drop pkt\n");
875                         ret = _FAIL;
876                         goto exit;
877                 }
878         } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
879                 /* Special case */
880                 ret = RTW_RX_HANDLED;
881                 goto exit;
882         } else {
883                 if (ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
884                         *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
885                         if (*psta == NULL) {
886                                 DBG_8723A("issue_deauth23a to the ap=%pM for the reason(7)\n",
887                                           pattrib->bssid);
888
889                                 issue_deauth23a(adapter, pattrib->bssid,
890                                              WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
891                         }
892                 }
893
894                 ret = _FAIL;
895         }
896
897 exit:
898
899
900
901         return ret;
902 }
903
904 int sta2ap_data_frame(struct rtw_adapter *adapter,
905                       struct recv_frame *precv_frame,
906                       struct sta_info **psta);
907 int sta2ap_data_frame(struct rtw_adapter *adapter,
908                       struct recv_frame *precv_frame,
909                       struct sta_info **psta)
910 {
911         struct sk_buff *skb = precv_frame->pkt;
912         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
913         struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
914         struct sta_priv *pstapriv = &adapter->stapriv;
915         struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
916         unsigned char *mybssid = get_bssid(pmlmepriv);
917         int ret = _SUCCESS;
918
919
920
921         if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
922                 /* For AP mode, RA = BSSID, TX = STA(SRC_ADDR), A3 = DST_ADDR */
923                 if (!ether_addr_equal(pattrib->bssid, mybssid)) {
924                         ret = _FAIL;
925                         goto exit;
926                 }
927
928                 *psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
929                 if (*psta == NULL) {
930                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
931                                  "can't get psta under AP_MODE; drop pkt\n");
932                         DBG_8723A("issue_deauth23a to sta=%pM for the reason(7)\n",
933                                   pattrib->src);
934
935                         issue_deauth23a(adapter, pattrib->src,
936                                      WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
937
938                         ret = RTW_RX_HANDLED;
939                         goto exit;
940                 }
941
942                 process23a_pwrbit_data(adapter, precv_frame);
943
944                 /* We only get here if it's a data frame, so no need to
945                  * confirm data frame type first */
946                 if (ieee80211_is_data_qos(hdr->frame_control))
947                         process_wmmps_data(adapter, precv_frame);
948
949                 if (ieee80211_is_nullfunc(hdr->frame_control)) {
950                         /* No data, will not indicate to upper layer,
951                            temporily count it here */
952                         count_rx_stats(adapter, precv_frame, *psta);
953                         ret = RTW_RX_HANDLED;
954                         goto exit;
955                 }
956         } else {
957                 u8 *myhwaddr = myid(&adapter->eeprompriv);
958
959                 if (!ether_addr_equal(pattrib->ra, myhwaddr)) {
960                         ret = RTW_RX_HANDLED;
961                         goto exit;
962                 }
963                 DBG_8723A("issue_deauth23a to sta=%pM for the reason(7)\n",
964                           pattrib->src);
965                 issue_deauth23a(adapter, pattrib->src,
966                              WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
967                 ret = RTW_RX_HANDLED;
968                 goto exit;
969         }
970
971 exit:
972
973
974
975         return ret;
976 }
977
978 static int validate_recv_ctrl_frame(struct rtw_adapter *padapter,
979                                     struct recv_frame *precv_frame)
980 {
981 #ifdef CONFIG_8723AU_AP_MODE
982         struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
983         struct sta_priv *pstapriv = &padapter->stapriv;
984         struct sk_buff *skb = precv_frame->pkt;
985         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
986
987         if (!ieee80211_is_ctl(hdr->frame_control))
988                 return _FAIL;
989
990         /* receive the frames that ra(a1) is my address */
991         if (!ether_addr_equal(hdr->addr1, myid(&padapter->eeprompriv)))
992                 return _FAIL;
993
994         /* only handle ps-poll */
995         if (ieee80211_is_pspoll(hdr->frame_control)) {
996                 struct ieee80211_pspoll *psp = (struct ieee80211_pspoll *)hdr;
997                 u16 aid;
998                 u8 wmmps_ac = 0;
999                 struct sta_info *psta = NULL;
1000
1001                 aid = le16_to_cpu(psp->aid) & 0x3fff;
1002                 psta = rtw_get_stainfo23a(pstapriv, hdr->addr2);
1003
1004                 if (!psta || psta->aid != aid)
1005                         return _FAIL;
1006
1007                 /* for rx pkt statistics */
1008                 psta->sta_stats.rx_ctrl_pkts++;
1009
1010                 switch (pattrib->priority) {
1011                 case 1:
1012                 case 2:
1013                         wmmps_ac = psta->uapsd_bk & BIT(0);
1014                         break;
1015                 case 4:
1016                 case 5:
1017                         wmmps_ac = psta->uapsd_vi & BIT(0);
1018                         break;
1019                 case 6:
1020                 case 7:
1021                         wmmps_ac = psta->uapsd_vo & BIT(0);
1022                         break;
1023                 case 0:
1024                 case 3:
1025                 default:
1026                         wmmps_ac = psta->uapsd_be & BIT(0);
1027                         break;
1028                 }
1029
1030                 if (wmmps_ac)
1031                         return _FAIL;
1032
1033                 if (psta->state & WIFI_STA_ALIVE_CHK_STATE) {
1034                         DBG_8723A("%s alive check-rx ps-poll\n", __func__);
1035                         psta->expire_to = pstapriv->expire_to;
1036                         psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
1037                 }
1038
1039                 if ((psta->state & WIFI_SLEEP_STATE) &&
1040                     (pstapriv->sta_dz_bitmap & CHKBIT(psta->aid))) {
1041                         struct list_head *xmitframe_phead;
1042                         struct xmit_frame *pxmitframe;
1043                         struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1044
1045                         spin_lock_bh(&pxmitpriv->lock);
1046
1047                         xmitframe_phead = get_list_head(&psta->sleep_q);
1048                         pxmitframe = list_first_entry_or_null(xmitframe_phead,
1049                                                               struct xmit_frame,
1050                                                               list);
1051                         if (pxmitframe) {
1052                                 list_del_init(&pxmitframe->list);
1053
1054                                 psta->sleepq_len--;
1055
1056                                 if (psta->sleepq_len>0)
1057                                         pxmitframe->attrib.mdata = 1;
1058                                 else
1059                                         pxmitframe->attrib.mdata = 0;
1060
1061                                 pxmitframe->attrib.triggered = 1;
1062
1063                                 rtl8723au_hal_xmitframe_enqueue(padapter,
1064                                                                 pxmitframe);
1065
1066                                 if (psta->sleepq_len == 0) {
1067                                         pstapriv->tim_bitmap &= ~CHKBIT(psta->aid);
1068                                         update_beacon23a(padapter, WLAN_EID_TIM,
1069                                                          NULL, false);
1070                                 }
1071
1072                                 spin_unlock_bh(&pxmitpriv->lock);
1073
1074                         } else {
1075                                 spin_unlock_bh(&pxmitpriv->lock);
1076
1077                                 if (pstapriv->tim_bitmap & CHKBIT(psta->aid)) {
1078                                         if (psta->sleepq_len == 0) {
1079                                                 DBG_8723A("no buffered packets "
1080                                                           "to xmit\n");
1081
1082                                                 /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */
1083                                                 issue_nulldata23a(padapter,
1084                                                                psta->hwaddr,
1085                                                                0, 0, 0);
1086                                         } else {
1087                                                 DBG_8723A("error!psta->sleepq"
1088                                                           "_len =%d\n",
1089                                                           psta->sleepq_len);
1090                                                 psta->sleepq_len = 0;
1091                                         }
1092
1093                                         pstapriv->tim_bitmap &= ~CHKBIT(psta->aid);
1094
1095                                         update_beacon23a(padapter, WLAN_EID_TIM,
1096                                                          NULL, false);
1097                                 }
1098                         }
1099                 }
1100         }
1101
1102 #endif
1103         return _FAIL;
1104 }
1105
1106 struct recv_frame *recvframe_chk_defrag23a(struct rtw_adapter *padapter,
1107                                         struct recv_frame *precv_frame);
1108 static int validate_recv_mgnt_frame(struct rtw_adapter *padapter,
1109                                     struct recv_frame *precv_frame)
1110 {
1111         struct sta_info *psta;
1112         struct sk_buff *skb;
1113         struct ieee80211_hdr *hdr;
1114
1115         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1116                  "+validate_recv_mgnt_frame\n");
1117
1118         precv_frame = recvframe_chk_defrag23a(padapter, precv_frame);
1119         if (precv_frame == NULL) {
1120                 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
1121                          "%s: fragment packet\n", __func__);
1122                 return _SUCCESS;
1123         }
1124
1125         skb = precv_frame->pkt;
1126         hdr = (struct ieee80211_hdr *) skb->data;
1127
1128                 /* for rx pkt statistics */
1129         psta = rtw_get_stainfo23a(&padapter->stapriv, hdr->addr2);
1130         if (psta) {
1131                 psta->sta_stats.rx_mgnt_pkts++;
1132
1133                 if (ieee80211_is_beacon(hdr->frame_control))
1134                         psta->sta_stats.rx_beacon_pkts++;
1135                 else if (ieee80211_is_probe_req(hdr->frame_control))
1136                         psta->sta_stats.rx_probereq_pkts++;
1137                 else if (ieee80211_is_probe_resp(hdr->frame_control)) {
1138                         if (ether_addr_equal(padapter->eeprompriv.mac_addr,
1139                                     hdr->addr1))
1140                                 psta->sta_stats.rx_probersp_pkts++;
1141                         else if (is_broadcast_ether_addr(hdr->addr1) ||
1142                                  is_multicast_ether_addr(hdr->addr1))
1143                                 psta->sta_stats.rx_probersp_bm_pkts++;
1144                         else
1145                                 psta->sta_stats.rx_probersp_uo_pkts++;
1146                 }
1147         }
1148
1149         mgt_dispatcher23a(padapter, precv_frame);
1150
1151         return _SUCCESS;
1152 }
1153
1154 static int validate_recv_data_frame(struct rtw_adapter *adapter,
1155                                     struct recv_frame *precv_frame)
1156 {
1157         u8 bretry;
1158         u8 *psa, *pda;
1159         struct sta_info *psta = NULL;
1160         struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
1161         struct security_priv *psecuritypriv = &adapter->securitypriv;
1162         int ret = _SUCCESS;
1163         struct sk_buff *skb = precv_frame->pkt;
1164         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1165
1166
1167
1168         bretry = ieee80211_has_retry(hdr->frame_control);
1169         pda = ieee80211_get_DA(hdr);
1170         psa = ieee80211_get_SA(hdr);
1171
1172         ether_addr_copy(pattrib->dst, pda);
1173         ether_addr_copy(pattrib->src, psa);
1174
1175         switch (hdr->frame_control &
1176                 cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
1177         case cpu_to_le16(0):
1178                 ether_addr_copy(pattrib->bssid, hdr->addr3);
1179                 ether_addr_copy(pattrib->ra, pda);
1180                 ether_addr_copy(pattrib->ta, psa);
1181                 ret = sta2sta_data_frame(adapter, precv_frame, &psta);
1182                 break;
1183
1184         case cpu_to_le16(IEEE80211_FCTL_FROMDS):
1185                 ether_addr_copy(pattrib->bssid, hdr->addr2);
1186                 ether_addr_copy(pattrib->ra, pda);
1187                 ether_addr_copy(pattrib->ta, hdr->addr2);
1188                 ret = ap2sta_data_frame(adapter, precv_frame, &psta);
1189                 break;
1190
1191         case cpu_to_le16(IEEE80211_FCTL_TODS):
1192                 ether_addr_copy(pattrib->bssid, hdr->addr1);
1193                 ether_addr_copy(pattrib->ra, hdr->addr1);
1194                 ether_addr_copy(pattrib->ta, psa);
1195                 ret = sta2ap_data_frame(adapter, precv_frame, &psta);
1196                 break;
1197
1198         case cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
1199                 /*
1200                  * There is no BSSID in this case, but the driver has been
1201                  * using addr1 so far, so keep it for now.
1202                  */
1203                 ether_addr_copy(pattrib->bssid, hdr->addr1);
1204                 ether_addr_copy(pattrib->ra, hdr->addr1);
1205                 ether_addr_copy(pattrib->ta, hdr->addr2);
1206                 ret = _FAIL;
1207                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, "case 3\n");
1208                 break;
1209         }
1210
1211         if ((ret == _FAIL) || (ret == RTW_RX_HANDLED))
1212                 goto exit;
1213
1214         if (!psta) {
1215                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1216                          "after to_fr_ds_chk; psta == NULL\n");
1217                 ret = _FAIL;
1218                 goto exit;
1219         }
1220
1221         precv_frame->psta = psta;
1222
1223         pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr);
1224         if (ieee80211_has_a4(hdr->frame_control))
1225                 pattrib->hdrlen += ETH_ALEN;
1226
1227         /* parsing QC field */
1228         if (pattrib->qos == 1) {
1229                 __le16 *qptr = (__le16 *)ieee80211_get_qos_ctl(hdr);
1230                 u16 qos_ctrl = le16_to_cpu(*qptr);
1231
1232                 pattrib->priority = qos_ctrl & IEEE80211_QOS_CTL_TID_MASK;
1233                 pattrib->ack_policy = (qos_ctrl >> 5) & 3;
1234                 pattrib->amsdu =
1235                         (qos_ctrl & IEEE80211_QOS_CTL_A_MSDU_PRESENT) >> 7;
1236                 pattrib->hdrlen += IEEE80211_QOS_CTL_LEN;
1237
1238                 if (pattrib->priority != 0 && pattrib->priority != 3) {
1239                         adapter->recvpriv.bIsAnyNonBEPkts = true;
1240                 }
1241         } else {
1242                 pattrib->priority = 0;
1243                 pattrib->ack_policy = 0;
1244                 pattrib->amsdu = 0;
1245         }
1246
1247         if (pattrib->order) { /* HT-CTRL 11n */
1248                 pattrib->hdrlen += 4;
1249         }
1250
1251         precv_frame->preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority];
1252
1253         /*  decache, drop duplicate recv packets */
1254         if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) ==
1255             _FAIL) {
1256                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1257                          "decache : drop pkt\n");
1258                 ret = _FAIL;
1259                 goto exit;
1260         }
1261
1262         if (pattrib->privacy) {
1263                 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1264                          "validate_recv_data_frame:pattrib->privacy =%x\n",
1265                          pattrib->privacy);
1266                 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1267                          "^^^^^^^^^^^is_multicast_ether_addr(pattrib->ra(0x%02x)) =%d^^^^^^^^^^^^^^^6\n",
1268                          pattrib->ra[0],
1269                          is_multicast_ether_addr(pattrib->ra));
1270
1271                 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt,
1272                                is_multicast_ether_addr(pattrib->ra));
1273
1274                 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1275                          "pattrib->encrypt =%d\n", pattrib->encrypt);
1276
1277                 switch (pattrib->encrypt) {
1278                 case WLAN_CIPHER_SUITE_WEP40:
1279                 case WLAN_CIPHER_SUITE_WEP104:
1280                         pattrib->iv_len = IEEE80211_WEP_IV_LEN;
1281                         pattrib->icv_len = IEEE80211_WEP_ICV_LEN;
1282                         break;
1283                 case WLAN_CIPHER_SUITE_TKIP:
1284                         pattrib->iv_len = IEEE80211_TKIP_IV_LEN;
1285                         pattrib->icv_len = IEEE80211_TKIP_ICV_LEN;
1286                         break;
1287                 case WLAN_CIPHER_SUITE_CCMP:
1288                         pattrib->iv_len = IEEE80211_CCMP_HDR_LEN;
1289                         pattrib->icv_len = IEEE80211_CCMP_MIC_LEN;
1290                         break;
1291                 default:
1292                         pattrib->iv_len = 0;
1293                         pattrib->icv_len = 0;
1294                         break;
1295                 }
1296         } else {
1297                 pattrib->encrypt = 0;
1298                 pattrib->iv_len = 0;
1299                 pattrib->icv_len = 0;
1300         }
1301
1302 exit:
1303
1304
1305
1306         return ret;
1307 }
1308
1309 static void dump_rx_pkt(struct sk_buff *skb, u16 type, int level)
1310 {
1311         int i;
1312         u8 *ptr;
1313
1314         if ((level == 1) ||
1315             ((level == 2) && (type == IEEE80211_FTYPE_MGMT)) ||
1316             ((level == 3) && (type == IEEE80211_FTYPE_DATA))) {
1317
1318                 ptr = skb->data;
1319
1320                 DBG_8723A("#############################\n");
1321
1322                 for (i = 0; i < 64; i = i + 8)
1323                         DBG_8723A("%*phC:\n", 8, ptr + i);
1324                 DBG_8723A("#############################\n");
1325         }
1326 }
1327
1328 static int validate_recv_frame(struct rtw_adapter *adapter,
1329                                struct recv_frame *precv_frame)
1330 {
1331         /* shall check frame subtype, to / from ds, da, bssid */
1332
1333         /* then call check if rx seq/frag. duplicated. */
1334         u8 type;
1335         u8 subtype;
1336         int retval = _SUCCESS;
1337         struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
1338         struct sk_buff *skb = precv_frame->pkt;
1339         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1340         u8 ver;
1341         u8 bDumpRxPkt;
1342         u16 seq_ctrl, fctl;
1343
1344         fctl = le16_to_cpu(hdr->frame_control);
1345         ver = fctl & IEEE80211_FCTL_VERS;
1346         type = fctl & IEEE80211_FCTL_FTYPE;
1347         subtype = fctl & IEEE80211_FCTL_STYPE;
1348
1349         /* add version chk */
1350         if (ver != 0) {
1351                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1352                          "validate_recv_data_frame fail! (ver!= 0)\n");
1353                 retval = _FAIL;
1354                 goto exit;
1355         }
1356
1357         seq_ctrl = le16_to_cpu(hdr->seq_ctrl);
1358         pattrib->frag_num = seq_ctrl & IEEE80211_SCTL_FRAG;
1359         pattrib->seq_num = seq_ctrl >> 4;
1360
1361         pattrib->pw_save = ieee80211_has_pm(hdr->frame_control);
1362         pattrib->mfrag = ieee80211_has_morefrags(hdr->frame_control);
1363         pattrib->mdata = ieee80211_has_moredata(hdr->frame_control);
1364         pattrib->privacy = ieee80211_has_protected(hdr->frame_control);
1365         pattrib->order = ieee80211_has_order(hdr->frame_control);
1366
1367         GetHalDefVar8192CUsb(adapter, HAL_DEF_DBG_DUMP_RXPKT, &bDumpRxPkt);
1368
1369         if (unlikely(bDumpRxPkt == 1))
1370                 dump_rx_pkt(skb, type, bDumpRxPkt);
1371
1372         switch (type) {
1373         case IEEE80211_FTYPE_MGMT:
1374                 retval = validate_recv_mgnt_frame(adapter, precv_frame);
1375                 if (retval == _FAIL) {
1376                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1377                                  "validate_recv_mgnt_frame fail\n");
1378                 }
1379                 retval = _FAIL; /*  only data frame return _SUCCESS */
1380                 break;
1381         case IEEE80211_FTYPE_CTL:
1382                 retval = validate_recv_ctrl_frame(adapter, precv_frame);
1383                 if (retval == _FAIL) {
1384                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1385                                  "validate_recv_ctrl_frame fail\n");
1386                 }
1387                 retval = _FAIL; /*  only data frame return _SUCCESS */
1388                 break;
1389         case IEEE80211_FTYPE_DATA:
1390                 pattrib->qos = (subtype & IEEE80211_STYPE_QOS_DATA) ? 1 : 0;
1391                 retval = validate_recv_data_frame(adapter, precv_frame);
1392                 if (retval == _FAIL) {
1393                         struct recv_priv *precvpriv = &adapter->recvpriv;
1394
1395                         precvpriv->rx_drop++;
1396                 }
1397                 break;
1398         default:
1399                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1400                          "validate_recv_data_frame fail! type = 0x%x\n", type);
1401                 retval = _FAIL;
1402                 break;
1403         }
1404
1405 exit:
1406         return retval;
1407 }
1408
1409 /* remove the wlanhdr and add the eth_hdr */
1410
1411 static int wlanhdr_to_ethhdr (struct recv_frame *precvframe)
1412 {
1413         u16     eth_type, len, hdrlen;
1414         u8      bsnaphdr;
1415         u8      *psnap;
1416         struct rtw_adapter *adapter = precvframe->adapter;
1417         struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1418
1419         struct sk_buff *skb = precvframe->pkt;
1420         u8 *ptr;
1421         struct rx_pkt_attrib *pattrib = &precvframe->attrib;
1422
1423
1424
1425         ptr = skb->data;
1426         hdrlen = pattrib->hdrlen;
1427         psnap = ptr + hdrlen;
1428         eth_type = (psnap[6] << 8) | psnap[7];
1429         /* convert hdr + possible LLC headers into Ethernet header */
1430         if ((ether_addr_equal(psnap, rfc1042_header) &&
1431              eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
1432             ether_addr_equal(psnap, bridge_tunnel_header)) {
1433                 /* remove RFC1042 or Bridge-Tunnel encapsulation
1434                    and replace EtherType */
1435                 bsnaphdr = true;
1436                 hdrlen += SNAP_SIZE;
1437         } else {
1438                 /* Leave Ethernet header part of hdr and full payload */
1439                 bsnaphdr = false;
1440                 eth_type = (psnap[0] << 8) | psnap[1];
1441         }
1442
1443         len = skb->len - hdrlen;
1444
1445         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1446                  "=== pattrib->hdrlen: %x,  pattrib->iv_len:%x ===\n",
1447                  pattrib->hdrlen,  pattrib->iv_len);
1448
1449         pattrib->eth_type = eth_type;
1450         if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
1451                 ptr += hdrlen;
1452                 *ptr = 0x87;
1453                 *(ptr + 1) = 0x12;
1454
1455                 eth_type = 0x8712;
1456                 /*  append rx status for mp test packets */
1457
1458                 ptr = skb_pull(skb, (hdrlen - sizeof(struct ethhdr) + 2) - 24);
1459                 memcpy(ptr, skb->head, 24);
1460                 ptr += 24;
1461         } else {
1462                 ptr = skb_pull(skb, (hdrlen - sizeof(struct ethhdr) +
1463                                      (bsnaphdr ? 2:0)));
1464         }
1465
1466         ether_addr_copy(ptr, pattrib->dst);
1467         ether_addr_copy(ptr + ETH_ALEN, pattrib->src);
1468
1469         if (!bsnaphdr) {
1470                 put_unaligned_be16(len, ptr + 12);
1471         }
1472
1473
1474         return _SUCCESS;
1475 }
1476
1477 /* perform defrag */
1478 struct recv_frame *recvframe_defrag(struct rtw_adapter *adapter,
1479                                     struct rtw_queue *defrag_q);
1480 struct recv_frame *recvframe_defrag(struct rtw_adapter *adapter,
1481                                     struct rtw_queue *defrag_q)
1482 {
1483         struct list_head *phead;
1484         u8 wlanhdr_offset;
1485         u8 curfragnum;
1486         struct recv_frame *pnfhdr, *ptmp;
1487         struct recv_frame *prframe, *pnextrframe;
1488         struct rtw_queue *pfree_recv_queue;
1489         struct sk_buff *skb;
1490
1491         curfragnum = 0;
1492         pfree_recv_queue = &adapter->recvpriv.free_recv_queue;
1493
1494         phead = get_list_head(defrag_q);
1495         prframe = list_first_entry(phead, struct recv_frame, list);
1496         list_del_init(&prframe->list);
1497         skb = prframe->pkt;
1498
1499         if (curfragnum != prframe->attrib.frag_num) {
1500                 /* the first fragment number must be 0 */
1501                 /* free the whole queue */
1502                 rtw_free_recvframe23a(prframe);
1503                 rtw_free_recvframe23a_queue(defrag_q);
1504
1505                 return NULL;
1506         }
1507
1508         curfragnum++;
1509
1510         list_for_each_entry_safe(pnfhdr, ptmp, phead, list) {
1511                 pnextrframe = (struct recv_frame *)pnfhdr;
1512                 /* check the fragment sequence  (2nd ~n fragment frame) */
1513
1514                 if (curfragnum != pnfhdr->attrib.frag_num) {
1515                         /* the fragment number must be increasing
1516                            (after decache) */
1517                         /* release the defrag_q & prframe */
1518                         rtw_free_recvframe23a(prframe);
1519                         rtw_free_recvframe23a_queue(defrag_q);
1520                         return NULL;
1521                 }
1522
1523                 curfragnum++;
1524
1525                 /* copy the 2nd~n fragment frame's payload to the
1526                    first fragment */
1527                 /* get the 2nd~last fragment frame's payload */
1528
1529                 wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len;
1530
1531                 skb_pull(pnfhdr->pkt, wlanhdr_offset);
1532
1533                 /* append  to first fragment frame's tail
1534                    (if privacy frame, pull the ICV) */
1535
1536                 skb_trim(skb, skb->len - prframe->attrib.icv_len);
1537
1538                 memcpy(skb_tail_pointer(skb), pnfhdr->pkt->data,
1539                        pnfhdr->pkt->len);
1540
1541                 skb_put(skb, pnfhdr->pkt->len);
1542
1543                 prframe->attrib.icv_len = pnfhdr->attrib.icv_len;
1544         }
1545
1546         /* free the defrag_q queue and return the prframe */
1547         rtw_free_recvframe23a_queue(defrag_q);
1548
1549         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1550                  "Performance defrag!!!!!\n");
1551
1552         return prframe;
1553 }
1554
1555 /* check if need to defrag, if needed queue the frame to defrag_q */
1556 struct recv_frame *recvframe_chk_defrag23a(struct rtw_adapter *padapter,
1557                                         struct recv_frame *precv_frame)
1558 {
1559         u8      ismfrag;
1560         u8      fragnum;
1561         u8      *psta_addr;
1562         struct recv_frame *pfhdr;
1563         struct sta_info *psta;
1564         struct sta_priv *pstapriv;
1565         struct list_head *phead;
1566         struct recv_frame *prtnframe = NULL;
1567         struct rtw_queue *pfree_recv_queue, *pdefrag_q;
1568
1569
1570
1571         pstapriv = &padapter->stapriv;
1572
1573         pfhdr = precv_frame;
1574
1575         pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
1576
1577         /* need to define struct of wlan header frame ctrl */
1578         ismfrag = pfhdr->attrib.mfrag;
1579         fragnum = pfhdr->attrib.frag_num;
1580
1581         psta_addr = pfhdr->attrib.ta;
1582         psta = rtw_get_stainfo23a(pstapriv, psta_addr);
1583         if (!psta) {
1584                 struct ieee80211_hdr *hdr =
1585                         (struct ieee80211_hdr *) pfhdr->pkt->data;
1586                 if (!ieee80211_is_data(hdr->frame_control)) {
1587                         psta = rtw_get_bcmc_stainfo23a(padapter);
1588                         pdefrag_q = &psta->sta_recvpriv.defrag_q;
1589                 } else
1590                         pdefrag_q = NULL;
1591         } else
1592                 pdefrag_q = &psta->sta_recvpriv.defrag_q;
1593
1594         if ((ismfrag == 0) && (fragnum == 0)) {
1595                 prtnframe = precv_frame;/* isn't a fragment frame */
1596         }
1597
1598         if (ismfrag == 1) {
1599                 /* 0~(n-1) fragment frame */
1600                 /* enqueue to defraf_g */
1601                 if (pdefrag_q != NULL) {
1602                         if (fragnum == 0) {
1603                                 /* the first fragment */
1604                                 if (!list_empty(&pdefrag_q->queue)) {
1605                                         /* free current defrag_q */
1606                                         rtw_free_recvframe23a_queue(pdefrag_q);
1607                                 }
1608                         }
1609
1610                         /* Then enqueue the 0~(n-1) fragment into the
1611                            defrag_q */
1612
1613                         /* spin_lock(&pdefrag_q->lock); */
1614                         phead = get_list_head(pdefrag_q);
1615                         list_add_tail(&pfhdr->list, phead);
1616                         /* spin_unlock(&pdefrag_q->lock); */
1617
1618                         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1619                                  "Enqueuq: ismfrag = %d, fragnum = %d\n",
1620                                  ismfrag, fragnum);
1621
1622                         prtnframe = NULL;
1623
1624                 } else {
1625                         /* can't find this ta's defrag_queue,
1626                            so free this recv_frame */
1627                         rtw_free_recvframe23a(precv_frame);
1628                         prtnframe = NULL;
1629                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1630                                  "Free because pdefrag_q == NULL: ismfrag = %d, fragnum = %d\n",
1631                                  ismfrag, fragnum);
1632                 }
1633         }
1634
1635         if ((ismfrag == 0) && (fragnum != 0)) {
1636                 /* the last fragment frame */
1637                 /* enqueue the last fragment */
1638                 if (pdefrag_q != NULL) {
1639                         /* spin_lock(&pdefrag_q->lock); */
1640                         phead = get_list_head(pdefrag_q);
1641                         list_add_tail(&pfhdr->list, phead);
1642                         /* spin_unlock(&pdefrag_q->lock); */
1643
1644                         /* call recvframe_defrag to defrag */
1645                         RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1646                                  "defrag: ismfrag = %d, fragnum = %d\n",
1647                                  ismfrag, fragnum);
1648                         precv_frame = recvframe_defrag(padapter, pdefrag_q);
1649                         prtnframe = precv_frame;
1650                 } else {
1651                         /* can't find this ta's defrag_queue,
1652                            so free this recv_frame */
1653                         rtw_free_recvframe23a(precv_frame);
1654                         prtnframe = NULL;
1655                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1656                                  "Free because pdefrag_q == NULL: ismfrag = %d, fragnum = %d\n",
1657                                  ismfrag, fragnum);
1658                 }
1659
1660         }
1661
1662         if ((prtnframe != NULL) && (prtnframe->attrib.privacy)) {
1663                 /* after defrag we must check tkip mic code */
1664                 if (recvframe_chkmic(padapter,  prtnframe) == _FAIL) {
1665                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1666                                  "recvframe_chkmic(padapter,  prtnframe) ==_FAIL\n");
1667                         rtw_free_recvframe23a(prtnframe);
1668                         prtnframe = NULL;
1669                 }
1670         }
1671
1672
1673
1674         return prtnframe;
1675 }
1676
1677 int amsdu_to_msdu(struct rtw_adapter *padapter, struct recv_frame *prframe);
1678 int amsdu_to_msdu(struct rtw_adapter *padapter, struct recv_frame *prframe)
1679 {
1680         struct rx_pkt_attrib *pattrib;
1681         struct sk_buff *skb, *sub_skb;
1682         struct sk_buff_head skb_list;
1683
1684         pattrib = &prframe->attrib;
1685
1686         skb = prframe->pkt;
1687         skb_pull(skb, prframe->attrib.hdrlen);
1688         __skb_queue_head_init(&skb_list);
1689
1690         ieee80211_amsdu_to_8023s(skb, &skb_list, NULL, 0, 0, false);
1691
1692         while (!skb_queue_empty(&skb_list)) {
1693                 sub_skb = __skb_dequeue(&skb_list);
1694
1695                 sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev);
1696                 sub_skb->dev = padapter->pnetdev;
1697
1698                 sub_skb->ip_summed = CHECKSUM_NONE;
1699
1700                 netif_rx(sub_skb);
1701         }
1702
1703         prframe->pkt = NULL;
1704         rtw_free_recvframe23a(prframe);
1705         return _SUCCESS;
1706 }
1707
1708 int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num);
1709 int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)
1710 {
1711         u8      wsize = preorder_ctrl->wsize_b;
1712         u16     wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;
1713
1714         /*  Rx Reorder initialize condition. */
1715         if (preorder_ctrl->indicate_seq == 0xFFFF)
1716                 preorder_ctrl->indicate_seq = seq_num;
1717
1718         /*  Drop out the packet which SeqNum is smaller than WinStart */
1719         if (SN_LESS(seq_num, preorder_ctrl->indicate_seq))
1720                 return false;
1721
1722         /*  */
1723         /*  Sliding window manipulation. Conditions includes: */
1724         /*  1. Incoming SeqNum is equal to WinStart =>Window shift 1 */
1725         /*  2. Incoming SeqNum is larger than the WinEnd => Window shift N */
1726         /*  */
1727         if (SN_EQUAL(seq_num, preorder_ctrl->indicate_seq)) {
1728                 preorder_ctrl->indicate_seq =
1729                         (preorder_ctrl->indicate_seq + 1) & 0xFFF;
1730         } else if (SN_LESS(wend, seq_num)) {
1731                 /*  boundary situation, when seq_num cross 0xFFF */
1732                 if (seq_num >= (wsize - 1))
1733                         preorder_ctrl->indicate_seq = seq_num + 1 -wsize;
1734                 else
1735                         preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1;
1736         }
1737         return true;
1738 }
1739
1740 static int enqueue_reorder_recvframe23a(struct recv_reorder_ctrl *preorder_ctrl,
1741                                         struct recv_frame *prframe)
1742 {
1743         struct rx_pkt_attrib *pattrib = &prframe->attrib;
1744         struct rtw_queue *ppending_recvframe_queue;
1745         struct list_head *phead, *plist, *ptmp;
1746         struct recv_frame *hdr;
1747         struct rx_pkt_attrib *pnextattrib;
1748
1749         ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
1750         phead = get_list_head(ppending_recvframe_queue);
1751
1752         list_for_each_safe(plist, ptmp, phead) {
1753                 hdr = container_of(plist, struct recv_frame, list);
1754                 pnextattrib = &hdr->attrib;
1755
1756                 if (SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) {
1757                         continue;
1758                 } else if (SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) {
1759                         /* Duplicate entry is found!! Do not insert current entry. */
1760                         return false;
1761                 } else {
1762                         break;
1763                 }
1764
1765         }
1766
1767         list_del_init(&prframe->list);
1768
1769         list_add_tail(&prframe->list, plist);
1770
1771         return true;
1772 }
1773
1774 int recv_indicatepkts_in_order(struct rtw_adapter *padapter,
1775                                struct recv_reorder_ctrl *preorder_ctrl,
1776                                int bforced);
1777 int recv_indicatepkts_in_order(struct rtw_adapter *padapter,
1778                                struct recv_reorder_ctrl *preorder_ctrl,
1779                                int bforced)
1780 {
1781         struct list_head *phead, *plist;
1782         struct recv_frame *prframe;
1783         struct rx_pkt_attrib *pattrib;
1784         int bPktInBuf = false;
1785         struct recv_priv *precvpriv;
1786         struct rtw_queue *ppending_recvframe_queue;
1787
1788         precvpriv = &padapter->recvpriv;
1789         ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
1790         phead = get_list_head(ppending_recvframe_queue);
1791         plist = phead->next;
1792
1793         /*  Handling some condition for forced indicate case. */
1794         if (bforced) {
1795                 if (list_empty(phead)) {
1796                         return true;
1797                 }
1798
1799                 prframe = container_of(plist, struct recv_frame, list);
1800                 pattrib = &prframe->attrib;
1801                 preorder_ctrl->indicate_seq = pattrib->seq_num;
1802         }
1803
1804         /*  Prepare indication list and indication. */
1805         /*  Check if there is any packet need indicate. */
1806         while (!list_empty(phead)) {
1807
1808                 prframe = container_of(plist, struct recv_frame, list);
1809                 pattrib = &prframe->attrib;
1810
1811                 if (!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) {
1812                         RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
1813                                  "recv_indicatepkts_in_order: indicate =%d seq =%d amsdu =%d\n",
1814                                  preorder_ctrl->indicate_seq,
1815                                  pattrib->seq_num, pattrib->amsdu);
1816
1817                         plist = plist->next;
1818                         list_del_init(&prframe->list);
1819
1820                         if (SN_EQUAL(preorder_ctrl->indicate_seq,
1821                                      pattrib->seq_num)) {
1822                                 preorder_ctrl->indicate_seq =
1823                                         (preorder_ctrl->indicate_seq + 1)&0xFFF;
1824                         }
1825
1826                         if (!pattrib->amsdu) {
1827                                 if ((padapter->bDriverStopped == false) &&
1828                                     (padapter->bSurpriseRemoved == false)) {
1829                                         rtw_recv_indicatepkt23a(padapter, prframe);
1830                                 }
1831                         } else {
1832                                 if (amsdu_to_msdu(padapter, prframe) !=
1833                                     _SUCCESS)
1834                                         rtw_free_recvframe23a(prframe);
1835                         }
1836
1837                         /* Update local variables. */
1838                         bPktInBuf = false;
1839
1840                 } else {
1841                         bPktInBuf = true;
1842                         break;
1843                 }
1844
1845         }
1846
1847         return bPktInBuf;
1848 }
1849
1850 int recv_indicatepkt_reorder(struct rtw_adapter *padapter,
1851                              struct recv_frame *prframe);
1852 int recv_indicatepkt_reorder(struct rtw_adapter *padapter,
1853                              struct recv_frame *prframe)
1854 {
1855         int retval = _SUCCESS;
1856         struct rx_pkt_attrib *pattrib;
1857         struct recv_reorder_ctrl *preorder_ctrl;
1858         struct rtw_queue *ppending_recvframe_queue;
1859
1860         pattrib = &prframe->attrib;
1861         preorder_ctrl = prframe->preorder_ctrl;
1862         ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
1863
1864         if (!pattrib->amsdu) {
1865                 /* s1. */
1866                 wlanhdr_to_ethhdr(prframe);
1867
1868                 if ((pattrib->qos!= 1) || (pattrib->eth_type == ETH_P_ARP) ||
1869                     (pattrib->ack_policy != 0)) {
1870                         if ((padapter->bDriverStopped == false) &&
1871                             (padapter->bSurpriseRemoved == false)) {
1872                                 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
1873                                          "@@@@  recv_indicatepkt_reorder -recv_func recv_indicatepkt\n");
1874
1875                                 rtw_recv_indicatepkt23a(padapter, prframe);
1876                                 return _SUCCESS;
1877                         }
1878
1879                         return _FAIL;
1880                 }
1881
1882                 if (preorder_ctrl->enable == false) {
1883                         /* indicate this recv_frame */
1884                         preorder_ctrl->indicate_seq = pattrib->seq_num;
1885                         rtw_recv_indicatepkt23a(padapter, prframe);
1886
1887                         preorder_ctrl->indicate_seq =
1888                                 (preorder_ctrl->indicate_seq + 1) % 4096;
1889                         return _SUCCESS;
1890                 }
1891         } else {
1892                  /* temp filter -> means didn't support A-MSDUs in a A-MPDU */
1893                 if (preorder_ctrl->enable == false) {
1894                         preorder_ctrl->indicate_seq = pattrib->seq_num;
1895                         retval = amsdu_to_msdu(padapter, prframe);
1896
1897                         preorder_ctrl->indicate_seq =
1898                                 (preorder_ctrl->indicate_seq + 1) % 4096;
1899                         return retval;
1900                 }
1901         }
1902
1903         spin_lock_bh(&ppending_recvframe_queue->lock);
1904
1905         RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
1906                  "recv_indicatepkt_reorder: indicate =%d seq =%d\n",
1907                  preorder_ctrl->indicate_seq, pattrib->seq_num);
1908
1909         /* s2. check if winstart_b(indicate_seq) needs to been updated */
1910         if (!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) {
1911                 goto _err_exit;
1912         }
1913
1914         /* s3. Insert all packet into Reorder Queue to maintain its ordering. */
1915         if (!enqueue_reorder_recvframe23a(preorder_ctrl, prframe)) {
1916                 goto _err_exit;
1917         }
1918
1919         /* s4. */
1920         /*  Indication process. */
1921         /*  After Packet dropping and Sliding Window shifting as above,
1922             we can now just indicate the packets */
1923         /*  with the SeqNum smaller than latest WinStart and buffer
1924             other packets. */
1925         /*  */
1926         /*  For Rx Reorder condition: */
1927         /*  1. All packets with SeqNum smaller than WinStart => Indicate */
1928         /*  2. All packets with SeqNum larger than or equal to WinStart =>
1929             Buffer it. */
1930         /*  */
1931
1932         if (recv_indicatepkts_in_order(padapter, preorder_ctrl, false) == true) {
1933                 mod_timer(&preorder_ctrl->reordering_ctrl_timer,
1934                           jiffies + msecs_to_jiffies(REORDER_WAIT_TIME));
1935                 spin_unlock_bh(&ppending_recvframe_queue->lock);
1936         } else {
1937                 spin_unlock_bh(&ppending_recvframe_queue->lock);
1938                 del_timer_sync(&preorder_ctrl->reordering_ctrl_timer);
1939         }
1940         return _SUCCESS;
1941
1942 _err_exit:
1943
1944         spin_unlock_bh(&ppending_recvframe_queue->lock);
1945         return _FAIL;
1946 }
1947
1948 void rtw_reordering_ctrl_timeout_handler23a(unsigned long pcontext)
1949 {
1950         struct recv_reorder_ctrl *preorder_ctrl;
1951         struct rtw_adapter *padapter;
1952         struct rtw_queue *ppending_recvframe_queue;
1953
1954         preorder_ctrl = (struct recv_reorder_ctrl *)pcontext;
1955         padapter = preorder_ctrl->padapter;
1956         ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
1957
1958         if (padapter->bDriverStopped || padapter->bSurpriseRemoved) {
1959                 return;
1960         }
1961
1962         spin_lock_bh(&ppending_recvframe_queue->lock);
1963
1964         if (recv_indicatepkts_in_order(padapter, preorder_ctrl, true) == true) {
1965                 mod_timer(&preorder_ctrl->reordering_ctrl_timer,
1966                           jiffies + msecs_to_jiffies(REORDER_WAIT_TIME));
1967         }
1968
1969         spin_unlock_bh(&ppending_recvframe_queue->lock);
1970 }
1971
1972 int process_recv_indicatepkts(struct rtw_adapter *padapter,
1973                               struct recv_frame *prframe);
1974 int process_recv_indicatepkts(struct rtw_adapter *padapter,
1975                               struct recv_frame *prframe)
1976 {
1977         int retval = _SUCCESS;
1978         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1979         struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1980
1981         if (phtpriv->ht_option == true) { /* B/G/N Mode */
1982                 /*  including perform A-MPDU Rx Ordering Buffer Control */
1983                 if (recv_indicatepkt_reorder(padapter, prframe) != _SUCCESS) {
1984                         if ((padapter->bDriverStopped == false) &&
1985                             (padapter->bSurpriseRemoved == false)) {
1986                                 retval = _FAIL;
1987                                 return retval;
1988                         }
1989                 }
1990         } else { /* B/G mode */
1991                 retval = wlanhdr_to_ethhdr(prframe);
1992                 if (retval != _SUCCESS) {
1993                         RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1994                                  "wlanhdr_to_ethhdr: drop pkt\n");
1995                         return retval;
1996                 }
1997
1998                 if ((padapter->bDriverStopped == false) &&
1999                     (padapter->bSurpriseRemoved == false)) {
2000                         /* indicate this recv_frame */
2001                         RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
2002                                  "@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n");
2003                         rtw_recv_indicatepkt23a(padapter, prframe);
2004                 } else {
2005                         RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
2006                                  "@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n");
2007
2008                         RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
2009                                  "recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n",
2010                                  padapter->bDriverStopped,
2011                                  padapter->bSurpriseRemoved);
2012                         retval = _FAIL;
2013                         return retval;
2014                 }
2015
2016         }
2017
2018         return retval;
2019 }
2020
2021 static int recv_func_prehandle(struct rtw_adapter *padapter,
2022                                struct recv_frame *rframe)
2023 {
2024         int ret;
2025
2026         /* check the frame crtl field and decache */
2027         ret = validate_recv_frame(padapter, rframe);
2028         if (ret != _SUCCESS) {
2029                 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
2030                          "recv_func: validate_recv_frame fail! drop pkt\n");
2031                 rtw_free_recvframe23a(rframe);
2032                 goto exit;
2033         }
2034
2035 exit:
2036         return ret;
2037 }
2038
2039 static int recv_func_posthandle(struct rtw_adapter *padapter,
2040                                 struct recv_frame *prframe)
2041 {
2042         int ret = _SUCCESS;
2043         struct recv_frame *orig_prframe = prframe;
2044         struct recv_priv *precvpriv = &padapter->recvpriv;
2045
2046         /*  DATA FRAME */
2047         prframe = decryptor(padapter, prframe);
2048         if (prframe == NULL) {
2049                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
2050                          "decryptor: drop pkt\n");
2051                 ret = _FAIL;
2052                 goto _recv_data_drop;
2053         }
2054
2055         prframe = recvframe_chk_defrag23a(padapter, prframe);
2056         if (!prframe) {
2057                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
2058                          "recvframe_chk_defrag23a: drop pkt\n");
2059                 goto _recv_data_drop;
2060         }
2061
2062         /*
2063          * Pull off crypto headers
2064          */
2065         if (prframe->attrib.iv_len > 0) {
2066                 skb_pull(prframe->pkt, prframe->attrib.iv_len);
2067         }
2068
2069         if (prframe->attrib.icv_len > 0) {
2070                 skb_trim(prframe->pkt,
2071                          prframe->pkt->len - prframe->attrib.icv_len);
2072         }
2073
2074         prframe = portctrl(padapter, prframe);
2075         if (!prframe) {
2076                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
2077                          "portctrl: drop pkt\n");
2078                 ret = _FAIL;
2079                 goto _recv_data_drop;
2080         }
2081
2082         count_rx_stats(padapter, prframe, NULL);
2083
2084         ret = process_recv_indicatepkts(padapter, prframe);
2085         if (ret != _SUCCESS) {
2086                 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
2087                          "recv_func: process_recv_indicatepkts fail!\n");
2088                 rtw_free_recvframe23a(orig_prframe);/* free this recv_frame */
2089                 goto _recv_data_drop;
2090         }
2091         return ret;
2092
2093 _recv_data_drop:
2094         precvpriv->rx_drop++;
2095         return ret;
2096 }
2097
2098 int rtw_recv_entry23a(struct recv_frame *rframe)
2099 {
2100         int ret, r;
2101         struct rtw_adapter *padapter = rframe->adapter;
2102         struct rx_pkt_attrib *prxattrib = &rframe->attrib;
2103         struct recv_priv *recvpriv = &padapter->recvpriv;
2104         struct security_priv *psecuritypriv = &padapter->securitypriv;
2105         struct mlme_priv *mlmepriv = &padapter->mlmepriv;
2106
2107         /* check if need to handle uc_swdec_pending_queue*/
2108         if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
2109             psecuritypriv->busetkipkey) {
2110                 struct recv_frame *pending_frame;
2111
2112                 while ((pending_frame = rtw_alloc_recvframe23a(&padapter->recvpriv.uc_swdec_pending_queue))) {
2113                         r = recv_func_posthandle(padapter, pending_frame);
2114                         if (r == _SUCCESS)
2115                                 DBG_8723A("%s: dequeue uc_swdec_pending_queue\n", __func__);
2116                 }
2117         }
2118
2119         ret = recv_func_prehandle(padapter, rframe);
2120
2121         if (ret == _SUCCESS) {
2122                 /* check if need to enqueue into uc_swdec_pending_queue*/
2123                 if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
2124                     !is_multicast_ether_addr(prxattrib->ra) &&
2125                     prxattrib->encrypt > 0 &&
2126                     (prxattrib->bdecrypted == 0) &&
2127                     !is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm) &&
2128                     !psecuritypriv->busetkipkey) {
2129                         rtw_enqueue_recvframe23a(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
2130                         DBG_8723A("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
2131                         goto exit;
2132                 }
2133
2134                 ret = recv_func_posthandle(padapter, rframe);
2135
2136                 recvpriv->rx_pkts++;
2137         }
2138
2139 exit:
2140         return ret;
2141 }
2142
2143 void rtw_signal_stat_timer_hdl23a(unsigned long data)
2144 {
2145         struct rtw_adapter *adapter = (struct rtw_adapter *)data;
2146         struct recv_priv *recvpriv = &adapter->recvpriv;
2147
2148         u32 tmp_s, tmp_q;
2149         u8 avg_signal_strength = 0;
2150         u8 avg_signal_qual = 0;
2151         u32 num_signal_strength = 0;
2152         u32 num_signal_qual = 0;
2153         u8 _alpha = 3;  /* this value is based on converging_constant = 5000 */
2154                         /* and sampling_interval = 1000 */
2155
2156         if (recvpriv->signal_strength_data.update_req == 0) {
2157                 /*  update_req is clear, means we got rx */
2158                 avg_signal_strength = recvpriv->signal_strength_data.avg_val;
2159                 num_signal_strength = recvpriv->signal_strength_data.total_num;
2160                 /*  after avg_vals are acquired, we can re-stat */
2161                 /* the signal values */
2162                 recvpriv->signal_strength_data.update_req = 1;
2163         }
2164
2165         if (recvpriv->signal_qual_data.update_req == 0) {
2166                 /*  update_req is clear, means we got rx */
2167                 avg_signal_qual = recvpriv->signal_qual_data.avg_val;
2168                 num_signal_qual = recvpriv->signal_qual_data.total_num;
2169                 /*  after avg_vals are acquired, we can re-stat */
2170                 /*the signal values */
2171                 recvpriv->signal_qual_data.update_req = 1;
2172         }
2173
2174         /* update value of signal_strength, rssi, signal_qual */
2175         if (!check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY)) {
2176                 tmp_s = avg_signal_strength + (_alpha - 1) *
2177                          recvpriv->signal_strength;
2178                 if (tmp_s %_alpha)
2179                         tmp_s = tmp_s / _alpha + 1;
2180                 else
2181                         tmp_s = tmp_s / _alpha;
2182                 if (tmp_s > 100)
2183                         tmp_s = 100;
2184
2185                 tmp_q = avg_signal_qual + (_alpha - 1) * recvpriv->signal_qual;
2186                 if (tmp_q %_alpha)
2187                         tmp_q = tmp_q / _alpha + 1;
2188                 else
2189                         tmp_q = tmp_q / _alpha;
2190                 if (tmp_q > 100)
2191                         tmp_q = 100;
2192
2193                 recvpriv->signal_strength = tmp_s;
2194                 recvpriv->signal_qual = tmp_q;
2195
2196                 DBG_8723A("%s signal_strength:%3u, signal_qual:%3u, "
2197                           "num_signal_strength:%u, num_signal_qual:%u\n",
2198                           __func__, recvpriv->signal_strength,
2199                           recvpriv->signal_qual, num_signal_strength,
2200                           num_signal_qual);
2201         }
2202
2203         rtw_set_signal_stat_timer(recvpriv);
2204 }