[go: nahoru, domu]

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
35static 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
54static 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
82static 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
95static 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
111static 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		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
129			 "Page numbers should not greater then 8\n");
130	}
131
132	for (page = 0; page < pagenums; page++) {
133		offset = page * FW_8821AE_PAGE_SIZE;
134		_rtl8821ae_fw_page_write(hw, page, (bufferptr + offset),
135					 FW_8821AE_PAGE_SIZE);
136	}
137
138	if (remainsize) {
139		offset = pagenums * FW_8821AE_PAGE_SIZE;
140		page = pagenums;
141		_rtl8821ae_fw_page_write(hw, page, (bufferptr + offset),
142					 remainsize);
143	}
144}
145
146static int _rtl8821ae_fw_free_to_go(struct ieee80211_hw *hw)
147{
148	struct rtl_priv *rtlpriv = rtl_priv(hw);
149	int err = -EIO;
150	u32 counter = 0;
151	u32 value32;
152
153	do {
154		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
155	} while ((counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT) &&
156		 (!(value32 & FWDL_CHKSUM_RPT)));
157
158	if (counter >= FW_8821AE_POLLING_TIMEOUT_COUNT) {
159		RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
160			 "chksum report faill ! REG_MCUFWDL:0x%08x .\n",
161			  value32);
162		goto exit;
163	}
164
165	RT_TRACE(rtlpriv, COMP_FW, DBG_EMERG,
166		 "Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32);
167
168	value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
169	value32 |= MCUFWDL_RDY;
170	value32 &= ~WINTINI_RDY;
171	rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
172
173	rtl8821ae_firmware_selfreset(hw);
174
175	counter = 0;
176	do {
177		value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
178		if (value32 & WINTINI_RDY) {
179			RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
180				 "Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",
181				  value32);
182			err = 0;
183			goto exit;
184		}
185
186		udelay(FW_8821AE_POLLING_DELAY);
187	} while (counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT);
188
189	RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
190		 "Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n",
191		 value32);
192
193exit:
194	return err;
195}
196
197static void _rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv *rtlpriv)
198{
199	u8 val;
200	u16 count = 0;
201
202	do {
203		val = rtl_read_byte(rtlpriv, REG_HMETFR);
204		mdelay(1);
205		count++;
206	} while ((val & 0x0F) && (count < 1000));
207}
208
209int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
210{
211	struct rtl_priv *rtlpriv = rtl_priv(hw);
212	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
213	struct rtl8821a_firmware_header *pfwheader;
214	u8 *pfwdata;
215	u32 fwsize;
216	int err;
217	bool support_remote_wakeup;
218	enum version_8821ae version = rtlhal->version;
219
220	rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
221				      (u8 *)(&support_remote_wakeup));
222
223	if (support_remote_wakeup)
224		_rtl8821ae_wait_for_h2c_cmd_finish(rtlpriv);
225
226	if (buse_wake_on_wlan_fw) {
227		if (!rtlhal->wowlan_firmware)
228			return 1;
229
230		pfwheader =
231		  (struct rtl8821a_firmware_header *)rtlhal->wowlan_firmware;
232		rtlhal->fw_version = pfwheader->version;
233		rtlhal->fw_subversion = pfwheader->subversion;
234		pfwdata = (u8 *)rtlhal->wowlan_firmware;
235		fwsize = rtlhal->wowlan_fwsize;
236	} else {
237		if (!rtlhal->pfirmware)
238			return 1;
239
240		pfwheader =
241		  (struct rtl8821a_firmware_header *)rtlhal->pfirmware;
242		rtlhal->fw_version = pfwheader->version;
243		rtlhal->fw_subversion = pfwheader->subversion;
244		pfwdata = (u8 *)rtlhal->pfirmware;
245		fwsize = rtlhal->fwsize;
246	}
247
248	RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
249		 "%s Firmware SIZE %d\n",
250		 buse_wake_on_wlan_fw ? "Wowlan" : "Normal", fwsize);
251
252	if (IS_FW_HEADER_EXIST_8812(pfwheader) ||
253	    IS_FW_HEADER_EXIST_8821(pfwheader)) {
254		RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
255			 "Firmware Version(%d), Signature(%#x)\n",
256			 pfwheader->version, pfwheader->signature);
257
258		pfwdata = pfwdata + sizeof(struct rtl8821a_firmware_header);
259		fwsize = fwsize - sizeof(struct rtl8821a_firmware_header);
260	}
261
262	if (rtlhal->mac_func_enable) {
263		if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
264			rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
265			rtl8821ae_firmware_selfreset(hw);
266		}
267	}
268	_rtl8821ae_enable_fw_download(hw, true);
269	_rtl8821ae_write_fw(hw, version, pfwdata, fwsize);
270	_rtl8821ae_enable_fw_download(hw, false);
271
272	err = _rtl8821ae_fw_free_to_go(hw);
273	if (err) {
274		RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
275			 "Firmware is not ready to run!\n");
276	} else {
277		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
278			 "Firmware is ready to run!\n");
279	}
280
281	return 0;
282}
283
284#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
285void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
286					 bool used_wowlan_fw)
287{
288	struct rtl_priv *rtlpriv = rtl_priv(hw);
289	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
290	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
291	/* 1. Before WoWLAN or After WOWLAN we need to re-download Fw. */
292	if (rtl8821ae_download_fw(hw, used_wowlan_fw)) {
293		RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
294			 "Re-Download Firmware failed!!\n");
295		rtlhal->fw_ready = false;
296		return;
297	}
298	RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
299		 "Re-Download Firmware Success !!\n");
300	rtlhal->fw_ready = true;
301
302	/* 2. Re-Init the variables about Fw related setting. */
303	ppsc->fw_current_inpsmode = false;
304	rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
305	rtlhal->fw_clk_change_in_progress = false;
306	rtlhal->allow_sw_to_change_hwclc = false;
307	rtlhal->last_hmeboxnum = 0;
308}
309#endif
310
311static bool _rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw *hw,
312					      u8 boxnum)
313{
314	struct rtl_priv *rtlpriv = rtl_priv(hw);
315	u8 val_hmetfr;
316	bool result = false;
317
318	val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
319	if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
320		result = true;
321	return result;
322}
323
324static void _rtl8821ae_fill_h2c_command(struct ieee80211_hw *hw,
325					u8 element_id, u32 cmd_len,
326					u8 *cmdbuffer)
327{
328	struct rtl_priv *rtlpriv = rtl_priv(hw);
329	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
330	u8 boxnum = 0;
331	u16 box_reg = 0, box_extreg = 0;
332	u8 u1b_tmp = 0;
333	bool isfw_read = false;
334	u8 buf_index = 0;
335	bool bwrite_sucess = false;
336	u8 wait_h2c_limmit = 100;
337	/*u8 wait_writeh2c_limmit = 100;*/
338	u8 boxcontent[4], boxextcontent[4];
339	u32 h2c_waitcounter = 0;
340	unsigned long flag = 0;
341	u8 idx = 0;
342
343	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
344
345	while (true) {
346		spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
347		if (rtlhal->h2c_setinprogress) {
348			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
349				 "H2C set in progress! Wait to set..element_id(%d).\n",
350				 element_id);
351
352			while (rtlhal->h2c_setinprogress) {
353				spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
354						       flag);
355				h2c_waitcounter++;
356				RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
357					 "Wait 100 us (%d times)...\n",
358					  h2c_waitcounter);
359				udelay(100);
360
361				if (h2c_waitcounter > 1000)
362					return;
363				spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
364						  flag);
365			}
366			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
367		} else {
368			rtlhal->h2c_setinprogress = true;
369			spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
370			break;
371		}
372	}
373
374	while (!bwrite_sucess) {
375		boxnum = rtlhal->last_hmeboxnum;
376		switch (boxnum) {
377		case 0:
378			box_reg = REG_HMEBOX_0;
379			box_extreg = REG_HMEBOX_EXT_0;
380			break;
381		case 1:
382			box_reg = REG_HMEBOX_1;
383			box_extreg = REG_HMEBOX_EXT_1;
384			break;
385		case 2:
386			box_reg = REG_HMEBOX_2;
387			box_extreg = REG_HMEBOX_EXT_2;
388			break;
389		case 3:
390			box_reg = REG_HMEBOX_3;
391			box_extreg = REG_HMEBOX_EXT_3;
392			break;
393		default:
394			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
395				 "switch case not process\n");
396			break;
397		}
398
399		isfw_read = false;
400		u1b_tmp = rtl_read_byte(rtlpriv, REG_CR);
401
402		if (u1b_tmp != 0xEA) {
403			isfw_read = true;
404		} else {
405			if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xEA ||
406			    rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xEA)
407				rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xFF);
408		}
409
410		if (isfw_read) {
411			wait_h2c_limmit = 100;
412			isfw_read =
413			  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
414			while (!isfw_read) {
415				/*wait until Fw read*/
416				wait_h2c_limmit--;
417				if (wait_h2c_limmit == 0) {
418					RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
419						 "Waiting too long for FW read clear HMEBox(%d)!\n",
420						 boxnum);
421					break;
422				}
423
424				udelay(10);
425
426				isfw_read =
427				  _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
428				u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
429				RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
430					 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
431					 boxnum, u1b_tmp);
432			}
433		}
434
435		if (!isfw_read) {
436			RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
437				 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
438				 boxnum);
439			break;
440		}
441
442		memset(boxcontent, 0, sizeof(boxcontent));
443		memset(boxextcontent, 0, sizeof(boxextcontent));
444		boxcontent[0] = element_id;
445		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
446			 "Write element_id box_reg(%4x) = %2x\n",
447			 box_reg, element_id);
448
449		switch (cmd_len) {
450		case 1:
451		case 2:
452		case 3:
453			/*boxcontent[0] &= ~(BIT(7));*/
454			memcpy((u8 *)(boxcontent) + 1,
455			       cmdbuffer + buf_index, cmd_len);
456
457			for (idx = 0; idx < 4; idx++) {
458				rtl_write_byte(rtlpriv, box_reg + idx,
459					       boxcontent[idx]);
460			}
461			break;
462		case 4:
463		case 5:
464		case 6:
465		case 7:
466			/*boxcontent[0] |= (BIT(7));*/
467			memcpy((u8 *)(boxextcontent),
468			       cmdbuffer + buf_index+3, cmd_len-3);
469			memcpy((u8 *)(boxcontent) + 1,
470			       cmdbuffer + buf_index, 3);
471
472			for (idx = 0; idx < 4; idx++) {
473				rtl_write_byte(rtlpriv, box_extreg + idx,
474					       boxextcontent[idx]);
475			}
476
477			for (idx = 0; idx < 4; idx++) {
478				rtl_write_byte(rtlpriv, box_reg + idx,
479					       boxcontent[idx]);
480			}
481			break;
482		default:
483			RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
484				 "switch case not process\n");
485			break;
486		}
487
488		bwrite_sucess = true;
489
490		rtlhal->last_hmeboxnum = boxnum + 1;
491		if (rtlhal->last_hmeboxnum == 4)
492			rtlhal->last_hmeboxnum = 0;
493
494		RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
495			 "pHalData->last_hmeboxnum  = %d\n",
496			  rtlhal->last_hmeboxnum);
497	}
498
499	spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
500	rtlhal->h2c_setinprogress = false;
501	spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
502
503	RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
504}
505
506void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw,
507			    u8 element_id, u32 cmd_len, u8 *cmdbuffer)
508{
509	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
510	u32 tmp_cmdbuf[2];
511
512	if (!rtlhal->fw_ready) {
513		RT_ASSERT(false,
514			  "return H2C cmd because of Fw download fail!!!\n");
515		return;
516	}
517
518	memset(tmp_cmdbuf, 0, 8);
519	memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
520	_rtl8821ae_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
521}
522
523void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw)
524{
525	struct rtl_priv *rtlpriv = rtl_priv(hw);
526	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
527	u8 u1b_tmp;
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	udelay(50);
540
541	if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
542		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
543		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
544	} else {
545		u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
546		rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(0)));
547	}
548
549	u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
550	rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
551
552	RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
553		 "_8051Reset8812ae(): 8051 reset success .\n");
554}
555
556void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
557{
558	struct rtl_priv *rtlpriv = rtl_priv(hw);
559	u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 };
560	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
561	u8 rlbm, power_state = 0;
562
563	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
564
565	SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
566	rlbm = 0;/*YJ,temp,120316. FW now not support RLBM=2.*/
567	SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
568	SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
569					 (rtlpriv->mac80211.p2p) ?
570					 ppsc->smart_ps : 1);
571	SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
572					       ppsc->reg_max_lps_awakeintvl);
573	SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
574	if (mode == FW_PS_ACTIVE_MODE)
575		power_state |= FW_PWR_STATE_ACTIVE;
576	else
577		power_state |= FW_PWR_STATE_RF_OFF;
578
579	SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
580
581	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
582		      "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
583		      u1_h2c_set_pwrmode, H2C_8821AE_PWEMODE_LENGTH);
584	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_SETPWRMODE,
585			       H2C_8821AE_PWEMODE_LENGTH,
586			       u1_h2c_set_pwrmode);
587}
588
589void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,
590					   u8 mstatus)
591{
592	u8 parm[3] = { 0, 0, 0 };
593	/* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect
594	 *          bit1=0-->update Media Status to MACID
595	 *          bit1=1-->update Media Status from MACID to MACID_End
596	 * parm[1]: MACID, if this is INFRA_STA, MacID = 0
597	 * parm[2]: MACID_End
598	 */
599
600	SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus);
601	SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0);
602
603	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_MSRRPT, 3, parm);
604}
605
606void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
607				      u8 ap_offload_enable)
608{
609	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
610	u8 u1_apoffload_parm[H2C_8821AE_AP_OFFLOAD_LENGTH] = { 0 };
611
612	SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable);
613	SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
614	SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
615
616	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AP_OFFLOAD,
617			       H2C_8821AE_AP_OFFLOAD_LENGTH,
618			       u1_apoffload_parm);
619}
620
621void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en)
622{
623	struct rtl_priv *rtlpriv = rtl_priv(hw);
624	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
625	u8 fw_wowlan_info[H2C_8821AE_WOWLAN_LENGTH] = {0};
626
627	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "enable(%d)\n", func_en);
628
629	SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(fw_wowlan_info,
630					   (func_en ? true : false));
631
632	SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(fw_wowlan_info,
633		((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) ? 1 : 0));
634	SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(fw_wowlan_info,
635		((ppsc->wo_wlan_mode & WAKE_ON_MAGIC_PACKET) ? 1 : 0));
636
637	SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(fw_wowlan_info, 0);
638	SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(fw_wowlan_info, false);
639	SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(fw_wowlan_info, 0);
640	SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(fw_wowlan_info, 1);
641	SET_8812_H2CCMD_WOWLAN_GPIONUM(fw_wowlan_info, 0);
642	SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(fw_wowlan_info, 0);
643
644	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_DMESG,
645		      "wowlan mode: cmd 0x80: Content:\n",
646		      fw_wowlan_info, H2C_8821AE_WOWLAN_LENGTH);
647
648	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_WO_WLAN,
649			       H2C_8821AE_WOWLAN_LENGTH,
650			       fw_wowlan_info);
651}
652
653void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,
654					   u8 enable)
655{
656	struct rtl_priv *rtlpriv = rtl_priv(hw);
657	struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
658	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
659	u8 remote_wake_ctrl_parm[H2C_8821AE_REMOTE_WAKE_CTRL_LEN] = {0};
660
661	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
662		 "enable=%d, ARP offload=%d, GTK offload=%d\n",
663		 enable, ppsc->arp_offload_enable, ppsc->gtk_offload_enable);
664
665	SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(remote_wake_ctrl_parm, enable);
666	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(remote_wake_ctrl_parm,
667					(ppsc->arp_offload_enable ? 1 : 0));
668	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(remote_wake_ctrl_parm,
669					(ppsc->gtk_offload_enable ? 1 : 0));
670	SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(remote_wake_ctrl_parm,
671					(rtlhal->real_wow_v2_enable ? 1 : 0));
672
673	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
674		      "remote_wake_ctrl: cmd 0x4: Content:\n",
675		      remote_wake_ctrl_parm, H2C_8821AE_REMOTE_WAKE_CTRL_LEN);
676
677	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_REMOTE_WAKE_CTRL,
678			       H2C_8821AE_REMOTE_WAKE_CTRL_LEN,
679			       remote_wake_ctrl_parm);
680}
681
682void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw,
683				     bool func_en)
684{
685	struct rtl_priv *rtlpriv = rtl_priv(hw);
686	u8 keep_alive_info[H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH] = {0};
687
688	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable(%d)\n", func_en);
689
690	SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(keep_alive_info, func_en);
691	/* 1: the period is controled by driver, 0: by Fw default */
692	SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(keep_alive_info, 1);
693	SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(keep_alive_info, 10); /* 10 sec */
694
695	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
696		      "keep alive: cmd 0x3: Content:\n",
697		      keep_alive_info, H2C_8821AE_KEEP_ALIVE_CTRL);
698	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL,
699			       H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH,
700			       keep_alive_info);
701}
702
703void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
704						   bool enabled)
705{
706	struct rtl_priv *rtlpriv = rtl_priv(hw);
707	u8 parm[H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN] = {0};
708
709	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(parm, enabled);
710	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(parm, 1);
711	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(parm, 30);
712	SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(parm, 3);
713
714	RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
715		      "disconnect_decision_ctrl: cmd 0x4: Content:\n",
716		      parm, H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN);
717	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_DISCONNECT_DECISION,
718			       H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN, parm);
719}
720
721void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw)
722{
723	struct rtl_priv *rtlpriv = rtl_priv(hw);
724	struct rtl_security *sec = &rtlpriv->sec;
725	u8 remote_wakeup_sec_info[H2C_8821AE_AOAC_GLOBAL_INFO_LEN] = {0};
726
727	RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
728		 "PairwiseEncAlgorithm=%d, GroupEncAlgorithm=%d\n",
729		 sec->pairwise_enc_algorithm, sec->group_enc_algorithm);
730
731	SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(
732						remote_wakeup_sec_info,
733						sec->pairwise_enc_algorithm);
734	SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(remote_wakeup_sec_info,
735						      sec->group_enc_algorithm);
736
737	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_GLOBAL_INFO,
738			       H2C_8821AE_AOAC_GLOBAL_INFO_LEN,
739			       remote_wakeup_sec_info);
740
741	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_TRACE,
742		      "rtl8821ae_set_global_info: cmd 0x82:\n",
743		      remote_wakeup_sec_info, H2C_8821AE_AOAC_GLOBAL_INFO_LEN);
744}
745
746#define BEACON_PG		0
747#define PSPOLL_PG		1
748#define NULL_PG			2
749#define QOSNULL_PG		3
750#define ARPRESP_PG		4
751#define REMOTE_PG		5
752#define GTKEXT_PG		6
753
754#define TOTAL_RESERVED_PKT_LEN_8812	3584
755#define TOTAL_RESERVED_PKT_LEN_8821	1792
756
757static u8 reserved_page_packet_8821[TOTAL_RESERVED_PKT_LEN_8821] = {
758	/* page 0: beacon */
759	0x80, 0x00, 0x00, 0x00,  0xff, 0xff, 0xff, 0xff,
760	0xff, 0xff, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
761	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 0x20, 0x00,
762	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
763	0x64, 0x00, 0x20, 0x04,  0x00, 0x06, 0x64, 0x6c,
764	0x69, 0x6e, 0x6b, 0x31,  0x01, 0x08, 0x82, 0x84,
765	0x8b, 0x96, 0x0c, 0x18,  0x30, 0x48, 0x03, 0x01,
766	0x0b, 0x06, 0x02, 0x00,  0x00, 0x2a, 0x01, 0x8b,
767	0x32, 0x04, 0x12, 0x24,  0x60, 0x6c, 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	0x10, 0x00, 0x28, 0x8c,  0x00, 0x12, 0x00, 0x00,
787	0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 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	/* page 1: ps-poll */
792	0xa4, 0x10, 0x01, 0xc0,  0x40, 0x16, 0x9f, 0x23,
793	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
794	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
795	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
796	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
797	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
798	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
799	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
800	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
801	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
802	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
803	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
804	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
805	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
806	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
807	0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
808	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	0x18, 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 2: null data */
825	0x48, 0x01, 0x00, 0x00,  0x40, 0x16, 0x9f, 0x23,
826	0xd4, 0x46, 0x00, 0xe0,  0x4c, 0x02, 0xe2, 0x64,
827	0x40, 0x16, 0x9f, 0x23,  0xd4, 0x46, 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, 0x00, 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 3: 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 4~6 is for wowlan */
891	/* page 4: 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 5: 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 6: 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
992static 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	0x3C, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1249	0x00, 0x00, 0x00, 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~6 is for wowlan */
1254	/* page 4: ARP resp */
1255	0x08, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1256	0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1257	0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
1258	0xAA, 0xAA, 0x03, 0x00,  0x00, 0x00, 0x08, 0x06,
1259	0x00, 0x01, 0x08, 0x00,  0x06, 0x04, 0x00, 0x02,
1260	0x00, 0xE0, 0x4C, 0x02,  0x51, 0x02, 0x00, 0x00,
1261	0x00, 0x00, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
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	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	/* page 5: H2C_REMOTE_WAKE_CTRL_INFO */
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	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: Rsvd GTK extend memory (zero memory) */
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};
1450
1451void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1452				  bool b_dl_finished, bool dl_whole_packets)
1453{
1454	struct rtl_priv *rtlpriv = rtl_priv(hw);
1455	struct rtl_mac *mac = rtl_mac(rtlpriv);
1456	struct sk_buff *skb = NULL;
1457	u32 totalpacketlen;
1458	bool rtstatus;
1459	u8 u1RsvdPageLoc[5] = { 0 };
1460	u8 u1RsvdPageLoc2[7] = { 0 };
1461	bool b_dlok = false;
1462	u8 *beacon;
1463	u8 *p_pspoll;
1464	u8 *nullfunc;
1465	u8 *qosnull;
1466	u8 *arpresp;
1467
1468	/*---------------------------------------------------------
1469	 *			(1) beacon
1470	 *---------------------------------------------------------
1471	 */
1472	beacon = &reserved_page_packet_8812[BEACON_PG * 512];
1473	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1474	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1475
1476	if (b_dl_finished) {
1477		totalpacketlen = 512 - 40;
1478		goto out;
1479	}
1480	/*-------------------------------------------------------
1481	 *			(2) ps-poll
1482	 *--------------------------------------------------------
1483	 */
1484	p_pspoll = &reserved_page_packet_8812[PSPOLL_PG * 512];
1485	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1486	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1487	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1488
1489	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1490
1491	/*--------------------------------------------------------
1492	 *			(3) null data
1493	 *---------------------------------------------------------
1494	 */
1495	nullfunc = &reserved_page_packet_8812[NULL_PG * 512];
1496	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1497	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1498	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1499
1500	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1501
1502	/*---------------------------------------------------------
1503	 *			(4) Qos null data
1504	 *----------------------------------------------------------
1505	 */
1506	qosnull = &reserved_page_packet_8812[QOSNULL_PG * 512];
1507	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1508	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1509	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1510
1511	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1512
1513	if (!dl_whole_packets) {
1514		totalpacketlen = 512 * (QOSNULL_PG + 1) - 40;
1515		goto out;
1516	}
1517	/*---------------------------------------------------------
1518	 *			(5) ARP Resp
1519	 *----------------------------------------------------------
1520	 */
1521	arpresp = &reserved_page_packet_8812[ARPRESP_PG * 512];
1522	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1523	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1524	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1525
1526	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1527
1528	/*---------------------------------------------------------
1529	 *			(6) Remote Wake Ctrl
1530	 *----------------------------------------------------------
1531	 */
1532	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1533								REMOTE_PG);
1534
1535	/*---------------------------------------------------------
1536	 *			(7) GTK Ext Memory
1537	 *----------------------------------------------------------
1538	 */
1539	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1540
1541	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8812 - 40;
1542
1543out:
1544	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1545		      "rtl8812ae_set_fw_rsvdpagepkt(): packet data\n",
1546		      &reserved_page_packet_8812[0], totalpacketlen);
1547
1548	skb = dev_alloc_skb(totalpacketlen);
1549	memcpy((u8 *)skb_put(skb, totalpacketlen),
1550	       &reserved_page_packet_8812, totalpacketlen);
1551
1552	rtstatus = rtl_cmd_send_packet(hw, skb);
1553
1554	if (rtstatus)
1555		b_dlok = true;
1556
1557	if (!b_dl_finished && b_dlok) {
1558		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1559			      "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1560		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1561				       sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1562		if (dl_whole_packets) {
1563			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1564				      "wowlan H2C_RSVDPAGE:\n", u1RsvdPageLoc2, 7);
1565			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1566					       sizeof(u1RsvdPageLoc2), u1RsvdPageLoc2);
1567		}
1568	}
1569
1570	if (!b_dlok)
1571		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1572			 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1573}
1574
1575void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1576				  bool b_dl_finished, bool dl_whole_packets)
1577{
1578	struct rtl_priv *rtlpriv = rtl_priv(hw);
1579	struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1580	struct sk_buff *skb = NULL;
1581	u32 totalpacketlen;
1582	bool rtstatus;
1583	u8 u1RsvdPageLoc[5] = { 0 };
1584	u8 u1RsvdPageLoc2[7] = { 0 };
1585	bool b_dlok = false;
1586	u8 *beacon;
1587	u8 *p_pspoll;
1588	u8 *nullfunc;
1589	u8 *qosnull;
1590	u8 *arpresp;
1591
1592	/*---------------------------------------------------------
1593	 *			(1) beacon
1594	 *---------------------------------------------------------
1595	 */
1596	beacon = &reserved_page_packet_8821[BEACON_PG * 256];
1597	SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1598	SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1599
1600	if (b_dl_finished) {
1601		totalpacketlen = 256 - 40;
1602		goto out;
1603	}
1604	/*-------------------------------------------------------
1605	 *			(2) ps-poll
1606	 *--------------------------------------------------------
1607	 */
1608	p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256];
1609	SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1610	SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1611	SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1612
1613	SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1614
1615	/*--------------------------------------------------------
1616	 *			(3) null data
1617	 *---------------------------------------------------------i
1618	 */
1619	nullfunc = &reserved_page_packet_8821[NULL_PG * 256];
1620	SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1621	SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1622	SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1623
1624	SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1625
1626	/*---------------------------------------------------------
1627	 *			(4) Qos null data
1628	 *----------------------------------------------------------
1629	 */
1630	qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256];
1631	SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1632	SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1633	SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1634
1635	SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1636
1637	if (!dl_whole_packets) {
1638		totalpacketlen = 256 * (QOSNULL_PG + 1) - 40;
1639		goto out;
1640	}
1641	/*---------------------------------------------------------
1642	 *			(5) ARP Resp
1643	 *----------------------------------------------------------
1644	 */
1645	arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256];
1646	SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1647	SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1648	SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1649
1650	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1651
1652	/*---------------------------------------------------------
1653	 *			(6) Remote Wake Ctrl
1654	 *----------------------------------------------------------
1655	 */
1656	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1657									REMOTE_PG);
1658
1659	/*---------------------------------------------------------
1660	 *			(7) GTK Ext Memory
1661	 *----------------------------------------------------------
1662	 */
1663	SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1664
1665	totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40;
1666
1667out:
1668
1669	RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1670		      "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n",
1671		      &reserved_page_packet_8821[0], totalpacketlen);
1672
1673	skb = dev_alloc_skb(totalpacketlen);
1674	memcpy((u8 *)skb_put(skb, totalpacketlen),
1675	       &reserved_page_packet_8821, totalpacketlen);
1676
1677	rtstatus = rtl_cmd_send_packet(hw, skb);
1678
1679	if (rtstatus)
1680		b_dlok = true;
1681
1682	if (!b_dl_finished && b_dlok) {
1683		RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1684			 "Set RSVD page location to Fw.\n");
1685		RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1686				"H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1687		rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1688				       sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1689		if (dl_whole_packets) {
1690			RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1691				      "wowlan H2C_RSVDPAGE:\n",
1692				      u1RsvdPageLoc2, 7);
1693			rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1694					       sizeof(u1RsvdPageLoc2),
1695					       u1RsvdPageLoc2);
1696		}
1697	}
1698
1699	if (!b_dlok) {
1700		RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1701			 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1702	}
1703}
1704
1705/*Should check FW support p2p or not.*/
1706static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
1707{
1708	u8 u1_ctwindow_period[1] = { ctwindow};
1709
1710	rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1,
1711			       u1_ctwindow_period);
1712}
1713
1714void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
1715{
1716	struct rtl_priv *rtlpriv = rtl_priv(hw);
1717	struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
1718	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1719	struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
1720	struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
1721	u8	i;
1722	u16	ctwindow;
1723	u32	start_time, tsf_low;
1724
1725	switch (p2p_ps_state) {
1726	case P2P_PS_DISABLE:
1727		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
1728		memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
1729		break;
1730	case P2P_PS_ENABLE:
1731		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
1732		/* update CTWindow value. */
1733		if (p2pinfo->ctwindow > 0) {
1734			p2p_ps_offload->ctwindow_en = 1;
1735			ctwindow = p2pinfo->ctwindow;
1736			rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow);
1737		}
1738
1739		/* hw only support 2 set of NoA */
1740		for (i = 0 ; i < p2pinfo->noa_num ; i++) {
1741			/* To control the register setting for which NOA*/
1742			rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
1743			if (i == 0)
1744				p2p_ps_offload->noa0_en = 1;
1745			else
1746				p2p_ps_offload->noa1_en = 1;
1747
1748			/* config P2P NoA Descriptor Register */
1749			rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]);
1750			rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]);
1751
1752			/*Get Current TSF value */
1753			tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
1754
1755			start_time = p2pinfo->noa_start_time[i];
1756			if (p2pinfo->noa_count_type[i] != 1) {
1757				while (start_time <= (tsf_low+(50*1024))) {
1758					start_time += p2pinfo->noa_interval[i];
1759					if (p2pinfo->noa_count_type[i] != 255)
1760						p2pinfo->noa_count_type[i]--;
1761				}
1762			}
1763			rtl_write_dword(rtlpriv, 0x5E8, start_time);
1764			rtl_write_dword(rtlpriv, 0x5EC,
1765					p2pinfo->noa_count_type[i]);
1766		}
1767
1768		if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
1769			/* rst p2p circuit */
1770			rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
1771
1772			p2p_ps_offload->offload_en = 1;
1773
1774			if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
1775				p2p_ps_offload->role = 1;
1776				p2p_ps_offload->allstasleep = 0;
1777			} else {
1778				p2p_ps_offload->role = 0;
1779			}
1780
1781			p2p_ps_offload->discovery = 0;
1782		}
1783		break;
1784	case P2P_PS_SCAN:
1785		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
1786		p2p_ps_offload->discovery = 1;
1787		break;
1788	case P2P_PS_SCAN_DONE:
1789		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
1790		p2p_ps_offload->discovery = 0;
1791		p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
1792		break;
1793	default:
1794		break;
1795	}
1796
1797	rtl8821ae_fill_h2c_cmd(hw,
1798			H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
1799}
1800
1801static void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
1802				     u8 *cmd_buf, u8 cmd_len)
1803{
1804	struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1805	u8 rate = cmd_buf[0] & 0x3F;
1806
1807	rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate);
1808
1809	rtl8821ae_dm_update_init_rate(hw, rate);
1810}
1811
1812static void _rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
1813					   u8 c2h_cmd_id, u8 c2h_cmd_len,
1814					   u8 *tmp_buf)
1815{
1816	struct rtl_priv *rtlpriv = rtl_priv(hw);
1817
1818	switch (c2h_cmd_id) {
1819	case C2H_8812_DBG:
1820		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n");
1821		break;
1822	case C2H_8812_RA_RPT:
1823		rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
1824		break;
1825	case C2H_8812_BT_INFO:
1826		RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1827			 "[C2H], C2H_8812_BT_INFO!!\n");
1828		if (rtlpriv->cfg->ops->get_btc_status())
1829			rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv,
1830								      tmp_buf,
1831								      c2h_cmd_len);
1832		break;
1833	default:
1834		break;
1835	}
1836}
1837
1838void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer,
1839				  u8 length)
1840{
1841	struct rtl_priv *rtlpriv = rtl_priv(hw);
1842	u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
1843	u8 *tmp_buf = NULL;
1844
1845	c2h_cmd_id = buffer[0];
1846	c2h_cmd_seq = buffer[1];
1847	c2h_cmd_len = length - 2;
1848	tmp_buf = buffer + 2;
1849
1850	RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1851		 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
1852		 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
1853
1854	RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD,
1855		      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
1856	_rtl8821ae_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
1857}
1858