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

📄 ah.c.svn-base

📁 最新之atheros芯片driver source code, 基于linux操作系统,內含atheros芯片HAL全部代码
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
	case HAL_CAP_CIPHER:		/* cipher handled in hardware */	case HAL_CAP_TKIP_MIC:		/* handle TKIP MIC in hardware */		return HAL_ENOTSUPP;	case HAL_CAP_TKIP_SPLIT:	/* hardware TKIP uses split keys */		return HAL_ENOTSUPP;	case HAL_CAP_PHYCOUNTERS:	/* hardware PHY error counters */		return pCap->halHwPhyCounterSupport ? HAL_OK : HAL_ENXIO;	case HAL_CAP_WME_TKIPMIC:   /* hardware can do TKIP MIC when WMM is turned on */		return HAL_ENOTSUPP;	case HAL_CAP_DIVERSITY:		/* hardware supports fast diversity */		return HAL_ENOTSUPP;	case HAL_CAP_KEYCACHE_SIZE:	/* hardware key cache size */		*result =  pCap->halKeyCacheSize;		return HAL_OK;	case HAL_CAP_NUM_TXQUEUES:	/* number of hardware tx queues */		*result = pCap->halTotalQueues;		return HAL_OK;	case HAL_CAP_VEOL:		/* hardware supports virtual EOL */		return pCap->halVEOLSupport ? HAL_OK : HAL_ENOTSUPP;	case HAL_CAP_PSPOLL:		/* hardware PS-Poll support works */		return pCap->halPSPollBroken ? HAL_ENOTSUPP : HAL_OK;	case HAL_CAP_COMPRESSION:		return pCap->halCompressSupport ? HAL_OK : HAL_ENOTSUPP;	case HAL_CAP_BURST:		return pCap->halBurstSupport ? HAL_OK : HAL_ENOTSUPP;	case HAL_CAP_FASTFRAME:		return pCap->halFastFramesSupport ? HAL_OK : HAL_ENOTSUPP;	case HAL_CAP_DIAG:		/* hardware diagnostic support */		*result = AH_PRIVATE(ah)->ah_diagreg;		return HAL_OK;	case HAL_CAP_TXPOW:		/* global tx power limit  */		switch (capability) {		case 0:			/* facility is supported */			return HAL_OK;		case 1:			/* current limit */			*result = AH_PRIVATE(ah)->ah_powerLimit;			return HAL_OK;		case 2:			/* current max tx power */			*result = AH_PRIVATE(ah)->ah_maxPowerLevel;			return HAL_OK;		case 3:			/* scale factor */			*result = AH_PRIVATE(ah)->ah_tpScale;			return HAL_OK;		}		return HAL_ENOTSUPP;	case HAL_CAP_BSSIDMASK:		/* hardware supports bssid mask */		return pCap->halBssIdMaskSupport ? HAL_OK : HAL_ENOTSUPP;	case HAL_CAP_MCAST_KEYSRCH:	/* multicast frame keycache search */		return pCap->halMcastKeySrchSupport ? HAL_OK : HAL_ENOTSUPP;	case HAL_CAP_TSF_ADJUST:	/* hardware has beacon tsf adjust */		return HAL_ENOTSUPP;	case HAL_CAP_RFSILENT:		/* rfsilent support  */		switch (capability) {		case 0:			/* facility is supported */			return pCap->halRfSilentSupport ? HAL_OK : HAL_ENOTSUPP;		case 1:			/* current setting */			return AH_PRIVATE(ah)->ah_rfkillEnabled ?				HAL_OK : HAL_ENOTSUPP;		case 2:			/* rfsilent config */			*result = AH_PRIVATE(ah)->ah_rfsilent;			return HAL_OK;		}		return HAL_ENOTSUPP;	case HAL_CAP_11D:#ifdef AH_SUPPORT_11D		return HAL_OK;#else		return HAL_ENOTSUPP;#endif	case HAL_CAP_RXORN_FATAL:	/* HAL_INT_RXORN treated as fatal  */		return AH_PRIVATE(ah)->ah_rxornIsFatal ? HAL_OK : HAL_ENOTSUPP;	case HAL_CAP_HT:		return pCap->halHTSupport ? HAL_OK : HAL_ENOTSUPP;	case HAL_CAP_TX_CHAINMASK:	/* mask of TX chains supported */		*result = pCap->halTxChainMask;		return HAL_OK;	case HAL_CAP_RX_CHAINMASK:	/* mask of RX chains supported */		*result = pCap->halRxChainMask;		return HAL_OK;	case HAL_CAP_RXTSTAMP_PREC:	/* rx desc tstamp precision (bits) */		*result = pCap->halTstampPrecision;		return HAL_OK;	default:		return HAL_EINVAL;	}}HAL_BOOLath_hal_setcapability(struct ath_hal *ah, HAL_CAPABILITY_TYPE type,	uint32_t capability, uint32_t setting, HAL_STATUS *status){	switch (type) {	case HAL_CAP_TXPOW:		switch (capability) {		case 3:			if (setting <= HAL_TP_SCALE_MIN) {				AH_PRIVATE(ah)->ah_tpScale = setting;				return AH_TRUE;			}			break;		}		break;	case HAL_CAP_RFSILENT:		/* rfsilent support  */		/*		 * NB: allow even if halRfSilentSupport is false		 *     in case the EEPROM is misprogrammed.		 */		switch (capability) {		case 1:			/* current setting */			AH_PRIVATE(ah)->ah_rfkillEnabled = (setting != 0);			return AH_TRUE;		case 2:			/* rfsilent config */			/* XXX better done per-chip for validation? */			AH_PRIVATE(ah)->ah_rfsilent = setting;			return AH_TRUE;		}		break;	case HAL_CAP_REG_DMN:		/* regulatory domain */		AH_PRIVATE(ah)->ah_currentRD = setting;		return AH_TRUE;	case HAL_CAP_RXORN_FATAL:	/* HAL_INT_RXORN treated as fatal  */		AH_PRIVATE(ah)->ah_rxornIsFatal = setting;		return AH_TRUE;	default:		break;	}	if (status)		*status = HAL_EINVAL;	return AH_FALSE;}/*  * Common support for getDiagState method. */static u_intath_hal_getregdump(struct ath_hal *ah, const HAL_REGRANGE *regs,	void *dstbuf, int space){	uint32_t *dp = dstbuf;	int i;	for (i = 0; space >= 2*sizeof(uint32_t); i++) {		u_int r = regs[i].start;		u_int e = regs[i].end;		*dp++ = (r<<16) | e;		space -= sizeof(uint32_t);		do {			*dp++ = OS_REG_READ(ah, r);			r += sizeof(uint32_t);			space -= sizeof(uint32_t);		} while (r <= e && space >= sizeof(uint32_t));	}	return (char *) dp - (char *) dstbuf;}HAL_BOOLath_hal_getdiagstate(struct ath_hal *ah, int request,	const void *args, uint32_t argsize,	void **result, uint32_t *resultsize){	switch (request) {	case HAL_DIAG_REVS:		*result = &AH_PRIVATE(ah)->ah_devid;		*resultsize = sizeof(HAL_REVS);		return AH_TRUE;	case HAL_DIAG_REGS:		*resultsize = ath_hal_getregdump(ah, args, *result,*resultsize);		return AH_TRUE;	case HAL_DIAG_FATALERR:		*result = &AH_PRIVATE(ah)->ah_fatalState[0];		*resultsize = sizeof(AH_PRIVATE(ah)->ah_fatalState);		return AH_TRUE;	case HAL_DIAG_EEREAD:		if (argsize != sizeof(uint16_t))			return AH_FALSE;		if (!ath_hal_eepromRead(ah, *(const uint16_t *)args, *result))			return AH_FALSE;		*resultsize = sizeof(uint16_t);		return AH_TRUE;#ifdef AH_PRIVATE_DIAG	case HAL_DIAG_SETKEY: {		const HAL_DIAG_KEYVAL *dk;		if (argsize != sizeof(HAL_DIAG_KEYVAL))			return AH_FALSE;		dk = (const HAL_DIAG_KEYVAL *)args;		return ah->ah_setKeyCacheEntry(ah, dk->dk_keyix,			&dk->dk_keyval, dk->dk_mac, dk->dk_xor);	}	case HAL_DIAG_RESETKEY:		if (argsize != sizeof(uint16_t))			return AH_FALSE;		return ah->ah_resetKeyCacheEntry(ah, *(const uint16_t *)args);#ifdef AH_SUPPORT_WRITE_EEPROM	case HAL_DIAG_EEWRITE: {		const HAL_DIAG_EEVAL *ee;		if (argsize != sizeof(HAL_DIAG_EEVAL))			return AH_FALSE;		ee = (const HAL_DIAG_EEVAL *)args;		return ath_hal_eepromWrite(ah, ee->ee_off, ee->ee_data);	}#endif /* AH_SUPPORT_WRITE_EEPROM */#endif /* AH_PRIVATE_DIAG */	case HAL_DIAG_11NCOMPAT:		if (argsize == 0) {			*resultsize = sizeof(uint32_t);			*((uint32_t *)(*result)) =				AH_PRIVATE(ah)->ah_11nCompat;		} else if (argsize == sizeof(uint32_t)) {			AH_PRIVATE(ah)->ah_11nCompat = *(const uint32_t *)args;		} else			return AH_FALSE;		return AH_TRUE;	}	return AH_FALSE;}/* * Set the properties of the tx queue with the parameters * from qInfo. */HAL_BOOLath_hal_setTxQProps(struct ath_hal *ah,	HAL_TX_QUEUE_INFO *qi, const HAL_TXQ_INFO *qInfo){	uint32_t cw;	if (qi->tqi_type == HAL_TX_QUEUE_INACTIVE) {		HALDEBUG(ah, HAL_DEBUG_TXQUEUE,		    "%s: inactive queue\n", __func__);		return AH_FALSE;	}	/* XXX validate parameters */	qi->tqi_ver = qInfo->tqi_ver;	qi->tqi_subtype = qInfo->tqi_subtype;	qi->tqi_qflags = qInfo->tqi_qflags;	qi->tqi_priority = qInfo->tqi_priority;	if (qInfo->tqi_aifs != HAL_TXQ_USEDEFAULT)		qi->tqi_aifs = AH_MIN(qInfo->tqi_aifs, 255);	else		qi->tqi_aifs = INIT_AIFS;	if (qInfo->tqi_cwmin != HAL_TXQ_USEDEFAULT) {		cw = AH_MIN(qInfo->tqi_cwmin, 1024);		/* make sure that the CWmin is of the form (2^n - 1) */		qi->tqi_cwmin = 1;		while (qi->tqi_cwmin < cw)			qi->tqi_cwmin = (qi->tqi_cwmin << 1) | 1;	} else		qi->tqi_cwmin = qInfo->tqi_cwmin;	if (qInfo->tqi_cwmax != HAL_TXQ_USEDEFAULT) {		cw = AH_MIN(qInfo->tqi_cwmax, 1024);		/* make sure that the CWmax is of the form (2^n - 1) */		qi->tqi_cwmax = 1;		while (qi->tqi_cwmax < cw)			qi->tqi_cwmax = (qi->tqi_cwmax << 1) | 1;	} else		qi->tqi_cwmax = INIT_CWMAX;	/* Set retry limit values */	if (qInfo->tqi_shretry != 0)		qi->tqi_shretry = AH_MIN(qInfo->tqi_shretry, 15);	else		qi->tqi_shretry = INIT_SH_RETRY;	if (qInfo->tqi_lgretry != 0)		qi->tqi_lgretry = AH_MIN(qInfo->tqi_lgretry, 15);	else		qi->tqi_lgretry = INIT_LG_RETRY;	qi->tqi_cbrPeriod = qInfo->tqi_cbrPeriod;	qi->tqi_cbrOverflowLimit = qInfo->tqi_cbrOverflowLimit;	qi->tqi_burstTime = qInfo->tqi_burstTime;	qi->tqi_readyTime = qInfo->tqi_readyTime;	switch (qInfo->tqi_subtype) {	case HAL_WME_UPSD:		if (qi->tqi_type == HAL_TX_QUEUE_DATA)			qi->tqi_intFlags = HAL_TXQ_USE_LOCKOUT_BKOFF_DIS;		break;	default:		break;		/* NB: silence compiler */	}	return AH_TRUE;}HAL_BOOLath_hal_getTxQProps(struct ath_hal *ah,	HAL_TXQ_INFO *qInfo, const HAL_TX_QUEUE_INFO *qi){	if (qi->tqi_type == HAL_TX_QUEUE_INACTIVE) {		HALDEBUG(ah, HAL_DEBUG_TXQUEUE,		    "%s: inactive queue\n", __func__);		return AH_FALSE;	}	qInfo->tqi_qflags = qi->tqi_qflags;	qInfo->tqi_ver = qi->tqi_ver;	qInfo->tqi_subtype = qi->tqi_subtype;	qInfo->tqi_qflags = qi->tqi_qflags;	qInfo->tqi_priority = qi->tqi_priority;	qInfo->tqi_aifs = qi->tqi_aifs;	qInfo->tqi_cwmin = qi->tqi_cwmin;	qInfo->tqi_cwmax = qi->tqi_cwmax;	qInfo->tqi_shretry = qi->tqi_shretry;	qInfo->tqi_lgretry = qi->tqi_lgretry;	qInfo->tqi_cbrPeriod = qi->tqi_cbrPeriod;	qInfo->tqi_cbrOverflowLimit = qi->tqi_cbrOverflowLimit;	qInfo->tqi_burstTime = qi->tqi_burstTime;	qInfo->tqi_readyTime = qi->tqi_readyTime;	return AH_TRUE;}                                     /* 11a Turbo  11b  11g  108g */static const int16_t NOISE_FLOOR[] = { -96, -93,  -98, -96,  -93 };/* * Read the current channel noise floor and return. * If nf cal hasn't finished, channel noise floor should be 0 * and we return a nominal value based on band and frequency. * * NB: This is a private routine used by per-chip code to *     implement the ah_getChanNoise method. */int16_tath_hal_getChanNoise(struct ath_hal *ah, HAL_CHANNEL *chan){	HAL_CHANNEL_INTERNAL *ichan;	ichan = ath_hal_checkchannel(ah, chan);	if (ichan == AH_NULL) {		HALDEBUG(ah, HAL_DEBUG_NFCAL,		    "%s: invalid channel %u/0x%x; no mapping\n",		    __func__, chan->channel, chan->channelFlags);		return 0;	}	if (ichan->rawNoiseFloor == 0) {		WIRELESS_MODE mode = ath_hal_chan2wmode(ah, chan);		HALASSERT(mode < WIRELESS_MODE_MAX);		return NOISE_FLOOR[mode] + ath_hal_getNfAdjust(ah, ichan);	} else		return ichan->rawNoiseFloor + ichan->noiseFloorAdjust;}/* * Process all valid raw noise floors into the dBm noise floor values. * Though our device has no reference for a dBm noise floor, we perform * a relative minimization of NF's based on the lowest NF found across a * channel scan. */voidath_hal_process_noisefloor(struct ath_hal *ah){	HAL_CHANNEL_INTERNAL *c;	int16_t correct2, correct5;	int16_t lowest2, lowest5;	int i;	/* 	 * Find the lowest 2GHz and 5GHz noise floor values after adjusting	 * for statistically recorded NF/channel deviation.	 */	correct2 = lowest2 = 0;	correct5 = lowest5 = 0;	for (i = 0; i < AH_PRIVATE(ah)->ah_nchan; i++) {		WIRELESS_MODE mode;		int16_t nf;		c = &AH_PRIVATE(ah)->ah_channels[i];		if (c->rawNoiseFloor >= 0)			continue;		mode = ath_hal_chan2wmode(ah, (HAL_CHANNEL *) c);		HALASSERT(mode < WIRELESS_MODE_MAX);		nf = c->rawNoiseFloor + NOISE_FLOOR[mode] +			ath_hal_getNfAdjust(ah, c);		if (IS_CHAN_5GHZ(c)) {			if (nf < lowest5) { 				lowest5 = nf;				correct5 = NOISE_FLOOR[mode] -				    (c->rawNoiseFloor + ath_hal_getNfAdjust(ah, c));			}		} else {			if (nf < lowest2) { 				lowest2 = nf;				correct2 = NOISE_FLOOR[mode] -				    (c->rawNoiseFloor + ath_hal_getNfAdjust(ah, c));			}		}	}	/* Correct the channels to reach the expected NF value */	for (i = 0; i < AH_PRIVATE(ah)->ah_nchan; i++) {		c = &AH_PRIVATE(ah)->ah_channels[i];		if (c->rawNoiseFloor >= 0)			continue;		/* Apply correction factor */		c->noiseFloorAdjust = ath_hal_getNfAdjust(ah, c) +			(IS_CHAN_5GHZ(c) ? correct5 : correct2);		HALDEBUG(ah, HAL_DEBUG_NFCAL, "%u/0x%x raw nf %d adjust %d\n",		    c->channel, c->channelFlags, c->rawNoiseFloor,		    c->noiseFloorAdjust);	}}/* * INI support routines. */intath_hal_ini_write(struct ath_hal *ah, const HAL_INI_ARRAY *ia,	int col, int regWr){	int r;	for (r = 0; r < ia->rows; r++) {		OS_REG_WRITE(ah, HAL_INI_VAL(ia, r, 0),		    HAL_INI_VAL(ia, r, col));		DMA_YIELD(regWr);	}	return regWr;}voidath_hal_ini_bank_setup(uint32_t data[], const HAL_INI_ARRAY *ia, int col){	int r;	for (r = 0; r < ia->rows; r++)		data[r] = HAL_INI_VAL(ia, r, col);}intath_hal_ini_bank_write(struct ath_hal *ah, const HAL_INI_ARRAY *ia,	const uint32_t data[], int regWr){	int r;	for (r = 0; r < ia->rows; r++) {		OS_REG_WRITE(ah, HAL_INI_VAL(ia, r, 0), data[r]);		DMA_YIELD(regWr);	}	return regWr;}

⌨️ 快捷键说明

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