hw.c (76203B)
1// SPDX-License-Identifier: GPL-2.0 2/* Copyright(c) 2009-2014 Realtek Corporation.*/ 3 4#include "../wifi.h" 5#include "../efuse.h" 6#include "../base.h" 7#include "../regd.h" 8#include "../cam.h" 9#include "../ps.h" 10#include "../pci.h" 11#include "reg.h" 12#include "def.h" 13#include "phy.h" 14#include "../rtl8723com/phy_common.h" 15#include "dm.h" 16#include "../rtl8723com/dm_common.h" 17#include "fw.h" 18#include "../rtl8723com/fw_common.h" 19#include "led.h" 20#include "hw.h" 21#include "../pwrseqcmd.h" 22#include "pwrseq.h" 23#include "../btcoexist/rtl_btc.h" 24#include <linux/kernel.h> 25 26#define LLT_CONFIG 5 27 28static void _rtl8723be_return_beacon_queue_skb(struct ieee80211_hw *hw) 29{ 30 struct rtl_priv *rtlpriv = rtl_priv(hw); 31 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 32 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; 33 unsigned long flags; 34 35 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 36 while (skb_queue_len(&ring->queue)) { 37 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; 38 struct sk_buff *skb = __skb_dequeue(&ring->queue); 39 40 dma_unmap_single(&rtlpci->pdev->dev, 41 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry, 42 true, HW_DESC_TXBUFF_ADDR), 43 skb->len, DMA_TO_DEVICE); 44 kfree_skb(skb); 45 ring->idx = (ring->idx + 1) % ring->entries; 46 } 47 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 48} 49 50static void _rtl8723be_set_bcn_ctrl_reg(struct ieee80211_hw *hw, 51 u8 set_bits, u8 clear_bits) 52{ 53 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 54 struct rtl_priv *rtlpriv = rtl_priv(hw); 55 56 rtlpci->reg_bcn_ctrl_val |= set_bits; 57 rtlpci->reg_bcn_ctrl_val &= ~clear_bits; 58 59 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val); 60} 61 62static void _rtl8723be_stop_tx_beacon(struct ieee80211_hw *hw) 63{ 64 struct rtl_priv *rtlpriv = rtl_priv(hw); 65 u8 tmp1byte; 66 67 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2); 68 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6))); 69 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64); 70 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2); 71 tmp1byte &= ~(BIT(0)); 72 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte); 73} 74 75static void _rtl8723be_resume_tx_beacon(struct ieee80211_hw *hw) 76{ 77 struct rtl_priv *rtlpriv = rtl_priv(hw); 78 u8 tmp1byte; 79 80 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2); 81 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6)); 82 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); 83 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2); 84 tmp1byte |= BIT(1); 85 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte); 86} 87 88static void _rtl8723be_enable_bcn_sub_func(struct ieee80211_hw *hw) 89{ 90 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(1)); 91} 92 93static void _rtl8723be_disable_bcn_sub_func(struct ieee80211_hw *hw) 94{ 95 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(1), 0); 96} 97 98static void _rtl8723be_set_fw_clock_on(struct ieee80211_hw *hw, u8 rpwm_val, 99 bool b_need_turn_off_ckk) 100{ 101 struct rtl_priv *rtlpriv = rtl_priv(hw); 102 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 103 bool b_support_remote_wake_up; 104 u32 count = 0, isr_regaddr, content; 105 bool b_schedule_timer = b_need_turn_off_ckk; 106 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN, 107 (u8 *)(&b_support_remote_wake_up)); 108 109 if (!rtlhal->fw_ready) 110 return; 111 if (!rtlpriv->psc.fw_current_inpsmode) 112 return; 113 114 while (1) { 115 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 116 if (rtlhal->fw_clk_change_in_progress) { 117 while (rtlhal->fw_clk_change_in_progress) { 118 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 119 count++; 120 udelay(100); 121 if (count > 1000) 122 return; 123 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 124 } 125 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 126 } else { 127 rtlhal->fw_clk_change_in_progress = false; 128 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 129 break; 130 } 131 } 132 133 if (IS_IN_LOW_POWER_STATE(rtlhal->fw_ps_state)) { 134 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM, 135 (u8 *)(&rpwm_val)); 136 if (FW_PS_IS_ACK(rpwm_val)) { 137 isr_regaddr = REG_HISR; 138 content = rtl_read_dword(rtlpriv, isr_regaddr); 139 while (!(content & IMR_CPWM) && (count < 500)) { 140 udelay(50); 141 count++; 142 content = rtl_read_dword(rtlpriv, isr_regaddr); 143 } 144 145 if (content & IMR_CPWM) { 146 rtl_write_word(rtlpriv, isr_regaddr, 0x0100); 147 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON; 148 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 149 "Receive CPWM INT!!! Set pHalData->FwPSState = %X\n", 150 rtlhal->fw_ps_state); 151 } 152 } 153 154 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 155 rtlhal->fw_clk_change_in_progress = false; 156 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 157 if (b_schedule_timer) 158 mod_timer(&rtlpriv->works.fw_clockoff_timer, 159 jiffies + MSECS(10)); 160 } else { 161 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 162 rtlhal->fw_clk_change_in_progress = false; 163 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 164 } 165} 166 167static void _rtl8723be_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val) 168{ 169 struct rtl_priv *rtlpriv = rtl_priv(hw); 170 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 171 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 172 struct rtl8192_tx_ring *ring; 173 enum rf_pwrstate rtstate; 174 bool b_schedule_timer = false; 175 u8 queue; 176 177 if (!rtlhal->fw_ready) 178 return; 179 if (!rtlpriv->psc.fw_current_inpsmode) 180 return; 181 if (!rtlhal->allow_sw_to_change_hwclc) 182 return; 183 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate)); 184 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF) 185 return; 186 187 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) { 188 ring = &rtlpci->tx_ring[queue]; 189 if (skb_queue_len(&ring->queue)) { 190 b_schedule_timer = true; 191 break; 192 } 193 } 194 195 if (b_schedule_timer) { 196 mod_timer(&rtlpriv->works.fw_clockoff_timer, 197 jiffies + MSECS(10)); 198 return; 199 } 200 201 if (FW_PS_STATE(rtlhal->fw_ps_state) != FW_PS_STATE_RF_OFF_LOW_PWR) { 202 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 203 if (!rtlhal->fw_clk_change_in_progress) { 204 rtlhal->fw_clk_change_in_progress = true; 205 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 206 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val); 207 rtl_write_word(rtlpriv, REG_HISR, 0x0100); 208 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, 209 (u8 *)(&rpwm_val)); 210 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 211 rtlhal->fw_clk_change_in_progress = false; 212 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 213 } else { 214 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 215 mod_timer(&rtlpriv->works.fw_clockoff_timer, 216 jiffies + MSECS(10)); 217 } 218 } 219 220} 221 222static void _rtl8723be_set_fw_ps_rf_on(struct ieee80211_hw *hw) 223{ 224 u8 rpwm_val = 0; 225 rpwm_val |= (FW_PS_STATE_RF_OFF | FW_PS_ACK); 226 _rtl8723be_set_fw_clock_on(hw, rpwm_val, true); 227} 228 229static void _rtl8723be_fwlps_leave(struct ieee80211_hw *hw) 230{ 231 struct rtl_priv *rtlpriv = rtl_priv(hw); 232 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 233 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 234 bool fw_current_inps = false; 235 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE; 236 237 if (ppsc->low_power_enable) { 238 rpwm_val = (FW_PS_STATE_ALL_ON | FW_PS_ACK);/* RF on */ 239 _rtl8723be_set_fw_clock_on(hw, rpwm_val, false); 240 rtlhal->allow_sw_to_change_hwclc = false; 241 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 242 (u8 *)(&fw_pwrmode)); 243 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 244 (u8 *)(&fw_current_inps)); 245 } else { 246 rpwm_val = FW_PS_STATE_ALL_ON; /* RF on */ 247 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, 248 (u8 *)(&rpwm_val)); 249 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 250 (u8 *)(&fw_pwrmode)); 251 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 252 (u8 *)(&fw_current_inps)); 253 } 254 255} 256 257static void _rtl8723be_fwlps_enter(struct ieee80211_hw *hw) 258{ 259 struct rtl_priv *rtlpriv = rtl_priv(hw); 260 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 261 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 262 bool fw_current_inps = true; 263 u8 rpwm_val; 264 265 if (ppsc->low_power_enable) { 266 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR; /* RF off */ 267 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 268 (u8 *)(&fw_current_inps)); 269 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 270 (u8 *)(&ppsc->fwctrl_psmode)); 271 rtlhal->allow_sw_to_change_hwclc = true; 272 _rtl8723be_set_fw_clock_off(hw, rpwm_val); 273 } else { 274 rpwm_val = FW_PS_STATE_RF_OFF; /* RF off */ 275 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 276 (u8 *)(&fw_current_inps)); 277 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 278 (u8 *)(&ppsc->fwctrl_psmode)); 279 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, 280 (u8 *)(&rpwm_val)); 281 } 282 283} 284 285void rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) 286{ 287 struct rtl_priv *rtlpriv = rtl_priv(hw); 288 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 289 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 290 291 switch (variable) { 292 case HW_VAR_RCR: 293 *((u32 *)(val)) = rtlpci->receive_config; 294 break; 295 case HW_VAR_RF_STATE: 296 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state; 297 break; 298 case HW_VAR_FWLPS_RF_ON:{ 299 enum rf_pwrstate rfstate; 300 u32 val_rcr; 301 302 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, 303 (u8 *)(&rfstate)); 304 if (rfstate == ERFOFF) { 305 *((bool *)(val)) = true; 306 } else { 307 val_rcr = rtl_read_dword(rtlpriv, REG_RCR); 308 val_rcr &= 0x00070000; 309 if (val_rcr) 310 *((bool *)(val)) = false; 311 else 312 *((bool *)(val)) = true; 313 } 314 } 315 break; 316 case HW_VAR_FW_PSMODE_STATUS: 317 *((bool *)(val)) = ppsc->fw_current_inpsmode; 318 break; 319 case HW_VAR_CORRECT_TSF:{ 320 u64 tsf; 321 u32 *ptsf_low = (u32 *)&tsf; 322 u32 *ptsf_high = ((u32 *)&tsf) + 1; 323 324 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4)); 325 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR); 326 327 *((u64 *)(val)) = tsf; 328 } 329 break; 330 case HAL_DEF_WOWLAN: 331 break; 332 default: 333 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 334 "switch case %#x not processed\n", variable); 335 break; 336 } 337} 338 339static void _rtl8723be_download_rsvd_page(struct ieee80211_hw *hw) 340{ 341 struct rtl_priv *rtlpriv = rtl_priv(hw); 342 u8 tmp_regcr, tmp_reg422, bcnvalid_reg; 343 u8 count = 0, dlbcn_count = 0; 344 bool b_recover = false; 345 346 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1); 347 rtl_write_byte(rtlpriv, REG_CR + 1, 348 (tmp_regcr | BIT(0))); 349 350 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3)); 351 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0); 352 353 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2); 354 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422 & (~BIT(6))); 355 if (tmp_reg422 & BIT(6)) 356 b_recover = true; 357 358 do { 359 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2); 360 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, 361 (bcnvalid_reg | BIT(0))); 362 _rtl8723be_return_beacon_queue_skb(hw); 363 364 rtl8723be_set_fw_rsvdpagepkt(hw, 0); 365 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2); 366 count = 0; 367 while (!(bcnvalid_reg & BIT(0)) && count < 20) { 368 count++; 369 udelay(10); 370 bcnvalid_reg = rtl_read_byte(rtlpriv, 371 REG_TDECTRL + 2); 372 } 373 dlbcn_count++; 374 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5); 375 376 if (bcnvalid_reg & BIT(0)) 377 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0)); 378 379 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0); 380 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4)); 381 382 if (b_recover) 383 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422); 384 385 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1); 386 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0)))); 387} 388 389void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) 390{ 391 struct rtl_priv *rtlpriv = rtl_priv(hw); 392 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 393 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 394 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 395 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 396 u8 idx; 397 398 switch (variable) { 399 case HW_VAR_ETHER_ADDR: 400 for (idx = 0; idx < ETH_ALEN; idx++) 401 rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]); 402 break; 403 case HW_VAR_BASIC_RATE:{ 404 u16 b_rate_cfg = ((u16 *)val)[0]; 405 u8 rate_index = 0; 406 b_rate_cfg = b_rate_cfg & 0x15f; 407 b_rate_cfg |= 0x01; 408 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff); 409 rtl_write_byte(rtlpriv, REG_RRSR + 1, (b_rate_cfg >> 8) & 0xff); 410 while (b_rate_cfg > 0x1) { 411 b_rate_cfg = (b_rate_cfg >> 1); 412 rate_index++; 413 } 414 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, rate_index); 415 } 416 break; 417 case HW_VAR_BSSID: 418 for (idx = 0; idx < ETH_ALEN; idx++) 419 rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]); 420 421 break; 422 case HW_VAR_SIFS: 423 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]); 424 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]); 425 426 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]); 427 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]); 428 429 if (!mac->ht_enable) 430 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 0x0e0e); 431 else 432 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 433 *((u16 *)val)); 434 break; 435 case HW_VAR_SLOT_TIME:{ 436 u8 e_aci; 437 438 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD, 439 "HW_VAR_SLOT_TIME %x\n", val[0]); 440 441 rtl_write_byte(rtlpriv, REG_SLOT, val[0]); 442 443 for (e_aci = 0; e_aci < AC_MAX; e_aci++) { 444 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, 445 (u8 *)(&e_aci)); 446 } 447 } 448 break; 449 case HW_VAR_ACK_PREAMBLE:{ 450 u8 reg_tmp; 451 u8 short_preamble = (bool)(*(u8 *)val); 452 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL + 2); 453 if (short_preamble) { 454 reg_tmp |= 0x02; 455 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp); 456 } else { 457 reg_tmp &= 0xFD; 458 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp); 459 } 460 } 461 break; 462 case HW_VAR_WPA_CONFIG: 463 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val)); 464 break; 465 case HW_VAR_AMPDU_MIN_SPACE:{ 466 u8 min_spacing_to_set; 467 u8 sec_min_space; 468 469 min_spacing_to_set = *((u8 *)val); 470 if (min_spacing_to_set <= 7) { 471 sec_min_space = 0; 472 473 if (min_spacing_to_set < sec_min_space) 474 min_spacing_to_set = sec_min_space; 475 476 mac->min_space_cfg = ((mac->min_space_cfg & 0xf8) | 477 min_spacing_to_set); 478 479 *val = min_spacing_to_set; 480 481 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD, 482 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", 483 mac->min_space_cfg); 484 485 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 486 mac->min_space_cfg); 487 } 488 } 489 break; 490 case HW_VAR_SHORTGI_DENSITY:{ 491 u8 density_to_set; 492 493 density_to_set = *((u8 *)val); 494 mac->min_space_cfg |= (density_to_set << 3); 495 496 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD, 497 "Set HW_VAR_SHORTGI_DENSITY: %#x\n", 498 mac->min_space_cfg); 499 500 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 501 mac->min_space_cfg); 502 } 503 break; 504 case HW_VAR_AMPDU_FACTOR:{ 505 u8 regtoset_normal[4] = {0x41, 0xa8, 0x72, 0xb9}; 506 u8 factor_toset; 507 u8 *p_regtoset = NULL; 508 u8 index = 0; 509 510 p_regtoset = regtoset_normal; 511 512 factor_toset = *((u8 *)val); 513 if (factor_toset <= 3) { 514 factor_toset = (1 << (factor_toset + 2)); 515 if (factor_toset > 0xf) 516 factor_toset = 0xf; 517 518 for (index = 0; index < 4; index++) { 519 if ((p_regtoset[index] & 0xf0) > 520 (factor_toset << 4)) 521 p_regtoset[index] = 522 (p_regtoset[index] & 0x0f) | 523 (factor_toset << 4); 524 525 if ((p_regtoset[index] & 0x0f) > factor_toset) 526 p_regtoset[index] = 527 (p_regtoset[index] & 0xf0) | 528 (factor_toset); 529 530 rtl_write_byte(rtlpriv, 531 (REG_AGGLEN_LMT + index), 532 p_regtoset[index]); 533 534 } 535 536 rtl_dbg(rtlpriv, COMP_MLME, DBG_LOUD, 537 "Set HW_VAR_AMPDU_FACTOR: %#x\n", 538 factor_toset); 539 } 540 } 541 break; 542 case HW_VAR_AC_PARAM:{ 543 u8 e_aci = *((u8 *)val); 544 rtl8723_dm_init_edca_turbo(hw); 545 546 if (rtlpci->acm_method != EACMWAY2_SW) 547 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL, 548 (u8 *)(&e_aci)); 549 } 550 break; 551 case HW_VAR_ACM_CTRL:{ 552 u8 e_aci = *((u8 *)val); 553 union aci_aifsn *p_aci_aifsn = 554 (union aci_aifsn *)(&(mac->ac[0].aifs)); 555 u8 acm = p_aci_aifsn->f.acm; 556 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL); 557 558 acm_ctrl = 559 acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1); 560 561 if (acm) { 562 switch (e_aci) { 563 case AC0_BE: 564 acm_ctrl |= ACMHW_BEQEN; 565 break; 566 case AC2_VI: 567 acm_ctrl |= ACMHW_VIQEN; 568 break; 569 case AC3_VO: 570 acm_ctrl |= ACMHW_VOQEN; 571 break; 572 default: 573 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 574 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n", 575 acm); 576 break; 577 } 578 } else { 579 switch (e_aci) { 580 case AC0_BE: 581 acm_ctrl &= (~ACMHW_BEQEN); 582 break; 583 case AC2_VI: 584 acm_ctrl &= (~ACMHW_VIQEN); 585 break; 586 case AC3_VO: 587 acm_ctrl &= (~ACMHW_VOQEN); 588 break; 589 default: 590 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 591 "switch case %#x not processed\n", 592 e_aci); 593 break; 594 } 595 } 596 597 rtl_dbg(rtlpriv, COMP_QOS, DBG_TRACE, 598 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n", 599 acm_ctrl); 600 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl); 601 } 602 break; 603 case HW_VAR_RCR: 604 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]); 605 rtlpci->receive_config = ((u32 *)(val))[0]; 606 break; 607 case HW_VAR_RETRY_LIMIT:{ 608 u8 retry_limit = ((u8 *)(val))[0]; 609 610 rtl_write_word(rtlpriv, REG_RL, 611 retry_limit << RETRY_LIMIT_SHORT_SHIFT | 612 retry_limit << RETRY_LIMIT_LONG_SHIFT); 613 } 614 break; 615 case HW_VAR_DUAL_TSF_RST: 616 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); 617 break; 618 case HW_VAR_EFUSE_BYTES: 619 rtlefuse->efuse_usedbytes = *((u16 *)val); 620 break; 621 case HW_VAR_EFUSE_USAGE: 622 rtlefuse->efuse_usedpercentage = *((u8 *)val); 623 break; 624 case HW_VAR_IO_CMD: 625 rtl8723be_phy_set_io_cmd(hw, (*(enum io_type *)val)); 626 break; 627 case HW_VAR_SET_RPWM:{ 628 u8 rpwm_val; 629 630 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM); 631 udelay(1); 632 633 if (rpwm_val & BIT(7)) { 634 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, (*(u8 *)val)); 635 } else { 636 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, 637 ((*(u8 *)val) | BIT(7))); 638 } 639 } 640 break; 641 case HW_VAR_H2C_FW_PWRMODE: 642 rtl8723be_set_fw_pwrmode_cmd(hw, (*(u8 *)val)); 643 break; 644 case HW_VAR_FW_PSMODE_STATUS: 645 ppsc->fw_current_inpsmode = *((bool *)val); 646 break; 647 case HW_VAR_RESUME_CLK_ON: 648 _rtl8723be_set_fw_ps_rf_on(hw); 649 break; 650 case HW_VAR_FW_LPS_ACTION:{ 651 bool b_enter_fwlps = *((bool *)val); 652 653 if (b_enter_fwlps) 654 _rtl8723be_fwlps_enter(hw); 655 else 656 _rtl8723be_fwlps_leave(hw); 657 } 658 break; 659 case HW_VAR_H2C_FW_JOINBSSRPT:{ 660 u8 mstatus = (*(u8 *)val); 661 662 if (mstatus == RT_MEDIA_CONNECT) { 663 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL); 664 _rtl8723be_download_rsvd_page(hw); 665 } 666 rtl8723be_set_fw_media_status_rpt_cmd(hw, mstatus); 667 } 668 break; 669 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: 670 rtl8723be_set_p2p_ps_offload_cmd(hw, (*(u8 *)val)); 671 break; 672 case HW_VAR_AID:{ 673 u16 u2btmp; 674 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT); 675 u2btmp &= 0xC000; 676 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, 677 (u2btmp | mac->assoc_id)); 678 } 679 break; 680 case HW_VAR_CORRECT_TSF:{ 681 u8 btype_ibss = ((u8 *)(val))[0]; 682 683 if (btype_ibss) 684 _rtl8723be_stop_tx_beacon(hw); 685 686 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3)); 687 688 rtl_write_dword(rtlpriv, REG_TSFTR, 689 (u32) (mac->tsf & 0xffffffff)); 690 rtl_write_dword(rtlpriv, REG_TSFTR + 4, 691 (u32) ((mac->tsf >> 32) & 0xffffffff)); 692 693 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0); 694 695 if (btype_ibss) 696 _rtl8723be_resume_tx_beacon(hw); 697 } 698 break; 699 case HW_VAR_KEEP_ALIVE:{ 700 u8 array[2]; 701 array[0] = 0xff; 702 array[1] = *((u8 *)val); 703 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_KEEP_ALIVE_CTRL, 2, array); 704 } 705 break; 706 default: 707 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 708 "switch case %#x not processed\n", variable); 709 break; 710 } 711} 712 713static bool _rtl8723be_llt_write(struct ieee80211_hw *hw, u32 address, u32 data) 714{ 715 struct rtl_priv *rtlpriv = rtl_priv(hw); 716 bool status = true; 717 long count = 0; 718 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | 719 _LLT_OP(_LLT_WRITE_ACCESS); 720 721 rtl_write_dword(rtlpriv, REG_LLT_INIT, value); 722 723 do { 724 value = rtl_read_dword(rtlpriv, REG_LLT_INIT); 725 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)) 726 break; 727 728 if (count > POLLING_LLT_THRESHOLD) { 729 pr_err("Failed to polling write LLT done at address %d!\n", 730 address); 731 status = false; 732 break; 733 } 734 } while (++count); 735 736 return status; 737} 738 739static bool _rtl8723be_llt_table_init(struct ieee80211_hw *hw) 740{ 741 struct rtl_priv *rtlpriv = rtl_priv(hw); 742 unsigned short i; 743 u8 txpktbuf_bndy; 744 u8 maxpage; 745 bool status; 746 747 maxpage = 255; 748 txpktbuf_bndy = 245; 749 750 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY, 751 (0x27FF0000 | txpktbuf_bndy)); 752 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy); 753 754 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy); 755 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy); 756 757 rtl_write_byte(rtlpriv, 0x45D, txpktbuf_bndy); 758 rtl_write_byte(rtlpriv, REG_PBP, 0x31); 759 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4); 760 761 for (i = 0; i < (txpktbuf_bndy - 1); i++) { 762 status = _rtl8723be_llt_write(hw, i, i + 1); 763 if (!status) 764 return status; 765 } 766 767 status = _rtl8723be_llt_write(hw, (txpktbuf_bndy - 1), 0xFF); 768 769 if (!status) 770 return status; 771 772 for (i = txpktbuf_bndy; i < maxpage; i++) { 773 status = _rtl8723be_llt_write(hw, i, (i + 1)); 774 if (!status) 775 return status; 776 } 777 778 status = _rtl8723be_llt_write(hw, maxpage, txpktbuf_bndy); 779 if (!status) 780 return status; 781 782 rtl_write_dword(rtlpriv, REG_RQPN, 0x80e40808); 783 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00); 784 785 return true; 786} 787 788static void _rtl8723be_gen_refresh_led_state(struct ieee80211_hw *hw) 789{ 790 struct rtl_priv *rtlpriv = rtl_priv(hw); 791 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 792 struct rtl_led *pled0 = &rtlpriv->ledctl.sw_led0; 793 794 if (rtlpriv->rtlhal.up_first_time) 795 return; 796 797 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) 798 rtl8723be_sw_led_on(hw, pled0); 799 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT) 800 rtl8723be_sw_led_on(hw, pled0); 801 else 802 rtl8723be_sw_led_off(hw, pled0); 803} 804 805static bool _rtl8723be_init_mac(struct ieee80211_hw *hw) 806{ 807 struct rtl_priv *rtlpriv = rtl_priv(hw); 808 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 809 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 810 unsigned char bytetmp; 811 unsigned short wordtmp; 812 813 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00); 814 815 /*Auto Power Down to CHIP-off State*/ 816 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7)); 817 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp); 818 819 /* HW Power on sequence */ 820 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, 821 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, 822 RTL8723_NIC_ENABLE_FLOW)) { 823 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 824 "init MAC Fail as power on failure\n"); 825 return false; 826 } 827 828 if (rtlpriv->cfg->ops->get_btc_status()) 829 rtlpriv->btcoexist.btc_ops->btc_power_on_setting(rtlpriv); 830 831 bytetmp = rtl_read_byte(rtlpriv, REG_MULTI_FUNC_CTRL); 832 rtl_write_byte(rtlpriv, REG_MULTI_FUNC_CTRL, bytetmp | BIT(3)); 833 834 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4); 835 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp); 836 837 bytetmp = rtl_read_byte(rtlpriv, REG_CR); 838 bytetmp = 0xff; 839 rtl_write_byte(rtlpriv, REG_CR, bytetmp); 840 mdelay(2); 841 842 bytetmp = rtl_read_byte(rtlpriv, REG_HWSEQ_CTRL); 843 bytetmp |= 0x7f; 844 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp); 845 mdelay(2); 846 847 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3); 848 if (bytetmp & BIT(0)) { 849 bytetmp = rtl_read_byte(rtlpriv, 0x7c); 850 rtl_write_byte(rtlpriv, 0x7c, bytetmp | BIT(6)); 851 } 852 853 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR); 854 rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp | BIT(3)); 855 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1); 856 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp & (~BIT(4))); 857 858 rtl_write_word(rtlpriv, REG_CR, 0x2ff); 859 860 if (!rtlhal->mac_func_enable) { 861 if (!_rtl8723be_llt_table_init(hw)) 862 return false; 863 } 864 865 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff); 866 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff); 867 868 /* Enable FW Beamformer Interrupt */ 869 bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3); 870 rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6)); 871 872 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL); 873 wordtmp &= 0xf; 874 wordtmp |= 0xF5B1; 875 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp); 876 877 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F); 878 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config); 879 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF); 880 rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config); 881 882 rtl_write_dword(rtlpriv, REG_BCNQ_DESA, 883 ((u64) rtlpci->tx_ring[BEACON_QUEUE].dma) & 884 DMA_BIT_MASK(32)); 885 rtl_write_dword(rtlpriv, REG_MGQ_DESA, 886 (u64) rtlpci->tx_ring[MGNT_QUEUE].dma & 887 DMA_BIT_MASK(32)); 888 rtl_write_dword(rtlpriv, REG_VOQ_DESA, 889 (u64) rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32)); 890 rtl_write_dword(rtlpriv, REG_VIQ_DESA, 891 (u64) rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32)); 892 rtl_write_dword(rtlpriv, REG_BEQ_DESA, 893 (u64) rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32)); 894 rtl_write_dword(rtlpriv, REG_BKQ_DESA, 895 (u64) rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32)); 896 rtl_write_dword(rtlpriv, REG_HQ_DESA, 897 (u64) rtlpci->tx_ring[HIGH_QUEUE].dma & 898 DMA_BIT_MASK(32)); 899 rtl_write_dword(rtlpriv, REG_RX_DESA, 900 (u64) rtlpci->rx_ring[RX_MPDU_QUEUE].dma & 901 DMA_BIT_MASK(32)); 902 903 bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 3); 904 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, bytetmp | 0x77); 905 906 rtl_write_dword(rtlpriv, REG_INT_MIG, 0); 907 908 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0); 909 910 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3); 911 912 /* <20130114, Kordan> The following setting is 913 * only for DPDT and Fixed board type. 914 * TODO: A better solution is configure it 915 * according EFUSE during the run-time. 916 */ 917 rtl_set_bbreg(hw, 0x64, BIT(20), 0x0);/* 0x66[4]=0 */ 918 rtl_set_bbreg(hw, 0x64, BIT(24), 0x0);/* 0x66[8]=0 */ 919 rtl_set_bbreg(hw, 0x40, BIT(4), 0x0)/* 0x40[4]=0 */; 920 rtl_set_bbreg(hw, 0x40, BIT(3), 0x1)/* 0x40[3]=1 */; 921 rtl_set_bbreg(hw, 0x4C, BIT(24) | BIT(23), 0x2)/* 0x4C[24:23]=10 */; 922 rtl_set_bbreg(hw, 0x944, BIT(1) | BIT(0), 0x3)/* 0x944[1:0]=11 */; 923 rtl_set_bbreg(hw, 0x930, MASKBYTE0, 0x77)/* 0x930[7:0]=77 */; 924 rtl_set_bbreg(hw, 0x38, BIT(11), 0x1)/* 0x38[11]=1 */; 925 926 bytetmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 927 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, bytetmp & (~BIT(2))); 928 929 _rtl8723be_gen_refresh_led_state(hw); 930 return true; 931} 932 933static void _rtl8723be_hw_configure(struct ieee80211_hw *hw) 934{ 935 struct rtl_priv *rtlpriv = rtl_priv(hw); 936 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 937 u32 reg_rrsr; 938 939 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG; 940 /* Init value for RRSR. */ 941 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr); 942 943 /* ARFB table 9 for 11ac 5G 2SS */ 944 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000); 945 946 /* ARFB table 10 for 11ac 5G 1SS */ 947 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000); 948 949 /* CF-End setting. */ 950 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00); 951 952 /* 0x456 = 0x70, sugguested by Zhilin */ 953 rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70); 954 955 /* Set retry limit */ 956 rtl_write_word(rtlpriv, REG_RL, 0x0707); 957 958 /* Set Data / Response auto rate fallack retry count */ 959 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000); 960 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504); 961 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000); 962 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504); 963 964 rtlpci->reg_bcn_ctrl_val = 0x1d; 965 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val); 966 967 /* TBTT prohibit hold time. Suggested by designer TimChen. */ 968 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); /* 8 ms */ 969 970 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040); 971 972 /*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/ 973 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666); 974 975 rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80); 976 977 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20); 978 979 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x1F); 980} 981 982static u8 _rtl8723be_dbi_read(struct rtl_priv *rtlpriv, u16 addr) 983{ 984 u16 read_addr = addr & 0xfffc; 985 u8 ret = 0, tmp = 0, count = 0; 986 987 rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr); 988 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2); 989 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG); 990 count = 0; 991 while (tmp && count < 20) { 992 udelay(10); 993 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG); 994 count++; 995 } 996 if (0 == tmp) { 997 read_addr = REG_DBI_RDATA + addr % 4; 998 ret = rtl_read_byte(rtlpriv, read_addr); 999 } 1000 1001 return ret; 1002} 1003 1004static void _rtl8723be_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data) 1005{ 1006 u8 tmp = 0, count = 0; 1007 u16 write_addr = 0, remainder = addr % 4; 1008 1009 /* Write DBI 1Byte Data */ 1010 write_addr = REG_DBI_WDATA + remainder; 1011 rtl_write_byte(rtlpriv, write_addr, data); 1012 1013 /* Write DBI 2Byte Address & Write Enable */ 1014 write_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12)); 1015 rtl_write_word(rtlpriv, REG_DBI_ADDR, write_addr); 1016 1017 /* Write DBI Write Flag */ 1018 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1); 1019 1020 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG); 1021 count = 0; 1022 while (tmp && count < 20) { 1023 udelay(10); 1024 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG); 1025 count++; 1026 } 1027} 1028 1029static u16 _rtl8723be_mdio_read(struct rtl_priv *rtlpriv, u8 addr) 1030{ 1031 u16 ret = 0; 1032 u8 tmp = 0, count = 0; 1033 1034 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6)); 1035 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6); 1036 count = 0; 1037 while (tmp && count < 20) { 1038 udelay(10); 1039 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6); 1040 count++; 1041 } 1042 1043 if (0 == tmp) 1044 ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA); 1045 1046 return ret; 1047} 1048 1049static void _rtl8723be_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data) 1050{ 1051 u8 tmp = 0, count = 0; 1052 1053 rtl_write_word(rtlpriv, REG_MDIO_WDATA, data); 1054 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5)); 1055 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5); 1056 count = 0; 1057 while (tmp && count < 20) { 1058 udelay(10); 1059 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5); 1060 count++; 1061 } 1062} 1063 1064static void _rtl8723be_enable_aspm_back_door(struct ieee80211_hw *hw) 1065{ 1066 struct rtl_priv *rtlpriv = rtl_priv(hw); 1067 u8 tmp8 = 0; 1068 u16 tmp16 = 0; 1069 1070 /* <Roger_Notes> Overwrite following ePHY parameter for 1071 * some platform compatibility issue, 1072 * especially when CLKReq is enabled, 2012.11.09. 1073 */ 1074 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x01); 1075 if (tmp16 != 0x0663) 1076 _rtl8723be_mdio_write(rtlpriv, 0x01, 0x0663); 1077 1078 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x04); 1079 if (tmp16 != 0x7544) 1080 _rtl8723be_mdio_write(rtlpriv, 0x04, 0x7544); 1081 1082 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x06); 1083 if (tmp16 != 0xB880) 1084 _rtl8723be_mdio_write(rtlpriv, 0x06, 0xB880); 1085 1086 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x07); 1087 if (tmp16 != 0x4000) 1088 _rtl8723be_mdio_write(rtlpriv, 0x07, 0x4000); 1089 1090 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x08); 1091 if (tmp16 != 0x9003) 1092 _rtl8723be_mdio_write(rtlpriv, 0x08, 0x9003); 1093 1094 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x09); 1095 if (tmp16 != 0x0D03) 1096 _rtl8723be_mdio_write(rtlpriv, 0x09, 0x0D03); 1097 1098 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0A); 1099 if (tmp16 != 0x4037) 1100 _rtl8723be_mdio_write(rtlpriv, 0x0A, 0x4037); 1101 1102 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0B); 1103 if (tmp16 != 0x0070) 1104 _rtl8723be_mdio_write(rtlpriv, 0x0B, 0x0070); 1105 1106 /* Configuration Space offset 0x70f BIT7 is used to control L0S */ 1107 tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x70f); 1108 _rtl8723be_dbi_write(rtlpriv, 0x70f, tmp8 | BIT(7) | 1109 ASPM_L1_LATENCY << 3); 1110 1111 /* Configuration Space offset 0x719 Bit3 is for L1 1112 * BIT4 is for clock request 1113 */ 1114 tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x719); 1115 _rtl8723be_dbi_write(rtlpriv, 0x719, tmp8 | BIT(3) | BIT(4)); 1116} 1117 1118void rtl8723be_enable_hw_security_config(struct ieee80211_hw *hw) 1119{ 1120 struct rtl_priv *rtlpriv = rtl_priv(hw); 1121 u8 sec_reg_value; 1122 1123 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, 1124 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n", 1125 rtlpriv->sec.pairwise_enc_algorithm, 1126 rtlpriv->sec.group_enc_algorithm); 1127 1128 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) { 1129 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, 1130 "not open hw encryption\n"); 1131 return; 1132 } 1133 1134 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE; 1135 1136 if (rtlpriv->sec.use_defaultkey) { 1137 sec_reg_value |= SCR_TXUSEDK; 1138 sec_reg_value |= SCR_RXUSEDK; 1139 } 1140 1141 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK); 1142 1143 rtl_write_byte(rtlpriv, REG_CR + 1, 0x02); 1144 1145 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, 1146 "The SECR-value %x\n", sec_reg_value); 1147 1148 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value); 1149} 1150 1151static void _rtl8723be_poweroff_adapter(struct ieee80211_hw *hw) 1152{ 1153 struct rtl_priv *rtlpriv = rtl_priv(hw); 1154 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1155 u8 u1b_tmp; 1156 1157 rtlhal->mac_func_enable = false; 1158 /* Combo (PCIe + USB) Card and PCIe-MF Card */ 1159 /* 1. Run LPS WL RFOFF flow */ 1160 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 1161 PWR_INTF_PCI_MSK, RTL8723_NIC_LPS_ENTER_FLOW); 1162 1163 /* 2. 0x1F[7:0] = 0 */ 1164 /* turn off RF */ 1165 /* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */ 1166 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) && 1167 rtlhal->fw_ready) { 1168 rtl8723be_firmware_selfreset(hw); 1169 } 1170 1171 /* Reset MCU. Suggested by Filen. */ 1172 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 1173 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2)))); 1174 1175 /* g. MCUFWDL 0x80[1:0]=0 */ 1176 /* reset MCU ready status */ 1177 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00); 1178 1179 /* HW card disable configuration. */ 1180 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 1181 PWR_INTF_PCI_MSK, RTL8723_NIC_DISABLE_FLOW); 1182 1183 /* Reset MCU IO Wrapper */ 1184 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1); 1185 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0)))); 1186 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1); 1187 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0)); 1188 1189 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */ 1190 /* lock ISO/CLK/Power control register */ 1191 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e); 1192} 1193 1194static bool _rtl8723be_check_pcie_dma_hang(struct rtl_priv *rtlpriv) 1195{ 1196 u8 tmp; 1197 1198 /* write reg 0x350 Bit[26]=1. Enable debug port. */ 1199 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3); 1200 if (!(tmp & BIT(2))) { 1201 rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2))); 1202 mdelay(100); /* Suggested by DD Justin_tsai. */ 1203 } 1204 1205 /* read reg 0x350 Bit[25] if 1 : RX hang 1206 * read reg 0x350 Bit[24] if 1 : TX hang 1207 */ 1208 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3); 1209 if ((tmp & BIT(0)) || (tmp & BIT(1))) { 1210 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 1211 "CheckPcieDMAHang8723BE(): true!!\n"); 1212 return true; 1213 } 1214 return false; 1215} 1216 1217static void _rtl8723be_reset_pcie_interface_dma(struct rtl_priv *rtlpriv, 1218 bool mac_power_on) 1219{ 1220 u8 tmp; 1221 bool release_mac_rx_pause; 1222 u8 backup_pcie_dma_pause; 1223 1224 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 1225 "ResetPcieInterfaceDMA8723BE()\n"); 1226 1227 /* Revise Note: Follow the document "PCIe RX DMA Hang Reset Flow_v03" 1228 * released by SD1 Alan. 1229 * 2013.05.07, by tynli. 1230 */ 1231 1232 /* 1. disable register write lock 1233 * write 0x1C bit[1:0] = 2'h0 1234 * write 0xCC bit[2] = 1'b1 1235 */ 1236 tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL); 1237 tmp &= ~(BIT(1) | BIT(0)); 1238 rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp); 1239 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2); 1240 tmp |= BIT(2); 1241 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp); 1242 1243 /* 2. Check and pause TRX DMA 1244 * write 0x284 bit[18] = 1'b1 1245 * write 0x301 = 0xFF 1246 */ 1247 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 1248 if (tmp & BIT(2)) { 1249 /* Already pause before the function for another purpose. */ 1250 release_mac_rx_pause = false; 1251 } else { 1252 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2))); 1253 release_mac_rx_pause = true; 1254 } 1255 1256 backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1); 1257 if (backup_pcie_dma_pause != 0xFF) 1258 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF); 1259 1260 if (mac_power_on) { 1261 /* 3. reset TRX function 1262 * write 0x100 = 0x00 1263 */ 1264 rtl_write_byte(rtlpriv, REG_CR, 0); 1265 } 1266 1267 /* 4. Reset PCIe DMA 1268 * write 0x003 bit[0] = 0 1269 */ 1270 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 1271 tmp &= ~(BIT(0)); 1272 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp); 1273 1274 /* 5. Enable PCIe DMA 1275 * write 0x003 bit[0] = 1 1276 */ 1277 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 1278 tmp |= BIT(0); 1279 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp); 1280 1281 if (mac_power_on) { 1282 /* 6. enable TRX function 1283 * write 0x100 = 0xFF 1284 */ 1285 rtl_write_byte(rtlpriv, REG_CR, 0xFF); 1286 1287 /* We should init LLT & RQPN and 1288 * prepare Tx/Rx descrptor address later 1289 * because MAC function is reset. 1290 */ 1291 } 1292 1293 /* 7. Restore PCIe autoload down bit 1294 * write 0xF8 bit[17] = 1'b1 1295 */ 1296 tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2); 1297 tmp |= BIT(1); 1298 rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp); 1299 1300 /* In MAC power on state, BB and RF maybe in ON state, 1301 * if we release TRx DMA here 1302 * it will cause packets to be started to Tx/Rx, 1303 * so we release Tx/Rx DMA later. 1304 */ 1305 if (!mac_power_on) { 1306 /* 8. release TRX DMA 1307 * write 0x284 bit[18] = 1'b0 1308 * write 0x301 = 0x00 1309 */ 1310 if (release_mac_rx_pause) { 1311 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 1312 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, 1313 (tmp & (~BIT(2)))); 1314 } 1315 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 1316 backup_pcie_dma_pause); 1317 } 1318 1319 /* 9. lock system register 1320 * write 0xCC bit[2] = 1'b0 1321 */ 1322 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2); 1323 tmp &= ~(BIT(2)); 1324 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp); 1325} 1326 1327int rtl8723be_hw_init(struct ieee80211_hw *hw) 1328{ 1329 struct rtl_priv *rtlpriv = rtl_priv(hw); 1330 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1331 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1332 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1333 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 1334 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1335 bool rtstatus = true; 1336 int err; 1337 u8 tmp_u1b; 1338 unsigned long flags; 1339 1340 /* reenable interrupts to not interfere with other devices */ 1341 local_save_flags(flags); 1342 local_irq_enable(); 1343 1344 rtlhal->fw_ready = false; 1345 rtlpriv->rtlhal.being_init_adapter = true; 1346 rtlpriv->intf_ops->disable_aspm(hw); 1347 1348 tmp_u1b = rtl_read_byte(rtlpriv, REG_CR); 1349 if (tmp_u1b != 0 && tmp_u1b != 0xea) { 1350 rtlhal->mac_func_enable = true; 1351 } else { 1352 rtlhal->mac_func_enable = false; 1353 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON; 1354 } 1355 1356 if (_rtl8723be_check_pcie_dma_hang(rtlpriv)) { 1357 _rtl8723be_reset_pcie_interface_dma(rtlpriv, 1358 rtlhal->mac_func_enable); 1359 rtlhal->mac_func_enable = false; 1360 } 1361 if (rtlhal->mac_func_enable) { 1362 _rtl8723be_poweroff_adapter(hw); 1363 rtlhal->mac_func_enable = false; 1364 } 1365 rtstatus = _rtl8723be_init_mac(hw); 1366 if (!rtstatus) { 1367 pr_err("Init MAC failed\n"); 1368 err = 1; 1369 goto exit; 1370 } 1371 1372 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG); 1373 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b & 0x7F); 1374 1375 err = rtl8723_download_fw(hw, true, FW_8723B_POLLING_TIMEOUT_COUNT); 1376 if (err) { 1377 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 1378 "Failed to download FW. Init HW without FW now..\n"); 1379 err = 1; 1380 goto exit; 1381 } 1382 rtlhal->fw_ready = true; 1383 1384 rtlhal->last_hmeboxnum = 0; 1385 rtl8723be_phy_mac_config(hw); 1386 /* because last function modify RCR, so we update 1387 * rcr var here, or TP will unstable for receive_config 1388 * is wrong, RX RCR_ACRC32 will cause TP unstable & Rx 1389 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252 1390 */ 1391 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR); 1392 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV); 1393 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config); 1394 1395 rtl8723be_phy_bb_config(hw); 1396 rtl8723be_phy_rf_config(hw); 1397 1398 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0, 1399 RF_CHNLBW, RFREG_OFFSET_MASK); 1400 rtlphy->rfreg_chnlval[1] = rtl_get_rfreg(hw, (enum radio_path)1, 1401 RF_CHNLBW, RFREG_OFFSET_MASK); 1402 rtlphy->rfreg_chnlval[0] &= 0xFFF03FF; 1403 rtlphy->rfreg_chnlval[0] |= (BIT(10) | BIT(11)); 1404 1405 _rtl8723be_hw_configure(hw); 1406 rtlhal->mac_func_enable = true; 1407 rtl_cam_reset_all_entry(hw); 1408 rtl8723be_enable_hw_security_config(hw); 1409 1410 ppsc->rfpwr_state = ERFON; 1411 1412 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr); 1413 _rtl8723be_enable_aspm_back_door(hw); 1414 rtlpriv->intf_ops->enable_aspm(hw); 1415 1416 rtl8723be_bt_hw_init(hw); 1417 1418 if (ppsc->rfpwr_state == ERFON) { 1419 rtl8723be_phy_set_rfpath_switch(hw, 1); 1420 /* when use 1ant NIC, iqk will disturb BT music 1421 * root cause is not clear now, is something 1422 * related with 'mdelay' and Reg[0x948] 1423 */ 1424 if (rtlpriv->btcoexist.btc_info.ant_num == ANT_X2 || 1425 !rtlpriv->cfg->ops->get_btc_status()) { 1426 rtl8723be_phy_iq_calibrate(hw, 1427 (rtlphy->iqk_initialized ? 1428 true : false)); 1429 rtlphy->iqk_initialized = true; 1430 } 1431 rtl8723be_dm_check_txpower_tracking(hw); 1432 rtl8723be_phy_lc_calibrate(hw); 1433 } 1434 rtl_write_byte(rtlpriv, REG_NAV_UPPER, ((30000 + 127) / 128)); 1435 1436 /* Release Rx DMA. */ 1437 tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 1438 if (tmp_u1b & BIT(2)) { 1439 /* Release Rx DMA if needed */ 1440 tmp_u1b &= (~BIT(2)); 1441 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b); 1442 } 1443 /* Release Tx/Rx PCIE DMA. */ 1444 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0); 1445 1446 rtl8723be_dm_init(hw); 1447exit: 1448 local_irq_restore(flags); 1449 rtlpriv->rtlhal.being_init_adapter = false; 1450 return err; 1451} 1452 1453static enum version_8723e _rtl8723be_read_chip_version(struct ieee80211_hw *hw) 1454{ 1455 struct rtl_priv *rtlpriv = rtl_priv(hw); 1456 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1457 enum version_8723e version = VERSION_UNKNOWN; 1458 u32 value32; 1459 1460 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1); 1461 if ((value32 & (CHIP_8723B)) != CHIP_8723B) 1462 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "unknown chip version\n"); 1463 else 1464 version = (enum version_8723e)CHIP_8723B; 1465 1466 rtlphy->rf_type = RF_1T1R; 1467 1468 /* treat rtl8723be chip as MP version in default */ 1469 version = (enum version_8723e)(version | NORMAL_CHIP); 1470 1471 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG); 1472 /* cut version */ 1473 version |= (enum version_8723e)(value32 & CHIP_VER_RTL_MASK); 1474 /* Manufacture */ 1475 if (((value32 & EXT_VENDOR_ID) >> 18) == 0x01) 1476 version = (enum version_8723e)(version | CHIP_VENDOR_SMIC); 1477 1478 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 1479 "Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ? 1480 "RF_2T2R" : "RF_1T1R"); 1481 1482 return version; 1483} 1484 1485static int _rtl8723be_set_media_status(struct ieee80211_hw *hw, 1486 enum nl80211_iftype type) 1487{ 1488 struct rtl_priv *rtlpriv = rtl_priv(hw); 1489 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc; 1490 enum led_ctl_mode ledaction = LED_CTL_NO_LINK; 1491 u8 mode = MSR_NOLINK; 1492 1493 switch (type) { 1494 case NL80211_IFTYPE_UNSPECIFIED: 1495 mode = MSR_NOLINK; 1496 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 1497 "Set Network type to NO LINK!\n"); 1498 break; 1499 case NL80211_IFTYPE_ADHOC: 1500 case NL80211_IFTYPE_MESH_POINT: 1501 mode = MSR_ADHOC; 1502 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 1503 "Set Network type to Ad Hoc!\n"); 1504 break; 1505 case NL80211_IFTYPE_STATION: 1506 mode = MSR_INFRA; 1507 ledaction = LED_CTL_LINK; 1508 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 1509 "Set Network type to STA!\n"); 1510 break; 1511 case NL80211_IFTYPE_AP: 1512 mode = MSR_AP; 1513 ledaction = LED_CTL_LINK; 1514 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 1515 "Set Network type to AP!\n"); 1516 break; 1517 default: 1518 pr_err("Network type %d not support!\n", type); 1519 return 1; 1520 } 1521 1522 /* MSR_INFRA == Link in infrastructure network; 1523 * MSR_ADHOC == Link in ad hoc network; 1524 * Therefore, check link state is necessary. 1525 * 1526 * MSR_AP == AP mode; link state is not cared here. 1527 */ 1528 if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) { 1529 mode = MSR_NOLINK; 1530 ledaction = LED_CTL_NO_LINK; 1531 } 1532 1533 if (mode == MSR_NOLINK || mode == MSR_INFRA) { 1534 _rtl8723be_stop_tx_beacon(hw); 1535 _rtl8723be_enable_bcn_sub_func(hw); 1536 } else if (mode == MSR_ADHOC || mode == MSR_AP) { 1537 _rtl8723be_resume_tx_beacon(hw); 1538 _rtl8723be_disable_bcn_sub_func(hw); 1539 } else { 1540 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 1541 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n", 1542 mode); 1543 } 1544 1545 rtl_write_byte(rtlpriv, MSR, bt_msr | mode); 1546 rtlpriv->cfg->ops->led_control(hw, ledaction); 1547 if (mode == MSR_AP) 1548 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1549 else 1550 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66); 1551 return 0; 1552} 1553 1554void rtl8723be_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid) 1555{ 1556 struct rtl_priv *rtlpriv = rtl_priv(hw); 1557 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1558 u32 reg_rcr = rtlpci->receive_config; 1559 1560 if (rtlpriv->psc.rfpwr_state != ERFON) 1561 return; 1562 1563 if (check_bssid) { 1564 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN); 1565 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, 1566 (u8 *)(®_rcr)); 1567 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4)); 1568 } else if (!check_bssid) { 1569 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN)); 1570 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0); 1571 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, 1572 (u8 *)(®_rcr)); 1573 } 1574 1575} 1576 1577int rtl8723be_set_network_type(struct ieee80211_hw *hw, 1578 enum nl80211_iftype type) 1579{ 1580 struct rtl_priv *rtlpriv = rtl_priv(hw); 1581 1582 if (_rtl8723be_set_media_status(hw, type)) 1583 return -EOPNOTSUPP; 1584 1585 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) { 1586 if (type != NL80211_IFTYPE_AP) 1587 rtl8723be_set_check_bssid(hw, true); 1588 } else { 1589 rtl8723be_set_check_bssid(hw, false); 1590 } 1591 1592 return 0; 1593} 1594 1595/* don't set REG_EDCA_BE_PARAM here 1596 * because mac80211 will send pkt when scan 1597 */ 1598void rtl8723be_set_qos(struct ieee80211_hw *hw, int aci) 1599{ 1600 struct rtl_priv *rtlpriv = rtl_priv(hw); 1601 1602 rtl8723_dm_init_edca_turbo(hw); 1603 switch (aci) { 1604 case AC1_BK: 1605 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f); 1606 break; 1607 case AC0_BE: 1608 break; 1609 case AC2_VI: 1610 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322); 1611 break; 1612 case AC3_VO: 1613 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222); 1614 break; 1615 default: 1616 WARN_ONCE(true, "rtl8723be: invalid aci: %d !\n", aci); 1617 break; 1618 } 1619} 1620 1621void rtl8723be_enable_interrupt(struct ieee80211_hw *hw) 1622{ 1623 struct rtl_priv *rtlpriv = rtl_priv(hw); 1624 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1625 1626 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); 1627 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); 1628 rtlpci->irq_enabled = true; 1629 1630 /*enable system interrupt*/ 1631 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF); 1632} 1633 1634void rtl8723be_disable_interrupt(struct ieee80211_hw *hw) 1635{ 1636 struct rtl_priv *rtlpriv = rtl_priv(hw); 1637 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1638 1639 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED); 1640 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED); 1641 rtlpci->irq_enabled = false; 1642 /*synchronize_irq(rtlpci->pdev->irq);*/ 1643} 1644 1645void rtl8723be_card_disable(struct ieee80211_hw *hw) 1646{ 1647 struct rtl_priv *rtlpriv = rtl_priv(hw); 1648 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 1649 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1650 enum nl80211_iftype opmode; 1651 1652 mac->link_state = MAC80211_NOLINK; 1653 opmode = NL80211_IFTYPE_UNSPECIFIED; 1654 _rtl8723be_set_media_status(hw, opmode); 1655 if (rtlpriv->rtlhal.driver_is_goingto_unload || 1656 ppsc->rfoff_reason > RF_CHANGE_BY_PS) 1657 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF); 1658 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 1659 _rtl8723be_poweroff_adapter(hw); 1660 1661 /* after power off we should do iqk again */ 1662 if (!rtlpriv->cfg->ops->get_btc_status()) 1663 rtlpriv->phy.iqk_initialized = false; 1664} 1665 1666void rtl8723be_interrupt_recognized(struct ieee80211_hw *hw, 1667 struct rtl_int *intvec) 1668{ 1669 struct rtl_priv *rtlpriv = rtl_priv(hw); 1670 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1671 1672 intvec->inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0]; 1673 rtl_write_dword(rtlpriv, ISR, intvec->inta); 1674 1675 intvec->intb = rtl_read_dword(rtlpriv, REG_HISRE) & 1676 rtlpci->irq_mask[1]; 1677 rtl_write_dword(rtlpriv, REG_HISRE, intvec->intb); 1678} 1679 1680void rtl8723be_set_beacon_related_registers(struct ieee80211_hw *hw) 1681{ 1682 struct rtl_priv *rtlpriv = rtl_priv(hw); 1683 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1684 u16 bcn_interval, atim_window; 1685 1686 bcn_interval = mac->beacon_interval; 1687 atim_window = 2; /*FIX MERGE */ 1688 rtl8723be_disable_interrupt(hw); 1689 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window); 1690 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); 1691 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f); 1692 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18); 1693 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18); 1694 rtl_write_byte(rtlpriv, 0x606, 0x30); 1695 rtl8723be_enable_interrupt(hw); 1696} 1697 1698void rtl8723be_set_beacon_interval(struct ieee80211_hw *hw) 1699{ 1700 struct rtl_priv *rtlpriv = rtl_priv(hw); 1701 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1702 u16 bcn_interval = mac->beacon_interval; 1703 1704 rtl_dbg(rtlpriv, COMP_BEACON, DBG_DMESG, 1705 "beacon_interval:%d\n", bcn_interval); 1706 rtl8723be_disable_interrupt(hw); 1707 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); 1708 rtl8723be_enable_interrupt(hw); 1709} 1710 1711void rtl8723be_update_interrupt_mask(struct ieee80211_hw *hw, 1712 u32 add_msr, u32 rm_msr) 1713{ 1714 struct rtl_priv *rtlpriv = rtl_priv(hw); 1715 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1716 1717 rtl_dbg(rtlpriv, COMP_INTR, DBG_LOUD, 1718 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr); 1719 1720 if (add_msr) 1721 rtlpci->irq_mask[0] |= add_msr; 1722 if (rm_msr) 1723 rtlpci->irq_mask[0] &= (~rm_msr); 1724 rtl8723be_disable_interrupt(hw); 1725 rtl8723be_enable_interrupt(hw); 1726} 1727 1728static u8 _rtl8723be_get_chnl_group(u8 chnl) 1729{ 1730 u8 group; 1731 1732 if (chnl < 3) 1733 group = 0; 1734 else if (chnl < 9) 1735 group = 1; 1736 else 1737 group = 2; 1738 return group; 1739} 1740 1741static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw, 1742 struct txpower_info_2g *pw2g, 1743 struct txpower_info_5g *pw5g, 1744 bool autoload_fail, u8 *hwinfo) 1745{ 1746 struct rtl_priv *rtlpriv = rtl_priv(hw); 1747 u32 path, addr = EEPROM_TX_PWR_INX, group, cnt = 0; 1748 1749 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 1750 "hal_ReadPowerValueFromPROM8723BE(): PROMContent[0x%x]=0x%x\n", 1751 (addr + 1), hwinfo[addr + 1]); 1752 if (0xFF == hwinfo[addr + 1]) /*YJ,add,120316*/ 1753 autoload_fail = true; 1754 1755 if (autoload_fail) { 1756 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 1757 "auto load fail : Use Default value!\n"); 1758 for (path = 0; path < MAX_RF_PATH; path++) { 1759 /* 2.4G default value */ 1760 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) { 1761 pw2g->index_cck_base[path][group] = 0x2D; 1762 pw2g->index_bw40_base[path][group] = 0x2D; 1763 } 1764 for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) { 1765 if (cnt == 0) { 1766 pw2g->bw20_diff[path][0] = 0x02; 1767 pw2g->ofdm_diff[path][0] = 0x04; 1768 } else { 1769 pw2g->bw20_diff[path][cnt] = 0xFE; 1770 pw2g->bw40_diff[path][cnt] = 0xFE; 1771 pw2g->cck_diff[path][cnt] = 0xFE; 1772 pw2g->ofdm_diff[path][cnt] = 0xFE; 1773 } 1774 } 1775 } 1776 return; 1777 } 1778 1779 for (path = 0; path < MAX_RF_PATH; path++) { 1780 /*2.4G default value*/ 1781 for (group = 0; group < MAX_CHNL_GROUP_24G; group++) { 1782 pw2g->index_cck_base[path][group] = hwinfo[addr++]; 1783 if (pw2g->index_cck_base[path][group] == 0xFF) 1784 pw2g->index_cck_base[path][group] = 0x2D; 1785 1786 } 1787 for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++) { 1788 pw2g->index_bw40_base[path][group] = hwinfo[addr++]; 1789 if (pw2g->index_bw40_base[path][group] == 0xFF) 1790 pw2g->index_bw40_base[path][group] = 0x2D; 1791 } 1792 for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) { 1793 if (cnt == 0) { 1794 pw2g->bw40_diff[path][cnt] = 0; 1795 if (hwinfo[addr] == 0xFF) { 1796 pw2g->bw20_diff[path][cnt] = 0x02; 1797 } else { 1798 pw2g->bw20_diff[path][cnt] = 1799 (hwinfo[addr] & 0xf0) >> 4; 1800 /*bit sign number to 8 bit sign number*/ 1801 if (pw2g->bw20_diff[path][cnt] & BIT(3)) 1802 pw2g->bw20_diff[path][cnt] |= 1803 0xF0; 1804 } 1805 1806 if (hwinfo[addr] == 0xFF) { 1807 pw2g->ofdm_diff[path][cnt] = 0x04; 1808 } else { 1809 pw2g->ofdm_diff[path][cnt] = 1810 (hwinfo[addr] & 0x0f); 1811 /*bit sign number to 8 bit sign number*/ 1812 if (pw2g->ofdm_diff[path][cnt] & BIT(3)) 1813 pw2g->ofdm_diff[path][cnt] |= 1814 0xF0; 1815 } 1816 pw2g->cck_diff[path][cnt] = 0; 1817 addr++; 1818 } else { 1819 if (hwinfo[addr] == 0xFF) { 1820 pw2g->bw40_diff[path][cnt] = 0xFE; 1821 } else { 1822 pw2g->bw40_diff[path][cnt] = 1823 (hwinfo[addr] & 0xf0) >> 4; 1824 if (pw2g->bw40_diff[path][cnt] & BIT(3)) 1825 pw2g->bw40_diff[path][cnt] |= 1826 0xF0; 1827 } 1828 1829 if (hwinfo[addr] == 0xFF) { 1830 pw2g->bw20_diff[path][cnt] = 0xFE; 1831 } else { 1832 pw2g->bw20_diff[path][cnt] = 1833 (hwinfo[addr] & 0x0f); 1834 if (pw2g->bw20_diff[path][cnt] & BIT(3)) 1835 pw2g->bw20_diff[path][cnt] |= 1836 0xF0; 1837 } 1838 addr++; 1839 1840 if (hwinfo[addr] == 0xFF) { 1841 pw2g->ofdm_diff[path][cnt] = 0xFE; 1842 } else { 1843 pw2g->ofdm_diff[path][cnt] = 1844 (hwinfo[addr] & 0xf0) >> 4; 1845 if (pw2g->ofdm_diff[path][cnt] & BIT(3)) 1846 pw2g->ofdm_diff[path][cnt] |= 1847 0xF0; 1848 } 1849 1850 if (hwinfo[addr] == 0xFF) 1851 pw2g->cck_diff[path][cnt] = 0xFE; 1852 else { 1853 pw2g->cck_diff[path][cnt] = 1854 (hwinfo[addr] & 0x0f); 1855 if (pw2g->cck_diff[path][cnt] & BIT(3)) 1856 pw2g->cck_diff[path][cnt] |= 1857 0xF0; 1858 } 1859 addr++; 1860 } 1861 } 1862 1863 /*5G default value*/ 1864 for (group = 0; group < MAX_CHNL_GROUP_5G; group++) { 1865 pw5g->index_bw40_base[path][group] = hwinfo[addr++]; 1866 if (pw5g->index_bw40_base[path][group] == 0xFF) 1867 pw5g->index_bw40_base[path][group] = 0xFE; 1868 } 1869 1870 for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) { 1871 if (cnt == 0) { 1872 pw5g->bw40_diff[path][cnt] = 0; 1873 1874 if (hwinfo[addr] == 0xFF) { 1875 pw5g->bw20_diff[path][cnt] = 0; 1876 } else { 1877 pw5g->bw20_diff[path][0] = 1878 (hwinfo[addr] & 0xf0) >> 4; 1879 if (pw5g->bw20_diff[path][cnt] & BIT(3)) 1880 pw5g->bw20_diff[path][cnt] |= 1881 0xF0; 1882 } 1883 1884 if (hwinfo[addr] == 0xFF) 1885 pw5g->ofdm_diff[path][cnt] = 0x04; 1886 else { 1887 pw5g->ofdm_diff[path][0] = 1888 (hwinfo[addr] & 0x0f); 1889 if (pw5g->ofdm_diff[path][cnt] & BIT(3)) 1890 pw5g->ofdm_diff[path][cnt] |= 1891 0xF0; 1892 } 1893 addr++; 1894 } else { 1895 if (hwinfo[addr] == 0xFF) { 1896 pw5g->bw40_diff[path][cnt] = 0xFE; 1897 } else { 1898 pw5g->bw40_diff[path][cnt] = 1899 (hwinfo[addr] & 0xf0) >> 4; 1900 if (pw5g->bw40_diff[path][cnt] & BIT(3)) 1901 pw5g->bw40_diff[path][cnt] |= 0xF0; 1902 } 1903 1904 if (hwinfo[addr] == 0xFF) { 1905 pw5g->bw20_diff[path][cnt] = 0xFE; 1906 } else { 1907 pw5g->bw20_diff[path][cnt] = 1908 (hwinfo[addr] & 0x0f); 1909 if (pw5g->bw20_diff[path][cnt] & BIT(3)) 1910 pw5g->bw20_diff[path][cnt] |= 0xF0; 1911 } 1912 addr++; 1913 } 1914 } 1915 1916 if (hwinfo[addr] == 0xFF) { 1917 pw5g->ofdm_diff[path][1] = 0xFE; 1918 pw5g->ofdm_diff[path][2] = 0xFE; 1919 } else { 1920 pw5g->ofdm_diff[path][1] = (hwinfo[addr] & 0xf0) >> 4; 1921 pw5g->ofdm_diff[path][2] = (hwinfo[addr] & 0x0f); 1922 } 1923 addr++; 1924 1925 if (hwinfo[addr] == 0xFF) 1926 pw5g->ofdm_diff[path][3] = 0xFE; 1927 else 1928 pw5g->ofdm_diff[path][3] = (hwinfo[addr] & 0x0f); 1929 addr++; 1930 1931 for (cnt = 1; cnt < MAX_TX_COUNT; cnt++) { 1932 if (pw5g->ofdm_diff[path][cnt] == 0xFF) 1933 pw5g->ofdm_diff[path][cnt] = 0xFE; 1934 else if (pw5g->ofdm_diff[path][cnt] & BIT(3)) 1935 pw5g->ofdm_diff[path][cnt] |= 0xF0; 1936 } 1937 } 1938} 1939 1940static void _rtl8723be_read_txpower_info_from_hwpg(struct ieee80211_hw *hw, 1941 bool autoload_fail, 1942 u8 *hwinfo) 1943{ 1944 struct rtl_priv *rtlpriv = rtl_priv(hw); 1945 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1946 struct txpower_info_2g pw2g; 1947 struct txpower_info_5g pw5g; 1948 u8 rf_path, index; 1949 u8 i; 1950 1951 _rtl8723be_read_power_value_fromprom(hw, &pw2g, &pw5g, autoload_fail, 1952 hwinfo); 1953 1954 for (rf_path = 0; rf_path < 2; rf_path++) { 1955 for (i = 0; i < 14; i++) { 1956 index = _rtl8723be_get_chnl_group(i+1); 1957 1958 rtlefuse->txpwrlevel_cck[rf_path][i] = 1959 pw2g.index_cck_base[rf_path][index]; 1960 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = 1961 pw2g.index_bw40_base[rf_path][index]; 1962 } 1963 for (i = 0; i < MAX_TX_COUNT; i++) { 1964 rtlefuse->txpwr_ht20diff[rf_path][i] = 1965 pw2g.bw20_diff[rf_path][i]; 1966 rtlefuse->txpwr_ht40diff[rf_path][i] = 1967 pw2g.bw40_diff[rf_path][i]; 1968 rtlefuse->txpwr_legacyhtdiff[rf_path][i] = 1969 pw2g.ofdm_diff[rf_path][i]; 1970 } 1971 1972 for (i = 0; i < 14; i++) { 1973 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1974 "RF(%d)-Ch(%d) [CCK / HT40_1S ] = [0x%x / 0x%x ]\n", 1975 rf_path, i, 1976 rtlefuse->txpwrlevel_cck[rf_path][i], 1977 rtlefuse->txpwrlevel_ht40_1s[rf_path][i]); 1978 } 1979 } 1980 1981 if (!autoload_fail) 1982 rtlefuse->eeprom_thermalmeter = 1983 hwinfo[EEPROM_THERMAL_METER_88E]; 1984 else 1985 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER; 1986 1987 if (rtlefuse->eeprom_thermalmeter == 0xff || autoload_fail) { 1988 rtlefuse->apk_thermalmeterignore = true; 1989 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER; 1990 } 1991 1992 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter; 1993 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1994 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter); 1995 1996 if (!autoload_fail) { 1997 rtlefuse->eeprom_regulatory = 1998 hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x07;/*bit0~2*/ 1999 if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF) 2000 rtlefuse->eeprom_regulatory = 0; 2001 } else { 2002 rtlefuse->eeprom_regulatory = 0; 2003 } 2004 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 2005 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory); 2006} 2007 2008static u8 _rtl8723be_read_package_type(struct ieee80211_hw *hw) 2009{ 2010 u8 package_type; 2011 u8 value; 2012 2013 efuse_power_switch(hw, false, true); 2014 if (!efuse_one_byte_read(hw, 0x1FB, &value)) 2015 value = 0; 2016 efuse_power_switch(hw, false, false); 2017 2018 switch (value & 0x7) { 2019 case 0x4: 2020 package_type = PACKAGE_TFBGA79; 2021 break; 2022 case 0x5: 2023 package_type = PACKAGE_TFBGA90; 2024 break; 2025 case 0x6: 2026 package_type = PACKAGE_QFN68; 2027 break; 2028 case 0x7: 2029 package_type = PACKAGE_TFBGA80; 2030 break; 2031 default: 2032 package_type = PACKAGE_DEFAULT; 2033 break; 2034 } 2035 2036 return package_type; 2037} 2038 2039static void _rtl8723be_read_adapter_info(struct ieee80211_hw *hw, 2040 bool pseudo_test) 2041{ 2042 struct rtl_priv *rtlpriv = rtl_priv(hw); 2043 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 2044 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 2045 int params[] = {RTL8723BE_EEPROM_ID, EEPROM_VID, EEPROM_DID, 2046 EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR, 2047 EEPROM_CHANNELPLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID, 2048 COUNTRY_CODE_WORLD_WIDE_13}; 2049 u8 *hwinfo; 2050 int i; 2051 bool is_toshiba_smid1 = false; 2052 bool is_toshiba_smid2 = false; 2053 bool is_samsung_smid = false; 2054 bool is_lenovo_smid = false; 2055 u16 toshiba_smid1[] = { 2056 0x6151, 0x6152, 0x6154, 0x6155, 0x6177, 0x6178, 0x6179, 0x6180, 2057 0x7151, 0x7152, 0x7154, 0x7155, 0x7177, 0x7178, 0x7179, 0x7180, 2058 0x8151, 0x8152, 0x8154, 0x8155, 0x8181, 0x8182, 0x8184, 0x8185, 2059 0x9151, 0x9152, 0x9154, 0x9155, 0x9181, 0x9182, 0x9184, 0x9185 2060 }; 2061 u16 toshiba_smid2[] = { 2062 0x6181, 0x6184, 0x6185, 0x7181, 0x7182, 0x7184, 0x7185, 0x8181, 2063 0x8182, 0x8184, 0x8185, 0x9181, 0x9182, 0x9184, 0x9185 2064 }; 2065 u16 samsung_smid[] = { 2066 0x6191, 0x6192, 0x6193, 0x7191, 0x7192, 0x7193, 0x8191, 0x8192, 2067 0x8193, 0x9191, 0x9192, 0x9193 2068 }; 2069 u16 lenovo_smid[] = { 2070 0x8195, 0x9195, 0x7194, 0x8200, 0x8201, 0x8202, 0x9199, 0x9200 2071 }; 2072 2073 if (pseudo_test) { 2074 /* needs to be added */ 2075 return; 2076 } 2077 2078 hwinfo = kzalloc(HWSET_MAX_SIZE, GFP_KERNEL); 2079 if (!hwinfo) 2080 return; 2081 2082 if (rtl_get_hwinfo(hw, rtlpriv, HWSET_MAX_SIZE, hwinfo, params)) 2083 goto exit; 2084 2085 /*parse xtal*/ 2086 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8723BE]; 2087 if (rtlefuse->crystalcap == 0xFF) 2088 rtlefuse->crystalcap = 0x20; 2089 2090 _rtl8723be_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag, 2091 hwinfo); 2092 2093 rtl8723be_read_bt_coexist_info_from_hwpg(hw, 2094 rtlefuse->autoload_failflag, 2095 hwinfo); 2096 2097 if (rtlpriv->btcoexist.btc_info.btcoexist == 1) 2098 rtlefuse->board_type |= BIT(2); /* ODM_BOARD_BT */ 2099 2100 rtlhal->board_type = rtlefuse->board_type; 2101 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 2102 "board_type = 0x%x\n", rtlefuse->board_type); 2103 2104 rtlhal->package_type = _rtl8723be_read_package_type(hw); 2105 2106 /* set channel plan from efuse */ 2107 rtlefuse->channel_plan = rtlefuse->eeprom_channelplan; 2108 2109 if (rtlhal->oem_id == RT_CID_DEFAULT) { 2110 /* Does this one have a Toshiba SMID from group 1? */ 2111 for (i = 0; i < ARRAY_SIZE(toshiba_smid1); i++) { 2112 if (rtlefuse->eeprom_smid == toshiba_smid1[i]) { 2113 is_toshiba_smid1 = true; 2114 break; 2115 } 2116 } 2117 /* Does this one have a Toshiba SMID from group 2? */ 2118 for (i = 0; i < ARRAY_SIZE(toshiba_smid2); i++) { 2119 if (rtlefuse->eeprom_smid == toshiba_smid2[i]) { 2120 is_toshiba_smid2 = true; 2121 break; 2122 } 2123 } 2124 /* Does this one have a Samsung SMID? */ 2125 for (i = 0; i < ARRAY_SIZE(samsung_smid); i++) { 2126 if (rtlefuse->eeprom_smid == samsung_smid[i]) { 2127 is_samsung_smid = true; 2128 break; 2129 } 2130 } 2131 /* Does this one have a Lenovo SMID? */ 2132 for (i = 0; i < ARRAY_SIZE(lenovo_smid); i++) { 2133 if (rtlefuse->eeprom_smid == lenovo_smid[i]) { 2134 is_lenovo_smid = true; 2135 break; 2136 } 2137 } 2138 switch (rtlefuse->eeprom_oemid) { 2139 case EEPROM_CID_DEFAULT: 2140 if (rtlefuse->eeprom_did == 0x8176) { 2141 if (rtlefuse->eeprom_svid == 0x10EC && 2142 is_toshiba_smid1) { 2143 rtlhal->oem_id = RT_CID_TOSHIBA; 2144 } else if (rtlefuse->eeprom_svid == 0x1025) { 2145 rtlhal->oem_id = RT_CID_819X_ACER; 2146 } else if (rtlefuse->eeprom_svid == 0x10EC && 2147 is_samsung_smid) { 2148 rtlhal->oem_id = RT_CID_819X_SAMSUNG; 2149 } else if (rtlefuse->eeprom_svid == 0x10EC && 2150 is_lenovo_smid) { 2151 rtlhal->oem_id = RT_CID_819X_LENOVO; 2152 } else if ((rtlefuse->eeprom_svid == 0x10EC && 2153 rtlefuse->eeprom_smid == 0x8197) || 2154 (rtlefuse->eeprom_svid == 0x10EC && 2155 rtlefuse->eeprom_smid == 0x9196)) { 2156 rtlhal->oem_id = RT_CID_819X_CLEVO; 2157 } else if ((rtlefuse->eeprom_svid == 0x1028 && 2158 rtlefuse->eeprom_smid == 0x8194) || 2159 (rtlefuse->eeprom_svid == 0x1028 && 2160 rtlefuse->eeprom_smid == 0x8198) || 2161 (rtlefuse->eeprom_svid == 0x1028 && 2162 rtlefuse->eeprom_smid == 0x9197) || 2163 (rtlefuse->eeprom_svid == 0x1028 && 2164 rtlefuse->eeprom_smid == 0x9198)) { 2165 rtlhal->oem_id = RT_CID_819X_DELL; 2166 } else if ((rtlefuse->eeprom_svid == 0x103C && 2167 rtlefuse->eeprom_smid == 0x1629)) { 2168 rtlhal->oem_id = RT_CID_819X_HP; 2169 } else if ((rtlefuse->eeprom_svid == 0x1A32 && 2170 rtlefuse->eeprom_smid == 0x2315)) { 2171 rtlhal->oem_id = RT_CID_819X_QMI; 2172 } else if ((rtlefuse->eeprom_svid == 0x10EC && 2173 rtlefuse->eeprom_smid == 0x8203)) { 2174 rtlhal->oem_id = RT_CID_819X_PRONETS; 2175 } else if ((rtlefuse->eeprom_svid == 0x1043 && 2176 rtlefuse->eeprom_smid == 0x84B5)) { 2177 rtlhal->oem_id = RT_CID_819X_EDIMAX_ASUS; 2178 } else { 2179 rtlhal->oem_id = RT_CID_DEFAULT; 2180 } 2181 } else if (rtlefuse->eeprom_did == 0x8178) { 2182 if (rtlefuse->eeprom_svid == 0x10EC && 2183 is_toshiba_smid2) 2184 rtlhal->oem_id = RT_CID_TOSHIBA; 2185 else if (rtlefuse->eeprom_svid == 0x1025) 2186 rtlhal->oem_id = RT_CID_819X_ACER; 2187 else if ((rtlefuse->eeprom_svid == 0x10EC && 2188 rtlefuse->eeprom_smid == 0x8186)) 2189 rtlhal->oem_id = RT_CID_819X_PRONETS; 2190 else if ((rtlefuse->eeprom_svid == 0x1043 && 2191 rtlefuse->eeprom_smid == 0x84B6)) 2192 rtlhal->oem_id = 2193 RT_CID_819X_EDIMAX_ASUS; 2194 else 2195 rtlhal->oem_id = RT_CID_DEFAULT; 2196 } else { 2197 rtlhal->oem_id = RT_CID_DEFAULT; 2198 } 2199 break; 2200 case EEPROM_CID_TOSHIBA: 2201 rtlhal->oem_id = RT_CID_TOSHIBA; 2202 break; 2203 case EEPROM_CID_CCX: 2204 rtlhal->oem_id = RT_CID_CCX; 2205 break; 2206 case EEPROM_CID_QMI: 2207 rtlhal->oem_id = RT_CID_819X_QMI; 2208 break; 2209 case EEPROM_CID_WHQL: 2210 break; 2211 default: 2212 rtlhal->oem_id = RT_CID_DEFAULT; 2213 break; 2214 } 2215 } 2216exit: 2217 kfree(hwinfo); 2218} 2219 2220static void _rtl8723be_hal_customized_behavior(struct ieee80211_hw *hw) 2221{ 2222 struct rtl_priv *rtlpriv = rtl_priv(hw); 2223 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 2224 2225 rtlpriv->ledctl.led_opendrain = true; 2226 switch (rtlhal->oem_id) { 2227 case RT_CID_819X_HP: 2228 rtlpriv->ledctl.led_opendrain = true; 2229 break; 2230 case RT_CID_819X_LENOVO: 2231 case RT_CID_DEFAULT: 2232 case RT_CID_TOSHIBA: 2233 case RT_CID_CCX: 2234 case RT_CID_819X_ACER: 2235 case RT_CID_WHQL: 2236 default: 2237 break; 2238 } 2239 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, 2240 "RT Customized ID: 0x%02X\n", rtlhal->oem_id); 2241} 2242 2243void rtl8723be_read_eeprom_info(struct ieee80211_hw *hw) 2244{ 2245 struct rtl_priv *rtlpriv = rtl_priv(hw); 2246 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 2247 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2248 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 2249 u8 tmp_u1b; 2250 2251 rtlhal->version = _rtl8723be_read_chip_version(hw); 2252 if (get_rf_type(rtlphy) == RF_1T1R) 2253 rtlpriv->dm.rfpath_rxenable[0] = true; 2254 else 2255 rtlpriv->dm.rfpath_rxenable[0] = 2256 rtlpriv->dm.rfpath_rxenable[1] = true; 2257 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n", 2258 rtlhal->version); 2259 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR); 2260 if (tmp_u1b & BIT(4)) { 2261 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n"); 2262 rtlefuse->epromtype = EEPROM_93C46; 2263 } else { 2264 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n"); 2265 rtlefuse->epromtype = EEPROM_BOOT_EFUSE; 2266 } 2267 if (tmp_u1b & BIT(5)) { 2268 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n"); 2269 rtlefuse->autoload_failflag = false; 2270 _rtl8723be_read_adapter_info(hw, false); 2271 } else { 2272 pr_err("Autoload ERR!!\n"); 2273 } 2274 _rtl8723be_hal_customized_behavior(hw); 2275} 2276 2277static u8 _rtl8723be_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, 2278 u8 rate_index) 2279{ 2280 u8 ret = 0; 2281 switch (rate_index) { 2282 case RATR_INX_WIRELESS_NGB: 2283 ret = 1; 2284 break; 2285 case RATR_INX_WIRELESS_N: 2286 case RATR_INX_WIRELESS_NG: 2287 ret = 5; 2288 break; 2289 case RATR_INX_WIRELESS_NB: 2290 ret = 3; 2291 break; 2292 case RATR_INX_WIRELESS_GB: 2293 ret = 6; 2294 break; 2295 case RATR_INX_WIRELESS_G: 2296 ret = 7; 2297 break; 2298 case RATR_INX_WIRELESS_B: 2299 ret = 8; 2300 break; 2301 default: 2302 ret = 0; 2303 break; 2304 } 2305 return ret; 2306} 2307 2308static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw, 2309 struct ieee80211_sta *sta, 2310 u8 rssi_level, bool update_bw) 2311{ 2312 struct rtl_priv *rtlpriv = rtl_priv(hw); 2313 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2314 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2315 struct rtl_sta_info *sta_entry = NULL; 2316 u32 ratr_bitmap; 2317 u8 ratr_index; 2318 u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap & 2319 IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0; 2320 u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? 2321 1 : 0; 2322 u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? 2323 1 : 0; 2324 enum wireless_mode wirelessmode = 0; 2325 bool shortgi = false; 2326 u8 rate_mask[7]; 2327 u8 macid = 0; 2328 2329 sta_entry = (struct rtl_sta_info *)sta->drv_priv; 2330 wirelessmode = sta_entry->wireless_mode; 2331 if (mac->opmode == NL80211_IFTYPE_STATION || 2332 mac->opmode == NL80211_IFTYPE_MESH_POINT) 2333 curtxbw_40mhz = mac->bw_40; 2334 else if (mac->opmode == NL80211_IFTYPE_AP || 2335 mac->opmode == NL80211_IFTYPE_ADHOC) 2336 macid = sta->aid + 1; 2337 2338 ratr_bitmap = sta->deflink.supp_rates[0]; 2339 2340 if (mac->opmode == NL80211_IFTYPE_ADHOC) 2341 ratr_bitmap = 0xfff; 2342 2343 ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 | 2344 sta->deflink.ht_cap.mcs.rx_mask[0] << 12); 2345 switch (wirelessmode) { 2346 case WIRELESS_MODE_B: 2347 ratr_index = RATR_INX_WIRELESS_B; 2348 if (ratr_bitmap & 0x0000000c) 2349 ratr_bitmap &= 0x0000000d; 2350 else 2351 ratr_bitmap &= 0x0000000f; 2352 break; 2353 case WIRELESS_MODE_G: 2354 ratr_index = RATR_INX_WIRELESS_GB; 2355 2356 if (rssi_level == 1) 2357 ratr_bitmap &= 0x00000f00; 2358 else if (rssi_level == 2) 2359 ratr_bitmap &= 0x00000ff0; 2360 else 2361 ratr_bitmap &= 0x00000ff5; 2362 break; 2363 case WIRELESS_MODE_N_24G: 2364 case WIRELESS_MODE_N_5G: 2365 ratr_index = RATR_INX_WIRELESS_NGB; 2366 if (rtlphy->rf_type == RF_1T1R) { 2367 if (curtxbw_40mhz) { 2368 if (rssi_level == 1) 2369 ratr_bitmap &= 0x000f0000; 2370 else if (rssi_level == 2) 2371 ratr_bitmap &= 0x000ff000; 2372 else 2373 ratr_bitmap &= 0x000ff015; 2374 } else { 2375 if (rssi_level == 1) 2376 ratr_bitmap &= 0x000f0000; 2377 else if (rssi_level == 2) 2378 ratr_bitmap &= 0x000ff000; 2379 else 2380 ratr_bitmap &= 0x000ff005; 2381 } 2382 } else { 2383 if (curtxbw_40mhz) { 2384 if (rssi_level == 1) 2385 ratr_bitmap &= 0x0f8f0000; 2386 else if (rssi_level == 2) 2387 ratr_bitmap &= 0x0f8ff000; 2388 else 2389 ratr_bitmap &= 0x0f8ff015; 2390 } else { 2391 if (rssi_level == 1) 2392 ratr_bitmap &= 0x0f8f0000; 2393 else if (rssi_level == 2) 2394 ratr_bitmap &= 0x0f8ff000; 2395 else 2396 ratr_bitmap &= 0x0f8ff005; 2397 } 2398 } 2399 if ((curtxbw_40mhz && curshortgi_40mhz) || 2400 (!curtxbw_40mhz && curshortgi_20mhz)) { 2401 if (macid == 0) 2402 shortgi = true; 2403 else if (macid == 1) 2404 shortgi = false; 2405 } 2406 break; 2407 default: 2408 ratr_index = RATR_INX_WIRELESS_NGB; 2409 2410 if (rtlphy->rf_type == RF_1T2R) 2411 ratr_bitmap &= 0x000ff0ff; 2412 else 2413 ratr_bitmap &= 0x0f0ff0ff; 2414 break; 2415 } 2416 2417 sta_entry->ratr_index = ratr_index; 2418 2419 rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG, 2420 "ratr_bitmap :%x\n", ratr_bitmap); 2421 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) | 2422 (ratr_index << 28); 2423 rate_mask[0] = macid; 2424 rate_mask[1] = _rtl8723be_mrate_idx_to_arfr_id(hw, ratr_index) | 2425 (shortgi ? 0x80 : 0x00); 2426 rate_mask[2] = curtxbw_40mhz | ((!update_bw) << 3); 2427 2428 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff); 2429 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8); 2430 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16); 2431 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24); 2432 2433 rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG, 2434 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n", 2435 ratr_index, ratr_bitmap, 2436 rate_mask[0], rate_mask[1], 2437 rate_mask[2], rate_mask[3], 2438 rate_mask[4], rate_mask[5], 2439 rate_mask[6]); 2440 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_RA_MASK, 7, rate_mask); 2441 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0); 2442} 2443 2444void rtl8723be_update_hal_rate_tbl(struct ieee80211_hw *hw, 2445 struct ieee80211_sta *sta, 2446 u8 rssi_level, bool update_bw) 2447{ 2448 struct rtl_priv *rtlpriv = rtl_priv(hw); 2449 if (rtlpriv->dm.useramask) 2450 rtl8723be_update_hal_rate_mask(hw, sta, rssi_level, update_bw); 2451} 2452 2453void rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw) 2454{ 2455 struct rtl_priv *rtlpriv = rtl_priv(hw); 2456 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2457 u16 sifs_timer; 2458 2459 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, &mac->slot_time); 2460 if (!mac->ht_enable) 2461 sifs_timer = 0x0a0a; 2462 else 2463 sifs_timer = 0x0e0e; 2464 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer); 2465} 2466 2467bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid) 2468{ 2469 struct rtl_priv *rtlpriv = rtl_priv(hw); 2470 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 2471 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2472 enum rf_pwrstate e_rfpowerstate_toset; 2473 u8 u1tmp; 2474 bool b_actuallyset = false; 2475 2476 if (rtlpriv->rtlhal.being_init_adapter) 2477 return false; 2478 2479 if (ppsc->swrf_processing) 2480 return false; 2481 2482 spin_lock(&rtlpriv->locks.rf_ps_lock); 2483 if (ppsc->rfchange_inprogress) { 2484 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2485 return false; 2486 } else { 2487 ppsc->rfchange_inprogress = true; 2488 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2489 } 2490 2491 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2, 2492 rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL_2) & ~(BIT(1))); 2493 2494 u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2); 2495 2496 if (rtlphy->polarity_ctl) 2497 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON; 2498 else 2499 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF; 2500 2501 if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) { 2502 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG, 2503 "GPIOChangeRF - HW Radio ON, RF ON\n"); 2504 2505 e_rfpowerstate_toset = ERFON; 2506 ppsc->hwradiooff = false; 2507 b_actuallyset = true; 2508 } else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) { 2509 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG, 2510 "GPIOChangeRF - HW Radio OFF, RF OFF\n"); 2511 2512 e_rfpowerstate_toset = ERFOFF; 2513 ppsc->hwradiooff = true; 2514 b_actuallyset = true; 2515 } 2516 2517 if (b_actuallyset) { 2518 spin_lock(&rtlpriv->locks.rf_ps_lock); 2519 ppsc->rfchange_inprogress = false; 2520 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2521 } else { 2522 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) 2523 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 2524 2525 spin_lock(&rtlpriv->locks.rf_ps_lock); 2526 ppsc->rfchange_inprogress = false; 2527 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2528 } 2529 2530 *valid = 1; 2531 return !ppsc->hwradiooff; 2532 2533} 2534 2535void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index, 2536 u8 *p_macaddr, bool is_group, u8 enc_algo, 2537 bool is_wepkey, bool clear_all) 2538{ 2539 struct rtl_priv *rtlpriv = rtl_priv(hw); 2540 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2541 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 2542 u8 *macaddr = p_macaddr; 2543 u32 entry_id = 0; 2544 bool is_pairwise = false; 2545 2546 static u8 cam_const_addr[4][6] = { 2547 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 2548 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 2549 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02}, 2550 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03} 2551 }; 2552 static u8 cam_const_broad[] = { 2553 0xff, 0xff, 0xff, 0xff, 0xff, 0xff 2554 }; 2555 2556 if (clear_all) { 2557 u8 idx = 0; 2558 u8 cam_offset = 0; 2559 u8 clear_number = 5; 2560 2561 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n"); 2562 2563 for (idx = 0; idx < clear_number; idx++) { 2564 rtl_cam_mark_invalid(hw, cam_offset + idx); 2565 rtl_cam_empty_entry(hw, cam_offset + idx); 2566 2567 if (idx < 5) { 2568 memset(rtlpriv->sec.key_buf[idx], 0, 2569 MAX_KEY_LEN); 2570 rtlpriv->sec.key_len[idx] = 0; 2571 } 2572 } 2573 2574 } else { 2575 switch (enc_algo) { 2576 case WEP40_ENCRYPTION: 2577 enc_algo = CAM_WEP40; 2578 break; 2579 case WEP104_ENCRYPTION: 2580 enc_algo = CAM_WEP104; 2581 break; 2582 case TKIP_ENCRYPTION: 2583 enc_algo = CAM_TKIP; 2584 break; 2585 case AESCCMP_ENCRYPTION: 2586 enc_algo = CAM_AES; 2587 break; 2588 default: 2589 rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 2590 "switch case %#x not processed\n", enc_algo); 2591 enc_algo = CAM_TKIP; 2592 break; 2593 } 2594 2595 if (is_wepkey || rtlpriv->sec.use_defaultkey) { 2596 macaddr = cam_const_addr[key_index]; 2597 entry_id = key_index; 2598 } else { 2599 if (is_group) { 2600 macaddr = cam_const_broad; 2601 entry_id = key_index; 2602 } else { 2603 if (mac->opmode == NL80211_IFTYPE_AP) { 2604 entry_id = rtl_cam_get_free_entry(hw, 2605 p_macaddr); 2606 if (entry_id >= TOTAL_CAM_ENTRY) { 2607 pr_err("Can not find free hw security cam entry\n"); 2608 return; 2609 } 2610 } else { 2611 entry_id = CAM_PAIRWISE_KEY_POSITION; 2612 } 2613 2614 key_index = PAIRWISE_KEYIDX; 2615 is_pairwise = true; 2616 } 2617 } 2618 2619 if (rtlpriv->sec.key_len[key_index] == 0) { 2620 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, 2621 "delete one entry, entry_id is %d\n", 2622 entry_id); 2623 if (mac->opmode == NL80211_IFTYPE_AP) 2624 rtl_cam_del_entry(hw, p_macaddr); 2625 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id); 2626 } else { 2627 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, 2628 "add one entry\n"); 2629 if (is_pairwise) { 2630 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, 2631 "set Pairwise key\n"); 2632 2633 rtl_cam_add_one_entry(hw, macaddr, key_index, 2634 entry_id, enc_algo, 2635 CAM_CONFIG_NO_USEDK, 2636 rtlpriv->sec.key_buf[key_index]); 2637 } else { 2638 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, 2639 "set group key\n"); 2640 2641 if (mac->opmode == NL80211_IFTYPE_ADHOC) { 2642 rtl_cam_add_one_entry(hw, 2643 rtlefuse->dev_addr, 2644 PAIRWISE_KEYIDX, 2645 CAM_PAIRWISE_KEY_POSITION, 2646 enc_algo, 2647 CAM_CONFIG_NO_USEDK, 2648 rtlpriv->sec.key_buf 2649 [entry_id]); 2650 } 2651 2652 rtl_cam_add_one_entry(hw, macaddr, key_index, 2653 entry_id, enc_algo, 2654 CAM_CONFIG_NO_USEDK, 2655 rtlpriv->sec.key_buf[entry_id]); 2656 } 2657 } 2658 } 2659} 2660 2661void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw, 2662 bool auto_load_fail, u8 *hwinfo) 2663{ 2664 struct rtl_priv *rtlpriv = rtl_priv(hw); 2665 struct rtl_mod_params *mod_params = rtlpriv->cfg->mod_params; 2666 u8 value; 2667 u32 tmpu_32; 2668 2669 if (!auto_load_fail) { 2670 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL); 2671 if (tmpu_32 & BIT(18)) 2672 rtlpriv->btcoexist.btc_info.btcoexist = 1; 2673 else 2674 rtlpriv->btcoexist.btc_info.btcoexist = 0; 2675 value = hwinfo[EEPROM_RF_BT_SETTING_8723B]; 2676 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B; 2677 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1); 2678 rtlpriv->btcoexist.btc_info.single_ant_path = 2679 (value & 0x40 ? ANT_AUX : ANT_MAIN); /*0xc3[6]*/ 2680 } else { 2681 rtlpriv->btcoexist.btc_info.btcoexist = 0; 2682 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B; 2683 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2; 2684 rtlpriv->btcoexist.btc_info.single_ant_path = ANT_MAIN; 2685 } 2686 2687 /* override ant_num / ant_path */ 2688 if (mod_params->ant_sel) { 2689 rtlpriv->btcoexist.btc_info.ant_num = 2690 (mod_params->ant_sel == 1 ? ANT_X1 : ANT_X2); 2691 2692 rtlpriv->btcoexist.btc_info.single_ant_path = 2693 (mod_params->ant_sel == 1 ? ANT_AUX : ANT_MAIN); 2694 } 2695} 2696 2697void rtl8723be_bt_reg_init(struct ieee80211_hw *hw) 2698{ 2699 struct rtl_priv *rtlpriv = rtl_priv(hw); 2700 2701 /* 0:Low, 1:High, 2:From Efuse. */ 2702 rtlpriv->btcoexist.reg_bt_iso = 2; 2703 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */ 2704 rtlpriv->btcoexist.reg_bt_sco = 3; 2705 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */ 2706 rtlpriv->btcoexist.reg_bt_sco = 0; 2707} 2708 2709void rtl8723be_bt_hw_init(struct ieee80211_hw *hw) 2710{ 2711 struct rtl_priv *rtlpriv = rtl_priv(hw); 2712 2713 if (rtlpriv->cfg->ops->get_btc_status()) 2714 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv); 2715 2716} 2717 2718void rtl8723be_suspend(struct ieee80211_hw *hw) 2719{ 2720} 2721 2722void rtl8723be_resume(struct ieee80211_hw *hw) 2723{ 2724}