xref: /linux/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
103f3dd37SLarry Finger // SPDX-License-Identifier: GPL-2.0
203f3dd37SLarry Finger /* Copyright(c) 2009-2010  Realtek Corporation.*/
321e4b072SLarry Finger 
421e4b072SLarry Finger #include "../wifi.h"
521e4b072SLarry Finger #include "../pci.h"
621e4b072SLarry Finger #include "../base.h"
7557f9331SLarry Finger #include "../core.h"
889d32c90SLarry Finger #include "../efuse.h"
921e4b072SLarry Finger #include "reg.h"
1021e4b072SLarry Finger #include "def.h"
1121e4b072SLarry Finger #include "fw.h"
1221e4b072SLarry Finger #include "dm.h"
1321e4b072SLarry Finger 
_rtl8821ae_enable_fw_download(struct ieee80211_hw * hw,bool enable)1421e4b072SLarry Finger static void _rtl8821ae_enable_fw_download(struct ieee80211_hw *hw, bool enable)
1521e4b072SLarry Finger {
1621e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1721e4b072SLarry Finger 	u8 tmp;
1821e4b072SLarry Finger 
1921e4b072SLarry Finger 	if (enable) {
2021e4b072SLarry Finger 		rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x05);
2121e4b072SLarry Finger 
2221e4b072SLarry Finger 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
2321e4b072SLarry Finger 		rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
2421e4b072SLarry Finger 
2521e4b072SLarry Finger 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
2621e4b072SLarry Finger 	} else {
2721e4b072SLarry Finger 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
2821e4b072SLarry Finger 		rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
2921e4b072SLarry Finger 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
3021e4b072SLarry Finger 	}
3121e4b072SLarry Finger }
3221e4b072SLarry Finger 
_rtl8821ae_write_fw(struct ieee80211_hw * hw,enum version_8821ae version,u8 * buffer,u32 size)3321e4b072SLarry Finger static void _rtl8821ae_write_fw(struct ieee80211_hw *hw,
3421e4b072SLarry Finger 				enum version_8821ae version,
3521e4b072SLarry Finger 				u8 *buffer, u32 size)
3621e4b072SLarry Finger {
3721e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
3821e4b072SLarry Finger 	u8 *bufferptr = (u8 *)buffer;
3921e4b072SLarry Finger 	u32 pagenums, remainsize;
4021e4b072SLarry Finger 	u32 page, offset;
4121e4b072SLarry Finger 
4298611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
4321e4b072SLarry Finger 
4489d32c90SLarry Finger 	rtl_fill_dummy(bufferptr, &size);
4521e4b072SLarry Finger 
4621e4b072SLarry Finger 	pagenums = size / FW_8821AE_PAGE_SIZE;
4721e4b072SLarry Finger 	remainsize = size % FW_8821AE_PAGE_SIZE;
4821e4b072SLarry Finger 
49c93ac39dSLarry Finger 	if (pagenums > 8)
50004a1e16SLarry Finger 		pr_err("Page numbers should not greater then 8\n");
5121e4b072SLarry Finger 
5221e4b072SLarry Finger 	for (page = 0; page < pagenums; page++) {
5321e4b072SLarry Finger 		offset = page * FW_8821AE_PAGE_SIZE;
5489d32c90SLarry Finger 		rtl_fw_page_write(hw, page, (bufferptr + offset),
5521e4b072SLarry Finger 				  FW_8821AE_PAGE_SIZE);
5621e4b072SLarry Finger 	}
5721e4b072SLarry Finger 
5821e4b072SLarry Finger 	if (remainsize) {
5921e4b072SLarry Finger 		offset = pagenums * FW_8821AE_PAGE_SIZE;
6021e4b072SLarry Finger 		page = pagenums;
6189d32c90SLarry Finger 		rtl_fw_page_write(hw, page, (bufferptr + offset), remainsize);
6221e4b072SLarry Finger 	}
6321e4b072SLarry Finger }
6421e4b072SLarry Finger 
_rtl8821ae_fw_free_to_go(struct ieee80211_hw * hw)6521e4b072SLarry Finger static int _rtl8821ae_fw_free_to_go(struct ieee80211_hw *hw)
6621e4b072SLarry Finger {
6721e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
6821e4b072SLarry Finger 	int err = -EIO;
6921e4b072SLarry Finger 	u32 counter = 0;
7021e4b072SLarry Finger 	u32 value32;
7121e4b072SLarry Finger 
7221e4b072SLarry Finger 	do {
7321e4b072SLarry Finger 		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
7421e4b072SLarry Finger 	} while ((counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT) &&
7521e4b072SLarry Finger 		 (!(value32 & FWDL_CHKSUM_RPT)));
7621e4b072SLarry Finger 
7721e4b072SLarry Finger 	if (counter >= FW_8821AE_POLLING_TIMEOUT_COUNT) {
7898611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
792cc8918eSColin Ian King 			"chksum report fail! REG_MCUFWDL:0x%08x .\n",
8021e4b072SLarry Finger 			value32);
8121e4b072SLarry Finger 		goto exit;
8221e4b072SLarry Finger 	}
8321e4b072SLarry Finger 	value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
8421e4b072SLarry Finger 	value32 |= MCUFWDL_RDY;
8521e4b072SLarry Finger 	value32 &= ~WINTINI_RDY;
8621e4b072SLarry Finger 	rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
8721e4b072SLarry Finger 
8821e4b072SLarry Finger 	rtl8821ae_firmware_selfreset(hw);
8921e4b072SLarry Finger 
9021e4b072SLarry Finger 	counter = 0;
9121e4b072SLarry Finger 	do {
9221e4b072SLarry Finger 		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
93c93ac39dSLarry Finger 		if (value32 & WINTINI_RDY)
94c93ac39dSLarry Finger 			return 0;
9521e4b072SLarry Finger 
9621e4b072SLarry Finger 		udelay(FW_8821AE_POLLING_DELAY);
9721e4b072SLarry Finger 	} while (counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT);
9821e4b072SLarry Finger 
99004a1e16SLarry Finger 	pr_err("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n",
10021e4b072SLarry Finger 	       value32);
10121e4b072SLarry Finger 
10221e4b072SLarry Finger exit:
10321e4b072SLarry Finger 	return err;
10421e4b072SLarry Finger }
10521e4b072SLarry Finger 
_rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv * rtlpriv)10621e4b072SLarry Finger static void _rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv *rtlpriv)
10721e4b072SLarry Finger {
10821e4b072SLarry Finger 	u8 val;
10921e4b072SLarry Finger 	u16 count = 0;
11021e4b072SLarry Finger 
11121e4b072SLarry Finger 	do {
11221e4b072SLarry Finger 		val = rtl_read_byte(rtlpriv, REG_HMETFR);
11321e4b072SLarry Finger 		mdelay(1);
11421e4b072SLarry Finger 		count++;
11521e4b072SLarry Finger 	} while ((val & 0x0F) && (count < 1000));
11621e4b072SLarry Finger }
11721e4b072SLarry Finger 
rtl8821ae_download_fw(struct ieee80211_hw * hw,bool buse_wake_on_wlan_fw)11821e4b072SLarry Finger int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
11921e4b072SLarry Finger {
12021e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
12121e4b072SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
122253f10abSLarry Finger 	struct rtlwifi_firmware_header *pfwheader;
12321e4b072SLarry Finger 	u8 *pfwdata;
12421e4b072SLarry Finger 	u32 fwsize;
12521e4b072SLarry Finger 	int err;
12621e4b072SLarry Finger 	bool support_remote_wakeup;
12721e4b072SLarry Finger 	enum version_8821ae version = rtlhal->version;
12821e4b072SLarry Finger 
12921e4b072SLarry Finger 	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
13021e4b072SLarry Finger 				      (u8 *)(&support_remote_wakeup));
13121e4b072SLarry Finger 
13221e4b072SLarry Finger 	if (support_remote_wakeup)
13321e4b072SLarry Finger 		_rtl8821ae_wait_for_h2c_cmd_finish(rtlpriv);
13421e4b072SLarry Finger 
13521e4b072SLarry Finger 	if (buse_wake_on_wlan_fw) {
13621e4b072SLarry Finger 		if (!rtlhal->wowlan_firmware)
13721e4b072SLarry Finger 			return 1;
13821e4b072SLarry Finger 
13921e4b072SLarry Finger 		pfwheader =
140253f10abSLarry Finger 		  (struct rtlwifi_firmware_header *)rtlhal->wowlan_firmware;
141253f10abSLarry Finger 		rtlhal->fw_version = le16_to_cpu(pfwheader->version);
14221e4b072SLarry Finger 		rtlhal->fw_subversion = pfwheader->subversion;
14321e4b072SLarry Finger 		pfwdata = (u8 *)rtlhal->wowlan_firmware;
14421e4b072SLarry Finger 		fwsize = rtlhal->wowlan_fwsize;
14521e4b072SLarry Finger 	} else {
14621e4b072SLarry Finger 		if (!rtlhal->pfirmware)
14721e4b072SLarry Finger 			return 1;
14821e4b072SLarry Finger 
14921e4b072SLarry Finger 		pfwheader =
150253f10abSLarry Finger 		  (struct rtlwifi_firmware_header *)rtlhal->pfirmware;
151253f10abSLarry Finger 		rtlhal->fw_version = le16_to_cpu(pfwheader->version);
15221e4b072SLarry Finger 		rtlhal->fw_subversion = pfwheader->subversion;
15321e4b072SLarry Finger 		pfwdata = (u8 *)rtlhal->pfirmware;
15421e4b072SLarry Finger 		fwsize = rtlhal->fwsize;
15521e4b072SLarry Finger 	}
15621e4b072SLarry Finger 
15798611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,
15821e4b072SLarry Finger 		"%s Firmware SIZE %d\n",
15921e4b072SLarry Finger 		buse_wake_on_wlan_fw ? "Wowlan" : "Normal", fwsize);
16021e4b072SLarry Finger 
16121e4b072SLarry Finger 	if (IS_FW_HEADER_EXIST_8812(pfwheader) ||
16221e4b072SLarry Finger 	    IS_FW_HEADER_EXIST_8821(pfwheader)) {
16398611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,
16421e4b072SLarry Finger 			"Firmware Version(%d), Signature(%#x)\n",
16521e4b072SLarry Finger 			pfwheader->version, pfwheader->signature);
16621e4b072SLarry Finger 
167253f10abSLarry Finger 		pfwdata = pfwdata + sizeof(struct rtlwifi_firmware_header);
168253f10abSLarry Finger 		fwsize = fwsize - sizeof(struct rtlwifi_firmware_header);
16921e4b072SLarry Finger 	}
17021e4b072SLarry Finger 
17121e4b072SLarry Finger 	if (rtlhal->mac_func_enable) {
17221e4b072SLarry Finger 		if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
17321e4b072SLarry Finger 			rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
17421e4b072SLarry Finger 			rtl8821ae_firmware_selfreset(hw);
17521e4b072SLarry Finger 		}
17621e4b072SLarry Finger 	}
17721e4b072SLarry Finger 	_rtl8821ae_enable_fw_download(hw, true);
17821e4b072SLarry Finger 	_rtl8821ae_write_fw(hw, version, pfwdata, fwsize);
17921e4b072SLarry Finger 	_rtl8821ae_enable_fw_download(hw, false);
18021e4b072SLarry Finger 
18121e4b072SLarry Finger 	err = _rtl8821ae_fw_free_to_go(hw);
18221e4b072SLarry Finger 	if (err) {
18398611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_ERR, DBG_DMESG,
18421e4b072SLarry Finger 			"Firmware is not ready to run!\n");
18521e4b072SLarry Finger 	} else {
18698611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD,
18721e4b072SLarry Finger 			"Firmware is ready to run!\n");
18821e4b072SLarry Finger 	}
18921e4b072SLarry Finger 
19021e4b072SLarry Finger 	return 0;
19121e4b072SLarry Finger }
19221e4b072SLarry Finger 
19321e4b072SLarry Finger #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw * hw,bool used_wowlan_fw)19421e4b072SLarry Finger void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
19521e4b072SLarry Finger 					 bool used_wowlan_fw)
19621e4b072SLarry Finger {
19721e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
19821e4b072SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
19921e4b072SLarry Finger 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
20021e4b072SLarry Finger 	/* 1. Before WoWLAN or After WOWLAN we need to re-download Fw. */
20121e4b072SLarry Finger 	if (rtl8821ae_download_fw(hw, used_wowlan_fw)) {
20298611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
20321e4b072SLarry Finger 			"Re-Download Firmware failed!!\n");
20421e4b072SLarry Finger 		rtlhal->fw_ready = false;
20521e4b072SLarry Finger 		return;
20621e4b072SLarry Finger 	}
20798611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
20821e4b072SLarry Finger 		"Re-Download Firmware Success !!\n");
20921e4b072SLarry Finger 	rtlhal->fw_ready = true;
21021e4b072SLarry Finger 
21121e4b072SLarry Finger 	/* 2. Re-Init the variables about Fw related setting. */
21221e4b072SLarry Finger 	ppsc->fw_current_inpsmode = false;
21321e4b072SLarry Finger 	rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
21421e4b072SLarry Finger 	rtlhal->fw_clk_change_in_progress = false;
21521e4b072SLarry Finger 	rtlhal->allow_sw_to_change_hwclc = false;
21621e4b072SLarry Finger 	rtlhal->last_hmeboxnum = 0;
21721e4b072SLarry Finger }
21821e4b072SLarry Finger #endif
21921e4b072SLarry Finger 
_rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw * hw,u8 boxnum)22021e4b072SLarry Finger static bool _rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw *hw,
22121e4b072SLarry Finger 					      u8 boxnum)
22221e4b072SLarry Finger {
22321e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
22421e4b072SLarry Finger 	u8 val_hmetfr;
22521e4b072SLarry Finger 	bool result = false;
22621e4b072SLarry Finger 
22721e4b072SLarry Finger 	val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
22821e4b072SLarry Finger 	if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
22921e4b072SLarry Finger 		result = true;
23021e4b072SLarry Finger 	return result;
23121e4b072SLarry Finger }
23221e4b072SLarry Finger 
_rtl8821ae_fill_h2c_command(struct ieee80211_hw * hw,u8 element_id,u32 cmd_len,u8 * cmdbuffer)23321e4b072SLarry Finger static void _rtl8821ae_fill_h2c_command(struct ieee80211_hw *hw,
23421e4b072SLarry Finger 					u8 element_id, u32 cmd_len,
23521e4b072SLarry Finger 					u8 *cmdbuffer)
23621e4b072SLarry Finger {
23721e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
23821e4b072SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
23921e4b072SLarry Finger 	u8 boxnum = 0;
24021e4b072SLarry Finger 	u16 box_reg = 0, box_extreg = 0;
24121e4b072SLarry Finger 	u8 u1b_tmp = 0;
24221e4b072SLarry Finger 	bool isfw_read = false;
24321e4b072SLarry Finger 	u8 buf_index = 0;
24421e4b072SLarry Finger 	bool bwrite_sucess = false;
24521e4b072SLarry Finger 	u8 wait_h2c_limmit = 100;
24621e4b072SLarry Finger 	/*u8 wait_writeh2c_limmit = 100;*/
24721e4b072SLarry Finger 	u8 boxcontent[4], boxextcontent[4];
24821e4b072SLarry Finger 	u32 h2c_waitcounter = 0;
24921e4b072SLarry Finger 	unsigned long flag = 0;
25021e4b072SLarry Finger 	u8 idx = 0;
25121e4b072SLarry Finger 
25298611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
25321e4b072SLarry Finger 
25421e4b072SLarry Finger 	while (true) {
25521e4b072SLarry Finger 		spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
25621e4b072SLarry Finger 		if (rtlhal->h2c_setinprogress) {
25798611b00SLarry Finger 			rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
25821e4b072SLarry Finger 				"H2C set in progress! Wait to set..element_id(%d).\n",
25921e4b072SLarry Finger 				element_id);
26021e4b072SLarry Finger 
26121e4b072SLarry Finger 			while (rtlhal->h2c_setinprogress) {
26221e4b072SLarry Finger 				spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
26321e4b072SLarry Finger 						       flag);
26421e4b072SLarry Finger 				h2c_waitcounter++;
26598611b00SLarry Finger 				rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
26621e4b072SLarry Finger 					"Wait 100 us (%d times)...\n",
26721e4b072SLarry Finger 					h2c_waitcounter);
26821e4b072SLarry Finger 				udelay(100);
26921e4b072SLarry Finger 
27021e4b072SLarry Finger 				if (h2c_waitcounter > 1000)
27121e4b072SLarry Finger 					return;
27221e4b072SLarry Finger 				spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
27321e4b072SLarry Finger 						  flag);
27421e4b072SLarry Finger 			}
27521e4b072SLarry Finger 			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
27621e4b072SLarry Finger 		} else {
27721e4b072SLarry Finger 			rtlhal->h2c_setinprogress = true;
27821e4b072SLarry Finger 			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
27921e4b072SLarry Finger 			break;
28021e4b072SLarry Finger 		}
28121e4b072SLarry Finger 	}
28221e4b072SLarry Finger 
28321e4b072SLarry Finger 	while (!bwrite_sucess) {
28421e4b072SLarry Finger 		boxnum = rtlhal->last_hmeboxnum;
28521e4b072SLarry Finger 		switch (boxnum) {
28621e4b072SLarry Finger 		case 0:
28721e4b072SLarry Finger 			box_reg = REG_HMEBOX_0;
28821e4b072SLarry Finger 			box_extreg = REG_HMEBOX_EXT_0;
28921e4b072SLarry Finger 			break;
29021e4b072SLarry Finger 		case 1:
29121e4b072SLarry Finger 			box_reg = REG_HMEBOX_1;
29221e4b072SLarry Finger 			box_extreg = REG_HMEBOX_EXT_1;
29321e4b072SLarry Finger 			break;
29421e4b072SLarry Finger 		case 2:
29521e4b072SLarry Finger 			box_reg = REG_HMEBOX_2;
29621e4b072SLarry Finger 			box_extreg = REG_HMEBOX_EXT_2;
29721e4b072SLarry Finger 			break;
29821e4b072SLarry Finger 		case 3:
29921e4b072SLarry Finger 			box_reg = REG_HMEBOX_3;
30021e4b072SLarry Finger 			box_extreg = REG_HMEBOX_EXT_3;
30121e4b072SLarry Finger 			break;
30221e4b072SLarry Finger 		default:
30398611b00SLarry Finger 			rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
304ad574889SJoe Perches 				"switch case %#x not processed\n", boxnum);
30521e4b072SLarry Finger 			break;
30621e4b072SLarry Finger 		}
30721e4b072SLarry Finger 
30821e4b072SLarry Finger 		isfw_read = false;
30921e4b072SLarry Finger 		u1b_tmp = rtl_read_byte(rtlpriv, REG_CR);
31021e4b072SLarry Finger 
31121e4b072SLarry Finger 		if (u1b_tmp != 0xEA) {
31221e4b072SLarry Finger 			isfw_read = true;
31321e4b072SLarry Finger 		} else {
31421e4b072SLarry Finger 			if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xEA ||
31521e4b072SLarry Finger 			    rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xEA)
31621e4b072SLarry Finger 				rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xFF);
31721e4b072SLarry Finger 		}
31821e4b072SLarry Finger 
31921e4b072SLarry Finger 		if (isfw_read) {
32021e4b072SLarry Finger 			wait_h2c_limmit = 100;
32121e4b072SLarry Finger 			isfw_read =
32221e4b072SLarry Finger 			  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
32321e4b072SLarry Finger 			while (!isfw_read) {
32421e4b072SLarry Finger 				/*wait until Fw read*/
32521e4b072SLarry Finger 				wait_h2c_limmit--;
32621e4b072SLarry Finger 				if (wait_h2c_limmit == 0) {
32798611b00SLarry Finger 					rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
32821e4b072SLarry Finger 						"Waiting too long for FW read clear HMEBox(%d)!\n",
32921e4b072SLarry Finger 						boxnum);
33021e4b072SLarry Finger 					break;
33121e4b072SLarry Finger 				}
33221e4b072SLarry Finger 
33321e4b072SLarry Finger 				udelay(10);
33421e4b072SLarry Finger 
33521e4b072SLarry Finger 				isfw_read =
33621e4b072SLarry Finger 				  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
33721e4b072SLarry Finger 				u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
33898611b00SLarry Finger 				rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
33921e4b072SLarry Finger 					"Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
34021e4b072SLarry Finger 					boxnum, u1b_tmp);
34121e4b072SLarry Finger 			}
34221e4b072SLarry Finger 		}
34321e4b072SLarry Finger 
34421e4b072SLarry Finger 		if (!isfw_read) {
34598611b00SLarry Finger 			rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
34621e4b072SLarry Finger 				"Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
34721e4b072SLarry Finger 				boxnum);
34821e4b072SLarry Finger 			break;
34921e4b072SLarry Finger 		}
35021e4b072SLarry Finger 
35121e4b072SLarry Finger 		memset(boxcontent, 0, sizeof(boxcontent));
35221e4b072SLarry Finger 		memset(boxextcontent, 0, sizeof(boxextcontent));
35321e4b072SLarry Finger 		boxcontent[0] = element_id;
35498611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
35521e4b072SLarry Finger 			"Write element_id box_reg(%4x) = %2x\n",
35621e4b072SLarry Finger 			box_reg, element_id);
35721e4b072SLarry Finger 
35821e4b072SLarry Finger 		switch (cmd_len) {
35921e4b072SLarry Finger 		case 1:
36021e4b072SLarry Finger 		case 2:
36121e4b072SLarry Finger 		case 3:
36221e4b072SLarry Finger 			/*boxcontent[0] &= ~(BIT(7));*/
36321e4b072SLarry Finger 			memcpy((u8 *)(boxcontent) + 1,
36421e4b072SLarry Finger 			       cmdbuffer + buf_index, cmd_len);
36521e4b072SLarry Finger 
36621e4b072SLarry Finger 			for (idx = 0; idx < 4; idx++) {
36721e4b072SLarry Finger 				rtl_write_byte(rtlpriv, box_reg + idx,
36821e4b072SLarry Finger 					       boxcontent[idx]);
36921e4b072SLarry Finger 			}
37021e4b072SLarry Finger 			break;
37121e4b072SLarry Finger 		case 4:
37221e4b072SLarry Finger 		case 5:
37321e4b072SLarry Finger 		case 6:
37421e4b072SLarry Finger 		case 7:
37521e4b072SLarry Finger 			/*boxcontent[0] |= (BIT(7));*/
37621e4b072SLarry Finger 			memcpy((u8 *)(boxextcontent),
37721e4b072SLarry Finger 			       cmdbuffer + buf_index+3, cmd_len-3);
37821e4b072SLarry Finger 			memcpy((u8 *)(boxcontent) + 1,
37921e4b072SLarry Finger 			       cmdbuffer + buf_index, 3);
38021e4b072SLarry Finger 
38121e4b072SLarry Finger 			for (idx = 0; idx < 4; idx++) {
38221e4b072SLarry Finger 				rtl_write_byte(rtlpriv, box_extreg + idx,
38321e4b072SLarry Finger 					       boxextcontent[idx]);
38421e4b072SLarry Finger 			}
38521e4b072SLarry Finger 
38621e4b072SLarry Finger 			for (idx = 0; idx < 4; idx++) {
38721e4b072SLarry Finger 				rtl_write_byte(rtlpriv, box_reg + idx,
38821e4b072SLarry Finger 					       boxcontent[idx]);
38921e4b072SLarry Finger 			}
39021e4b072SLarry Finger 			break;
39121e4b072SLarry Finger 		default:
39298611b00SLarry Finger 			rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
393ad574889SJoe Perches 				"switch case %#x not processed\n", cmd_len);
39421e4b072SLarry Finger 			break;
39521e4b072SLarry Finger 		}
39621e4b072SLarry Finger 
39721e4b072SLarry Finger 		bwrite_sucess = true;
39821e4b072SLarry Finger 
39921e4b072SLarry Finger 		rtlhal->last_hmeboxnum = boxnum + 1;
40021e4b072SLarry Finger 		if (rtlhal->last_hmeboxnum == 4)
40121e4b072SLarry Finger 			rtlhal->last_hmeboxnum = 0;
40221e4b072SLarry Finger 
40398611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
40421e4b072SLarry Finger 			"pHalData->last_hmeboxnum  = %d\n",
40521e4b072SLarry Finger 			rtlhal->last_hmeboxnum);
40621e4b072SLarry Finger 	}
40721e4b072SLarry Finger 
40821e4b072SLarry Finger 	spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
40921e4b072SLarry Finger 	rtlhal->h2c_setinprogress = false;
41021e4b072SLarry Finger 	spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
41121e4b072SLarry Finger 
41298611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
41321e4b072SLarry Finger }
41421e4b072SLarry Finger 
rtl8821ae_fill_h2c_cmd(struct ieee80211_hw * hw,u8 element_id,u32 cmd_len,u8 * cmdbuffer)41521e4b072SLarry Finger void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw,
41621e4b072SLarry Finger 			    u8 element_id, u32 cmd_len, u8 *cmdbuffer)
41721e4b072SLarry Finger {
41821e4b072SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
41921e4b072SLarry Finger 	u32 tmp_cmdbuf[2];
42021e4b072SLarry Finger 
42121e4b072SLarry Finger 	if (!rtlhal->fw_ready) {
422531940f9SLarry Finger 		WARN_ONCE(true,
423531940f9SLarry Finger 			  "rtl8821ae: error H2C cmd because of Fw download fail!!!\n");
42421e4b072SLarry Finger 		return;
42521e4b072SLarry Finger 	}
42621e4b072SLarry Finger 
42721e4b072SLarry Finger 	memset(tmp_cmdbuf, 0, 8);
42821e4b072SLarry Finger 	memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
42921e4b072SLarry Finger 	_rtl8821ae_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
43021e4b072SLarry Finger }
43121e4b072SLarry Finger 
rtl8821ae_firmware_selfreset(struct ieee80211_hw * hw)43221e4b072SLarry Finger void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw)
43321e4b072SLarry Finger {
43421e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
43521e4b072SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
43621e4b072SLarry Finger 	u8 u1b_tmp;
43721e4b072SLarry Finger 
43821e4b072SLarry Finger 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
43921e4b072SLarry Finger 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
44021e4b072SLarry Finger 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
44121e4b072SLarry Finger 	} else {
44221e4b072SLarry Finger 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
44321e4b072SLarry Finger 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(0))));
44421e4b072SLarry Finger 	}
44521e4b072SLarry Finger 
44621e4b072SLarry Finger 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
44721e4b072SLarry Finger 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
44821e4b072SLarry Finger 	udelay(50);
44921e4b072SLarry Finger 
45021e4b072SLarry Finger 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
45121e4b072SLarry Finger 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
45221e4b072SLarry Finger 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
45321e4b072SLarry Finger 	} else {
45421e4b072SLarry Finger 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
45521e4b072SLarry Finger 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(0)));
45621e4b072SLarry Finger 	}
45721e4b072SLarry Finger 
45821e4b072SLarry Finger 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
45921e4b072SLarry Finger 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
46021e4b072SLarry Finger 
46198611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
46221e4b072SLarry Finger 		"_8051Reset8812ae(): 8051 reset success .\n");
46321e4b072SLarry Finger }
46421e4b072SLarry Finger 
rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw * hw,u8 mode)46521e4b072SLarry Finger void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
46621e4b072SLarry Finger {
46721e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
46821e4b072SLarry Finger 	u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 };
46921e4b072SLarry Finger 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
47042213f2fSPing-Ke Shih 	u8 rlbm, power_state = 0, byte5 = 0;
47142213f2fSPing-Ke Shih 	u8 awake_intvl;	/* DTIM = (awake_intvl - 1) */
47254685f9cSPing-Ke Shih 	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
47342213f2fSPing-Ke Shih 	bool bt_ctrl_lps = (rtlpriv->cfg->ops->get_btc_status() ?
47442213f2fSPing-Ke Shih 			    btc_ops->btc_is_bt_ctrl_lps(rtlpriv) : false);
475135f4fbdSPing-Ke Shih 	bool bt_lps_on = (rtlpriv->cfg->ops->get_btc_status() ?
476135f4fbdSPing-Ke Shih 			  btc_ops->btc_is_bt_lps_on(rtlpriv) : false);
477135f4fbdSPing-Ke Shih 
478135f4fbdSPing-Ke Shih 	if (bt_ctrl_lps)
479135f4fbdSPing-Ke Shih 		mode = (bt_lps_on ? FW_PS_MIN_MODE : FW_PS_ACTIVE_MODE);
48021e4b072SLarry Finger 
48198611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG, "FW LPS mode = %d (coex:%d)\n",
48242213f2fSPing-Ke Shih 		mode, bt_ctrl_lps);
48342213f2fSPing-Ke Shih 
48442213f2fSPing-Ke Shih 	switch (mode) {
48542213f2fSPing-Ke Shih 	case FW_PS_MIN_MODE:
48642213f2fSPing-Ke Shih 		rlbm = 0;
48742213f2fSPing-Ke Shih 		awake_intvl = 2;
48842213f2fSPing-Ke Shih 		break;
48942213f2fSPing-Ke Shih 	case FW_PS_MAX_MODE:
49042213f2fSPing-Ke Shih 		rlbm = 1;
49142213f2fSPing-Ke Shih 		awake_intvl = 2;
49242213f2fSPing-Ke Shih 		break;
49342213f2fSPing-Ke Shih 	case FW_PS_DTIM_MODE:
49442213f2fSPing-Ke Shih 		rlbm = 2;
49542213f2fSPing-Ke Shih 		awake_intvl = ppsc->reg_max_lps_awakeintvl;
49642213f2fSPing-Ke Shih 		/* hw->conf.ps_dtim_period or mac->vif->bss_conf.dtim_period
49742213f2fSPing-Ke Shih 		 * is only used in swlps.
49842213f2fSPing-Ke Shih 		 */
49942213f2fSPing-Ke Shih 		break;
50042213f2fSPing-Ke Shih 	default:
50142213f2fSPing-Ke Shih 		rlbm = 2;
50242213f2fSPing-Ke Shih 		awake_intvl = 4;
50342213f2fSPing-Ke Shih 		break;
50442213f2fSPing-Ke Shih 	}
50542213f2fSPing-Ke Shih 
50642213f2fSPing-Ke Shih 	if (rtlpriv->mac80211.p2p) {
50742213f2fSPing-Ke Shih 		awake_intvl = 2;
50842213f2fSPing-Ke Shih 		rlbm = 1;
50942213f2fSPing-Ke Shih 	}
51042213f2fSPing-Ke Shih 
51142213f2fSPing-Ke Shih 	if (mode == FW_PS_ACTIVE_MODE) {
51242213f2fSPing-Ke Shih 		byte5 = 0x40;
51342213f2fSPing-Ke Shih 		power_state = FW_PWR_STATE_ACTIVE;
51442213f2fSPing-Ke Shih 	} else {
51542213f2fSPing-Ke Shih 		if (bt_ctrl_lps) {
51642213f2fSPing-Ke Shih 			byte5 = btc_ops->btc_get_lps_val(rtlpriv);
51742213f2fSPing-Ke Shih 			power_state = btc_ops->btc_get_rpwm_val(rtlpriv);
51842213f2fSPing-Ke Shih 
51942213f2fSPing-Ke Shih 			if ((rlbm == 2) && (byte5 & BIT(4))) {
52042213f2fSPing-Ke Shih 				/* Keep awake interval to 1 to prevent from
52142213f2fSPing-Ke Shih 				 * decreasing coex performance
52242213f2fSPing-Ke Shih 				 */
52342213f2fSPing-Ke Shih 				awake_intvl = 2;
52442213f2fSPing-Ke Shih 				rlbm = 2;
52542213f2fSPing-Ke Shih 			}
52642213f2fSPing-Ke Shih 		} else {
52742213f2fSPing-Ke Shih 			byte5 = 0x40;
52842213f2fSPing-Ke Shih 			power_state = FW_PWR_STATE_RF_OFF;
52942213f2fSPing-Ke Shih 		}
53042213f2fSPing-Ke Shih 	}
53121e4b072SLarry Finger 
53221e4b072SLarry Finger 	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
53321e4b072SLarry Finger 	SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
53421e4b072SLarry Finger 	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
535135f4fbdSPing-Ke Shih 					 bt_ctrl_lps ? 0 :
536135f4fbdSPing-Ke Shih 					 ((rtlpriv->mac80211.p2p) ?
537135f4fbdSPing-Ke Shih 					  ppsc->smart_ps : 1));
53821e4b072SLarry Finger 	SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
53942213f2fSPing-Ke Shih 					       awake_intvl);
54021e4b072SLarry Finger 	SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
54121e4b072SLarry Finger 	SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
54254685f9cSPing-Ke Shih 	SET_H2CCMD_PWRMODE_PARM_BYTE5(u1_h2c_set_pwrmode, byte5);
54321e4b072SLarry Finger 
54421e4b072SLarry Finger 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
54521e4b072SLarry Finger 		      "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
54621e4b072SLarry Finger 		      u1_h2c_set_pwrmode, H2C_8821AE_PWEMODE_LENGTH);
54754685f9cSPing-Ke Shih 	if (rtlpriv->cfg->ops->get_btc_status())
54854685f9cSPing-Ke Shih 		btc_ops->btc_record_pwr_mode(rtlpriv, u1_h2c_set_pwrmode,
54954685f9cSPing-Ke Shih 					     H2C_8821AE_PWEMODE_LENGTH);
55021e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_SETPWRMODE,
55121e4b072SLarry Finger 			       H2C_8821AE_PWEMODE_LENGTH,
55221e4b072SLarry Finger 			       u1_h2c_set_pwrmode);
55321e4b072SLarry Finger }
55421e4b072SLarry Finger 
rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw * hw,u8 mstatus)55521e4b072SLarry Finger void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,
55621e4b072SLarry Finger 					   u8 mstatus)
55721e4b072SLarry Finger {
55821e4b072SLarry Finger 	u8 parm[3] = { 0, 0, 0 };
55921e4b072SLarry Finger 	/* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect
56021e4b072SLarry Finger 	 *          bit1=0-->update Media Status to MACID
56121e4b072SLarry Finger 	 *          bit1=1-->update Media Status from MACID to MACID_End
56221e4b072SLarry Finger 	 * parm[1]: MACID, if this is INFRA_STA, MacID = 0
56321e4b072SLarry Finger 	 * parm[2]: MACID_End
56421e4b072SLarry Finger 	 */
56521e4b072SLarry Finger 
56621e4b072SLarry Finger 	SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus);
56721e4b072SLarry Finger 	SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0);
56821e4b072SLarry Finger 
56921e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_MSRRPT, 3, parm);
57021e4b072SLarry Finger }
57121e4b072SLarry Finger 
rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw * hw,u8 ap_offload_enable)57221e4b072SLarry Finger void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
57321e4b072SLarry Finger 				      u8 ap_offload_enable)
57421e4b072SLarry Finger {
57521e4b072SLarry Finger 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
57621e4b072SLarry Finger 	u8 u1_apoffload_parm[H2C_8821AE_AP_OFFLOAD_LENGTH] = { 0 };
57721e4b072SLarry Finger 
57821e4b072SLarry Finger 	SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable);
57921e4b072SLarry Finger 	SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
58021e4b072SLarry Finger 	SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
58121e4b072SLarry Finger 
58221e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AP_OFFLOAD,
58321e4b072SLarry Finger 			       H2C_8821AE_AP_OFFLOAD_LENGTH,
58421e4b072SLarry Finger 			       u1_apoffload_parm);
58521e4b072SLarry Finger }
58621e4b072SLarry Finger 
rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw * hw,bool func_en)58721e4b072SLarry Finger void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en)
58821e4b072SLarry Finger {
58921e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
59021e4b072SLarry Finger 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
59121e4b072SLarry Finger 	u8 fw_wowlan_info[H2C_8821AE_WOWLAN_LENGTH] = {0};
59221e4b072SLarry Finger 
59398611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "enable(%d)\n", func_en);
59421e4b072SLarry Finger 
59521e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(fw_wowlan_info,
59621e4b072SLarry Finger 					   (func_en ? true : false));
59721e4b072SLarry Finger 
59821e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(fw_wowlan_info,
59921e4b072SLarry Finger 		((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) ? 1 : 0));
60021e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(fw_wowlan_info,
60121e4b072SLarry Finger 		((ppsc->wo_wlan_mode & WAKE_ON_MAGIC_PACKET) ? 1 : 0));
60221e4b072SLarry Finger 
60321e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(fw_wowlan_info, 0);
60421e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(fw_wowlan_info, false);
60521e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(fw_wowlan_info, 0);
60621e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(fw_wowlan_info, 1);
60721e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_GPIONUM(fw_wowlan_info, 0);
60821e4b072SLarry Finger 	SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(fw_wowlan_info, 0);
60921e4b072SLarry Finger 
61021e4b072SLarry Finger 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_DMESG,
61121e4b072SLarry Finger 		      "wowlan mode: cmd 0x80: Content:\n",
61221e4b072SLarry Finger 		      fw_wowlan_info, H2C_8821AE_WOWLAN_LENGTH);
61321e4b072SLarry Finger 
61421e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_WO_WLAN,
61521e4b072SLarry Finger 			       H2C_8821AE_WOWLAN_LENGTH,
61621e4b072SLarry Finger 			       fw_wowlan_info);
61721e4b072SLarry Finger }
61821e4b072SLarry Finger 
rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw * hw,u8 enable)61921e4b072SLarry Finger void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,
62021e4b072SLarry Finger 					   u8 enable)
62121e4b072SLarry Finger {
62221e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
62321e4b072SLarry Finger 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
62421e4b072SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
62521e4b072SLarry Finger 	u8 remote_wake_ctrl_parm[H2C_8821AE_REMOTE_WAKE_CTRL_LEN] = {0};
62621e4b072SLarry Finger 
62798611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
62821e4b072SLarry Finger 		"enable=%d, ARP offload=%d, GTK offload=%d\n",
62921e4b072SLarry Finger 		enable, ppsc->arp_offload_enable, ppsc->gtk_offload_enable);
63021e4b072SLarry Finger 
63121e4b072SLarry Finger 	SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(remote_wake_ctrl_parm, enable);
63221e4b072SLarry Finger 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(remote_wake_ctrl_parm,
63321e4b072SLarry Finger 					(ppsc->arp_offload_enable ? 1 : 0));
63421e4b072SLarry Finger 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(remote_wake_ctrl_parm,
63521e4b072SLarry Finger 					(ppsc->gtk_offload_enable ? 1 : 0));
63621e4b072SLarry Finger 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(remote_wake_ctrl_parm,
63721e4b072SLarry Finger 					(rtlhal->real_wow_v2_enable ? 1 : 0));
63821e4b072SLarry Finger 
63921e4b072SLarry Finger 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
64021e4b072SLarry Finger 		      "remote_wake_ctrl: cmd 0x4: Content:\n",
64121e4b072SLarry Finger 		      remote_wake_ctrl_parm, H2C_8821AE_REMOTE_WAKE_CTRL_LEN);
64221e4b072SLarry Finger 
64321e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_REMOTE_WAKE_CTRL,
64421e4b072SLarry Finger 			       H2C_8821AE_REMOTE_WAKE_CTRL_LEN,
64521e4b072SLarry Finger 			       remote_wake_ctrl_parm);
64621e4b072SLarry Finger }
64721e4b072SLarry Finger 
rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw * hw,bool func_en)64821e4b072SLarry Finger void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw,
64921e4b072SLarry Finger 				     bool func_en)
65021e4b072SLarry Finger {
65121e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
65221e4b072SLarry Finger 	u8 keep_alive_info[H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH] = {0};
65321e4b072SLarry Finger 
65498611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Enable(%d)\n", func_en);
65521e4b072SLarry Finger 
65621e4b072SLarry Finger 	SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(keep_alive_info, func_en);
65721e4b072SLarry Finger 	/* 1: the period is controled by driver, 0: by Fw default */
65821e4b072SLarry Finger 	SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(keep_alive_info, 1);
65921e4b072SLarry Finger 	SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(keep_alive_info, 10); /* 10 sec */
66021e4b072SLarry Finger 
66121e4b072SLarry Finger 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
66221e4b072SLarry Finger 		      "keep alive: cmd 0x3: Content:\n",
66321e4b072SLarry Finger 		      keep_alive_info, H2C_8821AE_KEEP_ALIVE_CTRL);
66421e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL,
66521e4b072SLarry Finger 			       H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH,
66621e4b072SLarry Finger 			       keep_alive_info);
66721e4b072SLarry Finger }
66821e4b072SLarry Finger 
rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw * hw,bool enabled)66921e4b072SLarry Finger void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
67021e4b072SLarry Finger 						   bool enabled)
67121e4b072SLarry Finger {
67221e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
67321e4b072SLarry Finger 	u8 parm[H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN] = {0};
67421e4b072SLarry Finger 
67521e4b072SLarry Finger 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(parm, enabled);
67621e4b072SLarry Finger 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(parm, 1);
67721e4b072SLarry Finger 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(parm, 30);
67821e4b072SLarry Finger 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(parm, 3);
67921e4b072SLarry Finger 
68021e4b072SLarry Finger 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
68121e4b072SLarry Finger 		      "disconnect_decision_ctrl: cmd 0x4: Content:\n",
68221e4b072SLarry Finger 		      parm, H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN);
68321e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_DISCONNECT_DECISION,
68421e4b072SLarry Finger 			       H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN, parm);
68521e4b072SLarry Finger }
68621e4b072SLarry Finger 
rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw * hw)68721e4b072SLarry Finger void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw)
68821e4b072SLarry Finger {
68921e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
69021e4b072SLarry Finger 	struct rtl_security *sec = &rtlpriv->sec;
69121e4b072SLarry Finger 	u8 remote_wakeup_sec_info[H2C_8821AE_AOAC_GLOBAL_INFO_LEN] = {0};
69221e4b072SLarry Finger 
69398611b00SLarry Finger 	rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
69421e4b072SLarry Finger 		"PairwiseEncAlgorithm=%d, GroupEncAlgorithm=%d\n",
69521e4b072SLarry Finger 		sec->pairwise_enc_algorithm, sec->group_enc_algorithm);
69621e4b072SLarry Finger 
69721e4b072SLarry Finger 	SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(
69821e4b072SLarry Finger 						remote_wakeup_sec_info,
69921e4b072SLarry Finger 						sec->pairwise_enc_algorithm);
70021e4b072SLarry Finger 	SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(remote_wakeup_sec_info,
70121e4b072SLarry Finger 						      sec->group_enc_algorithm);
70221e4b072SLarry Finger 
70321e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_GLOBAL_INFO,
70421e4b072SLarry Finger 			       H2C_8821AE_AOAC_GLOBAL_INFO_LEN,
70521e4b072SLarry Finger 			       remote_wakeup_sec_info);
70621e4b072SLarry Finger 
70721e4b072SLarry Finger 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_TRACE,
70821e4b072SLarry Finger 		      "rtl8821ae_set_global_info: cmd 0x82:\n",
70921e4b072SLarry Finger 		      remote_wakeup_sec_info, H2C_8821AE_AOAC_GLOBAL_INFO_LEN);
71021e4b072SLarry Finger }
71121e4b072SLarry Finger 
71221e4b072SLarry Finger #define BEACON_PG		0
71321e4b072SLarry Finger #define PSPOLL_PG		1
71421e4b072SLarry Finger #define NULL_PG			2
71521e4b072SLarry Finger #define QOSNULL_PG		3
71674a7dfbcSPing-Ke Shih #define BT_QOSNULL_PG	4
71774a7dfbcSPing-Ke Shih #define ARPRESP_PG		5
71874a7dfbcSPing-Ke Shih #define REMOTE_PG		6
71974a7dfbcSPing-Ke Shih #define GTKEXT_PG		7
72021e4b072SLarry Finger 
72174a7dfbcSPing-Ke Shih #define TOTAL_RESERVED_PKT_LEN_8812	4096
72274a7dfbcSPing-Ke Shih #define TOTAL_RESERVED_PKT_LEN_8821	2048
72321e4b072SLarry Finger 
72421e4b072SLarry Finger static u8 reserved_page_packet_8821[TOTAL_RESERVED_PKT_LEN_8821] = {
72521e4b072SLarry Finger 	/* page 0: beacon */
72621e4b072SLarry Finger 	0x80, 0x00, 0x00, 0x00,  0xff, 0xff, 0xff, 0xff,
72721e4b072SLarry Finger 	0xff, 0xff, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
72821e4b072SLarry Finger 	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 0x20, 0x00,
72921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
73021e4b072SLarry Finger 	0x64, 0x00, 0x20, 0x04,  0x00, 0x06, 0x64, 0x6c,
73121e4b072SLarry Finger 	0x69, 0x6e, 0x6b, 0x31,  0x01, 0x08, 0x82, 0x84,
73221e4b072SLarry Finger 	0x8b, 0x96, 0x0c, 0x18,  0x30, 0x48, 0x03, 0x01,
73321e4b072SLarry Finger 	0x0b, 0x06, 0x02, 0x00,  0x00, 0x2a, 0x01, 0x8b,
73421e4b072SLarry Finger 	0x32, 0x04, 0x12, 0x24,  0x60, 0x6c, 0x00, 0x00,
73521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
73621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
73721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
73821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
73921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
74921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
75021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
75121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
75221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
75321e4b072SLarry Finger 	0x10, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
75421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 0x00, 0x00,
75521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
75621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
75721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
75821e4b072SLarry Finger 	/* page 1: ps-poll */
75921e4b072SLarry Finger 	0xa4, 0x10, 0x01, 0xc0,  0x40, 0x16, 0x9f, 0x23,
76021e4b072SLarry Finger 	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
76121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
76221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
76321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
76421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
76521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
76621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
76721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
76821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
76921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
77921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78621e4b072SLarry Finger 	0x18, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
78721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
78821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
78921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
79021e4b072SLarry Finger 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
79121e4b072SLarry Finger 	/* page 2: null data */
79221e4b072SLarry Finger 	0x48, 0x01, 0x00, 0x00,  0x40, 0x16, 0x9f, 0x23,
79321e4b072SLarry Finger 	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
79421e4b072SLarry Finger 	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 0x00, 0x00,
79521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
79621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
79721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
79821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
79921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
80921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
81921e4b072SLarry Finger 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
82021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
82121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
82221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
82321e4b072SLarry Finger 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
82421e4b072SLarry Finger 	/* page 3: qos null data */
8259c66a7e5SLarry Finger 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
8269c66a7e5SLarry Finger 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
8279c66a7e5SLarry Finger 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
82821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
82921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
83921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
84921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
85021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
85121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
85274a7dfbcSPing-Ke Shih 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
85374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x80, 0x00,  0x00, 0x01, 0x00, 0x00,
85474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
85574a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
85674a7dfbcSPing-Ke Shih 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
85774a7dfbcSPing-Ke Shih 	/* page 4: BT qos null data */
8589c66a7e5SLarry Finger 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
8599c66a7e5SLarry Finger 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
8609c66a7e5SLarry Finger 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
86174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
86274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
86374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
86474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
86574a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
86674a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
86774a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
86874a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
86974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87574a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87674a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87774a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87874a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
87974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
88074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
88174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
88274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
88374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
88474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
88521e4b072SLarry Finger 	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
88621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
88721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
88821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
88921e4b072SLarry Finger 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
89074a7dfbcSPing-Ke Shih 	/* page 5~7 is for wowlan */
89174a7dfbcSPing-Ke Shih 	/* page 5: ARP resp */
8929c66a7e5SLarry Finger 	0x08, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
8939c66a7e5SLarry Finger 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
8949c66a7e5SLarry Finger 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
89521e4b072SLarry Finger 	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
89621e4b072SLarry Finger 	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
89721e4b072SLarry Finger 	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
89821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
89921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
90921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
91921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92474a7dfbcSPing-Ke Shih 	/* page 6: H2C_REMOTE_WAKE_CTRL_INFO */
92521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
92921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
93921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
94921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95774a7dfbcSPing-Ke Shih 	/* page 7: Rsvd GTK extend memory (zero memory) */
95821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
95921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
96921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
97921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
98921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
99021e4b072SLarry Finger };
99121e4b072SLarry Finger 
99221e4b072SLarry Finger static u8 reserved_page_packet_8812[TOTAL_RESERVED_PKT_LEN_8812] = {
99321e4b072SLarry Finger 	/* page 0: beacon */
99421e4b072SLarry Finger 	0x80, 0x00, 0x00, 0x00,  0xFF, 0xFF, 0xFF, 0xFF,
99521e4b072SLarry Finger 	0xFF, 0xFF, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
9969c66a7e5SLarry Finger 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x60, 0x00,
99721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
99821e4b072SLarry Finger 	0x64, 0x00, 0x20, 0x04,  0x00, 0x03, 0x32, 0x31,
99921e4b072SLarry Finger 	0x35, 0x01, 0x08, 0x82,  0x84, 0x8B, 0x96, 0x0C,
100021e4b072SLarry Finger 	0x12, 0x18, 0x24, 0x03,  0x01, 0x01, 0x06, 0x02,
100121e4b072SLarry Finger 	0x00, 0x00, 0x2A, 0x01,  0x02, 0x32, 0x04, 0x30,
100221e4b072SLarry Finger 	0x48, 0x60, 0x6C, 0x2D,  0x1A, 0xED, 0x09, 0x03,
100321e4b072SLarry Finger 	0xFF, 0xFF, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
100421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
100521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x3D,
100621e4b072SLarry Finger 	0x00, 0xDD, 0x07, 0x00,  0xE0, 0x4C, 0x02, 0x02,
100721e4b072SLarry Finger 	0x08, 0x04, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
100821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
100921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
101921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
102921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
103921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
104921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
105021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
105121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
105221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
105321e4b072SLarry Finger 	0x10, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
105421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 0x00, 0x00,
105521e4b072SLarry Finger 	0x04, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
105621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
105721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
105821e4b072SLarry Finger 	/* page 1: ps-poll */
10599c66a7e5SLarry Finger 	0xA4, 0x10, 0x09, 0xC0,  0x84, 0xC9, 0XB2, 0xA7,
10609c66a7e5SLarry Finger 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
106121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
106221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
106321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
106421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
106521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
106621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
106721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
106821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
106921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
107921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
108921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
109921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
110921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
111821e4b072SLarry Finger 	0x18, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
111921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
112021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
112121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
112221e4b072SLarry Finger 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
112321e4b072SLarry Finger 	/* page 2: null data */
11249c66a7e5SLarry Finger 	0x48, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
11259c66a7e5SLarry Finger 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
11269c66a7e5SLarry Finger 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
112721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
112821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
112921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
113921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
114921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
115921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
116921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
117921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
118021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
118121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
118221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
118321e4b072SLarry Finger 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
118421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
118521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
118621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
118721e4b072SLarry Finger 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
118821e4b072SLarry Finger 	/* page 3: Qos null data */
11899c66a7e5SLarry Finger 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
11909c66a7e5SLarry Finger 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
11919c66a7e5SLarry Finger 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
119221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
119321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
119421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
119521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
119621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
119721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
119821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
119921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
120921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
121921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
122921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
123921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
124874a7dfbcSPing-Ke Shih 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
124974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x80, 0x00,  0x00, 0x01, 0x00, 0x00,
125074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
125174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
125274a7dfbcSPing-Ke Shih 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
125374a7dfbcSPing-Ke Shih 	/* page 4: BT Qos null data */
12549c66a7e5SLarry Finger 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
12559c66a7e5SLarry Finger 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
12569c66a7e5SLarry Finger 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
125774a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
125874a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
125974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126574a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126674a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126774a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126874a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
126974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127574a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127674a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127774a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127874a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
127974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128574a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128674a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128774a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128874a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
128974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129574a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129674a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129774a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129874a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
129974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130374a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130474a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130574a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130674a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130774a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130874a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
130974a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
131074a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
131174a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
131274a7dfbcSPing-Ke Shih 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
131321e4b072SLarry Finger 	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
131421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
131521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
131621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
131721e4b072SLarry Finger 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
131874a7dfbcSPing-Ke Shih 	/* page 5~7 is for wowlan */
131974a7dfbcSPing-Ke Shih 	/* page 5: ARP resp */
13209c66a7e5SLarry Finger 	0x08, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
13219c66a7e5SLarry Finger 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
13229c66a7e5SLarry Finger 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
132321e4b072SLarry Finger 	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
132421e4b072SLarry Finger 	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
132521e4b072SLarry Finger 	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
132621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
132721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
132821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
132921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
133921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
134921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
135921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
136921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
137921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138474a7dfbcSPing-Ke Shih 	/* page 6: H2C_REMOTE_WAKE_CTRL_INFO */
138521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
138921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
139921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
140921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
141921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
142921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
143921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
144974a7dfbcSPing-Ke Shih 	/* page 7: Rsvd GTK extend memory (zero memory) */
145021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
145921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
146921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
147921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
148921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
149921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150421e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150521e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150621e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150721e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150821e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
150921e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
151021e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
151121e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
151221e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
151321e4b072SLarry Finger 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
151421e4b072SLarry Finger };
151521e4b072SLarry Finger 
rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw * hw,bool b_dl_finished,bool dl_whole_packets)151621e4b072SLarry Finger void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
151721e4b072SLarry Finger 				  bool b_dl_finished, bool dl_whole_packets)
151821e4b072SLarry Finger {
151921e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
152021e4b072SLarry Finger 	struct rtl_mac *mac = rtl_mac(rtlpriv);
152121e4b072SLarry Finger 	struct sk_buff *skb = NULL;
152221e4b072SLarry Finger 	u32 totalpacketlen;
152321e4b072SLarry Finger 	bool rtstatus;
15249c66a7e5SLarry Finger 	u8 u1rsvdpageloc[5] = { 0 };
15259c66a7e5SLarry Finger 	u8 u1rsvdpageloc2[7] = { 0 };
152621e4b072SLarry Finger 	bool b_dlok = false;
152721e4b072SLarry Finger 	u8 *beacon;
152821e4b072SLarry Finger 	u8 *p_pspoll;
152921e4b072SLarry Finger 	u8 *nullfunc;
153021e4b072SLarry Finger 	u8 *qosnull;
153174a7dfbcSPing-Ke Shih 	u8 *btqosnull;
153221e4b072SLarry Finger 	u8 *arpresp;
153321e4b072SLarry Finger 
153421e4b072SLarry Finger 	/*---------------------------------------------------------
153521e4b072SLarry Finger 	 *			(1) beacon
153621e4b072SLarry Finger 	 *---------------------------------------------------------
153721e4b072SLarry Finger 	 */
153821e4b072SLarry Finger 	beacon = &reserved_page_packet_8812[BEACON_PG * 512];
153921e4b072SLarry Finger 	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
154021e4b072SLarry Finger 	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
154121e4b072SLarry Finger 
154221e4b072SLarry Finger 	if (b_dl_finished) {
154321e4b072SLarry Finger 		totalpacketlen = 512 - 40;
154421e4b072SLarry Finger 		goto out;
154521e4b072SLarry Finger 	}
154621e4b072SLarry Finger 	/*-------------------------------------------------------
154721e4b072SLarry Finger 	 *			(2) ps-poll
154821e4b072SLarry Finger 	 *--------------------------------------------------------
154921e4b072SLarry Finger 	 */
155021e4b072SLarry Finger 	p_pspoll = &reserved_page_packet_8812[PSPOLL_PG * 512];
155121e4b072SLarry Finger 	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
155221e4b072SLarry Finger 	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
155321e4b072SLarry Finger 	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
155421e4b072SLarry Finger 
15559c66a7e5SLarry Finger 	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
155621e4b072SLarry Finger 
155721e4b072SLarry Finger 	/*--------------------------------------------------------
155821e4b072SLarry Finger 	 *			(3) null data
155921e4b072SLarry Finger 	 *---------------------------------------------------------
156021e4b072SLarry Finger 	 */
156121e4b072SLarry Finger 	nullfunc = &reserved_page_packet_8812[NULL_PG * 512];
156221e4b072SLarry Finger 	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
156321e4b072SLarry Finger 	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
156421e4b072SLarry Finger 	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
156521e4b072SLarry Finger 
15669c66a7e5SLarry Finger 	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
156721e4b072SLarry Finger 
156821e4b072SLarry Finger 	/*---------------------------------------------------------
156921e4b072SLarry Finger 	 *			(4) Qos null data
157021e4b072SLarry Finger 	 *----------------------------------------------------------
157121e4b072SLarry Finger 	 */
157221e4b072SLarry Finger 	qosnull = &reserved_page_packet_8812[QOSNULL_PG * 512];
157321e4b072SLarry Finger 	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
157421e4b072SLarry Finger 	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
157521e4b072SLarry Finger 	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
157621e4b072SLarry Finger 
15779c66a7e5SLarry Finger 	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1rsvdpageloc, QOSNULL_PG);
157821e4b072SLarry Finger 
157974a7dfbcSPing-Ke Shih 	/*---------------------------------------------------------
158074a7dfbcSPing-Ke Shih 	 *			(5) BT Qos null data
158174a7dfbcSPing-Ke Shih 	 *----------------------------------------------------------
158274a7dfbcSPing-Ke Shih 	 */
158374a7dfbcSPing-Ke Shih 	btqosnull = &reserved_page_packet_8812[BT_QOSNULL_PG * 512];
158474a7dfbcSPing-Ke Shih 	SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid);
158574a7dfbcSPing-Ke Shih 	SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr);
158674a7dfbcSPing-Ke Shih 	SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid);
158774a7dfbcSPing-Ke Shih 
15889c66a7e5SLarry Finger 	SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1rsvdpageloc, BT_QOSNULL_PG);
158974a7dfbcSPing-Ke Shih 
159021e4b072SLarry Finger 	if (!dl_whole_packets) {
159174a7dfbcSPing-Ke Shih 		totalpacketlen = 512 * (BT_QOSNULL_PG + 1) - 40;
159221e4b072SLarry Finger 		goto out;
159321e4b072SLarry Finger 	}
159421e4b072SLarry Finger 	/*---------------------------------------------------------
159574a7dfbcSPing-Ke Shih 	 *			(6) ARP Resp
159621e4b072SLarry Finger 	 *----------------------------------------------------------
159721e4b072SLarry Finger 	 */
159821e4b072SLarry Finger 	arpresp = &reserved_page_packet_8812[ARPRESP_PG * 512];
159921e4b072SLarry Finger 	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
160021e4b072SLarry Finger 	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
160121e4b072SLarry Finger 	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
160221e4b072SLarry Finger 
16039c66a7e5SLarry Finger 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1rsvdpageloc2, ARPRESP_PG);
160421e4b072SLarry Finger 
160521e4b072SLarry Finger 	/*---------------------------------------------------------
160674a7dfbcSPing-Ke Shih 	 *			(7) Remote Wake Ctrl
160721e4b072SLarry Finger 	 *----------------------------------------------------------
160821e4b072SLarry Finger 	 */
16099c66a7e5SLarry Finger 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1rsvdpageloc2,
161021e4b072SLarry Finger 								REMOTE_PG);
161121e4b072SLarry Finger 
161221e4b072SLarry Finger 	/*---------------------------------------------------------
161374a7dfbcSPing-Ke Shih 	 *			(8) GTK Ext Memory
161421e4b072SLarry Finger 	 *----------------------------------------------------------
161521e4b072SLarry Finger 	 */
16169c66a7e5SLarry Finger 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1rsvdpageloc2, GTKEXT_PG);
161721e4b072SLarry Finger 
161821e4b072SLarry Finger 	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8812 - 40;
161921e4b072SLarry Finger 
162021e4b072SLarry Finger out:
162121e4b072SLarry Finger 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
162221e4b072SLarry Finger 		      "rtl8812ae_set_fw_rsvdpagepkt(): packet data\n",
162321e4b072SLarry Finger 		      &reserved_page_packet_8812[0], totalpacketlen);
162421e4b072SLarry Finger 
162521e4b072SLarry Finger 	skb = dev_alloc_skb(totalpacketlen);
162660209d48SPing-Ke Shih 	if (!skb)
162760209d48SPing-Ke Shih 		return;
1628ad941e69Syuan linyu 	skb_put_data(skb, &reserved_page_packet_8812, totalpacketlen);
162921e4b072SLarry Finger 
1630557f9331SLarry Finger 	rtstatus = rtl_cmd_send_packet(hw, skb);
163121e4b072SLarry Finger 
163221e4b072SLarry Finger 	if (rtstatus)
163321e4b072SLarry Finger 		b_dlok = true;
163421e4b072SLarry Finger 
163521e4b072SLarry Finger 	if (!b_dl_finished && b_dlok) {
163621e4b072SLarry Finger 		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
16379c66a7e5SLarry Finger 			      "H2C_RSVDPAGE:\n", u1rsvdpageloc, 5);
163821e4b072SLarry Finger 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
16399c66a7e5SLarry Finger 				       sizeof(u1rsvdpageloc), u1rsvdpageloc);
164021e4b072SLarry Finger 		if (dl_whole_packets) {
164121e4b072SLarry Finger 			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
16429c66a7e5SLarry Finger 				      "wowlan H2C_RSVDPAGE:\n", u1rsvdpageloc2, 7);
164321e4b072SLarry Finger 			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
16449c66a7e5SLarry Finger 					       sizeof(u1rsvdpageloc2), u1rsvdpageloc2);
164521e4b072SLarry Finger 		}
164621e4b072SLarry Finger 	}
164721e4b072SLarry Finger 
164821e4b072SLarry Finger 	if (!b_dlok)
164998611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
165021e4b072SLarry Finger 			"Set RSVD page location to Fw FAIL!!!!!!.\n");
165121e4b072SLarry Finger }
165221e4b072SLarry Finger 
rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw * hw,bool b_dl_finished,bool dl_whole_packets)165321e4b072SLarry Finger void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
165421e4b072SLarry Finger 				  bool b_dl_finished, bool dl_whole_packets)
165521e4b072SLarry Finger {
165621e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
165721e4b072SLarry Finger 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
165821e4b072SLarry Finger 	struct sk_buff *skb = NULL;
165921e4b072SLarry Finger 	u32 totalpacketlen;
166021e4b072SLarry Finger 	bool rtstatus;
16619c66a7e5SLarry Finger 	u8 u1rsvdpageloc[5] = { 0 };
16629c66a7e5SLarry Finger 	u8 u1rsvdpageloc2[7] = { 0 };
166321e4b072SLarry Finger 	bool b_dlok = false;
166421e4b072SLarry Finger 	u8 *beacon;
166521e4b072SLarry Finger 	u8 *p_pspoll;
166621e4b072SLarry Finger 	u8 *nullfunc;
166721e4b072SLarry Finger 	u8 *qosnull;
166874a7dfbcSPing-Ke Shih 	u8 *btqosnull;
166921e4b072SLarry Finger 	u8 *arpresp;
167021e4b072SLarry Finger 
167121e4b072SLarry Finger 	/*---------------------------------------------------------
167221e4b072SLarry Finger 	 *			(1) beacon
167321e4b072SLarry Finger 	 *---------------------------------------------------------
167421e4b072SLarry Finger 	 */
167521e4b072SLarry Finger 	beacon = &reserved_page_packet_8821[BEACON_PG * 256];
167621e4b072SLarry Finger 	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
167721e4b072SLarry Finger 	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
167821e4b072SLarry Finger 
167921e4b072SLarry Finger 	if (b_dl_finished) {
168021e4b072SLarry Finger 		totalpacketlen = 256 - 40;
168121e4b072SLarry Finger 		goto out;
168221e4b072SLarry Finger 	}
168321e4b072SLarry Finger 	/*-------------------------------------------------------
168421e4b072SLarry Finger 	 *			(2) ps-poll
168521e4b072SLarry Finger 	 *--------------------------------------------------------
168621e4b072SLarry Finger 	 */
168721e4b072SLarry Finger 	p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256];
168821e4b072SLarry Finger 	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
168921e4b072SLarry Finger 	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
169021e4b072SLarry Finger 	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
169121e4b072SLarry Finger 
16929c66a7e5SLarry Finger 	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
169321e4b072SLarry Finger 
169421e4b072SLarry Finger 	/*--------------------------------------------------------
169521e4b072SLarry Finger 	 *			(3) null data
169621e4b072SLarry Finger 	 *---------------------------------------------------------i
169721e4b072SLarry Finger 	 */
169821e4b072SLarry Finger 	nullfunc = &reserved_page_packet_8821[NULL_PG * 256];
169921e4b072SLarry Finger 	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
170021e4b072SLarry Finger 	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
170121e4b072SLarry Finger 	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
170221e4b072SLarry Finger 
17039c66a7e5SLarry Finger 	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
170421e4b072SLarry Finger 
170521e4b072SLarry Finger 	/*---------------------------------------------------------
170621e4b072SLarry Finger 	 *			(4) Qos null data
170721e4b072SLarry Finger 	 *----------------------------------------------------------
170821e4b072SLarry Finger 	 */
170921e4b072SLarry Finger 	qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256];
171021e4b072SLarry Finger 	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
171121e4b072SLarry Finger 	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
171221e4b072SLarry Finger 	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
171321e4b072SLarry Finger 
17149c66a7e5SLarry Finger 	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1rsvdpageloc, QOSNULL_PG);
171521e4b072SLarry Finger 
171674a7dfbcSPing-Ke Shih 	/*---------------------------------------------------------
171774a7dfbcSPing-Ke Shih 	 *			(5) Qos null data
171874a7dfbcSPing-Ke Shih 	 *----------------------------------------------------------
171974a7dfbcSPing-Ke Shih 	 */
172074a7dfbcSPing-Ke Shih 	btqosnull = &reserved_page_packet_8821[BT_QOSNULL_PG * 256];
172174a7dfbcSPing-Ke Shih 	SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid);
172274a7dfbcSPing-Ke Shih 	SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr);
172374a7dfbcSPing-Ke Shih 	SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid);
172474a7dfbcSPing-Ke Shih 
17259c66a7e5SLarry Finger 	SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1rsvdpageloc, BT_QOSNULL_PG);
172674a7dfbcSPing-Ke Shih 
172721e4b072SLarry Finger 	if (!dl_whole_packets) {
172874a7dfbcSPing-Ke Shih 		totalpacketlen = 256 * (BT_QOSNULL_PG + 1) - 40;
172921e4b072SLarry Finger 		goto out;
173021e4b072SLarry Finger 	}
173121e4b072SLarry Finger 	/*---------------------------------------------------------
173274a7dfbcSPing-Ke Shih 	 *			(6) ARP Resp
173321e4b072SLarry Finger 	 *----------------------------------------------------------
173421e4b072SLarry Finger 	 */
173521e4b072SLarry Finger 	arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256];
173621e4b072SLarry Finger 	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
173721e4b072SLarry Finger 	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
173821e4b072SLarry Finger 	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
173921e4b072SLarry Finger 
17409c66a7e5SLarry Finger 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1rsvdpageloc2, ARPRESP_PG);
174121e4b072SLarry Finger 
174221e4b072SLarry Finger 	/*---------------------------------------------------------
174374a7dfbcSPing-Ke Shih 	 *			(7) Remote Wake Ctrl
174421e4b072SLarry Finger 	 *----------------------------------------------------------
174521e4b072SLarry Finger 	 */
17469c66a7e5SLarry Finger 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1rsvdpageloc2,
174721e4b072SLarry Finger 									REMOTE_PG);
174821e4b072SLarry Finger 
174921e4b072SLarry Finger 	/*---------------------------------------------------------
175074a7dfbcSPing-Ke Shih 	 *			(8) GTK Ext Memory
175121e4b072SLarry Finger 	 *----------------------------------------------------------
175221e4b072SLarry Finger 	 */
17539c66a7e5SLarry Finger 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1rsvdpageloc2, GTKEXT_PG);
175421e4b072SLarry Finger 
175521e4b072SLarry Finger 	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40;
175621e4b072SLarry Finger 
175721e4b072SLarry Finger out:
175821e4b072SLarry Finger 
175921e4b072SLarry Finger 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
176021e4b072SLarry Finger 		      "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n",
176121e4b072SLarry Finger 		      &reserved_page_packet_8821[0], totalpacketlen);
176221e4b072SLarry Finger 
176321e4b072SLarry Finger 	skb = dev_alloc_skb(totalpacketlen);
176460209d48SPing-Ke Shih 	if (!skb)
176560209d48SPing-Ke Shih 		return;
1766ad941e69Syuan linyu 	skb_put_data(skb, &reserved_page_packet_8821, totalpacketlen);
176721e4b072SLarry Finger 
1768557f9331SLarry Finger 	rtstatus = rtl_cmd_send_packet(hw, skb);
176921e4b072SLarry Finger 
177021e4b072SLarry Finger 	if (rtstatus)
177121e4b072SLarry Finger 		b_dlok = true;
177221e4b072SLarry Finger 
177321e4b072SLarry Finger 	if (!b_dl_finished && b_dlok) {
177498611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
177521e4b072SLarry Finger 			"Set RSVD page location to Fw.\n");
177621e4b072SLarry Finger 		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
17779c66a7e5SLarry Finger 				"H2C_RSVDPAGE:\n", u1rsvdpageloc, 5);
177821e4b072SLarry Finger 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
17799c66a7e5SLarry Finger 				       sizeof(u1rsvdpageloc), u1rsvdpageloc);
178021e4b072SLarry Finger 		if (dl_whole_packets) {
178121e4b072SLarry Finger 			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
178221e4b072SLarry Finger 				      "wowlan H2C_RSVDPAGE:\n",
17839c66a7e5SLarry Finger 				      u1rsvdpageloc2, 7);
178421e4b072SLarry Finger 			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
17859c66a7e5SLarry Finger 					       sizeof(u1rsvdpageloc2),
17869c66a7e5SLarry Finger 					       u1rsvdpageloc2);
178721e4b072SLarry Finger 		}
178821e4b072SLarry Finger 	}
178921e4b072SLarry Finger 
179021e4b072SLarry Finger 	if (!b_dlok) {
179198611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
179221e4b072SLarry Finger 			"Set RSVD page location to Fw FAIL!!!!!!.\n");
179321e4b072SLarry Finger 	}
179421e4b072SLarry Finger }
179521e4b072SLarry Finger 
179621e4b072SLarry Finger /*Should check FW support p2p or not.*/
rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw * hw,u8 ctwindow)179721e4b072SLarry Finger static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
179821e4b072SLarry Finger {
179921e4b072SLarry Finger 	u8 u1_ctwindow_period[1] = { ctwindow};
180021e4b072SLarry Finger 
180121e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1,
180221e4b072SLarry Finger 			       u1_ctwindow_period);
180321e4b072SLarry Finger }
180421e4b072SLarry Finger 
rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw * hw,u8 p2p_ps_state)180521e4b072SLarry Finger void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
180621e4b072SLarry Finger {
180721e4b072SLarry Finger 	struct rtl_priv *rtlpriv = rtl_priv(hw);
180821e4b072SLarry Finger 	struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
180921e4b072SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
181021e4b072SLarry Finger 	struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
181121e4b072SLarry Finger 	struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
181221e4b072SLarry Finger 	u8	i;
181321e4b072SLarry Finger 	u16	ctwindow;
181421e4b072SLarry Finger 	u32	start_time, tsf_low;
181521e4b072SLarry Finger 
181621e4b072SLarry Finger 	switch (p2p_ps_state) {
181721e4b072SLarry Finger 	case P2P_PS_DISABLE:
181898611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
18197fe3b3abSLarry Finger 		memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
182021e4b072SLarry Finger 		break;
182121e4b072SLarry Finger 	case P2P_PS_ENABLE:
182298611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
182321e4b072SLarry Finger 		/* update CTWindow value. */
182421e4b072SLarry Finger 		if (p2pinfo->ctwindow > 0) {
182521e4b072SLarry Finger 			p2p_ps_offload->ctwindow_en = 1;
182621e4b072SLarry Finger 			ctwindow = p2pinfo->ctwindow;
182721e4b072SLarry Finger 			rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow);
182821e4b072SLarry Finger 		}
182921e4b072SLarry Finger 
183021e4b072SLarry Finger 		/* hw only support 2 set of NoA */
183121e4b072SLarry Finger 		for (i = 0 ; i < p2pinfo->noa_num ; i++) {
183221e4b072SLarry Finger 			/* To control the register setting for which NOA*/
183321e4b072SLarry Finger 			rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
183421e4b072SLarry Finger 			if (i == 0)
183521e4b072SLarry Finger 				p2p_ps_offload->noa0_en = 1;
183621e4b072SLarry Finger 			else
183721e4b072SLarry Finger 				p2p_ps_offload->noa1_en = 1;
183821e4b072SLarry Finger 
183921e4b072SLarry Finger 			/* config P2P NoA Descriptor Register */
184021e4b072SLarry Finger 			rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]);
184121e4b072SLarry Finger 			rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]);
184221e4b072SLarry Finger 
184321e4b072SLarry Finger 			/*Get Current TSF value */
184421e4b072SLarry Finger 			tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
184521e4b072SLarry Finger 
184621e4b072SLarry Finger 			start_time = p2pinfo->noa_start_time[i];
184721e4b072SLarry Finger 			if (p2pinfo->noa_count_type[i] != 1) {
184821e4b072SLarry Finger 				while (start_time <= (tsf_low+(50*1024))) {
184921e4b072SLarry Finger 					start_time += p2pinfo->noa_interval[i];
185021e4b072SLarry Finger 					if (p2pinfo->noa_count_type[i] != 255)
185121e4b072SLarry Finger 						p2pinfo->noa_count_type[i]--;
185221e4b072SLarry Finger 				}
185321e4b072SLarry Finger 			}
185421e4b072SLarry Finger 			rtl_write_dword(rtlpriv, 0x5E8, start_time);
185521e4b072SLarry Finger 			rtl_write_dword(rtlpriv, 0x5EC,
185621e4b072SLarry Finger 					p2pinfo->noa_count_type[i]);
185721e4b072SLarry Finger 		}
185821e4b072SLarry Finger 
185921e4b072SLarry Finger 		if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
186021e4b072SLarry Finger 			/* rst p2p circuit */
186121e4b072SLarry Finger 			rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
186221e4b072SLarry Finger 
186321e4b072SLarry Finger 			p2p_ps_offload->offload_en = 1;
186421e4b072SLarry Finger 
186521e4b072SLarry Finger 			if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
186621e4b072SLarry Finger 				p2p_ps_offload->role = 1;
186721e4b072SLarry Finger 				p2p_ps_offload->allstasleep = 0;
186821e4b072SLarry Finger 			} else {
186921e4b072SLarry Finger 				p2p_ps_offload->role = 0;
187021e4b072SLarry Finger 			}
187121e4b072SLarry Finger 
187221e4b072SLarry Finger 			p2p_ps_offload->discovery = 0;
187321e4b072SLarry Finger 		}
187421e4b072SLarry Finger 		break;
187521e4b072SLarry Finger 	case P2P_PS_SCAN:
187698611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
187721e4b072SLarry Finger 		p2p_ps_offload->discovery = 1;
187821e4b072SLarry Finger 		break;
187921e4b072SLarry Finger 	case P2P_PS_SCAN_DONE:
188098611b00SLarry Finger 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
188121e4b072SLarry Finger 		p2p_ps_offload->discovery = 0;
188221e4b072SLarry Finger 		p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
188321e4b072SLarry Finger 		break;
188421e4b072SLarry Finger 	default:
188521e4b072SLarry Finger 		break;
188621e4b072SLarry Finger 	}
188721e4b072SLarry Finger 
188821e4b072SLarry Finger 	rtl8821ae_fill_h2c_cmd(hw,
188921e4b072SLarry Finger 			H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
189021e4b072SLarry Finger }
189121e4b072SLarry Finger 
rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw * hw,u8 * cmd_buf,u8 cmd_len)189216cefa44SPing-Ke Shih void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
189321e4b072SLarry Finger 				     u8 *cmd_buf, u8 cmd_len)
189421e4b072SLarry Finger {
189521e4b072SLarry Finger 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
189621e4b072SLarry Finger 	u8 rate = cmd_buf[0] & 0x3F;
189721e4b072SLarry Finger 
189821e4b072SLarry Finger 	rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate);
189921e4b072SLarry Finger 
190021e4b072SLarry Finger 	rtl8821ae_dm_update_init_rate(hw, rate);
190121e4b072SLarry Finger }
1902