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