1 /******************************************************************************
2  *
3  * Copyright(c) 2009-2010  Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12  * more details.
13  *
14  * The full GNU General Public License is included in this distribution in the
15  * file called LICENSE.
16  *
17  * Contact Information:
18  * wlanfae <wlanfae@realtek.com>
19  * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20  * Hsinchu 300, Taiwan.
21  *
22  * Larry Finger <Larry.Finger@lwfinger.net>
23  *
24  *****************************************************************************/
25 
26 #include "../wifi.h"
27 #include "../pci.h"
28 #include "../base.h"
29 #include "../core.h"
30 #include "../efuse.h"
31 #include "reg.h"
32 #include "def.h"
33 #include "fw.h"
34 #include "dm.h"
35 
36 static void _rtl8821ae_enable_fw_download(struct ieee80211_hw *hw, bool enable)
37 {
38 	struct rtl_priv *rtlpriv = rtl_priv(hw);
39 	u8 tmp;
40 
41 	if (enable) {
42 		rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x05);
43 
44 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
45 		rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
46 
47 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
48 	} else {
49 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
50 		rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
51 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
52 	}
53 }
54 
55 static void _rtl8821ae_write_fw(struct ieee80211_hw *hw,
56 				enum version_8821ae version,
57 				u8 *buffer, u32 size)
58 {
59 	struct rtl_priv *rtlpriv = rtl_priv(hw);
60 	u8 *bufferptr = (u8 *)buffer;
61 	u32 pagenums, remainsize;
62 	u32 page, offset;
63 
64 	RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
65 
66 	rtl_fill_dummy(bufferptr, &size);
67 
68 	pagenums = size / FW_8821AE_PAGE_SIZE;
69 	remainsize = size % FW_8821AE_PAGE_SIZE;
70 
71 	if (pagenums > 8)
72 		pr_err("Page numbers should not greater then 8\n");
73 
74 	for (page = 0; page < pagenums; page++) {
75 		offset = page * FW_8821AE_PAGE_SIZE;
76 		rtl_fw_page_write(hw, page, (bufferptr + offset),
77 				  FW_8821AE_PAGE_SIZE);
78 	}
79 
80 	if (remainsize) {
81 		offset = pagenums * FW_8821AE_PAGE_SIZE;
82 		page = pagenums;
83 		rtl_fw_page_write(hw, page, (bufferptr + offset), remainsize);
84 	}
85 }
86 
87 static int _rtl8821ae_fw_free_to_go(struct ieee80211_hw *hw)
88 {
89 	struct rtl_priv *rtlpriv = rtl_priv(hw);
90 	int err = -EIO;
91 	u32 counter = 0;
92 	u32 value32;
93 
94 	do {
95 		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
96 	} while ((counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT) &&
97 		 (!(value32 & FWDL_CHKSUM_RPT)));
98 
99 	if (counter >= FW_8821AE_POLLING_TIMEOUT_COUNT) {
100 		RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
101 			 "chksum report faill ! REG_MCUFWDL:0x%08x .\n",
102 			  value32);
103 		goto exit;
104 	}
105 	value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
106 	value32 |= MCUFWDL_RDY;
107 	value32 &= ~WINTINI_RDY;
108 	rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
109 
110 	rtl8821ae_firmware_selfreset(hw);
111 
112 	counter = 0;
113 	do {
114 		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
115 		if (value32 & WINTINI_RDY)
116 			return 0;
117 
118 		udelay(FW_8821AE_POLLING_DELAY);
119 	} while (counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT);
120 
121 	pr_err("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n",
122 	       value32);
123 
124 exit:
125 	return err;
126 }
127 
128 static void _rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv *rtlpriv)
129 {
130 	u8 val;
131 	u16 count = 0;
132 
133 	do {
134 		val = rtl_read_byte(rtlpriv, REG_HMETFR);
135 		mdelay(1);
136 		count++;
137 	} while ((val & 0x0F) && (count < 1000));
138 }
139 
140 int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
141 {
142 	struct rtl_priv *rtlpriv = rtl_priv(hw);
143 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
144 	struct rtlwifi_firmware_header *pfwheader;
145 	u8 *pfwdata;
146 	u32 fwsize;
147 	int err;
148 	bool support_remote_wakeup;
149 	enum version_8821ae version = rtlhal->version;
150 
151 	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
152 				      (u8 *)(&support_remote_wakeup));
153 
154 	if (support_remote_wakeup)
155 		_rtl8821ae_wait_for_h2c_cmd_finish(rtlpriv);
156 
157 	if (buse_wake_on_wlan_fw) {
158 		if (!rtlhal->wowlan_firmware)
159 			return 1;
160 
161 		pfwheader =
162 		  (struct rtlwifi_firmware_header *)rtlhal->wowlan_firmware;
163 		rtlhal->fw_version = le16_to_cpu(pfwheader->version);
164 		rtlhal->fw_subversion = pfwheader->subversion;
165 		pfwdata = (u8 *)rtlhal->wowlan_firmware;
166 		fwsize = rtlhal->wowlan_fwsize;
167 	} else {
168 		if (!rtlhal->pfirmware)
169 			return 1;
170 
171 		pfwheader =
172 		  (struct rtlwifi_firmware_header *)rtlhal->pfirmware;
173 		rtlhal->fw_version = le16_to_cpu(pfwheader->version);
174 		rtlhal->fw_subversion = pfwheader->subversion;
175 		pfwdata = (u8 *)rtlhal->pfirmware;
176 		fwsize = rtlhal->fwsize;
177 	}
178 
179 	RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
180 		 "%s Firmware SIZE %d\n",
181 		 buse_wake_on_wlan_fw ? "Wowlan" : "Normal", fwsize);
182 
183 	if (IS_FW_HEADER_EXIST_8812(pfwheader) ||
184 	    IS_FW_HEADER_EXIST_8821(pfwheader)) {
185 		RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
186 			 "Firmware Version(%d), Signature(%#x)\n",
187 			 pfwheader->version, pfwheader->signature);
188 
189 		pfwdata = pfwdata + sizeof(struct rtlwifi_firmware_header);
190 		fwsize = fwsize - sizeof(struct rtlwifi_firmware_header);
191 	}
192 
193 	if (rtlhal->mac_func_enable) {
194 		if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
195 			rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
196 			rtl8821ae_firmware_selfreset(hw);
197 		}
198 	}
199 	_rtl8821ae_enable_fw_download(hw, true);
200 	_rtl8821ae_write_fw(hw, version, pfwdata, fwsize);
201 	_rtl8821ae_enable_fw_download(hw, false);
202 
203 	err = _rtl8821ae_fw_free_to_go(hw);
204 	if (err) {
205 		RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
206 			 "Firmware is not ready to run!\n");
207 	} else {
208 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
209 			 "Firmware is ready to run!\n");
210 	}
211 
212 	return 0;
213 }
214 
215 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
216 void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
217 					 bool used_wowlan_fw)
218 {
219 	struct rtl_priv *rtlpriv = rtl_priv(hw);
220 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
221 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
222 	/* 1. Before WoWLAN or After WOWLAN we need to re-download Fw. */
223 	if (rtl8821ae_download_fw(hw, used_wowlan_fw)) {
224 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
225 			 "Re-Download Firmware failed!!\n");
226 		rtlhal->fw_ready = false;
227 		return;
228 	}
229 	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
230 		 "Re-Download Firmware Success !!\n");
231 	rtlhal->fw_ready = true;
232 
233 	/* 2. Re-Init the variables about Fw related setting. */
234 	ppsc->fw_current_inpsmode = false;
235 	rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
236 	rtlhal->fw_clk_change_in_progress = false;
237 	rtlhal->allow_sw_to_change_hwclc = false;
238 	rtlhal->last_hmeboxnum = 0;
239 }
240 #endif
241 
242 static bool _rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw *hw,
243 					      u8 boxnum)
244 {
245 	struct rtl_priv *rtlpriv = rtl_priv(hw);
246 	u8 val_hmetfr;
247 	bool result = false;
248 
249 	val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
250 	if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
251 		result = true;
252 	return result;
253 }
254 
255 static void _rtl8821ae_fill_h2c_command(struct ieee80211_hw *hw,
256 					u8 element_id, u32 cmd_len,
257 					u8 *cmdbuffer)
258 {
259 	struct rtl_priv *rtlpriv = rtl_priv(hw);
260 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
261 	u8 boxnum = 0;
262 	u16 box_reg = 0, box_extreg = 0;
263 	u8 u1b_tmp = 0;
264 	bool isfw_read = false;
265 	u8 buf_index = 0;
266 	bool bwrite_sucess = false;
267 	u8 wait_h2c_limmit = 100;
268 	/*u8 wait_writeh2c_limmit = 100;*/
269 	u8 boxcontent[4], boxextcontent[4];
270 	u32 h2c_waitcounter = 0;
271 	unsigned long flag = 0;
272 	u8 idx = 0;
273 
274 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
275 
276 	while (true) {
277 		spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
278 		if (rtlhal->h2c_setinprogress) {
279 			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
280 				 "H2C set in progress! Wait to set..element_id(%d).\n",
281 				 element_id);
282 
283 			while (rtlhal->h2c_setinprogress) {
284 				spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
285 						       flag);
286 				h2c_waitcounter++;
287 				RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
288 					 "Wait 100 us (%d times)...\n",
289 					  h2c_waitcounter);
290 				udelay(100);
291 
292 				if (h2c_waitcounter > 1000)
293 					return;
294 				spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
295 						  flag);
296 			}
297 			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
298 		} else {
299 			rtlhal->h2c_setinprogress = true;
300 			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
301 			break;
302 		}
303 	}
304 
305 	while (!bwrite_sucess) {
306 		boxnum = rtlhal->last_hmeboxnum;
307 		switch (boxnum) {
308 		case 0:
309 			box_reg = REG_HMEBOX_0;
310 			box_extreg = REG_HMEBOX_EXT_0;
311 			break;
312 		case 1:
313 			box_reg = REG_HMEBOX_1;
314 			box_extreg = REG_HMEBOX_EXT_1;
315 			break;
316 		case 2:
317 			box_reg = REG_HMEBOX_2;
318 			box_extreg = REG_HMEBOX_EXT_2;
319 			break;
320 		case 3:
321 			box_reg = REG_HMEBOX_3;
322 			box_extreg = REG_HMEBOX_EXT_3;
323 			break;
324 		default:
325 			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
326 				 "switch case %#x not processed\n", boxnum);
327 			break;
328 		}
329 
330 		isfw_read = false;
331 		u1b_tmp = rtl_read_byte(rtlpriv, REG_CR);
332 
333 		if (u1b_tmp != 0xEA) {
334 			isfw_read = true;
335 		} else {
336 			if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xEA ||
337 			    rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xEA)
338 				rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xFF);
339 		}
340 
341 		if (isfw_read) {
342 			wait_h2c_limmit = 100;
343 			isfw_read =
344 			  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
345 			while (!isfw_read) {
346 				/*wait until Fw read*/
347 				wait_h2c_limmit--;
348 				if (wait_h2c_limmit == 0) {
349 					RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
350 						 "Waiting too long for FW read clear HMEBox(%d)!\n",
351 						 boxnum);
352 					break;
353 				}
354 
355 				udelay(10);
356 
357 				isfw_read =
358 				  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
359 				u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
360 				RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
361 					 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
362 					 boxnum, u1b_tmp);
363 			}
364 		}
365 
366 		if (!isfw_read) {
367 			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
368 				 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
369 				 boxnum);
370 			break;
371 		}
372 
373 		memset(boxcontent, 0, sizeof(boxcontent));
374 		memset(boxextcontent, 0, sizeof(boxextcontent));
375 		boxcontent[0] = element_id;
376 		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
377 			 "Write element_id box_reg(%4x) = %2x\n",
378 			 box_reg, element_id);
379 
380 		switch (cmd_len) {
381 		case 1:
382 		case 2:
383 		case 3:
384 			/*boxcontent[0] &= ~(BIT(7));*/
385 			memcpy((u8 *)(boxcontent) + 1,
386 			       cmdbuffer + buf_index, cmd_len);
387 
388 			for (idx = 0; idx < 4; idx++) {
389 				rtl_write_byte(rtlpriv, box_reg + idx,
390 					       boxcontent[idx]);
391 			}
392 			break;
393 		case 4:
394 		case 5:
395 		case 6:
396 		case 7:
397 			/*boxcontent[0] |= (BIT(7));*/
398 			memcpy((u8 *)(boxextcontent),
399 			       cmdbuffer + buf_index+3, cmd_len-3);
400 			memcpy((u8 *)(boxcontent) + 1,
401 			       cmdbuffer + buf_index, 3);
402 
403 			for (idx = 0; idx < 4; idx++) {
404 				rtl_write_byte(rtlpriv, box_extreg + idx,
405 					       boxextcontent[idx]);
406 			}
407 
408 			for (idx = 0; idx < 4; idx++) {
409 				rtl_write_byte(rtlpriv, box_reg + idx,
410 					       boxcontent[idx]);
411 			}
412 			break;
413 		default:
414 			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
415 				 "switch case %#x not processed\n", cmd_len);
416 			break;
417 		}
418 
419 		bwrite_sucess = true;
420 
421 		rtlhal->last_hmeboxnum = boxnum + 1;
422 		if (rtlhal->last_hmeboxnum == 4)
423 			rtlhal->last_hmeboxnum = 0;
424 
425 		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
426 			 "pHalData->last_hmeboxnum  = %d\n",
427 			  rtlhal->last_hmeboxnum);
428 	}
429 
430 	spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
431 	rtlhal->h2c_setinprogress = false;
432 	spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
433 
434 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
435 }
436 
437 void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw,
438 			    u8 element_id, u32 cmd_len, u8 *cmdbuffer)
439 {
440 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
441 	u32 tmp_cmdbuf[2];
442 
443 	if (!rtlhal->fw_ready) {
444 		WARN_ONCE(true,
445 			  "rtl8821ae: error H2C cmd because of Fw download fail!!!\n");
446 		return;
447 	}
448 
449 	memset(tmp_cmdbuf, 0, 8);
450 	memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
451 	_rtl8821ae_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
452 }
453 
454 void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw)
455 {
456 	struct rtl_priv *rtlpriv = rtl_priv(hw);
457 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
458 	u8 u1b_tmp;
459 
460 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
461 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
462 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
463 	} else {
464 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
465 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(0))));
466 	}
467 
468 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
469 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
470 	udelay(50);
471 
472 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
473 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
474 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
475 	} else {
476 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
477 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(0)));
478 	}
479 
480 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
481 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
482 
483 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
484 		 "_8051Reset8812ae(): 8051 reset success .\n");
485 }
486 
487 void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
488 {
489 	struct rtl_priv *rtlpriv = rtl_priv(hw);
490 	u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 };
491 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
492 	u8 rlbm, power_state = 0, byte5 = 0;
493 	u8 awake_intvl;	/* DTIM = (awake_intvl - 1) */
494 	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
495 	bool bt_ctrl_lps = (rtlpriv->cfg->ops->get_btc_status() ?
496 			    btc_ops->btc_is_bt_ctrl_lps(rtlpriv) : false);
497 	bool bt_lps_on = (rtlpriv->cfg->ops->get_btc_status() ?
498 			  btc_ops->btc_is_bt_lps_on(rtlpriv) : false);
499 
500 	if (bt_ctrl_lps)
501 		mode = (bt_lps_on ? FW_PS_MIN_MODE : FW_PS_ACTIVE_MODE);
502 
503 	RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "FW LPS mode = %d (coex:%d)\n",
504 		 mode, bt_ctrl_lps);
505 
506 	switch (mode) {
507 	case FW_PS_MIN_MODE:
508 		rlbm = 0;
509 		awake_intvl = 2;
510 		break;
511 	case FW_PS_MAX_MODE:
512 		rlbm = 1;
513 		awake_intvl = 2;
514 		break;
515 	case FW_PS_DTIM_MODE:
516 		rlbm = 2;
517 		awake_intvl = ppsc->reg_max_lps_awakeintvl;
518 		/* hw->conf.ps_dtim_period or mac->vif->bss_conf.dtim_period
519 		 * is only used in swlps.
520 		 */
521 		break;
522 	default:
523 		rlbm = 2;
524 		awake_intvl = 4;
525 		break;
526 	}
527 
528 	if (rtlpriv->mac80211.p2p) {
529 		awake_intvl = 2;
530 		rlbm = 1;
531 	}
532 
533 	if (mode == FW_PS_ACTIVE_MODE) {
534 		byte5 = 0x40;
535 		power_state = FW_PWR_STATE_ACTIVE;
536 	} else {
537 		if (bt_ctrl_lps) {
538 			byte5 = btc_ops->btc_get_lps_val(rtlpriv);
539 			power_state = btc_ops->btc_get_rpwm_val(rtlpriv);
540 
541 			if ((rlbm == 2) && (byte5 & BIT(4))) {
542 				/* Keep awake interval to 1 to prevent from
543 				 * decreasing coex performance
544 				 */
545 				awake_intvl = 2;
546 				rlbm = 2;
547 			}
548 		} else {
549 			byte5 = 0x40;
550 			power_state = FW_PWR_STATE_RF_OFF;
551 		}
552 	}
553 
554 	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
555 	SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
556 	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
557 					 bt_ctrl_lps ? 0 :
558 					 ((rtlpriv->mac80211.p2p) ?
559 					  ppsc->smart_ps : 1));
560 	SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
561 					       awake_intvl);
562 	SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
563 	SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
564 	SET_H2CCMD_PWRMODE_PARM_BYTE5(u1_h2c_set_pwrmode, byte5);
565 
566 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
567 		      "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
568 		      u1_h2c_set_pwrmode, H2C_8821AE_PWEMODE_LENGTH);
569 	if (rtlpriv->cfg->ops->get_btc_status())
570 		btc_ops->btc_record_pwr_mode(rtlpriv, u1_h2c_set_pwrmode,
571 					     H2C_8821AE_PWEMODE_LENGTH);
572 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_SETPWRMODE,
573 			       H2C_8821AE_PWEMODE_LENGTH,
574 			       u1_h2c_set_pwrmode);
575 }
576 
577 void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,
578 					   u8 mstatus)
579 {
580 	u8 parm[3] = { 0, 0, 0 };
581 	/* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect
582 	 *          bit1=0-->update Media Status to MACID
583 	 *          bit1=1-->update Media Status from MACID to MACID_End
584 	 * parm[1]: MACID, if this is INFRA_STA, MacID = 0
585 	 * parm[2]: MACID_End
586 	 */
587 
588 	SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus);
589 	SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0);
590 
591 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_MSRRPT, 3, parm);
592 }
593 
594 void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
595 				      u8 ap_offload_enable)
596 {
597 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
598 	u8 u1_apoffload_parm[H2C_8821AE_AP_OFFLOAD_LENGTH] = { 0 };
599 
600 	SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable);
601 	SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
602 	SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
603 
604 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AP_OFFLOAD,
605 			       H2C_8821AE_AP_OFFLOAD_LENGTH,
606 			       u1_apoffload_parm);
607 }
608 
609 void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en)
610 {
611 	struct rtl_priv *rtlpriv = rtl_priv(hw);
612 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
613 	u8 fw_wowlan_info[H2C_8821AE_WOWLAN_LENGTH] = {0};
614 
615 	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "enable(%d)\n", func_en);
616 
617 	SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(fw_wowlan_info,
618 					   (func_en ? true : false));
619 
620 	SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(fw_wowlan_info,
621 		((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) ? 1 : 0));
622 	SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(fw_wowlan_info,
623 		((ppsc->wo_wlan_mode & WAKE_ON_MAGIC_PACKET) ? 1 : 0));
624 
625 	SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(fw_wowlan_info, 0);
626 	SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(fw_wowlan_info, false);
627 	SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(fw_wowlan_info, 0);
628 	SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(fw_wowlan_info, 1);
629 	SET_8812_H2CCMD_WOWLAN_GPIONUM(fw_wowlan_info, 0);
630 	SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(fw_wowlan_info, 0);
631 
632 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_DMESG,
633 		      "wowlan mode: cmd 0x80: Content:\n",
634 		      fw_wowlan_info, H2C_8821AE_WOWLAN_LENGTH);
635 
636 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_WO_WLAN,
637 			       H2C_8821AE_WOWLAN_LENGTH,
638 			       fw_wowlan_info);
639 }
640 
641 void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,
642 					   u8 enable)
643 {
644 	struct rtl_priv *rtlpriv = rtl_priv(hw);
645 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
646 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
647 	u8 remote_wake_ctrl_parm[H2C_8821AE_REMOTE_WAKE_CTRL_LEN] = {0};
648 
649 	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
650 		 "enable=%d, ARP offload=%d, GTK offload=%d\n",
651 		 enable, ppsc->arp_offload_enable, ppsc->gtk_offload_enable);
652 
653 	SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(remote_wake_ctrl_parm, enable);
654 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(remote_wake_ctrl_parm,
655 					(ppsc->arp_offload_enable ? 1 : 0));
656 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(remote_wake_ctrl_parm,
657 					(ppsc->gtk_offload_enable ? 1 : 0));
658 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(remote_wake_ctrl_parm,
659 					(rtlhal->real_wow_v2_enable ? 1 : 0));
660 
661 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
662 		      "remote_wake_ctrl: cmd 0x4: Content:\n",
663 		      remote_wake_ctrl_parm, H2C_8821AE_REMOTE_WAKE_CTRL_LEN);
664 
665 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_REMOTE_WAKE_CTRL,
666 			       H2C_8821AE_REMOTE_WAKE_CTRL_LEN,
667 			       remote_wake_ctrl_parm);
668 }
669 
670 void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw,
671 				     bool func_en)
672 {
673 	struct rtl_priv *rtlpriv = rtl_priv(hw);
674 	u8 keep_alive_info[H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH] = {0};
675 
676 	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable(%d)\n", func_en);
677 
678 	SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(keep_alive_info, func_en);
679 	/* 1: the period is controled by driver, 0: by Fw default */
680 	SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(keep_alive_info, 1);
681 	SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(keep_alive_info, 10); /* 10 sec */
682 
683 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
684 		      "keep alive: cmd 0x3: Content:\n",
685 		      keep_alive_info, H2C_8821AE_KEEP_ALIVE_CTRL);
686 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL,
687 			       H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH,
688 			       keep_alive_info);
689 }
690 
691 void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
692 						   bool enabled)
693 {
694 	struct rtl_priv *rtlpriv = rtl_priv(hw);
695 	u8 parm[H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN] = {0};
696 
697 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(parm, enabled);
698 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(parm, 1);
699 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(parm, 30);
700 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(parm, 3);
701 
702 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
703 		      "disconnect_decision_ctrl: cmd 0x4: Content:\n",
704 		      parm, H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN);
705 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_DISCONNECT_DECISION,
706 			       H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN, parm);
707 }
708 
709 void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw)
710 {
711 	struct rtl_priv *rtlpriv = rtl_priv(hw);
712 	struct rtl_security *sec = &rtlpriv->sec;
713 	u8 remote_wakeup_sec_info[H2C_8821AE_AOAC_GLOBAL_INFO_LEN] = {0};
714 
715 	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
716 		 "PairwiseEncAlgorithm=%d, GroupEncAlgorithm=%d\n",
717 		 sec->pairwise_enc_algorithm, sec->group_enc_algorithm);
718 
719 	SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(
720 						remote_wakeup_sec_info,
721 						sec->pairwise_enc_algorithm);
722 	SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(remote_wakeup_sec_info,
723 						      sec->group_enc_algorithm);
724 
725 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_GLOBAL_INFO,
726 			       H2C_8821AE_AOAC_GLOBAL_INFO_LEN,
727 			       remote_wakeup_sec_info);
728 
729 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_TRACE,
730 		      "rtl8821ae_set_global_info: cmd 0x82:\n",
731 		      remote_wakeup_sec_info, H2C_8821AE_AOAC_GLOBAL_INFO_LEN);
732 }
733 
734 #define BEACON_PG		0
735 #define PSPOLL_PG		1
736 #define NULL_PG			2
737 #define QOSNULL_PG		3
738 #define BT_QOSNULL_PG	4
739 #define ARPRESP_PG		5
740 #define REMOTE_PG		6
741 #define GTKEXT_PG		7
742 
743 #define TOTAL_RESERVED_PKT_LEN_8812	4096
744 #define TOTAL_RESERVED_PKT_LEN_8821	2048
745 
746 static u8 reserved_page_packet_8821[TOTAL_RESERVED_PKT_LEN_8821] = {
747 	/* page 0: beacon */
748 	0x80, 0x00, 0x00, 0x00,  0xff, 0xff, 0xff, 0xff,
749 	0xff, 0xff, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
750 	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 0x20, 0x00,
751 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
752 	0x64, 0x00, 0x20, 0x04,  0x00, 0x06, 0x64, 0x6c,
753 	0x69, 0x6e, 0x6b, 0x31,  0x01, 0x08, 0x82, 0x84,
754 	0x8b, 0x96, 0x0c, 0x18,  0x30, 0x48, 0x03, 0x01,
755 	0x0b, 0x06, 0x02, 0x00,  0x00, 0x2a, 0x01, 0x8b,
756 	0x32, 0x04, 0x12, 0x24,  0x60, 0x6c, 0x00, 0x00,
757 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
758 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
759 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
760 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
761 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
762 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
763 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
764 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
765 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
766 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
767 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
768 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
769 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
770 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
771 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
772 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
773 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
774 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
775 	0x10, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
776 	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 0x00, 0x00,
777 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
778 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
779 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
780 	/* page 1: ps-poll */
781 	0xa4, 0x10, 0x01, 0xc0,  0x40, 0x16, 0x9f, 0x23,
782 	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
783 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
784 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
785 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
786 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
787 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
788 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
789 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
790 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
791 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
792 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
793 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
794 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
795 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
796 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
797 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
798 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
799 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
800 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
801 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
802 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
803 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
804 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
805 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
806 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
807 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
808 	0x18, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
809 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
810 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
811 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
812 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
813 	/* page 2: null data */
814 	0x48, 0x01, 0x00, 0x00,  0x40, 0x16, 0x9f, 0x23,
815 	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
816 	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 0x00, 0x00,
817 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
818 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
819 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
820 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
821 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
822 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
823 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
824 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
825 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
826 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
827 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
828 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
829 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
830 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
831 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
832 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
833 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
834 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
835 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
836 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
837 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
838 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
839 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
840 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
841 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
842 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
843 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
844 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
845 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
846 	/* page 3: qos null data */
847 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
848 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
849 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
850 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
851 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
852 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
853 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
854 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
855 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
856 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
857 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
858 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
859 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
860 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
861 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
862 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
863 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
864 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
865 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
866 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
867 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
868 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
869 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
870 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
871 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
872 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
873 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
874 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
875 	0x00, 0x00, 0x80, 0x00,  0x00, 0x01, 0x00, 0x00,
876 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
877 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
878 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
879 	/* page 4: BT qos null data */
880 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
881 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
882 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
883 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
884 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
885 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
886 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
887 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
888 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
889 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
890 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
891 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
892 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
893 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
894 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
895 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
896 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
897 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
898 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
899 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
900 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
901 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
902 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
903 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
904 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
905 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
906 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
907 	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
908 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
909 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
910 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
911 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
912 	/* page 5~7 is for wowlan */
913 	/* page 5: ARP resp */
914 	0x08, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
915 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
916 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
917 	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
918 	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
919 	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
920 	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
921 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
922 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
923 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
924 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
925 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
926 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
927 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
928 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
929 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
930 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
931 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
932 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
933 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
934 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
935 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
936 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
937 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
938 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
939 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
940 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
941 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
942 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
943 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
944 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
945 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
946 	/* page 6: H2C_REMOTE_WAKE_CTRL_INFO */
947 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
948 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
949 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
950 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
951 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
952 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
953 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
954 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
955 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
956 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
957 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
958 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
959 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
960 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
961 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
962 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
963 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
964 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
965 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
966 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
967 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
968 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
969 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
970 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
971 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
972 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
973 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
974 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
975 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
976 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
977 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
978 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
979 	/* page 7: Rsvd GTK extend memory (zero memory) */
980 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
981 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
982 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
983 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
984 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
985 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
986 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
987 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
988 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
989 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
990 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
991 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
992 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
993 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
994 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
995 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
996 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
997 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
998 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
999 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1000 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1001 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1002 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1003 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1004 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1005 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1006 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1007 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1008 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1009 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1010 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1011 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1012 };
1013 
1014 static u8 reserved_page_packet_8812[TOTAL_RESERVED_PKT_LEN_8812] = {
1015 	/* page 0: beacon */
1016 	0x80, 0x00, 0x00, 0x00,  0xFF, 0xFF, 0xFF, 0xFF,
1017 	0xFF, 0xFF, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1018 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x60, 0x00,
1019 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1020 	0x64, 0x00, 0x20, 0x04,  0x00, 0x03, 0x32, 0x31,
1021 	0x35, 0x01, 0x08, 0x82,  0x84, 0x8B, 0x96, 0x0C,
1022 	0x12, 0x18, 0x24, 0x03,  0x01, 0x01, 0x06, 0x02,
1023 	0x00, 0x00, 0x2A, 0x01,  0x02, 0x32, 0x04, 0x30,
1024 	0x48, 0x60, 0x6C, 0x2D,  0x1A, 0xED, 0x09, 0x03,
1025 	0xFF, 0xFF, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1026 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1027 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x3D,
1028 	0x00, 0xDD, 0x07, 0x00,  0xE0, 0x4C, 0x02, 0x02,
1029 	0x08, 0x04, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1030 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1031 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1032 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1033 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1034 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1035 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1036 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1037 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1038 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1039 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1040 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1041 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1042 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1043 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1044 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1045 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1046 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1047 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1048 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1049 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1050 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1051 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1052 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1053 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1054 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1055 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1056 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1057 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1058 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1059 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1060 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1061 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1062 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1063 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1064 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1065 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1066 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1067 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1068 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1069 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1070 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1071 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1072 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1073 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1074 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1075 	0x10, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1076 	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 0x00, 0x00,
1077 	0x04, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1078 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1079 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1080 	/* page 1: ps-poll */
1081 	0xA4, 0x10, 0x09, 0xC0,  0x84, 0xC9, 0xB2, 0xA7,
1082 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1083 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1084 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1085 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1086 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1087 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1088 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1089 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1090 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1091 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1092 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1093 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1094 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1095 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1096 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1097 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1098 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1099 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1100 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1101 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1102 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1103 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1104 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1105 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1106 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1107 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1108 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1109 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1110 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1111 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1112 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1113 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1114 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1115 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1116 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1117 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1118 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1119 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1120 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1121 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1122 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1123 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1124 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1125 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1126 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1127 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1128 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1129 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1130 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1131 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1132 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1133 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1134 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1135 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1136 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1137 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1138 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1139 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1140 	0x18, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1141 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1142 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1143 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1144 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1145 	/* page 2: null data */
1146 	0x48, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1147 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1148 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
1149 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1150 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1151 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1152 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1153 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1154 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1155 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1156 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1157 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1158 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1159 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1160 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1161 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1162 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1163 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1164 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1165 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1166 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1167 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1168 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1169 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1170 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1171 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1172 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1173 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1174 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1175 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1176 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1177 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1178 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1179 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1180 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1181 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1182 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1183 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1184 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1185 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1186 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1187 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1188 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1189 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1190 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1191 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1192 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1193 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1194 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1195 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1196 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1197 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1198 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1199 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1200 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1201 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1202 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1203 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1204 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1205 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1206 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1207 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1208 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1209 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1210 	/* page 3: Qos null data */
1211 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1212 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1213 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
1214 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1215 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1216 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1217 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1218 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1219 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1220 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1221 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1222 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1223 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1224 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1225 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1226 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1227 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1228 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1229 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1230 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1231 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1232 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1233 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1234 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1235 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1236 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1237 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1238 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1239 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1240 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1241 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1242 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1243 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1244 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1245 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1246 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1247 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1248 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1249 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1250 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1251 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1252 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1253 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1254 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1255 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1256 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1257 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1258 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1259 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1260 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1261 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1262 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1263 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1264 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1265 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1266 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1267 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1268 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1269 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1270 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1271 	0x00, 0x00, 0x80, 0x00,  0x00, 0x01, 0x00, 0x00,
1272 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1273 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1274 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1275 	/* page 4: BT Qos null data */
1276 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1277 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1278 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
1279 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1280 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1281 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1282 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1283 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1284 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1285 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1286 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1287 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1288 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1289 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1290 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1291 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1292 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1293 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1294 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1295 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1296 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1297 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1298 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1299 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1300 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1301 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1302 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1303 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1304 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1305 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1306 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1307 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1308 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1309 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1310 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1311 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1312 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1313 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1314 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1315 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1316 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1317 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1318 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1319 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1320 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1321 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1322 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1323 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1324 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1325 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1326 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1327 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1328 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1329 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1330 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1331 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1332 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1333 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1334 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1335 	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1336 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1337 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1338 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1339 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1340 	/* page 5~7 is for wowlan */
1341 	/* page 5: ARP resp */
1342 	0x08, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1343 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1344 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
1345 	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
1346 	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
1347 	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
1348 	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1349 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1350 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1351 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1352 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1353 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1354 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1355 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1356 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1357 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1358 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1359 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1360 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1361 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1362 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1363 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1364 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1365 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1366 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1367 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1368 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1369 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1370 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1371 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1372 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1373 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1374 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1375 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1376 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1377 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1378 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1379 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1380 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1381 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1382 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1383 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1384 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1385 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1386 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1387 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1388 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1389 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1390 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1391 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1392 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1393 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1394 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1395 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1396 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1397 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1398 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1399 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1400 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1401 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1402 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1403 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1404 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1405 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1406 	/* page 6: H2C_REMOTE_WAKE_CTRL_INFO */
1407 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1408 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1409 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1410 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1411 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1412 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1413 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1414 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1415 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1416 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1417 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1418 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1419 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1420 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1421 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1422 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1423 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1424 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1425 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1426 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1427 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1428 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1429 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1430 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1431 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1432 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1433 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1434 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1435 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1436 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1437 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1438 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1439 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1440 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1441 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1442 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1443 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1444 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1445 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1446 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1447 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1448 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1449 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1450 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1451 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1452 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1453 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1454 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1455 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1456 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1457 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1458 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1459 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1460 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1461 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1462 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1463 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1464 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1465 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1466 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1467 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1468 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1469 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1470 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1471 	/* page 7: Rsvd GTK extend memory (zero memory) */
1472 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1473 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1474 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1475 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1476 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1477 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1478 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1479 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1480 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1481 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1482 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1483 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1484 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1485 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1486 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1487 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1488 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1489 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1490 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1491 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1492 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1493 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1494 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1495 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1496 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1497 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1498 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1499 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1500 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1501 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1502 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1503 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1504 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1505 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1506 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1507 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1508 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1509 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1510 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1511 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1512 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1513 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1514 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1515 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1516 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1517 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1518 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1519 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1520 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1521 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1522 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1523 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1524 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1525 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1526 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1527 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1528 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1529 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1530 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1531 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1532 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1533 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1534 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1535 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1536 };
1537 
1538 void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1539 				  bool b_dl_finished, bool dl_whole_packets)
1540 {
1541 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1542 	struct rtl_mac *mac = rtl_mac(rtlpriv);
1543 	struct sk_buff *skb = NULL;
1544 	u32 totalpacketlen;
1545 	bool rtstatus;
1546 	u8 u1RsvdPageLoc[5] = { 0 };
1547 	u8 u1RsvdPageLoc2[7] = { 0 };
1548 	bool b_dlok = false;
1549 	u8 *beacon;
1550 	u8 *p_pspoll;
1551 	u8 *nullfunc;
1552 	u8 *qosnull;
1553 	u8 *btqosnull;
1554 	u8 *arpresp;
1555 
1556 	/*---------------------------------------------------------
1557 	 *			(1) beacon
1558 	 *---------------------------------------------------------
1559 	 */
1560 	beacon = &reserved_page_packet_8812[BEACON_PG * 512];
1561 	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1562 	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1563 
1564 	if (b_dl_finished) {
1565 		totalpacketlen = 512 - 40;
1566 		goto out;
1567 	}
1568 	/*-------------------------------------------------------
1569 	 *			(2) ps-poll
1570 	 *--------------------------------------------------------
1571 	 */
1572 	p_pspoll = &reserved_page_packet_8812[PSPOLL_PG * 512];
1573 	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1574 	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1575 	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1576 
1577 	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1578 
1579 	/*--------------------------------------------------------
1580 	 *			(3) null data
1581 	 *---------------------------------------------------------
1582 	 */
1583 	nullfunc = &reserved_page_packet_8812[NULL_PG * 512];
1584 	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1585 	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1586 	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1587 
1588 	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1589 
1590 	/*---------------------------------------------------------
1591 	 *			(4) Qos null data
1592 	 *----------------------------------------------------------
1593 	 */
1594 	qosnull = &reserved_page_packet_8812[QOSNULL_PG * 512];
1595 	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1596 	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1597 	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1598 
1599 	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1600 
1601 	/*---------------------------------------------------------
1602 	 *			(5) BT Qos null data
1603 	 *----------------------------------------------------------
1604 	 */
1605 	btqosnull = &reserved_page_packet_8812[BT_QOSNULL_PG * 512];
1606 	SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid);
1607 	SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr);
1608 	SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid);
1609 
1610 	SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1RsvdPageLoc, BT_QOSNULL_PG);
1611 
1612 	if (!dl_whole_packets) {
1613 		totalpacketlen = 512 * (BT_QOSNULL_PG + 1) - 40;
1614 		goto out;
1615 	}
1616 	/*---------------------------------------------------------
1617 	 *			(6) ARP Resp
1618 	 *----------------------------------------------------------
1619 	 */
1620 	arpresp = &reserved_page_packet_8812[ARPRESP_PG * 512];
1621 	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1622 	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1623 	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1624 
1625 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1626 
1627 	/*---------------------------------------------------------
1628 	 *			(7) Remote Wake Ctrl
1629 	 *----------------------------------------------------------
1630 	 */
1631 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1632 								REMOTE_PG);
1633 
1634 	/*---------------------------------------------------------
1635 	 *			(8) GTK Ext Memory
1636 	 *----------------------------------------------------------
1637 	 */
1638 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1639 
1640 	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8812 - 40;
1641 
1642 out:
1643 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1644 		      "rtl8812ae_set_fw_rsvdpagepkt(): packet data\n",
1645 		      &reserved_page_packet_8812[0], totalpacketlen);
1646 
1647 	skb = dev_alloc_skb(totalpacketlen);
1648 	skb_put_data(skb, &reserved_page_packet_8812, totalpacketlen);
1649 
1650 	rtstatus = rtl_cmd_send_packet(hw, skb);
1651 
1652 	if (rtstatus)
1653 		b_dlok = true;
1654 
1655 	if (!b_dl_finished && b_dlok) {
1656 		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1657 			      "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1658 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1659 				       sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1660 		if (dl_whole_packets) {
1661 			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1662 				      "wowlan H2C_RSVDPAGE:\n", u1RsvdPageLoc2, 7);
1663 			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1664 					       sizeof(u1RsvdPageLoc2), u1RsvdPageLoc2);
1665 		}
1666 	}
1667 
1668 	if (!b_dlok)
1669 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1670 			 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1671 }
1672 
1673 void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1674 				  bool b_dl_finished, bool dl_whole_packets)
1675 {
1676 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1677 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1678 	struct sk_buff *skb = NULL;
1679 	u32 totalpacketlen;
1680 	bool rtstatus;
1681 	u8 u1RsvdPageLoc[5] = { 0 };
1682 	u8 u1RsvdPageLoc2[7] = { 0 };
1683 	bool b_dlok = false;
1684 	u8 *beacon;
1685 	u8 *p_pspoll;
1686 	u8 *nullfunc;
1687 	u8 *qosnull;
1688 	u8 *btqosnull;
1689 	u8 *arpresp;
1690 
1691 	/*---------------------------------------------------------
1692 	 *			(1) beacon
1693 	 *---------------------------------------------------------
1694 	 */
1695 	beacon = &reserved_page_packet_8821[BEACON_PG * 256];
1696 	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1697 	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1698 
1699 	if (b_dl_finished) {
1700 		totalpacketlen = 256 - 40;
1701 		goto out;
1702 	}
1703 	/*-------------------------------------------------------
1704 	 *			(2) ps-poll
1705 	 *--------------------------------------------------------
1706 	 */
1707 	p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256];
1708 	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1709 	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1710 	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1711 
1712 	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1713 
1714 	/*--------------------------------------------------------
1715 	 *			(3) null data
1716 	 *---------------------------------------------------------i
1717 	 */
1718 	nullfunc = &reserved_page_packet_8821[NULL_PG * 256];
1719 	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1720 	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1721 	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1722 
1723 	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1724 
1725 	/*---------------------------------------------------------
1726 	 *			(4) Qos null data
1727 	 *----------------------------------------------------------
1728 	 */
1729 	qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256];
1730 	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1731 	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1732 	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1733 
1734 	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1735 
1736 	/*---------------------------------------------------------
1737 	 *			(5) Qos null data
1738 	 *----------------------------------------------------------
1739 	 */
1740 	btqosnull = &reserved_page_packet_8821[BT_QOSNULL_PG * 256];
1741 	SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid);
1742 	SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr);
1743 	SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid);
1744 
1745 	SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1RsvdPageLoc, BT_QOSNULL_PG);
1746 
1747 	if (!dl_whole_packets) {
1748 		totalpacketlen = 256 * (BT_QOSNULL_PG + 1) - 40;
1749 		goto out;
1750 	}
1751 	/*---------------------------------------------------------
1752 	 *			(6) ARP Resp
1753 	 *----------------------------------------------------------
1754 	 */
1755 	arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256];
1756 	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1757 	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1758 	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1759 
1760 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1761 
1762 	/*---------------------------------------------------------
1763 	 *			(7) Remote Wake Ctrl
1764 	 *----------------------------------------------------------
1765 	 */
1766 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1767 									REMOTE_PG);
1768 
1769 	/*---------------------------------------------------------
1770 	 *			(8) GTK Ext Memory
1771 	 *----------------------------------------------------------
1772 	 */
1773 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1774 
1775 	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40;
1776 
1777 out:
1778 
1779 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1780 		      "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n",
1781 		      &reserved_page_packet_8821[0], totalpacketlen);
1782 
1783 	skb = dev_alloc_skb(totalpacketlen);
1784 	skb_put_data(skb, &reserved_page_packet_8821, totalpacketlen);
1785 
1786 	rtstatus = rtl_cmd_send_packet(hw, skb);
1787 
1788 	if (rtstatus)
1789 		b_dlok = true;
1790 
1791 	if (!b_dl_finished && b_dlok) {
1792 		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1793 			 "Set RSVD page location to Fw.\n");
1794 		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1795 				"H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1796 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1797 				       sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1798 		if (dl_whole_packets) {
1799 			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1800 				      "wowlan H2C_RSVDPAGE:\n",
1801 				      u1RsvdPageLoc2, 7);
1802 			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1803 					       sizeof(u1RsvdPageLoc2),
1804 					       u1RsvdPageLoc2);
1805 		}
1806 	}
1807 
1808 	if (!b_dlok) {
1809 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1810 			 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1811 	}
1812 }
1813 
1814 /*Should check FW support p2p or not.*/
1815 static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
1816 {
1817 	u8 u1_ctwindow_period[1] = { ctwindow};
1818 
1819 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1,
1820 			       u1_ctwindow_period);
1821 }
1822 
1823 void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
1824 {
1825 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1826 	struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
1827 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1828 	struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
1829 	struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
1830 	u8	i;
1831 	u16	ctwindow;
1832 	u32	start_time, tsf_low;
1833 
1834 	switch (p2p_ps_state) {
1835 	case P2P_PS_DISABLE:
1836 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
1837 		memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
1838 		break;
1839 	case P2P_PS_ENABLE:
1840 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
1841 		/* update CTWindow value. */
1842 		if (p2pinfo->ctwindow > 0) {
1843 			p2p_ps_offload->ctwindow_en = 1;
1844 			ctwindow = p2pinfo->ctwindow;
1845 			rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow);
1846 		}
1847 
1848 		/* hw only support 2 set of NoA */
1849 		for (i = 0 ; i < p2pinfo->noa_num ; i++) {
1850 			/* To control the register setting for which NOA*/
1851 			rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
1852 			if (i == 0)
1853 				p2p_ps_offload->noa0_en = 1;
1854 			else
1855 				p2p_ps_offload->noa1_en = 1;
1856 
1857 			/* config P2P NoA Descriptor Register */
1858 			rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]);
1859 			rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]);
1860 
1861 			/*Get Current TSF value */
1862 			tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
1863 
1864 			start_time = p2pinfo->noa_start_time[i];
1865 			if (p2pinfo->noa_count_type[i] != 1) {
1866 				while (start_time <= (tsf_low+(50*1024))) {
1867 					start_time += p2pinfo->noa_interval[i];
1868 					if (p2pinfo->noa_count_type[i] != 255)
1869 						p2pinfo->noa_count_type[i]--;
1870 				}
1871 			}
1872 			rtl_write_dword(rtlpriv, 0x5E8, start_time);
1873 			rtl_write_dword(rtlpriv, 0x5EC,
1874 					p2pinfo->noa_count_type[i]);
1875 		}
1876 
1877 		if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
1878 			/* rst p2p circuit */
1879 			rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
1880 
1881 			p2p_ps_offload->offload_en = 1;
1882 
1883 			if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
1884 				p2p_ps_offload->role = 1;
1885 				p2p_ps_offload->allstasleep = 0;
1886 			} else {
1887 				p2p_ps_offload->role = 0;
1888 			}
1889 
1890 			p2p_ps_offload->discovery = 0;
1891 		}
1892 		break;
1893 	case P2P_PS_SCAN:
1894 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
1895 		p2p_ps_offload->discovery = 1;
1896 		break;
1897 	case P2P_PS_SCAN_DONE:
1898 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
1899 		p2p_ps_offload->discovery = 0;
1900 		p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
1901 		break;
1902 	default:
1903 		break;
1904 	}
1905 
1906 	rtl8821ae_fill_h2c_cmd(hw,
1907 			H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
1908 }
1909 
1910 static void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
1911 				     u8 *cmd_buf, u8 cmd_len)
1912 {
1913 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1914 	u8 rate = cmd_buf[0] & 0x3F;
1915 
1916 	rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate);
1917 
1918 	rtl8821ae_dm_update_init_rate(hw, rate);
1919 }
1920 
1921 void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
1922 				   u8 c2h_cmd_id, u8 c2h_cmd_len,
1923 				   u8 *tmp_buf)
1924 {
1925 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1926 
1927 	switch (c2h_cmd_id) {
1928 	case C2H_8812_DBG:
1929 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n");
1930 		break;
1931 	case C2H_8812_TX_REPORT:
1932 		rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
1933 		break;
1934 	case C2H_8812_RA_RPT:
1935 		rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
1936 		break;
1937 	case C2H_8812_BT_INFO:
1938 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1939 			 "[C2H], C2H_8812_BT_INFO!!\n");
1940 		if (rtlpriv->cfg->ops->get_btc_status())
1941 			rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv,
1942 								      tmp_buf,
1943 								      c2h_cmd_len);
1944 		break;
1945 	default:
1946 		break;
1947 	}
1948 }
1949 
1950 void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer,
1951 				  u8 length)
1952 {
1953 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1954 	u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
1955 	u8 *tmp_buf = NULL;
1956 
1957 	c2h_cmd_id = buffer[0];
1958 	c2h_cmd_seq = buffer[1];
1959 	c2h_cmd_len = length - 2;
1960 	tmp_buf = buffer + 2;
1961 
1962 	RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1963 		 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
1964 		 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
1965 
1966 	RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD,
1967 		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
1968 
1969 	switch (c2h_cmd_id) {
1970 	case C2H_8812_BT_INFO:
1971 		rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
1972 		break;
1973 
1974 	default:
1975 		rtl8821ae_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len,
1976 					      tmp_buf);
1977 		break;
1978 	}
1979 }
1980