0001
0002
0003
0004 #include "../wifi.h"
0005 #include "../efuse.h"
0006 #include "../base.h"
0007 #include "../regd.h"
0008 #include "../cam.h"
0009 #include "../ps.h"
0010 #include "../pci.h"
0011 #include "reg.h"
0012 #include "def.h"
0013 #include "phy.h"
0014 #include "dm.h"
0015 #include "fw.h"
0016 #include "led.h"
0017 #include "hw.h"
0018 #include "../pwrseqcmd.h"
0019 #include "pwrseq.h"
0020 #include "../btcoexist/rtl_btc.h"
0021
0022 #define LLT_CONFIG 5
0023
0024 static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw)
0025 {
0026 struct rtl_priv *rtlpriv = rtl_priv(hw);
0027 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0028 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
0029 unsigned long flags;
0030
0031 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
0032 while (skb_queue_len(&ring->queue)) {
0033 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
0034 struct sk_buff *skb = __skb_dequeue(&ring->queue);
0035
0036 dma_unmap_single(&rtlpci->pdev->dev,
0037 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry,
0038 true, HW_DESC_TXBUFF_ADDR),
0039 skb->len, DMA_TO_DEVICE);
0040 kfree_skb(skb);
0041 ring->idx = (ring->idx + 1) % ring->entries;
0042 }
0043 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
0044 }
0045
0046 static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
0047 u8 set_bits, u8 clear_bits)
0048 {
0049 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0050 struct rtl_priv *rtlpriv = rtl_priv(hw);
0051
0052 rtlpci->reg_bcn_ctrl_val |= set_bits;
0053 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
0054
0055 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
0056 }
0057
0058 void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw)
0059 {
0060 struct rtl_priv *rtlpriv = rtl_priv(hw);
0061 u8 tmp1byte;
0062
0063 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
0064 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
0065 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
0066 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
0067 tmp1byte &= ~(BIT(0));
0068 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
0069 }
0070
0071 void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw)
0072 {
0073 struct rtl_priv *rtlpriv = rtl_priv(hw);
0074 u8 tmp1byte;
0075
0076 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
0077 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
0078 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
0079 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
0080 tmp1byte |= BIT(0);
0081 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
0082 }
0083
0084 static void _rtl8821ae_enable_bcn_sub_func(struct ieee80211_hw *hw)
0085 {
0086 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(1));
0087 }
0088
0089 static void _rtl8821ae_disable_bcn_sub_func(struct ieee80211_hw *hw)
0090 {
0091 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(1), 0);
0092 }
0093
0094 static void _rtl8821ae_set_fw_clock_on(struct ieee80211_hw *hw,
0095 u8 rpwm_val, bool b_need_turn_off_ckk)
0096 {
0097 struct rtl_priv *rtlpriv = rtl_priv(hw);
0098 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0099 bool b_support_remote_wake_up;
0100 u32 count = 0, isr_regaddr, content;
0101 bool b_schedule_timer = b_need_turn_off_ckk;
0102
0103 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
0104 (u8 *)(&b_support_remote_wake_up));
0105
0106 if (!rtlhal->fw_ready)
0107 return;
0108 if (!rtlpriv->psc.fw_current_inpsmode)
0109 return;
0110
0111 while (1) {
0112 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
0113 if (rtlhal->fw_clk_change_in_progress) {
0114 while (rtlhal->fw_clk_change_in_progress) {
0115 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
0116 count++;
0117 udelay(100);
0118 if (count > 1000)
0119 goto change_done;
0120 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
0121 }
0122 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
0123 } else {
0124 rtlhal->fw_clk_change_in_progress = false;
0125 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
0126 goto change_done;
0127 }
0128 }
0129 change_done:
0130 if (IS_IN_LOW_POWER_STATE_8821AE(rtlhal->fw_ps_state)) {
0131 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
0132 (u8 *)(&rpwm_val));
0133 if (FW_PS_IS_ACK(rpwm_val)) {
0134 isr_regaddr = REG_HISR;
0135 content = rtl_read_dword(rtlpriv, isr_regaddr);
0136 while (!(content & IMR_CPWM) && (count < 500)) {
0137 udelay(50);
0138 count++;
0139 content = rtl_read_dword(rtlpriv, isr_regaddr);
0140 }
0141
0142 if (content & IMR_CPWM) {
0143 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
0144 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_8821AE;
0145 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
0146 "Receive CPWM INT!!! Set rtlhal->FwPSState = %X\n",
0147 rtlhal->fw_ps_state);
0148 }
0149 }
0150
0151 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
0152 rtlhal->fw_clk_change_in_progress = false;
0153 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
0154 if (b_schedule_timer)
0155 mod_timer(&rtlpriv->works.fw_clockoff_timer,
0156 jiffies + MSECS(10));
0157 } else {
0158 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
0159 rtlhal->fw_clk_change_in_progress = false;
0160 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
0161 }
0162 }
0163
0164 static void _rtl8821ae_set_fw_clock_off(struct ieee80211_hw *hw,
0165 u8 rpwm_val)
0166 {
0167 struct rtl_priv *rtlpriv = rtl_priv(hw);
0168 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0169 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0170 struct rtl8192_tx_ring *ring;
0171 enum rf_pwrstate rtstate;
0172 bool b_schedule_timer = false;
0173 u8 queue;
0174
0175 if (!rtlhal->fw_ready)
0176 return;
0177 if (!rtlpriv->psc.fw_current_inpsmode)
0178 return;
0179 if (!rtlhal->allow_sw_to_change_hwclc)
0180 return;
0181 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
0182 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
0183 return;
0184
0185 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
0186 ring = &rtlpci->tx_ring[queue];
0187 if (skb_queue_len(&ring->queue)) {
0188 b_schedule_timer = true;
0189 break;
0190 }
0191 }
0192
0193 if (b_schedule_timer) {
0194 mod_timer(&rtlpriv->works.fw_clockoff_timer,
0195 jiffies + MSECS(10));
0196 return;
0197 }
0198
0199 if (FW_PS_STATE(rtlhal->fw_ps_state) !=
0200 FW_PS_STATE_RF_OFF_LOW_PWR_8821AE) {
0201 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
0202 if (!rtlhal->fw_clk_change_in_progress) {
0203 rtlhal->fw_clk_change_in_progress = true;
0204 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
0205 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
0206 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
0207 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
0208 (u8 *)(&rpwm_val));
0209 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
0210 rtlhal->fw_clk_change_in_progress = false;
0211 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
0212 } else {
0213 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
0214 mod_timer(&rtlpriv->works.fw_clockoff_timer,
0215 jiffies + MSECS(10));
0216 }
0217 }
0218 }
0219
0220 static void _rtl8821ae_set_fw_ps_rf_on(struct ieee80211_hw *hw)
0221 {
0222 u8 rpwm_val = 0;
0223
0224 rpwm_val |= (FW_PS_STATE_RF_OFF_8821AE | FW_PS_ACK);
0225 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, true);
0226 }
0227
0228 static void _rtl8821ae_fwlps_leave(struct ieee80211_hw *hw)
0229 {
0230 struct rtl_priv *rtlpriv = rtl_priv(hw);
0231 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0232 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0233 bool fw_current_inps = false;
0234 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
0235
0236 if (ppsc->low_power_enable) {
0237 rpwm_val = (FW_PS_STATE_ALL_ON_8821AE|FW_PS_ACK);
0238 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, false);
0239 rtlhal->allow_sw_to_change_hwclc = false;
0240 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
0241 (u8 *)(&fw_pwrmode));
0242 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
0243 (u8 *)(&fw_current_inps));
0244 } else {
0245 rpwm_val = FW_PS_STATE_ALL_ON_8821AE;
0246 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
0247 (u8 *)(&rpwm_val));
0248 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
0249 (u8 *)(&fw_pwrmode));
0250 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
0251 (u8 *)(&fw_current_inps));
0252 }
0253 }
0254
0255 static void _rtl8821ae_fwlps_enter(struct ieee80211_hw *hw)
0256 {
0257 struct rtl_priv *rtlpriv = rtl_priv(hw);
0258 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0259 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0260 bool fw_current_inps = true;
0261 u8 rpwm_val;
0262
0263 if (ppsc->low_power_enable) {
0264 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_8821AE;
0265 rtlpriv->cfg->ops->set_hw_reg(hw,
0266 HW_VAR_FW_PSMODE_STATUS,
0267 (u8 *)(&fw_current_inps));
0268 rtlpriv->cfg->ops->set_hw_reg(hw,
0269 HW_VAR_H2C_FW_PWRMODE,
0270 (u8 *)(&ppsc->fwctrl_psmode));
0271 rtlhal->allow_sw_to_change_hwclc = true;
0272 _rtl8821ae_set_fw_clock_off(hw, rpwm_val);
0273 } else {
0274 rpwm_val = FW_PS_STATE_RF_OFF_8821AE;
0275 rtlpriv->cfg->ops->set_hw_reg(hw,
0276 HW_VAR_FW_PSMODE_STATUS,
0277 (u8 *)(&fw_current_inps));
0278 rtlpriv->cfg->ops->set_hw_reg(hw,
0279 HW_VAR_H2C_FW_PWRMODE,
0280 (u8 *)(&ppsc->fwctrl_psmode));
0281 rtlpriv->cfg->ops->set_hw_reg(hw,
0282 HW_VAR_SET_RPWM,
0283 (u8 *)(&rpwm_val));
0284 }
0285 }
0286
0287 static void _rtl8821ae_download_rsvd_page(struct ieee80211_hw *hw,
0288 bool dl_whole_packets)
0289 {
0290 struct rtl_priv *rtlpriv = rtl_priv(hw);
0291 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
0292 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
0293 u8 count = 0, dlbcn_count = 0;
0294 bool send_beacon = false;
0295
0296 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
0297 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr | BIT(0)));
0298
0299 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
0300 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
0301
0302 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
0303 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
0304 tmp_reg422 & (~BIT(6)));
0305 if (tmp_reg422 & BIT(6))
0306 send_beacon = true;
0307
0308 do {
0309 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
0310 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
0311 (bcnvalid_reg | BIT(0)));
0312 _rtl8821ae_return_beacon_queue_skb(hw);
0313
0314 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
0315 rtl8812ae_set_fw_rsvdpagepkt(hw, false,
0316 dl_whole_packets);
0317 else
0318 rtl8821ae_set_fw_rsvdpagepkt(hw, false,
0319 dl_whole_packets);
0320
0321 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
0322 count = 0;
0323 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
0324 count++;
0325 udelay(10);
0326 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
0327 }
0328 dlbcn_count++;
0329 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
0330
0331 if (!(bcnvalid_reg & BIT(0)))
0332 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0333 "Download RSVD page failed!\n");
0334 if (bcnvalid_reg & BIT(0) && rtlhal->enter_pnp_sleep) {
0335 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, bcnvalid_reg | BIT(0));
0336 _rtl8821ae_return_beacon_queue_skb(hw);
0337 if (send_beacon) {
0338 dlbcn_count = 0;
0339 do {
0340 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
0341 bcnvalid_reg | BIT(0));
0342
0343 _rtl8821ae_return_beacon_queue_skb(hw);
0344
0345 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
0346 rtl8812ae_set_fw_rsvdpagepkt(hw, true,
0347 false);
0348 else
0349 rtl8821ae_set_fw_rsvdpagepkt(hw, true,
0350 false);
0351
0352
0353 bcnvalid_reg = rtl_read_byte(rtlpriv,
0354 REG_TDECTRL + 2);
0355 count = 0;
0356 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
0357 count++;
0358 udelay(10);
0359 bcnvalid_reg =
0360 rtl_read_byte(rtlpriv,
0361 REG_TDECTRL + 2);
0362 }
0363 dlbcn_count++;
0364 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
0365
0366 if (!(bcnvalid_reg & BIT(0)))
0367 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0368 "2 Download RSVD page failed!\n");
0369 }
0370 }
0371
0372 if (bcnvalid_reg & BIT(0))
0373 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0));
0374
0375 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
0376 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
0377
0378 if (send_beacon)
0379 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
0380
0381 if (!rtlhal->enter_pnp_sleep) {
0382 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
0383 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0))));
0384 }
0385 }
0386
0387 void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
0388 {
0389 struct rtl_priv *rtlpriv = rtl_priv(hw);
0390 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0391 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0392 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
0393
0394 switch (variable) {
0395 case HW_VAR_ETHER_ADDR:
0396 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_MACID);
0397 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_MACID + 4);
0398 break;
0399 case HW_VAR_BSSID:
0400 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_BSSID);
0401 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_BSSID+4);
0402 break;
0403 case HW_VAR_MEDIA_STATUS:
0404 val[0] = rtl_read_byte(rtlpriv, MSR) & 0x3;
0405 break;
0406 case HW_VAR_SLOT_TIME:
0407 *((u8 *)(val)) = mac->slot_time;
0408 break;
0409 case HW_VAR_BEACON_INTERVAL:
0410 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_BCN_INTERVAL);
0411 break;
0412 case HW_VAR_ATIM_WINDOW:
0413 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_ATIMWND);
0414 break;
0415 case HW_VAR_RCR:
0416 *((u32 *)(val)) = rtlpci->receive_config;
0417 break;
0418 case HW_VAR_RF_STATE:
0419 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
0420 break;
0421 case HW_VAR_FWLPS_RF_ON:{
0422 enum rf_pwrstate rfstate;
0423 u32 val_rcr;
0424
0425 rtlpriv->cfg->ops->get_hw_reg(hw,
0426 HW_VAR_RF_STATE,
0427 (u8 *)(&rfstate));
0428 if (rfstate == ERFOFF) {
0429 *((bool *)(val)) = true;
0430 } else {
0431 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
0432 val_rcr &= 0x00070000;
0433 if (val_rcr)
0434 *((bool *)(val)) = false;
0435 else
0436 *((bool *)(val)) = true;
0437 }
0438 break; }
0439 case HW_VAR_FW_PSMODE_STATUS:
0440 *((bool *)(val)) = ppsc->fw_current_inpsmode;
0441 break;
0442 case HW_VAR_CORRECT_TSF:{
0443 u64 tsf;
0444 u32 *ptsf_low = (u32 *)&tsf;
0445 u32 *ptsf_high = ((u32 *)&tsf) + 1;
0446
0447 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
0448 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
0449
0450 *((u64 *)(val)) = tsf;
0451
0452 break; }
0453 case HAL_DEF_WOWLAN:
0454 if (ppsc->wo_wlan_mode)
0455 *((bool *)(val)) = true;
0456 else
0457 *((bool *)(val)) = false;
0458 break;
0459 default:
0460 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
0461 "switch case %#x not processed\n", variable);
0462 break;
0463 }
0464 }
0465
0466 void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
0467 {
0468 struct rtl_priv *rtlpriv = rtl_priv(hw);
0469 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0470 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
0471 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
0472 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0473 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0474 u8 idx;
0475
0476 switch (variable) {
0477 case HW_VAR_ETHER_ADDR:{
0478 for (idx = 0; idx < ETH_ALEN; idx++) {
0479 rtl_write_byte(rtlpriv, (REG_MACID + idx),
0480 val[idx]);
0481 }
0482 break;
0483 }
0484 case HW_VAR_BASIC_RATE:{
0485 u16 b_rate_cfg = ((u16 *)val)[0];
0486 b_rate_cfg = b_rate_cfg & 0x15f;
0487 rtl_write_word(rtlpriv, REG_RRSR, b_rate_cfg);
0488 break;
0489 }
0490 case HW_VAR_BSSID:{
0491 for (idx = 0; idx < ETH_ALEN; idx++) {
0492 rtl_write_byte(rtlpriv, (REG_BSSID + idx),
0493 val[idx]);
0494 }
0495 break;
0496 }
0497 case HW_VAR_SIFS:
0498 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
0499 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[0]);
0500
0501 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
0502 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
0503
0504 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]);
0505 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM, val[0]);
0506 break;
0507 case HW_VAR_R2T_SIFS:
0508 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]);
0509 break;
0510 case HW_VAR_SLOT_TIME:{
0511 u8 e_aci;
0512
0513 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
0514 "HW_VAR_SLOT_TIME %x\n", val[0]);
0515
0516 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
0517
0518 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
0519 rtlpriv->cfg->ops->set_hw_reg(hw,
0520 HW_VAR_AC_PARAM,
0521 (u8 *)(&e_aci));
0522 }
0523 break; }
0524 case HW_VAR_ACK_PREAMBLE:{
0525 u8 reg_tmp;
0526 u8 short_preamble = (bool)(*(u8 *)val);
0527
0528 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);
0529 if (short_preamble) {
0530 reg_tmp |= BIT(1);
0531 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2,
0532 reg_tmp);
0533 } else {
0534 reg_tmp &= (~BIT(1));
0535 rtl_write_byte(rtlpriv,
0536 REG_TRXPTCL_CTL + 2,
0537 reg_tmp);
0538 }
0539 break; }
0540 case HW_VAR_WPA_CONFIG:
0541 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
0542 break;
0543 case HW_VAR_AMPDU_MIN_SPACE:{
0544 u8 min_spacing_to_set;
0545 u8 sec_min_space;
0546
0547 min_spacing_to_set = *((u8 *)val);
0548 if (min_spacing_to_set <= 7) {
0549 sec_min_space = 0;
0550
0551 if (min_spacing_to_set < sec_min_space)
0552 min_spacing_to_set = sec_min_space;
0553
0554 mac->min_space_cfg = ((mac->min_space_cfg &
0555 0xf8) |
0556 min_spacing_to_set);
0557
0558 *val = min_spacing_to_set;
0559
0560 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
0561 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
0562 mac->min_space_cfg);
0563
0564 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
0565 mac->min_space_cfg);
0566 }
0567 break; }
0568 case HW_VAR_SHORTGI_DENSITY:{
0569 u8 density_to_set;
0570
0571 density_to_set = *((u8 *)val);
0572 mac->min_space_cfg |= (density_to_set << 3);
0573
0574 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD,
0575 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
0576 mac->min_space_cfg);
0577
0578 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
0579 mac->min_space_cfg);
0580
0581 break; }
0582 case HW_VAR_AMPDU_FACTOR:{
0583 u32 ampdu_len = (*((u8 *)val));
0584
0585 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
0586 if (ampdu_len < VHT_AGG_SIZE_128K)
0587 ampdu_len =
0588 (0x2000 << (*((u8 *)val))) - 1;
0589 else
0590 ampdu_len = 0x1ffff;
0591 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
0592 if (ampdu_len < HT_AGG_SIZE_64K)
0593 ampdu_len =
0594 (0x2000 << (*((u8 *)val))) - 1;
0595 else
0596 ampdu_len = 0xffff;
0597 }
0598 ampdu_len |= BIT(31);
0599
0600 rtl_write_dword(rtlpriv,
0601 REG_AMPDU_MAX_LENGTH_8812, ampdu_len);
0602 break; }
0603 case HW_VAR_AC_PARAM:{
0604 u8 e_aci = *((u8 *)val);
0605
0606 rtl8821ae_dm_init_edca_turbo(hw);
0607 if (rtlpci->acm_method != EACMWAY2_SW)
0608 rtlpriv->cfg->ops->set_hw_reg(hw,
0609 HW_VAR_ACM_CTRL,
0610 (u8 *)(&e_aci));
0611 break; }
0612 case HW_VAR_ACM_CTRL:{
0613 u8 e_aci = *((u8 *)val);
0614 union aci_aifsn *p_aci_aifsn =
0615 (union aci_aifsn *)(&mac->ac[0].aifs);
0616 u8 acm = p_aci_aifsn->f.acm;
0617 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
0618
0619 acm_ctrl =
0620 acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
0621
0622 if (acm) {
0623 switch (e_aci) {
0624 case AC0_BE:
0625 acm_ctrl |= ACMHW_BEQEN;
0626 break;
0627 case AC2_VI:
0628 acm_ctrl |= ACMHW_VIQEN;
0629 break;
0630 case AC3_VO:
0631 acm_ctrl |= ACMHW_VOQEN;
0632 break;
0633 default:
0634 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
0635 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
0636 acm);
0637 break;
0638 }
0639 } else {
0640 switch (e_aci) {
0641 case AC0_BE:
0642 acm_ctrl &= (~ACMHW_BEQEN);
0643 break;
0644 case AC2_VI:
0645 acm_ctrl &= (~ACMHW_VIQEN);
0646 break;
0647 case AC3_VO:
0648 acm_ctrl &= (~ACMHW_VOQEN);
0649 break;
0650 default:
0651 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
0652 "switch case %#x not processed\n",
0653 e_aci);
0654 break;
0655 }
0656 }
0657
0658 rtl_dbg(rtlpriv, COMP_QOS, DBG_TRACE,
0659 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
0660 acm_ctrl);
0661 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
0662 break; }
0663 case HW_VAR_RCR:
0664 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
0665 rtlpci->receive_config = ((u32 *)(val))[0];
0666 break;
0667 case HW_VAR_RETRY_LIMIT:{
0668 u8 retry_limit = ((u8 *)(val))[0];
0669
0670 rtl_write_word(rtlpriv, REG_RL,
0671 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
0672 retry_limit << RETRY_LIMIT_LONG_SHIFT);
0673 break; }
0674 case HW_VAR_DUAL_TSF_RST:
0675 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
0676 break;
0677 case HW_VAR_EFUSE_BYTES:
0678 rtlefuse->efuse_usedbytes = *((u16 *)val);
0679 break;
0680 case HW_VAR_EFUSE_USAGE:
0681 rtlefuse->efuse_usedpercentage = *((u8 *)val);
0682 break;
0683 case HW_VAR_IO_CMD:
0684 rtl8821ae_phy_set_io_cmd(hw, (*(enum io_type *)val));
0685 break;
0686 case HW_VAR_SET_RPWM:{
0687 u8 rpwm_val;
0688
0689 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
0690 udelay(1);
0691
0692 if (rpwm_val & BIT(7)) {
0693 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
0694 (*(u8 *)val));
0695 } else {
0696 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
0697 ((*(u8 *)val) | BIT(7)));
0698 }
0699
0700 break; }
0701 case HW_VAR_H2C_FW_PWRMODE:
0702 rtl8821ae_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
0703 break;
0704 case HW_VAR_FW_PSMODE_STATUS:
0705 ppsc->fw_current_inpsmode = *((bool *)val);
0706 break;
0707 case HW_VAR_INIT_RTS_RATE:
0708 break;
0709 case HW_VAR_RESUME_CLK_ON:
0710 _rtl8821ae_set_fw_ps_rf_on(hw);
0711 break;
0712 case HW_VAR_FW_LPS_ACTION:{
0713 bool b_enter_fwlps = *((bool *)val);
0714
0715 if (b_enter_fwlps)
0716 _rtl8821ae_fwlps_enter(hw);
0717 else
0718 _rtl8821ae_fwlps_leave(hw);
0719 break; }
0720 case HW_VAR_H2C_FW_JOINBSSRPT:{
0721 u8 mstatus = (*(u8 *)val);
0722
0723 if (mstatus == RT_MEDIA_CONNECT) {
0724 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
0725 NULL);
0726 _rtl8821ae_download_rsvd_page(hw, false);
0727 }
0728 rtl8821ae_set_fw_media_status_rpt_cmd(hw, mstatus);
0729
0730 break; }
0731 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
0732 rtl8821ae_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
0733 break;
0734 case HW_VAR_AID:{
0735 u16 u2btmp;
0736 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
0737 u2btmp &= 0xC000;
0738 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp |
0739 mac->assoc_id));
0740 break; }
0741 case HW_VAR_CORRECT_TSF:{
0742 u8 btype_ibss = ((u8 *)(val))[0];
0743
0744 if (btype_ibss)
0745 _rtl8821ae_stop_tx_beacon(hw);
0746
0747 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
0748
0749 rtl_write_dword(rtlpriv, REG_TSFTR,
0750 (u32)(mac->tsf & 0xffffffff));
0751 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
0752 (u32)((mac->tsf >> 32) & 0xffffffff));
0753
0754 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
0755
0756 if (btype_ibss)
0757 _rtl8821ae_resume_tx_beacon(hw);
0758 break; }
0759 case HW_VAR_NAV_UPPER: {
0760 u32 us_nav_upper = *(u32 *)val;
0761
0762 if (us_nav_upper > HAL_92C_NAV_UPPER_UNIT * 0xFF) {
0763 rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING,
0764 "The setting value (0x%08X us) of NAV_UPPER is larger than (%d * 0xFF)!!!\n",
0765 us_nav_upper, HAL_92C_NAV_UPPER_UNIT);
0766 break;
0767 }
0768 rtl_write_byte(rtlpriv, REG_NAV_UPPER,
0769 ((u8)((us_nav_upper +
0770 HAL_92C_NAV_UPPER_UNIT - 1) /
0771 HAL_92C_NAV_UPPER_UNIT)));
0772 break; }
0773 case HW_VAR_KEEP_ALIVE: {
0774 u8 array[2];
0775 array[0] = 0xff;
0776 array[1] = *((u8 *)val);
0777 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL, 2,
0778 array);
0779 break; }
0780 default:
0781 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
0782 "switch case %#x not processed\n", variable);
0783 break;
0784 }
0785 }
0786
0787 static bool _rtl8821ae_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
0788 {
0789 struct rtl_priv *rtlpriv = rtl_priv(hw);
0790 bool status = true;
0791 long count = 0;
0792 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
0793 _LLT_OP(_LLT_WRITE_ACCESS);
0794
0795 rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
0796
0797 do {
0798 value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
0799 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
0800 break;
0801
0802 if (count > POLLING_LLT_THRESHOLD) {
0803 pr_err("Failed to polling write LLT done at address %d!\n",
0804 address);
0805 status = false;
0806 break;
0807 }
0808 } while (++count);
0809
0810 return status;
0811 }
0812
0813 static bool _rtl8821ae_llt_table_init(struct ieee80211_hw *hw)
0814 {
0815 struct rtl_priv *rtlpriv = rtl_priv(hw);
0816 unsigned short i;
0817 u8 txpktbuf_bndy;
0818 u32 rqpn;
0819 u8 maxpage;
0820 bool status;
0821
0822 maxpage = 255;
0823 txpktbuf_bndy = 0xF7;
0824 rqpn = 0x80e60808;
0825
0826 rtl_write_byte(rtlpriv, REG_TRXFF_BNDY, txpktbuf_bndy);
0827 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, MAX_RX_DMA_BUFFER_SIZE - 1);
0828
0829 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
0830
0831 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
0832 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
0833
0834 rtl_write_byte(rtlpriv, REG_PBP, 0x31);
0835 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
0836
0837 for (i = 0; i < (txpktbuf_bndy - 1); i++) {
0838 status = _rtl8821ae_llt_write(hw, i, i + 1);
0839 if (!status)
0840 return status;
0841 }
0842
0843 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
0844 if (!status)
0845 return status;
0846
0847 for (i = txpktbuf_bndy; i < maxpage; i++) {
0848 status = _rtl8821ae_llt_write(hw, i, (i + 1));
0849 if (!status)
0850 return status;
0851 }
0852
0853 status = _rtl8821ae_llt_write(hw, maxpage, txpktbuf_bndy);
0854 if (!status)
0855 return status;
0856
0857 rtl_write_dword(rtlpriv, REG_RQPN, rqpn);
0858
0859 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00);
0860
0861 return true;
0862 }
0863
0864 static void _rtl8821ae_gen_refresh_led_state(struct ieee80211_hw *hw)
0865 {
0866 struct rtl_priv *rtlpriv = rtl_priv(hw);
0867 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
0868 struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0;
0869 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0870
0871 if (rtlpriv->rtlhal.up_first_time)
0872 return;
0873
0874 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
0875 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
0876 rtl8812ae_sw_led_on(hw, pled0);
0877 else
0878 rtl8821ae_sw_led_on(hw, pled0);
0879 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
0880 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
0881 rtl8812ae_sw_led_on(hw, pled0);
0882 else
0883 rtl8821ae_sw_led_on(hw, pled0);
0884 else
0885 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
0886 rtl8812ae_sw_led_off(hw, pled0);
0887 else
0888 rtl8821ae_sw_led_off(hw, pled0);
0889 }
0890
0891 static bool _rtl8821ae_init_mac(struct ieee80211_hw *hw)
0892 {
0893 struct rtl_priv *rtlpriv = rtl_priv(hw);
0894 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
0895 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0896
0897 u8 bytetmp = 0;
0898 u16 wordtmp = 0;
0899 bool mac_func_enable = rtlhal->mac_func_enable;
0900
0901 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
0902
0903
0904 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
0905 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
0906
0907 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
0908
0909 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
0910 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
0911 RTL8812_NIC_ENABLE_FLOW)) {
0912 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0913 "init 8812 MAC Fail as power on failure\n");
0914 return false;
0915 }
0916 } else {
0917
0918 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_A_MSK,
0919 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
0920 RTL8821A_NIC_ENABLE_FLOW)){
0921 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0922 "init 8821 MAC Fail as power on failure\n");
0923 return false;
0924 }
0925 }
0926
0927 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
0928 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
0929
0930 bytetmp = rtl_read_byte(rtlpriv, REG_CR);
0931 bytetmp = 0xff;
0932 rtl_write_byte(rtlpriv, REG_CR, bytetmp);
0933 mdelay(2);
0934
0935 bytetmp = 0xff;
0936 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
0937 mdelay(2);
0938
0939 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
0940 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
0941 if (bytetmp & BIT(0)) {
0942 bytetmp = rtl_read_byte(rtlpriv, 0x7c);
0943 bytetmp |= BIT(6);
0944 rtl_write_byte(rtlpriv, 0x7c, bytetmp);
0945 }
0946 }
0947
0948 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
0949 bytetmp &= ~BIT(4);
0950 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp);
0951
0952 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
0953
0954 if (!mac_func_enable) {
0955 if (!_rtl8821ae_llt_table_init(hw))
0956 return false;
0957 }
0958
0959 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
0960 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
0961
0962
0963 bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3);
0964 rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6));
0965
0966 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
0967 wordtmp &= 0xf;
0968 wordtmp |= 0xF5B1;
0969 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
0970
0971 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
0972 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
0973 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
0974
0975 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
0976 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
0977 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
0978 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
0979 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
0980 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
0981 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
0982 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
0983 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
0984 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
0985 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
0986 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
0987 rtl_write_dword(rtlpriv, REG_HQ_DESA,
0988 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
0989 rtl_write_dword(rtlpriv, REG_RX_DESA,
0990 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
0991
0992 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, 0x77);
0993
0994 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
0995
0996 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0);
0997
0998 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
0999 _rtl8821ae_gen_refresh_led_state(hw);
1000
1001 return true;
1002 }
1003
1004 static void _rtl8821ae_hw_configure(struct ieee80211_hw *hw)
1005 {
1006 struct rtl_priv *rtlpriv = rtl_priv(hw);
1007 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1008 u32 reg_rrsr;
1009
1010 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
1011
1012 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
1013
1014 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
1015
1016 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
1017
1018 rtl_write_dword(rtlpriv, REG_ARFR2, 0x00000015);
1019 rtl_write_dword(rtlpriv, REG_ARFR2 + 4, 0x003ff000);
1020
1021 rtl_write_dword(rtlpriv, REG_ARFR3, 0x00000015);
1022 rtl_write_dword(rtlpriv, REG_ARFR3 + 4, 0xffcff000);
1023
1024 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
1025 rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
1026
1027
1028 rtl_write_word(rtlpriv, REG_RL, 0x0707);
1029
1030
1031 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
1032 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
1033 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
1034 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
1035
1036 rtlpci->reg_bcn_ctrl_val = 0x1d;
1037 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
1038
1039
1040 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
1041
1042
1043 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
1044
1045
1046 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
1047
1048 rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
1049 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
1050 rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, 0x1F1F);
1051 }
1052
1053 static u16 _rtl8821ae_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
1054 {
1055 u16 ret = 0;
1056 u8 tmp = 0, count = 0;
1057
1058 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
1059 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1060 count = 0;
1061 while (tmp && count < 20) {
1062 udelay(10);
1063 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1064 count++;
1065 }
1066 if (0 == tmp)
1067 ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
1068
1069 return ret;
1070 }
1071
1072 static void _rtl8821ae_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
1073 {
1074 u8 tmp = 0, count = 0;
1075
1076 rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
1077 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
1078 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1079 count = 0;
1080 while (tmp && count < 20) {
1081 udelay(10);
1082 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1083 count++;
1084 }
1085 }
1086
1087 static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
1088 {
1089 u16 read_addr = addr & 0xfffc;
1090 u8 tmp = 0, count = 0, ret = 0;
1091
1092 rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
1093 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
1094 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1095 count = 0;
1096 while (tmp && count < 20) {
1097 udelay(10);
1098 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1099 count++;
1100 }
1101 if (0 == tmp) {
1102 read_addr = REG_DBI_RDATA + addr % 4;
1103 ret = rtl_read_byte(rtlpriv, read_addr);
1104 }
1105 return ret;
1106 }
1107
1108 static void _rtl8821ae_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
1109 {
1110 u8 tmp = 0, count = 0;
1111 u16 write_addr, remainder = addr % 4;
1112
1113 write_addr = REG_DBI_WDATA + remainder;
1114 rtl_write_byte(rtlpriv, write_addr, data);
1115
1116 write_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
1117 rtl_write_word(rtlpriv, REG_DBI_ADDR, write_addr);
1118
1119 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
1120
1121 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1122 count = 0;
1123 while (tmp && count < 20) {
1124 udelay(10);
1125 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1126 count++;
1127 }
1128 }
1129
1130 static void _rtl8821ae_enable_aspm_back_door(struct ieee80211_hw *hw)
1131 {
1132 struct rtl_priv *rtlpriv = rtl_priv(hw);
1133 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1134 u8 tmp;
1135
1136 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1137 if (_rtl8821ae_mdio_read(rtlpriv, 0x04) != 0x8544)
1138 _rtl8821ae_mdio_write(rtlpriv, 0x04, 0x8544);
1139
1140 if (_rtl8821ae_mdio_read(rtlpriv, 0x0b) != 0x0070)
1141 _rtl8821ae_mdio_write(rtlpriv, 0x0b, 0x0070);
1142 }
1143
1144 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f);
1145 _rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7) |
1146 ASPM_L1_LATENCY << 3);
1147
1148 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719);
1149 _rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4));
1150
1151 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1152 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1153 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp|BIT(4));
1154 }
1155 }
1156
1157 void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw)
1158 {
1159 struct rtl_priv *rtlpriv = rtl_priv(hw);
1160 u8 sec_reg_value;
1161 u8 tmp;
1162
1163 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
1164 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1165 rtlpriv->sec.pairwise_enc_algorithm,
1166 rtlpriv->sec.group_enc_algorithm);
1167
1168 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1169 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
1170 "not open hw encryption\n");
1171 return;
1172 }
1173
1174 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1175
1176 if (rtlpriv->sec.use_defaultkey) {
1177 sec_reg_value |= SCR_TXUSEDK;
1178 sec_reg_value |= SCR_RXUSEDK;
1179 }
1180
1181 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1182
1183 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1184 rtl_write_byte(rtlpriv, REG_CR + 1, tmp | BIT(1));
1185
1186 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
1187 "The SECR-value %x\n", sec_reg_value);
1188
1189 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1190 }
1191
1192
1193 #define MAC_ID_STATIC_FOR_DEFAULT_PORT 0
1194 #define MAC_ID_STATIC_FOR_BROADCAST_MULTICAST 1
1195 #define MAC_ID_STATIC_FOR_BT_CLIENT_START 2
1196 #define MAC_ID_STATIC_FOR_BT_CLIENT_END 3
1197
1198
1199 static void rtl8821ae_macid_initialize_mediastatus(struct ieee80211_hw *hw)
1200 {
1201 struct rtl_priv *rtlpriv = rtl_priv(hw);
1202 u8 media_rpt[4] = {RT_MEDIA_CONNECT, 1,
1203 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST,
1204 MAC_ID_STATIC_FOR_BT_CLIENT_END};
1205
1206 rtlpriv->cfg->ops->set_hw_reg(hw,
1207 HW_VAR_H2C_FW_MEDIASTATUSRPT, media_rpt);
1208
1209 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1210 "Initialize MacId media status: from %d to %d\n",
1211 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST,
1212 MAC_ID_STATIC_FOR_BT_CLIENT_END);
1213 }
1214
1215 static bool _rtl8821ae_check_pcie_dma_hang(struct ieee80211_hw *hw)
1216 {
1217 struct rtl_priv *rtlpriv = rtl_priv(hw);
1218 u8 tmp;
1219
1220
1221 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1222 if (!(tmp & BIT(2))) {
1223 rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2)));
1224 mdelay(100);
1225 }
1226
1227
1228
1229 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1230 if ((tmp & BIT(0)) || (tmp & BIT(1))) {
1231 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1232 "CheckPcieDMAHang8821AE(): true! Reset PCIE DMA!\n");
1233 return true;
1234 } else {
1235 return false;
1236 }
1237 }
1238
1239 static bool _rtl8821ae_reset_pcie_interface_dma(struct ieee80211_hw *hw,
1240 bool mac_power_on,
1241 bool in_watchdog)
1242 {
1243 struct rtl_priv *rtlpriv = rtl_priv(hw);
1244 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1245 u8 tmp;
1246 bool release_mac_rx_pause;
1247 u8 backup_pcie_dma_pause;
1248
1249 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
1250
1251
1252 tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
1253 tmp &= ~(BIT(1));
1254 rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
1255 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1256
1257 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1258 tmp |= BIT(2);
1259 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1260 }
1261
1262
1263
1264
1265 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1266 if (tmp & BIT(2)) {
1267
1268 release_mac_rx_pause = false;
1269 } else {
1270 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1271 release_mac_rx_pause = true;
1272 }
1273 backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1);
1274 if (backup_pcie_dma_pause != 0xFF)
1275 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF);
1276
1277 if (mac_power_on) {
1278
1279
1280 rtl_write_byte(rtlpriv, REG_CR, 0);
1281 }
1282
1283
1284 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1285 tmp &= ~(BIT(0));
1286 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1287
1288
1289 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1290 tmp |= BIT(0);
1291 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1292
1293 if (mac_power_on) {
1294
1295
1296 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1297
1298
1299
1300
1301 }
1302
1303
1304
1305 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1306
1307 tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2);
1308 tmp |= BIT(1);
1309 rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp);
1310 }
1311
1312
1313
1314
1315
1316 if (!mac_power_on) {
1317
1318
1319
1320 if (release_mac_rx_pause) {
1321 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1322 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL,
1323 tmp & (~BIT(2)));
1324 }
1325 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1,
1326 backup_pcie_dma_pause);
1327 }
1328
1329 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1330
1331
1332 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1333 tmp &= ~(BIT(2));
1334 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1335 }
1336 return true;
1337 }
1338
1339 static void _rtl8821ae_get_wakeup_reason(struct ieee80211_hw *hw)
1340 {
1341 struct rtl_priv *rtlpriv = rtl_priv(hw);
1342 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1343 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
1344 u8 fw_reason = 0;
1345
1346 fw_reason = rtl_read_byte(rtlpriv, REG_MCUTST_WOWLAN);
1347
1348 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "WOL Read 0x1c7 = %02X\n",
1349 fw_reason);
1350
1351 ppsc->wakeup_reason = 0;
1352
1353 rtlhal->last_suspend_sec = ktime_get_real_seconds();
1354
1355 switch (fw_reason) {
1356 case FW_WOW_V2_PTK_UPDATE_EVENT:
1357 ppsc->wakeup_reason = WOL_REASON_PTK_UPDATE;
1358 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1359 "It's a WOL PTK Key update event!\n");
1360 break;
1361 case FW_WOW_V2_GTK_UPDATE_EVENT:
1362 ppsc->wakeup_reason = WOL_REASON_GTK_UPDATE;
1363 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1364 "It's a WOL GTK Key update event!\n");
1365 break;
1366 case FW_WOW_V2_DISASSOC_EVENT:
1367 ppsc->wakeup_reason = WOL_REASON_DISASSOC;
1368 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1369 "It's a disassociation event!\n");
1370 break;
1371 case FW_WOW_V2_DEAUTH_EVENT:
1372 ppsc->wakeup_reason = WOL_REASON_DEAUTH;
1373 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1374 "It's a deauth event!\n");
1375 break;
1376 case FW_WOW_V2_FW_DISCONNECT_EVENT:
1377 ppsc->wakeup_reason = WOL_REASON_AP_LOST;
1378 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1379 "It's a Fw disconnect decision (AP lost) event!\n");
1380 break;
1381 case FW_WOW_V2_MAGIC_PKT_EVENT:
1382 ppsc->wakeup_reason = WOL_REASON_MAGIC_PKT;
1383 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1384 "It's a magic packet event!\n");
1385 break;
1386 case FW_WOW_V2_UNICAST_PKT_EVENT:
1387 ppsc->wakeup_reason = WOL_REASON_UNICAST_PKT;
1388 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1389 "It's an unicast packet event!\n");
1390 break;
1391 case FW_WOW_V2_PATTERN_PKT_EVENT:
1392 ppsc->wakeup_reason = WOL_REASON_PATTERN_PKT;
1393 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1394 "It's a pattern match event!\n");
1395 break;
1396 case FW_WOW_V2_RTD3_SSID_MATCH_EVENT:
1397 ppsc->wakeup_reason = WOL_REASON_RTD3_SSID_MATCH;
1398 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1399 "It's an RTD3 Ssid match event!\n");
1400 break;
1401 case FW_WOW_V2_REALWOW_V2_WAKEUPPKT:
1402 ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_WAKEUPPKT;
1403 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1404 "It's an RealWoW wake packet event!\n");
1405 break;
1406 case FW_WOW_V2_REALWOW_V2_ACKLOST:
1407 ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_ACKLOST;
1408 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1409 "It's an RealWoW ack lost event!\n");
1410 break;
1411 default:
1412 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
1413 "WOL Read 0x1c7 = %02X, Unknown reason!\n",
1414 fw_reason);
1415 break;
1416 }
1417 }
1418
1419 static void _rtl8821ae_init_trx_desc_hw_address(struct ieee80211_hw *hw)
1420 {
1421 struct rtl_priv *rtlpriv = rtl_priv(hw);
1422 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1423
1424
1425 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
1426 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
1427 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
1428 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
1429 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
1430 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
1431 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
1432 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
1433 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
1434 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
1435 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
1436 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
1437 rtl_write_dword(rtlpriv, REG_HQ_DESA,
1438 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
1439 rtl_write_dword(rtlpriv, REG_RX_DESA,
1440 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
1441 }
1442
1443 static bool _rtl8821ae_init_llt_table(struct ieee80211_hw *hw, u32 boundary)
1444 {
1445 bool status = true;
1446 u32 i;
1447 u32 txpktbuf_bndy = boundary;
1448 u32 last_entry_of_txpktbuf = LAST_ENTRY_OF_TX_PKT_BUFFER;
1449
1450 for (i = 0 ; i < (txpktbuf_bndy - 1) ; i++) {
1451 status = _rtl8821ae_llt_write(hw, i , i + 1);
1452 if (!status)
1453 return status;
1454 }
1455
1456 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
1457 if (!status)
1458 return status;
1459
1460 for (i = txpktbuf_bndy ; i < last_entry_of_txpktbuf ; i++) {
1461 status = _rtl8821ae_llt_write(hw, i, (i + 1));
1462 if (!status)
1463 return status;
1464 }
1465
1466 status = _rtl8821ae_llt_write(hw, last_entry_of_txpktbuf,
1467 txpktbuf_bndy);
1468 if (!status)
1469 return status;
1470
1471 return status;
1472 }
1473
1474 static bool _rtl8821ae_dynamic_rqpn(struct ieee80211_hw *hw, u32 boundary,
1475 u16 npq_rqpn_value, u32 rqpn_val)
1476 {
1477 struct rtl_priv *rtlpriv = rtl_priv(hw);
1478 u8 tmp;
1479 bool ret = true;
1480 u16 count = 0, tmp16;
1481 bool support_remote_wakeup;
1482
1483 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1484 (u8 *)(&support_remote_wakeup));
1485
1486 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1487 "boundary=%#X, NPQ_RQPNValue=%#X, RQPNValue=%#X\n",
1488 boundary, npq_rqpn_value, rqpn_val);
1489
1490
1491
1492 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE);
1493
1494
1495
1496 tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
1497 while ((tmp16 & 0x07FF) != 0x07FF) {
1498 udelay(100);
1499 tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
1500 count++;
1501 if ((count % 200) == 0) {
1502 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1503 "Tx queue is not empty for 20ms!\n");
1504 }
1505 if (count >= 1000) {
1506 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1507 "Wait for Tx FIFO empty timeout!\n");
1508 break;
1509 }
1510 }
1511
1512
1513
1514 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
1515
1516
1517
1518 count = 0;
1519 while (rtl_read_byte(rtlpriv, REG_SCH_TXCMD) != 0) {
1520 udelay(100);
1521 count++;
1522 if (count >= 500) {
1523 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1524 "Wait for TX State Machine ready timeout !!\n");
1525 break;
1526 }
1527 }
1528
1529
1530
1531
1532
1533 count = 0;
1534 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1535 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1536 do {
1537 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1538 udelay(10);
1539 count++;
1540 } while (!(tmp & BIT(1)) && count < 100);
1541
1542 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1543 "Wait until Rx DMA Idle. count=%d REG[0x286]=0x%x\n",
1544 count, tmp);
1545
1546
1547
1548 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
1549 tmp &= ~(BIT(0));
1550 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, tmp);
1551
1552
1553
1554
1555 rtl_write_byte(rtlpriv, REG_CR, 0x00);
1556 udelay(1000);
1557
1558
1559
1560 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1561 tmp &= ~(BIT(1));
1562 rtl_write_byte(rtlpriv, REG_CR + 1, tmp);
1563
1564
1565
1566 tmp = rtl_read_byte(rtlpriv, REG_DUAL_TSF_RST);
1567 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (tmp | BIT(5)));
1568
1569
1570
1571 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1572 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp | BIT(1)));
1573
1574
1575
1576
1577 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1578 udelay(1000);
1579
1580
1581
1582 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
1583 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, (tmp | BIT(0)));
1584
1585
1586
1587 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, (u8)boundary);
1588 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, (u8)boundary);
1589 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, (u8)boundary);
1590
1591
1592
1593 rtl_write_byte(rtlpriv, REG_TXPKTBUF_WMAC_LBK_BF_HD,
1594 (u8)boundary);
1595
1596 rtl_write_word(rtlpriv, REG_TRXFF_BNDY, boundary);
1597
1598
1599
1600 if (!_rtl8821ae_init_llt_table(hw, boundary)) {
1601 rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING,
1602 "Failed to init LLT table!\n");
1603 return false;
1604 }
1605
1606
1607
1608 rtl_write_word(rtlpriv, REG_RQPN_NPQ, npq_rqpn_value);
1609 rtl_write_dword(rtlpriv, REG_RQPN, rqpn_val);
1610
1611
1612
1613 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
1614
1615
1616
1617
1618 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00);
1619 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1620 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp&~BIT(2)));
1621
1622 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "End.\n");
1623 return ret;
1624 }
1625
1626 static void _rtl8821ae_simple_initialize_adapter(struct ieee80211_hw *hw)
1627 {
1628 struct rtl_priv *rtlpriv = rtl_priv(hw);
1629 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1630 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
1631
1632 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
1633
1634 rtl8821ae_set_fw_related_for_wowlan(hw, false);
1635 #endif
1636
1637
1638 if (rtlhal->re_init_llt_table) {
1639 u32 rqpn = 0x80e70808;
1640 u8 rqpn_npq = 0, boundary = 0xF8;
1641 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1642 rqpn = 0x80e90808;
1643 boundary = 0xFA;
1644 }
1645 if (_rtl8821ae_dynamic_rqpn(hw, boundary, rqpn_npq, rqpn))
1646 rtlhal->re_init_llt_table = false;
1647 }
1648
1649 ppsc->rfpwr_state = ERFON;
1650 }
1651
1652 static void _rtl8821ae_enable_l1off(struct ieee80211_hw *hw)
1653 {
1654 u8 tmp = 0;
1655 struct rtl_priv *rtlpriv = rtl_priv(hw);
1656
1657 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n");
1658
1659 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x160);
1660 if (!(tmp & (BIT(2) | BIT(3)))) {
1661 rtl_dbg(rtlpriv, COMP_POWER | COMP_INIT, DBG_LOUD,
1662 "0x160(%#x)return!!\n", tmp);
1663 return;
1664 }
1665
1666 tmp = _rtl8821ae_mdio_read(rtlpriv, 0x1b);
1667 _rtl8821ae_mdio_write(rtlpriv, 0x1b, (tmp | BIT(4)));
1668
1669 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1670 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp | BIT(5));
1671
1672 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n");
1673 }
1674
1675 static void _rtl8821ae_enable_ltr(struct ieee80211_hw *hw)
1676 {
1677 u8 tmp = 0;
1678 struct rtl_priv *rtlpriv = rtl_priv(hw);
1679
1680 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n");
1681
1682
1683 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x99);
1684 if (!(tmp & BIT(2))) {
1685 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1686 "<---0x99(%#x) return!!\n", tmp);
1687 return;
1688 }
1689
1690
1691 rtl_write_dword(rtlpriv, 0x798, 0x88908890);
1692
1693
1694 rtl_write_dword(rtlpriv, 0x79c, 0x883c883c);
1695
1696 tmp = rtl_read_byte(rtlpriv, 0x7a4);
1697 rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(4)));
1698
1699 tmp = rtl_read_byte(rtlpriv, 0x7a4);
1700 rtl_write_byte(rtlpriv, 0x7a4, (tmp & (~BIT(0))));
1701 rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(0)));
1702
1703 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n");
1704 }
1705
1706 static bool _rtl8821ae_wowlan_initialize_adapter(struct ieee80211_hw *hw)
1707 {
1708 struct rtl_priv *rtlpriv = rtl_priv(hw);
1709 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1710 bool init_finished = true;
1711 u8 tmp = 0;
1712
1713
1714 _rtl8821ae_get_wakeup_reason(hw);
1715
1716
1717
1718 if (_rtl8821ae_check_pcie_dma_hang(hw))
1719 _rtl8821ae_reset_pcie_interface_dma(hw, true, false);
1720
1721
1722 _rtl8821ae_init_trx_desc_hw_address(hw);
1723
1724
1725 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE);
1726 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Enable PCIE Rx DMA.\n");
1727
1728
1729
1730
1731 tmp = rtl_read_byte(rtlpriv, REG_FTISR + 3);
1732 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
1733 "Read REG_FTISR 0x13f = %#X\n", tmp);
1734
1735
1736 rtl8821ae_set_fw_wowlan_mode(hw, false);
1737 rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 0);
1738
1739 if (rtlhal->hw_rof_enable) {
1740 tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3);
1741 if (tmp & BIT(1)) {
1742
1743 rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1));
1744 init_finished = false;
1745 } else {
1746 init_finished = true;
1747 }
1748 }
1749
1750 if (init_finished) {
1751 _rtl8821ae_simple_initialize_adapter(hw);
1752
1753
1754 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00);
1755
1756 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, 0x02);
1757
1758 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1759 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp & (~BIT(0))));
1760
1761 _rtl8821ae_enable_l1off(hw);
1762 _rtl8821ae_enable_ltr(hw);
1763 }
1764
1765 return init_finished;
1766 }
1767
1768 static void _rtl8812ae_bb8812_config_1t(struct ieee80211_hw *hw)
1769 {
1770
1771 rtl_set_bbreg(hw, 0x808, 0xff, 0x11);
1772
1773 rtl_set_bbreg(hw, 0x80c, MASKLWORD, 0x1111);
1774
1775 rtl_set_bbreg(hw, 0xa04, 0x0c000000, 0x0);
1776
1777 rtl_set_bbreg(hw, 0x8bc, 0xc0000060, 0x4);
1778
1779 rtl_set_bbreg(hw, 0xe00, 0xf, 0x4);
1780
1781 rtl_set_bbreg(hw, 0xe90, MASKDWORD, 0);
1782
1783 rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0);
1784 rtl_set_bbreg(hw, 0xe64, MASKDWORD, 0);
1785 }
1786
1787 static void _rtl8821ae_poweroff_adapter(struct ieee80211_hw *hw)
1788 {
1789 struct rtl_priv *rtlpriv = rtl_priv(hw);
1790 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1791 u8 u1b_tmp;
1792
1793 rtlhal->mac_func_enable = false;
1794
1795 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1796
1797
1798
1799
1800
1801 rtl_hal_pwrseqcmdparsing(rtlpriv,
1802 PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1803 PWR_INTF_PCI_MSK, RTL8821A_NIC_LPS_ENTER_FLOW);
1804 }
1805
1806
1807
1808 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1809 rtlhal->fw_ready) {
1810 rtl8821ae_firmware_selfreset(hw);
1811 }
1812
1813
1814 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1815 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
1816
1817
1818
1819 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1820
1821 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1822
1823 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1824 PWR_INTF_PCI_MSK, RTL8821A_NIC_DISABLE_FLOW);
1825 } else {
1826
1827 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1828 PWR_INTF_PCI_MSK, RTL8812_NIC_DISABLE_FLOW);
1829 }
1830
1831
1832 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1833 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1834 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1835 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1836
1837
1838
1839 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1840 }
1841
1842 int rtl8821ae_hw_init(struct ieee80211_hw *hw)
1843 {
1844 struct rtl_priv *rtlpriv = rtl_priv(hw);
1845 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1846 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1847 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1848 bool rtstatus = true;
1849 int err;
1850 u8 tmp_u1b;
1851 bool support_remote_wakeup;
1852 u32 nav_upper = WIFI_NAV_UPPER_US;
1853
1854 rtlhal->being_init_adapter = true;
1855 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1856 (u8 *)(&support_remote_wakeup));
1857 rtlpriv->intf_ops->disable_aspm(hw);
1858
1859
1860
1861 tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
1862 if (tmp_u1b != 0 && tmp_u1b != 0xEA) {
1863 rtlhal->mac_func_enable = true;
1864 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
1865 "MAC has already power on.\n");
1866 } else {
1867 rtlhal->mac_func_enable = false;
1868 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1869 }
1870
1871 if (support_remote_wakeup &&
1872 rtlhal->wake_from_pnp_sleep &&
1873 rtlhal->mac_func_enable) {
1874 if (_rtl8821ae_wowlan_initialize_adapter(hw)) {
1875 rtlhal->being_init_adapter = false;
1876 return 0;
1877 }
1878 }
1879
1880 if (_rtl8821ae_check_pcie_dma_hang(hw)) {
1881 _rtl8821ae_reset_pcie_interface_dma(hw,
1882 rtlhal->mac_func_enable,
1883 false);
1884 rtlhal->mac_func_enable = false;
1885 }
1886
1887
1888
1889
1890
1891 if (rtlhal->mac_func_enable) {
1892 _rtl8821ae_poweroff_adapter(hw);
1893 rtlhal->mac_func_enable = false;
1894 }
1895
1896 rtstatus = _rtl8821ae_init_mac(hw);
1897 if (!rtstatus) {
1898 pr_err("Init MAC failed\n");
1899 err = 1;
1900 return err;
1901 }
1902
1903 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
1904 tmp_u1b &= 0x7F;
1905 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b);
1906
1907 err = rtl8821ae_download_fw(hw, false);
1908 if (err) {
1909 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1910 "Failed to download FW. Init HW without FW now\n");
1911 err = 1;
1912 rtlhal->fw_ready = false;
1913 return err;
1914 } else {
1915 rtlhal->fw_ready = true;
1916 }
1917 ppsc->fw_current_inpsmode = false;
1918 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1919 rtlhal->fw_clk_change_in_progress = false;
1920 rtlhal->allow_sw_to_change_hwclc = false;
1921 rtlhal->last_hmeboxnum = 0;
1922
1923
1924
1925
1926
1927 rtl8821ae_phy_mac_config(hw);
1928
1929
1930
1931
1932
1933
1934
1935 rtl8821ae_phy_bb_config(hw);
1936
1937 rtl8821ae_phy_rf_config(hw);
1938
1939 if (rtlpriv->phy.rf_type == RF_1T1R &&
1940 rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1941 _rtl8812ae_bb8812_config_1t(hw);
1942
1943 _rtl8821ae_hw_configure(hw);
1944
1945 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
1946
1947
1948
1949 rtlhal->mac_func_enable = true;
1950
1951 rtl_cam_reset_all_entry(hw);
1952
1953 rtl8821ae_enable_hw_security_config(hw);
1954
1955 ppsc->rfpwr_state = ERFON;
1956
1957 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1958 _rtl8821ae_enable_aspm_back_door(hw);
1959 rtlpriv->intf_ops->enable_aspm(hw);
1960
1961 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
1962 (rtlhal->rfe_type == 1 || rtlhal->rfe_type == 5))
1963 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x0302);
1964
1965 rtl8821ae_bt_hw_init(hw);
1966 rtlpriv->rtlhal.being_init_adapter = false;
1967
1968 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_NAV_UPPER, (u8 *)&nav_upper);
1969
1970
1971
1972 if (support_remote_wakeup)
1973 rtl_write_byte(rtlpriv, REG_WOW_CTRL, 0);
1974
1975
1976 tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1977 if (tmp_u1b & BIT(2)) {
1978
1979 tmp_u1b &= ~BIT(2);
1980 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
1981 }
1982
1983
1984 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
1985
1986 rtl8821ae_dm_init(hw);
1987 rtl8821ae_macid_initialize_mediastatus(hw);
1988
1989 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "%s() <====\n", __func__);
1990 return err;
1991 }
1992
1993 static enum version_8821ae _rtl8821ae_read_chip_version(struct ieee80211_hw *hw)
1994 {
1995 struct rtl_priv *rtlpriv = rtl_priv(hw);
1996 struct rtl_phy *rtlphy = &rtlpriv->phy;
1997 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1998 enum version_8821ae version = VERSION_UNKNOWN;
1999 u32 value32;
2000
2001 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
2002 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2003 "ReadChipVersion8812A 0xF0 = 0x%x\n", value32);
2004
2005 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
2006 rtlphy->rf_type = RF_2T2R;
2007 else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE)
2008 rtlphy->rf_type = RF_1T1R;
2009
2010 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2011 "RF_Type is %x!!\n", rtlphy->rf_type);
2012
2013 if (value32 & TRP_VAUX_EN) {
2014 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2015 if (rtlphy->rf_type == RF_2T2R)
2016 version = VERSION_TEST_CHIP_2T2R_8812;
2017 else
2018 version = VERSION_TEST_CHIP_1T1R_8812;
2019 } else
2020 version = VERSION_TEST_CHIP_8821;
2021 } else {
2022 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2023 u32 rtl_id = ((value32 & CHIP_VER_RTL_MASK) >> 12) + 1;
2024
2025 if (rtlphy->rf_type == RF_2T2R)
2026 version =
2027 (enum version_8821ae)(CHIP_8812
2028 | NORMAL_CHIP |
2029 RF_TYPE_2T2R);
2030 else
2031 version = (enum version_8821ae)(CHIP_8812
2032 | NORMAL_CHIP);
2033
2034 version = (enum version_8821ae)(version | (rtl_id << 12));
2035 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2036 u32 rtl_id = value32 & CHIP_VER_RTL_MASK;
2037
2038 version = (enum version_8821ae)(CHIP_8821
2039 | NORMAL_CHIP | rtl_id);
2040 }
2041 }
2042
2043 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2044
2045 value32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
2046 rtlhal->hw_rof_enable = ((value32 & WL_HWROF_EN) ? 1 : 0);
2047 }
2048
2049 switch (version) {
2050 case VERSION_TEST_CHIP_1T1R_8812:
2051 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2052 "Chip Version ID: VERSION_TEST_CHIP_1T1R_8812\n");
2053 break;
2054 case VERSION_TEST_CHIP_2T2R_8812:
2055 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2056 "Chip Version ID: VERSION_TEST_CHIP_2T2R_8812\n");
2057 break;
2058 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812:
2059 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2060 "Chip Version ID:VERSION_NORMAL_TSMC_CHIP_1T1R_8812\n");
2061 break;
2062 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812:
2063 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2064 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812\n");
2065 break;
2066 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812_C_CUT:
2067 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2068 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_1T1R_8812 C CUT\n");
2069 break;
2070 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812_C_CUT:
2071 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2072 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812 C CUT\n");
2073 break;
2074 case VERSION_TEST_CHIP_8821:
2075 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2076 "Chip Version ID: VERSION_TEST_CHIP_8821\n");
2077 break;
2078 case VERSION_NORMAL_TSMC_CHIP_8821:
2079 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2080 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 A CUT\n");
2081 break;
2082 case VERSION_NORMAL_TSMC_CHIP_8821_B_CUT:
2083 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2084 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 B CUT\n");
2085 break;
2086 default:
2087 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2088 "Chip Version ID: Unknown (0x%X)\n", version);
2089 break;
2090 }
2091
2092 return version;
2093 }
2094
2095 static int _rtl8821ae_set_media_status(struct ieee80211_hw *hw,
2096 enum nl80211_iftype type)
2097 {
2098 struct rtl_priv *rtlpriv = rtl_priv(hw);
2099 u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
2100 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
2101 bt_msr &= 0xfc;
2102
2103 rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0);
2104 rtl_dbg(rtlpriv, COMP_BEACON, DBG_LOUD,
2105 "clear 0x550 when set HW_VAR_MEDIA_STATUS\n");
2106
2107 if (type == NL80211_IFTYPE_UNSPECIFIED ||
2108 type == NL80211_IFTYPE_STATION) {
2109 _rtl8821ae_stop_tx_beacon(hw);
2110 _rtl8821ae_enable_bcn_sub_func(hw);
2111 } else if (type == NL80211_IFTYPE_ADHOC ||
2112 type == NL80211_IFTYPE_AP) {
2113 _rtl8821ae_resume_tx_beacon(hw);
2114 _rtl8821ae_disable_bcn_sub_func(hw);
2115 } else {
2116 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
2117 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
2118 type);
2119 }
2120
2121 switch (type) {
2122 case NL80211_IFTYPE_UNSPECIFIED:
2123 bt_msr |= MSR_NOLINK;
2124 ledaction = LED_CTL_LINK;
2125 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
2126 "Set Network type to NO LINK!\n");
2127 break;
2128 case NL80211_IFTYPE_ADHOC:
2129 bt_msr |= MSR_ADHOC;
2130 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
2131 "Set Network type to Ad Hoc!\n");
2132 break;
2133 case NL80211_IFTYPE_STATION:
2134 bt_msr |= MSR_INFRA;
2135 ledaction = LED_CTL_LINK;
2136 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
2137 "Set Network type to STA!\n");
2138 break;
2139 case NL80211_IFTYPE_AP:
2140 bt_msr |= MSR_AP;
2141 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
2142 "Set Network type to AP!\n");
2143 break;
2144 default:
2145 pr_err("Network type %d not support!\n", type);
2146 return 1;
2147 }
2148
2149 rtl_write_byte(rtlpriv, MSR, bt_msr);
2150 rtlpriv->cfg->ops->led_control(hw, ledaction);
2151 if ((bt_msr & MSR_MASK) == MSR_AP)
2152 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
2153 else
2154 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
2155
2156 return 0;
2157 }
2158
2159 void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
2160 {
2161 struct rtl_priv *rtlpriv = rtl_priv(hw);
2162 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2163 u32 reg_rcr = rtlpci->receive_config;
2164
2165 if (rtlpriv->psc.rfpwr_state != ERFON)
2166 return;
2167
2168 if (check_bssid) {
2169 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
2170 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
2171 (u8 *)(®_rcr));
2172 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
2173 } else if (!check_bssid) {
2174 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
2175 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
2176 rtlpriv->cfg->ops->set_hw_reg(hw,
2177 HW_VAR_RCR, (u8 *)(®_rcr));
2178 }
2179 }
2180
2181 int rtl8821ae_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
2182 {
2183 struct rtl_priv *rtlpriv = rtl_priv(hw);
2184
2185 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "%s!\n", __func__);
2186
2187 if (_rtl8821ae_set_media_status(hw, type))
2188 return -EOPNOTSUPP;
2189
2190 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
2191 if (type != NL80211_IFTYPE_AP)
2192 rtl8821ae_set_check_bssid(hw, true);
2193 } else {
2194 rtl8821ae_set_check_bssid(hw, false);
2195 }
2196
2197 return 0;
2198 }
2199
2200
2201 void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci)
2202 {
2203 struct rtl_priv *rtlpriv = rtl_priv(hw);
2204 rtl8821ae_dm_init_edca_turbo(hw);
2205 switch (aci) {
2206 case AC1_BK:
2207 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
2208 break;
2209 case AC0_BE:
2210
2211 break;
2212 case AC2_VI:
2213 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
2214 break;
2215 case AC3_VO:
2216 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
2217 break;
2218 default:
2219 WARN_ONCE(true, "rtl8821ae: invalid aci: %d !\n", aci);
2220 break;
2221 }
2222 }
2223
2224 static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw)
2225 {
2226 struct rtl_priv *rtlpriv = rtl_priv(hw);
2227 u32 tmp = rtl_read_dword(rtlpriv, REG_HISR);
2228
2229 rtl_write_dword(rtlpriv, REG_HISR, tmp);
2230
2231 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
2232 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
2233
2234 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
2235 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
2236 }
2237
2238 void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
2239 {
2240 struct rtl_priv *rtlpriv = rtl_priv(hw);
2241 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2242
2243 if (rtlpci->int_clear)
2244 rtl8821ae_clear_interrupt(hw);
2245
2246 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
2247 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
2248 rtlpci->irq_enabled = true;
2249
2250
2251
2252
2253
2254
2255
2256 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
2257 }
2258
2259 void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw)
2260 {
2261 struct rtl_priv *rtlpriv = rtl_priv(hw);
2262 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2263
2264 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
2265 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
2266 rtlpci->irq_enabled = false;
2267
2268 }
2269
2270 static void _rtl8821ae_clear_pci_pme_status(struct ieee80211_hw *hw)
2271 {
2272 struct rtl_priv *rtlpriv = rtl_priv(hw);
2273 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2274 u16 cap_hdr;
2275 u8 cap_pointer;
2276 u8 cap_id = 0xff;
2277 u8 pmcs_reg;
2278 u8 cnt = 0;
2279
2280
2281
2282
2283
2284 pci_read_config_byte(rtlpci->pdev, 0x34, &cap_pointer);
2285 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2286 "PCI configuration 0x34 = 0x%2x\n", cap_pointer);
2287
2288 do {
2289 pci_read_config_word(rtlpci->pdev, cap_pointer, &cap_hdr);
2290 cap_id = cap_hdr & 0xFF;
2291
2292 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2293 "in pci configuration, cap_pointer%x = %x\n",
2294 cap_pointer, cap_id);
2295
2296 if (cap_id == 0x01) {
2297 break;
2298 } else {
2299
2300 cap_pointer = (cap_hdr >> 8) & 0xFF;
2301
2302 if (cap_pointer == 0x00 || cap_pointer == 0xff) {
2303 cap_id = 0xff;
2304 break;
2305 }
2306 }
2307 } while (cnt++ < 200);
2308
2309 if (cap_id == 0x01) {
2310
2311
2312
2313 pci_read_config_byte(rtlpci->pdev, cap_pointer + 5, &pmcs_reg);
2314
2315 if (pmcs_reg & BIT(7)) {
2316
2317 pmcs_reg = pmcs_reg | BIT(7);
2318
2319 pci_write_config_byte(rtlpci->pdev, cap_pointer + 5,
2320 pmcs_reg);
2321
2322 pci_read_config_byte(rtlpci->pdev, cap_pointer + 5,
2323 &pmcs_reg);
2324 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
2325 "Clear PME status 0x%2x to 0x%2x\n",
2326 cap_pointer + 5, pmcs_reg);
2327 } else {
2328 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
2329 "PME status(0x%2x) = 0x%2x\n",
2330 cap_pointer + 5, pmcs_reg);
2331 }
2332 } else {
2333 rtl_dbg(rtlpriv, COMP_INIT, DBG_WARNING,
2334 "Cannot find PME Capability\n");
2335 }
2336 }
2337
2338 void rtl8821ae_card_disable(struct ieee80211_hw *hw)
2339 {
2340 struct rtl_priv *rtlpriv = rtl_priv(hw);
2341 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2342 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
2343 struct rtl_mac *mac = rtl_mac(rtlpriv);
2344 enum nl80211_iftype opmode;
2345 bool support_remote_wakeup;
2346 u8 tmp;
2347 u32 count = 0;
2348
2349 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
2350 (u8 *)(&support_remote_wakeup));
2351
2352 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2353
2354 if (!(support_remote_wakeup && mac->opmode == NL80211_IFTYPE_STATION)
2355 || !rtlhal->enter_pnp_sleep) {
2356 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Normal Power off\n");
2357 mac->link_state = MAC80211_NOLINK;
2358 opmode = NL80211_IFTYPE_UNSPECIFIED;
2359 _rtl8821ae_set_media_status(hw, opmode);
2360 _rtl8821ae_poweroff_adapter(hw);
2361 } else {
2362 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Wowlan Supported.\n");
2363
2364
2365 rtl_write_byte(rtlpriv, REG_MCUTST_WOWLAN, 0x0);
2366
2367 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
2368 rtl8821ae_set_fw_related_for_wowlan(hw, true);
2369 #endif
2370
2371
2372
2373 if (_rtl8821ae_dynamic_rqpn(hw, 0xE0, 0x3, 0x80c20d0d))
2374 rtlhal->re_init_llt_table = true;
2375
2376
2377
2378
2379 rtl8821ae_set_fw_global_info_cmd(hw);
2380
2381 _rtl8821ae_download_rsvd_page(hw, true);
2382
2383
2384 printk("mac->link_state = %d\n", mac->link_state);
2385 if (mac->link_state >= MAC80211_LINKED &&
2386 mac->opmode == NL80211_IFTYPE_STATION) {
2387 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
2388 rtl8821ae_set_fw_media_status_rpt_cmd(hw,
2389 RT_MEDIA_CONNECT);
2390
2391 rtl8821ae_set_fw_wowlan_mode(hw, true);
2392
2393 rtl8821ae_set_fw_keep_alive_cmd(hw, true);
2394
2395
2396 rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(hw, true);
2397 }
2398
2399
2400
2401
2402
2403
2404 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, BIT(2));
2405
2406 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2407 count = 0;
2408 while (!(tmp & BIT(1)) && (count++ < 100)) {
2409 udelay(10);
2410 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2411 }
2412 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2413 "Wait Rx DMA Finished before host sleep. count=%d\n",
2414 count);
2415
2416
2417 rtlpriv->intf_ops->reset_trx_ring(hw);
2418
2419 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, 0x0);
2420
2421 _rtl8821ae_clear_pci_pme_status(hw);
2422 tmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
2423 rtl_write_byte(rtlpriv, REG_SYS_CLKR, tmp | BIT(3));
2424
2425 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x20);
2426 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x60);
2427 }
2428
2429 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
2430 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
2431 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
2432
2433 if (support_remote_wakeup && rtlhal->enter_pnp_sleep) {
2434
2435
2436 rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 1);
2437
2438
2439 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xff);
2440 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Stop PCIE Tx DMA.\n");
2441
2442
2443 count = 0;
2444 do {
2445 tmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG);
2446 udelay(10);
2447 count++;
2448 } while ((tmp != 0) && (count < 100));
2449 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2450 "Wait Tx DMA Finished before host sleep. count=%d\n",
2451 count);
2452
2453 if (rtlhal->hw_rof_enable) {
2454 printk("hw_rof_enable\n");
2455 tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3);
2456 rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1));
2457 }
2458 }
2459
2460 rtlpriv->phy.iqk_initialized = false;
2461 }
2462
2463 void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw,
2464 struct rtl_int *intvec)
2465 {
2466 struct rtl_priv *rtlpriv = rtl_priv(hw);
2467 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2468
2469 intvec->inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
2470 rtl_write_dword(rtlpriv, ISR, intvec->inta);
2471
2472 intvec->intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
2473 rtl_write_dword(rtlpriv, REG_HISRE, intvec->intb);
2474 }
2475
2476 void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw)
2477 {
2478 struct rtl_priv *rtlpriv = rtl_priv(hw);
2479 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2480 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2481 u16 bcn_interval, atim_window;
2482
2483 bcn_interval = mac->beacon_interval;
2484 atim_window = 2;
2485 rtl8821ae_disable_interrupt(hw);
2486 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
2487 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
2488 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
2489 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
2490 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
2491 rtl_write_byte(rtlpriv, 0x606, 0x30);
2492 rtlpci->reg_bcn_ctrl_val |= BIT(3);
2493 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
2494 rtl8821ae_enable_interrupt(hw);
2495 }
2496
2497 void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw)
2498 {
2499 struct rtl_priv *rtlpriv = rtl_priv(hw);
2500 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2501 u16 bcn_interval = mac->beacon_interval;
2502
2503 rtl_dbg(rtlpriv, COMP_BEACON, DBG_DMESG,
2504 "beacon_interval:%d\n", bcn_interval);
2505 rtl8821ae_disable_interrupt(hw);
2506 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
2507 rtl8821ae_enable_interrupt(hw);
2508 }
2509
2510 void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw,
2511 u32 add_msr, u32 rm_msr)
2512 {
2513 struct rtl_priv *rtlpriv = rtl_priv(hw);
2514 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2515
2516 rtl_dbg(rtlpriv, COMP_INTR, DBG_LOUD,
2517 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
2518
2519 if (add_msr)
2520 rtlpci->irq_mask[0] |= add_msr;
2521 if (rm_msr)
2522 rtlpci->irq_mask[0] &= (~rm_msr);
2523 rtl8821ae_disable_interrupt(hw);
2524 rtl8821ae_enable_interrupt(hw);
2525 }
2526
2527 static u8 _rtl8821ae_get_chnl_group(u8 chnl)
2528 {
2529 u8 group = 0;
2530
2531 if (chnl <= 14) {
2532 if (1 <= chnl && chnl <= 2)
2533 group = 0;
2534 else if (3 <= chnl && chnl <= 5)
2535 group = 1;
2536 else if (6 <= chnl && chnl <= 8)
2537 group = 2;
2538 else if (9 <= chnl && chnl <= 11)
2539 group = 3;
2540 else
2541 group = 4;
2542 } else {
2543 if (36 <= chnl && chnl <= 42)
2544 group = 0;
2545 else if (44 <= chnl && chnl <= 48)
2546 group = 1;
2547 else if (50 <= chnl && chnl <= 58)
2548 group = 2;
2549 else if (60 <= chnl && chnl <= 64)
2550 group = 3;
2551 else if (100 <= chnl && chnl <= 106)
2552 group = 4;
2553 else if (108 <= chnl && chnl <= 114)
2554 group = 5;
2555 else if (116 <= chnl && chnl <= 122)
2556 group = 6;
2557 else if (124 <= chnl && chnl <= 130)
2558 group = 7;
2559 else if (132 <= chnl && chnl <= 138)
2560 group = 8;
2561 else if (140 <= chnl && chnl <= 144)
2562 group = 9;
2563 else if (149 <= chnl && chnl <= 155)
2564 group = 10;
2565 else if (157 <= chnl && chnl <= 161)
2566 group = 11;
2567 else if (165 <= chnl && chnl <= 171)
2568 group = 12;
2569 else if (173 <= chnl && chnl <= 177)
2570 group = 13;
2571 else
2572 WARN_ONCE(true,
2573 "rtl8821ae: 5G, Channel %d in Group not found\n",
2574 chnl);
2575 }
2576 return group;
2577 }
2578
2579 static void _rtl8821ae_read_power_value_fromprom(struct ieee80211_hw *hw,
2580 struct txpower_info_2g *pwrinfo24g,
2581 struct txpower_info_5g *pwrinfo5g,
2582 bool autoload_fail,
2583 u8 *hwinfo)
2584 {
2585 struct rtl_priv *rtlpriv = rtl_priv(hw);
2586 u32 rfpath, eeaddr = EEPROM_TX_PWR_INX, group, txcount = 0;
2587
2588 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2589 "hal_ReadPowerValueFromPROM8821ae(): hwinfo[0x%x]=0x%x\n",
2590 (eeaddr + 1), hwinfo[eeaddr + 1]);
2591 if (hwinfo[eeaddr + 1] == 0xFF)
2592 autoload_fail = true;
2593
2594 if (autoload_fail) {
2595 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2596 "auto load fail : Use Default value!\n");
2597 for (rfpath = 0 ; rfpath < MAX_RF_PATH ; rfpath++) {
2598
2599 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
2600 pwrinfo24g->index_cck_base[rfpath][group] = 0x2D;
2601 pwrinfo24g->index_bw40_base[rfpath][group] = 0x2D;
2602 }
2603 for (txcount = 0; txcount < MAX_TX_COUNT; txcount++) {
2604 if (txcount == 0) {
2605 pwrinfo24g->bw20_diff[rfpath][0] = 0x02;
2606 pwrinfo24g->ofdm_diff[rfpath][0] = 0x04;
2607 } else {
2608 pwrinfo24g->bw20_diff[rfpath][txcount] = 0xFE;
2609 pwrinfo24g->bw40_diff[rfpath][txcount] = 0xFE;
2610 pwrinfo24g->cck_diff[rfpath][txcount] = 0xFE;
2611 pwrinfo24g->ofdm_diff[rfpath][txcount] = 0xFE;
2612 }
2613 }
2614
2615 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++)
2616 pwrinfo5g->index_bw40_base[rfpath][group] = 0x2A;
2617
2618 for (txcount = 0; txcount < MAX_TX_COUNT; txcount++) {
2619 if (txcount == 0) {
2620 pwrinfo5g->ofdm_diff[rfpath][0] = 0x04;
2621 pwrinfo5g->bw20_diff[rfpath][0] = 0x00;
2622 pwrinfo5g->bw80_diff[rfpath][0] = 0xFE;
2623 pwrinfo5g->bw160_diff[rfpath][0] = 0xFE;
2624 } else {
2625 pwrinfo5g->ofdm_diff[rfpath][0] = 0xFE;
2626 pwrinfo5g->bw20_diff[rfpath][0] = 0xFE;
2627 pwrinfo5g->bw40_diff[rfpath][0] = 0xFE;
2628 pwrinfo5g->bw80_diff[rfpath][0] = 0xFE;
2629 pwrinfo5g->bw160_diff[rfpath][0] = 0xFE;
2630 }
2631 }
2632 }
2633 return;
2634 }
2635
2636 rtl_priv(hw)->efuse.txpwr_fromeprom = true;
2637
2638 for (rfpath = 0 ; rfpath < MAX_RF_PATH ; rfpath++) {
2639
2640 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
2641 pwrinfo24g->index_cck_base[rfpath][group] = hwinfo[eeaddr++];
2642 if (pwrinfo24g->index_cck_base[rfpath][group] == 0xFF)
2643 pwrinfo24g->index_cck_base[rfpath][group] = 0x2D;
2644 }
2645 for (group = 0 ; group < MAX_CHNL_GROUP_24G - 1; group++) {
2646 pwrinfo24g->index_bw40_base[rfpath][group] = hwinfo[eeaddr++];
2647 if (pwrinfo24g->index_bw40_base[rfpath][group] == 0xFF)
2648 pwrinfo24g->index_bw40_base[rfpath][group] = 0x2D;
2649 }
2650 for (txcount = 0; txcount < MAX_TX_COUNT; txcount++) {
2651 if (txcount == 0) {
2652 pwrinfo24g->bw40_diff[rfpath][txcount] = 0;
2653
2654 pwrinfo24g->bw20_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0xf0) >> 4;
2655 if (pwrinfo24g->bw20_diff[rfpath][txcount] & BIT(3))
2656 pwrinfo24g->bw20_diff[rfpath][txcount] |= 0xF0;
2657
2658 pwrinfo24g->ofdm_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0x0f);
2659 if (pwrinfo24g->ofdm_diff[rfpath][txcount] & BIT(3))
2660 pwrinfo24g->ofdm_diff[rfpath][txcount] |= 0xF0;
2661
2662 pwrinfo24g->cck_diff[rfpath][txcount] = 0;
2663 eeaddr++;
2664 } else {
2665 pwrinfo24g->bw40_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0xf0) >> 4;
2666 if (pwrinfo24g->bw40_diff[rfpath][txcount] & BIT(3))
2667 pwrinfo24g->bw40_diff[rfpath][txcount] |= 0xF0;
2668
2669 pwrinfo24g->bw20_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0x0f);
2670 if (pwrinfo24g->bw20_diff[rfpath][txcount] & BIT(3))
2671 pwrinfo24g->bw20_diff[rfpath][txcount] |= 0xF0;
2672
2673 eeaddr++;
2674
2675 pwrinfo24g->ofdm_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0xf0) >> 4;
2676 if (pwrinfo24g->ofdm_diff[rfpath][txcount] & BIT(3))
2677 pwrinfo24g->ofdm_diff[rfpath][txcount] |= 0xF0;
2678
2679 pwrinfo24g->cck_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0x0f);
2680 if (pwrinfo24g->cck_diff[rfpath][txcount] & BIT(3))
2681 pwrinfo24g->cck_diff[rfpath][txcount] |= 0xF0;
2682
2683 eeaddr++;
2684 }
2685 }
2686
2687
2688 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
2689 pwrinfo5g->index_bw40_base[rfpath][group] = hwinfo[eeaddr++];
2690 if (pwrinfo5g->index_bw40_base[rfpath][group] == 0xFF)
2691 pwrinfo5g->index_bw40_base[rfpath][group] = 0xFE;
2692 }
2693
2694 for (txcount = 0; txcount < MAX_TX_COUNT; txcount++) {
2695 if (txcount == 0) {
2696 pwrinfo5g->bw40_diff[rfpath][txcount] = 0;
2697
2698 pwrinfo5g->bw20_diff[rfpath][0] = (hwinfo[eeaddr] & 0xf0) >> 4;
2699 if (pwrinfo5g->bw20_diff[rfpath][txcount] & BIT(3))
2700 pwrinfo5g->bw20_diff[rfpath][txcount] |= 0xF0;
2701
2702 pwrinfo5g->ofdm_diff[rfpath][0] = (hwinfo[eeaddr] & 0x0f);
2703 if (pwrinfo5g->ofdm_diff[rfpath][txcount] & BIT(3))
2704 pwrinfo5g->ofdm_diff[rfpath][txcount] |= 0xF0;
2705
2706 eeaddr++;
2707 } else {
2708 pwrinfo5g->bw40_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0xf0) >> 4;
2709 if (pwrinfo5g->bw40_diff[rfpath][txcount] & BIT(3))
2710 pwrinfo5g->bw40_diff[rfpath][txcount] |= 0xF0;
2711
2712 pwrinfo5g->bw20_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0x0f);
2713 if (pwrinfo5g->bw20_diff[rfpath][txcount] & BIT(3))
2714 pwrinfo5g->bw20_diff[rfpath][txcount] |= 0xF0;
2715
2716 eeaddr++;
2717 }
2718 }
2719
2720 pwrinfo5g->ofdm_diff[rfpath][1] = (hwinfo[eeaddr] & 0xf0) >> 4;
2721 pwrinfo5g->ofdm_diff[rfpath][2] = (hwinfo[eeaddr] & 0x0f);
2722
2723 eeaddr++;
2724
2725 pwrinfo5g->ofdm_diff[rfpath][3] = (hwinfo[eeaddr] & 0x0f);
2726
2727 eeaddr++;
2728
2729 for (txcount = 1; txcount < MAX_TX_COUNT; txcount++) {
2730 if (pwrinfo5g->ofdm_diff[rfpath][txcount] & BIT(3))
2731 pwrinfo5g->ofdm_diff[rfpath][txcount] |= 0xF0;
2732 }
2733 for (txcount = 0; txcount < MAX_TX_COUNT; txcount++) {
2734 pwrinfo5g->bw80_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0xf0) >> 4;
2735
2736 if (pwrinfo5g->bw80_diff[rfpath][txcount] & BIT(3))
2737 pwrinfo5g->bw80_diff[rfpath][txcount] |= 0xF0;
2738
2739 pwrinfo5g->bw160_diff[rfpath][txcount] = (hwinfo[eeaddr] & 0x0f);
2740 if (pwrinfo5g->bw160_diff[rfpath][txcount] & BIT(3))
2741 pwrinfo5g->bw160_diff[rfpath][txcount] |= 0xF0;
2742
2743 eeaddr++;
2744 }
2745 }
2746 }
2747 #if 0
2748 static void _rtl8812ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2749 bool autoload_fail,
2750 u8 *hwinfo)
2751 {
2752 struct rtl_priv *rtlpriv = rtl_priv(hw);
2753 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2754 struct txpower_info_2g pwrinfo24g;
2755 struct txpower_info_5g pwrinfo5g;
2756 u8 rf_path, index;
2757 u8 i;
2758
2759 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g,
2760 &pwrinfo5g, autoload_fail, hwinfo);
2761
2762 for (rf_path = 0; rf_path < 2; rf_path++) {
2763 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2764 index = _rtl8821ae_get_chnl_group(i + 1);
2765
2766 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2767 rtlefuse->txpwrlevel_cck[rf_path][i] =
2768 pwrinfo24g.index_cck_base[rf_path][5];
2769 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2770 pwrinfo24g.index_bw40_base[rf_path][index];
2771 } else {
2772 rtlefuse->txpwrlevel_cck[rf_path][i] =
2773 pwrinfo24g.index_cck_base[rf_path][index];
2774 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2775 pwrinfo24g.index_bw40_base[rf_path][index];
2776 }
2777 }
2778
2779 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2780 index = _rtl8821ae_get_chnl_group(channel5g[i]);
2781 rtlefuse->txpwr_5g_bw40base[rf_path][i] =
2782 pwrinfo5g.index_bw40_base[rf_path][index];
2783 }
2784 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2785 u8 upper, lower;
2786 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2787 upper = pwrinfo5g.index_bw40_base[rf_path][index];
2788 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2789
2790 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2791 }
2792 for (i = 0; i < MAX_TX_COUNT; i++) {
2793 rtlefuse->txpwr_cckdiff[rf_path][i] =
2794 pwrinfo24g.cck_diff[rf_path][i];
2795 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
2796 pwrinfo24g.ofdm_diff[rf_path][i];
2797 rtlefuse->txpwr_ht20diff[rf_path][i] =
2798 pwrinfo24g.bw20_diff[rf_path][i];
2799 rtlefuse->txpwr_ht40diff[rf_path][i] =
2800 pwrinfo24g.bw40_diff[rf_path][i];
2801
2802 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] =
2803 pwrinfo5g.ofdm_diff[rf_path][i];
2804 rtlefuse->txpwr_5g_bw20diff[rf_path][i] =
2805 pwrinfo5g.bw20_diff[rf_path][i];
2806 rtlefuse->txpwr_5g_bw40diff[rf_path][i] =
2807 pwrinfo5g.bw40_diff[rf_path][i];
2808 rtlefuse->txpwr_5g_bw80diff[rf_path][i] =
2809 pwrinfo5g.bw80_diff[rf_path][i];
2810 }
2811 }
2812
2813 if (!autoload_fail) {
2814 rtlefuse->eeprom_regulatory =
2815 hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;
2816 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2817 rtlefuse->eeprom_regulatory = 0;
2818 } else {
2819 rtlefuse->eeprom_regulatory = 0;
2820 }
2821
2822 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2823 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2824 }
2825 #endif
2826 static void _rtl8821ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2827 bool autoload_fail,
2828 u8 *hwinfo)
2829 {
2830 struct rtl_priv *rtlpriv = rtl_priv(hw);
2831 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2832 struct txpower_info_2g pwrinfo24g;
2833 struct txpower_info_5g pwrinfo5g;
2834 u8 rf_path, index;
2835 u8 i;
2836
2837 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g,
2838 &pwrinfo5g, autoload_fail, hwinfo);
2839
2840 for (rf_path = 0; rf_path < 2; rf_path++) {
2841 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2842 index = _rtl8821ae_get_chnl_group(i + 1);
2843
2844 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2845 rtlefuse->txpwrlevel_cck[rf_path][i] =
2846 pwrinfo24g.index_cck_base[rf_path][5];
2847 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2848 pwrinfo24g.index_bw40_base[rf_path][index];
2849 } else {
2850 rtlefuse->txpwrlevel_cck[rf_path][i] =
2851 pwrinfo24g.index_cck_base[rf_path][index];
2852 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2853 pwrinfo24g.index_bw40_base[rf_path][index];
2854 }
2855 }
2856
2857 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2858 index = _rtl8821ae_get_chnl_group(channel5g[i]);
2859 rtlefuse->txpwr_5g_bw40base[rf_path][i] =
2860 pwrinfo5g.index_bw40_base[rf_path][index];
2861 }
2862 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2863 u8 upper, lower;
2864 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2865 upper = pwrinfo5g.index_bw40_base[rf_path][index];
2866 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2867
2868 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2869 }
2870 for (i = 0; i < MAX_TX_COUNT; i++) {
2871 rtlefuse->txpwr_cckdiff[rf_path][i] =
2872 pwrinfo24g.cck_diff[rf_path][i];
2873 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
2874 pwrinfo24g.ofdm_diff[rf_path][i];
2875 rtlefuse->txpwr_ht20diff[rf_path][i] =
2876 pwrinfo24g.bw20_diff[rf_path][i];
2877 rtlefuse->txpwr_ht40diff[rf_path][i] =
2878 pwrinfo24g.bw40_diff[rf_path][i];
2879
2880 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] =
2881 pwrinfo5g.ofdm_diff[rf_path][i];
2882 rtlefuse->txpwr_5g_bw20diff[rf_path][i] =
2883 pwrinfo5g.bw20_diff[rf_path][i];
2884 rtlefuse->txpwr_5g_bw40diff[rf_path][i] =
2885 pwrinfo5g.bw40_diff[rf_path][i];
2886 rtlefuse->txpwr_5g_bw80diff[rf_path][i] =
2887 pwrinfo5g.bw80_diff[rf_path][i];
2888 }
2889 }
2890
2891 if (!autoload_fail) {
2892 rtlefuse->eeprom_regulatory = hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;
2893 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2894 rtlefuse->eeprom_regulatory = 0;
2895 } else {
2896 rtlefuse->eeprom_regulatory = 0;
2897 }
2898
2899 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2900 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2901 }
2902
2903 static void _rtl8812ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo,
2904 bool autoload_fail)
2905 {
2906 struct rtl_priv *rtlpriv = rtl_priv(hw);
2907 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2908
2909 if (!autoload_fail) {
2910 rtlhal->pa_type_2g = hwinfo[0XBC];
2911 rtlhal->lna_type_2g = hwinfo[0XBD];
2912 if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) {
2913 rtlhal->pa_type_2g = 0;
2914 rtlhal->lna_type_2g = 0;
2915 }
2916 rtlhal->external_pa_2g = ((rtlhal->pa_type_2g & BIT(5)) &&
2917 (rtlhal->pa_type_2g & BIT(4))) ?
2918 1 : 0;
2919 rtlhal->external_lna_2g = ((rtlhal->lna_type_2g & BIT(7)) &&
2920 (rtlhal->lna_type_2g & BIT(3))) ?
2921 1 : 0;
2922
2923 rtlhal->pa_type_5g = hwinfo[0XBC];
2924 rtlhal->lna_type_5g = hwinfo[0XBF];
2925 if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) {
2926 rtlhal->pa_type_5g = 0;
2927 rtlhal->lna_type_5g = 0;
2928 }
2929 rtlhal->external_pa_5g = ((rtlhal->pa_type_5g & BIT(1)) &&
2930 (rtlhal->pa_type_5g & BIT(0))) ?
2931 1 : 0;
2932 rtlhal->external_lna_5g = ((rtlhal->lna_type_5g & BIT(7)) &&
2933 (rtlhal->lna_type_5g & BIT(3))) ?
2934 1 : 0;
2935 } else {
2936 rtlhal->external_pa_2g = 0;
2937 rtlhal->external_lna_2g = 0;
2938 rtlhal->external_pa_5g = 0;
2939 rtlhal->external_lna_5g = 0;
2940 }
2941 }
2942
2943 static void _rtl8812ae_read_amplifier_type(struct ieee80211_hw *hw, u8 *hwinfo,
2944 bool autoload_fail)
2945 {
2946 struct rtl_priv *rtlpriv = rtl_priv(hw);
2947 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2948
2949 u8 ext_type_pa_2g_a = (hwinfo[0XBD] & BIT(2)) >> 2;
2950 u8 ext_type_pa_2g_b = (hwinfo[0XBD] & BIT(6)) >> 6;
2951 u8 ext_type_pa_5g_a = (hwinfo[0XBF] & BIT(2)) >> 2;
2952 u8 ext_type_pa_5g_b = (hwinfo[0XBF] & BIT(6)) >> 6;
2953
2954 u8 ext_type_lna_2g_a = (hwinfo[0XBD] & (BIT(1) | BIT(0))) >> 0;
2955
2956 u8 ext_type_lna_2g_b = (hwinfo[0XBD] & (BIT(5) | BIT(4))) >> 4;
2957
2958 u8 ext_type_lna_5g_a = (hwinfo[0XBF] & (BIT(1) | BIT(0))) >> 0;
2959
2960 u8 ext_type_lna_5g_b = (hwinfo[0XBF] & (BIT(5) | BIT(4))) >> 4;
2961
2962 _rtl8812ae_read_pa_type(hw, hwinfo, autoload_fail);
2963
2964
2965 if ((rtlhal->pa_type_2g & (BIT(5) | BIT(4))) == (BIT(5) | BIT(4)))
2966 rtlhal->type_gpa = ext_type_pa_2g_b << 2 | ext_type_pa_2g_a;
2967
2968
2969 if ((rtlhal->pa_type_5g & (BIT(1) | BIT(0))) == (BIT(1) | BIT(0)))
2970 rtlhal->type_apa = ext_type_pa_5g_b << 2 | ext_type_pa_5g_a;
2971
2972
2973 if ((rtlhal->lna_type_2g & (BIT(7) | BIT(3))) == (BIT(7) | BIT(3)))
2974 rtlhal->type_glna = ext_type_lna_2g_b << 2 | ext_type_lna_2g_a;
2975
2976
2977 if ((rtlhal->lna_type_5g & (BIT(7) | BIT(3))) == (BIT(7) | BIT(3)))
2978 rtlhal->type_alna = ext_type_lna_5g_b << 2 | ext_type_lna_5g_a;
2979 }
2980
2981 static void _rtl8821ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo,
2982 bool autoload_fail)
2983 {
2984 struct rtl_priv *rtlpriv = rtl_priv(hw);
2985 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2986
2987 if (!autoload_fail) {
2988 rtlhal->pa_type_2g = hwinfo[0XBC];
2989 rtlhal->lna_type_2g = hwinfo[0XBD];
2990 if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) {
2991 rtlhal->pa_type_2g = 0;
2992 rtlhal->lna_type_2g = 0;
2993 }
2994 rtlhal->external_pa_2g = (rtlhal->pa_type_2g & BIT(5)) ? 1 : 0;
2995 rtlhal->external_lna_2g = (rtlhal->lna_type_2g & BIT(7)) ? 1 : 0;
2996
2997 rtlhal->pa_type_5g = hwinfo[0XBC];
2998 rtlhal->lna_type_5g = hwinfo[0XBF];
2999 if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) {
3000 rtlhal->pa_type_5g = 0;
3001 rtlhal->lna_type_5g = 0;
3002 }
3003 rtlhal->external_pa_5g = (rtlhal->pa_type_5g & BIT(1)) ? 1 : 0;
3004 rtlhal->external_lna_5g = (rtlhal->lna_type_5g & BIT(7)) ? 1 : 0;
3005 } else {
3006 rtlhal->external_pa_2g = 0;
3007 rtlhal->external_lna_2g = 0;
3008 rtlhal->external_pa_5g = 0;
3009 rtlhal->external_lna_5g = 0;
3010 }
3011 }
3012
3013 static void _rtl8821ae_read_rfe_type(struct ieee80211_hw *hw, u8 *hwinfo,
3014 bool autoload_fail)
3015 {
3016 struct rtl_priv *rtlpriv = rtl_priv(hw);
3017 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
3018
3019 if (!autoload_fail) {
3020 if (hwinfo[EEPROM_RFE_OPTION] & BIT(7)) {
3021 if (rtlhal->external_lna_5g) {
3022 if (rtlhal->external_pa_5g) {
3023 if (rtlhal->external_lna_2g &&
3024 rtlhal->external_pa_2g)
3025 rtlhal->rfe_type = 3;
3026 else
3027 rtlhal->rfe_type = 0;
3028 } else {
3029 rtlhal->rfe_type = 2;
3030 }
3031 } else {
3032 rtlhal->rfe_type = 4;
3033 }
3034 } else {
3035 rtlhal->rfe_type = hwinfo[EEPROM_RFE_OPTION] & 0x3F;
3036
3037 if (rtlhal->rfe_type == 4 &&
3038 (rtlhal->external_pa_5g ||
3039 rtlhal->external_pa_2g ||
3040 rtlhal->external_lna_5g ||
3041 rtlhal->external_lna_2g)) {
3042 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
3043 rtlhal->rfe_type = 2;
3044 }
3045 }
3046 } else {
3047 rtlhal->rfe_type = 0x04;
3048 }
3049
3050 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3051 "RFE Type: 0x%2x\n", rtlhal->rfe_type);
3052 }
3053
3054 static void _rtl8812ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3055 bool auto_load_fail, u8 *hwinfo)
3056 {
3057 struct rtl_priv *rtlpriv = rtl_priv(hw);
3058 u8 value;
3059
3060 if (!auto_load_fail) {
3061 value = *(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION];
3062 if (((value & 0xe0) >> 5) == 0x1)
3063 rtlpriv->btcoexist.btc_info.btcoexist = 1;
3064 else
3065 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3066 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3067
3068 value = hwinfo[EEPROM_RF_BT_SETTING];
3069 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3070 } else {
3071 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3072 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3073 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3074 }
3075
3076 }
3077
3078 static void _rtl8821ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3079 bool auto_load_fail, u8 *hwinfo)
3080 {
3081 struct rtl_priv *rtlpriv = rtl_priv(hw);
3082 u8 value;
3083 u32 tmpu_32;
3084
3085 if (!auto_load_fail) {
3086 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
3087 if (tmpu_32 & BIT(18))
3088 rtlpriv->btcoexist.btc_info.btcoexist = 1;
3089 else
3090 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3091 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3092
3093 value = hwinfo[EEPROM_RF_BT_SETTING];
3094 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3095 } else {
3096 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3097 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3098 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3099 }
3100
3101 }
3102
3103 static void _rtl8821ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_test)
3104 {
3105 struct rtl_priv *rtlpriv = rtl_priv(hw);
3106 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3107 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3108 int params[] = {RTL_EEPROM_ID, EEPROM_VID, EEPROM_DID,
3109 EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR,
3110 EEPROM_CHANNELPLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID,
3111 COUNTRY_CODE_WORLD_WIDE_13};
3112 u8 *hwinfo;
3113
3114 if (b_pseudo_test) {
3115 ;
3116 }
3117
3118 hwinfo = kzalloc(HWSET_MAX_SIZE, GFP_KERNEL);
3119 if (!hwinfo)
3120 return;
3121
3122 if (rtl_get_hwinfo(hw, rtlpriv, HWSET_MAX_SIZE, hwinfo, params))
3123 goto exit;
3124
3125 _rtl8821ae_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
3126 hwinfo);
3127
3128 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
3129 _rtl8812ae_read_amplifier_type(hw, hwinfo,
3130 rtlefuse->autoload_failflag);
3131 _rtl8812ae_read_bt_coexist_info_from_hwpg(hw,
3132 rtlefuse->autoload_failflag, hwinfo);
3133 } else {
3134 _rtl8821ae_read_pa_type(hw, hwinfo, rtlefuse->autoload_failflag);
3135 _rtl8821ae_read_bt_coexist_info_from_hwpg(hw,
3136 rtlefuse->autoload_failflag, hwinfo);
3137 }
3138
3139 _rtl8821ae_read_rfe_type(hw, hwinfo, rtlefuse->autoload_failflag);
3140
3141 rtlefuse->board_type = ODM_BOARD_DEFAULT;
3142 if (rtlhal->external_lna_2g != 0)
3143 rtlefuse->board_type |= ODM_BOARD_EXT_LNA;
3144 if (rtlhal->external_lna_5g != 0)
3145 rtlefuse->board_type |= ODM_BOARD_EXT_LNA_5G;
3146 if (rtlhal->external_pa_2g != 0)
3147 rtlefuse->board_type |= ODM_BOARD_EXT_PA;
3148 if (rtlhal->external_pa_5g != 0)
3149 rtlefuse->board_type |= ODM_BOARD_EXT_PA_5G;
3150
3151 if (rtlpriv->btcoexist.btc_info.btcoexist == 1)
3152 rtlefuse->board_type |= ODM_BOARD_BT;
3153
3154 rtlhal->board_type = rtlefuse->board_type;
3155 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3156 "board_type = 0x%x\n", rtlefuse->board_type);
3157
3158 rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
3159 if (rtlefuse->eeprom_channelplan == 0xff)
3160 rtlefuse->eeprom_channelplan = 0x7F;
3161
3162
3163 rtlefuse->channel_plan = rtlefuse->eeprom_channelplan;
3164
3165
3166 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8821AE];
3167 if (rtlefuse->crystalcap == 0xFF)
3168 rtlefuse->crystalcap = 0x20;
3169
3170 rtlefuse->eeprom_thermalmeter = *(u8 *)&hwinfo[EEPROM_THERMAL_METER];
3171 if ((rtlefuse->eeprom_thermalmeter == 0xff) ||
3172 rtlefuse->autoload_failflag) {
3173 rtlefuse->apk_thermalmeterignore = true;
3174 rtlefuse->eeprom_thermalmeter = 0xff;
3175 }
3176
3177 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
3178 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3179 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
3180
3181 if (!rtlefuse->autoload_failflag) {
3182 rtlefuse->antenna_div_cfg =
3183 (hwinfo[EEPROM_RF_BOARD_OPTION] & 0x18) >> 3;
3184 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xff)
3185 rtlefuse->antenna_div_cfg = 0;
3186
3187 if (rtlpriv->btcoexist.btc_info.btcoexist == 1 &&
3188 rtlpriv->btcoexist.btc_info.ant_num == ANT_X1)
3189 rtlefuse->antenna_div_cfg = 0;
3190
3191 rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E];
3192 if (rtlefuse->antenna_div_type == 0xff)
3193 rtlefuse->antenna_div_type = FIXED_HW_ANTDIV;
3194 } else {
3195 rtlefuse->antenna_div_cfg = 0;
3196 rtlefuse->antenna_div_type = 0;
3197 }
3198
3199 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3200 "SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n",
3201 rtlefuse->antenna_div_cfg, rtlefuse->antenna_div_type);
3202
3203 rtlpriv->ledctl.led_opendrain = true;
3204
3205 if (rtlhal->oem_id == RT_CID_DEFAULT) {
3206 switch (rtlefuse->eeprom_oemid) {
3207 case RT_CID_DEFAULT:
3208 break;
3209 case EEPROM_CID_TOSHIBA:
3210 rtlhal->oem_id = RT_CID_TOSHIBA;
3211 break;
3212 case EEPROM_CID_CCX:
3213 rtlhal->oem_id = RT_CID_CCX;
3214 break;
3215 case EEPROM_CID_QMI:
3216 rtlhal->oem_id = RT_CID_819X_QMI;
3217 break;
3218 case EEPROM_CID_WHQL:
3219 break;
3220 default:
3221 break;
3222 }
3223 }
3224 exit:
3225 kfree(hwinfo);
3226 }
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252 void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw)
3253 {
3254 struct rtl_priv *rtlpriv = rtl_priv(hw);
3255 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3256 struct rtl_phy *rtlphy = &rtlpriv->phy;
3257 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3258 u8 tmp_u1b;
3259
3260 rtlhal->version = _rtl8821ae_read_chip_version(hw);
3261 if (get_rf_type(rtlphy) == RF_1T1R)
3262 rtlpriv->dm.rfpath_rxenable[0] = true;
3263 else
3264 rtlpriv->dm.rfpath_rxenable[0] =
3265 rtlpriv->dm.rfpath_rxenable[1] = true;
3266 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
3267 rtlhal->version);
3268
3269 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
3270 if (tmp_u1b & BIT(4)) {
3271 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
3272 rtlefuse->epromtype = EEPROM_93C46;
3273 } else {
3274 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
3275 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
3276 }
3277
3278 if (tmp_u1b & BIT(5)) {
3279 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
3280 rtlefuse->autoload_failflag = false;
3281 _rtl8821ae_read_adapter_info(hw, false);
3282 } else {
3283 pr_err("Autoload ERR!!\n");
3284 }
3285
3286
3287 }
3288
3289 static void rtl8821ae_update_hal_rate_table(struct ieee80211_hw *hw,
3290 struct ieee80211_sta *sta)
3291 {
3292 struct rtl_priv *rtlpriv = rtl_priv(hw);
3293 struct rtl_phy *rtlphy = &rtlpriv->phy;
3294 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3295 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3296 u32 ratr_value;
3297 u8 ratr_index = 0;
3298 u8 b_nmode = mac->ht_enable;
3299 u8 mimo_ps = IEEE80211_SMPS_OFF;
3300 u16 shortgi_rate;
3301 u32 tmp_ratr_value;
3302 u8 curtxbw_40mhz = mac->bw_40;
3303 u8 b_curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
3304 1 : 0;
3305 u8 b_curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
3306 1 : 0;
3307 enum wireless_mode wirelessmode = mac->mode;
3308
3309 if (rtlhal->current_bandtype == BAND_ON_5G)
3310 ratr_value = sta->deflink.supp_rates[1] << 4;
3311 else
3312 ratr_value = sta->deflink.supp_rates[0];
3313 if (mac->opmode == NL80211_IFTYPE_ADHOC)
3314 ratr_value = 0xfff;
3315 ratr_value |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
3316 sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
3317 switch (wirelessmode) {
3318 case WIRELESS_MODE_B:
3319 if (ratr_value & 0x0000000c)
3320 ratr_value &= 0x0000000d;
3321 else
3322 ratr_value &= 0x0000000f;
3323 break;
3324 case WIRELESS_MODE_G:
3325 ratr_value &= 0x00000FF5;
3326 break;
3327 case WIRELESS_MODE_N_24G:
3328 case WIRELESS_MODE_N_5G:
3329 b_nmode = 1;
3330 if (mimo_ps == IEEE80211_SMPS_STATIC) {
3331 ratr_value &= 0x0007F005;
3332 } else {
3333 u32 ratr_mask;
3334
3335 if (get_rf_type(rtlphy) == RF_1T2R ||
3336 get_rf_type(rtlphy) == RF_1T1R)
3337 ratr_mask = 0x000ff005;
3338 else
3339 ratr_mask = 0x0f0ff005;
3340
3341 ratr_value &= ratr_mask;
3342 }
3343 break;
3344 default:
3345 if (rtlphy->rf_type == RF_1T2R)
3346 ratr_value &= 0x000ff0ff;
3347 else
3348 ratr_value &= 0x0f0ff0ff;
3349
3350 break;
3351 }
3352
3353 if ((rtlpriv->btcoexist.bt_coexistence) &&
3354 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
3355 (rtlpriv->btcoexist.bt_cur_state) &&
3356 (rtlpriv->btcoexist.bt_ant_isolation) &&
3357 ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
3358 (rtlpriv->btcoexist.bt_service == BT_BUSY)))
3359 ratr_value &= 0x0fffcfc0;
3360 else
3361 ratr_value &= 0x0FFFFFFF;
3362
3363 if (b_nmode && ((curtxbw_40mhz &&
3364 b_curshortgi_40mhz) || (!curtxbw_40mhz &&
3365 b_curshortgi_20mhz))) {
3366 ratr_value |= 0x10000000;
3367 tmp_ratr_value = (ratr_value >> 12);
3368
3369 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
3370 if ((1 << shortgi_rate) & tmp_ratr_value)
3371 break;
3372 }
3373
3374 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
3375 (shortgi_rate << 4) | (shortgi_rate);
3376 }
3377
3378 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
3379
3380 rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
3381 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0));
3382 }
3383
3384 static u32 _rtl8821ae_rate_to_bitmap_2ssvht(__le16 vht_rate)
3385 {
3386 u8 i, j, tmp_rate;
3387 u32 rate_bitmap = 0;
3388
3389 for (i = j = 0; i < 4; i += 2, j += 10) {
3390 tmp_rate = (le16_to_cpu(vht_rate) >> i) & 3;
3391
3392 switch (tmp_rate) {
3393 case 2:
3394 rate_bitmap = rate_bitmap | (0x03ff << j);
3395 break;
3396 case 1:
3397 rate_bitmap = rate_bitmap | (0x01ff << j);
3398 break;
3399 case 0:
3400 rate_bitmap = rate_bitmap | (0x00ff << j);
3401 break;
3402 default:
3403 break;
3404 }
3405 }
3406
3407 return rate_bitmap;
3408 }
3409
3410 static u32 _rtl8821ae_set_ra_vht_ratr_bitmap(struct ieee80211_hw *hw,
3411 enum wireless_mode wirelessmode,
3412 u32 ratr_bitmap)
3413 {
3414 struct rtl_priv *rtlpriv = rtl_priv(hw);
3415 struct rtl_phy *rtlphy = &rtlpriv->phy;
3416 u32 ret_bitmap = ratr_bitmap;
3417
3418 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40
3419 || rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
3420 ret_bitmap = ratr_bitmap;
3421 else if (wirelessmode == WIRELESS_MODE_AC_5G
3422 || wirelessmode == WIRELESS_MODE_AC_24G) {
3423 if (rtlphy->rf_type == RF_1T1R)
3424 ret_bitmap = ratr_bitmap & (~BIT21);
3425 else
3426 ret_bitmap = ratr_bitmap & (~(BIT31|BIT21));
3427 }
3428
3429 return ret_bitmap;
3430 }
3431
3432 static u8 _rtl8821ae_get_vht_eni(enum wireless_mode wirelessmode,
3433 u32 ratr_bitmap)
3434 {
3435 u8 ret = 0;
3436 if (wirelessmode < WIRELESS_MODE_N_24G)
3437 ret = 0;
3438 else if (wirelessmode == WIRELESS_MODE_AC_24G) {
3439 if (ratr_bitmap & 0xfff00000)
3440 ret = 3;
3441 else
3442 ret = 2;
3443 } else if (wirelessmode == WIRELESS_MODE_AC_5G) {
3444 ret = 1;
3445 }
3446
3447 return ret << 4;
3448 }
3449
3450 static u8 _rtl8821ae_get_ra_ldpc(struct ieee80211_hw *hw,
3451 u8 mac_id, struct rtl_sta_info *sta_entry,
3452 enum wireless_mode wirelessmode)
3453 {
3454 u8 b_ldpc = 0;
3455
3456 return b_ldpc << 2;
3457 }
3458
3459 static u8 _rtl8821ae_get_ra_rftype(struct ieee80211_hw *hw,
3460 enum wireless_mode wirelessmode,
3461 u32 ratr_bitmap)
3462 {
3463 struct rtl_priv *rtlpriv = rtl_priv(hw);
3464 struct rtl_phy *rtlphy = &rtlpriv->phy;
3465 u8 rf_type = RF_1T1R;
3466
3467 if (rtlphy->rf_type == RF_1T1R)
3468 rf_type = RF_1T1R;
3469 else if (wirelessmode == WIRELESS_MODE_AC_5G
3470 || wirelessmode == WIRELESS_MODE_AC_24G
3471 || wirelessmode == WIRELESS_MODE_AC_ONLY) {
3472 if (ratr_bitmap & 0xffc00000)
3473 rf_type = RF_2T2R;
3474 } else if (wirelessmode == WIRELESS_MODE_N_5G
3475 || wirelessmode == WIRELESS_MODE_N_24G) {
3476 if (ratr_bitmap & 0xfff00000)
3477 rf_type = RF_2T2R;
3478 }
3479
3480 return rf_type;
3481 }
3482
3483 static bool _rtl8821ae_get_ra_shortgi(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
3484 u8 mac_id)
3485 {
3486 bool b_short_gi = false;
3487 u8 b_curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
3488 1 : 0;
3489 u8 b_curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
3490 1 : 0;
3491 u8 b_curshortgi_80mhz = 0;
3492 b_curshortgi_80mhz = (sta->deflink.vht_cap.cap &
3493 IEEE80211_VHT_CAP_SHORT_GI_80) ? 1 : 0;
3494
3495 if (mac_id == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST)
3496 b_short_gi = false;
3497
3498 if (b_curshortgi_40mhz || b_curshortgi_80mhz
3499 || b_curshortgi_20mhz)
3500 b_short_gi = true;
3501
3502 return b_short_gi;
3503 }
3504
3505 static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
3506 struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
3507 {
3508 struct rtl_priv *rtlpriv = rtl_priv(hw);
3509 struct rtl_phy *rtlphy = &rtlpriv->phy;
3510 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3511 struct rtl_sta_info *sta_entry = NULL;
3512 u32 ratr_bitmap;
3513 u8 ratr_index;
3514 enum wireless_mode wirelessmode = 0;
3515 u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
3516 ? 1 : 0;
3517 bool b_shortgi = false;
3518 u8 rate_mask[7];
3519 u8 macid = 0;
3520 u8 mimo_ps = IEEE80211_SMPS_OFF;
3521 u8 rf_type;
3522
3523 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
3524 wirelessmode = sta_entry->wireless_mode;
3525
3526 rtl_dbg(rtlpriv, COMP_RATR, DBG_LOUD,
3527 "wireless mode = 0x%x\n", wirelessmode);
3528 if (mac->opmode == NL80211_IFTYPE_STATION ||
3529 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
3530 curtxbw_40mhz = mac->bw_40;
3531 } else if (mac->opmode == NL80211_IFTYPE_AP ||
3532 mac->opmode == NL80211_IFTYPE_ADHOC)
3533 macid = sta->aid + 1;
3534 if (wirelessmode == WIRELESS_MODE_N_5G ||
3535 wirelessmode == WIRELESS_MODE_AC_5G ||
3536 wirelessmode == WIRELESS_MODE_A)
3537 ratr_bitmap = sta->deflink.supp_rates[NL80211_BAND_5GHZ] << 4;
3538 else
3539 ratr_bitmap = sta->deflink.supp_rates[NL80211_BAND_2GHZ];
3540
3541 if (mac->opmode == NL80211_IFTYPE_ADHOC)
3542 ratr_bitmap = 0xfff;
3543
3544 if (wirelessmode == WIRELESS_MODE_N_24G
3545 || wirelessmode == WIRELESS_MODE_N_5G)
3546 ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
3547 sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
3548 else if (wirelessmode == WIRELESS_MODE_AC_24G
3549 || wirelessmode == WIRELESS_MODE_AC_5G
3550 || wirelessmode == WIRELESS_MODE_AC_ONLY)
3551 ratr_bitmap |= _rtl8821ae_rate_to_bitmap_2ssvht(
3552 sta->deflink.vht_cap.vht_mcs.rx_mcs_map) << 12;
3553
3554 b_shortgi = _rtl8821ae_get_ra_shortgi(hw, sta, macid);
3555 rf_type = _rtl8821ae_get_ra_rftype(hw, wirelessmode, ratr_bitmap);
3556
3557
3558 switch (wirelessmode) {
3559 case WIRELESS_MODE_B:
3560 ratr_index = RATR_INX_WIRELESS_B;
3561 if (ratr_bitmap & 0x0000000c)
3562 ratr_bitmap &= 0x0000000d;
3563 else
3564 ratr_bitmap &= 0x0000000f;
3565 break;
3566 case WIRELESS_MODE_G:
3567 ratr_index = RATR_INX_WIRELESS_GB;
3568
3569 if (rssi_level == 1)
3570 ratr_bitmap &= 0x00000f00;
3571 else if (rssi_level == 2)
3572 ratr_bitmap &= 0x00000ff0;
3573 else
3574 ratr_bitmap &= 0x00000ff5;
3575 break;
3576 case WIRELESS_MODE_A:
3577 ratr_index = RATR_INX_WIRELESS_G;
3578 ratr_bitmap &= 0x00000ff0;
3579 break;
3580 case WIRELESS_MODE_N_24G:
3581 case WIRELESS_MODE_N_5G:
3582 if (wirelessmode == WIRELESS_MODE_N_24G)
3583 ratr_index = RATR_INX_WIRELESS_NGB;
3584 else
3585 ratr_index = RATR_INX_WIRELESS_NG;
3586
3587 if (mimo_ps == IEEE80211_SMPS_STATIC
3588 || mimo_ps == IEEE80211_SMPS_DYNAMIC) {
3589 if (rssi_level == 1)
3590 ratr_bitmap &= 0x000f0000;
3591 else if (rssi_level == 2)
3592 ratr_bitmap &= 0x000ff000;
3593 else
3594 ratr_bitmap &= 0x000ff005;
3595 } else {
3596 if (rf_type == RF_1T1R) {
3597 if (curtxbw_40mhz) {
3598 if (rssi_level == 1)
3599 ratr_bitmap &= 0x000f0000;
3600 else if (rssi_level == 2)
3601 ratr_bitmap &= 0x000ff000;
3602 else
3603 ratr_bitmap &= 0x000ff015;
3604 } else {
3605 if (rssi_level == 1)
3606 ratr_bitmap &= 0x000f0000;
3607 else if (rssi_level == 2)
3608 ratr_bitmap &= 0x000ff000;
3609 else
3610 ratr_bitmap &= 0x000ff005;
3611 }
3612 } else {
3613 if (curtxbw_40mhz) {
3614 if (rssi_level == 1)
3615 ratr_bitmap &= 0x0fff0000;
3616 else if (rssi_level == 2)
3617 ratr_bitmap &= 0x0ffff000;
3618 else
3619 ratr_bitmap &= 0x0ffff015;
3620 } else {
3621 if (rssi_level == 1)
3622 ratr_bitmap &= 0x0fff0000;
3623 else if (rssi_level == 2)
3624 ratr_bitmap &= 0x0ffff000;
3625 else
3626 ratr_bitmap &= 0x0ffff005;
3627 }
3628 }
3629 }
3630 break;
3631
3632 case WIRELESS_MODE_AC_24G:
3633 ratr_index = RATR_INX_WIRELESS_AC_24N;
3634 if (rssi_level == 1)
3635 ratr_bitmap &= 0xfc3f0000;
3636 else if (rssi_level == 2)
3637 ratr_bitmap &= 0xfffff000;
3638 else
3639 ratr_bitmap &= 0xffffffff;
3640 break;
3641
3642 case WIRELESS_MODE_AC_5G:
3643 ratr_index = RATR_INX_WIRELESS_AC_5N;
3644
3645 if (rf_type == RF_1T1R) {
3646 if (rssi_level == 1)
3647 ratr_bitmap &= 0x003f8000;
3648 else if (rssi_level == 2)
3649 ratr_bitmap &= 0x003ff000;
3650 else
3651 ratr_bitmap &= 0x003ff010;
3652 } else {
3653 if (rssi_level == 1)
3654 ratr_bitmap &= 0xfe3f8000;
3655 else if (rssi_level == 2)
3656 ratr_bitmap &= 0xfffff000;
3657 else
3658 ratr_bitmap &= 0xfffff010;
3659 }
3660 break;
3661
3662 default:
3663 ratr_index = RATR_INX_WIRELESS_NGB;
3664
3665 if (rf_type == RF_1T2R)
3666 ratr_bitmap &= 0x000ff0ff;
3667 else
3668 ratr_bitmap &= 0x0f8ff0ff;
3669 break;
3670 }
3671
3672 ratr_index = rtl_mrate_idx_to_arfr_id(hw, ratr_index, wirelessmode);
3673 sta_entry->ratr_index = ratr_index;
3674 ratr_bitmap = _rtl8821ae_set_ra_vht_ratr_bitmap(hw, wirelessmode,
3675 ratr_bitmap);
3676
3677 rtl_dbg(rtlpriv, COMP_RATR, DBG_LOUD,
3678 "ratr_bitmap :%x\n", ratr_bitmap);
3679
3680
3681
3682
3683 rate_mask[0] = macid;
3684 rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00);
3685 rate_mask[2] = rtlphy->current_chan_bw | ((!update_bw) << 3)
3686 | _rtl8821ae_get_vht_eni(wirelessmode, ratr_bitmap)
3687 | _rtl8821ae_get_ra_ldpc(hw, macid, sta_entry, wirelessmode);
3688
3689 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
3690 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
3691 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
3692 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
3693
3694 rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
3695 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
3696 ratr_index, ratr_bitmap,
3697 rate_mask[0], rate_mask[1],
3698 rate_mask[2], rate_mask[3],
3699 rate_mask[4], rate_mask[5],
3700 rate_mask[6]);
3701 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RA_MASK, 7, rate_mask);
3702 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
3703 }
3704
3705 void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
3706 struct ieee80211_sta *sta, u8 rssi_level, bool update_bw)
3707 {
3708 struct rtl_priv *rtlpriv = rtl_priv(hw);
3709 if (rtlpriv->dm.useramask)
3710 rtl8821ae_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
3711 else
3712
3713
3714 rtl8821ae_update_hal_rate_table(hw, sta);
3715 }
3716
3717 void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw)
3718 {
3719 struct rtl_priv *rtlpriv = rtl_priv(hw);
3720 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3721 u16 wireless_mode = mac->mode;
3722 u8 sifs_timer, r2t_sifs;
3723
3724 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
3725 (u8 *)&mac->slot_time);
3726 if (wireless_mode == WIRELESS_MODE_G)
3727 sifs_timer = 0x0a;
3728 else
3729 sifs_timer = 0x0e;
3730 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
3731
3732 r2t_sifs = 0xa;
3733
3734 if (wireless_mode == WIRELESS_MODE_AC_5G &&
3735 (mac->vht_ldpc_cap & LDPC_VHT_ENABLE_RX) &&
3736 (mac->vht_stbc_cap & STBC_VHT_ENABLE_RX)) {
3737 if (mac->vendor == PEER_ATH)
3738 r2t_sifs = 0x8;
3739 else
3740 r2t_sifs = 0xa;
3741 } else if (wireless_mode == WIRELESS_MODE_AC_5G) {
3742 r2t_sifs = 0xa;
3743 }
3744
3745 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_R2T_SIFS, (u8 *)&r2t_sifs);
3746 }
3747
3748 bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
3749 {
3750 struct rtl_priv *rtlpriv = rtl_priv(hw);
3751 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3752 struct rtl_phy *rtlphy = &rtlpriv->phy;
3753 enum rf_pwrstate e_rfpowerstate_toset;
3754 u8 u1tmp = 0;
3755 bool b_actuallyset = false;
3756
3757 if (rtlpriv->rtlhal.being_init_adapter)
3758 return false;
3759
3760 if (ppsc->swrf_processing)
3761 return false;
3762
3763 spin_lock(&rtlpriv->locks.rf_ps_lock);
3764 if (ppsc->rfchange_inprogress) {
3765 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3766 return false;
3767 } else {
3768 ppsc->rfchange_inprogress = true;
3769 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3770 }
3771
3772 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
3773 rtl_read_byte(rtlpriv,
3774 REG_GPIO_IO_SEL_2) & ~(BIT(1)));
3775
3776 u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
3777
3778 if (rtlphy->polarity_ctl)
3779 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
3780 else
3781 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
3782
3783 if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
3784 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3785 "GPIOChangeRF - HW Radio ON, RF ON\n");
3786
3787 e_rfpowerstate_toset = ERFON;
3788 ppsc->hwradiooff = false;
3789 b_actuallyset = true;
3790 } else if ((!ppsc->hwradiooff)
3791 && (e_rfpowerstate_toset == ERFOFF)) {
3792 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3793 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
3794
3795 e_rfpowerstate_toset = ERFOFF;
3796 ppsc->hwradiooff = true;
3797 b_actuallyset = true;
3798 }
3799
3800 if (b_actuallyset) {
3801 spin_lock(&rtlpriv->locks.rf_ps_lock);
3802 ppsc->rfchange_inprogress = false;
3803 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3804 } else {
3805 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
3806 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3807
3808 spin_lock(&rtlpriv->locks.rf_ps_lock);
3809 ppsc->rfchange_inprogress = false;
3810 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3811 }
3812
3813 *valid = 1;
3814 return !ppsc->hwradiooff;
3815 }
3816
3817 void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index,
3818 u8 *p_macaddr, bool is_group, u8 enc_algo,
3819 bool is_wepkey, bool clear_all)
3820 {
3821 struct rtl_priv *rtlpriv = rtl_priv(hw);
3822 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3823 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3824 u8 *macaddr = p_macaddr;
3825 u32 entry_id = 0;
3826 bool is_pairwise = false;
3827
3828 static u8 cam_const_addr[4][6] = {
3829 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3830 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3831 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3832 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
3833 };
3834 static u8 cam_const_broad[] = {
3835 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3836 };
3837
3838 if (clear_all) {
3839 u8 idx = 0;
3840 u8 cam_offset = 0;
3841 u8 clear_number = 5;
3842
3843 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
3844
3845 for (idx = 0; idx < clear_number; idx++) {
3846 rtl_cam_mark_invalid(hw, cam_offset + idx);
3847 rtl_cam_empty_entry(hw, cam_offset + idx);
3848
3849 if (idx < 5) {
3850 memset(rtlpriv->sec.key_buf[idx], 0,
3851 MAX_KEY_LEN);
3852 rtlpriv->sec.key_len[idx] = 0;
3853 }
3854 }
3855 } else {
3856 switch (enc_algo) {
3857 case WEP40_ENCRYPTION:
3858 enc_algo = CAM_WEP40;
3859 break;
3860 case WEP104_ENCRYPTION:
3861 enc_algo = CAM_WEP104;
3862 break;
3863 case TKIP_ENCRYPTION:
3864 enc_algo = CAM_TKIP;
3865 break;
3866 case AESCCMP_ENCRYPTION:
3867 enc_algo = CAM_AES;
3868 break;
3869 default:
3870 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
3871 "switch case %#x not processed\n", enc_algo);
3872 enc_algo = CAM_TKIP;
3873 break;
3874 }
3875
3876 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
3877 macaddr = cam_const_addr[key_index];
3878 entry_id = key_index;
3879 } else {
3880 if (is_group) {
3881 macaddr = cam_const_broad;
3882 entry_id = key_index;
3883 } else {
3884 if (mac->opmode == NL80211_IFTYPE_AP) {
3885 entry_id = rtl_cam_get_free_entry(hw, p_macaddr);
3886 if (entry_id >= TOTAL_CAM_ENTRY) {
3887 pr_err("an not find free hwsecurity cam entry\n");
3888 return;
3889 }
3890 } else {
3891 entry_id = CAM_PAIRWISE_KEY_POSITION;
3892 }
3893
3894 key_index = PAIRWISE_KEYIDX;
3895 is_pairwise = true;
3896 }
3897 }
3898
3899 if (rtlpriv->sec.key_len[key_index] == 0) {
3900 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
3901 "delete one entry, entry_id is %d\n",
3902 entry_id);
3903 if (mac->opmode == NL80211_IFTYPE_AP)
3904 rtl_cam_del_entry(hw, p_macaddr);
3905 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
3906 } else {
3907 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
3908 "add one entry\n");
3909 if (is_pairwise) {
3910 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
3911 "set Pairwise key\n");
3912
3913 rtl_cam_add_one_entry(hw, macaddr, key_index,
3914 entry_id, enc_algo,
3915 CAM_CONFIG_NO_USEDK,
3916 rtlpriv->sec.key_buf[key_index]);
3917 } else {
3918 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
3919 "set group key\n");
3920
3921 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
3922 rtl_cam_add_one_entry(hw,
3923 rtlefuse->dev_addr,
3924 PAIRWISE_KEYIDX,
3925 CAM_PAIRWISE_KEY_POSITION,
3926 enc_algo,
3927 CAM_CONFIG_NO_USEDK,
3928 rtlpriv->sec.key_buf
3929 [entry_id]);
3930 }
3931
3932 rtl_cam_add_one_entry(hw, macaddr, key_index,
3933 entry_id, enc_algo,
3934 CAM_CONFIG_NO_USEDK,
3935 rtlpriv->sec.key_buf[entry_id]);
3936 }
3937 }
3938 }
3939 }
3940
3941 void rtl8821ae_bt_reg_init(struct ieee80211_hw *hw)
3942 {
3943 struct rtl_priv *rtlpriv = rtl_priv(hw);
3944
3945
3946 rtlpriv->btcoexist.reg_bt_iso = 2;
3947
3948 rtlpriv->btcoexist.reg_bt_sco = 3;
3949
3950 rtlpriv->btcoexist.reg_bt_sco = 0;
3951 }
3952
3953 void rtl8821ae_bt_hw_init(struct ieee80211_hw *hw)
3954 {
3955 struct rtl_priv *rtlpriv = rtl_priv(hw);
3956
3957 if (rtlpriv->cfg->ops->get_btc_status())
3958 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
3959 }
3960
3961 void rtl8821ae_suspend(struct ieee80211_hw *hw)
3962 {
3963 }
3964
3965 void rtl8821ae_resume(struct ieee80211_hw *hw)
3966 {
3967 }
3968
3969
3970 void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw,
3971 bool allow_all_da, bool write_into_reg)
3972 {
3973 struct rtl_priv *rtlpriv = rtl_priv(hw);
3974 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3975
3976 if (allow_all_da)
3977 rtlpci->receive_config |= RCR_AAP;
3978 else
3979 rtlpci->receive_config &= ~RCR_AAP;
3980
3981 if (write_into_reg)
3982 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
3983
3984 rtl_dbg(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD,
3985 "receive_config=0x%08X, write_into_reg=%d\n",
3986 rtlpci->receive_config, write_into_reg);
3987 }
3988
3989
3990 void rtl8821ae_add_wowlan_pattern(struct ieee80211_hw *hw,
3991 struct rtl_wow_pattern *rtl_pattern,
3992 u8 index)
3993 {
3994 struct rtl_priv *rtlpriv = rtl_priv(hw);
3995 u32 cam = 0;
3996 u8 addr = 0;
3997 u16 rxbuf_addr;
3998 u8 tmp, count = 0;
3999 u16 cam_start;
4000 u16 offset;
4001
4002
4003
4004
4005 offset = MAX_RX_DMA_BUFFER_SIZE_8812 / 128;
4006
4007 cam_start = offset * 128;
4008
4009
4010 rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT);
4011 for (addr = 0; addr < WKFMCAM_ADDR_NUM; addr++) {
4012
4013
4014
4015
4016
4017
4018
4019
4020
4021
4022 rxbuf_addr = (cam_start + index * WKFMCAM_SIZE + addr * 4) >> 3;
4023
4024 rtl_write_word(rtlpriv, REG_PKTBUF_DBG_CTRL, rxbuf_addr);
4025
4026 if (addr == 0) {
4027 cam = BIT(31) | rtl_pattern->crc;
4028
4029 if (rtl_pattern->type == UNICAST_PATTERN)
4030 cam |= BIT(24);
4031 else if (rtl_pattern->type == MULTICAST_PATTERN)
4032 cam |= BIT(25);
4033 else if (rtl_pattern->type == BROADCAST_PATTERN)
4034 cam |= BIT(26);
4035
4036 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam);
4037 rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
4038 "WRITE entry[%d] 0x%x: %x\n", addr,
4039 REG_PKTBUF_DBG_DATA_L, cam);
4040
4041
4042 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01);
4043 } else if (addr == 2 || addr == 4) {
4044 cam = rtl_pattern->mask[addr - 2];
4045
4046 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam);
4047 rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
4048 "WRITE entry[%d] 0x%x: %x\n", addr,
4049 REG_PKTBUF_DBG_DATA_L, cam);
4050
4051 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01);
4052 } else if (addr == 3 || addr == 5) {
4053 cam = rtl_pattern->mask[addr - 2];
4054
4055 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_H, cam);
4056 rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
4057 "WRITE entry[%d] 0x%x: %x\n", addr,
4058 REG_PKTBUF_DBG_DATA_H, cam);
4059
4060 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0xf001);
4061 }
4062
4063 count = 0;
4064 do {
4065 tmp = rtl_read_byte(rtlpriv, REG_RXPKTBUF_CTRL);
4066 udelay(2);
4067 count++;
4068 } while (tmp && count < 100);
4069
4070 WARN_ONCE((count >= 100),
4071 "rtl8821ae: Write wake up frame mask FAIL %d value!\n",
4072 tmp);
4073 }
4074
4075 rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL,
4076 DISABLE_TRXPKT_BUF_ACCESS);
4077 }