Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma
[linux-2.6-microblaze.git] / drivers / staging / rtl8712 / rtl871x_xmit.c
1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  * rtl871x_xmit.c
4  *
5  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
6  * Linux device driver for RTL8192SU
7  *
8  * Modifications for inclusion into the Linux staging tree are
9  * Copyright(c) 2010 Larry Finger. All rights reserved.
10  *
11  * Contact information:
12  * WLAN FAE <wlanfae@realtek.com>
13  * Larry Finger <Larry.Finger@lwfinger.net>
14  *
15  ******************************************************************************/
16
17 #define _RTL871X_XMIT_C_
18
19 #include "osdep_service.h"
20 #include "drv_types.h"
21 #include "osdep_intf.h"
22 #include "usb_ops.h"
23
24 #include <linux/usb.h>
25 #include <linux/ieee80211.h>
26
27 static const u8 P802_1H_OUI[P80211_OUI_LEN] = {0x00, 0x00, 0xf8};
28 static const u8 RFC1042_OUI[P80211_OUI_LEN] = {0x00, 0x00, 0x00};
29 static void init_hwxmits(struct hw_xmit *phwxmit, sint entry);
30 static void alloc_hwxmits(struct _adapter *padapter);
31 static void free_hwxmits(struct _adapter *padapter);
32
33 static void _init_txservq(struct tx_servq *ptxservq)
34 {
35         INIT_LIST_HEAD(&ptxservq->tx_pending);
36         _init_queue(&ptxservq->sta_pending);
37         ptxservq->qcnt = 0;
38 }
39
40 void _r8712_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv)
41 {
42         memset((unsigned char *)psta_xmitpriv, 0,
43                  sizeof(struct sta_xmit_priv));
44         spin_lock_init(&psta_xmitpriv->lock);
45         _init_txservq(&psta_xmitpriv->be_q);
46         _init_txservq(&psta_xmitpriv->bk_q);
47         _init_txservq(&psta_xmitpriv->vi_q);
48         _init_txservq(&psta_xmitpriv->vo_q);
49         INIT_LIST_HEAD(&psta_xmitpriv->legacy_dz);
50         INIT_LIST_HEAD(&psta_xmitpriv->apsd);
51 }
52
53 int _r8712_init_xmit_priv(struct xmit_priv *pxmitpriv,
54                           struct _adapter *padapter)
55 {
56         sint i;
57         struct xmit_buf *pxmitbuf;
58         struct xmit_frame *pxframe;
59         int j;
60
61         memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv));
62         spin_lock_init(&pxmitpriv->lock);
63         /*
64          *Please insert all the queue initialization using _init_queue below
65          */
66         pxmitpriv->adapter = padapter;
67         _init_queue(&pxmitpriv->be_pending);
68         _init_queue(&pxmitpriv->bk_pending);
69         _init_queue(&pxmitpriv->vi_pending);
70         _init_queue(&pxmitpriv->vo_pending);
71         _init_queue(&pxmitpriv->bm_pending);
72         _init_queue(&pxmitpriv->legacy_dz_queue);
73         _init_queue(&pxmitpriv->apsd_queue);
74         _init_queue(&pxmitpriv->free_xmit_queue);
75         /*
76          * Please allocate memory with 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...
79          */
80         pxmitpriv->pallocated_frame_buf =
81                 kmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4,
82                         GFP_ATOMIC);
83         if (!pxmitpriv->pallocated_frame_buf) {
84                 pxmitpriv->pxmit_frame_buf = NULL;
85                 return -ENOMEM;
86         }
87         pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 -
88                         ((addr_t) (pxmitpriv->pallocated_frame_buf) & 3);
89         pxframe = (struct xmit_frame *) pxmitpriv->pxmit_frame_buf;
90         for (i = 0; i < NR_XMITFRAME; i++) {
91                 INIT_LIST_HEAD(&(pxframe->list));
92                 pxframe->padapter = padapter;
93                 pxframe->frame_tag = DATA_FRAMETAG;
94                 pxframe->pkt = NULL;
95                 pxframe->buf_addr = NULL;
96                 pxframe->pxmitbuf = NULL;
97                 list_add_tail(&(pxframe->list),
98                                  &(pxmitpriv->free_xmit_queue.queue));
99                 pxframe++;
100         }
101         pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;
102         /*
103          * init xmit hw_txqueue
104          */
105         _r8712_init_hw_txqueue(&pxmitpriv->be_txqueue, BE_QUEUE_INX);
106         _r8712_init_hw_txqueue(&pxmitpriv->bk_txqueue, BK_QUEUE_INX);
107         _r8712_init_hw_txqueue(&pxmitpriv->vi_txqueue, VI_QUEUE_INX);
108         _r8712_init_hw_txqueue(&pxmitpriv->vo_txqueue, VO_QUEUE_INX);
109         _r8712_init_hw_txqueue(&pxmitpriv->bmc_txqueue, BMC_QUEUE_INX);
110         pxmitpriv->frag_len = MAX_FRAG_THRESHOLD;
111         pxmitpriv->txirp_cnt = 1;
112         /*per AC pending irp*/
113         pxmitpriv->beq_cnt = 0;
114         pxmitpriv->bkq_cnt = 0;
115         pxmitpriv->viq_cnt = 0;
116         pxmitpriv->voq_cnt = 0;
117         /*init xmit_buf*/
118         _init_queue(&pxmitpriv->free_xmitbuf_queue);
119         _init_queue(&pxmitpriv->pending_xmitbuf_queue);
120         pxmitpriv->pallocated_xmitbuf =
121                 kmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4, GFP_ATOMIC);
122         if (!pxmitpriv->pallocated_xmitbuf)
123                 goto clean_up_frame_buf;
124         pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 -
125                               ((addr_t)(pxmitpriv->pallocated_xmitbuf) & 3);
126         pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
127         for (i = 0; i < NR_XMITBUFF; i++) {
128                 INIT_LIST_HEAD(&pxmitbuf->list);
129                 pxmitbuf->pallocated_buf =
130                         kmalloc(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ, GFP_ATOMIC);
131                 if (!pxmitbuf->pallocated_buf) {
132                         j = 0;
133                         goto clean_up_alloc_buf;
134                 }
135                 pxmitbuf->pbuf = pxmitbuf->pallocated_buf + XMITBUF_ALIGN_SZ -
136                                  ((addr_t) (pxmitbuf->pallocated_buf) &
137                                  (XMITBUF_ALIGN_SZ - 1));
138                 if (r8712_xmit_resource_alloc(padapter, pxmitbuf)) {
139                         j = 1;
140                         goto clean_up_alloc_buf;
141                 }
142                 list_add_tail(&pxmitbuf->list,
143                                  &(pxmitpriv->free_xmitbuf_queue.queue));
144                 pxmitbuf++;
145         }
146         pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF;
147         INIT_WORK(&padapter->wk_filter_rx_ff0, r8712_SetFilter);
148         alloc_hwxmits(padapter);
149         init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
150         tasklet_setup(&pxmitpriv->xmit_tasklet, r8712_xmit_bh);
151         return 0;
152
153 clean_up_alloc_buf:
154         if (j) {
155                 /* failure happened in r8712_xmit_resource_alloc()
156                  * delete extra pxmitbuf->pallocated_buf
157                  */
158                 kfree(pxmitbuf->pallocated_buf);
159         }
160         for (j = 0; j < i; j++) {
161                 int k;
162
163                 pxmitbuf--;                     /* reset pointer */
164                 kfree(pxmitbuf->pallocated_buf);
165                 for (k = 0; k < 8; k++)         /* delete xmit urb's */
166                         usb_free_urb(pxmitbuf->pxmit_urb[k]);
167         }
168         kfree(pxmitpriv->pallocated_xmitbuf);
169         pxmitpriv->pallocated_xmitbuf = NULL;
170 clean_up_frame_buf:
171         kfree(pxmitpriv->pallocated_frame_buf);
172         pxmitpriv->pallocated_frame_buf = NULL;
173         return -ENOMEM;
174 }
175
176 void _free_xmit_priv(struct xmit_priv *pxmitpriv)
177 {
178         int i;
179         struct _adapter *padapter = pxmitpriv->adapter;
180         struct xmit_frame *pxmitframe = (struct xmit_frame *)
181                                         pxmitpriv->pxmit_frame_buf;
182         struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
183
184         if (!pxmitpriv->pxmit_frame_buf)
185                 return;
186         for (i = 0; i < NR_XMITFRAME; i++) {
187                 r8712_xmit_complete(padapter, pxmitframe);
188                 pxmitframe++;
189         }
190         for (i = 0; i < NR_XMITBUFF; i++) {
191                 r8712_xmit_resource_free(padapter, pxmitbuf);
192                 kfree(pxmitbuf->pallocated_buf);
193                 pxmitbuf++;
194         }
195         kfree(pxmitpriv->pallocated_frame_buf);
196         kfree(pxmitpriv->pallocated_xmitbuf);
197         free_hwxmits(padapter);
198 }
199
200 int r8712_update_attrib(struct _adapter *padapter, _pkt *pkt,
201                         struct pkt_attrib *pattrib)
202 {
203         struct pkt_file pktfile;
204         struct sta_info *psta = NULL;
205         struct ethhdr etherhdr;
206
207         struct tx_cmd txdesc;
208
209         bool bmcast;
210         struct sta_priv         *pstapriv = &padapter->stapriv;
211         struct security_priv    *psecuritypriv = &padapter->securitypriv;
212         struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
213         struct qos_priv         *pqospriv = &pmlmepriv->qospriv;
214
215         _r8712_open_pktfile(pkt, &pktfile);
216
217         _r8712_pktfile_read(&pktfile, (unsigned char *)&etherhdr, ETH_HLEN);
218
219         pattrib->ether_type = ntohs(etherhdr.h_proto);
220
221         /*
222          * If driver xmit ARP packet, driver can set ps mode to initial
223          * setting. It stands for getting DHCP or fix IP.
224          */
225         if (pattrib->ether_type == 0x0806) {
226                 if (padapter->pwrctrlpriv.pwr_mode !=
227                     padapter->registrypriv.power_mgnt) {
228                         del_timer_sync(&pmlmepriv->dhcp_timer);
229                         r8712_set_ps_mode(padapter,
230                                           padapter->registrypriv.power_mgnt,
231                                           padapter->registrypriv.smart_ps);
232                 }
233         }
234
235         memcpy(pattrib->dst, &etherhdr.h_dest, ETH_ALEN);
236         memcpy(pattrib->src, &etherhdr.h_source, ETH_ALEN);
237         pattrib->pctrl = 0;
238         if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
239             check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
240                 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
241                 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
242         } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
243                 memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
244                 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
245         } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
246                 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
247                 memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
248         } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
249                 /*firstly, filter packet not belongs to mp*/
250                 if (pattrib->ether_type != 0x8712)
251                         return -EINVAL;
252                 /* for mp storing the txcmd per packet,
253                  * according to the info of txcmd to update pattrib
254                  */
255                 /*get MP_TXDESC_SIZE bytes txcmd per packet*/
256                 _r8712_pktfile_read(&pktfile, (u8 *)&txdesc, TXDESC_SIZE);
257                 memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
258                 memcpy(pattrib->ta, pattrib->src, ETH_ALEN);
259                 pattrib->pctrl = 1;
260         }
261         /* r8712_xmitframe_coalesce() overwrite this!*/
262         pattrib->pktlen = pktfile.pkt_len;
263         if (pattrib->ether_type == ETH_P_IP) {
264                 /* The following is for DHCP and ARP packet, we use cck1M to
265                  * tx these packets and let LPS awake some time
266                  * to prevent DHCP protocol fail
267                  */
268                 u8 tmp[24];
269
270                 _r8712_pktfile_read(&pktfile, &tmp[0], 24);
271                 pattrib->dhcp_pkt = 0;
272                 if (pktfile.pkt_len > 282) {/*MINIMUM_DHCP_PACKET_SIZE)*/
273                         if (pattrib->ether_type == ETH_P_IP) {/* IP header*/
274                                 if (((tmp[21] == 68) && (tmp[23] == 67)) ||
275                                         ((tmp[21] == 67) && (tmp[23] == 68))) {
276                                         /* 68 : UDP BOOTP client
277                                          * 67 : UDP BOOTP server
278                                          * Use low rate to send DHCP packet.
279                                          */
280                                         pattrib->dhcp_pkt = 1;
281                                 }
282                         }
283                 }
284         }
285         bmcast = is_multicast_ether_addr(pattrib->ra);
286         /* get sta_info*/
287         if (bmcast) {
288                 psta = r8712_get_bcmc_stainfo(padapter);
289                 pattrib->mac_id = 4;
290         } else {
291                 if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
292                         psta = r8712_get_stainfo(pstapriv,
293                                                  get_bssid(pmlmepriv));
294                         pattrib->mac_id = 5;
295                 } else {
296                         psta = r8712_get_stainfo(pstapriv, pattrib->ra);
297                         if (!psta)  /* drop the pkt */
298                                 return -ENOMEM;
299                         if (check_fwstate(pmlmepriv, WIFI_STATION_STATE))
300                                 pattrib->mac_id = 5;
301                         else
302                                 pattrib->mac_id = psta->mac_id;
303                 }
304         }
305
306         if (psta) {
307                 pattrib->psta = psta;
308         } else {
309                 /* if we cannot get psta => drrp the pkt */
310                 return -ENOMEM;
311         }
312
313         pattrib->ack_policy = 0;
314         /* get ether_hdr_len */
315         pattrib->pkt_hdrlen = ETH_HLEN;
316
317         if (pqospriv->qos_option) {
318                 r8712_set_qos(&pktfile, pattrib);
319         } else {
320                 pattrib->hdrlen = WLAN_HDR_A3_LEN;
321                 pattrib->subtype = IEEE80211_FTYPE_DATA;
322                 pattrib->priority = 0;
323         }
324         if (psta->ieee8021x_blocked) {
325                 pattrib->encrypt = 0;
326                 if ((pattrib->ether_type != 0x888e) &&
327                     !check_fwstate(pmlmepriv, WIFI_MP_STATE))
328                         return -EINVAL;
329         } else {
330                 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
331         }
332         switch (pattrib->encrypt) {
333         case _WEP40_:
334         case _WEP104_:
335                 pattrib->iv_len = 4;
336                 pattrib->icv_len = 4;
337                 break;
338         case _TKIP_:
339                 pattrib->iv_len = 8;
340                 pattrib->icv_len = 4;
341                 if (padapter->securitypriv.busetkipkey == _FAIL)
342                         return -EINVAL;
343                 break;
344         case _AES_:
345                 pattrib->iv_len = 8;
346                 pattrib->icv_len = 8;
347                 break;
348         default:
349                 pattrib->iv_len = 0;
350                 pattrib->icv_len = 0;
351                 break;
352         }
353
354         if (pattrib->encrypt &&
355             (padapter->securitypriv.sw_encrypt ||
356             !psecuritypriv->hw_decrypted))
357                 pattrib->bswenc = true;
358         else
359                 pattrib->bswenc = false;
360         /* if in MP_STATE, update pkt_attrib from mp_txcmd, and overwrite
361          * some settings above.
362          */
363         if (check_fwstate(pmlmepriv, WIFI_MP_STATE))
364                 pattrib->priority =
365                     (le32_to_cpu(txdesc.txdw1) >> QSEL_SHT) & 0x1f;
366         return 0;
367 }
368
369 static int xmitframe_addmic(struct _adapter *padapter,
370                             struct xmit_frame *pxmitframe)
371 {
372         u32     curfragnum, length;
373         u8      *pframe, *payload, mic[8];
374         struct  mic_data micdata;
375         struct  sta_info *stainfo;
376         struct  qos_priv *pqospriv = &(padapter->mlmepriv.qospriv);
377         struct  pkt_attrib  *pattrib = &pxmitframe->attrib;
378         struct  security_priv *psecpriv = &padapter->securitypriv;
379         struct  xmit_priv *pxmitpriv = &padapter->xmitpriv;
380         u8 priority[4] = {};
381         bool bmcst = is_multicast_ether_addr(pattrib->ra);
382
383         if (pattrib->psta)
384                 stainfo = pattrib->psta;
385         else
386                 stainfo = r8712_get_stainfo(&padapter->stapriv,
387                                             &pattrib->ra[0]);
388         if (pattrib->encrypt == _TKIP_) {
389                 /*encode mic code*/
390                 if (stainfo) {
391                         u8 null_key[16] = {};
392
393                         pframe = pxmitframe->buf_addr + TXDESC_OFFSET;
394                         if (bmcst) {
395                                 if (!memcmp(psecpriv->XGrptxmickey
396                                    [psecpriv->XGrpKeyid].skey,
397                                    null_key, 16))
398                                         return -ENOMEM;
399                                 /*start to calculate the mic code*/
400                                 r8712_secmicsetkey(&micdata,
401                                         psecpriv->XGrptxmickey
402                                         [psecpriv->XGrpKeyid].skey);
403                         } else {
404                                 if (!memcmp(&stainfo->tkiptxmickey.skey[0],
405                                             null_key, 16))
406                                         return -ENOMEM;
407                                 /* start to calculate the mic code */
408                                 r8712_secmicsetkey(&micdata,
409                                              &stainfo->tkiptxmickey.skey[0]);
410                         }
411                         if (pframe[1] & 1) {   /* ToDS==1 */
412                                 r8712_secmicappend(&micdata,
413                                                    &pframe[16], 6); /*DA*/
414                                 if (pframe[1] & 2)  /* From Ds==1 */
415                                         r8712_secmicappend(&micdata,
416                                                            &pframe[24], 6);
417                                 else
418                                         r8712_secmicappend(&micdata,
419                                                            &pframe[10], 6);
420                         } else {        /* ToDS==0 */
421                                 r8712_secmicappend(&micdata,
422                                                    &pframe[4], 6); /* DA */
423                                 if (pframe[1] & 2)  /* From Ds==1 */
424                                         r8712_secmicappend(&micdata,
425                                                            &pframe[16], 6);
426                                 else
427                                         r8712_secmicappend(&micdata,
428                                                            &pframe[10], 6);
429                         }
430                         if (pqospriv->qos_option == 1)
431                                 priority[0] = (u8)pxmitframe->attrib.priority;
432                         r8712_secmicappend(&micdata, &priority[0], 4);
433                         payload = pframe;
434                         for (curfragnum = 0; curfragnum < pattrib->nr_frags;
435                              curfragnum++) {
436                                 payload = (u8 *)RND4((addr_t)(payload));
437                                 payload += pattrib->hdrlen + pattrib->iv_len;
438                                 if ((curfragnum + 1) == pattrib->nr_frags) {
439                                         length = pattrib->last_txcmdsz -
440                                                   pattrib->hdrlen -
441                                                   pattrib->iv_len -
442                                                   ((psecpriv->sw_encrypt)
443                                                   ? pattrib->icv_len : 0);
444                                         r8712_secmicappend(&micdata, payload,
445                                                            length);
446                                         payload = payload + length;
447                                 } else {
448                                         length = pxmitpriv->frag_len -
449                                             pattrib->hdrlen - pattrib->iv_len -
450                                             ((psecpriv->sw_encrypt) ?
451                                             pattrib->icv_len : 0);
452                                         r8712_secmicappend(&micdata, payload,
453                                                            length);
454                                         payload = payload + length +
455                                                   pattrib->icv_len;
456                                 }
457                         }
458                         r8712_secgetmic(&micdata, &(mic[0]));
459                         /* add mic code  and add the mic code length in
460                          * last_txcmdsz
461                          */
462                         memcpy(payload, &(mic[0]), 8);
463                         pattrib->last_txcmdsz += 8;
464                         payload = payload - pattrib->last_txcmdsz + 8;
465                 }
466         }
467         return 0;
468 }
469
470 static sint xmitframe_swencrypt(struct _adapter *padapter,
471                                 struct xmit_frame *pxmitframe)
472 {
473         struct pkt_attrib       *pattrib = &pxmitframe->attrib;
474
475         if (pattrib->bswenc) {
476                 switch (pattrib->encrypt) {
477                 case _WEP40_:
478                 case _WEP104_:
479                         r8712_wep_encrypt(padapter, (u8 *)pxmitframe);
480                         break;
481                 case _TKIP_:
482                         r8712_tkip_encrypt(padapter, (u8 *)pxmitframe);
483                         break;
484                 case _AES_:
485                         r8712_aes_encrypt(padapter, (u8 *)pxmitframe);
486                         break;
487                 default:
488                                 break;
489                 }
490         }
491         return _SUCCESS;
492 }
493
494 static int make_wlanhdr(struct _adapter *padapter, u8 *hdr,
495                         struct pkt_attrib *pattrib)
496 {
497         u16 *qc;
498
499         struct ieee80211_hdr *pwlanhdr = (struct ieee80211_hdr *)hdr;
500         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
501         struct qos_priv *pqospriv = &pmlmepriv->qospriv;
502         __le16 *fctrl = &pwlanhdr->frame_control;
503         u8 *bssid;
504
505         memset(hdr, 0, WLANHDR_OFFSET);
506         SetFrameSubType(fctrl, pattrib->subtype);
507         if (!(pattrib->subtype & IEEE80211_FTYPE_DATA))
508                 return 0;
509
510         bssid = get_bssid(pmlmepriv);
511
512         if (check_fwstate(pmlmepriv,  WIFI_STATION_STATE)) {
513                 /* to_ds = 1, fr_ds = 0; */
514                 SetToDs(fctrl);
515                 ether_addr_copy(pwlanhdr->addr1, bssid);
516                 ether_addr_copy(pwlanhdr->addr2, pattrib->src);
517                 ether_addr_copy(pwlanhdr->addr3, pattrib->dst);
518         } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
519                 /* to_ds = 0, fr_ds = 1; */
520                 SetFrDs(fctrl);
521                 ether_addr_copy(pwlanhdr->addr1, pattrib->dst);
522                 ether_addr_copy(pwlanhdr->addr2, bssid);
523                 ether_addr_copy(pwlanhdr->addr3, pattrib->src);
524         } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
525                    check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
526                 ether_addr_copy(pwlanhdr->addr1, pattrib->dst);
527                 ether_addr_copy(pwlanhdr->addr2, pattrib->src);
528                 ether_addr_copy(pwlanhdr->addr3, bssid);
529         } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
530                 ether_addr_copy(pwlanhdr->addr1, pattrib->dst);
531                 ether_addr_copy(pwlanhdr->addr2, pattrib->src);
532                 ether_addr_copy(pwlanhdr->addr3, bssid);
533         } else {
534                 return -EINVAL;
535         }
536
537         if (pattrib->encrypt)
538                 SetPrivacy(fctrl);
539         if (pqospriv->qos_option) {
540                 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
541                 if (pattrib->priority)
542                         SetPriority(qc, pattrib->priority);
543                 SetAckpolicy(qc, pattrib->ack_policy);
544         }
545         /* TODO: fill HT Control Field */
546         /* Update Seq Num will be handled by f/w */
547         {
548                 struct sta_info *psta;
549                 bool bmcst = is_multicast_ether_addr(pattrib->ra);
550
551                 if (pattrib->psta)
552                         psta = pattrib->psta;
553                 else if (bmcst)
554                         psta = r8712_get_bcmc_stainfo(padapter);
555                 else
556                         psta = r8712_get_stainfo(&padapter->stapriv,
557                                                  pattrib->ra);
558
559                 if (psta) {
560                         u16 *txtid = psta->sta_xmitpriv.txseq_tid;
561
562                         txtid[pattrib->priority]++;
563                         txtid[pattrib->priority] &= 0xFFF;
564                         pattrib->seqnum = txtid[pattrib->priority];
565                         SetSeqNum(hdr, pattrib->seqnum);
566                 }
567         }
568
569         return 0;
570 }
571
572 static sint r8712_put_snap(u8 *data, u16 h_proto)
573 {
574         struct ieee80211_snap_hdr *snap;
575         const u8 *oui;
576
577         snap = (struct ieee80211_snap_hdr *)data;
578         snap->dsap = 0xaa;
579         snap->ssap = 0xaa;
580         snap->ctrl = 0x03;
581         if (h_proto == 0x8137 || h_proto == 0x80f3)
582                 oui = P802_1H_OUI;
583         else
584                 oui = RFC1042_OUI;
585         snap->oui[0] = oui[0];
586         snap->oui[1] = oui[1];
587         snap->oui[2] = oui[2];
588         *(__be16 *)(data + SNAP_SIZE) = htons(h_proto);
589         return SNAP_SIZE + sizeof(u16);
590 }
591
592 /*
593  * This sub-routine will perform all the following:
594  * 1. remove 802.3 header.
595  * 2. create wlan_header, based on the info in pxmitframe
596  * 3. append sta's iv/ext-iv
597  * 4. append LLC
598  * 5. move frag chunk from pframe to pxmitframe->mem
599  * 6. apply sw-encrypt, if necessary.
600  */
601 sint r8712_xmitframe_coalesce(struct _adapter *padapter, _pkt *pkt,
602                         struct xmit_frame *pxmitframe)
603 {
604         struct pkt_file pktfile;
605
606         sint    frg_len, mpdu_len, llc_sz;
607         u32     mem_sz;
608         u8      frg_inx;
609         addr_t addr;
610         u8 *pframe, *mem_start, *ptxdesc;
611         struct sta_info         *psta;
612         struct security_priv    *psecpriv = &padapter->securitypriv;
613         struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;
614         struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
615         struct pkt_attrib       *pattrib = &pxmitframe->attrib;
616         u8 *pbuf_start;
617         bool bmcst = is_multicast_ether_addr(pattrib->ra);
618
619         if (!pattrib->psta)
620                 return _FAIL;
621         psta = pattrib->psta;
622         if (!pxmitframe->buf_addr)
623                 return _FAIL;
624         pbuf_start = pxmitframe->buf_addr;
625         ptxdesc = pbuf_start;
626         mem_start = pbuf_start + TXDESC_OFFSET;
627         if (make_wlanhdr(padapter, mem_start, pattrib))
628                 return _FAIL;
629         _r8712_open_pktfile(pkt, &pktfile);
630         _r8712_pktfile_read(&pktfile, NULL, (uint) pattrib->pkt_hdrlen);
631         if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
632                 /* truncate TXDESC_SIZE bytes txcmd if at mp mode for 871x */
633                 if (pattrib->ether_type == 0x8712) {
634                         /* take care -  update_txdesc overwrite this */
635                         _r8712_pktfile_read(&pktfile, ptxdesc, TXDESC_SIZE);
636                 }
637         }
638         pattrib->pktlen = pktfile.pkt_len;
639         frg_inx = 0;
640         frg_len = pxmitpriv->frag_len - 4;
641         while (1) {
642                 llc_sz = 0;
643                 mpdu_len = frg_len;
644                 pframe = mem_start;
645                 SetMFrag(mem_start);
646                 pframe += pattrib->hdrlen;
647                 mpdu_len -= pattrib->hdrlen;
648                 /* adding icv, if necessary...*/
649                 if (pattrib->iv_len) {
650                         if (psta) {
651                                 switch (pattrib->encrypt) {
652                                 case _WEP40_:
653                                 case _WEP104_:
654                                         WEP_IV(pattrib->iv, psta->txpn,
655                                                (u8)psecpriv->PrivacyKeyIndex);
656                                         break;
657                                 case _TKIP_:
658                                         if (bmcst)
659                                                 TKIP_IV(pattrib->iv,
660                                                     psta->txpn,
661                                                     (u8)psecpriv->XGrpKeyid);
662                                         else
663                                                 TKIP_IV(pattrib->iv, psta->txpn,
664                                                         0);
665                                         break;
666                                 case _AES_:
667                                         if (bmcst)
668                                                 AES_IV(pattrib->iv, psta->txpn,
669                                                     (u8)psecpriv->XGrpKeyid);
670                                         else
671                                                 AES_IV(pattrib->iv, psta->txpn,
672                                                        0);
673                                         break;
674                                 }
675                         }
676                         memcpy(pframe, pattrib->iv, pattrib->iv_len);
677                         pframe += pattrib->iv_len;
678                         mpdu_len -= pattrib->iv_len;
679                 }
680                 if (frg_inx == 0) {
681                         llc_sz = r8712_put_snap(pframe, pattrib->ether_type);
682                         pframe += llc_sz;
683                         mpdu_len -= llc_sz;
684                 }
685                 if ((pattrib->icv_len > 0) && (pattrib->bswenc))
686                         mpdu_len -= pattrib->icv_len;
687                 if (bmcst)
688                         mem_sz = _r8712_pktfile_read(&pktfile, pframe,
689                                  pattrib->pktlen);
690                 else
691                         mem_sz = _r8712_pktfile_read(&pktfile, pframe,
692                                  mpdu_len);
693                 pframe += mem_sz;
694                 if ((pattrib->icv_len > 0) && (pattrib->bswenc)) {
695                         memcpy(pframe, pattrib->icv, pattrib->icv_len);
696                         pframe += pattrib->icv_len;
697                 }
698                 frg_inx++;
699                 if (bmcst || r8712_endofpktfile(&pktfile)) {
700                         pattrib->nr_frags = frg_inx;
701                         pattrib->last_txcmdsz = pattrib->hdrlen +
702                                                 pattrib->iv_len +
703                                                 ((pattrib->nr_frags == 1) ?
704                                                 llc_sz : 0) +
705                                                 ((pattrib->bswenc) ?
706                                                 pattrib->icv_len : 0) + mem_sz;
707                         ClearMFrag(mem_start);
708                         break;
709                 }
710                 addr = (addr_t)(pframe);
711                 mem_start = (unsigned char *)RND4(addr) + TXDESC_OFFSET;
712                 memcpy(mem_start, pbuf_start + TXDESC_OFFSET, pattrib->hdrlen);
713         }
714
715         if (xmitframe_addmic(padapter, pxmitframe))
716                 return _FAIL;
717         xmitframe_swencrypt(padapter, pxmitframe);
718         return _SUCCESS;
719 }
720
721 void r8712_update_protection(struct _adapter *padapter, u8 *ie, uint ie_len)
722 {
723         uint    protection;
724         u8      *perp;
725         uint    erp_len;
726         struct  xmit_priv *pxmitpriv = &padapter->xmitpriv;
727         struct  registry_priv *pregistrypriv = &padapter->registrypriv;
728
729         switch (pxmitpriv->vcs_setting) {
730         case DISABLE_VCS:
731                 pxmitpriv->vcs = NONE_VCS;
732                 break;
733         case ENABLE_VCS:
734                 break;
735         case AUTO_VCS:
736         default:
737                 perp = r8712_get_ie(ie, WLAN_EID_ERP_INFO, &erp_len, ie_len);
738                 if (!perp) {
739                         pxmitpriv->vcs = NONE_VCS;
740                 } else {
741                         protection = (*(perp + 2)) & BIT(1);
742                         if (protection) {
743                                 if (pregistrypriv->vcs_type == RTS_CTS)
744                                         pxmitpriv->vcs = RTS_CTS;
745                                 else
746                                         pxmitpriv->vcs = CTS_TO_SELF;
747                         } else {
748                                 pxmitpriv->vcs = NONE_VCS;
749                         }
750                 }
751                 break;
752         }
753 }
754
755 struct xmit_buf *r8712_alloc_xmitbuf(struct xmit_priv *pxmitpriv)
756 {
757         unsigned long irqL;
758         struct xmit_buf *pxmitbuf;
759         struct  __queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
760
761         spin_lock_irqsave(&pfree_xmitbuf_queue->lock, irqL);
762         pxmitbuf = list_first_entry_or_null(&pfree_xmitbuf_queue->queue,
763                                             struct xmit_buf, list);
764         if (pxmitbuf) {
765                 list_del_init(&pxmitbuf->list);
766                 pxmitpriv->free_xmitbuf_cnt--;
767         }
768         spin_unlock_irqrestore(&pfree_xmitbuf_queue->lock, irqL);
769         return pxmitbuf;
770 }
771
772 void r8712_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
773 {
774         unsigned long irqL;
775         struct  __queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
776
777         if (!pxmitbuf)
778                 return;
779         spin_lock_irqsave(&pfree_xmitbuf_queue->lock, irqL);
780         list_del_init(&pxmitbuf->list);
781         list_add_tail(&(pxmitbuf->list), &pfree_xmitbuf_queue->queue);
782         pxmitpriv->free_xmitbuf_cnt++;
783         spin_unlock_irqrestore(&pfree_xmitbuf_queue->lock, irqL);
784 }
785
786 /*
787  * Calling context:
788  * 1. OS_TXENTRY
789  * 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
790  *
791  * If we turn on USE_RXTHREAD, then, no need for critical section.
792  * Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
793  *
794  * Must be very very cautious...
795  *
796  */
797 struct xmit_frame *r8712_alloc_xmitframe(struct xmit_priv *pxmitpriv)
798 {
799         /*
800          * Please remember to use all the osdep_service api,
801          * and lock/unlock or _enter/_exit critical to protect
802          * pfree_xmit_queue
803          */
804         unsigned long irqL;
805         struct xmit_frame *pxframe;
806         struct  __queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
807
808         spin_lock_irqsave(&pfree_xmit_queue->lock, irqL);
809         pxframe = list_first_entry_or_null(&pfree_xmit_queue->queue,
810                                            struct xmit_frame, list);
811         if (pxframe) {
812                 list_del_init(&pxframe->list);
813                 pxmitpriv->free_xmitframe_cnt--;
814                 pxframe->buf_addr = NULL;
815                 pxframe->pxmitbuf = NULL;
816                 pxframe->attrib.psta = NULL;
817                 pxframe->pkt = NULL;
818         }
819         spin_unlock_irqrestore(&pfree_xmit_queue->lock, irqL);
820         return pxframe;
821 }
822
823 void r8712_free_xmitframe(struct xmit_priv *pxmitpriv,
824                           struct xmit_frame *pxmitframe)
825 {
826         unsigned long irqL;
827         struct  __queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
828         struct _adapter *padapter = pxmitpriv->adapter;
829
830         if (!pxmitframe)
831                 return;
832         spin_lock_irqsave(&pfree_xmit_queue->lock, irqL);
833         list_del_init(&pxmitframe->list);
834         if (pxmitframe->pkt)
835                 pxmitframe->pkt = NULL;
836         list_add_tail(&pxmitframe->list, &pfree_xmit_queue->queue);
837         pxmitpriv->free_xmitframe_cnt++;
838         spin_unlock_irqrestore(&pfree_xmit_queue->lock, irqL);
839         if (netif_queue_stopped(padapter->pnetdev))
840                 netif_wake_queue(padapter->pnetdev);
841 }
842
843 void r8712_free_xmitframe_ex(struct xmit_priv *pxmitpriv,
844                       struct xmit_frame *pxmitframe)
845 {
846         if (!pxmitframe)
847                 return;
848         if (pxmitframe->frame_tag == DATA_FRAMETAG)
849                 r8712_free_xmitframe(pxmitpriv, pxmitframe);
850 }
851
852 void r8712_free_xmitframe_queue(struct xmit_priv *pxmitpriv,
853                                 struct  __queue *pframequeue)
854 {
855         unsigned long irqL;
856         struct list_head *plist, *phead;
857         struct  xmit_frame      *pxmitframe;
858
859         spin_lock_irqsave(&(pframequeue->lock), irqL);
860         phead = &pframequeue->queue;
861         plist = phead->next;
862         while (!end_of_queue_search(phead, plist)) {
863                 pxmitframe = container_of(plist, struct xmit_frame, list);
864                 plist = plist->next;
865                 r8712_free_xmitframe(pxmitpriv, pxmitframe);
866         }
867         spin_unlock_irqrestore(&(pframequeue->lock), irqL);
868 }
869
870 static inline struct tx_servq *get_sta_pending(struct _adapter *padapter,
871                                                struct  __queue **ppstapending,
872                                                struct sta_info *psta, sint up)
873 {
874         struct tx_servq *ptxservq;
875         struct hw_xmit *phwxmits =  padapter->xmitpriv.hwxmits;
876
877         switch (up) {
878         case 1:
879         case 2:
880                 ptxservq = &(psta->sta_xmitpriv.bk_q);
881                 *ppstapending = &padapter->xmitpriv.bk_pending;
882                 (phwxmits + 3)->accnt++;
883                 break;
884         case 4:
885         case 5:
886                 ptxservq = &(psta->sta_xmitpriv.vi_q);
887                 *ppstapending = &padapter->xmitpriv.vi_pending;
888                 (phwxmits + 1)->accnt++;
889                 break;
890         case 6:
891         case 7:
892                 ptxservq = &(psta->sta_xmitpriv.vo_q);
893                 *ppstapending = &padapter->xmitpriv.vo_pending;
894                 (phwxmits + 0)->accnt++;
895                 break;
896         case 0:
897         case 3:
898         default:
899                 ptxservq = &(psta->sta_xmitpriv.be_q);
900                 *ppstapending = &padapter->xmitpriv.be_pending;
901                 (phwxmits + 2)->accnt++;
902                 break;
903         }
904         return ptxservq;
905 }
906
907 /*
908  * Will enqueue pxmitframe to the proper queue, and indicate it
909  * to xx_pending list.....
910  */
911 int r8712_xmit_classifier(struct _adapter *padapter,
912                           struct xmit_frame *pxmitframe)
913 {
914         unsigned long irqL0;
915         struct  __queue *pstapending;
916         struct sta_info *psta;
917         struct tx_servq *ptxservq;
918         struct pkt_attrib *pattrib = &pxmitframe->attrib;
919         struct sta_priv *pstapriv = &padapter->stapriv;
920         struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
921         bool bmcst = is_multicast_ether_addr(pattrib->ra);
922
923         if (pattrib->psta) {
924                 psta = pattrib->psta;
925         } else {
926                 if (bmcst) {
927                         psta = r8712_get_bcmc_stainfo(padapter);
928                 } else {
929                         if (check_fwstate(pmlmepriv, WIFI_MP_STATE))
930                                 psta = r8712_get_stainfo(pstapriv,
931                                        get_bssid(pmlmepriv));
932                         else
933                                 psta = r8712_get_stainfo(pstapriv, pattrib->ra);
934                 }
935         }
936         if (!psta)
937                 return -EINVAL;
938         ptxservq = get_sta_pending(padapter, &pstapending,
939                    psta, pattrib->priority);
940         spin_lock_irqsave(&pstapending->lock, irqL0);
941         if (list_empty(&ptxservq->tx_pending))
942                 list_add_tail(&ptxservq->tx_pending, &pstapending->queue);
943         list_add_tail(&pxmitframe->list, &ptxservq->sta_pending.queue);
944         ptxservq->qcnt++;
945         spin_unlock_irqrestore(&pstapending->lock, irqL0);
946         return 0;
947 }
948
949 static void alloc_hwxmits(struct _adapter *padapter)
950 {
951         struct hw_xmit *hwxmits;
952         struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
953
954         pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
955         pxmitpriv->hwxmits = kmalloc_array(pxmitpriv->hwxmit_entry,
956                                 sizeof(struct hw_xmit), GFP_ATOMIC);
957         if (!pxmitpriv->hwxmits)
958                 return;
959         hwxmits = pxmitpriv->hwxmits;
960         if (pxmitpriv->hwxmit_entry == 5) {
961                 pxmitpriv->bmc_txqueue.head = 0;
962                 hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue;
963                 hwxmits[0] .sta_queue = &pxmitpriv->bm_pending;
964                 pxmitpriv->vo_txqueue.head = 0;
965                 hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue;
966                 hwxmits[1] .sta_queue = &pxmitpriv->vo_pending;
967                 pxmitpriv->vi_txqueue.head = 0;
968                 hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue;
969                 hwxmits[2] .sta_queue = &pxmitpriv->vi_pending;
970                 pxmitpriv->bk_txqueue.head = 0;
971                 hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
972                 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
973                 pxmitpriv->be_txqueue.head = 0;
974                 hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue;
975                 hwxmits[4] .sta_queue = &pxmitpriv->be_pending;
976         } else if (pxmitpriv->hwxmit_entry == 4) {
977                 pxmitpriv->vo_txqueue.head = 0;
978                 hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue;
979                 hwxmits[0] .sta_queue = &pxmitpriv->vo_pending;
980                 pxmitpriv->vi_txqueue.head = 0;
981                 hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue;
982                 hwxmits[1] .sta_queue = &pxmitpriv->vi_pending;
983                 pxmitpriv->be_txqueue.head = 0;
984                 hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue;
985                 hwxmits[2] .sta_queue = &pxmitpriv->be_pending;
986                 pxmitpriv->bk_txqueue.head = 0;
987                 hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
988                 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
989         }
990 }
991
992 static void free_hwxmits(struct _adapter *padapter)
993 {
994         struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
995
996         kfree(pxmitpriv->hwxmits);
997 }
998
999 static void init_hwxmits(struct hw_xmit *phwxmit, sint entry)
1000 {
1001         sint i;
1002
1003         for (i = 0; i < entry; i++, phwxmit++) {
1004                 spin_lock_init(&phwxmit->xmit_lock);
1005                 INIT_LIST_HEAD(&phwxmit->pending);
1006                 phwxmit->txcmdcnt = 0;
1007                 phwxmit->accnt = 0;
1008         }
1009 }
1010
1011 void xmitframe_xmitbuf_attach(struct xmit_frame *pxmitframe,
1012                         struct xmit_buf *pxmitbuf)
1013 {
1014         /* pxmitbuf attach to pxmitframe */
1015         pxmitframe->pxmitbuf = pxmitbuf;
1016         /* urb and irp connection */
1017         pxmitframe->pxmit_urb[0] = pxmitbuf->pxmit_urb[0];
1018         /* buffer addr assoc */
1019         pxmitframe->buf_addr = pxmitbuf->pbuf;
1020         /* pxmitframe attach to pxmitbuf */
1021         pxmitbuf->priv_data = pxmitframe;
1022 }
1023
1024 /*
1025  * tx_action == 0 == no frames to transmit
1026  * tx_action > 0 ==> we have frames to transmit
1027  * tx_action < 0 ==> we have frames to transmit, but TXFF is not even enough
1028  *                                               to transmit 1 frame.
1029  */
1030
1031 int r8712_pre_xmit(struct _adapter *padapter, struct xmit_frame *pxmitframe)
1032 {
1033         unsigned long irqL;
1034         int ret;
1035         struct xmit_buf *pxmitbuf = NULL;
1036         struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1037         struct pkt_attrib *pattrib = &pxmitframe->attrib;
1038
1039         r8712_do_queue_select(padapter, pattrib);
1040         spin_lock_irqsave(&pxmitpriv->lock, irqL);
1041         if (r8712_txframes_sta_ac_pending(padapter, pattrib) > 0) {
1042                 ret = false;
1043                 r8712_xmit_enqueue(padapter, pxmitframe);
1044                 spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
1045                 return ret;
1046         }
1047         pxmitbuf = r8712_alloc_xmitbuf(pxmitpriv);
1048         if (!pxmitbuf) { /*enqueue packet*/
1049                 ret = false;
1050                 r8712_xmit_enqueue(padapter, pxmitframe);
1051                 spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
1052         } else { /*dump packet directly*/
1053                 spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
1054                 ret = true;
1055                 xmitframe_xmitbuf_attach(pxmitframe, pxmitbuf);
1056                 r8712_xmit_direct(padapter, pxmitframe);
1057         }
1058         return ret;
1059 }