0001
0002
0003
0004 #include "../wifi.h"
0005 #include "../pci.h"
0006 #include "../base.h"
0007 #include "../stats.h"
0008 #include "reg.h"
0009 #include "def.h"
0010 #include "phy.h"
0011 #include "trx.h"
0012 #include "led.h"
0013
0014 static u8 _rtl8723e_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
0015 {
0016 __le16 fc = rtl_get_fc(skb);
0017
0018 if (unlikely(ieee80211_is_beacon(fc)))
0019 return QSLT_BEACON;
0020 if (ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))
0021 return QSLT_MGNT;
0022
0023 return skb->priority;
0024 }
0025
0026 static void _rtl8723e_query_rxphystatus(struct ieee80211_hw *hw,
0027 struct rtl_stats *pstatus, u8 *pdesc,
0028 struct rx_fwinfo_8723e *p_drvinfo,
0029 bool bpacket_match_bssid,
0030 bool bpacket_toself, bool packet_beacon)
0031 {
0032 struct rtl_priv *rtlpriv = rtl_priv(hw);
0033 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
0034 struct phy_sts_cck_8723e_t *cck_buf;
0035 s8 rx_pwr_all = 0, rx_pwr[4];
0036 u8 rf_rx_num = 0, evm, pwdb_all;
0037 u8 i, max_spatial_stream;
0038 u32 rssi, total_rssi = 0;
0039 bool is_cck = pstatus->is_cck;
0040
0041
0042 pstatus->packet_matchbssid = bpacket_match_bssid;
0043 pstatus->packet_toself = bpacket_toself;
0044 pstatus->packet_beacon = packet_beacon;
0045 pstatus->rx_mimo_signalquality[0] = -1;
0046 pstatus->rx_mimo_signalquality[1] = -1;
0047
0048 if (is_cck) {
0049 u8 report, cck_highpwr;
0050
0051
0052 cck_buf = (struct phy_sts_cck_8723e_t *)p_drvinfo;
0053
0054
0055
0056
0057
0058 if (ppsc->rfpwr_state == ERFON)
0059 cck_highpwr = (u8)rtl_get_bbreg(hw,
0060 RFPGA0_XA_HSSIPARAMETER2,
0061 BIT(9));
0062 else
0063 cck_highpwr = false;
0064
0065 if (!cck_highpwr) {
0066 u8 cck_agc_rpt = cck_buf->cck_agc_rpt;
0067 report = cck_buf->cck_agc_rpt & 0xc0;
0068 report = report >> 6;
0069 switch (report) {
0070 case 0x3:
0071 rx_pwr_all = -46 - (cck_agc_rpt & 0x3e);
0072 break;
0073 case 0x2:
0074 rx_pwr_all = -26 - (cck_agc_rpt & 0x3e);
0075 break;
0076 case 0x1:
0077 rx_pwr_all = -12 - (cck_agc_rpt & 0x3e);
0078 break;
0079 case 0x0:
0080 rx_pwr_all = 16 - (cck_agc_rpt & 0x3e);
0081 break;
0082 }
0083 } else {
0084 u8 cck_agc_rpt = cck_buf->cck_agc_rpt;
0085 report = p_drvinfo->cfosho[0] & 0x60;
0086 report = report >> 5;
0087 switch (report) {
0088 case 0x3:
0089 rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f) << 1);
0090 break;
0091 case 0x2:
0092 rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f) << 1);
0093 break;
0094 case 0x1:
0095 rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f) << 1);
0096 break;
0097 case 0x0:
0098 rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f) << 1);
0099 break;
0100 }
0101 }
0102
0103 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
0104
0105
0106
0107
0108 pwdb_all += 6;
0109 if (pwdb_all > 100)
0110 pwdb_all = 100;
0111
0112
0113
0114 if (pwdb_all > 34 && pwdb_all <= 42)
0115 pwdb_all -= 2;
0116 else if (pwdb_all > 26 && pwdb_all <= 34)
0117 pwdb_all -= 6;
0118 else if (pwdb_all > 14 && pwdb_all <= 26)
0119 pwdb_all -= 8;
0120 else if (pwdb_all > 4 && pwdb_all <= 14)
0121 pwdb_all -= 4;
0122
0123 pstatus->rx_pwdb_all = pwdb_all;
0124 pstatus->recvsignalpower = rx_pwr_all;
0125
0126
0127 if (bpacket_match_bssid) {
0128 u8 sq;
0129
0130 if (pstatus->rx_pwdb_all > 40)
0131 sq = 100;
0132 else {
0133 sq = cck_buf->sq_rpt;
0134 if (sq > 64)
0135 sq = 0;
0136 else if (sq < 20)
0137 sq = 100;
0138 else
0139 sq = ((64 - sq) * 100) / 44;
0140 }
0141
0142 pstatus->signalquality = sq;
0143 pstatus->rx_mimo_signalquality[0] = sq;
0144 pstatus->rx_mimo_signalquality[1] = -1;
0145 }
0146 } else {
0147 rtlpriv->dm.rfpath_rxenable[0] =
0148 rtlpriv->dm.rfpath_rxenable[1] = true;
0149
0150
0151 for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) {
0152
0153
0154 if (rtlpriv->dm.rfpath_rxenable[i])
0155 rf_rx_num++;
0156
0157 rx_pwr[i] = ((p_drvinfo->gain_trsw[i] &
0158 0x3f) * 2) - 110;
0159
0160
0161 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
0162 total_rssi += rssi;
0163
0164
0165 rtlpriv->stats.rx_snr_db[i] =
0166 (long)(p_drvinfo->rxsnr[i] / 2);
0167
0168
0169 if (bpacket_match_bssid)
0170 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
0171 }
0172
0173
0174
0175
0176 rx_pwr_all = ((p_drvinfo->pwdb_all >> 1) & 0x7f) - 110;
0177
0178 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
0179 pstatus->rx_pwdb_all = pwdb_all;
0180 pstatus->rxpower = rx_pwr_all;
0181 pstatus->recvsignalpower = rx_pwr_all;
0182
0183
0184 if (pstatus->is_ht && pstatus->rate >= DESC92C_RATEMCS8 &&
0185 pstatus->rate <= DESC92C_RATEMCS15)
0186 max_spatial_stream = 2;
0187 else
0188 max_spatial_stream = 1;
0189
0190 for (i = 0; i < max_spatial_stream; i++) {
0191 evm = rtl_evm_db_to_percentage(p_drvinfo->rxevm[i]);
0192
0193 if (bpacket_match_bssid) {
0194
0195
0196
0197 if (i == 0)
0198 pstatus->signalquality =
0199 (u8)(evm & 0xff);
0200 pstatus->rx_mimo_signalquality[i] =
0201 (u8)(evm & 0xff);
0202 }
0203 }
0204 }
0205
0206
0207
0208
0209 if (is_cck)
0210 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
0211 pwdb_all));
0212 else if (rf_rx_num != 0)
0213 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
0214 total_rssi /= rf_rx_num));
0215 }
0216
0217 static void translate_rx_signal_stuff(struct ieee80211_hw *hw,
0218 struct sk_buff *skb,
0219 struct rtl_stats *pstatus, u8 *pdesc,
0220 struct rx_fwinfo_8723e *p_drvinfo)
0221 {
0222 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
0223 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
0224 struct ieee80211_hdr *hdr;
0225 u8 *tmp_buf;
0226 u8 *praddr;
0227
0228 u16 fc, type;
0229 bool packet_matchbssid, packet_toself, packet_beacon;
0230
0231 tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
0232
0233 hdr = (struct ieee80211_hdr *)tmp_buf;
0234 fc = le16_to_cpu(hdr->frame_control);
0235 type = WLAN_FC_GET_TYPE(hdr->frame_control);
0236 praddr = hdr->addr1;
0237
0238 packet_matchbssid = ((IEEE80211_FTYPE_CTL != type) &&
0239 (ether_addr_equal(mac->bssid, (fc & IEEE80211_FCTL_TODS) ?
0240 hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS) ?
0241 hdr->addr2 : hdr->addr3)) &&
0242 (!pstatus->hwerror) &&
0243 (!pstatus->crc) && (!pstatus->icv));
0244
0245 packet_toself = packet_matchbssid &&
0246 (ether_addr_equal(praddr, rtlefuse->dev_addr));
0247
0248 if (ieee80211_is_beacon(hdr->frame_control))
0249 packet_beacon = true;
0250 else
0251 packet_beacon = false;
0252
0253 _rtl8723e_query_rxphystatus(hw, pstatus, pdesc, p_drvinfo,
0254 packet_matchbssid, packet_toself,
0255 packet_beacon);
0256
0257 rtl_process_phyinfo(hw, tmp_buf, pstatus);
0258 }
0259
0260 bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw,
0261 struct rtl_stats *status,
0262 struct ieee80211_rx_status *rx_status,
0263 u8 *pdesc8, struct sk_buff *skb)
0264 {
0265 struct rx_fwinfo_8723e *p_drvinfo;
0266 struct ieee80211_hdr *hdr;
0267 __le32 *pdesc = (__le32 *)pdesc8;
0268 u32 phystatus = get_rx_desc_physt(pdesc);
0269
0270 status->length = (u16)get_rx_desc_pkt_len(pdesc);
0271 status->rx_drvinfo_size = (u8)get_rx_desc_drv_info_size(pdesc) *
0272 RX_DRV_INFO_SIZE_UNIT;
0273 status->rx_bufshift = (u8)(get_rx_desc_shift(pdesc) & 0x03);
0274 status->icv = (u16)get_rx_desc_icv(pdesc);
0275 status->crc = (u16)get_rx_desc_crc32(pdesc);
0276 status->hwerror = (status->crc | status->icv);
0277 status->decrypted = !get_rx_desc_swdec(pdesc);
0278 status->rate = (u8)get_rx_desc_rxmcs(pdesc);
0279 status->shortpreamble = (u16)get_rx_desc_splcp(pdesc);
0280 status->isampdu = (bool)(get_rx_desc_paggr(pdesc) == 1);
0281 status->isfirst_ampdu = (bool)((get_rx_desc_paggr(pdesc) == 1) &&
0282 (get_rx_desc_faggr(pdesc) == 1));
0283 status->timestamp_low = get_rx_desc_tsfl(pdesc);
0284 status->rx_is40mhzpacket = (bool)get_rx_desc_bw(pdesc);
0285 status->is_ht = (bool)get_rx_desc_rxht(pdesc);
0286
0287 status->is_cck = RX_HAL_IS_CCK_RATE(status->rate);
0288
0289 rx_status->freq = hw->conf.chandef.chan->center_freq;
0290 rx_status->band = hw->conf.chandef.chan->band;
0291
0292 hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size
0293 + status->rx_bufshift);
0294
0295 if (status->crc)
0296 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
0297
0298 if (status->rx_is40mhzpacket)
0299 rx_status->bw = RATE_INFO_BW_40;
0300
0301 if (status->is_ht)
0302 rx_status->encoding = RX_ENC_HT;
0303
0304 rx_status->flag |= RX_FLAG_MACTIME_START;
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314 if (status->decrypted) {
0315 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
0316 (ieee80211_has_protected(hdr->frame_control)))
0317 rx_status->flag |= RX_FLAG_DECRYPTED;
0318 else
0319 rx_status->flag &= ~RX_FLAG_DECRYPTED;
0320 }
0321
0322
0323
0324
0325
0326
0327 rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht,
0328 false, status->rate);
0329
0330 rx_status->mactime = status->timestamp_low;
0331 if (phystatus == true) {
0332 p_drvinfo = (struct rx_fwinfo_8723e *)(skb->data +
0333 status->rx_bufshift);
0334
0335 translate_rx_signal_stuff(hw, skb, status, pdesc8, p_drvinfo);
0336 }
0337 rx_status->signal = status->recvsignalpower + 10;
0338 return true;
0339 }
0340
0341 void rtl8723e_tx_fill_desc(struct ieee80211_hw *hw,
0342 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
0343 u8 *txbd, struct ieee80211_tx_info *info,
0344 struct ieee80211_sta *sta,
0345 struct sk_buff *skb,
0346 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
0347 {
0348 struct rtl_priv *rtlpriv = rtl_priv(hw);
0349 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
0350 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0351 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0352 bool b_defaultadapter = true;
0353
0354 u8 *pdesc8 = (u8 *)pdesc_tx;
0355 __le32 *pdesc = (__le32 *)pdesc8;
0356 u16 seq_number;
0357 __le16 fc = hdr->frame_control;
0358 u8 fw_qsel = _rtl8723e_map_hwqueue_to_fwqueue(skb, hw_queue);
0359 bool firstseg = ((hdr->seq_ctrl &
0360 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
0361
0362 bool lastseg = ((hdr->frame_control &
0363 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
0364
0365 dma_addr_t mapping = dma_map_single(&rtlpci->pdev->dev, skb->data,
0366 skb->len, DMA_TO_DEVICE);
0367 u8 bw_40 = 0;
0368
0369 if (dma_mapping_error(&rtlpci->pdev->dev, mapping)) {
0370 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
0371 "DMA mapping error\n");
0372 return;
0373 }
0374 if (mac->opmode == NL80211_IFTYPE_STATION) {
0375 bw_40 = mac->bw_40;
0376 } else if (mac->opmode == NL80211_IFTYPE_AP ||
0377 mac->opmode == NL80211_IFTYPE_ADHOC) {
0378 if (sta)
0379 bw_40 = sta->deflink.ht_cap.cap &
0380 IEEE80211_HT_CAP_SUP_WIDTH_20_40;
0381 }
0382
0383 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
0384
0385 rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
0386
0387 clear_pci_tx_desc_content(pdesc, sizeof(struct tx_desc_8723e));
0388
0389 if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
0390 firstseg = true;
0391 lastseg = true;
0392 }
0393
0394 if (firstseg) {
0395 set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
0396
0397 set_tx_desc_tx_rate(pdesc, ptcb_desc->hw_rate);
0398
0399 if (ptcb_desc->use_shortgi || ptcb_desc->use_shortpreamble)
0400 set_tx_desc_data_shortgi(pdesc, 1);
0401
0402 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
0403 set_tx_desc_agg_break(pdesc, 1);
0404 set_tx_desc_max_agg_num(pdesc, 0x14);
0405 }
0406 set_tx_desc_seq(pdesc, seq_number);
0407
0408 set_tx_desc_rts_enable(pdesc,
0409 ((ptcb_desc->rts_enable &&
0410 !ptcb_desc->cts_enable) ? 1 : 0));
0411 set_tx_desc_hw_rts_enable(pdesc,
0412 ((ptcb_desc->rts_enable ||
0413 ptcb_desc->cts_enable) ? 1 : 0));
0414 set_tx_desc_cts2self(pdesc,
0415 ((ptcb_desc->cts_enable) ? 1 : 0));
0416 set_tx_desc_rts_stbc(pdesc,
0417 ((ptcb_desc->rts_stbc) ? 1 : 0));
0418
0419 set_tx_desc_rts_rate(pdesc, ptcb_desc->rts_rate);
0420 set_tx_desc_rts_bw(pdesc, 0);
0421 set_tx_desc_rts_sc(pdesc, ptcb_desc->rts_sc);
0422 set_tx_desc_rts_short(pdesc,
0423 ((ptcb_desc->rts_rate <= DESC92C_RATE54M) ?
0424 (ptcb_desc->rts_use_shortpreamble ? 1 : 0)
0425 : (ptcb_desc->rts_use_shortgi ? 1 : 0)));
0426
0427 if (bw_40) {
0428 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
0429 set_tx_desc_data_bw(pdesc, 1);
0430 set_tx_desc_tx_sub_carrier(pdesc, 3);
0431 } else {
0432 set_tx_desc_data_bw(pdesc, 0);
0433 set_tx_desc_tx_sub_carrier(pdesc,
0434 mac->cur_40_prime_sc);
0435 }
0436 } else {
0437 set_tx_desc_data_bw(pdesc, 0);
0438 set_tx_desc_tx_sub_carrier(pdesc, 0);
0439 }
0440
0441 set_tx_desc_linip(pdesc, 0);
0442 set_tx_desc_pkt_size(pdesc, (u16)skb->len);
0443
0444 if (sta) {
0445 u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
0446 set_tx_desc_ampdu_density(pdesc, ampdu_density);
0447 }
0448
0449 if (info->control.hw_key) {
0450 struct ieee80211_key_conf *keyconf =
0451 info->control.hw_key;
0452
0453 switch (keyconf->cipher) {
0454 case WLAN_CIPHER_SUITE_WEP40:
0455 case WLAN_CIPHER_SUITE_WEP104:
0456 case WLAN_CIPHER_SUITE_TKIP:
0457 set_tx_desc_sec_type(pdesc, 0x1);
0458 break;
0459 case WLAN_CIPHER_SUITE_CCMP:
0460 set_tx_desc_sec_type(pdesc, 0x3);
0461 break;
0462 default:
0463 set_tx_desc_sec_type(pdesc, 0x0);
0464 break;
0465
0466 }
0467 }
0468
0469 set_tx_desc_pkt_id(pdesc, 0);
0470 set_tx_desc_queue_sel(pdesc, fw_qsel);
0471
0472 set_tx_desc_data_rate_fb_limit(pdesc, 0x1F);
0473 set_tx_desc_rts_rate_fb_limit(pdesc, 0xF);
0474 set_tx_desc_disable_fb(pdesc, 0);
0475 set_tx_desc_use_rate(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
0476
0477 if (ieee80211_is_data_qos(fc)) {
0478 if (mac->rdg_en) {
0479 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
0480 "Enable RDG function.\n");
0481 set_tx_desc_rdg_enable(pdesc, 1);
0482 set_tx_desc_htc(pdesc, 1);
0483 }
0484 }
0485 }
0486
0487 set_tx_desc_first_seg(pdesc, (firstseg ? 1 : 0));
0488 set_tx_desc_last_seg(pdesc, (lastseg ? 1 : 0));
0489
0490 set_tx_desc_tx_buffer_size(pdesc, (u16)skb->len);
0491
0492 set_tx_desc_tx_buffer_address(pdesc, mapping);
0493
0494 if (rtlpriv->dm.useramask) {
0495 set_tx_desc_rate_id(pdesc, ptcb_desc->ratr_index);
0496 set_tx_desc_macid(pdesc, ptcb_desc->mac_id);
0497 } else {
0498 set_tx_desc_rate_id(pdesc, 0xC + ptcb_desc->ratr_index);
0499 set_tx_desc_macid(pdesc, ptcb_desc->ratr_index);
0500 }
0501
0502 if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) {
0503 set_tx_desc_hwseq_en_8723(pdesc, 1);
0504
0505
0506
0507 if (!b_defaultadapter)
0508 set_tx_desc_hwseq_sel_8723(pdesc, 1);
0509
0510 }
0511
0512 set_tx_desc_more_frag(pdesc, (lastseg ? 0 : 1));
0513
0514 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
0515 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
0516 set_tx_desc_bmc(pdesc, 1);
0517 }
0518
0519 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
0520 }
0521
0522 void rtl8723e_tx_fill_cmddesc(struct ieee80211_hw *hw,
0523 u8 *pdesc8, bool firstseg,
0524 bool lastseg, struct sk_buff *skb)
0525 {
0526 struct rtl_priv *rtlpriv = rtl_priv(hw);
0527 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0528 u8 fw_queue = QSLT_BEACON;
0529 __le32 *pdesc = (__le32 *)pdesc8;
0530
0531 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
0532 __le16 fc = hdr->frame_control;
0533
0534 dma_addr_t mapping = dma_map_single(&rtlpci->pdev->dev, skb->data,
0535 skb->len, DMA_TO_DEVICE);
0536
0537 if (dma_mapping_error(&rtlpci->pdev->dev, mapping)) {
0538 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
0539 "DMA mapping error\n");
0540 return;
0541 }
0542 clear_pci_tx_desc_content(pdesc, TX_DESC_SIZE);
0543
0544 if (firstseg)
0545 set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
0546
0547 set_tx_desc_tx_rate(pdesc, DESC92C_RATE1M);
0548
0549 set_tx_desc_seq(pdesc, 0);
0550
0551 set_tx_desc_linip(pdesc, 0);
0552
0553 set_tx_desc_queue_sel(pdesc, fw_queue);
0554
0555 set_tx_desc_first_seg(pdesc, 1);
0556 set_tx_desc_last_seg(pdesc, 1);
0557
0558 set_tx_desc_tx_buffer_size(pdesc, (u16)(skb->len));
0559
0560 set_tx_desc_tx_buffer_address(pdesc, mapping);
0561
0562 set_tx_desc_rate_id(pdesc, 7);
0563 set_tx_desc_macid(pdesc, 0);
0564
0565 set_tx_desc_own(pdesc, 1);
0566
0567 set_tx_desc_pkt_size(pdesc, (u16)(skb->len));
0568
0569 set_tx_desc_first_seg(pdesc, 1);
0570 set_tx_desc_last_seg(pdesc, 1);
0571
0572 set_tx_desc_offset(pdesc, 0x20);
0573
0574 set_tx_desc_use_rate(pdesc, 1);
0575
0576 if (!ieee80211_is_data_qos(fc)) {
0577 set_tx_desc_hwseq_en_8723(pdesc, 1);
0578
0579
0580 }
0581
0582 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
0583 "H2C Tx Cmd Content\n",
0584 pdesc, TX_DESC_SIZE);
0585 }
0586
0587 void rtl8723e_set_desc(struct ieee80211_hw *hw, u8 *pdesc8,
0588 bool istx, u8 desc_name, u8 *val)
0589 {
0590 __le32 *pdesc = (__le32 *)pdesc8;
0591
0592 if (istx) {
0593 switch (desc_name) {
0594 case HW_DESC_OWN:
0595 set_tx_desc_own(pdesc, 1);
0596 break;
0597 case HW_DESC_TX_NEXTDESC_ADDR:
0598 set_tx_desc_next_desc_address(pdesc, *(u32 *)val);
0599 break;
0600 default:
0601 WARN_ONCE(true, "rtl8723ae: ERR txdesc :%d not processed\n",
0602 desc_name);
0603 break;
0604 }
0605 } else {
0606 switch (desc_name) {
0607 case HW_DESC_RXOWN:
0608 set_rx_desc_own(pdesc, 1);
0609 break;
0610 case HW_DESC_RXBUFF_ADDR:
0611 set_rx_desc_buff_addr(pdesc, *(u32 *)val);
0612 break;
0613 case HW_DESC_RXPKT_LEN:
0614 set_rx_desc_pkt_len(pdesc, *(u32 *)val);
0615 break;
0616 case HW_DESC_RXERO:
0617 set_rx_desc_eor(pdesc, 1);
0618 break;
0619 default:
0620 WARN_ONCE(true, "rtl8723ae: ERR rxdesc :%d not processed\n",
0621 desc_name);
0622 break;
0623 }
0624 }
0625 }
0626
0627 u64 rtl8723e_get_desc(struct ieee80211_hw *hw,
0628 u8 *pdesc8, bool istx, u8 desc_name)
0629 {
0630 u32 ret = 0;
0631 __le32 *pdesc = (__le32 *)pdesc8;
0632
0633 if (istx) {
0634 switch (desc_name) {
0635 case HW_DESC_OWN:
0636 ret = get_tx_desc_own(pdesc);
0637 break;
0638 case HW_DESC_TXBUFF_ADDR:
0639 ret = get_tx_desc_tx_buffer_address(pdesc);
0640 break;
0641 default:
0642 WARN_ONCE(true, "rtl8723ae: ERR txdesc :%d not processed\n",
0643 desc_name);
0644 break;
0645 }
0646 } else {
0647 switch (desc_name) {
0648 case HW_DESC_OWN:
0649 ret = get_rx_desc_own(pdesc);
0650 break;
0651 case HW_DESC_RXPKT_LEN:
0652 ret = get_rx_desc_pkt_len(pdesc);
0653 break;
0654 case HW_DESC_RXBUFF_ADDR:
0655 ret = get_rx_desc_buff_addr(pdesc);
0656 break;
0657 default:
0658 WARN_ONCE(true, "rtl8723ae: ERR rxdesc :%d not processed\n",
0659 desc_name);
0660 break;
0661 }
0662 }
0663 return ret;
0664 }
0665
0666 bool rtl8723e_is_tx_desc_closed(struct ieee80211_hw *hw,
0667 u8 hw_queue, u16 index)
0668 {
0669 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0670 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
0671 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
0672 u8 own = (u8)rtl8723e_get_desc(hw, entry, true, HW_DESC_OWN);
0673
0674
0675
0676
0677
0678
0679 if (own)
0680 return false;
0681 return true;
0682 }
0683
0684 void rtl8723e_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
0685 {
0686 struct rtl_priv *rtlpriv = rtl_priv(hw);
0687 if (hw_queue == BEACON_QUEUE) {
0688 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, BIT(4));
0689 } else {
0690 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG,
0691 BIT(0) << (hw_queue));
0692 }
0693 }