1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 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 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
21 #define _USB_HALINIT_C_
23 #include <rtl8723b_hal.h>
25 #include "hal_com_h2c.h"
30 static void _dbg_dump_macreg(_adapter *padapter)
35 for(index=0;index<64;index++)
38 val32 = rtw_read32(padapter,offset);
39 DBG_8192C("offset : 0x%02x ,val:0x%08x\n",offset,val32);
44 _ConfigChipOutEP_8723(
49 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
52 pHalData->OutEpQueueSel = 0;
53 pHalData->OutEpNumber = 0;
57 pHalData->OutEpQueueSel=TX_SELE_HQ| TX_SELE_LQ|TX_SELE_NQ;
58 pHalData->OutEpNumber=4;
61 pHalData->OutEpQueueSel=TX_SELE_HQ| TX_SELE_LQ|TX_SELE_NQ;
62 pHalData->OutEpNumber=3;
65 pHalData->OutEpQueueSel=TX_SELE_HQ| TX_SELE_NQ;
66 pHalData->OutEpNumber=2;
69 pHalData->OutEpQueueSel=TX_SELE_HQ;
70 pHalData->OutEpNumber=1;
76 DBG_871X("%s OutEpQueueSel(0x%02x), OutEpNumber(%d) \n",__FUNCTION__,pHalData->OutEpQueueSel,pHalData->OutEpNumber );
80 static BOOLEAN HalUsbSetQueuePipeMapping8723BUsb(
86 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
87 BOOLEAN result = _FALSE;
89 _ConfigChipOutEP_8723(pAdapter, NumOutPipe);
91 // Normal chip with one IN and one OUT doesn't have interrupt IN EP.
92 if(1 == pHalData->OutEpNumber){
98 // All config other than above support one Bulk IN and one Interrupt IN.
103 result = Hal_MappingOutPipe(pAdapter, NumOutPipe);
109 void rtl8723bu_interface_configure(_adapter *padapter)
111 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
112 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);
114 if (IS_HIGH_SPEED_USB(padapter))
116 pHalData->UsbBulkOutSize = USB_HIGH_SPEED_BULK_SIZE;//512 bytes
120 pHalData->UsbBulkOutSize = USB_FULL_SPEED_BULK_SIZE;//64 bytes
123 pHalData->interfaceIndex = pdvobjpriv->InterfaceNumber;
125 #ifdef CONFIG_USB_TX_AGGREGATION
126 pHalData->UsbTxAggMode = 1;
127 pHalData->UsbTxAggDescNum = 0x6; // only 4 bits
130 #ifdef CONFIG_USB_RX_AGGREGATION
131 pHalData->UsbRxAggMode = USB_RX_AGG_USB;
132 pHalData->UsbRxAggBlockCount = 0x5; /* unit: 4KB, for USB mode */
133 pHalData->UsbRxAggBlockTimeout = 0x20; /* unit: 32us, for USB mode */
134 pHalData->UsbRxAggPageCount = 0xF; /* uint: 1KB, for DMA mode */
135 pHalData->UsbRxAggPageTimeout = 0x20; /* unit: 32us, for DMA mode */
138 HalUsbSetQueuePipeMapping8723BUsb(padapter,
139 pdvobjpriv->RtNumInPipes, pdvobjpriv->RtNumOutPipes);
143 #ifdef CONFIG_GPIO_WAKEUP
144 //we set it high under init and fw will
145 //give us Low Pulse when host wake up
146 void HostWakeUpGpioClear(PADAPTER Adapter)
150 value32 = rtw_read32(Adapter, REG_GPIO_PIN_CTRL_2);
153 value32 |= BIT(12);//4+8
155 value32 |= BIT(20);//4+16
157 rtw_write32(Adapter, REG_GPIO_PIN_CTRL_2, value32);
158 } //HostWakeUpGpioClear
160 void HalSetOutPutGPIO(PADAPTER padapter, u8 index, u8 OutPutValue)
163 /* config GPIO mode */
164 rtw_write8(padapter, REG_GPIO_PIN_CTRL + 3, rtw_read8(padapter, REG_GPIO_PIN_CTRL + 3) & ~BIT(index) );
166 /* config GPIO Sel */
169 rtw_write8(padapter, REG_GPIO_PIN_CTRL + 2, rtw_read8(padapter, REG_GPIO_PIN_CTRL + 2) | BIT(index));
171 /* set output value */
173 rtw_write8(padapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) | BIT(index));
175 rtw_write8(padapter, REG_GPIO_PIN_CTRL + 1, rtw_read8(padapter, REG_GPIO_PIN_CTRL + 1) & ~BIT(index));
179 /* index: 11~8 transform to 3~0 */
181 /* index: 12~8 transform to 4~0 */
184 /* config GPIO mode */
185 rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 3, rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 3) & ~BIT(index) );
187 /* config GPIO Sel */
190 rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 2, rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 2) | BIT(index));
192 /* set output value */
194 rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 1, rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) | BIT(index));
196 rtw_write8(padapter, REG_GPIO_PIN_CTRL_2 + 1, rtw_read8(padapter, REG_GPIO_PIN_CTRL_2 + 1) & ~BIT(index));
202 static u32 _InitPowerOn_8723BU(PADAPTER padapter)
204 u8 status = _SUCCESS;
209 rtw_hal_get_hwreg(padapter, HW_VAR_APFM_ON_MAC, &value8);
213 // HW Power on sequence
214 if(!HalPwrSeqCmdParsing(padapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, rtl8723B_card_enable_flow ))
217 // Enable MAC DMA/WMAC/SCHEDULE/SEC block
218 // Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy. Added by tynli. 2011.08.31.
219 rtw_write8(padapter, REG_CR_8723B, 0x00); //suggseted by zhouzhou, by page, 20111230
220 value16 = rtw_read16(padapter, REG_CR_8723B);
221 value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN
222 | PROTOCOL_EN | SCHEDULE_EN | ENSEC | CALTMR_EN);
223 rtw_write16(padapter, REG_CR_8723B, value16);
226 rtw_hal_set_hwreg(padapter, HW_VAR_APFM_ON_MAC, &value8);
228 #ifdef CONFIG_BT_COEXIST
229 rtw_btcoex_PowerOnSetting(padapter);
231 // external switch to S1
235 value16 = rtw_read16(padapter, REG_PWR_DATA);
236 // Switch the control of EESK, EECS to RFC for DPDT or Antenna switch
237 value16 |= BIT(11); // BIT_EEPRPAD_RFE_CTRL_EN
238 rtw_write16(padapter, REG_PWR_DATA, value16);
239 //DBG_8192C("%s: REG_PWR_DATA(0x%x)=0x%04X\n", __FUNCTION__, REG_PWR_DATA, rtw_read16(padapter, REG_PWR_DATA));
241 value32 = rtw_read32(padapter, REG_LEDCFG0);
242 value32 |= BIT(23); // DPDT_SEL_EN, 1 for SW control
243 rtw_write32(padapter, REG_LEDCFG0, value32);
244 //DBG_8192C("%s: REG_LEDCFG0(0x%x)=0x%08X\n", __FUNCTION__, REG_LEDCFG0, rtw_read32(padapter, REG_LEDCFG0));
246 value8 = rtw_read8(padapter, REG_PAD_CTRL1_8723B);
247 value8 &= ~BIT(0); // BIT_SW_DPDT_SEL_DATA, DPDT_SEL default configuration
248 rtw_write8(padapter, REG_PAD_CTRL1_8723B, value8);
249 //DBG_8192C("%s: REG_PAD_CTRL1(0x%x)=0x%02X\n", __FUNCTION__, REG_PAD_CTRL1_8723B, rtw_read8(padapter, REG_PAD_CTRL1_8723B));
250 #endif // CONFIG_BT_COEXIST
257 //-------------------------------------------------------------------------
259 // LLT R/W/Init function
261 //-------------------------------------------------------------------------
268 u8 status = _SUCCESS;
269 s8 count = POLLING_LLT_THRESHOLD;
270 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | _LLT_OP(_LLT_WRITE_ACCESS);
272 rtw_write32(Adapter, REG_LLT_INIT, value);
276 value = rtw_read32(Adapter, REG_LLT_INIT);
277 if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){
283 DBG_871X("Failed to polling write LLT done at address %d!\n", address);
297 u32 value = _LLT_INIT_ADDR(address) | _LLT_OP(_LLT_READ_ACCESS);
299 rtw_write32(Adapter, REG_LLT_INIT, value);
301 //polling and get value
304 value = rtw_read32(Adapter, REG_LLT_INIT);
305 if(_LLT_NO_ACTIVE == _LLT_OP_VALUE(value)){
309 if(count > POLLING_LLT_THRESHOLD){
310 //RT_TRACE(COMP_INIT,DBG_SERIOUS,("Failed to polling read LLT done at address %d!\n", address));
320 //---------------------------------------------------------------
322 // MAC init functions
324 //---------------------------------------------------------------
326 // Shall USB interface init this?
334 // HISR - turn all on
335 value32 = 0xFFFFFFFF;
336 rtw_write32(Adapter, REG_HISR, value32);
338 // HIMR - turn all on
339 rtw_write32(Adapter, REG_HIMR, value32);
342 static void _InitQueueReservedPage(PADAPTER padapter)
344 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
345 struct registry_priv *pregistrypriv = &padapter->registrypriv;
346 u32 outEPNum = (u32)pHalData->OutEpNumber;
353 BOOLEAN bWiFiConfig = pregistrypriv->wifi_spec;
355 if (pHalData->OutEpQueueSel & TX_SELE_HQ)
357 numHQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_HPQ_8723B : NORMAL_PAGE_NUM_HPQ_8723B;
360 if (pHalData->OutEpQueueSel & TX_SELE_LQ)
362 numLQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_LPQ_8723B : NORMAL_PAGE_NUM_LPQ_8723B;
365 // NOTE: This step shall be proceed before writting REG_RQPN.
366 if (pHalData->OutEpQueueSel & TX_SELE_NQ) {
367 numNQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_NPQ_8723B : NORMAL_PAGE_NUM_NPQ_8723B;
369 value8 = (u8)_NPQ(numNQ);
370 rtw_write8(padapter, REG_RQPN_NPQ, value8);
372 numPubQ = TX_TOTAL_PAGE_NUMBER_8723B - numHQ - numLQ - numNQ;
375 value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN;
376 rtw_write32(padapter, REG_RQPN, value32);
380 static void _InitTxBufferBoundary(PADAPTER padapter)
382 struct registry_priv *pregistrypriv = &padapter->registrypriv;
383 #ifdef CONFIG_CONCURRENT_MODE
385 #endif // CONFIG_CONCURRENT_MODE
390 if(!pregistrypriv->wifi_spec){
391 txpktbuf_bndy = TX_PAGE_BOUNDARY_8723B;
394 txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY_8723B;
397 rtw_write8(padapter, REG_TXPKTBUF_BCNQ_BDNY_8723B, txpktbuf_bndy);
398 rtw_write8(padapter, REG_TXPKTBUF_MGQ_BDNY_8723B, txpktbuf_bndy);
399 rtw_write8(padapter, REG_TXPKTBUF_WMAC_LBK_BF_HD_8723B, txpktbuf_bndy);
400 rtw_write8(padapter, REG_TRXFF_BNDY, txpktbuf_bndy);
401 rtw_write8(padapter, REG_TDECTRL+1, txpktbuf_bndy);
403 #ifdef CONFIG_CONCURRENT_MODE
404 val8 = txpktbuf_bndy + 8;
405 rtw_write8(padapter, REG_BCNQ1_BDNY, val8);
406 rtw_write8(padapter, REG_DWBCN1_CTRL_8723B+1, val8); // BCN1_HEAD
408 val8 = rtw_read8(padapter, REG_DWBCN1_CTRL_8723B+2);
409 val8 |= BIT(1); // BIT1- BIT_SW_BCN_SEL_EN
410 rtw_write8(padapter, REG_DWBCN1_CTRL_8723B+2, val8);
411 #endif // CONFIG_CONCURRENT_MODE
416 _InitTransferPageSize_8723bu(
422 value8 = _PSRX(PBP_256) | _PSTX(PBP_256);
424 rtw_write8(Adapter, REG_PBP_8723B, value8);
429 _InitNormalChipRegPriority(
439 u16 value16 = (rtw_read16(Adapter, REG_TRXDMA_CTRL_8723B) & 0x7);
441 value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) |
442 _TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) |
443 _TXDMA_MGQ_MAP(mgtQ)| _TXDMA_HIQ_MAP(hiQ);
445 rtw_write16(Adapter, REG_TRXDMA_CTRL_8723B, value16);
450 _InitNormalChipTwoOutEpPriority(
454 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
455 struct registry_priv *pregistrypriv = &Adapter->registrypriv;
456 u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ;
462 switch(pHalData->OutEpQueueSel)
464 case (TX_SELE_HQ | TX_SELE_LQ):
465 valueHi = QUEUE_HIGH;
466 valueLow = QUEUE_LOW;
468 case (TX_SELE_NQ | TX_SELE_LQ):
469 valueHi = QUEUE_NORMAL;
470 valueLow = QUEUE_LOW;
472 case (TX_SELE_HQ | TX_SELE_NQ):
473 valueHi = QUEUE_HIGH;
474 valueLow = QUEUE_NORMAL;
477 //RT_ASSERT(FALSE,("Shall not reach here!\n"));
481 if(!pregistrypriv->wifi_spec ){
489 else{//for WMM ,CONFIG_OUT_EP_WIFI_MODE
498 _InitNormalChipRegPriority(Adapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ);
503 _InitNormalChipThreeOutEpPriority(
507 struct registry_priv *pregistrypriv = &padapter->registrypriv;
508 u16 beQ,bkQ,viQ,voQ,mgtQ,hiQ;
510 if(!pregistrypriv->wifi_spec ){// typical setting
526 _InitNormalChipRegPriority(padapter,beQ,bkQ,viQ,voQ,mgtQ,hiQ);
529 static void _InitQueuePriority(PADAPTER padapter)
531 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
532 switch(pHalData->OutEpNumber)
535 _InitNormalChipTwoOutEpPriority(padapter);
539 _InitNormalChipThreeOutEpPriority(padapter);
542 //RT_ASSERT(FALSE,("Shall not reach here!\n"));
549 static void _InitPageBoundary(PADAPTER padapter)
551 /* RX FIFO(RXFF0) Boundary, unit is byte */
552 rtw_write16(padapter, REG_TRXFF_BNDY+2, RX_DMA_BOUNDARY_8723B);
556 _InitHardwareDropIncorrectBulkOut(
560 u32 value32 = rtw_read32(Adapter, REG_TXDMA_OFFSET_CHK);
561 value32 |= DROP_DATA_EN;
562 rtw_write32(Adapter, REG_TXDMA_OFFSET_CHK, value32);
572 value32 = rtw_read32(Adapter, REG_CR);
574 // TODO: use the other function to set network type
575 #if 0//RTL8191C_FPGA_NETWORKTYPE_ADHOC
576 value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AD_HOC);
578 value32 = (value32 & ~MASK_NETTYPE) | _NETTYPE(NT_LINK_AP);
580 rtw_write32(Adapter, REG_CR, value32);
581 // RASSERT(pIoBase->rtw_read8(REG_CR + 2) == 0x2);
591 rtw_write8(Adapter,REG_RX_DRVINFO_SZ, drvInfoSize);
601 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
603 // pHalData->ReceiveConfig = AAP | APM | AM |AB |ADD3|APWRMGT| APP_ICV | APP_MIC |APP_FCS|ADF |ACF|AMF|HTC_LOC_CTRL|APP_PHYSTS;
604 pHalData->ReceiveConfig = AAP | APM | AM |AB |ADD3|APWRMGT| APP_ICV | APP_MIC |ADF |ACF|AMF|HTC_LOC_CTRL|APP_PHYSTS;
606 rtw_write32(Adapter, REG_RCR, pHalData->ReceiveConfig);
608 // Accept all data frames
610 rtw_write16(Adapter, REG_RXFLTMAP2_8723B, value16);
613 // Since ADF is removed from RCR, ps-poll will not be indicate to driver,
614 // RxFilterMap should mask ps-poll to gurantee AP mode can rx ps-poll.
617 rtw_write16(Adapter, REG_RXFLTMAP1_8723B, value16);
619 // Accept all management frames
621 rtw_write16(Adapter, REG_RXFLTMAP0_8723B, value16);
634 value32 = rtw_read32(Adapter, REG_RRSR);
635 value32 &= ~RATE_BITMAP_ALL;
636 value32 |= RATE_RRSR_CCK_ONLY_1M;
637 rtw_write32(Adapter, REG_RRSR, value32);
640 //m_spIoBase->rtw_write8(REG_CFEND_TH, 0x1);
642 // SIFS (used in NAV)
643 value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10);
644 rtw_write16(Adapter, REG_SPEC_SIFS, value16);
647 value16 = _LRL(0x30) | _SRL(0x30);
648 rtw_write16(Adapter, REG_RL, value16);
657 // Set Data Auto Rate Fallback Retry Count register.
658 rtw_write32(Adapter, REG_DARFRC, 0x00000000);
659 rtw_write32(Adapter, REG_DARFRC+4, 0x10080404);
660 rtw_write32(Adapter, REG_RARFRC, 0x04030201);
661 rtw_write32(Adapter, REG_RARFRC+4, 0x08070605);
671 // Set Spec SIFS (used in NAV)
672 rtw_write16(Adapter,REG_SPEC_SIFS, 0x100a);
673 rtw_write16(Adapter,REG_MAC_SPEC_SIFS, 0x100a);
676 rtw_write16(Adapter,REG_SIFS_CTX, 0x100a);
679 rtw_write16(Adapter,REG_SIFS_TRX, 0x100a);
682 rtw_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B);
683 rtw_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F);
684 rtw_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324);
685 rtw_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226);
689 static void _InitHWLed(PADAPTER Adapter)
691 struct led_priv *pledpriv = &(Adapter->ledpriv);
693 if( pledpriv->LedStrategy != HW_LED)
698 //must consider cases of antenna diversity/ commbo card/solo card/mini card
704 _InitRDGSetting_8723bu(
708 rtw_write8(Adapter,REG_RD_CTRL_8723B,0xFF);
709 rtw_write16(Adapter, REG_RD_NAV_NXT_8723B, 0x200);
710 rtw_write8(Adapter,REG_RD_RESP_PKT_TH_8723B,0x05);
714 _InitRxSetting_8723bu(
718 rtw_write32(Adapter, REG_MACID, 0x87654321);
719 rtw_write32(Adapter, 0x0700, 0x87654321);
729 value8 = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL);
730 value8 |= EN_AMPDU_RTY_NEW;
731 rtw_write8(Adapter, REG_FWHW_TXQ_CTRL, value8);
734 rtw_write8(Adapter, REG_ACKTO, 0x40);
737 static void _InitBurstPktLen(PADAPTER padapter)
739 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
743 tmp8 = rtw_read8(padapter, REG_RXDMA_PRO_8723B);
744 tmp8 &= ~(BIT(4) | BIT(5));
745 switch (pHalData->UsbBulkOutSize) {
746 case USB_HIGH_SPEED_BULK_SIZE:
747 tmp8 |= BIT(4); // set burst pkt len=512B
749 case USB_FULL_SPEED_BULK_SIZE:
751 tmp8 |= BIT(5); // set burst pkt len=64B
754 tmp8 |= BIT(1) | BIT(2) | BIT(3);
755 rtw_write8(padapter, REG_RXDMA_PRO_8723B, tmp8);
757 pHalData->bSupportUSB3 = _FALSE;
759 tmp8 = rtw_read8(padapter, REG_HT_SINGLE_AMPDU_8723B);
760 tmp8 |= BIT(7); // enable single pkt ampdu
761 rtw_write8(padapter, REG_HT_SINGLE_AMPDU_8723B, tmp8);
762 rtw_write16(padapter, REG_MAX_AGGR_NUM, 0x0C14);
763 rtw_write8(padapter, REG_AMPDU_MAX_TIME_8723B, 0x5E);
764 rtw_write32(padapter, REG_AMPDU_MAX_LENGTH_8723B, 0xffffffff);
765 if (pHalData->AMPDUBurstMode)
766 rtw_write8(padapter, REG_AMPDU_BURST_MODE_8723B, 0x5F);
768 // for VHT packet length 11K
769 rtw_write8(padapter, REG_RX_PKT_LIMIT, 0x18);
771 rtw_write8(padapter, REG_PIFS, 0x00);
772 rtw_write8(padapter, REG_FWHW_TXQ_CTRL, 0x80);
773 rtw_write32(padapter, REG_FAST_EDCA_CTRL, 0x03086666);
774 rtw_write8(padapter, REG_USTIME_TSF_8723B, 0x50);
775 rtw_write8(padapter, REG_USTIME_EDCA_8723B, 0x50);
777 // to prevent mac is reseted by bus. 20111208, by Page
778 tmp8 = rtw_read8(padapter, REG_RSV_CTRL);
779 tmp8 |= BIT(5) | BIT(6);
780 rtw_write8(padapter, REG_RSV_CTRL, tmp8);
783 /*-----------------------------------------------------------------------------
784 * Function: usb_AggSettingTxUpdate()
786 * Overview: Seperate TX/RX parameters update independent for TP detection and
787 * dynamic TX/RX aggreagtion parameters update.
791 * Output/Return: NONE
795 * 12/10/2010 MHC Seperate to smaller function.
797 *---------------------------------------------------------------------------*/
799 usb_AggSettingTxUpdate(
803 #ifdef CONFIG_USB_TX_AGGREGATION
804 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
805 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
808 if(Adapter->registrypriv.wifi_spec)
809 pHalData->UsbTxAggMode = _FALSE;
811 if(pHalData->UsbTxAggMode){
812 value32 = rtw_read32(Adapter, REG_DWBCN0_CTRL_8723B);
813 value32 = value32 & ~(BLK_DESC_NUM_MASK << BLK_DESC_NUM_SHIFT);
814 value32 |= ((pHalData->UsbTxAggDescNum & BLK_DESC_NUM_MASK) << BLK_DESC_NUM_SHIFT);
816 rtw_write32(Adapter, REG_DWBCN0_CTRL_8723B, value32);
817 rtw_write8(Adapter, REG_DWBCN1_CTRL_8723B, pHalData->UsbTxAggDescNum<<1);
821 } // usb_AggSettingTxUpdate
824 /*-----------------------------------------------------------------------------
825 * Function: usb_AggSettingRxUpdate()
827 * Overview: Seperate TX/RX parameters update independent for TP detection and
828 * dynamic TX/RX aggreagtion parameters update.
832 * Output/Return: NONE
834 *---------------------------------------------------------------------------*/
835 static void usb_AggSettingRxUpdate(PADAPTER padapter)
837 PHAL_DATA_TYPE pHalData;
843 pHalData = GET_HAL_DATA(padapter);
845 aggctrl = rtw_read8(padapter, REG_TRXDMA_CTRL);
846 aggctrl &= ~RXDMA_AGG_EN;
848 aggrx = rtw_read32(padapter, REG_RXDMA_AGG_PG_TH);
849 aggrx &= ~BIT_USB_RXDMA_AGG_EN;
850 aggrx &= ~0xFF0F; // reset agg size and timeout
852 #ifdef CONFIG_USB_RX_AGGREGATION
853 switch(pHalData->UsbRxAggMode) {
855 agg_size = pHalData->UsbRxAggPageCount << 10;
856 if (agg_size > RX_DMA_BOUNDARY_8723B)
857 agg_size = RX_DMA_BOUNDARY_8723B >> 1;
858 if ((agg_size + 2048) > MAX_RECVBUF_SZ)
859 agg_size = MAX_RECVBUF_SZ - 2048;
860 agg_size >>= 10; /* unit: 1K */
864 aggctrl |= RXDMA_AGG_EN;
865 aggrx |= BIT_USB_RXDMA_AGG_EN;
867 aggrx |= (pHalData->UsbRxAggPageTimeout << 8);
868 DBG_8192C("%s: RX Agg-DMA mode, size=%dKB, timeout=%dus\n",
869 __func__, agg_size, pHalData->UsbRxAggPageTimeout*32);
874 agg_size = pHalData->UsbRxAggBlockCount << 12;
875 if ((agg_size + 2048) > MAX_RECVBUF_SZ)
876 agg_size = MAX_RECVBUF_SZ - 2048;
877 agg_size >>= 12; /* unit: 4K */
881 aggctrl |= RXDMA_AGG_EN;
882 aggrx &= ~BIT_USB_RXDMA_AGG_EN;
884 aggrx |= (pHalData->UsbRxAggBlockTimeout << 8);
885 DBG_8192C("%s: RX Agg-USB mode, size=%dKB, timeout=%dus\n",
886 __func__, agg_size*4, pHalData->UsbRxAggBlockTimeout*32);
889 case USB_RX_AGG_DISABLE:
891 DBG_8192C("%s: RX Aggregation Disable!\n", __FUNCTION__);
894 #endif // CONFIG_USB_RX_AGGREGATION
896 rtw_write8(padapter, REG_TRXDMA_CTRL, aggctrl);
897 rtw_write32(padapter, REG_RXDMA_AGG_PG_TH, aggrx);
901 _initUsbAggregationSetting(
905 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
907 // Tx aggregation setting
908 usb_AggSettingTxUpdate(Adapter);
910 // Rx aggregation setting
911 usb_AggSettingRxUpdate(Adapter);
913 // 201/12/10 MH Add for USB agg mode dynamic switch.
914 pHalData->UsbRxHighSpeedMode = _FALSE;
918 PHY_InitAntennaSelection8723B(
922 // TODO: <20130114, Kordan> The following setting is only for DPDT and Fixed board type.
923 // TODO: A better solution is configure it according EFUSE during the run-time.
924 PHY_SetMacReg(Adapter, 0x64, BIT20, 0x0); //0x66[4]=0
925 PHY_SetMacReg(Adapter, 0x64, BIT24, 0x0); //0x66[8]=0
926 PHY_SetMacReg(Adapter, 0x40, BIT4, 0x0); //0x40[4]=0
927 PHY_SetMacReg(Adapter, 0x40, BIT3, 0x1); //0x40[3]=1
928 PHY_SetMacReg(Adapter, 0x4C, BIT24, 0x1); //0x4C[24:23]=10
929 PHY_SetMacReg(Adapter, 0x4C, BIT23, 0x0); //0x4C[24:23]=10
930 PHY_SetBBReg(Adapter, 0x944, BIT1|BIT0, 0x3); //0x944[1:0]=11
931 PHY_SetBBReg(Adapter, 0x930, bMaskByte0, 0x77); //0x930[7:0]=77
932 PHY_SetMacReg(Adapter, 0x38, BIT11, 0x1); //0x38[11]=1
935 static VOID _InitAdhocWorkaroundParams(IN PADAPTER Adapter)
937 #ifdef CONFIG_ADHOC_WORKAROUND_SETTING
938 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
939 pHalData->RegBcnCtrlVal = rtw_read8(Adapter, REG_BCN_CTRL);
940 pHalData->RegTxPause = rtw_read8(Adapter, REG_TXPAUSE);
941 pHalData->RegFwHwTxQCtrl = rtw_read8(Adapter, REG_FWHW_TXQ_CTRL+2);
942 pHalData->RegReg542 = rtw_read8(Adapter, REG_TBTT_PROHIBIT+2);
946 // Set CCK and OFDM Block "ON"
947 static VOID _BBTurnOnBlock(
955 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1);
956 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1);
959 #define MgntActSet_RF_State(...)
967 // 2010/08/09 MH Add for power down check.
970 HalDetectPwrDownMode(
975 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
976 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);
978 EFUSE_ShadowRead(Adapter, 1, EEPROM_FEATURE_OPTION_8723B, (u32 *)&tmpvalue);
980 // 2010/08/25 MH INF priority > PDN Efuse value.
981 if(tmpvalue & BIT4 && pwrctrlpriv->reg_pdnmode)
983 pHalData->pwrdown = _TRUE;
987 pHalData->pwrdown = _FALSE;
990 DBG_8192C("HalDetectPwrDownMode(): PDN=%d\n", pHalData->pwrdown);
991 return pHalData->pwrdown;
993 } // HalDetectPwrDownMode
997 // 2010/08/26 MH Add for selective suspend mode check.
998 // If Efuse 0x0e bit1 is not enabled, we can not support selective suspend for Minicard and
1002 HalDetectSelectiveSuspendMode(
1008 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1009 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
1011 // If support HW radio detect, we need to enable WOL ability, otherwise, we
1012 // can not use FW to notify host the power state switch.
1014 EFUSE_ShadowRead(Adapter, 1, EEPROM_USB_OPTIONAL1, (u32 *)&tmpvalue);
1016 DBG_8192C("HalDetectSelectiveSuspendMode(): SS ");
1019 DBG_8192C("Enable\n");
1023 DBG_8192C("Disable\n");
1024 pdvobjpriv->RegUsbSS = _FALSE;
1027 // 2010/09/01 MH According to Dongle Selective Suspend INF. We can switch SS mode.
1028 if (pdvobjpriv->RegUsbSS && !SUPPORT_HW_RADIO_DETECT(pHalData))
1030 //PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
1032 //if (!pMgntInfo->bRegDongleSS)
1034 // RT_TRACE(COMP_INIT, DBG_LOUD, ("Dongle disable SS\n"));
1035 pdvobjpriv->RegUsbSS = _FALSE;
1039 } // HalDetectSelectiveSuspendMode
1040 /*-----------------------------------------------------------------------------
1041 * Function: HwSuspendModeEnable92Cu()
1043 * Overview: HW suspend mode switch.
1053 * 08/23/2010 MHC HW suspend mode switch test..
1054 *---------------------------------------------------------------------------*/
1056 HwSuspendModeEnable92Cu(
1057 IN PADAPTER pAdapter,
1061 //PRT_USB_DEVICE pDevice = GET_RT_USB_DEVICE(pAdapter);
1062 u16 reg = rtw_read16(pAdapter, REG_GPIO_MUXCFG);
1064 //if (!pDevice->RegUsbSS)
1070 // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW
1071 // to enter suspend mode automatically. Otherwise, it will shut down major power
1072 // domain and 8051 will stop. When we try to enter selective suspend mode, we
1073 // need to prevent HW to enter D2 mode aumotmatically. Another way, Host will
1074 // issue a S10 signal to power domain. Then it will cleat SIC setting(from Yngli).
1075 // We need to enable HW suspend mode when enter S3/S4 or disable. We need
1076 // to disable HW suspend mode for IPS/radio_off.
1078 //RT_TRACE(COMP_RF, DBG_LOUD, ("HwSuspendModeEnable92Cu = %d\n", Type));
1082 //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg));
1083 rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg);
1085 //RT_TRACE(COMP_RF, DBG_LOUD, ("REG_GPIO_MUXCFG = %x\n", reg));
1086 rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg);
1091 rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg);
1093 rtw_write16(pAdapter, REG_GPIO_MUXCFG, reg);
1096 } // HwSuspendModeEnable92Cu
1097 rt_rf_power_state RfOnOffDetect(IN PADAPTER pAdapter )
1099 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
1101 rt_rf_power_state rfpowerstate = rf_off;
1103 if(adapter_to_pwrctl(pAdapter)->bHWPowerdown)
1105 val8 = rtw_read8(pAdapter, REG_HSISR);
1106 DBG_8192C("pwrdown, 0x5c(BIT7)=%02x\n", val8);
1107 rfpowerstate = (val8 & BIT7) ? rf_off: rf_on;
1111 rtw_write8( pAdapter, REG_MAC_PINMUX_CFG,rtw_read8(pAdapter, REG_MAC_PINMUX_CFG)&~(BIT3));
1112 val8 = rtw_read8(pAdapter, REG_GPIO_IO_SEL);
1113 DBG_8192C("GPIO_IN=%02x\n", val8);
1114 rfpowerstate = (val8 & BIT3) ? rf_on : rf_off;
1116 return rfpowerstate;
1117 } // HalDetectPwrDownMode
1119 void _ps_open_RF(_adapter *padapter);
1121 u32 rtl8723bu_hal_init(PADAPTER padapter)
1123 u8 value8 = 0, u1bRegCR;
1124 u32 boundary, status = _SUCCESS;
1125 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(padapter);
1126 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(padapter);
1127 struct registry_priv *pregistrypriv = &padapter->registrypriv;
1128 rt_rf_power_state eRfPowerStateToSet;
1129 u32 NavUpper = WiFiNavUpperUs;
1131 u32 init_start_time = rtw_get_current_time();
1134 #ifdef DBG_HAL_INIT_PROFILING
1136 enum HAL_INIT_STAGES {
1137 HAL_INIT_STAGES_BEGIN = 0,
1138 HAL_INIT_STAGES_INIT_PW_ON,
1139 HAL_INIT_STAGES_INIT_LLTT,
1140 HAL_INIT_STAGES_MISC01,
1141 HAL_INIT_STAGES_DOWNLOAD_FW,
1142 HAL_INIT_STAGES_MAC,
1145 HAL_INIT_STAGES_MISC02,
1146 HAL_INIT_STAGES_TURN_ON_BLOCK,
1147 HAL_INIT_STAGES_INIT_SECURITY,
1148 HAL_INIT_STAGES_MISC11,
1149 //HAL_INIT_STAGES_RF_PS,
1150 HAL_INIT_STAGES_INIT_HAL_DM,
1151 // HAL_INIT_STAGES_IQK,
1152 // HAL_INIT_STAGES_PW_TRACK,
1153 // HAL_INIT_STAGES_LCK,
1154 HAL_INIT_STAGES_MISC21,
1155 //HAL_INIT_STAGES_INIT_PABIAS,
1156 HAL_INIT_STAGES_BT_COEXIST,
1157 //HAL_INIT_STAGES_ANTENNA_SEL,
1158 HAL_INIT_STAGES_MISC31,
1159 HAL_INIT_STAGES_END,
1163 char * hal_init_stages_str[] = {
1164 "HAL_INIT_STAGES_BEGIN",
1165 "HAL_INIT_STAGES_INIT_PW_ON",
1166 "HAL_INIT_STAGES_INIT_LLTT",
1167 "HAL_INIT_STAGES_MISC01",
1168 "HAL_INIT_STAGES_DOWNLOAD_FW",
1169 "HAL_INIT_STAGES_MAC",
1170 "HAL_INIT_STAGES_BB",
1171 "HAL_INIT_STAGES_RF",
1172 "HAL_INIT_STAGES_MISC02",
1173 "HAL_INIT_STAGES_TURN_ON_BLOCK",
1174 "HAL_INIT_STAGES_INIT_SECURITY",
1175 "HAL_INIT_STAGES_MISC11",
1176 //"HAL_INIT_STAGES_RF_PS",
1177 "HAL_INIT_STAGES_INIT_HAL_DM",
1178 // "HAL_INIT_STAGES_IQK",
1179 // "HAL_INIT_STAGES_PW_TRACK",
1180 // "HAL_INIT_STAGES_LCK",
1181 "HAL_INIT_STAGES_MISC21",
1182 //"HAL_INIT_STAGES_INIT_PABIAS",
1183 "HAL_INIT_STAGES_BT_COEXIST",
1184 //"HAL_INIT_STAGES_ANTENNA_SEL",
1185 "HAL_INIT_STAGES_MISC31",
1186 "HAL_INIT_STAGES_END",
1189 int hal_init_profiling_i;
1190 u32 hal_init_stages_timestamp[HAL_INIT_STAGES_NUM]; //used to record the time of each stage's starting point
1192 for(hal_init_profiling_i=0;hal_init_profiling_i<HAL_INIT_STAGES_NUM;hal_init_profiling_i++)
1193 hal_init_stages_timestamp[hal_init_profiling_i]=0;
1195 #define HAL_INIT_PROFILE_TAG(stage) hal_init_stages_timestamp[(stage)]=rtw_get_current_time();
1197 #define HAL_INIT_PROFILE_TAG(stage) do {} while(0)
1198 #endif //DBG_HAL_INIT_PROFILING
1204 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BEGIN);
1206 // if(Adapter->bSurpriseRemoved)
1209 // Check if MAC has already power on.
1210 value8 = rtw_read8(padapter, REG_SYS_CLKR_8723B+1);
1211 u1bRegCR = rtw_read8(padapter, REG_CR_8723B);
1212 DBG_871X(" power-on :REG_SYS_CLKR 0x09=0x%02x. REG_CR 0x100=0x%02x.\n", value8, u1bRegCR);
1213 if((value8&BIT3) && (u1bRegCR != 0 && u1bRegCR != 0xEA))
1215 DBG_871X(" MAC has already power on.\n");
1219 // Set FwPSState to ALL_ON mode to prevent from the I/O be return because of 32k
1220 // state which is set before sleep under wowlan mode. 2012.01.04. by tynli.
1221 //pHalData->FwPSState = FW_PS_STATE_ALL_ON_88E;
1222 DBG_871X(" MAC has not been powered on yet.\n");
1225 #ifdef CONFIG_WOWLAN
1226 if(rtw_read8(padapter, REG_MCUFWDL)&BIT7 &&
1227 (pwrctrlpriv->wowlan_wake_reason & FWDecisionDisconnect)) {
1229 DBG_871X("+Reset Entry+\n");
1230 rtw_write8(padapter, REG_MCUFWDL, 0x00);
1231 _8051Reset8723(padapter);
1233 reg_val = rtw_read8(padapter, REG_SYS_FUNC_EN);
1234 reg_val &= ~(BIT(0) | BIT(1));
1235 rtw_write8(padapter, REG_SYS_FUNC_EN, reg_val);
1237 rtw_write8(padapter, REG_RF_CTRL, 0);
1239 rtw_write16(padapter, REG_CR, 0);
1240 //reset MAC, Digital Core
1241 reg_val = rtw_read8(padapter, REG_SYS_FUNC_EN+1);
1242 reg_val &= ~(BIT(4) | BIT(7));
1243 rtw_write8(padapter, REG_SYS_FUNC_EN+1, reg_val);
1244 reg_val = rtw_read8(padapter, REG_SYS_FUNC_EN+1);
1245 reg_val |= BIT(4) | BIT(7);
1246 rtw_write8(padapter, REG_SYS_FUNC_EN+1, reg_val);
1247 DBG_871X("-Reset Entry-\n");
1249 #endif //CONFIG_WOWLAN
1251 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PW_ON);
1252 status = _InitPowerOn_8723BU(padapter);
1253 if(status == _FAIL){
1254 RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Failed to init power on!\n"));
1259 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_LLTT);
1260 if (!pregistrypriv->wifi_spec) {
1261 boundary = TX_PAGE_BOUNDARY_8723B;
1264 boundary = WMM_NORMAL_TX_PAGE_BOUNDARY_8723B;
1266 status = rtl8723b_InitLLTTable(padapter);
1267 if(status == _FAIL){
1268 RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("Failed to init LLT table\n"));
1272 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC01);
1273 if(pHalData->bRDGEnable){
1274 _InitRDGSetting_8723bu(padapter);
1279 //Enable Tx Report Timer
1280 value8 = rtw_read8(padapter, REG_TX_RPT_CTRL);
1281 rtw_write8(padapter, REG_TX_RPT_CTRL, value8|BIT1);
1283 rtw_write8(padapter, REG_TX_RPT_CTRL+1, 2);
1284 //Tx RPT Timer. Unit: 32us
1285 rtw_write16(padapter, REG_TX_RPT_TIME, 0xCdf0);
1287 #ifdef CONFIG_TX_EARLY_MODE
1288 if(pHalData->AMPDUBurstMode)
1290 RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("EarlyMode Enabled!!!\n"));
1292 value8 = rtw_read8(padapter, REG_EARLY_MODE_CONTROL_8723B);
1293 #if RTL8723B_EARLY_MODE_PKT_NUM_10 == 1
1294 value8 = value8|0x1f;
1296 value8 = value8|0xf;
1298 rtw_write8(padapter, REG_EARLY_MODE_CONTROL_8723B, value8);
1300 rtw_write8(padapter, REG_EARLY_MODE_CONTROL_8723B+3, 0x80);
1302 value8 = rtw_read8(padapter, REG_TCR_8723B+1);
1303 value8 = value8|0x40;
1304 rtw_write8(padapter,REG_TCR_8723B+1, value8);
1307 rtw_write8(padapter,REG_EARLY_MODE_CONTROL_8723B, 0);
1310 // <Kordan> InitHalDm should be put ahead of FirmwareDownload. (HWConfig flow: FW->MAC->-BB->RF)
1311 //InitHalDm(Adapter);
1313 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_DOWNLOAD_FW);
1314 #if (1 == MP_DRIVER)
1315 if (padapter->registrypriv.mp_mode == 1)
1317 _InitRxSetting_8723bu(padapter);
1322 status = rtl8723b_FirmwareDownload(padapter,_FALSE);
1323 if(status != _SUCCESS)
1325 padapter->bFWReady = _FALSE;
1326 pHalData->fw_ractrl = _FALSE;
1327 DBG_871X("fw download fail!\n");
1332 padapter->bFWReady = _TRUE;
1333 pHalData->fw_ractrl = _TRUE;
1334 DBG_871X("fw download ok!\n");
1338 rtl8723b_InitializeFirmwareVars(padapter);
1340 if(pwrctrlpriv->reg_rfoff == _TRUE){
1341 pwrctrlpriv->rf_pwrstate = rf_off;
1344 // Set RF type for BB/RF configuration
1345 //_InitRFType(Adapter);
1347 // We should call the function before MAC/BB configuration.
1348 PHY_InitAntennaSelection8723B(padapter);
1352 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MAC);
1353 #if (HAL_MAC_ENABLE == 1)
1354 status = PHY_MACConfig8723B(padapter);
1357 DBG_871X("PHY_MACConfig8723B fault !!\n");
1363 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BB);
1365 //d. Initialize BB related configurations.
1367 #if (HAL_BB_ENABLE == 1)
1368 status = PHY_BBConfig8723B(padapter);
1371 DBG_871X("PHY_BBConfig8723B fault !!\n");
1379 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_RF);
1380 #if (HAL_RF_ENABLE == 1)
1381 status = PHY_RFConfig8723B(padapter);
1385 DBG_871X("PHY_RFConfig8723B fault !!\n");
1395 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC02);
1396 _InitQueueReservedPage(padapter);
1397 _InitTxBufferBoundary(padapter);
1398 _InitQueuePriority(padapter);
1399 _InitPageBoundary(padapter);
1400 _InitTransferPageSize_8723bu(padapter);
1403 // Get Rx PHY status in order to report RSSI and others.
1404 _InitDriverInfoSize(padapter, DRVINFO_SZ);
1406 _InitInterrupt(padapter);
1407 hal_init_macaddr(padapter);//set mac_address
1408 _InitNetworkType(padapter);//set msr
1409 _InitWMACSetting(padapter);
1410 _InitAdaptiveCtrl(padapter);
1411 _InitEDCA(padapter);
1412 _InitRateFallback(padapter);
1413 _InitRetryFunction(padapter);
1414 // _InitOperationMode(Adapter);//todo
1415 rtl8723b_InitBeaconParameters(padapter);
1416 rtl8723b_InitBeaconMaxError(padapter, _TRUE);
1418 _InitBurstPktLen(padapter);
1419 _initUsbAggregationSetting(padapter);
1421 #ifdef ENABLE_USB_DROP_INCORRECT_OUT
1422 _InitHardwareDropIncorrectBulkOut(padapter);
1425 #if defined(CONFIG_CONCURRENT_MODE) || defined(CONFIG_TX_MCAST2UNI)
1427 #ifdef CONFIG_CHECK_AC_LIFETIME
1428 // Enable lifetime check for the four ACs
1429 rtw_write8(padapter, REG_LIFETIME_CTRL, 0x0F);
1430 #endif // CONFIG_CHECK_AC_LIFETIME
1432 #ifdef CONFIG_TX_MCAST2UNI
1433 rtw_write16(padapter, REG_PKT_VO_VI_LIFE_TIME, 0x0400); // unit: 256us. 256ms
1434 rtw_write16(padapter, REG_PKT_BE_BK_LIFE_TIME, 0x0400); // unit: 256us. 256ms
1435 #else // CONFIG_TX_MCAST2UNI
1436 rtw_write16(padapter, REG_PKT_VO_VI_LIFE_TIME, 0x3000); // unit: 256us. 3s
1437 rtw_write16(padapter, REG_PKT_BE_BK_LIFE_TIME, 0x3000); // unit: 256us. 3s
1438 #endif // CONFIG_TX_MCAST2UNI
1439 #endif // CONFIG_CONCURRENT_MODE || CONFIG_TX_MCAST2UNI
1443 _InitHWLed(padapter);
1446 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_TURN_ON_BLOCK);
1447 _BBTurnOnBlock(padapter);
1448 //NicIFSetMacAddress(padapter, padapter->PermanentAddress);
1451 rtw_hal_set_chnl_bw(padapter, padapter->registrypriv.channel,
1452 CHANNEL_WIDTH_20, HAL_PRIME_CHNL_OFFSET_DONT_CARE, HAL_PRIME_CHNL_OFFSET_DONT_CARE);
1454 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_SECURITY);
1455 invalidate_cam_all(padapter);
1457 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC11);
1458 // 2010/12/17 MH We need to set TX power according to EFUSE content at first.
1459 //PHY_SetTxPowerLevel8723B(padapter, pHalData->CurrentChannel);
1460 rtl8723b_InitAntenna_Selection(padapter);
1463 //set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM.
1464 rtw_write8(padapter,REG_HWSEQ_CTRL, 0xFF);
1467 // Disable BAR, suggested by Scott
1468 // 2010.04.09 add by hpfan
1470 rtw_write32(padapter, REG_BAR_MODE_CTRL, 0x0201ffff);
1472 if(pregistrypriv->wifi_spec)
1473 rtw_write16(padapter,REG_FAST_EDCA_CTRL ,0);
1475 // Move by Neo for USB SS from above setp
1477 // _RfPowerSave(Adapter);
1479 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_HAL_DM);
1480 rtl8723b_InitHalDm(padapter);
1482 #if (MP_DRIVER == 1)
1483 if (padapter->registrypriv.mp_mode == 1)
1485 padapter->mppriv.channel = pHalData->CurrentChannel;
1486 MPT_InitializeAdapter(padapter, padapter->mppriv.channel);
1491 pwrctrlpriv->rf_pwrstate = rf_on;
1493 if (pwrctrlpriv->rf_pwrstate == rf_on)
1495 struct pwrctrl_priv *pwrpriv;
1501 pwrpriv = adapter_to_pwrctl(padapter);
1503 PHY_LCCalibrate_8723B(&pHalData->odmpriv);
1505 /* Inform WiFi FW that it is the beginning of IQK */
1507 FillH2CCmd8723B(padapter, H2C_8723B_BT_WLAN_CALIBRATION, 1, &h2cCmdBuf);
1509 start_time = rtw_get_current_time();
1511 if (rtw_read8(padapter, 0x1e7) & 0x01)
1515 } while (rtw_get_passing_time_ms(start_time) <= 400);
1517 #ifdef CONFIG_BT_COEXIST
1518 rtw_btcoex_IQKNotify(padapter, _TRUE);
1520 restore_iqk_rst = (pwrpriv->bips_processing==_TRUE)?_TRUE:_FALSE;
1521 b2Ant = pHalData->EEPROMBluetoothAntNum==Ant_x2?_TRUE:_FALSE;
1522 PHY_IQCalibrate_8723B(padapter, _FALSE, restore_iqk_rst, b2Ant, pHalData->ant_path);
1523 pHalData->bIQKInitialized = _TRUE;
1524 #ifdef CONFIG_BT_COEXIST
1525 rtw_btcoex_IQKNotify(padapter, _FALSE);
1528 /* Inform WiFi FW that it is the finish of IQK */
1530 FillH2CCmd8723B(padapter, H2C_8723B_BT_WLAN_CALIBRATION, 1, &h2cCmdBuf);
1532 ODM_TXPowerTrackingCheck(&pHalData->odmpriv);
1537 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC21);
1539 //HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_INIT_PABIAS);
1540 // _InitPABias(Adapter);
1542 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_BT_COEXIST);
1543 #ifdef CONFIG_BT_COEXIST
1544 // Init BT hw config.
1545 rtw_btcoex_HAL_Initialize(padapter, _FALSE);
1547 rtw_btcoex_HAL_Initialize(padapter, _TRUE);
1551 // 2010/05/20 MH We need to init timer after update setting. Otherwise, we can not get correct inf setting.
1552 // 2010/05/18 MH For SE series only now. Init GPIO detect time
1553 if(pDevice->RegUsbSS)
1555 RT_TRACE(COMP_INIT, DBG_LOUD, (" call GpioDetectTimerStart8192CU\n"));
1556 GpioDetectTimerStart8192CU(Adapter); // Disable temporarily
1559 // 2010/08/23 MH According to Alfred's suggestion, we need to to prevent HW enter
1560 // suspend mode automatically.
1561 HwSuspendModeEnable92Cu(Adapter, _FALSE);
1564 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_MISC31);
1565 rtw_hal_set_hwreg(padapter, HW_VAR_NAV_UPPER, (u8*)&NavUpper);
1567 #ifdef CONFIG_XMIT_ACK
1568 //ack for xmit mgmt frames.
1569 rtw_write32(padapter, REG_FWHW_TXQ_CTRL, rtw_read32(padapter, REG_FWHW_TXQ_CTRL)|BIT(12));
1570 #endif //CONFIG_XMIT_ACK
1572 // Enable MACTXEN/MACRXEN block
1573 u1bRegCR = rtw_read8(padapter, REG_CR);
1574 u1bRegCR |= (MACTXEN | MACRXEN);
1575 rtw_write8(padapter, REG_CR, u1bRegCR);
1577 //_dbg_dump_macreg(Adapter);
1580 HAL_INIT_PROFILE_TAG(HAL_INIT_STAGES_END);
1582 DBG_871X("%s in %dms\n", __FUNCTION__, rtw_get_passing_time_ms(init_start_time));
1584 #ifdef DBG_HAL_INIT_PROFILING
1585 hal_init_stages_timestamp[HAL_INIT_STAGES_END]=rtw_get_current_time();
1587 for(hal_init_profiling_i=0;hal_init_profiling_i<HAL_INIT_STAGES_NUM-1;hal_init_profiling_i++) {
1588 DBG_871X("DBG_HAL_INIT_PROFILING: %35s, %u, %5u, %5u\n"
1589 , hal_init_stages_str[hal_init_profiling_i]
1590 , hal_init_stages_timestamp[hal_init_profiling_i]
1591 , (hal_init_stages_timestamp[hal_init_profiling_i+1]-hal_init_stages_timestamp[hal_init_profiling_i])
1592 , rtw_get_time_interval_ms(hal_init_stages_timestamp[hal_init_profiling_i], hal_init_stages_timestamp[hal_init_profiling_i+1])
1608 /***************************************
1609 j. GPIO_PIN_CTRL 0x44[31:0]=0x000 //
1610 k. Value = GPIO_PIN_CTRL[7:0]
1611 l. GPIO_PIN_CTRL 0x44[31:0] = 0x00FF0000 | (value <<8); //write external PIN level
1612 m. GPIO_MUXCFG 0x42 [15:0] = 0x0780
1613 n. LEDCFG 0x4C[15:0] = 0x8080
1614 ***************************************/
1619 //1. Disable GPIO[7:0]
1620 rtw_write16(Adapter, REG_GPIO_PIN_CTRL+2, 0x0000);
1621 value32 = rtw_read32(Adapter, REG_GPIO_PIN_CTRL) & 0xFFFF00FF;
1622 value8 = (u8) (value32&0x000000FF);
1623 value32 |= ((value8<<8) | 0x00FF0000);
1624 rtw_write32(Adapter, REG_GPIO_PIN_CTRL, value32);
1626 //2. Disable GPIO[10:8]
1627 rtw_write8(Adapter, REG_GPIO_MUXCFG+3, 0x00);
1628 value16 = rtw_read16(Adapter, REG_GPIO_MUXCFG+2) & 0xFF0F;
1629 value8 = (u8) (value16&0x000F);
1630 value16 |= ((value8<<4) | 0x0780);
1631 rtw_write16(Adapter, REG_GPIO_MUXCFG+2, value16);
1633 //3. Disable LED0 & 1
1634 rtw_write16(Adapter, REG_LEDCFG0, 0x8080);
1636 //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable GPIO and LED.\n"));
1638 } //end of _DisableGPIO()
1641 _ResetFWDownloadRegister(
1647 value32 = rtw_read32(Adapter, REG_MCUFWDL);
1648 value32 &= ~(MCUFWDL_EN | MCUFWDL_RDY);
1649 rtw_write32(Adapter, REG_MCUFWDL, value32);
1650 //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset FW download register.\n"));
1661 value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN);
1662 value16 &= ~(FEN_BBRSTB | FEN_BB_GLB_RSTn);
1663 rtw_write16(Adapter, REG_SYS_FUNC_EN, value16);
1664 //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset BB.\n"));
1675 value16 = rtw_read16(Adapter, REG_SYS_FUNC_EN);
1676 value16 &= ~FEN_CPUEN;
1677 rtw_write16(Adapter, REG_SYS_FUNC_EN, value16);
1678 //RT_TRACE(COMP_INIT, DBG_LOUD, ("Reset MCU.\n"));
1682 _DisableMAC_AFE_PLL(
1688 //disable MAC/ AFE PLL
1689 value32 = rtw_read32(Adapter, REG_APS_FSMCO);
1690 value32 |= APDM_MAC;
1691 rtw_write32(Adapter, REG_APS_FSMCO, value32);
1693 value32 |= APFM_OFF;
1694 rtw_write32(Adapter, REG_APS_FSMCO, value32);
1695 //RT_TRACE(COMP_INIT, DBG_LOUD, ("Disable MAC, AFE PLL.\n"));
1699 _AutoPowerDownToHostOff(
1704 rtw_write8(Adapter, REG_SPS0_CTRL, 0x22);
1706 value32 = rtw_read32(Adapter, REG_APS_FSMCO);
1708 value32 |= APDM_HOST;//card disable
1709 rtw_write32(Adapter, REG_APS_FSMCO, value32);
1710 //RT_TRACE(COMP_INIT, DBG_LOUD, ("Auto Power Down to Host-off state.\n"));
1713 value32 = rtw_read32(Adapter, REG_APS_FSMCO);
1714 value32 &= ~AFSM_PCIE;
1715 rtw_write32(Adapter, REG_APS_FSMCO, value32);
1726 value32 = rtw_read32(Adapter, REG_APS_FSMCO);
1729 value32 |= AFSM_HSUS;
1730 rtw_write32(Adapter, REG_APS_FSMCO, value32);
1732 //RT_ASSERT(0 == (rtw_read32(Adapter, REG_APS_FSMCO) & BIT(12)),(""));
1733 //RT_TRACE(COMP_INIT, DBG_LOUD, ("Set USB suspend.\n"));
1738 _DisableRFAFEAndResetBB(
1742 /**************************************
1743 a. TXPAUSE 0x522[7:0] = 0xFF //Pause MAC TX queue
1744 b. RF path 0 offset 0x00 = 0x00 // disable RF
1745 c. APSD_CTRL 0x600[7:0] = 0x40
1746 d. SYS_FUNC_EN 0x02[7:0] = 0x16 //reset BB state machine
1747 e. SYS_FUNC_EN 0x02[7:0] = 0x14 //reset BB state machine
1748 ***************************************/
1749 u8 eRFPath = 0,value8 = 0;
1750 rtw_write8(Adapter, REG_TXPAUSE, 0xFF);
1751 PHY_SetRFReg(Adapter, eRFPath, 0x0, bMaskByte0, 0x0);
1754 rtw_write8(Adapter, REG_APSD_CTRL, value8);//0x40
1757 value8 |=( FEN_USBD | FEN_USBA | FEN_BB_GLB_RSTn);
1758 rtw_write8(Adapter, REG_SYS_FUNC_EN,value8 );//0x16
1760 value8 &=( ~FEN_BB_GLB_RSTn );
1761 rtw_write8(Adapter, REG_SYS_FUNC_EN, value8); //0x14
1763 //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> RF off and reset BB.\n"));
1767 _ResetDigitalProcedure1(
1768 IN PADAPTER Adapter,
1769 IN BOOLEAN bWithoutHWSM
1773 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1775 if(pHalData->FirmwareVersion <= 0x20){
1777 /*****************************
1778 f. SYS_FUNC_EN 0x03[7:0]=0x54 // reset MAC register, DCORE
1779 g. MCUFWDL 0x80[7:0]=0 // reset MCU ready status
1780 ******************************/
1782 PlatformIOWrite1Byte(Adapter, REG_SYS_FUNC_EN+1, 0x54);
1783 PlatformIOWrite1Byte(Adapter, REG_MCUFWDL, 0);
1785 /*****************************
1786 f. MCUFWDL 0x80[7:0]=0 // reset MCU ready status
1787 g. SYS_FUNC_EN 0x02[10]= 0 // reset MCU register, (8051 reset)
1788 h. SYS_FUNC_EN 0x02[15-12]= 5 // reset MAC register, DCORE
1789 i. SYS_FUNC_EN 0x02[10]= 1 // enable MCU register, (8051 enable)
1790 ******************************/
1792 rtw_write8(Adapter, REG_MCUFWDL, 0);
1794 valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN);
1795 rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 & (~FEN_CPUEN)));//reset MCU ,8051
1797 valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN)&0x0FFF;
1798 rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 |(FEN_HWPDN|FEN_ELDR)));//reset MAC
1800 #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
1803 if( (val=rtw_read8(Adapter, REG_MCUFWDL)))
1804 DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val);
1809 valu16 = rtw_read16(Adapter, REG_SYS_FUNC_EN);
1810 rtw_write16(Adapter, REG_SYS_FUNC_EN, (valu16 | FEN_CPUEN));//enable MCU ,8051
1818 if(rtw_read8(Adapter, REG_MCUFWDL) & BIT1)
1819 { //IF fw in RAM code, do reset
1821 rtw_write8(Adapter, REG_MCUFWDL, 0);
1822 if(Adapter->bFWReady){
1823 // 2010/08/25 MH Accordign to RD alfred's suggestion, we need to disable other
1824 // HRCV INT to influence 8051 reset.
1825 rtw_write8(Adapter, REG_FWIMR, 0x20);
1827 rtw_write8(Adapter, REG_HMETFR+3, 0x20);//8051 reset by self
1829 while( (retry_cnts++ <100) && (FEN_CPUEN &rtw_read16(Adapter, REG_SYS_FUNC_EN)))
1831 rtw_udelay_os(50);//PlatformStallExecution(50);//us
1834 if(retry_cnts >= 100){
1835 DBG_8192C("%s #####=> 8051 reset failed!.........................\n", __FUNCTION__);
1836 // if 8051 reset fail we trigger GPIO 0 for LA
1837 //PlatformEFIOWrite4Byte( Adapter,
1838 // REG_GPIO_PIN_CTRL,
1840 // 2010/08/31 MH According to Filen's info, if 8051 reset fail, reset MAC directly.
1841 rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x50); //Reset MAC and Enable 8051
1845 //DBG_871X("%s =====> 8051 reset success (%d) .\n", __FUNCTION__, retry_cnts);
1849 DBG_871X("%s =====> 8051 in RAM but !Adapter->bFWReady\n", __FUNCTION__);
1853 //DBG_871X("%s =====> 8051 in ROM.\n", __FUNCTION__);
1856 #ifdef DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE
1859 if( (val=rtw_read8(Adapter, REG_MCUFWDL)))
1860 DBG_871X("DBG_SHOW_MCUFWDL_BEFORE_51_ENABLE %s:%d REG_MCUFWDL:0x%02x\n", __FUNCTION__, __LINE__, val);
1864 rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x54); //Reset MAC and Enable 8051
1867 // Clear rpwm value for initial toggle bit trigger.
1868 rtw_write8(Adapter, REG_USB_HRPWM, 0x00);
1871 /*****************************
1872 Without HW auto state machine
1873 g. SYS_CLKR 0x08[15:0] = 0x30A3 //disable MAC clock
1874 h. AFE_PLL_CTRL 0x28[7:0] = 0x80 //disable AFE PLL
1875 i. AFE_XTAL_CTRL 0x24[15:0] = 0x880F //gated AFE DIG_CLOCK
1876 j. SYS_ISO_CTRL 0x00[7:0] = 0xF9 // isolated digital to PON
1877 ******************************/
1878 //rtw_write16(Adapter, REG_SYS_CLKR, 0x30A3);
1879 rtw_write16(Adapter, REG_SYS_CLKR, 0x70A3);//modify to 0x70A3 by Scott.
1880 rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x80);
1881 rtw_write16(Adapter, REG_AFE_XTAL_CTRL, 0x880F);
1882 rtw_write8(Adapter, REG_SYS_ISO_CTRL, 0xF9);
1886 // Disable all RF/BB power
1887 rtw_write8(Adapter, REG_RF_CTRL, 0x00);
1889 //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Reset Digital.\n"));
1894 _ResetDigitalProcedure2(
1898 /*****************************
1899 k. SYS_FUNC_EN 0x03[7:0] = 0x44 // disable ELDR runction
1900 l. SYS_CLKR 0x08[15:0] = 0x3083 // disable ELDR clock
1901 m. SYS_ISO_CTRL 0x01[7:0] = 0x83 // isolated ELDR to PON
1902 ******************************/
1903 //rtw_write8(Adapter, REG_SYS_FUNC_EN+1, 0x44);//marked by Scott.
1904 //rtw_write16(Adapter, REG_SYS_CLKR, 0x3083);
1905 //rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x83);
1907 rtw_write16(Adapter, REG_SYS_CLKR, 0x70a3); //modify to 0x70a3 by Scott.
1908 rtw_write8(Adapter, REG_SYS_ISO_CTRL+1, 0x82); //modify to 0x82 by Scott.
1913 IN PADAPTER Adapter,
1914 IN BOOLEAN bWithoutHWSM
1919 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
1922 /*****************************
1923 n. LDOA15_CTRL 0x20[7:0] = 0x04 // disable A15 power
1924 o. LDOV12D_CTRL 0x21[7:0] = 0x54 // disable digital core power
1925 r. When driver call disable, the ASIC will turn off remaining clock automatically
1926 ******************************/
1928 rtw_write8(Adapter, REG_LDOA15_CTRL, 0x04);
1929 //PlatformIOWrite1Byte(Adapter, REG_LDOV12D_CTRL, 0x54);
1931 value8 = rtw_read8(Adapter, REG_LDOV12D_CTRL);
1932 value8 &= (~LDV12_EN);
1933 rtw_write8(Adapter, REG_LDOV12D_CTRL, value8);
1934 //RT_TRACE(COMP_INIT, DBG_LOUD, (" REG_LDOV12D_CTRL Reg0x21:0x%02x.\n",value8));
1937 /*****************************
1938 h. SPS0_CTRL 0x11[7:0] = 0x23 //enter PFM mode
1939 i. APS_FSMCO 0x04[15:0] = 0x4802 // set USB suspend
1940 ******************************/
1945 rtw_write8(Adapter, REG_SPS0_CTRL, value8);
1950 //value16 |= (APDM_HOST | /*AFSM_HSUS |*/PFM_ALDN);
1951 // 2010/08/31 According to Filen description, we need to use HW to shut down 8051 automatically.
1952 // Becasue suspend operatione need the asistance of 8051 to wait for 3ms.
1953 value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN);
1957 value16 |= (APDM_HOST | AFSM_HSUS |PFM_ALDN);
1960 rtw_write16(Adapter, REG_APS_FSMCO,value16 );//0x4802
1962 rtw_write8(Adapter, REG_RSV_CTRL, 0x0e);
1965 //tynli_test for suspend mode.
1967 rtw_write8(Adapter, 0xfe10, 0x19);
1971 //RT_TRACE(COMP_INIT, DBG_LOUD, ("======> Disable Analog Reg0x04:0x%04x.\n",value16));
1974 static void rtl8723bu_hw_power_down(_adapter *padapter)
1978 DBG_8192C("PowerDownRTL8723U\n");
1981 // 1. Run Card Disable Flow
1982 // Done before this function call.
1984 // 2. 0x04[16] = 0 // reset WLON
1985 u1bTmp = rtw_read8(padapter, REG_APS_FSMCO+2);
1986 rtw_write8(padapter, REG_APS_FSMCO+2, (u1bTmp&(~BIT0)));
1988 // 3. 0x04[12:11] = 2b'11 // enable suspend
1989 // Done before this function call.
1991 // 4. 0x04[15] = 1 // enable PDN
1992 u1bTmp = rtw_read8(padapter, REG_APS_FSMCO+1);
1993 rtw_write8(padapter, REG_APS_FSMCO+1, (u1bTmp|BIT7));
1997 // Description: RTL8723e card disable power sequence v003 which suggested by Scott.
1998 // First created by tynli. 2011.01.28.
2001 CardDisableRTL8723U(
2007 rtw_hal_get_hwreg(Adapter, HW_VAR_APFM_ON_MAC, &u1bTmp);
2008 DBG_8192C(FUNC_ADPT_FMT ": bMacPwrCtrlOn=%d\n", FUNC_ADPT_ARG(Adapter), u1bTmp);
2009 if (u1bTmp == _FALSE)
2012 rtw_hal_set_hwreg(Adapter, HW_VAR_APFM_ON_MAC, &u1bTmp);
2014 //Stop Tx Report Timer. 0x4EC[Bit1]=b'0
2015 u1bTmp = rtw_read8(Adapter, REG_TX_RPT_CTRL);
2016 rtw_write8(Adapter, REG_TX_RPT_CTRL, u1bTmp&(~BIT1));
2019 rtw_write8(Adapter, REG_CR_8723B, 0x0);
2021 // 1. Run LPS WL RFOFF flow
2022 HalPwrSeqCmdParsing(Adapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, rtl8723B_enter_lps_flow);
2024 if((rtw_read8(Adapter, REG_MCUFWDL_8723B)&BIT7) &&
2025 Adapter->bFWReady) //8051 RAM code
2027 rtl8723b_FirmwareSelfReset(Adapter);
2030 // Reset MCU. Suggested by Filen. 2011.01.26. by tynli.
2031 u1bTmp = rtw_read8(Adapter, REG_SYS_FUNC_EN_8723B+1);
2032 rtw_write8(Adapter, REG_SYS_FUNC_EN_8723B+1, (u1bTmp&(~BIT2)));
2034 // MCUFWDL 0x80[1:0]=0 // reset MCU ready status
2035 rtw_write8(Adapter, REG_MCUFWDL_8723B, 0x00);
2037 // Card disable power action flow
2038 HalPwrSeqCmdParsing(Adapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, rtl8723B_card_disable_flow);
2043 u32 rtl8723bu_hal_deinit(PADAPTER padapter)
2045 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
2048 DBG_8192C("==> %s\n", __FUNCTION__);
2051 // 2011/02/18 To Fix RU LNA power leakage problem. We need to execute below below in
2052 // Adapter init and halt sequence. Accordingto EEchou's opinion, we can enable the ability for all
2053 // IC. Accord to johnny's opinion, only RU need the support.
2054 CardDisableRTL8723U(padapter);
2060 unsigned int rtl8723bu_inirp_init(PADAPTER Adapter)
2063 struct recv_buf *precvbuf;
2065 struct dvobj_priv *pdev= adapter_to_dvobj(Adapter);
2066 struct intf_hdl * pintfhdl=&Adapter->iopriv.intf;
2067 struct recv_priv *precvpriv = &(Adapter->recvpriv);
2068 u32 (*_read_port)(struct intf_hdl *pintfhdl, u32 addr, u32 cnt, u8 *pmem);
2069 #ifdef CONFIG_USB_INTERRUPT_IN_PIPE
2070 u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr);
2071 HAL_DATA_TYPE *pHalData=GET_HAL_DATA(Adapter);
2072 #endif //CONFIG_USB_INTERRUPT_IN_PIPE
2076 _read_port = pintfhdl->io_ops._read_port;
2080 RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("===> usb_inirp_init \n"));
2082 precvpriv->ff_hwaddr = RECV_BULK_IN_ADDR;
2084 //issue Rx irp to receive data
2085 precvbuf = (struct recv_buf *)precvpriv->precv_buf;
2086 for(i=0; i<NR_RECVBUFF; i++)
2088 if(_read_port(pintfhdl, precvpriv->ff_hwaddr, 0, (unsigned char *)precvbuf) == _FALSE )
2090 RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_port error \n"));
2096 precvpriv->free_recv_buf_queue_cnt--;
2099 #ifdef CONFIG_USB_INTERRUPT_IN_PIPE
2100 _read_interrupt = pintfhdl->io_ops._read_interrupt;
2101 if(_read_interrupt(pintfhdl, RECV_INT_IN_ADDR) == _FALSE )
2103 RT_TRACE(_module_hci_hal_init_c_,_drv_err_,("usb_rx_init: usb_read_interrupt error \n"));
2106 pHalData->IntrMask[0]=rtw_read32(Adapter, REG_USB_HIMR);
2107 MSG_8192C("pHalData->IntrMask = 0x%04x\n", pHalData->IntrMask[0]);
2108 pHalData->IntrMask[0]|=UHIMR_C2HCMD|UHIMR_CPWM;
2109 rtw_write32(Adapter, REG_USB_HIMR,pHalData->IntrMask[0]);
2110 #endif //CONFIG_USB_INTERRUPT_IN_PIPE
2114 RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("<=== usb_inirp_init \n"));
2122 unsigned int rtl8723bu_inirp_deinit(PADAPTER Adapter)
2124 #ifdef CONFIG_USB_INTERRUPT_IN_PIPE
2125 u32 (*_read_interrupt)(struct intf_hdl *pintfhdl, u32 addr);
2126 HAL_DATA_TYPE *pHalData=GET_HAL_DATA(Adapter);
2127 #endif //CONFIG_USB_INTERRUPT_IN_PIPE
2128 RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n ===> usb_rx_deinit \n"));
2130 rtw_read_port_cancel(Adapter);
2131 #ifdef CONFIG_USB_INTERRUPT_IN_PIPE
2132 pHalData->IntrMask[0]=rtw_read32(Adapter, REG_USB_HIMR);
2133 MSG_8192C("%s pHalData->IntrMask = 0x%04x\n",__FUNCTION__, pHalData->IntrMask[0]);
2134 pHalData->IntrMask[0]=0x0;
2135 rtw_write32(Adapter, REG_USB_HIMR,pHalData->IntrMask[0]);
2136 RT_TRACE(_module_hci_hal_init_c_,_drv_info_,("\n <=== usb_rx_deinit \n"));
2137 #endif //CONFIG_USB_INTERRUPT_IN_PIPE
2147 //RT_ASSERT((channel < 14), ("Channel %d no is supported!\n"));
2149 if(channel < 3){ // Channel 1~3
2152 else if(channel < 9){ // Channel 4~9
2156 return 2; // Channel 10~14
2160 //-------------------------------------------------------------------
2162 // EEPROM/EFUSE Content Parsing
2164 //-------------------------------------------------------------------
2167 IN PADAPTER Adapter,
2169 IN BOOLEAN AutoloadFail
2172 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
2174 if(_FALSE == AutoloadFail){
2175 //Read Permanent MAC address and set value to hardware
2176 _rtw_memcpy(pHalData->EEPROMMACAddr, &PROMContent[EEPROM_MAC_ADDR_8723BU], ETH_ALEN);
2179 //Random assigh MAC address
2180 u8 sMacAddr[MAC_ADDR_LEN] = {0x00, 0xE0, 0x4C, 0x81, 0x92, 0x00};
2181 //sMacAddr[5] = (u8)GetRandomNumber(1, 254);
2182 _rtw_memcpy(pHalData->EEPROMMACAddr, sMacAddr, ETH_ALEN);
2184 DBG_8192C("%s MAC Address from EFUSE = "MAC_FMT"\n",__FUNCTION__, MAC_ARG(pHalData->EEPROMMACAddr));
2185 //NicIFSetMacAddress(Adapter, Adapter->PermanentAddress);
2186 //RT_PRINT_ADDR(COMP_INIT|COMP_EFUSE, DBG_LOUD, "MAC Addr: %s", Adapter->PermanentAddress);
2192 IN PADAPTER Adapter,
2194 IN BOOLEAN AutoloadFail
2197 struct led_priv *pledpriv = &(Adapter->ledpriv);
2198 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2200 #ifdef CONFIG_SW_LED
2201 pledpriv->bRegUseLed = _TRUE;
2206 switch(pHalData->CustomerID)
2208 case RT_CID_DEFAULT:
2209 pledpriv->LedStrategy = SW_LED_MODE1;
2210 pledpriv->bRegUseLed = _TRUE;
2213 case RT_CID_819x_HP:
2214 pledpriv->LedStrategy = SW_LED_MODE6;
2218 pledpriv->LedStrategy = SW_LED_MODE1;
2222 pHalData->bLedOpenDrain = _TRUE;// Support Open-drain arrangement for controlling the LED. Added by Roger, 2009.10.16.
2224 pledpriv->LedStrategy = HW_LED;
2225 #endif //CONFIG_SW_LED
2230 IN PADAPTER Adapter,
2232 IN BOOLEAN AutoloadFail
2237 // Read HW power down mode selection
2238 static void _ReadPSSetting(IN PADAPTER Adapter,IN u8*PROMContent,IN u8 AutoloadFail)
2240 struct pwrctrl_priv *pwrctl = adapter_to_pwrctl(Adapter);
2243 pwrctl->bHWPowerdown = _FALSE;
2244 pwrctl->bSupportRemoteWakeup = _FALSE;
2247 //if(SUPPORT_HW_RADIO_DETECT(Adapter))
2248 pwrctl->bHWPwrPindetect = Adapter->registrypriv.hwpwrp_detect;
2250 //pwrctl->bHWPwrPindetect = _FALSE;//dongle not support new
2253 //hw power down mode selection , 0:rf-off / 1:power down
2255 if(Adapter->registrypriv.hwpdn_mode==2)
2256 pwrctl->bHWPowerdown = (PROMContent[EEPROM_FEATURE_OPTION_8723B] & BIT4);
2258 pwrctl->bHWPowerdown = Adapter->registrypriv.hwpdn_mode;
2260 // decide hw if support remote wakeup function
2261 // if hw supported, 8051 (SIE) will generate WeakUP signal( D+/D- toggle) when autoresume
2262 pwrctl->bSupportRemoteWakeup = (PROMContent[EEPROM_USB_OPTIONAL_FUNCTION0] & BIT1)?_TRUE :_FALSE;
2264 //if(SUPPORT_HW_RADIO_DETECT(Adapter))
2265 //Adapter->registrypriv.usbss_enable = pwrctl->bSupportRemoteWakeup ;
2267 DBG_8192C("%s...bHWPwrPindetect(%x)-bHWPowerdown(%x) ,bSupportRemoteWakeup(%x)\n",__FUNCTION__,
2268 pwrctl->bHWPwrPindetect, pwrctl->bHWPowerdown, pwrctl->bSupportRemoteWakeup);
2270 DBG_8192C("### PS params=> power_mgnt(%x),usbss_enable(%x) ###\n",Adapter->registrypriv.power_mgnt,Adapter->registrypriv.usbss_enable);
2282 Hal_EfuseParsePIDVID_8723BU(
2283 IN PADAPTER pAdapter,
2285 IN BOOLEAN AutoLoadFail
2288 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
2292 pHalData->EEPROMVID = 0;
2293 pHalData->EEPROMPID = 0;
2298 pHalData->EEPROMVID = le16_to_cpu(*(u16*)&hwinfo[EEPROM_VID_8723BU]);
2299 pHalData->EEPROMPID = le16_to_cpu(*(u16*)&hwinfo[EEPROM_PID_8723BU]);
2303 MSG_8192C("EEPROM VID = 0x%4x\n", pHalData->EEPROMVID);
2304 MSG_8192C("EEPROM PID = 0x%4x\n", pHalData->EEPROMPID);
2309 Hal_EfuseParseMACAddr_8723BU(
2310 IN PADAPTER padapter,
2312 IN BOOLEAN AutoLoadFail
2316 u8 sMacAddr[6] = {0x00, 0xE0, 0x4C, 0x87, 0x23, 0x00};
2317 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
2320 // sMacAddr[5] = (u1Byte)GetRandomNumber(1, 254);
2322 pHalData->EEPROMMACAddr[i] = sMacAddr[i];
2326 //Read Permanent MAC address
2328 _rtw_memcpy(pHalData->EEPROMMACAddr, &hwinfo[EEPROM_MAC_ADDR_8723BU], ETH_ALEN);
2332 usValue = *(u16*)&hwinfo[EEPROM_MAC_ADDR_8723S+i];
2333 *((u16*)(&pHalData->EEPROMMACAddr[i])) = usValue;
2337 // NicIFSetMacAddress(pAdapter, pAdapter->PermanentAddress);
2339 RT_TRACE(_module_hci_hal_init_c_, _drv_notice_,
2340 ("Hal_EfuseParseMACAddr_8723BU: Permanent Address=%02x:%02x:%02x:%02x:%02x:%02x\n",
2341 pHalData->EEPROMMACAddr[0], pHalData->EEPROMMACAddr[1],
2342 pHalData->EEPROMMACAddr[2], pHalData->EEPROMMACAddr[3],
2343 pHalData->EEPROMMACAddr[4], pHalData->EEPROMMACAddr[5]));
2347 #ifdef CONFIG_EFUSE_CONFIG_FILE
2348 static u32 Hal_readPGDataFromConfigFile(
2356 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
2357 u8 *PROMContent = pHalData->efuse_eeprom_data;
2360 temp[2] = 0; // add end of string '\0'
2362 fp = filp_open("/system/etc/wifi/wifi_efuse.map", O_RDWR, 0644);
2364 pHalData->bloadfile_fail_flag= _TRUE;
2365 DBG_871X("Error, Efuse configure file doesn't exist.\n");
2372 DBG_871X("Efuse configure file:\n");
2373 for (i=0; i<HWSET_MAX_SIZE_88E; i++) {
2374 vfs_read(fp, temp, 2, &pos);
2375 PROMContent[i] = simple_strtoul(temp, NULL, 16 );
2376 pos += 1; // Filter the space character
2377 DBG_871X("%02X \n", PROMContent[i]);
2382 filp_close(fp, NULL);
2384 pHalData->bloadfile_fail_flag= _FALSE;
2390 Hal_ReadMACAddrFromFile_8723AU(
2399 u32 curtime = rtw_get_current_time();
2400 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
2403 u8 null_mac_addr[ETH_ALEN] = {0, 0, 0,0, 0, 0};
2404 u8 multi_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
2406 _rtw_memset(source_addr, 0, 18);
2407 _rtw_memset(pHalData->EEPROMMACAddr, 0, ETH_ALEN);
2409 fp = filp_open("/data/wifimac.txt", O_RDWR, 0644);
2411 pHalData->bloadmac_fail_flag = _TRUE;
2412 DBG_871X("Error, wifi mac address file doesn't exist.\n");
2417 DBG_871X("wifi mac address:\n");
2418 vfs_read(fp, source_addr, 18, &pos);
2419 source_addr[17] = ':';
2421 head = end = source_addr;
2422 for (i=0; i<ETH_ALEN; i++) {
2423 while (end && (*end != ':') )
2426 if (end && (*end == ':') )
2429 pHalData->EEPROMMACAddr[i] = simple_strtoul(head, NULL, 16 );
2435 DBG_871X("%02x \n", pHalData->EEPROMMACAddr[i]);
2440 filp_close(fp, NULL);
2443 if ( (_rtw_memcmp(pHalData->EEPROMMACAddr, null_mac_addr, ETH_ALEN)) ||
2444 (_rtw_memcmp(pHalData->EEPROMMACAddr, multi_mac_addr, ETH_ALEN)) ) {
2445 pHalData->EEPROMMACAddr[0] = 0x00;
2446 pHalData->EEPROMMACAddr[1] = 0xe0;
2447 pHalData->EEPROMMACAddr[2] = 0x4c;
2448 pHalData->EEPROMMACAddr[3] = (u8)(curtime & 0xff) ;
2449 pHalData->EEPROMMACAddr[4] = (u8)((curtime>>8) & 0xff) ;
2450 pHalData->EEPROMMACAddr[5] = (u8)((curtime>>16) & 0xff) ;
2453 pHalData->bloadmac_fail_flag = _FALSE;
2455 DBG_871X("Hal_ReadMACAddrFromFile_8188ES: Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
2456 pHalData->EEPROMMACAddr[0], pHalData->EEPROMMACAddr[1],
2457 pHalData->EEPROMMACAddr[2], pHalData->EEPROMMACAddr[3],
2458 pHalData->EEPROMMACAddr[4], pHalData->EEPROMMACAddr[5]);
2460 #endif //CONFIG_EFUSE_CONFIG_FILE
2464 InitAdapterVariablesByPROM_8723BU(
2465 IN PADAPTER padapter
2469 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
2472 if (sizeof(pHalData->efuse_eeprom_data) < HWSET_MAX_SIZE_8723B)
2473 DBG_871X("[WARNING] size of efuse_eeprom_data is less than HWSET_MAX_SIZE_8723B!\n");
2475 hwinfo = pHalData->efuse_eeprom_data;
2477 #ifdef CONFIG_EFUSE_CONFIG_FILE
2478 Hal_readPGDataFromConfigFile(padapter);
2479 #else //CONFIG_EFUSE_CONFIG_FILE
2480 Hal_InitPGData(padapter, hwinfo);
2481 #endif //CONFIG_EFUSE_CONFIG_FILE
2482 Hal_EfuseParseIDCode(padapter, hwinfo);
2483 Hal_EfuseParsePIDVID_8723BU(padapter, hwinfo, pHalData->bautoload_fail_flag);
2484 Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2485 #ifdef CONFIG_EFUSE_CONFIG_FILE
2486 Hal_ReadMACAddrFromFile_8723BU(padapter);
2487 #else //CONFIG_EFUSE_CONFIG_FILE
2488 Hal_EfuseParseMACAddr_8723BU(padapter, hwinfo, pHalData->bautoload_fail_flag);
2490 Hal_EfuseParseTxPowerInfo_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2491 Hal_EfuseParseBoardType_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2493 Hal_EfuseParseBTCoexistInfo_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2495 Hal_EfuseParseChnlPlan_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2496 Hal_EfuseParseThermalMeter_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2497 // _ReadLEDSetting(Adapter, PROMContent, pHalData->bautoload_fail_flag);
2498 // _ReadRFSetting(Adapter, PROMContent, pHalData->bautoload_fail_flag);
2499 // _ReadPSSetting(Adapter, PROMContent, pHalData->bautoload_fail_flag);
2500 Hal_EfuseParseAntennaDiversity_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2502 Hal_EfuseParseEEPROMVer_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2503 Hal_EfuseParseCustomerID_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2504 // Hal_EfuseParseRateIndicationOption(padapter, hwinfo, pHalData->bautoload_fail_flag);
2505 Hal_EfuseParseXtal_8723B(padapter, hwinfo, pHalData->bautoload_fail_flag);
2507 // The following part initialize some vars by PG info.
2512 //hal_CustomizedBehavior_8723U(Adapter);
2514 // Adapter->bDongle = (PROMContent[EEPROM_EASY_REPLACEMENT] == 1)? 0: 1;
2515 DBG_8192C("%s(): REPLACEMENT = %x\n",__FUNCTION__,padapter->bDongle);
2518 static void _ReadPROMContent(
2522 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
2528 eeValue = rtw_read8(Adapter, REG_9346CR);
2529 // To check system boot selection.
2530 pHalData->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? _TRUE : _FALSE;
2531 pHalData->bautoload_fail_flag = (eeValue & EEPROM_EN) ? _FALSE : _TRUE;
2534 DBG_8192C("Boot from %s, Autoload %s !\n", (pHalData->EepromOrEfuse ? "EEPROM" : "EFUSE"),
2535 (pHalData->bautoload_fail_flag ? "Fail" : "OK") );
2538 InitAdapterVariablesByPROM_8723BU(Adapter);
2547 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2550 //if(Adapter->bInHctTest){
2551 // pMgntInfo->PowerSaveControl.bInactivePs = FALSE;
2552 // pMgntInfo->PowerSaveControl.bIPSModeBackup = FALSE;
2553 // pMgntInfo->PowerSaveControl.bLeisurePs = FALSE;
2554 // pMgntInfo->keepAliveLevel = 0;
2565 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2568 pHalData->rf_chip = RF_PSEUDO_11N;
2570 pHalData->rf_chip = RF_6052;
2578 // We should set Efuse cell selection to WiFi cell in default.
2583 // Added by Roger, 2010.11.23.
2592 value32 = rtw_read32(Adapter, EFUSE_TEST);
2593 value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0);
2594 rtw_write32(Adapter, EFUSE_TEST, value32);
2597 static int _ReadAdapterInfo8723BU(PADAPTER Adapter)
2599 //HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2600 u32 start=rtw_get_current_time();
2602 MSG_8192C("====> _ReadAdapterInfo8723BU\n");
2604 //Efuse_InitSomeVar(Adapter);
2606 hal_EfuseCellSel(Adapter);
2608 _ReadRFType(Adapter);//rf_chip -> _InitRFType()
2609 _ReadPROMContent(Adapter);
2611 // 2010/10/25 MH THe function must be called after borad_type & IC-Version recognize.
2612 // _ReadSilmComboMode(Adapter);
2614 _InitOtherVariable(Adapter);
2616 //MSG_8192C("%s()(done), rf_chip=0x%x, rf_type=0x%x\n", __FUNCTION__, pHalData->rf_chip, pHalData->rf_type);
2618 MSG_8192C("<==== _ReadAdapterInfo8723BU in %d ms\n", rtw_get_passing_time_ms(start));
2624 static void ReadAdapterInfo8723BU(PADAPTER Adapter)
2626 // Read EEPROM size before call any EEPROM function
2627 Adapter->EepromAddressSize = GetEEPROMSize8723B(Adapter);
2629 _ReadAdapterInfo8723BU(Adapter);
2633 #define GPIO_DEBUG_PORT_NUM 0
2634 static void rtl8723bu_trigger_gpio_0(_adapter *padapter)
2638 DBG_871X("==> trigger_gpio_0...\n");
2639 rtw_write16_async(padapter,REG_GPIO_PIN_CTRL,0);
2640 rtw_write8_async(padapter,REG_GPIO_PIN_CTRL+2,0xFF);
2641 gpioctrl = (BIT(GPIO_DEBUG_PORT_NUM)<<24 )|(BIT(GPIO_DEBUG_PORT_NUM)<<16);
2642 rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl);
2643 gpioctrl |= (BIT(GPIO_DEBUG_PORT_NUM)<<8);
2644 rtw_write32_async(padapter,REG_GPIO_PIN_CTRL,gpioctrl);
2645 DBG_871X("<=== trigger_gpio_0...\n");
2650 * If variable not handled here,
2651 * some variables will be processed in SetHwReg8723A()
2653 void SetHwReg8723BU(PADAPTER Adapter, u8 variable, u8* val)
2655 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
2661 case HW_VAR_RXDMA_AGG_PG_TH:
2662 #ifdef CONFIG_USB_RX_AGGREGATION
2664 u8 threshold = *val;
2666 threshold = pHalData->UsbRxAggPageCount;
2667 SetHwReg8723B(Adapter, HW_VAR_RXDMA_AGG_PG_TH, &threshold);
2672 case HW_VAR_SET_RPWM:
2673 rtw_write8(Adapter, REG_USB_HRPWM, *val);
2676 case HW_VAR_TRIGGER_GPIO_0:
2677 rtl8723bu_trigger_gpio_0(Adapter);
2681 SetHwReg8723B(Adapter, variable, val);
2689 * If variable not handled here,
2690 * some variables will be processed in GetHwReg8723A()
2692 void GetHwReg8723BU(PADAPTER Adapter, u8 variable, u8* val)
2694 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
2701 GetHwReg8723B(Adapter, variable, val);
2710 // Query setting of specified variable.
2713 GetHalDefVar8723BUsb(
2714 IN PADAPTER Adapter,
2715 IN HAL_DEF_VARIABLE eVariable,
2719 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2720 u8 bResult = _SUCCESS;
2724 case HAL_DEF_IS_SUPPORT_ANT_DIV:
2725 #ifdef CONFIG_ANTENNA_DIVERSITY
2726 *((u8 *)pValue) =_FALSE;
2729 case HAL_DEF_CURRENT_ANTENNA:
2730 #ifdef CONFIG_ANTENNA_DIVERSITY
2731 *(( u8*)pValue) = pHalData->CurAntenna;
2734 case HAL_DEF_DRVINFO_SZ:
2735 *(( u32*)pValue) = DRVINFO_SZ;
2737 case HAL_DEF_MAX_RECVBUF_SZ:
2738 *(( u32*)pValue) = MAX_RECVBUF_SZ;
2740 case HAL_DEF_RX_PACKET_OFFSET:
2741 *(( u32*)pValue) = RXDESC_SIZE + DRVINFO_SZ;
2743 case HW_VAR_MAX_RX_AMPDU_FACTOR:
2744 *((HT_CAP_AMPDU_FACTOR*)pValue) = MAX_AMPDU_FACTOR_64K;
2747 bResult = GetHalDefVar8723B(Adapter, eVariable, pValue);
2759 // Change default setting of specified variable.
2762 SetHalDefVar8723BUsb(
2763 IN PADAPTER Adapter,
2764 IN HAL_DEF_VARIABLE eVariable,
2768 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
2769 u8 bResult = _SUCCESS;
2774 bResult = SetHalDefVar8723B(Adapter, eVariable, pValue);
2781 void _update_response_rate(_adapter *padapter,unsigned int mask)
2784 // Set RRSR rate table.
2785 rtw_write8(padapter, REG_RRSR, mask&0xff);
2786 rtw_write8(padapter,REG_RRSR+1, (mask>>8)&0xff);
2788 // Set RTS initial rate
2794 rtw_write8(padapter, REG_INIRTS_RATE_SEL, RateIndex);
2797 static void rtl8723bu_init_default_value(PADAPTER padapter)
2799 rtl8723b_init_default_value(padapter);
2802 static u8 rtl8723bu_ps_func(PADAPTER Adapter,HAL_INTF_PS_FUNC efunc_id, u8 *val)
2807 #if defined(CONFIG_AUTOSUSPEND) && defined(SUPPORT_HW_RFOFF_DETECTED)
2808 case HAL_USB_SELECT_SUSPEND:
2810 u8 bfwpoll = *(( u8*)val);
2811 rtl8723b_set_FwSelectSuspend_cmd(Adapter,bfwpoll ,500);//note fw to support hw power down ping detect
2814 #endif //CONFIG_AUTOSUSPEND && SUPPORT_HW_RFOFF_DETECTED
2822 void rtl8723bu_set_hal_ops(_adapter * padapter)
2824 struct hal_ops *pHalFunc = &padapter->HalFunc;
2828 rtl8723b_set_hal_ops(pHalFunc);
2830 pHalFunc->hal_power_on = &_InitPowerOn_8723BU;
2831 pHalFunc->hal_power_off = &CardDisableRTL8723U;
2833 pHalFunc->hal_init = &rtl8723bu_hal_init;
2834 pHalFunc->hal_deinit = &rtl8723bu_hal_deinit;
2836 pHalFunc->inirp_init = &rtl8723bu_inirp_init;
2837 pHalFunc->inirp_deinit = &rtl8723bu_inirp_deinit;
2839 pHalFunc->init_xmit_priv = &rtl8723bu_init_xmit_priv;
2840 pHalFunc->free_xmit_priv = &rtl8723bu_free_xmit_priv;
2842 pHalFunc->init_recv_priv = &rtl8723bu_init_recv_priv;
2843 pHalFunc->free_recv_priv = &rtl8723bu_free_recv_priv;
2844 #ifdef CONFIG_SW_LED
2845 pHalFunc->InitSwLeds = &rtl8723bu_InitSwLeds;
2846 pHalFunc->DeInitSwLeds = &rtl8723bu_DeInitSwLeds;
2847 #else //case of hw led or no led
2848 pHalFunc->InitSwLeds = NULL;
2849 pHalFunc->DeInitSwLeds = NULL;
2850 #endif//CONFIG_SW_LED
2852 pHalFunc->init_default_value = &rtl8723b_init_default_value;
2853 pHalFunc->intf_chip_configure = &rtl8723bu_interface_configure;
2854 pHalFunc->read_adapter_info = &ReadAdapterInfo8723BU;
2856 pHalFunc->SetHwRegHandler = &SetHwReg8723BU;
2857 pHalFunc->GetHwRegHandler = &GetHwReg8723BU;
2858 pHalFunc->GetHalDefVarHandler = &GetHalDefVar8723BUsb;
2859 pHalFunc->SetHalDefVarHandler = &SetHalDefVar8723BUsb;
2861 pHalFunc->hal_xmit = &rtl8723bu_hal_xmit;
2862 pHalFunc->mgnt_xmit = &rtl8723bu_mgnt_xmit;
2863 pHalFunc->hal_xmitframe_enqueue = &rtl8723bu_hal_xmitframe_enqueue;
2865 #ifdef CONFIG_HOSTAPD_MLME
2866 pHalFunc->hostap_mgnt_xmit_entry = &rtl8723bu_hostap_mgnt_xmit_entry;
2868 pHalFunc->interface_ps_func = &rtl8723bu_ps_func;
2870 #ifdef CONFIG_XMIT_THREAD_MODE
2871 pHalFunc->xmit_thread_handler = &rtl8723bu_xmit_buf_handler;