/******************************************************************************
 *
 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 ******************************************************************************/
#define _HCI_HAL_INIT_C_

#include <osdep_service.h>
#include <drv_types.h>
#include <rtw_efuse.h>

#include <HalPwrSeqCmd.h>
#include <Hal8723PwrSeq.h>
#include <rtl8723a_hal.h>
#include <rtl8723a_led.h>
#include <linux/ieee80211.h>

#include <usb_ops.h>

static void
_ConfigChipOutEP(struct rtw_adapter *pAdapter, u8 NumOutPipe)
{
	u8 value8;
	struct hal_data_8723a *pHalData = GET_HAL_DATA(pAdapter);

	pHalData->OutEpQueueSel = 0;
	pHalData->OutEpNumber = 0;

	/*  Normal and High queue */
	value8 = rtl8723au_read8(pAdapter, (REG_NORMAL_SIE_EP + 1));

	if (value8 & USB_NORMAL_SIE_EP_MASK) {
		pHalData->OutEpQueueSel |= TX_SELE_HQ;
		pHalData->OutEpNumber++;
	}

	if ((value8 >> USB_NORMAL_SIE_EP_SHIFT) & USB_NORMAL_SIE_EP_MASK) {
		pHalData->OutEpQueueSel |= TX_SELE_NQ;
		pHalData->OutEpNumber++;
	}

	/*  Low queue */
	value8 = rtl8723au_read8(pAdapter, (REG_NORMAL_SIE_EP + 2));
	if (value8 & USB_NORMAL_SIE_EP_MASK) {
		pHalData->OutEpQueueSel |= TX_SELE_LQ;
		pHalData->OutEpNumber++;
	}

	/*  TODO: Error recovery for this case */
	/* RT_ASSERT((NumOutPipe == pHalData->OutEpNumber),
	   ("Out EP number isn't match! %d(Descriptor) != %d (SIE reg)\n",
	   (u32)NumOutPipe, (u32)pHalData->OutEpNumber)); */
}

static bool rtl8723au_set_queue_pipe_mapping(struct rtw_adapter *pAdapter,
					     u8 NumInPipe, u8 NumOutPipe)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(pAdapter);
	bool result = false;

	_ConfigChipOutEP(pAdapter, NumOutPipe);

	/*  Normal chip with one IN and one OUT doesn't have interrupt IN EP. */
	if (pHalData->OutEpNumber == 1) {
		if (NumInPipe != 1)
			return result;
	}

	result = Hal_MappingOutPipe23a(pAdapter, NumOutPipe);

	return result;
}

void rtl8723au_chip_configure(struct rtw_adapter *padapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(padapter);
	struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(padapter);

	pHalData->interfaceIndex = pdvobjpriv->InterfaceNumber;

	rtl8723au_set_queue_pipe_mapping(padapter,
					 pdvobjpriv->RtNumInPipes,
					 pdvobjpriv->RtNumOutPipes);
}

static int _InitPowerOn(struct rtw_adapter *padapter)
{
	int status = _SUCCESS;
	u16 value16 = 0;
	u8 value8 = 0;

	/*  RSV_CTRL 0x1C[7:0] = 0x00
	    unlock ISO/CLK/Power control register */
	rtl8723au_write8(padapter, REG_RSV_CTRL, 0x0);

	/*  HW Power on sequence */
	if (!HalPwrSeqCmdParsing23a(padapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
				 PWR_INTF_USB_MSK, rtl8723AU_card_enable_flow))
		return _FAIL;

	/*  0x04[19] = 1, suggest by Jackie 2011.05.09, reset 8051 */
	value8 = rtl8723au_read8(padapter, REG_APS_FSMCO+2);
	rtl8723au_write8(padapter, REG_APS_FSMCO + 2, value8 | BIT(3));

	/*  Enable MAC DMA/WMAC/SCHEDULE/SEC block */
	/*  Set CR bit10 to enable 32k calibration. Suggested by SD1 Gimmy.
	    Added by tynli. 2011.08.31. */
	value16 = rtl8723au_read16(padapter, REG_CR);
	value16 |= (HCI_TXDMA_EN | HCI_RXDMA_EN | TXDMA_EN | RXDMA_EN |
		    PROTOCOL_EN | SCHEDULE_EN | MACTXEN | MACRXEN |
		    ENSEC | CALTMR_EN);
	rtl8723au_write16(padapter, REG_CR, value16);

	/* for Efuse PG, suggest by Jackie 2011.11.23 */
	PHY_SetBBReg(padapter, REG_EFUSE_CTRL, BIT(28)|BIT(29)|BIT(30), 0x06);

	return status;
}

/*  Shall USB interface init this? */
static void _InitInterrupt(struct rtw_adapter *Adapter)
{
	u32 value32;

	/*  HISR - turn all on */
	value32 = 0xFFFFFFFF;
	rtl8723au_write32(Adapter, REG_HISR, value32);

	/*  HIMR - turn all on */
	rtl8723au_write32(Adapter, REG_HIMR, value32);
}

static void _InitQueueReservedPage(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
	struct registry_priv *pregistrypriv = &Adapter->registrypriv;
	u32 numHQ = 0;
	u32 numLQ = 0;
	u32 numNQ = 0;
	u32 numPubQ;
	u32 value32;
	u8 value8;
	bool bWiFiConfig = pregistrypriv->wifi_spec;

	/* RT_ASSERT((outEPNum>= 2), ("for WMM , number of out-ep "
	   "must more than or equal to 2!\n")); */

	numPubQ = bWiFiConfig ? WMM_NORMAL_PAGE_NUM_PUBQ : NORMAL_PAGE_NUM_PUBQ;

	if (pHalData->OutEpQueueSel & TX_SELE_HQ) {
		numHQ = bWiFiConfig ?
			WMM_NORMAL_PAGE_NUM_HPQ : NORMAL_PAGE_NUM_HPQ;
	}

	if (pHalData->OutEpQueueSel & TX_SELE_LQ) {
		numLQ = bWiFiConfig ?
			WMM_NORMAL_PAGE_NUM_LPQ : NORMAL_PAGE_NUM_LPQ;
	}
	/*  NOTE: This step shall be proceed before
	    writting REG_RQPN. */
	if (pHalData->OutEpQueueSel & TX_SELE_NQ) {
		numNQ = bWiFiConfig ?
			WMM_NORMAL_PAGE_NUM_NPQ : NORMAL_PAGE_NUM_NPQ;
	}
	value8 = (u8)_NPQ(numNQ);
	rtl8723au_write8(Adapter, REG_RQPN_NPQ, value8);

	/*  TX DMA */
	value32 = _HPQ(numHQ) | _LPQ(numLQ) | _PUBQ(numPubQ) | LD_RQPN;
	rtl8723au_write32(Adapter, REG_RQPN, value32);
}

static void _InitTxBufferBoundary(struct rtw_adapter *Adapter)
{
	struct registry_priv *pregistrypriv = &Adapter->registrypriv;

	u8 txpktbuf_bndy;

	if (!pregistrypriv->wifi_spec)
		txpktbuf_bndy = TX_PAGE_BOUNDARY;
	else /* for WMM */
		txpktbuf_bndy = WMM_NORMAL_TX_PAGE_BOUNDARY;

	rtl8723au_write8(Adapter, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
	rtl8723au_write8(Adapter, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
	rtl8723au_write8(Adapter, REG_TXPKTBUF_WMAC_LBK_BF_HD, txpktbuf_bndy);
	rtl8723au_write8(Adapter, REG_TRXFF_BNDY, txpktbuf_bndy);
	rtl8723au_write8(Adapter, REG_TDECTRL+1, txpktbuf_bndy);
}

static void _InitPageBoundary(struct rtw_adapter *Adapter)
{
	/*  RX Page Boundary */
	/* srand(static_cast<unsigned int>(time(NULL))); */
	u16 rxff_bndy = 0x27FF;/* rand() % 1) ? 0x27FF : 0x23FF; */

	rtl8723au_write16(Adapter, (REG_TRXFF_BNDY + 2), rxff_bndy);

	/*  TODO: ?? shall we set tx boundary? */
}

static void
_InitNormalChipRegPriority(struct rtw_adapter *Adapter, u16 beQ, u16 bkQ,
			   u16 viQ, u16 voQ, u16 mgtQ, u16 hiQ)
{
	u16 value16 = rtl8723au_read16(Adapter, REG_TRXDMA_CTRL) & 0x7;

	value16 |= _TXDMA_BEQ_MAP(beQ) | _TXDMA_BKQ_MAP(bkQ) |
		_TXDMA_VIQ_MAP(viQ) | _TXDMA_VOQ_MAP(voQ) |
		_TXDMA_MGQ_MAP(mgtQ) | _TXDMA_HIQ_MAP(hiQ);

	rtl8723au_write16(Adapter, REG_TRXDMA_CTRL, value16);
}

static void _InitNormalChipOneOutEpPriority(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
	u16 value = 0;

	switch (pHalData->OutEpQueueSel) {
	case TX_SELE_HQ:
		value = QUEUE_HIGH;
		break;
	case TX_SELE_LQ:
		value = QUEUE_LOW;
		break;
	case TX_SELE_NQ:
		value = QUEUE_NORMAL;
		break;
	default:
		/* RT_ASSERT(false, ("Shall not reach here!\n")); */
		break;
	}

	_InitNormalChipRegPriority(Adapter, value, value, value,
				   value, value, value);
}

static void _InitNormalChipTwoOutEpPriority(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
	struct registry_priv *pregistrypriv = &Adapter->registrypriv;
	u16 beQ, bkQ, viQ, voQ, mgtQ, hiQ;
	u16 valueHi = 0;
	u16 valueLow = 0;

	switch (pHalData->OutEpQueueSel) {
	case (TX_SELE_HQ | TX_SELE_LQ):
		valueHi = QUEUE_HIGH;
		valueLow = QUEUE_LOW;
		break;
	case (TX_SELE_NQ | TX_SELE_LQ):
		valueHi = QUEUE_NORMAL;
		valueLow = QUEUE_LOW;
		break;
	case (TX_SELE_HQ | TX_SELE_NQ):
		valueHi = QUEUE_HIGH;
		valueLow = QUEUE_NORMAL;
		break;
	default:
		/* RT_ASSERT(false, ("Shall not reach here!\n")); */
		break;
	}

	if (!pregistrypriv->wifi_spec) {
		beQ = valueLow;
		bkQ = valueLow;
		viQ = valueHi;
		voQ = valueHi;
		mgtQ = valueHi;
		hiQ = valueHi;
	} else {/* for WMM , CONFIG_OUT_EP_WIFI_MODE */
		beQ = valueLow;
		bkQ = valueHi;
		viQ = valueHi;
		voQ = valueLow;
		mgtQ = valueHi;
		hiQ = valueHi;
	}

	_InitNormalChipRegPriority(Adapter, beQ, bkQ, viQ, voQ, mgtQ, hiQ);
}

static void _InitNormalChipThreeOutEpPriority(struct rtw_adapter *Adapter)
{
	struct registry_priv *pregistrypriv = &Adapter->registrypriv;
	u16 beQ, bkQ, viQ, voQ, mgtQ, hiQ;

	if (!pregistrypriv->wifi_spec) {/*  typical setting */
		beQ = QUEUE_LOW;
		bkQ = QUEUE_LOW;
		viQ = QUEUE_NORMAL;
		voQ = QUEUE_HIGH;
		mgtQ = QUEUE_HIGH;
		hiQ = QUEUE_HIGH;
	} else {/*  for WMM */
		beQ = QUEUE_LOW;
		bkQ = QUEUE_NORMAL;
		viQ = QUEUE_NORMAL;
		voQ = QUEUE_HIGH;
		mgtQ = QUEUE_HIGH;
		hiQ = QUEUE_HIGH;
	}
	_InitNormalChipRegPriority(Adapter, beQ, bkQ, viQ, voQ, mgtQ, hiQ);
}

static void _InitNormalChipQueuePriority(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);

	switch (pHalData->OutEpNumber) {
	case 1:
		_InitNormalChipOneOutEpPriority(Adapter);
		break;
	case 2:
		_InitNormalChipTwoOutEpPriority(Adapter);
		break;
	case 3:
		_InitNormalChipThreeOutEpPriority(Adapter);
		break;
	default:
		/* RT_ASSERT(false, ("Shall not reach here!\n")); */
		break;
	}
}

static void _InitQueuePriority(struct rtw_adapter *Adapter)
{
	_InitNormalChipQueuePriority(Adapter);
}

static void _InitTransferPageSize(struct rtw_adapter *Adapter)
{
	/*  Tx page size is always 128. */

	u8 value8;
	value8 = _PSRX(PBP_128) | _PSTX(PBP_128);
	rtl8723au_write8(Adapter, REG_PBP, value8);
}

static void _InitDriverInfoSize(struct rtw_adapter *Adapter, u8 drvInfoSize)
{
	rtl8723au_write8(Adapter, REG_RX_DRVINFO_SZ, drvInfoSize);
}

static void _InitWMACSetting(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);

	/*  don't turn on AAP, it will allow all packets to driver */
	pHalData->ReceiveConfig = RCR_APM | RCR_AM | RCR_AB | RCR_CBSSID_DATA |
				  RCR_CBSSID_BCN | RCR_APP_ICV | RCR_AMF |
				  RCR_HTC_LOC_CTRL | RCR_APP_MIC |
				  RCR_APP_PHYSTS;

	/*  some REG_RCR will be modified later by
	    phy_ConfigMACWithHeaderFile() */
	rtl8723au_write32(Adapter, REG_RCR, pHalData->ReceiveConfig);

	/*  Accept all multicast address */
	rtl8723au_write32(Adapter, REG_MAR, 0xFFFFFFFF);
	rtl8723au_write32(Adapter, REG_MAR + 4, 0xFFFFFFFF);

	/*  Accept all data frames */
	/* value16 = 0xFFFF; */
	/* rtl8723au_write16(Adapter, REG_RXFLTMAP2, value16); */

	/*  2010.09.08 hpfan */
	/*  Since ADF is removed from RCR, ps-poll will not be indicate
	    to driver, */
	/*  RxFilterMap should mask ps-poll to gurantee AP mode can
	    rx ps-poll. */
	/* value16 = 0x400; */
	/* rtl8723au_write16(Adapter, REG_RXFLTMAP1, value16); */

	/*  Accept all management frames */
	/* value16 = 0xFFFF; */
	/* rtl8723au_write16(Adapter, REG_RXFLTMAP0, value16); */

	/* enable RX_SHIFT bits */
	/* rtl8723au_write8(Adapter, REG_TRXDMA_CTRL, rtl8723au_read8(Adapter,
	   REG_TRXDMA_CTRL)|BIT(1)); */
}

static void _InitAdaptiveCtrl(struct rtw_adapter *Adapter)
{
	u16 value16;
	u32 value32;

	/*  Response Rate Set */
	value32 = rtl8723au_read32(Adapter, REG_RRSR);
	value32 &= ~RATE_BITMAP_ALL;
	value32 |= RATE_RRSR_CCK_ONLY_1M;
	rtl8723au_write32(Adapter, REG_RRSR, value32);

	/*  CF-END Threshold */
	/* m_spIoBase->rtl8723au_write8(REG_CFEND_TH, 0x1); */

	/*  SIFS (used in NAV) */
	value16 = _SPEC_SIFS_CCK(0x10) | _SPEC_SIFS_OFDM(0x10);
	rtl8723au_write16(Adapter, REG_SPEC_SIFS, value16);

	/*  Retry Limit */
	value16 = _LRL(0x30) | _SRL(0x30);
	rtl8723au_write16(Adapter, REG_RL, value16);
}

static void _InitRateFallback(struct rtw_adapter *Adapter)
{
	/*  Set Data Auto Rate Fallback Retry Count register. */
	rtl8723au_write32(Adapter, REG_DARFRC, 0x00000000);
	rtl8723au_write32(Adapter, REG_DARFRC+4, 0x10080404);
	rtl8723au_write32(Adapter, REG_RARFRC, 0x04030201);
	rtl8723au_write32(Adapter, REG_RARFRC+4, 0x08070605);
}

static void _InitEDCA(struct rtw_adapter *Adapter)
{
	/*  Set Spec SIFS (used in NAV) */
	rtl8723au_write16(Adapter, REG_SPEC_SIFS, 0x100a);
	rtl8723au_write16(Adapter, REG_MAC_SPEC_SIFS, 0x100a);

	/*  Set SIFS for CCK */
	rtl8723au_write16(Adapter, REG_SIFS_CTX, 0x100a);

	/*  Set SIFS for OFDM */
	rtl8723au_write16(Adapter, REG_SIFS_TRX, 0x100a);

	/*  TXOP */
	rtl8723au_write32(Adapter, REG_EDCA_BE_PARAM, 0x005EA42B);
	rtl8723au_write32(Adapter, REG_EDCA_BK_PARAM, 0x0000A44F);
	rtl8723au_write32(Adapter, REG_EDCA_VI_PARAM, 0x005EA324);
	rtl8723au_write32(Adapter, REG_EDCA_VO_PARAM, 0x002FA226);
}

static void _InitHWLed(struct rtw_adapter *Adapter)
{
	struct led_priv *pledpriv = &Adapter->ledpriv;

	if (pledpriv->LedStrategy != HW_LED)
		return;

/*  HW led control */
/*  to do .... */
/* must consider cases of antenna diversity/ commbo card/solo card/mini card */
}

static void _InitRDGSetting(struct rtw_adapter *Adapter)
{
	rtl8723au_write8(Adapter, REG_RD_CTRL, 0xFF);
	rtl8723au_write16(Adapter, REG_RD_NAV_NXT, 0x200);
	rtl8723au_write8(Adapter, REG_RD_RESP_PKT_TH, 0x05);
}

static void _InitRetryFunction(struct rtw_adapter *Adapter)
{
	u8 value8;

	value8 = rtl8723au_read8(Adapter, REG_FWHW_TXQ_CTRL);
	value8 |= EN_AMPDU_RTY_NEW;
	rtl8723au_write8(Adapter, REG_FWHW_TXQ_CTRL, value8);

	/*  Set ACK timeout */
	rtl8723au_write8(Adapter, REG_ACKTO, 0x40);
}

static void _InitRFType(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
	bool is92CU = IS_92C_SERIAL(pHalData->VersionID);

	pHalData->rf_chip = RF_6052;

	if (is92CU == false) {
		pHalData->rf_type = RF_1T1R;
		DBG_8723A("Set RF Chip ID to RF_6052 and RF type to 1T1R.\n");
		return;
	}

	/*  TODO: Consider that EEPROM set 92CU to 1T1R later. */
	/*  Force to overwrite setting according to chip version. Ignore
	    EEPROM setting. */
	/* pHalData->RF_Type = is92CU ? RF_2T2R : RF_1T1R; */
	MSG_8723A("Set RF Chip ID to RF_6052 and RF type to %d.\n",
		  pHalData->rf_type);
}

/*  Set CCK and OFDM Block "ON" */
static void _BBTurnOnBlock(struct rtw_adapter *Adapter)
{
	PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bCCKEn, 0x1);
	PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bOFDMEn, 0x1);
}

#define MgntActSet_RF_State(...)
static void _RfPowerSave(struct rtw_adapter *padapter)
{
}

enum {
	Antenna_Lfet = 1,
	Antenna_Right = 2,
};

enum rt_rf_power_state RfOnOffDetect23a(struct rtw_adapter *pAdapter)
{
	/* struct hal_data_8723a *pHalData = GET_HAL_DATA(pAdapter); */
	u8 val8;
	enum rt_rf_power_state rfpowerstate = rf_off;

	rtl8723au_write8(pAdapter, REG_MAC_PINMUX_CFG,
			 rtl8723au_read8(pAdapter,
					 REG_MAC_PINMUX_CFG) & ~BIT(3));
	val8 = rtl8723au_read8(pAdapter, REG_GPIO_IO_SEL);
	DBG_8723A("GPIO_IN =%02x\n", val8);
	rfpowerstate = (val8 & BIT(3)) ? rf_on : rf_off;

	return rfpowerstate;
}

void _ps_open_RF23a(struct rtw_adapter *padapter);

int rtl8723au_hal_init(struct rtw_adapter *Adapter)
{
	u8 val8 = 0;
	u32 boundary;
	int status = _SUCCESS;
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
	struct pwrctrl_priv *pwrctrlpriv = &Adapter->pwrctrlpriv;
	struct registry_priv *pregistrypriv = &Adapter->registrypriv;

	unsigned long init_start_time = jiffies;

	Adapter->hw_init_completed = false;

	if (Adapter->pwrctrlpriv.bkeepfwalive) {
		_ps_open_RF23a(Adapter);

		if (pHalData->bIQKInitialized) {
			rtl8723a_phy_iq_calibrate(Adapter, true);
		} else {
			rtl8723a_phy_iq_calibrate(Adapter, false);
			pHalData->bIQKInitialized = true;
		}
		rtl8723a_odm_check_tx_power_tracking(Adapter);
		rtl8723a_phy_lc_calibrate(Adapter);

		goto exit;
	}

	/*  Check if MAC has already power on. by tynli. 2011.05.27. */
	val8 = rtl8723au_read8(Adapter, REG_CR);
	RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
		 ("%s: REG_CR 0x100 = 0x%02x\n", __func__, val8));
	/* Fix 92DU-VC S3 hang with the reason is that secondary mac is not
	   initialized. */
	/* 0x100 value of first mac is 0xEA while 0x100 value of secondary
	   is 0x00 */
	if (val8 == 0xEA) {
		pHalData->bMACFuncEnable = false;
	} else {
		pHalData->bMACFuncEnable = true;
		RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
			 ("%s: MAC has already power on\n", __func__));
	}

	status = _InitPowerOn(Adapter);
	if (status == _FAIL) {
		RT_TRACE(_module_hci_hal_init_c_, _drv_err_,
			 ("Failed to init power on!\n"));
		goto exit;
	}

	if (!pregistrypriv->wifi_spec) {
		boundary = TX_PAGE_BOUNDARY;
	} else {
		/*  for WMM */
		boundary = WMM_NORMAL_TX_PAGE_BOUNDARY;
	}

	if (!pHalData->bMACFuncEnable) {
		status =  InitLLTTable23a(Adapter, boundary);
		if (status == _FAIL) {
			RT_TRACE(_module_hci_hal_init_c_, _drv_err_,
				 ("Failed to init LLT table\n"));
			goto exit;
		}
	}

	if (pHalData->bRDGEnable)
		_InitRDGSetting(Adapter);

	status = rtl8723a_FirmwareDownload(Adapter);
	if (status != _SUCCESS) {
		Adapter->bFWReady = false;
		pHalData->fw_ractrl = false;
		DBG_8723A("fw download fail!\n");
		goto exit;
	} else {
		Adapter->bFWReady = true;
		pHalData->fw_ractrl = true;
		DBG_8723A("fw download ok!\n");
	}

	rtl8723a_InitializeFirmwareVars(Adapter);

	if (pwrctrlpriv->reg_rfoff == true) {
		pwrctrlpriv->rf_pwrstate = rf_off;
	}

	/*  2010/08/09 MH We need to check if we need to turnon or off RF after detecting */
	/*  HW GPIO pin. Before PHY_RFConfig8192C. */
	/* HalDetectPwrDownMode(Adapter); */
	/*  2010/08/26 MH If Efuse does not support sective suspend then disable the function. */
	/* HalDetectSelectiveSuspendMode(Adapter); */

	/*  Set RF type for BB/RF configuration */
	_InitRFType(Adapter);/* _ReadRFType() */

	/*  Save target channel */
	/*  <Roger_Notes> Current Channel will be updated again later. */
	pHalData->CurrentChannel = 6;/* default set to 6 */

	status = PHY_MACConfig8723A(Adapter);
	if (status == _FAIL) {
		DBG_8723A("PHY_MACConfig8723A fault !!\n");
		goto exit;
	}

	/*  */
	/* d. Initialize BB related configurations. */
	/*  */
	status = PHY_BBConfig8723A(Adapter);
	if (status == _FAIL) {
		DBG_8723A("PHY_BBConfig8723A fault !!\n");
		goto exit;
	}

	/*  Add for tx power by rate fine tune. We need to call the function after BB config. */
	/*  Because the tx power by rate table is inited in BB config. */

	status = PHY_RF6052_Config8723A(Adapter);
	if (status == _FAIL) {
		DBG_8723A("PHY_RF6052_Config8723A failed!!\n");
		goto exit;
	}

	/* reducing 80M spur */
	PHY_SetBBReg(Adapter, RF_T_METER, bMaskDWord, 0x0381808d);
	PHY_SetBBReg(Adapter, RF_SYN_G4, bMaskDWord, 0xf2ffff83);
	PHY_SetBBReg(Adapter, RF_SYN_G4, bMaskDWord, 0xf2ffff82);
	PHY_SetBBReg(Adapter, RF_SYN_G4, bMaskDWord, 0xf2ffff83);

	/* RFSW Control */
	PHY_SetBBReg(Adapter, rFPGA0_TxInfo, bMaskDWord, 0x00000003);	/* 0x804[14]= 0 */
	PHY_SetBBReg(Adapter, rFPGA0_XAB_RFInterfaceSW, bMaskDWord, 0x07000760);	/* 0x870[6:5]= b'11 */
	PHY_SetBBReg(Adapter, rFPGA0_XA_RFInterfaceOE, bMaskDWord, 0x66F60210); /* 0x860[6:5]= b'00 */

	RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("%s: 0x870 = value 0x%x\n", __func__, PHY_QueryBBReg(Adapter, 0x870, bMaskDWord)));

	/*  */
	/*  Joseph Note: Keep RfRegChnlVal for later use. */
	/*  */
	pHalData->RfRegChnlVal[0] = PHY_QueryRFReg(Adapter, (enum RF_RADIO_PATH)0, RF_CHNLBW, bRFRegOffsetMask);
	pHalData->RfRegChnlVal[1] = PHY_QueryRFReg(Adapter, (enum RF_RADIO_PATH)1, RF_CHNLBW, bRFRegOffsetMask);

	if (!pHalData->bMACFuncEnable) {
		_InitQueueReservedPage(Adapter);
		_InitTxBufferBoundary(Adapter);
	}
	_InitQueuePriority(Adapter);
	_InitPageBoundary(Adapter);
	_InitTransferPageSize(Adapter);

	/*  Get Rx PHY status in order to report RSSI and others. */
	_InitDriverInfoSize(Adapter, DRVINFO_SZ);

	_InitInterrupt(Adapter);
	hw_var_set_macaddr(Adapter, Adapter->eeprompriv.mac_addr);
	rtl8723a_set_media_status(Adapter, MSR_INFRA);
	_InitWMACSetting(Adapter);
	_InitAdaptiveCtrl(Adapter);
	_InitEDCA(Adapter);
	_InitRateFallback(Adapter);
	_InitRetryFunction(Adapter);
	rtl8723a_InitBeaconParameters(Adapter);

	_InitHWLed(Adapter);

	_BBTurnOnBlock(Adapter);
	/* NicIFSetMacAddress(padapter, padapter->PermanentAddress); */

	rtl8723a_cam_invalidate_all(Adapter);

	/*  2010/12/17 MH We need to set TX power according to EFUSE content at first. */
	PHY_SetTxPowerLevel8723A(Adapter, pHalData->CurrentChannel);

	rtl8723a_InitAntenna_Selection(Adapter);

	/*  HW SEQ CTRL */
	/* set 0x0 to 0xFF by tynli. Default enable HW SEQ NUM. */
	rtl8723au_write8(Adapter, REG_HWSEQ_CTRL, 0xFF);

	/*  */
	/*  Disable BAR, suggested by Scott */
	/*  2010.04.09 add by hpfan */
	/*  */
	rtl8723au_write32(Adapter, REG_BAR_MODE_CTRL, 0x0201ffff);

	if (pregistrypriv->wifi_spec)
		rtl8723au_write16(Adapter, REG_FAST_EDCA_CTRL, 0);

	/*  Move by Neo for USB SS from above setp */
	_RfPowerSave(Adapter);

	/*  2010/08/26 MH Merge from 8192CE. */
	/* sherry masked that it has been done in _RfPowerSave */
	/* 20110927 */
	/* recovery for 8192cu and 9723Au 20111017 */
	if (pwrctrlpriv->rf_pwrstate == rf_on) {
		if (pHalData->bIQKInitialized) {
			rtl8723a_phy_iq_calibrate(Adapter, true);
		} else {
			rtl8723a_phy_iq_calibrate(Adapter, false);
			pHalData->bIQKInitialized = true;
		}

		rtl8723a_odm_check_tx_power_tracking(Adapter);

		rtl8723a_phy_lc_calibrate(Adapter);

		rtl8723a_dual_antenna_detection(Adapter);
	}

	/* fixed USB interface interference issue */
	rtl8723au_write8(Adapter, 0xfe40, 0xe0);
	rtl8723au_write8(Adapter, 0xfe41, 0x8d);
	rtl8723au_write8(Adapter, 0xfe42, 0x80);
	rtl8723au_write32(Adapter, 0x20c, 0xfd0320);
	/* Solve too many protocol error on USB bus */
	if (!IS_81xxC_VENDOR_UMC_A_CUT(pHalData->VersionID)) {
		/*  0xE6 = 0x94 */
		rtl8723au_write8(Adapter, 0xFE40, 0xE6);
		rtl8723au_write8(Adapter, 0xFE41, 0x94);
		rtl8723au_write8(Adapter, 0xFE42, 0x80);

		/*  0xE0 = 0x19 */
		rtl8723au_write8(Adapter, 0xFE40, 0xE0);
		rtl8723au_write8(Adapter, 0xFE41, 0x19);
		rtl8723au_write8(Adapter, 0xFE42, 0x80);

		/*  0xE5 = 0x91 */
		rtl8723au_write8(Adapter, 0xFE40, 0xE5);
		rtl8723au_write8(Adapter, 0xFE41, 0x91);
		rtl8723au_write8(Adapter, 0xFE42, 0x80);

		/*  0xE2 = 0x81 */
		rtl8723au_write8(Adapter, 0xFE40, 0xE2);
		rtl8723au_write8(Adapter, 0xFE41, 0x81);
		rtl8723au_write8(Adapter, 0xFE42, 0x80);

	}

/*	_InitPABias(Adapter); */

	/*  Init BT hw config. */
	rtl8723a_BT_init_hwconfig(Adapter);

	rtl8723a_InitHalDm(Adapter);

	val8 = ((WiFiNavUpperUs + HAL_8723A_NAV_UPPER_UNIT - 1) /
		HAL_8723A_NAV_UPPER_UNIT);
	rtl8723au_write8(Adapter, REG_NAV_UPPER, val8);

	/*  2011/03/09 MH debug only, UMC-B cut pass 2500 S5 test, but we need to fin root cause. */
	if (((rtl8723au_read32(Adapter, rFPGA0_RFMOD) & 0xFF000000) !=
	     0x83000000)) {
		PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(24), 1);
		RT_TRACE(_module_hci_hal_init_c_, _drv_err_, ("%s: IQK fail recorver\n", __func__));
	}

	/* ack for xmit mgmt frames. */
	rtl8723au_write32(Adapter, REG_FWHW_TXQ_CTRL,
			  rtl8723au_read32(Adapter, REG_FWHW_TXQ_CTRL)|BIT(12));

exit:
	if (status == _SUCCESS) {
		Adapter->hw_init_completed = true;

		if (Adapter->registrypriv.notch_filter == 1)
			rtl8723a_notch_filter(Adapter, 1);
	}

	DBG_8723A("%s in %dms\n", __func__,
		  jiffies_to_msecs(jiffies - init_start_time));
	return status;
}

static void phy_SsPwrSwitch92CU(struct rtw_adapter *Adapter,
				enum rt_rf_power_state eRFPowerState,
				int bRegSSPwrLvl)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
	u8 value8;
	u8 bytetmp;

	switch (eRFPowerState) {
	case rf_on:
		if (bRegSSPwrLvl == 1) {
			/*  1. Enable MAC Clock. Can not be enabled now. */
			/* WriteXBYTE(REG_SYS_CLKR+1,
			   ReadXBYTE(REG_SYS_CLKR+1) | BIT(3)); */

			/*  2. Force PWM, Enable SPS18_LDO_Marco_Block */
			rtl8723au_write8(Adapter, REG_SPS0_CTRL,
					 rtl8723au_read8(Adapter, REG_SPS0_CTRL) |
					 BIT(0) | BIT(3));

			/*  3. restore BB, AFE control register. */
			/* RF */
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
					     0x380038, 1);
			else
				PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
					     0x38, 1);
			PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 1);
			PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(1), 0);

			/* AFE */
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
					     0x63DB25A0);
			else if (pHalData->rf_type ==  RF_1T1R)
				PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
					     0x631B25A0);

			/*  4. issue 3-wire command that RF set to Rx idle
			    mode. This is used to re-write the RX idle mode. */
			/*  We can only prvide a usual value instead and then
			    HW will modify the value by itself. */
			PHY_SetRFReg(Adapter, RF_PATH_A, 0,
				     bRFRegOffsetMask, 0x32D95);
			if (pHalData->rf_type ==  RF_2T2R) {
				PHY_SetRFReg(Adapter, RF_PATH_B, 0,
					     bRFRegOffsetMask, 0x32D95);
			}
		} else {		/*  Level 2 or others. */
			/* h.	AFE_PLL_CTRL 0x28[7:0] = 0x80
			   disable AFE PLL */
			rtl8723au_write8(Adapter, REG_AFE_PLL_CTRL, 0x81);

			/*  i.	AFE_XTAL_CTRL 0x24[15:0] = 0x880F
			    gated AFE DIG_CLOCK */
			rtl8723au_write16(Adapter, REG_AFE_XTAL_CTRL, 0x800F);
			mdelay(1);

			/*  2. Force PWM, Enable SPS18_LDO_Marco_Block */
			rtl8723au_write8(Adapter, REG_SPS0_CTRL,
					 rtl8723au_read8(Adapter, REG_SPS0_CTRL) |
					 BIT(0) | BIT(3));

			/*  3. restore BB, AFE control register. */
			/* RF */
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
					     0x380038, 1);
			else
				PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
					     0x38, 1);
			PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 1);
			PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(1), 0);

			/* AFE */
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetBBReg(Adapter, rRx_Wait_CCA,
					     bMaskDWord, 0x63DB25A0);
			else if (pHalData->rf_type ==  RF_1T1R)
				PHY_SetBBReg(Adapter, rRx_Wait_CCA,
					     bMaskDWord, 0x631B25A0);

			/*  4. issue 3-wire command that RF set to Rx idle
			    mode. This is used to re-write the RX idle mode. */
			/*  We can only prvide a usual value instead and
			    then HW will modify the value by itself. */
			PHY_SetRFReg(Adapter, RF_PATH_A, 0,
				     bRFRegOffsetMask, 0x32D95);
			if (pHalData->rf_type ==  RF_2T2R) {
				PHY_SetRFReg(Adapter, RF_PATH_B, 0,
					     bRFRegOffsetMask, 0x32D95);
			}

			/*  5. gated MAC Clock */
			bytetmp = rtl8723au_read8(Adapter, REG_APSD_CTRL);
			rtl8723au_write8(Adapter, REG_APSD_CTRL,
					 bytetmp & ~BIT(6));

			mdelay(10);

			/*  Set BB reset at first */
			/* 0x16 */
			rtl8723au_write8(Adapter, REG_SYS_FUNC_EN, 0x17);

			/*  Enable TX */
			rtl8723au_write8(Adapter, REG_TXPAUSE, 0x0);
		}
		break;
	case rf_sleep:
	case rf_off:
		value8 = rtl8723au_read8(Adapter, REG_SPS0_CTRL);
		if (IS_81xxC_VENDOR_UMC_B_CUT(pHalData->VersionID))
			value8 &= ~BIT(0);
		else
			value8 &= ~(BIT(0) | BIT(3));
		if (bRegSSPwrLvl == 1) {
			RT_TRACE(_module_hal_init_c_, _drv_err_, ("SS LVL1\n"));
			/*  Disable RF and BB only for SelectSuspend. */

			/*  1. Set BB/RF to shutdown. */
			/*	(1) Reg878[5:3]= 0	 RF rx_code for
							preamble power saving */
			/*	(2)Reg878[21:19]= 0	Turn off RF-B */
			/*	(3) RegC04[7:4]= 0	Turn off all paths
							for packet detection */
			/*	(4) Reg800[1] = 1	enable preamble power
							saving */
			Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] =
				PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter,
					       bMaskDWord);
			Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] =
				PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable,
					       bMaskDWord);
			Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] =
				PHY_QueryBBReg(Adapter, rFPGA0_RFMOD,
					       bMaskDWord);
			if (pHalData->rf_type ==  RF_2T2R) {
				PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
					     0x380038, 0);
			} else if (pHalData->rf_type ==  RF_1T1R) {
				PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
					     0x38, 0);
			}
			PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 0);
			PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(1), 1);

			/*  2 .AFE control register to power down. bit[30:22] */
			Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] =
				PHY_QueryBBReg(Adapter, rRx_Wait_CCA,
					       bMaskDWord);
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
					     0x00DB25A0);
			else if (pHalData->rf_type ==  RF_1T1R)
				PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
					     0x001B25A0);

			/*  3. issue 3-wire command that RF set to power down.*/
			PHY_SetRFReg(Adapter, RF_PATH_A, 0, bRFRegOffsetMask, 0);
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetRFReg(Adapter, RF_PATH_B, 0,
					     bRFRegOffsetMask, 0);

			/*  4. Force PFM , disable SPS18_LDO_Marco_Block */
			rtl8723au_write8(Adapter, REG_SPS0_CTRL, value8);
		} else {	/*  Level 2 or others. */
			RT_TRACE(_module_hal_init_c_, _drv_err_, ("SS LVL2\n"));
			{
				u8 eRFPath = RF_PATH_A, value8 = 0;
				rtl8723au_write8(Adapter, REG_TXPAUSE, 0xFF);
				PHY_SetRFReg(Adapter,
					     (enum RF_RADIO_PATH)eRFPath,
					     0x0, bMaskByte0, 0x0);
				value8 |= APSDOFF;
				/* 0x40 */
				rtl8723au_write8(Adapter, REG_APSD_CTRL,
						 value8);

				/*  After switch APSD, we need to delay
				    for stability */
				mdelay(10);

				/*  Set BB reset at first */
				value8 = 0;
				value8 |= (FEN_USBD | FEN_USBA |
					   FEN_BB_GLB_RSTn);
				/* 0x16 */
				rtl8723au_write8(Adapter, REG_SYS_FUNC_EN,
						 value8);
			}

			/*  Disable RF and BB only for SelectSuspend. */

			/*  1. Set BB/RF to shutdown. */
			/*	(1) Reg878[5:3]= 0	RF rx_code for
							preamble power saving */
			/*	(2)Reg878[21:19]= 0	Turn off RF-B */
			/*	(3) RegC04[7:4]= 0	Turn off all paths for
							packet detection */
			/*	(4) Reg800[1] = 1	enable preamble power
							saving */
			Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF0] =
				PHY_QueryBBReg(Adapter, rFPGA0_XAB_RFParameter,
					       bMaskDWord);
			Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF1] =
				PHY_QueryBBReg(Adapter, rOFDM0_TRxPathEnable,
					       bMaskDWord);
			Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_RF2] =
				PHY_QueryBBReg(Adapter, rFPGA0_RFMOD,
					       bMaskDWord);
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
					     0x380038, 0);
			else if (pHalData->rf_type ==  RF_1T1R)
				PHY_SetBBReg(Adapter, rFPGA0_XAB_RFParameter,
					     0x38, 0);
			PHY_SetBBReg(Adapter, rOFDM0_TRxPathEnable, 0xf0, 0);
			PHY_SetBBReg(Adapter, rFPGA0_RFMOD, BIT(1), 1);

			/*  2 .AFE control register to power down. bit[30:22] */
			Adapter->pwrctrlpriv.PS_BBRegBackup[PSBBREG_AFE0] =
				PHY_QueryBBReg(Adapter, rRx_Wait_CCA,
					       bMaskDWord);
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
					     0x00DB25A0);
			else if (pHalData->rf_type ==  RF_1T1R)
				PHY_SetBBReg(Adapter, rRx_Wait_CCA, bMaskDWord,
					     0x001B25A0);

			/* 3. issue 3-wire command that RF set to power down. */
			PHY_SetRFReg(Adapter, RF_PATH_A, 0, bRFRegOffsetMask, 0);
			if (pHalData->rf_type ==  RF_2T2R)
				PHY_SetRFReg(Adapter, RF_PATH_B, 0,
					     bRFRegOffsetMask, 0);

			/*  4. Force PFM , disable SPS18_LDO_Marco_Block */
			rtl8723au_write8(Adapter, REG_SPS0_CTRL, value8);

			/*  2010/10/13 MH/Isaachsu exchange sequence. */
			/* h.	AFE_PLL_CTRL 0x28[7:0] = 0x80
				disable AFE PLL */
			rtl8723au_write8(Adapter, REG_AFE_PLL_CTRL, 0x80);
			mdelay(1);

			/*  i.	AFE_XTAL_CTRL 0x24[15:0] = 0x880F
				gated AFE DIG_CLOCK */
			rtl8723au_write16(Adapter, REG_AFE_XTAL_CTRL, 0xA80F);
		}
		break;
	default:
		break;
	}

}	/*  phy_PowerSwitch92CU */

void _ps_open_RF23a(struct rtw_adapter *padapter)
{
	/* here call with bRegSSPwrLvl 1, bRegSSPwrLvl 2 needs to be verified */
	phy_SsPwrSwitch92CU(padapter, rf_on, 1);
}

static void CardDisableRTL8723U(struct rtw_adapter *Adapter)
{
	u8		u1bTmp;

	DBG_8723A("CardDisableRTL8723U\n");
	/*  USB-MF Card Disable Flow */
	/*  1. Run LPS WL RFOFF flow */
	HalPwrSeqCmdParsing23a(Adapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
			    PWR_INTF_USB_MSK, rtl8723AU_enter_lps_flow);

	/*  2. 0x1F[7:0] = 0		turn off RF */
	rtl8723au_write8(Adapter, REG_RF_CTRL, 0x00);

	/*	==== Reset digital sequence   ====== */
	if ((rtl8723au_read8(Adapter, REG_MCUFWDL) & BIT(7)) &&
	    Adapter->bFWReady) /* 8051 RAM code */
		rtl8723a_FirmwareSelfReset(Adapter);

	/*  Reset MCU. Suggested by Filen. 2011.01.26. by tynli. */
	u1bTmp = rtl8723au_read8(Adapter, REG_SYS_FUNC_EN+1);
	rtl8723au_write8(Adapter, REG_SYS_FUNC_EN+1, u1bTmp & ~BIT(2));

	/*  g.	MCUFWDL 0x80[1:0]= 0		reset MCU ready status */
	rtl8723au_write8(Adapter, REG_MCUFWDL, 0x00);

	/*	==== Reset digital sequence end ====== */
	/*  Card disable power action flow */
	HalPwrSeqCmdParsing23a(Adapter, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
			       PWR_INTF_USB_MSK,
			       rtl8723AU_card_disable_flow);

	/*  Reset MCU IO Wrapper, added by Roger, 2011.08.30. */
	u1bTmp = rtl8723au_read8(Adapter, REG_RSV_CTRL + 1);
	rtl8723au_write8(Adapter, REG_RSV_CTRL+1, u1bTmp & ~BIT(0));
	u1bTmp = rtl8723au_read8(Adapter, REG_RSV_CTRL + 1);
	rtl8723au_write8(Adapter, REG_RSV_CTRL+1, u1bTmp | BIT(0));

	/*  7. RSV_CTRL 0x1C[7:0] = 0x0E  lock ISO/CLK/Power control register */
	rtl8723au_write8(Adapter, REG_RSV_CTRL, 0x0e);
}

int rtl8723au_hal_deinit(struct rtw_adapter *padapter)
{
	DBG_8723A("==> %s\n", __func__);

#ifdef CONFIG_8723AU_BT_COEXIST
	BT_HaltProcess(padapter);
#endif
	/*  2011/02/18 To Fix RU LNA  power leakage problem. We need to
	    execute below below in Adapter init and halt sequence.
	    According to EEchou's opinion, we can enable the ability for all */
	/*  IC. Accord to johnny's opinion, only RU need the support. */
	CardDisableRTL8723U(padapter);

	padapter->hw_init_completed = false;

	return _SUCCESS;
}

int rtl8723au_inirp_init(struct rtw_adapter *Adapter)
{
	u8 i;
	struct recv_buf *precvbuf;
	int status;
	struct recv_priv *precvpriv = &Adapter->recvpriv;
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);

	status = _SUCCESS;

	RT_TRACE(_module_hci_hal_init_c_, _drv_info_, ("===> usb_inirp_init\n"));

	/* issue Rx irp to receive data */
	precvbuf = (struct recv_buf *)precvpriv->precv_buf;
	for (i = 0; i < NR_RECVBUFF; i++) {
		if (rtl8723au_read_port(Adapter, RECV_BULK_IN_ADDR, 0,
					precvbuf) == _FAIL) {
			RT_TRACE(_module_hci_hal_init_c_, _drv_err_,
				 ("usb_rx_init: usb_read_port error\n"));
			status = _FAIL;
			goto exit;
		}
		precvbuf++;
	}
	if (rtl8723au_read_interrupt(Adapter, RECV_INT_IN_ADDR) == _FAIL) {
		RT_TRACE(_module_hci_hal_init_c_, _drv_err_,
			 ("usb_rx_init: usb_read_interrupt error\n"));
		status = _FAIL;
	}
	pHalData->IntrMask[0] = rtl8723au_read32(Adapter, REG_USB_HIMR);
	MSG_8723A("pHalData->IntrMask = 0x%04x\n", pHalData->IntrMask[0]);
	pHalData->IntrMask[0] |= UHIMR_C2HCMD|UHIMR_CPWM;
	rtl8723au_write32(Adapter, REG_USB_HIMR, pHalData->IntrMask[0]);
exit:
	RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
		 ("<=== usb_inirp_init\n"));
	return status;
}

int rtl8723au_inirp_deinit(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a	*pHalData = GET_HAL_DATA(Adapter);

	RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
		 ("\n ===> usb_rx_deinit\n"));
	rtl8723au_read_port_cancel(Adapter);
	pHalData->IntrMask[0] = rtl8723au_read32(Adapter, REG_USB_HIMR);
	MSG_8723A("%s pHalData->IntrMask = 0x%04x\n", __func__,
		  pHalData->IntrMask[0]);
	pHalData->IntrMask[0] = 0x0;
	rtl8723au_write32(Adapter, REG_USB_HIMR, pHalData->IntrMask[0]);
	RT_TRACE(_module_hci_hal_init_c_, _drv_info_,
		 ("\n <=== usb_rx_deinit\n"));
	return _SUCCESS;
}

static void _ReadBoardType(struct rtw_adapter *Adapter, u8 *PROMContent,
			   bool AutoloadFail)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
	u8 boardType = BOARD_USB_DONGLE;

	if (AutoloadFail) {
		if (IS_8723_SERIES(pHalData->VersionID))
			pHalData->rf_type = RF_1T1R;
		else
			pHalData->rf_type = RF_2T2R;
		pHalData->BoardType = boardType;
		return;
	}

	boardType = PROMContent[EEPROM_NORMAL_BoardType];
	boardType &= BOARD_TYPE_NORMAL_MASK;/* bit[7:5] */
	boardType >>= 5;

	pHalData->BoardType = boardType;
	MSG_8723A("_ReadBoardType(%x)\n", pHalData->BoardType);

	if (boardType == BOARD_USB_High_PA)
		pHalData->ExternalPA = 1;
}

static void _ReadLEDSetting(struct rtw_adapter *Adapter, u8 *PROMContent,
			    bool AutoloadFail)
{
	struct led_priv *pledpriv = &Adapter->ledpriv;

	pledpriv->LedStrategy = HW_LED;
}

static void Hal_EfuseParseMACAddr_8723AU(struct rtw_adapter *padapter,
					 u8 *hwinfo, bool AutoLoadFail)
{
	u16 i;
	u8 sMacAddr[ETH_ALEN] = {0x00, 0xE0, 0x4C, 0x87, 0x23, 0x00};
	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);

	if (AutoLoadFail) {
		for (i = 0; i < 6; i++)
			pEEPROM->mac_addr[i] = sMacAddr[i];
	} else {
		/* Read Permanent MAC address */
		memcpy(pEEPROM->mac_addr, &hwinfo[EEPROM_MAC_ADDR_8723AU],
		       ETH_ALEN);
	}

	RT_TRACE(_module_hci_hal_init_c_, _drv_notice_,
		 ("Hal_EfuseParseMACAddr_8723AU: Permanent Address =%02x:%02x:"
		  "%02x:%02x:%02x:%02x\n",
		  pEEPROM->mac_addr[0], pEEPROM->mac_addr[1],
		  pEEPROM->mac_addr[2], pEEPROM->mac_addr[3],
		  pEEPROM->mac_addr[4], pEEPROM->mac_addr[5]));
}

static void readAdapterInfo(struct rtw_adapter *padapter)
{
	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(padapter);
	/* struct hal_data_8723a * pHalData = GET_HAL_DATA(padapter); */
	u8 hwinfo[HWSET_MAX_SIZE];

	Hal_InitPGData(padapter, hwinfo);
	Hal_EfuseParseIDCode(padapter, hwinfo);
	Hal_EfuseParseEEPROMVer(padapter, hwinfo,
				pEEPROM->bautoload_fail_flag);
	Hal_EfuseParseMACAddr_8723AU(padapter, hwinfo,
				     pEEPROM->bautoload_fail_flag);
	Hal_EfuseParsetxpowerinfo_8723A(padapter, hwinfo,
					pEEPROM->bautoload_fail_flag);
	_ReadBoardType(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
	Hal_EfuseParseBTCoexistInfo_8723A(padapter, hwinfo,
					  pEEPROM->bautoload_fail_flag);

	rtl8723a_EfuseParseChnlPlan(padapter, hwinfo,
				    pEEPROM->bautoload_fail_flag);
	Hal_EfuseParseThermalMeter_8723A(padapter, hwinfo,
					 pEEPROM->bautoload_fail_flag);
	_ReadLEDSetting(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
/*	_ReadRFSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); */
/*	_ReadPSSetting(Adapter, PROMContent, pEEPROM->bautoload_fail_flag); */
	Hal_EfuseParseAntennaDiversity(padapter, hwinfo,
				       pEEPROM->bautoload_fail_flag);

	Hal_EfuseParseEEPROMVer(padapter, hwinfo, pEEPROM->bautoload_fail_flag);
	Hal_EfuseParseCustomerID(padapter, hwinfo,
				 pEEPROM->bautoload_fail_flag);
	Hal_EfuseParseRateIndicationOption(padapter, hwinfo,
					   pEEPROM->bautoload_fail_flag);
	Hal_EfuseParseXtal_8723A(padapter, hwinfo,
				 pEEPROM->bautoload_fail_flag);
	/*  */
	/*  The following part initialize some vars by PG info. */
	/*  */
	Hal_InitChannelPlan23a(padapter);

	/* hal_CustomizedBehavior_8723U(Adapter); */

/*	Adapter->bDongle = (PROMContent[EEPROM_EASY_REPLACEMENT] == 1)? 0: 1; */
	DBG_8723A("%s(): REPLACEMENT = %x\n", __func__, padapter->bDongle);
}

static void _ReadPROMContent(struct rtw_adapter *Adapter)
{
	struct eeprom_priv *pEEPROM = GET_EEPROM_EFUSE_PRIV(Adapter);
	u8 eeValue;

	eeValue = rtl8723au_read8(Adapter, REG_9346CR);
	/*  To check system boot selection. */
	pEEPROM->EepromOrEfuse = (eeValue & BOOT_FROM_EEPROM) ? true : false;
	pEEPROM->bautoload_fail_flag = (eeValue & EEPROM_EN) ? false : true;

	DBG_8723A("Boot from %s, Autoload %s !\n",
		  (pEEPROM->EepromOrEfuse ? "EEPROM" : "EFUSE"),
		  (pEEPROM->bautoload_fail_flag ? "Fail" : "OK"));

	readAdapterInfo(Adapter);
}

static void _ReadRFType(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);

	pHalData->rf_chip = RF_6052;
}

static void _ReadSilmComboMode(struct rtw_adapter *Adapter)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);

	pHalData->SlimComboDbg = false;	/*  Default is not debug mode. */
}

/*  */
/*	Description: */
/*		We should set Efuse cell selection to WiFi cell in default. */
/*  */
/*	Assumption: */
/*		PASSIVE_LEVEL */
/*  */
/*	Added by Roger, 2010.11.23. */
/*  */
static void hal_EfuseCellSel(struct rtw_adapter *Adapter)
{
	u32 value32;

	value32 = rtl8723au_read32(Adapter, EFUSE_TEST);
	value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0);
	rtl8723au_write32(Adapter, EFUSE_TEST, value32);
}

void rtl8723a_read_adapter_info(struct rtw_adapter *Adapter)
{
	unsigned long start = jiffies;

	/*  Read EEPROM size before call any EEPROM function */
	Adapter->EepromAddressSize = GetEEPROMSize8723A(Adapter);

	MSG_8723A("====> _ReadAdapterInfo8723AU\n");

	hal_EfuseCellSel(Adapter);

	_ReadRFType(Adapter);/* rf_chip -> _InitRFType() */
	_ReadPROMContent(Adapter);

	/*  2010/10/25 MH THe function must be called after
	    borad_type & IC-Version recognize. */
	_ReadSilmComboMode(Adapter);

	/* MSG_8723A("%s()(done), rf_chip = 0x%x, rf_type = 0x%x\n",
	   __func__, pHalData->rf_chip, pHalData->rf_type); */

	MSG_8723A("<==== _ReadAdapterInfo8723AU in %d ms\n",
		  jiffies_to_msecs(jiffies - start));
}

/*  */
/*	Description: */
/*		Query setting of specified variable. */
/*  */
int GetHalDefVar8192CUsb(struct rtw_adapter *Adapter,
			 enum hal_def_variable eVariable, void *pValue)
{
	struct hal_data_8723a *pHalData = GET_HAL_DATA(Adapter);
	int bResult = _SUCCESS;

	switch (eVariable) {
	case HAL_DEF_UNDERCORATEDSMOOTHEDPWDB:
		*((int *)pValue) = pHalData->dmpriv.UndecoratedSmoothedPWDB;
		break;
	case HAL_DEF_IS_SUPPORT_ANT_DIV:
		break;
	case HAL_DEF_CURRENT_ANTENNA:
		break;
	case HAL_DEF_DRVINFO_SZ:
		*((u32 *)pValue) = DRVINFO_SZ;
		break;
	case HAL_DEF_MAX_RECVBUF_SZ:
		*((u32 *)pValue) = MAX_RECVBUF_SZ;
		break;
	case HAL_DEF_RX_PACKET_OFFSET:
		*((u32 *)pValue) = RXDESC_SIZE + DRVINFO_SZ;
		break;
	case HAL_DEF_DBG_DUMP_RXPKT:
		*((u8 *)pValue) = pHalData->bDumpRxPkt;
		break;
	case HAL_DEF_DBG_DM_FUNC:
		*((u32 *)pValue) = pHalData->odmpriv.SupportAbility;
		break;
	case HW_VAR_MAX_RX_AMPDU_FACTOR:
		*((u32 *)pValue) = IEEE80211_HT_MAX_AMPDU_64K;
		break;
	case HW_DEF_ODM_DBG_FLAG:
	{
		struct dm_odm_t	*pDM_Odm = &pHalData->odmpriv;
		printk("pDM_Odm->DebugComponents = 0x%llx\n",
		       pDM_Odm->DebugComponents);
	}
		break;
	default:
		/* RT_TRACE(COMP_INIT, DBG_WARNING, ("GetHalDefVar8192CUsb(): "
		   "Unkown variable: %d!\n", eVariable)); */
		bResult = _FAIL;
		break;
	}

	return bResult;
}

void rtl8723a_update_ramask(struct rtw_adapter *padapter,
			    u32 mac_id, u8 rssi_level)
{
	u8	init_rate = 0;
	u8	networkType, raid;
	u32	mask, rate_bitmap;
	u8	shortGIrate = false;
	int	supportRateNum = 0;
	struct sta_info	*psta;
	struct hal_data_8723a	*pHalData = GET_HAL_DATA(padapter);
	struct dm_priv	*pdmpriv = &pHalData->dmpriv;
	struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
	struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
	struct wlan_bssid_ex *cur_network = &pmlmeinfo->network;

	if (mac_id >= NUM_STA) /* CAM_SIZE */
		return;

	psta = pmlmeinfo->FW_sta_info[mac_id].psta;
	if (psta == NULL)
		return;

	switch (mac_id) {
	case 0:/*  for infra mode */
		supportRateNum =
			rtw_get_rateset_len23a(cur_network->SupportedRates);
		networkType = judge_network_type23a(padapter,
						 cur_network->SupportedRates,
						 supportRateNum) & 0xf;
		/* pmlmeext->cur_wireless_mode = networkType; */
		raid = networktype_to_raid23a(networkType);

		mask = update_supported_rate23a(cur_network->SupportedRates,
					     supportRateNum);
		mask |= (pmlmeinfo->HT_enable) ?
			update_MSC_rate23a(&pmlmeinfo->ht_cap) : 0;

		if (support_short_GI23a(padapter, &pmlmeinfo->ht_cap))
			shortGIrate = true;
		break;

	case 1:/* for broadcast/multicast */
		supportRateNum = rtw_get_rateset_len23a(
			pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
		if (pmlmeext->cur_wireless_mode & WIRELESS_11B)
			networkType = WIRELESS_11B;
		else
			networkType = WIRELESS_11G;
		raid = networktype_to_raid23a(networkType);

		mask = update_basic_rate23a(cur_network->SupportedRates,
					 supportRateNum);
		break;

	default: /* for each sta in IBSS */
		supportRateNum = rtw_get_rateset_len23a(
			pmlmeinfo->FW_sta_info[mac_id].SupportedRates);
		networkType = judge_network_type23a(padapter,
						 pmlmeinfo->FW_sta_info[mac_id].SupportedRates,
						 supportRateNum) & 0xf;
		/* pmlmeext->cur_wireless_mode = networkType; */
		raid = networktype_to_raid23a(networkType);

		mask = update_supported_rate23a(cur_network->SupportedRates,
					     supportRateNum);

		/* todo: support HT in IBSS */
		break;
	}

	/* mask &= 0x0fffffff; */
	rate_bitmap = 0x0fffffff;
	rate_bitmap = ODM_Get_Rate_Bitmap23a(pHalData, mac_id, mask,
					     rssi_level);
	DBG_8723A("%s => mac_id:%d, networkType:0x%02x, "
		  "mask:0x%08x\n\t ==> rssi_level:%d, rate_bitmap:0x%08x\n",
		  __func__, mac_id, networkType, mask, rssi_level, rate_bitmap);

	mask &= rate_bitmap;
	mask |= ((raid<<28)&0xf0000000);

	init_rate = get_highest_rate_idx23a(mask)&0x3f;

	if (pHalData->fw_ractrl == true) {
		u8 arg = 0;

		/* arg = (cam_idx-4)&0x1f;MACID */
		arg = mac_id&0x1f;/* MACID */

		arg |= BIT(7);

		if (shortGIrate == true)
			arg |= BIT(5);

		DBG_8723A("update raid entry, mask = 0x%x, arg = 0x%x\n",
			  mask, arg);

		rtl8723a_set_raid_cmd(padapter, mask, arg);
	} else {
		if (shortGIrate == true)
			init_rate |= BIT(6);

		rtl8723au_write8(padapter, (REG_INIDATA_RATE_SEL+mac_id),
				 init_rate);
	}

	/* set ra_id */
	psta->raid = raid;
	psta->init_rate = init_rate;

	/* set correct initial date rate for each mac_id */
	pdmpriv->INIDATA_RATE[mac_id] = init_rate;
}
