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