📄 ath_info.c.svn-base
字号:
(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 + -