d372ccaf3465e062e173ef531e2e5501e58eab51
[cascardo/linux.git] / drivers / net / wireless / rtlwifi / rtl8723ae / trx.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2009-2012  Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * The full GNU General Public License is included in this distribution in the
15  * file called LICENSE.
16  *
17  * Contact Information:
18  * wlanfae <wlanfae@realtek.com>
19  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20  * Hsinchu 300, Taiwan.
21  *
22  * Larry Finger <Larry.Finger@lwfinger.net>
23  *
24  *****************************************************************************/
25
26 #include "../wifi.h"
27 #include "../pci.h"
28 #include "../base.h"
29 #include "../stats.h"
30 #include "reg.h"
31 #include "def.h"
32 #include "phy.h"
33 #include "trx.h"
34 #include "led.h"
35
36 static u8 _rtl8723e_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
37 {
38         __le16 fc = rtl_get_fc(skb);
39
40         if (unlikely(ieee80211_is_beacon(fc)))
41                 return QSLT_BEACON;
42         if (ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))
43                 return QSLT_MGNT;
44
45         return skb->priority;
46 }
47
48 /* mac80211's rate_idx is like this:
49  *
50  * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
51  *
52  * B/G rate:
53  * (rx_status->flag & RX_FLAG_HT) = 0,
54  * DESC92C_RATE1M-->DESC92C_RATE54M ==> idx is 0-->11,
55  *
56  * N rate:
57  * (rx_status->flag & RX_FLAG_HT) = 1,
58  * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
59  *
60  * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
61  * A rate:
62  * (rx_status->flag & RX_FLAG_HT) = 0,
63  * DESC92C_RATE6M-->DESC92C_RATE54M ==> idx is 0-->7,
64  *
65  * N rate:
66  * (rx_status->flag & RX_FLAG_HT) = 1,
67  * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
68  */
69 static int _rtl8723e_rate_mapping(struct ieee80211_hw *hw,
70                                   bool isht, u8 desc_rate)
71 {
72         int rate_idx;
73
74         if (!isht) {
75                 if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
76                         switch (desc_rate) {
77                         case DESC92C_RATE1M:
78                                 rate_idx = 0;
79                                 break;
80                         case DESC92C_RATE2M:
81                                 rate_idx = 1;
82                                 break;
83                         case DESC92C_RATE5_5M:
84                                 rate_idx = 2;
85                                 break;
86                         case DESC92C_RATE11M:
87                                 rate_idx = 3;
88                                 break;
89                         case DESC92C_RATE6M:
90                                 rate_idx = 4;
91                                 break;
92                         case DESC92C_RATE9M:
93                                 rate_idx = 5;
94                                 break;
95                         case DESC92C_RATE12M:
96                                 rate_idx = 6;
97                                 break;
98                         case DESC92C_RATE18M:
99                                 rate_idx = 7;
100                                 break;
101                         case DESC92C_RATE24M:
102                                 rate_idx = 8;
103                                 break;
104                         case DESC92C_RATE36M:
105                                 rate_idx = 9;
106                                 break;
107                         case DESC92C_RATE48M:
108                                 rate_idx = 10;
109                                 break;
110                         case DESC92C_RATE54M:
111                                 rate_idx = 11;
112                                 break;
113                         default:
114                                 rate_idx = 0;
115                                 break;
116                         }
117                 } else {
118                         switch (desc_rate) {
119                         case DESC92C_RATE6M:
120                                 rate_idx = 0;
121                                 break;
122                         case DESC92C_RATE9M:
123                                 rate_idx = 1;
124                                 break;
125                         case DESC92C_RATE12M:
126                                 rate_idx = 2;
127                                 break;
128                         case DESC92C_RATE18M:
129                                 rate_idx = 3;
130                                 break;
131                         case DESC92C_RATE24M:
132                                 rate_idx = 4;
133                                 break;
134                         case DESC92C_RATE36M:
135                                 rate_idx = 5;
136                                 break;
137                         case DESC92C_RATE48M:
138                                 rate_idx = 6;
139                                 break;
140                         case DESC92C_RATE54M:
141                                 rate_idx = 7;
142                                 break;
143                         default:
144                                 rate_idx = 0;
145                                 break;
146                         }
147                 }
148         } else {
149                 switch (desc_rate) {
150                 case DESC92C_RATEMCS0:
151                         rate_idx = 0;
152                         break;
153                 case DESC92C_RATEMCS1:
154                         rate_idx = 1;
155                         break;
156                 case DESC92C_RATEMCS2:
157                         rate_idx = 2;
158                         break;
159                 case DESC92C_RATEMCS3:
160                         rate_idx = 3;
161                         break;
162                 case DESC92C_RATEMCS4:
163                         rate_idx = 4;
164                         break;
165                 case DESC92C_RATEMCS5:
166                         rate_idx = 5;
167                         break;
168                 case DESC92C_RATEMCS6:
169                         rate_idx = 6;
170                         break;
171                 case DESC92C_RATEMCS7:
172                         rate_idx = 7;
173                         break;
174                 case DESC92C_RATEMCS8:
175                         rate_idx = 8;
176                         break;
177                 case DESC92C_RATEMCS9:
178                         rate_idx = 9;
179                         break;
180                 case DESC92C_RATEMCS10:
181                         rate_idx = 10;
182                         break;
183                 case DESC92C_RATEMCS11:
184                         rate_idx = 11;
185                         break;
186                 case DESC92C_RATEMCS12:
187                         rate_idx = 12;
188                         break;
189                 case DESC92C_RATEMCS13:
190                         rate_idx = 13;
191                         break;
192                 case DESC92C_RATEMCS14:
193                         rate_idx = 14;
194                         break;
195                 case DESC92C_RATEMCS15:
196                         rate_idx = 15;
197                         break;
198                 default:
199                         rate_idx = 0;
200                         break;
201                 }
202         }
203         return rate_idx;
204 }
205
206 static void _rtl8723e_query_rxphystatus(struct ieee80211_hw *hw,
207                                         struct rtl_stats *pstatus, u8 *pdesc,
208                                         struct rx_fwinfo_8723e *p_drvinfo,
209                                         bool bpacket_match_bssid,
210                                         bool bpacket_toself, bool packet_beacon)
211 {
212         struct rtl_priv *rtlpriv = rtl_priv(hw);
213         struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
214         struct phy_sts_cck_8723e_t *cck_buf;
215         s8 rx_pwr_all = 0, rx_pwr[4];
216         u8 rf_rx_num = 0, evm, pwdb_all;
217         u8 i, max_spatial_stream;
218         u32 rssi, total_rssi = 0;
219         bool is_cck = pstatus->is_cck;
220
221         /* Record it for next packet processing */
222         pstatus->packet_matchbssid = bpacket_match_bssid;
223         pstatus->packet_toself = bpacket_toself;
224         pstatus->packet_beacon = packet_beacon;
225         pstatus->rx_mimo_signalquality[0] = -1;
226         pstatus->rx_mimo_signalquality[1] = -1;
227
228         if (is_cck) {
229                 u8 report, cck_highpwr;
230
231                 /* CCK Driver info Structure is not the same as OFDM packet. */
232                 cck_buf = (struct phy_sts_cck_8723e_t *)p_drvinfo;
233
234                 /* (1)Hardware does not provide RSSI for CCK */
235                 /* (2)PWDB, Average PWDB cacluated by
236                  * hardware (for rate adaptive)
237                  */
238                 if (ppsc->rfpwr_state == ERFON)
239                         cck_highpwr = (u8)rtl_get_bbreg(hw,
240                                         RFPGA0_XA_HSSIPARAMETER2,
241                                         BIT(9));
242                 else
243                         cck_highpwr = false;
244
245                 if (!cck_highpwr) {
246                         u8 cck_agc_rpt = cck_buf->cck_agc_rpt;
247                         report = cck_buf->cck_agc_rpt & 0xc0;
248                         report = report >> 6;
249                         switch (report) {
250                         case 0x3:
251                                 rx_pwr_all = -46 - (cck_agc_rpt & 0x3e);
252                                 break;
253                         case 0x2:
254                                 rx_pwr_all = -26 - (cck_agc_rpt & 0x3e);
255                                 break;
256                         case 0x1:
257                                 rx_pwr_all = -12 - (cck_agc_rpt & 0x3e);
258                                 break;
259                         case 0x0:
260                                 rx_pwr_all = 16 - (cck_agc_rpt & 0x3e);
261                                 break;
262                         }
263                 } else {
264                         u8 cck_agc_rpt = cck_buf->cck_agc_rpt;
265                         report = p_drvinfo->cfosho[0] & 0x60;
266                         report = report >> 5;
267                         switch (report) {
268                         case 0x3:
269                                 rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f) << 1);
270                                 break;
271                         case 0x2:
272                                 rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f) << 1);
273                                 break;
274                         case 0x1:
275                                 rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f) << 1);
276                                 break;
277                         case 0x0:
278                                 rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f) << 1);
279                                 break;
280                         }
281                 }
282
283                 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
284                 /* CCK gain is smaller than OFDM/MCS gain,  */
285                 /* so we add gain diff by experiences,
286                  * the val is 6
287                  */
288                 pwdb_all += 6;
289                 if (pwdb_all > 100)
290                         pwdb_all = 100;
291                 /* modify the offset to make the same
292                  * gain index with OFDM.
293                  */
294                 if (pwdb_all > 34 && pwdb_all <= 42)
295                         pwdb_all -= 2;
296                 else if (pwdb_all > 26 && pwdb_all <= 34)
297                         pwdb_all -= 6;
298                 else if (pwdb_all > 14 && pwdb_all <= 26)
299                         pwdb_all -= 8;
300                 else if (pwdb_all > 4 && pwdb_all <= 14)
301                         pwdb_all -= 4;
302
303                 pstatus->rx_pwdb_all = pwdb_all;
304                 pstatus->recvsignalpower = rx_pwr_all;
305
306                 /* (3) Get Signal Quality (EVM) */
307                 if (bpacket_match_bssid) {
308                         u8 sq;
309
310                         if (pstatus->rx_pwdb_all > 40)
311                                 sq = 100;
312                         else {
313                                 sq = cck_buf->sq_rpt;
314                                 if (sq > 64)
315                                         sq = 0;
316                                 else if (sq < 20)
317                                         sq = 100;
318                                 else
319                                         sq = ((64 - sq) * 100) / 44;
320                         }
321
322                         pstatus->signalquality = sq;
323                         pstatus->rx_mimo_signalquality[0] = sq;
324                         pstatus->rx_mimo_signalquality[1] = -1;
325                 }
326         } else {
327                 rtlpriv->dm.rfpath_rxenable[0] =
328                     rtlpriv->dm.rfpath_rxenable[1] = true;
329
330                 /* (1)Get RSSI for HT rate */
331                 for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) {
332
333                         /* we will judge RF RX path now. */
334                         if (rtlpriv->dm.rfpath_rxenable[i])
335                                 rf_rx_num++;
336
337                         rx_pwr[i] = ((p_drvinfo->gain_trsw[i] &
338                                       0x3f) * 2) - 110;
339
340                         /* Translate DBM to percentage. */
341                         rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
342                         total_rssi += rssi;
343
344                         /* Get Rx snr value in DB */
345                         rtlpriv->stats.rx_snr_db[i] =
346                                 (long)(p_drvinfo->rxsnr[i] / 2);
347
348                         /* Record Signal Strength for next packet */
349                         if (bpacket_match_bssid)
350                                 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
351                 }
352
353                 /* (2)PWDB, Average PWDB cacluated by
354                  * hardware (for rate adaptive)
355                  */
356                 rx_pwr_all = ((p_drvinfo->pwdb_all >> 1) & 0x7f) - 110;
357
358                 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
359                 pstatus->rx_pwdb_all = pwdb_all;
360                 pstatus->rxpower = rx_pwr_all;
361                 pstatus->recvsignalpower = rx_pwr_all;
362
363                 /* (3)EVM of HT rate */
364                 if (pstatus->is_ht && pstatus->rate >= DESC92C_RATEMCS8 &&
365                     pstatus->rate <= DESC92C_RATEMCS15)
366                         max_spatial_stream = 2;
367                 else
368                         max_spatial_stream = 1;
369
370                 for (i = 0; i < max_spatial_stream; i++) {
371                         evm = rtl_evm_db_to_percentage(p_drvinfo->rxevm[i]);
372
373                         if (bpacket_match_bssid) {
374                                 /* Fill value in RFD, Get the first
375                                  * spatial stream only
376                                  */
377                                 if (i == 0)
378                                         pstatus->signalquality =
379                                                 (u8)(evm & 0xff);
380                                 pstatus->rx_mimo_signalquality[i] =
381                                         (u8)(evm & 0xff);
382                         }
383                 }
384         }
385
386         /* UI BSS List signal strength(in percentage),
387          * make it good looking, from 0~100.
388          */
389         if (is_cck)
390                 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
391                         pwdb_all));
392         else if (rf_rx_num != 0)
393                 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
394                         total_rssi /= rf_rx_num));
395 }
396
397 static void translate_rx_signal_stuff(struct ieee80211_hw *hw,
398                                       struct sk_buff *skb,
399                                       struct rtl_stats *pstatus, u8 *pdesc,
400                                       struct rx_fwinfo_8723e *p_drvinfo)
401 {
402         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
403         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
404         struct ieee80211_hdr *hdr;
405         u8 *tmp_buf;
406         u8 *praddr;
407         /*u8 *psaddr;*/
408         u16 fc, type;
409         bool packet_matchbssid, packet_toself, packet_beacon;
410
411         tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
412
413         hdr = (struct ieee80211_hdr *)tmp_buf;
414         fc = le16_to_cpu(hdr->frame_control);
415         type = WLAN_FC_GET_TYPE(hdr->frame_control);
416         praddr = hdr->addr1;
417
418         packet_matchbssid = ((IEEE80211_FTYPE_CTL != type) &&
419                 (ether_addr_equal(mac->bssid, (fc & IEEE80211_FCTL_TODS) ?
420                  hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS) ?
421                  hdr->addr2 : hdr->addr3)) &&
422                  (!pstatus->hwerror) &&
423                  (!pstatus->crc) && (!pstatus->icv));
424
425         packet_toself = packet_matchbssid &&
426             (ether_addr_equal(praddr, rtlefuse->dev_addr));
427
428         if (ieee80211_is_beacon(hdr->frame_control))
429                 packet_beacon = true;
430         else
431                 packet_beacon = false;
432
433         _rtl8723e_query_rxphystatus(hw, pstatus, pdesc, p_drvinfo,
434                                     packet_matchbssid, packet_toself,
435                                     packet_beacon);
436
437         rtl_process_phyinfo(hw, tmp_buf, pstatus);
438 }
439
440 bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw,
441                             struct rtl_stats *status,
442                             struct ieee80211_rx_status *rx_status,
443                             u8 *pdesc, struct sk_buff *skb)
444 {
445         struct rx_fwinfo_8723e *p_drvinfo;
446         struct ieee80211_hdr *hdr;
447         u32 phystatus = GET_RX_DESC_PHYST(pdesc);
448
449         status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc);
450         status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
451             RX_DRV_INFO_SIZE_UNIT;
452         status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03);
453         status->icv = (u16)GET_RX_DESC_ICV(pdesc);
454         status->crc = (u16)GET_RX_DESC_CRC32(pdesc);
455         status->hwerror = (status->crc | status->icv);
456         status->decrypted = !GET_RX_DESC_SWDEC(pdesc);
457         status->rate = (u8)GET_RX_DESC_RXMCS(pdesc);
458         status->shortpreamble = (u16)GET_RX_DESC_SPLCP(pdesc);
459         status->isampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
460         status->isfirst_ampdu = (bool)((GET_RX_DESC_PAGGR(pdesc) == 1) &&
461                                        (GET_RX_DESC_FAGGR(pdesc) == 1));
462         status->timestamp_low = GET_RX_DESC_TSFL(pdesc);
463         status->rx_is40Mhzpacket = (bool)GET_RX_DESC_BW(pdesc);
464         status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc);
465
466         status->is_cck = RX_HAL_IS_CCK_RATE(status->rate);
467
468         rx_status->freq = hw->conf.chandef.chan->center_freq;
469         rx_status->band = hw->conf.chandef.chan->band;
470
471         hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size
472                         + status->rx_bufshift);
473
474         if (status->crc)
475                 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
476
477         if (status->rx_is40Mhzpacket)
478                 rx_status->flag |= RX_FLAG_40MHZ;
479
480         if (status->is_ht)
481                 rx_status->flag |= RX_FLAG_HT;
482
483         rx_status->flag |= RX_FLAG_MACTIME_START;
484
485         /* hw will set status->decrypted true, if it finds the
486          * frame is open data frame or mgmt frame.
487          * So hw will not decryption robust managment frame
488          * for IEEE80211w but still set status->decrypted
489          * true, so here we should set it back to undecrypted
490          * for IEEE80211w frame, and mac80211 sw will help
491          * to decrypt it
492          */
493         if (status->decrypted) {
494                 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
495                     (ieee80211_has_protected(hdr->frame_control)))
496                         rx_status->flag |= RX_FLAG_DECRYPTED;
497                 else
498                         rx_status->flag &= ~RX_FLAG_DECRYPTED;
499         }
500
501         /* rate_idx: index of data rate into band's
502          * supported rates or MCS index if HT rates
503          * are use (RX_FLAG_HT)
504          * Notice: this is diff with windows define
505          */
506         rx_status->rate_idx = _rtl8723e_rate_mapping(hw,
507                                 status->is_ht, status->rate);
508
509         rx_status->mactime = status->timestamp_low;
510         if (phystatus == true) {
511                 p_drvinfo = (struct rx_fwinfo_8723e *)(skb->data +
512                                                      status->rx_bufshift);
513
514                 translate_rx_signal_stuff(hw, skb, status, pdesc, p_drvinfo);
515         }
516         rx_status->signal = status->recvsignalpower + 10;
517         return true;
518 }
519
520 void rtl8723e_tx_fill_desc(struct ieee80211_hw *hw,
521                            struct ieee80211_hdr *hdr, u8 *pdesc_tx,
522                            u8 *txbd, struct ieee80211_tx_info *info,
523                            struct ieee80211_sta *sta,
524                            struct sk_buff *skb,
525                            u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
526 {
527         struct rtl_priv *rtlpriv = rtl_priv(hw);
528         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
529         struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
530         struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
531         bool b_defaultadapter = true;
532         /* bool b_trigger_ac = false; */
533         u8 *pdesc = (u8 *)pdesc_tx;
534         u16 seq_number;
535         __le16 fc = hdr->frame_control;
536         u8 fw_qsel = _rtl8723e_map_hwqueue_to_fwqueue(skb, hw_queue);
537         bool firstseg = ((hdr->seq_ctrl &
538                           cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
539
540         bool lastseg = ((hdr->frame_control &
541                          cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
542
543         dma_addr_t mapping = pci_map_single(rtlpci->pdev,
544                                             skb->data, skb->len,
545                                             PCI_DMA_TODEVICE);
546         u8 bw_40 = 0;
547
548         if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
549                 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
550                          "DMA mapping error");
551                 return;
552         }
553         if (mac->opmode == NL80211_IFTYPE_STATION) {
554                 bw_40 = mac->bw_40;
555         } else if (mac->opmode == NL80211_IFTYPE_AP ||
556                 mac->opmode == NL80211_IFTYPE_ADHOC) {
557                 if (sta)
558                         bw_40 = sta->ht_cap.cap &
559                                 IEEE80211_HT_CAP_SUP_WIDTH_20_40;
560         }
561
562         seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
563
564         rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
565
566         CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_8723e));
567
568         if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
569                 firstseg = true;
570                 lastseg = true;
571         }
572
573         if (firstseg) {
574                 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
575
576                 SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
577
578                 if (ptcb_desc->use_shortgi || ptcb_desc->use_shortpreamble)
579                         SET_TX_DESC_DATA_SHORTGI(pdesc, 1);
580
581                 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
582                         SET_TX_DESC_AGG_BREAK(pdesc, 1);
583                         SET_TX_DESC_MAX_AGG_NUM(pdesc, 0x14);
584                 }
585                 SET_TX_DESC_SEQ(pdesc, seq_number);
586
587                 SET_TX_DESC_RTS_ENABLE(pdesc,
588                                        ((ptcb_desc->rts_enable &&
589                                         !ptcb_desc->cts_enable) ? 1 : 0));
590                 SET_TX_DESC_HW_RTS_ENABLE(pdesc,
591                                           ((ptcb_desc->rts_enable ||
592                                           ptcb_desc->cts_enable) ? 1 : 0));
593                 SET_TX_DESC_CTS2SELF(pdesc,
594                                      ((ptcb_desc->cts_enable) ? 1 : 0));
595                 SET_TX_DESC_RTS_STBC(pdesc,
596                                      ((ptcb_desc->rts_stbc) ? 1 : 0));
597
598                 SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
599                 SET_TX_DESC_RTS_BW(pdesc, 0);
600                 SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
601                 SET_TX_DESC_RTS_SHORT(pdesc,
602                                 ((ptcb_desc->rts_rate <= DESC92C_RATE54M) ?
603                                 (ptcb_desc->rts_use_shortpreamble ? 1 : 0)
604                                 : (ptcb_desc->rts_use_shortgi ? 1 : 0)));
605
606                 if (bw_40) {
607                         if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
608                                 SET_TX_DESC_DATA_BW(pdesc, 1);
609                                 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3);
610                         } else {
611                                 SET_TX_DESC_DATA_BW(pdesc, 0);
612                                 SET_TX_DESC_TX_SUB_CARRIER(pdesc,
613                                         mac->cur_40_prime_sc);
614                         }
615                 } else {
616                         SET_TX_DESC_DATA_BW(pdesc, 0);
617                         SET_TX_DESC_TX_SUB_CARRIER(pdesc, 0);
618                 }
619
620                 SET_TX_DESC_LINIP(pdesc, 0);
621                 SET_TX_DESC_PKT_SIZE(pdesc, (u16) skb->len);
622
623                 if (sta) {
624                         u8 ampdu_density = sta->ht_cap.ampdu_density;
625                         SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density);
626                 }
627
628                 if (info->control.hw_key) {
629                         struct ieee80211_key_conf *keyconf =
630                             info->control.hw_key;
631
632                         switch (keyconf->cipher) {
633                         case WLAN_CIPHER_SUITE_WEP40:
634                         case WLAN_CIPHER_SUITE_WEP104:
635                         case WLAN_CIPHER_SUITE_TKIP:
636                                 SET_TX_DESC_SEC_TYPE(pdesc, 0x1);
637                                 break;
638                         case WLAN_CIPHER_SUITE_CCMP:
639                                 SET_TX_DESC_SEC_TYPE(pdesc, 0x3);
640                                 break;
641                         default:
642                                 SET_TX_DESC_SEC_TYPE(pdesc, 0x0);
643                                 break;
644
645                         }
646                 }
647
648                 SET_TX_DESC_PKT_ID(pdesc, 0);
649                 SET_TX_DESC_QUEUE_SEL(pdesc, fw_qsel);
650
651                 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F);
652                 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF);
653                 SET_TX_DESC_DISABLE_FB(pdesc, 0);
654                 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
655
656                 if (ieee80211_is_data_qos(fc)) {
657                         if (mac->rdg_en) {
658                                 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
659                                          "Enable RDG function.\n");
660                                 SET_TX_DESC_RDG_ENABLE(pdesc, 1);
661                                 SET_TX_DESC_HTC(pdesc, 1);
662                         }
663                 }
664         }
665
666         SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
667         SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
668
669         SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) skb->len);
670
671         SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
672
673         if (rtlpriv->dm.useramask) {
674                 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
675                 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
676         } else {
677                 SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index);
678                 SET_TX_DESC_MACID(pdesc, ptcb_desc->ratr_index);
679         }
680
681         if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) {
682                 SET_TX_DESC_HWSEQ_EN_8723(pdesc, 1);
683                 /* SET_TX_DESC_HWSEQ_EN(pdesc, 1); */
684                 /* SET_TX_DESC_PKT_ID(pdesc, 8); */
685
686                 if (!b_defaultadapter)
687                         SET_TX_DESC_HWSEQ_SEL_8723(pdesc, 1);
688         /* SET_TX_DESC_QOS(pdesc, 1); */
689         }
690
691         SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
692
693         if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
694             is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
695                 SET_TX_DESC_BMC(pdesc, 1);
696         }
697
698         RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
699 }
700
701 void rtl8723e_tx_fill_cmddesc(struct ieee80211_hw *hw,
702                               u8 *pdesc, bool firstseg,
703                               bool lastseg, struct sk_buff *skb)
704 {
705         struct rtl_priv *rtlpriv = rtl_priv(hw);
706         struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
707         u8 fw_queue = QSLT_BEACON;
708
709         dma_addr_t mapping = pci_map_single(rtlpci->pdev,
710                                             skb->data, skb->len,
711                                             PCI_DMA_TODEVICE);
712
713         struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
714         __le16 fc = hdr->frame_control;
715
716         if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
717                 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
718                          "DMA mapping error");
719                 return;
720         }
721         CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
722
723         if (firstseg)
724                 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
725
726         SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE1M);
727
728         SET_TX_DESC_SEQ(pdesc, 0);
729
730         SET_TX_DESC_LINIP(pdesc, 0);
731
732         SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue);
733
734         SET_TX_DESC_FIRST_SEG(pdesc, 1);
735         SET_TX_DESC_LAST_SEG(pdesc, 1);
736
737         SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) (skb->len));
738
739         SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
740
741         SET_TX_DESC_RATE_ID(pdesc, 7);
742         SET_TX_DESC_MACID(pdesc, 0);
743
744         SET_TX_DESC_OWN(pdesc, 1);
745
746         SET_TX_DESC_PKT_SIZE((u8 *)pdesc, (u16)(skb->len));
747
748         SET_TX_DESC_FIRST_SEG(pdesc, 1);
749         SET_TX_DESC_LAST_SEG(pdesc, 1);
750
751         SET_TX_DESC_OFFSET(pdesc, 0x20);
752
753         SET_TX_DESC_USE_RATE(pdesc, 1);
754
755         if (!ieee80211_is_data_qos(fc)) {
756                 SET_TX_DESC_HWSEQ_EN_8723(pdesc, 1);
757                 /* SET_TX_DESC_HWSEQ_EN(pdesc, 1); */
758                 /* SET_TX_DESC_PKT_ID(pdesc, 8); */
759         }
760
761         RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
762                       "H2C Tx Cmd Content\n",
763                       pdesc, TX_DESC_SIZE);
764 }
765
766 void rtl8723e_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
767                        bool istx, u8 desc_name, u8 *val)
768 {
769         if (istx == true) {
770                 switch (desc_name) {
771                 case HW_DESC_OWN:
772                         SET_TX_DESC_OWN(pdesc, 1);
773                         break;
774                 case HW_DESC_TX_NEXTDESC_ADDR:
775                         SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *) val);
776                         break;
777                 default:
778                         RT_ASSERT(false, "ERR txdesc :%d not process\n",
779                                   desc_name);
780                         break;
781                 }
782         } else {
783                 switch (desc_name) {
784                 case HW_DESC_RXOWN:
785                         SET_RX_DESC_OWN(pdesc, 1);
786                         break;
787                 case HW_DESC_RXBUFF_ADDR:
788                         SET_RX_DESC_BUFF_ADDR(pdesc, *(u32 *) val);
789                         break;
790                 case HW_DESC_RXPKT_LEN:
791                         SET_RX_DESC_PKT_LEN(pdesc, *(u32 *) val);
792                         break;
793                 case HW_DESC_RXERO:
794                         SET_RX_DESC_EOR(pdesc, 1);
795                         break;
796                 default:
797                         RT_ASSERT(false, "ERR rxdesc :%d not process\n",
798                                   desc_name);
799                         break;
800                 }
801         }
802 }
803
804 u32 rtl8723e_get_desc(u8 *pdesc, bool istx, u8 desc_name)
805 {
806         u32 ret = 0;
807
808         if (istx == true) {
809                 switch (desc_name) {
810                 case HW_DESC_OWN:
811                         ret = GET_TX_DESC_OWN(pdesc);
812                         break;
813                 case HW_DESC_TXBUFF_ADDR:
814                         ret = GET_TX_DESC_TX_BUFFER_ADDRESS(pdesc);
815                         break;
816                 default:
817                         RT_ASSERT(false, "ERR txdesc :%d not process\n",
818                                   desc_name);
819                         break;
820                 }
821         } else {
822                 switch (desc_name) {
823                 case HW_DESC_OWN:
824                         ret = GET_RX_DESC_OWN(pdesc);
825                         break;
826                 case HW_DESC_RXPKT_LEN:
827                         ret = GET_RX_DESC_PKT_LEN(pdesc);
828                         break;
829                 case HW_DESC_RXBUFF_ADDR:
830                         ret = GET_RX_DESC_BUFF_ADDR(pdesc);
831                         break;
832                 default:
833                         RT_ASSERT(false, "ERR rxdesc :%d not process\n",
834                                   desc_name);
835                         break;
836                 }
837         }
838         return ret;
839 }
840
841 bool rtl8723e_is_tx_desc_closed(struct ieee80211_hw *hw,
842                                 u8 hw_queue, u16 index)
843 {
844         struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
845         struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
846         u8 *entry = (u8 *)(&ring->desc[ring->idx]);
847         u8 own = (u8)rtl8723e_get_desc(entry, true, HW_DESC_OWN);
848
849         /**
850          *beacon packet will only use the first
851          *descriptor defautly,and the own may not
852          *be cleared by the hardware
853          */
854         if (own)
855                 return false;
856         return true;
857 }
858
859 void rtl8723e_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
860 {
861         struct rtl_priv *rtlpriv = rtl_priv(hw);
862         if (hw_queue == BEACON_QUEUE) {
863                 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, BIT(4));
864         } else {
865                 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG,
866                                BIT(0) << (hw_queue));
867         }
868 }
869
870 u32 rtl8723e_rx_command_packet(struct ieee80211_hw *hw,
871                                struct rtl_stats status,
872                                struct sk_buff *skb)
873 {
874         return 0;
875 }