1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
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.
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
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
19 ******************************************************************************/
22 #include <drv_types.h>
24 #if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
25 #error "Shall be Linux or Windows, but not both!\n"
29 static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
30 static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
32 static void _init_txservq(struct tx_servq *ptxservq)
35 _rtw_init_listhead(&ptxservq->tx_pending);
36 _rtw_init_queue(&ptxservq->sta_pending);
42 void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv)
47 _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv));
49 _rtw_spinlock_init(&psta_xmitpriv->lock);
51 //for(i = 0 ; i < MAX_NUMBLKS; i++)
52 // _init_txservq(&(psta_xmitpriv->blk_q[i]));
54 _init_txservq(&psta_xmitpriv->be_q);
55 _init_txservq(&psta_xmitpriv->bk_q);
56 _init_txservq(&psta_xmitpriv->vi_q);
57 _init_txservq(&psta_xmitpriv->vo_q);
58 _rtw_init_listhead(&psta_xmitpriv->legacy_dz);
59 _rtw_init_listhead(&psta_xmitpriv->apsd);
65 s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter)
68 struct xmit_buf *pxmitbuf;
69 struct xmit_frame *pxframe;
74 // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
75 //_rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv));
77 _rtw_spinlock_init(&pxmitpriv->lock);
78 _rtw_spinlock_init(&pxmitpriv->lock_sctx);
79 _rtw_init_sema(&pxmitpriv->xmit_sema, 0);
80 _rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0);
83 Please insert all the queue initializaiton using _rtw_init_queue below
86 pxmitpriv->adapter = padapter;
88 //for(i = 0 ; i < MAX_NUMBLKS; i++)
89 // _rtw_init_queue(&pxmitpriv->blk_strms[i]);
91 _rtw_init_queue(&pxmitpriv->be_pending);
92 _rtw_init_queue(&pxmitpriv->bk_pending);
93 _rtw_init_queue(&pxmitpriv->vi_pending);
94 _rtw_init_queue(&pxmitpriv->vo_pending);
95 _rtw_init_queue(&pxmitpriv->bm_pending);
97 //_rtw_init_queue(&pxmitpriv->legacy_dz_queue);
98 //_rtw_init_queue(&pxmitpriv->apsd_queue);
100 _rtw_init_queue(&pxmitpriv->free_xmit_queue);
103 Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
104 and initialize free_xmit_frame below.
105 Please also apply free_txobj to link_up all the xmit_frames...
108 pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
110 if (pxmitpriv->pallocated_frame_buf == NULL){
111 pxmitpriv->pxmit_frame_buf =NULL;
112 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_frame fail!\n"));
116 pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4);
117 //pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 -
118 // ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3);
120 pxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
122 for (i = 0; i < NR_XMITFRAME; i++)
124 _rtw_init_listhead(&(pxframe->list));
126 pxframe->padapter = padapter;
127 pxframe->frame_tag = NULL_FRAMETAG;
131 pxframe->buf_addr = NULL;
132 pxframe->pxmitbuf = NULL;
134 rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue));
139 pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;
141 pxmitpriv->frag_len = MAX_FRAG_THRESHOLD;
145 _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue);
146 _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue);
148 pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
150 if (pxmitpriv->pallocated_xmitbuf == NULL){
151 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_buf fail!\n"));
156 pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4);
157 //pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 -
158 // ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3);
160 pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmitbuf;
162 for (i = 0; i < NR_XMITBUFF; i++)
164 _rtw_init_listhead(&pxmitbuf->list);
166 pxmitbuf->priv_data = NULL;
167 pxmitbuf->padapter = padapter;
168 pxmitbuf->buf_tag = XMITBUF_DATA;
170 /* Tx buf allocation may fail sometimes, so sleep and retry. */
171 if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE)) == _FAIL) {
173 res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
179 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
180 pxmitbuf->phead = pxmitbuf->pbuf;
181 pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMITBUF_SZ;
183 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
186 pxmitbuf->flags = XMIT_VO_QUEUE;
188 rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue));
197 pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF;
199 /* init xframe_ext queue, the same count as extbuf */
200 _rtw_init_queue(&pxmitpriv->free_xframe_ext_queue);
202 pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
204 if (pxmitpriv->xframe_ext_alloc_addr == NULL){
205 pxmitpriv->xframe_ext = NULL;
206 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xframe_ext fail!\n"));
210 pxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4);
211 pxframe = (struct xmit_frame*)pxmitpriv->xframe_ext;
213 for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
214 _rtw_init_listhead(&(pxframe->list));
216 pxframe->padapter = padapter;
217 pxframe->frame_tag = NULL_FRAMETAG;
221 pxframe->buf_addr = NULL;
222 pxframe->pxmitbuf = NULL;
224 pxframe->ext_tag = 1;
226 rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xframe_ext_queue.queue));
230 pxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF;
232 // Init xmit extension buff
233 _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
235 pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
237 if (pxmitpriv->pallocated_xmit_extbuf == NULL){
238 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n"));
243 pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);
245 pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf;
247 for (i = 0; i < NR_XMIT_EXTBUFF; i++)
249 _rtw_init_listhead(&pxmitbuf->list);
251 pxmitbuf->priv_data = NULL;
252 pxmitbuf->padapter = padapter;
253 pxmitbuf->buf_tag = XMITBUF_MGNT;
255 if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
260 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
261 pxmitbuf->phead = pxmitbuf->pbuf;
262 pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ;
264 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
267 rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));
268 #ifdef DBG_XMIT_BUF_EXT
275 pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF;
277 for (i = 0; i<CMDBUF_MAX; i++) {
278 pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
280 _rtw_init_listhead(&pxmitbuf->list);
282 pxmitbuf->priv_data = NULL;
283 pxmitbuf->padapter = padapter;
284 pxmitbuf->buf_tag = XMITBUF_CMD;
286 if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
291 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
292 pxmitbuf->phead = pxmitbuf->pbuf;
293 pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
295 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
297 pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;
301 rtw_alloc_hwxmits(padapter);
302 rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
304 for (i = 0; i < 4; i ++)
306 pxmitpriv->wmm_para_seq[i] = i;
309 #ifdef CONFIG_USB_HCI
310 pxmitpriv->txirp_cnt=1;
312 _rtw_init_sema(&(pxmitpriv->tx_retevt), 0);
315 pxmitpriv->beq_cnt = 0;
316 pxmitpriv->bkq_cnt = 0;
317 pxmitpriv->viq_cnt = 0;
318 pxmitpriv->voq_cnt = 0;
322 #ifdef CONFIG_XMIT_ACK
323 pxmitpriv->ack_tx = _FALSE;
324 _rtw_mutex_init(&pxmitpriv->ack_tx_mutex);
325 rtw_sctx_init(&pxmitpriv->ack_tx_ops, 0);
328 rtw_hal_init_xmit_priv(padapter);
337 void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv);
338 void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv)
340 _rtw_spinlock_free(&pxmitpriv->lock);
341 _rtw_free_sema(&pxmitpriv->xmit_sema);
342 _rtw_free_sema(&pxmitpriv->terminate_xmitthread_sema);
344 _rtw_spinlock_free(&pxmitpriv->be_pending.lock);
345 _rtw_spinlock_free(&pxmitpriv->bk_pending.lock);
346 _rtw_spinlock_free(&pxmitpriv->vi_pending.lock);
347 _rtw_spinlock_free(&pxmitpriv->vo_pending.lock);
348 _rtw_spinlock_free(&pxmitpriv->bm_pending.lock);
350 //_rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock);
351 //_rtw_spinlock_free(&pxmitpriv->apsd_queue.lock);
353 _rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock);
354 _rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock);
355 _rtw_spinlock_free(&pxmitpriv->pending_xmitbuf_queue.lock);
359 void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
362 _adapter *padapter = pxmitpriv->adapter;
363 struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
364 struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
368 rtw_hal_free_xmit_priv(padapter);
370 rtw_mfree_xmit_priv_lock(pxmitpriv);
372 if(pxmitpriv->pxmit_frame_buf==NULL)
375 for(i=0; i<NR_XMITFRAME; i++)
377 rtw_os_xmit_complete(padapter, pxmitframe);
382 for(i=0; i<NR_XMITBUFF; i++)
384 rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
389 if(pxmitpriv->pallocated_frame_buf) {
390 rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
394 if(pxmitpriv->pallocated_xmitbuf) {
395 rtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
398 /* free xframe_ext queue, the same count as extbuf */
399 if ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) {
400 for (i=0; i<NR_XMIT_EXTBUFF; i++) {
401 rtw_os_xmit_complete(padapter, pxmitframe);
405 if (pxmitpriv->xframe_ext_alloc_addr)
406 rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
407 _rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock);
409 // free xmit extension buff
410 _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock);
412 pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
413 for(i=0; i<NR_XMIT_EXTBUFF; i++)
415 rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
420 if(pxmitpriv->pallocated_xmit_extbuf) {
421 rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
424 for (i=0; i<CMDBUF_MAX; i++) {
425 pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
427 rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);
430 rtw_free_hwxmits(padapter);
432 #ifdef CONFIG_XMIT_ACK
433 _rtw_mutex_free(&pxmitpriv->ack_tx_mutex);
442 u8 query_ra_short_GI(struct sta_info *psta)
444 u8 sgi = _FALSE, sgi_20m = _FALSE, sgi_40m = _FALSE, sgi_80m = _FALSE;
446 #ifdef CONFIG_80211N_HT
447 #ifdef CONFIG_80211AC_VHT
448 if (psta->vhtpriv.vht_option) {
449 sgi_80m= psta->vhtpriv.sgi_80m;
451 #endif //CONFIG_80211AC_VHT
453 sgi_20m = psta->htpriv.sgi_20m;
454 sgi_40m = psta->htpriv.sgi_40m;
458 switch(psta->bw_mode){
459 case CHANNEL_WIDTH_80:
462 case CHANNEL_WIDTH_40:
465 case CHANNEL_WIDTH_20:
474 static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe)
477 struct pkt_attrib *pattrib = &pxmitframe->attrib;
478 //struct sta_info *psta = pattrib->psta;
479 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
480 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
485 psta = pattrib->psta;
489 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
490 psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
495 DBG_871X("%s, psta==NUL\n", __func__);
499 if(!(psta->state &_FW_LINKED))
501 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
506 if (pattrib->nr_frags != 1)
508 sz = padapter->xmitpriv.frag_len;
512 sz = pattrib->last_txcmdsz;
515 // (1) RTS_Threshold is compared to the MPDU, not MSDU.
516 // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame.
517 // Other fragments are protected by previous fragment.
518 // So we only need to check the length of first fragment.
519 if(pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec)
521 if(sz > padapter->registrypriv.rts_thresh)
523 pattrib->vcs_mode = RTS_CTS;
528 pattrib->vcs_mode = RTS_CTS;
529 else if(pattrib->cts2self)
530 pattrib->vcs_mode = CTS_TO_SELF;
532 pattrib->vcs_mode = NONE_VCS;
541 if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF)
543 pattrib->vcs_mode = CTS_TO_SELF;
544 pattrib->rts_rate = MGN_24M;
547 else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE))
549 pattrib->vcs_mode = RTS_CTS;
550 pattrib->rts_rate = MGN_24M;
556 if((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) && (pattrib->ampdu_en==_TRUE) &&
557 (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
559 pattrib->vcs_mode = CTS_TO_SELF;
564 //check ERP protection
565 if(pattrib->rtsen || pattrib->cts2self)
568 pattrib->vcs_mode = RTS_CTS;
569 else if(pattrib->cts2self)
570 pattrib->vcs_mode = CTS_TO_SELF;
578 u8 HTOpMode = pmlmeinfo->HT_protection;
579 if((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) ||
580 (!pmlmeext->cur_bwmode && HTOpMode == 3) )
582 pattrib->vcs_mode = RTS_CTS;
588 if(sz > padapter->registrypriv.rts_thresh)
590 pattrib->vcs_mode = RTS_CTS;
594 //to do list: check MIMO power save condition.
596 //check AMPDU aggregation for TXOP
597 if((pattrib->ampdu_en==_TRUE) && (!IS_HARDWARE_TYPE_8812(padapter)))
599 pattrib->vcs_mode = RTS_CTS;
603 pattrib->vcs_mode = NONE_VCS;
608 //for debug : force driver control vrtl_carrier_sense.
609 if(padapter->driver_vcs_en==1)
611 //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
612 //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
613 pattrib->vcs_mode = padapter->driver_vcs_type;
618 static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
620 struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
622 pattrib->rtsen = psta->rtsen;
623 pattrib->cts2self = psta->cts2self;
627 pattrib->triggered=0;
628 pattrib->ampdu_spacing = 0;
630 //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
631 pattrib->qos_en = psta->qos_option;
633 pattrib->raid = psta->raid;
635 if (mlmeext->cur_bwmode < psta->bw_mode)
636 pattrib->bwmode = mlmeext->cur_bwmode;
638 pattrib->bwmode = psta->bw_mode;
640 pattrib->sgi = query_ra_short_GI(psta);
642 pattrib->ldpc = psta->ldpc;
643 pattrib->stbc = psta->stbc;
645 #ifdef CONFIG_80211N_HT
646 pattrib->ht_en = psta->htpriv.ht_option;
647 pattrib->ch_offset = psta->htpriv.ch_offset;
648 pattrib->ampdu_en = _FALSE;
650 if(padapter->driver_ampdu_spacing != 0xFF) //driver control AMPDU Density for peer sta's rx
651 pattrib->ampdu_spacing = padapter->driver_ampdu_spacing;
653 pattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing;
654 #endif //CONFIG_80211N_HT
655 //if(pattrib->ht_en && psta->htpriv.ampdu_enable)
657 // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
658 // pattrib->ampdu_en = _TRUE;
662 if (pattrib->direct_link==_TRUE) {
663 psta = pattrib->ptdls_sta;
665 pattrib->raid = psta->raid;
666 #ifdef CONFIG_80211N_HT
667 pattrib->bwmode = psta->bw_mode;
668 pattrib->ht_en = psta->htpriv.ht_option;
669 pattrib->ch_offset = psta->htpriv.ch_offset;
670 pattrib->sgi= query_ra_short_GI(psta);
671 #endif /* CONFIG_80211N_HT */
673 #endif /* CONFIG_TDLS */
675 pattrib->retry_ctrl = _FALSE;
677 #ifdef CONFIG_AUTO_AP_MODE
678 if(psta->isrc && psta->pid>0)
679 pattrib->pctrl = _TRUE;
684 static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
687 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
688 struct security_priv *psecuritypriv = &padapter->securitypriv;
689 sint bmcast = IS_MCAST(pattrib->ra);
691 _rtw_memset(pattrib->dot118021x_UncstKey.skey, 0, 16);
692 _rtw_memset(pattrib->dot11tkiptxmickey.skey, 0, 16);
693 pattrib->mac_id = psta->mac_id;
695 if (psta->ieee8021x_blocked == _TRUE)
697 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n psta->ieee8021x_blocked == _TRUE \n"));
699 pattrib->encrypt = 0;
701 if((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE))
703 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npsta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n",pattrib->ether_type));
704 #ifdef DBG_TX_DROP_FRAME
705 DBG_871X("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%04x) != 0x888e\n", __FUNCTION__,pattrib->ether_type);
713 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
715 #ifdef CONFIG_WAPI_SUPPORT
716 if(pattrib->ether_type == 0x88B4)
717 pattrib->encrypt=_NO_PRIVACY_;
720 switch(psecuritypriv->dot11AuthAlgrthm)
722 case dot11AuthAlgrthm_Open:
723 case dot11AuthAlgrthm_Shared:
724 case dot11AuthAlgrthm_Auto:
725 pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;
727 case dot11AuthAlgrthm_8021X:
729 pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid;
731 pattrib->key_idx = 0;
734 pattrib->key_idx = 0;
738 //For WPS 1.0 WEP, driver should not encrypt EAPOL Packet for WPS handshake.
739 if (((pattrib->encrypt ==_WEP40_)||(pattrib->encrypt ==_WEP104_)) && (pattrib->ether_type == 0x888e))
740 pattrib->encrypt=_NO_PRIVACY_;
745 if (pattrib->direct_link == _TRUE) {
746 if (pattrib->encrypt > 0)
747 pattrib->encrypt = _AES_;
751 switch (pattrib->encrypt)
756 pattrib->icv_len = 4;
757 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
762 pattrib->icv_len = 4;
764 if(psecuritypriv->busetkipkey==_FAIL)
766 #ifdef DBG_TX_DROP_FRAME
767 DBG_871X("DBG_TX_DROP_FRAME %s psecuritypriv->busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, psecuritypriv->busetkipkey);
774 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
776 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
779 _rtw_memcpy(pattrib->dot11tkiptxmickey.skey, psta->dot11tkiptxmickey.skey, 16);
786 pattrib->icv_len = 8;
789 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
791 AES_IV(pattrib->iv, psta->dot11txpn, 0);
795 #ifdef CONFIG_WAPI_SUPPORT
797 pattrib->iv_len = 18;
798 pattrib->icv_len = 16;
799 rtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv);
804 pattrib->icv_len = 0;
808 if(pattrib->encrypt>0)
809 _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
811 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
812 ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n",
813 pattrib->encrypt, padapter->securitypriv.sw_encrypt));
815 if (pattrib->encrypt &&
816 ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE)))
818 pattrib->bswenc = _TRUE;
819 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,
820 ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\n",
821 pattrib->encrypt, padapter->securitypriv.sw_encrypt));
823 pattrib->bswenc = _FALSE;
824 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n"));
827 #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
828 if((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_))
830 pattrib->bswenc = _TRUE;//force using sw enc.
834 #ifdef CONFIG_WAPI_SUPPORT
835 if(pattrib->encrypt == _SMS4_)
836 pattrib->bswenc = _FALSE;
845 u8 qos_acm(u8 acm_mask, u8 priority)
847 u8 change_priority = priority;
853 if(acm_mask & BIT(1))
861 if(acm_mask & BIT(2))
866 if(acm_mask & BIT(3))
870 DBG_871X("qos_acm(): invalid pattrib->priority: %d!!!\n", priority);
874 return change_priority;
877 static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
879 struct ethhdr etherhdr;
881 s32 UserPriority = 0;
884 _rtw_open_pktfile(ppktfile->pkt, ppktfile);
885 _rtw_pktfile_read(ppktfile, (unsigned char*)ðerhdr, ETH_HLEN);
887 // get UserPriority from IP hdr
888 if (pattrib->ether_type == 0x0800) {
889 _rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr));
890 // UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3;
891 UserPriority = ip_hdr.tos >> 5;
894 else if (pattrib->ether_type == 0x888e) {
895 // "When priority processing of data frames is supported,
896 // a STA's SME should send EAPOL-Key frames at the highest priority."
900 pattrib->priority = UserPriority;
901 pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
902 pattrib->subtype = WIFI_QOS_DATA_TYPE;
906 u8 rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib)
908 pattrib->ptdls_sta = NULL;
910 pattrib->direct_link = _FALSE;
911 if (padapter->tdlsinfo.link_established == _TRUE) {
912 pattrib->ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);
914 if((pattrib->ptdls_sta!=NULL)&&
915 (pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)&&
916 (pattrib->ether_type!=0x0806)){
917 pattrib->direct_link = _TRUE;
918 //DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst));
921 if (pattrib->ptdls_sta != NULL &&
922 pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {
923 pattrib->direct_link = _TRUE;
925 DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst));
929 /* ARP frame may be helped by AP*/
930 if (pattrib->ether_type != 0x0806) {
931 pattrib->direct_link = _FALSE;
936 return pattrib->direct_link;
939 s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
942 struct sta_info *psta = NULL;
943 struct sta_priv *pstapriv = &padapter->stapriv;
944 struct security_priv *psecuritypriv = &padapter->securitypriv;
945 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
946 struct qos_priv *pqospriv= &pmlmepriv->qospriv;
950 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
956 pattrib->mac_id = psta->mac_id;
957 pattrib->psta = psta;
958 pattrib->ack_policy = 0;
960 pattrib->pkt_hdrlen = ETH_HLEN;
962 // [TDLS] TODO: setup req/rsp should be AC_BK
963 if (pqospriv->qos_option && psta->qos_option) {
964 pattrib->priority = 4; //tdls management frame should be AC_VI
965 pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
966 pattrib->subtype = WIFI_QOS_DATA_TYPE;
968 pattrib->priority = 0;
969 pattrib->hdrlen = WLAN_HDR_A3_LEN;
970 pattrib->subtype = WIFI_DATA_TYPE;
974 if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
980 update_attrib_phy_info(padapter, pattrib, psta);
990 //get non-qos hw_ssn control register,mapping to REG_HW_SEQ0,1,2,3
991 inline u8 rtw_get_hwseq_no(_adapter *padapter)
994 #ifdef CONFIG_CONCURRENT_MODE
995 if(padapter->adapter_type == SECONDARY_ADAPTER)
999 #endif //CONFIG_CONCURRENT_MODE
1002 static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib)
1005 struct pkt_file pktfile;
1006 struct sta_info *psta = NULL;
1007 struct ethhdr etherhdr;
1010 struct sta_priv *pstapriv = &padapter->stapriv;
1011 struct security_priv *psecuritypriv = &padapter->securitypriv;
1012 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1013 struct qos_priv *pqospriv= &pmlmepriv->qospriv;
1014 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1015 sint res = _SUCCESS;
1019 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib);
1021 _rtw_open_pktfile(pkt, &pktfile);
1022 i = _rtw_pktfile_read(&pktfile, (u8*)ðerhdr, ETH_HLEN);
1024 pattrib->ether_type = ntohs(etherhdr.h_proto);
1027 _rtw_memcpy(pattrib->dst, ðerhdr.h_dest, ETH_ALEN);
1028 _rtw_memcpy(pattrib->src, ðerhdr.h_source, ETH_ALEN);
1031 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
1032 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
1033 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
1034 _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);
1035 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);
1037 else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
1039 if (rtw_check_tdls_established(padapter, pattrib) == _TRUE)
1040 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); /* For TDLS direct link Tx, set ra to be same to dst */
1043 _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
1044 _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);
1045 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);
1047 else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
1048 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
1049 _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
1050 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap);
1053 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown);
1055 pattrib->pktlen = pktfile.pkt_len;
1057 if (ETH_P_IP == pattrib->ether_type)
1059 // The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time
1060 // to prevent DHCP protocol fail
1064 _rtw_pktfile_read(&pktfile, &tmp[0], 24);
1066 pattrib->dhcp_pkt = 0;
1067 if (pktfile.pkt_len > 282) {//MINIMUM_DHCP_PACKET_SIZE) {
1068 if (ETH_P_IP == pattrib->ether_type) {// IP header
1069 if (((tmp[21] == 68) && (tmp[23] == 67)) ||
1070 ((tmp[21] == 67) && (tmp[23] == 68))) {
1071 // 68 : UDP BOOTP client
1072 // 67 : UDP BOOTP server
1073 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("======================update_attrib: get DHCP Packet \n"));
1074 // Use low rate to send DHCP packet.
1075 //if(pMgntInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom)
1077 // tcb_desc->DataRate = MgntQuery_TxRateExcludeCCKRates(ieee);//0xc;//ofdm 6m
1078 // tcb_desc->bTxDisableRateFallBack = false;
1081 // pTcb->DataRate = Adapter->MgntInfo.LowestBasicRate;
1082 //RTPRINT(FDM, WA_IOT, ("DHCP TranslateHeader(), pTcb->DataRate = 0x%x\n", pTcb->DataRate));
1083 pattrib->dhcp_pkt = 1;
1084 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp);
1089 //for parsing ICMP pakcets
1091 struct iphdr *piphdr = (struct iphdr *)tmp;
1093 pattrib->icmp_pkt = 0;
1094 if(piphdr->protocol == 0x1) // protocol type in ip header 0x1 is ICMP
1096 pattrib->icmp_pkt = 1;
1097 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp);
1102 } else if (0x888e == pattrib->ether_type) {
1103 DBG_871X_LEVEL(_drv_always_, "send eapol packet\n");
1106 if ( (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1108 rtw_set_scan_deny(padapter, 3000);
1112 // If EAPOL , ARP , OR DHCP packet, driver must be in active mode.
1113 #ifdef CONFIG_WAPI_SUPPORT
1114 if ( (pattrib->ether_type == 0x88B4) || (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1115 #else //!CONFIG_WAPI_SUPPORT
1117 if ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1118 #else // only ICMP/DHCP packets is as SPECIAL_PACKET, and leave LPS when tx IMCP/DHCP packets.
1119 //if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1120 if (pattrib->icmp_pkt==1)
1122 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);
1124 else if(pattrib->dhcp_pkt==1)
1128 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active);
1129 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
1133 bmcast = IS_MCAST(pattrib->ra);
1137 psta = rtw_get_bcmc_stainfo(padapter);
1139 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
1140 if (psta == NULL) { // if we cannot get psta => drop the pkt
1141 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta);
1142 RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra)));
1143 #ifdef DBG_TX_DROP_FRAME
1144 DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
1149 else if((check_fwstate(pmlmepriv, WIFI_AP_STATE)==_TRUE)&&(!(psta->state & _FW_LINKED)))
1151 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link);
1158 { // if we cannot get psta => drop the pkt
1159 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta);
1160 RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra)));
1161 #ifdef DBG_TX_DROP_FRAME
1162 DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __FUNCTION__, MAC_ARG(pattrib->ra));
1168 if(!(psta->state &_FW_LINKED))
1170 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link);
1171 DBG_871X("%s, psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, MAC_ARG(psta->hwaddr), psta->state);
1178 if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
1180 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec);
1185 update_attrib_phy_info(padapter, pattrib, psta);
1187 //DBG_8192C("%s ==> mac_id(%d)\n",__FUNCTION__,pattrib->mac_id );
1189 pattrib->psta = psta;
1194 pattrib->ack_policy = 0;
1195 // get ether_hdr_len
1196 pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag
1198 pattrib->hdrlen = WLAN_HDR_A3_LEN;
1199 pattrib->subtype = WIFI_DATA_TYPE;
1200 pattrib->priority = 0;
1202 if (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
1205 set_qos(&pktfile, pattrib);
1210 if (pattrib->direct_link == _TRUE) {
1211 if (pattrib->qos_en)
1212 set_qos(&pktfile, pattrib);
1216 if (pqospriv->qos_option) {
1217 set_qos(&pktfile, pattrib);
1219 if (pmlmepriv->acm_mask != 0)
1220 pattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority);
1225 //pattrib->priority = 5; //force to used VI queue, for testing
1226 pattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no;
1227 rtw_set_tx_chksum_offload(pkt, pattrib);
1236 static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){
1237 sint curfragnum,length;
1238 u8 *pframe, *payload,mic[8];
1239 struct mic_data micdata;
1240 //struct sta_info *stainfo;
1241 struct qos_priv *pqospriv= &(padapter->mlmepriv.qospriv);
1242 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1243 struct security_priv *psecuritypriv=&padapter->securitypriv;
1244 struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
1245 u8 priority[4]={0x0,0x0,0x0,0x0};
1246 u8 hw_hdr_offset = 0;
1247 sint bmcst = IS_MCAST(pattrib->ra);
1252 stainfo = pattrib->psta;
1256 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
1257 stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
1262 DBG_871X("%s, psta==NUL\n", __func__);
1266 if(!(stainfo->state &_FW_LINKED))
1268 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
1275 #ifdef CONFIG_USB_TX_AGGREGATION
1276 hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);;
1278 #ifdef CONFIG_TX_EARLY_MODE
1279 hw_hdr_offset = TXDESC_OFFSET+ EARLY_MODE_INFO_SIZE;
1281 hw_hdr_offset = TXDESC_OFFSET;
1285 if(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_)
1288 //if(stainfo!= NULL)
1290 u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
1292 pframe = pxmitframe->buf_addr + hw_hdr_offset;
1296 if(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){
1297 //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n");
1298 //rtw_msleep_os(10);
1301 //start to calculate the mic code
1302 rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey);
1306 if(_rtw_memcmp(&pattrib->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){
1307 //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n");
1308 //rtw_msleep_os(10);
1311 //start to calculate the mic code
1312 rtw_secmicsetkey(&micdata, &pattrib->dot11tkiptxmickey.skey[0]);
1315 if(pframe[1]&1){ //ToDS==1
1316 rtw_secmicappend(&micdata, &pframe[16], 6); //DA
1317 if(pframe[1]&2) //From Ds==1
1318 rtw_secmicappend(&micdata, &pframe[24], 6);
1320 rtw_secmicappend(&micdata, &pframe[10], 6);
1323 rtw_secmicappend(&micdata, &pframe[4], 6); //DA
1324 if(pframe[1]&2) //From Ds==1
1325 rtw_secmicappend(&micdata, &pframe[16], 6);
1327 rtw_secmicappend(&micdata, &pframe[10], 6);
1331 //if(pqospriv->qos_option==1)
1333 priority[0]=(u8)pxmitframe->attrib.priority;
1336 rtw_secmicappend(&micdata, &priority[0], 4);
1340 for(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){
1341 payload=(u8 *)RND4((SIZE_PTR)(payload));
1342 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("===curfragnum=%d, pframe= 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\n",
1343 curfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7)));
1345 payload=payload+pattrib->hdrlen+pattrib->iv_len;
1346 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",curfragnum,pattrib->hdrlen,pattrib->iv_len));
1347 if((curfragnum+1)==pattrib->nr_frags){
1348 length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);
1349 rtw_secmicappend(&micdata, payload,length);
1350 payload=payload+length;
1353 length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);
1354 rtw_secmicappend(&micdata, payload, length);
1355 payload=payload+length+pattrib->icv_len;
1356 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d length=%d pattrib->icv_len=%d",curfragnum,length,pattrib->icv_len));
1359 rtw_secgetmic(&micdata,&(mic[0]));
1360 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: before add mic code!!!\n"));
1361 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n",pattrib->last_txcmdsz));
1362 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: mic[0]=0x%.2x ,mic[1]=0x%.2x ,mic[2]=0x%.2x ,mic[3]=0x%.2x \n\
1363 mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\n",
1364 mic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7]));
1365 //add mic code and add the mic code length in last_txcmdsz
1367 _rtw_memcpy(payload, &(mic[0]),8);
1368 pattrib->last_txcmdsz+=8;
1370 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("\n ========last pkt========\n"));
1371 payload=payload-pattrib->last_txcmdsz+8;
1372 for(curfragnum=0;curfragnum<pattrib->last_txcmdsz;curfragnum=curfragnum+8)
1373 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ",
1374 *(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3),
1375 *(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7)));
1379 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n"));
1389 static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){
1391 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1392 //struct security_priv *psecuritypriv=&padapter->securitypriv;
1396 //if((psecuritypriv->sw_encrypt)||(pattrib->bswenc))
1399 //DBG_871X("start xmitframe_swencrypt\n");
1400 RT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,("### xmitframe_swencrypt\n"));
1401 switch(pattrib->encrypt){
1404 rtw_wep_encrypt(padapter, (u8 *)pxmitframe);
1407 rtw_tkip_encrypt(padapter, (u8 *)pxmitframe);
1410 rtw_aes_encrypt(padapter, (u8 * )pxmitframe);
1412 #ifdef CONFIG_WAPI_SUPPORT
1414 rtw_sms4_encrypt(padapter, (u8 * )pxmitframe);
1421 RT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,("### xmitframe_hwencrypt\n"));
1429 s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib)
1433 struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
1434 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1435 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
1436 u8 qos_option = _FALSE;
1437 sint res = _SUCCESS;
1438 u16 *fctrl = &pwlanhdr->frame_ctl;
1440 //struct sta_info *psta;
1442 //sint bmcst = IS_MCAST(pattrib->ra);
1447 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1448 if(pattrib->psta != psta)
1450 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1456 DBG_871X("%s, psta==NUL\n", __func__);
1460 if(!(psta->state &_FW_LINKED))
1462 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1467 _rtw_memset(hdr, 0, WLANHDR_OFFSET);
1469 SetFrameSubType(fctrl, pattrib->subtype);
1471 if (pattrib->subtype & WIFI_DATA_TYPE)
1473 if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) {
1475 if(pattrib->direct_link == _TRUE){
1476 //TDLS data transfer, ToDS=0, FrDs=0
1477 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1478 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1479 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1481 if (pattrib->qos_en)
1485 #endif //CONFIG_TDLS
1487 //to_ds = 1, fr_ds = 0;
1488 // 1.Data transfer to AP
1489 // 2.Arp pkt will relayed by AP
1491 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1492 _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
1493 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1495 if (pqospriv->qos_option)
1499 else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) {
1500 //to_ds = 0, fr_ds = 1;
1502 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1503 _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
1504 _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
1509 else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
1510 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
1511 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1512 _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
1513 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1519 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv)));
1527 if (pattrib->encrypt)
1532 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
1534 if (pattrib->priority)
1535 SetPriority(qc, pattrib->priority);
1537 SetEOSP(qc, pattrib->eosp);
1539 SetAckpolicy(qc, pattrib->ack_policy);
1542 //TODO: fill HT Control Field
1544 //Update Seq Num will be handled by f/w
1546 struct sta_info *psta;
1547 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1548 if(pattrib->psta != psta)
1550 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1556 DBG_871X("%s, psta==NUL\n", __func__);
1560 if(!(psta->state &_FW_LINKED))
1562 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1569 psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1570 psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1571 pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
1573 SetSeqNum(hdr, pattrib->seqnum);
1575 #ifdef CONFIG_80211N_HT
1576 //check if enable ampdu
1577 if(pattrib->ht_en && psta->htpriv.ampdu_enable)
1579 if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
1580 pattrib->ampdu_en = _TRUE;
1583 //re-check if enable ampdu by BA_starting_seqctrl
1584 if(pattrib->ampdu_en == _TRUE)
1588 tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f];
1590 //check BA_starting_seqctrl
1591 if(SN_LESS(pattrib->seqnum, tx_seq))
1593 //DBG_871X("tx ampdu seqnum(%d) < tx_seq(%d)\n", pattrib->seqnum, tx_seq);
1594 pattrib->ampdu_en = _FALSE;//AGG BK
1596 else if(SN_EQUAL(pattrib->seqnum, tx_seq))
1598 psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff;
1600 pattrib->ampdu_en = _TRUE;//AGG EN
1604 //DBG_871X("tx ampdu over run\n");
1605 psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff;
1606 pattrib->ampdu_en = _TRUE;//AGG EN
1610 #endif //CONFIG_80211N_HT
1627 s32 rtw_txframes_pending(_adapter *padapter)
1629 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1631 return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) ||
1632 (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) ||
1633 (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) ||
1634 (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE));
1637 s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib)
1639 struct sta_info *psta;
1640 struct tx_servq *ptxservq;
1641 int priority = pattrib->priority;
1645 psta = pattrib->psta;
1649 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
1650 psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
1653 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1654 if(pattrib->psta != psta)
1656 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1662 DBG_871X("%s, psta==NUL\n", __func__);
1666 if(!(psta->state &_FW_LINKED))
1668 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1676 ptxservq = &(psta->sta_xmitpriv.bk_q);
1680 ptxservq = &(psta->sta_xmitpriv.vi_q);
1684 ptxservq = &(psta->sta_xmitpriv.vo_q);
1689 ptxservq = &(psta->sta_xmitpriv.be_q);
1694 return ptxservq->qcnt;
1699 int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)
1703 switch(ptxmgmt->action_code){
1704 case TDLS_SETUP_REQUEST:
1705 rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1707 case TDLS_SETUP_RESPONSE:
1708 rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1710 case TDLS_SETUP_CONFIRM:
1711 rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe, ptxmgmt);
1714 rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe, ptxmgmt);
1716 case TDLS_DISCOVERY_REQUEST:
1717 rtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1719 case TDLS_PEER_TRAFFIC_INDICATION:
1720 rtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe, ptxmgmt);
1722 #ifdef CONFIG_TDLS_CH_SW
1723 case TDLS_CHANNEL_SWITCH_REQUEST:
1724 rtw_build_tdls_ch_switch_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1726 case TDLS_CHANNEL_SWITCH_RESPONSE:
1727 rtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1730 case TDLS_PEER_TRAFFIC_RESPONSE:
1731 rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1734 case TUNNELED_PROBE_REQ:
1735 rtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe);
1737 case TUNNELED_PROBE_RSP:
1738 rtw_build_tunneled_probe_rsp_ies(padapter, pxmitframe, pframe);
1749 s32 rtw_make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)
1752 struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
1753 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1754 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
1755 struct sta_priv *pstapriv = &padapter->stapriv;
1756 struct sta_info *psta=NULL, *ptdls_sta=NULL;
1757 u8 tdls_seq=0, baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1759 sint res = _SUCCESS;
1760 u16 *fctrl = &pwlanhdr->frame_ctl;
1764 _rtw_memset(hdr, 0, WLANHDR_OFFSET);
1766 SetFrameSubType(fctrl, pattrib->subtype);
1768 switch(ptxmgmt->action_code){
1769 case TDLS_SETUP_REQUEST:
1770 case TDLS_SETUP_RESPONSE:
1771 case TDLS_SETUP_CONFIRM:
1772 case TDLS_PEER_TRAFFIC_INDICATION:
1773 case TDLS_PEER_PSM_REQUEST:
1774 case TUNNELED_PROBE_REQ:
1775 case TUNNELED_PROBE_RSP:
1776 case TDLS_DISCOVERY_REQUEST:
1778 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1779 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1780 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1782 case TDLS_CHANNEL_SWITCH_REQUEST:
1783 case TDLS_CHANNEL_SWITCH_RESPONSE:
1784 case TDLS_PEER_PSM_RESPONSE:
1785 case TDLS_PEER_TRAFFIC_RESPONSE:
1786 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1787 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1788 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1792 if(ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_)
1794 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1795 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1796 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1802 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1803 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1804 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1809 if (pattrib->encrypt)
1812 if(ptxmgmt->action_code == TDLS_PEER_TRAFFIC_RESPONSE)
1817 if (pqospriv->qos_option)
1819 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
1820 if (pattrib->priority)
1821 SetPriority(qc, pattrib->priority);
1822 SetAckpolicy(qc, pattrib->ack_policy);
1825 psta = pattrib->psta;
1827 // 1. update seq_num per link by sta_info
1828 // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len
1830 ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);
1832 ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1833 ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1834 pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority];
1835 SetSeqNum(hdr, pattrib->seqnum);
1837 if (pattrib->encrypt){
1838 pattrib->encrypt= _AES_;
1841 pattrib->bswenc = _FALSE;
1843 pattrib->mac_id = ptdls_sta->mac_id;
1849 psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1850 psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1851 pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
1852 SetSeqNum(hdr, pattrib->seqnum);
1863 s32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, struct tdls_txmgmt *ptxmgmt)
1867 u8 *pframe, *mem_start;
1869 struct sta_info *psta;
1870 struct sta_priv *pstapriv = &padapter->stapriv;
1871 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1872 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1874 s32 bmcst = IS_MCAST(pattrib->ra);
1879 if (pattrib->psta) {
1880 psta = pattrib->psta;
1883 psta = rtw_get_bcmc_stainfo(padapter);
1885 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1894 if (pxmitframe->buf_addr == NULL) {
1899 pbuf_start = pxmitframe->buf_addr;
1900 mem_start = pbuf_start + TXDESC_OFFSET;
1902 if (rtw_make_tdls_wlanhdr(padapter, mem_start, pattrib, ptxmgmt) == _FAIL) {
1908 pframe += pattrib->hdrlen;
1910 //adding icv, if necessary...
1911 if (pattrib->iv_len)
1915 switch(pattrib->encrypt)
1919 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1923 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1925 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
1929 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1931 AES_IV(pattrib->iv, psta->dot11txpn, 0);
1936 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
1937 pframe += pattrib->iv_len;
1941 llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
1944 //pattrib->pktlen will be counted in rtw_build_tdls_ies
1945 pattrib->pktlen = 0;
1947 rtw_build_tdls_ies(padapter, pxmitframe, pframe, ptxmgmt);
1949 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
1950 pframe += pattrib->pktlen;
1951 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
1952 pframe += pattrib->icv_len;
1955 pattrib->nr_frags = 1;
1956 pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz +
1957 ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen;
1959 if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
1965 xmitframe_swencrypt(padapter, pxmitframe);
1967 update_attrib_vcs_info(padapter, pxmitframe);
1975 #endif //CONFIG_TDLS
1978 * Calculate wlan 802.11 packet MAX size from pkt_attrib
1979 * This function doesn't consider fragment case
1981 u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib)
1985 len = pattrib->hdrlen + pattrib->iv_len; // WLAN Header and IV
1986 len += SNAP_SIZE + sizeof(u16); // LLC
1987 len += pattrib->pktlen;
1988 if (pattrib->encrypt == _TKIP_) len += 8; // MIC
1989 len += ((pattrib->bswenc) ? pattrib->icv_len : 0); // ICV
1996 This sub-routine will perform all the following:
1998 1. remove 802.3 header.
1999 2. create wlan_header, based on the info in pxmitframe
2000 3. append sta's iv/ext-iv
2002 5. move frag chunk from pframe to pxmitframe->mem
2003 6. apply sw-encrypt, if necessary.
2006 s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
2008 struct pkt_file pktfile;
2010 s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
2014 u8 *pframe, *mem_start;
2017 //struct sta_info *psta;
2018 //struct sta_priv *pstapriv = &padapter->stapriv;
2019 //struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2020 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2022 struct pkt_attrib *pattrib = &pxmitframe->attrib;
2026 s32 bmcst = IS_MCAST(pattrib->ra);
2034 psta = pattrib->psta;
2037 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
2038 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
2044 DBG_871X("%s, psta==NUL\n", __func__);
2049 if(!(psta->state &_FW_LINKED))
2051 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
2055 if (pxmitframe->buf_addr == NULL){
2056 DBG_8192C("==> %s buf_addr==NULL \n",__FUNCTION__);
2060 pbuf_start = pxmitframe->buf_addr;
2062 #ifdef CONFIG_USB_TX_AGGREGATION
2063 hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
2065 #ifdef CONFIG_TX_EARLY_MODE //for SDIO && Tx Agg
2066 hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
2068 hw_hdr_offset = TXDESC_OFFSET;
2072 mem_start = pbuf_start + hw_hdr_offset;
2074 if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) {
2075 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"));
2076 DBG_8192C("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n");
2081 _rtw_open_pktfile(pkt, &pktfile);
2082 _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);
2085 frg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342
2095 SetMFrag(mem_start);
2097 pframe += pattrib->hdrlen;
2098 mpdu_len -= pattrib->hdrlen;
2100 //adding icv, if necessary...
2101 if (pattrib->iv_len)
2104 //if (check_fwstate(pmlmepriv, WIFI_MP_STATE))
2105 // psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
2107 // psta = rtw_get_stainfo(pstapriv, pattrib->ra);
2111 switch(pattrib->encrypt)
2115 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2119 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2121 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
2125 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2127 AES_IV(pattrib->iv, psta->dot11txpn, 0);
2129 #ifdef CONFIG_WAPI_SUPPORT
2131 rtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv);
2137 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
2139 RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_,
2140 ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n",
2141 padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3)));
2143 pframe += pattrib->iv_len;
2145 mpdu_len -= pattrib->iv_len;
2149 llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
2154 if ((pattrib->icv_len >0) && (pattrib->bswenc)) {
2155 mpdu_len -= pattrib->icv_len;
2160 // don't do fragment to broadcat/multicast packets
2161 mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen);
2163 mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len);
2168 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
2169 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
2170 pframe += pattrib->icv_len;
2175 if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE))
2177 pattrib->nr_frags = frg_inx;
2179 pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) +
2180 ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz;
2182 ClearMFrag(mem_start);
2186 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("%s: There're still something in packet!\n", __FUNCTION__));
2189 addr = (SIZE_PTR)(pframe);
2191 mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset;
2192 _rtw_memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);
2196 if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
2198 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n"));
2199 DBG_8192C("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n");
2204 xmitframe_swencrypt(padapter, pxmitframe);
2207 update_attrib_vcs_info(padapter, pxmitframe);
2209 pattrib->vcs_mode = NONE_VCS;
2218 #ifdef CONFIG_IEEE80211W
2219 //broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption
2220 s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
2222 struct pkt_file pktfile;
2223 s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
2225 u8 *pframe, *mem_start = NULL, *tmp_buf=NULL;
2226 u8 hw_hdr_offset, subtype ;
2227 struct sta_info *psta = NULL;
2228 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2229 struct pkt_attrib *pattrib = &pxmitframe->attrib;
2231 s32 bmcst = IS_MCAST(pattrib->ra);
2236 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
2237 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2238 struct rtw_ieee80211_hdr *pwlanhdr;
2239 u8 MME[_MME_IE_LENGTH_];
2243 mem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET;
2244 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
2247 ori_len = BIP_AAD_SIZE+pattrib->pktlen;
2248 tmp_buf = BIP_AAD = rtw_zmalloc(ori_len);
2249 subtype = GetFrameSubType(pframe); //bit(7)~bit(2)
2254 _enter_critical_bh(&padapter->security_key_mutex, &irqL);
2256 //only support station mode
2257 if(!check_fwstate(pmlmepriv, WIFI_STATION_STATE) || !check_fwstate(pmlmepriv, _FW_LINKED))
2258 goto xmitframe_coalesce_success;
2260 //IGTK key is not install, it may not support 802.11w
2261 if(padapter->securitypriv.binstallBIPkey != _TRUE)
2263 DBG_871X("no instll BIP key\n");
2264 goto xmitframe_coalesce_success;
2266 //station mode doesn't need TX BIP, just ready the code
2272 _rtw_memset(MME, 0, _MME_IE_LENGTH_);
2274 //other types doesn't need the BIP
2275 if(GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC)
2276 goto xmitframe_coalesce_fail;
2278 MGMT_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
2279 pframe += pattrib->pktlen;
2281 //octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0
2282 MME[0]=padapter->securitypriv.dot11wBIPKeyid;
2283 //copy packet number
2284 _rtw_memcpy(&MME[2], &pmlmeext->mgnt_80211w_IPN, 6);
2285 //increase the packet number
2286 pmlmeext->mgnt_80211w_IPN++;
2288 //add MME IE with MIC all zero, MME string doesn't include element id and length
2289 pframe = rtw_set_ie(pframe, _MME_IE_ , 16 , MME, &(pattrib->pktlen));
2290 pattrib->last_txcmdsz = pattrib->pktlen;
2291 // total frame length - header length
2292 frame_body_len = pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr);
2294 //conscruct AAD, copy frame control field
2295 _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);
2296 ClearRetry(BIP_AAD);
2297 ClearPwrMgt(BIP_AAD);
2298 ClearMData(BIP_AAD);
2299 //conscruct AAD, copy address 1 to address 3
2300 _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18);
2301 //copy management fram body
2302 _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, MGMT_body, frame_body_len);
2303 /*//dump total packet include MME with zero MIC
2306 printk("Total packet: ");
2307 for(i=0; i < BIP_AAD_SIZE+frame_body_len; i++)
2308 printk(" %02x ", BIP_AAD[i]);
2312 if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey
2313 , BIP_AAD, BIP_AAD_SIZE+frame_body_len, mic))
2314 goto xmitframe_coalesce_fail;
2316 /*//dump calculated mic result
2319 printk("Calculated mic result: ");
2321 printk(" %02x ", mic[i]);
2324 //copy right BIP mic value, total is 128bits, we use the 0~63 bits
2325 _rtw_memcpy(pframe-8, mic, 8);
2326 /*/dump all packet after mic ok
2329 printk("pattrib->pktlen = %d \n", pattrib->pktlen);
2330 for(pp=0;pp< pattrib->pktlen; pp++)
2331 printk(" %02x ", mem_start[pp]);
2335 else //unicast mgmt frame TX
2337 //start to encrypt mgmt frame
2338 if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC ||
2339 subtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION)
2342 psta = pattrib->psta;
2345 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
2351 DBG_871X("%s, psta==NUL\n", __func__);
2352 goto xmitframe_coalesce_fail;
2355 if(!(psta->state & _FW_LINKED) || pxmitframe->buf_addr==NULL)
2357 DBG_871X("%s, not _FW_LINKED or addr null\n", __func__);
2358 goto xmitframe_coalesce_fail;
2361 //DBG_871X("%s, action frame category=%d \n", __func__, pframe[WLAN_HDR_A3_LEN]);
2362 //according 802.11-2012 standard, these five types are not robust types
2363 if(subtype == WIFI_ACTION &&
2364 (pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC ||
2365 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT ||
2366 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM ||
2367 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED ||
2368 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P))
2369 goto xmitframe_coalesce_fail;
2370 //before encrypt dump the management packet content
2373 printk("Management pkt: ");
2374 for(i=0; i<pattrib->pktlen; i++)
2375 printk(" %02x ", pframe[i]);
2376 printk("=======\n");
2378 if(pattrib->encrypt>0)
2379 _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
2380 //bakeup original management packet
2381 _rtw_memcpy(tmp_buf, pframe, pattrib->pktlen);
2382 //move to data portion
2383 pframe += pattrib->hdrlen;
2385 //802.11w unicast management packet must be _AES_
2386 pattrib->iv_len = 8;
2388 pattrib->icv_len = 8;
2390 switch(pattrib->encrypt)
2394 AES_IV(pattrib->iv, psta->dot11wtxpn, 0);
2397 goto xmitframe_coalesce_fail;
2399 //insert iv header into management frame
2400 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
2401 pframe += pattrib->iv_len;
2402 //copy mgmt data portion after CCMP header
2403 _rtw_memcpy(pframe, tmp_buf+pattrib->hdrlen, pattrib->pktlen-pattrib->hdrlen);
2404 //move pframe to end of mgmt pkt
2405 pframe += pattrib->pktlen-pattrib->hdrlen;
2406 //add 8 bytes CCMP IV header to length
2407 pattrib->pktlen += pattrib->iv_len;
2408 /*//dump management packet include AES IV header
2411 printk("Management pkt + IV: ");
2412 //for(i=0; i<pattrib->pktlen; i++)
2413 //printk(" %02x ", mem_start[i]);
2414 printk("@@@@@@@@@@@@@\n");
2417 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
2418 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
2419 pframe += pattrib->icv_len;
2422 pattrib->pktlen += pattrib->icv_len;
2423 //set final tx command size
2424 pattrib->last_txcmdsz = pattrib->pktlen;
2426 //set protected bit must be beofre SW encrypt
2427 SetPrivacy(mem_start);
2428 /*//dump management packet include AES header
2431 printk("prepare to enc Management pkt + IV: ");
2432 for(i=0; i<pattrib->pktlen; i++)
2433 printk(" %02x ", mem_start[i]);
2434 printk("@@@@@@@@@@@@@\n");
2437 xmitframe_swencrypt(padapter, pxmitframe);
2441 xmitframe_coalesce_success:
2442 _exit_critical_bh(&padapter->security_key_mutex, &irqL);
2443 rtw_mfree(BIP_AAD, ori_len);
2447 xmitframe_coalesce_fail:
2448 _exit_critical_bh(&padapter->security_key_mutex, &irqL);
2449 rtw_mfree(BIP_AAD, ori_len);
2454 #endif //CONFIG_IEEE80211W
2456 /* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header
2457 * IEEE LLC/SNAP header contains 8 octets
2458 * First 3 octets comprise the LLC portion
2459 * SNAP portion, 5 octets, is divided into two fields:
2460 * Organizationally Unique Identifier(OUI), 3 octets,
2461 * type, defined by that organization, 2 octets.
2463 s32 rtw_put_snap(u8 *data, u16 h_proto)
2465 struct ieee80211_snap_hdr *snap;
2470 snap = (struct ieee80211_snap_hdr *)data;
2475 if (h_proto == 0x8137 || h_proto == 0x80f3)
2480 snap->oui[0] = oui[0];
2481 snap->oui[1] = oui[1];
2482 snap->oui[2] = oui[2];
2484 *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
2488 return SNAP_SIZE + sizeof(u16);
2491 void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len)
2497 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2498 struct registry_priv *pregistrypriv = &padapter->registrypriv;
2502 switch(pxmitpriv->vcs_setting)
2505 pxmitpriv->vcs = NONE_VCS;
2513 perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len);
2516 pxmitpriv->vcs = NONE_VCS;
2520 protection = (*(perp + 2)) & BIT(1);
2523 if(pregistrypriv->vcs_type == RTS_CTS)
2524 pxmitpriv->vcs = RTS_CTS;
2526 pxmitpriv->vcs = CTS_TO_SELF;
2529 pxmitpriv->vcs = NONE_VCS;
2540 void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz)
2542 struct sta_info *psta = NULL;
2543 struct stainfo_stats *pstats = NULL;
2544 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2545 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2548 if ((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)
2550 #if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2551 pkt_num = pxmitframe->agg_num;
2553 pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pkt_num;
2555 pxmitpriv->tx_pkts += pkt_num;
2557 pxmitpriv->tx_bytes += sz;
2559 psta = pxmitframe->attrib.psta;
2562 pstats = &psta->sta_stats;
2564 pstats->tx_pkts += pkt_num;
2566 pstats->tx_bytes += sz;
2568 if(pxmitframe->attrib.ptdls_sta != NULL)
2570 pstats = &(pxmitframe->attrib.ptdls_sta->sta_stats);
2571 pstats->tx_pkts += pkt_num;
2572 pstats->tx_bytes += sz;
2574 #endif //CONFIG_TDLS
2577 #ifdef CONFIG_CHECK_LEAVE_LPS
2578 //traffic_check_for_leave_lps(padapter, _TRUE);
2584 static struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv,
2585 enum cmdbuf_type buf_type)
2587 struct xmit_buf *pxmitbuf = NULL;
2591 pxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type];
2592 if (pxmitbuf != NULL) {
2593 pxmitbuf->priv_data = NULL;
2595 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2597 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2598 pxmitbuf->agg_num = 0;
2599 pxmitbuf->pg_num = 0;
2601 #ifdef CONFIG_PCI_HCI
2603 pxmitbuf->desc = NULL;
2606 if (pxmitbuf->sctx) {
2607 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2608 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2611 DBG_871X("%s fail, no xmitbuf available !!!\n", __func__);
2621 struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
2622 enum cmdbuf_type buf_type)
2624 struct xmit_frame *pcmdframe;
2625 struct xmit_buf *pxmitbuf;
2627 if ((pcmdframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL)
2629 DBG_871X("%s, alloc xmitframe fail\n", __FUNCTION__);
2633 if ((pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type)) == NULL) {
2634 DBG_871X("%s, alloc xmitbuf fail\n", __FUNCTION__);
2635 rtw_free_xmitframe(pxmitpriv, pcmdframe);
2639 pcmdframe->frame_tag = MGNT_FRAMETAG;
2641 pcmdframe->pxmitbuf = pxmitbuf;
2643 pcmdframe->buf_addr = pxmitbuf->pbuf;
2645 pxmitbuf->priv_data = pcmdframe;
2651 struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv)
2654 struct xmit_buf *pxmitbuf = NULL;
2655 _list *plist, *phead;
2656 _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
2660 _enter_critical(&pfree_queue->lock, &irqL);
2662 if(_rtw_queue_empty(pfree_queue) == _TRUE) {
2666 phead = get_list_head(pfree_queue);
2668 plist = get_next(phead);
2670 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
2672 rtw_list_delete(&(pxmitbuf->list));
2675 if (pxmitbuf != NULL)
2677 pxmitpriv->free_xmit_extbuf_cnt--;
2678 #ifdef DBG_XMIT_BUF_EXT
2679 DBG_871X("DBG_XMIT_BUF_EXT ALLOC no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt);
2683 pxmitbuf->priv_data = NULL;
2685 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2687 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2688 pxmitbuf->agg_num = 1;
2690 #ifdef CONFIG_PCI_HCI
2692 pxmitbuf->desc = NULL;
2695 if (pxmitbuf->sctx) {
2696 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2697 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2702 _exit_critical(&pfree_queue->lock, &irqL);
2709 s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
2712 _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
2721 _enter_critical(&pfree_queue->lock, &irqL);
2723 rtw_list_delete(&pxmitbuf->list);
2725 rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue));
2726 pxmitpriv->free_xmit_extbuf_cnt++;
2727 #ifdef DBG_XMIT_BUF_EXT
2728 DBG_871X("DBG_XMIT_BUF_EXT FREE no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt);
2731 _exit_critical(&pfree_queue->lock, &irqL);
2738 struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv)
2741 struct xmit_buf *pxmitbuf = NULL;
2742 _list *plist, *phead;
2743 _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
2747 //DBG_871X("+rtw_alloc_xmitbuf\n");
2749 _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
2751 if(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) {
2755 phead = get_list_head(pfree_xmitbuf_queue);
2757 plist = get_next(phead);
2759 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
2761 rtw_list_delete(&(pxmitbuf->list));
2764 if (pxmitbuf != NULL)
2766 pxmitpriv->free_xmitbuf_cnt--;
2768 DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt);
2770 //DBG_871X("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt);
2772 pxmitbuf->priv_data = NULL;
2774 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2776 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2777 pxmitbuf->agg_num = 0;
2778 pxmitbuf->pg_num = 0;
2780 #ifdef CONFIG_PCI_HCI
2782 pxmitbuf->desc = NULL;
2785 if (pxmitbuf->sctx) {
2786 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2787 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2793 DBG_871X("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n");
2797 _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
2804 s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
2807 _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
2811 //DBG_871X("+rtw_free_xmitbuf\n");
2818 if (pxmitbuf->sctx) {
2819 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2820 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE);
2823 if(pxmitbuf->buf_tag == XMITBUF_CMD) {
2825 else if(pxmitbuf->buf_tag == XMITBUF_MGNT) {
2826 rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf);
2830 _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
2832 rtw_list_delete(&pxmitbuf->list);
2834 rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue));
2836 pxmitpriv->free_xmitbuf_cnt++;
2837 //DBG_871X("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt);
2839 DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt);
2841 _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
2849 void rtw_init_xmitframe(struct xmit_frame *pxframe)
2851 if (pxframe != NULL)//default value setting
2853 pxframe->buf_addr = NULL;
2854 pxframe->pxmitbuf = NULL;
2856 _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib));
2857 //pxframe->attrib.psta = NULL;
2859 pxframe->frame_tag = DATA_FRAMETAG;
2861 #ifdef CONFIG_USB_HCI
2862 pxframe->pkt = NULL;
2863 #ifdef USB_PACKET_OFFSET_SZ
2864 pxframe->pkt_offset = (PACKET_OFFSET_SZ/8);
2866 pxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc
2869 #ifdef CONFIG_USB_TX_AGGREGATION
2870 pxframe->agg_num = 1;
2873 #endif //#ifdef CONFIG_USB_HCI
2875 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2876 pxframe->pg_num = 1;
2877 pxframe->agg_num = 1;
2880 #ifdef CONFIG_XMIT_ACK
2881 pxframe->ack_report = 0;
2890 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
2892 If we turn on USE_RXTHREAD, then, no need for critical section.
2893 Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
2895 Must be very very cautious...
2898 struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue)
2901 Please remember to use all the osdep_service api,
2902 and lock/unlock or _enter/_exit critical to protect
2907 struct xmit_frame *pxframe = NULL;
2908 _list *plist, *phead;
2909 _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
2913 _enter_critical_bh(&pfree_xmit_queue->lock, &irqL);
2915 if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) {
2916 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe:%d\n", pxmitpriv->free_xmitframe_cnt));
2919 phead = get_list_head(pfree_xmit_queue);
2921 plist = get_next(phead);
2923 pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
2925 rtw_list_delete(&(pxframe->list));
2926 pxmitpriv->free_xmitframe_cnt--;
2927 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt));
2930 _exit_critical_bh(&pfree_xmit_queue->lock, &irqL);
2932 rtw_init_xmitframe(pxframe);
2939 struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv)
2942 struct xmit_frame *pxframe = NULL;
2943 _list *plist, *phead;
2944 _queue *queue = &pxmitpriv->free_xframe_ext_queue;
2948 _enter_critical_bh(&queue->lock, &irqL);
2950 if (_rtw_queue_empty(queue) == _TRUE) {
2951 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe_ext:%d\n", pxmitpriv->free_xframe_ext_cnt));
2954 phead = get_list_head(queue);
2955 plist = get_next(phead);
2956 pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
2958 rtw_list_delete(&(pxframe->list));
2959 pxmitpriv->free_xframe_ext_cnt--;
2960 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe_ext():free_xmitframe_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt));
2963 _exit_critical_bh(&queue->lock, &irqL);
2965 rtw_init_xmitframe(pxframe);
2972 struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv)
2974 struct xmit_frame *pxframe = NULL;
2977 alloc_addr = rtw_zmalloc(sizeof(struct xmit_frame) + 4);
2979 if (alloc_addr == NULL)
2982 pxframe = (struct xmit_frame *)N_BYTE_ALIGMENT((SIZE_PTR)(alloc_addr), 4);
2983 pxframe->alloc_addr = alloc_addr;
2985 pxframe->padapter = pxmitpriv->adapter;
2986 pxframe->frame_tag = NULL_FRAMETAG;
2988 pxframe->pkt = NULL;
2990 pxframe->buf_addr = NULL;
2991 pxframe->pxmitbuf = NULL;
2993 rtw_init_xmitframe(pxframe);
2995 DBG_871X("################## %s ##################\n", __func__);
3001 s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe)
3004 _queue *queue = NULL;
3005 _adapter *padapter = pxmitpriv->adapter;
3006 _pkt *pndis_pkt = NULL;
3010 if (pxmitframe == NULL) {
3011 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\n"));
3015 if (pxmitframe->pkt){
3016 pndis_pkt = pxmitframe->pkt;
3017 pxmitframe->pkt = NULL;
3020 if (pxmitframe->alloc_addr) {
3021 DBG_871X("################## %s with alloc_addr ##################\n", __func__);
3022 rtw_mfree(pxmitframe->alloc_addr, sizeof(struct xmit_frame) + 4);
3023 goto check_pkt_complete;
3026 if (pxmitframe->ext_tag == 0)
3027 queue = &pxmitpriv->free_xmit_queue;
3028 else if(pxmitframe->ext_tag == 1)
3029 queue = &pxmitpriv->free_xframe_ext_queue;
3033 _enter_critical_bh(&queue->lock, &irqL);
3035 rtw_list_delete(&pxmitframe->list);
3036 rtw_list_insert_tail(&pxmitframe->list, get_list_head(queue));
3037 if (pxmitframe->ext_tag == 0) {
3038 pxmitpriv->free_xmitframe_cnt++;
3039 RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt));
3040 } else if(pxmitframe->ext_tag == 1) {
3041 pxmitpriv->free_xframe_ext_cnt++;
3042 RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xframe_ext_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt));
3046 _exit_critical_bh(&queue->lock, &irqL);
3051 rtw_os_pkt_complete(padapter, pndis_pkt);
3060 void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue)
3063 _list *plist, *phead;
3064 struct xmit_frame *pxmitframe;
3068 _enter_critical_bh(&(pframequeue->lock), &irqL);
3070 phead = get_list_head(pframequeue);
3071 plist = get_next(phead);
3073 while (rtw_end_of_queue_search(phead, plist) == _FALSE)
3076 pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
3078 plist = get_next(plist);
3080 rtw_free_xmitframe(pxmitpriv,pxmitframe);
3083 _exit_critical_bh(&(pframequeue->lock), &irqL);
3088 s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
3090 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue);
3091 if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL)
3093 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
3094 ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n"));
3095 // pxmitframe->pkt = NULL;
3102 static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue)
3104 _list *xmitframe_plist, *xmitframe_phead;
3105 struct xmit_frame *pxmitframe=NULL;
3107 xmitframe_phead = get_list_head(pframe_queue);
3108 xmitframe_plist = get_next(xmitframe_phead);
3110 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
3112 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
3114 /* xmitframe_plist = get_next(xmitframe_plist); */
3116 /*#ifdef RTK_DMP_PLATFORM
3117 #ifdef CONFIG_USB_TX_AGGREGATION
3118 if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2))
3122 tasklet_schedule(&pxmitpriv->xmit_tasklet);
3128 rtw_list_delete(&pxmitframe->list);
3132 //rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending);
3138 //pxmitframe = NULL;
3145 struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry)
3148 _list *sta_plist, *sta_phead;
3149 struct hw_xmit *phwxmit;
3150 struct tx_servq *ptxservq = NULL;
3151 _queue *pframe_queue = NULL;
3152 struct xmit_frame *pxmitframe = NULL;
3153 _adapter *padapter = pxmitpriv->adapter;
3154 struct registry_priv *pregpriv = &padapter->registrypriv;
3156 #ifdef CONFIG_USB_HCI
3157 // int j, tmp, acirp_cnt[4];
3162 inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;
3164 if(pregpriv->wifi_spec==1)
3166 int j, tmp, acirp_cnt[4];
3168 if(flags<XMIT_QUEUE_ENTRY)
3170 //priority exchange according to the completed xmitbuf flags.
3176 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)
3178 inx[j] = pxmitpriv->wmm_para_seq[j];
3182 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
3184 for(i = 0; i < entry; i++)
3186 phwxmit = phwxmit_i + inx[i];
3188 //_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3190 sta_phead = get_list_head(phwxmit->sta_queue);
3191 sta_plist = get_next(sta_phead);
3193 while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE)
3196 ptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending);
3198 pframe_queue = &ptxservq->sta_pending;
3200 pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue);
3206 //Remove sta node when there is no pending packets.
3207 if(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break
3208 rtw_list_delete(&ptxservq->tx_pending);
3210 //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3215 sta_plist = get_next(sta_plist);
3219 //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3225 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
3233 struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac)
3235 struct tx_servq *ptxservq=NULL;
3243 ptxservq = &(psta->sta_xmitpriv.bk_q);
3245 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n"));
3250 ptxservq = &(psta->sta_xmitpriv.vi_q);
3252 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n"));
3257 ptxservq = &(psta->sta_xmitpriv.vo_q);
3259 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n"));
3265 ptxservq = &(psta->sta_xmitpriv.be_q);
3267 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n"));
3277 __inline static struct tx_servq *rtw_get_sta_pending
3278 (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up)
3280 struct tx_servq *ptxservq;
3281 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
3285 #ifdef CONFIG_RTL8711
3287 if(IS_MCAST(psta->hwaddr))
3289 ptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo
3290 *ppstapending = &padapter->xmitpriv.bm_pending;
3299 ptxservq = &(psta->sta_xmitpriv.bk_q);
3300 *ppstapending = &padapter->xmitpriv.bk_pending;
3301 (phwxmits+3)->accnt++;
3302 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n"));
3307 ptxservq = &(psta->sta_xmitpriv.vi_q);
3308 *ppstapending = &padapter->xmitpriv.vi_pending;
3309 (phwxmits+1)->accnt++;
3310 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n"));
3315 ptxservq = &(psta->sta_xmitpriv.vo_q);
3316 *ppstapending = &padapter->xmitpriv.vo_pending;
3317 (phwxmits+0)->accnt++;
3318 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n"));
3324 ptxservq = &(psta->sta_xmitpriv.be_q);
3325 *ppstapending = &padapter->xmitpriv.be_pending;
3326 (phwxmits+2)->accnt++;
3327 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n"));
3341 * Will enqueue pxmitframe to the proper queue,
3342 * and indicate it to xx_pending list.....
3344 s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)
3348 struct sta_info *psta;
3349 struct tx_servq *ptxservq;
3350 struct pkt_attrib *pattrib = &pxmitframe->attrib;
3351 struct sta_priv *pstapriv = &padapter->stapriv;
3352 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
3353 sint res = _SUCCESS;
3357 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class);
3360 if (pattrib->psta) {
3361 psta = pattrib->psta;
3363 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
3364 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
3368 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
3369 if(pattrib->psta != psta)
3371 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta);
3372 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
3377 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta);
3379 DBG_8192C("rtw_xmit_classifier: psta == NULL\n");
3380 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n"));
3384 if(!(psta->state &_FW_LINKED))
3386 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink);
3387 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
3391 ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
3393 //_enter_critical(&pstapending->lock, &irqL0);
3395 if (rtw_is_list_empty(&ptxservq->tx_pending)) {
3396 rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue));
3399 //_enter_critical(&ptxservq->sta_pending.lock, &irqL1);
3401 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending));
3403 phwxmits[ac_index].accnt++;
3405 //_exit_critical(&ptxservq->sta_pending.lock, &irqL1);
3407 //_exit_critical(&pstapending->lock, &irqL0);
3416 void rtw_alloc_hwxmits(_adapter *padapter)
3418 struct hw_xmit *hwxmits;
3419 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3421 pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
3423 pxmitpriv->hwxmits = NULL;
3425 pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry);
3427 if(pxmitpriv->hwxmits == NULL)
3429 DBG_871X("alloc hwxmits fail!...\n");
3433 hwxmits = pxmitpriv->hwxmits;
3435 if(pxmitpriv->hwxmit_entry == 5)
3437 //pxmitpriv->bmc_txqueue.head = 0;
3438 //hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue;
3439 hwxmits[0] .sta_queue = &pxmitpriv->bm_pending;
3441 //pxmitpriv->vo_txqueue.head = 0;
3442 //hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue;
3443 hwxmits[1] .sta_queue = &pxmitpriv->vo_pending;
3445 //pxmitpriv->vi_txqueue.head = 0;
3446 //hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue;
3447 hwxmits[2] .sta_queue = &pxmitpriv->vi_pending;
3449 //pxmitpriv->bk_txqueue.head = 0;
3450 //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
3451 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
3453 //pxmitpriv->be_txqueue.head = 0;
3454 //hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue;
3455 hwxmits[4] .sta_queue = &pxmitpriv->be_pending;
3458 else if(pxmitpriv->hwxmit_entry == 4)
3461 //pxmitpriv->vo_txqueue.head = 0;
3462 //hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue;
3463 hwxmits[0] .sta_queue = &pxmitpriv->vo_pending;
3465 //pxmitpriv->vi_txqueue.head = 0;
3466 //hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue;
3467 hwxmits[1] .sta_queue = &pxmitpriv->vi_pending;
3469 //pxmitpriv->be_txqueue.head = 0;
3470 //hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue;
3471 hwxmits[2] .sta_queue = &pxmitpriv->be_pending;
3473 //pxmitpriv->bk_txqueue.head = 0;
3474 //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
3475 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
3486 void rtw_free_hwxmits(_adapter *padapter)
3488 struct hw_xmit *hwxmits;
3489 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3491 hwxmits = pxmitpriv->hwxmits;
3493 rtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry));
3496 void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry)
3500 for(i = 0; i < entry; i++, phwxmit++)
3502 //_rtw_spinlock_init(&phwxmit->xmit_lock);
3503 //_rtw_init_listhead(&phwxmit->pending);
3504 //phwxmit->txcmdcnt = 0;
3510 #ifdef CONFIG_BR_EXT
3511 int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb)
3513 struct sk_buff *skb = *pskb;
3514 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3516 //if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
3518 void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb);
3519 int res, is_vlan_tag=0, i, do_nat25=1;
3520 unsigned short vlan_hdr=0;
3521 void *br_port = NULL;
3523 //mac_clone_handle_frame(priv, skb);
3525 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3526 br_port = padapter->pnetdev->br_port;
3527 #else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3529 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
3531 #endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3532 _enter_critical_bh(&padapter->br_ext_lock, &irqL);
3533 if ( !(skb->data[0] & 1) &&
3535 memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
3536 *((unsigned short *)(skb->data+MACADDRLEN*2)) != __constant_htons(ETH_P_8021Q) &&
3537 *((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP) &&
3538 !memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) {
3539 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3540 padapter->scdb_entry->ageing_timer = jiffies;
3541 _exit_critical_bh(&padapter->br_ext_lock, &irqL);
3544 //if (!priv->pmib->ethBrExtInfo.nat25_disable)
3546 // if (priv->dev->br_port &&
3547 // !memcmp(skb->data+MACADDRLEN, priv->br_mac, MACADDRLEN)) {
3549 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
3551 vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
3553 *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
3556 //if SA == br_mac && skb== IP => copy SIP to br_ip ?? why
3557 if (!memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
3558 (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)))
3559 memcpy(padapter->br_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
3561 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)) {
3562 if (memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN)) {
3563 void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, unsigned char *ipAddr);
3565 if ((padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter,
3566 skb->data+MACADDRLEN, skb->data+WLAN_ETHHDR_LEN+12)) != NULL) {
3567 memcpy(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN);
3568 memcpy(padapter->scdb_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
3569 padapter->scdb_entry->ageing_timer = jiffies;
3574 if (padapter->scdb_entry) {
3575 padapter->scdb_entry->ageing_timer = jiffies;
3579 memset(padapter->scdb_mac, 0, MACADDRLEN);
3580 memset(padapter->scdb_ip, 0, 4);
3584 _exit_critical_bh(&padapter->br_ext_lock, &irqL);
3588 int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method);
3589 if (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) {
3590 struct sk_buff *newskb;
3595 *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
3596 *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
3597 *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
3600 newskb = rtw_skb_copy(skb);
3601 if (newskb == NULL) {
3602 //priv->ext_stats.tx_drops++;
3603 DEBUG_ERR("TX DROP: rtw_skb_copy fail!\n");
3609 *pskb = skb = newskb;
3611 vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
3613 *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
3618 if (skb_is_nonlinear(skb))
3619 DEBUG_ERR("%s(): skb_is_nonlinear!!\n", __FUNCTION__);
3622 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3623 res = skb_linearize(skb, GFP_ATOMIC);
3624 #else // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3625 res = skb_linearize(skb);
3626 #endif // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3628 DEBUG_ERR("TX DROP: skb_linearize fail!\n");
3629 //goto free_and_stop;
3633 res = nat25_db_handle(padapter, skb, NAT25_INSERT);
3636 //priv->ext_stats.tx_drops++;
3637 DEBUG_ERR("TX DROP: nat25_db_handle fail!\n");
3638 //goto free_and_stop;
3642 // we just print warning message and let it go
3643 //DEBUG_WARN("%s()-%d: nat25_db_handle INSERT Warning!\n", __FUNCTION__, __LINE__);
3644 //return -1; // return -1 will cause system crash on 2011/08/30!
3649 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3651 dhcp_flag_bcast(padapter, skb);
3656 *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
3657 *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
3658 *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
3663 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
3668 if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A_VALN(skb->data)){
3669 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3673 if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A(skb->data)){
3674 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3680 // check if SA is equal to our MAC
3681 if (memcmp(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) {
3682 //priv->ext_stats.tx_drops++;
3683 DEBUG_ERR("TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\n",
3684 skb->data[6],skb->data[7],skb->data[8],skb->data[9],skb->data[10],skb->data[11]);
3685 //goto free_and_stop;
3691 #endif // CONFIG_BR_EXT
3693 u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe)
3696 struct pkt_attrib *pattrib = &pxmitframe->attrib;
3698 switch(pattrib->qsel)
3702 addr = BE_QUEUE_INX;
3706 addr = BK_QUEUE_INX;
3710 addr = VI_QUEUE_INX;
3714 addr = VO_QUEUE_INX;
3717 addr = BCN_QUEUE_INX;
3719 case 0x11://BC/MC in PS (HIQ)
3720 addr = HIGH_QUEUE_INX;
3724 addr = MGT_QUEUE_INX;
3733 static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib)
3737 qsel = pattrib->priority;
3738 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("### do_queue_select priority=%d ,qsel = %d\n",pattrib->priority ,qsel));
3740 #ifdef CONFIG_CONCURRENT_MODE
3741 // if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
3745 pattrib->qsel = qsel;
3749 * The main transmit(tx) entry
3753 * 0 success, hardware will handle this xmit frame(packet)
3756 s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
3758 static u32 start = 0;
3759 static u32 drop_cnt = 0;
3760 #ifdef CONFIG_AP_MODE
3763 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3764 struct xmit_frame *pxmitframe = NULL;
3765 #ifdef CONFIG_BR_EXT
3766 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3767 void *br_port = NULL;
3768 #endif // CONFIG_BR_EXT
3772 DBG_COUNTER(padapter->tx_logs.core_tx);
3775 start = rtw_get_current_time();
3777 pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
3779 if (rtw_get_passing_time_ms(start) > 2000) {
3781 DBG_871X("DBG_TX_DROP_FRAME %s no more pxmitframe, drop_cnt:%u\n", __FUNCTION__, drop_cnt);
3782 start = rtw_get_current_time();
3786 if (pxmitframe == NULL) {
3788 RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n"));
3789 DBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe);
3793 #ifdef CONFIG_BR_EXT
3795 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3796 br_port = padapter->pnetdev->br_port;
3797 #else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3799 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
3801 #endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3803 if( br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
3805 res = rtw_br_client_tx(padapter, ppkt);
3808 rtw_free_xmitframe(pxmitpriv, pxmitframe);
3809 DBG_COUNTER(padapter->tx_logs.core_tx_err_brtx);
3814 #endif // CONFIG_BR_EXT
3816 res = update_attrib(padapter, *ppkt, &pxmitframe->attrib);
3818 #ifdef CONFIG_WAPI_SUPPORT
3819 if(pxmitframe->attrib.ether_type != 0x88B4)
3821 if(rtw_wapi_drop_for_key_absent(padapter, pxmitframe->attrib.ra))
3823 WAPI_TRACE(WAPI_RX,"drop for key absend when tx \n");
3829 RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: update attrib fail\n"));
3830 #ifdef DBG_TX_DROP_FRAME
3831 DBG_871X("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__);
3833 rtw_free_xmitframe(pxmitpriv, pxmitframe);
3836 pxmitframe->pkt = *ppkt;
3838 rtw_led_control(padapter, LED_CTL_TX);
3840 do_queue_select(padapter, &pxmitframe->attrib);
3842 #ifdef CONFIG_AP_MODE
3843 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
3844 if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE)
3846 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
3847 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue);
3850 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
3854 if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)
3861 sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
3866 struct sta_info *ptdls_sta=NULL;
3867 struct sta_priv *pstapriv = &padapter->stapriv;
3868 struct pkt_attrib *pattrib = &pxmitframe->attrib;
3869 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3872 ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);
3873 if(ptdls_sta==NULL){
3875 }else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE){
3877 if(pattrib->triggered==1)
3883 _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
3885 if(ptdls_sta->state&WIFI_SLEEP_STATE)
3887 rtw_list_delete(&pxmitframe->list);
3889 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
3891 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q));
3893 ptdls_sta->sleepq_len++;
3894 ptdls_sta->sleepq_ac_len++;
3896 //indicate 4-AC queue bit in TDLS peer traffic indication
3897 switch(pattrib->priority)
3901 ptdls_sta->uapsd_bk |= BIT(1);
3905 ptdls_sta->uapsd_vi |= BIT(1);
3909 ptdls_sta->uapsd_vo |= BIT(1);
3914 ptdls_sta->uapsd_be |= BIT(1);
3918 /* Transmit TDLS PTI via AP */
3919 if(ptdls_sta->sleepq_len==1)
3920 rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ISSUE_PTI);
3925 _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
3931 #endif //CONFIG_TDLS
3933 #define RTW_HIQ_FILTER_ALLOW_ALL 0
3934 #define RTW_HIQ_FILTER_ALLOW_SPECIAL 1
3935 #define RTW_HIQ_FILTER_DENY_ALL 2
3937 inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)
3939 bool allow = _FALSE;
3940 _adapter *adapter = xmitframe->padapter;
3941 struct registry_priv *registry = &adapter->registrypriv;
3943 if (adapter->interface_type != RTW_PCIE) {
3945 if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {
3947 struct pkt_attrib *attrib = &xmitframe->attrib;
3949 if (attrib->ether_type == 0x0806
3950 || attrib->ether_type == 0x888e
3951 #ifdef CONFIG_WAPI_SUPPORT
3952 || attrib->ether_type == 0x88B4
3957 DBG_871X(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter)
3958 , attrib->ether_type, attrib->dhcp_pkt?" DHCP":"");
3962 else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) {
3965 else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {
3974 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
3976 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
3980 struct sta_info *psta=NULL;
3981 struct sta_priv *pstapriv = &padapter->stapriv;
3982 struct pkt_attrib *pattrib = &pxmitframe->attrib;
3983 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3984 sint bmcst = IS_MCAST(pattrib->ra);
3985 bool update_tim = _FALSE;
3988 if( padapter->tdlsinfo.link_established == _TRUE )
3990 ret = xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pxmitframe);
3992 #endif //CONFIG_TDLS
3994 if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)
3996 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate);
4002 psta = pattrib->psta;
4006 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
4007 psta=rtw_get_stainfo(pstapriv, pattrib->ra);
4010 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
4011 if(pattrib->psta != psta)
4013 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta);
4014 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
4020 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta);
4021 DBG_871X("%s, psta==NUL\n", __func__);
4025 if(!(psta->state &_FW_LINKED))
4027 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link);
4028 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
4032 if(pattrib->triggered==1)
4034 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger);
4035 //DBG_871X("directly xmit pspoll_triggered packet\n");
4037 //pattrib->triggered=0;
4038 if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
4039 pattrib->qsel = QSLT_HIGH;//HIQ
4047 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4049 if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode
4051 //pattrib->qsel = QSLT_HIGH;//HIQ
4053 rtw_list_delete(&pxmitframe->list);
4055 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4057 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
4061 if (!(pstapriv->tim_bitmap & BIT(0)))
4064 pstapriv->tim_bitmap |= BIT(0);//
4065 pstapriv->sta_dz_bitmap |= BIT(0);
4067 //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
4069 if (update_tim == _TRUE) {
4070 if (is_broadcast_mac_addr(pattrib->ra))
4071 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC");
4073 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC");
4075 chk_bmc_sleepq_cmd(padapter);
4078 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4082 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast);
4086 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4093 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4095 if(psta->state&WIFI_SLEEP_STATE)
4099 if(pstapriv->sta_dz_bitmap&BIT(psta->aid))
4101 rtw_list_delete(&pxmitframe->list);
4103 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4105 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
4109 switch(pattrib->priority)
4113 wmmps_ac = psta->uapsd_bk&BIT(0);
4117 wmmps_ac = psta->uapsd_vi&BIT(0);
4121 wmmps_ac = psta->uapsd_vo&BIT(0);
4126 wmmps_ac = psta->uapsd_be&BIT(0);
4131 psta->sleepq_ac_len++;
4133 if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac)))
4135 if (!(pstapriv->tim_bitmap & BIT(psta->aid)))
4138 pstapriv->tim_bitmap |= BIT(psta->aid);
4140 //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
4142 if(update_tim == _TRUE)
4144 //DBG_871X("sleepq_len==1, update BCNTIM\n");
4145 //upate BCN for TIM IE
4146 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer UC");
4150 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4152 //if(psta->sleepq_len > (NR_XMITFRAME>>3))
4154 // wakeup_sta_to_xmit(padapter, psta);
4159 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_ucast);
4164 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4170 static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_info *psta, _queue *pframequeue)
4173 _list *plist, *phead;
4175 struct tx_servq *ptxservq;
4176 struct pkt_attrib *pattrib;
4177 struct xmit_frame *pxmitframe;
4178 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
4180 phead = get_list_head(pframequeue);
4181 plist = get_next(phead);
4183 while (rtw_end_of_queue_search(phead, plist) == _FALSE)
4185 pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
4187 plist = get_next(plist);
4189 pattrib = &pxmitframe->attrib;
4191 pattrib->triggered = 0;
4193 ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);
4197 ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
4200 phwxmits[ac_index].accnt--;
4204 //DBG_871X("xmitframe_enqueue_for_sleeping_sta return _FALSE\n");
4211 void stop_sta_xmit(_adapter *padapter, struct sta_info *psta)
4214 struct sta_info *psta_bmc;
4215 struct sta_xmit_priv *pstaxmitpriv;
4216 struct sta_priv *pstapriv = &padapter->stapriv;
4217 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4219 pstaxmitpriv = &psta->sta_xmitpriv;
4222 psta_bmc = rtw_get_bcmc_stainfo(padapter);
4225 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
4227 psta->state |= WIFI_SLEEP_STATE;
4230 if( !(psta->tdls_sta_state & TDLS_LINKED_STATE) )
4231 #endif //CONFIG_TDLS
4232 pstapriv->sta_dz_bitmap |= BIT(psta->aid);
4236 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending);
4237 rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));
4240 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vi_q.sta_pending);
4241 rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));
4244 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending);
4245 rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
4248 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending);
4249 rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));
4252 if (!(psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta_bmc != NULL)) {
4253 #endif //CONFIG_TDLS
4257 pstaxmitpriv = &psta_bmc->sta_xmitpriv;
4258 dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending);
4259 rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
4264 #endif //CONFIG_TDLS
4265 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
4270 void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
4273 u8 update_mask=0, wmmps_ac=0;
4274 struct sta_info *psta_bmc;
4275 _list *xmitframe_plist, *xmitframe_phead;
4276 struct xmit_frame *pxmitframe=NULL;
4277 struct sta_priv *pstapriv = &padapter->stapriv;
4278 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4280 psta_bmc = rtw_get_bcmc_stainfo(padapter);
4283 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4284 _enter_critical_bh(&pxmitpriv->lock, &irqL);
4286 xmitframe_phead = get_list_head(&psta->sleep_q);
4287 xmitframe_plist = get_next(xmitframe_phead);
4289 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4291 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4293 xmitframe_plist = get_next(xmitframe_plist);
4295 rtw_list_delete(&pxmitframe->list);
4297 switch(pxmitframe->attrib.priority)
4301 wmmps_ac = psta->uapsd_bk&BIT(1);
4305 wmmps_ac = psta->uapsd_vi&BIT(1);
4309 wmmps_ac = psta->uapsd_vo&BIT(1);
4314 wmmps_ac = psta->uapsd_be&BIT(1);
4319 if(psta->sleepq_len>0)
4320 pxmitframe->attrib.mdata = 1;
4322 pxmitframe->attrib.mdata = 0;
4326 psta->sleepq_ac_len--;
4327 if(psta->sleepq_ac_len>0)
4329 pxmitframe->attrib.mdata = 1;
4330 pxmitframe->attrib.eosp = 0;
4334 pxmitframe->attrib.mdata = 0;
4335 pxmitframe->attrib.eosp = 1;
4339 pxmitframe->attrib.triggered = 1;
4342 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4343 if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
4345 rtw_os_xmit_complete(padapter, pxmitframe);
4347 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4349 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4354 if(psta->sleepq_len==0)
4357 if( psta->tdls_sta_state & TDLS_LINKED_STATE )
4359 if(psta->state&WIFI_SLEEP_STATE)
4360 psta->state ^= WIFI_SLEEP_STATE;
4362 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4365 #endif //CONFIG_TDLS
4367 if (pstapriv->tim_bitmap & BIT(psta->aid)) {
4368 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4369 //upate BCN for TIM IE
4370 //update_BCNTIM(padapter);
4371 update_mask = BIT(0);
4374 pstapriv->tim_bitmap &= ~BIT(psta->aid);
4376 if(psta->state&WIFI_SLEEP_STATE)
4377 psta->state ^= WIFI_SLEEP_STATE;
4379 if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
4381 DBG_871X("%s alive check\n", __func__);
4382 psta->expire_to = pstapriv->expire_to;
4383 psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
4386 pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
4393 if((pstapriv->sta_dz_bitmap&0xfffe) == 0x0)//no any sta in ps mode
4395 xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
4396 xmitframe_plist = get_next(xmitframe_phead);
4398 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4400 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4402 xmitframe_plist = get_next(xmitframe_plist);
4404 rtw_list_delete(&pxmitframe->list);
4406 psta_bmc->sleepq_len--;
4407 if(psta_bmc->sleepq_len>0)
4408 pxmitframe->attrib.mdata = 1;
4410 pxmitframe->attrib.mdata = 0;
4413 pxmitframe->attrib.triggered = 1;
4415 _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4416 if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
4418 rtw_os_xmit_complete(padapter, pxmitframe);
4420 _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4423 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4427 if(psta_bmc->sleepq_len==0)
4429 if (pstapriv->tim_bitmap & BIT(0)) {
4430 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4431 //upate BCN for TIM IE
4432 //update_BCNTIM(padapter);
4433 update_mask |= BIT(1);
4435 pstapriv->tim_bitmap &= ~BIT(0);
4436 pstapriv->sta_dz_bitmap &= ~BIT(0);
4443 //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4444 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4448 //update_BCNTIM(padapter);
4449 if ((update_mask & (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)))
4450 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC&BMC");
4451 else if ((update_mask & BIT(1)) == BIT(1))
4452 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear BMC");
4454 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC");
4459 void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
4463 _list *xmitframe_plist, *xmitframe_phead;
4464 struct xmit_frame *pxmitframe=NULL;
4465 struct sta_priv *pstapriv = &padapter->stapriv;
4466 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4469 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4470 _enter_critical_bh(&pxmitpriv->lock, &irqL);
4472 xmitframe_phead = get_list_head(&psta->sleep_q);
4473 xmitframe_plist = get_next(xmitframe_phead);
4475 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4477 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4479 xmitframe_plist = get_next(xmitframe_plist);
4481 switch(pxmitframe->attrib.priority)
4485 wmmps_ac = psta->uapsd_bk&BIT(1);
4489 wmmps_ac = psta->uapsd_vi&BIT(1);
4493 wmmps_ac = psta->uapsd_vo&BIT(1);
4498 wmmps_ac = psta->uapsd_be&BIT(1);
4505 rtw_list_delete(&pxmitframe->list);
4508 psta->sleepq_ac_len--;
4510 if(psta->sleepq_ac_len>0)
4512 pxmitframe->attrib.mdata = 1;
4513 pxmitframe->attrib.eosp = 0;
4517 pxmitframe->attrib.mdata = 0;
4518 pxmitframe->attrib.eosp = 1;
4521 pxmitframe->attrib.triggered = 1;
4522 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4524 if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac))
4527 if(psta->tdls_sta_state & TDLS_LINKED_STATE )
4529 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4532 #endif //CONFIG_TDLS
4533 pstapriv->tim_bitmap &= ~BIT(psta->aid);
4535 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4536 //upate BCN for TIM IE
4537 //update_BCNTIM(padapter);
4538 update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
4539 //update_mask = BIT(0);
4545 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4546 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4551 #endif /* defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS) */
4553 #ifdef CONFIG_XMIT_THREAD_MODE
4554 void enqueue_pending_xmitbuf(
4555 struct xmit_priv *pxmitpriv,
4556 struct xmit_buf *pxmitbuf)
4560 _adapter *pri_adapter = pxmitpriv->adapter;
4562 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4564 _enter_critical_bh(&pqueue->lock, &irql);
4565 rtw_list_delete(&pxmitbuf->list);
4566 rtw_list_insert_tail(&pxmitbuf->list, get_list_head(pqueue));
4567 _exit_critical_bh(&pqueue->lock, &irql);
4571 #if defined(CONFIG_SDIO_HCI) && defined(CONFIG_CONCURRENT_MODE)
4572 if (pri_adapter->adapter_type > PRIMARY_ADAPTER)
4573 pri_adapter = pri_adapter->pbuddy_adapter;
4574 #endif //SDIO_HCI + CONCURRENT
4575 _rtw_up_sema(&(pri_adapter->xmitpriv.xmit_sema));
4579 void enqueue_pending_xmitbuf_to_head(
4580 struct xmit_priv *pxmitpriv,
4581 struct xmit_buf *pxmitbuf)
4585 _adapter *pri_adapter = pxmitpriv->adapter;
4587 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4589 _enter_critical_bh(&pqueue->lock, &irql);
4590 rtw_list_delete(&pxmitbuf->list);
4591 rtw_list_insert_head(&pxmitbuf->list, get_list_head(pqueue));
4592 _exit_critical_bh(&pqueue->lock, &irql);
4595 struct xmit_buf* dequeue_pending_xmitbuf(
4596 struct xmit_priv *pxmitpriv)
4599 struct xmit_buf *pxmitbuf;
4604 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4606 _enter_critical_bh(&pqueue->lock, &irql);
4608 if (_rtw_queue_empty(pqueue) == _FALSE)
4610 _list *plist, *phead;
4612 phead = get_list_head(pqueue);
4613 plist = get_next(phead);
4614 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
4615 rtw_list_delete(&pxmitbuf->list);
4618 _exit_critical_bh(&pqueue->lock, &irql);
4623 struct xmit_buf* dequeue_pending_xmitbuf_under_survey(
4624 struct xmit_priv *pxmitpriv)
4627 struct xmit_buf *pxmitbuf;
4628 #ifdef CONFIG_USB_HCI
4629 struct xmit_frame *pxmitframe;
4635 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4637 _enter_critical_bh(&pqueue->lock, &irql);
4639 if (_rtw_queue_empty(pqueue) == _FALSE)
4641 _list *plist, *phead;
4644 phead = get_list_head(pqueue);
4647 plist = get_next(plist);
4648 if (plist == phead) break;
4650 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
4652 #ifdef CONFIG_USB_HCI
4653 pxmitframe = (struct xmit_frame*)pxmitbuf->priv_data;
4656 type = GetFrameSubType(pxmitbuf->pbuf + TXDESC_SIZE + pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
4660 DBG_871X("%s, !!!ERROR!!! For USB, TODO ITEM \n", __FUNCTION__);
4663 type = GetFrameSubType(pxmitbuf->pbuf + TXDESC_OFFSET);
4666 if ((type == WIFI_PROBEREQ) ||
4667 (type == WIFI_DATA_NULL) ||
4668 (type == WIFI_QOS_DATA_NULL))
4670 rtw_list_delete(&pxmitbuf->list);
4677 _exit_critical_bh(&pqueue->lock, &irql);
4682 sint check_pending_xmitbuf(
4683 struct xmit_priv *pxmitpriv)
4689 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4691 _enter_critical_bh(&pqueue->lock, &irql);
4693 if(_rtw_queue_empty(pqueue) == _FALSE)
4696 _exit_critical_bh(&pqueue->lock, &irql);
4701 thread_return rtw_xmit_thread(thread_context context)
4708 padapter = (PADAPTER)context;
4710 thread_enter("RTW_XMIT_THREAD");
4713 err = rtw_hal_xmit_thread_handler(padapter);
4714 flush_signals_thread();
4715 } while (_SUCCESS == err);
4717 _rtw_up_sema(&padapter->xmitpriv.terminate_xmitthread_sema);
4723 void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms)
4725 sctx->timeout_ms = timeout_ms;
4726 sctx->submit_time= rtw_get_current_time();
4727 #ifdef PLATFORM_LINUX /* TODO: add condition wating interface for other os */
4728 init_completion(&sctx->done);
4730 sctx->status = RTW_SCTX_SUBMITTED;
4733 int rtw_sctx_wait(struct submit_ctx *sctx, const char *msg)
4736 unsigned long expire;
4739 #ifdef PLATFORM_LINUX
4740 expire= sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT;
4741 if (!wait_for_completion_timeout(&sctx->done, expire)) {
4742 /* timeout, do something?? */
4743 status = RTW_SCTX_DONE_TIMEOUT;
4744 DBG_871X("%s timeout: %s\n", __func__, msg);
4746 status = sctx->status;
4750 if (status == RTW_SCTX_DONE_SUCCESS) {
4757 bool rtw_sctx_chk_waring_status(int status)
4760 case RTW_SCTX_DONE_UNKNOWN:
4761 case RTW_SCTX_DONE_BUF_ALLOC:
4762 case RTW_SCTX_DONE_BUF_FREE:
4764 case RTW_SCTX_DONE_DRV_STOP:
4765 case RTW_SCTX_DONE_DEV_REMOVE:
4772 void rtw_sctx_done_err(struct submit_ctx **sctx, int status)
4775 if (rtw_sctx_chk_waring_status(status))
4776 DBG_871X("%s status:%d\n", __func__, status);
4777 (*sctx)->status = status;
4778 #ifdef PLATFORM_LINUX
4779 complete(&((*sctx)->done));
4785 void rtw_sctx_done(struct submit_ctx **sctx)
4787 rtw_sctx_done_err(sctx, RTW_SCTX_DONE_SUCCESS);
4790 #ifdef CONFIG_XMIT_ACK
4792 #ifdef CONFIG_XMIT_ACK_POLLING
4793 s32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter);
4796 * rtw_ack_tx_polling -
4797 * @pxmitpriv: xmit_priv to address ack_tx_ops
4798 * @timeout_ms: timeout msec
4800 * Init ack_tx_ops and then do c2h_evt_hdl() and polling ack_tx_ops repeatedly
4801 * till tx report or timeout
4802 * Returns: _SUCCESS if TX report ok, _FAIL for others
4804 int rtw_ack_tx_polling(struct xmit_priv *pxmitpriv, u32 timeout_ms)
4807 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
4808 _adapter *adapter = container_of(pxmitpriv, _adapter, xmitpriv);
4810 pack_tx_ops->submit_time = rtw_get_current_time();
4811 pack_tx_ops->timeout_ms = timeout_ms;
4812 pack_tx_ops->status = RTW_SCTX_SUBMITTED;
4815 c2h_evt_hdl(adapter, NULL, rtw_hal_c2h_id_filter_ccx(adapter));
4816 if (pack_tx_ops->status != RTW_SCTX_SUBMITTED)
4819 if (adapter->bDriverStopped) {
4820 pack_tx_ops->status = RTW_SCTX_DONE_DRV_STOP;
4823 if (adapter->bSurpriseRemoved) {
4824 pack_tx_ops->status = RTW_SCTX_DONE_DEV_REMOVE;
4829 } while (rtw_get_passing_time_ms(pack_tx_ops->submit_time) < timeout_ms);
4831 if (pack_tx_ops->status == RTW_SCTX_SUBMITTED) {
4832 pack_tx_ops->status = RTW_SCTX_DONE_TIMEOUT;
4833 DBG_871X("%s timeout\n", __func__);
4836 if (pack_tx_ops->status == RTW_SCTX_DONE_SUCCESS)
4843 int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms)
4845 #ifdef CONFIG_XMIT_ACK_POLLING
4846 return rtw_ack_tx_polling(pxmitpriv, timeout_ms);
4848 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
4850 pack_tx_ops->submit_time = rtw_get_current_time();
4851 pack_tx_ops->timeout_ms = timeout_ms;
4852 pack_tx_ops->status = RTW_SCTX_SUBMITTED;
4854 return rtw_sctx_wait(pack_tx_ops, __func__);
4858 void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status)
4860 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
4862 if (pxmitpriv->ack_tx) {
4863 rtw_sctx_done_err(&pack_tx_ops, status);
4865 DBG_871X("%s ack_tx not set\n", __func__);
4868 #endif //CONFIG_XMIT_ACK