1 /******************************************************************************
2  *
3  * Copyright(c) 2009-2010  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 #include "../btcoexist/rtl_btc.h"
43 
44 #define LLT_CONFIG	5
45 
46 static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw)
47 {
48 	struct rtl_priv *rtlpriv = rtl_priv(hw);
49 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
50 	struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
51 	unsigned long flags;
52 
53 	spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
54 	while (skb_queue_len(&ring->queue)) {
55 		struct rtl_tx_desc *entry = &ring->desc[ring->idx];
56 		struct sk_buff *skb = __skb_dequeue(&ring->queue);
57 
58 		pci_unmap_single(rtlpci->pdev,
59 				 rtlpriv->cfg->ops->get_desc(
60 				 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
61 				 skb->len, PCI_DMA_TODEVICE);
62 		kfree_skb(skb);
63 		ring->idx = (ring->idx + 1) % ring->entries;
64 	}
65 	spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
66 }
67 
68 static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
69 					u8 set_bits, u8 clear_bits)
70 {
71 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
72 	struct rtl_priv *rtlpriv = rtl_priv(hw);
73 
74 	rtlpci->reg_bcn_ctrl_val |= set_bits;
75 	rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
76 
77 	rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
78 }
79 
80 void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw)
81 {
82 	struct rtl_priv *rtlpriv = rtl_priv(hw);
83 	u8 tmp1byte;
84 
85 	tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
86 	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
87 	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
88 	tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
89 	tmp1byte &= ~(BIT(0));
90 	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
91 }
92 
93 void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw)
94 {
95 	struct rtl_priv *rtlpriv = rtl_priv(hw);
96 	u8 tmp1byte;
97 
98 	tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
99 	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
100 	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
101 	tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
102 	tmp1byte |= BIT(0);
103 	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
104 }
105 
106 static void _rtl8821ae_enable_bcn_sub_func(struct ieee80211_hw *hw)
107 {
108 	_rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(1));
109 }
110 
111 static void _rtl8821ae_disable_bcn_sub_func(struct ieee80211_hw *hw)
112 {
113 	_rtl8821ae_set_bcn_ctrl_reg(hw, BIT(1), 0);
114 }
115 
116 static void _rtl8821ae_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 					goto change_done;
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 			goto change_done;
149 		}
150 	}
151 change_done:
152 	if (IS_IN_LOW_POWER_STATE_8821AE(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_8821AE;
167 				RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
168 					 "Receive CPWM INT!!! Set rtlhal->FwPSState = %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 	} else  {
180 		spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
181 		rtlhal->fw_clk_change_in_progress = false;
182 		spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
183 	}
184 }
185 
186 static void _rtl8821ae_set_fw_clock_off(struct ieee80211_hw *hw,
187 					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 	rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
204 	if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
205 		return;
206 
207 	for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
208 		ring = &rtlpci->tx_ring[queue];
209 		if (skb_queue_len(&ring->queue)) {
210 			b_schedule_timer = true;
211 			break;
212 		}
213 	}
214 
215 	if (b_schedule_timer) {
216 		mod_timer(&rtlpriv->works.fw_clockoff_timer,
217 			  jiffies + MSECS(10));
218 		return;
219 	}
220 
221 	if (FW_PS_STATE(rtlhal->fw_ps_state) !=
222 		FW_PS_STATE_RF_OFF_LOW_PWR_8821AE) {
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 _rtl8821ae_set_fw_ps_rf_on(struct ieee80211_hw *hw)
243 {
244 	u8 rpwm_val = 0;
245 
246 	rpwm_val |= (FW_PS_STATE_RF_OFF_8821AE | FW_PS_ACK);
247 	_rtl8821ae_set_fw_clock_on(hw, rpwm_val, true);
248 }
249 
250 static void _rtl8821ae_fwlps_leave(struct ieee80211_hw *hw)
251 {
252 	struct rtl_priv *rtlpriv = rtl_priv(hw);
253 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
254 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
255 	bool fw_current_inps = false;
256 	u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
257 
258 	if (ppsc->low_power_enable) {
259 		rpwm_val = (FW_PS_STATE_ALL_ON_8821AE|FW_PS_ACK);/* RF on */
260 		_rtl8821ae_set_fw_clock_on(hw, rpwm_val, false);
261 		rtlhal->allow_sw_to_change_hwclc = false;
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 	} else {
267 		rpwm_val = FW_PS_STATE_ALL_ON_8821AE;	/* RF on */
268 		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
269 				(u8 *)(&rpwm_val));
270 		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
271 				(u8 *)(&fw_pwrmode));
272 		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
273 				(u8 *)(&fw_current_inps));
274 	}
275 }
276 
277 static void _rtl8821ae_fwlps_enter(struct ieee80211_hw *hw)
278 {
279 	struct rtl_priv *rtlpriv = rtl_priv(hw);
280 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
281 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
282 	bool fw_current_inps = true;
283 	u8 rpwm_val;
284 
285 	if (ppsc->low_power_enable) {
286 		rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_8821AE;	/* RF off */
287 		rtlpriv->cfg->ops->set_hw_reg(hw,
288 				HW_VAR_FW_PSMODE_STATUS,
289 				(u8 *)(&fw_current_inps));
290 		rtlpriv->cfg->ops->set_hw_reg(hw,
291 				HW_VAR_H2C_FW_PWRMODE,
292 				(u8 *)(&ppsc->fwctrl_psmode));
293 		rtlhal->allow_sw_to_change_hwclc = true;
294 		_rtl8821ae_set_fw_clock_off(hw, rpwm_val);
295 	} else {
296 		rpwm_val = FW_PS_STATE_RF_OFF_8821AE;	/* RF off */
297 		rtlpriv->cfg->ops->set_hw_reg(hw,
298 				HW_VAR_FW_PSMODE_STATUS,
299 				(u8 *)(&fw_current_inps));
300 		rtlpriv->cfg->ops->set_hw_reg(hw,
301 				HW_VAR_H2C_FW_PWRMODE,
302 				(u8 *)(&ppsc->fwctrl_psmode));
303 		rtlpriv->cfg->ops->set_hw_reg(hw,
304 				HW_VAR_SET_RPWM,
305 				(u8 *)(&rpwm_val));
306 	}
307 }
308 
309 static void _rtl8821ae_download_rsvd_page(struct ieee80211_hw *hw,
310 					  bool dl_whole_packets)
311 {
312 	struct rtl_priv *rtlpriv = rtl_priv(hw);
313 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
314 	u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
315 	u8 count = 0, dlbcn_count = 0;
316 	bool send_beacon = false;
317 
318 	tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
319 	rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr | BIT(0)));
320 
321 	_rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
322 	_rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
323 
324 	tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
325 	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
326 		       tmp_reg422 & (~BIT(6)));
327 	if (tmp_reg422 & BIT(6))
328 		send_beacon = true;
329 
330 	do {
331 		bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
332 		rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
333 			       (bcnvalid_reg | BIT(0)));
334 		_rtl8821ae_return_beacon_queue_skb(hw);
335 
336 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
337 			rtl8812ae_set_fw_rsvdpagepkt(hw, false,
338 						     dl_whole_packets);
339 		else
340 			rtl8821ae_set_fw_rsvdpagepkt(hw, false,
341 						     dl_whole_packets);
342 
343 		bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
344 		count = 0;
345 		while (!(bcnvalid_reg & BIT(0)) && count < 20) {
346 			count++;
347 			udelay(10);
348 			bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
349 		}
350 		dlbcn_count++;
351 	} while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
352 
353 	if (!(bcnvalid_reg & BIT(0)))
354 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
355 			 "Download RSVD page failed!\n");
356 	if (bcnvalid_reg & BIT(0) && rtlhal->enter_pnp_sleep) {
357 		rtl_write_byte(rtlpriv, REG_TDECTRL + 2, bcnvalid_reg | BIT(0));
358 		_rtl8821ae_return_beacon_queue_skb(hw);
359 		if (send_beacon) {
360 			dlbcn_count = 0;
361 			do {
362 				rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
363 					       bcnvalid_reg | BIT(0));
364 
365 				_rtl8821ae_return_beacon_queue_skb(hw);
366 
367 				if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
368 					rtl8812ae_set_fw_rsvdpagepkt(hw, true,
369 								     false);
370 				else
371 					rtl8821ae_set_fw_rsvdpagepkt(hw, true,
372 								     false);
373 
374 				/* check rsvd page download OK. */
375 				bcnvalid_reg = rtl_read_byte(rtlpriv,
376 							     REG_TDECTRL + 2);
377 				count = 0;
378 				while (!(bcnvalid_reg & BIT(0)) && count < 20) {
379 					count++;
380 					udelay(10);
381 					bcnvalid_reg =
382 					  rtl_read_byte(rtlpriv,
383 							REG_TDECTRL + 2);
384 				}
385 				dlbcn_count++;
386 			} while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
387 
388 			if (!(bcnvalid_reg & BIT(0)))
389 				RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
390 					 "2 Download RSVD page failed!\n");
391 		}
392 	}
393 
394 	if (bcnvalid_reg & BIT(0))
395 		rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0));
396 
397 	_rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
398 	_rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
399 
400 	if (send_beacon)
401 		rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
402 
403 	if (!rtlhal->enter_pnp_sleep) {
404 		tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
405 		rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0))));
406 	}
407 }
408 
409 void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
410 {
411 	struct rtl_priv *rtlpriv = rtl_priv(hw);
412 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
413 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
414 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
415 
416 	switch (variable) {
417 	case HW_VAR_ETHER_ADDR:
418 		*((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_MACID);
419 		*((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_MACID + 4);
420 		break;
421 	case HW_VAR_BSSID:
422 		*((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_BSSID);
423 		*((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_BSSID+4);
424 		break;
425 	case HW_VAR_MEDIA_STATUS:
426 		val[0] = rtl_read_byte(rtlpriv, MSR) & 0x3;
427 		break;
428 	case HW_VAR_SLOT_TIME:
429 		*((u8 *)(val)) = mac->slot_time;
430 		break;
431 	case HW_VAR_BEACON_INTERVAL:
432 		*((u16 *)(val)) = rtl_read_word(rtlpriv, REG_BCN_INTERVAL);
433 		break;
434 	case HW_VAR_ATIM_WINDOW:
435 		*((u16 *)(val)) =  rtl_read_word(rtlpriv, REG_ATIMWND);
436 		break;
437 	case HW_VAR_RCR:
438 		*((u32 *)(val)) = rtlpci->receive_config;
439 		break;
440 	case HW_VAR_RF_STATE:
441 		*((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
442 		break;
443 	case HW_VAR_FWLPS_RF_ON:{
444 		enum rf_pwrstate rfstate;
445 		u32 val_rcr;
446 
447 		rtlpriv->cfg->ops->get_hw_reg(hw,
448 					      HW_VAR_RF_STATE,
449 					      (u8 *)(&rfstate));
450 		if (rfstate == ERFOFF) {
451 			*((bool *)(val)) = true;
452 		} else {
453 			val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
454 			val_rcr &= 0x00070000;
455 			if (val_rcr)
456 				*((bool *)(val)) = false;
457 			else
458 				*((bool *)(val)) = true;
459 		}
460 		break; }
461 	case HW_VAR_FW_PSMODE_STATUS:
462 		*((bool *)(val)) = ppsc->fw_current_inpsmode;
463 		break;
464 	case HW_VAR_CORRECT_TSF:{
465 		u64 tsf;
466 		u32 *ptsf_low = (u32 *)&tsf;
467 		u32 *ptsf_high = ((u32 *)&tsf) + 1;
468 
469 		*ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
470 		*ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
471 
472 		*((u64 *)(val)) = tsf;
473 
474 		break; }
475 	case HAL_DEF_WOWLAN:
476 		if (ppsc->wo_wlan_mode)
477 			*((bool *)(val)) = true;
478 		else
479 			*((bool *)(val)) = false;
480 		break;
481 	default:
482 		RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
483 			 "switch case not process %x\n", variable);
484 		break;
485 	}
486 }
487 
488 void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
489 {
490 	struct rtl_priv *rtlpriv = rtl_priv(hw);
491 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
492 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
493 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
494 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
495 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
496 	u8 idx;
497 
498 	switch (variable) {
499 	case HW_VAR_ETHER_ADDR:{
500 			for (idx = 0; idx < ETH_ALEN; idx++) {
501 				rtl_write_byte(rtlpriv, (REG_MACID + idx),
502 					       val[idx]);
503 			}
504 			break;
505 		}
506 	case HW_VAR_BASIC_RATE:{
507 			u16 b_rate_cfg = ((u16 *)val)[0];
508 			b_rate_cfg = b_rate_cfg & 0x15f;
509 			rtl_write_word(rtlpriv, REG_RRSR, b_rate_cfg);
510 			break;
511 		}
512 	case HW_VAR_BSSID:{
513 			for (idx = 0; idx < ETH_ALEN; idx++) {
514 				rtl_write_byte(rtlpriv, (REG_BSSID + idx),
515 					       val[idx]);
516 			}
517 			break;
518 		}
519 	case HW_VAR_SIFS:
520 		rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
521 		rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[0]);
522 
523 		rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
524 		rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
525 
526 		rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]);
527 		rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM, val[0]);
528 		break;
529 	case HW_VAR_R2T_SIFS:
530 		rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]);
531 		break;
532 	case HW_VAR_SLOT_TIME:{
533 		u8 e_aci;
534 
535 		RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
536 			 "HW_VAR_SLOT_TIME %x\n", val[0]);
537 
538 		rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
539 
540 		for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
541 			rtlpriv->cfg->ops->set_hw_reg(hw,
542 						      HW_VAR_AC_PARAM,
543 						      (u8 *)(&e_aci));
544 		}
545 		break; }
546 	case HW_VAR_ACK_PREAMBLE:{
547 		u8 reg_tmp;
548 		u8 short_preamble = (bool)(*(u8 *)val);
549 
550 		reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);
551 		if (short_preamble) {
552 			reg_tmp |= BIT(1);
553 			rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2,
554 				       reg_tmp);
555 		} else {
556 			reg_tmp &= (~BIT(1));
557 			rtl_write_byte(rtlpriv,
558 				REG_TRXPTCL_CTL + 2,
559 				reg_tmp);
560 		}
561 		break; }
562 	case HW_VAR_WPA_CONFIG:
563 		rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
564 		break;
565 	case HW_VAR_AMPDU_MIN_SPACE:{
566 		u8 min_spacing_to_set;
567 		u8 sec_min_space;
568 
569 		min_spacing_to_set = *((u8 *)val);
570 		if (min_spacing_to_set <= 7) {
571 			sec_min_space = 0;
572 
573 			if (min_spacing_to_set < sec_min_space)
574 				min_spacing_to_set = sec_min_space;
575 
576 			mac->min_space_cfg = ((mac->min_space_cfg &
577 					       0xf8) |
578 					      min_spacing_to_set);
579 
580 			*val = min_spacing_to_set;
581 
582 			RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
583 				 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
584 				  mac->min_space_cfg);
585 
586 			rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
587 				       mac->min_space_cfg);
588 		}
589 		break; }
590 	case HW_VAR_SHORTGI_DENSITY:{
591 		u8 density_to_set;
592 
593 		density_to_set = *((u8 *)val);
594 		mac->min_space_cfg |= (density_to_set << 3);
595 
596 		RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
597 			 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
598 			  mac->min_space_cfg);
599 
600 		rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
601 			       mac->min_space_cfg);
602 
603 		break; }
604 	case HW_VAR_AMPDU_FACTOR:{
605 		u32	ampdu_len =  (*((u8 *)val));
606 
607 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
608 			if (ampdu_len < VHT_AGG_SIZE_128K)
609 				ampdu_len =
610 					(0x2000 << (*((u8 *)val))) - 1;
611 			else
612 				ampdu_len = 0x1ffff;
613 		} else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
614 			if (ampdu_len < HT_AGG_SIZE_64K)
615 				ampdu_len =
616 					(0x2000 << (*((u8 *)val))) - 1;
617 			else
618 				ampdu_len = 0xffff;
619 		}
620 		ampdu_len |= BIT(31);
621 
622 		rtl_write_dword(rtlpriv,
623 			REG_AMPDU_MAX_LENGTH_8812, ampdu_len);
624 		break; }
625 	case HW_VAR_AC_PARAM:{
626 		u8 e_aci = *((u8 *)val);
627 
628 		rtl8821ae_dm_init_edca_turbo(hw);
629 		if (rtlpci->acm_method != EACMWAY2_SW)
630 			rtlpriv->cfg->ops->set_hw_reg(hw,
631 						      HW_VAR_ACM_CTRL,
632 						      (u8 *)(&e_aci));
633 		break; }
634 	case HW_VAR_ACM_CTRL:{
635 		u8 e_aci = *((u8 *)val);
636 		union aci_aifsn *p_aci_aifsn =
637 		    (union aci_aifsn *)(&mac->ac[0].aifs);
638 		u8 acm = p_aci_aifsn->f.acm;
639 		u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
640 
641 		acm_ctrl =
642 		    acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
643 
644 		if (acm) {
645 			switch (e_aci) {
646 			case AC0_BE:
647 				acm_ctrl |= ACMHW_BEQEN;
648 				break;
649 			case AC2_VI:
650 				acm_ctrl |= ACMHW_VIQEN;
651 				break;
652 			case AC3_VO:
653 				acm_ctrl |= ACMHW_VOQEN;
654 				break;
655 			default:
656 				RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
657 					 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
658 					 acm);
659 				break;
660 			}
661 		} else {
662 			switch (e_aci) {
663 			case AC0_BE:
664 				acm_ctrl &= (~ACMHW_BEQEN);
665 				break;
666 			case AC2_VI:
667 				acm_ctrl &= (~ACMHW_VIQEN);
668 				break;
669 			case AC3_VO:
670 				acm_ctrl &= (~ACMHW_VOQEN);
671 				break;
672 			default:
673 				RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
674 					 "switch case not process\n");
675 				break;
676 			}
677 		}
678 
679 		RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
680 			 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
681 			 acm_ctrl);
682 		rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
683 		break; }
684 	case HW_VAR_RCR:
685 		rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
686 		rtlpci->receive_config = ((u32 *)(val))[0];
687 		break;
688 	case HW_VAR_RETRY_LIMIT:{
689 		u8 retry_limit = ((u8 *)(val))[0];
690 
691 		rtl_write_word(rtlpriv, REG_RL,
692 			       retry_limit << RETRY_LIMIT_SHORT_SHIFT |
693 			       retry_limit << RETRY_LIMIT_LONG_SHIFT);
694 		break; }
695 	case HW_VAR_DUAL_TSF_RST:
696 		rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
697 		break;
698 	case HW_VAR_EFUSE_BYTES:
699 		rtlefuse->efuse_usedbytes = *((u16 *)val);
700 		break;
701 	case HW_VAR_EFUSE_USAGE:
702 		rtlefuse->efuse_usedpercentage = *((u8 *)val);
703 		break;
704 	case HW_VAR_IO_CMD:
705 		rtl8821ae_phy_set_io_cmd(hw, (*(enum io_type *)val));
706 		break;
707 	case HW_VAR_SET_RPWM:{
708 		u8 rpwm_val;
709 
710 		rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
711 		udelay(1);
712 
713 		if (rpwm_val & BIT(7)) {
714 			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
715 				       (*(u8 *)val));
716 		} else {
717 			rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
718 				       ((*(u8 *)val) | BIT(7)));
719 		}
720 
721 		break; }
722 	case HW_VAR_H2C_FW_PWRMODE:
723 		rtl8821ae_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
724 		break;
725 	case HW_VAR_FW_PSMODE_STATUS:
726 		ppsc->fw_current_inpsmode = *((bool *)val);
727 		break;
728 	case HW_VAR_INIT_RTS_RATE:
729 		break;
730 	case HW_VAR_RESUME_CLK_ON:
731 		_rtl8821ae_set_fw_ps_rf_on(hw);
732 		break;
733 	case HW_VAR_FW_LPS_ACTION:{
734 		bool b_enter_fwlps = *((bool *)val);
735 
736 		if (b_enter_fwlps)
737 			_rtl8821ae_fwlps_enter(hw);
738 		 else
739 			_rtl8821ae_fwlps_leave(hw);
740 		 break; }
741 	case HW_VAR_H2C_FW_JOINBSSRPT:{
742 		u8 mstatus = (*(u8 *)val);
743 
744 		if (mstatus == RT_MEDIA_CONNECT) {
745 			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
746 						      NULL);
747 			_rtl8821ae_download_rsvd_page(hw, false);
748 		}
749 		rtl8821ae_set_fw_media_status_rpt_cmd(hw, mstatus);
750 
751 		break; }
752 	case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
753 		rtl8821ae_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
754 		break;
755 	case HW_VAR_AID:{
756 		u16 u2btmp;
757 		u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
758 		u2btmp &= 0xC000;
759 		rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp |
760 			       mac->assoc_id));
761 		break; }
762 	case HW_VAR_CORRECT_TSF:{
763 		u8 btype_ibss = ((u8 *)(val))[0];
764 
765 		if (btype_ibss)
766 			_rtl8821ae_stop_tx_beacon(hw);
767 
768 		_rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
769 
770 		rtl_write_dword(rtlpriv, REG_TSFTR,
771 				(u32)(mac->tsf & 0xffffffff));
772 		rtl_write_dword(rtlpriv, REG_TSFTR + 4,
773 				(u32)((mac->tsf >> 32) & 0xffffffff));
774 
775 		_rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
776 
777 		if (btype_ibss)
778 			_rtl8821ae_resume_tx_beacon(hw);
779 		break; }
780 	case HW_VAR_NAV_UPPER: {
781 		u32	us_nav_upper = ((u32)*val);
782 
783 		if (us_nav_upper > HAL_92C_NAV_UPPER_UNIT * 0xFF) {
784 			RT_TRACE(rtlpriv, COMP_INIT , DBG_WARNING,
785 				 "The setting value (0x%08X us) of NAV_UPPER is larger than (%d * 0xFF)!!!\n",
786 				 us_nav_upper, HAL_92C_NAV_UPPER_UNIT);
787 			break;
788 		}
789 		rtl_write_byte(rtlpriv, REG_NAV_UPPER,
790 			       ((u8)((us_nav_upper +
791 				HAL_92C_NAV_UPPER_UNIT - 1) /
792 				HAL_92C_NAV_UPPER_UNIT)));
793 		break; }
794 	case HW_VAR_KEEP_ALIVE: {
795 		u8 array[2];
796 		array[0] = 0xff;
797 		array[1] = *((u8 *)val);
798 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL, 2,
799 				       array);
800 		break; }
801 	default:
802 		RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
803 			 "switch case not process %x\n", variable);
804 		break;
805 	}
806 }
807 
808 static bool _rtl8821ae_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
809 {
810 	struct rtl_priv *rtlpriv = rtl_priv(hw);
811 	bool status = true;
812 	long count = 0;
813 	u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
814 		    _LLT_OP(_LLT_WRITE_ACCESS);
815 
816 	rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
817 
818 	do {
819 		value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
820 		if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
821 			break;
822 
823 		if (count > POLLING_LLT_THRESHOLD) {
824 			RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
825 				 "Failed to polling write LLT done at address %d!\n",
826 				 address);
827 			status = false;
828 			break;
829 		}
830 	} while (++count);
831 
832 	return status;
833 }
834 
835 static bool _rtl8821ae_llt_table_init(struct ieee80211_hw *hw)
836 {
837 	struct rtl_priv *rtlpriv = rtl_priv(hw);
838 	unsigned short i;
839 	u8 txpktbuf_bndy;
840 	u32 rqpn;
841 	u8 maxpage;
842 	bool status;
843 
844 	maxpage = 255;
845 	txpktbuf_bndy = 0xF8;
846 	rqpn = 0x80e70808;
847 	if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE) {
848 		txpktbuf_bndy = 0xFA;
849 		rqpn = 0x80e90808;
850 	}
851 
852 	rtl_write_byte(rtlpriv, REG_TRXFF_BNDY, txpktbuf_bndy);
853 	rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, MAX_RX_DMA_BUFFER_SIZE - 1);
854 
855 	rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
856 
857 	rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
858 	rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
859 
860 	rtl_write_byte(rtlpriv, REG_PBP, 0x31);
861 	rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
862 
863 	for (i = 0; i < (txpktbuf_bndy - 1); i++) {
864 		status = _rtl8821ae_llt_write(hw, i, i + 1);
865 		if (!status)
866 			return status;
867 	}
868 
869 	status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
870 	if (!status)
871 		return status;
872 
873 	for (i = txpktbuf_bndy; i < maxpage; i++) {
874 		status = _rtl8821ae_llt_write(hw, i, (i + 1));
875 		if (!status)
876 			return status;
877 	}
878 
879 	status = _rtl8821ae_llt_write(hw, maxpage, txpktbuf_bndy);
880 	if (!status)
881 		return status;
882 
883 	rtl_write_dword(rtlpriv, REG_RQPN, rqpn);
884 
885 	rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00);
886 
887 	return true;
888 }
889 
890 static void _rtl8821ae_gen_refresh_led_state(struct ieee80211_hw *hw)
891 {
892 	struct rtl_priv *rtlpriv = rtl_priv(hw);
893 	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
894 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
895 	struct rtl_led *pled0 = &pcipriv->ledctl.sw_led0;
896 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
897 
898 	if (rtlpriv->rtlhal.up_first_time)
899 		return;
900 
901 	if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
902 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
903 			rtl8812ae_sw_led_on(hw, pled0);
904 		else
905 			rtl8821ae_sw_led_on(hw, pled0);
906 	else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
907 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
908 			rtl8812ae_sw_led_on(hw, pled0);
909 		else
910 			rtl8821ae_sw_led_on(hw, pled0);
911 	else
912 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
913 			rtl8812ae_sw_led_off(hw, pled0);
914 		else
915 			rtl8821ae_sw_led_off(hw, pled0);
916 }
917 
918 static bool _rtl8821ae_init_mac(struct ieee80211_hw *hw)
919 {
920 	struct rtl_priv *rtlpriv = rtl_priv(hw);
921 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
922 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
923 
924 	u8 bytetmp = 0;
925 	u16 wordtmp = 0;
926 	bool mac_func_enable = rtlhal->mac_func_enable;
927 
928 	rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
929 
930 	/*Auto Power Down to CHIP-off State*/
931 	bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
932 	rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
933 
934 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
935 		/* HW Power on sequence*/
936 		if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
937 					      PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
938 					      RTL8812_NIC_ENABLE_FLOW)) {
939 				RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
940 					 "init 8812 MAC Fail as power on failure\n");
941 				return false;
942 		}
943 	} else {
944 		/* HW Power on sequence */
945 		if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_A_MSK,
946 					      PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
947 					      RTL8821A_NIC_ENABLE_FLOW)){
948 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
949 				"init 8821 MAC Fail as power on failure\n");
950 			return false;
951 		}
952 	}
953 
954 	bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
955 	rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
956 
957 	bytetmp = rtl_read_byte(rtlpriv, REG_CR);
958 	bytetmp = 0xff;
959 	rtl_write_byte(rtlpriv, REG_CR, bytetmp);
960 	mdelay(2);
961 
962 	bytetmp = 0xff;
963 	rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
964 	mdelay(2);
965 
966 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
967 		bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
968 		if (bytetmp & BIT(0)) {
969 			bytetmp = rtl_read_byte(rtlpriv, 0x7c);
970 			bytetmp |= BIT(6);
971 			rtl_write_byte(rtlpriv, 0x7c, bytetmp);
972 		}
973 	}
974 
975 	bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
976 	bytetmp &= ~BIT(4);
977 	rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp);
978 
979 	rtl_write_word(rtlpriv, REG_CR, 0x2ff);
980 
981 	if (!mac_func_enable) {
982 		if (!_rtl8821ae_llt_table_init(hw))
983 			return false;
984 	}
985 
986 	rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
987 	rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
988 
989 	/* Enable FW Beamformer Interrupt */
990 	bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3);
991 	rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6));
992 
993 	wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
994 	wordtmp &= 0xf;
995 	wordtmp |= 0xF5B1;
996 	rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
997 
998 	rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
999 	rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1000 	rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
1001 	/*low address*/
1002 	rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
1003 			rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
1004 	rtl_write_dword(rtlpriv, REG_MGQ_DESA,
1005 			rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
1006 	rtl_write_dword(rtlpriv, REG_VOQ_DESA,
1007 			rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
1008 	rtl_write_dword(rtlpriv, REG_VIQ_DESA,
1009 			rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
1010 	rtl_write_dword(rtlpriv, REG_BEQ_DESA,
1011 			rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
1012 	rtl_write_dword(rtlpriv, REG_BKQ_DESA,
1013 			rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
1014 	rtl_write_dword(rtlpriv, REG_HQ_DESA,
1015 			rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
1016 	rtl_write_dword(rtlpriv, REG_RX_DESA,
1017 			rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
1018 
1019 	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, 0x77);
1020 
1021 	rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
1022 
1023 	rtl_write_dword(rtlpriv, REG_MCUTST_1, 0);
1024 
1025 	rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
1026 	_rtl8821ae_gen_refresh_led_state(hw);
1027 
1028 	return true;
1029 }
1030 
1031 static void _rtl8821ae_hw_configure(struct ieee80211_hw *hw)
1032 {
1033 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1034 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1035 	u32 reg_rrsr;
1036 
1037 	reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
1038 
1039 	rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
1040 	/* ARFB table 9 for 11ac 5G 2SS */
1041 	rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
1042 	/* ARFB table 10 for 11ac 5G 1SS */
1043 	rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
1044 	/* ARFB table 11 for 11ac 24G 1SS */
1045 	rtl_write_dword(rtlpriv, REG_ARFR2, 0x00000015);
1046 	rtl_write_dword(rtlpriv, REG_ARFR2 + 4, 0x003ff000);
1047 	/* ARFB table 12 for 11ac 24G 1SS */
1048 	rtl_write_dword(rtlpriv, REG_ARFR3, 0x00000015);
1049 	rtl_write_dword(rtlpriv, REG_ARFR3 + 4, 0xffcff000);
1050 	/* 0x420[7] = 0 , enable retry AMPDU in new AMPD not singal MPDU. */
1051 	rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
1052 	rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
1053 
1054 	/*Set retry limit*/
1055 	rtl_write_word(rtlpriv, REG_RL, 0x0707);
1056 
1057 	/* Set Data / Response auto rate fallack retry count*/
1058 	rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
1059 	rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
1060 	rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
1061 	rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
1062 
1063 	rtlpci->reg_bcn_ctrl_val = 0x1d;
1064 	rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
1065 
1066 	/* TBTT prohibit hold time. Suggested by designer TimChen. */
1067 	rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
1068 
1069 	/* AGGR_BK_TIME Reg51A 0x16 */
1070 	rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
1071 
1072 	/*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
1073 	rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
1074 
1075 	rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
1076 	rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
1077 	rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, 0x1F1F);
1078 }
1079 
1080 static u16 _rtl8821ae_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
1081 {
1082 	u16 ret = 0;
1083 	u8 tmp = 0, count = 0;
1084 
1085 	rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
1086 	tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1087 	count = 0;
1088 	while (tmp && count < 20) {
1089 		udelay(10);
1090 		tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1091 		count++;
1092 	}
1093 	if (0 == tmp)
1094 		ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
1095 
1096 	return ret;
1097 }
1098 
1099 static void _rtl8821ae_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
1100 {
1101 	u8 tmp = 0, count = 0;
1102 
1103 	rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
1104 	rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
1105 	tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1106 	count = 0;
1107 	while (tmp && count < 20) {
1108 		udelay(10);
1109 		tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1110 		count++;
1111 	}
1112 }
1113 
1114 static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
1115 {
1116 	u16 read_addr = addr & 0xfffc;
1117 	u8 tmp = 0, count = 0, ret = 0;
1118 
1119 	rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
1120 	rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
1121 	tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1122 	count = 0;
1123 	while (tmp && count < 20) {
1124 		udelay(10);
1125 		tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1126 		count++;
1127 	}
1128 	if (0 == tmp) {
1129 		read_addr = REG_DBI_RDATA + addr % 4;
1130 		ret = rtl_read_word(rtlpriv, read_addr);
1131 	}
1132 	return ret;
1133 }
1134 
1135 static void _rtl8821ae_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
1136 {
1137 	u8 tmp = 0, count = 0;
1138 	u16 wrtie_addr, remainder = addr % 4;
1139 
1140 	wrtie_addr = REG_DBI_WDATA + remainder;
1141 	rtl_write_byte(rtlpriv, wrtie_addr, data);
1142 
1143 	wrtie_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
1144 	rtl_write_word(rtlpriv, REG_DBI_ADDR, wrtie_addr);
1145 
1146 	rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
1147 
1148 	tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1149 	count = 0;
1150 	while (tmp && count < 20) {
1151 		udelay(10);
1152 		tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1153 		count++;
1154 	}
1155 }
1156 
1157 static void _rtl8821ae_enable_aspm_back_door(struct ieee80211_hw *hw)
1158 {
1159 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1160 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1161 	u8 tmp;
1162 
1163 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1164 		if (_rtl8821ae_mdio_read(rtlpriv, 0x04) != 0x8544)
1165 			_rtl8821ae_mdio_write(rtlpriv, 0x04, 0x8544);
1166 
1167 		if (_rtl8821ae_mdio_read(rtlpriv, 0x0b) != 0x0070)
1168 			_rtl8821ae_mdio_write(rtlpriv, 0x0b, 0x0070);
1169 	}
1170 
1171 	tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f);
1172 	_rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7));
1173 
1174 	tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719);
1175 	_rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4));
1176 
1177 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1178 		tmp  = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1179 		_rtl8821ae_dbi_write(rtlpriv, 0x718, tmp|BIT(4));
1180 	}
1181 }
1182 
1183 void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw)
1184 {
1185 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1186 	u8 sec_reg_value;
1187 	u8 tmp;
1188 
1189 	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1190 		 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1191 		  rtlpriv->sec.pairwise_enc_algorithm,
1192 		  rtlpriv->sec.group_enc_algorithm);
1193 
1194 	if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1195 		RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1196 			 "not open hw encryption\n");
1197 		return;
1198 	}
1199 
1200 	sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1201 
1202 	if (rtlpriv->sec.use_defaultkey) {
1203 		sec_reg_value |= SCR_TXUSEDK;
1204 		sec_reg_value |= SCR_RXUSEDK;
1205 	}
1206 
1207 	sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1208 
1209 	tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1210 	rtl_write_byte(rtlpriv, REG_CR + 1, tmp | BIT(1));
1211 
1212 	RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1213 		 "The SECR-value %x\n", sec_reg_value);
1214 
1215 	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1216 }
1217 
1218 /* Static MacID Mapping (cf. Used in MacIdDoStaticMapping) ---------- */
1219 #define MAC_ID_STATIC_FOR_DEFAULT_PORT				0
1220 #define MAC_ID_STATIC_FOR_BROADCAST_MULTICAST		1
1221 #define MAC_ID_STATIC_FOR_BT_CLIENT_START				2
1222 #define MAC_ID_STATIC_FOR_BT_CLIENT_END				3
1223 /* ----------------------------------------------------------- */
1224 
1225 static void rtl8821ae_macid_initialize_mediastatus(struct ieee80211_hw *hw)
1226 {
1227 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1228 	u8	media_rpt[4] = {RT_MEDIA_CONNECT, 1,
1229 		MAC_ID_STATIC_FOR_BROADCAST_MULTICAST,
1230 		MAC_ID_STATIC_FOR_BT_CLIENT_END};
1231 
1232 	rtlpriv->cfg->ops->set_hw_reg(hw,
1233 		HW_VAR_H2C_FW_MEDIASTATUSRPT, media_rpt);
1234 
1235 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1236 		 "Initialize MacId media status: from %d to %d\n",
1237 		 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST,
1238 		 MAC_ID_STATIC_FOR_BT_CLIENT_END);
1239 }
1240 
1241 static bool _rtl8821ae_check_pcie_dma_hang(struct ieee80211_hw *hw)
1242 {
1243 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1244 	u8 tmp;
1245 
1246 	/* write reg 0x350 Bit[26]=1. Enable debug port. */
1247 	tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1248 	if (!(tmp & BIT(2))) {
1249 		rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2)));
1250 		mdelay(100);
1251 	}
1252 
1253 	/* read reg 0x350 Bit[25] if 1 : RX hang */
1254 	/* read reg 0x350 Bit[24] if 1 : TX hang */
1255 	tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1256 	if ((tmp & BIT(0)) || (tmp & BIT(1))) {
1257 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1258 			 "CheckPcieDMAHang8821AE(): true! Reset PCIE DMA!\n");
1259 		return true;
1260 	} else {
1261 		return false;
1262 	}
1263 }
1264 
1265 static bool _rtl8821ae_reset_pcie_interface_dma(struct ieee80211_hw *hw,
1266 					 bool mac_power_on,
1267 					 bool in_watchdog)
1268 {
1269 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1270 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1271 	u8 tmp;
1272 	bool release_mac_rx_pause;
1273 	u8 backup_pcie_dma_pause;
1274 
1275 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
1276 
1277 	/* 1. Disable register write lock. 0x1c[1] = 0 */
1278 	tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
1279 	tmp &= ~(BIT(1));
1280 	rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
1281 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1282 		/* write 0xCC bit[2] = 1'b1 */
1283 		tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1284 		tmp |= BIT(2);
1285 		rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1286 	}
1287 
1288 	/* 2. Check and pause TRX DMA */
1289 	/* write 0x284 bit[18] = 1'b1 */
1290 	/* write 0x301 = 0xFF */
1291 	tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1292 	if (tmp & BIT(2)) {
1293 		/* Already pause before the function for another purpose. */
1294 		release_mac_rx_pause = false;
1295 	} else {
1296 		rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1297 		release_mac_rx_pause = true;
1298 	}
1299 	backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1);
1300 	if (backup_pcie_dma_pause != 0xFF)
1301 		rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF);
1302 
1303 	if (mac_power_on) {
1304 		/* 3. reset TRX function */
1305 		/* write 0x100 = 0x00 */
1306 		rtl_write_byte(rtlpriv, REG_CR, 0);
1307 	}
1308 
1309 	/* 4. Reset PCIe DMA. 0x3[0] = 0 */
1310 	tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1311 	tmp &= ~(BIT(0));
1312 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1313 
1314 	/* 5. Enable PCIe DMA. 0x3[0] = 1 */
1315 	tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1316 	tmp |= BIT(0);
1317 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1318 
1319 	if (mac_power_on) {
1320 		/* 6. enable TRX function */
1321 		/* write 0x100 = 0xFF */
1322 		rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1323 
1324 		/* We should init LLT & RQPN and
1325 		 * prepare Tx/Rx descrptor address later
1326 		 * because MAC function is reset.*/
1327 	}
1328 
1329 	/* 7. Restore PCIe autoload down bit */
1330 	/* 8812AE does not has the defination. */
1331 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1332 		/* write 0xF8 bit[17] = 1'b1 */
1333 		tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2);
1334 		tmp |= BIT(1);
1335 		rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp);
1336 	}
1337 
1338 	/* In MAC power on state, BB and RF maybe in ON state,
1339 	 * if we release TRx DMA here.
1340 	 * it will cause packets to be started to Tx/Rx,
1341 	 * so we release Tx/Rx DMA later.*/
1342 	if (!mac_power_on/* || in_watchdog*/) {
1343 		/* 8. release TRX DMA */
1344 		/* write 0x284 bit[18] = 1'b0 */
1345 		/* write 0x301 = 0x00 */
1346 		if (release_mac_rx_pause) {
1347 			tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1348 			rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL,
1349 				       tmp & (~BIT(2)));
1350 		}
1351 		rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1,
1352 			       backup_pcie_dma_pause);
1353 	}
1354 
1355 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1356 		/* 9. lock system register */
1357 		/* write 0xCC bit[2] = 1'b0 */
1358 		tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1359 		tmp &= ~(BIT(2));
1360 		rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1361 	}
1362 	return true;
1363 }
1364 
1365 static void _rtl8821ae_get_wakeup_reason(struct ieee80211_hw *hw)
1366 {
1367 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1368 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1369 	struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
1370 	u8 fw_reason = 0;
1371 	struct timeval ts;
1372 
1373 	fw_reason = rtl_read_byte(rtlpriv, REG_MCUTST_WOWLAN);
1374 
1375 	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "WOL Read 0x1c7 = %02X\n",
1376 		 fw_reason);
1377 
1378 	ppsc->wakeup_reason = 0;
1379 
1380 	rtlhal->last_suspend_sec = ts.tv_sec;
1381 
1382 	switch (fw_reason) {
1383 	case FW_WOW_V2_PTK_UPDATE_EVENT:
1384 		ppsc->wakeup_reason = WOL_REASON_PTK_UPDATE;
1385 		do_gettimeofday(&ts);
1386 		ppsc->last_wakeup_time = ts.tv_sec*1000 + ts.tv_usec/1000;
1387 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1388 			 "It's a WOL PTK Key update event!\n");
1389 		break;
1390 	case FW_WOW_V2_GTK_UPDATE_EVENT:
1391 		ppsc->wakeup_reason = WOL_REASON_GTK_UPDATE;
1392 		do_gettimeofday(&ts);
1393 		ppsc->last_wakeup_time = ts.tv_sec*1000 + ts.tv_usec/1000;
1394 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1395 			 "It's a WOL GTK Key update event!\n");
1396 		break;
1397 	case FW_WOW_V2_DISASSOC_EVENT:
1398 		ppsc->wakeup_reason = WOL_REASON_DISASSOC;
1399 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1400 			 "It's a disassociation event!\n");
1401 		break;
1402 	case FW_WOW_V2_DEAUTH_EVENT:
1403 		ppsc->wakeup_reason = WOL_REASON_DEAUTH;
1404 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1405 			 "It's a deauth event!\n");
1406 		break;
1407 	case FW_WOW_V2_FW_DISCONNECT_EVENT:
1408 		ppsc->wakeup_reason = WOL_REASON_AP_LOST;
1409 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1410 			 "It's a Fw disconnect decision (AP lost) event!\n");
1411 	break;
1412 	case FW_WOW_V2_MAGIC_PKT_EVENT:
1413 		ppsc->wakeup_reason = WOL_REASON_MAGIC_PKT;
1414 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1415 			 "It's a magic packet event!\n");
1416 		break;
1417 	case FW_WOW_V2_UNICAST_PKT_EVENT:
1418 		ppsc->wakeup_reason = WOL_REASON_UNICAST_PKT;
1419 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1420 			 "It's an unicast packet event!\n");
1421 		break;
1422 	case FW_WOW_V2_PATTERN_PKT_EVENT:
1423 		ppsc->wakeup_reason = WOL_REASON_PATTERN_PKT;
1424 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1425 			 "It's a pattern match event!\n");
1426 		break;
1427 	case FW_WOW_V2_RTD3_SSID_MATCH_EVENT:
1428 		ppsc->wakeup_reason = WOL_REASON_RTD3_SSID_MATCH;
1429 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1430 			 "It's an RTD3 Ssid match event!\n");
1431 		break;
1432 	case FW_WOW_V2_REALWOW_V2_WAKEUPPKT:
1433 		ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_WAKEUPPKT;
1434 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1435 			 "It's an RealWoW wake packet event!\n");
1436 		break;
1437 	case FW_WOW_V2_REALWOW_V2_ACKLOST:
1438 		ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_ACKLOST;
1439 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1440 			 "It's an RealWoW ack lost event!\n");
1441 		break;
1442 	default:
1443 		RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1444 			 "WOL Read 0x1c7 = %02X, Unknown reason!\n",
1445 			  fw_reason);
1446 		break;
1447 	}
1448 }
1449 
1450 static void _rtl8821ae_init_trx_desc_hw_address(struct ieee80211_hw *hw)
1451 {
1452 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1453 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1454 
1455 	/*low address*/
1456 	rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
1457 			rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
1458 	rtl_write_dword(rtlpriv, REG_MGQ_DESA,
1459 			rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
1460 	rtl_write_dword(rtlpriv, REG_VOQ_DESA,
1461 			rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
1462 	rtl_write_dword(rtlpriv, REG_VIQ_DESA,
1463 			rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
1464 	rtl_write_dword(rtlpriv, REG_BEQ_DESA,
1465 			rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
1466 	rtl_write_dword(rtlpriv, REG_BKQ_DESA,
1467 			rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
1468 	rtl_write_dword(rtlpriv, REG_HQ_DESA,
1469 			rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
1470 	rtl_write_dword(rtlpriv, REG_RX_DESA,
1471 			rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
1472 }
1473 
1474 static bool _rtl8821ae_init_llt_table(struct ieee80211_hw *hw, u32 boundary)
1475 {
1476 	bool status = true;
1477 	u32 i;
1478 	u32 txpktbuf_bndy = boundary;
1479 	u32 last_entry_of_txpktbuf = LAST_ENTRY_OF_TX_PKT_BUFFER;
1480 
1481 	for (i = 0 ; i < (txpktbuf_bndy - 1) ; i++) {
1482 		status = _rtl8821ae_llt_write(hw, i , i + 1);
1483 		if (!status)
1484 			return status;
1485 	}
1486 
1487 	status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
1488 	if (!status)
1489 		return status;
1490 
1491 	for (i = txpktbuf_bndy ; i < last_entry_of_txpktbuf ; i++) {
1492 		status = _rtl8821ae_llt_write(hw, i, (i + 1));
1493 		if (!status)
1494 			return status;
1495 	}
1496 
1497 	status = _rtl8821ae_llt_write(hw, last_entry_of_txpktbuf,
1498 				      txpktbuf_bndy);
1499 	if (!status)
1500 		return status;
1501 
1502 	return status;
1503 }
1504 
1505 static bool _rtl8821ae_dynamic_rqpn(struct ieee80211_hw *hw, u32 boundary,
1506 			     u16 npq_rqpn_value, u32 rqpn_val)
1507 {
1508 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1509 	u8 tmp;
1510 	bool ret = true;
1511 	u16 count = 0, tmp16;
1512 	bool support_remote_wakeup;
1513 
1514 	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1515 				      (u8 *)(&support_remote_wakeup));
1516 
1517 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1518 		 "boundary=%#X, NPQ_RQPNValue=%#X, RQPNValue=%#X\n",
1519 		  boundary, npq_rqpn_value, rqpn_val);
1520 
1521 	/* stop PCIe DMA
1522 	 * 1. 0x301[7:0] = 0xFE */
1523 	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE);
1524 
1525 	/* wait TXFF empty
1526 	 * 2. polling till 0x41A[15:0]=0x07FF */
1527 	tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
1528 	while ((tmp16 & 0x07FF) != 0x07FF) {
1529 		udelay(100);
1530 		tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
1531 		count++;
1532 		if ((count % 200) == 0) {
1533 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1534 				 "Tx queue is not empty for 20ms!\n");
1535 		}
1536 		if (count >= 1000) {
1537 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1538 				 "Wait for Tx FIFO empty timeout!\n");
1539 			break;
1540 		}
1541 	}
1542 
1543 	/* TX pause
1544 	 * 3. reg 0x522=0xFF */
1545 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
1546 
1547 	/* Wait TX State Machine OK
1548 	 * 4. polling till reg 0x5FB~0x5F8 = 0x00000000 for 50ms */
1549 	count = 0;
1550 	while (rtl_read_byte(rtlpriv, REG_SCH_TXCMD) != 0) {
1551 		udelay(100);
1552 		count++;
1553 		if (count >= 500) {
1554 			RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1555 				 "Wait for TX State Machine ready timeout !!\n");
1556 			break;
1557 		}
1558 	}
1559 
1560 	/* stop RX DMA path
1561 	 * 5.	0x284[18] = 1
1562 	 * 6.	wait till 0x284[17] == 1
1563 	 * wait RX DMA idle */
1564 	count = 0;
1565 	tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1566 	rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1567 	do {
1568 		tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1569 		udelay(10);
1570 		count++;
1571 	} while (!(tmp & BIT(1)) && count < 100);
1572 
1573 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1574 		 "Wait until Rx DMA Idle. count=%d REG[0x286]=0x%x\n",
1575 		  count, tmp);
1576 
1577 	/* reset BB
1578 	 * 7.	0x02 [0] = 0 */
1579 	tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
1580 	tmp &= ~(BIT(0));
1581 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, tmp);
1582 
1583 	/* Reset TRX MAC
1584 	 * 8.	 0x100 = 0x00
1585 	 * Delay (1ms) */
1586 	rtl_write_byte(rtlpriv, REG_CR, 0x00);
1587 	udelay(1000);
1588 
1589 	/* Disable MAC Security Engine
1590 	 * 9.	0x100 bit[9]=0 */
1591 	tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1592 	tmp &= ~(BIT(1));
1593 	rtl_write_byte(rtlpriv, REG_CR + 1, tmp);
1594 
1595 	/* To avoid DD-Tim Circuit hang
1596 	 * 10.	0x553 bit[5]=1 */
1597 	tmp = rtl_read_byte(rtlpriv, REG_DUAL_TSF_RST);
1598 	rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (tmp | BIT(5)));
1599 
1600 	/* Enable MAC Security Engine
1601 	 * 11.	0x100 bit[9]=1 */
1602 	tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1603 	rtl_write_byte(rtlpriv, REG_CR + 1, (tmp | BIT(1)));
1604 
1605 	/* Enable TRX MAC
1606 	 * 12.	 0x100 = 0xFF
1607 	 *	Delay (1ms) */
1608 	rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1609 	udelay(1000);
1610 
1611 	/* Enable BB
1612 	 * 13.	0x02 [0] = 1 */
1613 	tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
1614 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, (tmp | BIT(0)));
1615 
1616 	/* beacon setting
1617 	 * 14,15. set beacon head page (reg 0x209 and 0x424) */
1618 	rtl_write_byte(rtlpriv, REG_TDECTRL + 1, (u8)boundary);
1619 	rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, (u8)boundary);
1620 	rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, (u8)boundary);
1621 
1622 	/* 16.	WMAC_LBK_BF_HD 0x45D[7:0]
1623 	 * WMAC_LBK_BF_HD */
1624 	rtl_write_byte(rtlpriv, REG_TXPKTBUF_WMAC_LBK_BF_HD,
1625 		       (u8)boundary);
1626 
1627 	rtl_write_word(rtlpriv, REG_TRXFF_BNDY, boundary);
1628 
1629 	/* init LLT
1630 	 * 17. init LLT */
1631 	if (!_rtl8821ae_init_llt_table(hw, boundary)) {
1632 		RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING,
1633 			 "Failed to init LLT table!\n");
1634 		return false;
1635 	}
1636 
1637 	/* reallocate RQPN
1638 	 * 18. reallocate RQPN and init LLT */
1639 	rtl_write_word(rtlpriv, REG_RQPN_NPQ, npq_rqpn_value);
1640 	rtl_write_dword(rtlpriv, REG_RQPN, rqpn_val);
1641 
1642 	/* release Tx pause
1643 	 * 19. 0x522=0x00 */
1644 	rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
1645 
1646 	/* enable PCIE DMA
1647 	 * 20. 0x301[7:0] = 0x00
1648 	 * 21. 0x284[18] = 0 */
1649 	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00);
1650 	tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1651 	rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp&~BIT(2)));
1652 
1653 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "End.\n");
1654 	return ret;
1655 }
1656 
1657 static void _rtl8821ae_simple_initialize_adapter(struct ieee80211_hw *hw)
1658 {
1659 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1660 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1661 	struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
1662 
1663 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
1664 	/* Re-download normal Fw. */
1665 	rtl8821ae_set_fw_related_for_wowlan(hw, false);
1666 #endif
1667 
1668 	/* Re-Initialize LLT table. */
1669 	if (rtlhal->re_init_llt_table) {
1670 		u32 rqpn = 0x80e70808;
1671 		u8 rqpn_npq = 0, boundary = 0xF8;
1672 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1673 			rqpn = 0x80e90808;
1674 			boundary = 0xFA;
1675 		}
1676 		if (_rtl8821ae_dynamic_rqpn(hw, boundary, rqpn_npq, rqpn))
1677 			rtlhal->re_init_llt_table = false;
1678 	}
1679 
1680 	ppsc->rfpwr_state = ERFON;
1681 }
1682 
1683 static void _rtl8821ae_enable_l1off(struct ieee80211_hw *hw)
1684 {
1685 	u8 tmp  = 0;
1686 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1687 
1688 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n");
1689 
1690 	tmp = _rtl8821ae_dbi_read(rtlpriv, 0x160);
1691 	if (!(tmp & (BIT(2) | BIT(3)))) {
1692 		RT_TRACE(rtlpriv, COMP_POWER | COMP_INIT, DBG_LOUD,
1693 			 "0x160(%#x)return!!\n", tmp);
1694 		return;
1695 	}
1696 
1697 	tmp = _rtl8821ae_mdio_read(rtlpriv, 0x1b);
1698 	_rtl8821ae_mdio_write(rtlpriv, 0x1b, (tmp | BIT(4)));
1699 
1700 	tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1701 	_rtl8821ae_dbi_write(rtlpriv, 0x718, tmp | BIT(5));
1702 
1703 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n");
1704 }
1705 
1706 static void _rtl8821ae_enable_ltr(struct ieee80211_hw *hw)
1707 {
1708 	u8 tmp  = 0;
1709 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1710 
1711 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n");
1712 
1713 	/* Check 0x98[10] */
1714 	tmp = _rtl8821ae_dbi_read(rtlpriv, 0x99);
1715 	if (!(tmp & BIT(2))) {
1716 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1717 			 "<---0x99(%#x) return!!\n", tmp);
1718 		return;
1719 	}
1720 
1721 	/* LTR idle latency, 0x90 for 144us */
1722 	rtl_write_dword(rtlpriv, 0x798, 0x88908890);
1723 
1724 	/* LTR active latency, 0x3c for 60us */
1725 	rtl_write_dword(rtlpriv, 0x79c, 0x883c883c);
1726 
1727 	tmp = rtl_read_byte(rtlpriv, 0x7a4);
1728 	rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(4)));
1729 
1730 	tmp = rtl_read_byte(rtlpriv, 0x7a4);
1731 	rtl_write_byte(rtlpriv, 0x7a4, (tmp & (~BIT(0))));
1732 	rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(0)));
1733 
1734 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n");
1735 }
1736 
1737 static bool _rtl8821ae_wowlan_initialize_adapter(struct ieee80211_hw *hw)
1738 {
1739 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1740 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1741 	bool init_finished = true;
1742 	u8 tmp = 0;
1743 
1744 	/* Get Fw wake up reason. */
1745 	_rtl8821ae_get_wakeup_reason(hw);
1746 
1747 	/* Patch Pcie Rx DMA hang after S3/S4 several times.
1748 	 * The root cause has not be found. */
1749 	if (_rtl8821ae_check_pcie_dma_hang(hw))
1750 		_rtl8821ae_reset_pcie_interface_dma(hw, true, false);
1751 
1752 	/* Prepare Tx/Rx Desc Hw address. */
1753 	_rtl8821ae_init_trx_desc_hw_address(hw);
1754 
1755 	/* Release Pcie Interface Rx DMA to allow wake packet DMA. */
1756 	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE);
1757 	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable PCIE Rx DMA.\n");
1758 
1759 	/* Check wake up event.
1760 	 * We should check wake packet bit before disable wowlan by H2C or
1761 	 * Fw will clear the bit. */
1762 	tmp = rtl_read_byte(rtlpriv, REG_FTISR + 3);
1763 	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1764 		 "Read REG_FTISR 0x13f = %#X\n", tmp);
1765 
1766 	/* Set the WoWLAN related function control disable. */
1767 	rtl8821ae_set_fw_wowlan_mode(hw, false);
1768 	rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 0);
1769 
1770 	if (rtlhal->hw_rof_enable) {
1771 		tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3);
1772 		if (tmp & BIT(1)) {
1773 			/* Clear GPIO9 ISR */
1774 			rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1));
1775 			init_finished = false;
1776 		} else {
1777 			init_finished = true;
1778 		}
1779 	}
1780 
1781 	if (init_finished) {
1782 		_rtl8821ae_simple_initialize_adapter(hw);
1783 
1784 		/* Release Pcie Interface Tx DMA. */
1785 		rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00);
1786 		/* Release Pcie RX DMA */
1787 		rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, 0x02);
1788 
1789 		tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1790 		rtl_write_byte(rtlpriv, REG_CR + 1, (tmp & (~BIT(0))));
1791 
1792 		_rtl8821ae_enable_l1off(hw);
1793 		_rtl8821ae_enable_ltr(hw);
1794 	}
1795 
1796 	return init_finished;
1797 }
1798 
1799 static void _rtl8812ae_bb8812_config_1t(struct ieee80211_hw *hw)
1800 {
1801 	/* BB OFDM RX Path_A */
1802 	rtl_set_bbreg(hw, 0x808, 0xff, 0x11);
1803 	/* BB OFDM TX Path_A */
1804 	rtl_set_bbreg(hw, 0x80c, MASKLWORD, 0x1111);
1805 	/* BB CCK R/Rx Path_A */
1806 	rtl_set_bbreg(hw, 0xa04, 0x0c000000, 0x0);
1807 	/* MCS support */
1808 	rtl_set_bbreg(hw, 0x8bc, 0xc0000060, 0x4);
1809 	/* RF Path_B HSSI OFF */
1810 	rtl_set_bbreg(hw, 0xe00, 0xf, 0x4);
1811 	/* RF Path_B Power Down */
1812 	rtl_set_bbreg(hw, 0xe90, MASKDWORD, 0);
1813 	/* ADDA Path_B OFF */
1814 	rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0);
1815 	rtl_set_bbreg(hw, 0xe64, MASKDWORD, 0);
1816 }
1817 
1818 static void _rtl8821ae_poweroff_adapter(struct ieee80211_hw *hw)
1819 {
1820 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1821 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1822 	u8 u1b_tmp;
1823 
1824 	rtlhal->mac_func_enable = false;
1825 
1826 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1827 		/* Combo (PCIe + USB) Card and PCIe-MF Card */
1828 		/* 1. Run LPS WL RFOFF flow */
1829 		/* RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1830 		"=====>CardDisableRTL8812E,RTL8821A_NIC_LPS_ENTER_FLOW\n");
1831 		*/
1832 		rtl_hal_pwrseqcmdparsing(rtlpriv,
1833 			PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1834 			PWR_INTF_PCI_MSK, RTL8821A_NIC_LPS_ENTER_FLOW);
1835 	}
1836 	/* 2. 0x1F[7:0] = 0 */
1837 	/* turn off RF */
1838 	/* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */
1839 	if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1840 		rtlhal->fw_ready) {
1841 		rtl8821ae_firmware_selfreset(hw);
1842 	}
1843 
1844 	/* Reset MCU. Suggested by Filen. */
1845 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1846 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
1847 
1848 	/* g.	MCUFWDL 0x80[1:0]=0	 */
1849 	/* reset MCU ready status */
1850 	rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1851 
1852 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1853 		/* HW card disable configuration. */
1854 		rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1855 			PWR_INTF_PCI_MSK, RTL8821A_NIC_DISABLE_FLOW);
1856 	} else {
1857 		/* HW card disable configuration. */
1858 		rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1859 			PWR_INTF_PCI_MSK, RTL8812_NIC_DISABLE_FLOW);
1860 	}
1861 
1862 	/* Reset MCU IO Wrapper */
1863 	u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1864 	rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1865 	u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1866 	rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1867 
1868 	/* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1869 	/* lock ISO/CLK/Power control register */
1870 	rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1871 }
1872 
1873 int rtl8821ae_hw_init(struct ieee80211_hw *hw)
1874 {
1875 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1876 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1877 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1878 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1879 	bool rtstatus = true;
1880 	int err;
1881 	u8 tmp_u1b;
1882 	bool support_remote_wakeup;
1883 	u32 nav_upper = WIFI_NAV_UPPER_US;
1884 
1885 	rtlhal->being_init_adapter = true;
1886 	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1887 				      (u8 *)(&support_remote_wakeup));
1888 	rtlpriv->intf_ops->disable_aspm(hw);
1889 
1890 	/*YP wowlan not considered*/
1891 
1892 	tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
1893 	if (tmp_u1b != 0 && tmp_u1b != 0xEA) {
1894 		rtlhal->mac_func_enable = true;
1895 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1896 			 "MAC has already power on.\n");
1897 	} else {
1898 		rtlhal->mac_func_enable = false;
1899 		rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1900 	}
1901 
1902 	if (support_remote_wakeup &&
1903 		rtlhal->wake_from_pnp_sleep &&
1904 		rtlhal->mac_func_enable) {
1905 		if (_rtl8821ae_wowlan_initialize_adapter(hw)) {
1906 			rtlhal->being_init_adapter = false;
1907 			return 0;
1908 		}
1909 	}
1910 
1911 	if (_rtl8821ae_check_pcie_dma_hang(hw)) {
1912 		_rtl8821ae_reset_pcie_interface_dma(hw,
1913 						    rtlhal->mac_func_enable,
1914 						    false);
1915 		rtlhal->mac_func_enable = false;
1916 	}
1917 
1918 	/* Reset MAC/BB/RF status if it is not powered off
1919 	 * before calling initialize Hw flow to prevent
1920 	 * from interface and MAC status mismatch.
1921 	 * 2013.06.21, by tynli. Suggested by SD1 JackieLau. */
1922 	if (rtlhal->mac_func_enable) {
1923 		_rtl8821ae_poweroff_adapter(hw);
1924 		rtlhal->mac_func_enable = false;
1925 	}
1926 
1927 	rtstatus = _rtl8821ae_init_mac(hw);
1928 	if (rtstatus != true) {
1929 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1930 		err = 1;
1931 		return err;
1932 	}
1933 
1934 	tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
1935 	tmp_u1b &= 0x7F;
1936 	rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b);
1937 
1938 	err = rtl8821ae_download_fw(hw, false);
1939 	if (err) {
1940 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1941 			 "Failed to download FW. Init HW without FW now\n");
1942 		err = 1;
1943 		rtlhal->fw_ready = false;
1944 		return err;
1945 	} else {
1946 		rtlhal->fw_ready = true;
1947 	}
1948 	ppsc->fw_current_inpsmode = false;
1949 	rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1950 	rtlhal->fw_clk_change_in_progress = false;
1951 	rtlhal->allow_sw_to_change_hwclc = false;
1952 	rtlhal->last_hmeboxnum = 0;
1953 
1954 	/*SIC_Init(Adapter);
1955 	if(rtlhal->AMPDUBurstMode)
1956 		rtl_write_byte(rtlpriv,REG_AMPDU_BURST_MODE_8812,  0x7F);*/
1957 
1958 	rtl8821ae_phy_mac_config(hw);
1959 	/* because last function modify RCR, so we update
1960 	 * rcr var here, or TP will unstable for receive_config
1961 	 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
1962 	 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1963 	rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
1964 	rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1965 	rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);*/
1966 	rtl8821ae_phy_bb_config(hw);
1967 
1968 	rtl8821ae_phy_rf_config(hw);
1969 
1970 	if (rtlpriv->phy.rf_type == RF_1T1R &&
1971 		rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1972 		_rtl8812ae_bb8812_config_1t(hw);
1973 
1974 	_rtl8821ae_hw_configure(hw);
1975 
1976 	rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
1977 
1978 	/*set wireless mode*/
1979 
1980 	rtlhal->mac_func_enable = true;
1981 
1982 	rtl_cam_reset_all_entry(hw);
1983 
1984 	rtl8821ae_enable_hw_security_config(hw);
1985 
1986 	ppsc->rfpwr_state = ERFON;
1987 
1988 	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1989 	_rtl8821ae_enable_aspm_back_door(hw);
1990 	rtlpriv->intf_ops->enable_aspm(hw);
1991 
1992 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
1993 	    (rtlhal->rfe_type == 1 || rtlhal->rfe_type == 5))
1994 		rtl_set_bbreg(hw, 0x900, 0x00000303, 0x0302);
1995 
1996 	rtl8821ae_bt_hw_init(hw);
1997 	rtlpriv->rtlhal.being_init_adapter = false;
1998 
1999 	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_NAV_UPPER, (u8 *)&nav_upper);
2000 
2001 	/* rtl8821ae_dm_check_txpower_tracking(hw); */
2002 	/* rtl8821ae_phy_lc_calibrate(hw); */
2003 	if (support_remote_wakeup)
2004 		rtl_write_byte(rtlpriv, REG_WOW_CTRL, 0);
2005 
2006 	/* Release Rx DMA*/
2007 	tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2008 	if (tmp_u1b & BIT(2)) {
2009 		/* Release Rx DMA if needed*/
2010 		tmp_u1b &= ~BIT(2);
2011 		rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
2012 	}
2013 
2014 	/* Release Tx/Rx PCIE DMA if*/
2015 	rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
2016 
2017 	rtl8821ae_dm_init(hw);
2018 	rtl8821ae_macid_initialize_mediastatus(hw);
2019 
2020 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rtl8821ae_hw_init() <====\n");
2021 	return err;
2022 }
2023 
2024 static enum version_8821ae _rtl8821ae_read_chip_version(struct ieee80211_hw *hw)
2025 {
2026 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2027 	struct rtl_phy *rtlphy = &rtlpriv->phy;
2028 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2029 	enum version_8821ae version = VERSION_UNKNOWN;
2030 	u32 value32;
2031 
2032 	value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
2033 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2034 		 "ReadChipVersion8812A 0xF0 = 0x%x\n", value32);
2035 
2036 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
2037 		rtlphy->rf_type = RF_2T2R;
2038 	else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE)
2039 		rtlphy->rf_type = RF_1T1R;
2040 
2041 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2042 		 "RF_Type is %x!!\n", rtlphy->rf_type);
2043 
2044 	if (value32 & TRP_VAUX_EN) {
2045 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2046 			if (rtlphy->rf_type == RF_2T2R)
2047 				version = VERSION_TEST_CHIP_2T2R_8812;
2048 			else
2049 				version = VERSION_TEST_CHIP_1T1R_8812;
2050 		} else
2051 			version = VERSION_TEST_CHIP_8821;
2052 	} else {
2053 		if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2054 			u32 rtl_id = ((value32 & CHIP_VER_RTL_MASK) >> 12) + 1;
2055 
2056 			if (rtlphy->rf_type == RF_2T2R)
2057 				version =
2058 					(enum version_8821ae)(CHIP_8812
2059 					| NORMAL_CHIP |
2060 					RF_TYPE_2T2R);
2061 			else
2062 				version = (enum version_8821ae)(CHIP_8812
2063 					| NORMAL_CHIP);
2064 
2065 			version = (enum version_8821ae)(version | (rtl_id << 12));
2066 		} else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2067 			u32 rtl_id = value32 & CHIP_VER_RTL_MASK;
2068 
2069 			version = (enum version_8821ae)(CHIP_8821
2070 				| NORMAL_CHIP | rtl_id);
2071 		}
2072 	}
2073 
2074 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2075 		/*WL_HWROF_EN.*/
2076 		value32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
2077 		rtlhal->hw_rof_enable = ((value32 & WL_HWROF_EN) ? 1 : 0);
2078 	}
2079 
2080 	switch (version) {
2081 	case VERSION_TEST_CHIP_1T1R_8812:
2082 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2083 			 "Chip Version ID: VERSION_TEST_CHIP_1T1R_8812\n");
2084 		break;
2085 	case VERSION_TEST_CHIP_2T2R_8812:
2086 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2087 			 "Chip Version ID: VERSION_TEST_CHIP_2T2R_8812\n");
2088 		break;
2089 	case VERSION_NORMAL_TSMC_CHIP_1T1R_8812:
2090 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2091 			 "Chip Version ID:VERSION_NORMAL_TSMC_CHIP_1T1R_8812\n");
2092 		break;
2093 	case VERSION_NORMAL_TSMC_CHIP_2T2R_8812:
2094 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2095 			 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812\n");
2096 		break;
2097 	case VERSION_NORMAL_TSMC_CHIP_1T1R_8812_C_CUT:
2098 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2099 			 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_1T1R_8812 C CUT\n");
2100 		break;
2101 	case VERSION_NORMAL_TSMC_CHIP_2T2R_8812_C_CUT:
2102 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2103 			 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812 C CUT\n");
2104 		break;
2105 	case VERSION_TEST_CHIP_8821:
2106 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2107 			 "Chip Version ID: VERSION_TEST_CHIP_8821\n");
2108 		break;
2109 	case VERSION_NORMAL_TSMC_CHIP_8821:
2110 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2111 			 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 A CUT\n");
2112 		break;
2113 	case VERSION_NORMAL_TSMC_CHIP_8821_B_CUT:
2114 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2115 			 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 B CUT\n");
2116 		break;
2117 	default:
2118 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2119 			 "Chip Version ID: Unknow (0x%X)\n", version);
2120 		break;
2121 	}
2122 
2123 	return version;
2124 }
2125 
2126 static int _rtl8821ae_set_media_status(struct ieee80211_hw *hw,
2127 				     enum nl80211_iftype type)
2128 {
2129 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2130 	u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
2131 	enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
2132 	bt_msr &= 0xfc;
2133 
2134 	rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0);
2135 	RT_TRACE(rtlpriv, COMP_BEACON, DBG_LOUD,
2136 		"clear 0x550 when set HW_VAR_MEDIA_STATUS\n");
2137 
2138 	if (type == NL80211_IFTYPE_UNSPECIFIED ||
2139 	    type == NL80211_IFTYPE_STATION) {
2140 		_rtl8821ae_stop_tx_beacon(hw);
2141 		_rtl8821ae_enable_bcn_sub_func(hw);
2142 	} else if (type == NL80211_IFTYPE_ADHOC ||
2143 		type == NL80211_IFTYPE_AP) {
2144 		_rtl8821ae_resume_tx_beacon(hw);
2145 		_rtl8821ae_disable_bcn_sub_func(hw);
2146 	} else {
2147 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2148 			 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
2149 			 type);
2150 	}
2151 
2152 	switch (type) {
2153 	case NL80211_IFTYPE_UNSPECIFIED:
2154 		bt_msr |= MSR_NOLINK;
2155 		ledaction = LED_CTL_LINK;
2156 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2157 			 "Set Network type to NO LINK!\n");
2158 		break;
2159 	case NL80211_IFTYPE_ADHOC:
2160 		bt_msr |= MSR_ADHOC;
2161 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2162 			 "Set Network type to Ad Hoc!\n");
2163 		break;
2164 	case NL80211_IFTYPE_STATION:
2165 		bt_msr |= MSR_INFRA;
2166 		ledaction = LED_CTL_LINK;
2167 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2168 			 "Set Network type to STA!\n");
2169 		break;
2170 	case NL80211_IFTYPE_AP:
2171 		bt_msr |= MSR_AP;
2172 		RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2173 			 "Set Network type to AP!\n");
2174 		break;
2175 	default:
2176 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2177 			 "Network type %d not support!\n", type);
2178 		return 1;
2179 	}
2180 
2181 	rtl_write_byte(rtlpriv, MSR, bt_msr);
2182 	rtlpriv->cfg->ops->led_control(hw, ledaction);
2183 	if ((bt_msr & MSR_MASK) == MSR_AP)
2184 		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
2185 	else
2186 		rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
2187 
2188 	return 0;
2189 }
2190 
2191 void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
2192 {
2193 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2194 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2195 	u32 reg_rcr = rtlpci->receive_config;
2196 
2197 	if (rtlpriv->psc.rfpwr_state != ERFON)
2198 		return;
2199 
2200 	if (check_bssid) {
2201 		reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
2202 		rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
2203 					      (u8 *)(&reg_rcr));
2204 		_rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
2205 	} else if (!check_bssid) {
2206 		reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
2207 		_rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
2208 		rtlpriv->cfg->ops->set_hw_reg(hw,
2209 			HW_VAR_RCR, (u8 *)(&reg_rcr));
2210 	}
2211 }
2212 
2213 int rtl8821ae_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
2214 {
2215 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2216 
2217 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rtl8821ae_set_network_type!\n");
2218 
2219 	if (_rtl8821ae_set_media_status(hw, type))
2220 		return -EOPNOTSUPP;
2221 
2222 	if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
2223 		if (type != NL80211_IFTYPE_AP)
2224 			rtl8821ae_set_check_bssid(hw, true);
2225 	} else {
2226 		rtl8821ae_set_check_bssid(hw, false);
2227 	}
2228 
2229 	return 0;
2230 }
2231 
2232 /* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */
2233 void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci)
2234 {
2235 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2236 	rtl8821ae_dm_init_edca_turbo(hw);
2237 	switch (aci) {
2238 	case AC1_BK:
2239 		rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
2240 		break;
2241 	case AC0_BE:
2242 		/* rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, u4b_ac_param); */
2243 		break;
2244 	case AC2_VI:
2245 		rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
2246 		break;
2247 	case AC3_VO:
2248 		rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
2249 		break;
2250 	default:
2251 		RT_ASSERT(false, "invalid aci: %d !\n", aci);
2252 		break;
2253 	}
2254 }
2255 
2256 static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw)
2257 {
2258 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2259 	u32 tmp = rtl_read_dword(rtlpriv, REG_HISR);
2260 
2261 	rtl_write_dword(rtlpriv, REG_HISR, tmp);
2262 
2263 	tmp = rtl_read_dword(rtlpriv, REG_HISRE);
2264 	rtl_write_dword(rtlpriv, REG_HISRE, tmp);
2265 
2266 	tmp = rtl_read_dword(rtlpriv, REG_HSISR);
2267 	rtl_write_dword(rtlpriv, REG_HSISR, tmp);
2268 }
2269 
2270 void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
2271 {
2272 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2273 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2274 
2275 	if (!rtlpci->int_clear)
2276 		rtl8821ae_clear_interrupt(hw);/*clear it here first*/
2277 
2278 	rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
2279 	rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
2280 	rtlpci->irq_enabled = true;
2281 	/* there are some C2H CMDs have been sent before
2282 	system interrupt is enabled, e.g., C2H, CPWM.
2283 	*So we need to clear all C2H events that FW has
2284 	notified, otherwise FW won't schedule any commands anymore.
2285 	*/
2286 	/* rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0); */
2287 	/*enable system interrupt*/
2288 	rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
2289 }
2290 
2291 void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw)
2292 {
2293 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2294 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2295 
2296 	rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
2297 	rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
2298 	rtlpci->irq_enabled = false;
2299 	/*synchronize_irq(rtlpci->pdev->irq);*/
2300 }
2301 
2302 static void _rtl8821ae_clear_pci_pme_status(struct ieee80211_hw *hw)
2303 {
2304 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2305 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2306 	u16 cap_hdr;
2307 	u8 cap_pointer;
2308 	u8 cap_id = 0xff;
2309 	u8 pmcs_reg;
2310 	u8 cnt = 0;
2311 
2312 	/* Get the Capability pointer first,
2313 	 * the Capability Pointer is located at
2314 	 * offset 0x34 from the Function Header */
2315 
2316 	pci_read_config_byte(rtlpci->pdev, 0x34, &cap_pointer);
2317 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2318 		 "PCI configration 0x34 = 0x%2x\n", cap_pointer);
2319 
2320 	do {
2321 		pci_read_config_word(rtlpci->pdev, cap_pointer, &cap_hdr);
2322 		cap_id = cap_hdr & 0xFF;
2323 
2324 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2325 			 "in pci configration, cap_pointer%x = %x\n",
2326 			  cap_pointer, cap_id);
2327 
2328 		if (cap_id == 0x01) {
2329 			break;
2330 		} else {
2331 			/* point to next Capability */
2332 			cap_pointer = (cap_hdr >> 8) & 0xFF;
2333 			/* 0: end of pci capability, 0xff: invalid value */
2334 			if (cap_pointer == 0x00 || cap_pointer == 0xff) {
2335 				cap_id = 0xff;
2336 				break;
2337 			}
2338 		}
2339 	} while (cnt++ < 200);
2340 
2341 	if (cap_id == 0x01) {
2342 		/* Get the PM CSR (Control/Status Register),
2343 		 * The PME_Status is located at PM Capatibility offset 5, bit 7
2344 		 */
2345 		pci_read_config_byte(rtlpci->pdev, cap_pointer + 5, &pmcs_reg);
2346 
2347 		if (pmcs_reg & BIT(7)) {
2348 			/* PME event occured, clear the PM_Status by write 1 */
2349 			pmcs_reg = pmcs_reg | BIT(7);
2350 
2351 			pci_write_config_byte(rtlpci->pdev, cap_pointer + 5,
2352 					      pmcs_reg);
2353 			/* Read it back to check */
2354 			pci_read_config_byte(rtlpci->pdev, cap_pointer + 5,
2355 					     &pmcs_reg);
2356 			RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2357 				 "Clear PME status 0x%2x to 0x%2x\n",
2358 				  cap_pointer + 5, pmcs_reg);
2359 		} else {
2360 			RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2361 				 "PME status(0x%2x) = 0x%2x\n",
2362 				  cap_pointer + 5, pmcs_reg);
2363 		}
2364 	} else {
2365 		RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING,
2366 			 "Cannot find PME Capability\n");
2367 	}
2368 }
2369 
2370 void rtl8821ae_card_disable(struct ieee80211_hw *hw)
2371 {
2372 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2373 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2374 	struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
2375 	struct rtl_mac *mac = rtl_mac(rtlpriv);
2376 	enum nl80211_iftype opmode;
2377 	bool support_remote_wakeup;
2378 	u8 tmp;
2379 	u32 count = 0;
2380 
2381 	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
2382 				      (u8 *)(&support_remote_wakeup));
2383 
2384 	RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2385 
2386 	if (!(support_remote_wakeup && mac->opmode == NL80211_IFTYPE_STATION)
2387 	    || !rtlhal->enter_pnp_sleep) {
2388 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Normal Power off\n");
2389 		mac->link_state = MAC80211_NOLINK;
2390 		opmode = NL80211_IFTYPE_UNSPECIFIED;
2391 		_rtl8821ae_set_media_status(hw, opmode);
2392 		_rtl8821ae_poweroff_adapter(hw);
2393 	} else {
2394 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Wowlan Supported.\n");
2395 		/* 3 <1> Prepare for configuring wowlan related infomations */
2396 		/* Clear Fw WoWLAN event. */
2397 		rtl_write_byte(rtlpriv, REG_MCUTST_WOWLAN, 0x0);
2398 
2399 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
2400 		rtl8821ae_set_fw_related_for_wowlan(hw, true);
2401 #endif
2402 		/* Dynamically adjust Tx packet boundary
2403 		 * for download reserved page packet.
2404 		 * reserve 30 pages for rsvd page */
2405 		if (_rtl8821ae_dynamic_rqpn(hw, 0xE0, 0x3, 0x80c20d0d))
2406 			rtlhal->re_init_llt_table = true;
2407 
2408 		/* 3 <2> Set Fw releted H2C cmd. */
2409 
2410 		/* Set WoWLAN related security information. */
2411 		rtl8821ae_set_fw_global_info_cmd(hw);
2412 
2413 		_rtl8821ae_download_rsvd_page(hw, true);
2414 
2415 		/* Just enable AOAC related functions when we connect to AP. */
2416 		printk("mac->link_state = %d\n", mac->link_state);
2417 		if (mac->link_state >= MAC80211_LINKED &&
2418 		    mac->opmode == NL80211_IFTYPE_STATION) {
2419 			rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
2420 			rtl8821ae_set_fw_media_status_rpt_cmd(hw,
2421 							      RT_MEDIA_CONNECT);
2422 
2423 			rtl8821ae_set_fw_wowlan_mode(hw, true);
2424 			/* Enable Fw Keep alive mechanism. */
2425 			rtl8821ae_set_fw_keep_alive_cmd(hw, true);
2426 
2427 			/* Enable disconnect decision control. */
2428 			rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(hw, true);
2429 		}
2430 
2431 		/* 3 <3> Hw Configutations */
2432 
2433 		/* Wait untill Rx DMA Finished before host sleep.
2434 		 * FW Pause Rx DMA may happens when received packet doing dma.
2435 		 */
2436 		rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, BIT(2));
2437 
2438 		tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2439 		count = 0;
2440 		while (!(tmp & BIT(1)) && (count++ < 100)) {
2441 			udelay(10);
2442 			tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2443 		}
2444 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2445 			 "Wait Rx DMA Finished before host sleep. count=%d\n",
2446 			  count);
2447 
2448 		/* reset trx ring */
2449 		rtlpriv->intf_ops->reset_trx_ring(hw);
2450 
2451 		rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, 0x0);
2452 
2453 		_rtl8821ae_clear_pci_pme_status(hw);
2454 		tmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
2455 		rtl_write_byte(rtlpriv, REG_SYS_CLKR, tmp | BIT(3));
2456 		/* prevent 8051 to be reset by PERST */
2457 		rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x20);
2458 		rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x60);
2459 	}
2460 
2461 	if (rtlpriv->rtlhal.driver_is_goingto_unload ||
2462 	    ppsc->rfoff_reason > RF_CHANGE_BY_PS)
2463 		rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
2464 	/* For wowlan+LPS+32k. */
2465 	if (support_remote_wakeup && rtlhal->enter_pnp_sleep) {
2466 		/* Set the WoWLAN related function control enable.
2467 		 * It should be the last H2C cmd in the WoWLAN flow. */
2468 		rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 1);
2469 
2470 		/* Stop Pcie Interface Tx DMA. */
2471 		rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xff);
2472 		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Stop PCIE Tx DMA.\n");
2473 
2474 		/* Wait for TxDMA idle. */
2475 		count = 0;
2476 		do {
2477 			tmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG);
2478 			udelay(10);
2479 			count++;
2480 		} while ((tmp != 0) && (count < 100));
2481 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2482 			 "Wait Tx DMA Finished before host sleep. count=%d\n",
2483 			  count);
2484 
2485 		if (rtlhal->hw_rof_enable) {
2486 			printk("hw_rof_enable\n");
2487 			tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3);
2488 			rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1));
2489 		}
2490 	}
2491 	/* after power off we should do iqk again */
2492 	rtlpriv->phy.iqk_initialized = false;
2493 }
2494 
2495 void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw,
2496 				  u32 *p_inta, u32 *p_intb)
2497 {
2498 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2499 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2500 
2501 	*p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
2502 	rtl_write_dword(rtlpriv, ISR, *p_inta);
2503 
2504 	*p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
2505 	rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
2506 }
2507 
2508 void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw)
2509 {
2510 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2511 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2512 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2513 	u16 bcn_interval, atim_window;
2514 
2515 	bcn_interval = mac->beacon_interval;
2516 	atim_window = 2;	/*FIX MERGE */
2517 	rtl8821ae_disable_interrupt(hw);
2518 	rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
2519 	rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
2520 	rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
2521 	rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
2522 	rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
2523 	rtl_write_byte(rtlpriv, 0x606, 0x30);
2524 	rtlpci->reg_bcn_ctrl_val |= BIT(3);
2525 	rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
2526 	rtl8821ae_enable_interrupt(hw);
2527 }
2528 
2529 void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw)
2530 {
2531 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2532 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2533 	u16 bcn_interval = mac->beacon_interval;
2534 
2535 	RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
2536 		 "beacon_interval:%d\n", bcn_interval);
2537 	rtl8821ae_disable_interrupt(hw);
2538 	rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
2539 	rtl8821ae_enable_interrupt(hw);
2540 }
2541 
2542 void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw,
2543 				   u32 add_msr, u32 rm_msr)
2544 {
2545 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2546 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2547 
2548 	RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
2549 		 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
2550 
2551 	if (add_msr)
2552 		rtlpci->irq_mask[0] |= add_msr;
2553 	if (rm_msr)
2554 		rtlpci->irq_mask[0] &= (~rm_msr);
2555 	rtl8821ae_disable_interrupt(hw);
2556 	rtl8821ae_enable_interrupt(hw);
2557 }
2558 
2559 static u8 _rtl8821ae_get_chnl_group(u8 chnl)
2560 {
2561 	u8 group = 0;
2562 
2563 	if (chnl <= 14) {
2564 		if (1 <= chnl && chnl <= 2)
2565 			group = 0;
2566 	else if (3 <= chnl && chnl <= 5)
2567 			group = 1;
2568 	else if (6 <= chnl && chnl <= 8)
2569 			group = 2;
2570 	else if (9 <= chnl && chnl <= 11)
2571 			group = 3;
2572 	else /*if (12 <= chnl && chnl <= 14)*/
2573 			group = 4;
2574 	} else {
2575 		if (36 <= chnl && chnl <= 42)
2576 			group = 0;
2577 	else if (44 <= chnl && chnl <= 48)
2578 			group = 1;
2579 	else if (50 <= chnl && chnl <= 58)
2580 			group = 2;
2581 	else if (60 <= chnl && chnl <= 64)
2582 			group = 3;
2583 	else if (100 <= chnl && chnl <= 106)
2584 			group = 4;
2585 	else if (108 <= chnl && chnl <= 114)
2586 			group = 5;
2587 	else if (116 <= chnl && chnl <= 122)
2588 			group = 6;
2589 	else if (124 <= chnl && chnl <= 130)
2590 			group = 7;
2591 	else if (132 <= chnl && chnl <= 138)
2592 			group = 8;
2593 	else if (140 <= chnl && chnl <= 144)
2594 			group = 9;
2595 	else if (149 <= chnl && chnl <= 155)
2596 			group = 10;
2597 	else if (157 <= chnl && chnl <= 161)
2598 			group = 11;
2599 	else if (165 <= chnl && chnl <= 171)
2600 			group = 12;
2601 	else if (173 <= chnl && chnl <= 177)
2602 			group = 13;
2603 		else
2604 			/*RT_TRACE(rtlpriv, COMP_EFUSE,DBG_LOUD,
2605 				"5G, Channel %d in Group not found\n",chnl);*/
2606 			RT_ASSERT(!COMP_EFUSE,
2607 				"5G, Channel %d in Group not found\n", chnl);
2608 	}
2609 	return group;
2610 }
2611 
2612 static void _rtl8821ae_read_power_value_fromprom(struct ieee80211_hw *hw,
2613 	struct txpower_info_2g *pwrinfo24g,
2614 	struct txpower_info_5g *pwrinfo5g,
2615 	bool autoload_fail,
2616 	u8 *hwinfo)
2617 {
2618 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2619 	u32 rfPath, eeAddr = EEPROM_TX_PWR_INX, group, TxCount = 0;
2620 
2621 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2622 		 "hal_ReadPowerValueFromPROM8821ae(): hwinfo[0x%x]=0x%x\n",
2623 		 (eeAddr+1), hwinfo[eeAddr+1]);
2624 	if (0xFF == hwinfo[eeAddr+1])  /*YJ,add,120316*/
2625 		autoload_fail = true;
2626 
2627 	if (autoload_fail) {
2628 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2629 			 "auto load fail : Use Default value!\n");
2630 		for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) {
2631 			/*2.4G default value*/
2632 			for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
2633 				pwrinfo24g->index_cck_base[rfPath][group] =	0x2D;
2634 				pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D;
2635 			}
2636 			for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2637 				if (TxCount == 0) {
2638 					pwrinfo24g->bw20_diff[rfPath][0] = 0x02;
2639 					pwrinfo24g->ofdm_diff[rfPath][0] = 0x04;
2640 				} else {
2641 					pwrinfo24g->bw20_diff[rfPath][TxCount] = 0xFE;
2642 					pwrinfo24g->bw40_diff[rfPath][TxCount] = 0xFE;
2643 					pwrinfo24g->cck_diff[rfPath][TxCount] =	0xFE;
2644 					pwrinfo24g->ofdm_diff[rfPath][TxCount] = 0xFE;
2645 				}
2646 			}
2647 			/*5G default value*/
2648 			for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++)
2649 				pwrinfo5g->index_bw40_base[rfPath][group] = 0x2A;
2650 
2651 			for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2652 				if (TxCount == 0) {
2653 					pwrinfo5g->ofdm_diff[rfPath][0] = 0x04;
2654 					pwrinfo5g->bw20_diff[rfPath][0] = 0x00;
2655 					pwrinfo5g->bw80_diff[rfPath][0] = 0xFE;
2656 					pwrinfo5g->bw160_diff[rfPath][0] = 0xFE;
2657 				} else {
2658 					pwrinfo5g->ofdm_diff[rfPath][0] = 0xFE;
2659 					pwrinfo5g->bw20_diff[rfPath][0] = 0xFE;
2660 					pwrinfo5g->bw40_diff[rfPath][0] = 0xFE;
2661 					pwrinfo5g->bw80_diff[rfPath][0] = 0xFE;
2662 					pwrinfo5g->bw160_diff[rfPath][0] = 0xFE;
2663 				}
2664 			}
2665 		}
2666 		return;
2667 	}
2668 
2669 	rtl_priv(hw)->efuse.txpwr_fromeprom = true;
2670 
2671 	for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) {
2672 		/*2.4G default value*/
2673 		for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
2674 			pwrinfo24g->index_cck_base[rfPath][group] = hwinfo[eeAddr++];
2675 			if (pwrinfo24g->index_cck_base[rfPath][group] == 0xFF)
2676 				pwrinfo24g->index_cck_base[rfPath][group] = 0x2D;
2677 		}
2678 		for (group = 0 ; group < MAX_CHNL_GROUP_24G - 1; group++) {
2679 			pwrinfo24g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++];
2680 			if (pwrinfo24g->index_bw40_base[rfPath][group] == 0xFF)
2681 				pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D;
2682 		}
2683 		for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2684 			if (TxCount == 0) {
2685 				pwrinfo24g->bw40_diff[rfPath][TxCount] = 0;
2686 				/*bit sign number to 8 bit sign number*/
2687 				pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2688 				if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3))
2689 					pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0;
2690 				/*bit sign number to 8 bit sign number*/
2691 				pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2692 				if (pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3))
2693 					pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2694 
2695 				pwrinfo24g->cck_diff[rfPath][TxCount] = 0;
2696 				eeAddr++;
2697 			} else {
2698 				pwrinfo24g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr]&0xf0) >> 4;
2699 				if (pwrinfo24g->bw40_diff[rfPath][TxCount] & BIT(3))
2700 					pwrinfo24g->bw40_diff[rfPath][TxCount] |= 0xF0;
2701 
2702 				pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2703 				if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3))
2704 					pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0;
2705 
2706 				eeAddr++;
2707 
2708 				pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2709 				if (pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3))
2710 					pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2711 
2712 				pwrinfo24g->cck_diff[rfPath][TxCount] =	(hwinfo[eeAddr] & 0x0f);
2713 				if (pwrinfo24g->cck_diff[rfPath][TxCount] & BIT(3))
2714 					pwrinfo24g->cck_diff[rfPath][TxCount] |= 0xF0;
2715 
2716 				eeAddr++;
2717 			}
2718 		}
2719 
2720 		/*5G default value*/
2721 		for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
2722 			pwrinfo5g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++];
2723 			if (pwrinfo5g->index_bw40_base[rfPath][group] == 0xFF)
2724 				pwrinfo5g->index_bw40_base[rfPath][group] = 0xFE;
2725 		}
2726 
2727 		for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2728 			if (TxCount == 0) {
2729 				pwrinfo5g->bw40_diff[rfPath][TxCount] = 0;
2730 
2731 				pwrinfo5g->bw20_diff[rfPath][0] = (hwinfo[eeAddr] & 0xf0) >> 4;
2732 				if (pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3))
2733 					pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0;
2734 
2735 				pwrinfo5g->ofdm_diff[rfPath][0] = (hwinfo[eeAddr] & 0x0f);
2736 				if (pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3))
2737 					pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2738 
2739 				eeAddr++;
2740 			} else {
2741 				pwrinfo5g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2742 				if (pwrinfo5g->bw40_diff[rfPath][TxCount] & BIT(3))
2743 					pwrinfo5g->bw40_diff[rfPath][TxCount] |= 0xF0;
2744 
2745 				pwrinfo5g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2746 				if (pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3))
2747 					pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0;
2748 
2749 				eeAddr++;
2750 			}
2751 		}
2752 
2753 		pwrinfo5g->ofdm_diff[rfPath][1] =	(hwinfo[eeAddr] & 0xf0) >> 4;
2754 		pwrinfo5g->ofdm_diff[rfPath][2] =	(hwinfo[eeAddr] & 0x0f);
2755 
2756 		eeAddr++;
2757 
2758 		pwrinfo5g->ofdm_diff[rfPath][3] = (hwinfo[eeAddr] & 0x0f);
2759 
2760 		eeAddr++;
2761 
2762 		for (TxCount = 1; TxCount < MAX_TX_COUNT; TxCount++) {
2763 			if (pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3))
2764 				pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2765 		}
2766 		for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2767 			pwrinfo5g->bw80_diff[rfPath][TxCount] =	(hwinfo[eeAddr] & 0xf0) >> 4;
2768 			/* 4bit sign number to 8 bit sign number */
2769 			if (pwrinfo5g->bw80_diff[rfPath][TxCount] & BIT(3))
2770 				pwrinfo5g->bw80_diff[rfPath][TxCount] |= 0xF0;
2771 			/* 4bit sign number to 8 bit sign number */
2772 			pwrinfo5g->bw160_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2773 			if (pwrinfo5g->bw160_diff[rfPath][TxCount] & BIT(3))
2774 				pwrinfo5g->bw160_diff[rfPath][TxCount] |= 0xF0;
2775 
2776 			eeAddr++;
2777 		}
2778 	}
2779 }
2780 #if 0
2781 static void _rtl8812ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2782 						 bool autoload_fail,
2783 						 u8 *hwinfo)
2784 {
2785 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2786 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2787 	struct txpower_info_2g pwrinfo24g;
2788 	struct txpower_info_5g pwrinfo5g;
2789 	u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
2790 		36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
2791 		56, 58, 60, 62, 64, 100, 102, 104, 106,
2792 		108, 110, 112, 114, 116, 118, 120, 122,
2793 		124, 126, 128, 130, 132, 134, 136, 138,
2794 		140, 142, 144, 149, 151, 153, 155, 157,
2795 		159, 161, 163, 165, 167, 168, 169, 171, 173, 175, 177};
2796 	u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {42, 58, 106, 122, 138, 155, 171};
2797 	u8 rf_path, index;
2798 	u8 i;
2799 
2800 	_rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g,
2801 					&pwrinfo5g, autoload_fail, hwinfo);
2802 
2803 	for (rf_path = 0; rf_path < 2; rf_path++) {
2804 		for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2805 			index = _rtl8821ae_get_chnl_group(i + 1);
2806 
2807 			if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2808 				rtlefuse->txpwrlevel_cck[rf_path][i] =
2809 					pwrinfo24g.index_cck_base[rf_path][5];
2810 				rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2811 					pwrinfo24g.index_bw40_base[rf_path][index];
2812 			} else {
2813 				rtlefuse->txpwrlevel_cck[rf_path][i] =
2814 					pwrinfo24g.index_cck_base[rf_path][index];
2815 				rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2816 					pwrinfo24g.index_bw40_base[rf_path][index];
2817 			}
2818 		}
2819 
2820 		for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2821 			index = _rtl8821ae_get_chnl_group(channel5g[i]);
2822 			rtlefuse->txpwr_5g_bw40base[rf_path][i] =
2823 					pwrinfo5g.index_bw40_base[rf_path][index];
2824 		}
2825 		for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2826 			u8 upper, lower;
2827 			index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2828 			upper = pwrinfo5g.index_bw40_base[rf_path][index];
2829 			lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2830 
2831 			rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2832 		}
2833 		for (i = 0; i < MAX_TX_COUNT; i++) {
2834 			rtlefuse->txpwr_cckdiff[rf_path][i] =
2835 				pwrinfo24g.cck_diff[rf_path][i];
2836 			rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
2837 				pwrinfo24g.ofdm_diff[rf_path][i];
2838 			rtlefuse->txpwr_ht20diff[rf_path][i] =
2839 				pwrinfo24g.bw20_diff[rf_path][i];
2840 			rtlefuse->txpwr_ht40diff[rf_path][i] =
2841 				pwrinfo24g.bw40_diff[rf_path][i];
2842 
2843 			rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] =
2844 				pwrinfo5g.ofdm_diff[rf_path][i];
2845 			rtlefuse->txpwr_5g_bw20diff[rf_path][i] =
2846 				pwrinfo5g.bw20_diff[rf_path][i];
2847 			rtlefuse->txpwr_5g_bw40diff[rf_path][i] =
2848 				pwrinfo5g.bw40_diff[rf_path][i];
2849 			rtlefuse->txpwr_5g_bw80diff[rf_path][i] =
2850 				pwrinfo5g.bw80_diff[rf_path][i];
2851 		}
2852 	}
2853 
2854 	if (!autoload_fail) {
2855 		rtlefuse->eeprom_regulatory =
2856 			hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;/*bit0~2*/
2857 		if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2858 			rtlefuse->eeprom_regulatory = 0;
2859 	} else {
2860 		rtlefuse->eeprom_regulatory = 0;
2861 	}
2862 
2863 	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2864 	"eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2865 }
2866 #endif
2867 static void _rtl8821ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2868 						 bool autoload_fail,
2869 						 u8 *hwinfo)
2870 {
2871 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2872 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2873 	struct txpower_info_2g pwrinfo24g;
2874 	struct txpower_info_5g pwrinfo5g;
2875 	u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
2876 		36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
2877 		56, 58, 60, 62, 64, 100, 102, 104, 106,
2878 		108, 110, 112, 114, 116, 118, 120, 122,
2879 		124, 126, 128, 130, 132, 134, 136, 138,
2880 		140, 142, 144, 149, 151, 153, 155, 157,
2881 		159, 161, 163, 165, 167, 168, 169, 171,
2882 		173, 175, 177};
2883 	u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {
2884 		42, 58, 106, 122, 138, 155, 171};
2885 	u8 rf_path, index;
2886 	u8 i;
2887 
2888 	_rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g,
2889 		&pwrinfo5g, autoload_fail, hwinfo);
2890 
2891 	for (rf_path = 0; rf_path < 2; rf_path++) {
2892 		for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2893 			index = _rtl8821ae_get_chnl_group(i + 1);
2894 
2895 			if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2896 				rtlefuse->txpwrlevel_cck[rf_path][i] =
2897 					pwrinfo24g.index_cck_base[rf_path][5];
2898 				rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2899 					pwrinfo24g.index_bw40_base[rf_path][index];
2900 			} else {
2901 				rtlefuse->txpwrlevel_cck[rf_path][i] =
2902 					pwrinfo24g.index_cck_base[rf_path][index];
2903 				rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2904 					pwrinfo24g.index_bw40_base[rf_path][index];
2905 			}
2906 		}
2907 
2908 		for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2909 			index = _rtl8821ae_get_chnl_group(channel5g[i]);
2910 			rtlefuse->txpwr_5g_bw40base[rf_path][i] =
2911 				pwrinfo5g.index_bw40_base[rf_path][index];
2912 		}
2913 		for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2914 			u8 upper, lower;
2915 			index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2916 			upper = pwrinfo5g.index_bw40_base[rf_path][index];
2917 			lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2918 
2919 			rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2920 		}
2921 		for (i = 0; i < MAX_TX_COUNT; i++) {
2922 			rtlefuse->txpwr_cckdiff[rf_path][i] =
2923 				pwrinfo24g.cck_diff[rf_path][i];
2924 			rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
2925 				pwrinfo24g.ofdm_diff[rf_path][i];
2926 			rtlefuse->txpwr_ht20diff[rf_path][i] =
2927 				pwrinfo24g.bw20_diff[rf_path][i];
2928 			rtlefuse->txpwr_ht40diff[rf_path][i] =
2929 				pwrinfo24g.bw40_diff[rf_path][i];
2930 
2931 			rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] =
2932 				pwrinfo5g.ofdm_diff[rf_path][i];
2933 			rtlefuse->txpwr_5g_bw20diff[rf_path][i] =
2934 				pwrinfo5g.bw20_diff[rf_path][i];
2935 			rtlefuse->txpwr_5g_bw40diff[rf_path][i] =
2936 				pwrinfo5g.bw40_diff[rf_path][i];
2937 			rtlefuse->txpwr_5g_bw80diff[rf_path][i] =
2938 				pwrinfo5g.bw80_diff[rf_path][i];
2939 		}
2940 	}
2941 	/*bit0~2*/
2942 	if (!autoload_fail) {
2943 		rtlefuse->eeprom_regulatory = hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;
2944 		if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2945 			rtlefuse->eeprom_regulatory = 0;
2946 	} else {
2947 		rtlefuse->eeprom_regulatory = 0;
2948 	}
2949 
2950 	RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2951 	"eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2952 }
2953 
2954 static void _rtl8812ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo,
2955 				    bool autoload_fail)
2956 {
2957 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2958 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2959 
2960 	if (!autoload_fail) {
2961 		rtlhal->pa_type_2g = hwinfo[0xBC];
2962 		rtlhal->lna_type_2g = hwinfo[0xBD];
2963 		if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) {
2964 			rtlhal->pa_type_2g = 0;
2965 			rtlhal->lna_type_2g = 0;
2966 		}
2967 		rtlhal->external_pa_2g = ((rtlhal->pa_type_2g & BIT(5)) &&
2968 					  (rtlhal->pa_type_2g & BIT(4))) ?
2969 					 1 : 0;
2970 		rtlhal->external_lna_2g = ((rtlhal->lna_type_2g & BIT(7)) &&
2971 					   (rtlhal->lna_type_2g & BIT(3))) ?
2972 					  1 : 0;
2973 
2974 		rtlhal->pa_type_5g = hwinfo[0xBC];
2975 		rtlhal->lna_type_5g = hwinfo[0xBF];
2976 		if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) {
2977 			rtlhal->pa_type_5g = 0;
2978 			rtlhal->lna_type_5g = 0;
2979 		}
2980 		rtlhal->external_pa_5g = ((rtlhal->pa_type_5g & BIT(1)) &&
2981 					  (rtlhal->pa_type_5g & BIT(0))) ?
2982 					 1 : 0;
2983 		rtlhal->external_lna_5g = ((rtlhal->lna_type_5g & BIT(7)) &&
2984 					   (rtlhal->lna_type_5g & BIT(3))) ?
2985 					  1 : 0;
2986 	} else {
2987 		rtlhal->external_pa_2g  = 0;
2988 		rtlhal->external_lna_2g = 0;
2989 		rtlhal->external_pa_5g  = 0;
2990 		rtlhal->external_lna_5g = 0;
2991 	}
2992 }
2993 
2994 static void _rtl8821ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo,
2995 				    bool autoload_fail)
2996 {
2997 	struct rtl_priv *rtlpriv = rtl_priv(hw);
2998 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2999 
3000 	if (!autoload_fail) {
3001 		rtlhal->pa_type_2g = hwinfo[0xBC];
3002 		rtlhal->lna_type_2g = hwinfo[0xBD];
3003 		if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) {
3004 			rtlhal->pa_type_2g = 0;
3005 			rtlhal->lna_type_2g = 0;
3006 		}
3007 		rtlhal->external_pa_2g = (rtlhal->pa_type_2g & BIT(5)) ? 1 : 0;
3008 		rtlhal->external_lna_2g = (rtlhal->lna_type_2g & BIT(7)) ? 1 : 0;
3009 
3010 		rtlhal->pa_type_5g = hwinfo[0xBC];
3011 		rtlhal->lna_type_5g = hwinfo[0xBF];
3012 		if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) {
3013 			rtlhal->pa_type_5g = 0;
3014 			rtlhal->lna_type_5g = 0;
3015 		}
3016 		rtlhal->external_pa_5g = (rtlhal->pa_type_5g & BIT(1)) ? 1 : 0;
3017 		rtlhal->external_lna_5g = (rtlhal->lna_type_5g & BIT(7)) ? 1 : 0;
3018 	} else {
3019 		rtlhal->external_pa_2g  = 0;
3020 		rtlhal->external_lna_2g = 0;
3021 		rtlhal->external_pa_5g  = 0;
3022 		rtlhal->external_lna_5g = 0;
3023 	}
3024 }
3025 
3026 static void _rtl8821ae_read_rfe_type(struct ieee80211_hw *hw, u8 *hwinfo,
3027 			      bool autoload_fail)
3028 {
3029 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3030 	struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
3031 
3032 	if (!autoload_fail) {
3033 		if (hwinfo[EEPROM_RFE_OPTION] & BIT(7)) {
3034 			if (rtlhal->external_lna_5g) {
3035 				if (rtlhal->external_pa_5g) {
3036 					if (rtlhal->external_lna_2g &&
3037 					    rtlhal->external_pa_2g)
3038 						rtlhal->rfe_type = 3;
3039 					else
3040 						rtlhal->rfe_type = 0;
3041 				} else {
3042 					rtlhal->rfe_type = 2;
3043 				}
3044 			} else {
3045 				rtlhal->rfe_type = 4;
3046 			}
3047 		} else {
3048 			rtlhal->rfe_type = hwinfo[EEPROM_RFE_OPTION] & 0x3F;
3049 
3050 			if (rtlhal->rfe_type == 4 &&
3051 			    (rtlhal->external_pa_5g ||
3052 			     rtlhal->external_pa_2g ||
3053 			     rtlhal->external_lna_5g ||
3054 			     rtlhal->external_lna_2g)) {
3055 				if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
3056 					rtlhal->rfe_type = 2;
3057 			}
3058 		}
3059 	} else {
3060 		rtlhal->rfe_type = 0x04;
3061 	}
3062 
3063 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3064 		 "RFE Type: 0x%2x\n", rtlhal->rfe_type);
3065 }
3066 
3067 static void _rtl8812ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3068 					      bool auto_load_fail, u8 *hwinfo)
3069 {
3070 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3071 	u8 value;
3072 
3073 	if (!auto_load_fail) {
3074 		value = *(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION];
3075 		if (((value & 0xe0) >> 5) == 0x1)
3076 			rtlpriv->btcoexist.btc_info.btcoexist = 1;
3077 		else
3078 			rtlpriv->btcoexist.btc_info.btcoexist = 0;
3079 		rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3080 
3081 		value = hwinfo[EEPROM_RF_BT_SETTING];
3082 		rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3083 	} else {
3084 		rtlpriv->btcoexist.btc_info.btcoexist = 0;
3085 		rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3086 		rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3087 	}
3088 	/*move BT_InitHalVars() to init_sw_vars*/
3089 }
3090 
3091 static void _rtl8821ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3092 					      bool auto_load_fail, u8 *hwinfo)
3093 {
3094 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3095 	u8 value;
3096 	u32 tmpu_32;
3097 
3098 	if (!auto_load_fail) {
3099 		tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
3100 		if (tmpu_32 & BIT(18))
3101 			rtlpriv->btcoexist.btc_info.btcoexist = 1;
3102 		else
3103 			rtlpriv->btcoexist.btc_info.btcoexist = 0;
3104 		rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3105 
3106 		value = hwinfo[EEPROM_RF_BT_SETTING];
3107 		rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3108 	} else {
3109 		rtlpriv->btcoexist.btc_info.btcoexist = 0;
3110 		rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3111 		rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3112 	}
3113 	/*move BT_InitHalVars() to init_sw_vars*/
3114 }
3115 
3116 static void _rtl8821ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_test)
3117 {
3118 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3119 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3120 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3121 	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3122 	u16 i, usvalue;
3123 	u8 hwinfo[HWSET_MAX_SIZE];
3124 	u16 eeprom_id;
3125 
3126 	if (b_pseudo_test) {
3127 		;/* need add */
3128 	}
3129 
3130 	if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
3131 		rtl_efuse_shadow_map_update(hw);
3132 		memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
3133 		       HWSET_MAX_SIZE);
3134 	} else if (rtlefuse->epromtype == EEPROM_93C46) {
3135 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3136 			 "RTL819X Not boot from eeprom, check it !!");
3137 	}
3138 
3139 	RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
3140 		      hwinfo, HWSET_MAX_SIZE);
3141 
3142 	eeprom_id = *((u16 *)&hwinfo[0]);
3143 	if (eeprom_id != RTL_EEPROM_ID) {
3144 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3145 			 "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
3146 		rtlefuse->autoload_failflag = true;
3147 	} else {
3148 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
3149 		rtlefuse->autoload_failflag = false;
3150 	}
3151 
3152 	if (rtlefuse->autoload_failflag) {
3153 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3154 			 "RTL8812AE autoload_failflag, check it !!");
3155 		return;
3156 	}
3157 
3158 	rtlefuse->eeprom_version = *(u8 *)&hwinfo[EEPROM_VERSION];
3159 	if (rtlefuse->eeprom_version == 0xff)
3160 			rtlefuse->eeprom_version = 0;
3161 
3162 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3163 		 "EEPROM version: 0x%2x\n", rtlefuse->eeprom_version);
3164 
3165 	rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
3166 	rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
3167 	rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
3168 	rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
3169 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3170 		 "EEPROMId = 0x%4x\n", eeprom_id);
3171 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3172 		 "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
3173 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3174 		 "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
3175 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3176 		 "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
3177 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3178 		 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
3179 
3180 	/*customer ID*/
3181 	rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
3182 	if (rtlefuse->eeprom_oemid == 0xFF)
3183 		rtlefuse->eeprom_oemid = 0;
3184 
3185 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3186 		 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
3187 
3188 	for (i = 0; i < 6; i += 2) {
3189 		usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
3190 		*((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
3191 	}
3192 
3193 	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3194 		 "dev_addr: %pM\n", rtlefuse->dev_addr);
3195 
3196 	_rtl8821ae_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
3197 					       hwinfo);
3198 
3199 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
3200 		_rtl8812ae_read_pa_type(hw, hwinfo, rtlefuse->autoload_failflag);
3201 		_rtl8812ae_read_bt_coexist_info_from_hwpg(hw,
3202 				rtlefuse->autoload_failflag, hwinfo);
3203 	} else {
3204 		_rtl8821ae_read_pa_type(hw, hwinfo, rtlefuse->autoload_failflag);
3205 		_rtl8821ae_read_bt_coexist_info_from_hwpg(hw,
3206 				rtlefuse->autoload_failflag, hwinfo);
3207 	}
3208 
3209 	_rtl8821ae_read_rfe_type(hw, hwinfo, rtlefuse->autoload_failflag);
3210 	/*board type*/
3211 	rtlefuse->board_type = ODM_BOARD_DEFAULT;
3212 	if (rtlhal->external_lna_2g != 0)
3213 		rtlefuse->board_type |= ODM_BOARD_EXT_LNA;
3214 	if (rtlhal->external_lna_5g != 0)
3215 		rtlefuse->board_type |= ODM_BOARD_EXT_LNA_5G;
3216 	if (rtlhal->external_pa_2g != 0)
3217 		rtlefuse->board_type |= ODM_BOARD_EXT_PA;
3218 	if (rtlhal->external_pa_5g != 0)
3219 		rtlefuse->board_type |= ODM_BOARD_EXT_PA_5G;
3220 
3221 	if (rtlpriv->btcoexist.btc_info.btcoexist == 1)
3222 		rtlefuse->board_type |= ODM_BOARD_BT;
3223 
3224 	rtlhal->board_type = rtlefuse->board_type;
3225 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3226 		 "board_type = 0x%x\n", rtlefuse->board_type);
3227 
3228 	rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
3229 	if (rtlefuse->eeprom_channelplan == 0xff)
3230 		rtlefuse->eeprom_channelplan = 0x7F;
3231 
3232 	/* set channel plan from efuse */
3233 	rtlefuse->channel_plan = rtlefuse->eeprom_channelplan;
3234 
3235 	/*parse xtal*/
3236 	rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8821AE];
3237 	if (rtlefuse->crystalcap == 0xFF)
3238 		rtlefuse->crystalcap = 0x20;
3239 
3240 	rtlefuse->eeprom_thermalmeter = *(u8 *)&hwinfo[EEPROM_THERMAL_METER];
3241 	if ((rtlefuse->eeprom_thermalmeter == 0xff) ||
3242 	    rtlefuse->autoload_failflag) {
3243 		rtlefuse->apk_thermalmeterignore = true;
3244 		rtlefuse->eeprom_thermalmeter = 0xff;
3245 	}
3246 
3247 	rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
3248 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3249 		 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
3250 
3251 	if (!rtlefuse->autoload_failflag) {
3252 		rtlefuse->antenna_div_cfg =
3253 		  (hwinfo[EEPROM_RF_BOARD_OPTION] & 0x18) >> 3;
3254 		if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xff)
3255 			rtlefuse->antenna_div_cfg = 0;
3256 
3257 		if (rtlpriv->btcoexist.btc_info.btcoexist == 1 &&
3258 		    rtlpriv->btcoexist.btc_info.ant_num == ANT_X1)
3259 			rtlefuse->antenna_div_cfg = 0;
3260 
3261 		rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E];
3262 		if (rtlefuse->antenna_div_type == 0xff)
3263 			rtlefuse->antenna_div_type = FIXED_HW_ANTDIV;
3264 	} else {
3265 		rtlefuse->antenna_div_cfg = 0;
3266 		rtlefuse->antenna_div_type = 0;
3267 	}
3268 
3269 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3270 		"SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n",
3271 		rtlefuse->antenna_div_cfg, rtlefuse->antenna_div_type);
3272 
3273 	pcipriv->ledctl.led_opendrain = true;
3274 
3275 	if (rtlhal->oem_id == RT_CID_DEFAULT) {
3276 		switch (rtlefuse->eeprom_oemid) {
3277 		case RT_CID_DEFAULT:
3278 			break;
3279 		case EEPROM_CID_TOSHIBA:
3280 			rtlhal->oem_id = RT_CID_TOSHIBA;
3281 			break;
3282 		case EEPROM_CID_CCX:
3283 			rtlhal->oem_id = RT_CID_CCX;
3284 			break;
3285 		case EEPROM_CID_QMI:
3286 			rtlhal->oem_id = RT_CID_819X_QMI;
3287 			break;
3288 		case EEPROM_CID_WHQL:
3289 			break;
3290 		default:
3291 			break;
3292 		}
3293 	}
3294 }
3295 
3296 /*static void _rtl8821ae_hal_customized_behavior(struct ieee80211_hw *hw)
3297 {
3298 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3299 	struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3300 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3301 
3302 	pcipriv->ledctl.led_opendrain = true;
3303 	switch (rtlhal->oem_id) {
3304 	case RT_CID_819X_HP:
3305 		pcipriv->ledctl.led_opendrain = true;
3306 		break;
3307 	case RT_CID_819X_LENOVO:
3308 	case RT_CID_DEFAULT:
3309 	case RT_CID_TOSHIBA:
3310 	case RT_CID_CCX:
3311 	case RT_CID_819X_ACER:
3312 	case RT_CID_WHQL:
3313 	default:
3314 		break;
3315 	}
3316 	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3317 		 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
3318 }*/
3319 
3320 void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw)
3321 {
3322 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3323 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3324 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3325 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3326 	u8 tmp_u1b;
3327 
3328 	rtlhal->version = _rtl8821ae_read_chip_version(hw);
3329 	if (get_rf_type(rtlphy) == RF_1T1R)
3330 		rtlpriv->dm.rfpath_rxenable[0] = true;
3331 	else
3332 		rtlpriv->dm.rfpath_rxenable[0] =
3333 		    rtlpriv->dm.rfpath_rxenable[1] = true;
3334 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
3335 						rtlhal->version);
3336 
3337 	tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
3338 	if (tmp_u1b & BIT(4)) {
3339 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
3340 		rtlefuse->epromtype = EEPROM_93C46;
3341 	} else {
3342 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
3343 		rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
3344 	}
3345 
3346 	if (tmp_u1b & BIT(5)) {
3347 		RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
3348 		rtlefuse->autoload_failflag = false;
3349 		_rtl8821ae_read_adapter_info(hw, false);
3350 	} else {
3351 		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
3352 	}
3353 	/*hal_ReadRFType_8812A()*/
3354 	/* _rtl8821ae_hal_customized_behavior(hw); */
3355 }
3356 
3357 static void rtl8821ae_update_hal_rate_table(struct ieee80211_hw *hw,
3358 		struct ieee80211_sta *sta)
3359 {
3360 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3361 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3362 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3363 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3364 	u32 ratr_value;
3365 	u8 ratr_index = 0;
3366 	u8 b_nmode = mac->ht_enable;
3367 	u8 mimo_ps = IEEE80211_SMPS_OFF;
3368 	u16 shortgi_rate;
3369 	u32 tmp_ratr_value;
3370 	u8 curtxbw_40mhz = mac->bw_40;
3371 	u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
3372 				1 : 0;
3373 	u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
3374 				1 : 0;
3375 	enum wireless_mode wirelessmode = mac->mode;
3376 
3377 	if (rtlhal->current_bandtype == BAND_ON_5G)
3378 		ratr_value = sta->supp_rates[1] << 4;
3379 	else
3380 		ratr_value = sta->supp_rates[0];
3381 	if (mac->opmode == NL80211_IFTYPE_ADHOC)
3382 		ratr_value = 0xfff;
3383 	ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
3384 			sta->ht_cap.mcs.rx_mask[0] << 12);
3385 	switch (wirelessmode) {
3386 	case WIRELESS_MODE_B:
3387 		if (ratr_value & 0x0000000c)
3388 			ratr_value &= 0x0000000d;
3389 		else
3390 			ratr_value &= 0x0000000f;
3391 		break;
3392 	case WIRELESS_MODE_G:
3393 		ratr_value &= 0x00000FF5;
3394 		break;
3395 	case WIRELESS_MODE_N_24G:
3396 	case WIRELESS_MODE_N_5G:
3397 		b_nmode = 1;
3398 		if (mimo_ps == IEEE80211_SMPS_STATIC) {
3399 			ratr_value &= 0x0007F005;
3400 		} else {
3401 			u32 ratr_mask;
3402 
3403 			if (get_rf_type(rtlphy) == RF_1T2R ||
3404 			    get_rf_type(rtlphy) == RF_1T1R)
3405 				ratr_mask = 0x000ff005;
3406 			else
3407 				ratr_mask = 0x0f0ff005;
3408 
3409 			ratr_value &= ratr_mask;
3410 		}
3411 		break;
3412 	default:
3413 		if (rtlphy->rf_type == RF_1T2R)
3414 			ratr_value &= 0x000ff0ff;
3415 		else
3416 			ratr_value &= 0x0f0ff0ff;
3417 
3418 		break;
3419 	}
3420 
3421 	if ((rtlpriv->btcoexist.bt_coexistence) &&
3422 	     (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
3423 	     (rtlpriv->btcoexist.bt_cur_state) &&
3424 	     (rtlpriv->btcoexist.bt_ant_isolation) &&
3425 	     ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
3426 	     (rtlpriv->btcoexist.bt_service == BT_BUSY)))
3427 		ratr_value &= 0x0fffcfc0;
3428 	else
3429 		ratr_value &= 0x0FFFFFFF;
3430 
3431 	if (b_nmode && ((curtxbw_40mhz &&
3432 			 b_curshortgi_40mhz) || (!curtxbw_40mhz &&
3433 						 b_curshortgi_20mhz))) {
3434 		ratr_value |= 0x10000000;
3435 		tmp_ratr_value = (ratr_value >> 12);
3436 
3437 		for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
3438 			if ((1 << shortgi_rate) & tmp_ratr_value)
3439 				break;
3440 		}
3441 
3442 		shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
3443 		    (shortgi_rate << 4) | (shortgi_rate);
3444 	}
3445 
3446 	rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
3447 
3448 	RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
3449 		 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0));
3450 }
3451 
3452 static u8 _rtl8821ae_mrate_idx_to_arfr_id(
3453 	struct ieee80211_hw *hw, u8 rate_index,
3454 	enum wireless_mode wirelessmode)
3455 {
3456 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3457 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3458 	u8 ret = 0;
3459 	switch (rate_index) {
3460 	case RATR_INX_WIRELESS_NGB:
3461 		if (rtlphy->rf_type == RF_1T1R)
3462 			ret = 1;
3463 		else
3464 			ret = 0;
3465 		; break;
3466 	case RATR_INX_WIRELESS_N:
3467 	case RATR_INX_WIRELESS_NG:
3468 		if (rtlphy->rf_type == RF_1T1R)
3469 			ret = 5;
3470 		else
3471 			ret = 4;
3472 		; break;
3473 	case RATR_INX_WIRELESS_NB:
3474 		if (rtlphy->rf_type == RF_1T1R)
3475 			ret = 3;
3476 		else
3477 			ret = 2;
3478 		; break;
3479 	case RATR_INX_WIRELESS_GB:
3480 		ret = 6;
3481 		break;
3482 	case RATR_INX_WIRELESS_G:
3483 		ret = 7;
3484 		break;
3485 	case RATR_INX_WIRELESS_B:
3486 		ret = 8;
3487 		break;
3488 	case RATR_INX_WIRELESS_MC:
3489 		if ((wirelessmode == WIRELESS_MODE_B)
3490 			|| (wirelessmode == WIRELESS_MODE_G)
3491 			|| (wirelessmode == WIRELESS_MODE_N_24G)
3492 			|| (wirelessmode == WIRELESS_MODE_AC_24G))
3493 			ret = 6;
3494 		else
3495 			ret = 7;
3496 	case RATR_INX_WIRELESS_AC_5N:
3497 		if (rtlphy->rf_type == RF_1T1R)
3498 			ret = 10;
3499 		else
3500 			ret = 9;
3501 		break;
3502 	case RATR_INX_WIRELESS_AC_24N:
3503 		if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
3504 			if (rtlphy->rf_type == RF_1T1R)
3505 				ret = 10;
3506 			else
3507 				ret = 9;
3508 		} else {
3509 			if (rtlphy->rf_type == RF_1T1R)
3510 				ret = 11;
3511 			else
3512 				ret = 12;
3513 		}
3514 		break;
3515 	default:
3516 		ret = 0; break;
3517 	}
3518 	return ret;
3519 }
3520 
3521 static u32 _rtl8821ae_rate_to_bitmap_2ssvht(__le16 vht_rate)
3522 {
3523 	u8 i, j, tmp_rate;
3524 	u32 rate_bitmap = 0;
3525 
3526 	for (i = j = 0; i < 4; i += 2, j += 10) {
3527 		tmp_rate = (le16_to_cpu(vht_rate) >> i) & 3;
3528 
3529 		switch (tmp_rate) {
3530 		case 2:
3531 			rate_bitmap = rate_bitmap | (0x03ff << j);
3532 			break;
3533 		case 1:
3534 			rate_bitmap = rate_bitmap | (0x01ff << j);
3535 			break;
3536 		case 0:
3537 			rate_bitmap = rate_bitmap | (0x00ff << j);
3538 			break;
3539 		default:
3540 			break;
3541 		}
3542 	}
3543 
3544 	return rate_bitmap;
3545 }
3546 
3547 static u32 _rtl8821ae_set_ra_vht_ratr_bitmap(struct ieee80211_hw *hw,
3548 					     enum wireless_mode wirelessmode,
3549 					     u32 ratr_bitmap)
3550 {
3551 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3552 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3553 	u32 ret_bitmap = ratr_bitmap;
3554 
3555 	if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40
3556 		|| rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
3557 		ret_bitmap = ratr_bitmap;
3558 	else if (wirelessmode == WIRELESS_MODE_AC_5G
3559 		|| wirelessmode == WIRELESS_MODE_AC_24G) {
3560 		if (rtlphy->rf_type == RF_1T1R)
3561 			ret_bitmap = ratr_bitmap & (~BIT21);
3562 		else
3563 			ret_bitmap = ratr_bitmap & (~(BIT31|BIT21));
3564 	}
3565 
3566 	return ret_bitmap;
3567 }
3568 
3569 static u8 _rtl8821ae_get_vht_eni(enum wireless_mode wirelessmode,
3570 			u32 ratr_bitmap)
3571 {
3572 	u8 ret = 0;
3573 	if (wirelessmode < WIRELESS_MODE_N_24G)
3574 		ret =  0;
3575 	else if (wirelessmode == WIRELESS_MODE_AC_24G) {
3576 		if (ratr_bitmap & 0xfff00000)	/* Mix , 2SS */
3577 			ret = 3;
3578 		else					/* Mix, 1SS */
3579 			ret = 2;
3580 	} else if (wirelessmode == WIRELESS_MODE_AC_5G) {
3581 			ret = 1;
3582 	} /* VHT */
3583 
3584 	return ret << 4;
3585 }
3586 
3587 static u8 _rtl8821ae_get_ra_ldpc(struct ieee80211_hw *hw,
3588 			     u8 mac_id, struct rtl_sta_info *sta_entry,
3589 			     enum wireless_mode wirelessmode)
3590 {
3591 	u8 b_ldpc = 0;
3592 	/*not support ldpc, do not open*/
3593 	return b_ldpc << 2;
3594 }
3595 
3596 static u8 _rtl8821ae_get_ra_rftype(struct ieee80211_hw *hw,
3597 			  enum wireless_mode wirelessmode,
3598 			  u32 ratr_bitmap)
3599 {
3600 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3601 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3602 	u8 rf_type = RF_1T1R;
3603 
3604 	if (rtlphy->rf_type == RF_1T1R)
3605 		rf_type = RF_1T1R;
3606 	else if (wirelessmode == WIRELESS_MODE_AC_5G
3607 		|| wirelessmode == WIRELESS_MODE_AC_24G
3608 		|| wirelessmode == WIRELESS_MODE_AC_ONLY) {
3609 		if (ratr_bitmap & 0xffc00000)
3610 			rf_type = RF_2T2R;
3611 	} else if (wirelessmode == WIRELESS_MODE_N_5G
3612 		|| wirelessmode == WIRELESS_MODE_N_24G) {
3613 		if (ratr_bitmap & 0xfff00000)
3614 			rf_type = RF_2T2R;
3615 	}
3616 
3617 	return rf_type;
3618 }
3619 
3620 static bool _rtl8821ae_get_ra_shortgi(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
3621 			      u8 mac_id)
3622 {
3623 	bool b_short_gi = false;
3624 	u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
3625 				1 : 0;
3626 	u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
3627 				1 : 0;
3628 	u8 b_curshortgi_80mhz = 0;
3629 	b_curshortgi_80mhz = (sta->vht_cap.cap &
3630 			      IEEE80211_VHT_CAP_SHORT_GI_80) ? 1 : 0;
3631 
3632 	if (mac_id == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST)
3633 			b_short_gi = false;
3634 
3635 	if (b_curshortgi_40mhz || b_curshortgi_80mhz
3636 		|| b_curshortgi_20mhz)
3637 		b_short_gi = true;
3638 
3639 	return b_short_gi;
3640 }
3641 
3642 static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
3643 		struct ieee80211_sta *sta, u8 rssi_level)
3644 {
3645 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3646 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3647 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3648 	struct rtl_sta_info *sta_entry = NULL;
3649 	u32 ratr_bitmap;
3650 	u8 ratr_index;
3651 	enum wireless_mode wirelessmode = 0;
3652 	u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
3653 				? 1 : 0;
3654 	bool b_shortgi = false;
3655 	u8 rate_mask[7];
3656 	u8 macid = 0;
3657 	u8 mimo_ps = IEEE80211_SMPS_OFF;
3658 	u8 rf_type;
3659 
3660 	sta_entry = (struct rtl_sta_info *)sta->drv_priv;
3661 	wirelessmode = sta_entry->wireless_mode;
3662 
3663 	RT_TRACE(rtlpriv, COMP_RATR, DBG_LOUD,
3664 		 "wireless mode = 0x%x\n", wirelessmode);
3665 	if (mac->opmode == NL80211_IFTYPE_STATION ||
3666 		mac->opmode == NL80211_IFTYPE_MESH_POINT) {
3667 		curtxbw_40mhz = mac->bw_40;
3668 	} else if (mac->opmode == NL80211_IFTYPE_AP ||
3669 		mac->opmode == NL80211_IFTYPE_ADHOC)
3670 		macid = sta->aid + 1;
3671 	if (wirelessmode == WIRELESS_MODE_N_5G ||
3672 	    wirelessmode == WIRELESS_MODE_AC_5G ||
3673 	    wirelessmode == WIRELESS_MODE_A)
3674 		ratr_bitmap = sta->supp_rates[NL80211_BAND_5GHZ] << 4;
3675 	else
3676 		ratr_bitmap = sta->supp_rates[NL80211_BAND_2GHZ];
3677 
3678 	if (mac->opmode == NL80211_IFTYPE_ADHOC)
3679 		ratr_bitmap = 0xfff;
3680 
3681 	if (wirelessmode == WIRELESS_MODE_N_24G
3682 		|| wirelessmode == WIRELESS_MODE_N_5G)
3683 		ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
3684 				sta->ht_cap.mcs.rx_mask[0] << 12);
3685 	else if (wirelessmode == WIRELESS_MODE_AC_24G
3686 		|| wirelessmode == WIRELESS_MODE_AC_5G
3687 		|| wirelessmode == WIRELESS_MODE_AC_ONLY)
3688 		ratr_bitmap |= _rtl8821ae_rate_to_bitmap_2ssvht(
3689 				sta->vht_cap.vht_mcs.rx_mcs_map) << 12;
3690 
3691 	b_shortgi = _rtl8821ae_get_ra_shortgi(hw, sta, macid);
3692 	rf_type = _rtl8821ae_get_ra_rftype(hw, wirelessmode, ratr_bitmap);
3693 
3694 /*mac id owner*/
3695 	switch (wirelessmode) {
3696 	case WIRELESS_MODE_B:
3697 		ratr_index = RATR_INX_WIRELESS_B;
3698 		if (ratr_bitmap & 0x0000000c)
3699 			ratr_bitmap &= 0x0000000d;
3700 		else
3701 			ratr_bitmap &= 0x0000000f;
3702 		break;
3703 	case WIRELESS_MODE_G:
3704 		ratr_index = RATR_INX_WIRELESS_GB;
3705 
3706 		if (rssi_level == 1)
3707 			ratr_bitmap &= 0x00000f00;
3708 		else if (rssi_level == 2)
3709 			ratr_bitmap &= 0x00000ff0;
3710 		else
3711 			ratr_bitmap &= 0x00000ff5;
3712 		break;
3713 	case WIRELESS_MODE_A:
3714 		ratr_index = RATR_INX_WIRELESS_G;
3715 		ratr_bitmap &= 0x00000ff0;
3716 		break;
3717 	case WIRELESS_MODE_N_24G:
3718 	case WIRELESS_MODE_N_5G:
3719 		if (wirelessmode == WIRELESS_MODE_N_24G)
3720 			ratr_index = RATR_INX_WIRELESS_NGB;
3721 		else
3722 			ratr_index = RATR_INX_WIRELESS_NG;
3723 
3724 		if (mimo_ps == IEEE80211_SMPS_STATIC
3725 			|| mimo_ps == IEEE80211_SMPS_DYNAMIC) {
3726 			if (rssi_level == 1)
3727 				ratr_bitmap &= 0x000f0000;
3728 			else if (rssi_level == 2)
3729 				ratr_bitmap &= 0x000ff000;
3730 			else
3731 				ratr_bitmap &= 0x000ff005;
3732 		} else {
3733 			if (rf_type == RF_1T1R) {
3734 				if (curtxbw_40mhz) {
3735 					if (rssi_level == 1)
3736 						ratr_bitmap &= 0x000f0000;
3737 					else if (rssi_level == 2)
3738 						ratr_bitmap &= 0x000ff000;
3739 					else
3740 						ratr_bitmap &= 0x000ff015;
3741 				} else {
3742 					if (rssi_level == 1)
3743 						ratr_bitmap &= 0x000f0000;
3744 					else if (rssi_level == 2)
3745 						ratr_bitmap &= 0x000ff000;
3746 					else
3747 						ratr_bitmap &= 0x000ff005;
3748 				}
3749 			} else {
3750 				if (curtxbw_40mhz) {
3751 					if (rssi_level == 1)
3752 						ratr_bitmap &= 0x0fff0000;
3753 					else if (rssi_level == 2)
3754 						ratr_bitmap &= 0x0ffff000;
3755 					else
3756 						ratr_bitmap &= 0x0ffff015;
3757 				} else {
3758 					if (rssi_level == 1)
3759 						ratr_bitmap &= 0x0fff0000;
3760 					else if (rssi_level == 2)
3761 						ratr_bitmap &= 0x0ffff000;
3762 					else
3763 						ratr_bitmap &= 0x0ffff005;
3764 				}
3765 			}
3766 		}
3767 		break;
3768 
3769 	case WIRELESS_MODE_AC_24G:
3770 		ratr_index = RATR_INX_WIRELESS_AC_24N;
3771 		if (rssi_level == 1)
3772 			ratr_bitmap &= 0xfc3f0000;
3773 		else if (rssi_level == 2)
3774 			ratr_bitmap &= 0xfffff000;
3775 		else
3776 			ratr_bitmap &= 0xffffffff;
3777 		break;
3778 
3779 	case WIRELESS_MODE_AC_5G:
3780 		ratr_index = RATR_INX_WIRELESS_AC_5N;
3781 
3782 		if (rf_type == RF_1T1R) {
3783 			if (rssi_level == 1)	/*add by Gary for ac-series*/
3784 				ratr_bitmap &= 0x003f8000;
3785 			else if (rssi_level == 2)
3786 				ratr_bitmap &= 0x003ff000;
3787 			else
3788 				ratr_bitmap &= 0x003ff010;
3789 		} else {
3790 			if (rssi_level == 1)
3791 				ratr_bitmap &= 0xfe3f8000;
3792 			else if (rssi_level == 2)
3793 				ratr_bitmap &= 0xfffff000;
3794 			else
3795 				ratr_bitmap &= 0xfffff010;
3796 		}
3797 		break;
3798 
3799 	default:
3800 		ratr_index = RATR_INX_WIRELESS_NGB;
3801 
3802 		if (rf_type == RF_1T2R)
3803 			ratr_bitmap &= 0x000ff0ff;
3804 		else
3805 			ratr_bitmap &= 0x0f8ff0ff;
3806 		break;
3807 	}
3808 
3809 	ratr_index = _rtl8821ae_mrate_idx_to_arfr_id(hw, ratr_index, wirelessmode);
3810 	sta_entry->ratr_index = ratr_index;
3811 	ratr_bitmap = _rtl8821ae_set_ra_vht_ratr_bitmap(hw, wirelessmode,
3812 							ratr_bitmap);
3813 
3814 	RT_TRACE(rtlpriv, COMP_RATR, DBG_LOUD,
3815 		 "ratr_bitmap :%x\n", ratr_bitmap);
3816 
3817 	/* *(u32 *)& rate_mask = EF4BYTE((ratr_bitmap & 0x0fffffff) |
3818 				       (ratr_index << 28)); */
3819 
3820 	rate_mask[0] = macid;
3821 	rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00);
3822 	rate_mask[2] = rtlphy->current_chan_bw
3823 			   | _rtl8821ae_get_vht_eni(wirelessmode, ratr_bitmap)
3824 			   | _rtl8821ae_get_ra_ldpc(hw, macid, sta_entry, wirelessmode);
3825 
3826 	rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
3827 	rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
3828 	rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
3829 	rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
3830 
3831 	RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
3832 		 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
3833 		 ratr_index, ratr_bitmap,
3834 		 rate_mask[0], rate_mask[1],
3835 		 rate_mask[2], rate_mask[3],
3836 		 rate_mask[4], rate_mask[5],
3837 		 rate_mask[6]);
3838 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RA_MASK, 7, rate_mask);
3839 	_rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
3840 }
3841 
3842 void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
3843 		struct ieee80211_sta *sta, u8 rssi_level)
3844 {
3845 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3846 	if (rtlpriv->dm.useramask)
3847 		rtl8821ae_update_hal_rate_mask(hw, sta, rssi_level);
3848 	else
3849 		/*RT_TRACE(rtlpriv, COMP_RATR,DBG_LOUD,
3850 			   "rtl8821ae_update_hal_rate_tbl() Error! 8821ae FW RA Only");*/
3851 		rtl8821ae_update_hal_rate_table(hw, sta);
3852 }
3853 
3854 void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw)
3855 {
3856 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3857 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3858 	u8 wireless_mode = mac->mode;
3859 	u8 sifs_timer, r2t_sifs;
3860 
3861 	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
3862 				      (u8 *)&mac->slot_time);
3863 	if (wireless_mode == WIRELESS_MODE_G)
3864 		sifs_timer = 0x0a;
3865 	else
3866 		sifs_timer = 0x0e;
3867 	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
3868 
3869 	r2t_sifs = 0xa;
3870 
3871 	if (wireless_mode == WIRELESS_MODE_AC_5G &&
3872 	    (mac->vht_ldpc_cap & LDPC_VHT_ENABLE_RX) &&
3873 	    (mac->vht_stbc_cap & STBC_VHT_ENABLE_RX)) {
3874 		if (mac->vendor == PEER_ATH)
3875 			r2t_sifs = 0x8;
3876 		else
3877 			r2t_sifs = 0xa;
3878 	} else if (wireless_mode == WIRELESS_MODE_AC_5G) {
3879 		r2t_sifs = 0xa;
3880 	}
3881 
3882 	rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_R2T_SIFS, (u8 *)&r2t_sifs);
3883 }
3884 
3885 bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
3886 {
3887 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3888 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3889 	struct rtl_phy *rtlphy = &rtlpriv->phy;
3890 	enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
3891 	u8 u1tmp = 0;
3892 	bool b_actuallyset = false;
3893 
3894 	if (rtlpriv->rtlhal.being_init_adapter)
3895 		return false;
3896 
3897 	if (ppsc->swrf_processing)
3898 		return false;
3899 
3900 	spin_lock(&rtlpriv->locks.rf_ps_lock);
3901 	if (ppsc->rfchange_inprogress) {
3902 		spin_unlock(&rtlpriv->locks.rf_ps_lock);
3903 		return false;
3904 	} else {
3905 		ppsc->rfchange_inprogress = true;
3906 		spin_unlock(&rtlpriv->locks.rf_ps_lock);
3907 	}
3908 
3909 	cur_rfstate = ppsc->rfpwr_state;
3910 
3911 	rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
3912 			rtl_read_byte(rtlpriv,
3913 					REG_GPIO_IO_SEL_2) & ~(BIT(1)));
3914 
3915 	u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
3916 
3917 	if (rtlphy->polarity_ctl)
3918 		e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
3919 	else
3920 		e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
3921 
3922 	if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
3923 		RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3924 			 "GPIOChangeRF  - HW Radio ON, RF ON\n");
3925 
3926 		e_rfpowerstate_toset = ERFON;
3927 		ppsc->hwradiooff = false;
3928 		b_actuallyset = true;
3929 	} else if ((!ppsc->hwradiooff)
3930 		   && (e_rfpowerstate_toset == ERFOFF)) {
3931 		RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3932 			 "GPIOChangeRF  - HW Radio OFF, RF OFF\n");
3933 
3934 		e_rfpowerstate_toset = ERFOFF;
3935 		ppsc->hwradiooff = true;
3936 		b_actuallyset = true;
3937 	}
3938 
3939 	if (b_actuallyset) {
3940 		spin_lock(&rtlpriv->locks.rf_ps_lock);
3941 		ppsc->rfchange_inprogress = false;
3942 		spin_unlock(&rtlpriv->locks.rf_ps_lock);
3943 	} else {
3944 		if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
3945 			RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3946 
3947 		spin_lock(&rtlpriv->locks.rf_ps_lock);
3948 		ppsc->rfchange_inprogress = false;
3949 		spin_unlock(&rtlpriv->locks.rf_ps_lock);
3950 	}
3951 
3952 	*valid = 1;
3953 	return !ppsc->hwradiooff;
3954 }
3955 
3956 void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index,
3957 		     u8 *p_macaddr, bool is_group, u8 enc_algo,
3958 		     bool is_wepkey, bool clear_all)
3959 {
3960 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3961 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3962 	struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3963 	u8 *macaddr = p_macaddr;
3964 	u32 entry_id = 0;
3965 	bool is_pairwise = false;
3966 
3967 	static u8 cam_const_addr[4][6] = {
3968 		{0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3969 		{0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3970 		{0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3971 		{0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
3972 	};
3973 	static u8 cam_const_broad[] = {
3974 		0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3975 	};
3976 
3977 	if (clear_all) {
3978 		u8 idx = 0;
3979 		u8 cam_offset = 0;
3980 		u8 clear_number = 5;
3981 
3982 		RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
3983 
3984 		for (idx = 0; idx < clear_number; idx++) {
3985 			rtl_cam_mark_invalid(hw, cam_offset + idx);
3986 			rtl_cam_empty_entry(hw, cam_offset + idx);
3987 
3988 			if (idx < 5) {
3989 				memset(rtlpriv->sec.key_buf[idx], 0,
3990 				       MAX_KEY_LEN);
3991 				rtlpriv->sec.key_len[idx] = 0;
3992 			}
3993 		}
3994 	} else {
3995 		switch (enc_algo) {
3996 		case WEP40_ENCRYPTION:
3997 			enc_algo = CAM_WEP40;
3998 			break;
3999 		case WEP104_ENCRYPTION:
4000 			enc_algo = CAM_WEP104;
4001 			break;
4002 		case TKIP_ENCRYPTION:
4003 			enc_algo = CAM_TKIP;
4004 			break;
4005 		case AESCCMP_ENCRYPTION:
4006 			enc_algo = CAM_AES;
4007 			break;
4008 		default:
4009 			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
4010 				 "switch case not process\n");
4011 			enc_algo = CAM_TKIP;
4012 			break;
4013 		}
4014 
4015 		if (is_wepkey || rtlpriv->sec.use_defaultkey) {
4016 			macaddr = cam_const_addr[key_index];
4017 			entry_id = key_index;
4018 		} else {
4019 			if (is_group) {
4020 				macaddr = cam_const_broad;
4021 				entry_id = key_index;
4022 			} else {
4023 				if (mac->opmode == NL80211_IFTYPE_AP) {
4024 					entry_id = rtl_cam_get_free_entry(hw, p_macaddr);
4025 					if (entry_id >=  TOTAL_CAM_ENTRY) {
4026 						RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
4027 							 "Can not find free hwsecurity cam entry\n");
4028 						return;
4029 					}
4030 				} else {
4031 					entry_id = CAM_PAIRWISE_KEY_POSITION;
4032 				}
4033 
4034 				key_index = PAIRWISE_KEYIDX;
4035 				is_pairwise = true;
4036 			}
4037 		}
4038 
4039 		if (rtlpriv->sec.key_len[key_index] == 0) {
4040 			RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4041 				 "delete one entry, entry_id is %d\n",
4042 				 entry_id);
4043 			if (mac->opmode == NL80211_IFTYPE_AP)
4044 				rtl_cam_del_entry(hw, p_macaddr);
4045 			rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
4046 		} else {
4047 			RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4048 				 "add one entry\n");
4049 			if (is_pairwise) {
4050 				RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4051 					 "set Pairwise key\n");
4052 
4053 				rtl_cam_add_one_entry(hw, macaddr, key_index,
4054 						      entry_id, enc_algo,
4055 						      CAM_CONFIG_NO_USEDK,
4056 						      rtlpriv->sec.key_buf[key_index]);
4057 			} else {
4058 				RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4059 					 "set group key\n");
4060 
4061 				if (mac->opmode == NL80211_IFTYPE_ADHOC) {
4062 					rtl_cam_add_one_entry(hw,
4063 							rtlefuse->dev_addr,
4064 							PAIRWISE_KEYIDX,
4065 							CAM_PAIRWISE_KEY_POSITION,
4066 							enc_algo,
4067 							CAM_CONFIG_NO_USEDK,
4068 							rtlpriv->sec.key_buf
4069 							[entry_id]);
4070 				}
4071 
4072 				rtl_cam_add_one_entry(hw, macaddr, key_index,
4073 						entry_id, enc_algo,
4074 						CAM_CONFIG_NO_USEDK,
4075 						rtlpriv->sec.key_buf[entry_id]);
4076 			}
4077 		}
4078 	}
4079 }
4080 
4081 void rtl8821ae_bt_reg_init(struct ieee80211_hw *hw)
4082 {
4083 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4084 
4085 	/* 0:Low, 1:High, 2:From Efuse. */
4086 	rtlpriv->btcoexist.reg_bt_iso = 2;
4087 	/* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
4088 	rtlpriv->btcoexist.reg_bt_sco = 3;
4089 	/* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
4090 	rtlpriv->btcoexist.reg_bt_sco = 0;
4091 }
4092 
4093 void rtl8821ae_bt_hw_init(struct ieee80211_hw *hw)
4094 {
4095 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4096 
4097 	if (rtlpriv->cfg->ops->get_btc_status())
4098 		rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
4099 }
4100 
4101 void rtl8821ae_suspend(struct ieee80211_hw *hw)
4102 {
4103 }
4104 
4105 void rtl8821ae_resume(struct ieee80211_hw *hw)
4106 {
4107 }
4108 
4109 /* Turn on AAP (RCR:bit 0) for promicuous mode. */
4110 void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw,
4111 	bool allow_all_da, bool write_into_reg)
4112 {
4113 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4114 	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
4115 
4116 	if (allow_all_da) /* Set BIT0 */
4117 		rtlpci->receive_config |= RCR_AAP;
4118 	else /* Clear BIT0 */
4119 		rtlpci->receive_config &= ~RCR_AAP;
4120 
4121 	if (write_into_reg)
4122 		rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
4123 
4124 	RT_TRACE(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD,
4125 		"receive_config=0x%08X, write_into_reg=%d\n",
4126 		rtlpci->receive_config, write_into_reg);
4127 }
4128 
4129 /* WKFMCAMAddAllEntry8812 */
4130 void rtl8821ae_add_wowlan_pattern(struct ieee80211_hw *hw,
4131 				  struct rtl_wow_pattern *rtl_pattern,
4132 				  u8 index)
4133 {
4134 	struct rtl_priv *rtlpriv = rtl_priv(hw);
4135 	u32 cam = 0;
4136 	u8 addr = 0;
4137 	u16 rxbuf_addr;
4138 	u8 tmp, count = 0;
4139 	u16 cam_start;
4140 	u16 offset;
4141 
4142 	/* Count the WFCAM entry start offset. */
4143 
4144 	/* RX page size = 128 byte */
4145 	offset = MAX_RX_DMA_BUFFER_SIZE_8812 / 128;
4146 	/* We should start from the boundry */
4147 	cam_start = offset * 128;
4148 
4149 	/* Enable Rx packet buffer access. */
4150 	rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT);
4151 	for (addr = 0; addr < WKFMCAM_ADDR_NUM; addr++) {
4152 		/* Set Rx packet buffer offset.
4153 		 * RxBufer pointer increases 1,
4154 		 * we can access 8 bytes in Rx packet buffer.
4155 		 * CAM start offset (unit: 1 byte) =  index*WKFMCAM_SIZE
4156 		 * RxBufer addr = (CAM start offset +
4157 		 *                 per entry offset of a WKFM CAM)/8
4158 		 *	* index: The index of the wake up frame mask
4159 		 *	* WKFMCAM_SIZE: the total size of one WKFM CAM
4160 		 *	* per entry offset of a WKFM CAM: Addr*4 bytes
4161 		 */
4162 		rxbuf_addr = (cam_start + index * WKFMCAM_SIZE + addr * 4) >> 3;
4163 		/* Set R/W start offset */
4164 		rtl_write_word(rtlpriv, REG_PKTBUF_DBG_CTRL, rxbuf_addr);
4165 
4166 		if (addr == 0) {
4167 			cam = BIT(31) | rtl_pattern->crc;
4168 
4169 			if (rtl_pattern->type == UNICAST_PATTERN)
4170 				cam |= BIT(24);
4171 			else if (rtl_pattern->type == MULTICAST_PATTERN)
4172 				cam |= BIT(25);
4173 			else if (rtl_pattern->type == BROADCAST_PATTERN)
4174 				cam |= BIT(26);
4175 
4176 			rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam);
4177 			RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4178 				 "WRITE entry[%d] 0x%x: %x\n", addr,
4179 				  REG_PKTBUF_DBG_DATA_L, cam);
4180 
4181 			/* Write to Rx packet buffer. */
4182 			rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01);
4183 		} else if (addr == 2 || addr == 4) {/* WKFM[127:0] */
4184 			cam = rtl_pattern->mask[addr - 2];
4185 
4186 			rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam);
4187 			RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4188 				 "WRITE entry[%d] 0x%x: %x\n", addr,
4189 				  REG_PKTBUF_DBG_DATA_L, cam);
4190 
4191 			rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01);
4192 		} else if (addr == 3 || addr == 5) {/* WKFM[127:0] */
4193 			cam = rtl_pattern->mask[addr - 2];
4194 
4195 			rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_H, cam);
4196 			RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4197 				 "WRITE entry[%d] 0x%x: %x\n", addr,
4198 				  REG_PKTBUF_DBG_DATA_H, cam);
4199 
4200 			rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0xf001);
4201 		}
4202 
4203 		count = 0;
4204 		do {
4205 			tmp = rtl_read_byte(rtlpriv, REG_RXPKTBUF_CTRL);
4206 			udelay(2);
4207 			count++;
4208 		} while (tmp && count < 100);
4209 
4210 		RT_ASSERT((count < 100),
4211 			  "Write wake up frame mask FAIL %d value!\n", tmp);
4212 	}
4213 	/* Disable Rx packet buffer access. */
4214 	rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL,
4215 		       DISABLE_TRXPKT_BUF_ACCESS);
4216 }
4217