Merge branch 'linux-linaro-lsk-v4.4-android' of git://git.linaro.org/kernel/linux...
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / os_dep / linux / recv_linux.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 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  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #define _RECV_OSDEP_C_
21
22 #include <drv_types.h>
23
24 int rtw_os_alloc_recvframe(_adapter *padapter, union recv_frame *precvframe, u8 *pdata, _pkt *pskb)
25 {
26         int res = _SUCCESS;
27         u8      shift_sz = 0;
28         u32     skb_len, alloc_sz;
29         _pkt     *pkt_copy = NULL;      
30         struct rx_pkt_attrib *pattrib = &precvframe->u.hdr.attrib;
31
32
33         if(pdata == NULL)
34         {               
35                 precvframe->u.hdr.pkt = NULL;
36                 res = _FAIL;
37                 return res;
38         }       
39
40
41         //      Modified by Albert 20101213
42         //      For 8 bytes IP header alignment.
43         shift_sz = pattrib->qos ? 6:0;//        Qos data, wireless lan header length is 26
44
45         skb_len = pattrib->pkt_len;
46
47         // for first fragment packet, driver need allocate 1536+drvinfo_sz+RXDESC_SIZE to defrag packet.
48         // modify alloc_sz for recvive crc error packet by thomas 2011-06-02
49         if((pattrib->mfrag == 1)&&(pattrib->frag_num == 0))
50         {
51                 //alloc_sz = 1664;      //1664 is 128 alignment.
52                 alloc_sz = (skb_len <= 1650) ? 1664:(skb_len + 14);             
53         }
54         else 
55         {
56                 alloc_sz = skb_len;
57                 //      6 is for IP header 8 bytes alignment in QoS packet case.
58                 //      8 is for skb->data 4 bytes alignment.
59                 alloc_sz += 14;
60         }       
61
62         pkt_copy = rtw_skb_alloc(alloc_sz);
63
64         if(pkt_copy)
65         {
66                 pkt_copy->dev = padapter->pnetdev;
67                 precvframe->u.hdr.pkt = pkt_copy;
68                 precvframe->u.hdr.rx_head = pkt_copy->data;
69                 precvframe->u.hdr.rx_end = pkt_copy->data + alloc_sz;
70                 skb_reserve(pkt_copy, 8 - ((SIZE_PTR)( pkt_copy->data) & 7 ));//force pkt_copy->data at 8-byte alignment address
71                 skb_reserve(pkt_copy, shift_sz);//force ip_hdr at 8-byte alignment address according to shift_sz.
72                 _rtw_memcpy(pkt_copy->data, pdata, skb_len);
73                 precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pkt_copy->data;
74         }
75         else
76         {
77 #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
78                 DBG_871X("%s:can not allocate memory for skb copy\n", __FUNCTION__);
79
80                 precvframe->u.hdr.pkt = NULL;
81
82                 //rtw_free_recvframe(precvframe, pfree_recv_queue);
83                 //goto _exit_recvbuf2recvframe;
84
85                 res = _FAIL;    
86 #else
87                 if((pattrib->mfrag == 1)&&(pattrib->frag_num == 0))
88                 {                               
89                         DBG_871X("%s: alloc_skb fail , drop frag frame \n", __FUNCTION__);
90                         //rtw_free_recvframe(precvframe, pfree_recv_queue);
91                         res = _FAIL;
92                         goto exit_rtw_os_recv_resource_alloc;
93                 }
94
95                 if(pskb == NULL)
96                 {
97                         res = _FAIL;
98                         goto exit_rtw_os_recv_resource_alloc;
99                 }
100                         
101                 precvframe->u.hdr.pkt = rtw_skb_clone(pskb);
102                 if(precvframe->u.hdr.pkt)
103                 {
104                         precvframe->u.hdr.rx_head = precvframe->u.hdr.rx_data = precvframe->u.hdr.rx_tail = pdata;
105                         precvframe->u.hdr.rx_end =  pdata + alloc_sz;
106                 }
107                 else
108                 {
109                         DBG_871X("%s: rtw_skb_clone fail\n", __FUNCTION__);
110                         //rtw_free_recvframe(precvframe, pfree_recv_queue);
111                         //goto _exit_recvbuf2recvframe;
112                         res = _FAIL;
113                 }
114 #endif                  
115         }               
116
117 exit_rtw_os_recv_resource_alloc:
118
119         return res;
120
121 }
122
123 void rtw_os_free_recvframe(union recv_frame *precvframe)
124 {
125         if(precvframe->u.hdr.pkt)
126         {
127                 rtw_skb_free(precvframe->u.hdr.pkt);//free skb by driver
128
129                 precvframe->u.hdr.pkt = NULL;
130         }
131 }
132
133 //init os related resource in struct recv_priv
134 int rtw_os_recv_resource_init(struct recv_priv *precvpriv, _adapter *padapter)
135 {
136         int     res=_SUCCESS;
137
138         return res;
139 }
140
141 //alloc os related resource in union recv_frame
142 int rtw_os_recv_resource_alloc(_adapter *padapter, union recv_frame *precvframe)
143 {
144         int     res=_SUCCESS;
145         
146         precvframe->u.hdr.pkt_newalloc = precvframe->u.hdr.pkt = NULL;
147
148         return res;
149 }
150
151 //free os related resource in union recv_frame
152 void rtw_os_recv_resource_free(struct recv_priv *precvpriv)
153 {
154         sint i;
155         union recv_frame *precvframe;
156         precvframe = (union recv_frame*) precvpriv->precv_frame_buf;
157
158         for(i=0; i < NR_RECVFRAME; i++)
159         {
160                 if(precvframe->u.hdr.pkt)
161                 {
162                         rtw_skb_free(precvframe->u.hdr.pkt);//free skb by driver
163                         precvframe->u.hdr.pkt = NULL;
164                 }
165                 precvframe++;
166         }
167 }
168
169 //alloc os related resource in struct recv_buf
170 int rtw_os_recvbuf_resource_alloc(_adapter *padapter, struct recv_buf *precvbuf)
171 {
172         int res=_SUCCESS;
173
174 #ifdef CONFIG_USB_HCI
175         struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
176         struct usb_device       *pusbd = pdvobjpriv->pusbdev;
177
178         precvbuf->irp_pending = _FALSE;
179         precvbuf->purb = usb_alloc_urb(0, GFP_KERNEL);
180         if(precvbuf->purb == NULL){
181                 res = _FAIL;
182         }
183
184         precvbuf->pskb = NULL;
185
186         precvbuf->reuse = _FALSE;
187
188         precvbuf->pallocated_buf  = precvbuf->pbuf = NULL;
189
190         precvbuf->pdata = precvbuf->phead = precvbuf->ptail = precvbuf->pend = NULL;
191
192         precvbuf->transfer_len = 0;
193
194         precvbuf->len = 0;
195
196         #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
197         precvbuf->pallocated_buf = rtw_usb_buffer_alloc(pusbd, (size_t)precvbuf->alloc_sz, &precvbuf->dma_transfer_addr);
198         precvbuf->pbuf = precvbuf->pallocated_buf;
199         if(precvbuf->pallocated_buf == NULL)
200                 return _FAIL;
201         #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX
202         
203 #endif //CONFIG_USB_HCI
204
205         return res;
206 }
207
208 //free os related resource in struct recv_buf
209 int rtw_os_recvbuf_resource_free(_adapter *padapter, struct recv_buf *precvbuf)
210 {
211         int ret = _SUCCESS;
212
213 #ifdef CONFIG_USB_HCI
214
215 #ifdef CONFIG_USE_USB_BUFFER_ALLOC_RX
216
217         struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(padapter);
218         struct usb_device       *pusbd = pdvobjpriv->pusbdev;
219
220         rtw_usb_buffer_free(pusbd, (size_t)precvbuf->alloc_sz, precvbuf->pallocated_buf, precvbuf->dma_transfer_addr);
221         precvbuf->pallocated_buf =  NULL;
222         precvbuf->dma_transfer_addr = 0;
223
224 #endif //CONFIG_USE_USB_BUFFER_ALLOC_RX
225
226         if(precvbuf->purb)
227         {
228                 //usb_kill_urb(precvbuf->purb);
229                 usb_free_urb(precvbuf->purb);
230         }
231
232 #endif //CONFIG_USB_HCI
233
234
235         if(precvbuf->pskb)
236         {
237 #ifdef CONFIG_PREALLOC_RX_SKB_BUFFER
238                 if(rtw_free_skb_premem(precvbuf->pskb)!=0)
239 #endif
240                 rtw_skb_free(precvbuf->pskb);
241         }
242         return ret;
243
244 }
245
246 _pkt *rtw_os_alloc_msdu_pkt(union recv_frame *prframe, u16 nSubframe_Length, u8 *pdata)
247 {
248         u16     eth_type;
249         u8      *data_ptr;
250         _pkt *sub_skb;
251         struct rx_pkt_attrib *pattrib;
252
253         pattrib = &prframe->u.hdr.attrib;
254
255 #ifdef CONFIG_SKB_COPY
256         sub_skb = rtw_skb_alloc(nSubframe_Length + 12);
257         if(sub_skb)
258         {
259                 skb_reserve(sub_skb, 12);
260                 data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length);
261                 _rtw_memcpy(data_ptr, (pdata + ETH_HLEN), nSubframe_Length);
262         }
263         else
264 #endif // CONFIG_SKB_COPY
265         {
266                 sub_skb = rtw_skb_clone(prframe->u.hdr.pkt);
267                 if(sub_skb)
268                 {
269                         sub_skb->data = pdata + ETH_HLEN;
270                         sub_skb->len = nSubframe_Length;
271                         skb_set_tail_pointer(sub_skb, nSubframe_Length);
272                 }
273                 else
274                 {
275                         DBG_871X("%s(): rtw_skb_clone() Fail!!!\n",__FUNCTION__);
276                         return NULL;
277                 }
278         }
279
280         eth_type = RTW_GET_BE16(&sub_skb->data[6]);
281
282         if (sub_skb->len >= 8 &&
283                 ((_rtw_memcmp(sub_skb->data, rtw_rfc1042_header, SNAP_SIZE) &&
284                   eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
285                  _rtw_memcmp(sub_skb->data, rtw_bridge_tunnel_header, SNAP_SIZE) )) {
286                 /* remove RFC1042 or Bridge-Tunnel encapsulation and replace EtherType */
287                 skb_pull(sub_skb, SNAP_SIZE);
288                 _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN);
289                 _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN);
290         } else {
291                 u16 len;
292                 /* Leave Ethernet header part of hdr and full payload */
293                 len = htons(sub_skb->len);
294                 _rtw_memcpy(skb_push(sub_skb, 2), &len, 2);
295                 _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->src, ETH_ALEN);
296                 _rtw_memcpy(skb_push(sub_skb, ETH_ALEN), pattrib->dst, ETH_ALEN);
297         }
298
299         return sub_skb;
300 }
301
302 void rtw_os_recv_indicate_pkt(_adapter *padapter, _pkt *pkt, struct rx_pkt_attrib *pattrib)
303 {
304         struct mlme_priv*pmlmepriv = &padapter->mlmepriv;
305         struct recv_priv *precvpriv = &(padapter->recvpriv);
306 #ifdef CONFIG_BR_EXT
307         void *br_port = NULL;
308 #endif
309         int ret;
310
311         /* Indicat the packets to upper layer */
312         if (pkt) {
313                 if(check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE)
314                 {
315                         _pkt *pskb2=NULL;
316                         struct sta_info *psta = NULL;
317                         struct sta_priv *pstapriv = &padapter->stapriv;
318                         int bmcast = IS_MCAST(pattrib->dst);
319
320                         //DBG_871X("bmcast=%d\n", bmcast);
321
322                         if(_rtw_memcmp(pattrib->dst, myid(&padapter->eeprompriv), ETH_ALEN)==_FALSE)
323                         {
324                                 //DBG_871X("not ap psta=%p, addr=%pM\n", psta, pattrib->dst);
325
326                                 if(bmcast)
327                                 {
328                                         psta = rtw_get_bcmc_stainfo(padapter);
329                                         pskb2 = rtw_skb_clone(pkt);
330                                 } else {
331                                         psta = rtw_get_stainfo(pstapriv, pattrib->dst);
332                                 }
333
334                                 if(psta)
335                                 {
336                                         struct net_device *pnetdev= (struct net_device*)padapter->pnetdev;                      
337
338                                         //DBG_871X("directly forwarding to the rtw_xmit_entry\n");
339
340                                         //skb->ip_summed = CHECKSUM_NONE;
341                                         pkt->dev = pnetdev;                             
342 #if (LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35))
343                                         skb_set_queue_mapping(pkt, rtw_recv_select_queue(pkt));
344 #endif //LINUX_VERSION_CODE>=KERNEL_VERSION(2,6,35)
345
346                                         _rtw_xmit_entry(pkt, pnetdev);
347
348                                         if(bmcast && (pskb2 != NULL) ) {
349                                                 pkt = pskb2;
350                                                 DBG_COUNTER(padapter->rx_logs.os_indicate_ap_mcast);
351                                         } else {
352                                                 DBG_COUNTER(padapter->rx_logs.os_indicate_ap_forward);
353                                                 return;
354                                         }
355                                 }
356                         }
357                         else// to APself
358                         {
359                                 //DBG_871X("to APSelf\n");
360                                 DBG_COUNTER(padapter->rx_logs.os_indicate_ap_self);
361                         }
362                 }
363                 
364 #ifdef CONFIG_BR_EXT
365                 // Insert NAT2.5 RX here!
366 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
367                 br_port = padapter->pnetdev->br_port;
368 #else   // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
369                 rcu_read_lock();
370                 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
371                 rcu_read_unlock();
372 #endif  // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
373
374
375                 if( br_port && (check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE) )
376                 {
377                         int nat25_handle_frame(_adapter *priv, struct sk_buff *skb);
378                         if (nat25_handle_frame(padapter, pkt) == -1) {
379                                 //priv->ext_stats.rx_data_drops++;
380                                 //DEBUG_ERR("RX DROP: nat25_handle_frame fail!\n");
381                                 //return FAIL;
382                                 
383 #if 1
384                                 // bypass this frame to upper layer!!
385 #else
386                                 rtw_skb_free(sub_skb);
387                                 continue;
388 #endif
389                         }                                                       
390                 }
391 #endif  // CONFIG_BR_EXT
392                 if( precvpriv->sink_udpport > 0)
393                         rtw_sink_rtp_seq_dbg(padapter,pkt);
394                 pkt->protocol = eth_type_trans(pkt, padapter->pnetdev);
395                 pkt->dev = padapter->pnetdev;
396
397 #ifdef CONFIG_TCP_CSUM_OFFLOAD_RX
398                 if ( (pattrib->tcpchk_valid == 1) && (pattrib->tcp_chkrpt == 1) ) {
399                         pkt->ip_summed = CHECKSUM_UNNECESSARY;
400                 } else {
401                         pkt->ip_summed = CHECKSUM_NONE;
402                 }
403 #else /* !CONFIG_TCP_CSUM_OFFLOAD_RX */
404                 pkt->ip_summed = CHECKSUM_NONE;
405 #endif //CONFIG_TCP_CSUM_OFFLOAD_RX
406
407                 ret = rtw_netif_rx(padapter->pnetdev, pkt);
408                 if (ret == NET_RX_SUCCESS)
409                         DBG_COUNTER(padapter->rx_logs.os_netif_ok);
410                 else
411                         DBG_COUNTER(padapter->rx_logs.os_netif_err);
412         }
413 }
414
415 void rtw_handle_tkip_mic_err(_adapter *padapter,u8 bgroup)
416 {
417 #ifdef CONFIG_IOCTL_CFG80211
418         enum nl80211_key_type key_type = 0;
419 #endif
420         union iwreq_data wrqu;
421         struct iw_michaelmicfailure    ev;
422         struct mlme_priv*              pmlmepriv  = &padapter->mlmepriv;
423         struct security_priv    *psecuritypriv = &padapter->securitypriv;       
424         u32 cur_time = 0;
425
426         if( psecuritypriv->last_mic_err_time == 0 )
427         {
428                 psecuritypriv->last_mic_err_time = rtw_get_current_time();
429         }
430         else
431         {
432                 cur_time = rtw_get_current_time();
433
434                 if( cur_time - psecuritypriv->last_mic_err_time < 60*HZ )
435                 {
436                         psecuritypriv->btkip_countermeasure = _TRUE;
437                         psecuritypriv->last_mic_err_time = 0;
438                         psecuritypriv->btkip_countermeasure_time = cur_time;
439                 }
440                 else
441                 {
442                         psecuritypriv->last_mic_err_time = rtw_get_current_time();
443                 }
444         }
445
446 #ifdef CONFIG_IOCTL_CFG80211
447         if ( bgroup )
448         {
449                 key_type |= NL80211_KEYTYPE_GROUP;
450         }
451         else
452         {
453                 key_type |= NL80211_KEYTYPE_PAIRWISE;
454         }
455
456         cfg80211_michael_mic_failure(padapter->pnetdev, (u8 *)&pmlmepriv->assoc_bssid[ 0 ], key_type, -1,
457                 NULL, GFP_ATOMIC);
458 #endif
459
460         _rtw_memset( &ev, 0x00, sizeof( ev ) );
461         if ( bgroup )
462         {
463             ev.flags |= IW_MICFAILURE_GROUP;
464         }
465         else
466         {
467             ev.flags |= IW_MICFAILURE_PAIRWISE;
468         }
469
470         ev.src_addr.sa_family = ARPHRD_ETHER;
471         _rtw_memcpy( ev.src_addr.sa_data, &pmlmepriv->assoc_bssid[ 0 ], ETH_ALEN );
472
473         _rtw_memset( &wrqu, 0x00, sizeof( wrqu ) );
474         wrqu.data.length = sizeof( ev );
475
476 #ifndef CONFIG_IOCTL_CFG80211
477         wireless_send_event( padapter->pnetdev, IWEVMICHAELMICFAILURE, &wrqu, (char*) &ev );
478 #endif
479 }
480
481 void rtw_hostapd_mlme_rx(_adapter *padapter, union recv_frame *precv_frame)
482 {
483 #ifdef CONFIG_HOSTAPD_MLME
484         _pkt *skb;
485         struct hostapd_priv *phostapdpriv  = padapter->phostapdpriv;
486         struct net_device *pmgnt_netdev = phostapdpriv->pmgnt_netdev;
487
488         RT_TRACE(_module_recv_osdep_c_, _drv_info_, ("+rtw_hostapd_mlme_rx\n"));
489
490         skb = precv_frame->u.hdr.pkt;
491
492         if (skb == NULL)
493                 return;
494
495         skb->data = precv_frame->u.hdr.rx_data;
496         skb->tail = precv_frame->u.hdr.rx_tail;
497         skb->len = precv_frame->u.hdr.len;
498
499         //pskb_copy = rtw_skb_copy(skb);
500 //      if(skb == NULL) goto _exit;
501
502         skb->dev = pmgnt_netdev;
503         skb->ip_summed = CHECKSUM_NONE;
504         skb->pkt_type = PACKET_OTHERHOST;
505         //skb->protocol = __constant_htons(0x0019); /*ETH_P_80211_RAW*/
506         skb->protocol = __constant_htons(0x0003); /*ETH_P_80211_RAW*/
507
508         //DBG_871X("(1)data=0x%x, head=0x%x, tail=0x%x, mac_header=0x%x, len=%d\n", skb->data, skb->head, skb->tail, skb->mac_header, skb->len);
509
510         //skb->mac.raw = skb->data;
511         skb_reset_mac_header(skb);
512
513        //skb_pull(skb, 24);
514        _rtw_memset(skb->cb, 0, sizeof(skb->cb));
515
516         rtw_netif_rx(pmgnt_netdev, skb);
517
518         precv_frame->u.hdr.pkt = NULL; // set pointer to NULL before rtw_free_recvframe() if call rtw_netif_rx()
519 #endif
520 }
521
522 #ifdef CONFIG_AUTO_AP_MODE
523 static void rtw_os_ksocket_send(_adapter *padapter, union recv_frame *precv_frame)
524 {       
525         _pkt *skb = precv_frame->u.hdr.pkt;     
526         struct rx_pkt_attrib *pattrib = &precv_frame->u.hdr.attrib;
527         struct sta_info *psta = precv_frame->u.hdr.psta;
528                 
529         DBG_871X("eth rx: got eth_type=0x%x\n", pattrib->eth_type);                                     
530                 
531         if (psta && psta->isrc && psta->pid>0)
532         {
533                 u16 rx_pid;
534
535                 rx_pid = *(u16*)(skb->data+ETH_HLEN);
536                         
537                 DBG_871X("eth rx(pid=0x%x): sta("MAC_FMT") pid=0x%x\n", 
538                         rx_pid, MAC_ARG(psta->hwaddr), psta->pid);
539
540                 if(rx_pid == psta->pid)
541                 {
542                         int i;
543                         u16 len = *(u16*)(skb->data+ETH_HLEN+2);
544                         //u16 ctrl_type = *(u16*)(skb->data+ETH_HLEN+4);
545
546                         //DBG_871X("eth, RC: len=0x%x, ctrl_type=0x%x\n", len, ctrl_type); 
547                         DBG_871X("eth, RC: len=0x%x\n", len);
548
549                         for(i=0;i<len;i++)
550                                 DBG_871X("0x%x\n", *(skb->data+ETH_HLEN+4+i));
551                                 //DBG_871X("0x%x\n", *(skb->data+ETH_HLEN+6+i));
552
553                         DBG_871X("eth, RC-end\n"); 
554
555 #if 0
556                         //send_sz = ksocket_send(padapter->ksock_send, &padapter->kaddr_send, (skb->data+ETH_HLEN+2), len);                             
557                         rtw_recv_ksocket_send_cmd(padapter, (skb->data+ETH_HLEN+2), len);
558
559                         //DBG_871X("ksocket_send size=%d\n", send_sz); 
560 #endif                  
561                 }
562                 
563         }               
564
565 }
566 #endif //CONFIG_AUTO_AP_MODE
567
568 int rtw_recv_indicatepkt(_adapter *padapter, union recv_frame *precv_frame)
569 {
570         struct recv_priv *precvpriv;
571         _queue  *pfree_recv_queue;
572         _pkt *skb;
573         struct mlme_priv*pmlmepriv = &padapter->mlmepriv;
574         struct rx_pkt_attrib *pattrib;
575         
576         if(NULL == precv_frame)
577                 goto _recv_indicatepkt_drop;
578
579         DBG_COUNTER(padapter->rx_logs.os_indicate);
580         pattrib = &precv_frame->u.hdr.attrib;
581         precvpriv = &(padapter->recvpriv);
582         pfree_recv_queue = &(precvpriv->free_recv_queue);
583
584 #ifdef CONFIG_DRVEXT_MODULE
585         if (drvext_rx_handler(padapter, precv_frame->u.hdr.rx_data, precv_frame->u.hdr.len) == _SUCCESS)
586         {
587                 goto _recv_indicatepkt_drop;
588         }
589 #endif
590
591 #ifdef CONFIG_WAPI_SUPPORT
592         if (rtw_wapi_check_for_drop(padapter,precv_frame))
593         {
594                 WAPI_TRACE(WAPI_ERR, "%s(): Rx Reorder Drop case!!\n", __FUNCTION__);
595                 goto _recv_indicatepkt_drop;
596         }
597 #endif
598
599         skb = precv_frame->u.hdr.pkt;
600         if(skb == NULL)
601         {
602                 RT_TRACE(_module_recv_osdep_c_,_drv_err_,("rtw_recv_indicatepkt():skb==NULL something wrong!!!!\n"));
603                 goto _recv_indicatepkt_drop;
604         }
605
606         RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():skb != NULL !!!\n"));                
607         RT_TRACE(_module_recv_osdep_c_,_drv_info_,("rtw_recv_indicatepkt():precv_frame->u.hdr.rx_head=%p  precv_frame->hdr.rx_data=%p\n", precv_frame->u.hdr.rx_head, precv_frame->u.hdr.rx_data));
608         RT_TRACE(_module_recv_osdep_c_,_drv_info_,("precv_frame->hdr.rx_tail=%p precv_frame->u.hdr.rx_end=%p precv_frame->hdr.len=%d \n", precv_frame->u.hdr.rx_tail, precv_frame->u.hdr.rx_end, precv_frame->u.hdr.len));
609
610         skb->data = precv_frame->u.hdr.rx_data;
611
612         skb_set_tail_pointer(skb, precv_frame->u.hdr.len);
613
614         skb->len = precv_frame->u.hdr.len;
615
616         RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n skb->head=%p skb->data=%p skb->tail=%p skb->end=%p skb->len=%d\n", skb->head, skb->data, skb_tail_pointer(skb), skb_end_pointer(skb), skb->len));
617
618 #ifdef CONFIG_AUTO_AP_MODE      
619 #if 1 //for testing
620 #if 1
621         if (0x8899 == pattrib->eth_type)
622         {
623                 rtw_os_ksocket_send(padapter, precv_frame);
624
625                 //goto _recv_indicatepkt_drop;
626         }
627 #else
628         if (0x8899 == pattrib->eth_type)
629         {
630                 rtw_auto_ap_mode_rx(padapter, precv_frame);
631                 
632                 goto _recv_indicatepkt_end;
633         }
634 #endif
635 #endif
636 #endif //CONFIG_AUTO_AP_MODE
637
638         rtw_os_recv_indicate_pkt(padapter, skb, pattrib);
639
640 _recv_indicatepkt_end:
641
642         precv_frame->u.hdr.pkt = NULL; // pointers to NULL before rtw_free_recvframe()
643
644         rtw_free_recvframe(precv_frame, pfree_recv_queue);
645
646         RT_TRACE(_module_recv_osdep_c_,_drv_info_,("\n rtw_recv_indicatepkt :after rtw_os_recv_indicate_pkt!!!!\n"));
647
648
649         return _SUCCESS;
650
651 _recv_indicatepkt_drop:
652
653          //enqueue back to free_recv_queue
654          if(precv_frame)
655                  rtw_free_recvframe(precv_frame, pfree_recv_queue);
656
657          DBG_COUNTER(padapter->rx_logs.os_indicate_err);
658
659          return _FAIL;
660
661 }
662
663 void rtw_os_read_port(_adapter *padapter, struct recv_buf *precvbuf)
664 {
665         struct recv_priv *precvpriv = &padapter->recvpriv;
666
667 #ifdef CONFIG_USB_HCI
668
669         precvbuf->ref_cnt--;
670
671         //free skb in recv_buf
672         rtw_skb_free(precvbuf->pskb);
673
674         precvbuf->pskb = NULL;
675         precvbuf->reuse = _FALSE;
676
677         if(precvbuf->irp_pending == _FALSE)
678         {
679                 rtw_read_port(padapter, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf);
680         }
681
682
683 #endif
684 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
685                 precvbuf->pskb = NULL;
686 #endif
687
688 }
689 void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext);
690 void _rtw_reordering_ctrl_timeout_handler (void *FunctionContext)
691 {
692         struct recv_reorder_ctrl *preorder_ctrl = (struct recv_reorder_ctrl *)FunctionContext;
693         rtw_reordering_ctrl_timeout_handler(preorder_ctrl);
694 }
695
696 void rtw_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl)
697 {
698         _adapter *padapter = preorder_ctrl->padapter;
699
700         _init_timer(&(preorder_ctrl->reordering_ctrl_timer), padapter->pnetdev, _rtw_reordering_ctrl_timeout_handler, preorder_ctrl);
701
702 }
703