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

📄 ath_info.c.svn-base

📁 最新之atheros芯片driver source code, 基于linux操作系统,內含atheros芯片HAL全部代码
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
						(val >> 8) & 0x3f;			chan_pcal_info->pwr[3][2] =						(val >> 14) & 0x3;			AR5K_EEPROM_READ(offset++, val);			chan_pcal_info->pwr[3][2] |=						((val >> 0) & 0x3) << 2;			chan_pcal_info->pddac[3][2] =						(val >> 2) & 0x3f;			chan_pcal_info->pwr[3][3] =						(val >> 8) & 0xf;			chan_pcal_info->pddac[3][3] =						(val >> 12) & 0xF;			AR5K_EEPROM_READ(offset++, val);			chan_pcal_info->pddac[3][3] |=						((val >> 0) & 0x3) << 4;		} else if (chan_pcal_info->pd_gains == 3) {			chan_pcal_info->pwr[2][3] =						(val >> 14) & 0x3;			AR5K_EEPROM_READ(offset++, val);			chan_pcal_info->pwr[2][3] |=						((val >> 0) & 0x3) << 2;			chan_pcal_info->pddac[2][3] =						(val >> 2) & 0x3f;		}		for (c = 0; c < pd_gains; c++) {			/* Recreate pwr table for this channel using pwr steps */			chan_pcal_info->pwr[c][0] += chan_pcal_info->pwr_i[c] * 2;			chan_pcal_info->pwr[c][1] += chan_pcal_info->pwr[c][0];			chan_pcal_info->pwr[c][2] += chan_pcal_info->pwr[c][1];			chan_pcal_info->pwr[c][3] += chan_pcal_info->pwr[c][2];			if (chan_pcal_info->pwr[c][3] == chan_pcal_info->pwr[c][2])				chan_pcal_info->pwr[c][3] = 0;			/* Recreate pddac table for this channel using pddac steps */			chan_pcal_info->pddac[c][0] += chan_pcal_info->pddac_i[c];			chan_pcal_info->pddac[c][1] += chan_pcal_info->pddac[c][0];			chan_pcal_info->pddac[c][2] += chan_pcal_info->pddac[c][1];			chan_pcal_info->pddac[c][3] += chan_pcal_info->pddac[c][2];			if (chan_pcal_info->pddac[c][3] == chan_pcal_info->pddac[c][2])				chan_pcal_info->pddac[c][3] = 0;		}	}	return 0;}static int ath5k_eeprom_read_pcal_info(struct ath5k_eeprom_info *ee, unsigned int mode){	if (ee->ee_version >= AR5K_EEPROM_VERSION_4_0 && AR5K_EEPROM_EEMAP(ee->ee_misc0) == 1)		return ath5k_eeprom_read_rf5112_pcal_info(ee, mode);	else if (ee->ee_version >= AR5K_EEPROM_VERSION_5_0 && AR5K_EEPROM_EEMAP(ee->ee_misc0) == 2)		return ath5k_eeprom_read_rf2413_pcal_info(ee, mode);	/* Not sure if EEMAP existed in early eeproms */	else if (ee->ee_version >= AR5K_EEPROM_VERSION_3_0 || AR5K_EEPROM_EEMAP(ee->ee_misc0) == 0)		return ath5k_eeprom_read_rf5111_pcal_info(ee, mode);	return 0;}/* * Read per rate target power (this is the maximum tx power * supported by the card). This info is used when setting * tx power, no matter the channel. * * This also works for v5 EEPROMs. */static int ath5k_eeprom_read_target_rate_pwr_info(struct ath5k_eeprom_info *ee, unsigned int mode){	u_int32_t offset;	u_int16_t val;	struct ath5k_rate_pcal_info *rate_pcal_info;	u_int16_t *rate_target_pwr_num;	int ret, i;	switch (mode) {	case AR5K_EEPROM_MODE_11A:		offset = AR5K_EEPROM_TARGET_PWRSTART(ee->ee_misc1) +				AR5K_EEPROM_TARGET_PWR_OFF_11A(ee->ee_version);		rate_pcal_info = ee->ee_rate_tpwr_a;		ee->ee_rate_target_pwr_num_a = AR5K_EEPROM_N_5GHZ_CHAN;		rate_target_pwr_num = &ee->ee_rate_target_pwr_num_a;		break;	case AR5K_EEPROM_MODE_11B:		offset = AR5K_EEPROM_TARGET_PWRSTART(ee->ee_misc1) +				AR5K_EEPROM_TARGET_PWR_OFF_11B(ee->ee_version);		rate_pcal_info = ee->ee_rate_tpwr_b;		ee->ee_rate_target_pwr_num_b = 2; /* 3rd is g mode's 1st */		rate_target_pwr_num = &ee->ee_rate_target_pwr_num_b;		break;	case AR5K_EEPROM_MODE_11G:		offset = AR5K_EEPROM_TARGET_PWRSTART(ee->ee_misc1) +				AR5K_EEPROM_TARGET_PWR_OFF_11G(ee->ee_version);		rate_pcal_info = ee->ee_rate_tpwr_g;		ee->ee_rate_target_pwr_num_g = AR5K_EEPROM_N_2GHZ_CHAN;		rate_target_pwr_num = &ee->ee_rate_target_pwr_num_g;		break;	default:		return -EINVAL;	}	/* Different freq mask for older eeproms (<= v3.2) */	if(ee->ee_version <= AR5K_EEPROM_VERSION_3_2){		for (i = 0; i < (*rate_target_pwr_num); i++) {			AR5K_EEPROM_READ(offset++, val);			rate_pcal_info[i].freq =			    ath5k_eeprom_bin2freq(ee, (val >> 9) & 0x7f, mode);				rate_pcal_info[i].target_power_6to24 = ((val >> 3) & 0x3f);			rate_pcal_info[i].target_power_36 = (val << 3) & 0x3f;				AR5K_EEPROM_READ(offset++, val);				if (rate_pcal_info[i].freq == AR5K_EEPROM_CHANNEL_DIS ||			    val == 0) {				(*rate_target_pwr_num) = i;				break;			}			rate_pcal_info[i].target_power_36 |= ((val >> 13) & 0x7);			rate_pcal_info[i].target_power_48 = ((val >> 7) & 0x3f);			rate_pcal_info[i].target_power_54 = ((val >> 1) & 0x3f);		}	} else {		for (i = 0; i < (*rate_target_pwr_num); i++) {			AR5K_EEPROM_READ(offset++, val);			rate_pcal_info[i].freq =			    ath5k_eeprom_bin2freq(ee, (val >> 8) & 0xff, mode);				rate_pcal_info[i].target_power_6to24 = ((val >> 2) & 0x3f);			rate_pcal_info[i].target_power_36 = (val << 4) & 0x3f;				AR5K_EEPROM_READ(offset++, val);				if (rate_pcal_info[i].freq == AR5K_EEPROM_CHANNEL_DIS ||			    val == 0) {				(*rate_target_pwr_num) = i;				break;			}			rate_pcal_info[i].target_power_36 |= (val >> 12) & 0xf;			rate_pcal_info[i].target_power_48 = ((val >> 6) & 0x3f);			rate_pcal_info[i].target_power_54 = (val & 0x3f);		}	}	return 0;}/* * Initialize EEPROM & capabilities data */static int ath5k_eeprom_init(struct ath5k_eeprom_info *ee){	unsigned int mode, i;	int ret;	u_int32_t offset;	u_int16_t val;	/* 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(AR5K_EEPROM_MAGIC, ee->ee_magic);	AR5K_EEPROM_READ(AR5K_EEPROM_PROTECT, ee->ee_protect);	AR5K_EEPROM_READ(AR5K_EEPROM_REG_DOMAIN, ee->ee_regdomain);	AR5K_EEPROM_READ(AR5K_EEPROM_VERSION, ee->ee_version);	AR5K_EEPROM_READ(AR5K_EEPROM_HDR, ee->ee_header);	/* Return if we have an old EEPROM */	if (ee->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 -EIO;	}#endif	AR5K_EEPROM_READ(AR5K_EEPROM_ANT_GAIN(ee->ee_version), ee->ee_ant_gain);	if (ee->ee_version >= AR5K_EEPROM_VERSION_4_0) {		AR5K_EEPROM_READ(AR5K_EEPROM_MISC0, ee->ee_misc0);		AR5K_EEPROM_READ(AR5K_EEPROM_MISC1, ee->ee_misc1);		AR5K_EEPROM_READ(AR5K_EEPROM_MISC2, ee->ee_misc2);		AR5K_EEPROM_READ(AR5K_EEPROM_MISC3, ee->ee_misc3);		if (ee->ee_version >= AR5K_EEPROM_VERSION_5_0){			AR5K_EEPROM_READ(AR5K_EEPROM_MISC4, ee->ee_misc4);			AR5K_EEPROM_READ(AR5K_EEPROM_MISC5, ee->ee_misc5);			AR5K_EEPROM_READ(AR5K_EEPROM_MISC6, ee->ee_misc6);		}	}	if (ee->ee_version < AR5K_EEPROM_VERSION_3_3) {		AR5K_EEPROM_READ(AR5K_EEPROM_OBDB0_2GHZ, val);		ee->ee_ob[AR5K_EEPROM_MODE_11B][0] = val & 0x7;		ee->ee_db[AR5K_EEPROM_MODE_11B][0] = (val >> 3) & 0x7;		AR5K_EEPROM_READ(AR5K_EEPROM_OBDB1_2GHZ, val);		ee->ee_ob[AR5K_EEPROM_MODE_11G][0] = val & 0x7;		ee->ee_db[AR5K_EEPROM_MODE_11G][0] = (val >> 3) & 0x7;	}	/*	 * Get values for 802.11a (5GHz)	 */	mode = AR5K_EEPROM_MODE_11A;	ee->ee_turbo_max_power[mode] =	    AR5K_EEPROM_HDR_T_5GHZ_DBM(ee->ee_header);	offset = AR5K_EEPROM_MODES_11A(ee->ee_version);	ret = ath5k_eeprom_read_ants(ee, &offset, mode);	if (ret)		return ret;	ret = ath5k_eeprom_read_modes(ee, &offset, mode);	if (ret)		return ret;	ret = ath5k_eeprom_read_turbo_modes(ee, &offset, mode);	if (ret)		return ret;	/*	 * Get values for 802.11b (2.4GHz)	 */	mode = AR5K_EEPROM_MODE_11B;	offset = AR5K_EEPROM_MODES_11B(ee->ee_version);	ret = ath5k_eeprom_read_ants(ee, &offset, mode);	if (ret)		return ret;	ret = ath5k_eeprom_read_modes(ee, &offset, mode);	if (ret)		return ret;	/*	 * Get values for 802.11g (2.4GHz)	 */	mode = AR5K_EEPROM_MODE_11G;	offset = AR5K_EEPROM_MODES_11G(ee->ee_version);	ret = ath5k_eeprom_read_ants(ee, &offset, mode);	if (ret)		return ret;	ret = ath5k_eeprom_read_modes(ee, &offset, mode);	if (ret)		return ret;	ret = ath5k_eeprom_read_turbo_modes(ee, &offset, mode);	if (ret)		return ret;	/*	 * Get conformance test limit values	 */	offset = AR5K_EEPROM_CTL(ee->ee_version);	ee->ee_ctls = 0;	for (i = 0; i < AR5K_EEPROM_N_CTLS(ee->ee_version); i++) {		AR5K_EEPROM_READ(offset++, val);		if (((val >> 8) & 0xff) == 0)			break;		ee->ee_ctl[i] = (val >> 8) & 0xff;		ee->ee_ctls++;		if ((val & 0xff) == 0)			break;		ee->ee_ctl[i + 1] = val & 0xff;		ee->ee_ctls++;	}	/*	 * Read power calibration info	 */	mode = AR5K_EEPROM_MODE_11A;	ret = ath5k_eeprom_read_pcal_info(ee, mode);	if (ret)		return ret;	mode = AR5K_EEPROM_MODE_11B;	ret = ath5k_eeprom_read_pcal_info(ee, mode);	if (ret)		return ret;	mode = AR5K_EEPROM_MODE_11G;	ret = ath5k_eeprom_read_pcal_info(ee, mode);	if (ret)		return ret;	/*	 * Read per rate target power info	 */	mode = AR5K_EEPROM_MODE_11A;	ret = ath5k_eeprom_read_target_rate_pwr_info(ee, mode);	if (ret)		return ret;	mode = AR5K_EEPROM_MODE_11B;	ret = ath5k_eeprom_read_target_rate_pwr_info(ee,  mode);	if (ret)		return ret;	mode = AR5K_EEPROM_MODE_11G;	ret = ath5k_eeprom_read_target_rate_pwr_info(ee, mode);	if (ret)		return ret;	return 0;}static const char *ath5k_hw_get_mac_name(u_int8_t val){	const char *name = "?????";	unsigned int i;	for (i = 0; i < ARRAY_SIZE(ath5k_mac_names); i++) {		if ((val & 0xf0) == ath5k_mac_names[i].sr_val)			name = ath5k_mac_names[i].sr_name;		if ((val & 0xff) == ath5k_mac_names[i].sr_val) {			name = ath5k_mac_names[i].sr_name;			break;		}	}	return name;}static const char *ath5k_hw_get_phy_name(u_int8_t val){	const char *name = "?????";	unsigned int i;	for (i = 0; i < ARRAY_SIZE(ath5k_phy_names); i++) {		if ((val & 0xf0) == ath5k_phy_names[i].sr_val)			name = ath5k_phy_names[i].sr_name;		if ((val & 0xff) == ath5k_phy_names[i].sr_val) {			name = ath5k_phy_names[i].sr_name;			break;		}	}	return name;}/* returns -1 on unknown name */static int eeprom_name2addr(const char *name){	unsigned int i;	if (!name || !name[0])		return -1;	for (i = 0; i < ARRAY_SIZE(eeprom_addr); i++)		if (!strcmp(name, eeprom_addr[i].name))			return eeprom_addr[i].addr;	return -1;}/* returns "<unknown>" on unknown address */static const char *eeprom_addr2name(int addr){	unsigned int i;	for (i = 0; i < ARRAY_SIZE(eeprom_addr); i++)		if (eeprom_addr[i].addr == addr)			return eeprom_addr[i].name;	return "<unknown>";}static int do_write_pairs(int anr, int argc, char **argv){#define MAX_NR_WRITES 16	struct {		int addr;		unsigned int val;	} wr_ops[MAX_NR_WRITES];	int wr_ops_len = 0;	int i;	char *end;	int errors = 0;		/* count errors during write/verify */	if (anr >= argc) {		err("missing values to write.");		usage(argv[0]);		return 1;	}	if ((argc - anr) % 2) {		err("write spec. needs an even number of arguments.");		usage(argv[0]);		return 2;	}	if ((argc - anr) / 2 > MAX_NR_WRITES) {		err("too many values to write (max. %d)", MAX_NR_WRITES);		return 3;	}	/* get the (addr,val) pairs we have to write */	i = 0;	while (anr < (argc - 1)) {		wr_ops[i].addr = strtoul(argv[anr], &end, 16);		if (end == argv[anr]) {			/* maybe a symbolic name for the address? */			if ((wr_ops[i].addr =			     eeprom_name2addr(argv[anr])) == -1) {				err("pair %d: bad address %s", i, argv[anr]);				return 4;			}		}		if (wr_ops[i].addr >= AR5K_EEPROM_INFO_BASE) {			err("offset 0x%04x in CRC protected area is "			    "not supported", wr_ops[i].addr);			return 5;		}		anr++;		wr_ops[i].val = strtoul(argv[anr], &end, 16);		if (end == argv[anr]) {			err("pair %d: bad val %s", i, argv[anr]);			return 5;		}		if (wr_ops[i].val > 0xffff) {			err("pair %d: value %u too large", i, wr_ops[i].val);

⌨️ 快捷键说明

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