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