linux/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/fw.c
<<
>>
Prefs
   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
  36static 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
  55static 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
  87static 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
 124exit:
 125        return err;
 126}
 127
 128static 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
 140int 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)
 216void 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
 242static 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
 255static 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
 437void 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
 454void 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
 487void 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
 577void 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
 594void 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
 609void 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
 641void 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
 670void 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
 691void 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
 709void 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
 746static 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
1014static 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
1538void 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
1642out:
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        skb_put_data(skb, &reserved_page_packet_8812, totalpacketlen);
1649
1650        rtstatus = rtl_cmd_send_packet(hw, skb);
1651
1652        if (rtstatus)
1653                b_dlok = true;
1654
1655        if (!b_dl_finished && b_dlok) {
1656                RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1657                              "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1658                rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1659                                       sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1660                if (dl_whole_packets) {
1661                        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1662                                      "wowlan H2C_RSVDPAGE:\n", u1RsvdPageLoc2, 7);
1663                        rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1664                                               sizeof(u1RsvdPageLoc2), u1RsvdPageLoc2);
1665                }
1666        }
1667
1668        if (!b_dlok)
1669                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1670                         "Set RSVD page location to Fw FAIL!!!!!!.\n");
1671}
1672
1673void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1674                                  bool b_dl_finished, bool dl_whole_packets)
1675{
1676        struct rtl_priv *rtlpriv = rtl_priv(hw);
1677        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1678        struct sk_buff *skb = NULL;
1679        u32 totalpacketlen;
1680        bool rtstatus;
1681        u8 u1RsvdPageLoc[5] = { 0 };
1682        u8 u1RsvdPageLoc2[7] = { 0 };
1683        bool b_dlok = false;
1684        u8 *beacon;
1685        u8 *p_pspoll;
1686        u8 *nullfunc;
1687        u8 *qosnull;
1688        u8 *btqosnull;
1689        u8 *arpresp;
1690
1691        /*---------------------------------------------------------
1692         *                      (1) beacon
1693         *---------------------------------------------------------
1694         */
1695        beacon = &reserved_page_packet_8821[BEACON_PG * 256];
1696        SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1697        SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1698
1699        if (b_dl_finished) {
1700                totalpacketlen = 256 - 40;
1701                goto out;
1702        }
1703        /*-------------------------------------------------------
1704         *                      (2) ps-poll
1705         *--------------------------------------------------------
1706         */
1707        p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256];
1708        SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1709        SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1710        SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1711
1712        SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1713
1714        /*--------------------------------------------------------
1715         *                      (3) null data
1716         *---------------------------------------------------------i
1717         */
1718        nullfunc = &reserved_page_packet_8821[NULL_PG * 256];
1719        SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1720        SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1721        SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1722
1723        SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1724
1725        /*---------------------------------------------------------
1726         *                      (4) Qos null data
1727         *----------------------------------------------------------
1728         */
1729        qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256];
1730        SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1731        SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1732        SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1733
1734        SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1735
1736        /*---------------------------------------------------------
1737         *                      (5) Qos null data
1738         *----------------------------------------------------------
1739         */
1740        btqosnull = &reserved_page_packet_8821[BT_QOSNULL_PG * 256];
1741        SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid);
1742        SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr);
1743        SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid);
1744
1745        SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1RsvdPageLoc, BT_QOSNULL_PG);
1746
1747        if (!dl_whole_packets) {
1748                totalpacketlen = 256 * (BT_QOSNULL_PG + 1) - 40;
1749                goto out;
1750        }
1751        /*---------------------------------------------------------
1752         *                      (6) ARP Resp
1753         *----------------------------------------------------------
1754         */
1755        arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256];
1756        SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1757        SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1758        SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1759
1760        SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1761
1762        /*---------------------------------------------------------
1763         *                      (7) Remote Wake Ctrl
1764         *----------------------------------------------------------
1765         */
1766        SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1767                                                                        REMOTE_PG);
1768
1769        /*---------------------------------------------------------
1770         *                      (8) GTK Ext Memory
1771         *----------------------------------------------------------
1772         */
1773        SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1774
1775        totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40;
1776
1777out:
1778
1779        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1780                      "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n",
1781                      &reserved_page_packet_8821[0], totalpacketlen);
1782
1783        skb = dev_alloc_skb(totalpacketlen);
1784        skb_put_data(skb, &reserved_page_packet_8821, totalpacketlen);
1785
1786        rtstatus = rtl_cmd_send_packet(hw, skb);
1787
1788        if (rtstatus)
1789                b_dlok = true;
1790
1791        if (!b_dl_finished && b_dlok) {
1792                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1793                         "Set RSVD page location to Fw.\n");
1794                RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1795                                "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1796                rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1797                                       sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1798                if (dl_whole_packets) {
1799                        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1800                                      "wowlan H2C_RSVDPAGE:\n",
1801                                      u1RsvdPageLoc2, 7);
1802                        rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1803                                               sizeof(u1RsvdPageLoc2),
1804                                               u1RsvdPageLoc2);
1805                }
1806        }
1807
1808        if (!b_dlok) {
1809                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1810                         "Set RSVD page location to Fw FAIL!!!!!!.\n");
1811        }
1812}
1813
1814/*Should check FW support p2p or not.*/
1815static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
1816{
1817        u8 u1_ctwindow_period[1] = { ctwindow};
1818
1819        rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1,
1820                               u1_ctwindow_period);
1821}
1822
1823void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
1824{
1825        struct rtl_priv *rtlpriv = rtl_priv(hw);
1826        struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
1827        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1828        struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
1829        struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
1830        u8      i;
1831        u16     ctwindow;
1832        u32     start_time, tsf_low;
1833
1834        switch (p2p_ps_state) {
1835        case P2P_PS_DISABLE:
1836                RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
1837                memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
1838                break;
1839        case P2P_PS_ENABLE:
1840                RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
1841                /* update CTWindow value. */
1842                if (p2pinfo->ctwindow > 0) {
1843                        p2p_ps_offload->ctwindow_en = 1;
1844                        ctwindow = p2pinfo->ctwindow;
1845                        rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow);
1846                }
1847
1848                /* hw only support 2 set of NoA */
1849                for (i = 0 ; i < p2pinfo->noa_num ; i++) {
1850                        /* To control the register setting for which NOA*/
1851                        rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
1852                        if (i == 0)
1853                                p2p_ps_offload->noa0_en = 1;
1854                        else
1855                                p2p_ps_offload->noa1_en = 1;
1856
1857                        /* config P2P NoA Descriptor Register */
1858                        rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]);
1859                        rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]);
1860
1861                        /*Get Current TSF value */
1862                        tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
1863
1864                        start_time = p2pinfo->noa_start_time[i];
1865                        if (p2pinfo->noa_count_type[i] != 1) {
1866                                while (start_time <= (tsf_low+(50*1024))) {
1867                                        start_time += p2pinfo->noa_interval[i];
1868                                        if (p2pinfo->noa_count_type[i] != 255)
1869                                                p2pinfo->noa_count_type[i]--;
1870                                }
1871                        }
1872                        rtl_write_dword(rtlpriv, 0x5E8, start_time);
1873                        rtl_write_dword(rtlpriv, 0x5EC,
1874                                        p2pinfo->noa_count_type[i]);
1875                }
1876
1877                if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
1878                        /* rst p2p circuit */
1879                        rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
1880
1881                        p2p_ps_offload->offload_en = 1;
1882
1883                        if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
1884                                p2p_ps_offload->role = 1;
1885                                p2p_ps_offload->allstasleep = 0;
1886                        } else {
1887                                p2p_ps_offload->role = 0;
1888                        }
1889
1890                        p2p_ps_offload->discovery = 0;
1891                }
1892                break;
1893        case P2P_PS_SCAN:
1894                RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
1895                p2p_ps_offload->discovery = 1;
1896                break;
1897        case P2P_PS_SCAN_DONE:
1898                RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
1899                p2p_ps_offload->discovery = 0;
1900                p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
1901                break;
1902        default:
1903                break;
1904        }
1905
1906        rtl8821ae_fill_h2c_cmd(hw,
1907                        H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
1908}
1909
1910static void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
1911                                     u8 *cmd_buf, u8 cmd_len)
1912{
1913        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1914        u8 rate = cmd_buf[0] & 0x3F;
1915
1916        rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate);
1917
1918        rtl8821ae_dm_update_init_rate(hw, rate);
1919}
1920
1921void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
1922                                   u8 c2h_cmd_id, u8 c2h_cmd_len,
1923                                   u8 *tmp_buf)
1924{
1925        struct rtl_priv *rtlpriv = rtl_priv(hw);
1926        struct rtl_btc_ops *btc_ops = rtlpriv->btcoexist.btc_ops;
1927
1928        switch (c2h_cmd_id) {
1929        case C2H_8812_DBG:
1930                RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n");
1931                break;
1932        case C2H_8812_TX_REPORT:
1933                rtl_tx_report_handler(hw, tmp_buf, c2h_cmd_len);
1934                break;
1935        case C2H_8812_RA_RPT:
1936                rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
1937                break;
1938        case C2H_8812_BT_INFO:
1939                RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1940                         "[C2H], C2H_8812_BT_INFO!!\n");
1941                if (rtlpriv->cfg->ops->get_btc_status())
1942                        btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
1943                                                   c2h_cmd_len);
1944                break;
1945        case C2H_8812_BT_MP:
1946                RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
1947                         "[C2H], C2H_8812_BT_MP!!\n");
1948                if (rtlpriv->cfg->ops->get_btc_status())
1949                        btc_ops->btc_btmpinfo_notify(rtlpriv, tmp_buf,
1950                                                     c2h_cmd_len);
1951                break;
1952        default:
1953                break;
1954        }
1955}
1956
1957void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer,
1958                                  u8 length)
1959{
1960        struct rtl_priv *rtlpriv = rtl_priv(hw);
1961        u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
1962        u8 *tmp_buf = NULL;
1963
1964        c2h_cmd_id = buffer[0];
1965        c2h_cmd_seq = buffer[1];
1966        c2h_cmd_len = length - 2;
1967        tmp_buf = buffer + 2;
1968
1969        RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1970                 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
1971                 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
1972
1973        RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD,
1974                      "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
1975
1976        switch (c2h_cmd_id) {
1977        case C2H_8812_BT_INFO:
1978                rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
1979                break;
1980
1981        default:
1982                rtl8821ae_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len,
1983                                              tmp_buf);
1984                break;
1985        }
1986}
1987