📄 ar5xxx.c
字号:
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 + -