]> Git Repo - J-linux.git/blob - drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / net / wireless / realtek / rtlwifi / rtl8723be / hw.c
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 *)(&reg_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 *)(&reg_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         static const int params[] = {
2044                 RTL8723BE_EEPROM_ID, EEPROM_VID, EEPROM_DID,
2045                 EEPROM_SVID, EEPROM_SMID, EEPROM_MAC_ADDR,
2046                 EEPROM_CHANNELPLAN, EEPROM_VERSION, EEPROM_CUSTOMER_ID,
2047                 COUNTRY_CODE_WORLD_WIDE_13
2048         };
2049         u8 *hwinfo;
2050         int i;
2051         bool is_toshiba_smid1 = false;
2052         bool is_toshiba_smid2 = false;
2053         bool is_samsung_smid = false;
2054         bool is_lenovo_smid = false;
2055         static const u16 toshiba_smid1[] = {
2056                 0x6151, 0x6152, 0x6154, 0x6155, 0x6177, 0x6178, 0x6179, 0x6180,
2057                 0x7151, 0x7152, 0x7154, 0x7155, 0x7177, 0x7178, 0x7179, 0x7180,
2058                 0x8151, 0x8152, 0x8154, 0x8155, 0x8181, 0x8182, 0x8184, 0x8185,
2059                 0x9151, 0x9152, 0x9154, 0x9155, 0x9181, 0x9182, 0x9184, 0x9185
2060         };
2061         static const u16 toshiba_smid2[] = {
2062                 0x6181, 0x6184, 0x6185, 0x7181, 0x7182, 0x7184, 0x7185, 0x8181,
2063                 0x8182, 0x8184, 0x8185, 0x9181, 0x9182, 0x9184, 0x9185
2064         };
2065         static const u16 samsung_smid[] = {
2066                 0x6191, 0x6192, 0x6193, 0x7191, 0x7192, 0x7193, 0x8191, 0x8192,
2067                 0x8193, 0x9191, 0x9192, 0x9193
2068         };
2069         static const u16 lenovo_smid[] = {
2070                 0x8195, 0x9195, 0x7194, 0x8200, 0x8201, 0x8202, 0x9199, 0x9200
2071         };
2072
2073         if (pseudo_test) {
2074                 /* needs to be added */
2075                 return;
2076         }
2077
2078         hwinfo = kzalloc(HWSET_MAX_SIZE, GFP_KERNEL);
2079         if (!hwinfo)
2080                 return;
2081
2082         if (rtl_get_hwinfo(hw, rtlpriv, HWSET_MAX_SIZE, hwinfo, params))
2083                 goto exit;
2084
2085         /*parse xtal*/
2086         rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8723BE];
2087         if (rtlefuse->crystalcap == 0xFF)
2088                 rtlefuse->crystalcap = 0x20;
2089
2090         _rtl8723be_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
2091                                                hwinfo);
2092
2093         rtl8723be_read_bt_coexist_info_from_hwpg(hw,
2094                                                  rtlefuse->autoload_failflag,
2095                                                  hwinfo);
2096
2097         if (rtlpriv->btcoexist.btc_info.btcoexist == 1)
2098                 rtlefuse->board_type |= BIT(2); /* ODM_BOARD_BT */
2099
2100         rtlhal->board_type = rtlefuse->board_type;
2101         rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2102                 "board_type = 0x%x\n", rtlefuse->board_type);
2103
2104         rtlhal->package_type = _rtl8723be_read_package_type(hw);
2105
2106         /* set channel plan from efuse */
2107         rtlefuse->channel_plan = rtlefuse->eeprom_channelplan;
2108
2109         if (rtlhal->oem_id == RT_CID_DEFAULT) {
2110                 /* Does this one have a Toshiba SMID from group 1? */
2111                 for (i = 0; i < ARRAY_SIZE(toshiba_smid1); i++) {
2112                         if (rtlefuse->eeprom_smid == toshiba_smid1[i]) {
2113                                 is_toshiba_smid1 = true;
2114                                 break;
2115                         }
2116                 }
2117                 /* Does this one have a Toshiba SMID from group 2? */
2118                 for (i = 0; i < ARRAY_SIZE(toshiba_smid2); i++) {
2119                         if (rtlefuse->eeprom_smid == toshiba_smid2[i]) {
2120                                 is_toshiba_smid2 = true;
2121                                 break;
2122                         }
2123                 }
2124                 /* Does this one have a Samsung SMID? */
2125                 for (i = 0; i < ARRAY_SIZE(samsung_smid); i++) {
2126                         if (rtlefuse->eeprom_smid == samsung_smid[i]) {
2127                                 is_samsung_smid = true;
2128                                 break;
2129                         }
2130                 }
2131                 /* Does this one have a Lenovo SMID? */
2132                 for (i = 0; i < ARRAY_SIZE(lenovo_smid); i++) {
2133                         if (rtlefuse->eeprom_smid == lenovo_smid[i]) {
2134                                 is_lenovo_smid = true;
2135                                 break;
2136                         }
2137                 }
2138                 switch (rtlefuse->eeprom_oemid) {
2139                 case EEPROM_CID_DEFAULT:
2140                         if (rtlefuse->eeprom_did == 0x8176) {
2141                                 if (rtlefuse->eeprom_svid == 0x10EC &&
2142                                     is_toshiba_smid1) {
2143                                         rtlhal->oem_id = RT_CID_TOSHIBA;
2144                                 } else if (rtlefuse->eeprom_svid == 0x1025) {
2145                                         rtlhal->oem_id = RT_CID_819X_ACER;
2146                                 } else if (rtlefuse->eeprom_svid == 0x10EC &&
2147                                            is_samsung_smid) {
2148                                         rtlhal->oem_id = RT_CID_819X_SAMSUNG;
2149                                 } else if (rtlefuse->eeprom_svid == 0x10EC &&
2150                                            is_lenovo_smid) {
2151                                         rtlhal->oem_id = RT_CID_819X_LENOVO;
2152                                 } else if ((rtlefuse->eeprom_svid == 0x10EC &&
2153                                             rtlefuse->eeprom_smid == 0x8197) ||
2154                                            (rtlefuse->eeprom_svid == 0x10EC &&
2155                                             rtlefuse->eeprom_smid == 0x9196)) {
2156                                         rtlhal->oem_id = RT_CID_819X_CLEVO;
2157                                 } else if ((rtlefuse->eeprom_svid == 0x1028 &&
2158                                             rtlefuse->eeprom_smid == 0x8194) ||
2159                                            (rtlefuse->eeprom_svid == 0x1028 &&
2160                                             rtlefuse->eeprom_smid == 0x8198) ||
2161                                            (rtlefuse->eeprom_svid == 0x1028 &&
2162                                             rtlefuse->eeprom_smid == 0x9197) ||
2163                                            (rtlefuse->eeprom_svid == 0x1028 &&
2164                                             rtlefuse->eeprom_smid == 0x9198)) {
2165                                         rtlhal->oem_id = RT_CID_819X_DELL;
2166                                 } else if ((rtlefuse->eeprom_svid == 0x103C &&
2167                                             rtlefuse->eeprom_smid == 0x1629)) {
2168                                         rtlhal->oem_id = RT_CID_819X_HP;
2169                                 } else if ((rtlefuse->eeprom_svid == 0x1A32 &&
2170                                            rtlefuse->eeprom_smid == 0x2315)) {
2171                                         rtlhal->oem_id = RT_CID_819X_QMI;
2172                                 } else if ((rtlefuse->eeprom_svid == 0x10EC &&
2173                                            rtlefuse->eeprom_smid == 0x8203)) {
2174                                         rtlhal->oem_id = RT_CID_819X_PRONETS;
2175                                 } else if ((rtlefuse->eeprom_svid == 0x1043 &&
2176                                            rtlefuse->eeprom_smid == 0x84B5)) {
2177                                         rtlhal->oem_id = RT_CID_819X_EDIMAX_ASUS;
2178                                 } else {
2179                                         rtlhal->oem_id = RT_CID_DEFAULT;
2180                                 }
2181                         } else if (rtlefuse->eeprom_did == 0x8178) {
2182                                 if (rtlefuse->eeprom_svid == 0x10EC &&
2183                                     is_toshiba_smid2)
2184                                         rtlhal->oem_id = RT_CID_TOSHIBA;
2185                                 else if (rtlefuse->eeprom_svid == 0x1025)
2186                                         rtlhal->oem_id = RT_CID_819X_ACER;
2187                                 else if ((rtlefuse->eeprom_svid == 0x10EC &&
2188                                           rtlefuse->eeprom_smid == 0x8186))
2189                                         rtlhal->oem_id = RT_CID_819X_PRONETS;
2190                                 else if ((rtlefuse->eeprom_svid == 0x1043 &&
2191                                           rtlefuse->eeprom_smid == 0x84B6))
2192                                         rtlhal->oem_id =
2193                                                         RT_CID_819X_EDIMAX_ASUS;
2194                                 else
2195                                         rtlhal->oem_id = RT_CID_DEFAULT;
2196                         } else {
2197                                         rtlhal->oem_id = RT_CID_DEFAULT;
2198                         }
2199                         break;
2200                 case EEPROM_CID_TOSHIBA:
2201                         rtlhal->oem_id = RT_CID_TOSHIBA;
2202                         break;
2203                 case EEPROM_CID_CCX:
2204                         rtlhal->oem_id = RT_CID_CCX;
2205                         break;
2206                 case EEPROM_CID_QMI:
2207                         rtlhal->oem_id = RT_CID_819X_QMI;
2208                         break;
2209                 case EEPROM_CID_WHQL:
2210                         break;
2211                 default:
2212                         rtlhal->oem_id = RT_CID_DEFAULT;
2213                         break;
2214                 }
2215         }
2216 exit:
2217         kfree(hwinfo);
2218 }
2219
2220 static void _rtl8723be_hal_customized_behavior(struct ieee80211_hw *hw)
2221 {
2222         struct rtl_priv *rtlpriv = rtl_priv(hw);
2223         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2224
2225         rtlpriv->ledctl.led_opendrain = true;
2226         switch (rtlhal->oem_id) {
2227         case RT_CID_819X_HP:
2228                 rtlpriv->ledctl.led_opendrain = true;
2229                 break;
2230         case RT_CID_819X_LENOVO:
2231         case RT_CID_DEFAULT:
2232         case RT_CID_TOSHIBA:
2233         case RT_CID_CCX:
2234         case RT_CID_819X_ACER:
2235         case RT_CID_WHQL:
2236         default:
2237                 break;
2238         }
2239         rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
2240                 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
2241 }
2242
2243 void rtl8723be_read_eeprom_info(struct ieee80211_hw *hw)
2244 {
2245         struct rtl_priv *rtlpriv = rtl_priv(hw);
2246         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2247         struct rtl_phy *rtlphy = &(rtlpriv->phy);
2248         struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2249         u8 tmp_u1b;
2250
2251         rtlhal->version = _rtl8723be_read_chip_version(hw);
2252         if (get_rf_type(rtlphy) == RF_1T1R)
2253                 rtlpriv->dm.rfpath_rxenable[0] = true;
2254         else
2255                 rtlpriv->dm.rfpath_rxenable[0] =
2256                     rtlpriv->dm.rfpath_rxenable[1] = true;
2257         rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
2258                 rtlhal->version);
2259         tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
2260         if (tmp_u1b & BIT(4)) {
2261                 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
2262                 rtlefuse->epromtype = EEPROM_93C46;
2263         } else {
2264                 rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
2265                 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
2266         }
2267         if (tmp_u1b & BIT(5)) {
2268                 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2269                 rtlefuse->autoload_failflag = false;
2270                 _rtl8723be_read_adapter_info(hw, false);
2271         } else {
2272                 pr_err("Autoload ERR!!\n");
2273         }
2274         _rtl8723be_hal_customized_behavior(hw);
2275 }
2276
2277 static u8 _rtl8723be_mrate_idx_to_arfr_id(struct ieee80211_hw *hw,
2278                                           u8 rate_index)
2279 {
2280         u8 ret = 0;
2281         switch (rate_index) {
2282         case RATR_INX_WIRELESS_NGB:
2283                 ret = 1;
2284                 break;
2285         case RATR_INX_WIRELESS_N:
2286         case RATR_INX_WIRELESS_NG:
2287                 ret = 5;
2288                 break;
2289         case RATR_INX_WIRELESS_NB:
2290                 ret = 3;
2291                 break;
2292         case RATR_INX_WIRELESS_GB:
2293                 ret = 6;
2294                 break;
2295         case RATR_INX_WIRELESS_G:
2296                 ret = 7;
2297                 break;
2298         case RATR_INX_WIRELESS_B:
2299                 ret = 8;
2300                 break;
2301         default:
2302                 ret = 0;
2303                 break;
2304         }
2305         return ret;
2306 }
2307
2308 static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
2309                                            struct ieee80211_sta *sta,
2310                                            u8 rssi_level, bool update_bw)
2311 {
2312         struct rtl_priv *rtlpriv = rtl_priv(hw);
2313         struct rtl_phy *rtlphy = &(rtlpriv->phy);
2314         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2315         struct rtl_sta_info *sta_entry = NULL;
2316         u32 ratr_bitmap;
2317         u8 ratr_index;
2318         u8 curtxbw_40mhz = (sta->deflink.ht_cap.cap &
2319                               IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
2320         u8 curshortgi_40mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2321                                 1 : 0;
2322         u8 curshortgi_20mhz = (sta->deflink.ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2323                                 1 : 0;
2324         enum wireless_mode wirelessmode = 0;
2325         bool shortgi = false;
2326         u8 rate_mask[7];
2327         u8 macid = 0;
2328
2329         sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2330         wirelessmode = sta_entry->wireless_mode;
2331         if (mac->opmode == NL80211_IFTYPE_STATION ||
2332             mac->opmode == NL80211_IFTYPE_MESH_POINT)
2333                 curtxbw_40mhz = mac->bw_40;
2334         else if (mac->opmode == NL80211_IFTYPE_AP ||
2335                  mac->opmode == NL80211_IFTYPE_ADHOC)
2336                 macid = sta->aid + 1;
2337
2338         ratr_bitmap = sta->deflink.supp_rates[0];
2339
2340         if (mac->opmode == NL80211_IFTYPE_ADHOC)
2341                 ratr_bitmap = 0xfff;
2342
2343         ratr_bitmap |= (sta->deflink.ht_cap.mcs.rx_mask[1] << 20 |
2344                         sta->deflink.ht_cap.mcs.rx_mask[0] << 12);
2345         switch (wirelessmode) {
2346         case WIRELESS_MODE_B:
2347                 ratr_index = RATR_INX_WIRELESS_B;
2348                 if (ratr_bitmap & 0x0000000c)
2349                         ratr_bitmap &= 0x0000000d;
2350                 else
2351                         ratr_bitmap &= 0x0000000f;
2352                 break;
2353         case WIRELESS_MODE_G:
2354                 ratr_index = RATR_INX_WIRELESS_GB;
2355
2356                 if (rssi_level == 1)
2357                         ratr_bitmap &= 0x00000f00;
2358                 else if (rssi_level == 2)
2359                         ratr_bitmap &= 0x00000ff0;
2360                 else
2361                         ratr_bitmap &= 0x00000ff5;
2362                 break;
2363         case WIRELESS_MODE_N_24G:
2364         case WIRELESS_MODE_N_5G:
2365                 ratr_index = RATR_INX_WIRELESS_NGB;
2366                 if (rtlphy->rf_type == RF_1T1R) {
2367                         if (curtxbw_40mhz) {
2368                                 if (rssi_level == 1)
2369                                         ratr_bitmap &= 0x000f0000;
2370                                 else if (rssi_level == 2)
2371                                         ratr_bitmap &= 0x000ff000;
2372                                 else
2373                                         ratr_bitmap &= 0x000ff015;
2374                         } else {
2375                                 if (rssi_level == 1)
2376                                         ratr_bitmap &= 0x000f0000;
2377                                 else if (rssi_level == 2)
2378                                         ratr_bitmap &= 0x000ff000;
2379                                 else
2380                                         ratr_bitmap &= 0x000ff005;
2381                         }
2382                 } else {
2383                         if (curtxbw_40mhz) {
2384                                 if (rssi_level == 1)
2385                                         ratr_bitmap &= 0x0f8f0000;
2386                                 else if (rssi_level == 2)
2387                                         ratr_bitmap &= 0x0f8ff000;
2388                                 else
2389                                         ratr_bitmap &= 0x0f8ff015;
2390                         } else {
2391                                 if (rssi_level == 1)
2392                                         ratr_bitmap &= 0x0f8f0000;
2393                                 else if (rssi_level == 2)
2394                                         ratr_bitmap &= 0x0f8ff000;
2395                                 else
2396                                         ratr_bitmap &= 0x0f8ff005;
2397                         }
2398                 }
2399                 if ((curtxbw_40mhz && curshortgi_40mhz) ||
2400                     (!curtxbw_40mhz && curshortgi_20mhz)) {
2401                         if (macid == 0)
2402                                 shortgi = true;
2403                         else if (macid == 1)
2404                                 shortgi = false;
2405                 }
2406                 break;
2407         default:
2408                 ratr_index = RATR_INX_WIRELESS_NGB;
2409
2410                 if (rtlphy->rf_type == RF_1T2R)
2411                         ratr_bitmap &= 0x000ff0ff;
2412                 else
2413                         ratr_bitmap &= 0x0f0ff0ff;
2414                 break;
2415         }
2416
2417         sta_entry->ratr_index = ratr_index;
2418
2419         rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
2420                 "ratr_bitmap :%x\n", ratr_bitmap);
2421         *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2422                                        (ratr_index << 28);
2423         rate_mask[0] = macid;
2424         rate_mask[1] = _rtl8723be_mrate_idx_to_arfr_id(hw, ratr_index) |
2425                                                       (shortgi ? 0x80 : 0x00);
2426         rate_mask[2] = curtxbw_40mhz | ((!update_bw) << 3);
2427
2428         rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
2429         rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
2430         rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
2431         rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
2432
2433         rtl_dbg(rtlpriv, COMP_RATR, DBG_DMESG,
2434                 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
2435                 ratr_index, ratr_bitmap,
2436                 rate_mask[0], rate_mask[1],
2437                 rate_mask[2], rate_mask[3],
2438                 rate_mask[4], rate_mask[5],
2439                 rate_mask[6]);
2440         rtl8723be_fill_h2c_cmd(hw, H2C_8723B_RA_MASK, 7, rate_mask);
2441         _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
2442 }
2443
2444 void rtl8723be_update_hal_rate_tbl(struct ieee80211_hw *hw,
2445                                    struct ieee80211_sta *sta,
2446                                    u8 rssi_level, bool update_bw)
2447 {
2448         struct rtl_priv *rtlpriv = rtl_priv(hw);
2449         if (rtlpriv->dm.useramask)
2450                 rtl8723be_update_hal_rate_mask(hw, sta, rssi_level, update_bw);
2451 }
2452
2453 void rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw)
2454 {
2455         struct rtl_priv *rtlpriv = rtl_priv(hw);
2456         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2457         u16 sifs_timer;
2458
2459         rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, &mac->slot_time);
2460         if (!mac->ht_enable)
2461                 sifs_timer = 0x0a0a;
2462         else
2463                 sifs_timer = 0x0e0e;
2464         rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
2465 }
2466
2467 bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2468 {
2469         struct rtl_priv *rtlpriv = rtl_priv(hw);
2470         struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2471         struct rtl_phy *rtlphy = &(rtlpriv->phy);
2472         enum rf_pwrstate e_rfpowerstate_toset;
2473         u8 u1tmp;
2474         bool b_actuallyset = false;
2475
2476         if (rtlpriv->rtlhal.being_init_adapter)
2477                 return false;
2478
2479         if (ppsc->swrf_processing)
2480                 return false;
2481
2482         spin_lock(&rtlpriv->locks.rf_ps_lock);
2483         if (ppsc->rfchange_inprogress) {
2484                 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2485                 return false;
2486         } else {
2487                 ppsc->rfchange_inprogress = true;
2488                 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2489         }
2490
2491         rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
2492                        rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL_2) & ~(BIT(1)));
2493
2494         u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
2495
2496         if (rtlphy->polarity_ctl)
2497                 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
2498         else
2499                 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
2500
2501         if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
2502                 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2503                         "GPIOChangeRF  - HW Radio ON, RF ON\n");
2504
2505                 e_rfpowerstate_toset = ERFON;
2506                 ppsc->hwradiooff = false;
2507                 b_actuallyset = true;
2508         } else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) {
2509                 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
2510                         "GPIOChangeRF  - HW Radio OFF, RF OFF\n");
2511
2512                 e_rfpowerstate_toset = ERFOFF;
2513                 ppsc->hwradiooff = true;
2514                 b_actuallyset = true;
2515         }
2516
2517         if (b_actuallyset) {
2518                 spin_lock(&rtlpriv->locks.rf_ps_lock);
2519                 ppsc->rfchange_inprogress = false;
2520                 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2521         } else {
2522                 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
2523                         RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2524
2525                 spin_lock(&rtlpriv->locks.rf_ps_lock);
2526                 ppsc->rfchange_inprogress = false;
2527                 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2528         }
2529
2530         *valid = 1;
2531         return !ppsc->hwradiooff;
2532
2533 }
2534
2535 void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
2536                        u8 *p_macaddr, bool is_group, u8 enc_algo,
2537                        bool is_wepkey, bool clear_all)
2538 {
2539         struct rtl_priv *rtlpriv = rtl_priv(hw);
2540         struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2541         struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2542         u8 *macaddr = p_macaddr;
2543         u32 entry_id = 0;
2544         bool is_pairwise = false;
2545
2546         static u8 cam_const_addr[4][6] = {
2547                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2548                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2549                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
2550                 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
2551         };
2552         static u8 cam_const_broad[] = {
2553                 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2554         };
2555
2556         if (clear_all) {
2557                 u8 idx = 0;
2558                 u8 cam_offset = 0;
2559                 u8 clear_number = 5;
2560
2561                 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
2562
2563                 for (idx = 0; idx < clear_number; idx++) {
2564                         rtl_cam_mark_invalid(hw, cam_offset + idx);
2565                         rtl_cam_empty_entry(hw, cam_offset + idx);
2566
2567                         if (idx < 5) {
2568                                 memset(rtlpriv->sec.key_buf[idx], 0,
2569                                        MAX_KEY_LEN);
2570                                 rtlpriv->sec.key_len[idx] = 0;
2571                         }
2572                 }
2573
2574         } else {
2575                 switch (enc_algo) {
2576                 case WEP40_ENCRYPTION:
2577                         enc_algo = CAM_WEP40;
2578                         break;
2579                 case WEP104_ENCRYPTION:
2580                         enc_algo = CAM_WEP104;
2581                         break;
2582                 case TKIP_ENCRYPTION:
2583                         enc_algo = CAM_TKIP;
2584                         break;
2585                 case AESCCMP_ENCRYPTION:
2586                         enc_algo = CAM_AES;
2587                         break;
2588                 default:
2589                         rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
2590                                 "switch case %#x not processed\n", enc_algo);
2591                         enc_algo = CAM_TKIP;
2592                         break;
2593                 }
2594
2595                 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
2596                         macaddr = cam_const_addr[key_index];
2597                         entry_id = key_index;
2598                 } else {
2599                         if (is_group) {
2600                                 macaddr = cam_const_broad;
2601                                 entry_id = key_index;
2602                         } else {
2603                                 if (mac->opmode == NL80211_IFTYPE_AP) {
2604                                         entry_id = rtl_cam_get_free_entry(hw,
2605                                                                 p_macaddr);
2606                                         if (entry_id >=  TOTAL_CAM_ENTRY) {
2607                                                 pr_err("Can not find free hw security cam entry\n");
2608                                                 return;
2609                                         }
2610                                 } else {
2611                                         entry_id = CAM_PAIRWISE_KEY_POSITION;
2612                                 }
2613
2614                                 key_index = PAIRWISE_KEYIDX;
2615                                 is_pairwise = true;
2616                         }
2617                 }
2618
2619                 if (rtlpriv->sec.key_len[key_index] == 0) {
2620                         rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2621                                 "delete one entry, entry_id is %d\n",
2622                                 entry_id);
2623                         if (mac->opmode == NL80211_IFTYPE_AP)
2624                                 rtl_cam_del_entry(hw, p_macaddr);
2625                         rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
2626                 } else {
2627                         rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2628                                 "add one entry\n");
2629                         if (is_pairwise) {
2630                                 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2631                                         "set Pairwise key\n");
2632
2633                                 rtl_cam_add_one_entry(hw, macaddr, key_index,
2634                                                entry_id, enc_algo,
2635                                                CAM_CONFIG_NO_USEDK,
2636                                                rtlpriv->sec.key_buf[key_index]);
2637                         } else {
2638                                 rtl_dbg(rtlpriv, COMP_SEC, DBG_DMESG,
2639                                         "set group key\n");
2640
2641                                 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2642                                         rtl_cam_add_one_entry(hw,
2643                                                 rtlefuse->dev_addr,
2644                                                 PAIRWISE_KEYIDX,
2645                                                 CAM_PAIRWISE_KEY_POSITION,
2646                                                 enc_algo,
2647                                                 CAM_CONFIG_NO_USEDK,
2648                                                 rtlpriv->sec.key_buf
2649                                                 [entry_id]);
2650                                 }
2651
2652                                 rtl_cam_add_one_entry(hw, macaddr, key_index,
2653                                                 entry_id, enc_algo,
2654                                                 CAM_CONFIG_NO_USEDK,
2655                                                 rtlpriv->sec.key_buf[entry_id]);
2656                         }
2657                 }
2658         }
2659 }
2660
2661 void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2662                                               bool auto_load_fail, u8 *hwinfo)
2663 {
2664         struct rtl_priv *rtlpriv = rtl_priv(hw);
2665         struct rtl_mod_params *mod_params = rtlpriv->cfg->mod_params;
2666         u8 value;
2667         u32 tmpu_32;
2668
2669         if (!auto_load_fail) {
2670                 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
2671                 if (tmpu_32 & BIT(18))
2672                         rtlpriv->btcoexist.btc_info.btcoexist = 1;
2673                 else
2674                         rtlpriv->btcoexist.btc_info.btcoexist = 0;
2675                 value = hwinfo[EEPROM_RF_BT_SETTING_8723B];
2676                 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
2677                 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
2678                 rtlpriv->btcoexist.btc_info.single_ant_path =
2679                          (value & 0x40 ? ANT_AUX : ANT_MAIN);   /*0xc3[6]*/
2680         } else {
2681                 rtlpriv->btcoexist.btc_info.btcoexist = 0;
2682                 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
2683                 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
2684                 rtlpriv->btcoexist.btc_info.single_ant_path = ANT_MAIN;
2685         }
2686
2687         /* override ant_num / ant_path */
2688         if (mod_params->ant_sel) {
2689                 rtlpriv->btcoexist.btc_info.ant_num =
2690                         (mod_params->ant_sel == 1 ? ANT_X1 : ANT_X2);
2691
2692                 rtlpriv->btcoexist.btc_info.single_ant_path =
2693                         (mod_params->ant_sel == 1 ? ANT_AUX : ANT_MAIN);
2694         }
2695 }
2696
2697 void rtl8723be_bt_reg_init(struct ieee80211_hw *hw)
2698 {
2699         struct rtl_priv *rtlpriv = rtl_priv(hw);
2700
2701         /* 0:Low, 1:High, 2:From Efuse. */
2702         rtlpriv->btcoexist.reg_bt_iso = 2;
2703         /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2704         rtlpriv->btcoexist.reg_bt_sco = 3;
2705         /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2706         rtlpriv->btcoexist.reg_bt_sco = 0;
2707 }
2708
2709 void rtl8723be_bt_hw_init(struct ieee80211_hw *hw)
2710 {
2711         struct rtl_priv *rtlpriv = rtl_priv(hw);
2712
2713         if (rtlpriv->cfg->ops->get_btc_status())
2714                 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
2715
2716 }
2717
2718 void rtl8723be_suspend(struct ieee80211_hw *hw)
2719 {
2720 }
2721
2722 void rtl8723be_resume(struct ieee80211_hw *hw)
2723 {
2724 }
This page took 0.200068 seconds and 4 git commands to generate.