1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
14 ******************************************************************************/
15 #define _HCI_HAL_INIT_C_
17 #include <osdep_service.h>
18 #include <drv_types.h>
19 #include <rtw_efuse.h>
21 #include <HalPwrSeqCmd.h>
22 #include <Hal8723PwrSeq.h>
23 #include <rtl8723a_hal.h>
24 #include <linux/ieee80211.h>
29 _ConfigChipOutEP(struct rtw_adapter *pAdapter, u8 NumOutPipe)
32 struct hal_data_8723a *pHalData = GET_HAL_DATA(pAdapter);
34 pHalData->OutEpQueueSel = 0;
35 pHalData->OutEpNumber = 0;
37 /* Normal and High queue */
38 value8 = rtl8723au_read8(pAdapter, (REG_NORMAL_SIE_EP + 1));
40 if (value8 & USB_NORMAL_SIE_EP_MASK) {
41 pHalData->OutEpQueueSel |= TX_SELE_HQ;
42 pHalData->OutEpNumber++;
45 if ((value8 >> USB_NORMAL_SIE_EP_SHIFT) & USB_NORMAL_SIE_EP_MASK) {
46 pHalData->OutEpQueueSel |= TX_SELE_NQ;
47 pHalData->OutEpNumber++;
51 value8 = rtl8723au_read8(pAdapter, (REG_NORMAL_SIE_EP + 2));
52 if (value8 & USB_NORMAL_SIE_EP_MASK) {
53 pHalData->OutEpQueueSel |= TX_SELE_LQ;
54 pHalData->OutEpNumber++;
57 /* TODO: Error recovery for this case */
58 /* RT_ASSERT((NumOutPipe == pHalData->OutEpNumber),
59 ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n",
60 (u32)NumOutPipe, (u32)pHalData->OutEpNumber)); */
63 bool rtl8723au_chip_configure(struct rtw_adapter *padapter)
65 struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
66 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
67 u8 NumInPipe = pdvobjpriv->RtNumInPipes;
68 u8 NumOutPipe = pdvobjpriv->RtNumOutPipes;
70 _ConfigChipOutEP(padapter, NumOutPipe);
72 /* Normal chip with one IN and one OUT doesn't have interrupt IN EP. */
73 if (pHalData->OutEpNumber == 1) {
78 return Hal_MappingOutPipe23a(padapter, NumOutPipe);
81 static int _InitPowerOn(struct rtw_adapter *padapter)
86 /* RSV_CTRL 0x1C[7:0] = 0x00
87 unlock ISO/CLK/Power control register */
88 rtl8723au_write8(padapter, REG_RSV_CTRL, 0x0);
90 /* HW Power on sequence */
91 if (!HalPwrSeqCmdParsing23a(padapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
92 PWR_INTF_USB_MSK, rtl8723AU_card_enable_flow))
95 /* 0x04[19] = 1, suggest by Jackie 2011.05.09, reset 8051 */
96 value8 = rtl8723au_read8(padapter, REG_APS_FSMCO+2);
97 rtl8723au_write8(padapter, REG_APS_FSMCO + 2, value8 | BIT(3));
99 /* Enable MAC DMA/WMAC/SCHEDULE/SEC block */
100 /* Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy.
101 Added by tynli. 2011.08.31. */
102 value16 = rtl8723au_read16(padapter, REG_CR);
103 value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN |
104 PROTOCOL_EN | SCHEDULE_EN | MACTXEN | MACRXEN |
106 rtl8723au_write16(padapter, REG_CR, value16);
108 /* for Efuse PG, suggest by Jackie 2011.11.23 */
109 PHY_SetBBReg(padapter, REG_EFUSE_CTRL, BIT(28)|BIT(29)|BIT(30), 0x06);
114 /* Shall USB interface init this? */
115 static void _InitInterrupt(struct rtw_adapter *Adapter)
119 /* HISR - turn all on */
120 value32 = 0xFFFFFFFF;
121 rtl8723au_write32(Adapter, REG_HISR, value32);
123 /* HIMR - turn all on */
124 rtl8723au_write32(Adapter, REG_HIMR, value32);
127 static void _InitQueueReservedPage(struct rtw_adapter *Adapter)
129 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
130 struct registry_priv *pregistrypriv = &Adapter->registrypriv;
137 bool bWiFiConfig = pregistrypriv->wifi_spec;
139 /* RT_ASSERT((outEPNum>= 2), ("for WMM , number of out-ep "
140 "must more than or equal to 2!\n")); */
142 numPubQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_PUBQ : NORMAL_PAGE_NUM_PUBQ;
144 if (pHalData->OutEpQueueSel & TX_SELE_HQ) {
145 numHQ = bWiFiConfig ?
146 WMM_NORMAL_PAGE_NUM_HPQ : NORMAL_PAGE_NUM_HPQ;
149 if (pHalData->OutEpQueueSel & TX_SELE_LQ) {
150 numLQ = bWiFiConfig ?
151 WMM_NORMAL_PAGE_NUM_LPQ : NORMAL_PAGE_NUM_LPQ;
153 /* NOTE: This step shall be proceed before
154 writting REG_RQPN. */
155 if (pHalData->OutEpQueueSel & TX_SELE_NQ) {
156 numNQ = bWiFiConfig ?
157 WMM_NORMAL_PAGE_NUM_NPQ : NORMAL_PAGE_NUM_NPQ;
159 value8 = (u8)_NPQ(numNQ);
160 rtl8723au_write8(Adapter, REG_RQPN_NPQ, value8);
163 value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN;
164 rtl8723au_write32(Adapter, REG_RQPN, value32);
167 static void _InitTxBufferBoundary(struct rtw_adapter *Adapter)
169 struct registry_priv *pregistrypriv = &Adapter->registrypriv;
173 if (!pregistrypriv->wifi_spec)
174 txpktbuf_bndy = TX_PAGE_BOUNDARY;
176 txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY;
178 rtl8723au_write8(Adapter, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
179 rtl8723au_write8(Adapter, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
180 rtl8723au_write8(Adapter, REG_TXPKTBUF_WMAC_LBK_BF_HD, txpktbuf_bndy);
181 rtl8723au_write8(Adapter, REG_TRXFF_BNDY, txpktbuf_bndy);
182 rtl8723au_write8(Adapter, REG_TDECTRL+1, txpktbuf_bndy);
185 static void _InitPageBoundary(struct rtw_adapter *Adapter)
187 /* RX Page Boundary */
188 /* srand(static_cast<unsigned int>(time(NULL))); */
189 u16 rxff_bndy = 0x27FF;/* rand() % 1) ? 0x27FF : 0x23FF; */
191 rtl8723au_write16(Adapter, (REG_TRXFF_BNDY + 2), rxff_bndy);
193 /* TODO: ?? shall we set tx boundary? */
197 _InitNormalChipRegPriority(struct rtw_adapter *Adapter, u16 beQ, u16 bkQ,
198 u16 viQ, u16 voQ, u16 mgtQ, u16 hiQ)
200 u16 value16 = rtl8723au_read16(Adapter, REG_TRXDMA_CTRL) & 0x7;
202 value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) |
203 _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) |
204 _TXDMA_MGQ_MAP(mgtQ) | _TXDMA_HIQ_MAP(hiQ);
206 rtl8723au_write16(Adapter, REG_TRXDMA_CTRL, value16);
209 static void _InitNormalChipOneOutEpPriority(struct rtw_adapter *Adapter)
211 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
214 switch (pHalData->OutEpQueueSel) {
222 value = QUEUE_NORMAL;
225 /* RT_ASSERT(false, ("Shall not reach here!\n")); */
229 _InitNormalChipRegPriority(Adapter, value, value, value,
230 value, value, value);
233 static void _InitNormalChipTwoOutEpPriority(struct rtw_adapter *Adapter)
235 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
236 struct registry_priv *pregistrypriv = &Adapter->registrypriv;
237 u16 beQ, bkQ, viQ, voQ, mgtQ, hiQ;
241 switch (pHalData->OutEpQueueSel) {
242 case (TX_SELE_HQ | TX_SELE_LQ):
243 valueHi = QUEUE_HIGH;
244 valueLow = QUEUE_LOW;
246 case (TX_SELE_NQ | TX_SELE_LQ):
247 valueHi = QUEUE_NORMAL;
248 valueLow = QUEUE_LOW;
250 case (TX_SELE_HQ | TX_SELE_NQ):
251 valueHi = QUEUE_HIGH;
252 valueLow = QUEUE_NORMAL;
255 /* RT_ASSERT(false, ("Shall not reach here!\n")); */
259 if (!pregistrypriv->wifi_spec) {
266 } else {/* for WMM , CONFIG_OUT_EP_WIFI_MODE */
275 _InitNormalChipRegPriority(Adapter, beQ, bkQ, viQ, voQ, mgtQ, hiQ);
278 static void _InitNormalChipThreeOutEpPriority(struct rtw_adapter *Adapter)
280 struct registry_priv *pregistrypriv = &Adapter->registrypriv;
281 u16 beQ, bkQ, viQ, voQ, mgtQ, hiQ;
283 if (!pregistrypriv->wifi_spec) {/* typical setting */
290 } else {/* for WMM */
298 _InitNormalChipRegPriority(Adapter, beQ, bkQ, viQ, voQ, mgtQ, hiQ);
301 static void _InitNormalChipQueuePriority(struct rtw_adapter *Adapter)
303 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
305 switch (pHalData->OutEpNumber) {
307 _InitNormalChipOneOutEpPriority(Adapter);
310 _InitNormalChipTwoOutEpPriority(Adapter);
313 _InitNormalChipThreeOutEpPriority(Adapter);
316 /* RT_ASSERT(false, ("Shall not reach here!\n")); */
321 static void _InitQueuePriority(struct rtw_adapter *Adapter)
323 _InitNormalChipQueuePriority(Adapter);
326 static void _InitTransferPageSize(struct rtw_adapter *Adapter)
328 /* Tx page size is always 128. */
331 value8 = _PSRX(PBP_128) | _PSTX(PBP_128);
332 rtl8723au_write8(Adapter, REG_PBP, value8);
335 static void _InitDriverInfoSize(struct rtw_adapter *Adapter, u8 drvInfoSize)
337 rtl8723au_write8(Adapter, REG_RX_DRVINFO_SZ, drvInfoSize);
340 static void _InitWMACSetting(struct rtw_adapter *Adapter)
342 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
344 /* don't turn on AAP, it will allow all packets to driver */
345 pHalData->ReceiveConfig = RCR_APM | RCR_AM | RCR_AB | RCR_CBSSID_DATA |
346 RCR_CBSSID_BCN | RCR_APP_ICV | RCR_AMF |
347 RCR_HTC_LOC_CTRL | RCR_APP_MIC |
350 /* some REG_RCR will be modified later by
351 phy_ConfigMACWithHeaderFile() */
352 rtl8723au_write32(Adapter, REG_RCR, pHalData->ReceiveConfig);
354 /* Accept all multicast address */
355 rtl8723au_write32(Adapter, REG_MAR, 0xFFFFFFFF);
356 rtl8723au_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF);
358 /* Accept all data frames */
359 /* value16 = 0xFFFF; */
360 /* rtl8723au_write16(Adapter, REG_RXFLTMAP2, value16); */
362 /* 2010.09.08 hpfan */
363 /* Since ADF is removed from RCR, ps-poll will not be indicate
365 /* RxFilterMap should mask ps-poll to gurantee AP mode can
367 /* value16 = 0x400; */
368 /* rtl8723au_write16(Adapter, REG_RXFLTMAP1, value16); */
370 /* Accept all management frames */
371 /* value16 = 0xFFFF; */
372 /* rtl8723au_write16(Adapter, REG_RXFLTMAP0, value16); */
374 /* enable RX_SHIFT bits */
375 /* rtl8723au_write8(Adapter, REG_TRXDMA_CTRL, rtl8723au_read8(Adapter,
376 REG_TRXDMA_CTRL)|BIT(1)); */
379 static void _InitAdaptiveCtrl(struct rtw_adapter *Adapter)
384 /* Response Rate Set */
385 value32 = rtl8723au_read32(Adapter, REG_RRSR);
386 value32 &= ~RATE_BITMAP_ALL;
387 value32 |= RATE_RRSR_CCK_ONLY_1M;
388 rtl8723au_write32(Adapter, REG_RRSR, value32);
390 /* CF-END Threshold */
391 /* m_spIoBase->rtl8723au_write8(REG_CFEND_TH, 0x1); */
393 /* SIFS (used in NAV) */
394 value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10);
395 rtl8723au_write16(Adapter, REG_SPEC_SIFS, value16);
398 value16 = _LRL(0x30) | _SRL(0x30);
399 rtl8723au_write16(Adapter, REG_RL, value16);
402 static void _InitRateFallback(struct rtw_adapter *Adapter)
404 /* Set Data Auto Rate Fallback Retry Count register. */
405 rtl8723au_write32(Adapter, REG_DARFRC, 0x00000000);
406 rtl8723au_write32(Adapter, REG_DARFRC+4, 0x10080404);
407 rtl8723au_write32(Adapter, REG_RARFRC, 0x04030201);
408 rtl8723au_write32(Adapter, REG_RARFRC+4, 0x08070605);
411 static void _InitEDCA(struct rtw_adapter *Adapter)
413 /* Set Spec SIFS (used in NAV) */
414 rtl8723au_write16(Adapter, REG_SPEC_SIFS, 0x100a);
415 rtl8723au_write16(Adapter, REG_MAC_SPEC_SIFS, 0x100a);
417 /* Set SIFS for CCK */
418 rtl8723au_write16(Adapter, REG_SIFS_CTX, 0x100a);
420 /* Set SIFS for OFDM */
421 rtl8723au_write16(Adapter, REG_SIFS_TRX, 0x100a);
424 rtl8723au_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B);
425 rtl8723au_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F);
426 rtl8723au_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324);
427 rtl8723au_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226);
430 static void _InitHWLed(struct rtw_adapter *Adapter)
434 static void _InitRDGSetting(struct rtw_adapter *Adapter)
436 rtl8723au_write8(Adapter, REG_RD_CTRL, 0xFF);
437 rtl8723au_write16(Adapter, REG_RD_NAV_NXT, 0x200);
438 rtl8723au_write8(Adapter, REG_RD_RESP_PKT_TH, 0x05);
441 static void _InitRetryFunction(struct rtw_adapter *Adapter)
445 value8 = rtl8723au_read8(Adapter, REG_FWHW_TXQ_CTRL);
446 value8 |= EN_AMPDU_RTY_NEW;
447 rtl8723au_write8(Adapter, REG_FWHW_TXQ_CTRL, value8);
449 /* Set ACK timeout */
450 rtl8723au_write8(Adapter, REG_ACKTO, 0x40);
453 static void _InitRFType(struct rtw_adapter *Adapter)
455 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
456 bool is92CU = IS_92C_SERIAL(pHalData->VersionID);
458 pHalData->rf_chip = RF_6052;
461 pHalData->rf_type = RF_1T1R;
462 DBG_8723A("Set RF Chip ID to RF_6052 and RF type to 1T1R.\n");
466 /* TODO: Consider that EEPROM set 92CU to 1T1R later. */
467 /* Force to overwrite setting according to chip version. Ignore
469 /* pHalData->RF_Type = is92CU ? RF_2T2R : RF_1T1R; */
470 MSG_8723A("Set RF Chip ID to RF_6052 and RF type to %d.\n",
474 /* Set CCK and OFDM Block "ON" */
475 static void _BBTurnOnBlock(struct rtw_adapter *Adapter)
477 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1);
478 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1);
481 #define MgntActSet_RF_State(...)
482 static void _RfPowerSave(struct rtw_adapter *padapter)
491 enum rt_rf_power_state RfOnOffDetect23a(struct rtw_adapter *pAdapter)
493 /* struct hal_data_8723a *pHalData = GET_HAL_DATA(pAdapter); */
495 enum rt_rf_power_state rfpowerstate = rf_off;
497 rtl8723au_write8(pAdapter, REG_MAC_PINMUX_CFG,
498 rtl8723au_read8(pAdapter,
499 REG_MAC_PINMUX_CFG) & ~BIT(3));
500 val8 = rtl8723au_read8(pAdapter, REG_GPIO_IO_SEL);
501 DBG_8723A("GPIO_IN =%02x\n", val8);
502 rfpowerstate = (val8 & BIT(3)) ? rf_on : rf_off;
507 void _ps_open_RF23a(struct rtw_adapter *padapter);
509 int rtl8723au_hal_init(struct rtw_adapter *Adapter)
513 int status = _SUCCESS;
514 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
515 struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv;
516 struct registry_priv *pregistrypriv = &Adapter->registrypriv;
518 unsigned long init_start_time = jiffies;
520 Adapter->hw_init_completed = false;
522 if (Adapter->pwrctrlpriv.bkeepfwalive) {
523 _ps_open_RF23a(Adapter);
525 if (pHalData->bIQKInitialized) {
526 rtl8723a_phy_iq_calibrate(Adapter, true);
528 rtl8723a_phy_iq_calibrate(Adapter, false);
529 pHalData->bIQKInitialized = true;
531 rtl8723a_odm_check_tx_power_tracking(Adapter);
532 rtl8723a_phy_lc_calibrate(Adapter);
537 /* Check if MAC has already power on. by tynli. 2011.05.27. */
538 val8 = rtl8723au_read8(Adapter, REG_CR);
539 RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
540 ("%s: REG_CR 0x100 = 0x%02x\n", __func__, val8));
541 /* Fix 92DU-VC S3 hang with the reason is that secondary mac is not
543 /* 0x100 value of first mac is 0xEA while 0x100 value of secondary
546 pHalData->bMACFuncEnable = false;
548 pHalData->bMACFuncEnable = true;
549 RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
550 ("%s: MAC has already power on\n", __func__));
553 status = _InitPowerOn(Adapter);
554 if (status == _FAIL) {
555 RT_TRACE(_module_hci_hal_init_c_, _drv_err_,
556 ("Failed to init power on!\n"));
560 if (!pregistrypriv->wifi_spec) {
561 boundary = TX_PAGE_BOUNDARY;
564 boundary = WMM_NORMAL_TX_PAGE_BOUNDARY;
567 if (!pHalData->bMACFuncEnable) {
568 status = InitLLTTable23a(Adapter, boundary);
569 if (status == _FAIL) {
570 RT_TRACE(_module_hci_hal_init_c_, _drv_err_,
571 ("Failed to init LLT table\n"));
576 if (pHalData->bRDGEnable)
577 _InitRDGSetting(Adapter);
579 status = rtl8723a_FirmwareDownload(Adapter);
580 if (status != _SUCCESS) {
581 Adapter->bFWReady = false;
582 pHalData->fw_ractrl = false;
583 DBG_8723A("fw download fail!\n");
586 Adapter->bFWReady = true;
587 pHalData->fw_ractrl = true;
588 DBG_8723A("fw download ok!\n");
591 rtl8723a_InitializeFirmwareVars(Adapter);
593 if (pwrctrlpriv->reg_rfoff == true) {
594 pwrctrlpriv->rf_pwrstate = rf_off;
597 /* 2010/08/09 MH We need to check if we need to turnon or off RF after detecting */
598 /* HW GPIO pin. Before PHY_RFConfig8192C. */
599 /* HalDetectPwrDownMode(Adapter); */
600 /* 2010/08/26 MH If Efuse does not support sective suspend then disable the function. */
601 /* HalDetectSelectiveSuspendMode(Adapter); */
603 /* Set RF type for BB/RF configuration */
604 _InitRFType(Adapter);/* _ReadRFType() */
606 /* Save target channel */
607 /* <Roger_Notes> Current Channel will be updated again later. */
608 pHalData->CurrentChannel = 6;/* default set to 6 */
610 status = PHY_MACConfig8723A(Adapter);
611 if (status == _FAIL) {
612 DBG_8723A("PHY_MACConfig8723A fault !!\n");
617 /* d. Initialize BB related configurations. */
619 status = PHY_BBConfig8723A(Adapter);
620 if (status == _FAIL) {
621 DBG_8723A("PHY_BBConfig8723A fault !!\n");
625 /* Add for tx power by rate fine tune. We need to call the function after BB config. */
626 /* Because the tx power by rate table is inited in BB config. */
628 status = PHY_RF6052_Config8723A(Adapter);
629 if (status == _FAIL) {
630 DBG_8723A("PHY_RF6052_Config8723A failed!!\n");
634 /* reducing 80M spur */
635 PHY_SetBBReg(Adapter, RF_T_METER, bMaskDWord, 0x0381808d);
636 PHY_SetBBReg(Adapter, RF_SYN_G4, bMaskDWord, 0xf2ffff83);
637 PHY_SetBBReg(Adapter, RF_SYN_G4, bMaskDWord, 0xf2ffff82);
638 PHY_SetBBReg(Adapter, RF_SYN_G4, bMaskDWord, 0xf2ffff83);
641 PHY_SetBBReg(Adapter, rFPGA0_TxInfo, bMaskDWord, 0x00000003); /* 0x804[14]= 0 */
642 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFInterfaceSW, bMaskDWord, 0x07000760); /* 0x870[6:5]= b'11 */
643 PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, 0x66F60210); /* 0x860[6:5]= b'00 */
645 RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("%s: 0x870 = value 0x%x\n", __func__, PHY_QueryBBReg(Adapter, 0x870, bMaskDWord)));
648 /* Joseph Note: Keep RfRegChnlVal for later use. */
650 pHalData->RfRegChnlVal[0] = PHY_QueryRFReg(Adapter, (enum RF_RADIO_PATH)0, RF_CHNLBW, bRFRegOffsetMask);
651 pHalData->RfRegChnlVal[1] = PHY_QueryRFReg(Adapter, (enum RF_RADIO_PATH)1, RF_CHNLBW, bRFRegOffsetMask);
653 if (!pHalData->bMACFuncEnable) {
654 _InitQueueReservedPage(Adapter);
655 _InitTxBufferBoundary(Adapter);
657 _InitQueuePriority(Adapter);
658 _InitPageBoundary(Adapter);
659 _InitTransferPageSize(Adapter);
661 /* Get Rx PHY status in order to report RSSI and others. */
662 _InitDriverInfoSize(Adapter, DRVINFO_SZ);
664 _InitInterrupt(Adapter);
665 hw_var_set_macaddr(Adapter, Adapter->eeprompriv.mac_addr);
666 rtl8723a_set_media_status(Adapter, MSR_INFRA);
667 _InitWMACSetting(Adapter);
668 _InitAdaptiveCtrl(Adapter);
670 _InitRateFallback(Adapter);
671 _InitRetryFunction(Adapter);
672 rtl8723a_InitBeaconParameters(Adapter);
676 _BBTurnOnBlock(Adapter);
677 /* NicIFSetMacAddress(padapter, padapter->PermanentAddress); */
679 rtl8723a_cam_invalidate_all(Adapter);
681 /* 2010/12/17 MH We need to set TX power according to EFUSE content at first. */
682 PHY_SetTxPowerLevel8723A(Adapter, pHalData->CurrentChannel);
684 rtl8723a_InitAntenna_Selection(Adapter);
687 /* set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. */
688 rtl8723au_write8(Adapter, REG_HWSEQ_CTRL, 0xFF);
691 /* Disable BAR, suggested by Scott */
692 /* 2010.04.09 add by hpfan */
694 rtl8723au_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff);
696 if (pregistrypriv->wifi_spec)
697 rtl8723au_write16(Adapter, REG_FAST_EDCA_CTRL, 0);
699 /* Move by Neo for USB SS from above setp */
700 _RfPowerSave(Adapter);
702 /* 2010/08/26 MH Merge from 8192CE. */
703 /* sherry masked that it has been done in _RfPowerSave */
705 /* recovery for 8192cu and 9723Au 20111017 */
706 if (pwrctrlpriv->rf_pwrstate == rf_on) {
707 if (pHalData->bIQKInitialized) {
708 rtl8723a_phy_iq_calibrate(Adapter, true);
710 rtl8723a_phy_iq_calibrate(Adapter, false);
711 pHalData->bIQKInitialized = true;
714 rtl8723a_odm_check_tx_power_tracking(Adapter);
716 rtl8723a_phy_lc_calibrate(Adapter);
718 rtl8723a_dual_antenna_detection(Adapter);
721 /* fixed USB interface interference issue */
722 rtl8723au_write8(Adapter, 0xfe40, 0xe0);
723 rtl8723au_write8(Adapter, 0xfe41, 0x8d);
724 rtl8723au_write8(Adapter, 0xfe42, 0x80);
725 rtl8723au_write32(Adapter, 0x20c, 0xfd0320);
726 /* Solve too many protocol error on USB bus */
727 if (!IS_81xxC_VENDOR_UMC_A_CUT(pHalData->VersionID)) {
729 rtl8723au_write8(Adapter, 0xFE40, 0xE6);
730 rtl8723au_write8(Adapter, 0xFE41, 0x94);
731 rtl8723au_write8(Adapter, 0xFE42, 0x80);
734 rtl8723au_write8(Adapter, 0xFE40, 0xE0);
735 rtl8723au_write8(Adapter, 0xFE41, 0x19);
736 rtl8723au_write8(Adapter, 0xFE42, 0x80);
739 rtl8723au_write8(Adapter, 0xFE40, 0xE5);
740 rtl8723au_write8(Adapter, 0xFE41, 0x91);
741 rtl8723au_write8(Adapter, 0xFE42, 0x80);
744 rtl8723au_write8(Adapter, 0xFE40, 0xE2);
745 rtl8723au_write8(Adapter, 0xFE41, 0x81);
746 rtl8723au_write8(Adapter, 0xFE42, 0x80);
750 /* _InitPABias(Adapter); */
752 /* Init BT hw config. */
753 rtl8723a_BT_init_hwconfig(Adapter);
755 rtl8723a_InitHalDm(Adapter);
757 val8 = ((WiFiNavUpperUs + HAL_8723A_NAV_UPPER_UNIT - 1) /
758 HAL_8723A_NAV_UPPER_UNIT);
759 rtl8723au_write8(Adapter, REG_NAV_UPPER, val8);
761 /* 2011/03/09 MH debug only, UMC-B cut pass 2500 S5 test, but we need to fin root cause. */
762 if (((rtl8723au_read32(Adapter, rFPGA0_RFMOD) & 0xFF000000) !=
764 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(24), 1);
765 RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("%s: IQK fail recorver\n", __func__));
768 /* ack for xmit mgmt frames. */
769 rtl8723au_write32(Adapter, REG_FWHW_TXQ_CTRL,
770 rtl8723au_read32(Adapter, REG_FWHW_TXQ_CTRL)|BIT(12));
773 if (status == _SUCCESS) {
774 Adapter->hw_init_completed = true;
776 if (Adapter->registrypriv.notch_filter == 1)
777 rtl8723a_notch_filter(Adapter, 1);
780 DBG_8723A("%s in %dms\n", __func__,
781 jiffies_to_msecs(jiffies - init_start_time));
785 static void phy_SsPwrSwitch92CU(struct rtw_adapter *Adapter,
786 enum rt_rf_power_state eRFPowerState,
789 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
793 switch (eRFPowerState) {
795 if (bRegSSPwrLvl == 1) {
796 /* 1. Enable MAC Clock. Can not be enabled now. */
797 /* WriteXBYTE(REG_SYS_CLKR+1,
798 ReadXBYTE(REG_SYS_CLKR+1) | BIT(3)); */
800 /* 2. Force PWM, Enable SPS18_LDO_Marco_Block */
801 rtl8723au_write8(Adapter, REG_SPS0_CTRL,
802 rtl8723au_read8(Adapter, REG_SPS0_CTRL) |
805 /* 3. restore BB, AFE control register. */
807 if (pHalData->rf_type == RF_2T2R)
808 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
811 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
813 PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 1);
814 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(1), 0);
817 if (pHalData->rf_type == RF_2T2R)
818 PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
820 else if (pHalData->rf_type == RF_1T1R)
821 PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
824 /* 4. issue 3-wire command that RF set to Rx idle
825 mode. This is used to re-write the RX idle mode. */
826 /* We can only prvide a usual value instead and then
827 HW will modify the value by itself. */
828 PHY_SetRFReg(Adapter, RF_PATH_A, 0,
829 bRFRegOffsetMask, 0x32D95);
830 if (pHalData->rf_type == RF_2T2R) {
831 PHY_SetRFReg(Adapter, RF_PATH_B, 0,
832 bRFRegOffsetMask, 0x32D95);
834 } else { /* Level 2 or others. */
835 /* h. AFE_PLL_CTRL 0x28[7:0] = 0x80
837 rtl8723au_write8(Adapter, REG_AFE_PLL_CTRL, 0x81);
839 /* i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F
840 gated AFE DIG_CLOCK */
841 rtl8723au_write16(Adapter, REG_AFE_XTAL_CTRL, 0x800F);
844 /* 2. Force PWM, Enable SPS18_LDO_Marco_Block */
845 rtl8723au_write8(Adapter, REG_SPS0_CTRL,
846 rtl8723au_read8(Adapter, REG_SPS0_CTRL) |
849 /* 3. restore BB, AFE control register. */
851 if (pHalData->rf_type == RF_2T2R)
852 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
855 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
857 PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 1);
858 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(1), 0);
861 if (pHalData->rf_type == RF_2T2R)
862 PHY_SetBBReg(Adapter, rRx_Wait_CCA,
863 bMaskDWord, 0x63DB25A0);
864 else if (pHalData->rf_type == RF_1T1R)
865 PHY_SetBBReg(Adapter, rRx_Wait_CCA,
866 bMaskDWord, 0x631B25A0);
868 /* 4. issue 3-wire command that RF set to Rx idle
869 mode. This is used to re-write the RX idle mode. */
870 /* We can only prvide a usual value instead and
871 then HW will modify the value by itself. */
872 PHY_SetRFReg(Adapter, RF_PATH_A, 0,
873 bRFRegOffsetMask, 0x32D95);
874 if (pHalData->rf_type == RF_2T2R) {
875 PHY_SetRFReg(Adapter, RF_PATH_B, 0,
876 bRFRegOffsetMask, 0x32D95);
879 /* 5. gated MAC Clock */
880 bytetmp = rtl8723au_read8(Adapter, REG_APSD_CTRL);
881 rtl8723au_write8(Adapter, REG_APSD_CTRL,
886 /* Set BB reset at first */
888 rtl8723au_write8(Adapter, REG_SYS_FUNC_EN, 0x17);
891 rtl8723au_write8(Adapter, REG_TXPAUSE, 0x0);
896 value8 = rtl8723au_read8(Adapter, REG_SPS0_CTRL);
897 if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))
900 value8 &= ~(BIT(0) | BIT(3));
901 if (bRegSSPwrLvl == 1) {
902 RT_TRACE(_module_hal_init_c_, _drv_err_, ("SS LVL1\n"));
903 /* Disable RF and BB only for SelectSuspend. */
905 /* 1. Set BB/RF to shutdown. */
906 /* (1) Reg878[5:3]= 0 RF rx_code for
907 preamble power saving */
908 /* (2)Reg878[21:19]= 0 Turn off RF-B */
909 /* (3) RegC04[7:4]= 0 Turn off all paths
910 for packet detection */
911 /* (4) Reg800[1] = 1 enable preamble power
913 Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] =
914 PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter,
916 Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] =
917 PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable,
919 Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] =
920 PHY_QueryBBReg(Adapter, rFPGA0_RFMOD,
922 if (pHalData->rf_type == RF_2T2R) {
923 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
925 } else if (pHalData->rf_type == RF_1T1R) {
926 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
929 PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 0);
930 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(1), 1);
932 /* 2 .AFE control register to power down. bit[30:22] */
933 Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] =
934 PHY_QueryBBReg(Adapter, rRx_Wait_CCA,
936 if (pHalData->rf_type == RF_2T2R)
937 PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
939 else if (pHalData->rf_type == RF_1T1R)
940 PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
943 /* 3. issue 3-wire command that RF set to power down.*/
944 PHY_SetRFReg(Adapter, RF_PATH_A, 0, bRFRegOffsetMask, 0);
945 if (pHalData->rf_type == RF_2T2R)
946 PHY_SetRFReg(Adapter, RF_PATH_B, 0,
947 bRFRegOffsetMask, 0);
949 /* 4. Force PFM , disable SPS18_LDO_Marco_Block */
950 rtl8723au_write8(Adapter, REG_SPS0_CTRL, value8);
951 } else { /* Level 2 or others. */
952 RT_TRACE(_module_hal_init_c_, _drv_err_, ("SS LVL2\n"));
954 u8 eRFPath = RF_PATH_A, value8 = 0;
955 rtl8723au_write8(Adapter, REG_TXPAUSE, 0xFF);
956 PHY_SetRFReg(Adapter,
957 (enum RF_RADIO_PATH)eRFPath,
958 0x0, bMaskByte0, 0x0);
961 rtl8723au_write8(Adapter, REG_APSD_CTRL,
964 /* After switch APSD, we need to delay
968 /* Set BB reset at first */
970 value8 |= (FEN_USBD | FEN_USBA |
973 rtl8723au_write8(Adapter, REG_SYS_FUNC_EN,
977 /* Disable RF and BB only for SelectSuspend. */
979 /* 1. Set BB/RF to shutdown. */
980 /* (1) Reg878[5:3]= 0 RF rx_code for
981 preamble power saving */
982 /* (2)Reg878[21:19]= 0 Turn off RF-B */
983 /* (3) RegC04[7:4]= 0 Turn off all paths for
985 /* (4) Reg800[1] = 1 enable preamble power
987 Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] =
988 PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter,
990 Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] =
991 PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable,
993 Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] =
994 PHY_QueryBBReg(Adapter, rFPGA0_RFMOD,
996 if (pHalData->rf_type == RF_2T2R)
997 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
999 else if (pHalData->rf_type == RF_1T1R)
1000 PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
1002 PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 0);
1003 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(1), 1);
1005 /* 2 .AFE control register to power down. bit[30:22] */
1006 Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] =
1007 PHY_QueryBBReg(Adapter, rRx_Wait_CCA,
1009 if (pHalData->rf_type == RF_2T2R)
1010 PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
1012 else if (pHalData->rf_type == RF_1T1R)
1013 PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
1016 /* 3. issue 3-wire command that RF set to power down. */
1017 PHY_SetRFReg(Adapter, RF_PATH_A, 0, bRFRegOffsetMask, 0);
1018 if (pHalData->rf_type == RF_2T2R)
1019 PHY_SetRFReg(Adapter, RF_PATH_B, 0,
1020 bRFRegOffsetMask, 0);
1022 /* 4. Force PFM , disable SPS18_LDO_Marco_Block */
1023 rtl8723au_write8(Adapter, REG_SPS0_CTRL, value8);
1025 /* 2010/10/13 MH/Isaachsu exchange sequence. */
1026 /* h. AFE_PLL_CTRL 0x28[7:0] = 0x80
1028 rtl8723au_write8(Adapter, REG_AFE_PLL_CTRL, 0x80);
1031 /* i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F
1032 gated AFE DIG_CLOCK */
1033 rtl8723au_write16(Adapter, REG_AFE_XTAL_CTRL, 0xA80F);
1040 } /* phy_PowerSwitch92CU */
1042 void _ps_open_RF23a(struct rtw_adapter *padapter)
1044 /* here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified */
1045 phy_SsPwrSwitch92CU(padapter, rf_on, 1);
1048 static void CardDisableRTL8723U(struct rtw_adapter *Adapter)
1052 DBG_8723A("CardDisableRTL8723U\n");
1053 /* USB-MF Card Disable Flow */
1054 /* 1. Run LPS WL RFOFF flow */
1055 HalPwrSeqCmdParsing23a(Adapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1056 PWR_INTF_USB_MSK, rtl8723AU_enter_lps_flow);
1058 /* 2. 0x1F[7:0] = 0 turn off RF */
1059 rtl8723au_write8(Adapter, REG_RF_CTRL, 0x00);
1061 /* ==== Reset digital sequence ====== */
1062 if ((rtl8723au_read8(Adapter, REG_MCUFWDL) & BIT(7)) &&
1063 Adapter->bFWReady) /* 8051 RAM code */
1064 rtl8723a_FirmwareSelfReset(Adapter);
1066 /* Reset MCU. Suggested by Filen. 2011.01.26. by tynli. */
1067 u1bTmp = rtl8723au_read8(Adapter, REG_SYS_FUNC_EN+1);
1068 rtl8723au_write8(Adapter, REG_SYS_FUNC_EN+1, u1bTmp & ~BIT(2));
1070 /* g. MCUFWDL 0x80[1:0]= 0 reset MCU ready status */
1071 rtl8723au_write8(Adapter, REG_MCUFWDL, 0x00);
1073 /* ==== Reset digital sequence end ====== */
1074 /* Card disable power action flow */
1075 HalPwrSeqCmdParsing23a(Adapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1077 rtl8723AU_card_disable_flow);
1079 /* Reset MCU IO Wrapper, added by Roger, 2011.08.30. */
1080 u1bTmp = rtl8723au_read8(Adapter, REG_RSV_CTRL + 1);
1081 rtl8723au_write8(Adapter, REG_RSV_CTRL+1, u1bTmp & ~BIT(0));
1082 u1bTmp = rtl8723au_read8(Adapter, REG_RSV_CTRL + 1);
1083 rtl8723au_write8(Adapter, REG_RSV_CTRL+1, u1bTmp | BIT(0));
1085 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E lock ISO/CLK/Power control register */
1086 rtl8723au_write8(Adapter, REG_RSV_CTRL, 0x0e);
1089 int rtl8723au_hal_deinit(struct rtw_adapter *padapter)
1091 DBG_8723A("==> %s\n", __func__);
1093 #ifdef CONFIG_8723AU_BT_COEXIST
1094 BT_HaltProcess(padapter);
1096 /* 2011/02/18 To Fix RU LNA power leakage problem. We need to
1097 execute below below in Adapter init and halt sequence.
1098 According to EEchou's opinion, we can enable the ability for all */
1099 /* IC. Accord to johnny's opinion, only RU need the support. */
1100 CardDisableRTL8723U(padapter);
1102 padapter->hw_init_completed = false;
1107 int rtl8723au_inirp_init(struct rtw_adapter *Adapter)
1110 struct recv_buf *precvbuf;
1112 struct recv_priv *precvpriv = &Adapter->recvpriv;
1113 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
1117 RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("===> usb_inirp_init\n"));
1119 /* issue Rx irp to receive data */
1120 precvbuf = (struct recv_buf *)precvpriv->precv_buf;
1121 for (i = 0; i < NR_RECVBUFF; i++) {
1122 if (rtl8723au_read_port(Adapter, RECV_BULK_IN_ADDR, 0,
1123 precvbuf) == _FAIL) {
1124 RT_TRACE(_module_hci_hal_init_c_, _drv_err_,
1125 ("usb_rx_init: usb_read_port error\n"));
1131 if (rtl8723au_read_interrupt(Adapter, RECV_INT_IN_ADDR) == _FAIL) {
1132 RT_TRACE(_module_hci_hal_init_c_, _drv_err_,
1133 ("usb_rx_init: usb_read_interrupt error\n"));
1136 pHalData->IntrMask[0] = rtl8723au_read32(Adapter, REG_USB_HIMR);
1137 MSG_8723A("pHalData->IntrMask = 0x%04x\n", pHalData->IntrMask[0]);
1138 pHalData->IntrMask[0] |= UHIMR_C2HCMD|UHIMR_CPWM;
1139 rtl8723au_write32(Adapter, REG_USB_HIMR, pHalData->IntrMask[0]);
1141 RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
1142 ("<=== usb_inirp_init\n"));
1146 int rtl8723au_inirp_deinit(struct rtw_adapter *Adapter)
1148 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
1150 RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
1151 ("\n ===> usb_rx_deinit\n"));
1152 rtl8723au_read_port_cancel(Adapter);
1153 pHalData->IntrMask[0] = rtl8723au_read32(Adapter, REG_USB_HIMR);
1154 MSG_8723A("%s pHalData->IntrMask = 0x%04x\n", __func__,
1155 pHalData->IntrMask[0]);
1156 pHalData->IntrMask[0] = 0x0;
1157 rtl8723au_write32(Adapter, REG_USB_HIMR, pHalData->IntrMask[0]);
1158 RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
1159 ("\n <=== usb_rx_deinit\n"));
1163 static void _ReadBoardType(struct rtw_adapter *Adapter, u8 *PROMContent,
1166 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
1167 u8 boardType = BOARD_USB_DONGLE;
1170 if (IS_8723_SERIES(pHalData->VersionID))
1171 pHalData->rf_type = RF_1T1R;
1173 pHalData->rf_type = RF_2T2R;
1174 pHalData->BoardType = boardType;
1178 boardType = PROMContent[EEPROM_NORMAL_BoardType];
1179 boardType &= BOARD_TYPE_NORMAL_MASK;/* bit[7:5] */
1182 pHalData->BoardType = boardType;
1183 MSG_8723A("_ReadBoardType(%x)\n", pHalData->BoardType);
1185 if (boardType == BOARD_USB_High_PA)
1186 pHalData->ExternalPA = 1;
1189 static void Hal_EfuseParseMACAddr_8723AU(struct rtw_adapter *padapter,
1190 u8 *hwinfo, bool AutoLoadFail)
1193 u8 sMacAddr[ETH_ALEN] = {0x00, 0xE0, 0x4C, 0x87, 0x23, 0x00};
1194 struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
1197 for (i = 0; i < 6; i++)
1198 pEEPROM->mac_addr[i] = sMacAddr[i];
1200 /* Read Permanent MAC address */
1201 memcpy(pEEPROM->mac_addr, &hwinfo[EEPROM_MAC_ADDR_8723AU],
1205 RT_TRACE(_module_hci_hal_init_c_, _drv_notice_,
1206 ("Hal_EfuseParseMACAddr_8723AU: Permanent Address =%02x:%02x:"
1207 "%02x:%02x:%02x:%02x\n",
1208 pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
1209 pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
1210 pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]));
1213 static void readAdapterInfo(struct rtw_adapter *padapter)
1215 struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
1216 /* struct hal_data_8723a * pHalData = GET_HAL_DATA(padapter); */
1217 u8 hwinfo[HWSET_MAX_SIZE];
1219 Hal_InitPGData(padapter, hwinfo);
1220 Hal_EfuseParseIDCode(padapter, hwinfo);
1221 Hal_EfuseParseEEPROMVer(padapter, hwinfo,
1222 pEEPROM->bautoload_fail_flag);
1223 Hal_EfuseParseMACAddr_8723AU(padapter, hwinfo,
1224 pEEPROM->bautoload_fail_flag);
1225 Hal_EfuseParsetxpowerinfo_8723A(padapter, hwinfo,
1226 pEEPROM->bautoload_fail_flag);
1227 _ReadBoardType(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
1228 Hal_EfuseParseBTCoexistInfo_8723A(padapter, hwinfo,
1229 pEEPROM->bautoload_fail_flag);
1231 rtl8723a_EfuseParseChnlPlan(padapter, hwinfo,
1232 pEEPROM->bautoload_fail_flag);
1233 Hal_EfuseParseThermalMeter_8723A(padapter, hwinfo,
1234 pEEPROM->bautoload_fail_flag);
1235 /* _ReadRFSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); */
1236 /* _ReadPSSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); */
1237 Hal_EfuseParseAntennaDiversity(padapter, hwinfo,
1238 pEEPROM->bautoload_fail_flag);
1240 Hal_EfuseParseEEPROMVer(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
1241 Hal_EfuseParseCustomerID(padapter, hwinfo,
1242 pEEPROM->bautoload_fail_flag);
1243 Hal_EfuseParseRateIndicationOption(padapter, hwinfo,
1244 pEEPROM->bautoload_fail_flag);
1245 Hal_EfuseParseXtal_8723A(padapter, hwinfo,
1246 pEEPROM->bautoload_fail_flag);
1248 /* hal_CustomizedBehavior_8723U(Adapter); */
1250 /* Adapter->bDongle = (PROMContent[EEPROM_EASY_REPLACEMENT] == 1)? 0: 1; */
1251 DBG_8723A("%s(): REPLACEMENT = %x\n", __func__, padapter->bDongle);
1254 static void _ReadPROMContent(struct rtw_adapter *Adapter)
1256 struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
1259 eeValue = rtl8723au_read8(Adapter, REG_9346CR);
1260 /* To check system boot selection. */
1261 pEEPROM->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? true : false;
1262 pEEPROM->bautoload_fail_flag = (eeValue & EEPROM_EN) ? false : true;
1264 DBG_8723A("Boot from %s, Autoload %s !\n",
1265 (pEEPROM->EepromOrEfuse ? "EEPROM" : "EFUSE"),
1266 (pEEPROM->bautoload_fail_flag ? "Fail" : "OK"));
1268 readAdapterInfo(Adapter);
1271 static void _ReadRFType(struct rtw_adapter *Adapter)
1273 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
1275 pHalData->rf_chip = RF_6052;
1278 static void _ReadSilmComboMode(struct rtw_adapter *Adapter)
1280 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
1282 pHalData->SlimComboDbg = false; /* Default is not debug mode. */
1287 /* We should set Efuse cell selection to WiFi cell in default. */
1292 /* Added by Roger, 2010.11.23. */
1294 static void hal_EfuseCellSel(struct rtw_adapter *Adapter)
1298 value32 = rtl8723au_read32(Adapter, EFUSE_TEST);
1299 value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0);
1300 rtl8723au_write32(Adapter, EFUSE_TEST, value32);
1303 void rtl8723a_read_adapter_info(struct rtw_adapter *Adapter)
1305 unsigned long start = jiffies;
1307 /* Read EEPROM size before call any EEPROM function */
1308 Adapter->EepromAddressSize = GetEEPROMSize8723A(Adapter);
1310 MSG_8723A("====> _ReadAdapterInfo8723AU\n");
1312 hal_EfuseCellSel(Adapter);
1314 _ReadRFType(Adapter);/* rf_chip -> _InitRFType() */
1315 _ReadPROMContent(Adapter);
1317 /* 2010/10/25 MH THe function must be called after
1318 borad_type & IC-Version recognize. */
1319 _ReadSilmComboMode(Adapter);
1321 /* MSG_8723A("%s()(done), rf_chip = 0x%x, rf_type = 0x%x\n",
1322 __func__, pHalData->rf_chip, pHalData->rf_type); */
1324 MSG_8723A("<==== _ReadAdapterInfo8723AU in %d ms\n",
1325 jiffies_to_msecs(jiffies - start));
1330 /* Query setting of specified variable. */
1332 int GetHalDefVar8192CUsb(struct rtw_adapter *Adapter,
1333 enum hal_def_variable eVariable, void *pValue)
1335 struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
1336 int bResult = _SUCCESS;
1338 switch (eVariable) {
1339 case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
1340 *((int *)pValue) = pHalData->dmpriv.UndecoratedSmoothedPWDB;
1342 case HAL_DEF_IS_SUPPORT_ANT_DIV:
1344 case HAL_DEF_CURRENT_ANTENNA:
1346 case HAL_DEF_DRVINFO_SZ:
1347 *((u32 *)pValue) = DRVINFO_SZ;
1349 case HAL_DEF_MAX_RECVBUF_SZ:
1350 *((u32 *)pValue) = MAX_RECVBUF_SZ;
1352 case HAL_DEF_RX_PACKET_OFFSET:
1353 *((u32 *)pValue) = RXDESC_SIZE + DRVINFO_SZ;
1355 case HAL_DEF_DBG_DUMP_RXPKT:
1356 *((u8 *)pValue) = pHalData->bDumpRxPkt;
1358 case HAL_DEF_DBG_DM_FUNC:
1359 *((u32 *)pValue) = pHalData->odmpriv.SupportAbility;
1361 case HW_VAR_MAX_RX_AMPDU_FACTOR:
1362 *((u32 *)pValue) = IEEE80211_HT_MAX_AMPDU_64K;
1364 case HW_DEF_ODM_DBG_FLAG:
1366 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv;
1367 printk("pDM_Odm->DebugComponents = 0x%llx\n",
1368 pDM_Odm->DebugComponents);
1372 /* RT_TRACE(COMP_INIT, DBG_WARNING, ("GetHalDefVar8192CUsb(): "
1373 "Unkown variable: %d!\n", eVariable)); */
1381 void rtl8723a_update_ramask(struct rtw_adapter *padapter,
1382 u32 mac_id, u8 rssi_level)
1385 u8 networkType, raid;
1386 u32 mask, rate_bitmap;
1387 u8 shortGIrate = false;
1388 int supportRateNum = 0;
1389 struct sta_info *psta;
1390 struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
1391 struct dm_priv *pdmpriv = &pHalData->dmpriv;
1392 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1393 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
1394 struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;
1396 if (mac_id >= NUM_STA) /* CAM_SIZE */
1399 psta = pmlmeinfo->FW_sta_info[mac_id].psta;
1404 case 0:/* for infra mode */
1406 rtw_get_rateset_len23a(cur_network->SupportedRates);
1407 networkType = judge_network_type23a(padapter,
1408 cur_network->SupportedRates,
1409 supportRateNum) & 0xf;
1410 /* pmlmeext->cur_wireless_mode = networkType; */
1411 raid = networktype_to_raid23a(networkType);
1413 mask = update_supported_rate23a(cur_network->SupportedRates,
1415 mask |= (pmlmeinfo->HT_enable) ?
1416 update_MSC_rate23a(&pmlmeinfo->ht_cap) : 0;
1418 if (support_short_GI23a(padapter, &pmlmeinfo->ht_cap))
1422 case 1:/* for broadcast/multicast */
1423 supportRateNum = rtw_get_rateset_len23a(
1424 pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
1425 if (pmlmeext->cur_wireless_mode & WIRELESS_11B)
1426 networkType = WIRELESS_11B;
1428 networkType = WIRELESS_11G;
1429 raid = networktype_to_raid23a(networkType);
1431 mask = update_basic_rate23a(cur_network->SupportedRates,
1435 default: /* for each sta in IBSS */
1436 supportRateNum = rtw_get_rateset_len23a(
1437 pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
1438 networkType = judge_network_type23a(padapter,
1439 pmlmeinfo->FW_sta_info[mac_id].SupportedRates,
1440 supportRateNum) & 0xf;
1441 /* pmlmeext->cur_wireless_mode = networkType; */
1442 raid = networktype_to_raid23a(networkType);
1444 mask = update_supported_rate23a(cur_network->SupportedRates,
1447 /* todo: support HT in IBSS */
1451 /* mask &= 0x0fffffff; */
1452 rate_bitmap = ODM_Get_Rate_Bitmap23a(pHalData, mac_id, mask,
1454 DBG_8723A("%s => mac_id:%d, networkType:0x%02x, "
1455 "mask:0x%08x\n\t ==> rssi_level:%d, rate_bitmap:0x%08x\n",
1456 __func__, mac_id, networkType, mask, rssi_level, rate_bitmap);
1458 mask &= rate_bitmap;
1459 mask |= ((raid<<28)&0xf0000000);
1461 init_rate = get_highest_rate_idx23a(mask)&0x3f;
1463 if (pHalData->fw_ractrl == true) {
1466 /* arg = (cam_idx-4)&0x1f;MACID */
1467 arg = mac_id&0x1f;/* MACID */
1471 if (shortGIrate == true)
1474 DBG_8723A("update raid entry, mask = 0x%x, arg = 0x%x\n",
1477 rtl8723a_set_raid_cmd(padapter, mask, arg);
1479 if (shortGIrate == true)
1480 init_rate |= BIT(6);
1482 rtl8723au_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id),
1488 psta->init_rate = init_rate;
1490 /* set correct initial date rate for each mac_id */
1491 pdmpriv->INIDATA_RATE[mac_id] = init_rate;