xref: /openbmc/linux/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c (revision e4781421e883340b796da5a724bda7226817990b)
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 "reg.h"
31 #include "def.h"
32 #include "fw.h"
33 #include "dm.h"
34 
35 static void _rtl8821ae_enable_fw_download(struct ieee80211_hw *hw, bool enable)
36 {
37 	struct rtl_priv *rtlpriv = rtl_priv(hw);
38 	u8 tmp;
39 
40 	if (enable) {
41 		rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x05);
42 
43 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
44 		rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
45 
46 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
47 	} else {
48 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
49 		rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
50 		tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
51 	}
52 }
53 
54 static void _rtl8821ae_fw_block_write(struct ieee80211_hw *hw,
55 				      const u8 *buffer, u32 size)
56 {
57 	struct rtl_priv *rtlpriv = rtl_priv(hw);
58 	u32 blocksize = sizeof(u32);
59 	u8 *bufferptr = (u8 *)buffer;
60 	u32 *pu4byteptr = (u32 *)buffer;
61 	u32 i, offset, blockcount, remainsize;
62 
63 	blockcount = size / blocksize;
64 	remainsize = size % blocksize;
65 
66 	for (i = 0; i < blockcount; i++) {
67 		offset = i * blocksize;
68 		rtl_write_dword(rtlpriv, (FW_8821AE_START_ADDRESS + offset),
69 				*(pu4byteptr + i));
70 	}
71 
72 	if (remainsize) {
73 		offset = blockcount * blocksize;
74 		bufferptr += offset;
75 		for (i = 0; i < remainsize; i++) {
76 			rtl_write_byte(rtlpriv, (FW_8821AE_START_ADDRESS +
77 					offset + i), *(bufferptr + i));
78 		}
79 	}
80 }
81 
82 static void _rtl8821ae_fw_page_write(struct ieee80211_hw *hw,
83 				     u32 page, const u8 *buffer, u32 size)
84 {
85 	struct rtl_priv *rtlpriv = rtl_priv(hw);
86 	u8 value8;
87 	u8 u8page = (u8)(page & 0x07);
88 
89 	value8 = (rtl_read_byte(rtlpriv, REG_MCUFWDL + 2) & 0xF8) | u8page;
90 
91 	rtl_write_byte(rtlpriv, (REG_MCUFWDL + 2), value8);
92 	_rtl8821ae_fw_block_write(hw, buffer, size);
93 }
94 
95 static void _rtl8821ae_fill_dummy(u8 *pfwbuf, u32 *pfwlen)
96 {
97 	u32 fwlen = *pfwlen;
98 	u8 remain = (u8)(fwlen % 4);
99 
100 	remain = (remain == 0) ? 0 : (4 - remain);
101 
102 	while (remain > 0) {
103 		pfwbuf[fwlen] = 0;
104 		fwlen++;
105 		remain--;
106 	}
107 
108 	*pfwlen = fwlen;
109 }
110 
111 static void _rtl8821ae_write_fw(struct ieee80211_hw *hw,
112 				enum version_8821ae version,
113 				u8 *buffer, u32 size)
114 {
115 	struct rtl_priv *rtlpriv = rtl_priv(hw);
116 	u8 *bufferptr = (u8 *)buffer;
117 	u32 pagenums, remainsize;
118 	u32 page, offset;
119 
120 	RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
121 
122 	_rtl8821ae_fill_dummy(bufferptr, &size);
123 
124 	pagenums = size / FW_8821AE_PAGE_SIZE;
125 	remainsize = size % FW_8821AE_PAGE_SIZE;
126 
127 	if (pagenums > 8)
128 		pr_err("Page numbers should not greater then 8\n");
129 
130 	for (page = 0; page < pagenums; page++) {
131 		offset = page * FW_8821AE_PAGE_SIZE;
132 		_rtl8821ae_fw_page_write(hw, page, (bufferptr + offset),
133 					 FW_8821AE_PAGE_SIZE);
134 	}
135 
136 	if (remainsize) {
137 		offset = pagenums * FW_8821AE_PAGE_SIZE;
138 		page = pagenums;
139 		_rtl8821ae_fw_page_write(hw, page, (bufferptr + offset),
140 					 remainsize);
141 	}
142 }
143 
144 static int _rtl8821ae_fw_free_to_go(struct ieee80211_hw *hw)
145 {
146 	struct rtl_priv *rtlpriv = rtl_priv(hw);
147 	int err = -EIO;
148 	u32 counter = 0;
149 	u32 value32;
150 
151 	do {
152 		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
153 	} while ((counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT) &&
154 		 (!(value32 & FWDL_CHKSUM_RPT)));
155 
156 	if (counter >= FW_8821AE_POLLING_TIMEOUT_COUNT) {
157 		RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
158 			 "chksum report faill ! REG_MCUFWDL:0x%08x .\n",
159 			  value32);
160 		goto exit;
161 	}
162 	value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
163 	value32 |= MCUFWDL_RDY;
164 	value32 &= ~WINTINI_RDY;
165 	rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
166 
167 	rtl8821ae_firmware_selfreset(hw);
168 
169 	counter = 0;
170 	do {
171 		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
172 		if (value32 & WINTINI_RDY)
173 			return 0;
174 
175 		udelay(FW_8821AE_POLLING_DELAY);
176 	} while (counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT);
177 
178 	pr_err("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n",
179 	       value32);
180 
181 exit:
182 	return err;
183 }
184 
185 static void _rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv *rtlpriv)
186 {
187 	u8 val;
188 	u16 count = 0;
189 
190 	do {
191 		val = rtl_read_byte(rtlpriv, REG_HMETFR);
192 		mdelay(1);
193 		count++;
194 	} while ((val & 0x0F) && (count < 1000));
195 }
196 
197 int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
198 {
199 	struct rtl_priv *rtlpriv = rtl_priv(hw);
200 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
201 	struct rtlwifi_firmware_header *pfwheader;
202 	u8 *pfwdata;
203 	u32 fwsize;
204 	int err;
205 	bool support_remote_wakeup;
206 	enum version_8821ae version = rtlhal->version;
207 
208 	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
209 				      (u8 *)(&support_remote_wakeup));
210 
211 	if (support_remote_wakeup)
212 		_rtl8821ae_wait_for_h2c_cmd_finish(rtlpriv);
213 
214 	if (buse_wake_on_wlan_fw) {
215 		if (!rtlhal->wowlan_firmware)
216 			return 1;
217 
218 		pfwheader =
219 		  (struct rtlwifi_firmware_header *)rtlhal->wowlan_firmware;
220 		rtlhal->fw_version = le16_to_cpu(pfwheader->version);
221 		rtlhal->fw_subversion = pfwheader->subversion;
222 		pfwdata = (u8 *)rtlhal->wowlan_firmware;
223 		fwsize = rtlhal->wowlan_fwsize;
224 	} else {
225 		if (!rtlhal->pfirmware)
226 			return 1;
227 
228 		pfwheader =
229 		  (struct rtlwifi_firmware_header *)rtlhal->pfirmware;
230 		rtlhal->fw_version = le16_to_cpu(pfwheader->version);
231 		rtlhal->fw_subversion = pfwheader->subversion;
232 		pfwdata = (u8 *)rtlhal->pfirmware;
233 		fwsize = rtlhal->fwsize;
234 	}
235 
236 	RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
237 		 "%s Firmware SIZE %d\n",
238 		 buse_wake_on_wlan_fw ? "Wowlan" : "Normal", fwsize);
239 
240 	if (IS_FW_HEADER_EXIST_8812(pfwheader) ||
241 	    IS_FW_HEADER_EXIST_8821(pfwheader)) {
242 		RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
243 			 "Firmware Version(%d), Signature(%#x)\n",
244 			 pfwheader->version, pfwheader->signature);
245 
246 		pfwdata = pfwdata + sizeof(struct rtlwifi_firmware_header);
247 		fwsize = fwsize - sizeof(struct rtlwifi_firmware_header);
248 	}
249 
250 	if (rtlhal->mac_func_enable) {
251 		if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
252 			rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
253 			rtl8821ae_firmware_selfreset(hw);
254 		}
255 	}
256 	_rtl8821ae_enable_fw_download(hw, true);
257 	_rtl8821ae_write_fw(hw, version, pfwdata, fwsize);
258 	_rtl8821ae_enable_fw_download(hw, false);
259 
260 	err = _rtl8821ae_fw_free_to_go(hw);
261 	if (err) {
262 		RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
263 			 "Firmware is not ready to run!\n");
264 	} else {
265 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
266 			 "Firmware is ready to run!\n");
267 	}
268 
269 	return 0;
270 }
271 
272 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
273 void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
274 					 bool used_wowlan_fw)
275 {
276 	struct rtl_priv *rtlpriv = rtl_priv(hw);
277 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
278 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
279 	/* 1. Before WoWLAN or After WOWLAN we need to re-download Fw. */
280 	if (rtl8821ae_download_fw(hw, used_wowlan_fw)) {
281 		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
282 			 "Re-Download Firmware failed!!\n");
283 		rtlhal->fw_ready = false;
284 		return;
285 	}
286 	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
287 		 "Re-Download Firmware Success !!\n");
288 	rtlhal->fw_ready = true;
289 
290 	/* 2. Re-Init the variables about Fw related setting. */
291 	ppsc->fw_current_inpsmode = false;
292 	rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
293 	rtlhal->fw_clk_change_in_progress = false;
294 	rtlhal->allow_sw_to_change_hwclc = false;
295 	rtlhal->last_hmeboxnum = 0;
296 }
297 #endif
298 
299 static bool _rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw *hw,
300 					      u8 boxnum)
301 {
302 	struct rtl_priv *rtlpriv = rtl_priv(hw);
303 	u8 val_hmetfr;
304 	bool result = false;
305 
306 	val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
307 	if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
308 		result = true;
309 	return result;
310 }
311 
312 static void _rtl8821ae_fill_h2c_command(struct ieee80211_hw *hw,
313 					u8 element_id, u32 cmd_len,
314 					u8 *cmdbuffer)
315 {
316 	struct rtl_priv *rtlpriv = rtl_priv(hw);
317 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
318 	u8 boxnum = 0;
319 	u16 box_reg = 0, box_extreg = 0;
320 	u8 u1b_tmp = 0;
321 	bool isfw_read = false;
322 	u8 buf_index = 0;
323 	bool bwrite_sucess = false;
324 	u8 wait_h2c_limmit = 100;
325 	/*u8 wait_writeh2c_limmit = 100;*/
326 	u8 boxcontent[4], boxextcontent[4];
327 	u32 h2c_waitcounter = 0;
328 	unsigned long flag = 0;
329 	u8 idx = 0;
330 
331 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
332 
333 	while (true) {
334 		spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
335 		if (rtlhal->h2c_setinprogress) {
336 			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
337 				 "H2C set in progress! Wait to set..element_id(%d).\n",
338 				 element_id);
339 
340 			while (rtlhal->h2c_setinprogress) {
341 				spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
342 						       flag);
343 				h2c_waitcounter++;
344 				RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
345 					 "Wait 100 us (%d times)...\n",
346 					  h2c_waitcounter);
347 				udelay(100);
348 
349 				if (h2c_waitcounter > 1000)
350 					return;
351 				spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
352 						  flag);
353 			}
354 			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
355 		} else {
356 			rtlhal->h2c_setinprogress = true;
357 			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
358 			break;
359 		}
360 	}
361 
362 	while (!bwrite_sucess) {
363 		boxnum = rtlhal->last_hmeboxnum;
364 		switch (boxnum) {
365 		case 0:
366 			box_reg = REG_HMEBOX_0;
367 			box_extreg = REG_HMEBOX_EXT_0;
368 			break;
369 		case 1:
370 			box_reg = REG_HMEBOX_1;
371 			box_extreg = REG_HMEBOX_EXT_1;
372 			break;
373 		case 2:
374 			box_reg = REG_HMEBOX_2;
375 			box_extreg = REG_HMEBOX_EXT_2;
376 			break;
377 		case 3:
378 			box_reg = REG_HMEBOX_3;
379 			box_extreg = REG_HMEBOX_EXT_3;
380 			break;
381 		default:
382 			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
383 				 "switch case %#x not processed\n", boxnum);
384 			break;
385 		}
386 
387 		isfw_read = false;
388 		u1b_tmp = rtl_read_byte(rtlpriv, REG_CR);
389 
390 		if (u1b_tmp != 0xEA) {
391 			isfw_read = true;
392 		} else {
393 			if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xEA ||
394 			    rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xEA)
395 				rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xFF);
396 		}
397 
398 		if (isfw_read) {
399 			wait_h2c_limmit = 100;
400 			isfw_read =
401 			  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
402 			while (!isfw_read) {
403 				/*wait until Fw read*/
404 				wait_h2c_limmit--;
405 				if (wait_h2c_limmit == 0) {
406 					RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
407 						 "Waiting too long for FW read clear HMEBox(%d)!\n",
408 						 boxnum);
409 					break;
410 				}
411 
412 				udelay(10);
413 
414 				isfw_read =
415 				  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
416 				u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
417 				RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
418 					 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
419 					 boxnum, u1b_tmp);
420 			}
421 		}
422 
423 		if (!isfw_read) {
424 			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
425 				 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
426 				 boxnum);
427 			break;
428 		}
429 
430 		memset(boxcontent, 0, sizeof(boxcontent));
431 		memset(boxextcontent, 0, sizeof(boxextcontent));
432 		boxcontent[0] = element_id;
433 		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
434 			 "Write element_id box_reg(%4x) = %2x\n",
435 			 box_reg, element_id);
436 
437 		switch (cmd_len) {
438 		case 1:
439 		case 2:
440 		case 3:
441 			/*boxcontent[0] &= ~(BIT(7));*/
442 			memcpy((u8 *)(boxcontent) + 1,
443 			       cmdbuffer + buf_index, cmd_len);
444 
445 			for (idx = 0; idx < 4; idx++) {
446 				rtl_write_byte(rtlpriv, box_reg + idx,
447 					       boxcontent[idx]);
448 			}
449 			break;
450 		case 4:
451 		case 5:
452 		case 6:
453 		case 7:
454 			/*boxcontent[0] |= (BIT(7));*/
455 			memcpy((u8 *)(boxextcontent),
456 			       cmdbuffer + buf_index+3, cmd_len-3);
457 			memcpy((u8 *)(boxcontent) + 1,
458 			       cmdbuffer + buf_index, 3);
459 
460 			for (idx = 0; idx < 4; idx++) {
461 				rtl_write_byte(rtlpriv, box_extreg + idx,
462 					       boxextcontent[idx]);
463 			}
464 
465 			for (idx = 0; idx < 4; idx++) {
466 				rtl_write_byte(rtlpriv, box_reg + idx,
467 					       boxcontent[idx]);
468 			}
469 			break;
470 		default:
471 			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
472 				 "switch case %#x not processed\n", cmd_len);
473 			break;
474 		}
475 
476 		bwrite_sucess = true;
477 
478 		rtlhal->last_hmeboxnum = boxnum + 1;
479 		if (rtlhal->last_hmeboxnum == 4)
480 			rtlhal->last_hmeboxnum = 0;
481 
482 		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
483 			 "pHalData->last_hmeboxnum  = %d\n",
484 			  rtlhal->last_hmeboxnum);
485 	}
486 
487 	spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
488 	rtlhal->h2c_setinprogress = false;
489 	spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
490 
491 	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
492 }
493 
494 void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw,
495 			    u8 element_id, u32 cmd_len, u8 *cmdbuffer)
496 {
497 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
498 	u32 tmp_cmdbuf[2];
499 
500 	if (!rtlhal->fw_ready) {
501 		WARN_ONCE(true,
502 			  "rtl8821ae: error H2C cmd because of Fw download fail!!!\n");
503 		return;
504 	}
505 
506 	memset(tmp_cmdbuf, 0, 8);
507 	memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
508 	_rtl8821ae_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
509 }
510 
511 void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw)
512 {
513 	struct rtl_priv *rtlpriv = rtl_priv(hw);
514 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
515 	u8 u1b_tmp;
516 
517 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
518 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
519 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
520 	} else {
521 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
522 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(0))));
523 	}
524 
525 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
526 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
527 	udelay(50);
528 
529 	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
530 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
531 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
532 	} else {
533 		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
534 		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(0)));
535 	}
536 
537 	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
538 	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
539 
540 	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
541 		 "_8051Reset8812ae(): 8051 reset success .\n");
542 }
543 
544 void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
545 {
546 	struct rtl_priv *rtlpriv = rtl_priv(hw);
547 	u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 };
548 	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
549 	u8 rlbm, power_state = 0;
550 
551 	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
552 
553 	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
554 	rlbm = 0;/*YJ,temp,120316. FW now not support RLBM=2.*/
555 	SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
556 	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
557 					 (rtlpriv->mac80211.p2p) ?
558 					 ppsc->smart_ps : 1);
559 	SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
560 					       ppsc->reg_max_lps_awakeintvl);
561 	SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
562 	if (mode == FW_PS_ACTIVE_MODE)
563 		power_state |= FW_PWR_STATE_ACTIVE;
564 	else
565 		power_state |= FW_PWR_STATE_RF_OFF;
566 
567 	SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
568 
569 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
570 		      "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
571 		      u1_h2c_set_pwrmode, 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 ARPRESP_PG		4
739 #define REMOTE_PG		5
740 #define GTKEXT_PG		6
741 
742 #define TOTAL_RESERVED_PKT_LEN_8812	3584
743 #define TOTAL_RESERVED_PKT_LEN_8821	1792
744 
745 static u8 reserved_page_packet_8821[TOTAL_RESERVED_PKT_LEN_8821] = {
746 	/* page 0: beacon */
747 	0x80, 0x00, 0x00, 0x00,  0xff, 0xff, 0xff, 0xff,
748 	0xff, 0xff, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
749 	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 0x20, 0x00,
750 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
751 	0x64, 0x00, 0x20, 0x04,  0x00, 0x06, 0x64, 0x6c,
752 	0x69, 0x6e, 0x6b, 0x31,  0x01, 0x08, 0x82, 0x84,
753 	0x8b, 0x96, 0x0c, 0x18,  0x30, 0x48, 0x03, 0x01,
754 	0x0b, 0x06, 0x02, 0x00,  0x00, 0x2a, 0x01, 0x8b,
755 	0x32, 0x04, 0x12, 0x24,  0x60, 0x6c, 0x00, 0x00,
756 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 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 	0x10, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
775 	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 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 	/* page 1: ps-poll */
780 	0xa4, 0x10, 0x01, 0xc0,  0x40, 0x16, 0x9f, 0x23,
781 	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
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 	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 	0x18, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
808 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
809 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
810 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
811 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
812 	/* page 2: null data */
813 	0x48, 0x01, 0x00, 0x00,  0x40, 0x16, 0x9f, 0x23,
814 	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
815 	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 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 	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 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
841 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
842 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
843 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
844 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
845 	/* page 3: qos null data */
846 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
847 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
848 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 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 	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 	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
874 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
875 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
876 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
877 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
878 	/* page 4~6 is for wowlan */
879 	/* page 4: ARP resp */
880 	0x08, 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 	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
884 	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
885 	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
886 	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
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 	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 	/* page 5: H2C_REMOTE_WAKE_CTRL_INFO */
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 	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 	/* page 6: Rsvd GTK extend memory (zero memory) */
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 	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 };
979 
980 static u8 reserved_page_packet_8812[TOTAL_RESERVED_PKT_LEN_8812] = {
981 	/* page 0: beacon */
982 	0x80, 0x00, 0x00, 0x00,  0xFF, 0xFF, 0xFF, 0xFF,
983 	0xFF, 0xFF, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
984 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x60, 0x00,
985 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
986 	0x64, 0x00, 0x20, 0x04,  0x00, 0x03, 0x32, 0x31,
987 	0x35, 0x01, 0x08, 0x82,  0x84, 0x8B, 0x96, 0x0C,
988 	0x12, 0x18, 0x24, 0x03,  0x01, 0x01, 0x06, 0x02,
989 	0x00, 0x00, 0x2A, 0x01,  0x02, 0x32, 0x04, 0x30,
990 	0x48, 0x60, 0x6C, 0x2D,  0x1A, 0xED, 0x09, 0x03,
991 	0xFF, 0xFF, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
992 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
993 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x3D,
994 	0x00, 0xDD, 0x07, 0x00,  0xE0, 0x4C, 0x02, 0x02,
995 	0x08, 0x04, 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 	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 	0x10, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1042 	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 0x00, 0x00,
1043 	0x04, 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 	/* page 1: ps-poll */
1047 	0xA4, 0x10, 0x09, 0xC0,  0x84, 0xC9, 0xB2, 0xA7,
1048 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
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 	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 	0x18, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1107 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1108 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1109 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1110 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1111 	/* page 2: null data */
1112 	0x48, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1113 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1114 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 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 	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 	0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1172 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1173 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1174 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1175 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1176 	/* page 3: Qos null data */
1177 	0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1178 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1179 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 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 	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 	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1237 	0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1238 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1239 	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1240 	0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1241 	/* page 4~6 is for wowlan */
1242 	/* page 4: ARP resp */
1243 	0x08, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1244 	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1245 	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
1246 	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
1247 	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
1248 	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
1249 	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
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 	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 	/* page 5: H2C_REMOTE_WAKE_CTRL_INFO */
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 	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 	/* page 6: Rsvd GTK extend memory (zero memory) */
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 	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 };
1438 
1439 void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1440 				  bool b_dl_finished, bool dl_whole_packets)
1441 {
1442 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1443 	struct rtl_mac *mac = rtl_mac(rtlpriv);
1444 	struct sk_buff *skb = NULL;
1445 	u32 totalpacketlen;
1446 	bool rtstatus;
1447 	u8 u1RsvdPageLoc[5] = { 0 };
1448 	u8 u1RsvdPageLoc2[7] = { 0 };
1449 	bool b_dlok = false;
1450 	u8 *beacon;
1451 	u8 *p_pspoll;
1452 	u8 *nullfunc;
1453 	u8 *qosnull;
1454 	u8 *arpresp;
1455 
1456 	/*---------------------------------------------------------
1457 	 *			(1) beacon
1458 	 *---------------------------------------------------------
1459 	 */
1460 	beacon = &reserved_page_packet_8812[BEACON_PG * 512];
1461 	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1462 	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1463 
1464 	if (b_dl_finished) {
1465 		totalpacketlen = 512 - 40;
1466 		goto out;
1467 	}
1468 	/*-------------------------------------------------------
1469 	 *			(2) ps-poll
1470 	 *--------------------------------------------------------
1471 	 */
1472 	p_pspoll = &reserved_page_packet_8812[PSPOLL_PG * 512];
1473 	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1474 	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1475 	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1476 
1477 	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1478 
1479 	/*--------------------------------------------------------
1480 	 *			(3) null data
1481 	 *---------------------------------------------------------
1482 	 */
1483 	nullfunc = &reserved_page_packet_8812[NULL_PG * 512];
1484 	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1485 	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1486 	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1487 
1488 	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1489 
1490 	/*---------------------------------------------------------
1491 	 *			(4) Qos null data
1492 	 *----------------------------------------------------------
1493 	 */
1494 	qosnull = &reserved_page_packet_8812[QOSNULL_PG * 512];
1495 	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1496 	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1497 	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1498 
1499 	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1500 
1501 	if (!dl_whole_packets) {
1502 		totalpacketlen = 512 * (QOSNULL_PG + 1) - 40;
1503 		goto out;
1504 	}
1505 	/*---------------------------------------------------------
1506 	 *			(5) ARP Resp
1507 	 *----------------------------------------------------------
1508 	 */
1509 	arpresp = &reserved_page_packet_8812[ARPRESP_PG * 512];
1510 	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1511 	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1512 	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1513 
1514 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1515 
1516 	/*---------------------------------------------------------
1517 	 *			(6) Remote Wake Ctrl
1518 	 *----------------------------------------------------------
1519 	 */
1520 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1521 								REMOTE_PG);
1522 
1523 	/*---------------------------------------------------------
1524 	 *			(7) GTK Ext Memory
1525 	 *----------------------------------------------------------
1526 	 */
1527 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1528 
1529 	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8812 - 40;
1530 
1531 out:
1532 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1533 		      "rtl8812ae_set_fw_rsvdpagepkt(): packet data\n",
1534 		      &reserved_page_packet_8812[0], totalpacketlen);
1535 
1536 	skb = dev_alloc_skb(totalpacketlen);
1537 	memcpy((u8 *)skb_put(skb, totalpacketlen),
1538 	       &reserved_page_packet_8812, totalpacketlen);
1539 
1540 	rtstatus = rtl_cmd_send_packet(hw, skb);
1541 
1542 	if (rtstatus)
1543 		b_dlok = true;
1544 
1545 	if (!b_dl_finished && b_dlok) {
1546 		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1547 			      "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1548 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1549 				       sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1550 		if (dl_whole_packets) {
1551 			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1552 				      "wowlan H2C_RSVDPAGE:\n", u1RsvdPageLoc2, 7);
1553 			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1554 					       sizeof(u1RsvdPageLoc2), u1RsvdPageLoc2);
1555 		}
1556 	}
1557 
1558 	if (!b_dlok)
1559 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1560 			 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1561 }
1562 
1563 void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1564 				  bool b_dl_finished, bool dl_whole_packets)
1565 {
1566 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1567 	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1568 	struct sk_buff *skb = NULL;
1569 	u32 totalpacketlen;
1570 	bool rtstatus;
1571 	u8 u1RsvdPageLoc[5] = { 0 };
1572 	u8 u1RsvdPageLoc2[7] = { 0 };
1573 	bool b_dlok = false;
1574 	u8 *beacon;
1575 	u8 *p_pspoll;
1576 	u8 *nullfunc;
1577 	u8 *qosnull;
1578 	u8 *arpresp;
1579 
1580 	/*---------------------------------------------------------
1581 	 *			(1) beacon
1582 	 *---------------------------------------------------------
1583 	 */
1584 	beacon = &reserved_page_packet_8821[BEACON_PG * 256];
1585 	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1586 	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1587 
1588 	if (b_dl_finished) {
1589 		totalpacketlen = 256 - 40;
1590 		goto out;
1591 	}
1592 	/*-------------------------------------------------------
1593 	 *			(2) ps-poll
1594 	 *--------------------------------------------------------
1595 	 */
1596 	p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256];
1597 	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1598 	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1599 	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1600 
1601 	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1602 
1603 	/*--------------------------------------------------------
1604 	 *			(3) null data
1605 	 *---------------------------------------------------------i
1606 	 */
1607 	nullfunc = &reserved_page_packet_8821[NULL_PG * 256];
1608 	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1609 	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1610 	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1611 
1612 	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1613 
1614 	/*---------------------------------------------------------
1615 	 *			(4) Qos null data
1616 	 *----------------------------------------------------------
1617 	 */
1618 	qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256];
1619 	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1620 	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1621 	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1622 
1623 	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1624 
1625 	if (!dl_whole_packets) {
1626 		totalpacketlen = 256 * (QOSNULL_PG + 1) - 40;
1627 		goto out;
1628 	}
1629 	/*---------------------------------------------------------
1630 	 *			(5) ARP Resp
1631 	 *----------------------------------------------------------
1632 	 */
1633 	arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256];
1634 	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1635 	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1636 	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1637 
1638 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1639 
1640 	/*---------------------------------------------------------
1641 	 *			(6) Remote Wake Ctrl
1642 	 *----------------------------------------------------------
1643 	 */
1644 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1645 									REMOTE_PG);
1646 
1647 	/*---------------------------------------------------------
1648 	 *			(7) GTK Ext Memory
1649 	 *----------------------------------------------------------
1650 	 */
1651 	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1652 
1653 	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40;
1654 
1655 out:
1656 
1657 	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1658 		      "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n",
1659 		      &reserved_page_packet_8821[0], totalpacketlen);
1660 
1661 	skb = dev_alloc_skb(totalpacketlen);
1662 	memcpy((u8 *)skb_put(skb, totalpacketlen),
1663 	       &reserved_page_packet_8821, totalpacketlen);
1664 
1665 	rtstatus = rtl_cmd_send_packet(hw, skb);
1666 
1667 	if (rtstatus)
1668 		b_dlok = true;
1669 
1670 	if (!b_dl_finished && b_dlok) {
1671 		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1672 			 "Set RSVD page location to Fw.\n");
1673 		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1674 				"H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1675 		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1676 				       sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1677 		if (dl_whole_packets) {
1678 			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1679 				      "wowlan H2C_RSVDPAGE:\n",
1680 				      u1RsvdPageLoc2, 7);
1681 			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1682 					       sizeof(u1RsvdPageLoc2),
1683 					       u1RsvdPageLoc2);
1684 		}
1685 	}
1686 
1687 	if (!b_dlok) {
1688 		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1689 			 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1690 	}
1691 }
1692 
1693 /*Should check FW support p2p or not.*/
1694 static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
1695 {
1696 	u8 u1_ctwindow_period[1] = { ctwindow};
1697 
1698 	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1,
1699 			       u1_ctwindow_period);
1700 }
1701 
1702 void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
1703 {
1704 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1705 	struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
1706 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1707 	struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
1708 	struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
1709 	u8	i;
1710 	u16	ctwindow;
1711 	u32	start_time, tsf_low;
1712 
1713 	switch (p2p_ps_state) {
1714 	case P2P_PS_DISABLE:
1715 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
1716 		memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
1717 		break;
1718 	case P2P_PS_ENABLE:
1719 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
1720 		/* update CTWindow value. */
1721 		if (p2pinfo->ctwindow > 0) {
1722 			p2p_ps_offload->ctwindow_en = 1;
1723 			ctwindow = p2pinfo->ctwindow;
1724 			rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow);
1725 		}
1726 
1727 		/* hw only support 2 set of NoA */
1728 		for (i = 0 ; i < p2pinfo->noa_num ; i++) {
1729 			/* To control the register setting for which NOA*/
1730 			rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
1731 			if (i == 0)
1732 				p2p_ps_offload->noa0_en = 1;
1733 			else
1734 				p2p_ps_offload->noa1_en = 1;
1735 
1736 			/* config P2P NoA Descriptor Register */
1737 			rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]);
1738 			rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]);
1739 
1740 			/*Get Current TSF value */
1741 			tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
1742 
1743 			start_time = p2pinfo->noa_start_time[i];
1744 			if (p2pinfo->noa_count_type[i] != 1) {
1745 				while (start_time <= (tsf_low+(50*1024))) {
1746 					start_time += p2pinfo->noa_interval[i];
1747 					if (p2pinfo->noa_count_type[i] != 255)
1748 						p2pinfo->noa_count_type[i]--;
1749 				}
1750 			}
1751 			rtl_write_dword(rtlpriv, 0x5E8, start_time);
1752 			rtl_write_dword(rtlpriv, 0x5EC,
1753 					p2pinfo->noa_count_type[i]);
1754 		}
1755 
1756 		if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
1757 			/* rst p2p circuit */
1758 			rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
1759 
1760 			p2p_ps_offload->offload_en = 1;
1761 
1762 			if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
1763 				p2p_ps_offload->role = 1;
1764 				p2p_ps_offload->allstasleep = 0;
1765 			} else {
1766 				p2p_ps_offload->role = 0;
1767 			}
1768 
1769 			p2p_ps_offload->discovery = 0;
1770 		}
1771 		break;
1772 	case P2P_PS_SCAN:
1773 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
1774 		p2p_ps_offload->discovery = 1;
1775 		break;
1776 	case P2P_PS_SCAN_DONE:
1777 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
1778 		p2p_ps_offload->discovery = 0;
1779 		p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
1780 		break;
1781 	default:
1782 		break;
1783 	}
1784 
1785 	rtl8821ae_fill_h2c_cmd(hw,
1786 			H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
1787 }
1788 
1789 static void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
1790 				     u8 *cmd_buf, u8 cmd_len)
1791 {
1792 	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1793 	u8 rate = cmd_buf[0] & 0x3F;
1794 
1795 	rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate);
1796 
1797 	rtl8821ae_dm_update_init_rate(hw, rate);
1798 }
1799 
1800 static void _rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
1801 					   u8 c2h_cmd_id, u8 c2h_cmd_len,
1802 					   u8 *tmp_buf)
1803 {
1804 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1805 
1806 	switch (c2h_cmd_id) {
1807 	case C2H_8812_DBG:
1808 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n");
1809 		break;
1810 	case C2H_8812_RA_RPT:
1811 		rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
1812 		break;
1813 	case C2H_8812_BT_INFO:
1814 		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1815 			 "[C2H], C2H_8812_BT_INFO!!\n");
1816 		if (rtlpriv->cfg->ops->get_btc_status())
1817 			rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv,
1818 								      tmp_buf,
1819 								      c2h_cmd_len);
1820 		break;
1821 	default:
1822 		break;
1823 	}
1824 }
1825 
1826 void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer,
1827 				  u8 length)
1828 {
1829 	struct rtl_priv *rtlpriv = rtl_priv(hw);
1830 	u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
1831 	u8 *tmp_buf = NULL;
1832 
1833 	c2h_cmd_id = buffer[0];
1834 	c2h_cmd_seq = buffer[1];
1835 	c2h_cmd_len = length - 2;
1836 	tmp_buf = buffer + 2;
1837 
1838 	RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1839 		 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
1840 		 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
1841 
1842 	RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD,
1843 		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
1844 	_rtl8821ae_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
1845 }
1846