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

📄 ar5212_ani.c

📁 最新之atheros芯片driver source code, 基于linux操作系统,內含atheros芯片HAL全部代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		break;	}	case HAL_ANI_FIRSTEP_LEVEL: {		u_int level = param;		if (level >= params->maxFirstepLevel) {			HALDEBUG(ah, HAL_DEBUG_ANY,			    "%s: level out of range (%u > %u)\n",			    __func__, level, params->maxFirstepLevel);			return AH_FALSE;		}		OS_REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,		    AR_PHY_FIND_SIG_FIRSTEP, params->firstep[level]);		if (level > aniState->firstepLevel)			ahp->ah_stats.ast_ani_stepup++;		else if (level < aniState->firstepLevel)			ahp->ah_stats.ast_ani_stepdown++;		aniState->firstepLevel = level;		break;	}	case HAL_ANI_SPUR_IMMUNITY_LEVEL: {		u_int level = param;		if (level >= params->maxSpurImmunityLevel) {			HALDEBUG(ah, HAL_DEBUG_ANY,			    "%s: level out of range (%u > %u)\n",			    __func__, level, params->maxSpurImmunityLevel);			return AH_FALSE;		}		OS_REG_RMW_FIELD(ah, AR_PHY_TIMING5,		    AR_PHY_TIMING5_CYCPWR_THR1, params->cycPwrThr1[level]);		if (level > aniState->spurImmunityLevel)			ahp->ah_stats.ast_ani_spurup++;		else if (level < aniState->spurImmunityLevel)			ahp->ah_stats.ast_ani_spurdown++;		aniState->spurImmunityLevel = level;		break;	}	case HAL_ANI_PRESENT:		break;	case HAL_ANI_MODE:		if (param == 0) {			ahp->ah_procPhyErr &= ~HAL_ANI_ENA;			/* Turn off HW counters if we have them */			ar5212AniDetach(ah);			ar5212SetRxFilter(ah,				ar5212GetRxFilter(ah) &~ HAL_RX_FILTER_PHYERR);		} else {			/* normal/auto mode */			/* don't mess with state if already enabled */			if (ahp->ah_procPhyErr & HAL_ANI_ENA)				break;			if (ahp->ah_hasHwPhyCounters) {				ar5212SetRxFilter(ah,					ar5212GetRxFilter(ah) &~ HAL_RX_FILTER_PHYERR);				/* Enable MIB Counters */				enableAniMIBCounters(ah,				    ahp->ah_curani != AH_NULL ?					ahp->ah_curani->params:					&ahp->ah_aniParams24 /*XXX*/);			} else {				ar5212SetRxFilter(ah,					ar5212GetRxFilter(ah) | HAL_RX_FILTER_PHYERR);			}			ahp->ah_procPhyErr |= HAL_ANI_ENA;		}		break;#ifdef AH_PRIVATE_DIAG	case HAL_ANI_PHYERR_RESET:		ahp->ah_stats.ast_ani_ofdmerrs = 0;		ahp->ah_stats.ast_ani_cckerrs = 0;		break;#endif /* AH_PRIVATE_DIAG */	default:		HALDEBUG(ah, HAL_DEBUG_ANY, "%s: invalid cmd %u\n",		    __func__, cmd);		return AH_FALSE;	}	return AH_TRUE;}static voidar5212AniOfdmErrTrigger(struct ath_hal *ah){	struct ath_hal_5212 *ahp = AH5212(ah);	HAL_CHANNEL_INTERNAL *chan = AH_PRIVATE(ah)->ah_curchan;	struct ar5212AniState *aniState;	const struct ar5212AniParams *params;	HALASSERT(chan != AH_NULL);	if (!ANI_ENA(ah))		return;	aniState = ahp->ah_curani;	params = aniState->params;	/* First, raise noise immunity level, up to max */	if (aniState->noiseImmunityLevel+1 < params->maxNoiseImmunityLevel) {		HALDEBUG(ah, HAL_DEBUG_ANI, "%s: raise NI to %u\n", __func__,		    aniState->noiseImmunityLevel + 1);		ar5212AniControl(ah, HAL_ANI_NOISE_IMMUNITY_LEVEL, 				 aniState->noiseImmunityLevel + 1);		return;	}	/* then, raise spur immunity level, up to max */	if (aniState->spurImmunityLevel+1 < params->maxSpurImmunityLevel) {		HALDEBUG(ah, HAL_DEBUG_ANI, "%s: raise SI to %u\n", __func__,		    aniState->spurImmunityLevel + 1);		ar5212AniControl(ah, HAL_ANI_SPUR_IMMUNITY_LEVEL,				 aniState->spurImmunityLevel + 1);		return;	}	if (ANI_ENA_RSSI(ah)) {		int32_t rssi = BEACON_RSSI(ahp);		if (rssi > params->rssiThrHigh) {			/*			 * Beacon rssi is high, can turn off ofdm			 * weak sig detect.			 */			if (!aniState->ofdmWeakSigDetectOff) {				HALDEBUG(ah, HAL_DEBUG_ANI,				    "%s: rssi %d OWSD off\n", __func__, rssi);				ar5212AniControl(ah,				    HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION,				    AH_FALSE);				ar5212AniControl(ah,				    HAL_ANI_SPUR_IMMUNITY_LEVEL, 0);				return;			}			/* 			 * If weak sig detect is already off, as last resort,			 * raise firstep level 			 */			if (aniState->firstepLevel+1 < params->maxFirstepLevel) {				HALDEBUG(ah, HAL_DEBUG_ANI,				    "%s: rssi %d raise ST %u\n", __func__, rssi,				    aniState->firstepLevel+1);				ar5212AniControl(ah, HAL_ANI_FIRSTEP_LEVEL,						 aniState->firstepLevel + 1);				return;			}		} else if (rssi > params->rssiThrLow) {			/* 			 * Beacon rssi in mid range, need ofdm weak signal			 * detect, but we can raise firststepLevel.			 */			if (aniState->ofdmWeakSigDetectOff) {				HALDEBUG(ah, HAL_DEBUG_ANI,				    "%s: rssi %d OWSD on\n", __func__, rssi);				ar5212AniControl(ah,				    HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION,				    AH_TRUE);			}			if (aniState->firstepLevel+1 < params->maxFirstepLevel) {				HALDEBUG(ah, HAL_DEBUG_ANI,				    "%s: rssi %d raise ST %u\n", __func__, rssi,				    aniState->firstepLevel+1);				ar5212AniControl(ah, HAL_ANI_FIRSTEP_LEVEL,				     aniState->firstepLevel + 1);			}			return;		} else {			/* 			 * Beacon rssi is low, if in 11b/g mode, turn off ofdm			 * weak signal detection and zero firstepLevel to			 * maximize CCK sensitivity 			 */			/* XXX can optimize */			if (IS_CHAN_B(chan) || IS_CHAN_G(chan)) {				if (!aniState->ofdmWeakSigDetectOff) {					HALDEBUG(ah, HAL_DEBUG_ANI,					    "%s: rssi %d OWSD off\n",					    __func__, rssi);					ar5212AniControl(ah,					    HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION,					    AH_FALSE);				}				if (aniState->firstepLevel > 0) {					HALDEBUG(ah, HAL_DEBUG_ANI,					    "%s: rssi %d zero ST (was %u)\n",					    __func__, rssi,					    aniState->firstepLevel);					ar5212AniControl(ah,					     HAL_ANI_FIRSTEP_LEVEL, 0);				}				return;			}		}	}}static voidar5212AniCckErrTrigger(struct ath_hal *ah){	struct ath_hal_5212 *ahp = AH5212(ah);	HAL_CHANNEL_INTERNAL *chan = AH_PRIVATE(ah)->ah_curchan;	struct ar5212AniState *aniState;	const struct ar5212AniParams *params;	HALASSERT(chan != AH_NULL);	if (!ANI_ENA(ah))		return;	/* first, raise noise immunity level, up to max */	aniState = ahp->ah_curani;	params = aniState->params;	if (aniState->noiseImmunityLevel+1 < params->maxNoiseImmunityLevel) {		HALDEBUG(ah, HAL_DEBUG_ANI, "%s: raise NI to %u\n", __func__,		    aniState->noiseImmunityLevel + 1);		ar5212AniControl(ah, HAL_ANI_NOISE_IMMUNITY_LEVEL,				 aniState->noiseImmunityLevel + 1);		return;	}	if (ANI_ENA_RSSI(ah)) {		int32_t rssi = BEACON_RSSI(ahp);		if (rssi >  params->rssiThrLow) {			/*			 * Beacon signal in mid and high range,			 * raise firstep level.			 */			if (aniState->firstepLevel+1 < params->maxFirstepLevel) {				HALDEBUG(ah, HAL_DEBUG_ANI,				    "%s: rssi %d raise ST %u\n", __func__, rssi,				    aniState->firstepLevel+1);				ar5212AniControl(ah, HAL_ANI_FIRSTEP_LEVEL,						 aniState->firstepLevel + 1);			}		} else {			/*			 * Beacon rssi is low, zero firstep level to maximize			 * CCK sensitivity in 11b/g mode.			 */			/* XXX can optimize */			if (IS_CHAN_B(chan) || IS_CHAN_G(chan)) {				if (aniState->firstepLevel > 0) {					HALDEBUG(ah, HAL_DEBUG_ANI,					    "%s: rssi %d zero ST (was %u)\n",					    __func__, rssi,					    aniState->firstepLevel);					ar5212AniControl(ah,					    HAL_ANI_FIRSTEP_LEVEL, 0);				}			}		}	}}static voidar5212AniRestart(struct ath_hal *ah, struct ar5212AniState *aniState){	struct ath_hal_5212 *ahp = AH5212(ah);	aniState->listenTime = 0;	if (ahp->ah_hasHwPhyCounters) {		const struct ar5212AniParams *params = aniState->params;		/*		 * NB: these are written on reset based on the		 *     ini so we must re-write them!		 */		OS_REG_WRITE(ah, AR_PHYCNT1, params->ofdmPhyErrBase);		OS_REG_WRITE(ah, AR_PHYCNT2, params->cckPhyErrBase);		OS_REG_WRITE(ah, AR_PHYCNTMASK1, AR_PHY_ERR_OFDM_TIMING);		OS_REG_WRITE(ah, AR_PHYCNTMASK2, AR_PHY_ERR_CCK_TIMING);		/* Clear the mib counters and save them in the stats */		ar5212UpdateMibCounters(ah, &ahp->ah_mibStats);	}	aniState->ofdmPhyErrCount = 0;	aniState->cckPhyErrCount = 0;}/* * Restore/reset the ANI parameters and reset the statistics. * This routine must be called for every channel change. * * NOTE: This is where ah_curani is set; other ani code assumes *       it is setup to reflect the current channel. */voidar5212AniReset(struct ath_hal *ah, HAL_CHANNEL_INTERNAL *chan,	HAL_OPMODE opmode, int restore){	struct ath_hal_5212 *ahp = AH5212(ah);	struct ar5212AniState *aniState;	uint32_t rxfilter;	int index;	index = ar5212GetAniChannelIndex(ah, chan);	aniState = &ahp->ah_ani[index];	ahp->ah_curani = aniState;#if 0	ath_hal_printf(ah,"%s: chan %u/0x%x restore %d setup %d opmode %u\n",	    __func__, chan->channel, chan->channelFlags, restore,	    aniState->isSetup, opmode);#else	HALDEBUG(ah, HAL_DEBUG_ANI,	    "%s: chan %u/0x%x restore %d setup %d opmode %u\n",	    __func__, chan->channel, chan->channelFlags, restore,	    aniState->isSetup, opmode);#endif	OS_MARK(ah, AH_MARK_ANI_RESET, opmode);	/*	 * Turn off PHY error frame delivery while we futz with settings.	 */	rxfilter = ar5212GetRxFilter(ah);	ar5212SetRxFilter(ah, rxfilter &~ HAL_RX_FILTER_PHYERR);	/*	 * Automatic processing is done only in station mode right now.	 */	if (opmode == HAL_M_STA)		ahp->ah_procPhyErr |= HAL_RSSI_ANI_ENA;	else		ahp->ah_procPhyErr &= ~HAL_RSSI_ANI_ENA;	/*	 * Set all ani parameters.  We either set them to initial	 * values or restore the previous ones for the channel.	 * XXX if ANI follows hardware, we don't care what mode we're	 * XXX in, we should keep the ani parameters	 */	if (restore && aniState->isSetup) {		ar5212AniControl(ah, HAL_ANI_NOISE_IMMUNITY_LEVEL,				 aniState->noiseImmunityLevel);		ar5212AniControl(ah, HAL_ANI_SPUR_IMMUNITY_LEVEL,				 aniState->spurImmunityLevel);		ar5212AniControl(ah, HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION,				 !aniState->ofdmWeakSigDetectOff);		ar5212AniControl(ah, HAL_ANI_CCK_WEAK_SIGNAL_THR,				 aniState->cckWeakSigThreshold);		ar5212AniControl(ah, HAL_ANI_FIRSTEP_LEVEL,				 aniState->firstepLevel);	} else {		ar5212AniControl(ah, HAL_ANI_NOISE_IMMUNITY_LEVEL, 0);		ar5212AniControl(ah, HAL_ANI_SPUR_IMMUNITY_LEVEL, 0);		ar5212AniControl(ah, HAL_ANI_OFDM_WEAK_SIGNAL_DETECTION,			AH_TRUE);		ar5212AniControl(ah, HAL_ANI_CCK_WEAK_SIGNAL_THR, AH_FALSE);

⌨️ 快捷键说明

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