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
46static 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
68static 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
80void _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
93void _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
106static void _rtl8821ae_enable_bcn_sub_func(struct ieee80211_hw *hw)
107{
108	_rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(1));
109}
110
111static void _rtl8821ae_disable_bcn_sub_func(struct ieee80211_hw *hw)
112{
113	_rtl8821ae_set_bcn_ctrl_reg(hw, BIT(1), 0);
114}
115
116static 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	}
151change_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
186static 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
242static 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
250static 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
277static 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
309static 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
409void 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
488void 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
808static 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
835static 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
890static 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
918static 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
1031static 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
1080static 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
1099static 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
1114static 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
1135static 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
1157static 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
1183void 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
1225static 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
1241static 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
1265static 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
1365static 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
1450static 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
1474static 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
1505static 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
1657static 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
1683static 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
1706static 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
1737static 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
1799static 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
1818static 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
1873int 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
2024static 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
2126static 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
2191void 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
2213int 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 */
2233void 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
2256static 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
2270void 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
2291void 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
2302static 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
2370void 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
2495void 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
2508void 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
2529void 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
2542void 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
2559static 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
2612static 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
2781static 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
2867static 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
2954static 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
2994static 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
3026static 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
3067static 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
3091static 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
3116static 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 paln to world wide 13 */
3233	/* rtlefuse->channel_plan = (u8)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
3320void 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
3357static 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
3452static 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
3521static 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
3547static 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
3569static 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
3587static 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
3596static 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
3620static 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
3642static 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
3842void 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
3854void 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
3885bool 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
3956void 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
4081void 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
4093void 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
4101void rtl8821ae_suspend(struct ieee80211_hw *hw)
4102{
4103}
4104
4105void rtl8821ae_resume(struct ieee80211_hw *hw)
4106{
4107}
4108
4109/* Turn on AAP (RCR:bit 0) for promicuous mode. */
4110void 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 */
4130void 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