⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ar5416_reset.c.svn-base

📁 最新之atheros芯片driver source code, 基于linux操作系统,內含atheros芯片HAL全部代码
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
              | POW_SM(ratesArray[rate5_5l], 0)        );    HALDEBUG(ah, HAL_DEBUG_RESET,	"%s AR_PHY_POWER_TX_RATE3=0x%x AR_PHY_POWER_TX_RATE4=0x%x\n",	    __func__, OS_REG_READ(ah,AR_PHY_POWER_TX_RATE3),	    OS_REG_READ(ah,AR_PHY_POWER_TX_RATE4));     }    /* Write the HT20 power per rate set */    OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE5,        POW_SM(ratesArray[rateHt20_3], 24)          | POW_SM(ratesArray[rateHt20_2], 16)          | POW_SM(ratesArray[rateHt20_1], 8)          | POW_SM(ratesArray[rateHt20_0], 0)    );    OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE6,        POW_SM(ratesArray[rateHt20_7], 24)          | POW_SM(ratesArray[rateHt20_6], 16)          | POW_SM(ratesArray[rateHt20_5], 8)          | POW_SM(ratesArray[rateHt20_4], 0)    );    if (IS_CHAN_HT40(chan)) {        /* Write the HT40 power per rate set */	/* Correct PAR difference between HT40 and HT20/LEGACY */        OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE7,            POW_SM(ratesArray[rateHt40_3] + ht40PowerIncForPdadc, 24)              | POW_SM(ratesArray[rateHt40_2] + ht40PowerIncForPdadc, 16)              | POW_SM(ratesArray[rateHt40_1] + ht40PowerIncForPdadc, 8)              | POW_SM(ratesArray[rateHt40_0] + ht40PowerIncForPdadc, 0)        );        OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE8,            POW_SM(ratesArray[rateHt40_7] + ht40PowerIncForPdadc, 24)              | POW_SM(ratesArray[rateHt40_6] + ht40PowerIncForPdadc, 16)              | POW_SM(ratesArray[rateHt40_5] + ht40PowerIncForPdadc, 8)              | POW_SM(ratesArray[rateHt40_4] + ht40PowerIncForPdadc, 0)        );        /* Write the Dup/Ext 40 power per rate set */        OS_REG_WRITE(ah, AR_PHY_POWER_TX_RATE9,            POW_SM(ratesArray[rateExtOfdm], 24)              | POW_SM(ratesArray[rateExtCck], 16)              | POW_SM(ratesArray[rateDupOfdm], 8)              | POW_SM(ratesArray[rateDupCck], 0)        );    }    /* Write the Power subtraction for dynamic chain changing, for per-packet powertx */    OS_REG_WRITE(ah, AR_PHY_POWER_TX_SUB,        POW_SM(pModal->pwrDecreaseFor3Chain, 6)          | POW_SM(pModal->pwrDecreaseFor2Chain, 0)    );    return AH_TRUE;#undef POW_SM#undef N}/* * Exported call to check for a recent gain reading and return * the current state of the thermal calibration gain engine. */HAL_RFGAINar5416GetRfgain(struct ath_hal *ah){	return HAL_RFGAIN_INACTIVE;}/* * Places all of hardware into reset */HAL_BOOLar5416Disable(struct ath_hal *ah){	if (!ar5212SetPowerMode(ah, HAL_PM_AWAKE, AH_TRUE))		return AH_FALSE;	return ar5416SetResetReg(ah, HAL_RESET_COLD);}/* * Places the PHY and Radio chips into reset.  A full reset * must be called to leave this state.  The PCI/MAC/PCU are * not placed into reset as we must receive interrupt to * re-enable the hardware. */HAL_BOOLar5416PhyDisable(struct ath_hal *ah){	return ar5416SetResetReg(ah, HAL_RESET_WARM);}/* * Write the given reset bit mask into the reset register */HAL_BOOLar5416SetResetReg(struct ath_hal *ah, uint32_t type){	/*	 * Set force wake	 */	OS_REG_WRITE(ah, AR_RTC_FORCE_WAKE,	     AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);	switch (type) {	case HAL_RESET_POWER_ON:		return ar5416SetResetPowerOn(ah);		break;	case HAL_RESET_WARM:	case HAL_RESET_COLD:		return ar5416SetReset(ah, type);		break;	default:		return AH_FALSE;	}}static HAL_BOOLar5416SetResetPowerOn(struct ath_hal *ah){    /* Power On Reset (Hard Reset) */    /*     * Set force wake     *	     * If the MAC was running, previously calling     * reset will wake up the MAC but it may go back to sleep     * before we can start polling.      * Set force wake  stops that      * This must be called before initiating a hard reset.     */    OS_REG_WRITE(ah, AR_RTC_FORCE_WAKE,            AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);        /*     * RTC reset and clear     */    OS_REG_WRITE(ah, AR_RTC_RESET, 0);    OS_DELAY(20);    OS_REG_WRITE(ah, AR_RTC_RESET, 1);    /*     * Poll till RTC is ON     */    if (!ath_hal_wait(ah, AR_RTC_STATUS, AR_RTC_PM_STATUS_M, AR_RTC_STATUS_ON)) {        HALDEBUG(ah, HAL_DEBUG_ANY, "%s: RTC not waking up\n", __func__);        return AH_FALSE;    }    return ar5416SetReset(ah, HAL_RESET_COLD);}static HAL_BOOLar5416SetReset(struct ath_hal *ah, int type){    uint32_t tmpReg;    /*     * Force wake     */    OS_REG_WRITE(ah, AR_RTC_FORCE_WAKE,	AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);    /*     * Reset AHB     */    tmpReg = OS_REG_READ(ah, AR_INTR_SYNC_CAUSE);    if (tmpReg & (AR_INTR_SYNC_LOCAL_TIMEOUT|AR_INTR_SYNC_RADM_CPL_TIMEOUT)) {	OS_REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0);	OS_REG_WRITE(ah, AR_RC, AR_RC_AHB|AR_RC_HOSTIF);    } else {	OS_REG_WRITE(ah, AR_RC, AR_RC_AHB);    }    /*     * Set Mac(BB,Phy) Warm Reset     */    switch (type) {    case HAL_RESET_WARM:            OS_REG_WRITE(ah, AR_RTC_RC, AR_RTC_RC_MAC_WARM);            break;        case HAL_RESET_COLD:            OS_REG_WRITE(ah, AR_RTC_RC, AR_RTC_RC_MAC_WARM|AR_RTC_RC_MAC_COLD);            break;        default:            HALASSERT(0);            break;    }    /*     * Clear resets and force wakeup     */    OS_REG_WRITE(ah, AR_RTC_RC, 0);    if (!ath_hal_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0)) {        HALDEBUG(ah, HAL_DEBUG_ANY, "%s: RTC stuck in MAC reset\n", __func__);        return AH_FALSE;    }    /* Clear AHB reset */    OS_REG_WRITE(ah, AR_RC, 0);   /* Set register and descriptor swapping on     * Bigendian platforms on cold reset     */#ifdef __BIG_ENDIAN__    if (type == HAL_RESET_COLD) {    		uint32_t	mask;				HALDEBUG(ah, HAL_DEBUG_RESET,		    "%s Applying descriptor swap\n", __func__);		mask = INIT_CONFIG_STATUS | AR_CFG_SWRD | AR_CFG_SWRG;#ifndef AH_NEED_DESC_SWAP		mask |= AR_CFG_SWTD;#endif		OS_REG_WRITE(ah, AR_CFG, LE_READ_4(&mask));	}#endif    ar5416InitPLL(ah, AH_NULL);    return AH_TRUE;}#ifndef IS_5GHZ_FAST_CLOCK_EN#define	IS_5GHZ_FAST_CLOCK_EN(ah, chan)	AH_FALSE#endifstatic voidar5416InitPLL(struct ath_hal *ah, HAL_CHANNEL *chan){	uint32_t pll;	if (AR_SREV_MERLIN_10_OR_LATER(ah)) {		pll = SM(0x5, AR_RTC_SOWL_PLL_REFDIV);		if (chan != AH_NULL && IS_CHAN_HALF_RATE(chan)) {			pll |= SM(0x1, AR_RTC_SOWL_PLL_CLKSEL);		} else if (chan && IS_CHAN_QUARTER_RATE(chan)) {			pll |= SM(0x2, AR_RTC_SOWL_PLL_CLKSEL);		}		if (chan != AH_NULL && IS_CHAN_5GHZ(chan)) {			pll |= SM(0x28, AR_RTC_SOWL_PLL_DIV);			/*			 * PLL WAR for Merlin 2.0/2.1			 * When doing fast clock, set PLL to 0x142c			 * Else, set PLL to 0x2850 to prevent reset-to-reset variation 			 */			if (AR_SREV_MERLIN_20(ah)) {				if (IS_5GHZ_FAST_CLOCK_EN(ah, chan)) {					pll = 0x142c;				} else {					pll = 0x2850;				}			}		} else {			pll |= SM(0x2c, AR_RTC_SOWL_PLL_DIV);		}	} else if (AR_SREV_SOWL_10_OR_LATER(ah)) {		pll = SM(0x5, AR_RTC_SOWL_PLL_REFDIV);		if (chan != AH_NULL && IS_CHAN_HALF_RATE(chan)) {			pll |= SM(0x1, AR_RTC_SOWL_PLL_CLKSEL);		} else if (chan && IS_CHAN_QUARTER_RATE(chan)) {			pll |= SM(0x2, AR_RTC_SOWL_PLL_CLKSEL);		}		if (chan != AH_NULL && IS_CHAN_5GHZ(chan)) {			pll |= SM(0x50, AR_RTC_SOWL_PLL_DIV);		} else {			pll |= SM(0x58, AR_RTC_SOWL_PLL_DIV);		}	} else {		pll = AR_RTC_PLL_REFDIV_5 | AR_RTC_PLL_DIV2;		if (chan != AH_NULL && IS_CHAN_HALF_RATE(chan)) {			pll |= SM(0x1, AR_RTC_PLL_CLKSEL);		} else if (chan != AH_NULL && IS_CHAN_QUARTER_RATE(chan)) {			pll |= SM(0x2, AR_RTC_PLL_CLKSEL);		}		if (chan != AH_NULL && IS_CHAN_5GHZ(chan)) {			pll |= SM(0xa, AR_RTC_PLL_DIV);		} else {			pll |= SM(0xb, AR_RTC_PLL_DIV);		}	}	OS_REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);	/* TODO:	* For multi-band owl, switch between bands by reiniting the PLL.	*/	OS_DELAY(RTC_PLL_SETTLE_DELAY);	OS_REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_SLEEP_DERIVED_CLK);}/* * Read EEPROM header info and program the device for correct operation * given the channel value. */static HAL_BOOLar5416SetBoardValues(struct ath_hal *ah, HAL_CHANNEL_INTERNAL *chan){    const HAL_EEPROM_v14 *ee = AH_PRIVATE(ah)->ah_eeprom;    const struct ar5416eeprom *eep = &ee->ee_base;    const MODAL_EEP_HEADER *pModal;    int			i, regChainOffset;    uint8_t		txRxAttenLocal;    /* workaround for eeprom versions <= 14.2 */    HALASSERT(AH_PRIVATE(ah)->ah_eeversion >= AR_EEPROM_VER14_1);    pModal = &(eep->modalHeader[IS_CHAN_2GHZ(chan)]);    txRxAttenLocal = IS_CHAN_2GHZ(chan) ? 23 : 44;    /* workaround for eeprom versions <= 14.2 */    OS_REG_WRITE(ah, AR_PHY_SWITCH_COM, pModal->antCtrlCommon);    for (i = 0; i < AR5416_MAX_CHAINS; i++) { 	   if (AR_SREV_MERLIN(ah)) {		if (i >= 2) break;	   }       	   if (AR_SREV_OWL_20_OR_LATER(ah) &&            (AH5416(ah)->ah_rx_chainmask == 0x5 ||	     AH5416(ah)->ah_tx_chainmask == 0x5) && i != 0) {            /* Regs are swapped from chain 2 to 1 for 5416 2_0 with              * only chains 0 and 2 populated              */            regChainOffset = (i == 1) ? 0x2000 : 0x1000;        } else {            regChainOffset = i * 0x1000;        }        OS_REG_WRITE(ah, AR_PHY_SWITCH_CHAIN_0 + regChainOffset, pModal->antCtrlChain[i]);        OS_REG_WRITE(ah, AR_PHY_TIMING_CTRL4 + regChainOffset,         	(OS_REG_READ(ah, AR_PHY_TIMING_CTRL4 + regChainOffset) &        	~(AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF)) |        	SM(pModal->iqCalICh[i], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) |        	SM(pModal->iqCalQCh[i], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF));        /*         * Large signal upgrade.	 * XXX update         */        if ((i == 0) || AR_SREV_OWL_20_OR_LATER(ah)) {            OS_REG_WRITE(ah, AR_PHY_RXGAIN + regChainOffset, 		(OS_REG_READ(ah, AR_PHY_RXGAIN + regChainOffset) & ~AR_PHY_RXGAIN_TXRX_ATTEN) |			SM(IS_EEP_MINOR_V3(ah)  ? pModal->txRxAttenCh[i] : txRxAttenLocal,				AR_PHY_RXGAIN_TXRX_ATTEN));            OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + regChainOffset, 	    	(OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) & ~AR_PHY_GAIN_2GHZ_RXTX_MARGIN) |			SM(pModal->rxTxMarginCh[i], AR_PHY_GAIN_2GHZ_RXTX_MARGIN));        }    }    OS_REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH, pModal->switchSettling);    OS_REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, AR_PHY_DESIRED_SZ_ADC, pModal->adcDesiredSize);    OS_REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, AR_PHY_DESIRED_SZ_PGA, pModal->pgaDesiredSize);    OS_REG_WRITE(ah, AR_PHY_RF_CTL4,        SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAA_OFF)        | SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAB_OFF)        | SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAA_ON)        | SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAB_ON));    OS_REG_RMW_FIELD(ah, AR_PHY_RF_CTL3, AR_PHY_TX_END_TO_A2_RX_ON, pModal->txEndToRxOn);    if (AR_SREV_MERLIN_10_OR_LATER(ah)) {	OS_REG_RMW_FIELD(ah, AR_PHY_CCA, AR9280_PHY_CCA_THRESH62,	    pModal->thresh62);	OS_REG_RMW_FIELD(ah, AR_PHY_EXT_CCA0, AR_PHY_EXT_CCA0_THRESH62,	    pModal->thresh62);    } else {	OS_REG_RMW_FIELD(ah, AR_PHY_CCA, AR_PHY_CCA_THRESH62,	    pModal->thresh62);	OS_REG_RMW_FIELD(ah, AR_PHY_EXT_CCA0, AR_PHY_EXT_CCA_THRESH62,	    pModal->thresh62);    }        /* Minor Version Specific application */    if (IS_EEP_MINOR_V2(ah)) {        OS_REG_RMW_FIELD(ah, AR_PHY_RF_CTL2,  AR_PHY_TX_FRAME_TO_DATA_START, pModal->txFrameToDataStart);        OS_REG_RMW_FIELD(ah, AR_PHY_RF_CTL2,  AR_PHY_TX_FRAME_TO_PA_ON, pModal->txFrameToPaOn);        }	        if (IS_EEP_MINOR_V3(ah)) {	if (IS_CHAN_HT40(chan)) {		/* Overwrite switch settling with HT40 value */		OS_REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH, pModal->swSettleHt40);	}	        if ((AR_SREV_OWL_20_OR_LATER(ah)) &&            (  AH5416(ah)->ah_rx_chainmask == 0x5 || AH5416(ah)->ah_tx_chainmask == 0x5)){            /* Reg Offsets are swapped for logical mapping */		OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x1000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x1000) & ~AR_PHY_GAIN_2GHZ_BSW_MARGIN) |			SM(pModal->bswMargin[2], AR_PHY_GAIN_2GHZ_BSW_MARGIN));		OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x1000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x1000) & ~AR_PHY_GAIN_2GHZ_BSW_ATTEN) |			SM(pModal->bswAtten[2], AR_PHY_GAIN_2GHZ_BSW_ATTEN));		OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x2000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x2000) & ~AR_PHY_GAIN_2GHZ_BSW_MARGIN) |			SM(pModal->bswMargin[1], AR_PHY_GAIN_2GHZ_BSW_MARGIN));		OS_REG_WRITE(ah, AR_PHY_GAIN_2GHZ + 0x2000, (OS_REG_READ(ah, AR_PHY_GAIN_2GHZ + 0x2000)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -