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