]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
Merge branch 'linus' of git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[karo-tx-linux.git] / drivers / net / wireless / realtek / rtlwifi / rtl8821ae / fw.c
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                 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
146 static 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
193 exit:
194         return err;
195 }
196
197 static 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
209 int 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 rtlwifi_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 rtlwifi_firmware_header *)rtlhal->wowlan_firmware;
232                 rtlhal->fw_version = le16_to_cpu(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 rtlwifi_firmware_header *)rtlhal->pfirmware;
242                 rtlhal->fw_version = le16_to_cpu(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 rtlwifi_firmware_header);
259                 fwsize = fwsize - sizeof(struct rtlwifi_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)
285 void 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
311 static 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
324 static 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
506 void 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
523 void 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
556 void 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
589 void 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
606 void 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
621 void 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
653 void 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
682 void 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
703 void 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
721 void 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
757 static 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
992 static u8 reserved_page_packet_8812[TOTAL_RESERVED_PKT_LEN_8812] = {
993         /* page 0: beacon */
994         0x80, 0x00, 0x00, 0x00,  0xFF, 0xFF, 0xFF, 0xFF,
995         0xFF, 0xFF, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
996         0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x60, 0x00,
997         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
998         0x64, 0x00, 0x20, 0x04,  0x00, 0x03, 0x32, 0x31,
999         0x35, 0x01, 0x08, 0x82,  0x84, 0x8B, 0x96, 0x0C,
1000         0x12, 0x18, 0x24, 0x03,  0x01, 0x01, 0x06, 0x02,
1001         0x00, 0x00, 0x2A, 0x01,  0x02, 0x32, 0x04, 0x30,
1002         0x48, 0x60, 0x6C, 0x2D,  0x1A, 0xED, 0x09, 0x03,
1003         0xFF, 0xFF, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1004         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1005         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x3D,
1006         0x00, 0xDD, 0x07, 0x00,  0xE0, 0x4C, 0x02, 0x02,
1007         0x08, 0x04, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1008         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1009         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1010         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1011         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1012         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1013         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1014         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1015         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1016         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1017         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1018         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1019         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1020         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1021         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1022         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1023         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1024         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1025         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1026         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1027         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1028         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1029         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1030         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1031         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1032         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1033         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1034         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1035         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1036         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1037         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1038         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1039         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1040         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1041         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1042         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1043         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1044         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1045         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1046         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1047         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1048         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1049         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1050         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1051         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1052         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1053         0x10, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1054         0x00, 0x00, 0x00, 0x00,  0x00, 0x81, 0x00, 0x00,
1055         0x04, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1056         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1057         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1058         /* page 1: ps-poll */
1059         0xA4, 0x10, 0x09, 0xC0,  0x84, 0xC9, 0xB2, 0xA7,
1060         0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1061         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1062         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1063         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1064         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1065         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1066         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1067         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1068         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1069         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1070         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1071         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1072         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1073         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1074         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1075         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1076         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1077         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1078         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1079         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1080         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1081         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1082         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1083         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1084         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1085         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1086         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1087         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1088         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1089         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1090         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1091         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1092         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1093         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1094         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1095         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1096         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1097         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1098         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1099         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1100         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1101         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1102         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1103         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1104         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1105         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1106         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1107         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1108         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1109         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1110         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1111         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1112         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1113         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1114         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1115         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1116         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1117         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1118         0x18, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1119         0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1120         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1121         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1122         0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1123         /* page 2: null data */
1124         0x48, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1125         0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1126         0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
1127         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1128         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1129         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1130         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1131         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1132         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1133         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1134         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1135         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1136         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1137         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1138         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1139         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1140         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1141         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1142         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1143         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1144         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1145         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1146         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1147         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1148         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1149         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1150         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1151         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1152         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1153         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1154         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1155         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1156         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1157         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1158         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1159         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1160         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1161         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1162         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1163         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1164         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1165         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1166         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1167         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1168         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1169         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1170         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1171         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1172         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1173         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1174         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1175         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1176         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1177         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1178         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1179         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1180         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1181         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1182         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1183         0x1A, 0x00, 0x28, 0x8C,  0x00, 0x12, 0x00, 0x00,
1184         0x00, 0x00, 0x00, 0x00,  0x00, 0x01, 0x00, 0x00,
1185         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1186         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1187         0x00, 0x80, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1188         /* page 3: Qos null data */
1189         0xC8, 0x01, 0x00, 0x00,  0x84, 0xC9, 0xB2, 0xA7,
1190         0xB3, 0x6E, 0x00, 0xE0,  0x4C, 0x02, 0x51, 0x02,
1191         0x84, 0xC9, 0xB2, 0xA7,  0xB3, 0x6E, 0x00, 0x00,
1192         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1193         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1194         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1195         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1196         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1197         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1198         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1199         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1200         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1201         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1202         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1203         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1204         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1205         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1206         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1207         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1208         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1209         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1210         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1211         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1212         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1213         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1214         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1215         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1216         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1217         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1218         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1219         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1220         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1221         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1222         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1223         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1224         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1225         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1226         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1227         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1228         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1229         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1230         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1231         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1232         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1233         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1234         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1235         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1236         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1237         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1238         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1239         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1240         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1241         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1242         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1243         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1244         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1245         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1246         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1247         0x00, 0x00, 0x00, 0x00,  0x00, 0x00, 0x00, 0x00,
1248         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
1451 void 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
1543 out:
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
1575 void 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
1667 out:
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.*/
1706 static 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
1714 void 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 \14TSF 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
1801 static 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
1812 static 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
1838 void 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 }