1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2009-2014 Realtek Corporation.*/
14 #include "../rtl8723com/phy_common.h"
16 #include "../rtl8723com/dm_common.h"
18 #include "../rtl8723com/fw_common.h"
21 #include "../pwrseqcmd.h"
23 #include "../btcoexist/rtl_btc.h"
24 #include <linux/kernel.h>
28 static void _rtl8723be_return_beacon_queue_skb(struct ieee80211_hw *hw)
30 struct rtl_priv *rtlpriv = rtl_priv(hw);
31 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
32 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
33 struct sk_buff_head free_list;
36 skb_queue_head_init(&free_list);
37 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
38 while (skb_queue_len(&ring->queue)) {
39 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
40 struct sk_buff *skb = __skb_dequeue(&ring->queue);
42 dma_unmap_single(&rtlpci->pdev->dev,
43 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry,
44 true, HW_DESC_TXBUFF_ADDR),
45 skb->len, DMA_TO_DEVICE);
46 __skb_queue_tail(&free_list, skb);
47 ring->idx = (ring->idx + 1) % ring->entries;
49 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
51 __skb_queue_purge(&free_list);
54 static void _rtl8723be_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
55 u8 set_bits, u8 clear_bits)
57 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
58 struct rtl_priv *rtlpriv = rtl_priv(hw);
60 rtlpci->reg_bcn_ctrl_val |= set_bits;
61 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
63 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
66 static void _rtl8723be_stop_tx_beacon(struct ieee80211_hw *hw)
68 struct rtl_priv *rtlpriv = rtl_priv(hw);
71 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
72 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
73 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
74 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
75 tmp1byte &= ~(BIT(0));
76 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
79 static void _rtl8723be_resume_tx_beacon(struct ieee80211_hw *hw)
81 struct rtl_priv *rtlpriv = rtl_priv(hw);
84 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
85 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
86 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
87 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
89 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
92 static void _rtl8723be_enable_bcn_sub_func(struct ieee80211_hw *hw)
94 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(1));
97 static void _rtl8723be_disable_bcn_sub_func(struct ieee80211_hw *hw)
99 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(1), 0);
102 static void _rtl8723be_set_fw_clock_on(struct ieee80211_hw *hw, u8 rpwm_val,
103 bool b_need_turn_off_ckk)
105 struct rtl_priv *rtlpriv = rtl_priv(hw);
106 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
107 bool b_support_remote_wake_up;
108 u32 count = 0, isr_regaddr, content;
109 bool b_schedule_timer = b_need_turn_off_ckk;
110 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
111 (u8 *)(&b_support_remote_wake_up));
113 if (!rtlhal->fw_ready)
115 if (!rtlpriv->psc.fw_current_inpsmode)
119 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
120 if (rtlhal->fw_clk_change_in_progress) {
121 while (rtlhal->fw_clk_change_in_progress) {
122 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
127 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
129 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
131 rtlhal->fw_clk_change_in_progress = false;
132 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
137 if (IS_IN_LOW_POWER_STATE(rtlhal->fw_ps_state)) {
138 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
140 if (FW_PS_IS_ACK(rpwm_val)) {
141 isr_regaddr = REG_HISR;
142 content = rtl_read_dword(rtlpriv, isr_regaddr);
143 while (!(content & IMR_CPWM) && (count < 500)) {
146 content = rtl_read_dword(rtlpriv, isr_regaddr);
149 if (content & IMR_CPWM) {
150 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
151 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON;
152 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
153 "Receive CPWM INT!!! Set pHalData->FwPSState = %X\n",
154 rtlhal->fw_ps_state);
158 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
159 rtlhal->fw_clk_change_in_progress = false;
160 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
161 if (b_schedule_timer)
162 mod_timer(&rtlpriv->works.fw_clockoff_timer,
163 jiffies + MSECS(10));
165 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
166 rtlhal->fw_clk_change_in_progress = false;
167 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
171 static void _rtl8723be_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
173 struct rtl_priv *rtlpriv = rtl_priv(hw);
174 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
175 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
176 struct rtl8192_tx_ring *ring;
177 enum rf_pwrstate rtstate;
178 bool b_schedule_timer = false;
181 if (!rtlhal->fw_ready)
183 if (!rtlpriv->psc.fw_current_inpsmode)
185 if (!rtlhal->allow_sw_to_change_hwclc)
187 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
188 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
191 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
192 ring = &rtlpci->tx_ring[queue];
193 if (skb_queue_len(&ring->queue)) {
194 b_schedule_timer = true;
199 if (b_schedule_timer) {
200 mod_timer(&rtlpriv->works.fw_clockoff_timer,
201 jiffies + MSECS(10));
205 if (FW_PS_STATE(rtlhal->fw_ps_state) != FW_PS_STATE_RF_OFF_LOW_PWR) {
206 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
207 if (!rtlhal->fw_clk_change_in_progress) {
208 rtlhal->fw_clk_change_in_progress = true;
209 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
210 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
211 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
212 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
214 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
215 rtlhal->fw_clk_change_in_progress = false;
216 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
218 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
219 mod_timer(&rtlpriv->works.fw_clockoff_timer,
220 jiffies + MSECS(10));
226 static void _rtl8723be_set_fw_ps_rf_on(struct ieee80211_hw *hw)
229 rpwm_val |= (FW_PS_STATE_RF_OFF | FW_PS_ACK);
230 _rtl8723be_set_fw_clock_on(hw, rpwm_val, true);
233 static void _rtl8723be_fwlps_leave(struct ieee80211_hw *hw)
235 struct rtl_priv *rtlpriv = rtl_priv(hw);
236 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
237 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
238 bool fw_current_inps = false;
239 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
241 if (ppsc->low_power_enable) {
242 rpwm_val = (FW_PS_STATE_ALL_ON | FW_PS_ACK);/* RF on */
243 _rtl8723be_set_fw_clock_on(hw, rpwm_val, false);
244 rtlhal->allow_sw_to_change_hwclc = false;
245 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
246 (u8 *)(&fw_pwrmode));
247 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
248 (u8 *)(&fw_current_inps));
250 rpwm_val = FW_PS_STATE_ALL_ON; /* RF on */
251 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
253 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
254 (u8 *)(&fw_pwrmode));
255 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
256 (u8 *)(&fw_current_inps));
261 static void _rtl8723be_fwlps_enter(struct ieee80211_hw *hw)
263 struct rtl_priv *rtlpriv = rtl_priv(hw);
264 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
265 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
266 bool fw_current_inps = true;
269 if (ppsc->low_power_enable) {
270 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR; /* RF off */
271 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
272 (u8 *)(&fw_current_inps));
273 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
274 (u8 *)(&ppsc->fwctrl_psmode));
275 rtlhal->allow_sw_to_change_hwclc = true;
276 _rtl8723be_set_fw_clock_off(hw, rpwm_val);
278 rpwm_val = FW_PS_STATE_RF_OFF; /* RF off */
279 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
280 (u8 *)(&fw_current_inps));
281 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
282 (u8 *)(&ppsc->fwctrl_psmode));
283 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
289 void rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
291 struct rtl_priv *rtlpriv = rtl_priv(hw);
292 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
293 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
297 *((u32 *)(val)) = rtlpci->receive_config;
299 case HW_VAR_RF_STATE:
300 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
302 case HW_VAR_FWLPS_RF_ON:{
303 enum rf_pwrstate rfstate;
306 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE,
308 if (rfstate == ERFOFF) {
309 *((bool *)(val)) = true;
311 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
312 val_rcr &= 0x00070000;
314 *((bool *)(val)) = false;
316 *((bool *)(val)) = true;
320 case HW_VAR_FW_PSMODE_STATUS:
321 *((bool *)(val)) = ppsc->fw_current_inpsmode;
323 case HW_VAR_CORRECT_TSF:{
325 u32 *ptsf_low = (u32 *)&tsf;
326 u32 *ptsf_high = ((u32 *)&tsf) + 1;
328 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
329 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
331 *((u64 *)(val)) = tsf;
337 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
338 "switch case %#x not processed\n", variable);
343 static void _rtl8723be_download_rsvd_page(struct ieee80211_hw *hw)
345 struct rtl_priv *rtlpriv = rtl_priv(hw);
346 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
347 u8 count = 0, dlbcn_count = 0;
348 bool b_recover = false;
350 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
351 rtl_write_byte(rtlpriv, REG_CR + 1,
352 (tmp_regcr | BIT(0)));
354 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3));
355 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0);
357 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
358 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422 & (~BIT(6)));
359 if (tmp_reg422 & BIT(6))
363 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
364 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
365 (bcnvalid_reg | BIT(0)));
366 _rtl8723be_return_beacon_queue_skb(hw);
368 rtl8723be_set_fw_rsvdpagepkt(hw, 0);
369 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
371 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
374 bcnvalid_reg = rtl_read_byte(rtlpriv,
378 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
380 if (bcnvalid_reg & BIT(0))
381 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0));
383 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
384 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4));
387 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
389 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
390 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0))));
393 void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
395 struct rtl_priv *rtlpriv = rtl_priv(hw);
396 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
397 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
398 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
399 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
403 case HW_VAR_ETHER_ADDR:
404 for (idx = 0; idx < ETH_ALEN; idx++)
405 rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]);
407 case HW_VAR_BASIC_RATE:{
408 u16 b_rate_cfg = ((u16 *)val)[0];
410 b_rate_cfg = b_rate_cfg & 0x15f;
412 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
413 rtl_write_byte(rtlpriv, REG_RRSR + 1, (b_rate_cfg >> 8) & 0xff);
414 while (b_rate_cfg > 0x1) {
415 b_rate_cfg = (b_rate_cfg >> 1);
418 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, rate_index);
422 for (idx = 0; idx < ETH_ALEN; idx++)
423 rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]);
427 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
428 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
430 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
431 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
434 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 0x0e0e);
436 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
439 case HW_VAR_SLOT_TIME:{
442 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
443 "HW_VAR_SLOT_TIME %x\n", val[0]);
445 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
447 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
448 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
453 case HW_VAR_ACK_PREAMBLE:{
455 u8 short_preamble = (bool)(*(u8 *)val);
456 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL + 2);
457 if (short_preamble) {
459 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
462 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
466 case HW_VAR_WPA_CONFIG:
467 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
469 case HW_VAR_AMPDU_MIN_SPACE:{
470 u8 min_spacing_to_set;
472 min_spacing_to_set = *((u8 *)val);
473 if (min_spacing_to_set <= 7) {
474 mac->min_space_cfg = ((mac->min_space_cfg & 0xf8) |
477 *val = min_spacing_to_set;
479 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
480 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
483 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
488 case HW_VAR_SHORTGI_DENSITY:{
491 density_to_set = *((u8 *)val);
492 mac->min_space_cfg |= (density_to_set << 3);
494 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
495 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
498 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
502 case HW_VAR_AMPDU_FACTOR:{
503 u8 regtoset_normal[4] = {0x41, 0xa8, 0x72, 0xb9};
505 u8 *p_regtoset = NULL;
508 p_regtoset = regtoset_normal;
510 factor_toset = *((u8 *)val);
511 if (factor_toset <= 3) {
512 factor_toset = (1 << (factor_toset + 2));
513 if (factor_toset > 0xf)
516 for (index = 0; index < 4; index++) {
517 if ((p_regtoset[index] & 0xf0) >
520 (p_regtoset[index] & 0x0f) |
523 if ((p_regtoset[index] & 0x0f) > factor_toset)
525 (p_regtoset[index] & 0xf0) |
528 rtl_write_byte(rtlpriv,
529 (REG_AGGLEN_LMT + index),
534 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
535 "Set HW_VAR_AMPDU_FACTOR: %#x\n",
540 case HW_VAR_AC_PARAM:{
541 u8 e_aci = *((u8 *)val);
542 rtl8723_dm_init_edca_turbo(hw);
544 if (rtlpci->acm_method != EACMWAY2_SW)
545 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL,
549 case HW_VAR_ACM_CTRL:{
550 u8 e_aci = *((u8 *)val);
551 union aci_aifsn *p_aci_aifsn =
552 (union aci_aifsn *)(&(mac->ac[0].aifs));
553 u8 acm = p_aci_aifsn->f.acm;
554 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
557 acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
562 acm_ctrl |= ACMHW_BEQEN;
565 acm_ctrl |= ACMHW_VIQEN;
568 acm_ctrl |= ACMHW_VOQEN;
571 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
572 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
579 acm_ctrl &= (~ACMHW_BEQEN);
582 acm_ctrl &= (~ACMHW_VIQEN);
585 acm_ctrl &= (~ACMHW_VOQEN);
588 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
589 "switch case %#x not processed\n",
595 rtl_dbg(rtlpriv, COMP_QOS, DBG_TRACE,
596 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
598 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
602 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
603 rtlpci->receive_config = ((u32 *)(val))[0];
605 case HW_VAR_RETRY_LIMIT:{
606 u8 retry_limit = ((u8 *)(val))[0];
608 rtl_write_word(rtlpriv, REG_RL,
609 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
610 retry_limit << RETRY_LIMIT_LONG_SHIFT);
613 case HW_VAR_DUAL_TSF_RST:
614 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
616 case HW_VAR_EFUSE_BYTES:
617 rtlefuse->efuse_usedbytes = *((u16 *)val);
619 case HW_VAR_EFUSE_USAGE:
620 rtlefuse->efuse_usedpercentage = *((u8 *)val);
623 rtl8723be_phy_set_io_cmd(hw, (*(enum io_type *)val));
625 case HW_VAR_SET_RPWM:{
628 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
631 if (rpwm_val & BIT(7)) {
632 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, (*(u8 *)val));
634 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
635 ((*(u8 *)val) | BIT(7)));
639 case HW_VAR_H2C_FW_PWRMODE:
640 rtl8723be_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
642 case HW_VAR_FW_PSMODE_STATUS:
643 ppsc->fw_current_inpsmode = *((bool *)val);
645 case HW_VAR_RESUME_CLK_ON:
646 _rtl8723be_set_fw_ps_rf_on(hw);
648 case HW_VAR_FW_LPS_ACTION:{
649 bool b_enter_fwlps = *((bool *)val);
652 _rtl8723be_fwlps_enter(hw);
654 _rtl8723be_fwlps_leave(hw);
657 case HW_VAR_H2C_FW_JOINBSSRPT:{
658 u8 mstatus = (*(u8 *)val);
660 if (mstatus == RT_MEDIA_CONNECT) {
661 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
662 _rtl8723be_download_rsvd_page(hw);
664 rtl8723be_set_fw_media_status_rpt_cmd(hw, mstatus);
667 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
668 rtl8723be_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
672 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
674 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT,
675 (u2btmp | mac->assoc_id));
678 case HW_VAR_CORRECT_TSF:{
679 u8 btype_ibss = ((u8 *)(val))[0];
682 _rtl8723be_stop_tx_beacon(hw);
684 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3));
686 rtl_write_dword(rtlpriv, REG_TSFTR,
687 (u32) (mac->tsf & 0xffffffff));
688 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
689 (u32) ((mac->tsf >> 32) & 0xffffffff));
691 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
694 _rtl8723be_resume_tx_beacon(hw);
697 case HW_VAR_KEEP_ALIVE:{
700 array[1] = *((u8 *)val);
701 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_KEEP_ALIVE_CTRL, 2, array);
705 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
706 "switch case %#x not processed\n", variable);
711 static bool _rtl8723be_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
713 struct rtl_priv *rtlpriv = rtl_priv(hw);
716 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
717 _LLT_OP(_LLT_WRITE_ACCESS);
719 rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
722 value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
723 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
726 if (count > POLLING_LLT_THRESHOLD) {
727 pr_err("Failed to polling write LLT done at address %d!\n",
737 static bool _rtl8723be_llt_table_init(struct ieee80211_hw *hw)
739 struct rtl_priv *rtlpriv = rtl_priv(hw);
748 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY,
749 (0x27FF0000 | txpktbuf_bndy));
750 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
752 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
753 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
755 rtl_write_byte(rtlpriv, 0x45D, txpktbuf_bndy);
756 rtl_write_byte(rtlpriv, REG_PBP, 0x31);
757 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
759 for (i = 0; i < (txpktbuf_bndy - 1); i++) {
760 status = _rtl8723be_llt_write(hw, i, i + 1);
765 status = _rtl8723be_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
770 for (i = txpktbuf_bndy; i < maxpage; i++) {
771 status = _rtl8723be_llt_write(hw, i, (i + 1));
776 status = _rtl8723be_llt_write(hw, maxpage, txpktbuf_bndy);
780 rtl_write_dword(rtlpriv, REG_RQPN, 0x80e40808);
781 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00);
786 static void _rtl8723be_gen_refresh_led_state(struct ieee80211_hw *hw)
788 struct rtl_priv *rtlpriv = rtl_priv(hw);
789 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
790 enum rtl_led_pin pin0 = rtlpriv->ledctl.sw_led0;
792 if (rtlpriv->rtlhal.up_first_time)
795 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
796 rtl8723be_sw_led_on(hw, pin0);
797 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
798 rtl8723be_sw_led_on(hw, pin0);
800 rtl8723be_sw_led_off(hw, pin0);
803 static bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
805 struct rtl_priv *rtlpriv = rtl_priv(hw);
806 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
807 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
808 unsigned char bytetmp;
809 unsigned short wordtmp;
811 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
813 /*Auto Power Down to CHIP-off State*/
814 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
815 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
817 /* HW Power on sequence */
818 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
819 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
820 RTL8723_NIC_ENABLE_FLOW)) {
821 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
822 "init MAC Fail as power on failure\n");
826 if (rtlpriv->cfg->ops->get_btc_status())
827 rtlpriv->btcoexist.btc_ops->btc_power_on_setting(rtlpriv);
829 bytetmp = rtl_read_byte(rtlpriv, REG_MULTI_FUNC_CTRL);
830 rtl_write_byte(rtlpriv, REG_MULTI_FUNC_CTRL, bytetmp | BIT(3));
832 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
833 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
835 bytetmp = rtl_read_byte(rtlpriv, REG_CR);
837 rtl_write_byte(rtlpriv, REG_CR, bytetmp);
840 bytetmp = rtl_read_byte(rtlpriv, REG_HWSEQ_CTRL);
842 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
845 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
846 if (bytetmp & BIT(0)) {
847 bytetmp = rtl_read_byte(rtlpriv, 0x7c);
848 rtl_write_byte(rtlpriv, 0x7c, bytetmp | BIT(6));
851 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
852 rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp | BIT(3));
853 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
854 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp & (~BIT(4)));
856 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
858 if (!rtlhal->mac_func_enable) {
859 if (!_rtl8723be_llt_table_init(hw))
863 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
864 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
866 /* Enable FW Beamformer Interrupt */
867 bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3);
868 rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6));
870 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
873 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
875 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
876 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
877 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
878 rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
880 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
881 ((u64) rtlpci->tx_ring[BEACON_QUEUE].dma) &
883 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
884 (u64) rtlpci->tx_ring[MGNT_QUEUE].dma &
886 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
887 (u64) rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
888 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
889 (u64) rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
890 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
891 (u64) rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
892 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
893 (u64) rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
894 rtl_write_dword(rtlpriv, REG_HQ_DESA,
895 (u64) rtlpci->tx_ring[HIGH_QUEUE].dma &
897 rtl_write_dword(rtlpriv, REG_RX_DESA,
898 (u64) rtlpci->rx_ring[RX_MPDU_QUEUE].dma &
901 bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 3);
902 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, bytetmp | 0x77);
904 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
906 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
908 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
910 /* <20130114, Kordan> The following setting is
911 * only for DPDT and Fixed board type.
912 * TODO: A better solution is configure it
913 * according EFUSE during the run-time.
915 rtl_set_bbreg(hw, 0x64, BIT(20), 0x0);/* 0x66[4]=0 */
916 rtl_set_bbreg(hw, 0x64, BIT(24), 0x0);/* 0x66[8]=0 */
917 rtl_set_bbreg(hw, 0x40, BIT(4), 0x0)/* 0x40[4]=0 */;
918 rtl_set_bbreg(hw, 0x40, BIT(3), 0x1)/* 0x40[3]=1 */;
919 rtl_set_bbreg(hw, 0x4C, BIT(24) | BIT(23), 0x2)/* 0x4C[24:23]=10 */;
920 rtl_set_bbreg(hw, 0x944, BIT(1) | BIT(0), 0x3)/* 0x944[1:0]=11 */;
921 rtl_set_bbreg(hw, 0x930, MASKBYTE0, 0x77)/* 0x930[7:0]=77 */;
922 rtl_set_bbreg(hw, 0x38, BIT(11), 0x1)/* 0x38[11]=1 */;
924 bytetmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
925 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, bytetmp & (~BIT(2)));
927 _rtl8723be_gen_refresh_led_state(hw);
931 static void _rtl8723be_hw_configure(struct ieee80211_hw *hw)
933 struct rtl_priv *rtlpriv = rtl_priv(hw);
934 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
937 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
938 /* Init value for RRSR. */
939 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
941 /* ARFB table 9 for 11ac 5G 2SS */
942 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
944 /* ARFB table 10 for 11ac 5G 1SS */
945 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
947 /* CF-End setting. */
948 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
950 /* 0x456 = 0x70, sugguested by Zhilin */
951 rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
953 /* Set retry limit */
954 rtl_write_word(rtlpriv, REG_RL, 0x0707);
956 /* Set Data / Response auto rate fallack retry count */
957 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
958 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
959 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
960 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
962 rtlpci->reg_bcn_ctrl_val = 0x1d;
963 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
965 /* TBTT prohibit hold time. Suggested by designer TimChen. */
966 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); /* 8 ms */
968 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
970 /*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
971 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
973 rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
975 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
977 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x1F);
980 static u8 _rtl8723be_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
982 u16 read_addr = addr & 0xfffc;
983 u8 ret = 0, tmp = 0, count = 0;
985 rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
986 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
987 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
989 while (tmp && count < 20) {
991 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
995 read_addr = REG_DBI_RDATA + addr % 4;
996 ret = rtl_read_byte(rtlpriv, read_addr);
1002 static void _rtl8723be_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
1004 u8 tmp = 0, count = 0;
1005 u16 write_addr = 0, remainder = addr % 4;
1007 /* Write DBI 1Byte Data */
1008 write_addr = REG_DBI_WDATA + remainder;
1009 rtl_write_byte(rtlpriv, write_addr, data);
1011 /* Write DBI 2Byte Address & Write Enable */
1012 write_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
1013 rtl_write_word(rtlpriv, REG_DBI_ADDR, write_addr);
1015 /* Write DBI Write Flag */
1016 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
1018 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1020 while (tmp && count < 20) {
1022 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1027 static u16 _rtl8723be_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
1030 u8 tmp = 0, count = 0;
1032 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
1033 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1035 while (tmp && count < 20) {
1037 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1042 ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
1047 static void _rtl8723be_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
1049 u8 tmp = 0, count = 0;
1051 rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
1052 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
1053 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1055 while (tmp && count < 20) {
1057 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1062 static void _rtl8723be_enable_aspm_back_door(struct ieee80211_hw *hw)
1064 struct rtl_priv *rtlpriv = rtl_priv(hw);
1068 /* <Roger_Notes> Overwrite following ePHY parameter for
1069 * some platform compatibility issue,
1070 * especially when CLKReq is enabled, 2012.11.09.
1072 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x01);
1073 if (tmp16 != 0x0663)
1074 _rtl8723be_mdio_write(rtlpriv, 0x01, 0x0663);
1076 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x04);
1077 if (tmp16 != 0x7544)
1078 _rtl8723be_mdio_write(rtlpriv, 0x04, 0x7544);
1080 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x06);
1081 if (tmp16 != 0xB880)
1082 _rtl8723be_mdio_write(rtlpriv, 0x06, 0xB880);
1084 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x07);
1085 if (tmp16 != 0x4000)
1086 _rtl8723be_mdio_write(rtlpriv, 0x07, 0x4000);
1088 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x08);
1089 if (tmp16 != 0x9003)
1090 _rtl8723be_mdio_write(rtlpriv, 0x08, 0x9003);
1092 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x09);
1093 if (tmp16 != 0x0D03)
1094 _rtl8723be_mdio_write(rtlpriv, 0x09, 0x0D03);
1096 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0A);
1097 if (tmp16 != 0x4037)
1098 _rtl8723be_mdio_write(rtlpriv, 0x0A, 0x4037);
1100 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0B);
1101 if (tmp16 != 0x0070)
1102 _rtl8723be_mdio_write(rtlpriv, 0x0B, 0x0070);
1104 /* Configuration Space offset 0x70f BIT7 is used to control L0S */
1105 tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x70f);
1106 _rtl8723be_dbi_write(rtlpriv, 0x70f, tmp8 | BIT(7) |
1107 ASPM_L1_LATENCY << 3);
1109 /* Configuration Space offset 0x719 Bit3 is for L1
1110 * BIT4 is for clock request
1112 tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x719);
1113 _rtl8723be_dbi_write(rtlpriv, 0x719, tmp8 | BIT(3) | BIT(4));
1116 void rtl8723be_enable_hw_security_config(struct ieee80211_hw *hw)
1118 struct rtl_priv *rtlpriv = rtl_priv(hw);
1121 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
1122 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1123 rtlpriv->sec.pairwise_enc_algorithm,
1124 rtlpriv->sec.group_enc_algorithm);
1126 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1127 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
1128 "not open hw encryption\n");
1132 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1134 if (rtlpriv->sec.use_defaultkey) {
1135 sec_reg_value |= SCR_TXUSEDK;
1136 sec_reg_value |= SCR_RXUSEDK;
1139 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1141 rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
1143 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
1144 "The SECR-value %x\n", sec_reg_value);
1146 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1149 static void _rtl8723be_poweroff_adapter(struct ieee80211_hw *hw)
1151 struct rtl_priv *rtlpriv = rtl_priv(hw);
1152 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1155 rtlhal->mac_func_enable = false;
1156 /* Combo (PCIe + USB) Card and PCIe-MF Card */
1157 /* 1. Run LPS WL RFOFF flow */
1158 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1159 PWR_INTF_PCI_MSK, RTL8723_NIC_LPS_ENTER_FLOW);
1161 /* 2. 0x1F[7:0] = 0 */
1163 /* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */
1164 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1166 rtl8723be_firmware_selfreset(hw);
1169 /* Reset MCU. Suggested by Filen. */
1170 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1171 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
1173 /* g. MCUFWDL 0x80[1:0]=0 */
1174 /* reset MCU ready status */
1175 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1177 /* HW card disable configuration. */
1178 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1179 PWR_INTF_PCI_MSK, RTL8723_NIC_DISABLE_FLOW);
1181 /* Reset MCU IO Wrapper */
1182 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1183 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1184 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1185 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1187 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1188 /* lock ISO/CLK/Power control register */
1189 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1192 static bool _rtl8723be_check_pcie_dma_hang(struct rtl_priv *rtlpriv)
1196 /* write reg 0x350 Bit[26]=1. Enable debug port. */
1197 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1198 if (!(tmp & BIT(2))) {
1199 rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2)));
1200 mdelay(100); /* Suggested by DD Justin_tsai. */
1203 /* read reg 0x350 Bit[25] if 1 : RX hang
1204 * read reg 0x350 Bit[24] if 1 : TX hang
1206 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1207 if ((tmp & BIT(0)) || (tmp & BIT(1))) {
1208 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1209 "CheckPcieDMAHang8723BE(): true!!\n");
1215 static void _rtl8723be_reset_pcie_interface_dma(struct rtl_priv *rtlpriv,
1219 bool release_mac_rx_pause;
1220 u8 backup_pcie_dma_pause;
1222 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1223 "ResetPcieInterfaceDMA8723BE()\n");
1225 /* Revise Note: Follow the document "PCIe RX DMA Hang Reset Flow_v03"
1226 * released by SD1 Alan.
1227 * 2013.05.07, by tynli.
1230 /* 1. disable register write lock
1231 * write 0x1C bit[1:0] = 2'h0
1232 * write 0xCC bit[2] = 1'b1
1234 tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
1235 tmp &= ~(BIT(1) | BIT(0));
1236 rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
1237 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1239 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1241 /* 2. Check and pause TRX DMA
1242 * write 0x284 bit[18] = 1'b1
1243 * write 0x301 = 0xFF
1245 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1247 /* Already pause before the function for another purpose. */
1248 release_mac_rx_pause = false;
1250 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1251 release_mac_rx_pause = true;
1254 backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1);
1255 if (backup_pcie_dma_pause != 0xFF)
1256 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF);
1259 /* 3. reset TRX function
1260 * write 0x100 = 0x00
1262 rtl_write_byte(rtlpriv, REG_CR, 0);
1265 /* 4. Reset PCIe DMA
1266 * write 0x003 bit[0] = 0
1268 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1270 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1272 /* 5. Enable PCIe DMA
1273 * write 0x003 bit[0] = 1
1275 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1277 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1280 /* 6. enable TRX function
1281 * write 0x100 = 0xFF
1283 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1285 /* We should init LLT & RQPN and
1286 * prepare Tx/Rx descrptor address later
1287 * because MAC function is reset.
1291 /* 7. Restore PCIe autoload down bit
1292 * write 0xF8 bit[17] = 1'b1
1294 tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2);
1296 rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp);
1298 /* In MAC power on state, BB and RF maybe in ON state,
1299 * if we release TRx DMA here
1300 * it will cause packets to be started to Tx/Rx,
1301 * so we release Tx/Rx DMA later.
1303 if (!mac_power_on) {
1304 /* 8. release TRX DMA
1305 * write 0x284 bit[18] = 1'b0
1306 * write 0x301 = 0x00
1308 if (release_mac_rx_pause) {
1309 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1310 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL,
1313 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1,
1314 backup_pcie_dma_pause);
1317 /* 9. lock system register
1318 * write 0xCC bit[2] = 1'b0
1320 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1322 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1325 int rtl8723be_hw_init(struct ieee80211_hw *hw)
1327 struct rtl_priv *rtlpriv = rtl_priv(hw);
1328 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1329 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1330 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1331 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1332 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1333 bool rtstatus = true;
1336 unsigned long flags;
1338 /* reenable interrupts to not interfere with other devices */
1339 local_save_flags(flags);
1342 rtlhal->fw_ready = false;
1343 rtlpriv->rtlhal.being_init_adapter = true;
1344 rtlpriv->intf_ops->disable_aspm(hw);
1346 tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
1347 if (tmp_u1b != 0 && tmp_u1b != 0xea) {
1348 rtlhal->mac_func_enable = true;
1350 rtlhal->mac_func_enable = false;
1351 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON;
1354 if (_rtl8723be_check_pcie_dma_hang(rtlpriv)) {
1355 _rtl8723be_reset_pcie_interface_dma(rtlpriv,
1356 rtlhal->mac_func_enable);
1357 rtlhal->mac_func_enable = false;
1359 if (rtlhal->mac_func_enable) {
1360 _rtl8723be_poweroff_adapter(hw);
1361 rtlhal->mac_func_enable = false;
1363 rtstatus = _rtl8723be_init_mac(hw);
1365 pr_err("Init MAC failed\n");
1370 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
1371 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b & 0x7F);
1373 err = rtl8723_download_fw(hw, true, FW_8723B_POLLING_TIMEOUT_COUNT);
1375 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1376 "Failed to download FW. Init HW without FW now..\n");
1380 rtlhal->fw_ready = true;
1382 rtlhal->last_hmeboxnum = 0;
1383 rtl8723be_phy_mac_config(hw);
1384 /* because last function modify RCR, so we update
1385 * rcr var here, or TP will unstable for receive_config
1386 * is wrong, RX RCR_ACRC32 will cause TP unstable & Rx
1387 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1389 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
1390 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1391 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1393 rtl8723be_phy_bb_config(hw);
1394 rtl8723be_phy_rf_config(hw);
1396 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0,
1397 RF_CHNLBW, RFREG_OFFSET_MASK);
1398 rtlphy->rfreg_chnlval[1] = rtl_get_rfreg(hw, (enum radio_path)1,
1399 RF_CHNLBW, RFREG_OFFSET_MASK);
1400 rtlphy->rfreg_chnlval[0] &= 0xFFF03FF;
1401 rtlphy->rfreg_chnlval[0] |= (BIT(10) | BIT(11));
1403 _rtl8723be_hw_configure(hw);
1404 rtlhal->mac_func_enable = true;
1405 rtl_cam_reset_all_entry(hw);
1406 rtl8723be_enable_hw_security_config(hw);
1408 ppsc->rfpwr_state = ERFON;
1410 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1411 _rtl8723be_enable_aspm_back_door(hw);
1412 rtlpriv->intf_ops->enable_aspm(hw);
1414 rtl8723be_bt_hw_init(hw);
1416 if (ppsc->rfpwr_state == ERFON) {
1417 rtl8723be_phy_set_rfpath_switch(hw, 1);
1418 /* when use 1ant NIC, iqk will disturb BT music
1419 * root cause is not clear now, is something
1420 * related with 'mdelay' and Reg[0x948]
1422 if (rtlpriv->btcoexist.btc_info.ant_num == ANT_X2 ||
1423 !rtlpriv->cfg->ops->get_btc_status()) {
1424 rtl8723be_phy_iq_calibrate(hw,
1425 (rtlphy->iqk_initialized ?
1427 rtlphy->iqk_initialized = true;
1429 rtl8723be_dm_check_txpower_tracking(hw);
1430 rtl8723be_phy_lc_calibrate(hw);
1432 rtl_write_byte(rtlpriv, REG_NAV_UPPER, ((30000 + 127) / 128));
1434 /* Release Rx DMA. */
1435 tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1436 if (tmp_u1b & BIT(2)) {
1437 /* Release Rx DMA if needed */
1438 tmp_u1b &= (~BIT(2));
1439 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
1441 /* Release Tx/Rx PCIE DMA. */
1442 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
1444 rtl8723be_dm_init(hw);
1446 local_irq_restore(flags);
1447 rtlpriv->rtlhal.being_init_adapter = false;
1451 static enum version_8723e _rtl8723be_read_chip_version(struct ieee80211_hw *hw)
1453 struct rtl_priv *rtlpriv = rtl_priv(hw);
1454 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1455 enum version_8723e version = VERSION_UNKNOWN;
1458 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
1459 if ((value32 & (CHIP_8723B)) != CHIP_8723B)
1460 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "unknown chip version\n");
1462 version = (enum version_8723e)CHIP_8723B;
1464 rtlphy->rf_type = RF_1T1R;
1466 /* treat rtl8723be chip as MP version in default */
1467 version = (enum version_8723e)(version | NORMAL_CHIP);
1469 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
1471 version |= (enum version_8723e)(value32 & CHIP_VER_RTL_MASK);
1473 if (((value32 & EXT_VENDOR_ID) >> 18) == 0x01)
1474 version = (enum version_8723e)(version | CHIP_VENDOR_SMIC);
1476 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1477 "Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
1478 "RF_2T2R" : "RF_1T1R");
1483 static int _rtl8723be_set_media_status(struct ieee80211_hw *hw,
1484 enum nl80211_iftype type)
1486 struct rtl_priv *rtlpriv = rtl_priv(hw);
1487 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1488 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1489 u8 mode = MSR_NOLINK;
1492 case NL80211_IFTYPE_UNSPECIFIED:
1494 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1495 "Set Network type to NO LINK!\n");
1497 case NL80211_IFTYPE_ADHOC:
1498 case NL80211_IFTYPE_MESH_POINT:
1500 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1501 "Set Network type to Ad Hoc!\n");
1503 case NL80211_IFTYPE_STATION:
1505 ledaction = LED_CTL_LINK;
1506 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1507 "Set Network type to STA!\n");
1509 case NL80211_IFTYPE_AP:
1511 ledaction = LED_CTL_LINK;
1512 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1513 "Set Network type to AP!\n");
1516 pr_err("Network type %d not support!\n", type);
1520 /* MSR_INFRA == Link in infrastructure network;
1521 * MSR_ADHOC == Link in ad hoc network;
1522 * Therefore, check link state is necessary.
1524 * MSR_AP == AP mode; link state is not cared here.
1526 if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1528 ledaction = LED_CTL_NO_LINK;
1531 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1532 _rtl8723be_stop_tx_beacon(hw);
1533 _rtl8723be_enable_bcn_sub_func(hw);
1534 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1535 _rtl8723be_resume_tx_beacon(hw);
1536 _rtl8723be_disable_bcn_sub_func(hw);
1538 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1539 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1543 rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1544 rtlpriv->cfg->ops->led_control(hw, ledaction);
1546 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1548 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
1552 void rtl8723be_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1554 struct rtl_priv *rtlpriv = rtl_priv(hw);
1555 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1556 u32 reg_rcr = rtlpci->receive_config;
1558 if (rtlpriv->psc.rfpwr_state != ERFON)
1562 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1563 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1565 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4));
1566 } else if (!check_bssid) {
1567 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
1568 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0);
1569 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1575 int rtl8723be_set_network_type(struct ieee80211_hw *hw,
1576 enum nl80211_iftype type)
1578 struct rtl_priv *rtlpriv = rtl_priv(hw);
1580 if (_rtl8723be_set_media_status(hw, type))
1583 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1584 if (type != NL80211_IFTYPE_AP)
1585 rtl8723be_set_check_bssid(hw, true);
1587 rtl8723be_set_check_bssid(hw, false);
1593 /* don't set REG_EDCA_BE_PARAM here
1594 * because mac80211 will send pkt when scan
1596 void rtl8723be_set_qos(struct ieee80211_hw *hw, int aci)
1598 struct rtl_priv *rtlpriv = rtl_priv(hw);
1600 rtl8723_dm_init_edca_turbo(hw);
1603 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
1608 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
1611 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
1614 WARN_ONCE(true, "rtl8723be: invalid aci: %d !\n", aci);
1619 void rtl8723be_enable_interrupt(struct ieee80211_hw *hw)
1621 struct rtl_priv *rtlpriv = rtl_priv(hw);
1622 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1624 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
1625 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
1626 rtlpci->irq_enabled = true;
1628 /*enable system interrupt*/
1629 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
1632 void rtl8723be_disable_interrupt(struct ieee80211_hw *hw)
1634 struct rtl_priv *rtlpriv = rtl_priv(hw);
1635 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1637 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1638 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1639 rtlpci->irq_enabled = false;
1640 /*synchronize_irq(rtlpci->pdev->irq);*/
1643 void rtl8723be_card_disable(struct ieee80211_hw *hw)
1645 struct rtl_priv *rtlpriv = rtl_priv(hw);
1646 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1647 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1648 enum nl80211_iftype opmode;
1650 mac->link_state = MAC80211_NOLINK;
1651 opmode = NL80211_IFTYPE_UNSPECIFIED;
1652 _rtl8723be_set_media_status(hw, opmode);
1653 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1654 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
1655 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1656 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1657 _rtl8723be_poweroff_adapter(hw);
1659 /* after power off we should do iqk again */
1660 if (!rtlpriv->cfg->ops->get_btc_status())
1661 rtlpriv->phy.iqk_initialized = false;
1664 void rtl8723be_interrupt_recognized(struct ieee80211_hw *hw,
1665 struct rtl_int *intvec)
1667 struct rtl_priv *rtlpriv = rtl_priv(hw);
1668 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1670 intvec->inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
1671 rtl_write_dword(rtlpriv, ISR, intvec->inta);
1673 intvec->intb = rtl_read_dword(rtlpriv, REG_HISRE) &
1674 rtlpci->irq_mask[1];
1675 rtl_write_dword(rtlpriv, REG_HISRE, intvec->intb);
1678 void rtl8723be_set_beacon_related_registers(struct ieee80211_hw *hw)
1680 struct rtl_priv *rtlpriv = rtl_priv(hw);
1681 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1682 u16 bcn_interval, atim_window;
1684 bcn_interval = mac->beacon_interval;
1685 atim_window = 2; /*FIX MERGE */
1686 rtl8723be_disable_interrupt(hw);
1687 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
1688 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1689 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
1690 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
1691 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
1692 rtl_write_byte(rtlpriv, 0x606, 0x30);
1693 rtl8723be_enable_interrupt(hw);
1696 void rtl8723be_set_beacon_interval(struct ieee80211_hw *hw)
1698 struct rtl_priv *rtlpriv = rtl_priv(hw);
1699 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1700 u16 bcn_interval = mac->beacon_interval;
1702 rtl_dbg(rtlpriv, COMP_BEACON, DBG_DMESG,
1703 "beacon_interval:%d\n", bcn_interval);
1704 rtl8723be_disable_interrupt(hw);
1705 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1706 rtl8723be_enable_interrupt(hw);
1709 void rtl8723be_update_interrupt_mask(struct ieee80211_hw *hw,
1710 u32 add_msr, u32 rm_msr)
1712 struct rtl_priv *rtlpriv = rtl_priv(hw);
1713 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1715 rtl_dbg(rtlpriv, COMP_INTR, DBG_LOUD,
1716 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
1719 rtlpci->irq_mask[0] |= add_msr;
1721 rtlpci->irq_mask[0] &= (~rm_msr);
1722 rtl8723be_disable_interrupt(hw);
1723 rtl8723be_enable_interrupt(hw);
1726 static u8 _rtl8723be_get_chnl_group(u8 chnl)
1739 static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1740 struct txpower_info_2g *pw2g,
1741 struct txpower_info_5g *pw5g,
1742 bool autoload_fail, u8 *hwinfo)
1744 struct rtl_priv *rtlpriv = rtl_priv(hw);
1745 u32 path, addr = EEPROM_TX_PWR_INX, group, cnt = 0;
1747 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1748 "hal_ReadPowerValueFromPROM8723BE(): PROMContent[0x%x]=0x%x\n",
1749 (addr + 1), hwinfo[addr + 1]);
1750 if (0xFF == hwinfo[addr + 1]) /*YJ,add,120316*/
1751 autoload_fail = true;
1753 if (autoload_fail) {
1754 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1755 "auto load fail : Use Default value!\n");
1756 for (path = 0; path < MAX_RF_PATH; path++) {
1757 /* 2.4G default value */
1758 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1759 pw2g->index_cck_base[path][group] = 0x2D;
1760 pw2g->index_bw40_base[path][group] = 0x2D;
1762 for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
1764 pw2g->bw20_diff[path][0] = 0x02;
1765 pw2g->ofdm_diff[path][0] = 0x04;
1767 pw2g->bw20_diff[path][cnt] = 0xFE;
1768 pw2g->bw40_diff[path][cnt] = 0xFE;
1769 pw2g->cck_diff[path][cnt] = 0xFE;
1770 pw2g->ofdm_diff[path][cnt] = 0xFE;
1777 for (path = 0; path < MAX_RF_PATH; path++) {
1778 /*2.4G default value*/
1779 for (group = 0; group < MAX_CHNL_GROUP_24G; group++) {
1780 pw2g->index_cck_base[path][group] = hwinfo[addr++];
1781 if (pw2g->index_cck_base[path][group] == 0xFF)
1782 pw2g->index_cck_base[path][group] = 0x2D;
1785 for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++) {
1786 pw2g->index_bw40_base[path][group] = hwinfo[addr++];
1787 if (pw2g->index_bw40_base[path][group] == 0xFF)
1788 pw2g->index_bw40_base[path][group] = 0x2D;
1790 for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
1792 pw2g->bw40_diff[path][cnt] = 0;
1793 if (hwinfo[addr] == 0xFF) {
1794 pw2g->bw20_diff[path][cnt] = 0x02;
1796 pw2g->bw20_diff[path][cnt] =
1797 (hwinfo[addr] & 0xf0) >> 4;
1798 /*bit sign number to 8 bit sign number*/
1799 if (pw2g->bw20_diff[path][cnt] & BIT(3))
1800 pw2g->bw20_diff[path][cnt] |=
1804 if (hwinfo[addr] == 0xFF) {
1805 pw2g->ofdm_diff[path][cnt] = 0x04;
1807 pw2g->ofdm_diff[path][cnt] =
1808 (hwinfo[addr] & 0x0f);
1809 /*bit sign number to 8 bit sign number*/
1810 if (pw2g->ofdm_diff[path][cnt] & BIT(3))
1811 pw2g->ofdm_diff[path][cnt] |=
1814 pw2g->cck_diff[path][cnt] = 0;
1817 if (hwinfo[addr] == 0xFF) {
1818 pw2g->bw40_diff[path][cnt] = 0xFE;
1820 pw2g->bw40_diff[path][cnt] =
1821 (hwinfo[addr] & 0xf0) >> 4;
1822 if (pw2g->bw40_diff[path][cnt] & BIT(3))
1823 pw2g->bw40_diff[path][cnt] |=
1827 if (hwinfo[addr] == 0xFF) {
1828 pw2g->bw20_diff[path][cnt] = 0xFE;
1830 pw2g->bw20_diff[path][cnt] =
1831 (hwinfo[addr] & 0x0f);
1832 if (pw2g->bw20_diff[path][cnt] & BIT(3))
1833 pw2g->bw20_diff[path][cnt] |=
1838 if (hwinfo[addr] == 0xFF) {
1839 pw2g->ofdm_diff[path][cnt] = 0xFE;
1841 pw2g->ofdm_diff[path][cnt] =
1842 (hwinfo[addr] & 0xf0) >> 4;
1843 if (pw2g->ofdm_diff[path][cnt] & BIT(3))
1844 pw2g->ofdm_diff[path][cnt] |=
1848 if (hwinfo[addr] == 0xFF)
1849 pw2g->cck_diff[path][cnt] = 0xFE;
1851 pw2g->cck_diff[path][cnt] =
1852 (hwinfo[addr] & 0x0f);
1853 if (pw2g->cck_diff[path][cnt] & BIT(3))
1854 pw2g->cck_diff[path][cnt] |=
1861 /*5G default value*/
1862 for (group = 0; group < MAX_CHNL_GROUP_5G; group++) {
1863 pw5g->index_bw40_base[path][group] = hwinfo[addr++];
1864 if (pw5g->index_bw40_base[path][group] == 0xFF)
1865 pw5g->index_bw40_base[path][group] = 0xFE;
1868 for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
1870 pw5g->bw40_diff[path][cnt] = 0;
1872 if (hwinfo[addr] == 0xFF) {
1873 pw5g->bw20_diff[path][cnt] = 0;
1875 pw5g->bw20_diff[path][0] =
1876 (hwinfo[addr] & 0xf0) >> 4;
1877 if (pw5g->bw20_diff[path][cnt] & BIT(3))
1878 pw5g->bw20_diff[path][cnt] |=
1882 if (hwinfo[addr] == 0xFF)
1883 pw5g->ofdm_diff[path][cnt] = 0x04;
1885 pw5g->ofdm_diff[path][0] =
1886 (hwinfo[addr] & 0x0f);
1887 if (pw5g->ofdm_diff[path][cnt] & BIT(3))
1888 pw5g->ofdm_diff[path][cnt] |=
1893 if (hwinfo[addr] == 0xFF) {
1894 pw5g->bw40_diff[path][cnt] = 0xFE;
1896 pw5g->bw40_diff[path][cnt] =
1897 (hwinfo[addr] & 0xf0) >> 4;
1898 if (pw5g->bw40_diff[path][cnt] & BIT(3))
1899 pw5g->bw40_diff[path][cnt] |= 0xF0;
1902 if (hwinfo[addr] == 0xFF) {
1903 pw5g->bw20_diff[path][cnt] = 0xFE;
1905 pw5g->bw20_diff[path][cnt] =
1906 (hwinfo[addr] & 0x0f);
1907 if (pw5g->bw20_diff[path][cnt] & BIT(3))
1908 pw5g->bw20_diff[path][cnt] |= 0xF0;
1914 if (hwinfo[addr] == 0xFF) {
1915 pw5g->ofdm_diff[path][1] = 0xFE;
1916 pw5g->ofdm_diff[path][2] = 0xFE;
1918 pw5g->ofdm_diff[path][1] = (hwinfo[addr] & 0xf0) >> 4;
1919 pw5g->ofdm_diff[path][2] = (hwinfo[addr] & 0x0f);
1923 if (hwinfo[addr] == 0xFF)
1924 pw5g->ofdm_diff[path][3] = 0xFE;
1926 pw5g->ofdm_diff[path][3] = (hwinfo[addr] & 0x0f);
1929 for (cnt = 1; cnt < MAX_TX_COUNT; cnt++) {
1930 if (pw5g->ofdm_diff[path][cnt] == 0xFF)
1931 pw5g->ofdm_diff[path][cnt] = 0xFE;
1932 else if (pw5g->ofdm_diff[path][cnt] & BIT(3))
1933 pw5g->ofdm_diff[path][cnt] |= 0xF0;
1938 static void _rtl8723be_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1942 struct rtl_priv *rtlpriv = rtl_priv(hw);
1943 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1944 struct txpower_info_2g pw2g;
1945 struct txpower_info_5g pw5g;
1949 _rtl8723be_read_power_value_fromprom(hw, &pw2g, &pw5g, autoload_fail,
1952 for (rf_path = 0; rf_path < 2; rf_path++) {
1953 for (i = 0; i < 14; i++) {
1954 index = _rtl8723be_get_chnl_group(i+1);
1956 rtlefuse->txpwrlevel_cck[rf_path][i] =
1957 pw2g.index_cck_base[rf_path][index];
1958 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
1959 pw2g.index_bw40_base[rf_path][index];
1961 for (i = 0; i < MAX_TX_COUNT; i++) {
1962 rtlefuse->txpwr_ht20diff[rf_path][i] =
1963 pw2g.bw20_diff[rf_path][i];
1964 rtlefuse->txpwr_ht40diff[rf_path][i] =
1965 pw2g.bw40_diff[rf_path][i];
1966 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
1967 pw2g.ofdm_diff[rf_path][i];
1970 for (i = 0; i < 14; i++) {
1971 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1972 "RF(%d)-Ch(%d) [CCK / HT40_1S ] = [0x%x / 0x%x ]\n",
1974 rtlefuse->txpwrlevel_cck[rf_path][i],
1975 rtlefuse->txpwrlevel_ht40_1s[rf_path][i]);
1980 rtlefuse->eeprom_thermalmeter =
1981 hwinfo[EEPROM_THERMAL_METER_88E];
1983 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1985 if (rtlefuse->eeprom_thermalmeter == 0xff || autoload_fail) {
1986 rtlefuse->apk_thermalmeterignore = true;
1987 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1990 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
1991 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1992 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
1994 if (!autoload_fail) {
1995 rtlefuse->eeprom_regulatory =
1996 hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x07;/*bit0~2*/
1997 if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
1998 rtlefuse->eeprom_regulatory = 0;
2000 rtlefuse->eeprom_regulatory = 0;
2002 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2003 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2006 static u8 _rtl8723be_read_package_type(struct ieee80211_hw *hw)
2011 efuse_power_switch(hw, false, true);
2012 if (!efuse_one_byte_read(hw, 0x1FB, &value))
2014 efuse_power_switch(hw, false, false);
2016 switch (value & 0x7) {
2018 package_type = PACKAGE_TFBGA79;
2021 package_type = PACKAGE_TFBGA90;
2024 package_type = PACKAGE_QFN68;
2027 package_type = PACKAGE_TFBGA80;
2030 package_type = PACKAGE_DEFAULT;
2034 return package_type;
2037 static void _rtl8723be_read_adapter_info(struct ieee80211_hw *hw,
2040 struct rtl_priv *rtlpriv = rtl_priv(hw);
2041 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2042 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2043 static const int params[] = {
2044 RTL8723BE_EEPROM_ID, EEPROM_VID, EEPROM_DID,
2045 EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR,
2046 EEPROM_CHANNELPLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID,
2047 COUNTRY_CODE_WORLD_WIDE_13
2051 bool is_toshiba_smid1 = false;
2052 bool is_toshiba_smid2 = false;
2053 bool is_samsung_smid = false;
2054 bool is_lenovo_smid = false;
2055 static const u16 toshiba_smid1[] = {
2056 0x6151, 0x6152, 0x6154, 0x6155, 0x6177, 0x6178, 0x6179, 0x6180,
2057 0x7151, 0x7152, 0x7154, 0x7155, 0x7177, 0x7178, 0x7179, 0x7180,
2058 0x8151, 0x8152, 0x8154, 0x8155, 0x8181, 0x8182, 0x8184, 0x8185,
2059 0x9151, 0x9152, 0x9154, 0x9155, 0x9181, 0x9182, 0x9184, 0x9185
2061 static const u16 toshiba_smid2[] = {
2062 0x6181, 0x6184, 0x6185, 0x7181, 0x7182, 0x7184, 0x7185, 0x8181,
2063 0x8182, 0x8184, 0x8185, 0x9181, 0x9182, 0x9184, 0x9185
2065 static const u16 samsung_smid[] = {
2066 0x6191, 0x6192, 0x6193, 0x7191, 0x7192, 0x7193, 0x8191, 0x8192,
2067 0x8193, 0x9191, 0x9192, 0x9193
2069 static const u16 lenovo_smid[] = {
2070 0x8195, 0x9195, 0x7194, 0x8200, 0x8201, 0x8202, 0x9199, 0x9200
2074 /* needs to be added */
2078 hwinfo = kzalloc(HWSET_MAX_SIZE, GFP_KERNEL);
2082 if (rtl_get_hwinfo(hw, rtlpriv, HWSET_MAX_SIZE, hwinfo, params))
2086 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8723BE];
2087 if (rtlefuse->crystalcap == 0xFF)
2088 rtlefuse->crystalcap = 0x20;
2090 _rtl8723be_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
2093 rtl8723be_read_bt_coexist_info_from_hwpg(hw,
2094 rtlefuse->autoload_failflag,
2097 if (rtlpriv->btcoexist.btc_info.btcoexist == 1)
2098 rtlefuse->board_type |= BIT(2); /* ODM_BOARD_BT */
2100 rtlhal->board_type = rtlefuse->board_type;
2101 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2102 "board_type = 0x%x\n", rtlefuse->board_type);
2104 rtlhal->package_type = _rtl8723be_read_package_type(hw);
2106 /* set channel plan from efuse */
2107 rtlefuse->channel_plan = rtlefuse->eeprom_channelplan;
2109 if (rtlhal->oem_id == RT_CID_DEFAULT) {
2110 /* Does this one have a Toshiba SMID from group 1? */
2111 for (i = 0; i < ARRAY_SIZE(toshiba_smid1); i++) {
2112 if (rtlefuse->eeprom_smid == toshiba_smid1[i]) {
2113 is_toshiba_smid1 = true;
2117 /* Does this one have a Toshiba SMID from group 2? */
2118 for (i = 0; i < ARRAY_SIZE(toshiba_smid2); i++) {
2119 if (rtlefuse->eeprom_smid == toshiba_smid2[i]) {
2120 is_toshiba_smid2 = true;
2124 /* Does this one have a Samsung SMID? */
2125 for (i = 0; i < ARRAY_SIZE(samsung_smid); i++) {
2126 if (rtlefuse->eeprom_smid == samsung_smid[i]) {
2127 is_samsung_smid = true;
2131 /* Does this one have a Lenovo SMID? */
2132 for (i = 0; i < ARRAY_SIZE(lenovo_smid); i++) {
2133 if (rtlefuse->eeprom_smid == lenovo_smid[i]) {
2134 is_lenovo_smid = true;
2138 switch (rtlefuse->eeprom_oemid) {
2139 case EEPROM_CID_DEFAULT:
2140 if (rtlefuse->eeprom_did == 0x8176) {
2141 if (rtlefuse->eeprom_svid == 0x10EC &&
2143 rtlhal->oem_id = RT_CID_TOSHIBA;
2144 } else if (rtlefuse->eeprom_svid == 0x1025) {
2145 rtlhal->oem_id = RT_CID_819X_ACER;
2146 } else if (rtlefuse->eeprom_svid == 0x10EC &&
2148 rtlhal->oem_id = RT_CID_819X_SAMSUNG;
2149 } else if (rtlefuse->eeprom_svid == 0x10EC &&
2151 rtlhal->oem_id = RT_CID_819X_LENOVO;
2152 } else if ((rtlefuse->eeprom_svid == 0x10EC &&
2153 rtlefuse->eeprom_smid == 0x8197) ||
2154 (rtlefuse->eeprom_svid == 0x10EC &&
2155 rtlefuse->eeprom_smid == 0x9196)) {
2156 rtlhal->oem_id = RT_CID_819X_CLEVO;
2157 } else if ((rtlefuse->eeprom_svid == 0x1028 &&
2158 rtlefuse->eeprom_smid == 0x8194) ||
2159 (rtlefuse->eeprom_svid == 0x1028 &&
2160 rtlefuse->eeprom_smid == 0x8198) ||
2161 (rtlefuse->eeprom_svid == 0x1028 &&
2162 rtlefuse->eeprom_smid == 0x9197) ||
2163 (rtlefuse->eeprom_svid == 0x1028 &&
2164 rtlefuse->eeprom_smid == 0x9198)) {
2165 rtlhal->oem_id = RT_CID_819X_DELL;
2166 } else if ((rtlefuse->eeprom_svid == 0x103C &&
2167 rtlefuse->eeprom_smid == 0x1629)) {
2168 rtlhal->oem_id = RT_CID_819X_HP;
2169 } else if ((rtlefuse->eeprom_svid == 0x1A32 &&
2170 rtlefuse->eeprom_smid == 0x2315)) {
2171 rtlhal->oem_id = RT_CID_819X_QMI;
2172 } else if ((rtlefuse->eeprom_svid == 0x10EC &&
2173 rtlefuse->eeprom_smid == 0x8203)) {
2174 rtlhal->oem_id = RT_CID_819X_PRONETS;
2175 } else if ((rtlefuse->eeprom_svid == 0x1043 &&
2176 rtlefuse->eeprom_smid == 0x84B5)) {
2177 rtlhal->oem_id = RT_CID_819X_EDIMAX_ASUS;
2179 rtlhal->oem_id = RT_CID_DEFAULT;
2181 } else if (rtlefuse->eeprom_did == 0x8178) {
2182 if (rtlefuse->eeprom_svid == 0x10EC &&
2184 rtlhal->oem_id = RT_CID_TOSHIBA;
2185 else if (rtlefuse->eeprom_svid == 0x1025)
2186 rtlhal->oem_id = RT_CID_819X_ACER;
2187 else if ((rtlefuse->eeprom_svid == 0x10EC &&
2188 rtlefuse->eeprom_smid == 0x8186))
2189 rtlhal->oem_id = RT_CID_819X_PRONETS;
2190 else if ((rtlefuse->eeprom_svid == 0x1043 &&
2191 rtlefuse->eeprom_smid == 0x84B6))
2193 RT_CID_819X_EDIMAX_ASUS;
2195 rtlhal->oem_id = RT_CID_DEFAULT;
2197 rtlhal->oem_id = RT_CID_DEFAULT;
2200 case EEPROM_CID_TOSHIBA:
2201 rtlhal->oem_id = RT_CID_TOSHIBA;
2203 case EEPROM_CID_CCX:
2204 rtlhal->oem_id = RT_CID_CCX;
2206 case EEPROM_CID_QMI:
2207 rtlhal->oem_id = RT_CID_819X_QMI;
2209 case EEPROM_CID_WHQL:
2212 rtlhal->oem_id = RT_CID_DEFAULT;
2220 static void _rtl8723be_hal_customized_behavior(struct ieee80211_hw *hw)
2222 struct rtl_priv *rtlpriv = rtl_priv(hw);
2223 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2225 rtlpriv->ledctl.led_opendrain = true;
2226 switch (rtlhal->oem_id) {
2227 case RT_CID_819X_HP:
2228 rtlpriv->ledctl.led_opendrain = true;
2230 case RT_CID_819X_LENOVO:
2231 case RT_CID_DEFAULT:
2232 case RT_CID_TOSHIBA:
2234 case RT_CID_819X_ACER:
2239 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
2240 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
2243 void rtl8723be_read_eeprom_info(struct ieee80211_hw *hw)
2245 struct rtl_priv *rtlpriv = rtl_priv(hw);
2246 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2247 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2248 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2251 rtlhal->version = _rtl8723be_read_chip_version(hw);
2252 if (get_rf_type(rtlphy) == RF_1T1R)
2253 rtlpriv->dm.rfpath_rxenable[0] = true;
2255 rtlpriv->dm.rfpath_rxenable[0] =
2256 rtlpriv->dm.rfpath_rxenable[1] = true;
2257 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
2259 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
2260 if (tmp_u1b & BIT(4)) {
2261 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
2262 rtlefuse->epromtype = EEPROM_93C46;
2264 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
2265 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
2267 if (tmp_u1b & BIT(5)) {
2268 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2269 rtlefuse->autoload_failflag = false;
2270 _rtl8723be_read_adapter_info(hw, false);
2272 pr_err("Autoload ERR!!\n");
2274 _rtl8723be_hal_customized_behavior(hw);
2277 static u8 _rtl8723be_mrate_idx_to_arfr_id(struct ieee80211_hw *hw,
2281 switch (rate_index) {
2282 case RATR_INX_WIRELESS_NGB:
2285 case RATR_INX_WIRELESS_N:
2286 case RATR_INX_WIRELESS_NG:
2289 case RATR_INX_WIRELESS_NB:
2292 case RATR_INX_WIRELESS_GB:
2295 case RATR_INX_WIRELESS_G:
2298 case RATR_INX_WIRELESS_B:
2308 static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
2309 struct ieee80211_sta *sta,
2310 u8 rssi_level, bool update_bw)
2312 struct rtl_priv *rtlpriv = rtl_priv(hw);
2313 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2314 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2315 struct rtl_sta_info *sta_entry = NULL;
2318 u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap &
2319 IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
2320 u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2322 u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2324 enum wireless_mode wirelessmode = 0;
2325 bool shortgi = false;
2329 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2330 wirelessmode = sta_entry->wireless_mode;
2331 if (mac->opmode == NL80211_IFTYPE_STATION ||
2332 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2333 curtxbw_40mhz = mac->bw_40;
2334 else if (mac->opmode == NL80211_IFTYPE_AP ||
2335 mac->opmode == NL80211_IFTYPE_ADHOC)
2336 macid = sta->aid + 1;
2338 ratr_bitmap = sta->deflink.supp_rates[0];
2340 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2341 ratr_bitmap = 0xfff;
2343 ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
2344 sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
2345 switch (wirelessmode) {
2346 case WIRELESS_MODE_B:
2347 ratr_index = RATR_INX_WIRELESS_B;
2348 if (ratr_bitmap & 0x0000000c)
2349 ratr_bitmap &= 0x0000000d;
2351 ratr_bitmap &= 0x0000000f;
2353 case WIRELESS_MODE_G:
2354 ratr_index = RATR_INX_WIRELESS_GB;
2356 if (rssi_level == 1)
2357 ratr_bitmap &= 0x00000f00;
2358 else if (rssi_level == 2)
2359 ratr_bitmap &= 0x00000ff0;
2361 ratr_bitmap &= 0x00000ff5;
2363 case WIRELESS_MODE_N_24G:
2364 case WIRELESS_MODE_N_5G:
2365 ratr_index = RATR_INX_WIRELESS_NGB;
2366 if (rtlphy->rf_type == RF_1T1R) {
2367 if (curtxbw_40mhz) {
2368 if (rssi_level == 1)
2369 ratr_bitmap &= 0x000f0000;
2370 else if (rssi_level == 2)
2371 ratr_bitmap &= 0x000ff000;
2373 ratr_bitmap &= 0x000ff015;
2375 if (rssi_level == 1)
2376 ratr_bitmap &= 0x000f0000;
2377 else if (rssi_level == 2)
2378 ratr_bitmap &= 0x000ff000;
2380 ratr_bitmap &= 0x000ff005;
2383 if (curtxbw_40mhz) {
2384 if (rssi_level == 1)
2385 ratr_bitmap &= 0x0f8f0000;
2386 else if (rssi_level == 2)
2387 ratr_bitmap &= 0x0f8ff000;
2389 ratr_bitmap &= 0x0f8ff015;
2391 if (rssi_level == 1)
2392 ratr_bitmap &= 0x0f8f0000;
2393 else if (rssi_level == 2)
2394 ratr_bitmap &= 0x0f8ff000;
2396 ratr_bitmap &= 0x0f8ff005;
2399 if ((curtxbw_40mhz && curshortgi_40mhz) ||
2400 (!curtxbw_40mhz && curshortgi_20mhz)) {
2403 else if (macid == 1)
2408 ratr_index = RATR_INX_WIRELESS_NGB;
2410 if (rtlphy->rf_type == RF_1T2R)
2411 ratr_bitmap &= 0x000ff0ff;
2413 ratr_bitmap &= 0x0f0ff0ff;
2417 sta_entry->ratr_index = ratr_index;
2419 rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
2420 "ratr_bitmap :%x\n", ratr_bitmap);
2421 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2423 rate_mask[0] = macid;
2424 rate_mask[1] = _rtl8723be_mrate_idx_to_arfr_id(hw, ratr_index) |
2425 (shortgi ? 0x80 : 0x00);
2426 rate_mask[2] = curtxbw_40mhz | ((!update_bw) << 3);
2428 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
2429 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
2430 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
2431 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
2433 rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
2434 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
2435 ratr_index, ratr_bitmap,
2436 rate_mask[0], rate_mask[1],
2437 rate_mask[2], rate_mask[3],
2438 rate_mask[4], rate_mask[5],
2440 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_RA_MASK, 7, rate_mask);
2441 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
2444 void rtl8723be_update_hal_rate_tbl(struct ieee80211_hw *hw,
2445 struct ieee80211_sta *sta,
2446 u8 rssi_level, bool update_bw)
2448 struct rtl_priv *rtlpriv = rtl_priv(hw);
2449 if (rtlpriv->dm.useramask)
2450 rtl8723be_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
2453 void rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw)
2455 struct rtl_priv *rtlpriv = rtl_priv(hw);
2456 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2459 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, &mac->slot_time);
2460 if (!mac->ht_enable)
2461 sifs_timer = 0x0a0a;
2463 sifs_timer = 0x0e0e;
2464 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
2467 bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2469 struct rtl_priv *rtlpriv = rtl_priv(hw);
2470 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2471 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2472 enum rf_pwrstate e_rfpowerstate_toset;
2474 bool b_actuallyset = false;
2476 if (rtlpriv->rtlhal.being_init_adapter)
2479 if (ppsc->swrf_processing)
2482 spin_lock(&rtlpriv->locks.rf_ps_lock);
2483 if (ppsc->rfchange_inprogress) {
2484 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2487 ppsc->rfchange_inprogress = true;
2488 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2491 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
2492 rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL_2) & ~(BIT(1)));
2494 u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
2496 if (rtlphy->polarity_ctl)
2497 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
2499 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
2501 if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
2502 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2503 "GPIOChangeRF - HW Radio ON, RF ON\n");
2505 e_rfpowerstate_toset = ERFON;
2506 ppsc->hwradiooff = false;
2507 b_actuallyset = true;
2508 } else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) {
2509 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2510 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
2512 e_rfpowerstate_toset = ERFOFF;
2513 ppsc->hwradiooff = true;
2514 b_actuallyset = true;
2517 if (b_actuallyset) {
2518 spin_lock(&rtlpriv->locks.rf_ps_lock);
2519 ppsc->rfchange_inprogress = false;
2520 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2522 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
2523 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2525 spin_lock(&rtlpriv->locks.rf_ps_lock);
2526 ppsc->rfchange_inprogress = false;
2527 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2531 return !ppsc->hwradiooff;
2535 void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
2536 u8 *p_macaddr, bool is_group, u8 enc_algo,
2537 bool is_wepkey, bool clear_all)
2539 struct rtl_priv *rtlpriv = rtl_priv(hw);
2540 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2541 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2542 u8 *macaddr = p_macaddr;
2544 bool is_pairwise = false;
2546 static u8 cam_const_addr[4][6] = {
2547 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2548 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2549 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
2550 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
2552 static u8 cam_const_broad[] = {
2553 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2559 u8 clear_number = 5;
2561 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
2563 for (idx = 0; idx < clear_number; idx++) {
2564 rtl_cam_mark_invalid(hw, cam_offset + idx);
2565 rtl_cam_empty_entry(hw, cam_offset + idx);
2568 memset(rtlpriv->sec.key_buf[idx], 0,
2570 rtlpriv->sec.key_len[idx] = 0;
2576 case WEP40_ENCRYPTION:
2577 enc_algo = CAM_WEP40;
2579 case WEP104_ENCRYPTION:
2580 enc_algo = CAM_WEP104;
2582 case TKIP_ENCRYPTION:
2583 enc_algo = CAM_TKIP;
2585 case AESCCMP_ENCRYPTION:
2589 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
2590 "switch case %#x not processed\n", enc_algo);
2591 enc_algo = CAM_TKIP;
2595 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
2596 macaddr = cam_const_addr[key_index];
2597 entry_id = key_index;
2600 macaddr = cam_const_broad;
2601 entry_id = key_index;
2603 if (mac->opmode == NL80211_IFTYPE_AP) {
2604 entry_id = rtl_cam_get_free_entry(hw,
2606 if (entry_id >= TOTAL_CAM_ENTRY) {
2607 pr_err("Can not find free hw security cam entry\n");
2611 entry_id = CAM_PAIRWISE_KEY_POSITION;
2614 key_index = PAIRWISE_KEYIDX;
2619 if (rtlpriv->sec.key_len[key_index] == 0) {
2620 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2621 "delete one entry, entry_id is %d\n",
2623 if (mac->opmode == NL80211_IFTYPE_AP)
2624 rtl_cam_del_entry(hw, p_macaddr);
2625 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
2627 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2630 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2631 "set Pairwise key\n");
2633 rtl_cam_add_one_entry(hw, macaddr, key_index,
2635 CAM_CONFIG_NO_USEDK,
2636 rtlpriv->sec.key_buf[key_index]);
2638 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2641 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2642 rtl_cam_add_one_entry(hw,
2645 CAM_PAIRWISE_KEY_POSITION,
2647 CAM_CONFIG_NO_USEDK,
2648 rtlpriv->sec.key_buf
2652 rtl_cam_add_one_entry(hw, macaddr, key_index,
2654 CAM_CONFIG_NO_USEDK,
2655 rtlpriv->sec.key_buf[entry_id]);
2661 void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2662 bool auto_load_fail, u8 *hwinfo)
2664 struct rtl_priv *rtlpriv = rtl_priv(hw);
2665 struct rtl_mod_params *mod_params = rtlpriv->cfg->mod_params;
2669 if (!auto_load_fail) {
2670 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
2671 if (tmpu_32 & BIT(18))
2672 rtlpriv->btcoexist.btc_info.btcoexist = 1;
2674 rtlpriv->btcoexist.btc_info.btcoexist = 0;
2675 value = hwinfo[EEPROM_RF_BT_SETTING_8723B];
2676 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
2677 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
2678 rtlpriv->btcoexist.btc_info.single_ant_path =
2679 (value & 0x40 ? ANT_AUX : ANT_MAIN); /*0xc3[6]*/
2681 rtlpriv->btcoexist.btc_info.btcoexist = 0;
2682 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
2683 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
2684 rtlpriv->btcoexist.btc_info.single_ant_path = ANT_MAIN;
2687 /* override ant_num / ant_path */
2688 if (mod_params->ant_sel) {
2689 rtlpriv->btcoexist.btc_info.ant_num =
2690 (mod_params->ant_sel == 1 ? ANT_X1 : ANT_X2);
2692 rtlpriv->btcoexist.btc_info.single_ant_path =
2693 (mod_params->ant_sel == 1 ? ANT_AUX : ANT_MAIN);
2697 void rtl8723be_bt_reg_init(struct ieee80211_hw *hw)
2699 struct rtl_priv *rtlpriv = rtl_priv(hw);
2701 /* 0:Low, 1:High, 2:From Efuse. */
2702 rtlpriv->btcoexist.reg_bt_iso = 2;
2703 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2704 rtlpriv->btcoexist.reg_bt_sco = 3;
2705 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2706 rtlpriv->btcoexist.reg_bt_sco = 0;
2709 void rtl8723be_bt_hw_init(struct ieee80211_hw *hw)
2711 struct rtl_priv *rtlpriv = rtl_priv(hw);
2713 if (rtlpriv->cfg->ops->get_btc_status())
2714 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
2718 void rtl8723be_suspend(struct ieee80211_hw *hw)
2722 void rtl8723be_resume(struct ieee80211_hw *hw)