1 /****************************************************************************** 2 * 3 * Copyright(c) 2009-2010 Realtek Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of version 2 of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * The full GNU General Public License is included in this distribution in the 15 * file called LICENSE. 16 * 17 * Contact Information: 18 * wlanfae <wlanfae@realtek.com> 19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 20 * Hsinchu 300, Taiwan. 21 * 22 * Larry Finger <Larry.Finger@lwfinger.net> 23 * 24 *****************************************************************************/ 25 26 #include "../wifi.h" 27 #include "../efuse.h" 28 #include "../base.h" 29 #include "../regd.h" 30 #include "../cam.h" 31 #include "../ps.h" 32 #include "../pci.h" 33 #include "reg.h" 34 #include "def.h" 35 #include "phy.h" 36 #include "dm.h" 37 #include "fw.h" 38 #include "led.h" 39 #include "hw.h" 40 #include "../pwrseqcmd.h" 41 #include "pwrseq.h" 42 #include "../btcoexist/rtl_btc.h" 43 44 #define LLT_CONFIG 5 45 46 static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw) 47 { 48 struct rtl_priv *rtlpriv = rtl_priv(hw); 49 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 50 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; 51 unsigned long flags; 52 53 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 54 while (skb_queue_len(&ring->queue)) { 55 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; 56 struct sk_buff *skb = __skb_dequeue(&ring->queue); 57 58 pci_unmap_single(rtlpci->pdev, 59 rtlpriv->cfg->ops->get_desc( 60 hw, 61 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR), 62 skb->len, PCI_DMA_TODEVICE); 63 kfree_skb(skb); 64 ring->idx = (ring->idx + 1) % ring->entries; 65 } 66 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 67 } 68 69 static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw, 70 u8 set_bits, u8 clear_bits) 71 { 72 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 73 struct rtl_priv *rtlpriv = rtl_priv(hw); 74 75 rtlpci->reg_bcn_ctrl_val |= set_bits; 76 rtlpci->reg_bcn_ctrl_val &= ~clear_bits; 77 78 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val); 79 } 80 81 void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw) 82 { 83 struct rtl_priv *rtlpriv = rtl_priv(hw); 84 u8 tmp1byte; 85 86 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2); 87 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6))); 88 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64); 89 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2); 90 tmp1byte &= ~(BIT(0)); 91 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte); 92 } 93 94 void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw) 95 { 96 struct rtl_priv *rtlpriv = rtl_priv(hw); 97 u8 tmp1byte; 98 99 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2); 100 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6)); 101 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); 102 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2); 103 tmp1byte |= BIT(0); 104 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte); 105 } 106 107 static void _rtl8821ae_enable_bcn_sub_func(struct ieee80211_hw *hw) 108 { 109 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(1)); 110 } 111 112 static void _rtl8821ae_disable_bcn_sub_func(struct ieee80211_hw *hw) 113 { 114 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(1), 0); 115 } 116 117 static void _rtl8821ae_set_fw_clock_on(struct ieee80211_hw *hw, 118 u8 rpwm_val, bool b_need_turn_off_ckk) 119 { 120 struct rtl_priv *rtlpriv = rtl_priv(hw); 121 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 122 bool b_support_remote_wake_up; 123 u32 count = 0, isr_regaddr, content; 124 bool b_schedule_timer = b_need_turn_off_ckk; 125 126 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN, 127 (u8 *)(&b_support_remote_wake_up)); 128 129 if (!rtlhal->fw_ready) 130 return; 131 if (!rtlpriv->psc.fw_current_inpsmode) 132 return; 133 134 while (1) { 135 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 136 if (rtlhal->fw_clk_change_in_progress) { 137 while (rtlhal->fw_clk_change_in_progress) { 138 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 139 count++; 140 udelay(100); 141 if (count > 1000) 142 goto change_done; 143 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 144 } 145 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 146 } else { 147 rtlhal->fw_clk_change_in_progress = false; 148 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 149 goto change_done; 150 } 151 } 152 change_done: 153 if (IS_IN_LOW_POWER_STATE_8821AE(rtlhal->fw_ps_state)) { 154 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM, 155 (u8 *)(&rpwm_val)); 156 if (FW_PS_IS_ACK(rpwm_val)) { 157 isr_regaddr = REG_HISR; 158 content = rtl_read_dword(rtlpriv, isr_regaddr); 159 while (!(content & IMR_CPWM) && (count < 500)) { 160 udelay(50); 161 count++; 162 content = rtl_read_dword(rtlpriv, isr_regaddr); 163 } 164 165 if (content & IMR_CPWM) { 166 rtl_write_word(rtlpriv, isr_regaddr, 0x0100); 167 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_8821AE; 168 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 169 "Receive CPWM INT!!! Set rtlhal->FwPSState = %X\n", 170 rtlhal->fw_ps_state); 171 } 172 } 173 174 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 175 rtlhal->fw_clk_change_in_progress = false; 176 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 177 if (b_schedule_timer) 178 mod_timer(&rtlpriv->works.fw_clockoff_timer, 179 jiffies + MSECS(10)); 180 } else { 181 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 182 rtlhal->fw_clk_change_in_progress = false; 183 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 184 } 185 } 186 187 static void _rtl8821ae_set_fw_clock_off(struct ieee80211_hw *hw, 188 u8 rpwm_val) 189 { 190 struct rtl_priv *rtlpriv = rtl_priv(hw); 191 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 192 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 193 struct rtl8192_tx_ring *ring; 194 enum rf_pwrstate rtstate; 195 bool b_schedule_timer = false; 196 u8 queue; 197 198 if (!rtlhal->fw_ready) 199 return; 200 if (!rtlpriv->psc.fw_current_inpsmode) 201 return; 202 if (!rtlhal->allow_sw_to_change_hwclc) 203 return; 204 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate)); 205 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF) 206 return; 207 208 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) { 209 ring = &rtlpci->tx_ring[queue]; 210 if (skb_queue_len(&ring->queue)) { 211 b_schedule_timer = true; 212 break; 213 } 214 } 215 216 if (b_schedule_timer) { 217 mod_timer(&rtlpriv->works.fw_clockoff_timer, 218 jiffies + MSECS(10)); 219 return; 220 } 221 222 if (FW_PS_STATE(rtlhal->fw_ps_state) != 223 FW_PS_STATE_RF_OFF_LOW_PWR_8821AE) { 224 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 225 if (!rtlhal->fw_clk_change_in_progress) { 226 rtlhal->fw_clk_change_in_progress = true; 227 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 228 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val); 229 rtl_write_word(rtlpriv, REG_HISR, 0x0100); 230 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, 231 (u8 *)(&rpwm_val)); 232 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 233 rtlhal->fw_clk_change_in_progress = false; 234 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 235 } else { 236 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 237 mod_timer(&rtlpriv->works.fw_clockoff_timer, 238 jiffies + MSECS(10)); 239 } 240 } 241 } 242 243 static void _rtl8821ae_set_fw_ps_rf_on(struct ieee80211_hw *hw) 244 { 245 u8 rpwm_val = 0; 246 247 rpwm_val |= (FW_PS_STATE_RF_OFF_8821AE | FW_PS_ACK); 248 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, true); 249 } 250 251 static void _rtl8821ae_fwlps_leave(struct ieee80211_hw *hw) 252 { 253 struct rtl_priv *rtlpriv = rtl_priv(hw); 254 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 255 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 256 bool fw_current_inps = false; 257 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE; 258 259 if (ppsc->low_power_enable) { 260 rpwm_val = (FW_PS_STATE_ALL_ON_8821AE|FW_PS_ACK);/* RF on */ 261 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, false); 262 rtlhal->allow_sw_to_change_hwclc = false; 263 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 264 (u8 *)(&fw_pwrmode)); 265 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 266 (u8 *)(&fw_current_inps)); 267 } else { 268 rpwm_val = FW_PS_STATE_ALL_ON_8821AE; /* RF on */ 269 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, 270 (u8 *)(&rpwm_val)); 271 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 272 (u8 *)(&fw_pwrmode)); 273 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 274 (u8 *)(&fw_current_inps)); 275 } 276 } 277 278 static void _rtl8821ae_fwlps_enter(struct ieee80211_hw *hw) 279 { 280 struct rtl_priv *rtlpriv = rtl_priv(hw); 281 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 282 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 283 bool fw_current_inps = true; 284 u8 rpwm_val; 285 286 if (ppsc->low_power_enable) { 287 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_8821AE; /* RF off */ 288 rtlpriv->cfg->ops->set_hw_reg(hw, 289 HW_VAR_FW_PSMODE_STATUS, 290 (u8 *)(&fw_current_inps)); 291 rtlpriv->cfg->ops->set_hw_reg(hw, 292 HW_VAR_H2C_FW_PWRMODE, 293 (u8 *)(&ppsc->fwctrl_psmode)); 294 rtlhal->allow_sw_to_change_hwclc = true; 295 _rtl8821ae_set_fw_clock_off(hw, rpwm_val); 296 } else { 297 rpwm_val = FW_PS_STATE_RF_OFF_8821AE; /* RF off */ 298 rtlpriv->cfg->ops->set_hw_reg(hw, 299 HW_VAR_FW_PSMODE_STATUS, 300 (u8 *)(&fw_current_inps)); 301 rtlpriv->cfg->ops->set_hw_reg(hw, 302 HW_VAR_H2C_FW_PWRMODE, 303 (u8 *)(&ppsc->fwctrl_psmode)); 304 rtlpriv->cfg->ops->set_hw_reg(hw, 305 HW_VAR_SET_RPWM, 306 (u8 *)(&rpwm_val)); 307 } 308 } 309 310 static void _rtl8821ae_download_rsvd_page(struct ieee80211_hw *hw, 311 bool dl_whole_packets) 312 { 313 struct rtl_priv *rtlpriv = rtl_priv(hw); 314 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 315 u8 tmp_regcr, tmp_reg422, bcnvalid_reg; 316 u8 count = 0, dlbcn_count = 0; 317 bool send_beacon = false; 318 319 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1); 320 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr | BIT(0))); 321 322 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3)); 323 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0); 324 325 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2); 326 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, 327 tmp_reg422 & (~BIT(6))); 328 if (tmp_reg422 & BIT(6)) 329 send_beacon = true; 330 331 do { 332 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2); 333 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, 334 (bcnvalid_reg | BIT(0))); 335 _rtl8821ae_return_beacon_queue_skb(hw); 336 337 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 338 rtl8812ae_set_fw_rsvdpagepkt(hw, false, 339 dl_whole_packets); 340 else 341 rtl8821ae_set_fw_rsvdpagepkt(hw, false, 342 dl_whole_packets); 343 344 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2); 345 count = 0; 346 while (!(bcnvalid_reg & BIT(0)) && count < 20) { 347 count++; 348 udelay(10); 349 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2); 350 } 351 dlbcn_count++; 352 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5); 353 354 if (!(bcnvalid_reg & BIT(0))) 355 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 356 "Download RSVD page failed!\n"); 357 if (bcnvalid_reg & BIT(0) && rtlhal->enter_pnp_sleep) { 358 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, bcnvalid_reg | BIT(0)); 359 _rtl8821ae_return_beacon_queue_skb(hw); 360 if (send_beacon) { 361 dlbcn_count = 0; 362 do { 363 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, 364 bcnvalid_reg | BIT(0)); 365 366 _rtl8821ae_return_beacon_queue_skb(hw); 367 368 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 369 rtl8812ae_set_fw_rsvdpagepkt(hw, true, 370 false); 371 else 372 rtl8821ae_set_fw_rsvdpagepkt(hw, true, 373 false); 374 375 /* check rsvd page download OK. */ 376 bcnvalid_reg = rtl_read_byte(rtlpriv, 377 REG_TDECTRL + 2); 378 count = 0; 379 while (!(bcnvalid_reg & BIT(0)) && count < 20) { 380 count++; 381 udelay(10); 382 bcnvalid_reg = 383 rtl_read_byte(rtlpriv, 384 REG_TDECTRL + 2); 385 } 386 dlbcn_count++; 387 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5); 388 389 if (!(bcnvalid_reg & BIT(0))) 390 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 391 "2 Download RSVD page failed!\n"); 392 } 393 } 394 395 if (bcnvalid_reg & BIT(0)) 396 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0)); 397 398 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0); 399 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4)); 400 401 if (send_beacon) 402 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422); 403 404 if (!rtlhal->enter_pnp_sleep) { 405 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1); 406 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0)))); 407 } 408 } 409 410 void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) 411 { 412 struct rtl_priv *rtlpriv = rtl_priv(hw); 413 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 414 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 415 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 416 417 switch (variable) { 418 case HW_VAR_ETHER_ADDR: 419 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_MACID); 420 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_MACID + 4); 421 break; 422 case HW_VAR_BSSID: 423 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_BSSID); 424 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_BSSID+4); 425 break; 426 case HW_VAR_MEDIA_STATUS: 427 val[0] = rtl_read_byte(rtlpriv, MSR) & 0x3; 428 break; 429 case HW_VAR_SLOT_TIME: 430 *((u8 *)(val)) = mac->slot_time; 431 break; 432 case HW_VAR_BEACON_INTERVAL: 433 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_BCN_INTERVAL); 434 break; 435 case HW_VAR_ATIM_WINDOW: 436 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_ATIMWND); 437 break; 438 case HW_VAR_RCR: 439 *((u32 *)(val)) = rtlpci->receive_config; 440 break; 441 case HW_VAR_RF_STATE: 442 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state; 443 break; 444 case HW_VAR_FWLPS_RF_ON:{ 445 enum rf_pwrstate rfstate; 446 u32 val_rcr; 447 448 rtlpriv->cfg->ops->get_hw_reg(hw, 449 HW_VAR_RF_STATE, 450 (u8 *)(&rfstate)); 451 if (rfstate == ERFOFF) { 452 *((bool *)(val)) = true; 453 } else { 454 val_rcr = rtl_read_dword(rtlpriv, REG_RCR); 455 val_rcr &= 0x00070000; 456 if (val_rcr) 457 *((bool *)(val)) = false; 458 else 459 *((bool *)(val)) = true; 460 } 461 break; } 462 case HW_VAR_FW_PSMODE_STATUS: 463 *((bool *)(val)) = ppsc->fw_current_inpsmode; 464 break; 465 case HW_VAR_CORRECT_TSF:{ 466 u64 tsf; 467 u32 *ptsf_low = (u32 *)&tsf; 468 u32 *ptsf_high = ((u32 *)&tsf) + 1; 469 470 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4)); 471 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR); 472 473 *((u64 *)(val)) = tsf; 474 475 break; } 476 case HAL_DEF_WOWLAN: 477 if (ppsc->wo_wlan_mode) 478 *((bool *)(val)) = true; 479 else 480 *((bool *)(val)) = false; 481 break; 482 default: 483 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 484 "switch case %#x not processed\n", variable); 485 break; 486 } 487 } 488 489 void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) 490 { 491 struct rtl_priv *rtlpriv = rtl_priv(hw); 492 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 493 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 494 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 495 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 496 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 497 u8 idx; 498 499 switch (variable) { 500 case HW_VAR_ETHER_ADDR:{ 501 for (idx = 0; idx < ETH_ALEN; idx++) { 502 rtl_write_byte(rtlpriv, (REG_MACID + idx), 503 val[idx]); 504 } 505 break; 506 } 507 case HW_VAR_BASIC_RATE:{ 508 u16 b_rate_cfg = ((u16 *)val)[0]; 509 b_rate_cfg = b_rate_cfg & 0x15f; 510 rtl_write_word(rtlpriv, REG_RRSR, b_rate_cfg); 511 break; 512 } 513 case HW_VAR_BSSID:{ 514 for (idx = 0; idx < ETH_ALEN; idx++) { 515 rtl_write_byte(rtlpriv, (REG_BSSID + idx), 516 val[idx]); 517 } 518 break; 519 } 520 case HW_VAR_SIFS: 521 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]); 522 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[0]); 523 524 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]); 525 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]); 526 527 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]); 528 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM, val[0]); 529 break; 530 case HW_VAR_R2T_SIFS: 531 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]); 532 break; 533 case HW_VAR_SLOT_TIME:{ 534 u8 e_aci; 535 536 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 537 "HW_VAR_SLOT_TIME %x\n", val[0]); 538 539 rtl_write_byte(rtlpriv, REG_SLOT, val[0]); 540 541 for (e_aci = 0; e_aci < AC_MAX; e_aci++) { 542 rtlpriv->cfg->ops->set_hw_reg(hw, 543 HW_VAR_AC_PARAM, 544 (u8 *)(&e_aci)); 545 } 546 break; } 547 case HW_VAR_ACK_PREAMBLE:{ 548 u8 reg_tmp; 549 u8 short_preamble = (bool)(*(u8 *)val); 550 551 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2); 552 if (short_preamble) { 553 reg_tmp |= BIT(1); 554 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, 555 reg_tmp); 556 } else { 557 reg_tmp &= (~BIT(1)); 558 rtl_write_byte(rtlpriv, 559 REG_TRXPTCL_CTL + 2, 560 reg_tmp); 561 } 562 break; } 563 case HW_VAR_WPA_CONFIG: 564 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val)); 565 break; 566 case HW_VAR_AMPDU_MIN_SPACE:{ 567 u8 min_spacing_to_set; 568 u8 sec_min_space; 569 570 min_spacing_to_set = *((u8 *)val); 571 if (min_spacing_to_set <= 7) { 572 sec_min_space = 0; 573 574 if (min_spacing_to_set < sec_min_space) 575 min_spacing_to_set = sec_min_space; 576 577 mac->min_space_cfg = ((mac->min_space_cfg & 578 0xf8) | 579 min_spacing_to_set); 580 581 *val = min_spacing_to_set; 582 583 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 584 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", 585 mac->min_space_cfg); 586 587 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 588 mac->min_space_cfg); 589 } 590 break; } 591 case HW_VAR_SHORTGI_DENSITY:{ 592 u8 density_to_set; 593 594 density_to_set = *((u8 *)val); 595 mac->min_space_cfg |= (density_to_set << 3); 596 597 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 598 "Set HW_VAR_SHORTGI_DENSITY: %#x\n", 599 mac->min_space_cfg); 600 601 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 602 mac->min_space_cfg); 603 604 break; } 605 case HW_VAR_AMPDU_FACTOR:{ 606 u32 ampdu_len = (*((u8 *)val)); 607 608 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 609 if (ampdu_len < VHT_AGG_SIZE_128K) 610 ampdu_len = 611 (0x2000 << (*((u8 *)val))) - 1; 612 else 613 ampdu_len = 0x1ffff; 614 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 615 if (ampdu_len < HT_AGG_SIZE_64K) 616 ampdu_len = 617 (0x2000 << (*((u8 *)val))) - 1; 618 else 619 ampdu_len = 0xffff; 620 } 621 ampdu_len |= BIT(31); 622 623 rtl_write_dword(rtlpriv, 624 REG_AMPDU_MAX_LENGTH_8812, ampdu_len); 625 break; } 626 case HW_VAR_AC_PARAM:{ 627 u8 e_aci = *((u8 *)val); 628 629 rtl8821ae_dm_init_edca_turbo(hw); 630 if (rtlpci->acm_method != EACMWAY2_SW) 631 rtlpriv->cfg->ops->set_hw_reg(hw, 632 HW_VAR_ACM_CTRL, 633 (u8 *)(&e_aci)); 634 break; } 635 case HW_VAR_ACM_CTRL:{ 636 u8 e_aci = *((u8 *)val); 637 union aci_aifsn *p_aci_aifsn = 638 (union aci_aifsn *)(&mac->ac[0].aifs); 639 u8 acm = p_aci_aifsn->f.acm; 640 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL); 641 642 acm_ctrl = 643 acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1); 644 645 if (acm) { 646 switch (e_aci) { 647 case AC0_BE: 648 acm_ctrl |= ACMHW_BEQEN; 649 break; 650 case AC2_VI: 651 acm_ctrl |= ACMHW_VIQEN; 652 break; 653 case AC3_VO: 654 acm_ctrl |= ACMHW_VOQEN; 655 break; 656 default: 657 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 658 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n", 659 acm); 660 break; 661 } 662 } else { 663 switch (e_aci) { 664 case AC0_BE: 665 acm_ctrl &= (~ACMHW_BEQEN); 666 break; 667 case AC2_VI: 668 acm_ctrl &= (~ACMHW_VIQEN); 669 break; 670 case AC3_VO: 671 acm_ctrl &= (~ACMHW_VOQEN); 672 break; 673 default: 674 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 675 "switch case %#x not processed\n", 676 e_aci); 677 break; 678 } 679 } 680 681 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE, 682 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n", 683 acm_ctrl); 684 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl); 685 break; } 686 case HW_VAR_RCR: 687 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]); 688 rtlpci->receive_config = ((u32 *)(val))[0]; 689 break; 690 case HW_VAR_RETRY_LIMIT:{ 691 u8 retry_limit = ((u8 *)(val))[0]; 692 693 rtl_write_word(rtlpriv, REG_RL, 694 retry_limit << RETRY_LIMIT_SHORT_SHIFT | 695 retry_limit << RETRY_LIMIT_LONG_SHIFT); 696 break; } 697 case HW_VAR_DUAL_TSF_RST: 698 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); 699 break; 700 case HW_VAR_EFUSE_BYTES: 701 rtlefuse->efuse_usedbytes = *((u16 *)val); 702 break; 703 case HW_VAR_EFUSE_USAGE: 704 rtlefuse->efuse_usedpercentage = *((u8 *)val); 705 break; 706 case HW_VAR_IO_CMD: 707 rtl8821ae_phy_set_io_cmd(hw, (*(enum io_type *)val)); 708 break; 709 case HW_VAR_SET_RPWM:{ 710 u8 rpwm_val; 711 712 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM); 713 udelay(1); 714 715 if (rpwm_val & BIT(7)) { 716 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, 717 (*(u8 *)val)); 718 } else { 719 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, 720 ((*(u8 *)val) | BIT(7))); 721 } 722 723 break; } 724 case HW_VAR_H2C_FW_PWRMODE: 725 rtl8821ae_set_fw_pwrmode_cmd(hw, (*(u8 *)val)); 726 break; 727 case HW_VAR_FW_PSMODE_STATUS: 728 ppsc->fw_current_inpsmode = *((bool *)val); 729 break; 730 case HW_VAR_INIT_RTS_RATE: 731 break; 732 case HW_VAR_RESUME_CLK_ON: 733 _rtl8821ae_set_fw_ps_rf_on(hw); 734 break; 735 case HW_VAR_FW_LPS_ACTION:{ 736 bool b_enter_fwlps = *((bool *)val); 737 738 if (b_enter_fwlps) 739 _rtl8821ae_fwlps_enter(hw); 740 else 741 _rtl8821ae_fwlps_leave(hw); 742 break; } 743 case HW_VAR_H2C_FW_JOINBSSRPT:{ 744 u8 mstatus = (*(u8 *)val); 745 746 if (mstatus == RT_MEDIA_CONNECT) { 747 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, 748 NULL); 749 _rtl8821ae_download_rsvd_page(hw, false); 750 } 751 rtl8821ae_set_fw_media_status_rpt_cmd(hw, mstatus); 752 753 break; } 754 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: 755 rtl8821ae_set_p2p_ps_offload_cmd(hw, (*(u8 *)val)); 756 break; 757 case HW_VAR_AID:{ 758 u16 u2btmp; 759 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT); 760 u2btmp &= 0xC000; 761 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp | 762 mac->assoc_id)); 763 break; } 764 case HW_VAR_CORRECT_TSF:{ 765 u8 btype_ibss = ((u8 *)(val))[0]; 766 767 if (btype_ibss) 768 _rtl8821ae_stop_tx_beacon(hw); 769 770 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3)); 771 772 rtl_write_dword(rtlpriv, REG_TSFTR, 773 (u32)(mac->tsf & 0xffffffff)); 774 rtl_write_dword(rtlpriv, REG_TSFTR + 4, 775 (u32)((mac->tsf >> 32) & 0xffffffff)); 776 777 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0); 778 779 if (btype_ibss) 780 _rtl8821ae_resume_tx_beacon(hw); 781 break; } 782 case HW_VAR_NAV_UPPER: { 783 u32 us_nav_upper = *(u32 *)val; 784 785 if (us_nav_upper > HAL_92C_NAV_UPPER_UNIT * 0xFF) { 786 RT_TRACE(rtlpriv, COMP_INIT , DBG_WARNING, 787 "The setting value (0x%08X us) of NAV_UPPER is larger than (%d * 0xFF)!!!\n", 788 us_nav_upper, HAL_92C_NAV_UPPER_UNIT); 789 break; 790 } 791 rtl_write_byte(rtlpriv, REG_NAV_UPPER, 792 ((u8)((us_nav_upper + 793 HAL_92C_NAV_UPPER_UNIT - 1) / 794 HAL_92C_NAV_UPPER_UNIT))); 795 break; } 796 case HW_VAR_KEEP_ALIVE: { 797 u8 array[2]; 798 array[0] = 0xff; 799 array[1] = *((u8 *)val); 800 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL, 2, 801 array); 802 break; } 803 default: 804 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 805 "switch case %#x not processed\n", variable); 806 break; 807 } 808 } 809 810 static bool _rtl8821ae_llt_write(struct ieee80211_hw *hw, u32 address, u32 data) 811 { 812 struct rtl_priv *rtlpriv = rtl_priv(hw); 813 bool status = true; 814 long count = 0; 815 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | 816 _LLT_OP(_LLT_WRITE_ACCESS); 817 818 rtl_write_dword(rtlpriv, REG_LLT_INIT, value); 819 820 do { 821 value = rtl_read_dword(rtlpriv, REG_LLT_INIT); 822 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)) 823 break; 824 825 if (count > POLLING_LLT_THRESHOLD) { 826 pr_err("Failed to polling write LLT done at address %d!\n", 827 address); 828 status = false; 829 break; 830 } 831 } while (++count); 832 833 return status; 834 } 835 836 static bool _rtl8821ae_llt_table_init(struct ieee80211_hw *hw) 837 { 838 struct rtl_priv *rtlpriv = rtl_priv(hw); 839 unsigned short i; 840 u8 txpktbuf_bndy; 841 u32 rqpn; 842 u8 maxpage; 843 bool status; 844 845 maxpage = 255; 846 txpktbuf_bndy = 0xF7; 847 rqpn = 0x80e60808; 848 849 rtl_write_byte(rtlpriv, REG_TRXFF_BNDY, txpktbuf_bndy); 850 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, MAX_RX_DMA_BUFFER_SIZE - 1); 851 852 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy); 853 854 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy); 855 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy); 856 857 rtl_write_byte(rtlpriv, REG_PBP, 0x31); 858 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4); 859 860 for (i = 0; i < (txpktbuf_bndy - 1); i++) { 861 status = _rtl8821ae_llt_write(hw, i, i + 1); 862 if (!status) 863 return status; 864 } 865 866 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF); 867 if (!status) 868 return status; 869 870 for (i = txpktbuf_bndy; i < maxpage; i++) { 871 status = _rtl8821ae_llt_write(hw, i, (i + 1)); 872 if (!status) 873 return status; 874 } 875 876 status = _rtl8821ae_llt_write(hw, maxpage, txpktbuf_bndy); 877 if (!status) 878 return status; 879 880 rtl_write_dword(rtlpriv, REG_RQPN, rqpn); 881 882 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00); 883 884 return true; 885 } 886 887 static void _rtl8821ae_gen_refresh_led_state(struct ieee80211_hw *hw) 888 { 889 struct rtl_priv *rtlpriv = rtl_priv(hw); 890 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 891 struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0; 892 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 893 894 if (rtlpriv->rtlhal.up_first_time) 895 return; 896 897 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) 898 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 899 rtl8812ae_sw_led_on(hw, pled0); 900 else 901 rtl8821ae_sw_led_on(hw, pled0); 902 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT) 903 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 904 rtl8812ae_sw_led_on(hw, pled0); 905 else 906 rtl8821ae_sw_led_on(hw, pled0); 907 else 908 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 909 rtl8812ae_sw_led_off(hw, pled0); 910 else 911 rtl8821ae_sw_led_off(hw, pled0); 912 } 913 914 static bool _rtl8821ae_init_mac(struct ieee80211_hw *hw) 915 { 916 struct rtl_priv *rtlpriv = rtl_priv(hw); 917 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 918 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 919 920 u8 bytetmp = 0; 921 u16 wordtmp = 0; 922 bool mac_func_enable = rtlhal->mac_func_enable; 923 924 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00); 925 926 /*Auto Power Down to CHIP-off State*/ 927 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7)); 928 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp); 929 930 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 931 /* HW Power on sequence*/ 932 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, 933 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, 934 RTL8812_NIC_ENABLE_FLOW)) { 935 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 936 "init 8812 MAC Fail as power on failure\n"); 937 return false; 938 } 939 } else { 940 /* HW Power on sequence */ 941 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_A_MSK, 942 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, 943 RTL8821A_NIC_ENABLE_FLOW)){ 944 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 945 "init 8821 MAC Fail as power on failure\n"); 946 return false; 947 } 948 } 949 950 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4); 951 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp); 952 953 bytetmp = rtl_read_byte(rtlpriv, REG_CR); 954 bytetmp = 0xff; 955 rtl_write_byte(rtlpriv, REG_CR, bytetmp); 956 mdelay(2); 957 958 bytetmp = 0xff; 959 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp); 960 mdelay(2); 961 962 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 963 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3); 964 if (bytetmp & BIT(0)) { 965 bytetmp = rtl_read_byte(rtlpriv, 0x7c); 966 bytetmp |= BIT(6); 967 rtl_write_byte(rtlpriv, 0x7c, bytetmp); 968 } 969 } 970 971 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1); 972 bytetmp &= ~BIT(4); 973 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp); 974 975 rtl_write_word(rtlpriv, REG_CR, 0x2ff); 976 977 if (!mac_func_enable) { 978 if (!_rtl8821ae_llt_table_init(hw)) 979 return false; 980 } 981 982 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff); 983 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff); 984 985 /* Enable FW Beamformer Interrupt */ 986 bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3); 987 rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6)); 988 989 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL); 990 wordtmp &= 0xf; 991 wordtmp |= 0xF5B1; 992 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp); 993 994 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F); 995 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config); 996 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF); 997 /*low address*/ 998 rtl_write_dword(rtlpriv, REG_BCNQ_DESA, 999 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32)); 1000 rtl_write_dword(rtlpriv, REG_MGQ_DESA, 1001 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32)); 1002 rtl_write_dword(rtlpriv, REG_VOQ_DESA, 1003 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32)); 1004 rtl_write_dword(rtlpriv, REG_VIQ_DESA, 1005 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32)); 1006 rtl_write_dword(rtlpriv, REG_BEQ_DESA, 1007 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32)); 1008 rtl_write_dword(rtlpriv, REG_BKQ_DESA, 1009 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32)); 1010 rtl_write_dword(rtlpriv, REG_HQ_DESA, 1011 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32)); 1012 rtl_write_dword(rtlpriv, REG_RX_DESA, 1013 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32)); 1014 1015 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, 0x77); 1016 1017 rtl_write_dword(rtlpriv, REG_INT_MIG, 0); 1018 1019 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0); 1020 1021 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3); 1022 _rtl8821ae_gen_refresh_led_state(hw); 1023 1024 return true; 1025 } 1026 1027 static void _rtl8821ae_hw_configure(struct ieee80211_hw *hw) 1028 { 1029 struct rtl_priv *rtlpriv = rtl_priv(hw); 1030 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1031 u32 reg_rrsr; 1032 1033 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG; 1034 1035 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr); 1036 /* ARFB table 9 for 11ac 5G 2SS */ 1037 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000); 1038 /* ARFB table 10 for 11ac 5G 1SS */ 1039 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000); 1040 /* ARFB table 11 for 11ac 24G 1SS */ 1041 rtl_write_dword(rtlpriv, REG_ARFR2, 0x00000015); 1042 rtl_write_dword(rtlpriv, REG_ARFR2 + 4, 0x003ff000); 1043 /* ARFB table 12 for 11ac 24G 1SS */ 1044 rtl_write_dword(rtlpriv, REG_ARFR3, 0x00000015); 1045 rtl_write_dword(rtlpriv, REG_ARFR3 + 4, 0xffcff000); 1046 /* 0x420[7] = 0 , enable retry AMPDU in new AMPD not singal MPDU. */ 1047 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00); 1048 rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70); 1049 1050 /*Set retry limit*/ 1051 rtl_write_word(rtlpriv, REG_RL, 0x0707); 1052 1053 /* Set Data / Response auto rate fallack retry count*/ 1054 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000); 1055 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504); 1056 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000); 1057 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504); 1058 1059 rtlpci->reg_bcn_ctrl_val = 0x1d; 1060 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val); 1061 1062 /* TBTT prohibit hold time. Suggested by designer TimChen. */ 1063 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); 1064 1065 /* AGGR_BK_TIME Reg51A 0x16 */ 1066 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040); 1067 1068 /*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/ 1069 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666); 1070 1071 rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80); 1072 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20); 1073 rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, 0x1F1F); 1074 } 1075 1076 static u16 _rtl8821ae_mdio_read(struct rtl_priv *rtlpriv, u8 addr) 1077 { 1078 u16 ret = 0; 1079 u8 tmp = 0, count = 0; 1080 1081 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6)); 1082 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6); 1083 count = 0; 1084 while (tmp && count < 20) { 1085 udelay(10); 1086 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6); 1087 count++; 1088 } 1089 if (0 == tmp) 1090 ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA); 1091 1092 return ret; 1093 } 1094 1095 static void _rtl8821ae_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data) 1096 { 1097 u8 tmp = 0, count = 0; 1098 1099 rtl_write_word(rtlpriv, REG_MDIO_WDATA, data); 1100 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5)); 1101 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5); 1102 count = 0; 1103 while (tmp && count < 20) { 1104 udelay(10); 1105 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5); 1106 count++; 1107 } 1108 } 1109 1110 static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr) 1111 { 1112 u16 read_addr = addr & 0xfffc; 1113 u8 tmp = 0, count = 0, ret = 0; 1114 1115 rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr); 1116 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2); 1117 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG); 1118 count = 0; 1119 while (tmp && count < 20) { 1120 udelay(10); 1121 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG); 1122 count++; 1123 } 1124 if (0 == tmp) { 1125 read_addr = REG_DBI_RDATA + addr % 4; 1126 ret = rtl_read_word(rtlpriv, read_addr); 1127 } 1128 return ret; 1129 } 1130 1131 static void _rtl8821ae_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data) 1132 { 1133 u8 tmp = 0, count = 0; 1134 u16 write_addr, remainder = addr % 4; 1135 1136 write_addr = REG_DBI_WDATA + remainder; 1137 rtl_write_byte(rtlpriv, write_addr, data); 1138 1139 write_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12)); 1140 rtl_write_word(rtlpriv, REG_DBI_ADDR, write_addr); 1141 1142 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1); 1143 1144 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG); 1145 count = 0; 1146 while (tmp && count < 20) { 1147 udelay(10); 1148 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG); 1149 count++; 1150 } 1151 } 1152 1153 static void _rtl8821ae_enable_aspm_back_door(struct ieee80211_hw *hw) 1154 { 1155 struct rtl_priv *rtlpriv = rtl_priv(hw); 1156 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1157 u8 tmp; 1158 1159 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 1160 if (_rtl8821ae_mdio_read(rtlpriv, 0x04) != 0x8544) 1161 _rtl8821ae_mdio_write(rtlpriv, 0x04, 0x8544); 1162 1163 if (_rtl8821ae_mdio_read(rtlpriv, 0x0b) != 0x0070) 1164 _rtl8821ae_mdio_write(rtlpriv, 0x0b, 0x0070); 1165 } 1166 1167 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f); 1168 _rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7)); 1169 1170 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719); 1171 _rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4)); 1172 1173 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 1174 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718); 1175 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp|BIT(4)); 1176 } 1177 } 1178 1179 void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw) 1180 { 1181 struct rtl_priv *rtlpriv = rtl_priv(hw); 1182 u8 sec_reg_value; 1183 u8 tmp; 1184 1185 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 1186 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n", 1187 rtlpriv->sec.pairwise_enc_algorithm, 1188 rtlpriv->sec.group_enc_algorithm); 1189 1190 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) { 1191 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 1192 "not open hw encryption\n"); 1193 return; 1194 } 1195 1196 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE; 1197 1198 if (rtlpriv->sec.use_defaultkey) { 1199 sec_reg_value |= SCR_TXUSEDK; 1200 sec_reg_value |= SCR_RXUSEDK; 1201 } 1202 1203 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK); 1204 1205 tmp = rtl_read_byte(rtlpriv, REG_CR + 1); 1206 rtl_write_byte(rtlpriv, REG_CR + 1, tmp | BIT(1)); 1207 1208 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 1209 "The SECR-value %x\n", sec_reg_value); 1210 1211 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value); 1212 } 1213 1214 /* Static MacID Mapping (cf. Used in MacIdDoStaticMapping) ---------- */ 1215 #define MAC_ID_STATIC_FOR_DEFAULT_PORT 0 1216 #define MAC_ID_STATIC_FOR_BROADCAST_MULTICAST 1 1217 #define MAC_ID_STATIC_FOR_BT_CLIENT_START 2 1218 #define MAC_ID_STATIC_FOR_BT_CLIENT_END 3 1219 /* ----------------------------------------------------------- */ 1220 1221 static void rtl8821ae_macid_initialize_mediastatus(struct ieee80211_hw *hw) 1222 { 1223 struct rtl_priv *rtlpriv = rtl_priv(hw); 1224 u8 media_rpt[4] = {RT_MEDIA_CONNECT, 1, 1225 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST, 1226 MAC_ID_STATIC_FOR_BT_CLIENT_END}; 1227 1228 rtlpriv->cfg->ops->set_hw_reg(hw, 1229 HW_VAR_H2C_FW_MEDIASTATUSRPT, media_rpt); 1230 1231 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1232 "Initialize MacId media status: from %d to %d\n", 1233 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST, 1234 MAC_ID_STATIC_FOR_BT_CLIENT_END); 1235 } 1236 1237 static bool _rtl8821ae_check_pcie_dma_hang(struct ieee80211_hw *hw) 1238 { 1239 struct rtl_priv *rtlpriv = rtl_priv(hw); 1240 u8 tmp; 1241 1242 /* write reg 0x350 Bit[26]=1. Enable debug port. */ 1243 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3); 1244 if (!(tmp & BIT(2))) { 1245 rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2))); 1246 mdelay(100); 1247 } 1248 1249 /* read reg 0x350 Bit[25] if 1 : RX hang */ 1250 /* read reg 0x350 Bit[24] if 1 : TX hang */ 1251 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3); 1252 if ((tmp & BIT(0)) || (tmp & BIT(1))) { 1253 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1254 "CheckPcieDMAHang8821AE(): true! Reset PCIE DMA!\n"); 1255 return true; 1256 } else { 1257 return false; 1258 } 1259 } 1260 1261 static bool _rtl8821ae_reset_pcie_interface_dma(struct ieee80211_hw *hw, 1262 bool mac_power_on, 1263 bool in_watchdog) 1264 { 1265 struct rtl_priv *rtlpriv = rtl_priv(hw); 1266 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1267 u8 tmp; 1268 bool release_mac_rx_pause; 1269 u8 backup_pcie_dma_pause; 1270 1271 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n"); 1272 1273 /* 1. Disable register write lock. 0x1c[1] = 0 */ 1274 tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL); 1275 tmp &= ~(BIT(1)); 1276 rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp); 1277 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 1278 /* write 0xCC bit[2] = 1'b1 */ 1279 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2); 1280 tmp |= BIT(2); 1281 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp); 1282 } 1283 1284 /* 2. Check and pause TRX DMA */ 1285 /* write 0x284 bit[18] = 1'b1 */ 1286 /* write 0x301 = 0xFF */ 1287 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 1288 if (tmp & BIT(2)) { 1289 /* Already pause before the function for another purpose. */ 1290 release_mac_rx_pause = false; 1291 } else { 1292 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2))); 1293 release_mac_rx_pause = true; 1294 } 1295 backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1); 1296 if (backup_pcie_dma_pause != 0xFF) 1297 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF); 1298 1299 if (mac_power_on) { 1300 /* 3. reset TRX function */ 1301 /* write 0x100 = 0x00 */ 1302 rtl_write_byte(rtlpriv, REG_CR, 0); 1303 } 1304 1305 /* 4. Reset PCIe DMA. 0x3[0] = 0 */ 1306 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 1307 tmp &= ~(BIT(0)); 1308 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp); 1309 1310 /* 5. Enable PCIe DMA. 0x3[0] = 1 */ 1311 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 1312 tmp |= BIT(0); 1313 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp); 1314 1315 if (mac_power_on) { 1316 /* 6. enable TRX function */ 1317 /* write 0x100 = 0xFF */ 1318 rtl_write_byte(rtlpriv, REG_CR, 0xFF); 1319 1320 /* We should init LLT & RQPN and 1321 * prepare Tx/Rx descrptor address later 1322 * because MAC function is reset.*/ 1323 } 1324 1325 /* 7. Restore PCIe autoload down bit */ 1326 /* 8812AE does not has the defination. */ 1327 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 1328 /* write 0xF8 bit[17] = 1'b1 */ 1329 tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2); 1330 tmp |= BIT(1); 1331 rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp); 1332 } 1333 1334 /* In MAC power on state, BB and RF maybe in ON state, 1335 * if we release TRx DMA here. 1336 * it will cause packets to be started to Tx/Rx, 1337 * so we release Tx/Rx DMA later.*/ 1338 if (!mac_power_on/* || in_watchdog*/) { 1339 /* 8. release TRX DMA */ 1340 /* write 0x284 bit[18] = 1'b0 */ 1341 /* write 0x301 = 0x00 */ 1342 if (release_mac_rx_pause) { 1343 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 1344 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, 1345 tmp & (~BIT(2))); 1346 } 1347 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 1348 backup_pcie_dma_pause); 1349 } 1350 1351 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 1352 /* 9. lock system register */ 1353 /* write 0xCC bit[2] = 1'b0 */ 1354 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2); 1355 tmp &= ~(BIT(2)); 1356 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp); 1357 } 1358 return true; 1359 } 1360 1361 static void _rtl8821ae_get_wakeup_reason(struct ieee80211_hw *hw) 1362 { 1363 struct rtl_priv *rtlpriv = rtl_priv(hw); 1364 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1365 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv); 1366 u8 fw_reason = 0; 1367 struct timeval ts; 1368 1369 fw_reason = rtl_read_byte(rtlpriv, REG_MCUTST_WOWLAN); 1370 1371 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "WOL Read 0x1c7 = %02X\n", 1372 fw_reason); 1373 1374 ppsc->wakeup_reason = 0; 1375 1376 rtlhal->last_suspend_sec = ts.tv_sec; 1377 1378 switch (fw_reason) { 1379 case FW_WOW_V2_PTK_UPDATE_EVENT: 1380 ppsc->wakeup_reason = WOL_REASON_PTK_UPDATE; 1381 do_gettimeofday(&ts); 1382 ppsc->last_wakeup_time = ts.tv_sec*1000 + ts.tv_usec/1000; 1383 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1384 "It's a WOL PTK Key update event!\n"); 1385 break; 1386 case FW_WOW_V2_GTK_UPDATE_EVENT: 1387 ppsc->wakeup_reason = WOL_REASON_GTK_UPDATE; 1388 do_gettimeofday(&ts); 1389 ppsc->last_wakeup_time = ts.tv_sec*1000 + ts.tv_usec/1000; 1390 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1391 "It's a WOL GTK Key update event!\n"); 1392 break; 1393 case FW_WOW_V2_DISASSOC_EVENT: 1394 ppsc->wakeup_reason = WOL_REASON_DISASSOC; 1395 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1396 "It's a disassociation event!\n"); 1397 break; 1398 case FW_WOW_V2_DEAUTH_EVENT: 1399 ppsc->wakeup_reason = WOL_REASON_DEAUTH; 1400 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1401 "It's a deauth event!\n"); 1402 break; 1403 case FW_WOW_V2_FW_DISCONNECT_EVENT: 1404 ppsc->wakeup_reason = WOL_REASON_AP_LOST; 1405 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1406 "It's a Fw disconnect decision (AP lost) event!\n"); 1407 break; 1408 case FW_WOW_V2_MAGIC_PKT_EVENT: 1409 ppsc->wakeup_reason = WOL_REASON_MAGIC_PKT; 1410 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1411 "It's a magic packet event!\n"); 1412 break; 1413 case FW_WOW_V2_UNICAST_PKT_EVENT: 1414 ppsc->wakeup_reason = WOL_REASON_UNICAST_PKT; 1415 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1416 "It's an unicast packet event!\n"); 1417 break; 1418 case FW_WOW_V2_PATTERN_PKT_EVENT: 1419 ppsc->wakeup_reason = WOL_REASON_PATTERN_PKT; 1420 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1421 "It's a pattern match event!\n"); 1422 break; 1423 case FW_WOW_V2_RTD3_SSID_MATCH_EVENT: 1424 ppsc->wakeup_reason = WOL_REASON_RTD3_SSID_MATCH; 1425 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1426 "It's an RTD3 Ssid match event!\n"); 1427 break; 1428 case FW_WOW_V2_REALWOW_V2_WAKEUPPKT: 1429 ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_WAKEUPPKT; 1430 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1431 "It's an RealWoW wake packet event!\n"); 1432 break; 1433 case FW_WOW_V2_REALWOW_V2_ACKLOST: 1434 ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_ACKLOST; 1435 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1436 "It's an RealWoW ack lost event!\n"); 1437 break; 1438 default: 1439 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 1440 "WOL Read 0x1c7 = %02X, Unknown reason!\n", 1441 fw_reason); 1442 break; 1443 } 1444 } 1445 1446 static void _rtl8821ae_init_trx_desc_hw_address(struct ieee80211_hw *hw) 1447 { 1448 struct rtl_priv *rtlpriv = rtl_priv(hw); 1449 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1450 1451 /*low address*/ 1452 rtl_write_dword(rtlpriv, REG_BCNQ_DESA, 1453 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32)); 1454 rtl_write_dword(rtlpriv, REG_MGQ_DESA, 1455 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32)); 1456 rtl_write_dword(rtlpriv, REG_VOQ_DESA, 1457 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32)); 1458 rtl_write_dword(rtlpriv, REG_VIQ_DESA, 1459 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32)); 1460 rtl_write_dword(rtlpriv, REG_BEQ_DESA, 1461 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32)); 1462 rtl_write_dword(rtlpriv, REG_BKQ_DESA, 1463 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32)); 1464 rtl_write_dword(rtlpriv, REG_HQ_DESA, 1465 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32)); 1466 rtl_write_dword(rtlpriv, REG_RX_DESA, 1467 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32)); 1468 } 1469 1470 static bool _rtl8821ae_init_llt_table(struct ieee80211_hw *hw, u32 boundary) 1471 { 1472 bool status = true; 1473 u32 i; 1474 u32 txpktbuf_bndy = boundary; 1475 u32 last_entry_of_txpktbuf = LAST_ENTRY_OF_TX_PKT_BUFFER; 1476 1477 for (i = 0 ; i < (txpktbuf_bndy - 1) ; i++) { 1478 status = _rtl8821ae_llt_write(hw, i , i + 1); 1479 if (!status) 1480 return status; 1481 } 1482 1483 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF); 1484 if (!status) 1485 return status; 1486 1487 for (i = txpktbuf_bndy ; i < last_entry_of_txpktbuf ; i++) { 1488 status = _rtl8821ae_llt_write(hw, i, (i + 1)); 1489 if (!status) 1490 return status; 1491 } 1492 1493 status = _rtl8821ae_llt_write(hw, last_entry_of_txpktbuf, 1494 txpktbuf_bndy); 1495 if (!status) 1496 return status; 1497 1498 return status; 1499 } 1500 1501 static bool _rtl8821ae_dynamic_rqpn(struct ieee80211_hw *hw, u32 boundary, 1502 u16 npq_rqpn_value, u32 rqpn_val) 1503 { 1504 struct rtl_priv *rtlpriv = rtl_priv(hw); 1505 u8 tmp; 1506 bool ret = true; 1507 u16 count = 0, tmp16; 1508 bool support_remote_wakeup; 1509 1510 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN, 1511 (u8 *)(&support_remote_wakeup)); 1512 1513 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1514 "boundary=%#X, NPQ_RQPNValue=%#X, RQPNValue=%#X\n", 1515 boundary, npq_rqpn_value, rqpn_val); 1516 1517 /* stop PCIe DMA 1518 * 1. 0x301[7:0] = 0xFE */ 1519 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE); 1520 1521 /* wait TXFF empty 1522 * 2. polling till 0x41A[15:0]=0x07FF */ 1523 tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY); 1524 while ((tmp16 & 0x07FF) != 0x07FF) { 1525 udelay(100); 1526 tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY); 1527 count++; 1528 if ((count % 200) == 0) { 1529 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1530 "Tx queue is not empty for 20ms!\n"); 1531 } 1532 if (count >= 1000) { 1533 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1534 "Wait for Tx FIFO empty timeout!\n"); 1535 break; 1536 } 1537 } 1538 1539 /* TX pause 1540 * 3. reg 0x522=0xFF */ 1541 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); 1542 1543 /* Wait TX State Machine OK 1544 * 4. polling till reg 0x5FB~0x5F8 = 0x00000000 for 50ms */ 1545 count = 0; 1546 while (rtl_read_byte(rtlpriv, REG_SCH_TXCMD) != 0) { 1547 udelay(100); 1548 count++; 1549 if (count >= 500) { 1550 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1551 "Wait for TX State Machine ready timeout !!\n"); 1552 break; 1553 } 1554 } 1555 1556 /* stop RX DMA path 1557 * 5. 0x284[18] = 1 1558 * 6. wait till 0x284[17] == 1 1559 * wait RX DMA idle */ 1560 count = 0; 1561 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 1562 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2))); 1563 do { 1564 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 1565 udelay(10); 1566 count++; 1567 } while (!(tmp & BIT(1)) && count < 100); 1568 1569 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1570 "Wait until Rx DMA Idle. count=%d REG[0x286]=0x%x\n", 1571 count, tmp); 1572 1573 /* reset BB 1574 * 7. 0x02 [0] = 0 */ 1575 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN); 1576 tmp &= ~(BIT(0)); 1577 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, tmp); 1578 1579 /* Reset TRX MAC 1580 * 8. 0x100 = 0x00 1581 * Delay (1ms) */ 1582 rtl_write_byte(rtlpriv, REG_CR, 0x00); 1583 udelay(1000); 1584 1585 /* Disable MAC Security Engine 1586 * 9. 0x100 bit[9]=0 */ 1587 tmp = rtl_read_byte(rtlpriv, REG_CR + 1); 1588 tmp &= ~(BIT(1)); 1589 rtl_write_byte(rtlpriv, REG_CR + 1, tmp); 1590 1591 /* To avoid DD-Tim Circuit hang 1592 * 10. 0x553 bit[5]=1 */ 1593 tmp = rtl_read_byte(rtlpriv, REG_DUAL_TSF_RST); 1594 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (tmp | BIT(5))); 1595 1596 /* Enable MAC Security Engine 1597 * 11. 0x100 bit[9]=1 */ 1598 tmp = rtl_read_byte(rtlpriv, REG_CR + 1); 1599 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp | BIT(1))); 1600 1601 /* Enable TRX MAC 1602 * 12. 0x100 = 0xFF 1603 * Delay (1ms) */ 1604 rtl_write_byte(rtlpriv, REG_CR, 0xFF); 1605 udelay(1000); 1606 1607 /* Enable BB 1608 * 13. 0x02 [0] = 1 */ 1609 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN); 1610 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, (tmp | BIT(0))); 1611 1612 /* beacon setting 1613 * 14,15. set beacon head page (reg 0x209 and 0x424) */ 1614 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, (u8)boundary); 1615 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, (u8)boundary); 1616 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, (u8)boundary); 1617 1618 /* 16. WMAC_LBK_BF_HD 0x45D[7:0] 1619 * WMAC_LBK_BF_HD */ 1620 rtl_write_byte(rtlpriv, REG_TXPKTBUF_WMAC_LBK_BF_HD, 1621 (u8)boundary); 1622 1623 rtl_write_word(rtlpriv, REG_TRXFF_BNDY, boundary); 1624 1625 /* init LLT 1626 * 17. init LLT */ 1627 if (!_rtl8821ae_init_llt_table(hw, boundary)) { 1628 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, 1629 "Failed to init LLT table!\n"); 1630 return false; 1631 } 1632 1633 /* reallocate RQPN 1634 * 18. reallocate RQPN and init LLT */ 1635 rtl_write_word(rtlpriv, REG_RQPN_NPQ, npq_rqpn_value); 1636 rtl_write_dword(rtlpriv, REG_RQPN, rqpn_val); 1637 1638 /* release Tx pause 1639 * 19. 0x522=0x00 */ 1640 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 1641 1642 /* enable PCIE DMA 1643 * 20. 0x301[7:0] = 0x00 1644 * 21. 0x284[18] = 0 */ 1645 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00); 1646 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 1647 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp&~BIT(2))); 1648 1649 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "End.\n"); 1650 return ret; 1651 } 1652 1653 static void _rtl8821ae_simple_initialize_adapter(struct ieee80211_hw *hw) 1654 { 1655 struct rtl_priv *rtlpriv = rtl_priv(hw); 1656 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1657 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv); 1658 1659 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1) 1660 /* Re-download normal Fw. */ 1661 rtl8821ae_set_fw_related_for_wowlan(hw, false); 1662 #endif 1663 1664 /* Re-Initialize LLT table. */ 1665 if (rtlhal->re_init_llt_table) { 1666 u32 rqpn = 0x80e70808; 1667 u8 rqpn_npq = 0, boundary = 0xF8; 1668 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 1669 rqpn = 0x80e90808; 1670 boundary = 0xFA; 1671 } 1672 if (_rtl8821ae_dynamic_rqpn(hw, boundary, rqpn_npq, rqpn)) 1673 rtlhal->re_init_llt_table = false; 1674 } 1675 1676 ppsc->rfpwr_state = ERFON; 1677 } 1678 1679 static void _rtl8821ae_enable_l1off(struct ieee80211_hw *hw) 1680 { 1681 u8 tmp = 0; 1682 struct rtl_priv *rtlpriv = rtl_priv(hw); 1683 1684 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n"); 1685 1686 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x160); 1687 if (!(tmp & (BIT(2) | BIT(3)))) { 1688 RT_TRACE(rtlpriv, COMP_POWER | COMP_INIT, DBG_LOUD, 1689 "0x160(%#x)return!!\n", tmp); 1690 return; 1691 } 1692 1693 tmp = _rtl8821ae_mdio_read(rtlpriv, 0x1b); 1694 _rtl8821ae_mdio_write(rtlpriv, 0x1b, (tmp | BIT(4))); 1695 1696 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718); 1697 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp | BIT(5)); 1698 1699 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n"); 1700 } 1701 1702 static void _rtl8821ae_enable_ltr(struct ieee80211_hw *hw) 1703 { 1704 u8 tmp = 0; 1705 struct rtl_priv *rtlpriv = rtl_priv(hw); 1706 1707 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n"); 1708 1709 /* Check 0x98[10] */ 1710 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x99); 1711 if (!(tmp & BIT(2))) { 1712 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1713 "<---0x99(%#x) return!!\n", tmp); 1714 return; 1715 } 1716 1717 /* LTR idle latency, 0x90 for 144us */ 1718 rtl_write_dword(rtlpriv, 0x798, 0x88908890); 1719 1720 /* LTR active latency, 0x3c for 60us */ 1721 rtl_write_dword(rtlpriv, 0x79c, 0x883c883c); 1722 1723 tmp = rtl_read_byte(rtlpriv, 0x7a4); 1724 rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(4))); 1725 1726 tmp = rtl_read_byte(rtlpriv, 0x7a4); 1727 rtl_write_byte(rtlpriv, 0x7a4, (tmp & (~BIT(0)))); 1728 rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(0))); 1729 1730 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n"); 1731 } 1732 1733 static bool _rtl8821ae_wowlan_initialize_adapter(struct ieee80211_hw *hw) 1734 { 1735 struct rtl_priv *rtlpriv = rtl_priv(hw); 1736 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1737 bool init_finished = true; 1738 u8 tmp = 0; 1739 1740 /* Get Fw wake up reason. */ 1741 _rtl8821ae_get_wakeup_reason(hw); 1742 1743 /* Patch Pcie Rx DMA hang after S3/S4 several times. 1744 * The root cause has not be found. */ 1745 if (_rtl8821ae_check_pcie_dma_hang(hw)) 1746 _rtl8821ae_reset_pcie_interface_dma(hw, true, false); 1747 1748 /* Prepare Tx/Rx Desc Hw address. */ 1749 _rtl8821ae_init_trx_desc_hw_address(hw); 1750 1751 /* Release Pcie Interface Rx DMA to allow wake packet DMA. */ 1752 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE); 1753 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable PCIE Rx DMA.\n"); 1754 1755 /* Check wake up event. 1756 * We should check wake packet bit before disable wowlan by H2C or 1757 * Fw will clear the bit. */ 1758 tmp = rtl_read_byte(rtlpriv, REG_FTISR + 3); 1759 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 1760 "Read REG_FTISR 0x13f = %#X\n", tmp); 1761 1762 /* Set the WoWLAN related function control disable. */ 1763 rtl8821ae_set_fw_wowlan_mode(hw, false); 1764 rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 0); 1765 1766 if (rtlhal->hw_rof_enable) { 1767 tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3); 1768 if (tmp & BIT(1)) { 1769 /* Clear GPIO9 ISR */ 1770 rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1)); 1771 init_finished = false; 1772 } else { 1773 init_finished = true; 1774 } 1775 } 1776 1777 if (init_finished) { 1778 _rtl8821ae_simple_initialize_adapter(hw); 1779 1780 /* Release Pcie Interface Tx DMA. */ 1781 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00); 1782 /* Release Pcie RX DMA */ 1783 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, 0x02); 1784 1785 tmp = rtl_read_byte(rtlpriv, REG_CR + 1); 1786 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp & (~BIT(0)))); 1787 1788 _rtl8821ae_enable_l1off(hw); 1789 _rtl8821ae_enable_ltr(hw); 1790 } 1791 1792 return init_finished; 1793 } 1794 1795 static void _rtl8812ae_bb8812_config_1t(struct ieee80211_hw *hw) 1796 { 1797 /* BB OFDM RX Path_A */ 1798 rtl_set_bbreg(hw, 0x808, 0xff, 0x11); 1799 /* BB OFDM TX Path_A */ 1800 rtl_set_bbreg(hw, 0x80c, MASKLWORD, 0x1111); 1801 /* BB CCK R/Rx Path_A */ 1802 rtl_set_bbreg(hw, 0xa04, 0x0c000000, 0x0); 1803 /* MCS support */ 1804 rtl_set_bbreg(hw, 0x8bc, 0xc0000060, 0x4); 1805 /* RF Path_B HSSI OFF */ 1806 rtl_set_bbreg(hw, 0xe00, 0xf, 0x4); 1807 /* RF Path_B Power Down */ 1808 rtl_set_bbreg(hw, 0xe90, MASKDWORD, 0); 1809 /* ADDA Path_B OFF */ 1810 rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0); 1811 rtl_set_bbreg(hw, 0xe64, MASKDWORD, 0); 1812 } 1813 1814 static void _rtl8821ae_poweroff_adapter(struct ieee80211_hw *hw) 1815 { 1816 struct rtl_priv *rtlpriv = rtl_priv(hw); 1817 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1818 u8 u1b_tmp; 1819 1820 rtlhal->mac_func_enable = false; 1821 1822 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 1823 /* Combo (PCIe + USB) Card and PCIe-MF Card */ 1824 /* 1. Run LPS WL RFOFF flow */ 1825 /* RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1826 "=====>CardDisableRTL8812E,RTL8821A_NIC_LPS_ENTER_FLOW\n"); 1827 */ 1828 rtl_hal_pwrseqcmdparsing(rtlpriv, 1829 PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 1830 PWR_INTF_PCI_MSK, RTL8821A_NIC_LPS_ENTER_FLOW); 1831 } 1832 /* 2. 0x1F[7:0] = 0 */ 1833 /* turn off RF */ 1834 /* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */ 1835 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) && 1836 rtlhal->fw_ready) { 1837 rtl8821ae_firmware_selfreset(hw); 1838 } 1839 1840 /* Reset MCU. Suggested by Filen. */ 1841 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1); 1842 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2)))); 1843 1844 /* g. MCUFWDL 0x80[1:0]=0 */ 1845 /* reset MCU ready status */ 1846 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00); 1847 1848 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 1849 /* HW card disable configuration. */ 1850 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 1851 PWR_INTF_PCI_MSK, RTL8821A_NIC_DISABLE_FLOW); 1852 } else { 1853 /* HW card disable configuration. */ 1854 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 1855 PWR_INTF_PCI_MSK, RTL8812_NIC_DISABLE_FLOW); 1856 } 1857 1858 /* Reset MCU IO Wrapper */ 1859 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1); 1860 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0)))); 1861 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1); 1862 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0)); 1863 1864 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */ 1865 /* lock ISO/CLK/Power control register */ 1866 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e); 1867 } 1868 1869 int rtl8821ae_hw_init(struct ieee80211_hw *hw) 1870 { 1871 struct rtl_priv *rtlpriv = rtl_priv(hw); 1872 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1873 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1874 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 1875 bool rtstatus = true; 1876 int err; 1877 u8 tmp_u1b; 1878 bool support_remote_wakeup; 1879 u32 nav_upper = WIFI_NAV_UPPER_US; 1880 1881 rtlhal->being_init_adapter = true; 1882 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN, 1883 (u8 *)(&support_remote_wakeup)); 1884 rtlpriv->intf_ops->disable_aspm(hw); 1885 1886 /*YP wowlan not considered*/ 1887 1888 tmp_u1b = rtl_read_byte(rtlpriv, REG_CR); 1889 if (tmp_u1b != 0 && tmp_u1b != 0xEA) { 1890 rtlhal->mac_func_enable = true; 1891 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1892 "MAC has already power on.\n"); 1893 } else { 1894 rtlhal->mac_func_enable = false; 1895 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE; 1896 } 1897 1898 if (support_remote_wakeup && 1899 rtlhal->wake_from_pnp_sleep && 1900 rtlhal->mac_func_enable) { 1901 if (_rtl8821ae_wowlan_initialize_adapter(hw)) { 1902 rtlhal->being_init_adapter = false; 1903 return 0; 1904 } 1905 } 1906 1907 if (_rtl8821ae_check_pcie_dma_hang(hw)) { 1908 _rtl8821ae_reset_pcie_interface_dma(hw, 1909 rtlhal->mac_func_enable, 1910 false); 1911 rtlhal->mac_func_enable = false; 1912 } 1913 1914 /* Reset MAC/BB/RF status if it is not powered off 1915 * before calling initialize Hw flow to prevent 1916 * from interface and MAC status mismatch. 1917 * 2013.06.21, by tynli. Suggested by SD1 JackieLau. */ 1918 if (rtlhal->mac_func_enable) { 1919 _rtl8821ae_poweroff_adapter(hw); 1920 rtlhal->mac_func_enable = false; 1921 } 1922 1923 rtstatus = _rtl8821ae_init_mac(hw); 1924 if (rtstatus != true) { 1925 pr_err("Init MAC failed\n"); 1926 err = 1; 1927 return err; 1928 } 1929 1930 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG); 1931 tmp_u1b &= 0x7F; 1932 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b); 1933 1934 err = rtl8821ae_download_fw(hw, false); 1935 if (err) { 1936 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 1937 "Failed to download FW. Init HW without FW now\n"); 1938 err = 1; 1939 rtlhal->fw_ready = false; 1940 return err; 1941 } else { 1942 rtlhal->fw_ready = true; 1943 } 1944 ppsc->fw_current_inpsmode = false; 1945 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE; 1946 rtlhal->fw_clk_change_in_progress = false; 1947 rtlhal->allow_sw_to_change_hwclc = false; 1948 rtlhal->last_hmeboxnum = 0; 1949 1950 /*SIC_Init(Adapter); 1951 if(rtlhal->AMPDUBurstMode) 1952 rtl_write_byte(rtlpriv,REG_AMPDU_BURST_MODE_8812, 0x7F);*/ 1953 1954 rtl8821ae_phy_mac_config(hw); 1955 /* because last function modify RCR, so we update 1956 * rcr var here, or TP will unstable for receive_config 1957 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx 1958 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252 1959 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR); 1960 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV); 1961 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);*/ 1962 rtl8821ae_phy_bb_config(hw); 1963 1964 rtl8821ae_phy_rf_config(hw); 1965 1966 if (rtlpriv->phy.rf_type == RF_1T1R && 1967 rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 1968 _rtl8812ae_bb8812_config_1t(hw); 1969 1970 _rtl8821ae_hw_configure(hw); 1971 1972 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G); 1973 1974 /*set wireless mode*/ 1975 1976 rtlhal->mac_func_enable = true; 1977 1978 rtl_cam_reset_all_entry(hw); 1979 1980 rtl8821ae_enable_hw_security_config(hw); 1981 1982 ppsc->rfpwr_state = ERFON; 1983 1984 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr); 1985 _rtl8821ae_enable_aspm_back_door(hw); 1986 rtlpriv->intf_ops->enable_aspm(hw); 1987 1988 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE && 1989 (rtlhal->rfe_type == 1 || rtlhal->rfe_type == 5)) 1990 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x0302); 1991 1992 rtl8821ae_bt_hw_init(hw); 1993 rtlpriv->rtlhal.being_init_adapter = false; 1994 1995 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_NAV_UPPER, (u8 *)&nav_upper); 1996 1997 /* rtl8821ae_dm_check_txpower_tracking(hw); */ 1998 /* rtl8821ae_phy_lc_calibrate(hw); */ 1999 if (support_remote_wakeup) 2000 rtl_write_byte(rtlpriv, REG_WOW_CTRL, 0); 2001 2002 /* Release Rx DMA*/ 2003 tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 2004 if (tmp_u1b & BIT(2)) { 2005 /* Release Rx DMA if needed*/ 2006 tmp_u1b &= ~BIT(2); 2007 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b); 2008 } 2009 2010 /* Release Tx/Rx PCIE DMA if*/ 2011 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0); 2012 2013 rtl8821ae_dm_init(hw); 2014 rtl8821ae_macid_initialize_mediastatus(hw); 2015 2016 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rtl8821ae_hw_init() <====\n"); 2017 return err; 2018 } 2019 2020 static enum version_8821ae _rtl8821ae_read_chip_version(struct ieee80211_hw *hw) 2021 { 2022 struct rtl_priv *rtlpriv = rtl_priv(hw); 2023 struct rtl_phy *rtlphy = &rtlpriv->phy; 2024 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 2025 enum version_8821ae version = VERSION_UNKNOWN; 2026 u32 value32; 2027 2028 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG); 2029 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2030 "ReadChipVersion8812A 0xF0 = 0x%x\n", value32); 2031 2032 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 2033 rtlphy->rf_type = RF_2T2R; 2034 else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) 2035 rtlphy->rf_type = RF_1T1R; 2036 2037 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2038 "RF_Type is %x!!\n", rtlphy->rf_type); 2039 2040 if (value32 & TRP_VAUX_EN) { 2041 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 2042 if (rtlphy->rf_type == RF_2T2R) 2043 version = VERSION_TEST_CHIP_2T2R_8812; 2044 else 2045 version = VERSION_TEST_CHIP_1T1R_8812; 2046 } else 2047 version = VERSION_TEST_CHIP_8821; 2048 } else { 2049 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 2050 u32 rtl_id = ((value32 & CHIP_VER_RTL_MASK) >> 12) + 1; 2051 2052 if (rtlphy->rf_type == RF_2T2R) 2053 version = 2054 (enum version_8821ae)(CHIP_8812 2055 | NORMAL_CHIP | 2056 RF_TYPE_2T2R); 2057 else 2058 version = (enum version_8821ae)(CHIP_8812 2059 | NORMAL_CHIP); 2060 2061 version = (enum version_8821ae)(version | (rtl_id << 12)); 2062 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 2063 u32 rtl_id = value32 & CHIP_VER_RTL_MASK; 2064 2065 version = (enum version_8821ae)(CHIP_8821 2066 | NORMAL_CHIP | rtl_id); 2067 } 2068 } 2069 2070 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 2071 /*WL_HWROF_EN.*/ 2072 value32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL); 2073 rtlhal->hw_rof_enable = ((value32 & WL_HWROF_EN) ? 1 : 0); 2074 } 2075 2076 switch (version) { 2077 case VERSION_TEST_CHIP_1T1R_8812: 2078 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2079 "Chip Version ID: VERSION_TEST_CHIP_1T1R_8812\n"); 2080 break; 2081 case VERSION_TEST_CHIP_2T2R_8812: 2082 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2083 "Chip Version ID: VERSION_TEST_CHIP_2T2R_8812\n"); 2084 break; 2085 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812: 2086 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2087 "Chip Version ID:VERSION_NORMAL_TSMC_CHIP_1T1R_8812\n"); 2088 break; 2089 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812: 2090 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2091 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812\n"); 2092 break; 2093 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812_C_CUT: 2094 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2095 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_1T1R_8812 C CUT\n"); 2096 break; 2097 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812_C_CUT: 2098 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2099 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812 C CUT\n"); 2100 break; 2101 case VERSION_TEST_CHIP_8821: 2102 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2103 "Chip Version ID: VERSION_TEST_CHIP_8821\n"); 2104 break; 2105 case VERSION_NORMAL_TSMC_CHIP_8821: 2106 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2107 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 A CUT\n"); 2108 break; 2109 case VERSION_NORMAL_TSMC_CHIP_8821_B_CUT: 2110 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2111 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 B CUT\n"); 2112 break; 2113 default: 2114 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2115 "Chip Version ID: Unknown (0x%X)\n", version); 2116 break; 2117 } 2118 2119 return version; 2120 } 2121 2122 static int _rtl8821ae_set_media_status(struct ieee80211_hw *hw, 2123 enum nl80211_iftype type) 2124 { 2125 struct rtl_priv *rtlpriv = rtl_priv(hw); 2126 u8 bt_msr = rtl_read_byte(rtlpriv, MSR); 2127 enum led_ctl_mode ledaction = LED_CTL_NO_LINK; 2128 bt_msr &= 0xfc; 2129 2130 rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0); 2131 RT_TRACE(rtlpriv, COMP_BEACON, DBG_LOUD, 2132 "clear 0x550 when set HW_VAR_MEDIA_STATUS\n"); 2133 2134 if (type == NL80211_IFTYPE_UNSPECIFIED || 2135 type == NL80211_IFTYPE_STATION) { 2136 _rtl8821ae_stop_tx_beacon(hw); 2137 _rtl8821ae_enable_bcn_sub_func(hw); 2138 } else if (type == NL80211_IFTYPE_ADHOC || 2139 type == NL80211_IFTYPE_AP) { 2140 _rtl8821ae_resume_tx_beacon(hw); 2141 _rtl8821ae_disable_bcn_sub_func(hw); 2142 } else { 2143 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 2144 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n", 2145 type); 2146 } 2147 2148 switch (type) { 2149 case NL80211_IFTYPE_UNSPECIFIED: 2150 bt_msr |= MSR_NOLINK; 2151 ledaction = LED_CTL_LINK; 2152 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 2153 "Set Network type to NO LINK!\n"); 2154 break; 2155 case NL80211_IFTYPE_ADHOC: 2156 bt_msr |= MSR_ADHOC; 2157 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 2158 "Set Network type to Ad Hoc!\n"); 2159 break; 2160 case NL80211_IFTYPE_STATION: 2161 bt_msr |= MSR_INFRA; 2162 ledaction = LED_CTL_LINK; 2163 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 2164 "Set Network type to STA!\n"); 2165 break; 2166 case NL80211_IFTYPE_AP: 2167 bt_msr |= MSR_AP; 2168 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 2169 "Set Network type to AP!\n"); 2170 break; 2171 default: 2172 pr_err("Network type %d not support!\n", type); 2173 return 1; 2174 } 2175 2176 rtl_write_byte(rtlpriv, MSR, bt_msr); 2177 rtlpriv->cfg->ops->led_control(hw, ledaction); 2178 if ((bt_msr & MSR_MASK) == MSR_AP) 2179 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 2180 else 2181 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66); 2182 2183 return 0; 2184 } 2185 2186 void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid) 2187 { 2188 struct rtl_priv *rtlpriv = rtl_priv(hw); 2189 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 2190 u32 reg_rcr = rtlpci->receive_config; 2191 2192 if (rtlpriv->psc.rfpwr_state != ERFON) 2193 return; 2194 2195 if (check_bssid) { 2196 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN); 2197 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, 2198 (u8 *)(®_rcr)); 2199 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4)); 2200 } else if (!check_bssid) { 2201 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN)); 2202 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0); 2203 rtlpriv->cfg->ops->set_hw_reg(hw, 2204 HW_VAR_RCR, (u8 *)(®_rcr)); 2205 } 2206 } 2207 2208 int rtl8821ae_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type) 2209 { 2210 struct rtl_priv *rtlpriv = rtl_priv(hw); 2211 2212 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rtl8821ae_set_network_type!\n"); 2213 2214 if (_rtl8821ae_set_media_status(hw, type)) 2215 return -EOPNOTSUPP; 2216 2217 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) { 2218 if (type != NL80211_IFTYPE_AP) 2219 rtl8821ae_set_check_bssid(hw, true); 2220 } else { 2221 rtl8821ae_set_check_bssid(hw, false); 2222 } 2223 2224 return 0; 2225 } 2226 2227 /* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */ 2228 void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci) 2229 { 2230 struct rtl_priv *rtlpriv = rtl_priv(hw); 2231 rtl8821ae_dm_init_edca_turbo(hw); 2232 switch (aci) { 2233 case AC1_BK: 2234 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f); 2235 break; 2236 case AC0_BE: 2237 /* rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, u4b_ac_param); */ 2238 break; 2239 case AC2_VI: 2240 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322); 2241 break; 2242 case AC3_VO: 2243 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222); 2244 break; 2245 default: 2246 WARN_ONCE(true, "rtl8821ae: invalid aci: %d !\n", aci); 2247 break; 2248 } 2249 } 2250 2251 static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw) 2252 { 2253 struct rtl_priv *rtlpriv = rtl_priv(hw); 2254 u32 tmp = rtl_read_dword(rtlpriv, REG_HISR); 2255 2256 rtl_write_dword(rtlpriv, REG_HISR, tmp); 2257 2258 tmp = rtl_read_dword(rtlpriv, REG_HISRE); 2259 rtl_write_dword(rtlpriv, REG_HISRE, tmp); 2260 2261 tmp = rtl_read_dword(rtlpriv, REG_HSISR); 2262 rtl_write_dword(rtlpriv, REG_HSISR, tmp); 2263 } 2264 2265 void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw) 2266 { 2267 struct rtl_priv *rtlpriv = rtl_priv(hw); 2268 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 2269 2270 if (rtlpci->int_clear) 2271 rtl8821ae_clear_interrupt(hw);/*clear it here first*/ 2272 2273 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); 2274 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); 2275 rtlpci->irq_enabled = true; 2276 /* there are some C2H CMDs have been sent before 2277 system interrupt is enabled, e.g., C2H, CPWM. 2278 *So we need to clear all C2H events that FW has 2279 notified, otherwise FW won't schedule any commands anymore. 2280 */ 2281 /* rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0); */ 2282 /*enable system interrupt*/ 2283 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF); 2284 } 2285 2286 void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw) 2287 { 2288 struct rtl_priv *rtlpriv = rtl_priv(hw); 2289 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 2290 2291 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED); 2292 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED); 2293 rtlpci->irq_enabled = false; 2294 /*synchronize_irq(rtlpci->pdev->irq);*/ 2295 } 2296 2297 static void _rtl8821ae_clear_pci_pme_status(struct ieee80211_hw *hw) 2298 { 2299 struct rtl_priv *rtlpriv = rtl_priv(hw); 2300 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 2301 u16 cap_hdr; 2302 u8 cap_pointer; 2303 u8 cap_id = 0xff; 2304 u8 pmcs_reg; 2305 u8 cnt = 0; 2306 2307 /* Get the Capability pointer first, 2308 * the Capability Pointer is located at 2309 * offset 0x34 from the Function Header */ 2310 2311 pci_read_config_byte(rtlpci->pdev, 0x34, &cap_pointer); 2312 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2313 "PCI configuration 0x34 = 0x%2x\n", cap_pointer); 2314 2315 do { 2316 pci_read_config_word(rtlpci->pdev, cap_pointer, &cap_hdr); 2317 cap_id = cap_hdr & 0xFF; 2318 2319 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2320 "in pci configuration, cap_pointer%x = %x\n", 2321 cap_pointer, cap_id); 2322 2323 if (cap_id == 0x01) { 2324 break; 2325 } else { 2326 /* point to next Capability */ 2327 cap_pointer = (cap_hdr >> 8) & 0xFF; 2328 /* 0: end of pci capability, 0xff: invalid value */ 2329 if (cap_pointer == 0x00 || cap_pointer == 0xff) { 2330 cap_id = 0xff; 2331 break; 2332 } 2333 } 2334 } while (cnt++ < 200); 2335 2336 if (cap_id == 0x01) { 2337 /* Get the PM CSR (Control/Status Register), 2338 * The PME_Status is located at PM Capatibility offset 5, bit 7 2339 */ 2340 pci_read_config_byte(rtlpci->pdev, cap_pointer + 5, &pmcs_reg); 2341 2342 if (pmcs_reg & BIT(7)) { 2343 /* PME event occured, clear the PM_Status by write 1 */ 2344 pmcs_reg = pmcs_reg | BIT(7); 2345 2346 pci_write_config_byte(rtlpci->pdev, cap_pointer + 5, 2347 pmcs_reg); 2348 /* Read it back to check */ 2349 pci_read_config_byte(rtlpci->pdev, cap_pointer + 5, 2350 &pmcs_reg); 2351 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 2352 "Clear PME status 0x%2x to 0x%2x\n", 2353 cap_pointer + 5, pmcs_reg); 2354 } else { 2355 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 2356 "PME status(0x%2x) = 0x%2x\n", 2357 cap_pointer + 5, pmcs_reg); 2358 } 2359 } else { 2360 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, 2361 "Cannot find PME Capability\n"); 2362 } 2363 } 2364 2365 void rtl8821ae_card_disable(struct ieee80211_hw *hw) 2366 { 2367 struct rtl_priv *rtlpriv = rtl_priv(hw); 2368 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 2369 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv); 2370 struct rtl_mac *mac = rtl_mac(rtlpriv); 2371 enum nl80211_iftype opmode; 2372 bool support_remote_wakeup; 2373 u8 tmp; 2374 u32 count = 0; 2375 2376 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN, 2377 (u8 *)(&support_remote_wakeup)); 2378 2379 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 2380 2381 if (!(support_remote_wakeup && mac->opmode == NL80211_IFTYPE_STATION) 2382 || !rtlhal->enter_pnp_sleep) { 2383 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Normal Power off\n"); 2384 mac->link_state = MAC80211_NOLINK; 2385 opmode = NL80211_IFTYPE_UNSPECIFIED; 2386 _rtl8821ae_set_media_status(hw, opmode); 2387 _rtl8821ae_poweroff_adapter(hw); 2388 } else { 2389 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Wowlan Supported.\n"); 2390 /* 3 <1> Prepare for configuring wowlan related infomations */ 2391 /* Clear Fw WoWLAN event. */ 2392 rtl_write_byte(rtlpriv, REG_MCUTST_WOWLAN, 0x0); 2393 2394 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1) 2395 rtl8821ae_set_fw_related_for_wowlan(hw, true); 2396 #endif 2397 /* Dynamically adjust Tx packet boundary 2398 * for download reserved page packet. 2399 * reserve 30 pages for rsvd page */ 2400 if (_rtl8821ae_dynamic_rqpn(hw, 0xE0, 0x3, 0x80c20d0d)) 2401 rtlhal->re_init_llt_table = true; 2402 2403 /* 3 <2> Set Fw releted H2C cmd. */ 2404 2405 /* Set WoWLAN related security information. */ 2406 rtl8821ae_set_fw_global_info_cmd(hw); 2407 2408 _rtl8821ae_download_rsvd_page(hw, true); 2409 2410 /* Just enable AOAC related functions when we connect to AP. */ 2411 printk("mac->link_state = %d\n", mac->link_state); 2412 if (mac->link_state >= MAC80211_LINKED && 2413 mac->opmode == NL80211_IFTYPE_STATION) { 2414 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL); 2415 rtl8821ae_set_fw_media_status_rpt_cmd(hw, 2416 RT_MEDIA_CONNECT); 2417 2418 rtl8821ae_set_fw_wowlan_mode(hw, true); 2419 /* Enable Fw Keep alive mechanism. */ 2420 rtl8821ae_set_fw_keep_alive_cmd(hw, true); 2421 2422 /* Enable disconnect decision control. */ 2423 rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(hw, true); 2424 } 2425 2426 /* 3 <3> Hw Configutations */ 2427 2428 /* Wait untill Rx DMA Finished before host sleep. 2429 * FW Pause Rx DMA may happens when received packet doing dma. 2430 */ 2431 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, BIT(2)); 2432 2433 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 2434 count = 0; 2435 while (!(tmp & BIT(1)) && (count++ < 100)) { 2436 udelay(10); 2437 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 2438 } 2439 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2440 "Wait Rx DMA Finished before host sleep. count=%d\n", 2441 count); 2442 2443 /* reset trx ring */ 2444 rtlpriv->intf_ops->reset_trx_ring(hw); 2445 2446 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, 0x0); 2447 2448 _rtl8821ae_clear_pci_pme_status(hw); 2449 tmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR); 2450 rtl_write_byte(rtlpriv, REG_SYS_CLKR, tmp | BIT(3)); 2451 /* prevent 8051 to be reset by PERST */ 2452 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x20); 2453 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x60); 2454 } 2455 2456 if (rtlpriv->rtlhal.driver_is_goingto_unload || 2457 ppsc->rfoff_reason > RF_CHANGE_BY_PS) 2458 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF); 2459 /* For wowlan+LPS+32k. */ 2460 if (support_remote_wakeup && rtlhal->enter_pnp_sleep) { 2461 /* Set the WoWLAN related function control enable. 2462 * It should be the last H2C cmd in the WoWLAN flow. */ 2463 rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 1); 2464 2465 /* Stop Pcie Interface Tx DMA. */ 2466 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xff); 2467 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Stop PCIE Tx DMA.\n"); 2468 2469 /* Wait for TxDMA idle. */ 2470 count = 0; 2471 do { 2472 tmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG); 2473 udelay(10); 2474 count++; 2475 } while ((tmp != 0) && (count < 100)); 2476 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2477 "Wait Tx DMA Finished before host sleep. count=%d\n", 2478 count); 2479 2480 if (rtlhal->hw_rof_enable) { 2481 printk("hw_rof_enable\n"); 2482 tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3); 2483 rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1)); 2484 } 2485 } 2486 /* after power off we should do iqk again */ 2487 rtlpriv->phy.iqk_initialized = false; 2488 } 2489 2490 void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw, 2491 u32 *p_inta, u32 *p_intb) 2492 { 2493 struct rtl_priv *rtlpriv = rtl_priv(hw); 2494 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 2495 2496 *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0]; 2497 rtl_write_dword(rtlpriv, ISR, *p_inta); 2498 2499 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1]; 2500 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb); 2501 } 2502 2503 void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw) 2504 { 2505 struct rtl_priv *rtlpriv = rtl_priv(hw); 2506 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2507 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 2508 u16 bcn_interval, atim_window; 2509 2510 bcn_interval = mac->beacon_interval; 2511 atim_window = 2; /*FIX MERGE */ 2512 rtl8821ae_disable_interrupt(hw); 2513 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window); 2514 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); 2515 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f); 2516 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18); 2517 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18); 2518 rtl_write_byte(rtlpriv, 0x606, 0x30); 2519 rtlpci->reg_bcn_ctrl_val |= BIT(3); 2520 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val); 2521 rtl8821ae_enable_interrupt(hw); 2522 } 2523 2524 void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw) 2525 { 2526 struct rtl_priv *rtlpriv = rtl_priv(hw); 2527 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2528 u16 bcn_interval = mac->beacon_interval; 2529 2530 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG, 2531 "beacon_interval:%d\n", bcn_interval); 2532 rtl8821ae_disable_interrupt(hw); 2533 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); 2534 rtl8821ae_enable_interrupt(hw); 2535 } 2536 2537 void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw, 2538 u32 add_msr, u32 rm_msr) 2539 { 2540 struct rtl_priv *rtlpriv = rtl_priv(hw); 2541 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 2542 2543 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD, 2544 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr); 2545 2546 if (add_msr) 2547 rtlpci->irq_mask[0] |= add_msr; 2548 if (rm_msr) 2549 rtlpci->irq_mask[0] &= (~rm_msr); 2550 rtl8821ae_disable_interrupt(hw); 2551 rtl8821ae_enable_interrupt(hw); 2552 } 2553 2554 static u8 _rtl8821ae_get_chnl_group(u8 chnl) 2555 { 2556 u8 group = 0; 2557 2558 if (chnl <= 14) { 2559 if (1 <= chnl && chnl <= 2) 2560 group = 0; 2561 else if (3 <= chnl && chnl <= 5) 2562 group = 1; 2563 else if (6 <= chnl && chnl <= 8) 2564 group = 2; 2565 else if (9 <= chnl && chnl <= 11) 2566 group = 3; 2567 else /*if (12 <= chnl && chnl <= 14)*/ 2568 group = 4; 2569 } else { 2570 if (36 <= chnl && chnl <= 42) 2571 group = 0; 2572 else if (44 <= chnl && chnl <= 48) 2573 group = 1; 2574 else if (50 <= chnl && chnl <= 58) 2575 group = 2; 2576 else if (60 <= chnl && chnl <= 64) 2577 group = 3; 2578 else if (100 <= chnl && chnl <= 106) 2579 group = 4; 2580 else if (108 <= chnl && chnl <= 114) 2581 group = 5; 2582 else if (116 <= chnl && chnl <= 122) 2583 group = 6; 2584 else if (124 <= chnl && chnl <= 130) 2585 group = 7; 2586 else if (132 <= chnl && chnl <= 138) 2587 group = 8; 2588 else if (140 <= chnl && chnl <= 144) 2589 group = 9; 2590 else if (149 <= chnl && chnl <= 155) 2591 group = 10; 2592 else if (157 <= chnl && chnl <= 161) 2593 group = 11; 2594 else if (165 <= chnl && chnl <= 171) 2595 group = 12; 2596 else if (173 <= chnl && chnl <= 177) 2597 group = 13; 2598 else 2599 WARN_ONCE(true, 2600 "rtl8821ae: 5G, Channel %d in Group not found\n", 2601 chnl); 2602 } 2603 return group; 2604 } 2605 2606 static void _rtl8821ae_read_power_value_fromprom(struct ieee80211_hw *hw, 2607 struct txpower_info_2g *pwrinfo24g, 2608 struct txpower_info_5g *pwrinfo5g, 2609 bool autoload_fail, 2610 u8 *hwinfo) 2611 { 2612 struct rtl_priv *rtlpriv = rtl_priv(hw); 2613 u32 rfPath, eeAddr = EEPROM_TX_PWR_INX, group, TxCount = 0; 2614 2615 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2616 "hal_ReadPowerValueFromPROM8821ae(): hwinfo[0x%x]=0x%x\n", 2617 (eeAddr+1), hwinfo[eeAddr+1]); 2618 if (0xFF == hwinfo[eeAddr+1]) /*YJ,add,120316*/ 2619 autoload_fail = true; 2620 2621 if (autoload_fail) { 2622 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2623 "auto load fail : Use Default value!\n"); 2624 for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) { 2625 /*2.4G default value*/ 2626 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) { 2627 pwrinfo24g->index_cck_base[rfPath][group] = 0x2D; 2628 pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D; 2629 } 2630 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) { 2631 if (TxCount == 0) { 2632 pwrinfo24g->bw20_diff[rfPath][0] = 0x02; 2633 pwrinfo24g->ofdm_diff[rfPath][0] = 0x04; 2634 } else { 2635 pwrinfo24g->bw20_diff[rfPath][TxCount] = 0xFE; 2636 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0xFE; 2637 pwrinfo24g->cck_diff[rfPath][TxCount] = 0xFE; 2638 pwrinfo24g->ofdm_diff[rfPath][TxCount] = 0xFE; 2639 } 2640 } 2641 /*5G default value*/ 2642 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) 2643 pwrinfo5g->index_bw40_base[rfPath][group] = 0x2A; 2644 2645 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) { 2646 if (TxCount == 0) { 2647 pwrinfo5g->ofdm_diff[rfPath][0] = 0x04; 2648 pwrinfo5g->bw20_diff[rfPath][0] = 0x00; 2649 pwrinfo5g->bw80_diff[rfPath][0] = 0xFE; 2650 pwrinfo5g->bw160_diff[rfPath][0] = 0xFE; 2651 } else { 2652 pwrinfo5g->ofdm_diff[rfPath][0] = 0xFE; 2653 pwrinfo5g->bw20_diff[rfPath][0] = 0xFE; 2654 pwrinfo5g->bw40_diff[rfPath][0] = 0xFE; 2655 pwrinfo5g->bw80_diff[rfPath][0] = 0xFE; 2656 pwrinfo5g->bw160_diff[rfPath][0] = 0xFE; 2657 } 2658 } 2659 } 2660 return; 2661 } 2662 2663 rtl_priv(hw)->efuse.txpwr_fromeprom = true; 2664 2665 for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) { 2666 /*2.4G default value*/ 2667 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) { 2668 pwrinfo24g->index_cck_base[rfPath][group] = hwinfo[eeAddr++]; 2669 if (pwrinfo24g->index_cck_base[rfPath][group] == 0xFF) 2670 pwrinfo24g->index_cck_base[rfPath][group] = 0x2D; 2671 } 2672 for (group = 0 ; group < MAX_CHNL_GROUP_24G - 1; group++) { 2673 pwrinfo24g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++]; 2674 if (pwrinfo24g->index_bw40_base[rfPath][group] == 0xFF) 2675 pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D; 2676 } 2677 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) { 2678 if (TxCount == 0) { 2679 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0; 2680 /*bit sign number to 8 bit sign number*/ 2681 pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4; 2682 if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3)) 2683 pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0; 2684 /*bit sign number to 8 bit sign number*/ 2685 pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f); 2686 if (pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3)) 2687 pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0; 2688 2689 pwrinfo24g->cck_diff[rfPath][TxCount] = 0; 2690 eeAddr++; 2691 } else { 2692 pwrinfo24g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr]&0xf0) >> 4; 2693 if (pwrinfo24g->bw40_diff[rfPath][TxCount] & BIT(3)) 2694 pwrinfo24g->bw40_diff[rfPath][TxCount] |= 0xF0; 2695 2696 pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f); 2697 if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3)) 2698 pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0; 2699 2700 eeAddr++; 2701 2702 pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4; 2703 if (pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3)) 2704 pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0; 2705 2706 pwrinfo24g->cck_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f); 2707 if (pwrinfo24g->cck_diff[rfPath][TxCount] & BIT(3)) 2708 pwrinfo24g->cck_diff[rfPath][TxCount] |= 0xF0; 2709 2710 eeAddr++; 2711 } 2712 } 2713 2714 /*5G default value*/ 2715 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) { 2716 pwrinfo5g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++]; 2717 if (pwrinfo5g->index_bw40_base[rfPath][group] == 0xFF) 2718 pwrinfo5g->index_bw40_base[rfPath][group] = 0xFE; 2719 } 2720 2721 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) { 2722 if (TxCount == 0) { 2723 pwrinfo5g->bw40_diff[rfPath][TxCount] = 0; 2724 2725 pwrinfo5g->bw20_diff[rfPath][0] = (hwinfo[eeAddr] & 0xf0) >> 4; 2726 if (pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3)) 2727 pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0; 2728 2729 pwrinfo5g->ofdm_diff[rfPath][0] = (hwinfo[eeAddr] & 0x0f); 2730 if (pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3)) 2731 pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0; 2732 2733 eeAddr++; 2734 } else { 2735 pwrinfo5g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4; 2736 if (pwrinfo5g->bw40_diff[rfPath][TxCount] & BIT(3)) 2737 pwrinfo5g->bw40_diff[rfPath][TxCount] |= 0xF0; 2738 2739 pwrinfo5g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f); 2740 if (pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3)) 2741 pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0; 2742 2743 eeAddr++; 2744 } 2745 } 2746 2747 pwrinfo5g->ofdm_diff[rfPath][1] = (hwinfo[eeAddr] & 0xf0) >> 4; 2748 pwrinfo5g->ofdm_diff[rfPath][2] = (hwinfo[eeAddr] & 0x0f); 2749 2750 eeAddr++; 2751 2752 pwrinfo5g->ofdm_diff[rfPath][3] = (hwinfo[eeAddr] & 0x0f); 2753 2754 eeAddr++; 2755 2756 for (TxCount = 1; TxCount < MAX_TX_COUNT; TxCount++) { 2757 if (pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3)) 2758 pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0; 2759 } 2760 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) { 2761 pwrinfo5g->bw80_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4; 2762 /* 4bit sign number to 8 bit sign number */ 2763 if (pwrinfo5g->bw80_diff[rfPath][TxCount] & BIT(3)) 2764 pwrinfo5g->bw80_diff[rfPath][TxCount] |= 0xF0; 2765 /* 4bit sign number to 8 bit sign number */ 2766 pwrinfo5g->bw160_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f); 2767 if (pwrinfo5g->bw160_diff[rfPath][TxCount] & BIT(3)) 2768 pwrinfo5g->bw160_diff[rfPath][TxCount] |= 0xF0; 2769 2770 eeAddr++; 2771 } 2772 } 2773 } 2774 #if 0 2775 static void _rtl8812ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw, 2776 bool autoload_fail, 2777 u8 *hwinfo) 2778 { 2779 struct rtl_priv *rtlpriv = rtl_priv(hw); 2780 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 2781 struct txpower_info_2g pwrinfo24g; 2782 struct txpower_info_5g pwrinfo5g; 2783 u8 rf_path, index; 2784 u8 i; 2785 2786 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g, 2787 &pwrinfo5g, autoload_fail, hwinfo); 2788 2789 for (rf_path = 0; rf_path < 2; rf_path++) { 2790 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) { 2791 index = _rtl8821ae_get_chnl_group(i + 1); 2792 2793 if (i == CHANNEL_MAX_NUMBER_2G - 1) { 2794 rtlefuse->txpwrlevel_cck[rf_path][i] = 2795 pwrinfo24g.index_cck_base[rf_path][5]; 2796 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = 2797 pwrinfo24g.index_bw40_base[rf_path][index]; 2798 } else { 2799 rtlefuse->txpwrlevel_cck[rf_path][i] = 2800 pwrinfo24g.index_cck_base[rf_path][index]; 2801 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = 2802 pwrinfo24g.index_bw40_base[rf_path][index]; 2803 } 2804 } 2805 2806 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) { 2807 index = _rtl8821ae_get_chnl_group(channel5g[i]); 2808 rtlefuse->txpwr_5g_bw40base[rf_path][i] = 2809 pwrinfo5g.index_bw40_base[rf_path][index]; 2810 } 2811 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) { 2812 u8 upper, lower; 2813 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]); 2814 upper = pwrinfo5g.index_bw40_base[rf_path][index]; 2815 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1]; 2816 2817 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2; 2818 } 2819 for (i = 0; i < MAX_TX_COUNT; i++) { 2820 rtlefuse->txpwr_cckdiff[rf_path][i] = 2821 pwrinfo24g.cck_diff[rf_path][i]; 2822 rtlefuse->txpwr_legacyhtdiff[rf_path][i] = 2823 pwrinfo24g.ofdm_diff[rf_path][i]; 2824 rtlefuse->txpwr_ht20diff[rf_path][i] = 2825 pwrinfo24g.bw20_diff[rf_path][i]; 2826 rtlefuse->txpwr_ht40diff[rf_path][i] = 2827 pwrinfo24g.bw40_diff[rf_path][i]; 2828 2829 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] = 2830 pwrinfo5g.ofdm_diff[rf_path][i]; 2831 rtlefuse->txpwr_5g_bw20diff[rf_path][i] = 2832 pwrinfo5g.bw20_diff[rf_path][i]; 2833 rtlefuse->txpwr_5g_bw40diff[rf_path][i] = 2834 pwrinfo5g.bw40_diff[rf_path][i]; 2835 rtlefuse->txpwr_5g_bw80diff[rf_path][i] = 2836 pwrinfo5g.bw80_diff[rf_path][i]; 2837 } 2838 } 2839 2840 if (!autoload_fail) { 2841 rtlefuse->eeprom_regulatory = 2842 hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;/*bit0~2*/ 2843 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF) 2844 rtlefuse->eeprom_regulatory = 0; 2845 } else { 2846 rtlefuse->eeprom_regulatory = 0; 2847 } 2848 2849 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 2850 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory); 2851 } 2852 #endif 2853 static void _rtl8821ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw, 2854 bool autoload_fail, 2855 u8 *hwinfo) 2856 { 2857 struct rtl_priv *rtlpriv = rtl_priv(hw); 2858 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 2859 struct txpower_info_2g pwrinfo24g; 2860 struct txpower_info_5g pwrinfo5g; 2861 u8 rf_path, index; 2862 u8 i; 2863 2864 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g, 2865 &pwrinfo5g, autoload_fail, hwinfo); 2866 2867 for (rf_path = 0; rf_path < 2; rf_path++) { 2868 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) { 2869 index = _rtl8821ae_get_chnl_group(i + 1); 2870 2871 if (i == CHANNEL_MAX_NUMBER_2G - 1) { 2872 rtlefuse->txpwrlevel_cck[rf_path][i] = 2873 pwrinfo24g.index_cck_base[rf_path][5]; 2874 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = 2875 pwrinfo24g.index_bw40_base[rf_path][index]; 2876 } else { 2877 rtlefuse->txpwrlevel_cck[rf_path][i] = 2878 pwrinfo24g.index_cck_base[rf_path][index]; 2879 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = 2880 pwrinfo24g.index_bw40_base[rf_path][index]; 2881 } 2882 } 2883 2884 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) { 2885 index = _rtl8821ae_get_chnl_group(channel5g[i]); 2886 rtlefuse->txpwr_5g_bw40base[rf_path][i] = 2887 pwrinfo5g.index_bw40_base[rf_path][index]; 2888 } 2889 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) { 2890 u8 upper, lower; 2891 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]); 2892 upper = pwrinfo5g.index_bw40_base[rf_path][index]; 2893 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1]; 2894 2895 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2; 2896 } 2897 for (i = 0; i < MAX_TX_COUNT; i++) { 2898 rtlefuse->txpwr_cckdiff[rf_path][i] = 2899 pwrinfo24g.cck_diff[rf_path][i]; 2900 rtlefuse->txpwr_legacyhtdiff[rf_path][i] = 2901 pwrinfo24g.ofdm_diff[rf_path][i]; 2902 rtlefuse->txpwr_ht20diff[rf_path][i] = 2903 pwrinfo24g.bw20_diff[rf_path][i]; 2904 rtlefuse->txpwr_ht40diff[rf_path][i] = 2905 pwrinfo24g.bw40_diff[rf_path][i]; 2906 2907 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] = 2908 pwrinfo5g.ofdm_diff[rf_path][i]; 2909 rtlefuse->txpwr_5g_bw20diff[rf_path][i] = 2910 pwrinfo5g.bw20_diff[rf_path][i]; 2911 rtlefuse->txpwr_5g_bw40diff[rf_path][i] = 2912 pwrinfo5g.bw40_diff[rf_path][i]; 2913 rtlefuse->txpwr_5g_bw80diff[rf_path][i] = 2914 pwrinfo5g.bw80_diff[rf_path][i]; 2915 } 2916 } 2917 /*bit0~2*/ 2918 if (!autoload_fail) { 2919 rtlefuse->eeprom_regulatory = hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07; 2920 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF) 2921 rtlefuse->eeprom_regulatory = 0; 2922 } else { 2923 rtlefuse->eeprom_regulatory = 0; 2924 } 2925 2926 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 2927 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory); 2928 } 2929 2930 static void _rtl8812ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo, 2931 bool autoload_fail) 2932 { 2933 struct rtl_priv *rtlpriv = rtl_priv(hw); 2934 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 2935 2936 if (!autoload_fail) { 2937 rtlhal->pa_type_2g = hwinfo[0xBC]; 2938 rtlhal->lna_type_2g = hwinfo[0xBD]; 2939 if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) { 2940 rtlhal->pa_type_2g = 0; 2941 rtlhal->lna_type_2g = 0; 2942 } 2943 rtlhal->external_pa_2g = ((rtlhal->pa_type_2g & BIT(5)) && 2944 (rtlhal->pa_type_2g & BIT(4))) ? 2945 1 : 0; 2946 rtlhal->external_lna_2g = ((rtlhal->lna_type_2g & BIT(7)) && 2947 (rtlhal->lna_type_2g & BIT(3))) ? 2948 1 : 0; 2949 2950 rtlhal->pa_type_5g = hwinfo[0xBC]; 2951 rtlhal->lna_type_5g = hwinfo[0xBF]; 2952 if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) { 2953 rtlhal->pa_type_5g = 0; 2954 rtlhal->lna_type_5g = 0; 2955 } 2956 rtlhal->external_pa_5g = ((rtlhal->pa_type_5g & BIT(1)) && 2957 (rtlhal->pa_type_5g & BIT(0))) ? 2958 1 : 0; 2959 rtlhal->external_lna_5g = ((rtlhal->lna_type_5g & BIT(7)) && 2960 (rtlhal->lna_type_5g & BIT(3))) ? 2961 1 : 0; 2962 } else { 2963 rtlhal->external_pa_2g = 0; 2964 rtlhal->external_lna_2g = 0; 2965 rtlhal->external_pa_5g = 0; 2966 rtlhal->external_lna_5g = 0; 2967 } 2968 } 2969 2970 static void _rtl8812ae_read_amplifier_type(struct ieee80211_hw *hw, u8 *hwinfo, 2971 bool autoload_fail) 2972 { 2973 struct rtl_priv *rtlpriv = rtl_priv(hw); 2974 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 2975 2976 u8 ext_type_pa_2g_a = (hwinfo[0xBD] & BIT(2)) >> 2; /* 0xBD[2] */ 2977 u8 ext_type_pa_2g_b = (hwinfo[0xBD] & BIT(6)) >> 6; /* 0xBD[6] */ 2978 u8 ext_type_pa_5g_a = (hwinfo[0xBF] & BIT(2)) >> 2; /* 0xBF[2] */ 2979 u8 ext_type_pa_5g_b = (hwinfo[0xBF] & BIT(6)) >> 6; /* 0xBF[6] */ 2980 /* 0xBD[1:0] */ 2981 u8 ext_type_lna_2g_a = (hwinfo[0xBD] & (BIT(1) | BIT(0))) >> 0; 2982 /* 0xBD[5:4] */ 2983 u8 ext_type_lna_2g_b = (hwinfo[0xBD] & (BIT(5) | BIT(4))) >> 4; 2984 /* 0xBF[1:0] */ 2985 u8 ext_type_lna_5g_a = (hwinfo[0xBF] & (BIT(1) | BIT(0))) >> 0; 2986 /* 0xBF[5:4] */ 2987 u8 ext_type_lna_5g_b = (hwinfo[0xBF] & (BIT(5) | BIT(4))) >> 4; 2988 2989 _rtl8812ae_read_pa_type(hw, hwinfo, autoload_fail); 2990 2991 /* [2.4G] Path A and B are both extPA */ 2992 if ((rtlhal->pa_type_2g & (BIT(5) | BIT(4))) == (BIT(5) | BIT(4))) 2993 rtlhal->type_gpa = ext_type_pa_2g_b << 2 | ext_type_pa_2g_a; 2994 2995 /* [5G] Path A and B are both extPA */ 2996 if ((rtlhal->pa_type_5g & (BIT(1) | BIT(0))) == (BIT(1) | BIT(0))) 2997 rtlhal->type_apa = ext_type_pa_5g_b << 2 | ext_type_pa_5g_a; 2998 2999 /* [2.4G] Path A and B are both extLNA */ 3000 if ((rtlhal->lna_type_2g & (BIT(7) | BIT(3))) == (BIT(7) | BIT(3))) 3001 rtlhal->type_glna = ext_type_lna_2g_b << 2 | ext_type_lna_2g_a; 3002 3003 /* [5G] Path A and B are both extLNA */ 3004 if ((rtlhal->lna_type_5g & (BIT(7) | BIT(3))) == (BIT(7) | BIT(3))) 3005 rtlhal->type_alna = ext_type_lna_5g_b << 2 | ext_type_lna_5g_a; 3006 } 3007 3008 static void _rtl8821ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo, 3009 bool autoload_fail) 3010 { 3011 struct rtl_priv *rtlpriv = rtl_priv(hw); 3012 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 3013 3014 if (!autoload_fail) { 3015 rtlhal->pa_type_2g = hwinfo[0xBC]; 3016 rtlhal->lna_type_2g = hwinfo[0xBD]; 3017 if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) { 3018 rtlhal->pa_type_2g = 0; 3019 rtlhal->lna_type_2g = 0; 3020 } 3021 rtlhal->external_pa_2g = (rtlhal->pa_type_2g & BIT(5)) ? 1 : 0; 3022 rtlhal->external_lna_2g = (rtlhal->lna_type_2g & BIT(7)) ? 1 : 0; 3023 3024 rtlhal->pa_type_5g = hwinfo[0xBC]; 3025 rtlhal->lna_type_5g = hwinfo[0xBF]; 3026 if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) { 3027 rtlhal->pa_type_5g = 0; 3028 rtlhal->lna_type_5g = 0; 3029 } 3030 rtlhal->external_pa_5g = (rtlhal->pa_type_5g & BIT(1)) ? 1 : 0; 3031 rtlhal->external_lna_5g = (rtlhal->lna_type_5g & BIT(7)) ? 1 : 0; 3032 } else { 3033 rtlhal->external_pa_2g = 0; 3034 rtlhal->external_lna_2g = 0; 3035 rtlhal->external_pa_5g = 0; 3036 rtlhal->external_lna_5g = 0; 3037 } 3038 } 3039 3040 static void _rtl8821ae_read_rfe_type(struct ieee80211_hw *hw, u8 *hwinfo, 3041 bool autoload_fail) 3042 { 3043 struct rtl_priv *rtlpriv = rtl_priv(hw); 3044 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 3045 3046 if (!autoload_fail) { 3047 if (hwinfo[EEPROM_RFE_OPTION] & BIT(7)) { 3048 if (rtlhal->external_lna_5g) { 3049 if (rtlhal->external_pa_5g) { 3050 if (rtlhal->external_lna_2g && 3051 rtlhal->external_pa_2g) 3052 rtlhal->rfe_type = 3; 3053 else 3054 rtlhal->rfe_type = 0; 3055 } else { 3056 rtlhal->rfe_type = 2; 3057 } 3058 } else { 3059 rtlhal->rfe_type = 4; 3060 } 3061 } else { 3062 rtlhal->rfe_type = hwinfo[EEPROM_RFE_OPTION] & 0x3F; 3063 3064 if (rtlhal->rfe_type == 4 && 3065 (rtlhal->external_pa_5g || 3066 rtlhal->external_pa_2g || 3067 rtlhal->external_lna_5g || 3068 rtlhal->external_lna_2g)) { 3069 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 3070 rtlhal->rfe_type = 2; 3071 } 3072 } 3073 } else { 3074 rtlhal->rfe_type = 0x04; 3075 } 3076 3077 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 3078 "RFE Type: 0x%2x\n", rtlhal->rfe_type); 3079 } 3080 3081 static void _rtl8812ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw, 3082 bool auto_load_fail, u8 *hwinfo) 3083 { 3084 struct rtl_priv *rtlpriv = rtl_priv(hw); 3085 u8 value; 3086 3087 if (!auto_load_fail) { 3088 value = *(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION]; 3089 if (((value & 0xe0) >> 5) == 0x1) 3090 rtlpriv->btcoexist.btc_info.btcoexist = 1; 3091 else 3092 rtlpriv->btcoexist.btc_info.btcoexist = 0; 3093 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A; 3094 3095 value = hwinfo[EEPROM_RF_BT_SETTING]; 3096 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1); 3097 } else { 3098 rtlpriv->btcoexist.btc_info.btcoexist = 0; 3099 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A; 3100 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2; 3101 } 3102 /*move BT_InitHalVars() to init_sw_vars*/ 3103 } 3104 3105 static void _rtl8821ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw, 3106 bool auto_load_fail, u8 *hwinfo) 3107 { 3108 struct rtl_priv *rtlpriv = rtl_priv(hw); 3109 u8 value; 3110 u32 tmpu_32; 3111 3112 if (!auto_load_fail) { 3113 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL); 3114 if (tmpu_32 & BIT(18)) 3115 rtlpriv->btcoexist.btc_info.btcoexist = 1; 3116 else 3117 rtlpriv->btcoexist.btc_info.btcoexist = 0; 3118 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A; 3119 3120 value = hwinfo[EEPROM_RF_BT_SETTING]; 3121 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1); 3122 } else { 3123 rtlpriv->btcoexist.btc_info.btcoexist = 0; 3124 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A; 3125 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2; 3126 } 3127 /*move BT_InitHalVars() to init_sw_vars*/ 3128 } 3129 3130 static void _rtl8821ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_test) 3131 { 3132 struct rtl_priv *rtlpriv = rtl_priv(hw); 3133 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 3134 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3135 int params[] = {RTL_EEPROM_ID, EEPROM_VID, EEPROM_DID, 3136 EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR, 3137 EEPROM_CHANNELPLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID, 3138 COUNTRY_CODE_WORLD_WIDE_13}; 3139 u8 *hwinfo; 3140 3141 if (b_pseudo_test) { 3142 ;/* need add */ 3143 } 3144 3145 hwinfo = kzalloc(HWSET_MAX_SIZE, GFP_KERNEL); 3146 if (!hwinfo) 3147 return; 3148 3149 if (rtl_get_hwinfo(hw, rtlpriv, HWSET_MAX_SIZE, hwinfo, params)) 3150 goto exit; 3151 3152 _rtl8821ae_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag, 3153 hwinfo); 3154 3155 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 3156 _rtl8812ae_read_amplifier_type(hw, hwinfo, 3157 rtlefuse->autoload_failflag); 3158 _rtl8812ae_read_bt_coexist_info_from_hwpg(hw, 3159 rtlefuse->autoload_failflag, hwinfo); 3160 } else { 3161 _rtl8821ae_read_pa_type(hw, hwinfo, rtlefuse->autoload_failflag); 3162 _rtl8821ae_read_bt_coexist_info_from_hwpg(hw, 3163 rtlefuse->autoload_failflag, hwinfo); 3164 } 3165 3166 _rtl8821ae_read_rfe_type(hw, hwinfo, rtlefuse->autoload_failflag); 3167 /*board type*/ 3168 rtlefuse->board_type = ODM_BOARD_DEFAULT; 3169 if (rtlhal->external_lna_2g != 0) 3170 rtlefuse->board_type |= ODM_BOARD_EXT_LNA; 3171 if (rtlhal->external_lna_5g != 0) 3172 rtlefuse->board_type |= ODM_BOARD_EXT_LNA_5G; 3173 if (rtlhal->external_pa_2g != 0) 3174 rtlefuse->board_type |= ODM_BOARD_EXT_PA; 3175 if (rtlhal->external_pa_5g != 0) 3176 rtlefuse->board_type |= ODM_BOARD_EXT_PA_5G; 3177 3178 if (rtlpriv->btcoexist.btc_info.btcoexist == 1) 3179 rtlefuse->board_type |= ODM_BOARD_BT; 3180 3181 rtlhal->board_type = rtlefuse->board_type; 3182 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 3183 "board_type = 0x%x\n", rtlefuse->board_type); 3184 3185 rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN]; 3186 if (rtlefuse->eeprom_channelplan == 0xff) 3187 rtlefuse->eeprom_channelplan = 0x7F; 3188 3189 /* set channel plan from efuse */ 3190 rtlefuse->channel_plan = rtlefuse->eeprom_channelplan; 3191 3192 /*parse xtal*/ 3193 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8821AE]; 3194 if (rtlefuse->crystalcap == 0xFF) 3195 rtlefuse->crystalcap = 0x20; 3196 3197 rtlefuse->eeprom_thermalmeter = *(u8 *)&hwinfo[EEPROM_THERMAL_METER]; 3198 if ((rtlefuse->eeprom_thermalmeter == 0xff) || 3199 rtlefuse->autoload_failflag) { 3200 rtlefuse->apk_thermalmeterignore = true; 3201 rtlefuse->eeprom_thermalmeter = 0xff; 3202 } 3203 3204 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter; 3205 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 3206 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter); 3207 3208 if (!rtlefuse->autoload_failflag) { 3209 rtlefuse->antenna_div_cfg = 3210 (hwinfo[EEPROM_RF_BOARD_OPTION] & 0x18) >> 3; 3211 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xff) 3212 rtlefuse->antenna_div_cfg = 0; 3213 3214 if (rtlpriv->btcoexist.btc_info.btcoexist == 1 && 3215 rtlpriv->btcoexist.btc_info.ant_num == ANT_X1) 3216 rtlefuse->antenna_div_cfg = 0; 3217 3218 rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E]; 3219 if (rtlefuse->antenna_div_type == 0xff) 3220 rtlefuse->antenna_div_type = FIXED_HW_ANTDIV; 3221 } else { 3222 rtlefuse->antenna_div_cfg = 0; 3223 rtlefuse->antenna_div_type = 0; 3224 } 3225 3226 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 3227 "SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n", 3228 rtlefuse->antenna_div_cfg, rtlefuse->antenna_div_type); 3229 3230 rtlpriv->ledctl.led_opendrain = true; 3231 3232 if (rtlhal->oem_id == RT_CID_DEFAULT) { 3233 switch (rtlefuse->eeprom_oemid) { 3234 case RT_CID_DEFAULT: 3235 break; 3236 case EEPROM_CID_TOSHIBA: 3237 rtlhal->oem_id = RT_CID_TOSHIBA; 3238 break; 3239 case EEPROM_CID_CCX: 3240 rtlhal->oem_id = RT_CID_CCX; 3241 break; 3242 case EEPROM_CID_QMI: 3243 rtlhal->oem_id = RT_CID_819X_QMI; 3244 break; 3245 case EEPROM_CID_WHQL: 3246 break; 3247 default: 3248 break; 3249 } 3250 } 3251 exit: 3252 kfree(hwinfo); 3253 } 3254 3255 /*static void _rtl8821ae_hal_customized_behavior(struct ieee80211_hw *hw) 3256 { 3257 struct rtl_priv *rtlpriv = rtl_priv(hw); 3258 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 3259 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3260 3261 rtlpriv->ledctl.led_opendrain = true; 3262 switch (rtlhal->oem_id) { 3263 case RT_CID_819X_HP: 3264 rtlpriv->ledctl.led_opendrain = true; 3265 break; 3266 case RT_CID_819X_LENOVO: 3267 case RT_CID_DEFAULT: 3268 case RT_CID_TOSHIBA: 3269 case RT_CID_CCX: 3270 case RT_CID_819X_ACER: 3271 case RT_CID_WHQL: 3272 default: 3273 break; 3274 } 3275 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 3276 "RT Customized ID: 0x%02X\n", rtlhal->oem_id); 3277 }*/ 3278 3279 void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw) 3280 { 3281 struct rtl_priv *rtlpriv = rtl_priv(hw); 3282 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 3283 struct rtl_phy *rtlphy = &rtlpriv->phy; 3284 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3285 u8 tmp_u1b; 3286 3287 rtlhal->version = _rtl8821ae_read_chip_version(hw); 3288 if (get_rf_type(rtlphy) == RF_1T1R) 3289 rtlpriv->dm.rfpath_rxenable[0] = true; 3290 else 3291 rtlpriv->dm.rfpath_rxenable[0] = 3292 rtlpriv->dm.rfpath_rxenable[1] = true; 3293 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n", 3294 rtlhal->version); 3295 3296 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR); 3297 if (tmp_u1b & BIT(4)) { 3298 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n"); 3299 rtlefuse->epromtype = EEPROM_93C46; 3300 } else { 3301 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n"); 3302 rtlefuse->epromtype = EEPROM_BOOT_EFUSE; 3303 } 3304 3305 if (tmp_u1b & BIT(5)) { 3306 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n"); 3307 rtlefuse->autoload_failflag = false; 3308 _rtl8821ae_read_adapter_info(hw, false); 3309 } else { 3310 pr_err("Autoload ERR!!\n"); 3311 } 3312 /*hal_ReadRFType_8812A()*/ 3313 /* _rtl8821ae_hal_customized_behavior(hw); */ 3314 } 3315 3316 static void rtl8821ae_update_hal_rate_table(struct ieee80211_hw *hw, 3317 struct ieee80211_sta *sta) 3318 { 3319 struct rtl_priv *rtlpriv = rtl_priv(hw); 3320 struct rtl_phy *rtlphy = &rtlpriv->phy; 3321 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 3322 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3323 u32 ratr_value; 3324 u8 ratr_index = 0; 3325 u8 b_nmode = mac->ht_enable; 3326 u8 mimo_ps = IEEE80211_SMPS_OFF; 3327 u16 shortgi_rate; 3328 u32 tmp_ratr_value; 3329 u8 curtxbw_40mhz = mac->bw_40; 3330 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? 3331 1 : 0; 3332 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? 3333 1 : 0; 3334 enum wireless_mode wirelessmode = mac->mode; 3335 3336 if (rtlhal->current_bandtype == BAND_ON_5G) 3337 ratr_value = sta->supp_rates[1] << 4; 3338 else 3339 ratr_value = sta->supp_rates[0]; 3340 if (mac->opmode == NL80211_IFTYPE_ADHOC) 3341 ratr_value = 0xfff; 3342 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 | 3343 sta->ht_cap.mcs.rx_mask[0] << 12); 3344 switch (wirelessmode) { 3345 case WIRELESS_MODE_B: 3346 if (ratr_value & 0x0000000c) 3347 ratr_value &= 0x0000000d; 3348 else 3349 ratr_value &= 0x0000000f; 3350 break; 3351 case WIRELESS_MODE_G: 3352 ratr_value &= 0x00000FF5; 3353 break; 3354 case WIRELESS_MODE_N_24G: 3355 case WIRELESS_MODE_N_5G: 3356 b_nmode = 1; 3357 if (mimo_ps == IEEE80211_SMPS_STATIC) { 3358 ratr_value &= 0x0007F005; 3359 } else { 3360 u32 ratr_mask; 3361 3362 if (get_rf_type(rtlphy) == RF_1T2R || 3363 get_rf_type(rtlphy) == RF_1T1R) 3364 ratr_mask = 0x000ff005; 3365 else 3366 ratr_mask = 0x0f0ff005; 3367 3368 ratr_value &= ratr_mask; 3369 } 3370 break; 3371 default: 3372 if (rtlphy->rf_type == RF_1T2R) 3373 ratr_value &= 0x000ff0ff; 3374 else 3375 ratr_value &= 0x0f0ff0ff; 3376 3377 break; 3378 } 3379 3380 if ((rtlpriv->btcoexist.bt_coexistence) && 3381 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) && 3382 (rtlpriv->btcoexist.bt_cur_state) && 3383 (rtlpriv->btcoexist.bt_ant_isolation) && 3384 ((rtlpriv->btcoexist.bt_service == BT_SCO) || 3385 (rtlpriv->btcoexist.bt_service == BT_BUSY))) 3386 ratr_value &= 0x0fffcfc0; 3387 else 3388 ratr_value &= 0x0FFFFFFF; 3389 3390 if (b_nmode && ((curtxbw_40mhz && 3391 b_curshortgi_40mhz) || (!curtxbw_40mhz && 3392 b_curshortgi_20mhz))) { 3393 ratr_value |= 0x10000000; 3394 tmp_ratr_value = (ratr_value >> 12); 3395 3396 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) { 3397 if ((1 << shortgi_rate) & tmp_ratr_value) 3398 break; 3399 } 3400 3401 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) | 3402 (shortgi_rate << 4) | (shortgi_rate); 3403 } 3404 3405 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value); 3406 3407 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, 3408 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0)); 3409 } 3410 3411 static u8 _rtl8821ae_mrate_idx_to_arfr_id( 3412 struct ieee80211_hw *hw, u8 rate_index, 3413 enum wireless_mode wirelessmode) 3414 { 3415 struct rtl_priv *rtlpriv = rtl_priv(hw); 3416 struct rtl_phy *rtlphy = &rtlpriv->phy; 3417 u8 ret = 0; 3418 switch (rate_index) { 3419 case RATR_INX_WIRELESS_NGB: 3420 if (rtlphy->rf_type == RF_1T1R) 3421 ret = 1; 3422 else 3423 ret = 0; 3424 ; break; 3425 case RATR_INX_WIRELESS_N: 3426 case RATR_INX_WIRELESS_NG: 3427 if (rtlphy->rf_type == RF_1T1R) 3428 ret = 5; 3429 else 3430 ret = 4; 3431 ; break; 3432 case RATR_INX_WIRELESS_NB: 3433 if (rtlphy->rf_type == RF_1T1R) 3434 ret = 3; 3435 else 3436 ret = 2; 3437 ; break; 3438 case RATR_INX_WIRELESS_GB: 3439 ret = 6; 3440 break; 3441 case RATR_INX_WIRELESS_G: 3442 ret = 7; 3443 break; 3444 case RATR_INX_WIRELESS_B: 3445 ret = 8; 3446 break; 3447 case RATR_INX_WIRELESS_MC: 3448 if ((wirelessmode == WIRELESS_MODE_B) 3449 || (wirelessmode == WIRELESS_MODE_G) 3450 || (wirelessmode == WIRELESS_MODE_N_24G) 3451 || (wirelessmode == WIRELESS_MODE_AC_24G)) 3452 ret = 6; 3453 else 3454 ret = 7; 3455 case RATR_INX_WIRELESS_AC_5N: 3456 if (rtlphy->rf_type == RF_1T1R) 3457 ret = 10; 3458 else 3459 ret = 9; 3460 break; 3461 case RATR_INX_WIRELESS_AC_24N: 3462 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) { 3463 if (rtlphy->rf_type == RF_1T1R) 3464 ret = 10; 3465 else 3466 ret = 9; 3467 } else { 3468 if (rtlphy->rf_type == RF_1T1R) 3469 ret = 11; 3470 else 3471 ret = 12; 3472 } 3473 break; 3474 default: 3475 ret = 0; break; 3476 } 3477 return ret; 3478 } 3479 3480 static u32 _rtl8821ae_rate_to_bitmap_2ssvht(__le16 vht_rate) 3481 { 3482 u8 i, j, tmp_rate; 3483 u32 rate_bitmap = 0; 3484 3485 for (i = j = 0; i < 4; i += 2, j += 10) { 3486 tmp_rate = (le16_to_cpu(vht_rate) >> i) & 3; 3487 3488 switch (tmp_rate) { 3489 case 2: 3490 rate_bitmap = rate_bitmap | (0x03ff << j); 3491 break; 3492 case 1: 3493 rate_bitmap = rate_bitmap | (0x01ff << j); 3494 break; 3495 case 0: 3496 rate_bitmap = rate_bitmap | (0x00ff << j); 3497 break; 3498 default: 3499 break; 3500 } 3501 } 3502 3503 return rate_bitmap; 3504 } 3505 3506 static u32 _rtl8821ae_set_ra_vht_ratr_bitmap(struct ieee80211_hw *hw, 3507 enum wireless_mode wirelessmode, 3508 u32 ratr_bitmap) 3509 { 3510 struct rtl_priv *rtlpriv = rtl_priv(hw); 3511 struct rtl_phy *rtlphy = &rtlpriv->phy; 3512 u32 ret_bitmap = ratr_bitmap; 3513 3514 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40 3515 || rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) 3516 ret_bitmap = ratr_bitmap; 3517 else if (wirelessmode == WIRELESS_MODE_AC_5G 3518 || wirelessmode == WIRELESS_MODE_AC_24G) { 3519 if (rtlphy->rf_type == RF_1T1R) 3520 ret_bitmap = ratr_bitmap & (~BIT21); 3521 else 3522 ret_bitmap = ratr_bitmap & (~(BIT31|BIT21)); 3523 } 3524 3525 return ret_bitmap; 3526 } 3527 3528 static u8 _rtl8821ae_get_vht_eni(enum wireless_mode wirelessmode, 3529 u32 ratr_bitmap) 3530 { 3531 u8 ret = 0; 3532 if (wirelessmode < WIRELESS_MODE_N_24G) 3533 ret = 0; 3534 else if (wirelessmode == WIRELESS_MODE_AC_24G) { 3535 if (ratr_bitmap & 0xfff00000) /* Mix , 2SS */ 3536 ret = 3; 3537 else /* Mix, 1SS */ 3538 ret = 2; 3539 } else if (wirelessmode == WIRELESS_MODE_AC_5G) { 3540 ret = 1; 3541 } /* VHT */ 3542 3543 return ret << 4; 3544 } 3545 3546 static u8 _rtl8821ae_get_ra_ldpc(struct ieee80211_hw *hw, 3547 u8 mac_id, struct rtl_sta_info *sta_entry, 3548 enum wireless_mode wirelessmode) 3549 { 3550 u8 b_ldpc = 0; 3551 /*not support ldpc, do not open*/ 3552 return b_ldpc << 2; 3553 } 3554 3555 static u8 _rtl8821ae_get_ra_rftype(struct ieee80211_hw *hw, 3556 enum wireless_mode wirelessmode, 3557 u32 ratr_bitmap) 3558 { 3559 struct rtl_priv *rtlpriv = rtl_priv(hw); 3560 struct rtl_phy *rtlphy = &rtlpriv->phy; 3561 u8 rf_type = RF_1T1R; 3562 3563 if (rtlphy->rf_type == RF_1T1R) 3564 rf_type = RF_1T1R; 3565 else if (wirelessmode == WIRELESS_MODE_AC_5G 3566 || wirelessmode == WIRELESS_MODE_AC_24G 3567 || wirelessmode == WIRELESS_MODE_AC_ONLY) { 3568 if (ratr_bitmap & 0xffc00000) 3569 rf_type = RF_2T2R; 3570 } else if (wirelessmode == WIRELESS_MODE_N_5G 3571 || wirelessmode == WIRELESS_MODE_N_24G) { 3572 if (ratr_bitmap & 0xfff00000) 3573 rf_type = RF_2T2R; 3574 } 3575 3576 return rf_type; 3577 } 3578 3579 static bool _rtl8821ae_get_ra_shortgi(struct ieee80211_hw *hw, struct ieee80211_sta *sta, 3580 u8 mac_id) 3581 { 3582 bool b_short_gi = false; 3583 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? 3584 1 : 0; 3585 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? 3586 1 : 0; 3587 u8 b_curshortgi_80mhz = 0; 3588 b_curshortgi_80mhz = (sta->vht_cap.cap & 3589 IEEE80211_VHT_CAP_SHORT_GI_80) ? 1 : 0; 3590 3591 if (mac_id == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST) 3592 b_short_gi = false; 3593 3594 if (b_curshortgi_40mhz || b_curshortgi_80mhz 3595 || b_curshortgi_20mhz) 3596 b_short_gi = true; 3597 3598 return b_short_gi; 3599 } 3600 3601 static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw, 3602 struct ieee80211_sta *sta, u8 rssi_level, bool update_bw) 3603 { 3604 struct rtl_priv *rtlpriv = rtl_priv(hw); 3605 struct rtl_phy *rtlphy = &rtlpriv->phy; 3606 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 3607 struct rtl_sta_info *sta_entry = NULL; 3608 u32 ratr_bitmap; 3609 u8 ratr_index; 3610 enum wireless_mode wirelessmode = 0; 3611 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) 3612 ? 1 : 0; 3613 bool b_shortgi = false; 3614 u8 rate_mask[7]; 3615 u8 macid = 0; 3616 u8 mimo_ps = IEEE80211_SMPS_OFF; 3617 u8 rf_type; 3618 3619 sta_entry = (struct rtl_sta_info *)sta->drv_priv; 3620 wirelessmode = sta_entry->wireless_mode; 3621 3622 RT_TRACE(rtlpriv, COMP_RATR, DBG_LOUD, 3623 "wireless mode = 0x%x\n", wirelessmode); 3624 if (mac->opmode == NL80211_IFTYPE_STATION || 3625 mac->opmode == NL80211_IFTYPE_MESH_POINT) { 3626 curtxbw_40mhz = mac->bw_40; 3627 } else if (mac->opmode == NL80211_IFTYPE_AP || 3628 mac->opmode == NL80211_IFTYPE_ADHOC) 3629 macid = sta->aid + 1; 3630 if (wirelessmode == WIRELESS_MODE_N_5G || 3631 wirelessmode == WIRELESS_MODE_AC_5G || 3632 wirelessmode == WIRELESS_MODE_A) 3633 ratr_bitmap = sta->supp_rates[NL80211_BAND_5GHZ] << 4; 3634 else 3635 ratr_bitmap = sta->supp_rates[NL80211_BAND_2GHZ]; 3636 3637 if (mac->opmode == NL80211_IFTYPE_ADHOC) 3638 ratr_bitmap = 0xfff; 3639 3640 if (wirelessmode == WIRELESS_MODE_N_24G 3641 || wirelessmode == WIRELESS_MODE_N_5G) 3642 ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 | 3643 sta->ht_cap.mcs.rx_mask[0] << 12); 3644 else if (wirelessmode == WIRELESS_MODE_AC_24G 3645 || wirelessmode == WIRELESS_MODE_AC_5G 3646 || wirelessmode == WIRELESS_MODE_AC_ONLY) 3647 ratr_bitmap |= _rtl8821ae_rate_to_bitmap_2ssvht( 3648 sta->vht_cap.vht_mcs.rx_mcs_map) << 12; 3649 3650 b_shortgi = _rtl8821ae_get_ra_shortgi(hw, sta, macid); 3651 rf_type = _rtl8821ae_get_ra_rftype(hw, wirelessmode, ratr_bitmap); 3652 3653 /*mac id owner*/ 3654 switch (wirelessmode) { 3655 case WIRELESS_MODE_B: 3656 ratr_index = RATR_INX_WIRELESS_B; 3657 if (ratr_bitmap & 0x0000000c) 3658 ratr_bitmap &= 0x0000000d; 3659 else 3660 ratr_bitmap &= 0x0000000f; 3661 break; 3662 case WIRELESS_MODE_G: 3663 ratr_index = RATR_INX_WIRELESS_GB; 3664 3665 if (rssi_level == 1) 3666 ratr_bitmap &= 0x00000f00; 3667 else if (rssi_level == 2) 3668 ratr_bitmap &= 0x00000ff0; 3669 else 3670 ratr_bitmap &= 0x00000ff5; 3671 break; 3672 case WIRELESS_MODE_A: 3673 ratr_index = RATR_INX_WIRELESS_G; 3674 ratr_bitmap &= 0x00000ff0; 3675 break; 3676 case WIRELESS_MODE_N_24G: 3677 case WIRELESS_MODE_N_5G: 3678 if (wirelessmode == WIRELESS_MODE_N_24G) 3679 ratr_index = RATR_INX_WIRELESS_NGB; 3680 else 3681 ratr_index = RATR_INX_WIRELESS_NG; 3682 3683 if (mimo_ps == IEEE80211_SMPS_STATIC 3684 || mimo_ps == IEEE80211_SMPS_DYNAMIC) { 3685 if (rssi_level == 1) 3686 ratr_bitmap &= 0x000f0000; 3687 else if (rssi_level == 2) 3688 ratr_bitmap &= 0x000ff000; 3689 else 3690 ratr_bitmap &= 0x000ff005; 3691 } else { 3692 if (rf_type == RF_1T1R) { 3693 if (curtxbw_40mhz) { 3694 if (rssi_level == 1) 3695 ratr_bitmap &= 0x000f0000; 3696 else if (rssi_level == 2) 3697 ratr_bitmap &= 0x000ff000; 3698 else 3699 ratr_bitmap &= 0x000ff015; 3700 } else { 3701 if (rssi_level == 1) 3702 ratr_bitmap &= 0x000f0000; 3703 else if (rssi_level == 2) 3704 ratr_bitmap &= 0x000ff000; 3705 else 3706 ratr_bitmap &= 0x000ff005; 3707 } 3708 } else { 3709 if (curtxbw_40mhz) { 3710 if (rssi_level == 1) 3711 ratr_bitmap &= 0x0fff0000; 3712 else if (rssi_level == 2) 3713 ratr_bitmap &= 0x0ffff000; 3714 else 3715 ratr_bitmap &= 0x0ffff015; 3716 } else { 3717 if (rssi_level == 1) 3718 ratr_bitmap &= 0x0fff0000; 3719 else if (rssi_level == 2) 3720 ratr_bitmap &= 0x0ffff000; 3721 else 3722 ratr_bitmap &= 0x0ffff005; 3723 } 3724 } 3725 } 3726 break; 3727 3728 case WIRELESS_MODE_AC_24G: 3729 ratr_index = RATR_INX_WIRELESS_AC_24N; 3730 if (rssi_level == 1) 3731 ratr_bitmap &= 0xfc3f0000; 3732 else if (rssi_level == 2) 3733 ratr_bitmap &= 0xfffff000; 3734 else 3735 ratr_bitmap &= 0xffffffff; 3736 break; 3737 3738 case WIRELESS_MODE_AC_5G: 3739 ratr_index = RATR_INX_WIRELESS_AC_5N; 3740 3741 if (rf_type == RF_1T1R) { 3742 if (rssi_level == 1) /*add by Gary for ac-series*/ 3743 ratr_bitmap &= 0x003f8000; 3744 else if (rssi_level == 2) 3745 ratr_bitmap &= 0x003ff000; 3746 else 3747 ratr_bitmap &= 0x003ff010; 3748 } else { 3749 if (rssi_level == 1) 3750 ratr_bitmap &= 0xfe3f8000; 3751 else if (rssi_level == 2) 3752 ratr_bitmap &= 0xfffff000; 3753 else 3754 ratr_bitmap &= 0xfffff010; 3755 } 3756 break; 3757 3758 default: 3759 ratr_index = RATR_INX_WIRELESS_NGB; 3760 3761 if (rf_type == RF_1T2R) 3762 ratr_bitmap &= 0x000ff0ff; 3763 else 3764 ratr_bitmap &= 0x0f8ff0ff; 3765 break; 3766 } 3767 3768 ratr_index = _rtl8821ae_mrate_idx_to_arfr_id(hw, ratr_index, wirelessmode); 3769 sta_entry->ratr_index = ratr_index; 3770 ratr_bitmap = _rtl8821ae_set_ra_vht_ratr_bitmap(hw, wirelessmode, 3771 ratr_bitmap); 3772 3773 RT_TRACE(rtlpriv, COMP_RATR, DBG_LOUD, 3774 "ratr_bitmap :%x\n", ratr_bitmap); 3775 3776 /* *(u32 *)& rate_mask = EF4BYTE((ratr_bitmap & 0x0fffffff) | 3777 (ratr_index << 28)); */ 3778 3779 rate_mask[0] = macid; 3780 rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00); 3781 rate_mask[2] = rtlphy->current_chan_bw | ((!update_bw) << 3) 3782 | _rtl8821ae_get_vht_eni(wirelessmode, ratr_bitmap) 3783 | _rtl8821ae_get_ra_ldpc(hw, macid, sta_entry, wirelessmode); 3784 3785 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff); 3786 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8); 3787 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16); 3788 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24); 3789 3790 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, 3791 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n", 3792 ratr_index, ratr_bitmap, 3793 rate_mask[0], rate_mask[1], 3794 rate_mask[2], rate_mask[3], 3795 rate_mask[4], rate_mask[5], 3796 rate_mask[6]); 3797 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RA_MASK, 7, rate_mask); 3798 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0); 3799 } 3800 3801 void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw, 3802 struct ieee80211_sta *sta, u8 rssi_level, bool update_bw) 3803 { 3804 struct rtl_priv *rtlpriv = rtl_priv(hw); 3805 if (rtlpriv->dm.useramask) 3806 rtl8821ae_update_hal_rate_mask(hw, sta, rssi_level, update_bw); 3807 else 3808 /*RT_TRACE(rtlpriv, COMP_RATR,DBG_LOUD, 3809 "rtl8821ae_update_hal_rate_tbl() Error! 8821ae FW RA Only\n");*/ 3810 rtl8821ae_update_hal_rate_table(hw, sta); 3811 } 3812 3813 void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw) 3814 { 3815 struct rtl_priv *rtlpriv = rtl_priv(hw); 3816 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 3817 u16 wireless_mode = mac->mode; 3818 u8 sifs_timer, r2t_sifs; 3819 3820 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, 3821 (u8 *)&mac->slot_time); 3822 if (wireless_mode == WIRELESS_MODE_G) 3823 sifs_timer = 0x0a; 3824 else 3825 sifs_timer = 0x0e; 3826 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer); 3827 3828 r2t_sifs = 0xa; 3829 3830 if (wireless_mode == WIRELESS_MODE_AC_5G && 3831 (mac->vht_ldpc_cap & LDPC_VHT_ENABLE_RX) && 3832 (mac->vht_stbc_cap & STBC_VHT_ENABLE_RX)) { 3833 if (mac->vendor == PEER_ATH) 3834 r2t_sifs = 0x8; 3835 else 3836 r2t_sifs = 0xa; 3837 } else if (wireless_mode == WIRELESS_MODE_AC_5G) { 3838 r2t_sifs = 0xa; 3839 } 3840 3841 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_R2T_SIFS, (u8 *)&r2t_sifs); 3842 } 3843 3844 bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid) 3845 { 3846 struct rtl_priv *rtlpriv = rtl_priv(hw); 3847 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 3848 struct rtl_phy *rtlphy = &rtlpriv->phy; 3849 enum rf_pwrstate e_rfpowerstate_toset; 3850 u8 u1tmp = 0; 3851 bool b_actuallyset = false; 3852 3853 if (rtlpriv->rtlhal.being_init_adapter) 3854 return false; 3855 3856 if (ppsc->swrf_processing) 3857 return false; 3858 3859 spin_lock(&rtlpriv->locks.rf_ps_lock); 3860 if (ppsc->rfchange_inprogress) { 3861 spin_unlock(&rtlpriv->locks.rf_ps_lock); 3862 return false; 3863 } else { 3864 ppsc->rfchange_inprogress = true; 3865 spin_unlock(&rtlpriv->locks.rf_ps_lock); 3866 } 3867 3868 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2, 3869 rtl_read_byte(rtlpriv, 3870 REG_GPIO_IO_SEL_2) & ~(BIT(1))); 3871 3872 u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2); 3873 3874 if (rtlphy->polarity_ctl) 3875 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON; 3876 else 3877 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF; 3878 3879 if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) { 3880 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 3881 "GPIOChangeRF - HW Radio ON, RF ON\n"); 3882 3883 e_rfpowerstate_toset = ERFON; 3884 ppsc->hwradiooff = false; 3885 b_actuallyset = true; 3886 } else if ((!ppsc->hwradiooff) 3887 && (e_rfpowerstate_toset == ERFOFF)) { 3888 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 3889 "GPIOChangeRF - HW Radio OFF, RF OFF\n"); 3890 3891 e_rfpowerstate_toset = ERFOFF; 3892 ppsc->hwradiooff = true; 3893 b_actuallyset = true; 3894 } 3895 3896 if (b_actuallyset) { 3897 spin_lock(&rtlpriv->locks.rf_ps_lock); 3898 ppsc->rfchange_inprogress = false; 3899 spin_unlock(&rtlpriv->locks.rf_ps_lock); 3900 } else { 3901 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) 3902 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 3903 3904 spin_lock(&rtlpriv->locks.rf_ps_lock); 3905 ppsc->rfchange_inprogress = false; 3906 spin_unlock(&rtlpriv->locks.rf_ps_lock); 3907 } 3908 3909 *valid = 1; 3910 return !ppsc->hwradiooff; 3911 } 3912 3913 void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index, 3914 u8 *p_macaddr, bool is_group, u8 enc_algo, 3915 bool is_wepkey, bool clear_all) 3916 { 3917 struct rtl_priv *rtlpriv = rtl_priv(hw); 3918 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 3919 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 3920 u8 *macaddr = p_macaddr; 3921 u32 entry_id = 0; 3922 bool is_pairwise = false; 3923 3924 static u8 cam_const_addr[4][6] = { 3925 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 3926 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 3927 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, 3928 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03} 3929 }; 3930 static u8 cam_const_broad[] = { 3931 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 3932 }; 3933 3934 if (clear_all) { 3935 u8 idx = 0; 3936 u8 cam_offset = 0; 3937 u8 clear_number = 5; 3938 3939 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n"); 3940 3941 for (idx = 0; idx < clear_number; idx++) { 3942 rtl_cam_mark_invalid(hw, cam_offset + idx); 3943 rtl_cam_empty_entry(hw, cam_offset + idx); 3944 3945 if (idx < 5) { 3946 memset(rtlpriv->sec.key_buf[idx], 0, 3947 MAX_KEY_LEN); 3948 rtlpriv->sec.key_len[idx] = 0; 3949 } 3950 } 3951 } else { 3952 switch (enc_algo) { 3953 case WEP40_ENCRYPTION: 3954 enc_algo = CAM_WEP40; 3955 break; 3956 case WEP104_ENCRYPTION: 3957 enc_algo = CAM_WEP104; 3958 break; 3959 case TKIP_ENCRYPTION: 3960 enc_algo = CAM_TKIP; 3961 break; 3962 case AESCCMP_ENCRYPTION: 3963 enc_algo = CAM_AES; 3964 break; 3965 default: 3966 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 3967 "switch case %#x not processed\n", enc_algo); 3968 enc_algo = CAM_TKIP; 3969 break; 3970 } 3971 3972 if (is_wepkey || rtlpriv->sec.use_defaultkey) { 3973 macaddr = cam_const_addr[key_index]; 3974 entry_id = key_index; 3975 } else { 3976 if (is_group) { 3977 macaddr = cam_const_broad; 3978 entry_id = key_index; 3979 } else { 3980 if (mac->opmode == NL80211_IFTYPE_AP) { 3981 entry_id = rtl_cam_get_free_entry(hw, p_macaddr); 3982 if (entry_id >= TOTAL_CAM_ENTRY) { 3983 pr_err("an not find free hwsecurity cam entry\n"); 3984 return; 3985 } 3986 } else { 3987 entry_id = CAM_PAIRWISE_KEY_POSITION; 3988 } 3989 3990 key_index = PAIRWISE_KEYIDX; 3991 is_pairwise = true; 3992 } 3993 } 3994 3995 if (rtlpriv->sec.key_len[key_index] == 0) { 3996 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 3997 "delete one entry, entry_id is %d\n", 3998 entry_id); 3999 if (mac->opmode == NL80211_IFTYPE_AP) 4000 rtl_cam_del_entry(hw, p_macaddr); 4001 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id); 4002 } else { 4003 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 4004 "add one entry\n"); 4005 if (is_pairwise) { 4006 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 4007 "set Pairwise key\n"); 4008 4009 rtl_cam_add_one_entry(hw, macaddr, key_index, 4010 entry_id, enc_algo, 4011 CAM_CONFIG_NO_USEDK, 4012 rtlpriv->sec.key_buf[key_index]); 4013 } else { 4014 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 4015 "set group key\n"); 4016 4017 if (mac->opmode == NL80211_IFTYPE_ADHOC) { 4018 rtl_cam_add_one_entry(hw, 4019 rtlefuse->dev_addr, 4020 PAIRWISE_KEYIDX, 4021 CAM_PAIRWISE_KEY_POSITION, 4022 enc_algo, 4023 CAM_CONFIG_NO_USEDK, 4024 rtlpriv->sec.key_buf 4025 [entry_id]); 4026 } 4027 4028 rtl_cam_add_one_entry(hw, macaddr, key_index, 4029 entry_id, enc_algo, 4030 CAM_CONFIG_NO_USEDK, 4031 rtlpriv->sec.key_buf[entry_id]); 4032 } 4033 } 4034 } 4035 } 4036 4037 void rtl8821ae_bt_reg_init(struct ieee80211_hw *hw) 4038 { 4039 struct rtl_priv *rtlpriv = rtl_priv(hw); 4040 4041 /* 0:Low, 1:High, 2:From Efuse. */ 4042 rtlpriv->btcoexist.reg_bt_iso = 2; 4043 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */ 4044 rtlpriv->btcoexist.reg_bt_sco = 3; 4045 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */ 4046 rtlpriv->btcoexist.reg_bt_sco = 0; 4047 } 4048 4049 void rtl8821ae_bt_hw_init(struct ieee80211_hw *hw) 4050 { 4051 struct rtl_priv *rtlpriv = rtl_priv(hw); 4052 4053 if (rtlpriv->cfg->ops->get_btc_status()) 4054 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv); 4055 } 4056 4057 void rtl8821ae_suspend(struct ieee80211_hw *hw) 4058 { 4059 } 4060 4061 void rtl8821ae_resume(struct ieee80211_hw *hw) 4062 { 4063 } 4064 4065 /* Turn on AAP (RCR:bit 0) for promicuous mode. */ 4066 void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw, 4067 bool allow_all_da, bool write_into_reg) 4068 { 4069 struct rtl_priv *rtlpriv = rtl_priv(hw); 4070 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 4071 4072 if (allow_all_da) /* Set BIT0 */ 4073 rtlpci->receive_config |= RCR_AAP; 4074 else /* Clear BIT0 */ 4075 rtlpci->receive_config &= ~RCR_AAP; 4076 4077 if (write_into_reg) 4078 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config); 4079 4080 RT_TRACE(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD, 4081 "receive_config=0x%08X, write_into_reg=%d\n", 4082 rtlpci->receive_config, write_into_reg); 4083 } 4084 4085 /* WKFMCAMAddAllEntry8812 */ 4086 void rtl8821ae_add_wowlan_pattern(struct ieee80211_hw *hw, 4087 struct rtl_wow_pattern *rtl_pattern, 4088 u8 index) 4089 { 4090 struct rtl_priv *rtlpriv = rtl_priv(hw); 4091 u32 cam = 0; 4092 u8 addr = 0; 4093 u16 rxbuf_addr; 4094 u8 tmp, count = 0; 4095 u16 cam_start; 4096 u16 offset; 4097 4098 /* Count the WFCAM entry start offset. */ 4099 4100 /* RX page size = 128 byte */ 4101 offset = MAX_RX_DMA_BUFFER_SIZE_8812 / 128; 4102 /* We should start from the boundry */ 4103 cam_start = offset * 128; 4104 4105 /* Enable Rx packet buffer access. */ 4106 rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT); 4107 for (addr = 0; addr < WKFMCAM_ADDR_NUM; addr++) { 4108 /* Set Rx packet buffer offset. 4109 * RxBufer pointer increases 1, 4110 * we can access 8 bytes in Rx packet buffer. 4111 * CAM start offset (unit: 1 byte) = index*WKFMCAM_SIZE 4112 * RxBufer addr = (CAM start offset + 4113 * per entry offset of a WKFM CAM)/8 4114 * * index: The index of the wake up frame mask 4115 * * WKFMCAM_SIZE: the total size of one WKFM CAM 4116 * * per entry offset of a WKFM CAM: Addr*4 bytes 4117 */ 4118 rxbuf_addr = (cam_start + index * WKFMCAM_SIZE + addr * 4) >> 3; 4119 /* Set R/W start offset */ 4120 rtl_write_word(rtlpriv, REG_PKTBUF_DBG_CTRL, rxbuf_addr); 4121 4122 if (addr == 0) { 4123 cam = BIT(31) | rtl_pattern->crc; 4124 4125 if (rtl_pattern->type == UNICAST_PATTERN) 4126 cam |= BIT(24); 4127 else if (rtl_pattern->type == MULTICAST_PATTERN) 4128 cam |= BIT(25); 4129 else if (rtl_pattern->type == BROADCAST_PATTERN) 4130 cam |= BIT(26); 4131 4132 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam); 4133 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, 4134 "WRITE entry[%d] 0x%x: %x\n", addr, 4135 REG_PKTBUF_DBG_DATA_L, cam); 4136 4137 /* Write to Rx packet buffer. */ 4138 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01); 4139 } else if (addr == 2 || addr == 4) {/* WKFM[127:0] */ 4140 cam = rtl_pattern->mask[addr - 2]; 4141 4142 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam); 4143 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, 4144 "WRITE entry[%d] 0x%x: %x\n", addr, 4145 REG_PKTBUF_DBG_DATA_L, cam); 4146 4147 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01); 4148 } else if (addr == 3 || addr == 5) {/* WKFM[127:0] */ 4149 cam = rtl_pattern->mask[addr - 2]; 4150 4151 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_H, cam); 4152 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, 4153 "WRITE entry[%d] 0x%x: %x\n", addr, 4154 REG_PKTBUF_DBG_DATA_H, cam); 4155 4156 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0xf001); 4157 } 4158 4159 count = 0; 4160 do { 4161 tmp = rtl_read_byte(rtlpriv, REG_RXPKTBUF_CTRL); 4162 udelay(2); 4163 count++; 4164 } while (tmp && count < 100); 4165 4166 WARN_ONCE((count >= 100), 4167 "rtl8821ae: Write wake up frame mask FAIL %d value!\n", 4168 tmp); 4169 } 4170 /* Disable Rx packet buffer access. */ 4171 rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL, 4172 DISABLE_TRXPKT_BUF_ACCESS); 4173 } 4174