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

📄 ar5xxx.c

📁 无线网卡驱动 固件程序 There are currently 3 "programming generations" of Atheros 802.11 wireless devices (
💻 C
📖 第 1 页 / 共 4 页
字号:
			min = max + 1;			max = ath_hal_mhz2ieee(IEEE80211_CHANNELS_5GHZ_MAX,			    IEEE80211_CHAN_5GHZ);			flags = CHANNEL_A | CHANNEL_T | CHANNEL_XR;			goto debugchan;		}		goto done;	}	domain_5ghz = ieee80211_regdomain2flag(domain_current,	    IEEE80211_CHANNELS_5GHZ_MIN);	domain_2ghz = ieee80211_regdomain2flag(domain_current,	    IEEE80211_CHANNELS_2GHZ_MIN);	/*	 * Create channel list based on chipset capabilities, regulation domain	 * and mode. 5GHz...	 */	for (i = 0; (hal->ah_capabilities.cap_range.range_5ghz_max > 0) &&		 (i < AR5K_ELEMENTS(ar5k_5ghz_channels)) &&		 (c < max_channels); i++) {		/* Check if channel is supported by the chipset */		if (ar5k_check_channel(hal,		    ar5k_5ghz_channels[i].rc_channel,		    IEEE80211_CHAN_5GHZ) == AH_FALSE)			continue;		/* Match regulation domain */		if ((IEEE80211_DMN(ar5k_5ghz_channels[i].rc_domain) &			IEEE80211_DMN(domain_5ghz)) == 0)			continue;		/* Match modes */		if (ar5k_5ghz_channels[i].rc_mode & IEEE80211_CHAN_TURBO) {			all_channels[c].c_channel_flags = CHANNEL_T;		} else if (ar5k_5ghz_channels[i].rc_mode &		    IEEE80211_CHAN_OFDM) {			all_channels[c].c_channel_flags = CHANNEL_A;		} else			continue;		/* Write channel and increment counter */		all_channels[c++].channel = ar5k_5ghz_channels[i].rc_channel;	}	/*	 * ...and 2GHz.	 */	for (i = 0; (hal->ah_capabilities.cap_range.range_2ghz_max > 0) &&		 (i < AR5K_ELEMENTS(ar5k_2ghz_channels)) &&		 (c < max_channels); i++) {		/* Check if channel is supported by the chipset */		if (ar5k_check_channel(hal,		    ar5k_2ghz_channels[i].rc_channel,		    IEEE80211_CHAN_2GHZ) == AH_FALSE)			continue;		/* Match regulation domain */		if ((IEEE80211_DMN(ar5k_2ghz_channels[i].rc_domain) &			IEEE80211_DMN(domain_2ghz)) == 0)			continue;		/* Match modes */		if (ar5k_2ghz_channels[i].rc_mode & IEEE80211_CHAN_CCK)			all_channels[c].c_channel_flags = CHANNEL_B;		if (ar5k_2ghz_channels[i].rc_mode & IEEE80211_CHAN_OFDM) {			all_channels[c].c_channel_flags |=			    hal->ah_version == AR5K_AR5211 ?			    CHANNEL_PUREG : CHANNEL_G;			if (ar5k_2ghz_channels[i].rc_mode &			    IEEE80211_CHAN_TURBO)				all_channels[c].c_channel_flags |= CHANNEL_TG;		}		/* Write channel and increment counter */		all_channels[c++].channel = ar5k_2ghz_channels[i].rc_channel;	} done:	bcopy(all_channels, channels, sizeof(HAL_CHANNEL) * max_channels);	*channels_size = c;	free(all_channels, M_TEMP);	return (AH_TRUE);}/* * Common internal functions */const char * /*O.K.*/ar5k_printver(enum ar5k_srev_type type, u_int32_t val){	struct ar5k_srev_name names[] = AR5K_SREV_NAME;	const char *name = "xxxx";	int i;	for (i = 0; i < AR5K_ELEMENTS(names); i++) {		if (names[i].sr_type != type ||		    names[i].sr_val == AR5K_SREV_UNKNOWN)			continue;		if ((val & 0xff) < names[i + 1].sr_val) {			name = names[i].sr_name;			break;		}	}	return (name);}void /*O.K.*/ar5k_radar_alert(struct ath_hal *hal){	/*	 * Limit ~1/s	 */	//	if (hal->ah_radar.r_last_channel.channel ==//	    hal->ah_current_channel.channel &&//	    tick < (hal->ah_radar.r_last_alert + hz))		return;/*	hal->ah_radar.r_last_channel.channel =	    hal->ah_current_channel.channel;	hal->ah_radar.r_last_channel.c_channel_flags =	    hal->ah_current_channel.c_channel_flags;	hal->ah_radar.r_last_alert = tick;	AR5K_PRINTF("Possible radar activity detected at %u MHz (tick %u)\n",	    hal->ah_radar.r_last_alert, hal->ah_current_channel.channel);*/}u_int16_t /*O.K.*/ar5k_regdomain_from_ieee(ieee80211_regdomain_t ieee){	u_int32_t regdomain = (u_int32_t)ieee;	/*	 * Use the default regulation domain if the value is empty	 * or not supported by the net80211 regulation code.	 */	if (ieee80211_regdomain2flag(regdomain,	    IEEE80211_CHANNELS_5GHZ_MIN) == DMN_DEBUG)		return ((u_int16_t)AR5K_TUNE_REGDOMAIN);	/* It is supported, just return the value */	return (regdomain);}ieee80211_regdomain_t /*O.K.*/ar5k_regdomain_to_ieee(u_int16_t regdomain){	ieee80211_regdomain_t ieee = (ieee80211_regdomain_t)regdomain;	return (ieee);}u_int16_t /*O.K*/ar5k_get_regdomain(struct ath_hal *hal){	u_int16_t regdomain;	ieee80211_regdomain_t ieee_regdomain;#ifdef COUNTRYCODE	u_int16_t code;#endif	ar5k_eeprom_regulation_domain(hal, AH_FALSE, &ieee_regdomain);	hal->ah_capabilities.cap_regdomain.reg_hw = ieee_regdomain;#ifdef COUNTRYCODE	/*	 * Get the regulation domain by country code. This will ignore	 * the settings found in the EEPROM.	 */	code = ieee80211_name2countrycode(COUNTRYCODE);	ieee_regdomain = ieee80211_countrycode2regdomain(code);#endif	regdomain = ar5k_regdomain_from_ieee(ieee_regdomain);	hal->ah_capabilities.cap_regdomain.reg_current = regdomain;	return (regdomain);}u_int32_t /*O.K.*/ar5k_bitswap(u_int32_t val, u_int bits){	u_int32_t retval = 0, bit, i;	for (i = 0; i < bits; i++) {		bit = (val >> i) & 1;		retval = (retval << 1) | bit;	}	return (retval);}u_int  /*O.K.*/ar5k_htoclock(u_int usec, HAL_BOOL turbo){	return (turbo == AH_TRUE ? (usec * 80) : (usec * 40));}u_int /*O.K.*/ar5k_clocktoh(u_int clock, HAL_BOOL turbo){	return (turbo == AH_TRUE ? (clock / 80) : (clock / 40));}void /*O.K.*/ar5k_rt_copy(HAL_RATE_TABLE *dst, const HAL_RATE_TABLE *src){	bzero(dst, sizeof(HAL_RATE_TABLE));	dst->rateCount = src->rateCount;	bcopy(src->info, dst->info, sizeof(dst->info));}HAL_BOOL /*O.K.*/ar5k_register_timeout(struct ath_hal *hal, u_int32_t reg, u_int32_t flag,    u_int32_t val, HAL_BOOL is_set){	int i;	u_int32_t data;	for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) {		data = AR5K_REG_READ(reg);		if ((is_set == AH_TRUE) && (data & flag))			break;		else if ((data & flag) == val)			break;		AR5K_DELAY(15);	}	if (i <= 0)		return (AH_FALSE);	return (AH_TRUE);}/* * Common ar5xx EEPROM access functions */u_int16_t /*O.K.*/ar5k_eeprom_bin2freq(struct ath_hal *hal, u_int16_t bin, u_int mode){	u_int16_t val;	if (bin == AR5K_EEPROM_CHANNEL_DIS)		return (bin);	if (mode == AR5K_EEPROM_MODE_11A) {		if (hal->ah_ee_version > AR5K_EEPROM_VERSION_3_2)			val = (5 * bin) + 4800;		else			val = bin > 62 ?			    (10 * 62) + (5 * (bin - 62)) + 5100 :			    (bin * 10) + 5100;	} else {		if (hal->ah_ee_version > AR5K_EEPROM_VERSION_3_2)			val = bin + 2300;		else			val = bin + 2400;	}	return (val);}int /*O.K.*/ar5k_eeprom_read_ants(struct ath_hal *hal, u_int32_t *offset, u_int mode){	struct ar5k_eeprom_info *ee = &hal->ah_capabilities.cap_eeprom;	u_int32_t o = *offset;	u_int16_t val;	int ret, i = 0;	AR5K_EEPROM_READ(o++, val);	ee->ee_switch_settling[mode]	= (val >> 8) & 0x7f;	ee->ee_ant_tx_rx[mode]		= (val >> 2) & 0x3f;	ee->ee_ant_control[mode][i]	= (val << 4) & 0x3f;	AR5K_EEPROM_READ(o++, val);	ee->ee_ant_control[mode][i++]	|= (val >> 12) & 0xf;	ee->ee_ant_control[mode][i++]	= (val >> 6) & 0x3f;	ee->ee_ant_control[mode][i++]	= val & 0x3f;	AR5K_EEPROM_READ(o++, val);	ee->ee_ant_control[mode][i++]	= (val >> 10) & 0x3f;	ee->ee_ant_control[mode][i++]	= (val >> 4) & 0x3f;	ee->ee_ant_control[mode][i]	= (val << 2) & 0x3f;	AR5K_EEPROM_READ(o++, val);	ee->ee_ant_control[mode][i++]	|= (val >> 14) & 0x3;	ee->ee_ant_control[mode][i++]	= (val >> 8) & 0x3f;	ee->ee_ant_control[mode][i++]	= (val >> 2) & 0x3f;	ee->ee_ant_control[mode][i]	= (val << 4) & 0x3f;	AR5K_EEPROM_READ(o++, val);	ee->ee_ant_control[mode][i++]	|= (val >> 12) & 0xf;	ee->ee_ant_control[mode][i++]	= (val >> 6) & 0x3f;	ee->ee_ant_control[mode][i++]	= val & 0x3f;	/* Get antenna modes */	hal->ah_antenna[mode][0] =	    (ee->ee_ant_control[mode][0] << 4) | 0x1;	hal->ah_antenna[mode][HAL_ANT_FIXED_A] =	    ee->ee_ant_control[mode][1] |	    (ee->ee_ant_control[mode][2] << 6) |	    (ee->ee_ant_control[mode][3] << 12) |	    (ee->ee_ant_control[mode][4] << 18) |	    (ee->ee_ant_control[mode][5] << 24);	hal->ah_antenna[mode][HAL_ANT_FIXED_B] =	    ee->ee_ant_control[mode][6] |	    (ee->ee_ant_control[mode][7] << 6) |	    (ee->ee_ant_control[mode][8] << 12) |	    (ee->ee_ant_control[mode][9] << 18) |	    (ee->ee_ant_control[mode][10] << 24);	/* return new offset */	*offset = o;	return (0);}int /*O.K.*/ar5k_eeprom_read_modes(struct ath_hal *hal, u_int32_t *offset, u_int mode){	struct ar5k_eeprom_info *ee = &hal->ah_capabilities.cap_eeprom;	u_int32_t o = *offset;	u_int16_t val;	int ret;	AR5K_EEPROM_READ(o++, val);	ee->ee_tx_end2xlna_enable[mode]	= (val >> 8) & 0xff;	ee->ee_thr_62[mode]		= val & 0xff;	if (hal->ah_ee_version <= AR5K_EEPROM_VERSION_3_2)		ee->ee_thr_62[mode] =		    mode == AR5K_EEPROM_MODE_11A ? 15 : 28;	AR5K_EEPROM_READ(o++, val);	ee->ee_tx_end2xpa_disable[mode]	= (val >> 8) & 0xff;	ee->ee_tx_frm2xpa_enable[mode]	= val & 0xff;	AR5K_EEPROM_READ(o++, val);	ee->ee_pga_desired_size[mode]	= (val >> 8) & 0xff;	if ((val & 0xff) & 0x80)		ee->ee_noise_floor_thr[mode] = -((((val & 0xff) ^ 0xff)) + 1);	else		ee->ee_noise_floor_thr[mode] = val & 0xff;	if (hal->ah_ee_version <= AR5K_EEPROM_VERSION_3_2)		ee->ee_noise_floor_thr[mode] =		    mode == AR5K_EEPROM_MODE_11A ? -54 : -1;	AR5K_EEPROM_READ(o++, val);	ee->ee_xlna_gain[mode]		= (val >> 5) & 0xff;	ee->ee_x_gain[mode]		= (val >> 1) & 0xf;	ee->ee_xpd[mode]		= val & 0x1;	if (hal->ah_ee_version >= AR5K_EEPROM_VERSION_4_0)		ee->ee_fixed_bias[mode] = (val >> 13) & 0x1;	if (hal->ah_ee_version >= AR5K_EEPROM_VERSION_3_3) {		AR5K_EEPROM_READ(o++, val);		ee->ee_false_detect[mode] = (val >> 6) & 0x7f;		if (mode == AR5K_EEPROM_MODE_11A)			ee->ee_xr_power[mode] = val & 0x3f;		else {			ee->ee_ob[mode][0] = val & 0x7;			ee->ee_db[mode][0] = (val >> 3) & 0x7;		}	}	if (hal->ah_ee_version < AR5K_EEPROM_VERSION_3_4) {		ee->ee_i_gain[mode] = AR5K_EEPROM_I_GAIN;		ee->ee_cck_ofdm_power_delta = AR5K_EEPROM_CCK_OFDM_DELTA;	} else {		ee->ee_i_gain[mode] = (val >> 13) & 0x7;		AR5K_EEPROM_READ(o++, val);		ee->ee_i_gain[mode] |= (val << 3) & 0x38;		if (mode == AR5K_EEPROM_MODE_11G)			ee->ee_cck_ofdm_power_delta = (val >> 3) & 0xff;	}	if (hal->ah_ee_version >= AR5K_EEPROM_VERSION_4_0 &&	    mode == AR5K_EEPROM_MODE_11A) {		ee->ee_i_cal[mode] = (val >> 8) & 0x3f;		ee->ee_q_cal[mode] = (val >> 3) & 0x1f;	}	if (hal->ah_ee_version >= AR5K_EEPROM_VERSION_4_6 &&	    mode == AR5K_EEPROM_MODE_11G)		ee->ee_scaled_cck_delta = (val >> 11) & 0x1f;	/* return new offset */	*offset = o;	return (0);}int /*O.K.*/ar5k_eeprom_init(struct ath_hal *hal){	struct ar5k_eeprom_info *ee = &hal->ah_capabilities.cap_eeprom;	u_int32_t offset;	u_int16_t val;	int ret, i;	u_int mode;	/* Initial TX thermal adjustment values */	ee->ee_tx_clip = 4;	ee->ee_pwd_84 = ee->ee_pwd_90 = 1;	ee->ee_gain_select = 1;	/*	 * Read values from EEPROM and store them in the capability structure	 */	AR5K_EEPROM_READ_HDR(AR5K_EEPROM_MAGIC, ee_magic);	AR5K_EEPROM_READ_HDR(AR5K_EEPROM_PROTECT, ee_protect);	AR5K_EEPROM_READ_HDR(AR5K_EEPROM_REG_DOMAIN, ee_regdomain);	AR5K_EEPROM_READ_HDR(AR5K_EEPROM_VERSION, ee_version);	AR5K_EEPROM_READ_HDR(AR5K_EEPROM_HDR, ee_header);	/* Return if we have an old EEPROM */	if (hal->ah_ee_version < AR5K_EEPROM_VERSION_3_0)		return (0);#ifdef notyet	/*	 * Validate the checksum of the EEPROM date. There are some	 * devices with invalid EEPROMs.	 */	for (cksum = 0, offset = 0; offset < AR5K_EEPROM_INFO_MAX; offset++) {		AR5K_EEPROM_READ(AR5K_EEPROM_INFO(offset), val);		cksum ^= val;	}	if (cksum != AR5K_EEPROM_INFO_CKSUM) {		AR5K_PRINTF("Invalid EEPROM checksum 0x%04x\n", cksum);		return (HAL_EEBADSUM);	}

⌨️ 快捷键说明

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