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