1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2007 - 2012 Realtek Corporation. */
6 #include "../include/osdep_service.h"
7 #include "../include/drv_types.h"
8 #include "../include/wifi.h"
9 #include "../include/osdep_intf.h"
10 #include "../include/ip.h"
11 #include "../include/usb_ops.h"
12 #include "../include/usb_osintf.h"
14 static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
15 static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
17 static void _init_txservq(struct tx_servq *ptxservq)
20 INIT_LIST_HEAD(&ptxservq->tx_pending);
21 _rtw_init_queue(&ptxservq->sta_pending);
26 void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv)
29 memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv));
30 spin_lock_init(&psta_xmitpriv->lock);
31 _init_txservq(&psta_xmitpriv->be_q);
32 _init_txservq(&psta_xmitpriv->bk_q);
33 _init_txservq(&psta_xmitpriv->vi_q);
34 _init_txservq(&psta_xmitpriv->vo_q);
35 INIT_LIST_HEAD(&psta_xmitpriv->legacy_dz);
36 INIT_LIST_HEAD(&psta_xmitpriv->apsd);
40 s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, struct adapter *padapter)
43 struct xmit_buf *pxmitbuf;
44 struct xmit_frame *pxframe;
46 u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
47 u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
49 /* We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc(). */
51 spin_lock_init(&pxmitpriv->lock);
52 sema_init(&pxmitpriv->xmit_sema, 0);
53 sema_init(&pxmitpriv->terminate_xmitthread_sema, 0);
56 Please insert all the queue initializaiton using _rtw_init_queue below
59 pxmitpriv->adapter = padapter;
61 _rtw_init_queue(&pxmitpriv->be_pending);
62 _rtw_init_queue(&pxmitpriv->bk_pending);
63 _rtw_init_queue(&pxmitpriv->vi_pending);
64 _rtw_init_queue(&pxmitpriv->vo_pending);
65 _rtw_init_queue(&pxmitpriv->bm_pending);
67 _rtw_init_queue(&pxmitpriv->free_xmit_queue);
70 Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
71 and initialize free_xmit_frame below.
72 Please also apply free_txobj to link_up all the xmit_frames...
75 pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
77 if (!pxmitpriv->pallocated_frame_buf) {
78 pxmitpriv->pxmit_frame_buf = NULL;
82 pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_frame_buf), 4);
83 /* pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 - */
84 /* ((size_t) (pxmitpriv->pallocated_frame_buf) &3); */
86 pxframe = (struct xmit_frame *)pxmitpriv->pxmit_frame_buf;
88 for (i = 0; i < NR_XMITFRAME; i++) {
89 INIT_LIST_HEAD(&(pxframe->list));
91 pxframe->padapter = padapter;
92 pxframe->frame_tag = NULL_FRAMETAG;
96 pxframe->buf_addr = NULL;
97 pxframe->pxmitbuf = NULL;
99 list_add_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue));
104 pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;
106 pxmitpriv->frag_len = MAX_FRAG_THRESHOLD;
109 _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue);
110 _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue);
112 pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
114 if (!pxmitpriv->pallocated_xmitbuf) {
119 pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_xmitbuf), 4);
120 /* pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 - */
121 /* ((size_t) (pxmitpriv->pallocated_xmitbuf) &3); */
123 pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
125 for (i = 0; i < NR_XMITBUFF; i++) {
126 INIT_LIST_HEAD(&pxmitbuf->list);
128 pxmitbuf->priv_data = NULL;
129 pxmitbuf->padapter = padapter;
130 pxmitbuf->ext_tag = false;
132 /* Tx buf allocation may fail sometimes, so sleep and retry. */
133 res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ));
136 res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ));
142 pxmitbuf->flags = XMIT_VO_QUEUE;
144 list_add_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue));
148 pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF;
150 /* Init xmit extension buff */
151 _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
153 pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(num_xmit_extbuf * sizeof(struct xmit_buf) + 4);
155 if (!pxmitpriv->pallocated_xmit_extbuf) {
160 pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((size_t)(pxmitpriv->pallocated_xmit_extbuf), 4);
162 pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
164 for (i = 0; i < num_xmit_extbuf; i++) {
165 INIT_LIST_HEAD(&pxmitbuf->list);
167 pxmitbuf->priv_data = NULL;
168 pxmitbuf->padapter = padapter;
169 pxmitbuf->ext_tag = true;
171 res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf, max_xmit_extbuf_size + XMITBUF_ALIGN_SZ);
177 list_add_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));
181 pxmitpriv->free_xmit_extbuf_cnt = num_xmit_extbuf;
183 rtw_alloc_hwxmits(padapter);
184 rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
186 for (i = 0; i < 4; i++)
187 pxmitpriv->wmm_para_seq[i] = i;
189 pxmitpriv->txirp_cnt = 1;
191 sema_init(&(pxmitpriv->tx_retevt), 0);
193 /* per AC pending irp */
194 pxmitpriv->beq_cnt = 0;
195 pxmitpriv->bkq_cnt = 0;
196 pxmitpriv->viq_cnt = 0;
197 pxmitpriv->voq_cnt = 0;
199 pxmitpriv->ack_tx = false;
200 _rtw_mutex_init(&pxmitpriv->ack_tx_mutex);
201 rtw_sctx_init(&pxmitpriv->ack_tx_ops, 0);
203 rtw_hal_init_xmit_priv(padapter);
210 static void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv)
214 void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
217 struct adapter *padapter = pxmitpriv->adapter;
218 struct xmit_frame *pxmitframe = (struct xmit_frame *)pxmitpriv->pxmit_frame_buf;
219 struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
220 u32 max_xmit_extbuf_size = MAX_XMIT_EXTBUF_SZ;
221 u32 num_xmit_extbuf = NR_XMIT_EXTBUFF;
223 rtw_hal_free_xmit_priv(padapter);
225 rtw_mfree_xmit_priv_lock(pxmitpriv);
227 if (!pxmitpriv->pxmit_frame_buf)
230 for (i = 0; i < NR_XMITFRAME; i++) {
231 rtw_os_xmit_complete(padapter, pxmitframe);
236 for (i = 0; i < NR_XMITBUFF; i++) {
237 rtw_os_xmit_resource_free(padapter, pxmitbuf, (MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ));
241 vfree(pxmitpriv->pallocated_frame_buf);
243 vfree(pxmitpriv->pallocated_xmitbuf);
245 pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
246 for (i = 0; i < num_xmit_extbuf; i++) {
247 rtw_os_xmit_resource_free(padapter, pxmitbuf, (max_xmit_extbuf_size + XMITBUF_ALIGN_SZ));
251 vfree(pxmitpriv->pallocated_xmit_extbuf);
253 rtw_free_hwxmits(padapter);
255 _rtw_mutex_free(&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;
431 _rtw_open_pktfile(pkt, &pktfile);
432 _rtw_pktfile_read(&pktfile, (u8 *)ðerhdr, ETH_HLEN);
434 pattrib->ether_type = ntohs(etherhdr.h_proto);
436 memcpy(pattrib->dst, ðerhdr.h_dest, ETH_ALEN);
437 memcpy(pattrib->src, ðerhdr.h_source, ETH_ALEN);
441 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
442 check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
443 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
444 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
445 } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
446 memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
447 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
448 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
449 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
450 memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
453 pattrib->pktlen = pktfile.pkt_len;
455 if (ETH_P_IP == pattrib->ether_type) {
456 /* The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time */
457 /* to prevent DHCP protocol fail */
459 _rtw_pktfile_read(&pktfile, &tmp[0], 24);
460 pattrib->dhcp_pkt = 0;
461 if (pktfile.pkt_len > 282) {/* MINIMUM_DHCP_PACKET_SIZE) { */
462 if (ETH_P_IP == pattrib->ether_type) {/* IP header */
463 if (((tmp[21] == 68) && (tmp[23] == 67)) ||
464 ((tmp[21] == 67) && (tmp[23] == 68))) {
465 /* 68 : UDP BOOTP client */
466 /* 67 : UDP BOOTP server */
467 /* Use low rate to send DHCP packet. */
468 pattrib->dhcp_pkt = 1;
472 } else if (0x888e == pattrib->ether_type) {
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) { /* if we cannot get psta => drrp the pkt */
493 } else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == true) && (!(psta->state & _FW_LINKED))) {
500 pattrib->mac_id = psta->mac_id;
501 /* DBG_88E("%s ==> mac_id(%d)\n", __func__, pattrib->mac_id); */
502 pattrib->psta = psta;
504 /* if we cannot get psta => drop the pkt */
509 pattrib->ack_policy = 0;
510 /* get ether_hdr_len */
511 pattrib->pkt_hdrlen = ETH_HLEN;/* pattrib->ether_type == 0x8100) ? (14 + 4): 14; vlan tag */
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 pattrib->encrypt = 0;
532 if ((pattrib->ether_type != 0x888e) && !check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
537 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
539 switch (psecuritypriv->dot11AuthAlgrthm) {
540 case dot11AuthAlgrthm_Open:
541 case dot11AuthAlgrthm_Shared:
542 case dot11AuthAlgrthm_Auto:
543 pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;
545 case dot11AuthAlgrthm_8021X:
547 pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid;
549 pattrib->key_idx = 0;
552 pattrib->key_idx = 0;
557 switch (pattrib->encrypt) {
561 pattrib->icv_len = 4;
565 pattrib->icv_len = 4;
567 if (padapter->securitypriv.busetkipkey == _FAIL) {
574 pattrib->icv_len = 8;
578 pattrib->icv_len = 0;
582 if (pattrib->encrypt &&
583 (padapter->securitypriv.sw_encrypt || !psecuritypriv->hw_decrypted))
584 pattrib->bswenc = true;
586 pattrib->bswenc = false;
588 rtw_set_tx_chksum_offload(pkt, pattrib);
590 update_attrib_phy_info(pattrib, psta);
597 static s32 xmitframe_addmic(struct adapter *padapter, struct xmit_frame *pxmitframe)
599 int curfragnum, length;
600 u8 *pframe, *payload, mic[8];
601 struct mic_data micdata;
602 struct sta_info *stainfo;
603 struct pkt_attrib *pattrib = &pxmitframe->attrib;
604 struct security_priv *psecuritypriv = &padapter->securitypriv;
605 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
606 u8 priority[4] = {0x0, 0x0, 0x0, 0x0};
607 u8 hw_hdr_offset = 0;
608 int bmcst = IS_MCAST(pattrib->ra);
611 stainfo = pattrib->psta;
613 stainfo = rtw_get_stainfo(&padapter->stapriv, &pattrib->ra[0]);
615 hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);;
617 if (pattrib->encrypt == _TKIP_) {/* if (psecuritypriv->dot11PrivacyAlgrthm == _TKIP_PRIVACY_) */
618 /* encode mic code */
620 u8 null_key[16] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
621 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
624 pframe = pxmitframe->buf_addr + hw_hdr_offset;
627 if (!memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16))
629 /* start to calculate the mic code */
630 rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey);
632 if (!memcmp(&stainfo->dot11tkiptxmickey.skey[0], null_key, 16)) {
636 /* start to calculate the mic code */
637 rtw_secmicsetkey(&micdata, &stainfo->dot11tkiptxmickey.skey[0]);
640 if (pframe[1]&1) { /* ToDS == 1 */
641 rtw_secmicappend(&micdata, &pframe[16], 6); /* DA */
642 if (pframe[1]&2) /* From Ds == 1 */
643 rtw_secmicappend(&micdata, &pframe[24], 6);
645 rtw_secmicappend(&micdata, &pframe[10], 6);
646 } else { /* ToDS == 0 */
647 rtw_secmicappend(&micdata, &pframe[4], 6); /* DA */
648 if (pframe[1]&2) /* From Ds == 1 */
649 rtw_secmicappend(&micdata, &pframe[16], 6);
651 rtw_secmicappend(&micdata, &pframe[10], 6);
655 priority[0] = (u8)pxmitframe->attrib.priority;
657 rtw_secmicappend(&micdata, &priority[0], 4);
661 for (curfragnum = 0; curfragnum < pattrib->nr_frags; curfragnum++) {
662 payload = (u8 *)RND4((size_t)(payload));
664 payload = payload+pattrib->hdrlen+pattrib->iv_len;
665 if ((curfragnum+1) == pattrib->nr_frags) {
666 length = pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-((pattrib->bswenc) ? pattrib->icv_len : 0);
667 rtw_secmicappend(&micdata, payload, length);
668 payload = payload+length;
670 length = pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-((pattrib->bswenc) ? pattrib->icv_len : 0);
671 rtw_secmicappend(&micdata, payload, length);
672 payload = payload+length+pattrib->icv_len;
675 rtw_secgetmic(&micdata, &(mic[0]));
676 /* add mic code and add the mic code length in last_txcmdsz */
678 memcpy(payload, &(mic[0]), 8);
679 pattrib->last_txcmdsz += 8;
681 payload = payload-pattrib->last_txcmdsz+8;
688 static s32 xmitframe_swencrypt(struct adapter *padapter, struct xmit_frame *pxmitframe)
690 struct pkt_attrib *pattrib = &pxmitframe->attrib;
692 if (pattrib->bswenc) {
693 switch (pattrib->encrypt) {
696 rtw_wep_encrypt(padapter, (u8 *)pxmitframe);
699 rtw_tkip_encrypt(padapter, (u8 *)pxmitframe);
702 rtw_aes_encrypt(padapter, (u8 *)pxmitframe);
712 s32 rtw_make_wlanhdr (struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattrib)
716 struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
717 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
718 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
719 u8 qos_option = false;
722 __le16 *fctrl = &pwlanhdr->frame_ctl;
724 struct sta_info *psta;
726 int bmcst = IS_MCAST(pattrib->ra);
729 psta = pattrib->psta;
732 psta = rtw_get_bcmc_stainfo(padapter);
734 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
738 memset(hdr, 0, WLANHDR_OFFSET);
740 SetFrameSubType(fctrl, pattrib->subtype);
742 if (pattrib->subtype & WIFI_DATA_TYPE) {
743 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
744 /* to_ds = 1, fr_ds = 0; */
745 /* Data transfer to AP */
747 memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
748 memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
749 memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
751 if (pqospriv->qos_option)
753 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
754 /* to_ds = 0, fr_ds = 1; */
756 memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
757 memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
758 memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
760 if (psta->qos_option)
762 } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
763 check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
764 memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
765 memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
766 memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
768 if (psta->qos_option)
778 if (pattrib->encrypt)
782 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
784 if (pattrib->priority)
785 SetPriority(qc, pattrib->priority);
787 SetEOSP(qc, pattrib->eosp);
789 SetAckpolicy(qc, pattrib->ack_policy);
792 /* TODO: fill HT Control Field */
794 /* Update Seq Num will be handled by f/w */
796 psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
797 psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
799 pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
801 SetSeqNum(hdr, pattrib->seqnum);
803 /* check if enable ampdu */
804 if (pattrib->ht_en && psta->htpriv.ampdu_enable) {
805 if (psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
806 pattrib->ampdu_en = true;
809 /* re-check if enable ampdu by BA_starting_seqctrl */
810 if (pattrib->ampdu_en) {
813 tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f];
815 /* check BA_starting_seqctrl */
816 if (SN_LESS(pattrib->seqnum, tx_seq)) {
817 pattrib->ampdu_en = false;/* AGG BK */
818 } else if (SN_EQUAL(pattrib->seqnum, tx_seq)) {
819 psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff;
821 pattrib->ampdu_en = true;/* AGG EN */
823 psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff;
824 pattrib->ampdu_en = true;/* AGG EN */
834 s32 rtw_txframes_pending(struct adapter *padapter)
836 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
838 return (!list_empty(&pxmitpriv->be_pending.queue) ||
839 !list_empty(&pxmitpriv->bk_pending.queue) ||
840 !list_empty(&pxmitpriv->vi_pending.queue) ||
841 !list_empty(&pxmitpriv->vo_pending.queue));
844 s32 rtw_txframes_sta_ac_pending(struct adapter *padapter, struct pkt_attrib *pattrib)
846 struct sta_info *psta;
847 struct tx_servq *ptxservq;
848 int priority = pattrib->priority;
850 psta = pattrib->psta;
855 ptxservq = &(psta->sta_xmitpriv.bk_q);
859 ptxservq = &(psta->sta_xmitpriv.vi_q);
863 ptxservq = &(psta->sta_xmitpriv.vo_q);
868 ptxservq = &(psta->sta_xmitpriv.be_q);
873 return ptxservq->qcnt;
878 * Calculate wlan 802.11 packet MAX size from pkt_attrib
879 * This function doesn't consider fragment case
881 u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib)
885 len = pattrib->hdrlen + pattrib->iv_len; /* WLAN Header and IV */
886 len += SNAP_SIZE + sizeof(u16); /* LLC */
887 len += pattrib->pktlen;
888 if (pattrib->encrypt == _TKIP_)
890 len += ((pattrib->bswenc) ? pattrib->icv_len : 0); /* ICV */
897 This sub-routine will perform all the following:
899 1. remove 802.3 header.
900 2. create wlan_header, based on the info in pxmitframe
901 3. append sta's iv/ext-iv
903 5. move frag chunk from pframe to pxmitframe->mem
904 6. apply sw-encrypt, if necessary.
907 s32 rtw_xmitframe_coalesce(struct adapter *padapter, struct sk_buff *pkt, struct xmit_frame *pxmitframe)
909 struct pkt_file pktfile;
910 s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
912 u8 *pframe, *mem_start;
914 struct sta_info *psta;
915 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
916 struct pkt_attrib *pattrib = &pxmitframe->attrib;
918 s32 bmcst = IS_MCAST(pattrib->ra);
924 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
929 if (!pxmitframe->buf_addr) {
930 DBG_88E("==> %s buf_addr == NULL\n", __func__);
934 pbuf_start = pxmitframe->buf_addr;
936 hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
938 mem_start = pbuf_start + hw_hdr_offset;
940 if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) {
941 DBG_88E("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n");
946 _rtw_open_pktfile(pkt, &pktfile);
947 _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);
950 frg_len = pxmitpriv->frag_len - 4;/* 2346-4 = 2342 */
961 pframe += pattrib->hdrlen;
962 mpdu_len -= pattrib->hdrlen;
964 /* adding icv, if necessary... */
965 if (pattrib->iv_len) {
967 switch (pattrib->encrypt) {
970 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
974 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
976 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
980 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
982 AES_IV(pattrib->iv, psta->dot11txpn, 0);
987 memcpy(pframe, pattrib->iv, pattrib->iv_len);
989 pframe += pattrib->iv_len;
991 mpdu_len -= pattrib->iv_len;
995 llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
1000 if ((pattrib->icv_len > 0) && (pattrib->bswenc)) {
1001 mpdu_len -= pattrib->icv_len;
1005 /* don't do fragment to broadcat/multicast packets */
1006 mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen);
1008 mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len);
1013 if ((pattrib->icv_len > 0) && (pattrib->bswenc)) {
1014 memcpy(pframe, pattrib->icv, pattrib->icv_len);
1015 pframe += pattrib->icv_len;
1020 if (bmcst || rtw_endofpktfile(&pktfile)) {
1021 pattrib->nr_frags = frg_inx;
1023 pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags == 1) ? llc_sz : 0) +
1024 ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz;
1026 ClearMFrag(mem_start);
1031 addr = (size_t)(pframe);
1033 mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset;
1034 memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);
1037 if (xmitframe_addmic(padapter, pxmitframe) == _FAIL) {
1038 DBG_88E("xmitframe_addmic(padapter, pxmitframe) == _FAIL\n");
1043 xmitframe_swencrypt(padapter, pxmitframe);
1046 update_attrib_vcs_info(padapter, pxmitframe);
1048 pattrib->vcs_mode = NONE_VCS;
1055 /* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header
1056 * IEEE LLC/SNAP header contains 8 octets
1057 * First 3 octets comprise the LLC portion
1058 * SNAP portion, 5 octets, is divided into two fields:
1059 * Organizationally Unique Identifier(OUI), 3 octets,
1060 * type, defined by that organization, 2 octets.
1062 s32 rtw_put_snap(u8 *data, u16 h_proto)
1064 struct ieee80211_snap_hdr *snap;
1067 snap = (struct ieee80211_snap_hdr *)data;
1072 if (h_proto == 0x8137 || h_proto == 0x80f3)
1077 snap->oui[0] = oui[0];
1078 snap->oui[1] = oui[1];
1079 snap->oui[2] = oui[2];
1081 *(__be16 *)(data + SNAP_SIZE) = htons(h_proto);
1083 return SNAP_SIZE + sizeof(u16);
1086 void rtw_update_protection(struct adapter *padapter, u8 *ie, uint ie_len)
1091 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1092 struct registry_priv *pregistrypriv = &padapter->registrypriv;
1094 switch (pxmitpriv->vcs_setting) {
1096 pxmitpriv->vcs = NONE_VCS;
1102 perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len);
1104 pxmitpriv->vcs = NONE_VCS;
1106 protection = (*(perp + 2)) & BIT(1);
1108 if (pregistrypriv->vcs_type == RTS_CTS)
1109 pxmitpriv->vcs = RTS_CTS;
1111 pxmitpriv->vcs = CTS_TO_SELF;
1113 pxmitpriv->vcs = NONE_VCS;
1121 void rtw_count_tx_stats(struct adapter *padapter, struct xmit_frame *pxmitframe, int sz)
1123 struct sta_info *psta = NULL;
1124 struct stainfo_stats *pstats = NULL;
1125 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1126 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1128 if ((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG) {
1129 pxmitpriv->tx_bytes += sz;
1130 pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pxmitframe->agg_num;
1132 psta = pxmitframe->attrib.psta;
1134 pstats = &psta->sta_stats;
1135 pstats->tx_pkts += pxmitframe->agg_num;
1136 pstats->tx_bytes += sz;
1141 struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv)
1143 struct xmit_buf *pxmitbuf = NULL;
1144 struct list_head *plist, *phead;
1145 struct __queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
1146 unsigned long flags;
1148 spin_lock_irqsave(&pfree_queue->lock, flags);
1150 if (list_empty(&pfree_queue->queue)) {
1153 phead = get_list_head(pfree_queue);
1155 plist = phead->next;
1157 pxmitbuf = container_of(plist, struct xmit_buf, list);
1159 list_del_init(&(pxmitbuf->list));
1163 pxmitpriv->free_xmit_extbuf_cnt--;
1165 pxmitbuf->priv_data = NULL;
1166 /* pxmitbuf->ext_tag = true; */
1168 if (pxmitbuf->sctx) {
1169 DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__);
1170 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
1174 spin_unlock_irqrestore(&pfree_queue->lock, flags);
1179 s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
1181 struct __queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
1182 unsigned long flags;
1187 spin_lock_irqsave(&pfree_queue->lock, flags);
1189 list_del_init(&pxmitbuf->list);
1191 list_add_tail(&(pxmitbuf->list), get_list_head(pfree_queue));
1192 pxmitpriv->free_xmit_extbuf_cnt++;
1194 spin_unlock_irqrestore(&pfree_queue->lock, flags);
1199 struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv)
1201 struct xmit_buf *pxmitbuf = NULL;
1202 struct list_head *plist, *phead;
1203 struct __queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
1204 unsigned long flags;
1206 /* DBG_88E("+rtw_alloc_xmitbuf\n"); */
1208 spin_lock_irqsave(&pfree_xmitbuf_queue->lock, flags);
1210 if (list_empty(&pfree_xmitbuf_queue->queue)) {
1213 phead = get_list_head(pfree_xmitbuf_queue);
1215 plist = phead->next;
1217 pxmitbuf = container_of(plist, struct xmit_buf, list);
1219 list_del_init(&(pxmitbuf->list));
1223 pxmitpriv->free_xmitbuf_cnt--;
1224 pxmitbuf->priv_data = NULL;
1225 if (pxmitbuf->sctx) {
1226 DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__);
1227 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
1230 spin_unlock_irqrestore(&pfree_xmitbuf_queue->lock, flags);
1235 s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
1237 struct __queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
1238 unsigned long flags;
1243 if (pxmitbuf->sctx) {
1244 DBG_88E("%s pxmitbuf->sctx is not NULL\n", __func__);
1245 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE);
1248 if (pxmitbuf->ext_tag) {
1249 rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf);
1251 spin_lock_irqsave(&pfree_xmitbuf_queue->lock, flags);
1253 list_del_init(&pxmitbuf->list);
1255 list_add_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue));
1257 pxmitpriv->free_xmitbuf_cnt++;
1258 spin_unlock_irqrestore(&pfree_xmitbuf_queue->lock, flags);
1267 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
1269 If we turn on USE_RXTHREAD, then, no need for critical section.
1270 Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
1272 Must be very very cautious...
1276 struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)/* _queue *pfree_xmit_queue) */
1279 Please remember to use all the osdep_service api,
1280 and lock/unlock or _enter/_exit critical to protect
1284 struct xmit_frame *pxframe = NULL;
1285 struct list_head *plist, *phead;
1286 struct __queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
1288 spin_lock_bh(&pfree_xmit_queue->lock);
1290 if (list_empty(&pfree_xmit_queue->queue)) {
1293 phead = get_list_head(pfree_xmit_queue);
1295 plist = phead->next;
1297 pxframe = container_of(plist, struct xmit_frame, list);
1299 list_del_init(&(pxframe->list));
1302 if (pxframe) { /* default value setting */
1303 pxmitpriv->free_xmitframe_cnt--;
1305 pxframe->buf_addr = NULL;
1306 pxframe->pxmitbuf = NULL;
1308 memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib));
1309 /* pxframe->attrib.psta = NULL; */
1311 pxframe->frame_tag = DATA_FRAMETAG;
1313 pxframe->pkt = NULL;
1314 pxframe->pkt_offset = 1;/* default use pkt_offset to fill tx desc */
1316 pxframe->agg_num = 1;
1317 pxframe->ack_report = 0;
1320 spin_unlock_bh(&pfree_xmit_queue->lock);
1325 s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe)
1327 struct __queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
1328 struct adapter *padapter = pxmitpriv->adapter;
1329 struct sk_buff *pndis_pkt = NULL;
1334 spin_lock_bh(&pfree_xmit_queue->lock);
1336 list_del_init(&pxmitframe->list);
1338 if (pxmitframe->pkt) {
1339 pndis_pkt = pxmitframe->pkt;
1340 pxmitframe->pkt = NULL;
1343 list_add_tail(&pxmitframe->list, get_list_head(pfree_xmit_queue));
1345 pxmitpriv->free_xmitframe_cnt++;
1347 spin_unlock_bh(&pfree_xmit_queue->lock);
1350 rtw_os_pkt_complete(padapter, pndis_pkt);
1357 void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, struct __queue *pframequeue)
1359 struct list_head *plist, *phead;
1360 struct xmit_frame *pxmitframe;
1362 spin_lock_bh(&pframequeue->lock);
1364 phead = get_list_head(pframequeue);
1365 plist = phead->next;
1367 while (phead != plist) {
1368 pxmitframe = container_of(plist, struct xmit_frame, list);
1370 plist = plist->next;
1372 rtw_free_xmitframe(pxmitpriv, pxmitframe);
1374 spin_unlock_bh(&pframequeue->lock);
1378 s32 rtw_xmitframe_enqueue(struct adapter *padapter, struct xmit_frame *pxmitframe)
1380 if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL) {
1381 /* pxmitframe->pkt = NULL; */
1388 static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, struct __queue *pframe_queue)
1390 struct list_head *xmitframe_plist, *xmitframe_phead;
1391 struct xmit_frame *pxmitframe = NULL;
1393 xmitframe_phead = get_list_head(pframe_queue);
1394 xmitframe_plist = xmitframe_phead->next;
1396 if (xmitframe_phead != xmitframe_plist) {
1397 pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list);
1399 xmitframe_plist = xmitframe_plist->next;
1401 list_del_init(&pxmitframe->list);
1408 struct xmit_frame *rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, int entry)
1410 struct list_head *sta_plist, *sta_phead;
1411 struct hw_xmit *phwxmit;
1412 struct tx_servq *ptxservq = NULL;
1413 struct __queue *pframe_queue = NULL;
1414 struct xmit_frame *pxmitframe = NULL;
1415 struct adapter *padapter = pxmitpriv->adapter;
1416 struct registry_priv *pregpriv = &padapter->registrypriv;
1419 inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;
1421 if (pregpriv->wifi_spec == 1) {
1424 for (j = 0; j < 4; j++)
1425 inx[j] = pxmitpriv->wmm_para_seq[j];
1428 spin_lock_bh(&pxmitpriv->lock);
1430 for (i = 0; i < entry; i++) {
1431 phwxmit = phwxmit_i + inx[i];
1433 sta_phead = get_list_head(phwxmit->sta_queue);
1434 sta_plist = sta_phead->next;
1436 while (sta_phead != sta_plist) {
1437 ptxservq = container_of(sta_plist, struct tx_servq, tx_pending);
1439 pframe_queue = &ptxservq->sta_pending;
1441 pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue);
1446 /* Remove sta node when there are no pending packets. */
1447 if (list_empty(&pframe_queue->queue)) /* must be done after get_next and before break */
1448 list_del_init(&ptxservq->tx_pending);
1452 sta_plist = sta_plist->next;
1456 spin_unlock_bh(&pxmitpriv->lock);
1461 struct tx_servq *rtw_get_sta_pending(struct adapter *padapter, struct sta_info *psta, int up, u8 *ac)
1463 struct tx_servq *ptxservq;
1468 ptxservq = &(psta->sta_xmitpriv.bk_q);
1473 ptxservq = &(psta->sta_xmitpriv.vi_q);
1478 ptxservq = &(psta->sta_xmitpriv.vo_q);
1484 ptxservq = &(psta->sta_xmitpriv.be_q);
1493 * Will enqueue pxmitframe to the proper queue,
1494 * and indicate it to xx_pending list.....
1496 s32 rtw_xmit_classifier(struct adapter *padapter, struct xmit_frame *pxmitframe)
1499 struct sta_info *psta;
1500 struct tx_servq *ptxservq;
1501 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1502 struct sta_priv *pstapriv = &padapter->stapriv;
1503 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
1506 if (pattrib->psta) {
1507 psta = pattrib->psta;
1509 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
1514 DBG_88E("rtw_xmit_classifier: psta == NULL\n");
1518 ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
1520 if (list_empty(&ptxservq->tx_pending))
1521 list_add_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue));
1523 list_add_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending));
1525 phwxmits[ac_index].accnt++;
1531 void rtw_alloc_hwxmits(struct adapter *padapter)
1533 struct hw_xmit *hwxmits;
1534 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1536 pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
1538 pxmitpriv->hwxmits = kzalloc(sizeof(struct hw_xmit) * pxmitpriv->hwxmit_entry, GFP_KERNEL);
1540 hwxmits = pxmitpriv->hwxmits;
1542 if (pxmitpriv->hwxmit_entry == 5) {
1543 hwxmits[0] .sta_queue = &pxmitpriv->bm_pending;
1544 hwxmits[1] .sta_queue = &pxmitpriv->vo_pending;
1545 hwxmits[2] .sta_queue = &pxmitpriv->vi_pending;
1546 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
1547 hwxmits[4] .sta_queue = &pxmitpriv->be_pending;
1548 } else if (pxmitpriv->hwxmit_entry == 4) {
1549 hwxmits[0] .sta_queue = &pxmitpriv->vo_pending;
1550 hwxmits[1] .sta_queue = &pxmitpriv->vi_pending;
1551 hwxmits[2] .sta_queue = &pxmitpriv->be_pending;
1552 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
1557 void rtw_free_hwxmits(struct adapter *padapter)
1559 struct hw_xmit *hwxmits;
1560 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1562 hwxmits = pxmitpriv->hwxmits;
1566 void rtw_init_hwxmits(struct hw_xmit *phwxmit, int entry)
1570 for (i = 0; i < entry; i++, phwxmit++)
1575 static int rtw_br_client_tx(struct adapter *padapter, struct sk_buff **pskb)
1577 struct sk_buff *skb = *pskb;
1578 int res, is_vlan_tag = 0, i, do_nat25 = 1;
1579 unsigned short vlan_hdr = 0;
1580 void *br_port = NULL;
1583 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
1585 spin_lock_bh(&padapter->br_ext_lock);
1586 if (!(skb->data[0] & 1) && br_port &&
1587 memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
1588 *((__be16 *)(skb->data+MACADDRLEN*2)) != __constant_htons(ETH_P_8021Q) &&
1589 *((__be16 *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP) &&
1590 !memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) {
1591 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
1592 padapter->scdb_entry->ageing_timer = jiffies;
1593 spin_unlock_bh(&padapter->br_ext_lock);
1595 if (*((__be16 *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
1597 vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
1598 for (i = 0; i < 6; i++)
1599 *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
1602 if (!memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
1603 (*((__be16 *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)))
1604 memcpy(padapter->br_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
1606 if (*((__be16 *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)) {
1607 if (memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN)) {
1608 padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter,
1609 skb->data+MACADDRLEN, skb->data+WLAN_ETHHDR_LEN+12);
1610 if (padapter->scdb_entry) {
1611 memcpy(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN);
1612 memcpy(padapter->scdb_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
1613 padapter->scdb_entry->ageing_timer = jiffies;
1617 if (padapter->scdb_entry) {
1618 padapter->scdb_entry->ageing_timer = jiffies;
1621 memset(padapter->scdb_mac, 0, MACADDRLEN);
1622 memset(padapter->scdb_ip, 0, 4);
1626 spin_unlock_bh(&padapter->br_ext_lock);
1628 if (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) {
1629 struct sk_buff *newskb;
1633 for (i = 0; i < 6; i++)
1634 *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
1635 *((__be16 *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
1636 *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
1639 newskb = skb_copy(skb, GFP_ATOMIC);
1641 DEBUG_ERR("TX DROP: skb_copy fail!\n");
1644 dev_kfree_skb_any(skb);
1646 *pskb = skb = newskb;
1648 vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
1649 for (i = 0; i < 6; i++)
1650 *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
1655 if (skb_is_nonlinear(skb))
1656 DEBUG_ERR("%s(): skb_is_nonlinear!!\n", __func__);
1658 res = skb_linearize(skb);
1660 DEBUG_ERR("TX DROP: skb_linearize fail!\n");
1664 res = nat25_db_handle(padapter, skb, NAT25_INSERT);
1667 DEBUG_ERR("TX DROP: nat25_db_handle fail!\n");
1674 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
1676 dhcp_flag_bcast(padapter, skb);
1680 for (i = 0; i < 6; i++)
1681 *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
1682 *((__be16 *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
1683 *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
1687 /* check if SA is equal to our MAC */
1688 if (memcmp(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) {
1689 DEBUG_ERR("TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\n",
1690 skb->data[6], skb->data[7], skb->data[8], skb->data[9], skb->data[10], skb->data[11]);
1696 u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe)
1699 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1701 switch (pattrib->qsel) {
1704 addr = BE_QUEUE_INX;
1708 addr = BK_QUEUE_INX;
1712 addr = VI_QUEUE_INX;
1716 addr = VO_QUEUE_INX;
1719 addr = BCN_QUEUE_INX;
1721 case 0x11:/* BC/MC in PS (HIQ) */
1722 addr = HIGH_QUEUE_INX;
1726 addr = MGT_QUEUE_INX;
1733 static void do_queue_select(struct adapter *padapter, struct pkt_attrib *pattrib)
1737 qsel = pattrib->priority;
1739 pattrib->qsel = qsel;
1743 * The main transmit(tx) entry
1747 * 0 success, hardware will handle this xmit frame(packet)
1750 s32 rtw_xmit(struct adapter *padapter, struct sk_buff **ppkt)
1752 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1753 struct xmit_frame *pxmitframe = NULL;
1754 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1755 void *br_port = NULL;
1758 pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
1760 DBG_88E("DBG_TX_DROP_FRAME %s no more pxmitframe\n", __func__);
1765 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
1768 if (br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE)) {
1769 res = rtw_br_client_tx(padapter, ppkt);
1771 rtw_free_xmitframe(pxmitpriv, pxmitframe);
1776 res = update_attrib(padapter, *ppkt, &pxmitframe->attrib);
1779 rtw_free_xmitframe(pxmitpriv, pxmitframe);
1782 pxmitframe->pkt = *ppkt;
1784 rtw_led_control(padapter, LED_CTL_TX);
1786 do_queue_select(padapter, &pxmitframe->attrib);
1788 #ifdef CONFIG_88EU_AP_MODE
1789 spin_lock_bh(&pxmitpriv->lock);
1790 if (xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe)) {
1791 spin_unlock_bh(&pxmitpriv->lock);
1794 spin_unlock_bh(&pxmitpriv->lock);
1797 if (rtw_hal_xmit(padapter, pxmitframe) == false)
1803 #if defined(CONFIG_88EU_AP_MODE)
1805 int xmitframe_enqueue_for_sleeping_sta(struct adapter *padapter, struct xmit_frame *pxmitframe)
1808 struct sta_info *psta = NULL;
1809 struct sta_priv *pstapriv = &padapter->stapriv;
1810 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1811 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1812 int bmcst = IS_MCAST(pattrib->ra);
1814 if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == false)
1818 psta = pattrib->psta;
1820 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
1825 if (pattrib->triggered == 1) {
1827 pattrib->qsel = 0x11;/* HIQ */
1832 spin_lock_bh(&psta->sleep_q.lock);
1834 if (pstapriv->sta_dz_bitmap) {/* if any one sta is in ps mode */
1835 list_del_init(&pxmitframe->list);
1837 list_add_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
1841 pstapriv->tim_bitmap |= BIT(0);/* */
1842 pstapriv->sta_dz_bitmap |= BIT(0);
1844 update_beacon(padapter, _TIM_IE_, NULL, false);/* tx bc/mc packets after upate bcn */
1849 spin_unlock_bh(&psta->sleep_q.lock);
1854 spin_lock_bh(&psta->sleep_q.lock);
1856 if (psta->state&WIFI_SLEEP_STATE) {
1859 if (pstapriv->sta_dz_bitmap&BIT(psta->aid)) {
1860 list_del_init(&pxmitframe->list);
1862 list_add_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
1866 switch (pattrib->priority) {
1869 wmmps_ac = psta->uapsd_bk&BIT(0);
1873 wmmps_ac = psta->uapsd_vi&BIT(0);
1877 wmmps_ac = psta->uapsd_vo&BIT(0);
1882 wmmps_ac = psta->uapsd_be&BIT(0);
1887 psta->sleepq_ac_len++;
1889 if (((psta->has_legacy_ac) && (!wmmps_ac)) ||
1890 ((!psta->has_legacy_ac) && (wmmps_ac))) {
1891 pstapriv->tim_bitmap |= BIT(psta->aid);
1893 if (psta->sleepq_len == 1) {
1894 /* upate BCN for TIM IE */
1895 update_beacon(padapter, _TIM_IE_, NULL, false);
1902 spin_unlock_bh(&psta->sleep_q.lock);
1907 static void dequeue_xmitframes_to_sleeping_queue(struct adapter *padapter, struct sta_info *psta, struct __queue *pframequeue)
1909 struct list_head *plist, *phead;
1911 struct tx_servq *ptxservq;
1912 struct pkt_attrib *pattrib;
1913 struct xmit_frame *pxmitframe;
1914 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
1916 phead = get_list_head(pframequeue);
1917 plist = phead->next;
1919 while (phead != plist) {
1920 pxmitframe = container_of(plist, struct xmit_frame, list);
1922 plist = plist->next;
1924 xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);
1926 pattrib = &pxmitframe->attrib;
1928 ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
1931 phwxmits[ac_index].accnt--;
1935 void stop_sta_xmit(struct adapter *padapter, struct sta_info *psta)
1937 struct sta_info *psta_bmc;
1938 struct sta_xmit_priv *pstaxmitpriv;
1939 struct sta_priv *pstapriv = &padapter->stapriv;
1940 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1942 pstaxmitpriv = &psta->sta_xmitpriv;
1944 /* for BC/MC Frames */
1945 psta_bmc = rtw_get_bcmc_stainfo(padapter);
1947 spin_lock_bh(&pxmitpriv->lock);
1949 psta->state |= WIFI_SLEEP_STATE;
1951 pstapriv->sta_dz_bitmap |= BIT(psta->aid);
1953 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending);
1954 list_del_init(&(pstaxmitpriv->vo_q.tx_pending));
1956 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vi_q.sta_pending);
1957 list_del_init(&(pstaxmitpriv->vi_q.tx_pending));
1959 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending);
1960 list_del_init(&(pstaxmitpriv->be_q.tx_pending));
1962 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending);
1963 list_del_init(&(pstaxmitpriv->bk_q.tx_pending));
1965 /* for BC/MC Frames */
1966 pstaxmitpriv = &psta_bmc->sta_xmitpriv;
1967 dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending);
1968 list_del_init(&(pstaxmitpriv->be_q.tx_pending));
1970 spin_unlock_bh(&pxmitpriv->lock);
1973 void wakeup_sta_to_xmit(struct adapter *padapter, struct sta_info *psta)
1975 u8 update_mask = 0, wmmps_ac = 0;
1976 struct sta_info *psta_bmc;
1977 struct list_head *xmitframe_plist, *xmitframe_phead;
1978 struct xmit_frame *pxmitframe = NULL;
1979 struct sta_priv *pstapriv = &padapter->stapriv;
1981 spin_lock_bh(&psta->sleep_q.lock);
1983 xmitframe_phead = get_list_head(&psta->sleep_q);
1984 xmitframe_plist = xmitframe_phead->next;
1986 while (xmitframe_phead != xmitframe_plist) {
1987 pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list);
1989 xmitframe_plist = xmitframe_plist->next;
1991 list_del_init(&pxmitframe->list);
1993 switch (pxmitframe->attrib.priority) {
1996 wmmps_ac = psta->uapsd_bk&BIT(1);
2000 wmmps_ac = psta->uapsd_vi&BIT(1);
2004 wmmps_ac = psta->uapsd_vo&BIT(1);
2009 wmmps_ac = psta->uapsd_be&BIT(1);
2014 if (psta->sleepq_len > 0)
2015 pxmitframe->attrib.mdata = 1;
2017 pxmitframe->attrib.mdata = 0;
2020 psta->sleepq_ac_len--;
2021 if (psta->sleepq_ac_len > 0) {
2022 pxmitframe->attrib.mdata = 1;
2023 pxmitframe->attrib.eosp = 0;
2025 pxmitframe->attrib.mdata = 0;
2026 pxmitframe->attrib.eosp = 1;
2030 pxmitframe->attrib.triggered = 1;
2032 spin_unlock_bh(&psta->sleep_q.lock);
2033 if (rtw_hal_xmit(padapter, pxmitframe))
2034 rtw_os_xmit_complete(padapter, pxmitframe);
2035 spin_lock_bh(&psta->sleep_q.lock);
2038 if (psta->sleepq_len == 0) {
2039 pstapriv->tim_bitmap &= ~BIT(psta->aid);
2041 update_mask = BIT(0);
2043 if (psta->state&WIFI_SLEEP_STATE)
2044 psta->state ^= WIFI_SLEEP_STATE;
2046 if (psta->state & WIFI_STA_ALIVE_CHK_STATE) {
2047 psta->expire_to = pstapriv->expire_to;
2048 psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
2051 pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
2054 spin_unlock_bh(&psta->sleep_q.lock);
2056 /* for BC/MC Frames */
2057 psta_bmc = rtw_get_bcmc_stainfo(padapter);
2061 if ((pstapriv->sta_dz_bitmap&0xfffe) == 0x0) { /* no any sta in ps mode */
2062 spin_lock_bh(&psta_bmc->sleep_q.lock);
2064 xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
2065 xmitframe_plist = xmitframe_phead->next;
2067 while (xmitframe_phead != xmitframe_plist) {
2068 pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list);
2070 xmitframe_plist = xmitframe_plist->next;
2072 list_del_init(&pxmitframe->list);
2074 psta_bmc->sleepq_len--;
2075 if (psta_bmc->sleepq_len > 0)
2076 pxmitframe->attrib.mdata = 1;
2078 pxmitframe->attrib.mdata = 0;
2080 pxmitframe->attrib.triggered = 1;
2082 spin_unlock_bh(&psta_bmc->sleep_q.lock);
2083 if (rtw_hal_xmit(padapter, pxmitframe))
2084 rtw_os_xmit_complete(padapter, pxmitframe);
2085 spin_lock_bh(&psta_bmc->sleep_q.lock);
2088 if (psta_bmc->sleepq_len == 0) {
2089 pstapriv->tim_bitmap &= ~BIT(0);
2090 pstapriv->sta_dz_bitmap &= ~BIT(0);
2092 update_mask |= BIT(1);
2095 spin_unlock_bh(&psta_bmc->sleep_q.lock);
2099 update_beacon(padapter, _TIM_IE_, NULL, false);
2102 void xmit_delivery_enabled_frames(struct adapter *padapter, struct sta_info *psta)
2105 struct list_head *xmitframe_plist, *xmitframe_phead;
2106 struct xmit_frame *pxmitframe = NULL;
2107 struct sta_priv *pstapriv = &padapter->stapriv;
2109 spin_lock_bh(&psta->sleep_q.lock);
2111 xmitframe_phead = get_list_head(&psta->sleep_q);
2112 xmitframe_plist = xmitframe_phead->next;
2114 while (xmitframe_phead != xmitframe_plist) {
2115 pxmitframe = container_of(xmitframe_plist, struct xmit_frame, list);
2117 xmitframe_plist = xmitframe_plist->next;
2119 switch (pxmitframe->attrib.priority) {
2122 wmmps_ac = psta->uapsd_bk&BIT(1);
2126 wmmps_ac = psta->uapsd_vi&BIT(1);
2130 wmmps_ac = psta->uapsd_vo&BIT(1);
2135 wmmps_ac = psta->uapsd_be&BIT(1);
2142 list_del_init(&pxmitframe->list);
2145 psta->sleepq_ac_len--;
2147 if (psta->sleepq_ac_len > 0) {
2148 pxmitframe->attrib.mdata = 1;
2149 pxmitframe->attrib.eosp = 0;
2151 pxmitframe->attrib.mdata = 0;
2152 pxmitframe->attrib.eosp = 1;
2155 pxmitframe->attrib.triggered = 1;
2157 if (rtw_hal_xmit(padapter, pxmitframe) == true)
2158 rtw_os_xmit_complete(padapter, pxmitframe);
2160 if ((psta->sleepq_ac_len == 0) && (!psta->has_legacy_ac) && (wmmps_ac)) {
2161 pstapriv->tim_bitmap &= ~BIT(psta->aid);
2163 /* upate BCN for TIM IE */
2164 update_beacon(padapter, _TIM_IE_, NULL, false);
2168 spin_unlock_bh(&psta->sleep_q.lock);
2173 void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms)
2175 sctx->timeout_ms = timeout_ms;
2176 sctx->submit_time = jiffies;
2177 init_completion(&sctx->done);
2178 sctx->status = RTW_SCTX_SUBMITTED;
2181 int rtw_sctx_wait(struct submit_ctx *sctx)
2184 unsigned long expire;
2187 expire = sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT;
2188 if (!wait_for_completion_timeout(&sctx->done, expire)) {
2189 /* timeout, do something?? */
2190 status = RTW_SCTX_DONE_TIMEOUT;
2191 DBG_88E("%s timeout\n", __func__);
2193 status = sctx->status;
2196 if (status == RTW_SCTX_DONE_SUCCESS)
2202 static bool rtw_sctx_chk_waring_status(int status)
2205 case RTW_SCTX_DONE_UNKNOWN:
2206 case RTW_SCTX_DONE_BUF_ALLOC:
2207 case RTW_SCTX_DONE_BUF_FREE:
2209 case RTW_SCTX_DONE_DRV_STOP:
2210 case RTW_SCTX_DONE_DEV_REMOVE:
2217 void rtw_sctx_done_err(struct submit_ctx **sctx, int status)
2220 if (rtw_sctx_chk_waring_status(status))
2221 DBG_88E("%s status:%d\n", __func__, status);
2222 (*sctx)->status = status;
2223 complete(&((*sctx)->done));
2228 void rtw_sctx_done(struct submit_ctx **sctx)
2230 rtw_sctx_done_err(sctx, RTW_SCTX_DONE_SUCCESS);
2233 int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms)
2235 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
2237 pack_tx_ops->submit_time = jiffies;
2238 pack_tx_ops->timeout_ms = timeout_ms;
2239 pack_tx_ops->status = RTW_SCTX_SUBMITTED;
2241 return rtw_sctx_wait(pack_tx_ops);
2244 void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status)
2246 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
2248 if (pxmitpriv->ack_tx)
2249 rtw_sctx_done_err(&pack_tx_ops, status);
2251 DBG_88E("%s ack_tx not set\n", __func__);