FILE
sdio_halinit.c
File preview with syntax highlighting.
linux-6.19.14/drivers/staging/rtl8723bs/hal/sdio_halinit.c
1// SPDX-License-Identifier: GPL-2.0 2/****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved. 5 * 6 ******************************************************************************/ 7#include <drv_types.h> 8#include <rtl8723b_hal.h> 9 10#include "hal_com_h2c.h" 11/* 12 * Description: 13 *Call power on sequence to enable card 14 * 15 * Return: 16 *_SUCCESS enable success 17 *_FAIL enable fail 18 */ 19static u8 CardEnable(struct adapter *padapter) 20{ 21 u8 bMacPwrCtrlOn; 22 u8 ret = _FAIL; 23 24 25 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); 26 if (!bMacPwrCtrlOn) { 27 /* RSV_CTRL 0x1C[7:0] = 0x00 */ 28 /* unlock ISO/CLK/Power control register */ 29 rtw_write8(padapter, REG_RSV_CTRL, 0x0); 30 31 ret = HalPwrSeqCmdParsing(padapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, rtl8723B_card_enable_flow); 32 if (ret == _SUCCESS) { 33 u8 bMacPwrCtrlOn = true; 34 rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); 35 } 36 } else 37 ret = _SUCCESS; 38 39 return ret; 40} 41 42static 43u8 _InitPowerOn_8723BS(struct adapter *padapter) 44{ 45 u8 value8; 46 u16 value16; 47 u32 value32; 48 u8 ret; 49/* u8 bMacPwrCtrlOn; */ 50 51 52 /* all of these MUST be configured before power on */ 53 54 /* only cmd52 can be used before power on(card enable) */ 55 ret = CardEnable(padapter); 56 if (!ret) 57 return _FAIL; 58 59 /* Radio-Off Pin Trigger */ 60 value8 = rtw_read8(padapter, REG_GPIO_INTM + 1); 61 value8 |= BIT(1); /* Enable falling edge triggering interrupt */ 62 rtw_write8(padapter, REG_GPIO_INTM + 1, value8); 63 value8 = rtw_read8(padapter, REG_GPIO_IO_SEL_2 + 1); 64 value8 |= BIT(1); 65 rtw_write8(padapter, REG_GPIO_IO_SEL_2 + 1, value8); 66 67 /* Enable power down and GPIO interrupt */ 68 value16 = rtw_read16(padapter, REG_APS_FSMCO); 69 value16 |= EnPDN; /* Enable HW power down and RF on */ 70 rtw_write16(padapter, REG_APS_FSMCO, value16); 71 72 /* Enable CMD53 R/W Operation */ 73/* bMacPwrCtrlOn = true; */ 74/* rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); */ 75 76 rtw_write8(padapter, REG_CR, 0x00); 77 /* Enable MAC DMA/WMAC/SCHEDULE/SEC block */ 78 value16 = rtw_read16(padapter, REG_CR); 79 value16 |= ( 80 HCI_TXDMA_EN | 81 HCI_RXDMA_EN | 82 TXDMA_EN | 83 RXDMA_EN | 84 PROTOCOL_EN | 85 SCHEDULE_EN | 86 ENSEC | 87 CALTMR_EN 88 ); 89 rtw_write16(padapter, REG_CR, value16); 90 91 hal_btcoex_PowerOnSetting(padapter); 92 93 /* external switch to S1 */ 94 /* 0x38[11] = 0x1 */ 95 /* 0x4c[23] = 0x1 */ 96 /* 0x64[0] = 0 */ 97 value16 = rtw_read16(padapter, REG_PWR_DATA); 98 /* Switch the control of EESK, EECS to RFC for DPDT or Antenna switch */ 99 value16 |= BIT(11); /* BIT_EEPRPAD_RFE_CTRL_EN */ 100 rtw_write16(padapter, REG_PWR_DATA, value16); 101 102 value32 = rtw_read32(padapter, REG_LEDCFG0); 103 value32 |= BIT(23); /* DPDT_SEL_EN, 1 for SW control */ 104 rtw_write32(padapter, REG_LEDCFG0, value32); 105 106 value8 = rtw_read8(padapter, REG_PAD_CTRL1_8723B); 107 value8 &= ~BIT(0); /* BIT_SW_DPDT_SEL_DATA, DPDT_SEL default configuration */ 108 rtw_write8(padapter, REG_PAD_CTRL1_8723B, value8); 109 110 return _SUCCESS; 111} 112 113/* Tx Page FIFO threshold */ 114static void _init_available_page_threshold(struct adapter *padapter, u8 numHQ, u8 numNQ, u8 numLQ, u8 numPubQ) 115{ 116 u16 HQ_threshold, NQ_threshold, LQ_threshold; 117 118 HQ_threshold = (numPubQ + numHQ + 1) >> 1; 119 HQ_threshold |= (HQ_threshold << 8); 120 121 NQ_threshold = (numPubQ + numNQ + 1) >> 1; 122 NQ_threshold |= (NQ_threshold << 8); 123 124 LQ_threshold = (numPubQ + numLQ + 1) >> 1; 125 LQ_threshold |= (LQ_threshold << 8); 126 127 rtw_write16(padapter, 0x218, HQ_threshold); 128 rtw_write16(padapter, 0x21A, NQ_threshold); 129 rtw_write16(padapter, 0x21C, LQ_threshold); 130} 131 132static void _InitQueueReservedPage(struct adapter *padapter) 133{ 134 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 135 struct registry_priv *pregistrypriv = &padapter->registrypriv; 136 u32 numHQ = 0; 137 u32 numLQ = 0; 138 u32 numNQ = 0; 139 u32 numPubQ; 140 u32 value32; 141 u8 value8; 142 bool bWiFiConfig = pregistrypriv->wifi_spec; 143 144 if (pHalData->OutEpQueueSel & TX_SELE_HQ) 145 numHQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_HPQ_8723B : NORMAL_PAGE_NUM_HPQ_8723B; 146 147 if (pHalData->OutEpQueueSel & TX_SELE_LQ) 148 numLQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_LPQ_8723B : NORMAL_PAGE_NUM_LPQ_8723B; 149 150 /* NOTE: This step shall be proceed before writing REG_RQPN. */ 151 if (pHalData->OutEpQueueSel & TX_SELE_NQ) 152 numNQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_NPQ_8723B : NORMAL_PAGE_NUM_NPQ_8723B; 153 154 numPubQ = TX_TOTAL_PAGE_NUMBER_8723B - numHQ - numLQ - numNQ; 155 156 value8 = (u8)_NPQ(numNQ); 157 rtw_write8(padapter, REG_RQPN_NPQ, value8); 158 159 /* TX DMA */ 160 value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN; 161 rtw_write32(padapter, REG_RQPN, value32); 162 163 rtw_hal_set_sdio_tx_max_length(padapter, numHQ, numNQ, numLQ, numPubQ); 164 165 _init_available_page_threshold(padapter, numHQ, numNQ, numLQ, numPubQ); 166} 167 168static void _InitTxBufferBoundary(struct adapter *padapter) 169{ 170 struct registry_priv *pregistrypriv = &padapter->registrypriv; 171 172 /* u16 txdmactrl; */ 173 u8 txpktbuf_bndy; 174 175 if (!pregistrypriv->wifi_spec) { 176 txpktbuf_bndy = TX_PAGE_BOUNDARY_8723B; 177 } else { 178 /* for WMM */ 179 txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8723B; 180 } 181 182 rtw_write8(padapter, REG_TXPKTBUF_BCNQ_BDNY_8723B, txpktbuf_bndy); 183 rtw_write8(padapter, REG_TXPKTBUF_MGQ_BDNY_8723B, txpktbuf_bndy); 184 rtw_write8(padapter, REG_TXPKTBUF_WMAC_LBK_BF_HD_8723B, txpktbuf_bndy); 185 rtw_write8(padapter, REG_TRXFF_BNDY, txpktbuf_bndy); 186 rtw_write8(padapter, REG_TDECTRL + 1, txpktbuf_bndy); 187} 188 189static void _InitNormalChipRegPriority( 190 struct adapter *Adapter, 191 u16 beQ, 192 u16 bkQ, 193 u16 viQ, 194 u16 voQ, 195 u16 mgtQ, 196 u16 hiQ 197) 198{ 199 u16 value16 = (rtw_read16(Adapter, REG_TRXDMA_CTRL) & 0x7); 200 201 value16 |= 202 _TXDMA_BEQ_MAP(beQ) | 203 _TXDMA_BKQ_MAP(bkQ) | 204 _TXDMA_VIQ_MAP(viQ) | 205 _TXDMA_VOQ_MAP(voQ) | 206 _TXDMA_MGQ_MAP(mgtQ) | 207 _TXDMA_HIQ_MAP(hiQ); 208 209 rtw_write16(Adapter, REG_TRXDMA_CTRL, value16); 210} 211 212static void _InitNormalChipOneOutEpPriority(struct adapter *Adapter) 213{ 214 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 215 216 u16 value = 0; 217 switch (pHalData->OutEpQueueSel) { 218 case TX_SELE_HQ: 219 value = QUEUE_HIGH; 220 break; 221 case TX_SELE_LQ: 222 value = QUEUE_LOW; 223 break; 224 case TX_SELE_NQ: 225 value = QUEUE_NORMAL; 226 break; 227 default: 228 break; 229 } 230 231 _InitNormalChipRegPriority( 232 Adapter, value, value, value, value, value, value 233 ); 234 235} 236 237static void _InitNormalChipTwoOutEpPriority(struct adapter *Adapter) 238{ 239 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 240 struct registry_priv *pregistrypriv = &Adapter->registrypriv; 241 u16 beQ, bkQ, viQ, voQ, mgtQ, hiQ; 242 243 244 u16 valueHi = 0; 245 u16 valueLow = 0; 246 247 switch (pHalData->OutEpQueueSel) { 248 case (TX_SELE_HQ | TX_SELE_LQ): 249 valueHi = QUEUE_HIGH; 250 valueLow = QUEUE_LOW; 251 break; 252 case (TX_SELE_NQ | TX_SELE_LQ): 253 valueHi = QUEUE_NORMAL; 254 valueLow = QUEUE_LOW; 255 break; 256 case (TX_SELE_HQ | TX_SELE_NQ): 257 valueHi = QUEUE_HIGH; 258 valueLow = QUEUE_NORMAL; 259 break; 260 default: 261 break; 262 } 263 264 if (!pregistrypriv->wifi_spec) { 265 beQ = valueLow; 266 bkQ = valueLow; 267 viQ = valueHi; 268 voQ = valueHi; 269 mgtQ = valueHi; 270 hiQ = valueHi; 271 } else { 272 /* for WMM , CONFIG_OUT_EP_WIFI_MODE */ 273 beQ = valueLow; 274 bkQ = valueHi; 275 viQ = valueHi; 276 voQ = valueLow; 277 mgtQ = valueHi; 278 hiQ = valueHi; 279 } 280 281 _InitNormalChipRegPriority(Adapter, beQ, bkQ, viQ, voQ, mgtQ, hiQ); 282 283} 284 285static void _InitNormalChipThreeOutEpPriority(struct adapter *padapter) 286{ 287 struct registry_priv *pregistrypriv = &padapter->registrypriv; 288 u16 beQ, bkQ, viQ, voQ, mgtQ, hiQ; 289 290 if (!pregistrypriv->wifi_spec) { 291 /* typical setting */ 292 beQ = QUEUE_LOW; 293 bkQ = QUEUE_LOW; 294 viQ = QUEUE_NORMAL; 295 voQ = QUEUE_HIGH; 296 mgtQ = QUEUE_HIGH; 297 hiQ = QUEUE_HIGH; 298 } else { 299 /* for WMM */ 300 beQ = QUEUE_LOW; 301 bkQ = QUEUE_NORMAL; 302 viQ = QUEUE_NORMAL; 303 voQ = QUEUE_HIGH; 304 mgtQ = QUEUE_HIGH; 305 hiQ = QUEUE_HIGH; 306 } 307 _InitNormalChipRegPriority(padapter, beQ, bkQ, viQ, voQ, mgtQ, hiQ); 308} 309 310static void _InitQueuePriority(struct adapter *Adapter) 311{ 312 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 313 314 switch (pHalData->OutEpNumber) { 315 case 1: 316 _InitNormalChipOneOutEpPriority(Adapter); 317 break; 318 case 2: 319 _InitNormalChipTwoOutEpPriority(Adapter); 320 break; 321 case 3: 322 _InitNormalChipThreeOutEpPriority(Adapter); 323 break; 324 default: 325 break; 326 } 327 328 329} 330 331static void _InitPageBoundary(struct adapter *padapter) 332{ 333 /* RX Page Boundary */ 334 u16 rxff_bndy = RX_DMA_BOUNDARY_8723B; 335 336 rtw_write16(padapter, (REG_TRXFF_BNDY + 2), rxff_bndy); 337} 338 339static void _InitTransferPageSize(struct adapter *padapter) 340{ 341 /* Tx page size is always 128. */ 342 343 u8 value8; 344 value8 = _PSRX(PBP_128) | _PSTX(PBP_128); 345 rtw_write8(padapter, REG_PBP, value8); 346} 347 348static void _InitDriverInfoSize(struct adapter *padapter, u8 drvInfoSize) 349{ 350 rtw_write8(padapter, REG_RX_DRVINFO_SZ, drvInfoSize); 351} 352 353static void _InitNetworkType(struct adapter *padapter) 354{ 355 u32 value32; 356 357 value32 = rtw_read32(padapter, REG_CR); 358 359 /* TODO: use the other function to set network type */ 360/* value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AD_HOC); */ 361 value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP); 362 363 rtw_write32(padapter, REG_CR, value32); 364} 365 366static void _InitWMACSetting(struct adapter *padapter) 367{ 368 struct hal_com_data *pHalData; 369 u16 value16; 370 371 372 pHalData = GET_HAL_DATA(padapter); 373 374 pHalData->ReceiveConfig = 0; 375 pHalData->ReceiveConfig |= RCR_APM | RCR_AM | RCR_AB; 376 pHalData->ReceiveConfig |= RCR_CBSSID_DATA | RCR_CBSSID_BCN | RCR_AMF; 377 pHalData->ReceiveConfig |= RCR_HTC_LOC_CTRL; 378 pHalData->ReceiveConfig |= RCR_APP_PHYST_RXFF | RCR_APP_ICV | RCR_APP_MIC; 379 rtw_write32(padapter, REG_RCR, pHalData->ReceiveConfig); 380 381 /* Accept all multicast address */ 382 rtw_write32(padapter, REG_MAR, 0xFFFFFFFF); /* Offset 0x0620-0x0623 */ 383 rtw_write32(padapter, REG_MAR + 4, 0xFFFFFFFF); /* Offset 0x0624-0x0627 */ 384 385 /* Accept all data frames */ 386 value16 = 0xFFFF; 387 rtw_write16(padapter, REG_RXFLTMAP2, value16); 388 389 /* 2010.09.08 hpfan */ 390 /* Since ADF is removed from RCR, ps-poll will not be indicate to driver, */ 391 /* RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll. */ 392 value16 = 0x400; 393 rtw_write16(padapter, REG_RXFLTMAP1, value16); 394 395 /* Accept all management frames */ 396 value16 = 0xFFFF; 397 rtw_write16(padapter, REG_RXFLTMAP0, value16); 398} 399 400static void _InitAdaptiveCtrl(struct adapter *padapter) 401{ 402 u16 value16; 403 u32 value32; 404 405 /* Response Rate Set */ 406 value32 = rtw_read32(padapter, REG_RRSR); 407 value32 &= ~RATE_BITMAP_ALL; 408 value32 |= RATE_RRSR_CCK_ONLY_1M; 409 rtw_write32(padapter, REG_RRSR, value32); 410 411 /* CF-END Threshold */ 412 /* m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1); */ 413 414 /* SIFS (used in NAV) */ 415 value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10); 416 rtw_write16(padapter, REG_SPEC_SIFS, value16); 417 418 /* Retry Limit */ 419 value16 = _LRL(0x30) | _SRL(0x30); 420 rtw_write16(padapter, REG_RL, value16); 421} 422 423static void _InitEDCA(struct adapter *padapter) 424{ 425 /* Set Spec SIFS (used in NAV) */ 426 rtw_write16(padapter, REG_SPEC_SIFS, 0x100a); 427 rtw_write16(padapter, REG_MAC_SPEC_SIFS, 0x100a); 428 429 /* Set SIFS for CCK */ 430 rtw_write16(padapter, REG_SIFS_CTX, 0x100a); 431 432 /* Set SIFS for OFDM */ 433 rtw_write16(padapter, REG_SIFS_TRX, 0x100a); 434 435 /* TXOP */ 436 rtw_write32(padapter, REG_EDCA_BE_PARAM, 0x005EA42B); 437 rtw_write32(padapter, REG_EDCA_BK_PARAM, 0x0000A44F); 438 rtw_write32(padapter, REG_EDCA_VI_PARAM, 0x005EA324); 439 rtw_write32(padapter, REG_EDCA_VO_PARAM, 0x002FA226); 440} 441 442static void _InitRetryFunction(struct adapter *padapter) 443{ 444 u8 value8; 445 446 value8 = rtw_read8(padapter, REG_FWHW_TXQ_CTRL); 447 value8 |= EN_AMPDU_RTY_NEW; 448 rtw_write8(padapter, REG_FWHW_TXQ_CTRL, value8); 449 450 /* Set ACK timeout */ 451 rtw_write8(padapter, REG_ACKTO, 0x40); 452} 453 454static void HalRxAggr8723BSdio(struct adapter *padapter) 455{ 456 u8 valueDMATimeout; 457 u8 valueDMAPageCount; 458 459 valueDMATimeout = 0x06; 460 valueDMAPageCount = 0x06; 461 462 rtw_write8(padapter, REG_RXDMA_AGG_PG_TH + 1, valueDMATimeout); 463 rtw_write8(padapter, REG_RXDMA_AGG_PG_TH, valueDMAPageCount); 464} 465 466static void sdio_AggSettingRxUpdate(struct adapter *padapter) 467{ 468 u8 valueDMA; 469 u8 valueRxAggCtrl = 0; 470 u8 aggBurstNum = 3; /* 0:1, 1:2, 2:3, 3:4 */ 471 u8 aggBurstSize = 0; /* 0:1K, 1:512Byte, 2:256Byte... */ 472 473 valueDMA = rtw_read8(padapter, REG_TRXDMA_CTRL); 474 valueDMA |= RXDMA_AGG_EN; 475 rtw_write8(padapter, REG_TRXDMA_CTRL, valueDMA); 476 477 valueRxAggCtrl |= RXDMA_AGG_MODE_EN; 478 valueRxAggCtrl |= ((aggBurstNum << 2) & 0x0C); 479 valueRxAggCtrl |= ((aggBurstSize << 4) & 0x30); 480 rtw_write8(padapter, REG_RXDMA_MODE_CTRL_8723B, valueRxAggCtrl);/* RxAggLowThresh = 4*1K */ 481} 482 483static void _initSdioAggregationSetting(struct adapter *padapter) 484{ 485 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 486 487 /* Tx aggregation setting */ 488/* sdio_AggSettingTxUpdate(padapter); */ 489 490 /* Rx aggregation setting */ 491 HalRxAggr8723BSdio(padapter); 492 493 sdio_AggSettingRxUpdate(padapter); 494 495 /* 201/12/10 MH Add for USB agg mode dynamic switch. */ 496 pHalData->UsbRxHighSpeedMode = false; 497} 498 499static void _InitOperationMode(struct adapter *padapter) 500{ 501 struct mlme_ext_priv *pmlmeext; 502 u8 regBwOpMode = 0; 503 504 pmlmeext = &padapter->mlmeextpriv; 505 506 /* 1 This part need to modified according to the rate set we filtered!! */ 507 /* */ 508 /* Set RRSR, RATR, and REG_BWOPMODE registers */ 509 /* */ 510 switch (pmlmeext->cur_wireless_mode) { 511 case WIRELESS_MODE_B: 512 regBwOpMode = BW_OPMODE_20MHZ; 513 break; 514 case WIRELESS_MODE_G: 515 regBwOpMode = BW_OPMODE_20MHZ; 516 break; 517 case WIRELESS_MODE_AUTO: 518 regBwOpMode = BW_OPMODE_20MHZ; 519 break; 520 case WIRELESS_MODE_N_24G: 521 /* It support CCK rate by default. */ 522 /* CCK rate will be filtered out only when associated AP does not support it. */ 523 regBwOpMode = BW_OPMODE_20MHZ; 524 break; 525 526 default: /* for MacOSX compiler warning. */ 527 break; 528 } 529 530 rtw_write8(padapter, REG_BWOPMODE, regBwOpMode); 531 532} 533 534static void _InitInterrupt(struct adapter *padapter) 535{ 536 /* HISR - turn all off */ 537 rtw_write32(padapter, REG_HISR, 0); 538 539 /* HIMR - turn all off */ 540 rtw_write32(padapter, REG_HIMR, 0); 541 542 /* */ 543 /* Initialize and enable SDIO Host Interrupt. */ 544 /* */ 545 InitInterrupt8723BSdio(padapter); 546 547 /* */ 548 /* Initialize system Host Interrupt. */ 549 /* */ 550 InitSysInterrupt8723BSdio(padapter); 551} 552 553static void _InitRFType(struct adapter *padapter) 554{ 555 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 556 557 pHalData->rf_chip = RF_6052; 558} 559 560static void _RfPowerSave(struct adapter *padapter) 561{ 562/* YJ, TODO */ 563} 564 565/* */ 566/* 2010/08/09 MH Add for power down check. */ 567/* */ 568static bool HalDetectPwrDownMode(struct adapter *Adapter) 569{ 570 u8 tmpvalue; 571 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 572 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter); 573 574 575 EFUSE_ShadowRead(Adapter, 1, 0x7B/*EEPROM_RF_OPT3_92C*/, (u32 *)&tmpvalue); 576 577 /* 2010/08/25 MH INF priority > PDN Efuse value. */ 578 if (tmpvalue & BIT4 && pwrctrlpriv->reg_pdnmode) 579 pHalData->pwrdown = true; 580 else 581 pHalData->pwrdown = false; 582 583 return pHalData->pwrdown; 584} /* HalDetectPwrDownMode */ 585 586u32 rtl8723bs_hal_init(struct adapter *padapter) 587{ 588 s32 ret; 589 struct hal_com_data *pHalData; 590 struct pwrctrl_priv *pwrctrlpriv; 591 u32 NavUpper = WiFiNavUpperUs; 592 u8 u1bTmp; 593 594 pHalData = GET_HAL_DATA(padapter); 595 pwrctrlpriv = adapter_to_pwrctl(padapter); 596 597 if ( 598 adapter_to_pwrctl(padapter)->bips_processing == true && 599 adapter_to_pwrctl(padapter)->pre_ips_type == 0 600 ) { 601 unsigned long start_time; 602 u8 cpwm_orig, cpwm_now; 603 u8 val8, bMacPwrCtrlOn = true; 604 605 /* for polling cpwm */ 606 cpwm_orig = 0; 607 rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_orig); 608 609 /* ser rpwm */ 610 val8 = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1); 611 val8 &= 0x80; 612 val8 += 0x80; 613 val8 |= BIT(6); 614 rtw_write8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1, val8); 615 adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80; 616 617 /* do polling cpwm */ 618 start_time = jiffies; 619 do { 620 621 mdelay(1); 622 623 rtw_hal_get_hwreg(padapter, HW_VAR_CPWM, &cpwm_now); 624 if ((cpwm_orig ^ cpwm_now) & 0x80) 625 break; 626 627 if (jiffies_to_msecs(jiffies - start_time) > 100) 628 break; 629 630 } while (1); 631 632 rtl8723b_set_FwPwrModeInIPS_cmd(padapter, 0); 633 634 rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); 635 636 hal_btcoex_InitHwConfig(padapter, false); 637 638 return _SUCCESS; 639 } 640 641 /* Disable Interrupt first. */ 642/* rtw_hal_disable_interrupt(padapter); */ 643 644 ret = _InitPowerOn_8723BS(padapter); 645 if (ret == _FAIL) 646 return _FAIL; 647 648 rtw_write8(padapter, REG_EARLY_MODE_CONTROL, 0); 649 650 ret = rtl8723b_FirmwareDownload(padapter, false); 651 if (ret != _SUCCESS) { 652 padapter->bFWReady = false; 653 pHalData->fw_ractrl = false; 654 return ret; 655 } else { 656 padapter->bFWReady = true; 657 pHalData->fw_ractrl = true; 658 } 659 660 rtl8723b_InitializeFirmwareVars(padapter); 661 662/* SIC_Init(padapter); */ 663 664 if (pwrctrlpriv->reg_rfoff) 665 pwrctrlpriv->rf_pwrstate = rf_off; 666 667 /* 2010/08/09 MH We need to check if we need to turnon or off RF after detecting */ 668 /* HW GPIO pin. Before PHY_RFConfig8192C. */ 669 HalDetectPwrDownMode(padapter); 670 671 /* Set RF type for BB/RF configuration */ 672 _InitRFType(padapter); 673 674 /* Save target channel */ 675 /* <Roger_Notes> Current Channel will be updated again later. */ 676 pHalData->CurrentChannel = 6; 677 678 ret = PHY_MACConfig8723B(padapter); 679 if (ret != _SUCCESS) 680 return ret; 681 /* */ 682 /* d. Initialize BB related configurations. */ 683 /* */ 684 ret = PHY_BBConfig8723B(padapter); 685 if (ret != _SUCCESS) 686 return ret; 687 688 /* If RF is on, we need to init RF. Otherwise, skip the procedure. */ 689 /* We need to follow SU method to change the RF cfg.txt. Default disable RF TX/RX mode. */ 690 /* if (pHalData->eRFPowerState == eRfOn) */ 691 { 692 ret = PHY_RFConfig8723B(padapter); 693 if (ret != _SUCCESS) 694 return ret; 695 } 696 697 /* */ 698 /* Joseph Note: Keep RfRegChnlVal for later use. */ 699 /* */ 700 pHalData->RfRegChnlVal[0] = 701 PHY_QueryRFReg(padapter, (enum rf_path)0, RF_CHNLBW, bRFRegOffsetMask); 702 pHalData->RfRegChnlVal[1] = 703 PHY_QueryRFReg(padapter, (enum rf_path)1, RF_CHNLBW, bRFRegOffsetMask); 704 705 706 /* if (!pHalData->bMACFuncEnable) { */ 707 _InitQueueReservedPage(padapter); 708 _InitTxBufferBoundary(padapter); 709 710 /* init LLT after tx buffer boundary is defined */ 711 ret = rtl8723b_InitLLTTable(padapter); 712 if (ret != _SUCCESS) 713 return _FAIL; 714 715 /* */ 716 _InitQueuePriority(padapter); 717 _InitPageBoundary(padapter); 718 _InitTransferPageSize(padapter); 719 720 /* Get Rx PHY status in order to report RSSI and others. */ 721 _InitDriverInfoSize(padapter, DRVINFO_SZ); 722 hal_init_macaddr(padapter); 723 _InitNetworkType(padapter); 724 _InitWMACSetting(padapter); 725 _InitAdaptiveCtrl(padapter); 726 _InitEDCA(padapter); 727 _InitRetryFunction(padapter); 728 _initSdioAggregationSetting(padapter); 729 _InitOperationMode(padapter); 730 rtl8723b_InitBeaconParameters(padapter); 731 _InitInterrupt(padapter); 732 _InitBurstPktLen_8723BS(padapter); 733 734 /* YJ, TODO */ 735 rtw_write8(padapter, REG_SECONDARY_CCA_CTRL_8723B, 0x3); /* CCA */ 736 rtw_write8(padapter, 0x976, 0); /* hpfan_todo: 2nd CCA related */ 737 738 rtw_write16(padapter, REG_PKT_VO_VI_LIFE_TIME, 0x0400); /* unit: 256us. 256ms */ 739 rtw_write16(padapter, REG_PKT_BE_BK_LIFE_TIME, 0x0400); /* unit: 256us. 256ms */ 740 741 invalidate_cam_all(padapter); 742 743 rtw_hal_set_chnl_bw(padapter, padapter->registrypriv.channel, 744 CHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HAL_PRIME_CHNL_OFFSET_DONT_CARE); 745 746 /* Record original value for template. This is arough data, we can only use the data */ 747 /* for power adjust. The value can not be adjustde according to different power!!! */ 748/* pHalData->OriginalCckTxPwrIdx = pHalData->CurrentCckTxPwrIdx; */ 749/* pHalData->OriginalOfdm24GTxPwrIdx = pHalData->CurrentOfdm24GTxPwrIdx; */ 750 751 rtl8723b_InitAntenna_Selection(padapter); 752 753 /* */ 754 /* Disable BAR, suggested by Scott */ 755 /* 2010.04.09 add by hpfan */ 756 /* */ 757 rtw_write32(padapter, REG_BAR_MODE_CTRL, 0x0201ffff); 758 759 /* HW SEQ CTRL */ 760 /* set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. */ 761 rtw_write8(padapter, REG_HWSEQ_CTRL, 0xFF); 762 763 764 /* */ 765 /* Configure SDIO TxRx Control to enable Rx DMA timer masking. */ 766 /* 2010.02.24. */ 767 /* */ 768 rtw_write32(padapter, SDIO_LOCAL_BASE | SDIO_REG_TX_CTRL, 0); 769 770 _RfPowerSave(padapter); 771 772 773 rtl8723b_InitHalDm(padapter); 774 775 /* */ 776 /* Update current Tx FIFO page status. */ 777 /* */ 778 HalQueryTxBufferStatus8723BSdio(padapter); 779 HalQueryTxOQTBufferStatus8723BSdio(padapter); 780 pHalData->SdioTxOQTMaxFreeSpace = pHalData->SdioTxOQTFreeSpace; 781 782 /* Enable MACTXEN/MACRXEN block */ 783 u1bTmp = rtw_read8(padapter, REG_CR); 784 u1bTmp |= (MACTXEN | MACRXEN); 785 rtw_write8(padapter, REG_CR, u1bTmp); 786 787 rtw_hal_set_hwreg(padapter, HW_VAR_NAV_UPPER, (u8 *)&NavUpper); 788 789 /* ack for xmit mgmt frames. */ 790 rtw_write32(padapter, REG_FWHW_TXQ_CTRL, rtw_read32(padapter, REG_FWHW_TXQ_CTRL) | BIT(12)); 791 792/* pHalData->PreRpwmVal = SdioLocalCmd52Read1Byte(padapter, SDIO_REG_HRPWM1) & 0x80; */ 793 794 { 795 pwrctrlpriv->rf_pwrstate = rf_on; 796 797 if (pwrctrlpriv->rf_pwrstate == rf_on) { 798 struct pwrctrl_priv *pwrpriv; 799 unsigned long start_time; 800 u8 restore_iqk_rst; 801 u8 b2Ant; 802 u8 h2cCmdBuf; 803 804 pwrpriv = adapter_to_pwrctl(padapter); 805 806 PHY_LCCalibrate_8723B(&pHalData->odmpriv); 807 808 /* Inform WiFi FW that it is the beginning of IQK */ 809 h2cCmdBuf = 1; 810 FillH2CCmd8723B(padapter, H2C_8723B_BT_WLAN_CALIBRATION, 1, &h2cCmdBuf); 811 812 start_time = jiffies; 813 do { 814 if (rtw_read8(padapter, 0x1e7) & 0x01) 815 break; 816 817 msleep(50); 818 } while (jiffies_to_msecs(jiffies - start_time) <= 400); 819 820 hal_btcoex_IQKNotify(padapter, true); 821 822 restore_iqk_rst = pwrpriv->bips_processing; 823 b2Ant = pHalData->EEPROMBluetoothAntNum == Ant_x2; 824 PHY_IQCalibrate_8723B(padapter, false, restore_iqk_rst, b2Ant, pHalData->ant_path); 825 pHalData->odmpriv.RFCalibrateInfo.bIQKInitialized = true; 826 827 hal_btcoex_IQKNotify(padapter, false); 828 829 /* Inform WiFi FW that it is the finish of IQK */ 830 h2cCmdBuf = 0; 831 FillH2CCmd8723B(padapter, H2C_8723B_BT_WLAN_CALIBRATION, 1, &h2cCmdBuf); 832 833 ODM_TXPowerTrackingCheck(&pHalData->odmpriv); 834 } 835 } 836 837 /* Init BT hw config. */ 838 hal_btcoex_InitHwConfig(padapter, false); 839 840 return _SUCCESS; 841} 842 843/* */ 844/* Description: */ 845/* RTL8723e card disable power sequence v003 which suggested by Scott. */ 846/* */ 847/* First created by tynli. 2011.01.28. */ 848/* */ 849static void CardDisableRTL8723BSdio(struct adapter *padapter) 850{ 851 u8 u1bTmp; 852 u8 bMacPwrCtrlOn; 853 854 /* Run LPS WL RFOFF flow */ 855 HalPwrSeqCmdParsing(padapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, rtl8723B_enter_lps_flow); 856 857 /* ==== Reset digital sequence ====== */ 858 859 u1bTmp = rtw_read8(padapter, REG_MCUFWDL); 860 if ((u1bTmp & RAM_DL_SEL) && padapter->bFWReady) /* 8051 RAM code */ 861 rtl8723b_FirmwareSelfReset(padapter); 862 863 /* Reset MCU 0x2[10]= 0. Suggested by Filen. 2011.01.26. by tynli. */ 864 u1bTmp = rtw_read8(padapter, REG_SYS_FUNC_EN + 1); 865 u1bTmp &= ~BIT(2); /* 0x2[10], FEN_CPUEN */ 866 rtw_write8(padapter, REG_SYS_FUNC_EN + 1, u1bTmp); 867 868 /* MCUFWDL 0x80[1:0]= 0 */ 869 /* reset MCU ready status */ 870 rtw_write8(padapter, REG_MCUFWDL, 0); 871 872 /* Reset MCU IO Wrapper, added by Roger, 2011.08.30 */ 873 u1bTmp = rtw_read8(padapter, REG_RSV_CTRL + 1); 874 u1bTmp &= ~BIT(0); 875 rtw_write8(padapter, REG_RSV_CTRL + 1, u1bTmp); 876 u1bTmp = rtw_read8(padapter, REG_RSV_CTRL + 1); 877 u1bTmp |= BIT(0); 878 rtw_write8(padapter, REG_RSV_CTRL+1, u1bTmp); 879 880 /* ==== Reset digital sequence end ====== */ 881 882 bMacPwrCtrlOn = false; /* Disable CMD53 R/W */ 883 rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &bMacPwrCtrlOn); 884 HalPwrSeqCmdParsing(padapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, rtl8723B_card_disable_flow); 885} 886 887u32 rtl8723bs_hal_deinit(struct adapter *padapter) 888{ 889 struct dvobj_priv *psdpriv = padapter->dvobj; 890 struct debug_priv *pdbgpriv = &psdpriv->drv_dbg; 891 892 if (padapter->hw_init_completed) { 893 if (adapter_to_pwrctl(padapter)->bips_processing) { 894 if (padapter->netif_up) { 895 int cnt = 0; 896 u8 val8 = 0; 897 898 rtl8723b_set_FwPwrModeInIPS_cmd(padapter, 0x3); 899 /* poll 0x1cc to make sure H2C command already finished by FW; MAC_0x1cc = 0 means H2C done by FW. */ 900 do { 901 val8 = rtw_read8(padapter, REG_HMETFR); 902 cnt++; 903 mdelay(10); 904 } while (cnt < 100 && (val8 != 0)); 905 /* H2C done, enter 32k */ 906 if (val8 == 0) { 907 /* ser rpwm to enter 32k */ 908 val8 = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1); 909 val8 += 0x80; 910 val8 |= BIT(0); 911 rtw_write8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1, val8); 912 adapter_to_pwrctl(padapter)->tog = (val8 + 0x80) & 0x80; 913 cnt = val8 = 0; 914 do { 915 val8 = rtw_read8(padapter, REG_CR); 916 cnt++; 917 mdelay(10); 918 } while (cnt < 100 && (val8 != 0xEA)); 919 } 920 921 adapter_to_pwrctl(padapter)->pre_ips_type = 0; 922 923 } else { 924 pdbgpriv->dbg_carddisable_cnt++; 925 CardDisableRTL8723BSdio(padapter); 926 927 adapter_to_pwrctl(padapter)->pre_ips_type = 1; 928 } 929 930 } else { 931 pdbgpriv->dbg_carddisable_cnt++; 932 CardDisableRTL8723BSdio(padapter); 933 } 934 } else 935 pdbgpriv->dbg_deinit_fail_cnt++; 936 937 return _SUCCESS; 938} 939 940void rtl8723bs_init_default_value(struct adapter *padapter) 941{ 942 struct hal_com_data *pHalData; 943 944 945 pHalData = GET_HAL_DATA(padapter); 946 947 rtl8723b_init_default_value(padapter); 948 949 /* interface related variable */ 950 pHalData->SdioRxFIFOCnt = 0; 951} 952 953void rtl8723bs_interface_configure(struct adapter *padapter) 954{ 955 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 956 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter); 957 struct registry_priv *pregistrypriv = &padapter->registrypriv; 958 bool bWiFiConfig = pregistrypriv->wifi_spec; 959 960 961 pdvobjpriv->RtOutPipe[0] = WLAN_TX_HIQ_DEVICE_ID; 962 pdvobjpriv->RtOutPipe[1] = WLAN_TX_MIQ_DEVICE_ID; 963 pdvobjpriv->RtOutPipe[2] = WLAN_TX_LOQ_DEVICE_ID; 964 965 if (bWiFiConfig) 966 pHalData->OutEpNumber = 2; 967 else 968 pHalData->OutEpNumber = SDIO_MAX_TX_QUEUE; 969 970 switch (pHalData->OutEpNumber) { 971 case 3: 972 pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_LQ | TX_SELE_NQ; 973 break; 974 case 2: 975 pHalData->OutEpQueueSel = TX_SELE_HQ | TX_SELE_NQ; 976 break; 977 case 1: 978 pHalData->OutEpQueueSel = TX_SELE_HQ; 979 break; 980 default: 981 break; 982 } 983 984 Hal_MappingOutPipe(padapter, pHalData->OutEpNumber); 985} 986 987/* */ 988/* Description: */ 989/* We should set Efuse cell selection to WiFi cell in default. */ 990/* */ 991/* Assumption: */ 992/* PASSIVE_LEVEL */ 993/* */ 994/* Added by Roger, 2010.11.23. */ 995/* */ 996static void _EfuseCellSel(struct adapter *padapter) 997{ 998 u32 value32; 999 1000 value32 = rtw_read32(padapter, EFUSE_TEST); 1001 value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0); 1002 rtw_write32(padapter, EFUSE_TEST, value32); 1003} 1004 1005static void _ReadRFType(struct adapter *Adapter) 1006{ 1007 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 1008 1009 pHalData->rf_chip = RF_6052; 1010} 1011 1012 1013static void Hal_EfuseParseMACAddr_8723BS( 1014 struct adapter *padapter, u8 *hwinfo, bool AutoLoadFail 1015) 1016{ 1017 struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); 1018 1019 if (AutoLoadFail) { 1020 eth_random_addr(pEEPROM->mac_addr); 1021 } else { 1022 /* Read Permanent MAC address */ 1023 memcpy(pEEPROM->mac_addr, &hwinfo[EEPROM_MAC_ADDR_8723BS], ETH_ALEN); 1024 } 1025} 1026 1027static void Hal_EfuseParseBoardType_8723BS( 1028 struct adapter *padapter, u8 *hwinfo, bool AutoLoadFail 1029) 1030{ 1031 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 1032 1033 if (!AutoLoadFail) { 1034 pHalData->BoardType = (hwinfo[EEPROM_RF_BOARD_OPTION_8723B] & 0xE0) >> 5; 1035 if (pHalData->BoardType == 0xFF) 1036 pHalData->BoardType = (EEPROM_DEFAULT_BOARD_OPTION & 0xE0) >> 5; 1037 } else 1038 pHalData->BoardType = 0; 1039} 1040 1041static void _ReadEfuseInfo8723BS(struct adapter *padapter) 1042{ 1043 struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); 1044 u8 *hwinfo = NULL; 1045 1046 /* */ 1047 /* This part read and parse the eeprom/efuse content */ 1048 /* */ 1049 1050 hwinfo = pEEPROM->efuse_eeprom_data; 1051 1052 Hal_InitPGData(padapter, hwinfo); 1053 1054 Hal_EfuseParseIDCode(padapter, hwinfo); 1055 Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1056 1057 Hal_EfuseParseMACAddr_8723BS(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1058 1059 Hal_EfuseParseTxPowerInfo_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1060 Hal_EfuseParseBoardType_8723BS(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1061 1062 /* */ 1063 /* Read Bluetooth co-exist and initialize */ 1064 /* */ 1065 Hal_EfuseParsePackageType_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1066 Hal_EfuseParseBTCoexistInfo_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1067 Hal_EfuseParseChnlPlan_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1068 Hal_EfuseParseXtal_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1069 Hal_EfuseParseThermalMeter_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1070 Hal_EfuseParseCustomerID_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1071 1072 Hal_EfuseParseVoltage_8723B(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1073 1074 Hal_ReadRFGainOffset(padapter, hwinfo, pEEPROM->bautoload_fail_flag); 1075} 1076 1077static void _ReadPROMContent(struct adapter *padapter) 1078{ 1079 struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter); 1080 u8 eeValue; 1081 1082 eeValue = rtw_read8(padapter, REG_9346CR); 1083 /* To check system boot selection. */ 1084 pEEPROM->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? true : false; 1085 pEEPROM->bautoload_fail_flag = (eeValue & EEPROM_EN) ? false : true; 1086 1087/* pHalData->EEType = IS_BOOT_FROM_EEPROM(Adapter) ? EEPROM_93C46 : EEPROM_BOOT_EFUSE; */ 1088 1089 _ReadEfuseInfo8723BS(padapter); 1090} 1091 1092/* */ 1093/* Description: */ 1094/* Read HW adapter information by E-Fuse or EEPROM according CR9346 reported. */ 1095/* */ 1096/* Assumption: */ 1097/* PASSIVE_LEVEL (SDIO interface) */ 1098/* */ 1099/* */ 1100static s32 _ReadAdapterInfo8723BS(struct adapter *padapter) 1101{ 1102 u8 val8; 1103 1104 /* before access eFuse, make sure card enable has been called */ 1105 if (!padapter->hw_init_completed) 1106 _InitPowerOn_8723BS(padapter); 1107 1108 1109 val8 = rtw_read8(padapter, 0x4e); 1110 val8 |= BIT(6); 1111 rtw_write8(padapter, 0x4e, val8); 1112 1113 _EfuseCellSel(padapter); 1114 _ReadRFType(padapter); 1115 _ReadPROMContent(padapter); 1116 1117 if (!padapter->hw_init_completed) { 1118 rtw_write8(padapter, 0x67, 0x00); /* for BT, Switch Ant control to BT */ 1119 CardDisableRTL8723BSdio(padapter);/* for the power consumption issue, wifi ko module is loaded during booting, but wifi GUI is off */ 1120 } 1121 1122 return _SUCCESS; 1123} 1124 1125void ReadAdapterInfo8723BS(struct adapter *padapter) 1126{ 1127 /* Read EEPROM size before call any EEPROM function */ 1128 padapter->EepromAddressSize = GetEEPROMSize8723B(padapter); 1129 1130 _ReadAdapterInfo8723BS(padapter); 1131} 1132 1133/* 1134 * If variable not handled here, 1135 * some variables will be processed in SetHwReg8723B() 1136 */ 1137void SetHwReg8723BS(struct adapter *padapter, u8 variable, u8 *val) 1138{ 1139 u8 val8; 1140 1141 switch (variable) { 1142 case HW_VAR_SET_RPWM: 1143 /* rpwm value only use BIT0(clock bit) , BIT6(Ack bit), and BIT7(Toggle bit) */ 1144 /* BIT0 value - 1: 32k, 0:40MHz. */ 1145 /* BIT6 value - 1: report cpwm value after success set, 0:do not report. */ 1146 /* BIT7 value - Toggle bit change. */ 1147 { 1148 val8 = *val; 1149 val8 &= 0xC1; 1150 rtw_write8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HRPWM1, val8); 1151 } 1152 break; 1153 case HW_VAR_SET_REQ_FW_PS: 1154 { 1155 u8 req_fw_ps = 0; 1156 req_fw_ps = rtw_read8(padapter, 0x8f); 1157 req_fw_ps |= 0x10; 1158 rtw_write8(padapter, 0x8f, req_fw_ps); 1159 } 1160 break; 1161 case HW_VAR_RXDMA_AGG_PG_TH: 1162 val8 = *val; 1163 break; 1164 1165 case HW_VAR_DM_IN_LPS: 1166 rtl8723b_hal_dm_in_lps(padapter); 1167 break; 1168 default: 1169 SetHwReg8723B(padapter, variable, val); 1170 break; 1171 } 1172} 1173 1174/* 1175 * If variable not handled here, 1176 * some variables will be processed in GetHwReg8723B() 1177 */ 1178void GetHwReg8723BS(struct adapter *padapter, u8 variable, u8 *val) 1179{ 1180 switch (variable) { 1181 case HW_VAR_CPWM: 1182 *val = rtw_read8(padapter, SDIO_LOCAL_BASE | SDIO_REG_HCPWM1_8723B); 1183 break; 1184 1185 case HW_VAR_FW_PS_STATE: 1186 { 1187 /* 3. read dword 0x88 driver read fw ps state */ 1188 *((u16 *)val) = rtw_read16(padapter, 0x88); 1189 } 1190 break; 1191 default: 1192 GetHwReg8723B(padapter, variable, val); 1193 break; 1194 } 1195} 1196 1197void SetHwRegWithBuf8723B(struct adapter *padapter, u8 variable, u8 *pbuf, int len) 1198{ 1199 switch (variable) { 1200 case HW_VAR_C2H_HANDLE: 1201 C2HPacketHandler_8723B(padapter, pbuf, len); 1202 break; 1203 default: 1204 break; 1205 } 1206} 1207 1208/* */ 1209/* Description: */ 1210/* Query setting of specified variable. */ 1211/* */ 1212u8 GetHalDefVar8723BSDIO( 1213 struct adapter *Adapter, enum hal_def_variable eVariable, void *pValue 1214) 1215{ 1216 u8 bResult = _SUCCESS; 1217 1218 switch (eVariable) { 1219 case HAL_DEF_IS_SUPPORT_ANT_DIV: 1220 break; 1221 case HAL_DEF_CURRENT_ANTENNA: 1222 break; 1223 case HW_VAR_MAX_RX_AMPDU_FACTOR: 1224 /* Stanley@BB.SD3 suggests 16K can get stable performance */ 1225 /* coding by Lucas@20130730 */ 1226 *(u32 *)pValue = IEEE80211_HT_MAX_AMPDU_16K; 1227 break; 1228 default: 1229 bResult = GetHalDefVar8723B(Adapter, eVariable, pValue); 1230 break; 1231 } 1232 1233 return bResult; 1234}
~/
Read-only file preview.