]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
Merge branch 'perf/urgent' into perf/core, to pick up fixes
[mirror_ubuntu-bionic-kernel.git] / drivers / net / wireless / rtlwifi / rtl8192ee / hw.c
1 /******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26 #include "../wifi.h"
27 #include "../efuse.h"
28 #include "../base.h"
29 #include "../regd.h"
30 #include "../cam.h"
31 #include "../ps.h"
32 #include "../pci.h"
33 #include "reg.h"
34 #include "def.h"
35 #include "phy.h"
36 #include "dm.h"
37 #include "fw.h"
38 #include "led.h"
39 #include "hw.h"
40 #include "../pwrseqcmd.h"
41 #include "pwrseq.h"
42
43 #define LLT_CONFIG 5
44
45 static void _rtl92ee_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
46 u8 set_bits, u8 clear_bits)
47 {
48 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
49 struct rtl_priv *rtlpriv = rtl_priv(hw);
50
51 rtlpci->reg_bcn_ctrl_val |= set_bits;
52 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
53
54 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
55 }
56
57 static void _rtl92ee_stop_tx_beacon(struct ieee80211_hw *hw)
58 {
59 struct rtl_priv *rtlpriv = rtl_priv(hw);
60 u8 tmp;
61
62 tmp = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
63 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp & (~BIT(6)));
64 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
65 tmp = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
66 tmp &= ~(BIT(0));
67 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp);
68 }
69
70 static void _rtl92ee_resume_tx_beacon(struct ieee80211_hw *hw)
71 {
72 struct rtl_priv *rtlpriv = rtl_priv(hw);
73 u8 tmp;
74
75 tmp = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
76 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp | BIT(6));
77 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
78 tmp = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
79 tmp |= BIT(0);
80 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp);
81 }
82
83 static void _rtl92ee_enable_bcn_sub_func(struct ieee80211_hw *hw)
84 {
85 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(1));
86 }
87
88 static void _rtl92ee_return_beacon_queue_skb(struct ieee80211_hw *hw)
89 {
90 struct rtl_priv *rtlpriv = rtl_priv(hw);
91 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
92 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
93 unsigned long flags;
94
95 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
96 while (skb_queue_len(&ring->queue)) {
97 struct rtl_tx_buffer_desc *entry =
98 &ring->buffer_desc[ring->idx];
99 struct sk_buff *skb = __skb_dequeue(&ring->queue);
100
101 pci_unmap_single(rtlpci->pdev,
102 rtlpriv->cfg->ops->get_desc(
103 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
104 skb->len, PCI_DMA_TODEVICE);
105 kfree_skb(skb);
106 ring->idx = (ring->idx + 1) % ring->entries;
107 }
108 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
109 }
110
111 static void _rtl92ee_disable_bcn_sub_func(struct ieee80211_hw *hw)
112 {
113 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(1), 0);
114 }
115
116 static void _rtl92ee_set_fw_clock_on(struct ieee80211_hw *hw,
117 u8 rpwm_val, bool b_need_turn_off_ckk)
118 {
119 struct rtl_priv *rtlpriv = rtl_priv(hw);
120 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
121 bool b_support_remote_wake_up;
122 u32 count = 0, isr_regaddr, content;
123 bool b_schedule_timer = b_need_turn_off_ckk;
124
125 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
126 (u8 *)(&b_support_remote_wake_up));
127
128 if (!rtlhal->fw_ready)
129 return;
130 if (!rtlpriv->psc.fw_current_inpsmode)
131 return;
132
133 while (1) {
134 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
135 if (rtlhal->fw_clk_change_in_progress) {
136 while (rtlhal->fw_clk_change_in_progress) {
137 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
138 count++;
139 udelay(100);
140 if (count > 1000)
141 return;
142 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
143 }
144 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
145 } else {
146 rtlhal->fw_clk_change_in_progress = false;
147 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
148 break;
149 }
150 }
151
152 if (IS_IN_LOW_POWER_STATE_92E(rtlhal->fw_ps_state)) {
153 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
154 (u8 *)(&rpwm_val));
155 if (FW_PS_IS_ACK(rpwm_val)) {
156 isr_regaddr = REG_HISR;
157 content = rtl_read_dword(rtlpriv, isr_regaddr);
158 while (!(content & IMR_CPWM) && (count < 500)) {
159 udelay(50);
160 count++;
161 content = rtl_read_dword(rtlpriv, isr_regaddr);
162 }
163
164 if (content & IMR_CPWM) {
165 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
166 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_92E;
167 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
168 "Receive CPWM INT!!! PSState = %X\n",
169 rtlhal->fw_ps_state);
170 }
171 }
172
173 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
174 rtlhal->fw_clk_change_in_progress = false;
175 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
176 if (b_schedule_timer) {
177 mod_timer(&rtlpriv->works.fw_clockoff_timer,
178 jiffies + MSECS(10));
179 }
180 } else {
181 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
182 rtlhal->fw_clk_change_in_progress = false;
183 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
184 }
185 }
186
187 static void _rtl92ee_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
188 {
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
191 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
192 struct rtl8192_tx_ring *ring;
193 enum rf_pwrstate rtstate;
194 bool b_schedule_timer = false;
195 u8 queue;
196
197 if (!rtlhal->fw_ready)
198 return;
199 if (!rtlpriv->psc.fw_current_inpsmode)
200 return;
201 if (!rtlhal->allow_sw_to_change_hwclc)
202 return;
203
204 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
205 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
206 return;
207
208 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
209 ring = &rtlpci->tx_ring[queue];
210 if (skb_queue_len(&ring->queue)) {
211 b_schedule_timer = true;
212 break;
213 }
214 }
215
216 if (b_schedule_timer) {
217 mod_timer(&rtlpriv->works.fw_clockoff_timer,
218 jiffies + MSECS(10));
219 return;
220 }
221
222 if (FW_PS_STATE(rtlhal->fw_ps_state) != FW_PS_STATE_RF_OFF_LOW_PWR) {
223 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
224 if (!rtlhal->fw_clk_change_in_progress) {
225 rtlhal->fw_clk_change_in_progress = true;
226 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
227 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
228 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
229 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
230 (u8 *)(&rpwm_val));
231 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
232 rtlhal->fw_clk_change_in_progress = false;
233 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
234 } else {
235 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
236 mod_timer(&rtlpriv->works.fw_clockoff_timer,
237 jiffies + MSECS(10));
238 }
239 }
240 }
241
242 static void _rtl92ee_set_fw_ps_rf_on(struct ieee80211_hw *hw)
243 {
244 u8 rpwm_val = 0;
245
246 rpwm_val |= (FW_PS_STATE_RF_OFF_92E | FW_PS_ACK);
247 _rtl92ee_set_fw_clock_on(hw, rpwm_val, true);
248 }
249
250 static void _rtl92ee_set_fw_ps_rf_off_low_power(struct ieee80211_hw *hw)
251 {
252 u8 rpwm_val = 0;
253
254 rpwm_val |= FW_PS_STATE_RF_OFF_LOW_PWR;
255 _rtl92ee_set_fw_clock_off(hw, rpwm_val);
256 }
257
258 void rtl92ee_fw_clk_off_timer_callback(unsigned long data)
259 {
260 struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
261
262 _rtl92ee_set_fw_ps_rf_off_low_power(hw);
263 }
264
265 static void _rtl92ee_fwlps_leave(struct ieee80211_hw *hw)
266 {
267 struct rtl_priv *rtlpriv = rtl_priv(hw);
268 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
269 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
270 bool fw_current_inps = false;
271 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
272
273 if (ppsc->low_power_enable) {
274 rpwm_val = (FW_PS_STATE_ALL_ON_92E | FW_PS_ACK);/* RF on */
275 _rtl92ee_set_fw_clock_on(hw, rpwm_val, false);
276 rtlhal->allow_sw_to_change_hwclc = false;
277 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
278 (u8 *)(&fw_pwrmode));
279 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
280 (u8 *)(&fw_current_inps));
281 } else {
282 rpwm_val = FW_PS_STATE_ALL_ON_92E; /* RF on */
283 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
284 (u8 *)(&rpwm_val));
285 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
286 (u8 *)(&fw_pwrmode));
287 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
288 (u8 *)(&fw_current_inps));
289 }
290 }
291
292 static void _rtl92ee_fwlps_enter(struct ieee80211_hw *hw)
293 {
294 struct rtl_priv *rtlpriv = rtl_priv(hw);
295 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
296 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
297 bool fw_current_inps = true;
298 u8 rpwm_val;
299
300 if (ppsc->low_power_enable) {
301 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR; /* RF off */
302 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
303 (u8 *)(&fw_current_inps));
304 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
305 (u8 *)(&ppsc->fwctrl_psmode));
306 rtlhal->allow_sw_to_change_hwclc = true;
307 _rtl92ee_set_fw_clock_off(hw, rpwm_val);
308 } else {
309 rpwm_val = FW_PS_STATE_RF_OFF_92E; /* RF off */
310 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
311 (u8 *)(&fw_current_inps));
312 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
313 (u8 *)(&ppsc->fwctrl_psmode));
314 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
315 (u8 *)(&rpwm_val));
316 }
317 }
318
319 void rtl92ee_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
320 {
321 struct rtl_priv *rtlpriv = rtl_priv(hw);
322 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
323 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
324
325 switch (variable) {
326 case HW_VAR_RCR:
327 *((u32 *)(val)) = rtlpci->receive_config;
328 break;
329 case HW_VAR_RF_STATE:
330 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
331 break;
332 case HW_VAR_FWLPS_RF_ON:{
333 enum rf_pwrstate rfstate;
334 u32 val_rcr;
335
336 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE,
337 (u8 *)(&rfstate));
338 if (rfstate == ERFOFF) {
339 *((bool *)(val)) = true;
340 } else {
341 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
342 val_rcr &= 0x00070000;
343 if (val_rcr)
344 *((bool *)(val)) = false;
345 else
346 *((bool *)(val)) = true;
347 }
348 }
349 break;
350 case HW_VAR_FW_PSMODE_STATUS:
351 *((bool *)(val)) = ppsc->fw_current_inpsmode;
352 break;
353 case HW_VAR_CORRECT_TSF:{
354 u64 tsf;
355 u32 *ptsf_low = (u32 *)&tsf;
356 u32 *ptsf_high = ((u32 *)&tsf) + 1;
357
358 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
359 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
360
361 *((u64 *)(val)) = tsf;
362 }
363 break;
364 default:
365 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
366 "switch case not process %x\n", variable);
367 break;
368 }
369 }
370
371 static void _rtl92ee_download_rsvd_page(struct ieee80211_hw *hw)
372 {
373 struct rtl_priv *rtlpriv = rtl_priv(hw);
374 u8 tmp_regcr, tmp_reg422;
375 u8 bcnvalid_reg, txbc_reg;
376 u8 count = 0, dlbcn_count = 0;
377 bool b_recover = false;
378
379 /*Set REG_CR bit 8. DMA beacon by SW.*/
380 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
381 rtl_write_byte(rtlpriv, REG_CR + 1, tmp_regcr | BIT(0));
382
383 /* Disable Hw protection for a time which revserd for Hw sending beacon.
384 * Fix download reserved page packet fail
385 * that access collision with the protection time.
386 * 2010.05.11. Added by tynli.
387 */
388 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
389 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
390
391 /* Set FWHW_TXQ_CTRL 0x422[6]=0 to
392 * tell Hw the packet is not a real beacon frame.
393 */
394 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
395 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422 & (~BIT(6)));
396
397 if (tmp_reg422 & BIT(6))
398 b_recover = true;
399
400 do {
401 /* Clear beacon valid check bit */
402 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_DWBCN0_CTRL + 2);
403 rtl_write_byte(rtlpriv, REG_DWBCN0_CTRL + 2,
404 bcnvalid_reg | BIT(0));
405
406 /* Return Beacon TCB */
407 _rtl92ee_return_beacon_queue_skb(hw);
408
409 /* download rsvd page */
410 rtl92ee_set_fw_rsvdpagepkt(hw, false);
411
412 txbc_reg = rtl_read_byte(rtlpriv, REG_MGQ_TXBD_NUM + 3);
413 count = 0;
414 while ((txbc_reg & BIT(4)) && count < 20) {
415 count++;
416 udelay(10);
417 txbc_reg = rtl_read_byte(rtlpriv, REG_MGQ_TXBD_NUM + 3);
418 }
419 rtl_write_byte(rtlpriv, REG_MGQ_TXBD_NUM + 3,
420 txbc_reg | BIT(4));
421
422 /* check rsvd page download OK. */
423 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_DWBCN0_CTRL + 2);
424 count = 0;
425 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
426 count++;
427 udelay(50);
428 bcnvalid_reg = rtl_read_byte(rtlpriv,
429 REG_DWBCN0_CTRL + 2);
430 }
431
432 if (bcnvalid_reg & BIT(0))
433 rtl_write_byte(rtlpriv, REG_DWBCN0_CTRL + 2, BIT(0));
434
435 dlbcn_count++;
436 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
437
438 if (!(bcnvalid_reg & BIT(0)))
439 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
440 "Download RSVD page failed!\n");
441
442 /* Enable Bcn */
443 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
444 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
445
446 if (b_recover)
447 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
448
449 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
450 rtl_write_byte(rtlpriv, REG_CR + 1, tmp_regcr & (~BIT(0)));
451 }
452
453 void rtl92ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
454 {
455 struct rtl_priv *rtlpriv = rtl_priv(hw);
456 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
457 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
458 struct rtl_efuse *efuse = rtl_efuse(rtl_priv(hw));
459 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
460 u8 idx;
461
462 switch (variable) {
463 case HW_VAR_ETHER_ADDR:
464 for (idx = 0; idx < ETH_ALEN; idx++)
465 rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]);
466 break;
467 case HW_VAR_BASIC_RATE:{
468 u16 b_rate_cfg = ((u16 *)val)[0];
469
470 b_rate_cfg = b_rate_cfg & 0x15f;
471 b_rate_cfg |= 0x01;
472 b_rate_cfg = (b_rate_cfg | 0xd) & (~BIT(1));
473 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
474 rtl_write_byte(rtlpriv, REG_RRSR + 1, (b_rate_cfg >> 8) & 0xff);
475 break; }
476 case HW_VAR_BSSID:
477 for (idx = 0; idx < ETH_ALEN; idx++)
478 rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]);
479 break;
480 case HW_VAR_SIFS:
481 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
482 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
483
484 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
485 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
486
487 if (!mac->ht_enable)
488 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 0x0e0e);
489 else
490 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
491 *((u16 *)val));
492 break;
493 case HW_VAR_SLOT_TIME:{
494 u8 e_aci;
495
496 RT_TRACE(rtlpriv, COMP_MLME, DBG_TRACE,
497 "HW_VAR_SLOT_TIME %x\n", val[0]);
498
499 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
500
501 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
502 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
503 (u8 *)(&e_aci));
504 }
505 break; }
506 case HW_VAR_ACK_PREAMBLE:{
507 u8 reg_tmp;
508 u8 short_preamble = (bool)(*(u8 *)val);
509
510 reg_tmp = (rtlpriv->mac80211.cur_40_prime_sc) << 5;
511 if (short_preamble)
512 reg_tmp |= 0x80;
513 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_tmp);
514 rtlpriv->mac80211.short_preamble = short_preamble;
515 }
516 break;
517 case HW_VAR_WPA_CONFIG:
518 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
519 break;
520 case HW_VAR_AMPDU_FACTOR:{
521 u8 regtoset_normal[4] = { 0x41, 0xa8, 0x72, 0xb9 };
522 u8 fac;
523 u8 *reg = NULL;
524 u8 i = 0;
525
526 reg = regtoset_normal;
527
528 fac = *((u8 *)val);
529 if (fac <= 3) {
530 fac = (1 << (fac + 2));
531 if (fac > 0xf)
532 fac = 0xf;
533 for (i = 0; i < 4; i++) {
534 if ((reg[i] & 0xf0) > (fac << 4))
535 reg[i] = (reg[i] & 0x0f) |
536 (fac << 4);
537 if ((reg[i] & 0x0f) > fac)
538 reg[i] = (reg[i] & 0xf0) | fac;
539 rtl_write_byte(rtlpriv,
540 (REG_AGGLEN_LMT + i),
541 reg[i]);
542 }
543 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
544 "Set HW_VAR_AMPDU_FACTOR:%#x\n", fac);
545 }
546 }
547 break;
548 case HW_VAR_AC_PARAM:{
549 u8 e_aci = *((u8 *)val);
550
551 if (rtlpci->acm_method != EACMWAY2_SW)
552 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL,
553 (u8 *)(&e_aci));
554 }
555 break;
556 case HW_VAR_ACM_CTRL:{
557 u8 e_aci = *((u8 *)val);
558 union aci_aifsn *aifs = (union aci_aifsn *)(&mac->ac[0].aifs);
559
560 u8 acm = aifs->f.acm;
561 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
562
563 acm_ctrl = acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
564
565 if (acm) {
566 switch (e_aci) {
567 case AC0_BE:
568 acm_ctrl |= ACMHW_BEQEN;
569 break;
570 case AC2_VI:
571 acm_ctrl |= ACMHW_VIQEN;
572 break;
573 case AC3_VO:
574 acm_ctrl |= ACMHW_VOQEN;
575 break;
576 default:
577 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
578 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
579 acm);
580 break;
581 }
582 } else {
583 switch (e_aci) {
584 case AC0_BE:
585 acm_ctrl &= (~ACMHW_BEQEN);
586 break;
587 case AC2_VI:
588 acm_ctrl &= (~ACMHW_VIQEN);
589 break;
590 case AC3_VO:
591 acm_ctrl &= (~ACMHW_BEQEN);
592 break;
593 default:
594 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
595 "switch case not process\n");
596 break;
597 }
598 }
599
600 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
601 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
602 acm_ctrl);
603 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
604 }
605 break;
606 case HW_VAR_RCR:{
607 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
608 rtlpci->receive_config = ((u32 *)(val))[0];
609 }
610 break;
611 case HW_VAR_RETRY_LIMIT:{
612 u8 retry_limit = ((u8 *)(val))[0];
613
614 rtl_write_word(rtlpriv, REG_RETRY_LIMIT,
615 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
616 retry_limit << RETRY_LIMIT_LONG_SHIFT);
617 }
618 break;
619 case HW_VAR_DUAL_TSF_RST:
620 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
621 break;
622 case HW_VAR_EFUSE_BYTES:
623 efuse->efuse_usedbytes = *((u16 *)val);
624 break;
625 case HW_VAR_EFUSE_USAGE:
626 efuse->efuse_usedpercentage = *((u8 *)val);
627 break;
628 case HW_VAR_IO_CMD:
629 rtl92ee_phy_set_io_cmd(hw, (*(enum io_type *)val));
630 break;
631 case HW_VAR_SET_RPWM:{
632 u8 rpwm_val;
633
634 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
635 udelay(1);
636
637 if (rpwm_val & BIT(7)) {
638 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, (*(u8 *)val));
639 } else {
640 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
641 ((*(u8 *)val) | BIT(7)));
642 }
643 }
644 break;
645 case HW_VAR_H2C_FW_PWRMODE:
646 rtl92ee_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
647 break;
648 case HW_VAR_FW_PSMODE_STATUS:
649 ppsc->fw_current_inpsmode = *((bool *)val);
650 break;
651 case HW_VAR_RESUME_CLK_ON:
652 _rtl92ee_set_fw_ps_rf_on(hw);
653 break;
654 case HW_VAR_FW_LPS_ACTION:{
655 bool b_enter_fwlps = *((bool *)val);
656
657 if (b_enter_fwlps)
658 _rtl92ee_fwlps_enter(hw);
659 else
660 _rtl92ee_fwlps_leave(hw);
661 }
662 break;
663 case HW_VAR_H2C_FW_JOINBSSRPT:{
664 u8 mstatus = (*(u8 *)val);
665
666 if (mstatus == RT_MEDIA_CONNECT) {
667 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
668 _rtl92ee_download_rsvd_page(hw);
669 }
670 rtl92ee_set_fw_media_status_rpt_cmd(hw, mstatus);
671 }
672 break;
673 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
674 rtl92ee_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
675 break;
676 case HW_VAR_AID:{
677 u16 u2btmp;
678
679 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
680 u2btmp &= 0xC000;
681 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT,
682 (u2btmp | mac->assoc_id));
683 }
684 break;
685 case HW_VAR_CORRECT_TSF:{
686 u8 btype_ibss = ((u8 *)(val))[0];
687
688 if (btype_ibss)
689 _rtl92ee_stop_tx_beacon(hw);
690
691 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
692
693 rtl_write_dword(rtlpriv, REG_TSFTR,
694 (u32)(mac->tsf & 0xffffffff));
695 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
696 (u32)((mac->tsf >> 32) & 0xffffffff));
697
698 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
699
700 if (btype_ibss)
701 _rtl92ee_resume_tx_beacon(hw);
702 }
703 break;
704 case HW_VAR_KEEP_ALIVE: {
705 u8 array[2];
706
707 array[0] = 0xff;
708 array[1] = *((u8 *)val);
709 rtl92ee_fill_h2c_cmd(hw, H2C_92E_KEEP_ALIVE_CTRL, 2, array);
710 }
711 break;
712 default:
713 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
714 "switch case not process %x\n", variable);
715 break;
716 }
717 }
718
719 static bool _rtl92ee_llt_table_init(struct ieee80211_hw *hw)
720 {
721 struct rtl_priv *rtlpriv = rtl_priv(hw);
722 u8 txpktbuf_bndy;
723 u8 u8tmp, testcnt = 0;
724
725 txpktbuf_bndy = 0xFA;
726
727 rtl_write_dword(rtlpriv, REG_RQPN, 0x80E90808);
728
729 rtl_write_byte(rtlpriv, REG_TRXFF_BNDY, txpktbuf_bndy);
730 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x3d00 - 1);
731
732 rtl_write_byte(rtlpriv, REG_DWBCN0_CTRL + 1, txpktbuf_bndy);
733 rtl_write_byte(rtlpriv, REG_DWBCN1_CTRL + 1, txpktbuf_bndy);
734
735 rtl_write_byte(rtlpriv, REG_BCNQ_BDNY, txpktbuf_bndy);
736 rtl_write_byte(rtlpriv, REG_BCNQ1_BDNY, txpktbuf_bndy);
737
738 rtl_write_byte(rtlpriv, REG_MGQ_BDNY, txpktbuf_bndy);
739 rtl_write_byte(rtlpriv, 0x45D, txpktbuf_bndy);
740
741 rtl_write_byte(rtlpriv, REG_PBP, 0x31);
742 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
743
744 u8tmp = rtl_read_byte(rtlpriv, REG_AUTO_LLT + 2);
745 rtl_write_byte(rtlpriv, REG_AUTO_LLT + 2, u8tmp | BIT(0));
746
747 while (u8tmp & BIT(0)) {
748 u8tmp = rtl_read_byte(rtlpriv, REG_AUTO_LLT + 2);
749 udelay(10);
750 testcnt++;
751 if (testcnt > 10)
752 break;
753 }
754
755 return true;
756 }
757
758 static void _rtl92ee_gen_refresh_led_state(struct ieee80211_hw *hw)
759 {
760 struct rtl_priv *rtlpriv = rtl_priv(hw);
761 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
762 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
763 struct rtl_led *pled0 = &pcipriv->ledctl.sw_led0;
764
765 if (rtlpriv->rtlhal.up_first_time)
766 return;
767
768 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
769 rtl92ee_sw_led_on(hw, pled0);
770 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
771 rtl92ee_sw_led_on(hw, pled0);
772 else
773 rtl92ee_sw_led_off(hw, pled0);
774 }
775
776 static bool _rtl92ee_init_mac(struct ieee80211_hw *hw)
777 {
778 struct rtl_priv *rtlpriv = rtl_priv(hw);
779 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
780 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
781
782 u8 bytetmp;
783 u16 wordtmp;
784 u32 dwordtmp;
785
786 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0);
787
788 dwordtmp = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
789 if (dwordtmp & BIT(24)) {
790 rtl_write_byte(rtlpriv, 0x7c, 0xc3);
791 } else {
792 bytetmp = rtl_read_byte(rtlpriv, 0x16);
793 rtl_write_byte(rtlpriv, 0x16, bytetmp | BIT(4) | BIT(6));
794 rtl_write_byte(rtlpriv, 0x7c, 0x83);
795 }
796 /* 1. 40Mhz crystal source*/
797 bytetmp = rtl_read_byte(rtlpriv, REG_AFE_CTRL2);
798 bytetmp &= 0xfb;
799 rtl_write_byte(rtlpriv, REG_AFE_CTRL2, bytetmp);
800
801 dwordtmp = rtl_read_dword(rtlpriv, REG_AFE_CTRL4);
802 dwordtmp &= 0xfffffc7f;
803 rtl_write_dword(rtlpriv, REG_AFE_CTRL4, dwordtmp);
804
805 /* 2. 92E AFE parameter
806 * MP chip then check version
807 */
808 bytetmp = rtl_read_byte(rtlpriv, REG_AFE_CTRL2);
809 bytetmp &= 0xbf;
810 rtl_write_byte(rtlpriv, REG_AFE_CTRL2, bytetmp);
811
812 dwordtmp = rtl_read_dword(rtlpriv, REG_AFE_CTRL4);
813 dwordtmp &= 0xffdfffff;
814 rtl_write_dword(rtlpriv, REG_AFE_CTRL4, dwordtmp);
815
816 /* HW Power on sequence */
817 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
818 PWR_INTF_PCI_MSK,
819 RTL8192E_NIC_ENABLE_FLOW)) {
820 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
821 "init MAC Fail as rtl_hal_pwrseqcmdparsing\n");
822 return false;
823 }
824
825 /* Release MAC IO register reset */
826 bytetmp = rtl_read_byte(rtlpriv, REG_CR);
827 bytetmp = 0xff;
828 rtl_write_byte(rtlpriv, REG_CR, bytetmp);
829 mdelay(2);
830 bytetmp = 0x7f;
831 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
832 mdelay(2);
833
834 /* Add for wakeup online */
835 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
836 rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp | BIT(3));
837 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
838 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp & (~BIT(4)));
839 /* Release MAC IO register reset */
840 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
841
842 if (!rtlhal->mac_func_enable) {
843 if (_rtl92ee_llt_table_init(hw) == false) {
844 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
845 "LLT table init fail\n");
846 return false;
847 }
848 }
849
850 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
851 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
852
853 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
854 wordtmp &= 0xf;
855 wordtmp |= 0xF5B1;
856 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
857 /* Reported Tx status from HW for rate adaptive.*/
858 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
859
860 /* Set RCR register */
861 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
862 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xffff);
863
864 /* Set TCR register */
865 rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
866
867 /* Set TX/RX descriptor physical address(from OS API). */
868 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
869 ((u64)rtlpci->tx_ring[BEACON_QUEUE].buffer_desc_dma) &
870 DMA_BIT_MASK(32));
871 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
872 (u64)rtlpci->tx_ring[MGNT_QUEUE].buffer_desc_dma &
873 DMA_BIT_MASK(32));
874 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
875 (u64)rtlpci->tx_ring[VO_QUEUE].buffer_desc_dma &
876 DMA_BIT_MASK(32));
877 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
878 (u64)rtlpci->tx_ring[VI_QUEUE].buffer_desc_dma &
879 DMA_BIT_MASK(32));
880
881 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
882 (u64)rtlpci->tx_ring[BE_QUEUE].buffer_desc_dma &
883 DMA_BIT_MASK(32));
884
885 dwordtmp = rtl_read_dword(rtlpriv, REG_BEQ_DESA);
886
887 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
888 (u64)rtlpci->tx_ring[BK_QUEUE].buffer_desc_dma &
889 DMA_BIT_MASK(32));
890 rtl_write_dword(rtlpriv, REG_HQ0_DESA,
891 (u64)rtlpci->tx_ring[HIGH_QUEUE].buffer_desc_dma &
892 DMA_BIT_MASK(32));
893
894 rtl_write_dword(rtlpriv, REG_RX_DESA,
895 (u64)rtlpci->rx_ring[RX_MPDU_QUEUE].dma &
896 DMA_BIT_MASK(32));
897
898 /* if we want to support 64 bit DMA, we should set it here,
899 * but now we do not support 64 bit DMA
900 */
901
902 rtl_write_dword(rtlpriv, REG_TSFTIMER_HCI, 0x3fffffff);
903
904 bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 3);
905 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, bytetmp | 0xF7);
906
907 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
908
909 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
910
911 rtl_write_word(rtlpriv, REG_MGQ_TXBD_NUM,
912 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
913 rtl_write_word(rtlpriv, REG_VOQ_TXBD_NUM,
914 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
915 rtl_write_word(rtlpriv, REG_VIQ_TXBD_NUM,
916 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
917 rtl_write_word(rtlpriv, REG_BEQ_TXBD_NUM,
918 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
919 rtl_write_word(rtlpriv, REG_VOQ_TXBD_NUM,
920 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
921 rtl_write_word(rtlpriv, REG_BKQ_TXBD_NUM,
922 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
923 rtl_write_word(rtlpriv, REG_HI0Q_TXBD_NUM,
924 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
925 rtl_write_word(rtlpriv, REG_HI1Q_TXBD_NUM,
926 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
927 rtl_write_word(rtlpriv, REG_HI2Q_TXBD_NUM,
928 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
929 rtl_write_word(rtlpriv, REG_HI3Q_TXBD_NUM,
930 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
931 rtl_write_word(rtlpriv, REG_HI4Q_TXBD_NUM,
932 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
933 rtl_write_word(rtlpriv, REG_HI5Q_TXBD_NUM,
934 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
935 rtl_write_word(rtlpriv, REG_HI6Q_TXBD_NUM,
936 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
937 rtl_write_word(rtlpriv, REG_HI7Q_TXBD_NUM,
938 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
939 /*Rx*/
940 #if (DMA_IS_64BIT == 1)
941 rtl_write_word(rtlpriv, REG_RX_RXBD_NUM,
942 RX_DESC_NUM_92E |
943 ((RTL8192EE_SEG_NUM << 13) & 0x6000) | 0x8000);
944 #else
945 rtl_write_word(rtlpriv, REG_RX_RXBD_NUM,
946 RX_DESC_NUM_92E |
947 ((RTL8192EE_SEG_NUM << 13) & 0x6000) | 0x0000);
948 #endif
949
950 rtl_write_dword(rtlpriv, REG_TSFTIMER_HCI, 0XFFFFFFFF);
951
952 _rtl92ee_gen_refresh_led_state(hw);
953 return true;
954 }
955
956 static void _rtl92ee_hw_configure(struct ieee80211_hw *hw)
957 {
958 struct rtl_priv *rtlpriv = rtl_priv(hw);
959 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
960 u32 reg_rrsr;
961
962 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
963 /* Init value for RRSR. */
964 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
965
966 /* ARFB table 9 for 11ac 5G 2SS */
967 rtl_write_dword(rtlpriv, REG_ARFR0, 0x00000010);
968 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0x3e0ff000);
969
970 /* ARFB table 10 for 11ac 5G 1SS */
971 rtl_write_dword(rtlpriv, REG_ARFR1, 0x00000010);
972 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x000ff000);
973
974 /* Set SLOT time */
975 rtl_write_byte(rtlpriv, REG_SLOT, 0x09);
976
977 /* CF-End setting. */
978 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F80);
979
980 /* Set retry limit */
981 rtl_write_word(rtlpriv, REG_RETRY_LIMIT, 0x0707);
982
983 /* BAR settings */
984 rtl_write_dword(rtlpriv, REG_BAR_MODE_CTRL, 0x0201ffff);
985
986 /* Set Data / Response auto rate fallack retry count */
987 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
988 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
989 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
990 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
991
992 /* Beacon related, for rate adaptive */
993 rtl_write_byte(rtlpriv, REG_ATIMWND, 0x2);
994 rtl_write_byte(rtlpriv, REG_BCN_MAX_ERR, 0xff);
995
996 rtlpci->reg_bcn_ctrl_val = 0x1d;
997 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
998
999 /* Marked out by Bruce, 2010-09-09.
1000 * This register is configured for the 2nd Beacon (multiple BSSID).
1001 * We shall disable this register if we only support 1 BSSID.
1002 * vivi guess 92d also need this, also 92d now doesnot set this reg
1003 */
1004 rtl_write_byte(rtlpriv, REG_BCN_CTRL_1, 0);
1005
1006 /* TBTT prohibit hold time. Suggested by designer TimChen. */
1007 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); /* 8 ms */
1008
1009 rtl_write_byte(rtlpriv, REG_PIFS, 0);
1010 rtl_write_byte(rtlpriv, REG_AGGR_BREAK_TIME, 0x16);
1011
1012 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
1013 rtl_write_word(rtlpriv, REG_PROT_MODE_CTRL, 0x08ff);
1014
1015 /* For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
1016 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
1017
1018 /* ACKTO for IOT issue. */
1019 rtl_write_byte(rtlpriv, REG_ACKTO, 0x40);
1020
1021 /* Set Spec SIFS (used in NAV) */
1022 rtl_write_word(rtlpriv, REG_SPEC_SIFS, 0x100a);
1023 rtl_write_word(rtlpriv, REG_MAC_SPEC_SIFS, 0x100a);
1024
1025 /* Set SIFS for CCK */
1026 rtl_write_word(rtlpriv, REG_SIFS_CTX, 0x100a);
1027
1028 /* Set SIFS for OFDM */
1029 rtl_write_word(rtlpriv, REG_SIFS_TRX, 0x100a);
1030
1031 /* Note Data sheet don't define */
1032 rtl_write_word(rtlpriv, 0x4C7, 0x80);
1033
1034 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
1035
1036 rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, 0x1717);
1037
1038 /* Set Multicast Address. 2009.01.07. by tynli. */
1039 rtl_write_dword(rtlpriv, REG_MAR, 0xffffffff);
1040 rtl_write_dword(rtlpriv, REG_MAR + 4, 0xffffffff);
1041 }
1042
1043 static void _rtl92ee_enable_aspm_back_door(struct ieee80211_hw *hw)
1044 {
1045 struct rtl_priv *rtlpriv = rtl_priv(hw);
1046 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1047 u32 tmp32 = 0, count = 0;
1048 u8 tmp8 = 0;
1049
1050 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0x78);
1051 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x2);
1052 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1053 count = 0;
1054 while (tmp8 && count < 20) {
1055 udelay(10);
1056 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1057 count++;
1058 }
1059
1060 if (0 == tmp8) {
1061 tmp32 = rtl_read_dword(rtlpriv, REG_BACKDOOR_DBI_RDATA);
1062 if ((tmp32 & 0xff00) != 0x2000) {
1063 tmp32 &= 0xffff00ff;
1064 rtl_write_dword(rtlpriv, REG_BACKDOOR_DBI_WDATA,
1065 tmp32 | BIT(13));
1066 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0xf078);
1067 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x1);
1068
1069 tmp8 = rtl_read_byte(rtlpriv,
1070 REG_BACKDOOR_DBI_DATA + 2);
1071 count = 0;
1072 while (tmp8 && count < 20) {
1073 udelay(10);
1074 tmp8 = rtl_read_byte(rtlpriv,
1075 REG_BACKDOOR_DBI_DATA + 2);
1076 count++;
1077 }
1078 }
1079 }
1080
1081 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0x70c);
1082 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x2);
1083 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1084 count = 0;
1085 while (tmp8 && count < 20) {
1086 udelay(10);
1087 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1088 count++;
1089 }
1090 if (0 == tmp8) {
1091 tmp32 = rtl_read_dword(rtlpriv, REG_BACKDOOR_DBI_RDATA);
1092 rtl_write_dword(rtlpriv, REG_BACKDOOR_DBI_WDATA,
1093 tmp32 | BIT(31));
1094 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0xf70c);
1095 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x1);
1096 }
1097
1098 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1099 count = 0;
1100 while (tmp8 && count < 20) {
1101 udelay(10);
1102 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1103 count++;
1104 }
1105
1106 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0x718);
1107 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x2);
1108 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1109 count = 0;
1110 while (tmp8 && count < 20) {
1111 udelay(10);
1112 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1113 count++;
1114 }
1115 if (ppsc->support_backdoor || (0 == tmp8)) {
1116 tmp32 = rtl_read_dword(rtlpriv, REG_BACKDOOR_DBI_RDATA);
1117 rtl_write_dword(rtlpriv, REG_BACKDOOR_DBI_WDATA,
1118 tmp32 | BIT(11) | BIT(12));
1119 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0xf718);
1120 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x1);
1121 }
1122 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1123 count = 0;
1124 while (tmp8 && count < 20) {
1125 udelay(10);
1126 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1127 count++;
1128 }
1129 }
1130
1131 void rtl92ee_enable_hw_security_config(struct ieee80211_hw *hw)
1132 {
1133 struct rtl_priv *rtlpriv = rtl_priv(hw);
1134 u8 sec_reg_value;
1135 u8 tmp;
1136
1137 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1138 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1139 rtlpriv->sec.pairwise_enc_algorithm,
1140 rtlpriv->sec.group_enc_algorithm);
1141
1142 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1143 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1144 "not open hw encryption\n");
1145 return;
1146 }
1147
1148 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1149
1150 if (rtlpriv->sec.use_defaultkey) {
1151 sec_reg_value |= SCR_TXUSEDK;
1152 sec_reg_value |= SCR_RXUSEDK;
1153 }
1154
1155 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1156
1157 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1158 rtl_write_byte(rtlpriv, REG_CR + 1, tmp | BIT(1));
1159
1160 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1161 "The SECR-value %x\n", sec_reg_value);
1162
1163 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1164 }
1165
1166 int rtl92ee_hw_init(struct ieee80211_hw *hw)
1167 {
1168 struct rtl_priv *rtlpriv = rtl_priv(hw);
1169 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1170 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1171 struct rtl_phy *rtlphy = &rtlpriv->phy;
1172 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1173 bool rtstatus = true;
1174 int err = 0;
1175 u8 tmp_u1b, u1byte;
1176 u32 tmp_u4b;
1177
1178 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, " Rtl8192EE hw init\n");
1179 rtlpriv->rtlhal.being_init_adapter = true;
1180 rtlpriv->intf_ops->disable_aspm(hw);
1181
1182 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CLKR+1);
1183 u1byte = rtl_read_byte(rtlpriv, REG_CR);
1184 if ((tmp_u1b & BIT(3)) && (u1byte != 0 && u1byte != 0xEA)) {
1185 rtlhal->mac_func_enable = true;
1186 } else {
1187 rtlhal->mac_func_enable = false;
1188 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_92E;
1189 }
1190
1191 rtstatus = _rtl92ee_init_mac(hw);
1192
1193 rtl_write_byte(rtlpriv, 0x577, 0x03);
1194
1195 /*for Crystal 40 Mhz setting */
1196 rtl_write_byte(rtlpriv, REG_AFE_CTRL4, 0x2A);
1197 rtl_write_byte(rtlpriv, REG_AFE_CTRL4 + 1, 0x00);
1198 rtl_write_byte(rtlpriv, REG_AFE_CTRL2, 0x83);
1199
1200 /*Forced the antenna b to wifi */
1201 if (rtlpriv->btcoexist.btc_info.btcoexist == 1) {
1202 rtl_write_byte(rtlpriv, 0x64, 0);
1203 rtl_write_byte(rtlpriv, 0x65, 1);
1204 }
1205 if (!rtstatus) {
1206 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1207 err = 1;
1208 return err;
1209 }
1210 rtlhal->rx_tag = 0;
1211 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, 0x8000);
1212 err = rtl92ee_download_fw(hw, false);
1213 if (err) {
1214 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1215 "Failed to download FW. Init HW without FW now..\n");
1216 err = 1;
1217 rtlhal->fw_ready = false;
1218 return err;
1219 }
1220 rtlhal->fw_ready = true;
1221 /*fw related variable initialize */
1222 ppsc->fw_current_inpsmode = false;
1223 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_92E;
1224 rtlhal->fw_clk_change_in_progress = false;
1225 rtlhal->allow_sw_to_change_hwclc = false;
1226 rtlhal->last_hmeboxnum = 0;
1227
1228 rtl92ee_phy_mac_config(hw);
1229
1230 rtl92ee_phy_bb_config(hw);
1231
1232 rtl92ee_phy_rf_config(hw);
1233
1234 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, RF90_PATH_A,
1235 RF_CHNLBW, RFREG_OFFSET_MASK);
1236 rtlphy->rfreg_chnlval[1] = rtl_get_rfreg(hw, RF90_PATH_B,
1237 RF_CHNLBW, RFREG_OFFSET_MASK);
1238 rtlphy->backup_rf_0x1a = (u32)rtl_get_rfreg(hw, RF90_PATH_A, RF_RX_G1,
1239 RFREG_OFFSET_MASK);
1240 rtlphy->rfreg_chnlval[0] = (rtlphy->rfreg_chnlval[0] & 0xfffff3ff) |
1241 BIT(10) | BIT(11);
1242
1243 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK,
1244 rtlphy->rfreg_chnlval[0]);
1245 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, RFREG_OFFSET_MASK,
1246 rtlphy->rfreg_chnlval[0]);
1247
1248 /*---- Set CCK and OFDM Block "ON"----*/
1249 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1250 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1251
1252 /* Must set this,
1253 * otherwise the rx sensitivity will be very pool. Maddest
1254 */
1255 rtl_set_rfreg(hw, RF90_PATH_A, 0xB1, RFREG_OFFSET_MASK, 0x54418);
1256
1257 /*Set Hardware(MAC default setting.)*/
1258 _rtl92ee_hw_configure(hw);
1259
1260 rtlhal->mac_func_enable = true;
1261
1262 rtl_cam_reset_all_entry(hw);
1263 rtl92ee_enable_hw_security_config(hw);
1264
1265 ppsc->rfpwr_state = ERFON;
1266
1267 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1268 _rtl92ee_enable_aspm_back_door(hw);
1269 rtlpriv->intf_ops->enable_aspm(hw);
1270
1271 rtl92ee_bt_hw_init(hw);
1272
1273 rtlpriv->rtlhal.being_init_adapter = false;
1274
1275 if (ppsc->rfpwr_state == ERFON) {
1276 if (rtlphy->iqk_initialized) {
1277 rtl92ee_phy_iq_calibrate(hw, true);
1278 } else {
1279 rtl92ee_phy_iq_calibrate(hw, false);
1280 rtlphy->iqk_initialized = true;
1281 }
1282 }
1283
1284 rtlphy->rfpath_rx_enable[0] = true;
1285 if (rtlphy->rf_type == RF_2T2R)
1286 rtlphy->rfpath_rx_enable[1] = true;
1287
1288 efuse_one_byte_read(hw, 0x1FA, &tmp_u1b);
1289 if (!(tmp_u1b & BIT(0))) {
1290 rtl_set_rfreg(hw, RF90_PATH_A, 0x15, 0x0F, 0x05);
1291 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "PA BIAS path A\n");
1292 }
1293
1294 if ((!(tmp_u1b & BIT(1))) && (rtlphy->rf_type == RF_2T2R)) {
1295 rtl_set_rfreg(hw, RF90_PATH_B, 0x15, 0x0F, 0x05);
1296 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "PA BIAS path B\n");
1297 }
1298
1299 rtl_write_byte(rtlpriv, REG_NAV_UPPER, ((30000 + 127) / 128));
1300
1301 /*Fixed LDPC rx hang issue. */
1302 tmp_u4b = rtl_read_dword(rtlpriv, REG_SYS_SWR_CTRL1);
1303 rtl_write_byte(rtlpriv, REG_SYS_SWR_CTRL2, 0x75);
1304 tmp_u4b = (tmp_u4b & 0xfff00fff) | (0x7E << 12);
1305 rtl_write_dword(rtlpriv, REG_SYS_SWR_CTRL1, tmp_u4b);
1306
1307 rtl92ee_dm_init(hw);
1308
1309 rtl_write_dword(rtlpriv, 0x4fc, 0);
1310
1311 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1312 "end of Rtl8192EE hw init %x\n", err);
1313 return 0;
1314 }
1315
1316 static enum version_8192e _rtl92ee_read_chip_version(struct ieee80211_hw *hw)
1317 {
1318 struct rtl_priv *rtlpriv = rtl_priv(hw);
1319 struct rtl_phy *rtlphy = &rtlpriv->phy;
1320 enum version_8192e version = VERSION_UNKNOWN;
1321 u32 value32;
1322
1323 rtlphy->rf_type = RF_2T2R;
1324
1325 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
1326 if (value32 & TRP_VAUX_EN)
1327 version = (enum version_8192e)VERSION_TEST_CHIP_2T2R_8192E;
1328 else
1329 version = (enum version_8192e)VERSION_NORMAL_CHIP_2T2R_8192E;
1330
1331 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1332 "Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
1333 "RF_2T2R" : "RF_1T1R");
1334
1335 return version;
1336 }
1337
1338 static int _rtl92ee_set_media_status(struct ieee80211_hw *hw,
1339 enum nl80211_iftype type)
1340 {
1341 struct rtl_priv *rtlpriv = rtl_priv(hw);
1342 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1343 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1344 u8 mode = MSR_NOLINK;
1345
1346 switch (type) {
1347 case NL80211_IFTYPE_UNSPECIFIED:
1348 mode = MSR_NOLINK;
1349 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1350 "Set Network type to NO LINK!\n");
1351 break;
1352 case NL80211_IFTYPE_ADHOC:
1353 case NL80211_IFTYPE_MESH_POINT:
1354 mode = MSR_ADHOC;
1355 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1356 "Set Network type to Ad Hoc!\n");
1357 break;
1358 case NL80211_IFTYPE_STATION:
1359 mode = MSR_INFRA;
1360 ledaction = LED_CTL_LINK;
1361 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1362 "Set Network type to STA!\n");
1363 break;
1364 case NL80211_IFTYPE_AP:
1365 mode = MSR_AP;
1366 ledaction = LED_CTL_LINK;
1367 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1368 "Set Network type to AP!\n");
1369 break;
1370 default:
1371 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1372 "Network type %d not support!\n", type);
1373 return 1;
1374 }
1375
1376 /* MSR_INFRA == Link in infrastructure network;
1377 * MSR_ADHOC == Link in ad hoc network;
1378 * Therefore, check link state is necessary.
1379 *
1380 * MSR_AP == AP mode; link state is not cared here.
1381 */
1382 if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1383 mode = MSR_NOLINK;
1384 ledaction = LED_CTL_NO_LINK;
1385 }
1386
1387 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1388 _rtl92ee_stop_tx_beacon(hw);
1389 _rtl92ee_enable_bcn_sub_func(hw);
1390 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1391 _rtl92ee_resume_tx_beacon(hw);
1392 _rtl92ee_disable_bcn_sub_func(hw);
1393 } else {
1394 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1395 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1396 mode);
1397 }
1398
1399 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode);
1400 rtlpriv->cfg->ops->led_control(hw, ledaction);
1401 if (mode == MSR_AP)
1402 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1403 else
1404 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
1405 return 0;
1406 }
1407
1408 void rtl92ee_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1409 {
1410 struct rtl_priv *rtlpriv = rtl_priv(hw);
1411 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1412 u32 reg_rcr = rtlpci->receive_config;
1413
1414 if (rtlpriv->psc.rfpwr_state != ERFON)
1415 return;
1416
1417 if (check_bssid) {
1418 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1419 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1420 (u8 *)(&reg_rcr));
1421 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
1422 } else {
1423 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
1424 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
1425 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1426 (u8 *)(&reg_rcr));
1427 }
1428 }
1429
1430 int rtl92ee_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
1431 {
1432 struct rtl_priv *rtlpriv = rtl_priv(hw);
1433
1434 if (_rtl92ee_set_media_status(hw, type))
1435 return -EOPNOTSUPP;
1436
1437 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1438 if (type != NL80211_IFTYPE_AP &&
1439 type != NL80211_IFTYPE_MESH_POINT)
1440 rtl92ee_set_check_bssid(hw, true);
1441 } else {
1442 rtl92ee_set_check_bssid(hw, false);
1443 }
1444
1445 return 0;
1446 }
1447
1448 /* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */
1449 void rtl92ee_set_qos(struct ieee80211_hw *hw, int aci)
1450 {
1451 struct rtl_priv *rtlpriv = rtl_priv(hw);
1452
1453 rtl92ee_dm_init_edca_turbo(hw);
1454 switch (aci) {
1455 case AC1_BK:
1456 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
1457 break;
1458 case AC0_BE:
1459 /* rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, u4b_ac_param); */
1460 break;
1461 case AC2_VI:
1462 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
1463 break;
1464 case AC3_VO:
1465 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
1466 break;
1467 default:
1468 RT_ASSERT(false, "invalid aci: %d !\n", aci);
1469 break;
1470 }
1471 }
1472
1473 static void rtl92ee_clear_interrupt(struct ieee80211_hw *hw)
1474 {
1475 struct rtl_priv *rtlpriv = rtl_priv(hw);
1476 u32 tmp;
1477
1478 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1479 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1480
1481 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1482 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1483
1484 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
1485 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
1486 }
1487
1488 void rtl92ee_enable_interrupt(struct ieee80211_hw *hw)
1489 {
1490 struct rtl_priv *rtlpriv = rtl_priv(hw);
1491 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1492
1493 rtl92ee_clear_interrupt(hw);/*clear it here first*/
1494
1495 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
1496 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
1497 rtlpci->irq_enabled = true;
1498 }
1499
1500 void rtl92ee_disable_interrupt(struct ieee80211_hw *hw)
1501 {
1502 struct rtl_priv *rtlpriv = rtl_priv(hw);
1503 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1504
1505 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1506 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1507 rtlpci->irq_enabled = false;
1508 /*synchronize_irq(rtlpci->pdev->irq);*/
1509 }
1510
1511 static void _rtl92ee_poweroff_adapter(struct ieee80211_hw *hw)
1512 {
1513 struct rtl_priv *rtlpriv = rtl_priv(hw);
1514 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1515 u8 u1b_tmp;
1516
1517 rtlhal->mac_func_enable = false;
1518
1519 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "POWER OFF adapter\n");
1520
1521 /* Run LPS WL RFOFF flow */
1522 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1523 PWR_INTF_PCI_MSK, RTL8192E_NIC_LPS_ENTER_FLOW);
1524 /* turn off RF */
1525 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00);
1526
1527 /* ==== Reset digital sequence ====== */
1528 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) && rtlhal->fw_ready)
1529 rtl92ee_firmware_selfreset(hw);
1530
1531 /* Reset MCU */
1532 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1533 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
1534
1535 /* reset MCU ready status */
1536 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1537
1538 /* HW card disable configuration. */
1539 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1540 PWR_INTF_PCI_MSK, RTL8192E_NIC_DISABLE_FLOW);
1541
1542 /* Reset MCU IO Wrapper */
1543 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1544 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1545 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1546 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp | BIT(0)));
1547
1548 /* lock ISO/CLK/Power control register */
1549 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0E);
1550 }
1551
1552 void rtl92ee_card_disable(struct ieee80211_hw *hw)
1553 {
1554 struct rtl_priv *rtlpriv = rtl_priv(hw);
1555 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1556 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1557 enum nl80211_iftype opmode;
1558
1559 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "RTL8192ee card disable\n");
1560
1561 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1562
1563 mac->link_state = MAC80211_NOLINK;
1564 opmode = NL80211_IFTYPE_UNSPECIFIED;
1565
1566 _rtl92ee_set_media_status(hw, opmode);
1567
1568 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1569 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
1570 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1571
1572 _rtl92ee_poweroff_adapter(hw);
1573
1574 /* after power off we should do iqk again */
1575 rtlpriv->phy.iqk_initialized = false;
1576 }
1577
1578 void rtl92ee_interrupt_recognized(struct ieee80211_hw *hw,
1579 u32 *p_inta, u32 *p_intb)
1580 {
1581 struct rtl_priv *rtlpriv = rtl_priv(hw);
1582 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1583
1584 *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
1585 rtl_write_dword(rtlpriv, ISR, *p_inta);
1586
1587 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
1588 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
1589 }
1590
1591 void rtl92ee_set_beacon_related_registers(struct ieee80211_hw *hw)
1592 {
1593 struct rtl_priv *rtlpriv = rtl_priv(hw);
1594 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1595 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1596 u16 bcn_interval, atim_window;
1597
1598 bcn_interval = mac->beacon_interval;
1599 atim_window = 2; /*FIX MERGE */
1600 rtl92ee_disable_interrupt(hw);
1601 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
1602 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1603 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
1604 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
1605 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
1606 rtl_write_byte(rtlpriv, 0x606, 0x30);
1607 rtlpci->reg_bcn_ctrl_val |= BIT(3);
1608 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
1609 }
1610
1611 void rtl92ee_set_beacon_interval(struct ieee80211_hw *hw)
1612 {
1613 struct rtl_priv *rtlpriv = rtl_priv(hw);
1614 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1615 u16 bcn_interval = mac->beacon_interval;
1616
1617 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
1618 "beacon_interval:%d\n", bcn_interval);
1619 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1620 }
1621
1622 void rtl92ee_update_interrupt_mask(struct ieee80211_hw *hw,
1623 u32 add_msr, u32 rm_msr)
1624 {
1625 struct rtl_priv *rtlpriv = rtl_priv(hw);
1626 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1627
1628 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
1629 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
1630
1631 if (add_msr)
1632 rtlpci->irq_mask[0] |= add_msr;
1633 if (rm_msr)
1634 rtlpci->irq_mask[0] &= (~rm_msr);
1635 rtl92ee_disable_interrupt(hw);
1636 rtl92ee_enable_interrupt(hw);
1637 }
1638
1639 static u8 _rtl92ee_get_chnl_group(u8 chnl)
1640 {
1641 u8 group = 0;
1642
1643 if (chnl <= 14) {
1644 if (1 <= chnl && chnl <= 2)
1645 group = 0;
1646 else if (3 <= chnl && chnl <= 5)
1647 group = 1;
1648 else if (6 <= chnl && chnl <= 8)
1649 group = 2;
1650 else if (9 <= chnl && chnl <= 11)
1651 group = 3;
1652 else if (12 <= chnl && chnl <= 14)
1653 group = 4;
1654 } else {
1655 if (36 <= chnl && chnl <= 42)
1656 group = 0;
1657 else if (44 <= chnl && chnl <= 48)
1658 group = 1;
1659 else if (50 <= chnl && chnl <= 58)
1660 group = 2;
1661 else if (60 <= chnl && chnl <= 64)
1662 group = 3;
1663 else if (100 <= chnl && chnl <= 106)
1664 group = 4;
1665 else if (108 <= chnl && chnl <= 114)
1666 group = 5;
1667 else if (116 <= chnl && chnl <= 122)
1668 group = 6;
1669 else if (124 <= chnl && chnl <= 130)
1670 group = 7;
1671 else if (132 <= chnl && chnl <= 138)
1672 group = 8;
1673 else if (140 <= chnl && chnl <= 144)
1674 group = 9;
1675 else if (149 <= chnl && chnl <= 155)
1676 group = 10;
1677 else if (157 <= chnl && chnl <= 161)
1678 group = 11;
1679 else if (165 <= chnl && chnl <= 171)
1680 group = 12;
1681 else if (173 <= chnl && chnl <= 177)
1682 group = 13;
1683 }
1684 return group;
1685 }
1686
1687 static void _rtl8192ee_read_power_value_fromprom(struct ieee80211_hw *hw,
1688 struct txpower_info_2g *pwr2g,
1689 struct txpower_info_5g *pwr5g,
1690 bool autoload_fail, u8 *hwinfo)
1691 {
1692 struct rtl_priv *rtlpriv = rtl_priv(hw);
1693 u32 rf, addr = EEPROM_TX_PWR_INX, group, i = 0;
1694
1695 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1696 "hal_ReadPowerValueFromPROM92E(): PROMContent[0x%x]=0x%x\n",
1697 (addr + 1), hwinfo[addr + 1]);
1698 if (0xFF == hwinfo[addr+1]) /*YJ,add,120316*/
1699 autoload_fail = true;
1700
1701 if (autoload_fail) {
1702 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1703 "auto load fail : Use Default value!\n");
1704 for (rf = 0 ; rf < MAX_RF_PATH ; rf++) {
1705 /* 2.4G default value */
1706 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1707 pwr2g->index_cck_base[rf][group] = 0x2D;
1708 pwr2g->index_bw40_base[rf][group] = 0x2D;
1709 }
1710 for (i = 0; i < MAX_TX_COUNT; i++) {
1711 if (i == 0) {
1712 pwr2g->bw20_diff[rf][0] = 0x02;
1713 pwr2g->ofdm_diff[rf][0] = 0x04;
1714 } else {
1715 pwr2g->bw20_diff[rf][i] = 0xFE;
1716 pwr2g->bw40_diff[rf][i] = 0xFE;
1717 pwr2g->cck_diff[rf][i] = 0xFE;
1718 pwr2g->ofdm_diff[rf][i] = 0xFE;
1719 }
1720 }
1721
1722 /*5G default value*/
1723 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++)
1724 pwr5g->index_bw40_base[rf][group] = 0x2A;
1725
1726 for (i = 0; i < MAX_TX_COUNT; i++) {
1727 if (i == 0) {
1728 pwr5g->ofdm_diff[rf][0] = 0x04;
1729 pwr5g->bw20_diff[rf][0] = 0x00;
1730 pwr5g->bw80_diff[rf][0] = 0xFE;
1731 pwr5g->bw160_diff[rf][0] = 0xFE;
1732 } else {
1733 pwr5g->ofdm_diff[rf][0] = 0xFE;
1734 pwr5g->bw20_diff[rf][0] = 0xFE;
1735 pwr5g->bw40_diff[rf][0] = 0xFE;
1736 pwr5g->bw80_diff[rf][0] = 0xFE;
1737 pwr5g->bw160_diff[rf][0] = 0xFE;
1738 }
1739 }
1740 }
1741 return;
1742 }
1743
1744 rtl_priv(hw)->efuse.txpwr_fromeprom = true;
1745
1746 for (rf = 0 ; rf < MAX_RF_PATH ; rf++) {
1747 /*2.4G default value*/
1748 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1749 pwr2g->index_cck_base[rf][group] = hwinfo[addr++];
1750 if (pwr2g->index_cck_base[rf][group] == 0xFF)
1751 pwr2g->index_cck_base[rf][group] = 0x2D;
1752 }
1753 for (group = 0 ; group < MAX_CHNL_GROUP_24G - 1; group++) {
1754 pwr2g->index_bw40_base[rf][group] = hwinfo[addr++];
1755 if (pwr2g->index_bw40_base[rf][group] == 0xFF)
1756 pwr2g->index_bw40_base[rf][group] = 0x2D;
1757 }
1758 for (i = 0; i < MAX_TX_COUNT; i++) {
1759 if (i == 0) {
1760 pwr2g->bw40_diff[rf][i] = 0;
1761 if (hwinfo[addr] == 0xFF) {
1762 pwr2g->bw20_diff[rf][i] = 0x02;
1763 } else {
1764 pwr2g->bw20_diff[rf][i] = (hwinfo[addr]
1765 & 0xf0) >> 4;
1766 if (pwr2g->bw20_diff[rf][i] & BIT(3))
1767 pwr2g->bw20_diff[rf][i] |= 0xF0;
1768 }
1769
1770 if (hwinfo[addr] == 0xFF) {
1771 pwr2g->ofdm_diff[rf][i] = 0x04;
1772 } else {
1773 pwr2g->ofdm_diff[rf][i] = (hwinfo[addr]
1774 & 0x0f);
1775 if (pwr2g->ofdm_diff[rf][i] & BIT(3))
1776 pwr2g->ofdm_diff[rf][i] |= 0xF0;
1777 }
1778 pwr2g->cck_diff[rf][i] = 0;
1779 addr++;
1780 } else {
1781 if (hwinfo[addr] == 0xFF) {
1782 pwr2g->bw40_diff[rf][i] = 0xFE;
1783 } else {
1784 pwr2g->bw40_diff[rf][i] = (hwinfo[addr]
1785 & 0xf0) >> 4;
1786 if (pwr2g->bw40_diff[rf][i] & BIT(3))
1787 pwr2g->bw40_diff[rf][i] |= 0xF0;
1788 }
1789
1790 if (hwinfo[addr] == 0xFF) {
1791 pwr2g->bw20_diff[rf][i] = 0xFE;
1792 } else {
1793 pwr2g->bw20_diff[rf][i] = (hwinfo[addr]
1794 & 0x0f);
1795 if (pwr2g->bw20_diff[rf][i] & BIT(3))
1796 pwr2g->bw20_diff[rf][i] |= 0xF0;
1797 }
1798 addr++;
1799
1800 if (hwinfo[addr] == 0xFF) {
1801 pwr2g->ofdm_diff[rf][i] = 0xFE;
1802 } else {
1803 pwr2g->ofdm_diff[rf][i] = (hwinfo[addr]
1804 & 0xf0) >> 4;
1805 if (pwr2g->ofdm_diff[rf][i] & BIT(3))
1806 pwr2g->ofdm_diff[rf][i] |= 0xF0;
1807 }
1808
1809 if (hwinfo[addr] == 0xFF) {
1810 pwr2g->cck_diff[rf][i] = 0xFE;
1811 } else {
1812 pwr2g->cck_diff[rf][i] = (hwinfo[addr]
1813 & 0x0f);
1814 if (pwr2g->cck_diff[rf][i] & BIT(3))
1815 pwr2g->cck_diff[rf][i] |= 0xF0;
1816 }
1817 addr++;
1818 }
1819 }
1820
1821 /*5G default value*/
1822 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
1823 pwr5g->index_bw40_base[rf][group] = hwinfo[addr++];
1824 if (pwr5g->index_bw40_base[rf][group] == 0xFF)
1825 pwr5g->index_bw40_base[rf][group] = 0xFE;
1826 }
1827
1828 for (i = 0; i < MAX_TX_COUNT; i++) {
1829 if (i == 0) {
1830 pwr5g->bw40_diff[rf][i] = 0;
1831
1832 if (hwinfo[addr] == 0xFF) {
1833 pwr5g->bw20_diff[rf][i] = 0;
1834 } else {
1835 pwr5g->bw20_diff[rf][0] = (hwinfo[addr]
1836 & 0xf0) >> 4;
1837 if (pwr5g->bw20_diff[rf][i] & BIT(3))
1838 pwr5g->bw20_diff[rf][i] |= 0xF0;
1839 }
1840
1841 if (hwinfo[addr] == 0xFF) {
1842 pwr5g->ofdm_diff[rf][i] = 0x04;
1843 } else {
1844 pwr5g->ofdm_diff[rf][0] = (hwinfo[addr]
1845 & 0x0f);
1846 if (pwr5g->ofdm_diff[rf][i] & BIT(3))
1847 pwr5g->ofdm_diff[rf][i] |= 0xF0;
1848 }
1849 addr++;
1850 } else {
1851 if (hwinfo[addr] == 0xFF) {
1852 pwr5g->bw40_diff[rf][i] = 0xFE;
1853 } else {
1854 pwr5g->bw40_diff[rf][i] = (hwinfo[addr]
1855 & 0xf0) >> 4;
1856 if (pwr5g->bw40_diff[rf][i] & BIT(3))
1857 pwr5g->bw40_diff[rf][i] |= 0xF0;
1858 }
1859
1860 if (hwinfo[addr] == 0xFF) {
1861 pwr5g->bw20_diff[rf][i] = 0xFE;
1862 } else {
1863 pwr5g->bw20_diff[rf][i] = (hwinfo[addr]
1864 & 0x0f);
1865 if (pwr5g->bw20_diff[rf][i] & BIT(3))
1866 pwr5g->bw20_diff[rf][i] |= 0xF0;
1867 }
1868 addr++;
1869 }
1870 }
1871
1872 if (hwinfo[addr] == 0xFF) {
1873 pwr5g->ofdm_diff[rf][1] = 0xFE;
1874 pwr5g->ofdm_diff[rf][2] = 0xFE;
1875 } else {
1876 pwr5g->ofdm_diff[rf][1] = (hwinfo[addr] & 0xf0) >> 4;
1877 pwr5g->ofdm_diff[rf][2] = (hwinfo[addr] & 0x0f);
1878 }
1879 addr++;
1880
1881 if (hwinfo[addr] == 0xFF)
1882 pwr5g->ofdm_diff[rf][3] = 0xFE;
1883 else
1884 pwr5g->ofdm_diff[rf][3] = (hwinfo[addr] & 0x0f);
1885 addr++;
1886
1887 for (i = 1; i < MAX_TX_COUNT; i++) {
1888 if (pwr5g->ofdm_diff[rf][i] == 0xFF)
1889 pwr5g->ofdm_diff[rf][i] = 0xFE;
1890 else if (pwr5g->ofdm_diff[rf][i] & BIT(3))
1891 pwr5g->ofdm_diff[rf][i] |= 0xF0;
1892 }
1893
1894 for (i = 0; i < MAX_TX_COUNT; i++) {
1895 if (hwinfo[addr] == 0xFF) {
1896 pwr5g->bw80_diff[rf][i] = 0xFE;
1897 } else {
1898 pwr5g->bw80_diff[rf][i] = (hwinfo[addr] & 0xf0)
1899 >> 4;
1900 if (pwr5g->bw80_diff[rf][i] & BIT(3))
1901 pwr5g->bw80_diff[rf][i] |= 0xF0;
1902 }
1903
1904 if (hwinfo[addr] == 0xFF) {
1905 pwr5g->bw160_diff[rf][i] = 0xFE;
1906 } else {
1907 pwr5g->bw160_diff[rf][i] =
1908 (hwinfo[addr] & 0x0f);
1909 if (pwr5g->bw160_diff[rf][i] & BIT(3))
1910 pwr5g->bw160_diff[rf][i] |= 0xF0;
1911 }
1912 addr++;
1913 }
1914 }
1915 }
1916
1917 static void _rtl92ee_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1918 bool autoload_fail, u8 *hwinfo)
1919 {
1920 struct rtl_priv *rtlpriv = rtl_priv(hw);
1921 struct rtl_efuse *efu = rtl_efuse(rtl_priv(hw));
1922 struct txpower_info_2g pwr2g;
1923 struct txpower_info_5g pwr5g;
1924 u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
1925 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
1926 56, 58, 60, 62, 64, 100, 102, 104, 106,
1927 108, 110, 112, 114, 116, 118, 120, 122,
1928 124, 126, 128, 130, 132, 134, 136, 138,
1929 140, 142, 144, 149, 151, 153, 155, 157,
1930 159, 161, 163, 165, 167, 168, 169, 171,
1931 173, 175, 177
1932 };
1933 u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {
1934 42, 58, 106, 122, 138, 155, 171
1935 };
1936 u8 rf, idx;
1937 u8 i;
1938
1939 _rtl8192ee_read_power_value_fromprom(hw, &pwr2g, &pwr5g,
1940 autoload_fail, hwinfo);
1941
1942 for (rf = 0; rf < MAX_RF_PATH; rf++) {
1943 for (i = 0; i < 14; i++) {
1944 idx = _rtl92ee_get_chnl_group(i + 1);
1945
1946 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
1947 efu->txpwrlevel_cck[rf][i] =
1948 pwr2g.index_cck_base[rf][5];
1949 efu->txpwrlevel_ht40_1s[rf][i] =
1950 pwr2g.index_bw40_base[rf][idx];
1951 } else {
1952 efu->txpwrlevel_cck[rf][i] =
1953 pwr2g.index_cck_base[rf][idx];
1954 efu->txpwrlevel_ht40_1s[rf][i] =
1955 pwr2g.index_bw40_base[rf][idx];
1956 }
1957 }
1958 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
1959 idx = _rtl92ee_get_chnl_group(channel5g[i]);
1960 efu->txpwr_5g_bw40base[rf][i] =
1961 pwr5g.index_bw40_base[rf][idx];
1962 }
1963 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
1964 u8 upper, lower;
1965
1966 idx = _rtl92ee_get_chnl_group(channel5g_80m[i]);
1967 upper = pwr5g.index_bw40_base[rf][idx];
1968 lower = pwr5g.index_bw40_base[rf][idx + 1];
1969
1970 efu->txpwr_5g_bw80base[rf][i] = (upper + lower) / 2;
1971 }
1972 for (i = 0; i < MAX_TX_COUNT; i++) {
1973 efu->txpwr_cckdiff[rf][i] = pwr2g.cck_diff[rf][i];
1974 efu->txpwr_legacyhtdiff[rf][i] = pwr2g.ofdm_diff[rf][i];
1975 efu->txpwr_ht20diff[rf][i] = pwr2g.bw20_diff[rf][i];
1976 efu->txpwr_ht40diff[rf][i] = pwr2g.bw40_diff[rf][i];
1977
1978 efu->txpwr_5g_ofdmdiff[rf][i] = pwr5g.ofdm_diff[rf][i];
1979 efu->txpwr_5g_bw20diff[rf][i] = pwr5g.bw20_diff[rf][i];
1980 efu->txpwr_5g_bw40diff[rf][i] = pwr5g.bw40_diff[rf][i];
1981 efu->txpwr_5g_bw80diff[rf][i] = pwr5g.bw80_diff[rf][i];
1982 }
1983 }
1984
1985 if (!autoload_fail)
1986 efu->eeprom_thermalmeter = hwinfo[EEPROM_THERMAL_METER_92E];
1987 else
1988 efu->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1989
1990 if (efu->eeprom_thermalmeter == 0xff || autoload_fail) {
1991 efu->apk_thermalmeterignore = true;
1992 efu->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1993 }
1994
1995 efu->thermalmeter[0] = efu->eeprom_thermalmeter;
1996 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1997 "thermalmeter = 0x%x\n", efu->eeprom_thermalmeter);
1998
1999 if (!autoload_fail) {
2000 efu->eeprom_regulatory = hwinfo[EEPROM_RF_BOARD_OPTION_92E]
2001 & 0x07;
2002 if (hwinfo[EEPROM_RF_BOARD_OPTION_92E] == 0xFF)
2003 efu->eeprom_regulatory = 0;
2004 } else {
2005 efu->eeprom_regulatory = 0;
2006 }
2007 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2008 "eeprom_regulatory = 0x%x\n", efu->eeprom_regulatory);
2009 }
2010
2011 static void _rtl92ee_read_adapter_info(struct ieee80211_hw *hw)
2012 {
2013 struct rtl_priv *rtlpriv = rtl_priv(hw);
2014 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2015 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2016 u16 i, usvalue;
2017 u8 hwinfo[HWSET_MAX_SIZE];
2018 u16 eeprom_id;
2019
2020 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
2021 rtl_efuse_shadow_map_update(hw);
2022
2023 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
2024 HWSET_MAX_SIZE);
2025 } else if (rtlefuse->epromtype == EEPROM_93C46) {
2026 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2027 "RTL819X Not boot from eeprom, check it !!");
2028 return;
2029 } else {
2030 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2031 "boot from neither eeprom nor efuse, check it !!");
2032 return;
2033 }
2034
2035 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
2036 hwinfo, HWSET_MAX_SIZE);
2037
2038 eeprom_id = *((u16 *)&hwinfo[0]);
2039 if (eeprom_id != RTL8192E_EEPROM_ID) {
2040 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2041 "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
2042 rtlefuse->autoload_failflag = true;
2043 } else {
2044 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2045 rtlefuse->autoload_failflag = false;
2046 }
2047
2048 if (rtlefuse->autoload_failflag)
2049 return;
2050 /*VID DID SVID SDID*/
2051 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
2052 rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
2053 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
2054 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
2055 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "EEPROMId = 0x%4x\n", eeprom_id);
2056 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2057 "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
2058 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2059 "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
2060 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2061 "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
2062 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2063 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
2064 /*customer ID*/
2065 rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
2066 if (rtlefuse->eeprom_oemid == 0xFF)
2067 rtlefuse->eeprom_oemid = 0;
2068
2069 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2070 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
2071 /*EEPROM version*/
2072 rtlefuse->eeprom_version = *(u8 *)&hwinfo[EEPROM_VERSION];
2073 /*mac address*/
2074 for (i = 0; i < 6; i += 2) {
2075 usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
2076 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
2077 }
2078
2079 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2080 "dev_addr: %pM\n", rtlefuse->dev_addr);
2081 /*channel plan */
2082 rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
2083 /* set channel paln to world wide 13 */
2084 rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13;
2085 /*tx power*/
2086 _rtl92ee_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
2087 hwinfo);
2088
2089 rtl92ee_read_bt_coexist_info_from_hwpg(hw, rtlefuse->autoload_failflag,
2090 hwinfo);
2091
2092 /*board type*/
2093 rtlefuse->board_type = (((*(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION_92E])
2094 & 0xE0) >> 5);
2095 if ((*(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION_92E]) == 0xFF)
2096 rtlefuse->board_type = 0;
2097
2098 rtlhal->board_type = rtlefuse->board_type;
2099 /*parse xtal*/
2100 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_92E];
2101 if (hwinfo[EEPROM_XTAL_92E] == 0xFF)
2102 rtlefuse->crystalcap = 0x20;
2103
2104 /*antenna diversity*/
2105 rtlefuse->antenna_div_type = NO_ANTDIV;
2106 rtlefuse->antenna_div_cfg = 0;
2107
2108 if (rtlhal->oem_id == RT_CID_DEFAULT) {
2109 switch (rtlefuse->eeprom_oemid) {
2110 case EEPROM_CID_DEFAULT:
2111 if (rtlefuse->eeprom_did == 0x818B) {
2112 if ((rtlefuse->eeprom_svid == 0x10EC) &&
2113 (rtlefuse->eeprom_smid == 0x001B))
2114 rtlhal->oem_id = RT_CID_819X_LENOVO;
2115 } else {
2116 rtlhal->oem_id = RT_CID_DEFAULT;
2117 }
2118 break;
2119 default:
2120 rtlhal->oem_id = RT_CID_DEFAULT;
2121 break;
2122 }
2123 }
2124 }
2125
2126 static void _rtl92ee_hal_customized_behavior(struct ieee80211_hw *hw)
2127 {
2128 struct rtl_priv *rtlpriv = rtl_priv(hw);
2129 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2130 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2131
2132 pcipriv->ledctl.led_opendrain = true;
2133
2134 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2135 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
2136 }
2137
2138 void rtl92ee_read_eeprom_info(struct ieee80211_hw *hw)
2139 {
2140 struct rtl_priv *rtlpriv = rtl_priv(hw);
2141 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2142 struct rtl_phy *rtlphy = &rtlpriv->phy;
2143 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2144 u8 tmp_u1b;
2145
2146 rtlhal->version = _rtl92ee_read_chip_version(hw);
2147 if (get_rf_type(rtlphy) == RF_1T1R) {
2148 rtlpriv->dm.rfpath_rxenable[0] = true;
2149 } else {
2150 rtlpriv->dm.rfpath_rxenable[0] = true;
2151 rtlpriv->dm.rfpath_rxenable[1] = true;
2152 }
2153 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
2154 rtlhal->version);
2155 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
2156 if (tmp_u1b & BIT(4)) {
2157 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
2158 rtlefuse->epromtype = EEPROM_93C46;
2159 } else {
2160 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
2161 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
2162 }
2163 if (tmp_u1b & BIT(5)) {
2164 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2165 rtlefuse->autoload_failflag = false;
2166 _rtl92ee_read_adapter_info(hw);
2167 } else {
2168 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
2169 }
2170 _rtl92ee_hal_customized_behavior(hw);
2171
2172 rtlphy->rfpath_rx_enable[0] = true;
2173 if (rtlphy->rf_type == RF_2T2R)
2174 rtlphy->rfpath_rx_enable[1] = true;
2175 }
2176
2177 static u8 _rtl92ee_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index)
2178 {
2179 u8 ret = 0;
2180
2181 switch (rate_index) {
2182 case RATR_INX_WIRELESS_NGB:
2183 ret = 0;
2184 break;
2185 case RATR_INX_WIRELESS_N:
2186 case RATR_INX_WIRELESS_NG:
2187 ret = 4;
2188 break;
2189 case RATR_INX_WIRELESS_NB:
2190 ret = 2;
2191 break;
2192 case RATR_INX_WIRELESS_GB:
2193 ret = 6;
2194 break;
2195 case RATR_INX_WIRELESS_G:
2196 ret = 7;
2197 break;
2198 case RATR_INX_WIRELESS_B:
2199 ret = 8;
2200 break;
2201 default:
2202 ret = 0;
2203 break;
2204 }
2205 return ret;
2206 }
2207
2208 static void rtl92ee_update_hal_rate_mask(struct ieee80211_hw *hw,
2209 struct ieee80211_sta *sta,
2210 u8 rssi_level)
2211 {
2212 struct rtl_priv *rtlpriv = rtl_priv(hw);
2213 struct rtl_phy *rtlphy = &rtlpriv->phy;
2214 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2215 struct rtl_sta_info *sta_entry = NULL;
2216 u32 ratr_bitmap;
2217 u8 ratr_index;
2218 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
2219 ? 1 : 0;
2220 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2221 1 : 0;
2222 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2223 1 : 0;
2224 enum wireless_mode wirelessmode = 0;
2225 bool b_shortgi = false;
2226 u8 rate_mask[7] = {0};
2227 u8 macid = 0;
2228 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
2229 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2230 wirelessmode = sta_entry->wireless_mode;
2231 if (mac->opmode == NL80211_IFTYPE_STATION ||
2232 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2233 curtxbw_40mhz = mac->bw_40;
2234 else if (mac->opmode == NL80211_IFTYPE_AP ||
2235 mac->opmode == NL80211_IFTYPE_ADHOC)
2236 macid = sta->aid + 1;
2237
2238 ratr_bitmap = sta->supp_rates[0];
2239 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2240 ratr_bitmap = 0xfff;
2241
2242 ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
2243 sta->ht_cap.mcs.rx_mask[0] << 12);
2244
2245 switch (wirelessmode) {
2246 case WIRELESS_MODE_B:
2247 ratr_index = RATR_INX_WIRELESS_B;
2248 if (ratr_bitmap & 0x0000000c)
2249 ratr_bitmap &= 0x0000000d;
2250 else
2251 ratr_bitmap &= 0x0000000f;
2252 break;
2253 case WIRELESS_MODE_G:
2254 ratr_index = RATR_INX_WIRELESS_GB;
2255
2256 if (rssi_level == 1)
2257 ratr_bitmap &= 0x00000f00;
2258 else if (rssi_level == 2)
2259 ratr_bitmap &= 0x00000ff0;
2260 else
2261 ratr_bitmap &= 0x00000ff5;
2262 break;
2263 case WIRELESS_MODE_N_24G:
2264 if (curtxbw_40mhz)
2265 ratr_index = RATR_INX_WIRELESS_NGB;
2266 else
2267 ratr_index = RATR_INX_WIRELESS_NB;
2268
2269 if (rtlphy->rf_type == RF_1T1R) {
2270 if (curtxbw_40mhz) {
2271 if (rssi_level == 1)
2272 ratr_bitmap &= 0x000f0000;
2273 else if (rssi_level == 2)
2274 ratr_bitmap &= 0x000ff000;
2275 else
2276 ratr_bitmap &= 0x000ff015;
2277 } else {
2278 if (rssi_level == 1)
2279 ratr_bitmap &= 0x000f0000;
2280 else if (rssi_level == 2)
2281 ratr_bitmap &= 0x000ff000;
2282 else
2283 ratr_bitmap &= 0x000ff005;
2284 }
2285 } else {
2286 if (curtxbw_40mhz) {
2287 if (rssi_level == 1)
2288 ratr_bitmap &= 0x0f8f0000;
2289 else if (rssi_level == 2)
2290 ratr_bitmap &= 0x0ffff000;
2291 else
2292 ratr_bitmap &= 0x0ffff015;
2293 } else {
2294 if (rssi_level == 1)
2295 ratr_bitmap &= 0x0f8f0000;
2296 else if (rssi_level == 2)
2297 ratr_bitmap &= 0x0ffff000;
2298 else
2299 ratr_bitmap &= 0x0ffff005;
2300 }
2301 }
2302
2303 if ((curtxbw_40mhz && b_curshortgi_40mhz) ||
2304 (!curtxbw_40mhz && b_curshortgi_20mhz)) {
2305 if (macid == 0)
2306 b_shortgi = true;
2307 else if (macid == 1)
2308 b_shortgi = false;
2309 }
2310 break;
2311 default:
2312 ratr_index = RATR_INX_WIRELESS_NGB;
2313
2314 if (rtlphy->rf_type == RF_1T1R)
2315 ratr_bitmap &= 0x000ff0ff;
2316 else
2317 ratr_bitmap &= 0x0f8ff0ff;
2318 break;
2319 }
2320 ratr_index = _rtl92ee_mrate_idx_to_arfr_id(hw, ratr_index);
2321 sta_entry->ratr_index = ratr_index;
2322
2323 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2324 "ratr_bitmap :%x\n", ratr_bitmap);
2325 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2326 (ratr_index << 28);
2327 rate_mask[0] = macid;
2328 rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00);
2329 rate_mask[2] = curtxbw_40mhz;
2330 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
2331 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
2332 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
2333 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
2334 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2335 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
2336 ratr_index, ratr_bitmap, rate_mask[0], rate_mask[1],
2337 rate_mask[2], rate_mask[3], rate_mask[4],
2338 rate_mask[5], rate_mask[6]);
2339 rtl92ee_fill_h2c_cmd(hw, H2C_92E_RA_MASK, 7, rate_mask);
2340 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
2341 }
2342
2343 void rtl92ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
2344 struct ieee80211_sta *sta, u8 rssi_level)
2345 {
2346 struct rtl_priv *rtlpriv = rtl_priv(hw);
2347
2348 if (rtlpriv->dm.useramask)
2349 rtl92ee_update_hal_rate_mask(hw, sta, rssi_level);
2350 }
2351
2352 void rtl92ee_update_channel_access_setting(struct ieee80211_hw *hw)
2353 {
2354 struct rtl_priv *rtlpriv = rtl_priv(hw);
2355 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2356 u16 sifs_timer;
2357
2358 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
2359 (u8 *)&mac->slot_time);
2360 if (!mac->ht_enable)
2361 sifs_timer = 0x0a0a;
2362 else
2363 sifs_timer = 0x0e0e;
2364 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
2365 }
2366
2367 bool rtl92ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2368 {
2369 *valid = 1;
2370 return true;
2371 }
2372
2373 void rtl92ee_set_key(struct ieee80211_hw *hw, u32 key_index,
2374 u8 *p_macaddr, bool is_group, u8 enc_algo,
2375 bool is_wepkey, bool clear_all)
2376 {
2377 struct rtl_priv *rtlpriv = rtl_priv(hw);
2378 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2379 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2380 u8 *macaddr = p_macaddr;
2381 u32 entry_id = 0;
2382 bool is_pairwise = false;
2383
2384 static u8 cam_const_addr[4][6] = {
2385 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2386 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2387 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
2388 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
2389 };
2390 static u8 cam_const_broad[] = {
2391 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2392 };
2393
2394 if (clear_all) {
2395 u8 idx = 0;
2396 u8 cam_offset = 0;
2397 u8 clear_number = 5;
2398
2399 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
2400
2401 for (idx = 0; idx < clear_number; idx++) {
2402 rtl_cam_mark_invalid(hw, cam_offset + idx);
2403 rtl_cam_empty_entry(hw, cam_offset + idx);
2404
2405 if (idx < 5) {
2406 memset(rtlpriv->sec.key_buf[idx], 0,
2407 MAX_KEY_LEN);
2408 rtlpriv->sec.key_len[idx] = 0;
2409 }
2410 }
2411
2412 } else {
2413 switch (enc_algo) {
2414 case WEP40_ENCRYPTION:
2415 enc_algo = CAM_WEP40;
2416 break;
2417 case WEP104_ENCRYPTION:
2418 enc_algo = CAM_WEP104;
2419 break;
2420 case TKIP_ENCRYPTION:
2421 enc_algo = CAM_TKIP;
2422 break;
2423 case AESCCMP_ENCRYPTION:
2424 enc_algo = CAM_AES;
2425 break;
2426 default:
2427 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
2428 "switch case not process\n");
2429 enc_algo = CAM_TKIP;
2430 break;
2431 }
2432
2433 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
2434 macaddr = cam_const_addr[key_index];
2435 entry_id = key_index;
2436 } else {
2437 if (is_group) {
2438 macaddr = cam_const_broad;
2439 entry_id = key_index;
2440 } else {
2441 if (mac->opmode == NL80211_IFTYPE_AP ||
2442 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
2443 entry_id = rtl_cam_get_free_entry(hw,
2444 p_macaddr);
2445 if (entry_id >= TOTAL_CAM_ENTRY) {
2446 RT_TRACE(rtlpriv, COMP_SEC,
2447 DBG_EMERG,
2448 "Can not find free hw security cam entry\n");
2449 return;
2450 }
2451 } else {
2452 entry_id = CAM_PAIRWISE_KEY_POSITION;
2453 }
2454
2455 key_index = PAIRWISE_KEYIDX;
2456 is_pairwise = true;
2457 }
2458 }
2459
2460 if (rtlpriv->sec.key_len[key_index] == 0) {
2461 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2462 "delete one entry, entry_id is %d\n",
2463 entry_id);
2464 if (mac->opmode == NL80211_IFTYPE_AP ||
2465 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2466 rtl_cam_del_entry(hw, p_macaddr);
2467 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
2468 } else {
2469 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2470 "add one entry\n");
2471 if (is_pairwise) {
2472 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2473 "set Pairwiase key\n");
2474
2475 rtl_cam_add_one_entry(hw, macaddr, key_index,
2476 entry_id, enc_algo,
2477 CAM_CONFIG_NO_USEDK,
2478 rtlpriv->sec.key_buf[key_index]);
2479 } else {
2480 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2481 "set group key\n");
2482
2483 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2484 rtl_cam_add_one_entry(hw,
2485 rtlefuse->dev_addr,
2486 PAIRWISE_KEYIDX,
2487 CAM_PAIRWISE_KEY_POSITION,
2488 enc_algo, CAM_CONFIG_NO_USEDK,
2489 rtlpriv->sec.key_buf[entry_id]);
2490 }
2491
2492 rtl_cam_add_one_entry(hw, macaddr, key_index,
2493 entry_id, enc_algo,
2494 CAM_CONFIG_NO_USEDK,
2495 rtlpriv->sec.key_buf[entry_id]);
2496 }
2497 }
2498 }
2499 }
2500
2501 void rtl92ee_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2502 bool auto_load_fail, u8 *hwinfo)
2503 {
2504 struct rtl_priv *rtlpriv = rtl_priv(hw);
2505 u8 value;
2506
2507 if (!auto_load_fail) {
2508 value = hwinfo[EEPROM_RF_BOARD_OPTION_92E];
2509 if (((value & 0xe0) >> 5) == 0x1)
2510 rtlpriv->btcoexist.btc_info.btcoexist = 1;
2511 else
2512 rtlpriv->btcoexist.btc_info.btcoexist = 0;
2513
2514 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8192E;
2515 rtlpriv->btcoexist.btc_info.ant_num = ANT_TOTAL_X2;
2516 } else {
2517 rtlpriv->btcoexist.btc_info.btcoexist = 1;
2518 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8192E;
2519 rtlpriv->btcoexist.btc_info.ant_num = ANT_TOTAL_X1;
2520 }
2521 }
2522
2523 void rtl92ee_bt_reg_init(struct ieee80211_hw *hw)
2524 {
2525 struct rtl_priv *rtlpriv = rtl_priv(hw);
2526
2527 /* 0:Low, 1:High, 2:From Efuse. */
2528 rtlpriv->btcoexist.reg_bt_iso = 2;
2529 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2530 rtlpriv->btcoexist.reg_bt_sco = 3;
2531 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2532 rtlpriv->btcoexist.reg_bt_sco = 0;
2533 }
2534
2535 void rtl92ee_bt_hw_init(struct ieee80211_hw *hw)
2536 {
2537 struct rtl_priv *rtlpriv = rtl_priv(hw);
2538
2539 if (rtlpriv->cfg->ops->get_btc_status())
2540 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
2541 }
2542
2543 void rtl92ee_suspend(struct ieee80211_hw *hw)
2544 {
2545 }
2546
2547 void rtl92ee_resume(struct ieee80211_hw *hw)
2548 {
2549 }
2550
2551 /* Turn on AAP (RCR:bit 0) for promicuous mode. */
2552 void rtl92ee_allow_all_destaddr(struct ieee80211_hw *hw,
2553 bool allow_all_da, bool write_into_reg)
2554 {
2555 struct rtl_priv *rtlpriv = rtl_priv(hw);
2556 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2557
2558 if (allow_all_da) /* Set BIT0 */
2559 rtlpci->receive_config |= RCR_AAP;
2560 else /* Clear BIT0 */
2561 rtlpci->receive_config &= ~RCR_AAP;
2562
2563 if (write_into_reg)
2564 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
2565
2566 RT_TRACE(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD,
2567 "receive_config=0x%08X, write_into_reg=%d\n",
2568 rtlpci->receive_config, write_into_reg);
2569 }