1 /******************************************************************************
3 * Copyright(c) 2009-2010 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
26 * Larry Finger <Larry.Finger@lwfinger.net>
28 *****************************************************************************/
44 #include "pwrseqcmd.h"
47 #include "../btcoexist/rtl_btc.h"
51 static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw)
53 struct rtl_priv *rtlpriv = rtl_priv(hw);
54 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
55 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
57 while (skb_queue_len(&ring->queue)) {
58 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
59 struct sk_buff *skb = __skb_dequeue(&ring->queue);
61 pci_unmap_single(rtlpci->pdev,
62 le32_to_cpu(rtlpriv->cfg->ops->get_desc(
63 (u8 *) entry, true, HW_DESC_TXBUFF_ADDR)),
64 skb->len, PCI_DMA_TODEVICE);
66 ring->idx = (ring->idx + 1) % ring->entries;
71 static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
72 u8 set_bits, u8 clear_bits)
74 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
75 struct rtl_priv *rtlpriv = rtl_priv(hw);
77 rtlpci->reg_bcn_ctrl_val |= set_bits;
78 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
80 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val);
83 void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw)
85 struct rtl_priv *rtlpriv = rtl_priv(hw);
88 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
89 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
90 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
91 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
92 tmp1byte &= ~(BIT(0));
93 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
96 void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw)
98 struct rtl_priv *rtlpriv = rtl_priv(hw);
101 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
102 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
103 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
104 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
106 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
109 static void _rtl8821ae_enable_bcn_sub_func(struct ieee80211_hw *hw)
111 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(1));
114 static void _rtl8821ae_disable_bcn_sub_func(struct ieee80211_hw *hw)
116 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(1), 0);
119 static void _rtl8821ae_set_fw_clock_on(struct ieee80211_hw *hw,
120 u8 rpwm_val, bool b_need_turn_off_ckk)
122 struct rtl_priv *rtlpriv = rtl_priv(hw);
123 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
124 bool b_support_remote_wake_up;
125 u32 count = 0,isr_regaddr,content;
126 bool b_schedule_timer = b_need_turn_off_ckk;
127 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
128 (u8 *) (&b_support_remote_wake_up));
130 if (!rtlhal->bfw_ready)
132 if (!rtlpriv->psc.b_fw_current_inpsmode)
136 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
137 if (rtlhal->bfw_clk_change_in_progress) {
138 while (rtlhal->bfw_clk_change_in_progress) {
139 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
144 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
146 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
148 rtlhal->bfw_clk_change_in_progress = false;
149 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
153 if (IS_IN_LOW_POWER_STATE_8821AE(rtlhal->fw_ps_state)) {
154 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
156 if (FW_PS_IS_ACK(rpwm_val)) {
157 isr_regaddr = REG_HISR;
158 content = rtl_read_dword(rtlpriv, isr_regaddr);
159 while (!(content & IMR_CPWM) && (count < 500)) {
162 content = rtl_read_dword(rtlpriv, isr_regaddr);
165 if (content & IMR_CPWM) {
166 rtl_write_word(rtlpriv,isr_regaddr, 0x0100);
167 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_8821AE;
168 RT_TRACE(COMP_POWER, DBG_LOUD, ("Receive CPWM INT!!! Set pHalData->FwPSState = %X\n", rtlhal->fw_ps_state));
172 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
173 rtlhal->bfw_clk_change_in_progress = false;
174 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
175 if (b_schedule_timer) {
176 mod_timer(&rtlpriv->works.fw_clockoff_timer,
177 jiffies + MSECS(10));
181 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
182 rtlhal->bfw_clk_change_in_progress = false;
183 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
189 static void _rtl8821ae_set_fw_clock_off(struct ieee80211_hw *hw,
192 struct rtl_priv *rtlpriv = rtl_priv(hw);
193 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
194 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
195 struct rtl8192_tx_ring *ring;
196 enum rf_pwrstate rtstate;
197 bool b_schedule_timer = false;
200 if (!rtlhal->bfw_ready)
202 if (!rtlpriv->psc.b_fw_current_inpsmode)
204 if (!rtlhal->ballow_sw_to_change_hwclc)
206 rtlpriv->cfg->ops->get_hw_reg(hw,HW_VAR_RF_STATE,(u8 *)(&rtstate));
207 if (rtstate == ERFOFF ||rtlpriv->psc.inactive_pwrstate ==ERFOFF)
210 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
211 ring = &rtlpci->tx_ring[queue];
212 if (skb_queue_len(&ring->queue)) {
213 b_schedule_timer = true;
218 if (b_schedule_timer) {
219 mod_timer(&rtlpriv->works.fw_clockoff_timer,
220 jiffies + MSECS(10));
224 if (FW_PS_STATE(rtlhal->fw_ps_state) != FW_PS_STATE_RF_OFF_LOW_PWR_8821AE) {
225 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
226 if (!rtlhal->bfw_clk_change_in_progress) {
227 rtlhal->bfw_clk_change_in_progress = true;
228 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
229 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
230 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
231 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
233 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
234 rtlhal->bfw_clk_change_in_progress = false;
235 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
237 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
238 mod_timer(&rtlpriv->works.fw_clockoff_timer,
239 jiffies + MSECS(10));
245 static void _rtl8821ae_set_fw_ps_rf_on(struct ieee80211_hw *hw)
248 rpwm_val |= (FW_PS_STATE_RF_OFF_8821AE | FW_PS_ACK);
249 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, true);
252 static void _rtl8821ae_fwlps_leave(struct ieee80211_hw *hw)
254 struct rtl_priv *rtlpriv = rtl_priv(hw);
255 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
256 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
257 bool b_fw_current_inps = false;
258 u8 rpwm_val = 0,fw_pwrmode = FW_PS_ACTIVE_MODE;
260 if (ppsc->b_low_power_enable){
261 rpwm_val = (FW_PS_STATE_ALL_ON_8821AE|FW_PS_ACK);/* RF on */
262 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, false);
263 rtlhal->ballow_sw_to_change_hwclc = false;
264 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
265 (u8 *) (&fw_pwrmode));
266 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
267 (u8 *) (&b_fw_current_inps));
269 rpwm_val = FW_PS_STATE_ALL_ON_8821AE; /* RF on */
270 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
272 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
273 (u8 *) (&fw_pwrmode));
274 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
275 (u8 *) (&b_fw_current_inps));
280 static void _rtl8821ae_fwlps_enter(struct ieee80211_hw *hw)
282 struct rtl_priv *rtlpriv = rtl_priv(hw);
283 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
284 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
285 bool b_fw_current_inps = true;
288 if (ppsc->b_low_power_enable){
289 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_8821AE; /* RF off */
290 rtlpriv->cfg->ops->set_hw_reg(hw,
291 HW_VAR_FW_PSMODE_STATUS,
292 (u8 *) (&b_fw_current_inps));
293 rtlpriv->cfg->ops->set_hw_reg(hw,
294 HW_VAR_H2C_FW_PWRMODE,
295 (u8 *) (&ppsc->fwctrl_psmode));
296 rtlhal->ballow_sw_to_change_hwclc = true;
297 _rtl8821ae_set_fw_clock_off(hw, rpwm_val);
301 rpwm_val = FW_PS_STATE_RF_OFF_8821AE; /* RF off */
302 rtlpriv->cfg->ops->set_hw_reg(hw,
303 HW_VAR_FW_PSMODE_STATUS,
304 (u8 *) (&b_fw_current_inps));
305 rtlpriv->cfg->ops->set_hw_reg(hw,
306 HW_VAR_H2C_FW_PWRMODE,
307 (u8 *) (&ppsc->fwctrl_psmode));
308 rtlpriv->cfg->ops->set_hw_reg(hw,
315 void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
317 struct rtl_priv *rtlpriv = rtl_priv(hw);
318 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
319 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
320 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
323 case HW_VAR_ETHER_ADDR:
324 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_MACID);
325 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_MACID + 4);
328 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_BSSID);
329 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_BSSID+4);
331 case HW_VAR_MEDIA_STATUS:
332 val[0] = rtl_read_byte(rtlpriv, REG_CR+2) & 0x3;
334 case HW_VAR_SLOT_TIME:
335 *((u8 *)(val)) = mac->slot_time;
337 case HW_VAR_BEACON_INTERVAL:
338 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_BCN_INTERVAL);
340 case HW_VAR_ATIM_WINDOW:
341 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_ATIMWND);
344 *((u32 *) (val)) = rtlpci->receive_config;
346 case HW_VAR_RF_STATE:
347 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
349 case HW_VAR_FWLPS_RF_ON:{
350 enum rf_pwrstate rfState;
353 rtlpriv->cfg->ops->get_hw_reg(hw,
356 if (rfState == ERFOFF) {
357 *((bool *) (val)) = true;
359 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
360 val_rcr &= 0x00070000;
362 *((bool *) (val)) = false;
364 *((bool *) (val)) = true;
368 case HW_VAR_FW_PSMODE_STATUS:
369 *((bool *) (val)) = ppsc->b_fw_current_inpsmode;
371 case HW_VAR_CORRECT_TSF:{
373 u32 *ptsf_low = (u32 *) & tsf;
374 u32 *ptsf_high = ((u32 *) & tsf) + 1;
376 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
377 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
379 *((u64 *) (val)) = tsf;
384 RT_TRACE(COMP_ERR, DBG_EMERG,
385 ("switch case not process %x\n",variable));
391 void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
393 struct rtl_priv *rtlpriv = rtl_priv(hw);
394 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
395 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
396 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
397 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
398 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
402 case HW_VAR_ETHER_ADDR:{
403 for (idx = 0; idx < ETH_ALEN; idx++) {
404 rtl_write_byte(rtlpriv, (REG_MACID + idx),
409 case HW_VAR_BASIC_RATE:{
410 u16 b_rate_cfg = ((u16 *) val)[0];
412 b_rate_cfg = b_rate_cfg & 0x15f;
414 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
415 rtl_write_byte(rtlpriv, REG_RRSR + 1,
416 (b_rate_cfg >> 8) & 0xff);
417 while (b_rate_cfg > 0x1) {
418 b_rate_cfg = (b_rate_cfg >> 1);
421 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL,
426 for (idx = 0; idx < ETH_ALEN; idx++) {
427 rtl_write_byte(rtlpriv, (REG_BSSID + idx),
433 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
434 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
436 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
437 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
440 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
443 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
447 case HW_VAR_SLOT_TIME:{
450 RT_TRACE(COMP_MLME, DBG_LOUD,
451 ("HW_VAR_SLOT_TIME %x\n", val[0]));
453 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
455 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
456 rtlpriv->cfg->ops->set_hw_reg(hw,
462 case HW_VAR_ACK_PREAMBLE:{
464 u8 short_preamble = (bool) (*(u8 *) val);
465 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);
468 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
470 reg_tmp &= (~BIT(1));
471 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
475 case HW_VAR_WPA_CONFIG:
476 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *) val));
478 case HW_VAR_AMPDU_MIN_SPACE:{
479 u8 min_spacing_to_set;
482 min_spacing_to_set = *((u8 *) val);
483 if (min_spacing_to_set <= 7) {
486 if (min_spacing_to_set < sec_min_space)
487 min_spacing_to_set = sec_min_space;
489 mac->min_space_cfg = ((mac->min_space_cfg &
493 *val = min_spacing_to_set;
495 RT_TRACE(COMP_MLME, DBG_LOUD,
496 ("Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
497 mac->min_space_cfg));
499 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
504 case HW_VAR_SHORTGI_DENSITY:{
507 density_to_set = *((u8 *) val);
508 mac->min_space_cfg |= (density_to_set << 3);
510 RT_TRACE(COMP_MLME, DBG_LOUD,
511 ("Set HW_VAR_SHORTGI_DENSITY: %#x\n",
512 mac->min_space_cfg));
514 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
519 case HW_VAR_AMPDU_FACTOR:{
520 u32 ampdu_len = (*((u8 *)val));
521 if(rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
522 if(ampdu_len < VHT_AGG_SIZE_128K)
523 ampdu_len = (0x2000 << (*((u8 *)val))) -1;
526 } else if(rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
527 if(ampdu_len < HT_AGG_SIZE_64K)
528 ampdu_len = (0x2000 << (*((u8 *)val))) -1;
532 ampdu_len |= BIT(31);
534 rtl_write_dword(rtlpriv,
535 REG_AMPDU_MAX_LENGTH_8812, ampdu_len);
538 case HW_VAR_AC_PARAM:{
539 u8 e_aci = *((u8 *) val);
540 rtl8821ae_dm_init_edca_turbo(hw);
542 if (rtlpci->acm_method != eAcmWay2_SW)
543 rtlpriv->cfg->ops->set_hw_reg(hw,
548 case HW_VAR_ACM_CTRL:{
549 u8 e_aci = *((u8 *) val);
550 union aci_aifsn *p_aci_aifsn =
551 (union aci_aifsn *)(&(mac->ac[0].aifs));
552 u8 acm = p_aci_aifsn->f.acm;
553 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
556 acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
561 acm_ctrl |= AcmHw_BeqEn;
564 acm_ctrl |= AcmHw_ViqEn;
567 acm_ctrl |= AcmHw_VoqEn;
570 RT_TRACE(COMP_ERR, DBG_WARNING,
571 ("HW_VAR_ACM_CTRL acm set "
572 "failed: eACI is %d\n", acm));
578 acm_ctrl &= (~AcmHw_BeqEn);
581 acm_ctrl &= (~AcmHw_ViqEn);
584 acm_ctrl &= (~AcmHw_BeqEn);
587 RT_TRACE(COMP_ERR, DBG_EMERG,
588 ("switch case not process \n"));
593 RT_TRACE(COMP_QOS, DBG_TRACE,
594 ("SetHwReg8190pci(): [HW_VAR_ACM_CTRL] "
595 "Write 0x%X\n", acm_ctrl));
596 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
600 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *) (val))[0]);
601 rtlpci->receive_config = ((u32 *) (val))[0];
604 case HW_VAR_RETRY_LIMIT:{
605 u8 retry_limit = ((u8 *) (val))[0];
607 rtl_write_word(rtlpriv, REG_RL,
608 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
609 retry_limit << RETRY_LIMIT_LONG_SHIFT);
612 case HW_VAR_DUAL_TSF_RST:
613 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
615 case HW_VAR_EFUSE_BYTES:
616 rtlefuse->efuse_usedbytes = *((u16 *) val);
618 case HW_VAR_EFUSE_USAGE:
619 rtlefuse->efuse_usedpercentage = *((u8 *) val);
622 rtl8821ae_phy_set_io_cmd(hw, (*(enum io_type *)val));
624 case HW_VAR_SET_RPWM:{
627 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
630 if (rpwm_val & BIT(7)) {
631 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
634 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
635 ((*(u8 *) val) | BIT(7)));
640 case HW_VAR_H2C_FW_PWRMODE:{
641 rtl8821ae_set_fw_pwrmode_cmd(hw, (*(u8 *) val));
644 case HW_VAR_FW_PSMODE_STATUS:
645 ppsc->b_fw_current_inpsmode = *((bool *) val);
648 case HW_VAR_RESUME_CLK_ON:
649 _rtl8821ae_set_fw_ps_rf_on(hw);
652 case HW_VAR_FW_LPS_ACTION:{
653 bool b_enter_fwlps = *((bool *) val);
656 _rtl8821ae_fwlps_enter(hw);
658 _rtl8821ae_fwlps_leave(hw);
663 case HW_VAR_H2C_FW_JOINBSSRPT:{
664 u8 mstatus = (*(u8 *) val);
665 u8 tmp_regcr, tmp_reg422,bcnvalid_reg;
666 u8 count = 0, dlbcn_count = 0;
667 bool b_recover = false;
669 if (mstatus == RT_MEDIA_CONNECT) {
670 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
673 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
674 rtl_write_byte(rtlpriv, REG_CR + 1,
675 (tmp_regcr | BIT(0)));
677 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
678 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
681 rtl_read_byte(rtlpriv,
682 REG_FWHW_TXQ_CTRL + 2);
683 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
684 tmp_reg422 & (~BIT(6)));
685 if (tmp_reg422 & BIT(6))
689 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL+2);
690 rtl_write_byte(rtlpriv, REG_TDECTRL+2,(bcnvalid_reg | BIT(0)));
691 _rtl8821ae_return_beacon_queue_skb(hw);
693 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
694 rtl8812ae_set_fw_rsvdpagepkt(hw, 0);
696 rtl8821ae_set_fw_rsvdpagepkt(hw, 0);
697 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL+2);
699 while (!(bcnvalid_reg & BIT(0)) && count <20){
702 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL+2);
705 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count <5);
707 if (bcnvalid_reg & BIT(0))
708 rtl_write_byte(rtlpriv, REG_TDECTRL+2, BIT(0));
710 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
711 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
714 rtl_write_byte(rtlpriv,
715 REG_FWHW_TXQ_CTRL + 2,
719 rtl_write_byte(rtlpriv, REG_CR + 1,
720 (tmp_regcr & ~(BIT(0))));
722 rtl8821ae_set_fw_joinbss_report_cmd(hw, (*(u8 *) val));
726 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:{
727 rtl8821ae_set_p2p_ps_offload_cmd(hw, (*(u8 *) val));
733 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
735 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp |
740 case HW_VAR_CORRECT_TSF:{
741 u8 btype_ibss = ((u8 *) (val))[0];
743 if (btype_ibss == true)
744 _rtl8821ae_stop_tx_beacon(hw);
746 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
748 rtl_write_dword(rtlpriv, REG_TSFTR,
749 (u32) (mac->tsf & 0xffffffff));
750 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
751 (u32) ((mac->tsf >> 32) & 0xffffffff));
753 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
755 if (btype_ibss == true)
756 _rtl8821ae_resume_tx_beacon(hw);
761 case HW_VAR_NAV_UPPER: {
762 u32 us_nav_upper = ((u32)*val);
764 if(us_nav_upper > HAL_92C_NAV_UPPER_UNIT * 0xFF)
766 RT_TRACE(COMP_INIT , DBG_WARNING,
767 ("The setting value (0x%08X us) of NAV_UPPER"
768 " is larger than (%d * 0xFF)!!!\n",
769 us_nav_upper, HAL_92C_NAV_UPPER_UNIT));
772 rtl_write_byte(rtlpriv, REG_NAV_UPPER,
773 ((u8)((us_nav_upper + HAL_92C_NAV_UPPER_UNIT - 1) / HAL_92C_NAV_UPPER_UNIT)));
776 case HW_VAR_KEEP_ALIVE: {
779 array[1] = *((u8 *)val);
780 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL, 2, array);
783 RT_TRACE(COMP_ERR, DBG_EMERG, ("switch case "
784 "not process %x\n",variable));
789 static bool _rtl8821ae_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
791 struct rtl_priv *rtlpriv = rtl_priv(hw);
794 u32 value = _LLT_INIT_ADDR(address) |
795 _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS);
797 rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
800 value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
801 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
804 if (count > POLLING_LLT_THRESHOLD) {
805 RT_TRACE(COMP_ERR, DBG_EMERG,
806 ("Failed to polling write LLT done at "
807 "address %d!\n", address));
816 static bool _rtl8821ae_llt_table_init(struct ieee80211_hw *hw)
818 struct rtl_priv *rtlpriv = rtl_priv(hw);
825 txpktbuf_bndy = 0xF8;
828 rtl_write_byte(rtlpriv, REG_TRXFF_BNDY, txpktbuf_bndy);
829 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, MAX_RX_DMA_BUFFER_SIZE - 1);
831 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
833 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
834 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
836 rtl_write_byte(rtlpriv, REG_PBP, 0x31);
837 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
839 for (i = 0; i < (txpktbuf_bndy - 1); i++) {
840 status = _rtl8821ae_llt_write(hw, i, i + 1);
845 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
849 for (i = txpktbuf_bndy; i < maxPage; i++) {
850 status = _rtl8821ae_llt_write(hw, i, (i + 1));
855 status = _rtl8821ae_llt_write(hw, maxPage, txpktbuf_bndy);
859 rtl_write_dword(rtlpriv, REG_RQPN, 0x80e70808);
860 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00);
865 static void _rtl8821ae_gen_refresh_led_state(struct ieee80211_hw *hw)
867 struct rtl_priv *rtlpriv = rtl_priv(hw);
868 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
869 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
870 struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0);
871 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
873 if (rtlpriv->rtlhal.up_first_time)
876 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
877 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
878 rtl8812ae_sw_led_on(hw, pLed0);
880 rtl8821ae_sw_led_on(hw, pLed0);
881 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
882 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
883 rtl8812ae_sw_led_on(hw, pLed0);
885 rtl8821ae_sw_led_on(hw, pLed0);
887 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
888 rtl8812ae_sw_led_off(hw, pLed0);
890 rtl8821ae_sw_led_off(hw, pLed0);
893 static bool _rtl8821ae_init_mac(struct ieee80211_hw *hw)
895 struct rtl_priv *rtlpriv = rtl_priv(hw);
896 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
897 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
901 bool b_mac_func_enable = rtlhal->b_mac_func_enable;
903 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
905 /*Auto Power Down to CHIP-off State*/
906 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
907 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
909 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
910 /* HW Power on sequence*/
911 if(!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
912 PWR_INTF_PCI_MSK, RTL8812_NIC_ENABLE_FLOW)) {
913 RT_TRACE(COMP_INIT,DBG_LOUD,("init 8812 MAC Fail as power on failure\n"));
917 /* HW Power on sequence */
918 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_A_MSK, PWR_FAB_ALL_MSK,
919 PWR_INTF_PCI_MSK, RTL8821A_NIC_ENABLE_FLOW)){
920 RT_TRACE(COMP_INIT,DBG_LOUD,("init 8821 MAC Fail as power on failure\n"));
925 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
926 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
928 bytetmp = rtl_read_byte(rtlpriv, REG_CR);
930 rtl_write_byte(rtlpriv, REG_CR, bytetmp);
934 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
937 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
938 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
939 if (bytetmp & BIT(0)) {
940 bytetmp = rtl_read_byte(rtlpriv, 0x7c);
942 rtl_write_byte(rtlpriv, 0x7c, bytetmp);
946 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
948 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp);
950 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
952 if (!b_mac_func_enable) {
953 if (!_rtl8821ae_llt_table_init(hw))
957 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
958 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
960 /* Enable FW Beamformer Interrupt */
961 bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3);
962 rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6));
964 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
967 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
969 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
970 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
971 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
973 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
974 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
975 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
976 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
977 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
978 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
979 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
980 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
981 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
982 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
983 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
984 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
985 rtl_write_dword(rtlpriv, REG_HQ_DESA,
986 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
987 rtl_write_dword(rtlpriv, REG_RX_DESA,
988 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
990 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, 0x77);
992 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
994 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
995 _rtl8821ae_gen_refresh_led_state(hw);
1000 static void _rtl8821ae_hw_configure(struct ieee80211_hw *hw)
1002 struct rtl_priv *rtlpriv = rtl_priv(hw);
1003 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1006 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
1008 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
1009 /* ARFB table 9 for 11ac 5G 2SS */
1010 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
1011 /* ARFB table 10 for 11ac 5G 1SS */
1012 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
1013 /* ARFB table 11 for 11ac 24G 1SS */
1014 rtl_write_dword(rtlpriv, REG_ARFR2, 0x00000015);
1015 rtl_write_dword(rtlpriv, REG_ARFR2 + 4, 0x003ff000);
1016 /* ARFB table 12 for 11ac 24G 1SS */
1017 rtl_write_dword(rtlpriv, REG_ARFR3, 0x00000015);
1018 rtl_write_dword(rtlpriv, REG_ARFR3 + 4, 0xffcff000);
1019 /* 0x420[7] = 0 , enable retry AMPDU in new AMPD not singal MPDU. */
1020 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
1021 rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
1024 rtl_write_word(rtlpriv, REG_RL, 0x0707);
1027 /* Set Data / Response auto rate fallack retry count*/
1028 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
1029 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
1030 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
1031 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
1033 rtlpci->reg_bcn_ctrl_val = 0x1d;
1034 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
1036 /* TBTT prohibit hold time. Suggested by designer TimChen. */
1037 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1,0xff); // 8 ms
1039 /* AGGR_BK_TIME Reg51A 0x16 */
1040 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
1042 /*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
1043 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
1045 rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
1046 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
1047 rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, 0x1F1F);
1050 static u16 _rtl8821ae_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
1053 u8 tmp = 0, count = 0;
1055 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
1056 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6) ;
1058 while (tmp && count < 20) {
1060 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1064 ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
1069 void _rtl8821ae_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
1071 u8 tmp = 0, count = 0;
1073 rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
1074 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
1075 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5) ;
1077 while (tmp && count < 20) {
1079 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1084 static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
1086 u16 read_addr = addr & 0xfffc;
1087 u8 tmp = 0, count = 0, ret = 0;
1089 rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
1090 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
1091 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1093 while (tmp && count < 20) {
1095 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1099 read_addr = REG_DBI_RDATA + addr % 4;
1100 ret = rtl_read_word(rtlpriv, read_addr);
1105 void _rtl8821ae_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
1107 u8 tmp = 0, count = 0;
1108 u16 wrtie_addr, remainder = addr % 4;
1110 wrtie_addr = REG_DBI_WDATA + remainder;
1111 rtl_write_byte(rtlpriv, wrtie_addr, data);
1113 wrtie_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
1114 rtl_write_word(rtlpriv, REG_DBI_ADDR, wrtie_addr);
1116 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
1118 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1120 while (tmp && count < 20) {
1122 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1128 static void _rtl8821ae_enable_aspm_back_door(struct ieee80211_hw *hw)
1130 struct rtl_priv *rtlpriv = rtl_priv(hw);
1131 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1134 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1135 if (_rtl8821ae_mdio_read(rtlpriv, 0x04) != 0x8544)
1136 _rtl8821ae_mdio_write(rtlpriv, 0x04, 0x8544);
1138 if (_rtl8821ae_mdio_read(rtlpriv, 0x0b) != 0x0070)
1139 _rtl8821ae_mdio_write(rtlpriv, 0x0b, 0x0070);
1142 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f);
1143 _rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7));
1145 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719);
1146 _rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4));
1148 if(rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1150 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1151 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp|BIT(4));
1155 void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw)
1157 struct rtl_priv *rtlpriv = rtl_priv(hw);
1161 RT_TRACE(COMP_INIT, DBG_DMESG,
1162 ("PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1163 rtlpriv->sec.pairwise_enc_algorithm,
1164 rtlpriv->sec.group_enc_algorithm));
1166 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1167 RT_TRACE(COMP_SEC, DBG_DMESG, ("not open hw encryption\n"));
1171 sec_reg_value = SCR_TxEncEnable | SCR_RxDecEnable;
1173 if (rtlpriv->sec.use_defaultkey) {
1174 sec_reg_value |= SCR_TxUseDK;
1175 sec_reg_value |= SCR_RxUseDK;
1178 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1180 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1181 rtl_write_byte(rtlpriv, REG_CR + 1, tmp | BIT(1));
1183 RT_TRACE(COMP_SEC, DBG_DMESG,
1184 ("The SECR-value %x \n", sec_reg_value));
1186 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1191 bool _rtl8821ae_check_pcie_dma_hang(struct ieee80211_hw *hw)
1193 struct rtl_priv *rtlpriv = rtl_priv(hw);
1195 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL+3);
1196 if (!(tmp&BIT(2))) {
1197 rtl_write_byte(rtlpriv, REG_DBI_CTRL+3, tmp|BIT(2));
1201 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL+3);
1202 if (tmp&BIT(0) || tmp&BIT(1)) {
1203 RT_TRACE(COMP_INIT, DBG_LOUD,
1204 ("rtl8821ae_check_pcie_dma_hang(): TRUE! Reset PCIE DMA!\n"));
1211 void _rtl8821ae_reset_pcie_interface_dma(struct ieee80211_hw *hw,
1212 bool mac_power_on, bool watch_dog)
1214 struct rtl_priv *rtlpriv = rtl_priv(hw);
1216 bool release_mac_rx_pause;
1217 u8 backup_pcie_dma_pause;
1219 RT_TRACE(COMP_INIT, DBG_LOUD, ("_rtl8821ae_reset_pcie_interface_dma()\n"));
1221 tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
1223 rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
1224 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1226 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1228 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1230 release_mac_rx_pause = false;
1232 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp | BIT(2));
1233 release_mac_rx_pause = true;
1235 backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG+1);
1236 if (backup_pcie_dma_pause != 0xFF)
1237 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+1, 0xFF);
1240 rtl_write_byte(rtlpriv, REG_CR, 0);
1242 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1244 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, tmp);
1246 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1248 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, tmp);
1251 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1253 tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL+2);
1255 rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL+2, tmp);
1260 u8 tx_page_boundary = _RQPN_Init_8812E(Adapter, &rqpn_npq, &rqpn);
1262 if(LLT_table_init_8812(Adapter, TX_PAGE_BOUNDARY, RQPN, RQPN_NPQ) == RT_STATUS_FAILURE)
1265 PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
1266 PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK);
1268 // <1> Reset Tx descriptor
1269 Adapter->HalFunc.ResetTxDescHandler(Adapter,Adapter->NumTxDesc);
1271 // <2> Reset Rx descriptor
1272 Adapter->HalFunc.ResetRxDescHandler(Adapter,Adapter->NumRxDesc);
1275 FreeRFDs( Adapter, TRUE);
1278 FreeTCBs( Adapter, TRUE);
1280 // We should set all Rx desc own bit to 1 to prevent from RDU after enable Rx DMA. 2013.02.18, by tynli.
1281 PrepareAllRxDescBuffer(Adapter);
1283 PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK);
1284 PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
1287 // Initialize TRx DMA address.
1289 // Because set 0x100 to 0x0 will cause the Rx descriptor address 0x340 be cleared to zero on 88EE,
1290 // we should re-initialize Rx desc. address before enable DMA. 2012.11.07. by tynli.
1291 InitTRxDescHwAddress8812AE(Adapter);
1294 // In MAC power on state, BB and RF maybe in ON state, if we release TRx DMA here
1295 // it will cause packets to be started to Tx/Rx, so we release Tx/Rx DMA later.
1296 if(!bInMACPowerOn || bInWatchDog)
1298 // 8. release TRX DMA
1299 //write 0x284 bit[18] = 1'b0
1300 //write 0x301 = 0x00
1301 if(bReleaseMACRxPause)
1303 u1Tmp = PlatformEFIORead1Byte(Adapter, REG_RXDMA_CONTROL);
1304 PlatformEFIOWrite1Byte(Adapter, REG_RXDMA_CONTROL, (u1Tmp&~BIT2));
1306 PlatformEFIOWrite1Byte(Adapter, REG_PCIE_CTRL_REG+1, BackUpPcieDMAPause);
1309 if(IS_HARDWARE_TYPE_8821E(Adapter))
1311 //9. lock system register
1312 // write 0xCC bit[2] = 1'b0
1313 u1Tmp = PlatformEFIORead1Byte(Adapter, REG_PMC_DBG_CTRL2_8723B);
1315 PlatformEFIOWrite1Byte(Adapter, REG_PMC_DBG_CTRL2_8723B, u1Tmp);
1318 return RT_STATUS_SUCCESS;
1322 // Static MacID Mapping (cf. Used in MacIdDoStaticMapping) ----------
1323 #define MAC_ID_STATIC_FOR_DEFAULT_PORT 0
1324 #define MAC_ID_STATIC_FOR_BROADCAST_MULTICAST 1
1325 #define MAC_ID_STATIC_FOR_BT_CLIENT_START 2
1326 #define MAC_ID_STATIC_FOR_BT_CLIENT_END 3
1327 // -----------------------------------------------------------
1329 void rtl8821ae_macid_initialize_mediastatus(struct ieee80211_hw *hw)
1331 struct rtl_priv *rtlpriv = rtl_priv(hw);
1332 u8 media_rpt[4] = {RT_MEDIA_CONNECT, 1, \
1333 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST, \
1334 MAC_ID_STATIC_FOR_BT_CLIENT_END};
1336 rtlpriv->cfg->ops->set_hw_reg(hw, \
1337 HW_VAR_H2C_FW_MEDIASTATUSRPT, media_rpt);
1339 RT_TRACE(COMP_INIT,DBG_LOUD, \
1340 ("Initialize MacId media status: from %d to %d\n", \
1341 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST, \
1342 MAC_ID_STATIC_FOR_BT_CLIENT_END));
1345 int rtl8821ae_hw_init(struct ieee80211_hw *hw)
1347 struct rtl_priv *rtlpriv = rtl_priv(hw);
1348 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1349 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1350 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1351 bool rtstatus = true;
1354 u32 nav_upper = WIFI_NAV_UPPER_US;
1356 rtlpriv->rtlhal.being_init_adapter = true;
1357 rtlpriv->intf_ops->disable_aspm(hw);
1359 /*YP wowlan not considered*/
1361 tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
1362 if (tmp_u1b!=0 && tmp_u1b != 0xEA) {
1363 rtlhal->b_mac_func_enable = true;
1364 RT_TRACE(COMP_INIT,DBG_LOUD,(" MAC has already power on.\n"));
1366 rtlhal->b_mac_func_enable = false;
1367 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1370 /* if (_rtl8821ae_check_pcie_dma_hang(hw)) {
1371 _rtl8821ae_reset_pcie_interface_dma(hw,rtlhal->b_mac_func_enable,false);
1372 rtlhal->b_mac_func_enable = false;
1375 rtstatus = _rtl8821ae_init_mac(hw);
1376 if (rtstatus != true) {
1377 RT_TRACE(COMP_ERR, DBG_EMERG, ("Init MAC failed\n"));
1382 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
1384 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b);
1386 err = rtl8821ae_download_fw(hw, false);
1388 RT_TRACE(COMP_ERR, DBG_WARNING,
1389 ("Failed to download FW. Init HW "
1390 "without FW now..\n"));
1392 rtlhal->bfw_ready = false;
1395 rtlhal->bfw_ready = true;
1397 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1398 rtlhal->bfw_clk_change_in_progress = false;
1399 rtlhal->ballow_sw_to_change_hwclc = false;
1400 rtlhal->last_hmeboxnum = 0;
1402 /*SIC_Init(Adapter);
1403 if(pHalData->AMPDUBurstMode)
1404 PlatformEFIOWrite1Byte(Adapter,REG_AMPDU_BURST_MODE_8812, 0x7F);*/
1406 rtl8821ae_phy_mac_config(hw);
1407 /* because last function modify RCR, so we update
1408 * rcr var here, or TP will unstable for receive_config
1409 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
1410 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1411 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
1412 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1413 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);*/
1414 rtl8821ae_phy_bb_config(hw);
1416 rtl8821ae_phy_rf_config(hw);
1418 _rtl8821ae_hw_configure(hw);
1420 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
1422 /*set wireless mode*/
1424 rtlhal->b_mac_func_enable = true;
1426 rtl_cam_reset_all_entry(hw);
1428 rtl8821ae_enable_hw_security_config(hw);
1430 ppsc->rfpwr_state = ERFON;
1432 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1433 _rtl8821ae_enable_aspm_back_door(hw);
1434 rtlpriv->intf_ops->enable_aspm(hw);
1436 //rtl8821ae_bt_hw_init(hw);
1437 rtlpriv->rtlhal.being_init_adapter = false;
1439 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_NAV_UPPER, (u8 *)&nav_upper);
1441 //rtl8821ae_dm_check_txpower_tracking(hw);
1442 //rtl8821ae_phy_lc_calibrate(hw);
1445 tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1446 if (tmp_u1b & BIT(2)) {
1447 /* Release Rx DMA if needed*/
1449 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
1452 /* Release Tx/Rx PCIE DMA if*/
1453 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
1455 rtl8821ae_dm_init(hw);
1456 rtl8821ae_macid_initialize_mediastatus(hw);
1458 RT_TRACE(COMP_INIT, DBG_LOUD, ("rtl8821ae_hw_init() <====\n"));
1462 static enum version_8821ae _rtl8821ae_read_chip_version(struct ieee80211_hw *hw)
1464 struct rtl_priv *rtlpriv = rtl_priv(hw);
1465 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1466 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1467 enum version_8821ae version = VERSION_UNKNOWN;
1470 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
1471 RT_TRACE(COMP_INIT, DBG_LOUD, ("ReadChipVersion8812A 0xF0 = 0x%x \n", value32));
1475 if(rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1476 rtlphy->rf_type = RF_2T2R;
1477 else if(rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE)
1478 rtlphy->rf_type = RF_1T1R;
1480 RT_TRACE(COMP_INIT, DBG_LOUD, ("RF_Type is %x!!\n", rtlphy->rf_type));
1483 if (value32 & TRP_VAUX_EN)
1485 if(rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1487 if(rtlphy->rf_type == RF_2T2R)
1488 version = VERSION_TEST_CHIP_2T2R_8812;
1490 version = VERSION_TEST_CHIP_1T1R_8812;
1493 version = VERSION_TEST_CHIP_8821;
1495 if(rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1497 u32 rtl_id = ((value32 & CHIP_VER_RTL_MASK) >> 12) +1 ;
1499 if(rtlphy->rf_type == RF_2T2R)
1500 version = (enum version_8821ae)(CHIP_8812 | NORMAL_CHIP | RF_TYPE_2T2R);
1502 version = (enum version_8821ae)(CHIP_8812 | NORMAL_CHIP);
1504 version = (enum version_8821ae)(version| (rtl_id << 12));
1506 else if(rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE)
1508 u32 rtl_id = value32 & CHIP_VER_RTL_MASK;
1510 version = (enum version_8821ae)(CHIP_8821 | NORMAL_CHIP | rtl_id);
1514 RT_TRACE(COMP_INIT, DBG_LOUD,
1515 ("Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
1516 "RF_2T2R" : "RF_1T1R"));
1518 if(rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE)
1521 value32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
1522 rtlphy->hw_rof_enable= ((value32 & WL_HWROF_EN) ? 1 : 0);
1527 case VERSION_TEST_CHIP_1T1R_8812:
1528 RT_TRACE(COMP_INIT, DBG_LOUD,
1529 ("Chip Version ID: VERSION_TEST_CHIP_1T1R_8812.\n"));
1531 case VERSION_TEST_CHIP_2T2R_8812:
1532 RT_TRACE(COMP_INIT, DBG_LOUD,
1533 ("Chip Version ID: VERSION_TEST_CHIP_2T2R_8812.\n"));
1535 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812:
1536 RT_TRACE(COMP_INIT, DBG_LOUD,
1537 ("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_1T1R_8812.\n"));
1539 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812:
1540 RT_TRACE(COMP_INIT, DBG_LOUD,
1541 ("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812.\n"));
1543 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812_C_CUT:
1544 RT_TRACE(COMP_INIT, DBG_LOUD,
1545 ("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_1T1R_8812 C CUT.\n"));
1547 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812_C_CUT:
1548 RT_TRACE(COMP_INIT, DBG_LOUD,
1549 ("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812 C CUT.\n"));
1551 case VERSION_TEST_CHIP_8821:
1552 RT_TRACE(COMP_INIT, DBG_LOUD,
1553 ("Chip Version ID: VERSION_TEST_CHIP_8821.\n"));
1555 case VERSION_NORMAL_TSMC_CHIP_8821:
1556 RT_TRACE(COMP_INIT, DBG_LOUD,
1557 ("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 A CUT.\n"));
1559 case VERSION_NORMAL_TSMC_CHIP_8821_B_CUT:
1560 RT_TRACE(COMP_INIT, DBG_LOUD,
1561 ("Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 B CUT.\n"));
1564 RT_TRACE(COMP_INIT, DBG_LOUD,
1565 ("Chip Version ID: Unknow (0x%X).\n", version));
1572 static int _rtl8821ae_set_media_status(struct ieee80211_hw *hw,
1573 enum nl80211_iftype type)
1575 struct rtl_priv *rtlpriv = rtl_priv(hw);
1576 u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
1577 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1580 rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0);
1581 RT_TRACE(COMP_BEACON, DBG_LOUD,
1582 ("clear 0x550 when set HW_VAR_MEDIA_STATUS\n"));
1584 if (type == NL80211_IFTYPE_UNSPECIFIED ||
1585 type == NL80211_IFTYPE_STATION) {
1586 _rtl8821ae_stop_tx_beacon(hw);
1587 _rtl8821ae_enable_bcn_sub_func(hw);
1588 } else if (type == NL80211_IFTYPE_ADHOC ||
1589 type == NL80211_IFTYPE_AP) {
1590 _rtl8821ae_resume_tx_beacon(hw);
1591 _rtl8821ae_disable_bcn_sub_func(hw);
1593 RT_TRACE(COMP_ERR, DBG_WARNING,("Set HW_VAR_MEDIA_STATUS: "
1594 "No such media status(%x).\n", type));
1598 case NL80211_IFTYPE_UNSPECIFIED:
1599 bt_msr |= MSR_NOLINK;
1600 ledaction = LED_CTL_LINK;
1601 RT_TRACE(COMP_INIT, DBG_TRACE, ("Set Network type to NO LINK!\n"));
1603 case NL80211_IFTYPE_ADHOC:
1604 bt_msr |= MSR_ADHOC;
1605 RT_TRACE(COMP_INIT, DBG_TRACE, ("Set Network type to Ad Hoc!\n"));
1607 case NL80211_IFTYPE_STATION:
1608 bt_msr |= MSR_INFRA;
1609 ledaction = LED_CTL_LINK;
1610 RT_TRACE(COMP_INIT, DBG_TRACE, ("Set Network type to STA!\n"));
1612 case NL80211_IFTYPE_AP:
1614 RT_TRACE(COMP_INIT, DBG_TRACE, ("Set Network type to AP!\n"));
1617 RT_TRACE(COMP_ERR, DBG_EMERG, ("Network type %d not support!\n", type));
1623 rtl_write_byte(rtlpriv, (MSR), bt_msr);
1624 rtlpriv->cfg->ops->led_control(hw, ledaction);
1625 if ((bt_msr & 0xfc) == MSR_AP)
1626 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1628 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
1633 void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1635 struct rtl_priv *rtlpriv = rtl_priv(hw);
1636 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1637 u32 reg_rcr = rtlpci->receive_config;
1639 if (rtlpriv->psc.rfpwr_state != ERFON)
1642 if (check_bssid == true) {
1643 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1644 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1646 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
1647 } else if (check_bssid == false) {
1648 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
1649 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
1650 rtlpriv->cfg->ops->set_hw_reg(hw,
1651 HW_VAR_RCR, (u8 *) (®_rcr));
1656 int rtl8821ae_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
1658 struct rtl_priv *rtlpriv = rtl_priv(hw);
1660 RT_TRACE(COMP_INIT, DBG_LOUD, ("rtl8821ae_set_network_type!\n"));
1662 if (_rtl8821ae_set_media_status(hw, type))
1665 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1666 if (type != NL80211_IFTYPE_AP)
1667 rtl8821ae_set_check_bssid(hw, true);
1669 rtl8821ae_set_check_bssid(hw, false);
1675 /* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */
1676 void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci)
1678 struct rtl_priv *rtlpriv = rtl_priv(hw);
1679 rtl8821ae_dm_init_edca_turbo(hw);
1682 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
1685 /* rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, u4b_ac_param); */
1688 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
1691 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
1694 RT_ASSERT(false, ("invalid aci: %d !\n", aci));
1699 void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
1701 struct rtl_priv *rtlpriv = rtl_priv(hw);
1702 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1704 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
1705 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
1706 rtlpci->irq_enabled = true;
1707 /* there are some C2H CMDs have been sent before system interrupt is enabled, e.g., C2H, CPWM.
1708 *So we need to clear all C2H events that FW has notified, otherwise FW won't schedule any commands anymore.
1710 //rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0);
1711 /*enable system interrupt*/
1712 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
1715 void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw)
1717 struct rtl_priv *rtlpriv = rtl_priv(hw);
1718 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1720 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1721 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1722 rtlpci->irq_enabled = false;
1723 synchronize_irq(rtlpci->pdev->irq);
1726 static void _rtl8821ae_poweroff_adapter(struct ieee80211_hw *hw)
1728 struct rtl_priv *rtlpriv = rtl_priv(hw);
1729 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1732 rtlhal->b_mac_func_enable = false;
1734 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1735 /* Combo (PCIe + USB) Card and PCIe-MF Card */
1736 /* 1. Run LPS WL RFOFF flow */
1737 //RT_TRACE(COMP_INIT, DBG_LOUD, ("=====>CardDisableRTL8812E,RTL8821A_NIC_LPS_ENTER_FLOW\n"));
1738 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1739 PWR_INTF_PCI_MSK, RTL8821A_NIC_LPS_ENTER_FLOW);
1741 /* 2. 0x1F[7:0] = 0 */
1743 //rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00);
1744 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1745 rtlhal->bfw_ready ) {
1746 rtl8821ae_firmware_selfreset(hw);
1749 /* Reset MCU. Suggested by Filen. */
1750 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1751 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
1753 /* g. MCUFWDL 0x80[1:0]=0 */
1754 /* reset MCU ready status */
1755 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1757 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1758 /* HW card disable configuration. */
1759 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1760 PWR_INTF_PCI_MSK, RTL8821A_NIC_DISABLE_FLOW);
1762 /* HW card disable configuration. */
1763 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1764 PWR_INTF_PCI_MSK, RTL8812_NIC_DISABLE_FLOW);
1767 /* Reset MCU IO Wrapper */
1768 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1769 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1770 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1771 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1773 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1774 /* lock ISO/CLK/Power control register */
1775 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1778 void rtl8821ae_card_disable(struct ieee80211_hw *hw)
1780 struct rtl_priv *rtlpriv = rtl_priv(hw);
1781 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1782 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1783 enum nl80211_iftype opmode;
1785 RT_TRACE(COMP_INIT, DBG_LOUD,
1786 ("rtl8821ae_card_disable.\n"));
1788 mac->link_state = MAC80211_NOLINK;
1789 opmode = NL80211_IFTYPE_UNSPECIFIED;
1790 _rtl8821ae_set_media_status(hw, opmode);
1791 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1792 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
1793 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1794 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1795 _rtl8821ae_poweroff_adapter(hw);
1797 /* after power off we should do iqk again */
1798 rtlpriv->phy.iqk_initialized = false;
1801 void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw,
1802 u32 *p_inta, u32 *p_intb)
1804 struct rtl_priv *rtlpriv = rtl_priv(hw);
1805 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1807 *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
1808 rtl_write_dword(rtlpriv, ISR, *p_inta);
1811 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
1812 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
1817 void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw)
1820 struct rtl_priv *rtlpriv = rtl_priv(hw);
1821 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1822 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1823 u16 bcn_interval, atim_window;
1825 bcn_interval = mac->beacon_interval;
1826 atim_window = 2; /*FIX MERGE */
1827 rtl8821ae_disable_interrupt(hw);
1828 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
1829 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1830 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
1831 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
1832 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
1833 rtl_write_byte(rtlpriv, 0x606, 0x30);
1834 rtlpci->reg_bcn_ctrl_val |= BIT(3);
1835 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val);
1836 rtl8821ae_enable_interrupt(hw);
1839 void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw)
1841 struct rtl_priv *rtlpriv = rtl_priv(hw);
1842 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1843 u16 bcn_interval = mac->beacon_interval;
1845 RT_TRACE(COMP_BEACON, DBG_DMESG,
1846 ("beacon_interval:%d\n", bcn_interval));
1847 rtl8821ae_disable_interrupt(hw);
1848 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1849 rtl8821ae_enable_interrupt(hw);
1852 void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw,
1853 u32 add_msr, u32 rm_msr)
1855 struct rtl_priv *rtlpriv = rtl_priv(hw);
1856 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1858 RT_TRACE(COMP_INTR, DBG_LOUD,
1859 ("add_msr:%x, rm_msr:%x\n", add_msr, rm_msr));
1862 rtlpci->irq_mask[0] |= add_msr;
1864 rtlpci->irq_mask[0] &= (~rm_msr);
1865 rtl8821ae_disable_interrupt(hw);
1866 rtl8821ae_enable_interrupt(hw);
1869 static u8 _rtl8821ae_get_chnl_group(u8 chnl)
1874 if (1 <= chnl && chnl <= 2 )
1876 else if (3 <= chnl && chnl <= 5 )
1878 else if (6 <= chnl && chnl <= 8 )
1880 else if (9 <= chnl && chnl <= 11)
1882 else /*if (12 <= chnl && chnl <= 14)*/
1885 if (36 <= chnl && chnl <= 42)
1887 else if (44 <= chnl && chnl <= 48)
1889 else if (50 <= chnl && chnl <= 58)
1891 else if (60 <= chnl && chnl <= 64)
1893 else if (100 <= chnl && chnl <= 106)
1895 else if (108 <= chnl && chnl <= 114)
1897 else if (116 <= chnl && chnl <= 122)
1899 else if (124 <= chnl && chnl <= 130)
1901 else if (132 <= chnl && chnl <= 138)
1903 else if (140 <= chnl && chnl <= 144)
1905 else if (149 <= chnl && chnl <= 155)
1907 else if (157 <= chnl && chnl <= 161)
1909 else if (165 <= chnl && chnl <= 171)
1911 else if (173 <= chnl && chnl <= 177)
1914 /*RT_TRACE(COMP_EFUSE,DBG_LOUD,
1915 ("5G, Channel %d in Group not found \n",chnl));*/
1916 RT_ASSERT(!COMP_EFUSE,
1917 ("5G, Channel %d in Group not found \n",chnl));
1922 static void _rtl8821ae_read_power_value_fromprom(struct ieee80211_hw *hw,
1923 struct txpower_info_2g *pwrinfo24g,
1924 struct txpower_info_5g *pwrinfo5g,
1928 struct rtl_priv *rtlpriv = rtl_priv(hw);
1929 u32 rfPath, eeAddr=EEPROM_TX_PWR_INX, group,TxCount=0;
1931 RT_TRACE(COMP_INIT, DBG_LOUD, ("hal_ReadPowerValueFromPROM8821ae(): PROMContent[0x%x]=0x%x\n", (eeAddr+1), hwinfo[eeAddr+1]));
1932 if (0xFF == hwinfo[eeAddr+1]) /*YJ,add,120316*/
1933 autoload_fail = true;
1937 RT_TRACE(COMP_INIT, DBG_LOUD, ("auto load fail : Use Default value!\n"));
1938 for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) {
1939 /*2.4G default value*/
1940 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1941 pwrinfo24g->index_cck_base[rfPath][group] = 0x2D;
1942 pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D;
1944 for (TxCount = 0;TxCount < MAX_TX_COUNT;TxCount++) {
1946 pwrinfo24g->bw20_diff[rfPath][0] = 0x02;
1947 pwrinfo24g->ofdm_diff[rfPath][0] = 0x04;
1949 pwrinfo24g->bw20_diff[rfPath][TxCount] = 0xFE;
1950 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0xFE;
1951 pwrinfo24g->cck_diff[rfPath][TxCount] = 0xFE;
1952 pwrinfo24g->ofdm_diff[rfPath][TxCount] = 0xFE;
1955 /*5G default value*/
1956 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++)
1957 pwrinfo5g->index_bw40_base[rfPath][group] = 0x2A;
1959 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
1961 pwrinfo5g->ofdm_diff[rfPath][0] = 0x04;
1962 pwrinfo5g->bw20_diff[rfPath][0] = 0x00;
1963 pwrinfo5g->bw80_diff[rfPath][0] = 0xFE;
1964 pwrinfo5g->bw160_diff[rfPath][0] = 0xFE;
1966 pwrinfo5g->ofdm_diff[rfPath][0] = 0xFE;
1967 pwrinfo5g->bw20_diff[rfPath][0] = 0xFE;
1968 pwrinfo5g->bw40_diff[rfPath][0] = 0xFE;
1969 pwrinfo5g->bw80_diff[rfPath][0] = 0xFE;
1970 pwrinfo5g->bw160_diff[rfPath][0] = 0xFE;
1977 rtl_priv(hw)->efuse.b_txpwr_fromeprom = true;
1979 for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) {
1980 /*2.4G default value*/
1981 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1982 pwrinfo24g->index_cck_base[rfPath][group] = hwinfo[eeAddr++];
1983 if (pwrinfo24g->index_cck_base[rfPath][group] == 0xFF)
1984 pwrinfo24g->index_cck_base[rfPath][group] = 0x2D;
1986 for (group = 0 ; group < MAX_CHNL_GROUP_24G - 1; group++) {
1987 pwrinfo24g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++];
1988 if (pwrinfo24g->index_bw40_base[rfPath][group] == 0xFF)
1989 pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D;
1991 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount ++) {
1993 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0;
1994 if (hwinfo[eeAddr] == 0xFF) {
1995 pwrinfo24g->bw20_diff[rfPath][TxCount] = 0x02;
1997 pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
1998 if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3)) /*bit sign number to 8 bit sign number*/
1999 pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0;
2002 if (hwinfo[eeAddr] == 0xFF) {
2003 pwrinfo24g->ofdm_diff[rfPath][TxCount] = 0x04;
2005 pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2006 if(pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3)) /*bit sign number to 8 bit sign number*/
2007 pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2009 pwrinfo24g->cck_diff[rfPath][TxCount] = 0;
2012 if (hwinfo[eeAddr] == 0xFF) {
2013 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0xFE;
2015 pwrinfo24g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr]&0xf0) >> 4;
2016 if (pwrinfo24g->bw40_diff[rfPath][TxCount] & BIT(3))
2017 pwrinfo24g->bw40_diff[rfPath][TxCount] |= 0xF0;
2020 if (hwinfo[eeAddr] == 0xFF) {
2021 pwrinfo24g->bw20_diff[rfPath][TxCount] = 0xFE;
2023 pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2024 if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3))
2025 pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0;
2030 if (hwinfo[eeAddr] == 0xFF) {
2031 pwrinfo24g->ofdm_diff[rfPath][TxCount] = 0xFE;
2033 pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2034 if(pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3))
2035 pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2038 if (hwinfo[eeAddr] == 0xFF) {
2039 pwrinfo24g->cck_diff[rfPath][TxCount] = 0xFE;
2041 pwrinfo24g->cck_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2042 if(pwrinfo24g->cck_diff[rfPath][TxCount] & BIT(3))
2043 pwrinfo24g->cck_diff[rfPath][TxCount] |= 0xF0;
2049 /*5G default value*/
2050 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group ++) {
2051 pwrinfo5g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++];
2052 if (pwrinfo5g->index_bw40_base[rfPath][group] == 0xFF)
2053 pwrinfo5g->index_bw40_base[rfPath][group] = 0xFE;
2056 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2058 pwrinfo5g->bw40_diff[rfPath][TxCount] = 0;
2059 if (hwinfo[eeAddr] == 0xFF) {
2060 pwrinfo5g->bw20_diff[rfPath][TxCount] = 0x0;
2062 pwrinfo5g->bw20_diff[rfPath][0] = (hwinfo[eeAddr] & 0xf0) >> 4;
2063 if(pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3))
2064 pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0;
2067 if (hwinfo[eeAddr] == 0xFF) {
2068 pwrinfo5g->ofdm_diff[rfPath][TxCount] = 0x4;
2070 pwrinfo5g->ofdm_diff[rfPath][0] = (hwinfo[eeAddr] & 0x0f);
2071 if(pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3))
2072 pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2076 if (hwinfo[eeAddr] == 0xFF) {
2077 pwrinfo5g->bw40_diff[rfPath][TxCount] = 0xFE;
2079 pwrinfo5g->bw40_diff[rfPath][TxCount]= (hwinfo[eeAddr] & 0xf0) >> 4;
2080 if(pwrinfo5g->bw40_diff[rfPath][TxCount] & BIT(3))
2081 pwrinfo5g->bw40_diff[rfPath][TxCount] |= 0xF0;
2084 if (hwinfo[eeAddr] == 0xFF) {
2085 pwrinfo5g->bw20_diff[rfPath][TxCount] = 0xFE;
2087 pwrinfo5g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2088 if(pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3))
2089 pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0;
2095 if (hwinfo[eeAddr] == 0xFF) {
2096 pwrinfo5g->ofdm_diff[rfPath][1] = 0xFE;
2097 pwrinfo5g->ofdm_diff[rfPath][2] = 0xFE;
2099 pwrinfo5g->ofdm_diff[rfPath][1] = (hwinfo[eeAddr] & 0xf0) >> 4;
2100 pwrinfo5g->ofdm_diff[rfPath][2] = (hwinfo[eeAddr] & 0x0f);
2103 if (hwinfo[eeAddr] == 0xFF)
2104 pwrinfo5g->ofdm_diff[rfPath][3] = 0xFE;
2106 pwrinfo5g->ofdm_diff[rfPath][3] = (hwinfo[eeAddr] & 0x0f);
2110 for (TxCount = 1; TxCount < MAX_TX_COUNT; TxCount++) {
2111 if (pwrinfo5g->ofdm_diff[rfPath][TxCount] == 0xFF)
2112 pwrinfo5g->ofdm_diff[rfPath][TxCount] = 0xFE;
2113 else if(pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3))
2114 pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2116 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2117 if (hwinfo[eeAddr] == 0xFF) {
2118 pwrinfo5g->bw80_diff[rfPath][TxCount] = 0xFE;
2120 pwrinfo5g->bw80_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2121 if(pwrinfo5g->bw80_diff[rfPath][TxCount] & BIT(3)) //4bit sign number to 8 bit sign number
2122 pwrinfo5g->bw80_diff[rfPath][TxCount] |= 0xF0;
2125 if (hwinfo[eeAddr] == 0xFF) {
2126 pwrinfo5g->bw160_diff[rfPath][TxCount] = 0xFE;
2128 pwrinfo5g->bw160_diff[rfPath][TxCount]= (hwinfo[eeAddr] & 0x0f);
2129 if(pwrinfo5g->bw160_diff[rfPath][TxCount] & BIT(3)) //4bit sign number to 8 bit sign number
2130 pwrinfo5g->bw160_diff[rfPath][TxCount] |= 0xF0;
2137 static void _rtl8812ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2141 struct rtl_priv *rtlpriv = rtl_priv(hw);
2142 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2143 struct txpower_info_2g pwrinfo24g;
2144 struct txpower_info_5g pwrinfo5g;
2145 u8 channel5g[CHANNEL_MAX_NUMBER_5G] =
2146 {36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112,
2147 114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,149,151,
2148 153,155,157,159,161,163,165,167,168,169,171,173,175,177};
2149 u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {42, 58, 106, 122, 138, 155, 171};
2153 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g, &pwrinfo5g, autoload_fail, hwinfo);
2155 for (rf_path = 0; rf_path < 2; rf_path++) {
2156 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2157 index = _rtl8821ae_get_chnl_group(i + 1);
2159 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2160 rtlefuse->txpwrlevel_cck[rf_path][i] =
2161 pwrinfo24g.index_cck_base[rf_path][5];
2162 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2163 pwrinfo24g.index_bw40_base[rf_path][index];
2165 rtlefuse->txpwrlevel_cck[rf_path][i] =
2166 pwrinfo24g.index_cck_base[rf_path][index];
2167 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2168 pwrinfo24g.index_bw40_base[rf_path][index];
2172 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2173 index = _rtl8821ae_get_chnl_group(channel5g[i]);
2174 rtlefuse->txpwr_5g_bw40base[rf_path][i] = pwrinfo5g.index_bw40_base[rf_path][index];
2176 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2178 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2179 upper = pwrinfo5g.index_bw40_base[rf_path][index];
2180 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2182 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2184 for (i = 0; i < MAX_TX_COUNT; i++) {
2185 rtlefuse->txpwr_cckdiff[rf_path][i] = pwrinfo24g.cck_diff[rf_path][i];
2186 rtlefuse->txpwr_legacyhtdiff[rf_path][i] = pwrinfo24g.ofdm_diff[rf_path][i];
2187 rtlefuse->txpwr_ht20diff[rf_path][i] = pwrinfo24g.bw20_diff[rf_path][i];
2188 rtlefuse->txpwr_ht40diff[rf_path][i] = pwrinfo24g.bw40_diff[rf_path][i];
2190 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] = pwrinfo5g.ofdm_diff[rf_path][i];
2191 rtlefuse->txpwr_5g_bw20diff[rf_path][i] = pwrinfo5g.bw20_diff[rf_path][i];
2192 rtlefuse->txpwr_5g_bw40diff[rf_path][i] = pwrinfo5g.bw40_diff[rf_path][i];
2193 rtlefuse->txpwr_5g_bw80diff[rf_path][i] = pwrinfo5g.bw80_diff[rf_path][i];
2197 if (!autoload_fail){
2198 rtlefuse->eeprom_regulatory =
2199 hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;/*bit0~2*/
2200 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2201 rtlefuse->eeprom_regulatory = 0;
2203 rtlefuse->eeprom_regulatory = 0;
2206 RTPRINT(rtlpriv, FINIT, INIT_TxPower,
2207 ("eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory ));
2210 static void _rtl8821ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2214 struct rtl_priv *rtlpriv = rtl_priv(hw);
2215 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2216 struct txpower_info_2g pwrinfo24g;
2217 struct txpower_info_5g pwrinfo5g;
2218 u8 channel5g[CHANNEL_MAX_NUMBER_5G] =
2219 {36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112,
2220 114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,149,151,
2221 153,155,157,159,161,163,165,167,168,169,171,173,175,177};
2222 u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {42, 58, 106, 122, 138, 155, 171};
2226 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g, &pwrinfo5g, autoload_fail, hwinfo);
2228 for (rf_path = 0; rf_path < 2; rf_path++) {
2229 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2230 index = _rtl8821ae_get_chnl_group(i + 1);
2232 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2233 rtlefuse->txpwrlevel_cck[rf_path][i] = pwrinfo24g.index_cck_base[rf_path][5];
2234 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = pwrinfo24g.index_bw40_base[rf_path][index];
2236 rtlefuse->txpwrlevel_cck[rf_path][i] = pwrinfo24g.index_cck_base[rf_path][index];
2237 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = pwrinfo24g.index_bw40_base[rf_path][index];
2241 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2242 index = _rtl8821ae_get_chnl_group(channel5g[i]);
2243 rtlefuse->txpwr_5g_bw40base[rf_path][i] = pwrinfo5g.index_bw40_base[rf_path][index];
2245 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2247 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2248 upper = pwrinfo5g.index_bw40_base[rf_path][index];
2249 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2251 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2253 for (i = 0; i < MAX_TX_COUNT; i++) {
2254 rtlefuse->txpwr_cckdiff[rf_path][i] = pwrinfo24g.cck_diff[rf_path][i];
2255 rtlefuse->txpwr_legacyhtdiff[rf_path][i] = pwrinfo24g.ofdm_diff[rf_path][i];
2256 rtlefuse->txpwr_ht20diff[rf_path][i] = pwrinfo24g.bw20_diff[rf_path][i];
2257 rtlefuse->txpwr_ht40diff[rf_path][i] = pwrinfo24g.bw40_diff[rf_path][i];
2259 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] = pwrinfo5g.ofdm_diff[rf_path][i];
2260 rtlefuse->txpwr_5g_bw20diff[rf_path][i] = pwrinfo5g.bw20_diff[rf_path][i];
2261 rtlefuse->txpwr_5g_bw40diff[rf_path][i] = pwrinfo5g.bw40_diff[rf_path][i];
2262 rtlefuse->txpwr_5g_bw80diff[rf_path][i] = pwrinfo5g.bw80_diff[rf_path][i];
2266 if (!autoload_fail){
2267 rtlefuse->eeprom_regulatory = hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;/*bit0~2*/
2268 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2269 rtlefuse->eeprom_regulatory = 0;
2271 rtlefuse->eeprom_regulatory = 0;
2274 RTPRINT(rtlpriv, FINIT, INIT_TxPower,
2275 ("eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory ));
2278 static void _rtl8812ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_test )
2280 struct rtl_priv *rtlpriv = rtl_priv(hw);
2281 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2282 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2283 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2285 u8 hwinfo[HWSET_MAX_SIZE];
2288 if (b_pseudo_test) {
2292 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
2293 rtl_efuse_shadow_map_update(hw);
2294 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
2296 } else if (rtlefuse->epromtype == EEPROM_93C46) {
2297 RT_TRACE(COMP_ERR, DBG_EMERG,
2298 ("RTL819X Not boot from eeprom, check it !!"));
2301 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, ("MAP \n"),
2302 hwinfo, HWSET_MAX_SIZE);
2304 eeprom_id = *((u16 *) & hwinfo[0]);
2305 if (eeprom_id != RTL_EEPROM_ID) {
2306 RT_TRACE(COMP_ERR, DBG_WARNING,
2307 ("EEPROM ID(%#x) is invalid!!\n", eeprom_id));
2308 rtlefuse->autoload_failflag = true;
2310 RT_TRACE(COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
2311 rtlefuse->autoload_failflag = false;
2314 if (rtlefuse->autoload_failflag == true) {
2315 RT_TRACE(COMP_ERR, DBG_EMERG,
2316 ("RTL8812AE autoload_failflag, check it !!"));
2320 rtlefuse->eeprom_version = *(u8 *) & hwinfo[EEPROM_VERSION];
2321 if (rtlefuse->eeprom_version == 0xff)
2322 rtlefuse->eeprom_version = 0;
2324 RT_TRACE(COMP_INIT, DBG_LOUD,
2325 ("EEPROM version: 0x%2x\n", rtlefuse->eeprom_version));
2327 rtlefuse->eeprom_vid = *(u16 *) &hwinfo[EEPROM_VID];
2328 rtlefuse->eeprom_did = *(u16 *) &hwinfo[EEPROM_DID];
2329 rtlefuse->eeprom_svid = *(u16 *) &hwinfo[EEPROM_SVID];
2330 rtlefuse->eeprom_smid = *(u16 *) &hwinfo[EEPROM_SMID];
2331 RT_TRACE(COMP_INIT, DBG_LOUD,
2332 ("EEPROMId = 0x%4x\n", eeprom_id));
2333 RT_TRACE(COMP_INIT, DBG_LOUD,
2334 ("EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid));
2335 RT_TRACE(COMP_INIT, DBG_LOUD,
2336 ("EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did));
2337 RT_TRACE(COMP_INIT, DBG_LOUD,
2338 ("EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid));
2339 RT_TRACE(COMP_INIT, DBG_LOUD,
2340 ("EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid));
2343 rtlefuse->eeprom_oemid = *(u8 *) & hwinfo[EEPROM_CUSTOMER_ID];
2344 if (rtlefuse->eeprom_oemid == 0xFF)
2345 rtlefuse->eeprom_oemid = 0;
2347 RT_TRACE(COMP_INIT, DBG_LOUD,
2348 ("EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid));
2350 for (i = 0; i < 6; i += 2) {
2351 usvalue = *(u16 *) & hwinfo[EEPROM_MAC_ADDR + i];
2352 *((u16 *) (&rtlefuse->dev_addr[i])) = usvalue;
2355 RT_TRACE(COMP_INIT, DBG_DMESG,
2356 ("dev_addr: %pM\n", rtlefuse->dev_addr));
2358 _rtl8812ae_read_txpower_info_from_hwpg(hw,
2359 rtlefuse->autoload_failflag, hwinfo);
2362 rtlefuse->board_type = (((*(u8 *) & hwinfo[EEPROM_RF_BOARD_OPTION]) & 0xE0 ) >> 5);
2363 if ((*(u8 *) & hwinfo[EEPROM_RF_BOARD_OPTION]) == 0xff )
2364 rtlefuse->board_type = 0;
2365 rtlhal->boad_type = rtlefuse->board_type;
2367 rtl8812ae_read_bt_coexist_info_from_hwpg(hw,
2368 rtlefuse->autoload_failflag, hwinfo);
2370 rtlefuse->eeprom_channelplan = *(u8 *) & hwinfo[EEPROM_CHANNELPLAN];
2371 if (rtlefuse->eeprom_channelplan == 0xff)
2372 rtlefuse->eeprom_channelplan = 0x7F;
2374 /* set channel paln to world wide 13 */
2375 //rtlefuse->channel_plan = (u8) rtlefuse->eeprom_channelplan;
2378 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8821AE];
2379 if ( rtlefuse->crystalcap == 0xFF )
2380 rtlefuse->crystalcap = 0x20;
2382 rtlefuse->eeprom_thermalmeter = *(u8 *) & hwinfo[EEPROM_THERMAL_METER];
2383 if ((rtlefuse->eeprom_thermalmeter == 0xff) ||rtlefuse->autoload_failflag )
2385 rtlefuse->b_apk_thermalmeterignore = true;
2386 rtlefuse->eeprom_thermalmeter = 0xff;
2389 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
2390 RT_TRACE(COMP_INIT, DBG_LOUD,
2391 ("thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter));
2393 if (rtlefuse->autoload_failflag == false) {
2394 rtlefuse->antenna_div_cfg = *(u8 *) & hwinfo[EEPROM_RF_BOARD_OPTION] & 0x18 >> 3;
2395 if (*(u8 *) & hwinfo[EEPROM_RF_BOARD_OPTION] == 0xff)
2396 rtlefuse->antenna_div_cfg = 0x00;
2398 rtlefuse->antenna_div_cfg = 0;*/
2399 rtlefuse->antenna_div_type = *(u8 *) & hwinfo[EEPROM_RF_ANTENNA_OPT_88E];
2400 if (rtlefuse->antenna_div_type == 0xFF)
2402 rtlefuse->antenna_div_type = FIXED_HW_ANTDIV;
2405 rtlefuse->antenna_div_cfg = 0;
2406 rtlefuse->antenna_div_type = 0;
2409 RT_TRACE(COMP_INIT, DBG_LOUD,
2410 ("SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n",
2411 rtlefuse->antenna_div_cfg, rtlefuse->antenna_div_type));
2413 /*Hal_ReadPAType_8821A()*/
2414 /*Hal_EfuseParseRateIndicationOption8821A()*/
2415 /*Hal_ReadEfusePCIeCap8821AE()*/
2417 pcipriv->ledctl.bled_opendrain = true;
2419 if (rtlhal->oem_id == RT_CID_DEFAULT) {
2420 switch (rtlefuse->eeprom_oemid) {
2421 case RT_CID_DEFAULT:
2423 case EEPROM_CID_TOSHIBA:
2424 rtlhal->oem_id = RT_CID_TOSHIBA;
2426 case EEPROM_CID_CCX:
2427 rtlhal->oem_id = RT_CID_CCX;
2429 case EEPROM_CID_QMI:
2430 rtlhal->oem_id = RT_CID_819x_QMI;
2432 case EEPROM_CID_WHQL:
2441 static void _rtl8821ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_test )
2443 struct rtl_priv *rtlpriv = rtl_priv(hw);
2444 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2445 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2446 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2448 u8 hwinfo[HWSET_MAX_SIZE];
2451 if (b_pseudo_test) {
2455 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
2456 rtl_efuse_shadow_map_update(hw);
2457 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
2459 } else if (rtlefuse->epromtype == EEPROM_93C46) {
2460 RT_TRACE(COMP_ERR, DBG_EMERG,
2461 ("RTL819X Not boot from eeprom, check it !!"));
2464 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, ("MAP \n"),
2465 hwinfo, HWSET_MAX_SIZE);
2467 eeprom_id = *((u16 *) & hwinfo[0]);
2468 if (eeprom_id != RTL_EEPROM_ID) {
2469 RT_TRACE(COMP_ERR, DBG_WARNING,
2470 ("EEPROM ID(%#x) is invalid!!\n", eeprom_id));
2471 rtlefuse->autoload_failflag = true;
2473 RT_TRACE(COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
2474 rtlefuse->autoload_failflag = false;
2477 if (rtlefuse->autoload_failflag == true) {
2478 RT_TRACE(COMP_ERR, DBG_EMERG,
2479 ("RTL8812AE autoload_failflag, check it !!"));
2483 rtlefuse->eeprom_version = *(u8 *) & hwinfo[EEPROM_VERSION];
2484 if (rtlefuse->eeprom_version == 0xff)
2485 rtlefuse->eeprom_version = 0;
2487 RT_TRACE(COMP_INIT, DBG_LOUD,
2488 ("EEPROM version: 0x%2x\n", rtlefuse->eeprom_version));
2490 rtlefuse->eeprom_vid = *(u16 *) &hwinfo[EEPROM_VID];
2491 rtlefuse->eeprom_did = *(u16 *) &hwinfo[EEPROM_DID];
2492 rtlefuse->eeprom_svid = *(u16 *) &hwinfo[EEPROM_SVID];
2493 rtlefuse->eeprom_smid = *(u16 *) &hwinfo[EEPROM_SMID];
2494 RT_TRACE(COMP_INIT, DBG_LOUD,
2495 ("EEPROMId = 0x%4x\n", eeprom_id));
2496 RT_TRACE(COMP_INIT, DBG_LOUD,
2497 ("EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid));
2498 RT_TRACE(COMP_INIT, DBG_LOUD,
2499 ("EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did));
2500 RT_TRACE(COMP_INIT, DBG_LOUD,
2501 ("EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid));
2502 RT_TRACE(COMP_INIT, DBG_LOUD,
2503 ("EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid));
2506 rtlefuse->eeprom_oemid = *(u8 *) & hwinfo[EEPROM_CUSTOMER_ID];
2507 if (rtlefuse->eeprom_oemid == 0xFF)
2508 rtlefuse->eeprom_oemid = 0;
2510 RT_TRACE(COMP_INIT, DBG_LOUD,
2511 ("EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid));
2513 for (i = 0; i < 6; i += 2) {
2514 usvalue = *(u16 *) & hwinfo[EEPROM_MAC_ADDR + i];
2515 *((u16 *) (&rtlefuse->dev_addr[i])) = usvalue;
2518 RT_TRACE(COMP_INIT, DBG_DMESG,
2519 ("dev_addr: %pM\n", rtlefuse->dev_addr));
2521 _rtl8821ae_read_txpower_info_from_hwpg(hw,
2522 rtlefuse->autoload_failflag, hwinfo);
2525 rtlefuse->board_type = (((*(u8 *) & hwinfo[EEPROM_RF_BOARD_OPTION]) & 0xE0 ) >> 5);
2526 if ((*(u8 *) & hwinfo[EEPROM_RF_BOARD_OPTION]) == 0xff )
2527 rtlefuse->board_type = 0;
2528 rtlhal->boad_type = rtlefuse->board_type;
2530 rtl8821ae_read_bt_coexist_info_from_hwpg(hw,
2531 rtlefuse->autoload_failflag, hwinfo);
2533 rtlefuse->eeprom_channelplan = *(u8 *) & hwinfo[EEPROM_CHANNELPLAN];
2534 if (rtlefuse->eeprom_channelplan == 0xff)
2535 rtlefuse->eeprom_channelplan = 0x7F;
2537 /* set channel paln to world wide 13 */
2538 //rtlefuse->channel_plan = (u8) rtlefuse->eeprom_channelplan;
2541 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8821AE];
2542 if ( rtlefuse->crystalcap == 0xFF )
2543 rtlefuse->crystalcap = 0x20;
2545 rtlefuse->eeprom_thermalmeter = *(u8 *) & hwinfo[EEPROM_THERMAL_METER];
2546 if ((rtlefuse->eeprom_thermalmeter == 0xff) ||rtlefuse->autoload_failflag )
2548 rtlefuse->b_apk_thermalmeterignore = true;
2549 rtlefuse->eeprom_thermalmeter = 0x18;
2552 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
2553 RT_TRACE(COMP_INIT, DBG_LOUD,
2554 ("thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter));
2556 if (rtlefuse->autoload_failflag == false) {
2557 rtlefuse->antenna_div_cfg = (*(u8 *) & hwinfo[EEPROM_RF_BOARD_OPTION] & BIT(3))?true:false;
2559 rtlefuse->antenna_div_cfg = 0;*/
2561 rtlefuse->antenna_div_type = CG_TRX_HW_ANTDIV;
2563 rtlefuse->antenna_div_cfg = 0;
2564 rtlefuse->antenna_div_type = 0;
2567 RT_TRACE(COMP_INIT, DBG_LOUD,
2568 ("SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n",
2569 rtlefuse->antenna_div_cfg, rtlefuse->antenna_div_type));
2571 pcipriv->ledctl.bled_opendrain = true;
2573 if (rtlhal->oem_id == RT_CID_DEFAULT) {
2574 switch (rtlefuse->eeprom_oemid) {
2575 case RT_CID_DEFAULT:
2577 case EEPROM_CID_TOSHIBA:
2578 rtlhal->oem_id = RT_CID_TOSHIBA;
2580 case EEPROM_CID_CCX:
2581 rtlhal->oem_id = RT_CID_CCX;
2583 case EEPROM_CID_QMI:
2584 rtlhal->oem_id = RT_CID_819x_QMI;
2586 case EEPROM_CID_WHQL:
2595 /*static void _rtl8821ae_hal_customized_behavior(struct ieee80211_hw *hw)
2597 struct rtl_priv *rtlpriv = rtl_priv(hw);
2598 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2599 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2601 pcipriv->ledctl.bled_opendrain = true;
2602 switch (rtlhal->oem_id) {
2603 case RT_CID_819x_HP:
2604 pcipriv->ledctl.bled_opendrain = true;
2606 case RT_CID_819x_Lenovo:
2607 case RT_CID_DEFAULT:
2608 case RT_CID_TOSHIBA:
2610 case RT_CID_819x_Acer:
2615 RT_TRACE(COMP_INIT, DBG_DMESG,
2616 ("RT Customized ID: 0x%02X\n", rtlhal->oem_id));
2619 void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw)
2621 struct rtl_priv *rtlpriv = rtl_priv(hw);
2622 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2623 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2624 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2627 rtlhal->version = _rtl8821ae_read_chip_version(hw);
2629 if (get_rf_type(rtlphy) == RF_1T1R)
2630 rtlpriv->dm.brfpath_rxenable[0] = true;
2632 rtlpriv->dm.brfpath_rxenable[0] =
2633 rtlpriv->dm.brfpath_rxenable[1] = true;
2634 RT_TRACE(COMP_INIT, DBG_LOUD, ("VersionID = 0x%4x\n",
2637 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
2638 if (tmp_u1b & BIT(4)) {
2639 RT_TRACE(COMP_INIT, DBG_DMESG, ("Boot from EEPROM\n"));
2640 rtlefuse->epromtype = EEPROM_93C46;
2642 RT_TRACE(COMP_INIT, DBG_DMESG, ("Boot from EFUSE\n"));
2643 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
2646 if (tmp_u1b & BIT(5)) {
2647 RT_TRACE(COMP_INIT, DBG_LOUD, ("Autoload OK\n"));
2648 rtlefuse->autoload_failflag = false;
2649 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
2650 _rtl8812ae_read_adapter_info(hw, false);
2651 else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE)
2652 _rtl8821ae_read_adapter_info(hw, false);
2654 RT_TRACE(COMP_ERR, DBG_EMERG, ("Autoload ERR!!\n"));
2656 /*hal_ReadRFType_8812A()*/
2657 //_rtl8821ae_hal_customized_behavior(hw);
2660 static void rtl8821ae_update_hal_rate_table(struct ieee80211_hw *hw,
2661 struct ieee80211_sta *sta)
2663 struct rtl_priv *rtlpriv = rtl_priv(hw);
2664 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
2665 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2666 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2667 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2670 u8 b_nmode = mac->ht_enable;
2671 u8 mimo_ps = IEEE80211_SMPS_OFF;
2674 u8 b_curtxbw_40mhz = mac->bw_40;
2675 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2677 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2679 enum wireless_mode wirelessmode = mac->mode;
2681 if (rtlhal->current_bandtype == BAND_ON_5G)
2682 ratr_value = sta->supp_rates[1] << 4;
2684 ratr_value = sta->supp_rates[0];
2685 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2687 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
2688 sta->ht_cap.mcs.rx_mask[0] << 12);
2689 switch (wirelessmode) {
2690 case WIRELESS_MODE_B:
2691 if (ratr_value & 0x0000000c)
2692 ratr_value &= 0x0000000d;
2694 ratr_value &= 0x0000000f;
2696 case WIRELESS_MODE_G:
2697 ratr_value &= 0x00000FF5;
2699 case WIRELESS_MODE_N_24G:
2700 case WIRELESS_MODE_N_5G:
2702 if (mimo_ps == IEEE80211_SMPS_STATIC) {
2703 ratr_value &= 0x0007F005;
2707 if (get_rf_type(rtlphy) == RF_1T2R ||
2708 get_rf_type(rtlphy) == RF_1T1R)
2709 ratr_mask = 0x000ff005;
2711 ratr_mask = 0x0f0ff005;
2713 ratr_value &= ratr_mask;
2717 if (rtlphy->rf_type == RF_1T2R)
2718 ratr_value &= 0x000ff0ff;
2720 ratr_value &= 0x0f0ff0ff;
2725 if ( (rtlpcipriv->btcoexist.bt_coexistence) &&
2726 (rtlpcipriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
2727 (rtlpcipriv->btcoexist.bt_cur_state) &&
2728 (rtlpcipriv->btcoexist.bt_ant_isolation) &&
2729 ((rtlpcipriv->btcoexist.bt_service == BT_SCO)||
2730 (rtlpcipriv->btcoexist.bt_service == BT_BUSY)) )
2731 ratr_value &= 0x0fffcfc0;
2733 ratr_value &= 0x0FFFFFFF;
2735 if (b_nmode && ((b_curtxbw_40mhz &&
2736 b_curshortgi_40mhz) || (!b_curtxbw_40mhz &&
2737 b_curshortgi_20mhz))) {
2739 ratr_value |= 0x10000000;
2740 tmp_ratr_value = (ratr_value >> 12);
2742 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
2743 if ((1 << shortgi_rate) & tmp_ratr_value)
2747 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
2748 (shortgi_rate << 4) | (shortgi_rate);
2751 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
2753 RT_TRACE(COMP_RATR, DBG_DMESG,
2754 ("%x\n", rtl_read_dword(rtlpriv, REG_ARFR0)));
2758 static u8 _rtl8821ae_mrate_idx_to_arfr_id(
2759 struct ieee80211_hw *hw, u8 rate_index,
2760 enum wireless_mode wirelessmode)
2762 struct rtl_priv *rtlpriv = rtl_priv(hw);
2763 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2766 case RATR_INX_WIRELESS_NGB:
2767 if(rtlphy->rf_type == RF_1T1R)
2772 case RATR_INX_WIRELESS_N:
2773 case RATR_INX_WIRELESS_NG:
2774 if(rtlphy->rf_type == RF_1T1R)
2779 case RATR_INX_WIRELESS_NB:
2780 if(rtlphy->rf_type == RF_1T1R)
2785 case RATR_INX_WIRELESS_GB:
2788 case RATR_INX_WIRELESS_G:
2791 case RATR_INX_WIRELESS_B:
2794 case RATR_INX_WIRELESS_MC:
2795 if ((wirelessmode == WIRELESS_MODE_B)
2796 || (wirelessmode == WIRELESS_MODE_G)
2797 || (wirelessmode == WIRELESS_MODE_N_24G)
2798 || (wirelessmode == WIRELESS_MODE_AC_24G))
2802 case RATR_INX_WIRELESS_AC_5N:
2803 if(rtlphy->rf_type == RF_1T1R)
2808 case RATR_INX_WIRELESS_AC_24N:
2809 if(rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
2811 if(rtlphy->rf_type == RF_1T1R)
2816 if(rtlphy->rf_type == RF_1T1R)
2828 static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
2829 struct ieee80211_sta *sta, u8 rssi_level)
2831 struct rtl_priv *rtlpriv = rtl_priv(hw);
2832 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2833 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2834 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2835 struct rtl_sta_info * sta_entry = NULL;
2838 u8 b_curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
2840 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2842 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2844 enum wireless_mode wirelessmode = 0;
2845 bool b_shortgi = false;
2848 u8 mimo_ps = IEEE80211_SMPS_OFF;
2850 sta_entry = (struct rtl_sta_info *) sta->drv_priv;
2851 wirelessmode = sta_entry->wireless_mode;
2852 if (mac->opmode == NL80211_IFTYPE_STATION ||
2853 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2854 b_curtxbw_40mhz = mac->bw_40;
2855 else if (mac->opmode == NL80211_IFTYPE_AP ||
2856 mac->opmode == NL80211_IFTYPE_ADHOC)
2857 macid = sta->aid + 1;
2859 ratr_bitmap = sta->supp_rates[0];
2861 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2862 ratr_bitmap = 0xfff;
2864 ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
2865 sta->ht_cap.mcs.rx_mask[0] << 12);
2867 switch (wirelessmode) {
2868 case WIRELESS_MODE_B:
2869 ratr_index = RATR_INX_WIRELESS_B;
2870 if (ratr_bitmap & 0x0000000c)
2871 ratr_bitmap &= 0x0000000d;
2873 ratr_bitmap &= 0x0000000f;
2875 case WIRELESS_MODE_G:
2876 ratr_index = RATR_INX_WIRELESS_GB;
2878 if (rssi_level == 1)
2879 ratr_bitmap &= 0x00000f00;
2880 else if (rssi_level == 2)
2881 ratr_bitmap &= 0x00000ff0;
2883 ratr_bitmap &= 0x00000ff5;
2885 case WIRELESS_MODE_A:
2886 ratr_index = RATR_INX_WIRELESS_G;
2887 ratr_bitmap &= 0x00000ff0;
2889 case WIRELESS_MODE_N_24G:
2890 case WIRELESS_MODE_N_5G:
2891 if (wirelessmode == WIRELESS_MODE_N_24G)
2892 ratr_index = RATR_INX_WIRELESS_NGB;
2894 ratr_index = RATR_INX_WIRELESS_NG;
2896 if (mimo_ps == IEEE80211_SMPS_STATIC || mimo_ps == IEEE80211_SMPS_DYNAMIC) {
2897 if (rssi_level == 1)
2898 ratr_bitmap &= 0x00070000;
2899 else if (rssi_level == 2)
2900 ratr_bitmap &= 0x0007f000;
2902 ratr_bitmap &= 0x0007f005;
2904 if ( rtlphy->rf_type == RF_1T1R) {
2905 if (b_curtxbw_40mhz) {
2906 if (rssi_level == 1)
2907 ratr_bitmap &= 0x000f0000;
2908 else if (rssi_level == 2)
2909 ratr_bitmap &= 0x000ff000;
2911 ratr_bitmap &= 0x000ff015;
2913 if (rssi_level == 1)
2914 ratr_bitmap &= 0x000f0000;
2915 else if (rssi_level == 2)
2916 ratr_bitmap &= 0x000ff000;
2918 ratr_bitmap &= 0x000ff005;
2921 if (b_curtxbw_40mhz) {
2922 if (rssi_level == 1)
2923 ratr_bitmap &= 0x0fff0000;
2924 else if (rssi_level == 2)
2925 ratr_bitmap &= 0x0ffff000;
2927 ratr_bitmap &= 0x0ffff015;
2929 if (rssi_level == 1)
2930 ratr_bitmap &= 0x0fff0000;
2931 else if (rssi_level == 2)
2932 ratr_bitmap &= 0x0ffff000;
2934 ratr_bitmap &= 0x0ffff005;
2938 if ((b_curtxbw_40mhz && b_curshortgi_40mhz) ||
2939 (!b_curtxbw_40mhz && b_curshortgi_20mhz)) {
2943 else if (macid == 1)
2948 case WIRELESS_MODE_AC_24G:
2949 ratr_index = RATR_INX_WIRELESS_AC_24N;
2951 ratr_bitmap &= 0xfc3f0000;
2952 else if(rssi_level == 2)
2953 ratr_bitmap &= 0xfffff000;
2955 ratr_bitmap &= 0xffffffff;
2958 case WIRELESS_MODE_AC_5G:
2959 ratr_index = RATR_INX_WIRELESS_AC_5N;
2961 if (rtlphy->rf_type == RF_1T1R)
2963 if(rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
2965 if(rssi_level == 1) /*add by Gary for ac-series*/
2966 ratr_bitmap &= 0x003f8000;
2967 else if (rssi_level == 2)
2968 ratr_bitmap &= 0x003ff000;
2970 ratr_bitmap &= 0x003ff010;
2973 ratr_bitmap &= 0x000ff010;
2977 if(rssi_level == 1) /* add by Gary for ac-series*/
2978 ratr_bitmap &= 0xfe3f8000; /*VHT 2SS MCS3~9*/
2979 else if (rssi_level == 2)
2980 ratr_bitmap &= 0xfffff000; /*VHT 2SS MCS0~9*/
2982 ratr_bitmap &= 0xfffff010; /*All*/
2987 ratr_index = RATR_INX_WIRELESS_NGB;
2989 if (rtlphy->rf_type == RF_1T2R)
2990 ratr_bitmap &= 0x000ff0ff;
2992 ratr_bitmap &= 0x0f0ff0ff;
2997 sta_entry->ratr_index = ratr_index;
2999 RT_TRACE(COMP_RATR, DBG_DMESG,
3000 ("ratr_bitmap :%x\n", ratr_bitmap));
3001 *(u32 *) & rate_mask = EF4BYTE((ratr_bitmap & 0x0fffffff) |
3002 (ratr_index << 28));
3003 rate_mask[0] = macid;
3004 rate_mask[1] = _rtl8821ae_mrate_idx_to_arfr_id(hw, ratr_index, wirelessmode) | (b_shortgi ? 0x80 : 0x00);
3005 rate_mask[2] = b_curtxbw_40mhz;
3006 /* if (prox_priv->proxim_modeinfo->power_output > 0)
3007 rate_mask[2] |= BIT(6); */
3009 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
3010 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >>8);
3011 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
3012 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
3014 RT_TRACE(COMP_RATR, DBG_DMESG, ("Rate_index:%x, "
3015 "ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
3016 ratr_index, ratr_bitmap,
3017 rate_mask[0], rate_mask[1],
3018 rate_mask[2], rate_mask[3],
3019 rate_mask[4], rate_mask[5],
3021 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RA_MASK, 7, rate_mask);
3022 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
3025 void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
3026 struct ieee80211_sta *sta, u8 rssi_level)
3028 struct rtl_priv *rtlpriv = rtl_priv(hw);
3029 if (rtlpriv->dm.b_useramask)
3030 rtl8821ae_update_hal_rate_mask(hw, sta, rssi_level);
3032 /*RT_TRACE(COMP_RATR,DBG_LOUD,("rtl8821ae_update_hal_rate_tbl(): Error! 8821ae FW RA Only"));*/
3033 rtl8821ae_update_hal_rate_table(hw, sta);
3036 void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw)
3038 struct rtl_priv *rtlpriv = rtl_priv(hw);
3039 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3042 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
3043 (u8 *) & mac->slot_time);
3044 if (!mac->ht_enable)
3045 sifs_timer = 0x0a0a;
3047 sifs_timer = 0x0e0e;
3048 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *) & sifs_timer);
3051 bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 * valid)
3053 struct rtl_priv *rtlpriv = rtl_priv(hw);
3054 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3055 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3056 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
3058 bool b_actuallyset = false;
3060 if (rtlpriv->rtlhal.being_init_adapter)
3063 if (ppsc->b_swrf_processing)
3066 spin_lock(&rtlpriv->locks.rf_ps_lock);
3067 if (ppsc->rfchange_inprogress) {
3068 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3071 ppsc->rfchange_inprogress = true;
3072 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3075 cur_rfstate = ppsc->rfpwr_state;
3077 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
3078 rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL_2) & ~(BIT(1)));
3080 u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
3082 if (rtlphy->polarity_ctl) {
3083 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
3085 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
3088 if ((ppsc->b_hwradiooff == true) && (e_rfpowerstate_toset == ERFON)) {
3089 RT_TRACE(COMP_RF, DBG_DMESG,
3090 ("GPIOChangeRF - HW Radio ON, RF ON\n"));
3092 e_rfpowerstate_toset = ERFON;
3093 ppsc->b_hwradiooff = false;
3094 b_actuallyset = true;
3095 } else if ((ppsc->b_hwradiooff == false)
3096 && (e_rfpowerstate_toset == ERFOFF)) {
3097 RT_TRACE(COMP_RF, DBG_DMESG,
3098 ("GPIOChangeRF - HW Radio OFF, RF OFF\n"));
3100 e_rfpowerstate_toset = ERFOFF;
3101 ppsc->b_hwradiooff = true;
3102 b_actuallyset = true;
3105 if (b_actuallyset) {
3106 spin_lock(&rtlpriv->locks.rf_ps_lock);
3107 ppsc->rfchange_inprogress = false;
3108 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3110 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
3111 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3113 spin_lock(&rtlpriv->locks.rf_ps_lock);
3114 ppsc->rfchange_inprogress = false;
3115 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3119 return !ppsc->b_hwradiooff;
3123 void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index,
3124 u8 *p_macaddr, bool is_group, u8 enc_algo,
3125 bool is_wepkey, bool clear_all)
3127 struct rtl_priv *rtlpriv = rtl_priv(hw);
3128 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3129 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3130 u8 *macaddr = p_macaddr;
3132 bool is_pairwise = false;
3134 static u8 cam_const_addr[4][6] = {
3135 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3136 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3137 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3138 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
3140 static u8 cam_const_broad[] = {
3141 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3147 u8 clear_number = 5;
3149 RT_TRACE(COMP_SEC, DBG_DMESG, ("clear_all\n"));
3151 for (idx = 0; idx < clear_number; idx++) {
3152 rtl_cam_mark_invalid(hw, cam_offset + idx);
3153 rtl_cam_empty_entry(hw, cam_offset + idx);
3156 memset(rtlpriv->sec.key_buf[idx], 0,
3158 rtlpriv->sec.key_len[idx] = 0;
3164 case WEP40_ENCRYPTION:
3165 enc_algo = CAM_WEP40;
3167 case WEP104_ENCRYPTION:
3168 enc_algo = CAM_WEP104;
3170 case TKIP_ENCRYPTION:
3171 enc_algo = CAM_TKIP;
3173 case AESCCMP_ENCRYPTION:
3177 RT_TRACE(COMP_ERR, DBG_EMERG, ("switch case "
3179 enc_algo = CAM_TKIP;
3183 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
3184 macaddr = cam_const_addr[key_index];
3185 entry_id = key_index;
3188 macaddr = cam_const_broad;
3189 entry_id = key_index;
3191 if (mac->opmode == NL80211_IFTYPE_AP) {
3192 entry_id = rtl_cam_get_free_entry(hw, p_macaddr);
3193 if (entry_id >= TOTAL_CAM_ENTRY) {
3194 RT_TRACE(COMP_SEC, DBG_EMERG,
3195 ("Can not find free hw security cam entry\n"));
3199 entry_id = CAM_PAIRWISE_KEY_POSITION;
3202 key_index = PAIRWISE_KEYIDX;
3207 if (rtlpriv->sec.key_len[key_index] == 0) {
3208 RT_TRACE(COMP_SEC, DBG_DMESG,
3209 ("delete one entry, entry_id is %d\n",entry_id));
3210 if (mac->opmode == NL80211_IFTYPE_AP)
3211 rtl_cam_del_entry(hw, p_macaddr);
3212 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
3214 RT_TRACE(COMP_SEC, DBG_DMESG, ("add one entry\n"));
3216 RT_TRACE(COMP_SEC, DBG_DMESG, ("set Pairwiase key\n"));
3218 rtl_cam_add_one_entry(hw, macaddr, key_index,
3220 CAM_CONFIG_NO_USEDK,
3221 rtlpriv->sec.key_buf[key_index]);
3223 RT_TRACE(COMP_SEC, DBG_DMESG, ("set group key\n"));
3225 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
3226 rtl_cam_add_one_entry(hw,
3229 CAM_PAIRWISE_KEY_POSITION,
3231 CAM_CONFIG_NO_USEDK,
3232 rtlpriv->sec.key_buf
3236 rtl_cam_add_one_entry(hw, macaddr, key_index,
3238 CAM_CONFIG_NO_USEDK,
3239 rtlpriv->sec.key_buf[entry_id]);
3247 void rtl8812ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3248 bool auto_load_fail, u8 *hwinfo)
3250 struct rtl_priv *rtlpriv = rtl_priv(hw);
3253 if (!auto_load_fail) {
3254 value = *(u8 *) & hwinfo[EEPROM_RF_BOARD_OPTION];
3255 if (((value & 0xe0) >> 5) == 0x1)
3256 rtlpriv->btcoexist.btc_info.btcoexist = 1;
3258 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3259 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3261 value = hwinfo[EEPROM_RF_BT_SETTING];
3262 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3264 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3265 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3266 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3268 /*move BT_InitHalVars() to init_sw_vars*/
3271 void rtl8821ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3272 bool auto_load_fail, u8 *hwinfo)
3274 struct rtl_priv *rtlpriv = rtl_priv(hw);
3278 if (!auto_load_fail) {
3279 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
3280 if(tmpu_32 & BIT(18))
3281 rtlpriv->btcoexist.btc_info.btcoexist = 1;
3283 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3284 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3286 value = hwinfo[EEPROM_RF_BT_SETTING];
3287 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3289 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3290 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3291 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3293 /*move BT_InitHalVars() to init_sw_vars*/
3296 void rtl8821ae_bt_reg_init(struct ieee80211_hw* hw)
3298 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
3300 /* 0:Low, 1:High, 2:From Efuse. */
3301 rtlpcipriv->btcoexist.b_reg_bt_iso = 2;
3302 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
3303 rtlpcipriv->btcoexist.b_reg_bt_sco= 3;
3304 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
3305 rtlpcipriv->btcoexist.b_reg_bt_sco= 0;
3309 void rtl8821ae_bt_hw_init(struct ieee80211_hw* hw)
3311 struct rtl_priv *rtlpriv = rtl_priv(hw);
3313 if (rtlpriv->cfg->ops->get_btc_status()){
3314 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
3318 void rtl8821ae_suspend(struct ieee80211_hw *hw)
3322 void rtl8821ae_resume(struct ieee80211_hw *hw)
3326 /* Turn on AAP (RCR:bit 0) for promicuous mode. */
3327 void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw,
3328 bool allow_all_da, bool write_into_reg)
3330 struct rtl_priv *rtlpriv = rtl_priv(hw);
3331 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3333 if (allow_all_da) /* Set BIT0 */
3334 rtlpci->receive_config |= RCR_AAP;
3335 else /* Clear BIT0 */
3336 rtlpci->receive_config &= ~RCR_AAP;
3339 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
3342 RT_TRACE(COMP_TURBO | COMP_INIT, DBG_LOUD,
3343 ("receive_config=0x%08X, write_into_reg=%d\n",
3344 rtlpci->receive_config, write_into_reg ));