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