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 ******************************************************************************/
17 #include <osdep_service.h>
18 #include <drv_types.h>
21 #include <osdep_intf.h>
22 #include <linux/vmalloc.h>
24 static u8 P802_1H_OUI
[P80211_OUI_LEN
] = { 0x00, 0x00, 0xf8 };
25 static u8 RFC1042_OUI
[P80211_OUI_LEN
] = { 0x00, 0x00, 0x00 };
27 static void _init_txservq(struct tx_servq
*ptxservq
)
29 INIT_LIST_HEAD(&ptxservq
->tx_pending
);
30 _rtw_init_queue(&ptxservq
->sta_pending
);
34 void _rtw_init_sta_xmit_priv(struct sta_xmit_priv
*psta_xmitpriv
)
36 memset((unsigned char *)psta_xmitpriv
, 0, sizeof(struct sta_xmit_priv
));
37 spin_lock_init(&psta_xmitpriv
->lock
);
38 _init_txservq(&psta_xmitpriv
->be_q
);
39 _init_txservq(&psta_xmitpriv
->bk_q
);
40 _init_txservq(&psta_xmitpriv
->vi_q
);
41 _init_txservq(&psta_xmitpriv
->vo_q
);
42 INIT_LIST_HEAD(&psta_xmitpriv
->legacy_dz
);
43 INIT_LIST_HEAD(&psta_xmitpriv
->apsd
);
47 s32
_rtw_init_xmit_priv(struct xmit_priv
*pxmitpriv
, struct adapter
*padapter
)
50 struct xmit_buf
*pxmitbuf
;
51 struct xmit_frame
*pxframe
;
53 u32 max_xmit_extbuf_size
= MAX_XMIT_EXTBUF_SZ
;
54 u32 num_xmit_extbuf
= NR_XMIT_EXTBUFF
;
57 /* We don't need to memset padapter->XXX to zero, because adapter is allocated by vzalloc(). */
59 spin_lock_init(&pxmitpriv
->lock
);
62 Please insert all the queue initializaiton using _rtw_init_queue below
65 pxmitpriv
->adapter
= padapter
;
67 _rtw_init_queue(&pxmitpriv
->be_pending
);
68 _rtw_init_queue(&pxmitpriv
->bk_pending
);
69 _rtw_init_queue(&pxmitpriv
->vi_pending
);
70 _rtw_init_queue(&pxmitpriv
->vo_pending
);
71 _rtw_init_queue(&pxmitpriv
->bm_pending
);
73 _rtw_init_queue(&pxmitpriv
->free_xmit_queue
);
76 Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
77 and initialize free_xmit_frame below.
78 Please also apply free_txobj to link_up all the xmit_frames...
81 pxmitpriv
->pallocated_frame_buf
= vzalloc(NR_XMITFRAME
* sizeof(struct xmit_frame
) + 4);
83 if (pxmitpriv
->pallocated_frame_buf
== NULL
) {
84 pxmitpriv
->pxmit_frame_buf
= NULL
;
85 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("alloc xmit_frame fail!\n"));
89 pxmitpriv
->pxmit_frame_buf
= PTR_ALIGN(pxmitpriv
->pallocated_frame_buf
, 4);
90 /* pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - */
91 /* ((size_t) (pxmitpriv->pallocated_frame_buf) &3); */
93 pxframe
= (struct xmit_frame
*)pxmitpriv
->pxmit_frame_buf
;
95 for (i
= 0; i
< NR_XMITFRAME
; i
++) {
96 INIT_LIST_HEAD(&(pxframe
->list
));
98 pxframe
->padapter
= padapter
;
99 pxframe
->frame_tag
= NULL_FRAMETAG
;
103 pxframe
->buf_addr
= NULL
;
104 pxframe
->pxmitbuf
= NULL
;
106 list_add_tail(&(pxframe
->list
), &(pxmitpriv
->free_xmit_queue
.queue
));
111 pxmitpriv
->free_xmitframe_cnt
= NR_XMITFRAME
;
113 pxmitpriv
->frag_len
= MAX_FRAG_THRESHOLD
;
116 _rtw_init_queue(&pxmitpriv
->free_xmitbuf_queue
);
117 _rtw_init_queue(&pxmitpriv
->pending_xmitbuf_queue
);
119 pxmitpriv
->pallocated_xmitbuf
= vzalloc(NR_XMITBUFF
* sizeof(struct xmit_buf
) + 4);
121 if (pxmitpriv
->pallocated_xmitbuf
== NULL
) {
122 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("alloc xmit_buf fail!\n"));
127 pxmitpriv
->pxmitbuf
= PTR_ALIGN(pxmitpriv
->pallocated_xmitbuf
, 4);
128 /* pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - */
129 /* ((size_t) (pxmitpriv->pallocated_xmitbuf) &3); */
131 pxmitbuf
= (struct xmit_buf
*)pxmitpriv
->pxmitbuf
;
133 for (i
= 0; i
< NR_XMITBUFF
; i
++) {
134 INIT_LIST_HEAD(&pxmitbuf
->list
);
136 pxmitbuf
->priv_data
= NULL
;
137 pxmitbuf
->padapter
= padapter
;
138 pxmitbuf
->ext_tag
= false;
140 /* Tx buf allocation may fail sometimes, so sleep and retry. */
141 res
= rtw_os_xmit_resource_alloc(padapter
, pxmitbuf
, (MAX_XMITBUF_SZ
+ XMITBUF_ALIGN_SZ
));
144 res
= rtw_os_xmit_resource_alloc(padapter
, pxmitbuf
, (MAX_XMITBUF_SZ
+ XMITBUF_ALIGN_SZ
));
149 pxmitbuf
->flags
= XMIT_VO_QUEUE
;
151 list_add_tail(&pxmitbuf
->list
, &(pxmitpriv
->free_xmitbuf_queue
.queue
));
155 pxmitpriv
->free_xmitbuf_cnt
= NR_XMITBUFF
;
157 /* Init xmit extension buff */
158 _rtw_init_queue(&pxmitpriv
->free_xmit_extbuf_queue
);
160 pxmitpriv
->pallocated_xmit_extbuf
= vzalloc(num_xmit_extbuf
* sizeof(struct xmit_buf
) + 4);
162 if (pxmitpriv
->pallocated_xmit_extbuf
== NULL
) {
163 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("alloc xmit_extbuf fail!\n"));
168 pxmitpriv
->pxmit_extbuf
= PTR_ALIGN(pxmitpriv
->pallocated_xmit_extbuf
, 4);
170 pxmitbuf
= (struct xmit_buf
*)pxmitpriv
->pxmit_extbuf
;
172 for (i
= 0; i
< num_xmit_extbuf
; i
++) {
173 INIT_LIST_HEAD(&pxmitbuf
->list
);
175 pxmitbuf
->priv_data
= NULL
;
176 pxmitbuf
->padapter
= padapter
;
177 pxmitbuf
->ext_tag
= true;
179 res
= rtw_os_xmit_resource_alloc(padapter
, pxmitbuf
, max_xmit_extbuf_size
+ XMITBUF_ALIGN_SZ
);
185 list_add_tail(&pxmitbuf
->list
, &(pxmitpriv
->free_xmit_extbuf_queue
.queue
));
189 pxmitpriv
->free_xmit_extbuf_cnt
= num_xmit_extbuf
;
191 rtw_alloc_hwxmits(padapter
);
192 rtw_init_hwxmits(pxmitpriv
->hwxmits
, pxmitpriv
->hwxmit_entry
);
194 for (i
= 0; i
< 4; i
++)
195 pxmitpriv
->wmm_para_seq
[i
] = i
;
197 pxmitpriv
->txirp_cnt
= 1;
199 /* per AC pending irp */
200 pxmitpriv
->beq_cnt
= 0;
201 pxmitpriv
->bkq_cnt
= 0;
202 pxmitpriv
->viq_cnt
= 0;
203 pxmitpriv
->voq_cnt
= 0;
205 pxmitpriv
->ack_tx
= false;
206 mutex_init(&pxmitpriv
->ack_tx_mutex
);
207 rtw_sctx_init(&pxmitpriv
->ack_tx_ops
, 0);
209 rtw_hal_init_xmit_priv(padapter
);
217 void _rtw_free_xmit_priv(struct xmit_priv
*pxmitpriv
)
220 struct adapter
*padapter
= pxmitpriv
->adapter
;
221 struct xmit_frame
*pxmitframe
= (struct xmit_frame
*)pxmitpriv
->pxmit_frame_buf
;
222 struct xmit_buf
*pxmitbuf
= (struct xmit_buf
*)pxmitpriv
->pxmitbuf
;
223 u32 max_xmit_extbuf_size
= MAX_XMIT_EXTBUF_SZ
;
224 u32 num_xmit_extbuf
= NR_XMIT_EXTBUFF
;
226 if (pxmitpriv
->pxmit_frame_buf
== NULL
)
229 for (i
= 0; i
< NR_XMITFRAME
; i
++) {
230 rtw_os_xmit_complete(padapter
, pxmitframe
);
235 for (i
= 0; i
< NR_XMITBUFF
; i
++) {
236 rtw_os_xmit_resource_free(padapter
, pxmitbuf
, (MAX_XMITBUF_SZ
+ XMITBUF_ALIGN_SZ
));
240 vfree(pxmitpriv
->pallocated_frame_buf
);
241 vfree(pxmitpriv
->pallocated_xmitbuf
);
243 /* free xmit extension buff */
244 pxmitbuf
= (struct xmit_buf
*)pxmitpriv
->pxmit_extbuf
;
245 for (i
= 0; i
< num_xmit_extbuf
; i
++) {
246 rtw_os_xmit_resource_free(padapter
, pxmitbuf
, (max_xmit_extbuf_size
+ XMITBUF_ALIGN_SZ
));
250 if (pxmitpriv
->pallocated_xmit_extbuf
)
251 vfree(pxmitpriv
->pallocated_xmit_extbuf
);
253 rtw_free_hwxmits(padapter
);
255 mutex_destroy(&pxmitpriv
->ack_tx_mutex
);
258 static void update_attrib_vcs_info(struct adapter
*padapter
, struct xmit_frame
*pxmitframe
)
261 struct pkt_attrib
*pattrib
= &pxmitframe
->attrib
;
262 struct sta_info
*psta
= pattrib
->psta
;
263 struct mlme_ext_priv
*pmlmeext
= &(padapter
->mlmeextpriv
);
264 struct mlme_ext_info
*pmlmeinfo
= &(pmlmeext
->mlmext_info
);
266 if (pattrib
->nr_frags
!= 1)
267 sz
= padapter
->xmitpriv
.frag_len
;
269 sz
= pattrib
->last_txcmdsz
;
271 /* (1) RTS_Threshold is compared to the MPDU, not MSDU. */
272 /* (2) If there are more than one frag in this MSDU, only the first frag uses protection frame. */
273 /* Other fragments are protected by previous fragment. */
274 /* So we only need to check the length of first fragment. */
275 if (pmlmeext
->cur_wireless_mode
< WIRELESS_11_24N
|| padapter
->registrypriv
.wifi_spec
) {
276 if (sz
> padapter
->registrypriv
.rts_thresh
) {
277 pattrib
->vcs_mode
= RTS_CTS
;
280 pattrib
->vcs_mode
= RTS_CTS
;
281 else if (psta
->cts2self
)
282 pattrib
->vcs_mode
= CTS_TO_SELF
;
284 pattrib
->vcs_mode
= NONE_VCS
;
289 if ((pmlmeinfo
->assoc_AP_vendor
== HT_IOT_PEER_ATHEROS
) && pattrib
->ampdu_en
&&
290 (padapter
->securitypriv
.dot11PrivacyAlgrthm
== _AES_
)) {
291 pattrib
->vcs_mode
= CTS_TO_SELF
;
295 /* check ERP protection */
296 if (psta
->rtsen
|| psta
->cts2self
) {
298 pattrib
->vcs_mode
= RTS_CTS
;
299 else if (psta
->cts2self
)
300 pattrib
->vcs_mode
= CTS_TO_SELF
;
305 /* check HT op mode */
306 if (pattrib
->ht_en
) {
307 u8 htopmode
= pmlmeinfo
->HT_protection
;
308 if ((pmlmeext
->cur_bwmode
&& (htopmode
== 2 || htopmode
== 3)) ||
309 (!pmlmeext
->cur_bwmode
&& htopmode
== 3)) {
310 pattrib
->vcs_mode
= RTS_CTS
;
316 if (sz
> padapter
->registrypriv
.rts_thresh
) {
317 pattrib
->vcs_mode
= RTS_CTS
;
321 /* to do list: check MIMO power save condition. */
323 /* check AMPDU aggregation for TXOP */
324 if (pattrib
->ampdu_en
) {
325 pattrib
->vcs_mode
= RTS_CTS
;
329 pattrib
->vcs_mode
= NONE_VCS
;
335 static void update_attrib_phy_info(struct pkt_attrib
*pattrib
, struct sta_info
*psta
)
338 pattrib->vcs_mode = RTS_CTS;
339 else if (psta->cts2self)
340 pattrib->vcs_mode = CTS_TO_SELF;
342 pattrib->vcs_mode = NONE_VCS;*/
346 pattrib
->triggered
= 0;
348 /* qos_en, ht_en, init rate, , bw, ch_offset, sgi */
349 pattrib
->qos_en
= psta
->qos_option
;
351 pattrib
->raid
= psta
->raid
;
352 pattrib
->ht_en
= psta
->htpriv
.ht_option
;
353 pattrib
->bwmode
= psta
->htpriv
.bwmode
;
354 pattrib
->ch_offset
= psta
->htpriv
.ch_offset
;
355 pattrib
->sgi
= psta
->htpriv
.sgi
;
356 pattrib
->ampdu_en
= false;
357 pattrib
->retry_ctrl
= false;
360 u8
qos_acm(u8 acm_mask
, u8 priority
)
362 u8 change_priority
= priority
;
367 if (acm_mask
& BIT(1))
375 if (acm_mask
& BIT(2))
380 if (acm_mask
& BIT(3))
384 DBG_88E("qos_acm(): invalid pattrib->priority: %d!!!\n", priority
);
388 return change_priority
;
391 static void set_qos(struct pkt_file
*ppktfile
, struct pkt_attrib
*pattrib
)
393 struct ethhdr etherhdr
;
397 _rtw_open_pktfile(ppktfile
->pkt
, ppktfile
);
398 _rtw_pktfile_read(ppktfile
, (unsigned char *)ðerhdr
, ETH_HLEN
);
400 /* get user_prio from IP hdr */
401 if (pattrib
->ether_type
== 0x0800) {
402 _rtw_pktfile_read(ppktfile
, (u8
*)&ip_hdr
, sizeof(ip_hdr
));
403 /* user_prio = (ntohs(ip_hdr.tos) >> 5) & 0x3; */
404 user_prio
= ip_hdr
.tos
>> 5;
405 } else if (pattrib
->ether_type
== 0x888e) {
406 /* "When priority processing of data frames is supported, */
407 /* a STA's SME should send EAPOL-Key frames at the highest priority." */
411 pattrib
->priority
= user_prio
;
412 pattrib
->hdrlen
= WLAN_HDR_A3_QOS_LEN
;
413 pattrib
->subtype
= WIFI_QOS_DATA_TYPE
;
416 static s32
update_attrib(struct adapter
*padapter
, struct sk_buff
*pkt
, struct pkt_attrib
*pattrib
)
418 struct pkt_file pktfile
;
419 struct sta_info
*psta
= NULL
;
420 struct ethhdr etherhdr
;
423 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
424 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
425 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
426 struct qos_priv
*pqospriv
= &pmlmepriv
->qospriv
;
430 _rtw_open_pktfile(pkt
, &pktfile
);
431 _rtw_pktfile_read(&pktfile
, (u8
*)ðerhdr
, ETH_HLEN
);
433 pattrib
->ether_type
= ntohs(etherhdr
.h_proto
);
435 memcpy(pattrib
->dst
, ðerhdr
.h_dest
, ETH_ALEN
);
436 memcpy(pattrib
->src
, ðerhdr
.h_source
, ETH_ALEN
);
440 if (check_fwstate(pmlmepriv
, WIFI_ADHOC_STATE
) ||
441 check_fwstate(pmlmepriv
, WIFI_ADHOC_MASTER_STATE
)) {
442 memcpy(pattrib
->ra
, pattrib
->dst
, ETH_ALEN
);
443 memcpy(pattrib
->ta
, pattrib
->src
, ETH_ALEN
);
444 } else if (check_fwstate(pmlmepriv
, WIFI_STATION_STATE
)) {
445 memcpy(pattrib
->ra
, get_bssid(pmlmepriv
), ETH_ALEN
);
446 memcpy(pattrib
->ta
, pattrib
->src
, ETH_ALEN
);
447 } else if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) {
448 memcpy(pattrib
->ra
, pattrib
->dst
, ETH_ALEN
);
449 memcpy(pattrib
->ta
, get_bssid(pmlmepriv
), ETH_ALEN
);
452 pattrib
->pktlen
= pktfile
.pkt_len
;
454 if (pattrib
->ether_type
== ETH_P_IP
) {
455 /* The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time */
456 /* to prevent DHCP protocol fail */
458 _rtw_pktfile_read(&pktfile
, &tmp
[0], 24);
459 pattrib
->dhcp_pkt
= 0;
460 if (pktfile
.pkt_len
> 282) {/* MINIMUM_DHCP_PACKET_SIZE) { */
461 if (pattrib
->ether_type
== ETH_P_IP
) {/* IP header */
462 if (((tmp
[21] == 68) && (tmp
[23] == 67)) ||
463 ((tmp
[21] == 67) && (tmp
[23] == 68))) {
464 /* 68 : UDP BOOTP client */
465 /* 67 : UDP BOOTP server */
466 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("====================== update_attrib: get DHCP Packet\n"));
467 /* Use low rate to send DHCP packet. */
468 pattrib
->dhcp_pkt
= 1;
472 } else if (pattrib
->ether_type
== 0x888e) {
473 DBG_88E_LEVEL(_drv_info_
, "send eapol packet\n");
476 if ((pattrib
->ether_type
== 0x888e) || (pattrib
->dhcp_pkt
== 1))
477 rtw_set_scan_deny(padapter
, 3000);
479 /* If EAPOL , ARP , OR DHCP packet, driver must be in active mode. */
480 if ((pattrib
->ether_type
== 0x0806) || (pattrib
->ether_type
== 0x888e) || (pattrib
->dhcp_pkt
== 1))
481 rtw_lps_ctrl_wk_cmd(padapter
, LPS_CTRL_SPECIAL_PACKET
, 1);
483 bmcast
= IS_MCAST(pattrib
->ra
);
487 psta
= rtw_get_bcmc_stainfo(padapter
);
489 psta
= rtw_get_stainfo(pstapriv
, pattrib
->ra
);
490 if (psta
== NULL
) { /* if we cannot get psta => drrp the pkt */
491 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_alert_
, ("\nupdate_attrib => get sta_info fail, ra: %pM\n", (pattrib
->ra
)));
494 } else if ((check_fwstate(pmlmepriv
, WIFI_AP_STATE
) == true) && (!(psta
->state
& _FW_LINKED
))) {
501 pattrib
->mac_id
= psta
->mac_id
;
502 /* DBG_88E("%s ==> mac_id(%d)\n", __func__, pattrib->mac_id); */
503 pattrib
->psta
= psta
;
505 /* if we cannot get psta => drop the pkt */
506 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_alert_
, ("\nupdate_attrib => get sta_info fail, ra:%pM\n", (pattrib
->ra
)));
511 pattrib
->ack_policy
= 0;
513 pattrib
->hdrlen
= WLAN_HDR_A3_LEN
;
514 pattrib
->subtype
= WIFI_DATA_TYPE
;
515 pattrib
->priority
= 0;
517 if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
|WIFI_ADHOC_STATE
|WIFI_ADHOC_MASTER_STATE
)) {
518 if (psta
->qos_option
)
519 set_qos(&pktfile
, pattrib
);
521 if (pqospriv
->qos_option
) {
522 set_qos(&pktfile
, pattrib
);
524 if (pmlmepriv
->acm_mask
!= 0)
525 pattrib
->priority
= qos_acm(pmlmepriv
->acm_mask
, pattrib
->priority
);
529 if (psta
->ieee8021x_blocked
) {
530 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("\n psta->ieee8021x_blocked == true\n"));
532 pattrib
->encrypt
= 0;
534 if ((pattrib
->ether_type
!= 0x888e) && !check_fwstate(pmlmepriv
, WIFI_MP_STATE
)) {
535 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("\npsta->ieee8021x_blocked == true, pattrib->ether_type(%.4x) != 0x888e\n", pattrib
->ether_type
));
540 GET_ENCRY_ALGO(psecuritypriv
, psta
, pattrib
->encrypt
, bmcast
);
542 switch (psecuritypriv
->dot11AuthAlgrthm
) {
543 case dot11AuthAlgrthm_Open
:
544 case dot11AuthAlgrthm_Shared
:
545 case dot11AuthAlgrthm_Auto
:
546 pattrib
->key_idx
= (u8
)psecuritypriv
->dot11PrivacyKeyIndex
;
548 case dot11AuthAlgrthm_8021X
:
550 pattrib
->key_idx
= (u8
)psecuritypriv
->dot118021XGrpKeyid
;
552 pattrib
->key_idx
= 0;
555 pattrib
->key_idx
= 0;
560 switch (pattrib
->encrypt
) {
564 pattrib
->icv_len
= 4;
568 pattrib
->icv_len
= 4;
570 if (padapter
->securitypriv
.busetkipkey
== _FAIL
) {
571 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
,
572 ("\npadapter->securitypriv.busetkipkey(%d) == _FAIL drop packet\n",
573 padapter
->securitypriv
.busetkipkey
));
579 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
, ("pattrib->encrypt=%d (_AES_)\n", pattrib
->encrypt
));
581 pattrib
->icv_len
= 8;
585 pattrib
->icv_len
= 0;
589 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
,
590 ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n",
591 pattrib
->encrypt
, padapter
->securitypriv
.sw_encrypt
));
593 if (pattrib
->encrypt
&&
594 (padapter
->securitypriv
.sw_encrypt
|| !psecuritypriv
->hw_decrypted
)) {
595 pattrib
->bswenc
= true;
596 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
,
597 ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc = true\n",
598 pattrib
->encrypt
, padapter
->securitypriv
.sw_encrypt
));
600 pattrib
->bswenc
= false;
601 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
, ("update_attrib: bswenc = false\n"));
604 update_attrib_phy_info(pattrib
, psta
);
612 static s32
xmitframe_addmic(struct adapter
*padapter
, struct xmit_frame
*pxmitframe
)
614 int curfragnum
, length
;
615 u8
*pframe
, *payload
, mic
[8];
616 struct mic_data micdata
;
617 struct sta_info
*stainfo
;
618 struct pkt_attrib
*pattrib
= &pxmitframe
->attrib
;
619 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
620 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
621 u8 priority
[4] = {0x0, 0x0, 0x0, 0x0};
622 u8 hw_hdr_offset
= 0;
623 int bmcst
= IS_MCAST(pattrib
->ra
);
626 stainfo
= pattrib
->psta
;
628 stainfo
= rtw_get_stainfo(&padapter
->stapriv
, &pattrib
->ra
[0]);
631 hw_hdr_offset
= TXDESC_SIZE
+ (pxmitframe
->pkt_offset
* PACKET_OFFSET_SZ
);
633 if (pattrib
->encrypt
== _TKIP_
) {/* if (psecuritypriv->dot11PrivacyAlgrthm == _TKIP_PRIVACY_) */
634 /* encode mic code */
635 if (stainfo
!= NULL
) {
636 u8 null_key
[16] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
637 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
640 pframe
= pxmitframe
->buf_addr
+ hw_hdr_offset
;
643 if (!memcmp(psecuritypriv
->dot118021XGrptxmickey
[psecuritypriv
->dot118021XGrpKeyid
].skey
, null_key
, 16))
645 /* start to calculate the mic code */
646 rtw_secmicsetkey(&micdata
, psecuritypriv
->dot118021XGrptxmickey
[psecuritypriv
->dot118021XGrpKeyid
].skey
);
648 if (!memcmp(&stainfo
->dot11tkiptxmickey
.skey
[0], null_key
, 16)) {
649 /* DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey == 0\n"); */
653 /* start to calculate the mic code */
654 rtw_secmicsetkey(&micdata
, &stainfo
->dot11tkiptxmickey
.skey
[0]);
657 if (pframe
[1]&1) { /* ToDS == 1 */
658 rtw_secmicappend(&micdata
, &pframe
[16], 6); /* DA */
659 if (pframe
[1]&2) /* From Ds == 1 */
660 rtw_secmicappend(&micdata
, &pframe
[24], 6);
662 rtw_secmicappend(&micdata
, &pframe
[10], 6);
663 } else { /* ToDS == 0 */
664 rtw_secmicappend(&micdata
, &pframe
[4], 6); /* DA */
665 if (pframe
[1]&2) /* From Ds == 1 */
666 rtw_secmicappend(&micdata
, &pframe
[16], 6);
668 rtw_secmicappend(&micdata
, &pframe
[10], 6);
672 priority
[0] = (u8
)pxmitframe
->attrib
.priority
;
674 rtw_secmicappend(&micdata
, &priority
[0], 4);
678 for (curfragnum
= 0; curfragnum
< pattrib
->nr_frags
; curfragnum
++) {
679 payload
= (u8
*)round_up((size_t)(payload
), 4);
680 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
,
681 ("=== curfragnum=%d, pframe = 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\n",
682 curfragnum
, *payload
, *(payload
+1),
683 *(payload
+2), *(payload
+3),
684 *(payload
+4), *(payload
+5),
685 *(payload
+6), *(payload
+7)));
687 payload
= payload
+pattrib
->hdrlen
+pattrib
->iv_len
;
688 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
,
689 ("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",
690 curfragnum
, pattrib
->hdrlen
, pattrib
->iv_len
));
691 if ((curfragnum
+1) == pattrib
->nr_frags
) {
692 length
= pattrib
->last_txcmdsz
-pattrib
->hdrlen
-pattrib
->iv_len
-((pattrib
->bswenc
) ? pattrib
->icv_len
: 0);
693 rtw_secmicappend(&micdata
, payload
, length
);
694 payload
= payload
+length
;
696 length
= pxmitpriv
->frag_len
-pattrib
->hdrlen
-pattrib
->iv_len
-((pattrib
->bswenc
) ? pattrib
->icv_len
: 0);
697 rtw_secmicappend(&micdata
, payload
, length
);
698 payload
= payload
+length
+pattrib
->icv_len
;
699 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("curfragnum=%d length=%d pattrib->icv_len=%d", curfragnum
, length
, pattrib
->icv_len
));
702 rtw_secgetmic(&micdata
, &(mic
[0]));
703 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("xmitframe_addmic: before add mic code!!!\n"));
704 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n", pattrib
->last_txcmdsz
));
705 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\
706 mic[4]= 0x%.2x , mic[5]= 0x%.2x , mic[6]= 0x%.2x , mic[7]= 0x%.2x !!!!\n",
707 mic
[0], mic
[1], mic
[2], mic
[3], mic
[4], mic
[5], mic
[6], mic
[7]));
708 /* add mic code and add the mic code length in last_txcmdsz */
710 memcpy(payload
, &(mic
[0]), 8);
711 pattrib
->last_txcmdsz
+= 8;
713 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
, ("\n ======== last pkt ========\n"));
714 payload
= payload
-pattrib
->last_txcmdsz
+8;
715 for (curfragnum
= 0; curfragnum
< pattrib
->last_txcmdsz
; curfragnum
= curfragnum
+8)
716 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
,
717 (" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ",
718 *(payload
+curfragnum
), *(payload
+curfragnum
+1),
719 *(payload
+curfragnum
+2), *(payload
+curfragnum
+3),
720 *(payload
+curfragnum
+4), *(payload
+curfragnum
+5),
721 *(payload
+curfragnum
+6), *(payload
+curfragnum
+7)));
723 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n"));
731 static s32
xmitframe_swencrypt(struct adapter
*padapter
, struct xmit_frame
*pxmitframe
)
733 struct pkt_attrib
*pattrib
= &pxmitframe
->attrib
;
736 if (pattrib
->bswenc
) {
737 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_alert_
, ("### xmitframe_swencrypt\n"));
738 switch (pattrib
->encrypt
) {
741 rtw_wep_encrypt(padapter
, (u8
*)pxmitframe
);
744 rtw_tkip_encrypt(padapter
, (u8
*)pxmitframe
);
747 rtw_aes_encrypt(padapter
, (u8
*)pxmitframe
);
753 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_notice_
, ("### xmitframe_hwencrypt\n"));
760 s32
rtw_make_wlanhdr(struct adapter
*padapter
, u8
*hdr
, struct pkt_attrib
*pattrib
)
764 struct ieee80211_hdr
*pwlanhdr
= (struct ieee80211_hdr
*)hdr
;
765 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
766 struct qos_priv
*pqospriv
= &pmlmepriv
->qospriv
;
767 u8 qos_option
= false;
770 __le16
*fctrl
= &pwlanhdr
->frame_control
;
772 struct sta_info
*psta
;
774 int bmcst
= IS_MCAST(pattrib
->ra
);
778 psta
= pattrib
->psta
;
781 psta
= rtw_get_bcmc_stainfo(padapter
);
783 psta
= rtw_get_stainfo(&padapter
->stapriv
, pattrib
->ra
);
786 memset(hdr
, 0, WLANHDR_OFFSET
);
788 SetFrameSubType(fctrl
, pattrib
->subtype
);
790 if (pattrib
->subtype
& WIFI_DATA_TYPE
) {
791 if ((check_fwstate(pmlmepriv
, WIFI_STATION_STATE
) == true)) {
792 /* to_ds = 1, fr_ds = 0; */
793 /* Data transfer to AP */
795 memcpy(pwlanhdr
->addr1
, get_bssid(pmlmepriv
), ETH_ALEN
);
796 memcpy(pwlanhdr
->addr2
, pattrib
->src
, ETH_ALEN
);
797 memcpy(pwlanhdr
->addr3
, pattrib
->dst
, ETH_ALEN
);
799 if (pqospriv
->qos_option
)
801 } else if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) {
802 /* to_ds = 0, fr_ds = 1; */
804 memcpy(pwlanhdr
->addr1
, pattrib
->dst
, ETH_ALEN
);
805 memcpy(pwlanhdr
->addr2
, get_bssid(pmlmepriv
), ETH_ALEN
);
806 memcpy(pwlanhdr
->addr3
, pattrib
->src
, ETH_ALEN
);
808 if (psta
->qos_option
)
810 } else if (check_fwstate(pmlmepriv
, WIFI_ADHOC_STATE
) ||
811 check_fwstate(pmlmepriv
, WIFI_ADHOC_MASTER_STATE
)) {
812 memcpy(pwlanhdr
->addr1
, pattrib
->dst
, ETH_ALEN
);
813 memcpy(pwlanhdr
->addr2
, pattrib
->src
, ETH_ALEN
);
814 memcpy(pwlanhdr
->addr3
, get_bssid(pmlmepriv
), ETH_ALEN
);
816 if (psta
->qos_option
)
819 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv
)));
827 if (pattrib
->encrypt
)
831 qc
= (unsigned short *)(hdr
+ pattrib
->hdrlen
- 2);
833 if (pattrib
->priority
)
834 SetPriority(qc
, pattrib
->priority
);
836 SetEOSP(qc
, pattrib
->eosp
);
838 SetAckpolicy(qc
, pattrib
->ack_policy
);
841 /* TODO: fill HT Control Field */
843 /* Update Seq Num will be handled by f/w */
845 psta
->sta_xmitpriv
.txseq_tid
[pattrib
->priority
]++;
846 psta
->sta_xmitpriv
.txseq_tid
[pattrib
->priority
] &= 0xFFF;
848 pattrib
->seqnum
= psta
->sta_xmitpriv
.txseq_tid
[pattrib
->priority
];
850 SetSeqNum(hdr
, pattrib
->seqnum
);
852 /* check if enable ampdu */
853 if (pattrib
->ht_en
&& psta
->htpriv
.ampdu_enable
) {
854 if (psta
->htpriv
.agg_enable_bitmap
& BIT(pattrib
->priority
))
855 pattrib
->ampdu_en
= true;
858 /* re-check if enable ampdu by BA_starting_seqctrl */
859 if (pattrib
->ampdu_en
) {
862 tx_seq
= psta
->BA_starting_seqctrl
[pattrib
->priority
& 0x0f];
864 /* check BA_starting_seqctrl */
865 if (SN_LESS(pattrib
->seqnum
, tx_seq
)) {
866 pattrib
->ampdu_en
= false;/* AGG BK */
867 } else if (SN_EQUAL(pattrib
->seqnum
, tx_seq
)) {
868 psta
->BA_starting_seqctrl
[pattrib
->priority
& 0x0f] = (tx_seq
+1)&0xfff;
870 pattrib
->ampdu_en
= true;/* AGG EN */
872 psta
->BA_starting_seqctrl
[pattrib
->priority
& 0x0f] = (pattrib
->seqnum
+1)&0xfff;
873 pattrib
->ampdu_en
= true;/* AGG EN */
883 s32
rtw_txframes_pending(struct adapter
*padapter
)
885 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
887 return (!list_empty(&pxmitpriv
->be_pending
.queue
) ||
888 !list_empty(&pxmitpriv
->bk_pending
.queue
) ||
889 !list_empty(&pxmitpriv
->vi_pending
.queue
) ||
890 !list_empty(&pxmitpriv
->vo_pending
.queue
));
893 s32
rtw_txframes_sta_ac_pending(struct adapter
*padapter
, struct pkt_attrib
*pattrib
)
895 struct sta_info
*psta
;
896 struct tx_servq
*ptxservq
;
897 int priority
= pattrib
->priority
;
899 psta
= pattrib
->psta
;
904 ptxservq
= &(psta
->sta_xmitpriv
.bk_q
);
908 ptxservq
= &(psta
->sta_xmitpriv
.vi_q
);
912 ptxservq
= &(psta
->sta_xmitpriv
.vo_q
);
917 ptxservq
= &(psta
->sta_xmitpriv
.be_q
);
921 return ptxservq
->qcnt
;
925 * Calculate wlan 802.11 packet MAX size from pkt_attrib
926 * This function doesn't consider fragment case
928 u32
rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib
*pattrib
)
932 len
= pattrib
->hdrlen
+ pattrib
->iv_len
; /* WLAN Header and IV */
933 len
+= SNAP_SIZE
+ sizeof(u16
); /* LLC */
934 len
+= pattrib
->pktlen
;
935 if (pattrib
->encrypt
== _TKIP_
)
937 len
+= ((pattrib
->bswenc
) ? pattrib
->icv_len
: 0); /* ICV */
944 This sub-routine will perform all the following:
946 1. remove 802.3 header.
947 2. create wlan_header, based on the info in pxmitframe
948 3. append sta's iv/ext-iv
950 5. move frag chunk from pframe to pxmitframe->mem
951 6. apply sw-encrypt, if necessary.
954 s32
rtw_xmitframe_coalesce(struct adapter
*padapter
, struct sk_buff
*pkt
, struct xmit_frame
*pxmitframe
)
956 struct pkt_file pktfile
;
957 s32 frg_inx
, frg_len
, mpdu_len
, llc_sz
, mem_sz
;
959 u8
*pframe
, *mem_start
;
961 struct sta_info
*psta
;
962 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
963 struct pkt_attrib
*pattrib
= &pxmitframe
->attrib
;
965 s32 bmcst
= IS_MCAST(pattrib
->ra
);
969 psta
= rtw_get_stainfo(&padapter
->stapriv
, pattrib
->ra
);
974 if (pxmitframe
->buf_addr
== NULL
) {
975 DBG_88E("==> %s buf_addr == NULL\n", __func__
);
979 pbuf_start
= pxmitframe
->buf_addr
;
981 hw_hdr_offset
= TXDESC_SIZE
+ (pxmitframe
->pkt_offset
* PACKET_OFFSET_SZ
);
983 mem_start
= pbuf_start
+ hw_hdr_offset
;
985 if (rtw_make_wlanhdr(padapter
, mem_start
, pattrib
) == _FAIL
) {
986 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"));
987 DBG_88E("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n");
992 _rtw_open_pktfile(pkt
, &pktfile
);
993 _rtw_pktfile_read(&pktfile
, NULL
, ETH_HLEN
);
996 frg_len
= pxmitpriv
->frag_len
- 4;/* 2346-4 = 2342 */
1005 SetMFrag(mem_start
);
1007 pframe
+= pattrib
->hdrlen
;
1008 mpdu_len
-= pattrib
->hdrlen
;
1010 /* adding icv, if necessary... */
1011 if (pattrib
->iv_len
) {
1012 switch (pattrib
->encrypt
) {
1015 WEP_IV(pattrib
->iv
, psta
->dot11txpn
, pattrib
->key_idx
);
1019 TKIP_IV(pattrib
->iv
, psta
->dot11txpn
, pattrib
->key_idx
);
1021 TKIP_IV(pattrib
->iv
, psta
->dot11txpn
, 0);
1025 AES_IV(pattrib
->iv
, psta
->dot11txpn
, pattrib
->key_idx
);
1027 AES_IV(pattrib
->iv
, psta
->dot11txpn
, 0);
1031 memcpy(pframe
, pattrib
->iv
, pattrib
->iv_len
);
1033 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_notice_
,
1034 ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n",
1035 padapter
->securitypriv
.dot11PrivacyKeyIndex
, pattrib
->iv
[3], *pframe
, *(pframe
+1), *(pframe
+2), *(pframe
+3)));
1037 pframe
+= pattrib
->iv_len
;
1039 mpdu_len
-= pattrib
->iv_len
;
1043 llc_sz
= rtw_put_snap(pframe
, pattrib
->ether_type
);
1048 if ((pattrib
->icv_len
> 0) && (pattrib
->bswenc
))
1049 mpdu_len
-= pattrib
->icv_len
;
1052 /* don't do fragment to broadcat/multicast packets */
1053 mem_sz
= _rtw_pktfile_read(&pktfile
, pframe
, pattrib
->pktlen
);
1055 mem_sz
= _rtw_pktfile_read(&pktfile
, pframe
, mpdu_len
);
1060 if ((pattrib
->icv_len
> 0) && (pattrib
->bswenc
)) {
1061 memcpy(pframe
, pattrib
->icv
, pattrib
->icv_len
);
1062 pframe
+= pattrib
->icv_len
;
1067 if (bmcst
|| rtw_endofpktfile(&pktfile
)) {
1068 pattrib
->nr_frags
= frg_inx
;
1070 pattrib
->last_txcmdsz
= pattrib
->hdrlen
+ pattrib
->iv_len
+ ((pattrib
->nr_frags
== 1) ? llc_sz
: 0) +
1071 ((pattrib
->bswenc
) ? pattrib
->icv_len
: 0) + mem_sz
;
1073 ClearMFrag(mem_start
);
1077 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("%s: There're still something in packet!\n", __func__
));
1080 addr
= (size_t)(pframe
);
1082 mem_start
= (unsigned char *)round_up(addr
, 4) + hw_hdr_offset
;
1083 memcpy(mem_start
, pbuf_start
+ hw_hdr_offset
, pattrib
->hdrlen
);
1086 /* Frame is about to be encrypted. Forward it to the monitor first. */
1087 rtl88eu_mon_xmit_hook(padapter
->pmondev
, pxmitframe
, frg_len
);
1089 if (xmitframe_addmic(padapter
, pxmitframe
) == _FAIL
) {
1090 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n"));
1091 DBG_88E("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n");
1096 xmitframe_swencrypt(padapter
, pxmitframe
);
1099 update_attrib_vcs_info(padapter
, pxmitframe
);
1101 pattrib
->vcs_mode
= NONE_VCS
;
1109 /* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header
1110 * IEEE LLC/SNAP header contains 8 octets
1111 * First 3 octets comprise the LLC portion
1112 * SNAP portion, 5 octets, is divided into two fields:
1113 * Organizationally Unique Identifier(OUI), 3 octets,
1114 * type, defined by that organization, 2 octets.
1116 s32
rtw_put_snap(u8
*data
, u16 h_proto
)
1118 struct ieee80211_snap_hdr
*snap
;
1122 snap
= (struct ieee80211_snap_hdr
*)data
;
1127 if (h_proto
== 0x8137 || h_proto
== 0x80f3)
1132 snap
->oui
[0] = oui
[0];
1133 snap
->oui
[1] = oui
[1];
1134 snap
->oui
[2] = oui
[2];
1136 *(__be16
*)(data
+ SNAP_SIZE
) = htons(h_proto
);
1139 return SNAP_SIZE
+ sizeof(u16
);
1142 void rtw_update_protection(struct adapter
*padapter
, u8
*ie
, uint ie_len
)
1147 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
1148 struct registry_priv
*pregistrypriv
= &padapter
->registrypriv
;
1151 switch (pxmitpriv
->vcs_setting
) {
1153 pxmitpriv
->vcs
= NONE_VCS
;
1159 perp
= rtw_get_ie(ie
, _ERPINFO_IE_
, &erp_len
, ie_len
);
1161 pxmitpriv
->vcs
= NONE_VCS
;
1163 protection
= (*(perp
+ 2)) & BIT(1);
1165 if (pregistrypriv
->vcs_type
== RTS_CTS
)
1166 pxmitpriv
->vcs
= RTS_CTS
;
1168 pxmitpriv
->vcs
= CTS_TO_SELF
;
1170 pxmitpriv
->vcs
= NONE_VCS
;
1178 void rtw_count_tx_stats(struct adapter
*padapter
, struct xmit_frame
*pxmitframe
, int sz
)
1180 struct sta_info
*psta
= NULL
;
1181 struct stainfo_stats
*pstats
= NULL
;
1182 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
1183 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1185 if ((pxmitframe
->frame_tag
&0x0f) == DATA_FRAMETAG
) {
1186 pxmitpriv
->tx_bytes
+= sz
;
1187 pmlmepriv
->LinkDetectInfo
.NumTxOkInPeriod
+= pxmitframe
->agg_num
;
1189 psta
= pxmitframe
->attrib
.psta
;
1191 pstats
= &psta
->sta_stats
;
1192 pstats
->tx_pkts
+= pxmitframe
->agg_num
;
1193 pstats
->tx_bytes
+= sz
;
1198 struct xmit_buf
*rtw_alloc_xmitbuf_ext(struct xmit_priv
*pxmitpriv
)
1201 struct xmit_buf
*pxmitbuf
;
1202 struct __queue
*pfree_queue
= &pxmitpriv
->free_xmit_extbuf_queue
;
1204 spin_lock_irqsave(&pfree_queue
->lock
, irql
);
1205 pxmitbuf
= list_first_entry_or_null(&pfree_queue
->queue
,
1206 struct xmit_buf
, list
);
1208 list_del_init(&pxmitbuf
->list
);
1209 pxmitpriv
->free_xmit_extbuf_cnt
--;
1210 pxmitbuf
->priv_data
= NULL
;
1211 /* pxmitbuf->ext_tag = true; */
1212 if (pxmitbuf
->sctx
) {
1213 DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__
);
1214 rtw_sctx_done_err(&pxmitbuf
->sctx
, RTW_SCTX_DONE_BUF_ALLOC
);
1217 spin_unlock_irqrestore(&pfree_queue
->lock
, irql
);
1222 s32
rtw_free_xmitbuf_ext(struct xmit_priv
*pxmitpriv
, struct xmit_buf
*pxmitbuf
)
1225 struct __queue
*pfree_queue
= &pxmitpriv
->free_xmit_extbuf_queue
;
1228 if (pxmitbuf
== NULL
)
1231 spin_lock_irqsave(&pfree_queue
->lock
, irql
);
1233 list_del_init(&pxmitbuf
->list
);
1235 list_add_tail(&(pxmitbuf
->list
), get_list_head(pfree_queue
));
1236 pxmitpriv
->free_xmit_extbuf_cnt
++;
1238 spin_unlock_irqrestore(&pfree_queue
->lock
, irql
);
1244 struct xmit_buf
*rtw_alloc_xmitbuf(struct xmit_priv
*pxmitpriv
)
1247 struct xmit_buf
*pxmitbuf
;
1248 struct __queue
*pfree_xmitbuf_queue
= &pxmitpriv
->free_xmitbuf_queue
;
1250 /* DBG_88E("+rtw_alloc_xmitbuf\n"); */
1252 spin_lock_irqsave(&pfree_xmitbuf_queue
->lock
, irql
);
1253 pxmitbuf
= list_first_entry_or_null(&pfree_xmitbuf_queue
->queue
,
1254 struct xmit_buf
, list
);
1256 list_del_init(&pxmitbuf
->list
);
1257 pxmitpriv
->free_xmitbuf_cnt
--;
1258 pxmitbuf
->priv_data
= NULL
;
1259 if (pxmitbuf
->sctx
) {
1260 DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__
);
1261 rtw_sctx_done_err(&pxmitbuf
->sctx
, RTW_SCTX_DONE_BUF_ALLOC
);
1264 spin_unlock_irqrestore(&pfree_xmitbuf_queue
->lock
, irql
);
1269 s32
rtw_free_xmitbuf(struct xmit_priv
*pxmitpriv
, struct xmit_buf
*pxmitbuf
)
1272 struct __queue
*pfree_xmitbuf_queue
= &pxmitpriv
->free_xmitbuf_queue
;
1274 if (pxmitbuf
== NULL
)
1277 if (pxmitbuf
->sctx
) {
1278 DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__
);
1279 rtw_sctx_done_err(&pxmitbuf
->sctx
, RTW_SCTX_DONE_BUF_FREE
);
1282 if (pxmitbuf
->ext_tag
) {
1283 rtw_free_xmitbuf_ext(pxmitpriv
, pxmitbuf
);
1285 spin_lock_irqsave(&pfree_xmitbuf_queue
->lock
, irql
);
1287 list_del_init(&pxmitbuf
->list
);
1289 list_add_tail(&(pxmitbuf
->list
), get_list_head(pfree_xmitbuf_queue
));
1291 pxmitpriv
->free_xmitbuf_cnt
++;
1292 spin_unlock_irqrestore(&pfree_xmitbuf_queue
->lock
, irql
);
1302 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
1304 If we turn on USE_RXTHREAD, then, no need for critical section.
1305 Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
1307 Must be very very cautious...
1311 struct xmit_frame
*rtw_alloc_xmitframe(struct xmit_priv
*pxmitpriv
)
1312 /* _queue *pfree_xmit_queue) */
1315 Please remember to use all the osdep_service api,
1316 and lock/unlock or _enter/_exit critical to protect
1319 struct xmit_frame
*pxframe
;
1320 struct __queue
*pfree_xmit_queue
= &pxmitpriv
->free_xmit_queue
;
1322 spin_lock_bh(&pfree_xmit_queue
->lock
);
1323 pxframe
= list_first_entry_or_null(&pfree_xmit_queue
->queue
,
1324 struct xmit_frame
, list
);
1326 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
,
1327 ("rtw_alloc_xmitframe:%d\n",
1328 pxmitpriv
->free_xmitframe_cnt
));
1330 list_del_init(&pxframe
->list
);
1332 /* default value setting */
1333 pxmitpriv
->free_xmitframe_cnt
--;
1335 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
,
1336 ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n",
1337 pxmitpriv
->free_xmitframe_cnt
));
1339 pxframe
->buf_addr
= NULL
;
1340 pxframe
->pxmitbuf
= NULL
;
1342 memset(&pxframe
->attrib
, 0, sizeof(struct pkt_attrib
));
1343 /* pxframe->attrib.psta = NULL; */
1345 pxframe
->frame_tag
= DATA_FRAMETAG
;
1347 pxframe
->pkt
= NULL
;
1348 pxframe
->pkt_offset
= 1;/* default use pkt_offset to fill tx desc */
1350 pxframe
->agg_num
= 1;
1351 pxframe
->ack_report
= 0;
1353 spin_unlock_bh(&pfree_xmit_queue
->lock
);
1358 s32
rtw_free_xmitframe(struct xmit_priv
*pxmitpriv
, struct xmit_frame
*pxmitframe
)
1360 struct __queue
*pfree_xmit_queue
= &pxmitpriv
->free_xmit_queue
;
1361 struct adapter
*padapter
= pxmitpriv
->adapter
;
1362 struct sk_buff
*pndis_pkt
= NULL
;
1365 if (pxmitframe
== NULL
) {
1366 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("====== rtw_free_xmitframe():pxmitframe == NULL!!!!!!!!!!\n"));
1370 spin_lock_bh(&pfree_xmit_queue
->lock
);
1372 list_del_init(&pxmitframe
->list
);
1374 if (pxmitframe
->pkt
) {
1375 pndis_pkt
= pxmitframe
->pkt
;
1376 pxmitframe
->pkt
= NULL
;
1379 list_add_tail(&pxmitframe
->list
, get_list_head(pfree_xmit_queue
));
1381 pxmitpriv
->free_xmitframe_cnt
++;
1382 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_debug_
, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv
->free_xmitframe_cnt
));
1384 spin_unlock_bh(&pfree_xmit_queue
->lock
);
1387 rtw_os_pkt_complete(padapter
, pndis_pkt
);
1395 void rtw_free_xmitframe_queue(struct xmit_priv
*pxmitpriv
, struct __queue
*pframequeue
)
1397 struct list_head
*plist
, *phead
;
1398 struct xmit_frame
*pxmitframe
;
1401 spin_lock_bh(&(pframequeue
->lock
));
1403 phead
= get_list_head(pframequeue
);
1404 plist
= phead
->next
;
1406 while (phead
!= plist
) {
1407 pxmitframe
= container_of(plist
, struct xmit_frame
, list
);
1409 plist
= plist
->next
;
1411 rtw_free_xmitframe(pxmitpriv
, pxmitframe
);
1413 spin_unlock_bh(&(pframequeue
->lock
));
1417 s32
rtw_xmitframe_enqueue(struct adapter
*padapter
, struct xmit_frame
*pxmitframe
)
1419 if (rtw_xmit_classifier(padapter
, pxmitframe
) == _FAIL
) {
1420 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
,
1421 ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n"));
1422 /* pxmitframe->pkt = NULL; */
1429 static struct xmit_frame
*dequeue_one_xmitframe(struct xmit_priv
*pxmitpriv
, struct hw_xmit
*phwxmit
, struct tx_servq
*ptxservq
, struct __queue
*pframe_queue
)
1431 struct list_head
*xmitframe_plist
, *xmitframe_phead
;
1432 struct xmit_frame
*pxmitframe
= NULL
;
1434 xmitframe_phead
= get_list_head(pframe_queue
);
1435 xmitframe_plist
= xmitframe_phead
->next
;
1437 if (xmitframe_phead
!= xmitframe_plist
) {
1438 pxmitframe
= container_of(xmitframe_plist
, struct xmit_frame
, list
);
1440 xmitframe_plist
= xmitframe_plist
->next
;
1442 list_del_init(&pxmitframe
->list
);
1449 struct xmit_frame
*rtw_dequeue_xframe(struct xmit_priv
*pxmitpriv
, struct hw_xmit
*phwxmit_i
, int entry
)
1451 struct list_head
*sta_plist
, *sta_phead
;
1452 struct hw_xmit
*phwxmit
;
1453 struct tx_servq
*ptxservq
= NULL
;
1454 struct __queue
*pframe_queue
= NULL
;
1455 struct xmit_frame
*pxmitframe
= NULL
;
1456 struct adapter
*padapter
= pxmitpriv
->adapter
;
1457 struct registry_priv
*pregpriv
= &padapter
->registrypriv
;
1461 inx
[0] = 0; inx
[1] = 1; inx
[2] = 2; inx
[3] = 3;
1463 if (pregpriv
->wifi_spec
== 1) {
1466 for (j
= 0; j
< 4; j
++)
1467 inx
[j
] = pxmitpriv
->wmm_para_seq
[j
];
1470 spin_lock_bh(&pxmitpriv
->lock
);
1472 for (i
= 0; i
< entry
; i
++) {
1473 phwxmit
= phwxmit_i
+ inx
[i
];
1475 sta_phead
= get_list_head(phwxmit
->sta_queue
);
1476 sta_plist
= sta_phead
->next
;
1478 while (sta_phead
!= sta_plist
) {
1479 ptxservq
= container_of(sta_plist
, struct tx_servq
, tx_pending
);
1481 pframe_queue
= &ptxservq
->sta_pending
;
1483 pxmitframe
= dequeue_one_xmitframe(pxmitpriv
, phwxmit
, ptxservq
, pframe_queue
);
1488 /* Remove sta node when there are no pending packets. */
1489 if (list_empty(&pframe_queue
->queue
)) /* must be done after get_next and before break */
1490 list_del_init(&ptxservq
->tx_pending
);
1494 sta_plist
= sta_plist
->next
;
1498 spin_unlock_bh(&pxmitpriv
->lock
);
1502 struct tx_servq
*rtw_get_sta_pending(struct adapter
*padapter
, struct sta_info
*psta
, int up
, u8
*ac
)
1504 struct tx_servq
*ptxservq
;
1509 ptxservq
= &(psta
->sta_xmitpriv
.bk_q
);
1511 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
, ("rtw_get_sta_pending : BK\n"));
1515 ptxservq
= &(psta
->sta_xmitpriv
.vi_q
);
1517 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
, ("rtw_get_sta_pending : VI\n"));
1521 ptxservq
= &(psta
->sta_xmitpriv
.vo_q
);
1523 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
, ("rtw_get_sta_pending : VO\n"));
1528 ptxservq
= &(psta
->sta_xmitpriv
.be_q
);
1530 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_info_
, ("rtw_get_sta_pending : BE\n"));
1539 * Will enqueue pxmitframe to the proper queue,
1540 * and indicate it to xx_pending list.....
1542 s32
rtw_xmit_classifier(struct adapter
*padapter
, struct xmit_frame
*pxmitframe
)
1545 struct sta_info
*psta
;
1546 struct tx_servq
*ptxservq
;
1547 struct pkt_attrib
*pattrib
= &pxmitframe
->attrib
;
1548 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1549 struct hw_xmit
*phwxmits
= padapter
->xmitpriv
.hwxmits
;
1554 psta
= pattrib
->psta
;
1556 psta
= rtw_get_stainfo(pstapriv
, pattrib
->ra
);
1560 DBG_88E("rtw_xmit_classifier: psta == NULL\n");
1561 RT_TRACE(_module_rtl871x_xmit_c_
, _drv_err_
, ("rtw_xmit_classifier: psta == NULL\n"));
1565 ptxservq
= rtw_get_sta_pending(padapter
, psta
, pattrib
->priority
, (u8
*)(&ac_index
));
1567 if (list_empty(&ptxservq
->tx_pending
))
1568 list_add_tail(&ptxservq
->tx_pending
, get_list_head(phwxmits
[ac_index
].sta_queue
));
1570 list_add_tail(&pxmitframe
->list
, get_list_head(&ptxservq
->sta_pending
));
1572 phwxmits
[ac_index
].accnt
++;
1579 void rtw_alloc_hwxmits(struct adapter
*padapter
)
1581 struct hw_xmit
*hwxmits
;
1582 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
1584 pxmitpriv
->hwxmit_entry
= HWXMIT_ENTRY
;
1586 pxmitpriv
->hwxmits
= kcalloc(pxmitpriv
->hwxmit_entry
,
1587 sizeof(struct hw_xmit
), GFP_KERNEL
);
1589 hwxmits
= pxmitpriv
->hwxmits
;
1591 hwxmits
[0] .sta_queue
= &pxmitpriv
->vo_pending
;
1592 hwxmits
[1] .sta_queue
= &pxmitpriv
->vi_pending
;
1593 hwxmits
[2] .sta_queue
= &pxmitpriv
->be_pending
;
1594 hwxmits
[3] .sta_queue
= &pxmitpriv
->bk_pending
;
1597 void rtw_free_hwxmits(struct adapter
*padapter
)
1599 struct hw_xmit
*hwxmits
;
1600 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
1602 hwxmits
= pxmitpriv
->hwxmits
;
1606 void rtw_init_hwxmits(struct hw_xmit
*phwxmit
, int entry
)
1609 for (i
= 0; i
< entry
; i
++, phwxmit
++)
1613 u32
rtw_get_ff_hwaddr(struct xmit_frame
*pxmitframe
)
1616 struct pkt_attrib
*pattrib
= &pxmitframe
->attrib
;
1618 switch (pattrib
->qsel
) {
1621 addr
= BE_QUEUE_INX
;
1625 addr
= BK_QUEUE_INX
;
1629 addr
= VI_QUEUE_INX
;
1633 addr
= VO_QUEUE_INX
;
1636 addr
= BCN_QUEUE_INX
;
1638 case 0x11:/* BC/MC in PS (HIQ) */
1639 addr
= HIGH_QUEUE_INX
;
1643 addr
= MGT_QUEUE_INX
;
1651 * The main transmit(tx) entry
1655 * 0 success, hardware will handle this xmit frame(packet)
1658 s32
rtw_xmit(struct adapter
*padapter
, struct sk_buff
**ppkt
)
1660 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
1661 struct xmit_frame
*pxmitframe
= NULL
;
1664 pxmitframe
= rtw_alloc_xmitframe(pxmitpriv
);
1665 if (pxmitframe
== NULL
) {
1666 RT_TRACE(_module_xmit_osdep_c_
, _drv_err_
, ("rtw_xmit: no more pxmitframe\n"));
1667 DBG_88E("DBG_TX_DROP_FRAME %s no more pxmitframe\n", __func__
);
1671 res
= update_attrib(padapter
, *ppkt
, &pxmitframe
->attrib
);
1674 RT_TRACE(_module_xmit_osdep_c_
, _drv_err_
, ("rtw_xmit: update attrib fail\n"));
1675 rtw_free_xmitframe(pxmitpriv
, pxmitframe
);
1678 pxmitframe
->pkt
= *ppkt
;
1680 rtw_led_control(padapter
, LED_CTL_TX
);
1682 pxmitframe
->attrib
.qsel
= pxmitframe
->attrib
.priority
;
1684 #ifdef CONFIG_88EU_AP_MODE
1685 spin_lock_bh(&pxmitpriv
->lock
);
1686 if (xmitframe_enqueue_for_sleeping_sta(padapter
, pxmitframe
)) {
1687 spin_unlock_bh(&pxmitpriv
->lock
);
1690 spin_unlock_bh(&pxmitpriv
->lock
);
1693 if (rtw_hal_xmit(padapter
, pxmitframe
) == false)
1699 #if defined(CONFIG_88EU_AP_MODE)
1701 int xmitframe_enqueue_for_sleeping_sta(struct adapter
*padapter
, struct xmit_frame
*pxmitframe
)
1704 struct sta_info
*psta
= NULL
;
1705 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1706 struct pkt_attrib
*pattrib
= &pxmitframe
->attrib
;
1707 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1708 int bmcst
= IS_MCAST(pattrib
->ra
);
1710 if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
) == false)
1714 psta
= pattrib
->psta
;
1716 psta
= rtw_get_stainfo(pstapriv
, pattrib
->ra
);
1721 if (pattrib
->triggered
== 1) {
1723 pattrib
->qsel
= 0x11;/* HIQ */
1728 spin_lock_bh(&psta
->sleep_q
.lock
);
1730 if (pstapriv
->sta_dz_bitmap
) {/* if any one sta is in ps mode */
1731 list_del_init(&pxmitframe
->list
);
1733 list_add_tail(&pxmitframe
->list
, get_list_head(&psta
->sleep_q
));
1737 pstapriv
->tim_bitmap
|= BIT(0);/* */
1738 pstapriv
->sta_dz_bitmap
|= BIT(0);
1740 update_beacon(padapter
, _TIM_IE_
, NULL
, false);/* tx bc/mc packets after update bcn */
1745 spin_unlock_bh(&psta
->sleep_q
.lock
);
1750 spin_lock_bh(&psta
->sleep_q
.lock
);
1752 if (psta
->state
&WIFI_SLEEP_STATE
) {
1755 if (pstapriv
->sta_dz_bitmap
&BIT(psta
->aid
)) {
1756 list_del_init(&pxmitframe
->list
);
1758 list_add_tail(&pxmitframe
->list
, get_list_head(&psta
->sleep_q
));
1762 switch (pattrib
->priority
) {
1765 wmmps_ac
= psta
->uapsd_bk
&BIT(0);
1769 wmmps_ac
= psta
->uapsd_vi
&BIT(0);
1773 wmmps_ac
= psta
->uapsd_vo
&BIT(0);
1778 wmmps_ac
= psta
->uapsd_be
&BIT(0);
1783 psta
->sleepq_ac_len
++;
1785 if (((psta
->has_legacy_ac
) && (!wmmps_ac
)) ||
1786 ((!psta
->has_legacy_ac
) && (wmmps_ac
))) {
1787 pstapriv
->tim_bitmap
|= BIT(psta
->aid
);
1789 if (psta
->sleepq_len
== 1) {
1790 /* update BCN for TIM IE */
1791 update_beacon(padapter
, _TIM_IE_
, NULL
, false);
1798 spin_unlock_bh(&psta
->sleep_q
.lock
);
1803 static void dequeue_xmitframes_to_sleeping_queue(struct adapter
*padapter
, struct sta_info
*psta
, struct __queue
*pframequeue
)
1805 struct list_head
*plist
, *phead
;
1807 struct tx_servq
*ptxservq
;
1808 struct pkt_attrib
*pattrib
;
1809 struct xmit_frame
*pxmitframe
;
1810 struct hw_xmit
*phwxmits
= padapter
->xmitpriv
.hwxmits
;
1812 phead
= get_list_head(pframequeue
);
1813 plist
= phead
->next
;
1815 while (phead
!= plist
) {
1816 pxmitframe
= container_of(plist
, struct xmit_frame
, list
);
1818 plist
= plist
->next
;
1820 xmitframe_enqueue_for_sleeping_sta(padapter
, pxmitframe
);
1822 pattrib
= &pxmitframe
->attrib
;
1824 ptxservq
= rtw_get_sta_pending(padapter
, psta
, pattrib
->priority
, (u8
*)(&ac_index
));
1827 phwxmits
[ac_index
].accnt
--;
1831 void stop_sta_xmit(struct adapter
*padapter
, struct sta_info
*psta
)
1833 struct sta_info
*psta_bmc
;
1834 struct sta_xmit_priv
*pstaxmitpriv
;
1835 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1836 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
1838 pstaxmitpriv
= &psta
->sta_xmitpriv
;
1840 /* for BC/MC Frames */
1841 psta_bmc
= rtw_get_bcmc_stainfo(padapter
);
1843 spin_lock_bh(&pxmitpriv
->lock
);
1845 psta
->state
|= WIFI_SLEEP_STATE
;
1847 pstapriv
->sta_dz_bitmap
|= BIT(psta
->aid
);
1849 dequeue_xmitframes_to_sleeping_queue(padapter
, psta
, &pstaxmitpriv
->vo_q
.sta_pending
);
1850 list_del_init(&(pstaxmitpriv
->vo_q
.tx_pending
));
1852 dequeue_xmitframes_to_sleeping_queue(padapter
, psta
, &pstaxmitpriv
->vi_q
.sta_pending
);
1853 list_del_init(&(pstaxmitpriv
->vi_q
.tx_pending
));
1855 dequeue_xmitframes_to_sleeping_queue(padapter
, psta
, &pstaxmitpriv
->be_q
.sta_pending
);
1856 list_del_init(&(pstaxmitpriv
->be_q
.tx_pending
));
1858 dequeue_xmitframes_to_sleeping_queue(padapter
, psta
, &pstaxmitpriv
->bk_q
.sta_pending
);
1859 list_del_init(&(pstaxmitpriv
->bk_q
.tx_pending
));
1861 /* for BC/MC Frames */
1862 pstaxmitpriv
= &psta_bmc
->sta_xmitpriv
;
1863 dequeue_xmitframes_to_sleeping_queue(padapter
, psta_bmc
, &pstaxmitpriv
->be_q
.sta_pending
);
1864 list_del_init(&(pstaxmitpriv
->be_q
.tx_pending
));
1866 spin_unlock_bh(&pxmitpriv
->lock
);
1869 void wakeup_sta_to_xmit(struct adapter
*padapter
, struct sta_info
*psta
)
1871 u8 update_mask
= 0, wmmps_ac
= 0;
1872 struct sta_info
*psta_bmc
;
1873 struct list_head
*xmitframe_plist
, *xmitframe_phead
;
1874 struct xmit_frame
*pxmitframe
= NULL
;
1875 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1877 spin_lock_bh(&psta
->sleep_q
.lock
);
1879 xmitframe_phead
= get_list_head(&psta
->sleep_q
);
1880 xmitframe_plist
= xmitframe_phead
->next
;
1882 while (xmitframe_phead
!= xmitframe_plist
) {
1883 pxmitframe
= container_of(xmitframe_plist
, struct xmit_frame
, list
);
1885 xmitframe_plist
= xmitframe_plist
->next
;
1887 list_del_init(&pxmitframe
->list
);
1889 switch (pxmitframe
->attrib
.priority
) {
1892 wmmps_ac
= psta
->uapsd_bk
&BIT(1);
1896 wmmps_ac
= psta
->uapsd_vi
&BIT(1);
1900 wmmps_ac
= psta
->uapsd_vo
&BIT(1);
1905 wmmps_ac
= psta
->uapsd_be
&BIT(1);
1910 if (psta
->sleepq_len
> 0)
1911 pxmitframe
->attrib
.mdata
= 1;
1913 pxmitframe
->attrib
.mdata
= 0;
1916 psta
->sleepq_ac_len
--;
1917 if (psta
->sleepq_ac_len
> 0) {
1918 pxmitframe
->attrib
.mdata
= 1;
1919 pxmitframe
->attrib
.eosp
= 0;
1921 pxmitframe
->attrib
.mdata
= 0;
1922 pxmitframe
->attrib
.eosp
= 1;
1926 pxmitframe
->attrib
.triggered
= 1;
1928 spin_unlock_bh(&psta
->sleep_q
.lock
);
1929 if (rtw_hal_xmit(padapter
, pxmitframe
))
1930 rtw_os_xmit_complete(padapter
, pxmitframe
);
1931 spin_lock_bh(&psta
->sleep_q
.lock
);
1934 if (psta
->sleepq_len
== 0) {
1935 pstapriv
->tim_bitmap
&= ~BIT(psta
->aid
);
1937 update_mask
= BIT(0);
1939 if (psta
->state
&WIFI_SLEEP_STATE
)
1940 psta
->state
^= WIFI_SLEEP_STATE
;
1942 if (psta
->state
& WIFI_STA_ALIVE_CHK_STATE
) {
1943 psta
->expire_to
= pstapriv
->expire_to
;
1944 psta
->state
^= WIFI_STA_ALIVE_CHK_STATE
;
1947 pstapriv
->sta_dz_bitmap
&= ~BIT(psta
->aid
);
1950 spin_unlock_bh(&psta
->sleep_q
.lock
);
1952 /* for BC/MC Frames */
1953 psta_bmc
= rtw_get_bcmc_stainfo(padapter
);
1957 if ((pstapriv
->sta_dz_bitmap
&0xfffe) == 0x0) { /* no any sta in ps mode */
1958 spin_lock_bh(&psta_bmc
->sleep_q
.lock
);
1960 xmitframe_phead
= get_list_head(&psta_bmc
->sleep_q
);
1961 xmitframe_plist
= xmitframe_phead
->next
;
1963 while (xmitframe_phead
!= xmitframe_plist
) {
1964 pxmitframe
= container_of(xmitframe_plist
, struct xmit_frame
, list
);
1966 xmitframe_plist
= xmitframe_plist
->next
;
1968 list_del_init(&pxmitframe
->list
);
1970 psta_bmc
->sleepq_len
--;
1971 if (psta_bmc
->sleepq_len
> 0)
1972 pxmitframe
->attrib
.mdata
= 1;
1974 pxmitframe
->attrib
.mdata
= 0;
1976 pxmitframe
->attrib
.triggered
= 1;
1978 spin_unlock_bh(&psta_bmc
->sleep_q
.lock
);
1979 if (rtw_hal_xmit(padapter
, pxmitframe
))
1980 rtw_os_xmit_complete(padapter
, pxmitframe
);
1981 spin_lock_bh(&psta_bmc
->sleep_q
.lock
);
1984 if (psta_bmc
->sleepq_len
== 0) {
1985 pstapriv
->tim_bitmap
&= ~BIT(0);
1986 pstapriv
->sta_dz_bitmap
&= ~BIT(0);
1988 update_mask
|= BIT(1);
1991 spin_unlock_bh(&psta_bmc
->sleep_q
.lock
);
1995 update_beacon(padapter
, _TIM_IE_
, NULL
, false);
1998 void xmit_delivery_enabled_frames(struct adapter
*padapter
, struct sta_info
*psta
)
2001 struct list_head
*xmitframe_plist
, *xmitframe_phead
;
2002 struct xmit_frame
*pxmitframe
= NULL
;
2003 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
2005 spin_lock_bh(&psta
->sleep_q
.lock
);
2007 xmitframe_phead
= get_list_head(&psta
->sleep_q
);
2008 xmitframe_plist
= xmitframe_phead
->next
;
2010 while (xmitframe_phead
!= xmitframe_plist
) {
2011 pxmitframe
= container_of(xmitframe_plist
, struct xmit_frame
, list
);
2013 xmitframe_plist
= xmitframe_plist
->next
;
2015 switch (pxmitframe
->attrib
.priority
) {
2018 wmmps_ac
= psta
->uapsd_bk
&BIT(1);
2022 wmmps_ac
= psta
->uapsd_vi
&BIT(1);
2026 wmmps_ac
= psta
->uapsd_vo
&BIT(1);
2031 wmmps_ac
= psta
->uapsd_be
&BIT(1);
2038 list_del_init(&pxmitframe
->list
);
2041 psta
->sleepq_ac_len
--;
2043 if (psta
->sleepq_ac_len
> 0) {
2044 pxmitframe
->attrib
.mdata
= 1;
2045 pxmitframe
->attrib
.eosp
= 0;
2047 pxmitframe
->attrib
.mdata
= 0;
2048 pxmitframe
->attrib
.eosp
= 1;
2051 pxmitframe
->attrib
.triggered
= 1;
2053 if (rtw_hal_xmit(padapter
, pxmitframe
) == true)
2054 rtw_os_xmit_complete(padapter
, pxmitframe
);
2056 if ((psta
->sleepq_ac_len
== 0) && (!psta
->has_legacy_ac
) && (wmmps_ac
)) {
2057 pstapriv
->tim_bitmap
&= ~BIT(psta
->aid
);
2059 /* update BCN for TIM IE */
2060 update_beacon(padapter
, _TIM_IE_
, NULL
, false);
2064 spin_unlock_bh(&psta
->sleep_q
.lock
);
2069 void rtw_sctx_init(struct submit_ctx
*sctx
, int timeout_ms
)
2071 sctx
->timeout_ms
= timeout_ms
;
2072 sctx
->submit_time
= jiffies
;
2073 init_completion(&sctx
->done
);
2074 sctx
->status
= RTW_SCTX_SUBMITTED
;
2077 int rtw_sctx_wait(struct submit_ctx
*sctx
)
2080 unsigned long expire
;
2083 expire
= sctx
->timeout_ms
? msecs_to_jiffies(sctx
->timeout_ms
) : MAX_SCHEDULE_TIMEOUT
;
2084 if (!wait_for_completion_timeout(&sctx
->done
, expire
)) {
2085 /* timeout, do something?? */
2086 status
= RTW_SCTX_DONE_TIMEOUT
;
2087 DBG_88E("%s timeout\n", __func__
);
2089 status
= sctx
->status
;
2092 if (status
== RTW_SCTX_DONE_SUCCESS
)
2098 static bool rtw_sctx_chk_waring_status(int status
)
2101 case RTW_SCTX_DONE_UNKNOWN
:
2102 case RTW_SCTX_DONE_BUF_ALLOC
:
2103 case RTW_SCTX_DONE_BUF_FREE
:
2105 case RTW_SCTX_DONE_DRV_STOP
:
2106 case RTW_SCTX_DONE_DEV_REMOVE
:
2113 void rtw_sctx_done_err(struct submit_ctx
**sctx
, int status
)
2116 if (rtw_sctx_chk_waring_status(status
))
2117 DBG_88E("%s status:%d\n", __func__
, status
);
2118 (*sctx
)->status
= status
;
2119 complete(&((*sctx
)->done
));
2124 int rtw_ack_tx_wait(struct xmit_priv
*pxmitpriv
, u32 timeout_ms
)
2126 struct submit_ctx
*pack_tx_ops
= &pxmitpriv
->ack_tx_ops
;
2128 pack_tx_ops
->submit_time
= jiffies
;
2129 pack_tx_ops
->timeout_ms
= timeout_ms
;
2130 pack_tx_ops
->status
= RTW_SCTX_SUBMITTED
;
2132 return rtw_sctx_wait(pack_tx_ops
);
2135 void rtw_ack_tx_done(struct xmit_priv
*pxmitpriv
, int status
)
2137 struct submit_ctx
*pack_tx_ops
= &pxmitpriv
->ack_tx_ops
;
2139 if (pxmitpriv
->ack_tx
)
2140 rtw_sctx_done_err(&pack_tx_ops
, status
);
2142 DBG_88E("%s ack_tx not set\n", __func__
);