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 36static 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 */ 69static 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 206static 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 397static 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 440bool 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 520void 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 701void 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 766void 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 804u32 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 841bool 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 859void 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 870u32 rtl8723e_rx_command_packet(struct ieee80211_hw *hw, 871 struct rtl_stats status, 872 struct sk_buff *skb) 873{ 874 return 0; 875} 876