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 _rtl92ce_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 _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
0027 struct rtl_stats *pstats,
0028 struct rx_desc_92c *pdesc,
0029 struct rx_fwinfo_92c *p_drvinfo,
0030 bool packet_match_bssid,
0031 bool packet_toself,
0032 bool packet_beacon)
0033 {
0034 struct rtl_priv *rtlpriv = rtl_priv(hw);
0035 struct phy_sts_cck_8192s_t *cck_buf;
0036 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
0037 s8 rx_pwr_all = 0, rx_pwr[4];
0038 u8 evm, pwdb_all, rf_rx_num = 0;
0039 u8 i, max_spatial_stream;
0040 u32 rssi, total_rssi = 0;
0041 bool is_cck_rate;
0042
0043 is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
0044 pstats->packet_matchbssid = packet_match_bssid;
0045 pstats->packet_toself = packet_toself;
0046 pstats->is_cck = is_cck_rate;
0047 pstats->packet_beacon = packet_beacon;
0048 pstats->rx_mimo_sig_qual[0] = -1;
0049 pstats->rx_mimo_sig_qual[1] = -1;
0050
0051 if (is_cck_rate) {
0052 u8 report, cck_highpwr;
0053
0054 cck_buf = (struct phy_sts_cck_8192s_t *)p_drvinfo;
0055
0056 if (ppsc->rfpwr_state == ERFON)
0057 cck_highpwr = (u8) rtl_get_bbreg(hw,
0058 RFPGA0_XA_HSSIPARAMETER2,
0059 BIT(9));
0060 else
0061 cck_highpwr = false;
0062
0063 if (!cck_highpwr) {
0064 u8 cck_agc_rpt = cck_buf->cck_agc_rpt;
0065
0066 report = cck_buf->cck_agc_rpt & 0xc0;
0067 report = report >> 6;
0068 switch (report) {
0069 case 0x3:
0070 rx_pwr_all = -46 - (cck_agc_rpt & 0x3e);
0071 break;
0072 case 0x2:
0073 rx_pwr_all = -26 - (cck_agc_rpt & 0x3e);
0074 break;
0075 case 0x1:
0076 rx_pwr_all = -12 - (cck_agc_rpt & 0x3e);
0077 break;
0078 case 0x0:
0079 rx_pwr_all = 16 - (cck_agc_rpt & 0x3e);
0080 break;
0081 }
0082 } else {
0083 u8 cck_agc_rpt = cck_buf->cck_agc_rpt;
0084
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 pstats->rx_pwdb_all = pwdb_all;
0124 pstats->recvsignalpower = rx_pwr_all;
0125
0126
0127 if (packet_match_bssid) {
0128 u8 sq;
0129
0130 if (pstats->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 pstats->signalquality = sq;
0143 pstats->rx_mimo_sig_qual[0] = sq;
0144 pstats->rx_mimo_sig_qual[1] = -1;
0145 }
0146 } else {
0147 rtlpriv->dm.rfpath_rxenable[0] =
0148 rtlpriv->dm.rfpath_rxenable[1] = true;
0149
0150 for (i = RF90_PATH_A; i < RF90_PATH_MAX; i++) {
0151
0152 if (rtlpriv->dm.rfpath_rxenable[i])
0153 rf_rx_num++;
0154
0155 rx_pwr[i] =
0156 ((p_drvinfo->gain_trsw[i] & 0x3f) * 2) - 110;
0157
0158 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
0159 total_rssi += rssi;
0160
0161 rtlpriv->stats.rx_snr_db[i] =
0162 (long)(p_drvinfo->rxsnr[i] / 2);
0163
0164
0165 if (packet_match_bssid)
0166 pstats->rx_mimo_signalstrength[i] = (u8) rssi;
0167 }
0168
0169
0170
0171
0172 rx_pwr_all = ((p_drvinfo->pwdb_all >> 1) & 0x7f) - 110;
0173 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
0174 pstats->rx_pwdb_all = pwdb_all;
0175 pstats->rxpower = rx_pwr_all;
0176 pstats->recvsignalpower = rx_pwr_all;
0177
0178
0179 if (pstats->is_ht && pstats->rate >= DESC_RATEMCS8 &&
0180 pstats->rate <= DESC_RATEMCS15)
0181 max_spatial_stream = 2;
0182 else
0183 max_spatial_stream = 1;
0184
0185 for (i = 0; i < max_spatial_stream; i++) {
0186 evm = rtl_evm_db_to_percentage(p_drvinfo->rxevm[i]);
0187
0188 if (packet_match_bssid) {
0189
0190
0191
0192 if (i == 0)
0193 pstats->signalquality =
0194 (u8)(evm & 0xff);
0195 pstats->rx_mimo_sig_qual[i] = (u8)(evm & 0xff);
0196 }
0197 }
0198 }
0199
0200
0201
0202
0203 if (is_cck_rate)
0204 pstats->signalstrength =
0205 (u8)(rtl_signal_scale_mapping(hw, pwdb_all));
0206 else if (rf_rx_num != 0)
0207 pstats->signalstrength =
0208 (u8)(rtl_signal_scale_mapping(hw, total_rssi /= rf_rx_num));
0209 }
0210
0211 static void _rtl92ce_translate_rx_signal_stuff(struct ieee80211_hw *hw,
0212 struct sk_buff *skb,
0213 struct rtl_stats *pstats,
0214 struct rx_desc_92c *pdesc,
0215 struct rx_fwinfo_92c *p_drvinfo)
0216 {
0217 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
0218 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
0219
0220 struct ieee80211_hdr *hdr;
0221 u8 *tmp_buf;
0222 u8 *praddr;
0223 __le16 fc;
0224 u16 type, c_fc;
0225 bool packet_matchbssid, packet_toself, packet_beacon = false;
0226
0227 tmp_buf = skb->data + pstats->rx_drvinfo_size + pstats->rx_bufshift;
0228
0229 hdr = (struct ieee80211_hdr *)tmp_buf;
0230 fc = hdr->frame_control;
0231 c_fc = le16_to_cpu(fc);
0232 type = WLAN_FC_GET_TYPE(fc);
0233 praddr = hdr->addr1;
0234
0235 packet_matchbssid =
0236 ((IEEE80211_FTYPE_CTL != type) &&
0237 ether_addr_equal(mac->bssid,
0238 (c_fc & IEEE80211_FCTL_TODS) ? hdr->addr1 :
0239 (c_fc & IEEE80211_FCTL_FROMDS) ? hdr->addr2 :
0240 hdr->addr3) &&
0241 (!pstats->hwerror) && (!pstats->crc) && (!pstats->icv));
0242
0243 packet_toself = packet_matchbssid &&
0244 ether_addr_equal(praddr, rtlefuse->dev_addr);
0245
0246 if (ieee80211_is_beacon(fc))
0247 packet_beacon = true;
0248
0249 _rtl92ce_query_rxphystatus(hw, pstats, pdesc, p_drvinfo,
0250 packet_matchbssid, packet_toself,
0251 packet_beacon);
0252
0253 rtl_process_phyinfo(hw, tmp_buf, pstats);
0254 }
0255
0256 bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
0257 struct rtl_stats *stats,
0258 struct ieee80211_rx_status *rx_status,
0259 u8 *p_desc8, struct sk_buff *skb)
0260 {
0261 struct rx_fwinfo_92c *p_drvinfo;
0262 struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc8;
0263 struct ieee80211_hdr *hdr;
0264 __le32 *p_desc = (__le32 *)p_desc8;
0265 u32 phystatus = get_rx_desc_physt(p_desc);
0266
0267 stats->length = (u16)get_rx_desc_pkt_len(p_desc);
0268 stats->rx_drvinfo_size = (u8)get_rx_desc_drv_info_size(p_desc) *
0269 RX_DRV_INFO_SIZE_UNIT;
0270 stats->rx_bufshift = (u8)(get_rx_desc_shift(p_desc) & 0x03);
0271 stats->icv = (u16)get_rx_desc_icv(p_desc);
0272 stats->crc = (u16)get_rx_desc_crc32(p_desc);
0273 stats->hwerror = (stats->crc | stats->icv);
0274 stats->decrypted = !get_rx_desc_swdec(p_desc);
0275 stats->rate = (u8)get_rx_desc_rxmcs(p_desc);
0276 stats->shortpreamble = (u16)get_rx_desc_splcp(p_desc);
0277 stats->isampdu = (bool)(get_rx_desc_paggr(p_desc) == 1);
0278 stats->isfirst_ampdu = (bool)((get_rx_desc_paggr(p_desc) == 1) &&
0279 (get_rx_desc_faggr(p_desc) == 1));
0280 stats->timestamp_low = get_rx_desc_tsfl(p_desc);
0281 stats->rx_is40mhzpacket = (bool)get_rx_desc_bw(p_desc);
0282 stats->is_ht = (bool)get_rx_desc_rxht(p_desc);
0283
0284 stats->is_cck = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
0285
0286 rx_status->freq = hw->conf.chandef.chan->center_freq;
0287 rx_status->band = hw->conf.chandef.chan->band;
0288
0289 hdr = (struct ieee80211_hdr *)(skb->data + stats->rx_drvinfo_size
0290 + stats->rx_bufshift);
0291
0292 if (stats->crc)
0293 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
0294
0295 if (stats->rx_is40mhzpacket)
0296 rx_status->bw = RATE_INFO_BW_40;
0297
0298 if (stats->is_ht)
0299 rx_status->encoding = RX_ENC_HT;
0300
0301 rx_status->flag |= RX_FLAG_MACTIME_START;
0302
0303
0304
0305
0306
0307
0308
0309
0310
0311 if (stats->decrypted) {
0312 if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
0313 (ieee80211_has_protected(hdr->frame_control)))
0314 rx_status->flag &= ~RX_FLAG_DECRYPTED;
0315 else
0316 rx_status->flag |= RX_FLAG_DECRYPTED;
0317 }
0318
0319
0320
0321
0322
0323 rx_status->rate_idx = rtlwifi_rate_mapping(hw, stats->is_ht,
0324 false, stats->rate);
0325
0326 rx_status->mactime = stats->timestamp_low;
0327 if (phystatus) {
0328 p_drvinfo = (struct rx_fwinfo_92c *)(skb->data +
0329 stats->rx_bufshift);
0330
0331 _rtl92ce_translate_rx_signal_stuff(hw,
0332 skb, stats, pdesc,
0333 p_drvinfo);
0334 }
0335
0336
0337 rx_status->signal = stats->recvsignalpower + 10;
0338
0339 return true;
0340 }
0341
0342 void rtl92ce_tx_fill_desc(struct ieee80211_hw *hw,
0343 struct ieee80211_hdr *hdr, u8 *pdesc8,
0344 u8 *pbd_desc_tx, struct ieee80211_tx_info *info,
0345 struct ieee80211_sta *sta,
0346 struct sk_buff *skb,
0347 u8 hw_queue, struct rtl_tcb_desc *tcb_desc)
0348 {
0349 struct rtl_priv *rtlpriv = rtl_priv(hw);
0350 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
0351 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0352 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0353 bool defaultadapter = true;
0354 __le32 *pdesc = (__le32 *)pdesc8;
0355 u16 seq_number;
0356 __le16 fc = hdr->frame_control;
0357 u8 fw_qsel = _rtl92ce_map_hwqueue_to_fwqueue(skb, hw_queue);
0358 bool firstseg = ((hdr->seq_ctrl &
0359 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
0360
0361 bool lastseg = ((hdr->frame_control &
0362 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
0363
0364 dma_addr_t mapping = dma_map_single(&rtlpci->pdev->dev, skb->data,
0365 skb->len, DMA_TO_DEVICE);
0366
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 rcu_read_lock();
0375 sta = get_sta(hw, mac->vif, mac->bssid);
0376 if (mac->opmode == NL80211_IFTYPE_STATION) {
0377 bw_40 = mac->bw_40;
0378 } else if (mac->opmode == NL80211_IFTYPE_AP ||
0379 mac->opmode == NL80211_IFTYPE_ADHOC ||
0380 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
0381 if (sta)
0382 bw_40 = sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40;
0383 }
0384
0385 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
0386
0387 rtl_get_tcb_desc(hw, info, sta, skb, tcb_desc);
0388
0389 clear_pci_tx_desc_content(pdesc, sizeof(struct tx_desc_92c));
0390
0391 if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
0392 firstseg = true;
0393 lastseg = true;
0394 }
0395 if (firstseg) {
0396 set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
0397
0398 set_tx_desc_tx_rate(pdesc, tcb_desc->hw_rate);
0399
0400 if (tcb_desc->use_shortgi || tcb_desc->use_shortpreamble)
0401 set_tx_desc_data_shortgi(pdesc, 1);
0402
0403 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
0404 set_tx_desc_agg_break(pdesc, 1);
0405 set_tx_desc_max_agg_num(pdesc, 0x14);
0406 }
0407 set_tx_desc_seq(pdesc, seq_number);
0408
0409 set_tx_desc_rts_enable(pdesc, ((tcb_desc->rts_enable &&
0410 !tcb_desc->
0411 cts_enable) ? 1 : 0));
0412 set_tx_desc_hw_rts_enable(pdesc,
0413 ((tcb_desc->rts_enable
0414 || tcb_desc->cts_enable) ? 1 : 0));
0415 set_tx_desc_cts2self(pdesc, ((tcb_desc->cts_enable) ? 1 : 0));
0416 set_tx_desc_rts_stbc(pdesc, ((tcb_desc->rts_stbc) ? 1 : 0));
0417
0418 set_tx_desc_rts_rate(pdesc, tcb_desc->rts_rate);
0419 set_tx_desc_rts_bw(pdesc, 0);
0420 set_tx_desc_rts_sc(pdesc, tcb_desc->rts_sc);
0421 set_tx_desc_rts_short(pdesc,
0422 ((tcb_desc->rts_rate <= DESC_RATE54M) ?
0423 (tcb_desc->rts_use_shortpreamble ? 1 : 0)
0424 : (tcb_desc->rts_use_shortgi ? 1 : 0)));
0425
0426 if (bw_40) {
0427 if (tcb_desc->packet_bw) {
0428 set_tx_desc_data_bw(pdesc, 1);
0429 set_tx_desc_tx_sub_carrier(pdesc, 3);
0430 } else {
0431 set_tx_desc_data_bw(pdesc, 0);
0432 set_tx_desc_tx_sub_carrier(pdesc,
0433 mac->cur_40_prime_sc);
0434 }
0435 } else {
0436 set_tx_desc_data_bw(pdesc, 0);
0437 set_tx_desc_tx_sub_carrier(pdesc, 0);
0438 }
0439
0440 set_tx_desc_linip(pdesc, 0);
0441 set_tx_desc_pkt_size(pdesc, (u16)skb->len);
0442
0443 if (sta) {
0444 u8 ampdu_density = sta->deflink.ht_cap.ampdu_density;
0445
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, tcb_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 rcu_read_unlock();
0487
0488 set_tx_desc_first_seg(pdesc, (firstseg ? 1 : 0));
0489 set_tx_desc_last_seg(pdesc, (lastseg ? 1 : 0));
0490
0491 set_tx_desc_tx_buffer_size(pdesc, (u16)skb->len);
0492
0493 set_tx_desc_tx_buffer_address(pdesc, mapping);
0494
0495 if (rtlpriv->dm.useramask) {
0496 set_tx_desc_rate_id(pdesc, tcb_desc->ratr_index);
0497 set_tx_desc_macid(pdesc, tcb_desc->mac_id);
0498 } else {
0499 set_tx_desc_rate_id(pdesc, 0xC + tcb_desc->ratr_index);
0500 set_tx_desc_macid(pdesc, tcb_desc->ratr_index);
0501 }
0502
0503 if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) {
0504 set_tx_desc_hwseq_en(pdesc, 1);
0505 set_tx_desc_pkt_id(pdesc, 8);
0506
0507 if (!defaultadapter)
0508 set_tx_desc_qos(pdesc, 1);
0509 }
0510
0511 set_tx_desc_more_frag(pdesc, (lastseg ? 0 : 1));
0512
0513 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
0514 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
0515 set_tx_desc_bmc(pdesc, 1);
0516 }
0517
0518 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
0519 }
0520
0521 void rtl92ce_tx_fill_cmddesc(struct ieee80211_hw *hw,
0522 u8 *pdesc8, bool firstseg,
0523 bool lastseg, struct sk_buff *skb)
0524 {
0525 struct rtl_priv *rtlpriv = rtl_priv(hw);
0526 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0527 u8 fw_queue = QSLT_BEACON;
0528 __le32 *pdesc = (__le32 *)pdesc8;
0529
0530 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
0531 __le16 fc = hdr->frame_control;
0532
0533 dma_addr_t mapping = dma_map_single(&rtlpci->pdev->dev, skb->data,
0534 skb->len, DMA_TO_DEVICE);
0535
0536 if (dma_mapping_error(&rtlpci->pdev->dev, mapping)) {
0537 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
0538 "DMA mapping error\n");
0539 return;
0540 }
0541 clear_pci_tx_desc_content(pdesc, TX_DESC_SIZE);
0542
0543 if (firstseg)
0544 set_tx_desc_offset(pdesc, USB_HWDESC_HEADER_LEN);
0545
0546 set_tx_desc_tx_rate(pdesc, DESC_RATE1M);
0547
0548 set_tx_desc_seq(pdesc, 0);
0549
0550 set_tx_desc_linip(pdesc, 0);
0551
0552 set_tx_desc_queue_sel(pdesc, fw_queue);
0553
0554 set_tx_desc_first_seg(pdesc, 1);
0555 set_tx_desc_last_seg(pdesc, 1);
0556
0557 set_tx_desc_tx_buffer_size(pdesc, (u16)(skb->len));
0558
0559 set_tx_desc_tx_buffer_address(pdesc, mapping);
0560
0561 set_tx_desc_rate_id(pdesc, 7);
0562 set_tx_desc_macid(pdesc, 0);
0563
0564 set_tx_desc_own(pdesc, 1);
0565
0566 set_tx_desc_pkt_size(pdesc, (u16)(skb->len));
0567
0568 set_tx_desc_first_seg(pdesc, 1);
0569 set_tx_desc_last_seg(pdesc, 1);
0570
0571 set_tx_desc_offset(pdesc, 0x20);
0572
0573 set_tx_desc_use_rate(pdesc, 1);
0574
0575 if (!ieee80211_is_data_qos(fc)) {
0576 set_tx_desc_hwseq_en(pdesc, 1);
0577 set_tx_desc_pkt_id(pdesc, 8);
0578 }
0579
0580 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
0581 "H2C Tx Cmd Content", pdesc, TX_DESC_SIZE);
0582 }
0583
0584 void rtl92ce_set_desc(struct ieee80211_hw *hw, u8 *pdesc8, bool istx,
0585 u8 desc_name, u8 *val)
0586 {
0587 __le32 *pdesc = (__le32 *)pdesc8;
0588
0589 if (istx) {
0590 switch (desc_name) {
0591 case HW_DESC_OWN:
0592 wmb();
0593 set_tx_desc_own(pdesc, 1);
0594 break;
0595 case HW_DESC_TX_NEXTDESC_ADDR:
0596 set_tx_desc_next_desc_address(pdesc, *(u32 *)val);
0597 break;
0598 default:
0599 WARN_ONCE(true, "rtl8192ce: ERR txdesc :%d not processed\n",
0600 desc_name);
0601 break;
0602 }
0603 } else {
0604 switch (desc_name) {
0605 case HW_DESC_RXOWN:
0606 wmb();
0607 set_rx_desc_own(pdesc, 1);
0608 break;
0609 case HW_DESC_RXBUFF_ADDR:
0610 set_rx_desc_buff_addr(pdesc, *(u32 *)val);
0611 break;
0612 case HW_DESC_RXPKT_LEN:
0613 set_rx_desc_pkt_len(pdesc, *(u32 *)val);
0614 break;
0615 case HW_DESC_RXERO:
0616 set_rx_desc_eor(pdesc, 1);
0617 break;
0618 default:
0619 WARN_ONCE(true, "rtl8192ce: ERR rxdesc :%d not processed\n",
0620 desc_name);
0621 break;
0622 }
0623 }
0624 }
0625
0626 u64 rtl92ce_get_desc(struct ieee80211_hw *hw, u8 *p_desc8,
0627 bool istx, u8 desc_name)
0628 {
0629 u32 ret = 0;
0630 __le32 *p_desc = (__le32 *)p_desc8;
0631
0632 if (istx) {
0633 switch (desc_name) {
0634 case HW_DESC_OWN:
0635 ret = get_tx_desc_own(p_desc);
0636 break;
0637 case HW_DESC_TXBUFF_ADDR:
0638 ret = get_tx_desc_tx_buffer_address(p_desc);
0639 break;
0640 default:
0641 WARN_ONCE(true, "rtl8192ce: ERR txdesc :%d not processed\n",
0642 desc_name);
0643 break;
0644 }
0645 } else {
0646 switch (desc_name) {
0647 case HW_DESC_OWN:
0648 ret = get_rx_desc_own(p_desc);
0649 break;
0650 case HW_DESC_RXPKT_LEN:
0651 ret = get_rx_desc_pkt_len(p_desc);
0652 break;
0653 case HW_DESC_RXBUFF_ADDR:
0654 ret = get_rx_desc_buff_addr(p_desc);
0655 break;
0656 default:
0657 WARN_ONCE(true, "rtl8192ce: ERR rxdesc :%d not processed\n",
0658 desc_name);
0659 break;
0660 }
0661 }
0662 return ret;
0663 }
0664
0665 bool rtl92ce_is_tx_desc_closed(struct ieee80211_hw *hw,
0666 u8 hw_queue, u16 index)
0667 {
0668 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0669 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
0670 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
0671 u8 own = (u8)rtl92ce_get_desc(hw, entry, true, HW_DESC_OWN);
0672
0673
0674
0675
0676
0677 if (own)
0678 return false;
0679 return true;
0680 }
0681
0682 void rtl92ce_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
0683 {
0684 struct rtl_priv *rtlpriv = rtl_priv(hw);
0685
0686 if (hw_queue == BEACON_QUEUE) {
0687 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, BIT(4));
0688 } else {
0689 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG,
0690 BIT(0) << (hw_queue));
0691 }
0692 }
0693