• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2009-2010  Realtek Corporation.*/
3 
4 #include "../wifi.h"
5 #include "../pci.h"
6 #include "../base.h"
7 #include "../core.h"
8 #include "../efuse.h"
9 #include "reg.h"
10 #include "def.h"
11 #include "fw.h"
12 #include "dm.h"
13 
_rtl8821ae_enable_fw_download(struct ieee80211_hw * hw,bool enable)14 static void _rtl8821ae_enable_fw_download(struct ieee80211_hw *hw, bool enable)
15 {
16 	struct rtl_priv *rtlpriv = rtl_priv(hw);
17 	u8 tmp;
18 
19 	if (enable) {
20 		rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x05);
21 
22 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
23 		rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
24 
25 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
26 	} else {
27 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
28 		rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
29 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
30 	}
31 }
32 
_rtl8821ae_write_fw(struct ieee80211_hw * hw,enum version_8821ae version,u8 * buffer,u32 size)33 static void _rtl8821ae_write_fw(struct ieee80211_hw *hw,
34 				enum version_8821ae version,
35 				u8 *buffer, u32 size)
36 {
37 	struct rtl_priv *rtlpriv = rtl_priv(hw);
38 	u8 *bufferptr = (u8 *)buffer;
39 	u32 pagenums, remainsize;
40 	u32 page, offset;
41 
42 	rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
43 
44 	rtl_fill_dummy(bufferptr, &size);
45 
46 	pagenums = size / FW_8821AE_PAGE_SIZE;
47 	remainsize = size % FW_8821AE_PAGE_SIZE;
48 
49 	if (pagenums > 8)
50 		pr_err("Page numbers should not greater then 8\n");
51 
52 	for (page = 0; page < pagenums; page++) {
53 		offset = page * FW_8821AE_PAGE_SIZE;
54 		rtl_fw_page_write(hw, page, (bufferptr + offset),
55 				  FW_8821AE_PAGE_SIZE);
56 	}
57 
58 	if (remainsize) {
59 		offset = pagenums * FW_8821AE_PAGE_SIZE;
60 		page = pagenums;
61 		rtl_fw_page_write(hw, page, (bufferptr + offset), remainsize);
62 	}
63 }
64 
_rtl8821ae_fw_free_to_go(struct ieee80211_hw * hw)65 static int _rtl8821ae_fw_free_to_go(struct ieee80211_hw *hw)
66 {
67 	struct rtl_priv *rtlpriv = rtl_priv(hw);
68 	int err = -EIO;
69 	u32 counter = 0;
70 	u32 value32;
71 
72 	do {
73 		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
74 	} while ((counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT) &&
75 		 (!(value32 & FWDL_CHKSUM_RPT)));
76 
77 	if (counter >= FW_8821AE_POLLING_TIMEOUT_COUNT) {
78 		rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
79 			"chksum report fail! REG_MCUFWDL:0x%08x .\n",
80 			value32);
81 		goto exit;
82 	}
83 	value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
84 	value32 |= MCUFWDL_RDY;
85 	value32 &= ~WINTINI_RDY;
86 	rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
87 
88 	rtl8821ae_firmware_selfreset(hw);
89 
90 	counter = 0;
91 	do {
92 		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
93 		if (value32 & WINTINI_RDY)
94 			return 0;
95 
96 		udelay(FW_8821AE_POLLING_DELAY);
97 	} while (counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT);
98 
99 	pr_err("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n",
100 	       value32);
101 
102 exit:
103 	return err;
104 }
105 
_rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv * rtlpriv)106 static void _rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv *rtlpriv)
107 {
108 	u8 val;
109 	u16 count = 0;
110 
111 	do {
112 		val = rtl_read_byte(rtlpriv, REG_HMETFR);
113 		mdelay(1);
114 		count++;
115 	} while ((val & 0x0F) && (count < 1000));
116 }
117 
rtl8821ae_download_fw(struct ieee80211_hw * hw,bool buse_wake_on_wlan_fw)118 int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
119 {
120 	struct rtl_priv *rtlpriv = rtl_priv(hw);
121 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
122 	struct rtlwifi_firmware_header *pfwheader;
123 	u8 *pfwdata;
124 	u32 fwsize;
125 	int err;
126 	bool support_remote_wakeup;
127 	enum version_8821ae version = rtlhal->version;
128 
129 	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
130 				      (u8 *)(&support_remote_wakeup));
131 
132 	if (support_remote_wakeup)
133 		_rtl8821ae_wait_for_h2c_cmd_finish(rtlpriv);
134 
135 	if (buse_wake_on_wlan_fw) {
136 		if (!rtlhal->wowlan_firmware)
137 			return 1;
138 
139 		pfwheader =
140 		  (struct rtlwifi_firmware_header *)rtlhal->wowlan_firmware;
141 		rtlhal->fw_version = le16_to_cpu(pfwheader->version);
142 		rtlhal->fw_subversion = pfwheader->subversion;
143 		pfwdata = (u8 *)rtlhal->wowlan_firmware;
144 		fwsize = rtlhal->wowlan_fwsize;
145 	} else {
146 		if (!rtlhal->pfirmware)
147 			return 1;
148 
149 		pfwheader =
150 		  (struct rtlwifi_firmware_header *)rtlhal->pfirmware;
151 		rtlhal->fw_version = le16_to_cpu(pfwheader->version);
152 		rtlhal->fw_subversion = pfwheader->subversion;
153 		pfwdata = (u8 *)rtlhal->pfirmware;
154 		fwsize = rtlhal->fwsize;
155 	}
156 
157 	rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,
158 		"%s Firmware SIZE %d\n",
159 		buse_wake_on_wlan_fw ? "Wowlan" : "Normal", fwsize);
160 
161 	if (IS_FW_HEADER_EXIST_8812(pfwheader) ||
162 	    IS_FW_HEADER_EXIST_8821(pfwheader)) {
163 		rtl_dbg(rtlpriv, COMP_FW, DBG_DMESG,
164 			"Firmware Version(%d), Signature(%#x)\n",
165 			pfwheader->version, pfwheader->signature);
166 
167 		pfwdata = pfwdata + sizeof(struct rtlwifi_firmware_header);
168 		fwsize = fwsize - sizeof(struct rtlwifi_firmware_header);
169 	}
170 
171 	if (rtlhal->mac_func_enable) {
172 		if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
173 			rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
174 			rtl8821ae_firmware_selfreset(hw);
175 		}
176 	}
177 	_rtl8821ae_enable_fw_download(hw, true);
178 	_rtl8821ae_write_fw(hw, version, pfwdata, fwsize);
179 	_rtl8821ae_enable_fw_download(hw, false);
180 
181 	err = _rtl8821ae_fw_free_to_go(hw);
182 	if (err) {
183 		rtl_dbg(rtlpriv, COMP_ERR, DBG_DMESG,
184 			"Firmware is not ready to run!\n");
185 	} else {
186 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD,
187 			"Firmware is ready to run!\n");
188 	}
189 
190 	return 0;
191 }
192 
193 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw * hw,bool used_wowlan_fw)194 void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
195 					 bool used_wowlan_fw)
196 {
197 	struct rtl_priv *rtlpriv = rtl_priv(hw);
198 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
199 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
200 	/* 1. Before WoWLAN or After WOWLAN we need to re-download Fw. */
201 	if (rtl8821ae_download_fw(hw, used_wowlan_fw)) {
202 		rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
203 			"Re-Download Firmware failed!!\n");
204 		rtlhal->fw_ready = false;
205 		return;
206 	}
207 	rtl_dbg(rtlpriv, COMP_INIT, DBG_DMESG,
208 		"Re-Download Firmware Success !!\n");
209 	rtlhal->fw_ready = true;
210 
211 	/* 2. Re-Init the variables about Fw related setting. */
212 	ppsc->fw_current_inpsmode = false;
213 	rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
214 	rtlhal->fw_clk_change_in_progress = false;
215 	rtlhal->allow_sw_to_change_hwclc = false;
216 	rtlhal->last_hmeboxnum = 0;
217 }
218 #endif
219 
_rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw * hw,u8 boxnum)220 static bool _rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw *hw,
221 					      u8 boxnum)
222 {
223 	struct rtl_priv *rtlpriv = rtl_priv(hw);
224 	u8 val_hmetfr;
225 	bool result = false;
226 
227 	val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
228 	if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
229 		result = true;
230 	return result;
231 }
232 
_rtl8821ae_fill_h2c_command(struct ieee80211_hw * hw,u8 element_id,u32 cmd_len,u8 * cmdbuffer)233 static void _rtl8821ae_fill_h2c_command(struct ieee80211_hw *hw,
234 					u8 element_id, u32 cmd_len,
235 					u8 *cmdbuffer)
236 {
237 	struct rtl_priv *rtlpriv = rtl_priv(hw);
238 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
239 	u8 boxnum = 0;
240 	u16 box_reg = 0, box_extreg = 0;
241 	u8 u1b_tmp = 0;
242 	bool isfw_read = false;
243 	u8 buf_index = 0;
244 	bool bwrite_sucess = false;
245 	u8 wait_h2c_limmit = 100;
246 	/*u8 wait_writeh2c_limmit = 100;*/
247 	u8 boxcontent[4], boxextcontent[4];
248 	u32 h2c_waitcounter = 0;
249 	unsigned long flag = 0;
250 	u8 idx = 0;
251 
252 	rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
253 
254 	while (true) {
255 		spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
256 		if (rtlhal->h2c_setinprogress) {
257 			rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
258 				"H2C set in progress! Wait to set..element_id(%d).\n",
259 				element_id);
260 
261 			while (rtlhal->h2c_setinprogress) {
262 				spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
263 						       flag);
264 				h2c_waitcounter++;
265 				rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
266 					"Wait 100 us (%d times)...\n",
267 					h2c_waitcounter);
268 				udelay(100);
269 
270 				if (h2c_waitcounter > 1000)
271 					return;
272 				spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
273 						  flag);
274 			}
275 			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
276 		} else {
277 			rtlhal->h2c_setinprogress = true;
278 			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
279 			break;
280 		}
281 	}
282 
283 	while (!bwrite_sucess) {
284 		boxnum = rtlhal->last_hmeboxnum;
285 		switch (boxnum) {
286 		case 0:
287 			box_reg = REG_HMEBOX_0;
288 			box_extreg = REG_HMEBOX_EXT_0;
289 			break;
290 		case 1:
291 			box_reg = REG_HMEBOX_1;
292 			box_extreg = REG_HMEBOX_EXT_1;
293 			break;
294 		case 2:
295 			box_reg = REG_HMEBOX_2;
296 			box_extreg = REG_HMEBOX_EXT_2;
297 			break;
298 		case 3:
299 			box_reg = REG_HMEBOX_3;
300 			box_extreg = REG_HMEBOX_EXT_3;
301 			break;
302 		default:
303 			rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
304 				"switch case %#x not processed\n", boxnum);
305 			break;
306 		}
307 
308 		isfw_read = false;
309 		u1b_tmp = rtl_read_byte(rtlpriv, REG_CR);
310 
311 		if (u1b_tmp != 0xEA) {
312 			isfw_read = true;
313 		} else {
314 			if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xEA ||
315 			    rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xEA)
316 				rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xFF);
317 		}
318 
319 		if (isfw_read) {
320 			wait_h2c_limmit = 100;
321 			isfw_read =
322 			  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
323 			while (!isfw_read) {
324 				/*wait until Fw read*/
325 				wait_h2c_limmit--;
326 				if (wait_h2c_limmit == 0) {
327 					rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
328 						"Waiting too long for FW read clear HMEBox(%d)!\n",
329 						boxnum);
330 					break;
331 				}
332 
333 				udelay(10);
334 
335 				isfw_read =
336 				  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
337 				u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
338 				rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
339 					"Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
340 					boxnum, u1b_tmp);
341 			}
342 		}
343 
344 		if (!isfw_read) {
345 			rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
346 				"Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
347 				boxnum);
348 			break;
349 		}
350 
351 		memset(boxcontent, 0, sizeof(boxcontent));
352 		memset(boxextcontent, 0, sizeof(boxextcontent));
353 		boxcontent[0] = element_id;
354 		rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
355 			"Write element_id box_reg(%4x) = %2x\n",
356 			box_reg, element_id);
357 
358 		switch (cmd_len) {
359 		case 1:
360 		case 2:
361 		case 3:
362 			/*boxcontent[0] &= ~(BIT(7));*/
363 			memcpy((u8 *)(boxcontent) + 1,
364 			       cmdbuffer + buf_index, cmd_len);
365 
366 			for (idx = 0; idx < 4; idx++) {
367 				rtl_write_byte(rtlpriv, box_reg + idx,
368 					       boxcontent[idx]);
369 			}
370 			break;
371 		case 4:
372 		case 5:
373 		case 6:
374 		case 7:
375 			/*boxcontent[0] |= (BIT(7));*/
376 			memcpy((u8 *)(boxextcontent),
377 			       cmdbuffer + buf_index+3, cmd_len-3);
378 			memcpy((u8 *)(boxcontent) + 1,
379 			       cmdbuffer + buf_index, 3);
380 
381 			for (idx = 0; idx < 4; idx++) {
382 				rtl_write_byte(rtlpriv, box_extreg + idx,
383 					       boxextcontent[idx]);
384 			}
385 
386 			for (idx = 0; idx < 4; idx++) {
387 				rtl_write_byte(rtlpriv, box_reg + idx,
388 					       boxcontent[idx]);
389 			}
390 			break;
391 		default:
392 			rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
393 				"switch case %#x not processed\n", cmd_len);
394 			break;
395 		}
396 
397 		bwrite_sucess = true;
398 
399 		rtlhal->last_hmeboxnum = boxnum + 1;
400 		if (rtlhal->last_hmeboxnum == 4)
401 			rtlhal->last_hmeboxnum = 0;
402 
403 		rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD,
404 			"pHalData->last_hmeboxnum  = %d\n",
405 			rtlhal->last_hmeboxnum);
406 	}
407 
408 	spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
409 	rtlhal->h2c_setinprogress = false;
410 	spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
411 
412 	rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
413 }
414 
rtl8821ae_fill_h2c_cmd(struct ieee80211_hw * hw,u8 element_id,u32 cmd_len,u8 * cmdbuffer)415 void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw,
416 			    u8 element_id, u32 cmd_len, u8 *cmdbuffer)
417 {
418 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
419 	u32 tmp_cmdbuf[2];
420 
421 	if (!rtlhal->fw_ready) {
422 		WARN_ONCE(true,
423 			  "rtl8821ae: error H2C cmd because of Fw download fail!!!\n");
424 		return;
425 	}
426 
427 	memset(tmp_cmdbuf, 0, 8);
428 	memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
429 	_rtl8821ae_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
430 }
431 
rtl8821ae_firmware_selfreset(struct ieee80211_hw * hw)432 void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw)
433 {
434 	struct rtl_priv *rtlpriv = rtl_priv(hw);
435 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
436 	u8 u1b_tmp;
437 
438 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
439 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
440 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
441 	} else {
442 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
443 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(0))));
444 	}
445 
446 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
447 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
448 	udelay(50);
449 
450 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
451 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
452 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
453 	} else {
454 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
455 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(0)));
456 	}
457 
458 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
459 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
460 
461 	rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
462 		"_8051Reset8812ae(): 8051 reset success .\n");
463 }
464 
rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw * hw,u8 mode)465 void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
466 {
467 	struct rtl_priv *rtlpriv = rtl_priv(hw);
468 	u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 };
469 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
470 	u8 rlbm, power_state = 0, byte5 = 0;
471 	u8 awake_intvl;	/* DTIM = (awake_intvl - 1) */
472 	struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
473 	bool bt_ctrl_lps = (rtlpriv->cfg->ops->get_btc_status() ?
474 			    btc_ops->btc_is_bt_ctrl_lps(rtlpriv) : false);
475 	bool bt_lps_on = (rtlpriv->cfg->ops->get_btc_status() ?
476 			  btc_ops->btc_is_bt_lps_on(rtlpriv) : false);
477 
478 	if (bt_ctrl_lps)
479 		mode = (bt_lps_on ? FW_PS_MIN_MODE : FW_PS_ACTIVE_MODE);
480 
481 	rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG, "FW LPS mode = %d (coex:%d)\n",
482 		mode, bt_ctrl_lps);
483 
484 	switch (mode) {
485 	case FW_PS_MIN_MODE:
486 		rlbm = 0;
487 		awake_intvl = 2;
488 		break;
489 	case FW_PS_MAX_MODE:
490 		rlbm = 1;
491 		awake_intvl = 2;
492 		break;
493 	case FW_PS_DTIM_MODE:
494 		rlbm = 2;
495 		awake_intvl = ppsc->reg_max_lps_awakeintvl;
496 		/* hw->conf.ps_dtim_period or mac->vif->bss_conf.dtim_period
497 		 * is only used in swlps.
498 		 */
499 		break;
500 	default:
501 		rlbm = 2;
502 		awake_intvl = 4;
503 		break;
504 	}
505 
506 	if (rtlpriv->mac80211.p2p) {
507 		awake_intvl = 2;
508 		rlbm = 1;
509 	}
510 
511 	if (mode == FW_PS_ACTIVE_MODE) {
512 		byte5 = 0x40;
513 		power_state = FW_PWR_STATE_ACTIVE;
514 	} else {
515 		if (bt_ctrl_lps) {
516 			byte5 = btc_ops->btc_get_lps_val(rtlpriv);
517 			power_state = btc_ops->btc_get_rpwm_val(rtlpriv);
518 
519 			if ((rlbm == 2) && (byte5 & BIT(4))) {
520 				/* Keep awake interval to 1 to prevent from
521 				 * decreasing coex performance
522 				 */
523 				awake_intvl = 2;
524 				rlbm = 2;
525 			}
526 		} else {
527 			byte5 = 0x40;
528 			power_state = FW_PWR_STATE_RF_OFF;
529 		}
530 	}
531 
532 	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
533 	SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
534 	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
535 					 bt_ctrl_lps ? 0 :
536 					 ((rtlpriv->mac80211.p2p) ?
537 					  ppsc->smart_ps : 1));
538 	SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
539 					       awake_intvl);
540 	SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
541 	SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
542 	SET_H2CCMD_PWRMODE_PARM_BYTE5(u1_h2c_set_pwrmode, byte5);
543 
544 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
545 		      "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
546 		      u1_h2c_set_pwrmode, H2C_8821AE_PWEMODE_LENGTH);
547 	if (rtlpriv->cfg->ops->get_btc_status())
548 		btc_ops->btc_record_pwr_mode(rtlpriv, u1_h2c_set_pwrmode,
549 					     H2C_8821AE_PWEMODE_LENGTH);
550 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_SETPWRMODE,
551 			       H2C_8821AE_PWEMODE_LENGTH,
552 			       u1_h2c_set_pwrmode);
553 }
554 
rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw * hw,u8 mstatus)555 void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,
556 					   u8 mstatus)
557 {
558 	u8 parm[3] = { 0, 0, 0 };
559 	/* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect
560 	 *          bit1=0-->update Media Status to MACID
561 	 *          bit1=1-->update Media Status from MACID to MACID_End
562 	 * parm[1]: MACID, if this is INFRA_STA, MacID = 0
563 	 * parm[2]: MACID_End
564 	 */
565 
566 	SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus);
567 	SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0);
568 
569 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_MSRRPT, 3, parm);
570 }
571 
rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw * hw,u8 ap_offload_enable)572 void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
573 				      u8 ap_offload_enable)
574 {
575 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
576 	u8 u1_apoffload_parm[H2C_8821AE_AP_OFFLOAD_LENGTH] = { 0 };
577 
578 	SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable);
579 	SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
580 	SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
581 
582 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AP_OFFLOAD,
583 			       H2C_8821AE_AP_OFFLOAD_LENGTH,
584 			       u1_apoffload_parm);
585 }
586 
rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw * hw,bool func_en)587 void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en)
588 {
589 	struct rtl_priv *rtlpriv = rtl_priv(hw);
590 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
591 	u8 fw_wowlan_info[H2C_8821AE_WOWLAN_LENGTH] = {0};
592 
593 	rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "enable(%d)\n", func_en);
594 
595 	SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(fw_wowlan_info,
596 					   (func_en ? true : false));
597 
598 	SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(fw_wowlan_info,
599 		((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) ? 1 : 0));
600 	SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(fw_wowlan_info,
601 		((ppsc->wo_wlan_mode & WAKE_ON_MAGIC_PACKET) ? 1 : 0));
602 
603 	SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(fw_wowlan_info, 0);
604 	SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(fw_wowlan_info, false);
605 	SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(fw_wowlan_info, 0);
606 	SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(fw_wowlan_info, 1);
607 	SET_8812_H2CCMD_WOWLAN_GPIONUM(fw_wowlan_info, 0);
608 	SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(fw_wowlan_info, 0);
609 
610 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_DMESG,
611 		      "wowlan mode: cmd 0x80: Content:\n",
612 		      fw_wowlan_info, H2C_8821AE_WOWLAN_LENGTH);
613 
614 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_WO_WLAN,
615 			       H2C_8821AE_WOWLAN_LENGTH,
616 			       fw_wowlan_info);
617 }
618 
rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw * hw,u8 enable)619 void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,
620 					   u8 enable)
621 {
622 	struct rtl_priv *rtlpriv = rtl_priv(hw);
623 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
624 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
625 	u8 remote_wake_ctrl_parm[H2C_8821AE_REMOTE_WAKE_CTRL_LEN] = {0};
626 
627 	rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
628 		"enable=%d, ARP offload=%d, GTK offload=%d\n",
629 		enable, ppsc->arp_offload_enable, ppsc->gtk_offload_enable);
630 
631 	SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(remote_wake_ctrl_parm, enable);
632 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(remote_wake_ctrl_parm,
633 					(ppsc->arp_offload_enable ? 1 : 0));
634 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(remote_wake_ctrl_parm,
635 					(ppsc->gtk_offload_enable ? 1 : 0));
636 	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(remote_wake_ctrl_parm,
637 					(rtlhal->real_wow_v2_enable ? 1 : 0));
638 
639 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
640 		      "remote_wake_ctrl: cmd 0x4: Content:\n",
641 		      remote_wake_ctrl_parm, H2C_8821AE_REMOTE_WAKE_CTRL_LEN);
642 
643 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_REMOTE_WAKE_CTRL,
644 			       H2C_8821AE_REMOTE_WAKE_CTRL_LEN,
645 			       remote_wake_ctrl_parm);
646 }
647 
rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw * hw,bool func_en)648 void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw,
649 				     bool func_en)
650 {
651 	struct rtl_priv *rtlpriv = rtl_priv(hw);
652 	u8 keep_alive_info[H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH] = {0};
653 
654 	rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Enable(%d)\n", func_en);
655 
656 	SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(keep_alive_info, func_en);
657 	/* 1: the period is controled by driver, 0: by Fw default */
658 	SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(keep_alive_info, 1);
659 	SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(keep_alive_info, 10); /* 10 sec */
660 
661 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
662 		      "keep alive: cmd 0x3: Content:\n",
663 		      keep_alive_info, H2C_8821AE_KEEP_ALIVE_CTRL);
664 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL,
665 			       H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH,
666 			       keep_alive_info);
667 }
668 
rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw * hw,bool enabled)669 void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
670 						   bool enabled)
671 {
672 	struct rtl_priv *rtlpriv = rtl_priv(hw);
673 	u8 parm[H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN] = {0};
674 
675 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(parm, enabled);
676 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(parm, 1);
677 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(parm, 30);
678 	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(parm, 3);
679 
680 	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
681 		      "disconnect_decision_ctrl: cmd 0x4: Content:\n",
682 		      parm, H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN);
683 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_DISCONNECT_DECISION,
684 			       H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN, parm);
685 }
686 
rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw * hw)687 void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw)
688 {
689 	struct rtl_priv *rtlpriv = rtl_priv(hw);
690 	struct rtl_security *sec = &rtlpriv->sec;
691 	u8 remote_wakeup_sec_info[H2C_8821AE_AOAC_GLOBAL_INFO_LEN] = {0};
692 
693 	rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
694 		"PairwiseEncAlgorithm=%d, GroupEncAlgorithm=%d\n",
695 		sec->pairwise_enc_algorithm, sec->group_enc_algorithm);
696 
697 	SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(
698 						remote_wakeup_sec_info,
699 						sec->pairwise_enc_algorithm);
700 	SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(remote_wakeup_sec_info,
701 						      sec->group_enc_algorithm);
702 
703 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_GLOBAL_INFO,
704 			       H2C_8821AE_AOAC_GLOBAL_INFO_LEN,
705 			       remote_wakeup_sec_info);
706 
707 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_TRACE,
708 		      "rtl8821ae_set_global_info: cmd 0x82:\n",
709 		      remote_wakeup_sec_info, H2C_8821AE_AOAC_GLOBAL_INFO_LEN);
710 }
711 
712 #define BEACON_PG		0
713 #define PSPOLL_PG		1
714 #define NULL_PG			2
715 #define QOSNULL_PG		3
716 #define BT_QOSNULL_PG	4
717 #define ARPRESP_PG		5
718 #define REMOTE_PG		6
719 #define GTKEXT_PG		7
720 
721 #define TOTAL_RESERVED_PKT_LEN_8812	4096
722 #define TOTAL_RESERVED_PKT_LEN_8821	2048
723 
724 static u8 reserved_page_packet_8821[TOTAL_RESERVED_PKT_LEN_8821] = {
725 	/* page 0: beacon */
726 	0x80, 0x00, 0x00, 0x00,  0xff, 0xff, 0xff, 0xff,
727 	0xff, 0xff, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
728 	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 0x20, 0x00,
729 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
730 	0x64, 0x00, 0x20, 0x04,  0x00, 0x06, 0x64, 0x6c,
731 	0x69, 0x6e, 0x6b, 0x31,  0x01, 0x08, 0x82, 0x84,
732 	0x8b, 0x96, 0x0c, 0x18,  0x30, 0x48, 0x03, 0x01,
733 	0x0b, 0x06, 0x02, 0x00,  0x00, 0x2a, 0x01, 0x8b,
734 	0x32, 0x04, 0x12, 0x24,  0x60, 0x6c, 0x00, 0x00,
735 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
736 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
737 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
738 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
739 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
740 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
741 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
742 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
743 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
744 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
745 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
746 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
747 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
748 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
749 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
750 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
751 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
752 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
753 	0x10, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
754 	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 0x00, 0x00,
755 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
756 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
757 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
758 	/* page 1: ps-poll */
759 	0xa4, 0x10, 0x01, 0xc0,  0x40, 0x16, 0x9f, 0x23,
760 	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
776 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
781 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
782 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
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 	0x18, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
787 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
788 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
789 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
790 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
791 	/* page 2: null data */
792 	0x48, 0x01, 0x00, 0x00,  0x40, 0x16, 0x9f, 0x23,
793 	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
794 	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
809 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
810 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
811 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
812 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
813 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
814 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
815 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
816 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
817 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
818 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
819 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
820 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
821 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
822 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
823 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
824 	/* page 3: qos null data */
825 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
826 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
827 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
842 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
843 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
844 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
845 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
846 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
847 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
848 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
849 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
850 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
851 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
852 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
853 	0x00, 0x00, 0x80, 0x00,  0x00, 0x01, 0x00, 0x00,
854 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
855 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
856 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
857 	/* page 4: BT qos null data */
858 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
859 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
860 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
875 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
876 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
877 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
878 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
879 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
880 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
881 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
882 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
883 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
884 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
885 	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
886 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
887 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
888 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
889 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
890 	/* page 5~7 is for wowlan */
891 	/* page 5: ARP resp */
892 	0x08, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
893 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
894 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
895 	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
896 	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
897 	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
898 	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
908 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
909 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
910 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
911 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
912 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
913 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
914 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
915 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
916 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
917 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
918 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
919 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
920 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
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 	/* page 6: H2C_REMOTE_WAKE_CTRL_INFO */
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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
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 	/* page 7: Rsvd GTK extend memory (zero memory) */
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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
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 };
991 
992 static u8 reserved_page_packet_8812[TOTAL_RESERVED_PKT_LEN_8812] = {
993 	/* page 0: beacon */
994 	0x80, 0x00, 0x00, 0x00,  0xFF, 0xFF, 0xFF, 0xFF,
995 	0xFF, 0xFF, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
996 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x60, 0x00,
997 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
998 	0x64, 0x00, 0x20, 0x04,  0x00, 0x03, 0x32, 0x31,
999 	0x35, 0x01, 0x08, 0x82,  0x84, 0x8B, 0x96, 0x0C,
1000 	0x12, 0x18, 0x24, 0x03,  0x01, 0x01, 0x06, 0x02,
1001 	0x00, 0x00, 0x2A, 0x01,  0x02, 0x32, 0x04, 0x30,
1002 	0x48, 0x60, 0x6C, 0x2D,  0x1A, 0xED, 0x09, 0x03,
1003 	0xFF, 0xFF, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1004 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1005 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x3D,
1006 	0x00, 0xDD, 0x07, 0x00,  0xE0, 0x4C, 0x02, 0x02,
1007 	0x08, 0x04, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1013 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1014 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1015 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1016 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1017 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1018 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1019 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1020 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1021 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1022 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1023 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1024 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1025 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1026 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1027 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1028 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1029 	0x00, 0x00, 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 	0x10, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1054 	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 0x00, 0x00,
1055 	0x04, 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 	/* page 1: ps-poll */
1059 	0xA4, 0x10, 0x09, 0xC0,  0x84, 0xC9, 0XB2, 0xA7,
1060 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1076 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1077 	0x00, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1081 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1082 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
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 	0x18, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1119 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1120 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1121 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1122 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1123 	/* page 2: null data */
1124 	0x48, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
1125 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1126 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1141 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1142 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1143 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1144 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1145 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1146 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1147 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1148 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 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 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1184 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1185 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1186 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1187 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1188 	/* page 3: Qos null data */
1189 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
1190 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1191 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1206 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1207 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1208 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1209 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1210 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1211 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1212 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1213 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 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 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1249 	0x00, 0x00, 0x80, 0x00,  0x00, 0x01, 0x00, 0x00,
1250 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1251 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1252 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1253 	/* page 4: BT Qos null data */
1254 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
1255 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1256 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1271 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1272 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1273 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1274 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1275 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1276 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1277 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1278 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 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 	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1314 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1315 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1316 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1317 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1318 	/* page 5~7 is for wowlan */
1319 	/* page 5: ARP resp */
1320 	0x08, 0x01, 0x00, 0x00,  0x84, 0xC9, 0XB2, 0xA7,
1321 	0XB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1322 	0x84, 0xC9, 0XB2, 0xA7,  0XB3, 0x6E, 0x00, 0x00,
1323 	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
1324 	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
1325 	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
1326 	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1336 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1337 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1338 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1339 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1340 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1341 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1342 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1343 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1344 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1345 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1346 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1347 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1348 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
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 	/* page 6: H2C_REMOTE_WAKE_CTRL_INFO */
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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
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 	/* page 7: Rsvd GTK extend memory (zero memory) */
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 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
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 };
1515 
rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw * hw,bool b_dl_finished,bool dl_whole_packets)1516 void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1517 				  bool b_dl_finished, bool dl_whole_packets)
1518 {
1519 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1520 	struct rtl_mac *mac = rtl_mac(rtlpriv);
1521 	struct sk_buff *skb = NULL;
1522 	u32 totalpacketlen;
1523 	bool rtstatus;
1524 	u8 u1rsvdpageloc[5] = { 0 };
1525 	u8 u1rsvdpageloc2[7] = { 0 };
1526 	bool b_dlok = false;
1527 	u8 *beacon;
1528 	u8 *p_pspoll;
1529 	u8 *nullfunc;
1530 	u8 *qosnull;
1531 	u8 *btqosnull;
1532 	u8 *arpresp;
1533 
1534 	/*---------------------------------------------------------
1535 	 *			(1) beacon
1536 	 *---------------------------------------------------------
1537 	 */
1538 	beacon = &reserved_page_packet_8812[BEACON_PG * 512];
1539 	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1540 	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1541 
1542 	if (b_dl_finished) {
1543 		totalpacketlen = 512 - 40;
1544 		goto out;
1545 	}
1546 	/*-------------------------------------------------------
1547 	 *			(2) ps-poll
1548 	 *--------------------------------------------------------
1549 	 */
1550 	p_pspoll = &reserved_page_packet_8812[PSPOLL_PG * 512];
1551 	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1552 	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1553 	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1554 
1555 	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
1556 
1557 	/*--------------------------------------------------------
1558 	 *			(3) null data
1559 	 *---------------------------------------------------------
1560 	 */
1561 	nullfunc = &reserved_page_packet_8812[NULL_PG * 512];
1562 	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1563 	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1564 	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1565 
1566 	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
1567 
1568 	/*---------------------------------------------------------
1569 	 *			(4) Qos null data
1570 	 *----------------------------------------------------------
1571 	 */
1572 	qosnull = &reserved_page_packet_8812[QOSNULL_PG * 512];
1573 	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1574 	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1575 	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1576 
1577 	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1rsvdpageloc, QOSNULL_PG);
1578 
1579 	/*---------------------------------------------------------
1580 	 *			(5) BT Qos null data
1581 	 *----------------------------------------------------------
1582 	 */
1583 	btqosnull = &reserved_page_packet_8812[BT_QOSNULL_PG * 512];
1584 	SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid);
1585 	SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr);
1586 	SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid);
1587 
1588 	SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1rsvdpageloc, BT_QOSNULL_PG);
1589 
1590 	if (!dl_whole_packets) {
1591 		totalpacketlen = 512 * (BT_QOSNULL_PG + 1) - 40;
1592 		goto out;
1593 	}
1594 	/*---------------------------------------------------------
1595 	 *			(6) ARP Resp
1596 	 *----------------------------------------------------------
1597 	 */
1598 	arpresp = &reserved_page_packet_8812[ARPRESP_PG * 512];
1599 	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1600 	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1601 	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1602 
1603 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1rsvdpageloc2, ARPRESP_PG);
1604 
1605 	/*---------------------------------------------------------
1606 	 *			(7) Remote Wake Ctrl
1607 	 *----------------------------------------------------------
1608 	 */
1609 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1rsvdpageloc2,
1610 								REMOTE_PG);
1611 
1612 	/*---------------------------------------------------------
1613 	 *			(8) GTK Ext Memory
1614 	 *----------------------------------------------------------
1615 	 */
1616 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1rsvdpageloc2, GTKEXT_PG);
1617 
1618 	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8812 - 40;
1619 
1620 out:
1621 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1622 		      "rtl8812ae_set_fw_rsvdpagepkt(): packet data\n",
1623 		      &reserved_page_packet_8812[0], totalpacketlen);
1624 
1625 	skb = dev_alloc_skb(totalpacketlen);
1626 	if (!skb)
1627 		return;
1628 	skb_put_data(skb, &reserved_page_packet_8812, totalpacketlen);
1629 
1630 	rtstatus = rtl_cmd_send_packet(hw, skb);
1631 
1632 	if (rtstatus)
1633 		b_dlok = true;
1634 
1635 	if (!b_dl_finished && b_dlok) {
1636 		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1637 			      "H2C_RSVDPAGE:\n", u1rsvdpageloc, 5);
1638 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1639 				       sizeof(u1rsvdpageloc), u1rsvdpageloc);
1640 		if (dl_whole_packets) {
1641 			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1642 				      "wowlan H2C_RSVDPAGE:\n", u1rsvdpageloc2, 7);
1643 			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1644 					       sizeof(u1rsvdpageloc2), u1rsvdpageloc2);
1645 		}
1646 	}
1647 
1648 	if (!b_dlok)
1649 		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1650 			"Set RSVD page location to Fw FAIL!!!!!!.\n");
1651 }
1652 
rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw * hw,bool b_dl_finished,bool dl_whole_packets)1653 void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1654 				  bool b_dl_finished, bool dl_whole_packets)
1655 {
1656 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1657 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1658 	struct sk_buff *skb = NULL;
1659 	u32 totalpacketlen;
1660 	bool rtstatus;
1661 	u8 u1rsvdpageloc[5] = { 0 };
1662 	u8 u1rsvdpageloc2[7] = { 0 };
1663 	bool b_dlok = false;
1664 	u8 *beacon;
1665 	u8 *p_pspoll;
1666 	u8 *nullfunc;
1667 	u8 *qosnull;
1668 	u8 *btqosnull;
1669 	u8 *arpresp;
1670 
1671 	/*---------------------------------------------------------
1672 	 *			(1) beacon
1673 	 *---------------------------------------------------------
1674 	 */
1675 	beacon = &reserved_page_packet_8821[BEACON_PG * 256];
1676 	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1677 	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1678 
1679 	if (b_dl_finished) {
1680 		totalpacketlen = 256 - 40;
1681 		goto out;
1682 	}
1683 	/*-------------------------------------------------------
1684 	 *			(2) ps-poll
1685 	 *--------------------------------------------------------
1686 	 */
1687 	p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256];
1688 	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1689 	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1690 	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1691 
1692 	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
1693 
1694 	/*--------------------------------------------------------
1695 	 *			(3) null data
1696 	 *---------------------------------------------------------i
1697 	 */
1698 	nullfunc = &reserved_page_packet_8821[NULL_PG * 256];
1699 	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1700 	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1701 	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1702 
1703 	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
1704 
1705 	/*---------------------------------------------------------
1706 	 *			(4) Qos null data
1707 	 *----------------------------------------------------------
1708 	 */
1709 	qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256];
1710 	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1711 	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1712 	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1713 
1714 	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1rsvdpageloc, QOSNULL_PG);
1715 
1716 	/*---------------------------------------------------------
1717 	 *			(5) Qos null data
1718 	 *----------------------------------------------------------
1719 	 */
1720 	btqosnull = &reserved_page_packet_8821[BT_QOSNULL_PG * 256];
1721 	SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid);
1722 	SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr);
1723 	SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid);
1724 
1725 	SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1rsvdpageloc, BT_QOSNULL_PG);
1726 
1727 	if (!dl_whole_packets) {
1728 		totalpacketlen = 256 * (BT_QOSNULL_PG + 1) - 40;
1729 		goto out;
1730 	}
1731 	/*---------------------------------------------------------
1732 	 *			(6) ARP Resp
1733 	 *----------------------------------------------------------
1734 	 */
1735 	arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256];
1736 	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1737 	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1738 	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1739 
1740 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1rsvdpageloc2, ARPRESP_PG);
1741 
1742 	/*---------------------------------------------------------
1743 	 *			(7) Remote Wake Ctrl
1744 	 *----------------------------------------------------------
1745 	 */
1746 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1rsvdpageloc2,
1747 									REMOTE_PG);
1748 
1749 	/*---------------------------------------------------------
1750 	 *			(8) GTK Ext Memory
1751 	 *----------------------------------------------------------
1752 	 */
1753 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1rsvdpageloc2, GTKEXT_PG);
1754 
1755 	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40;
1756 
1757 out:
1758 
1759 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1760 		      "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n",
1761 		      &reserved_page_packet_8821[0], totalpacketlen);
1762 
1763 	skb = dev_alloc_skb(totalpacketlen);
1764 	if (!skb)
1765 		return;
1766 	skb_put_data(skb, &reserved_page_packet_8821, totalpacketlen);
1767 
1768 	rtstatus = rtl_cmd_send_packet(hw, skb);
1769 
1770 	if (rtstatus)
1771 		b_dlok = true;
1772 
1773 	if (!b_dl_finished && b_dlok) {
1774 		rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
1775 			"Set RSVD page location to Fw.\n");
1776 		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1777 				"H2C_RSVDPAGE:\n", u1rsvdpageloc, 5);
1778 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1779 				       sizeof(u1rsvdpageloc), u1rsvdpageloc);
1780 		if (dl_whole_packets) {
1781 			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1782 				      "wowlan H2C_RSVDPAGE:\n",
1783 				      u1rsvdpageloc2, 7);
1784 			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1785 					       sizeof(u1rsvdpageloc2),
1786 					       u1rsvdpageloc2);
1787 		}
1788 	}
1789 
1790 	if (!b_dlok) {
1791 		rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1792 			"Set RSVD page location to Fw FAIL!!!!!!.\n");
1793 	}
1794 }
1795 
1796 /*Should check FW support p2p or not.*/
rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw * hw,u8 ctwindow)1797 static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
1798 {
1799 	u8 u1_ctwindow_period[1] = { ctwindow};
1800 
1801 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1,
1802 			       u1_ctwindow_period);
1803 }
1804 
rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw * hw,u8 p2p_ps_state)1805 void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
1806 {
1807 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1808 	struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
1809 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1810 	struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
1811 	struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
1812 	u8	i;
1813 	u16	ctwindow;
1814 	u32	start_time, tsf_low;
1815 
1816 	switch (p2p_ps_state) {
1817 	case P2P_PS_DISABLE:
1818 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
1819 		memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
1820 		break;
1821 	case P2P_PS_ENABLE:
1822 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
1823 		/* update CTWindow value. */
1824 		if (p2pinfo->ctwindow > 0) {
1825 			p2p_ps_offload->ctwindow_en = 1;
1826 			ctwindow = p2pinfo->ctwindow;
1827 			rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow);
1828 		}
1829 
1830 		/* hw only support 2 set of NoA */
1831 		for (i = 0 ; i < p2pinfo->noa_num ; i++) {
1832 			/* To control the register setting for which NOA*/
1833 			rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
1834 			if (i == 0)
1835 				p2p_ps_offload->noa0_en = 1;
1836 			else
1837 				p2p_ps_offload->noa1_en = 1;
1838 
1839 			/* config P2P NoA Descriptor Register */
1840 			rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]);
1841 			rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]);
1842 
1843 			/*Get Current TSF value */
1844 			tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
1845 
1846 			start_time = p2pinfo->noa_start_time[i];
1847 			if (p2pinfo->noa_count_type[i] != 1) {
1848 				while (start_time <= (tsf_low+(50*1024))) {
1849 					start_time += p2pinfo->noa_interval[i];
1850 					if (p2pinfo->noa_count_type[i] != 255)
1851 						p2pinfo->noa_count_type[i]--;
1852 				}
1853 			}
1854 			rtl_write_dword(rtlpriv, 0x5E8, start_time);
1855 			rtl_write_dword(rtlpriv, 0x5EC,
1856 					p2pinfo->noa_count_type[i]);
1857 		}
1858 
1859 		if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
1860 			/* rst p2p circuit */
1861 			rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
1862 
1863 			p2p_ps_offload->offload_en = 1;
1864 
1865 			if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
1866 				p2p_ps_offload->role = 1;
1867 				p2p_ps_offload->allstasleep = 0;
1868 			} else {
1869 				p2p_ps_offload->role = 0;
1870 			}
1871 
1872 			p2p_ps_offload->discovery = 0;
1873 		}
1874 		break;
1875 	case P2P_PS_SCAN:
1876 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
1877 		p2p_ps_offload->discovery = 1;
1878 		break;
1879 	case P2P_PS_SCAN_DONE:
1880 		rtl_dbg(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
1881 		p2p_ps_offload->discovery = 0;
1882 		p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
1883 		break;
1884 	default:
1885 		break;
1886 	}
1887 
1888 	rtl8821ae_fill_h2c_cmd(hw,
1889 			H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
1890 }
1891 
rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw * hw,u8 * cmd_buf,u8 cmd_len)1892 void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
1893 				     u8 *cmd_buf, u8 cmd_len)
1894 {
1895 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1896 	u8 rate = cmd_buf[0] & 0x3F;
1897 
1898 	rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate);
1899 
1900 	rtl8821ae_dm_update_init_rate(hw, rate);
1901 }
1902