1 /****************************************************************************** 2 * 3 * Copyright(c) 2009-2010 Realtek Corporation. 4 * 5 * This program is free software; you can redistribute it and/or modify it 6 * under the terms of version 2 of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 * more details. 13 * 14 * The full GNU General Public License is included in this distribution in the 15 * file called LICENSE. 16 * 17 * Contact Information: 18 * wlanfae <wlanfae@realtek.com> 19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, 20 * Hsinchu 300, Taiwan. 21 * 22 * Larry Finger <Larry.Finger@lwfinger.net> 23 * 24 *****************************************************************************/ 25 26 #include "../wifi.h" 27 #include "../pci.h" 28 #include "../base.h" 29 #include "../core.h" 30 #include "../efuse.h" 31 #include "reg.h" 32 #include "def.h" 33 #include "fw.h" 34 #include "dm.h" 35 36 static void _rtl8821ae_enable_fw_download(struct ieee80211_hw *hw, bool enable) 37 { 38 struct rtl_priv *rtlpriv = rtl_priv(hw); 39 u8 tmp; 40 41 if (enable) { 42 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x05); 43 44 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2); 45 rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7); 46 47 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL); 48 } else { 49 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL); 50 rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe); 51 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL); 52 } 53 } 54 55 static void _rtl8821ae_write_fw(struct ieee80211_hw *hw, 56 enum version_8821ae version, 57 u8 *buffer, u32 size) 58 { 59 struct rtl_priv *rtlpriv = rtl_priv(hw); 60 u8 *bufferptr = (u8 *)buffer; 61 u32 pagenums, remainsize; 62 u32 page, offset; 63 64 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size); 65 66 rtl_fill_dummy(bufferptr, &size); 67 68 pagenums = size / FW_8821AE_PAGE_SIZE; 69 remainsize = size % FW_8821AE_PAGE_SIZE; 70 71 if (pagenums > 8) 72 pr_err("Page numbers should not greater then 8\n"); 73 74 for (page = 0; page < pagenums; page++) { 75 offset = page * FW_8821AE_PAGE_SIZE; 76 rtl_fw_page_write(hw, page, (bufferptr + offset), 77 FW_8821AE_PAGE_SIZE); 78 } 79 80 if (remainsize) { 81 offset = pagenums * FW_8821AE_PAGE_SIZE; 82 page = pagenums; 83 rtl_fw_page_write(hw, page, (bufferptr + offset), remainsize); 84 } 85 } 86 87 static int _rtl8821ae_fw_free_to_go(struct ieee80211_hw *hw) 88 { 89 struct rtl_priv *rtlpriv = rtl_priv(hw); 90 int err = -EIO; 91 u32 counter = 0; 92 u32 value32; 93 94 do { 95 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL); 96 } while ((counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT) && 97 (!(value32 & FWDL_CHKSUM_RPT))); 98 99 if (counter >= FW_8821AE_POLLING_TIMEOUT_COUNT) { 100 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 101 "chksum report faill ! REG_MCUFWDL:0x%08x .\n", 102 value32); 103 goto exit; 104 } 105 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL); 106 value32 |= MCUFWDL_RDY; 107 value32 &= ~WINTINI_RDY; 108 rtl_write_dword(rtlpriv, REG_MCUFWDL, value32); 109 110 rtl8821ae_firmware_selfreset(hw); 111 112 counter = 0; 113 do { 114 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL); 115 if (value32 & WINTINI_RDY) 116 return 0; 117 118 udelay(FW_8821AE_POLLING_DELAY); 119 } while (counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT); 120 121 pr_err("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", 122 value32); 123 124 exit: 125 return err; 126 } 127 128 static void _rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv *rtlpriv) 129 { 130 u8 val; 131 u16 count = 0; 132 133 do { 134 val = rtl_read_byte(rtlpriv, REG_HMETFR); 135 mdelay(1); 136 count++; 137 } while ((val & 0x0F) && (count < 1000)); 138 } 139 140 int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw) 141 { 142 struct rtl_priv *rtlpriv = rtl_priv(hw); 143 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 144 struct rtlwifi_firmware_header *pfwheader; 145 u8 *pfwdata; 146 u32 fwsize; 147 int err; 148 bool support_remote_wakeup; 149 enum version_8821ae version = rtlhal->version; 150 151 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN, 152 (u8 *)(&support_remote_wakeup)); 153 154 if (support_remote_wakeup) 155 _rtl8821ae_wait_for_h2c_cmd_finish(rtlpriv); 156 157 if (buse_wake_on_wlan_fw) { 158 if (!rtlhal->wowlan_firmware) 159 return 1; 160 161 pfwheader = 162 (struct rtlwifi_firmware_header *)rtlhal->wowlan_firmware; 163 rtlhal->fw_version = le16_to_cpu(pfwheader->version); 164 rtlhal->fw_subversion = pfwheader->subversion; 165 pfwdata = (u8 *)rtlhal->wowlan_firmware; 166 fwsize = rtlhal->wowlan_fwsize; 167 } else { 168 if (!rtlhal->pfirmware) 169 return 1; 170 171 pfwheader = 172 (struct rtlwifi_firmware_header *)rtlhal->pfirmware; 173 rtlhal->fw_version = le16_to_cpu(pfwheader->version); 174 rtlhal->fw_subversion = pfwheader->subversion; 175 pfwdata = (u8 *)rtlhal->pfirmware; 176 fwsize = rtlhal->fwsize; 177 } 178 179 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, 180 "%s Firmware SIZE %d\n", 181 buse_wake_on_wlan_fw ? "Wowlan" : "Normal", fwsize); 182 183 if (IS_FW_HEADER_EXIST_8812(pfwheader) || 184 IS_FW_HEADER_EXIST_8821(pfwheader)) { 185 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, 186 "Firmware Version(%d), Signature(%#x)\n", 187 pfwheader->version, pfwheader->signature); 188 189 pfwdata = pfwdata + sizeof(struct rtlwifi_firmware_header); 190 fwsize = fwsize - sizeof(struct rtlwifi_firmware_header); 191 } 192 193 if (rtlhal->mac_func_enable) { 194 if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) { 195 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00); 196 rtl8821ae_firmware_selfreset(hw); 197 } 198 } 199 _rtl8821ae_enable_fw_download(hw, true); 200 _rtl8821ae_write_fw(hw, version, pfwdata, fwsize); 201 _rtl8821ae_enable_fw_download(hw, false); 202 203 err = _rtl8821ae_fw_free_to_go(hw); 204 if (err) { 205 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG, 206 "Firmware is not ready to run!\n"); 207 } else { 208 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, 209 "Firmware is ready to run!\n"); 210 } 211 212 return 0; 213 } 214 215 #if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1) 216 void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw, 217 bool used_wowlan_fw) 218 { 219 struct rtl_priv *rtlpriv = rtl_priv(hw); 220 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 221 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 222 /* 1. Before WoWLAN or After WOWLAN we need to re-download Fw. */ 223 if (rtl8821ae_download_fw(hw, used_wowlan_fw)) { 224 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 225 "Re-Download Firmware failed!!\n"); 226 rtlhal->fw_ready = false; 227 return; 228 } 229 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 230 "Re-Download Firmware Success !!\n"); 231 rtlhal->fw_ready = true; 232 233 /* 2. Re-Init the variables about Fw related setting. */ 234 ppsc->fw_current_inpsmode = false; 235 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE; 236 rtlhal->fw_clk_change_in_progress = false; 237 rtlhal->allow_sw_to_change_hwclc = false; 238 rtlhal->last_hmeboxnum = 0; 239 } 240 #endif 241 242 static bool _rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw *hw, 243 u8 boxnum) 244 { 245 struct rtl_priv *rtlpriv = rtl_priv(hw); 246 u8 val_hmetfr; 247 bool result = false; 248 249 val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR); 250 if (((val_hmetfr >> boxnum) & BIT(0)) == 0) 251 result = true; 252 return result; 253 } 254 255 static void _rtl8821ae_fill_h2c_command(struct ieee80211_hw *hw, 256 u8 element_id, u32 cmd_len, 257 u8 *cmdbuffer) 258 { 259 struct rtl_priv *rtlpriv = rtl_priv(hw); 260 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 261 u8 boxnum = 0; 262 u16 box_reg = 0, box_extreg = 0; 263 u8 u1b_tmp = 0; 264 bool isfw_read = false; 265 u8 buf_index = 0; 266 bool bwrite_sucess = false; 267 u8 wait_h2c_limmit = 100; 268 /*u8 wait_writeh2c_limmit = 100;*/ 269 u8 boxcontent[4], boxextcontent[4]; 270 u32 h2c_waitcounter = 0; 271 unsigned long flag = 0; 272 u8 idx = 0; 273 274 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n"); 275 276 while (true) { 277 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag); 278 if (rtlhal->h2c_setinprogress) { 279 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 280 "H2C set in progress! Wait to set..element_id(%d).\n", 281 element_id); 282 283 while (rtlhal->h2c_setinprogress) { 284 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, 285 flag); 286 h2c_waitcounter++; 287 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 288 "Wait 100 us (%d times)...\n", 289 h2c_waitcounter); 290 udelay(100); 291 292 if (h2c_waitcounter > 1000) 293 return; 294 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, 295 flag); 296 } 297 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag); 298 } else { 299 rtlhal->h2c_setinprogress = true; 300 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag); 301 break; 302 } 303 } 304 305 while (!bwrite_sucess) { 306 boxnum = rtlhal->last_hmeboxnum; 307 switch (boxnum) { 308 case 0: 309 box_reg = REG_HMEBOX_0; 310 box_extreg = REG_HMEBOX_EXT_0; 311 break; 312 case 1: 313 box_reg = REG_HMEBOX_1; 314 box_extreg = REG_HMEBOX_EXT_1; 315 break; 316 case 2: 317 box_reg = REG_HMEBOX_2; 318 box_extreg = REG_HMEBOX_EXT_2; 319 break; 320 case 3: 321 box_reg = REG_HMEBOX_3; 322 box_extreg = REG_HMEBOX_EXT_3; 323 break; 324 default: 325 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 326 "switch case %#x not processed\n", boxnum); 327 break; 328 } 329 330 isfw_read = false; 331 u1b_tmp = rtl_read_byte(rtlpriv, REG_CR); 332 333 if (u1b_tmp != 0xEA) { 334 isfw_read = true; 335 } else { 336 if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xEA || 337 rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xEA) 338 rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xFF); 339 } 340 341 if (isfw_read) { 342 wait_h2c_limmit = 100; 343 isfw_read = 344 _rtl8821ae_check_fw_read_last_h2c(hw, boxnum); 345 while (!isfw_read) { 346 /*wait until Fw read*/ 347 wait_h2c_limmit--; 348 if (wait_h2c_limmit == 0) { 349 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 350 "Waiting too long for FW read clear HMEBox(%d)!\n", 351 boxnum); 352 break; 353 } 354 355 udelay(10); 356 357 isfw_read = 358 _rtl8821ae_check_fw_read_last_h2c(hw, boxnum); 359 u1b_tmp = rtl_read_byte(rtlpriv, 0x130); 360 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 361 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n", 362 boxnum, u1b_tmp); 363 } 364 } 365 366 if (!isfw_read) { 367 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 368 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n", 369 boxnum); 370 break; 371 } 372 373 memset(boxcontent, 0, sizeof(boxcontent)); 374 memset(boxextcontent, 0, sizeof(boxextcontent)); 375 boxcontent[0] = element_id; 376 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 377 "Write element_id box_reg(%4x) = %2x\n", 378 box_reg, element_id); 379 380 switch (cmd_len) { 381 case 1: 382 case 2: 383 case 3: 384 /*boxcontent[0] &= ~(BIT(7));*/ 385 memcpy((u8 *)(boxcontent) + 1, 386 cmdbuffer + buf_index, cmd_len); 387 388 for (idx = 0; idx < 4; idx++) { 389 rtl_write_byte(rtlpriv, box_reg + idx, 390 boxcontent[idx]); 391 } 392 break; 393 case 4: 394 case 5: 395 case 6: 396 case 7: 397 /*boxcontent[0] |= (BIT(7));*/ 398 memcpy((u8 *)(boxextcontent), 399 cmdbuffer + buf_index+3, cmd_len-3); 400 memcpy((u8 *)(boxcontent) + 1, 401 cmdbuffer + buf_index, 3); 402 403 for (idx = 0; idx < 4; idx++) { 404 rtl_write_byte(rtlpriv, box_extreg + idx, 405 boxextcontent[idx]); 406 } 407 408 for (idx = 0; idx < 4; idx++) { 409 rtl_write_byte(rtlpriv, box_reg + idx, 410 boxcontent[idx]); 411 } 412 break; 413 default: 414 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 415 "switch case %#x not processed\n", cmd_len); 416 break; 417 } 418 419 bwrite_sucess = true; 420 421 rtlhal->last_hmeboxnum = boxnum + 1; 422 if (rtlhal->last_hmeboxnum == 4) 423 rtlhal->last_hmeboxnum = 0; 424 425 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 426 "pHalData->last_hmeboxnum = %d\n", 427 rtlhal->last_hmeboxnum); 428 } 429 430 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag); 431 rtlhal->h2c_setinprogress = false; 432 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag); 433 434 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n"); 435 } 436 437 void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw, 438 u8 element_id, u32 cmd_len, u8 *cmdbuffer) 439 { 440 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 441 u32 tmp_cmdbuf[2]; 442 443 if (!rtlhal->fw_ready) { 444 WARN_ONCE(true, 445 "rtl8821ae: error H2C cmd because of Fw download fail!!!\n"); 446 return; 447 } 448 449 memset(tmp_cmdbuf, 0, 8); 450 memcpy(tmp_cmdbuf, cmdbuffer, cmd_len); 451 _rtl8821ae_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf); 452 } 453 454 void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw) 455 { 456 struct rtl_priv *rtlpriv = rtl_priv(hw); 457 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 458 u8 u1b_tmp; 459 460 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 461 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); 462 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3)))); 463 } else { 464 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); 465 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(0)))); 466 } 467 468 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1); 469 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2)))); 470 udelay(50); 471 472 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 473 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); 474 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3))); 475 } else { 476 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); 477 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(0))); 478 } 479 480 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1); 481 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2))); 482 483 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 484 "_8051Reset8812ae(): 8051 reset success .\n"); 485 } 486 487 void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode) 488 { 489 struct rtl_priv *rtlpriv = rtl_priv(hw); 490 u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 }; 491 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 492 u8 rlbm, power_state = 0; 493 494 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode); 495 496 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0)); 497 rlbm = 0;/*YJ,temp,120316. FW now not support RLBM=2.*/ 498 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm); 499 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 500 (rtlpriv->mac80211.p2p) ? 501 ppsc->smart_ps : 1); 502 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode, 503 ppsc->reg_max_lps_awakeintvl); 504 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0); 505 if (mode == FW_PS_ACTIVE_MODE) 506 power_state |= FW_PWR_STATE_ACTIVE; 507 else 508 power_state |= FW_PWR_STATE_RF_OFF; 509 510 SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state); 511 512 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 513 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n", 514 u1_h2c_set_pwrmode, H2C_8821AE_PWEMODE_LENGTH); 515 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_SETPWRMODE, 516 H2C_8821AE_PWEMODE_LENGTH, 517 u1_h2c_set_pwrmode); 518 } 519 520 void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, 521 u8 mstatus) 522 { 523 u8 parm[3] = { 0, 0, 0 }; 524 /* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect 525 * bit1=0-->update Media Status to MACID 526 * bit1=1-->update Media Status from MACID to MACID_End 527 * parm[1]: MACID, if this is INFRA_STA, MacID = 0 528 * parm[2]: MACID_End 529 */ 530 531 SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus); 532 SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0); 533 534 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_MSRRPT, 3, parm); 535 } 536 537 void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw, 538 u8 ap_offload_enable) 539 { 540 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 541 u8 u1_apoffload_parm[H2C_8821AE_AP_OFFLOAD_LENGTH] = { 0 }; 542 543 SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable); 544 SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid); 545 SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0); 546 547 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AP_OFFLOAD, 548 H2C_8821AE_AP_OFFLOAD_LENGTH, 549 u1_apoffload_parm); 550 } 551 552 void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en) 553 { 554 struct rtl_priv *rtlpriv = rtl_priv(hw); 555 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 556 u8 fw_wowlan_info[H2C_8821AE_WOWLAN_LENGTH] = {0}; 557 558 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "enable(%d)\n", func_en); 559 560 SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(fw_wowlan_info, 561 (func_en ? true : false)); 562 563 SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(fw_wowlan_info, 564 ((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) ? 1 : 0)); 565 SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(fw_wowlan_info, 566 ((ppsc->wo_wlan_mode & WAKE_ON_MAGIC_PACKET) ? 1 : 0)); 567 568 SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(fw_wowlan_info, 0); 569 SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(fw_wowlan_info, false); 570 SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(fw_wowlan_info, 0); 571 SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(fw_wowlan_info, 1); 572 SET_8812_H2CCMD_WOWLAN_GPIONUM(fw_wowlan_info, 0); 573 SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(fw_wowlan_info, 0); 574 575 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_DMESG, 576 "wowlan mode: cmd 0x80: Content:\n", 577 fw_wowlan_info, H2C_8821AE_WOWLAN_LENGTH); 578 579 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_WO_WLAN, 580 H2C_8821AE_WOWLAN_LENGTH, 581 fw_wowlan_info); 582 } 583 584 void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw, 585 u8 enable) 586 { 587 struct rtl_priv *rtlpriv = rtl_priv(hw); 588 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 589 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 590 u8 remote_wake_ctrl_parm[H2C_8821AE_REMOTE_WAKE_CTRL_LEN] = {0}; 591 592 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 593 "enable=%d, ARP offload=%d, GTK offload=%d\n", 594 enable, ppsc->arp_offload_enable, ppsc->gtk_offload_enable); 595 596 SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(remote_wake_ctrl_parm, enable); 597 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(remote_wake_ctrl_parm, 598 (ppsc->arp_offload_enable ? 1 : 0)); 599 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(remote_wake_ctrl_parm, 600 (ppsc->gtk_offload_enable ? 1 : 0)); 601 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(remote_wake_ctrl_parm, 602 (rtlhal->real_wow_v2_enable ? 1 : 0)); 603 604 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE, 605 "remote_wake_ctrl: cmd 0x4: Content:\n", 606 remote_wake_ctrl_parm, H2C_8821AE_REMOTE_WAKE_CTRL_LEN); 607 608 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_REMOTE_WAKE_CTRL, 609 H2C_8821AE_REMOTE_WAKE_CTRL_LEN, 610 remote_wake_ctrl_parm); 611 } 612 613 void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw, 614 bool func_en) 615 { 616 struct rtl_priv *rtlpriv = rtl_priv(hw); 617 u8 keep_alive_info[H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH] = {0}; 618 619 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable(%d)\n", func_en); 620 621 SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(keep_alive_info, func_en); 622 /* 1: the period is controled by driver, 0: by Fw default */ 623 SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(keep_alive_info, 1); 624 SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(keep_alive_info, 10); /* 10 sec */ 625 626 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE, 627 "keep alive: cmd 0x3: Content:\n", 628 keep_alive_info, H2C_8821AE_KEEP_ALIVE_CTRL); 629 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL, 630 H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH, 631 keep_alive_info); 632 } 633 634 void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw, 635 bool enabled) 636 { 637 struct rtl_priv *rtlpriv = rtl_priv(hw); 638 u8 parm[H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN] = {0}; 639 640 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(parm, enabled); 641 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(parm, 1); 642 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(parm, 30); 643 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(parm, 3); 644 645 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE, 646 "disconnect_decision_ctrl: cmd 0x4: Content:\n", 647 parm, H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN); 648 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_DISCONNECT_DECISION, 649 H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN, parm); 650 } 651 652 void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw) 653 { 654 struct rtl_priv *rtlpriv = rtl_priv(hw); 655 struct rtl_security *sec = &rtlpriv->sec; 656 u8 remote_wakeup_sec_info[H2C_8821AE_AOAC_GLOBAL_INFO_LEN] = {0}; 657 658 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 659 "PairwiseEncAlgorithm=%d, GroupEncAlgorithm=%d\n", 660 sec->pairwise_enc_algorithm, sec->group_enc_algorithm); 661 662 SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG( 663 remote_wakeup_sec_info, 664 sec->pairwise_enc_algorithm); 665 SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(remote_wakeup_sec_info, 666 sec->group_enc_algorithm); 667 668 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_GLOBAL_INFO, 669 H2C_8821AE_AOAC_GLOBAL_INFO_LEN, 670 remote_wakeup_sec_info); 671 672 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_TRACE, 673 "rtl8821ae_set_global_info: cmd 0x82:\n", 674 remote_wakeup_sec_info, H2C_8821AE_AOAC_GLOBAL_INFO_LEN); 675 } 676 677 #define BEACON_PG 0 678 #define PSPOLL_PG 1 679 #define NULL_PG 2 680 #define QOSNULL_PG 3 681 #define BT_QOSNULL_PG 4 682 #define ARPRESP_PG 5 683 #define REMOTE_PG 6 684 #define GTKEXT_PG 7 685 686 #define TOTAL_RESERVED_PKT_LEN_8812 4096 687 #define TOTAL_RESERVED_PKT_LEN_8821 2048 688 689 static u8 reserved_page_packet_8821[TOTAL_RESERVED_PKT_LEN_8821] = { 690 /* page 0: beacon */ 691 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 692 0xff, 0xff, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64, 693 0x40, 0x16, 0x9f, 0x23, 0xd4, 0x46, 0x20, 0x00, 694 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 695 0x64, 0x00, 0x20, 0x04, 0x00, 0x06, 0x64, 0x6c, 696 0x69, 0x6e, 0x6b, 0x31, 0x01, 0x08, 0x82, 0x84, 697 0x8b, 0x96, 0x0c, 0x18, 0x30, 0x48, 0x03, 0x01, 698 0x0b, 0x06, 0x02, 0x00, 0x00, 0x2a, 0x01, 0x8b, 699 0x32, 0x04, 0x12, 0x24, 0x60, 0x6c, 0x00, 0x00, 700 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 701 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 702 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 703 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 704 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 707 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 708 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 709 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 710 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 711 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 712 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 714 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 715 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 716 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 717 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 718 0x10, 0x00, 0x28, 0x8c, 0x00, 0x12, 0x00, 0x00, 719 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 720 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 721 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 722 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 723 /* page 1: ps-poll */ 724 0xa4, 0x10, 0x01, 0xc0, 0x40, 0x16, 0x9f, 0x23, 725 0xd4, 0x46, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64, 726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 727 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 728 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 729 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 730 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 731 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 732 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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 0x18, 0x00, 0x28, 0x8c, 0x00, 0x12, 0x00, 0x00, 752 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 753 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 755 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 756 /* page 2: null data */ 757 0x48, 0x01, 0x00, 0x00, 0x40, 0x16, 0x9f, 0x23, 758 0xd4, 0x46, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64, 759 0x40, 0x16, 0x9f, 0x23, 0xd4, 0x46, 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 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 0x1A, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00, 785 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 786 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 788 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 789 /* page 3: qos null data */ 790 0xC8, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7, 791 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 792 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 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 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 0x1A, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00, 818 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 819 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 820 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 821 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 822 /* page 4: BT qos null data */ 823 0xC8, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7, 824 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 825 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 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 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 0x3C, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00, 851 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 852 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 854 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 855 /* page 5~7 is for wowlan */ 856 /* page 5: ARP resp */ 857 0x08, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7, 858 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 859 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00, 860 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06, 861 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02, 862 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 0x00, 0x00, 863 0x00, 0x00, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 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 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 /* page 6: H2C_REMOTE_WAKE_CTRL_INFO */ 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 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 /* page 7: Rsvd GTK extend memory (zero memory) */ 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 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 }; 956 957 static u8 reserved_page_packet_8812[TOTAL_RESERVED_PKT_LEN_8812] = { 958 /* page 0: beacon */ 959 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 960 0xFF, 0xFF, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 961 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x60, 0x00, 962 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 963 0x64, 0x00, 0x20, 0x04, 0x00, 0x03, 0x32, 0x31, 964 0x35, 0x01, 0x08, 0x82, 0x84, 0x8B, 0x96, 0x0C, 965 0x12, 0x18, 0x24, 0x03, 0x01, 0x01, 0x06, 0x02, 966 0x00, 0x00, 0x2A, 0x01, 0x02, 0x32, 0x04, 0x30, 967 0x48, 0x60, 0x6C, 0x2D, 0x1A, 0xED, 0x09, 0x03, 968 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 971 0x00, 0xDD, 0x07, 0x00, 0xE0, 0x4C, 0x02, 0x02, 972 0x08, 0x04, 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 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 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 0x10, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00, 1019 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 1020 0x04, 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 /* page 1: ps-poll */ 1024 0xA4, 0x10, 0x09, 0xC0, 0x84, 0xC9, 0xB2, 0xA7, 1025 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 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 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 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 0x18, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00, 1084 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 1085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1087 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1088 /* page 2: null data */ 1089 0x48, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7, 1090 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 1091 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 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 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 0x1A, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00, 1149 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 1150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1152 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1153 /* page 3: Qos null data */ 1154 0xC8, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7, 1155 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 1156 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 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 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 0x1A, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00, 1214 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 1215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1217 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1218 /* page 4: BT Qos null data */ 1219 0xC8, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7, 1220 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 1221 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 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 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 0x3C, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00, 1279 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 1280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1282 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 1283 /* page 5~7 is for wowlan */ 1284 /* page 5: ARP resp */ 1285 0x08, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7, 1286 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 1287 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00, 1288 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06, 1289 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02, 1290 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 0x00, 0x00, 1291 0x00, 0x00, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 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 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 /* page 6: H2C_REMOTE_WAKE_CTRL_INFO */ 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 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 /* page 7: Rsvd GTK extend memory (zero memory) */ 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 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 }; 1480 1481 void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, 1482 bool b_dl_finished, bool dl_whole_packets) 1483 { 1484 struct rtl_priv *rtlpriv = rtl_priv(hw); 1485 struct rtl_mac *mac = rtl_mac(rtlpriv); 1486 struct sk_buff *skb = NULL; 1487 u32 totalpacketlen; 1488 bool rtstatus; 1489 u8 u1RsvdPageLoc[5] = { 0 }; 1490 u8 u1RsvdPageLoc2[7] = { 0 }; 1491 bool b_dlok = false; 1492 u8 *beacon; 1493 u8 *p_pspoll; 1494 u8 *nullfunc; 1495 u8 *qosnull; 1496 u8 *btqosnull; 1497 u8 *arpresp; 1498 1499 /*--------------------------------------------------------- 1500 * (1) beacon 1501 *--------------------------------------------------------- 1502 */ 1503 beacon = &reserved_page_packet_8812[BEACON_PG * 512]; 1504 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr); 1505 SET_80211_HDR_ADDRESS3(beacon, mac->bssid); 1506 1507 if (b_dl_finished) { 1508 totalpacketlen = 512 - 40; 1509 goto out; 1510 } 1511 /*------------------------------------------------------- 1512 * (2) ps-poll 1513 *-------------------------------------------------------- 1514 */ 1515 p_pspoll = &reserved_page_packet_8812[PSPOLL_PG * 512]; 1516 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000)); 1517 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid); 1518 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr); 1519 1520 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG); 1521 1522 /*-------------------------------------------------------- 1523 * (3) null data 1524 *--------------------------------------------------------- 1525 */ 1526 nullfunc = &reserved_page_packet_8812[NULL_PG * 512]; 1527 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid); 1528 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr); 1529 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid); 1530 1531 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG); 1532 1533 /*--------------------------------------------------------- 1534 * (4) Qos null data 1535 *---------------------------------------------------------- 1536 */ 1537 qosnull = &reserved_page_packet_8812[QOSNULL_PG * 512]; 1538 SET_80211_HDR_ADDRESS1(qosnull, mac->bssid); 1539 SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr); 1540 SET_80211_HDR_ADDRESS3(qosnull, mac->bssid); 1541 1542 SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG); 1543 1544 /*--------------------------------------------------------- 1545 * (5) BT Qos null data 1546 *---------------------------------------------------------- 1547 */ 1548 btqosnull = &reserved_page_packet_8812[BT_QOSNULL_PG * 512]; 1549 SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid); 1550 SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr); 1551 SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid); 1552 1553 SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1RsvdPageLoc, BT_QOSNULL_PG); 1554 1555 if (!dl_whole_packets) { 1556 totalpacketlen = 512 * (BT_QOSNULL_PG + 1) - 40; 1557 goto out; 1558 } 1559 /*--------------------------------------------------------- 1560 * (6) ARP Resp 1561 *---------------------------------------------------------- 1562 */ 1563 arpresp = &reserved_page_packet_8812[ARPRESP_PG * 512]; 1564 SET_80211_HDR_ADDRESS1(arpresp, mac->bssid); 1565 SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr); 1566 SET_80211_HDR_ADDRESS3(arpresp, mac->bssid); 1567 1568 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG); 1569 1570 /*--------------------------------------------------------- 1571 * (7) Remote Wake Ctrl 1572 *---------------------------------------------------------- 1573 */ 1574 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2, 1575 REMOTE_PG); 1576 1577 /*--------------------------------------------------------- 1578 * (8) GTK Ext Memory 1579 *---------------------------------------------------------- 1580 */ 1581 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG); 1582 1583 totalpacketlen = TOTAL_RESERVED_PKT_LEN_8812 - 40; 1584 1585 out: 1586 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, 1587 "rtl8812ae_set_fw_rsvdpagepkt(): packet data\n", 1588 &reserved_page_packet_8812[0], totalpacketlen); 1589 1590 skb = dev_alloc_skb(totalpacketlen); 1591 memcpy((u8 *)skb_put(skb, totalpacketlen), 1592 &reserved_page_packet_8812, totalpacketlen); 1593 1594 rtstatus = rtl_cmd_send_packet(hw, skb); 1595 1596 if (rtstatus) 1597 b_dlok = true; 1598 1599 if (!b_dl_finished && b_dlok) { 1600 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 1601 "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5); 1602 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE, 1603 sizeof(u1RsvdPageLoc), u1RsvdPageLoc); 1604 if (dl_whole_packets) { 1605 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 1606 "wowlan H2C_RSVDPAGE:\n", u1RsvdPageLoc2, 7); 1607 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE, 1608 sizeof(u1RsvdPageLoc2), u1RsvdPageLoc2); 1609 } 1610 } 1611 1612 if (!b_dlok) 1613 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 1614 "Set RSVD page location to Fw FAIL!!!!!!.\n"); 1615 } 1616 1617 void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, 1618 bool b_dl_finished, bool dl_whole_packets) 1619 { 1620 struct rtl_priv *rtlpriv = rtl_priv(hw); 1621 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1622 struct sk_buff *skb = NULL; 1623 u32 totalpacketlen; 1624 bool rtstatus; 1625 u8 u1RsvdPageLoc[5] = { 0 }; 1626 u8 u1RsvdPageLoc2[7] = { 0 }; 1627 bool b_dlok = false; 1628 u8 *beacon; 1629 u8 *p_pspoll; 1630 u8 *nullfunc; 1631 u8 *qosnull; 1632 u8 *btqosnull; 1633 u8 *arpresp; 1634 1635 /*--------------------------------------------------------- 1636 * (1) beacon 1637 *--------------------------------------------------------- 1638 */ 1639 beacon = &reserved_page_packet_8821[BEACON_PG * 256]; 1640 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr); 1641 SET_80211_HDR_ADDRESS3(beacon, mac->bssid); 1642 1643 if (b_dl_finished) { 1644 totalpacketlen = 256 - 40; 1645 goto out; 1646 } 1647 /*------------------------------------------------------- 1648 * (2) ps-poll 1649 *-------------------------------------------------------- 1650 */ 1651 p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256]; 1652 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000)); 1653 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid); 1654 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr); 1655 1656 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG); 1657 1658 /*-------------------------------------------------------- 1659 * (3) null data 1660 *---------------------------------------------------------i 1661 */ 1662 nullfunc = &reserved_page_packet_8821[NULL_PG * 256]; 1663 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid); 1664 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr); 1665 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid); 1666 1667 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG); 1668 1669 /*--------------------------------------------------------- 1670 * (4) Qos null data 1671 *---------------------------------------------------------- 1672 */ 1673 qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256]; 1674 SET_80211_HDR_ADDRESS1(qosnull, mac->bssid); 1675 SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr); 1676 SET_80211_HDR_ADDRESS3(qosnull, mac->bssid); 1677 1678 SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG); 1679 1680 /*--------------------------------------------------------- 1681 * (5) Qos null data 1682 *---------------------------------------------------------- 1683 */ 1684 btqosnull = &reserved_page_packet_8821[BT_QOSNULL_PG * 256]; 1685 SET_80211_HDR_ADDRESS1(btqosnull, mac->bssid); 1686 SET_80211_HDR_ADDRESS2(btqosnull, mac->mac_addr); 1687 SET_80211_HDR_ADDRESS3(btqosnull, mac->bssid); 1688 1689 SET_H2CCMD_RSVDPAGE_LOC_BT_QOS_NULL_DATA(u1RsvdPageLoc, BT_QOSNULL_PG); 1690 1691 if (!dl_whole_packets) { 1692 totalpacketlen = 256 * (BT_QOSNULL_PG + 1) - 40; 1693 goto out; 1694 } 1695 /*--------------------------------------------------------- 1696 * (6) ARP Resp 1697 *---------------------------------------------------------- 1698 */ 1699 arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256]; 1700 SET_80211_HDR_ADDRESS1(arpresp, mac->bssid); 1701 SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr); 1702 SET_80211_HDR_ADDRESS3(arpresp, mac->bssid); 1703 1704 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG); 1705 1706 /*--------------------------------------------------------- 1707 * (7) Remote Wake Ctrl 1708 *---------------------------------------------------------- 1709 */ 1710 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2, 1711 REMOTE_PG); 1712 1713 /*--------------------------------------------------------- 1714 * (8) GTK Ext Memory 1715 *---------------------------------------------------------- 1716 */ 1717 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG); 1718 1719 totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40; 1720 1721 out: 1722 1723 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, 1724 "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n", 1725 &reserved_page_packet_8821[0], totalpacketlen); 1726 1727 skb = dev_alloc_skb(totalpacketlen); 1728 memcpy((u8 *)skb_put(skb, totalpacketlen), 1729 &reserved_page_packet_8821, totalpacketlen); 1730 1731 rtstatus = rtl_cmd_send_packet(hw, skb); 1732 1733 if (rtstatus) 1734 b_dlok = true; 1735 1736 if (!b_dl_finished && b_dlok) { 1737 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 1738 "Set RSVD page location to Fw.\n"); 1739 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 1740 "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5); 1741 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE, 1742 sizeof(u1RsvdPageLoc), u1RsvdPageLoc); 1743 if (dl_whole_packets) { 1744 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 1745 "wowlan H2C_RSVDPAGE:\n", 1746 u1RsvdPageLoc2, 7); 1747 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE, 1748 sizeof(u1RsvdPageLoc2), 1749 u1RsvdPageLoc2); 1750 } 1751 } 1752 1753 if (!b_dlok) { 1754 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 1755 "Set RSVD page location to Fw FAIL!!!!!!.\n"); 1756 } 1757 } 1758 1759 /*Should check FW support p2p or not.*/ 1760 static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow) 1761 { 1762 u8 u1_ctwindow_period[1] = { ctwindow}; 1763 1764 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1, 1765 u1_ctwindow_period); 1766 } 1767 1768 void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state) 1769 { 1770 struct rtl_priv *rtlpriv = rtl_priv(hw); 1771 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw)); 1772 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1773 struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info; 1774 struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload; 1775 u8 i; 1776 u16 ctwindow; 1777 u32 start_time, tsf_low; 1778 1779 switch (p2p_ps_state) { 1780 case P2P_PS_DISABLE: 1781 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n"); 1782 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload)); 1783 break; 1784 case P2P_PS_ENABLE: 1785 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n"); 1786 /* update CTWindow value. */ 1787 if (p2pinfo->ctwindow > 0) { 1788 p2p_ps_offload->ctwindow_en = 1; 1789 ctwindow = p2pinfo->ctwindow; 1790 rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow); 1791 } 1792 1793 /* hw only support 2 set of NoA */ 1794 for (i = 0 ; i < p2pinfo->noa_num ; i++) { 1795 /* To control the register setting for which NOA*/ 1796 rtl_write_byte(rtlpriv, 0x5cf, (i << 4)); 1797 if (i == 0) 1798 p2p_ps_offload->noa0_en = 1; 1799 else 1800 p2p_ps_offload->noa1_en = 1; 1801 1802 /* config P2P NoA Descriptor Register */ 1803 rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]); 1804 rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]); 1805 1806 /*Get Current TSF value */ 1807 tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR); 1808 1809 start_time = p2pinfo->noa_start_time[i]; 1810 if (p2pinfo->noa_count_type[i] != 1) { 1811 while (start_time <= (tsf_low+(50*1024))) { 1812 start_time += p2pinfo->noa_interval[i]; 1813 if (p2pinfo->noa_count_type[i] != 255) 1814 p2pinfo->noa_count_type[i]--; 1815 } 1816 } 1817 rtl_write_dword(rtlpriv, 0x5E8, start_time); 1818 rtl_write_dword(rtlpriv, 0x5EC, 1819 p2pinfo->noa_count_type[i]); 1820 } 1821 1822 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) { 1823 /* rst p2p circuit */ 1824 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4)); 1825 1826 p2p_ps_offload->offload_en = 1; 1827 1828 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) { 1829 p2p_ps_offload->role = 1; 1830 p2p_ps_offload->allstasleep = 0; 1831 } else { 1832 p2p_ps_offload->role = 0; 1833 } 1834 1835 p2p_ps_offload->discovery = 0; 1836 } 1837 break; 1838 case P2P_PS_SCAN: 1839 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n"); 1840 p2p_ps_offload->discovery = 1; 1841 break; 1842 case P2P_PS_SCAN_DONE: 1843 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n"); 1844 p2p_ps_offload->discovery = 0; 1845 p2pinfo->p2p_ps_state = P2P_PS_ENABLE; 1846 break; 1847 default: 1848 break; 1849 } 1850 1851 rtl8821ae_fill_h2c_cmd(hw, 1852 H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload); 1853 } 1854 1855 static void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw, 1856 u8 *cmd_buf, u8 cmd_len) 1857 { 1858 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1859 u8 rate = cmd_buf[0] & 0x3F; 1860 1861 rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate); 1862 1863 rtl8821ae_dm_update_init_rate(hw, rate); 1864 } 1865 1866 void rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw, 1867 u8 c2h_cmd_id, u8 c2h_cmd_len, 1868 u8 *tmp_buf) 1869 { 1870 struct rtl_priv *rtlpriv = rtl_priv(hw); 1871 1872 switch (c2h_cmd_id) { 1873 case C2H_8812_DBG: 1874 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n"); 1875 break; 1876 case C2H_8812_RA_RPT: 1877 rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len); 1878 break; 1879 case C2H_8812_BT_INFO: 1880 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, 1881 "[C2H], C2H_8812_BT_INFO!!\n"); 1882 if (rtlpriv->cfg->ops->get_btc_status()) 1883 rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv, 1884 tmp_buf, 1885 c2h_cmd_len); 1886 break; 1887 default: 1888 break; 1889 } 1890 } 1891 1892 void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, 1893 u8 length) 1894 { 1895 struct rtl_priv *rtlpriv = rtl_priv(hw); 1896 u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0; 1897 u8 *tmp_buf = NULL; 1898 1899 c2h_cmd_id = buffer[0]; 1900 c2h_cmd_seq = buffer[1]; 1901 c2h_cmd_len = length - 2; 1902 tmp_buf = buffer + 2; 1903 1904 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, 1905 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n", 1906 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len); 1907 1908 RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD, 1909 "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len); 1910 1911 switch (c2h_cmd_id) { 1912 case C2H_8812_BT_INFO: 1913 rtl_c2hcmd_enqueue(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf); 1914 break; 1915 1916 default: 1917 rtl8821ae_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, 1918 tmp_buf); 1919 break; 1920 } 1921 } 1922