/* * Convert GHz frequency to IEEE channel number. */ int ath_hal_mhz2ieee(struct ath_hal *ah, u_int freq, u_int flags) { if (flags & IEEE80211_CHAN_2GHZ) { /* 2GHz band */ if (freq == 2484) return 14; if (freq < 2484) return ((int)freq - 2407) / 5; else return 15 + ((freq - 2512) / 20); } else if (flags & IEEE80211_CHAN_5GHZ) {/* 5Ghz band */ if (IS_CHAN_IN_PUBLIC_SAFETY_BAND(freq)) return mappsb(freq, flags); else if ((flags & IEEE80211_CHAN_A) && (freq <= 5000)) return (freq - 4000) / 5; else return (freq - 5000) / 5; } else { /* either, guess */ if (freq == 2484) return 14; if (freq < 2484) return ((int)freq - 2407) / 5; if (freq < 5000) { if (IS_CHAN_IN_PUBLIC_SAFETY_BAND(freq)) return mappsb(freq, flags); else if (freq > 4900) return (freq - 4000) / 5; else return 15 + ((freq - 2512) / 20); } return (freq - 5000) / 5; } }
/* * Function : icm_convert_mhz2channel * Description : converts MHz to IEEE channel * Input params : freq in MHz * Return : channel number * */ int icm_convert_mhz2channel(u_int32_t freq) { #define IS_CHAN_IN_PUBLIC_SAFETY_BAND(_c) ((_c) > 4940 && (_c) < 4990) if (freq == 2484) return 14; if (freq < 2484) return (freq - 2407) / 5; if (freq < 5000) { if (IS_CHAN_IN_PUBLIC_SAFETY_BAND(freq)) { return ((freq * 10) + (((freq % 5) == 2) ? 5 : 0) - 49400)/5; } else if (freq > 4900) { return (freq - 4000) / 5; } else { return 15 + ((freq - 2512) / 20); } } return (freq - 5000) / 5; }
LBD_STATUS wlanifResolveRegclassAndChannum(u_int32_t freq, u_int8_t *channel, u_int8_t *regClass) { if (!channel || !regClass) { return LBD_NOK; } *channel = 0; *regClass = IEEE80211_RRM_REGCLASS_RESERVED; freq /= 100000; // Convert to MHz if ((freq >= 2412) && (freq <= 2472)) { if (((freq - 2407) % 5) != 0) { /* error: freq not exact */ return LBD_NOK; } *regClass = IEEE80211_RRM_REGCLASS_81; /* 2.407 GHz, channels 1..13 */ *channel = (freq - 2407) / 5; return LBD_OK; } if (freq == 2484) { *regClass = IEEE80211_RRM_REGCLASS_82; /* channel 14 */ *channel = 14; return LBD_OK; } #define IS_CHAN_IN_PUBLIC_SAFETY_BAND(_c) ((_c) > 4940 && (_c) < 4990) if (freq >= 2512 && freq < 5000) { if (IS_CHAN_IN_PUBLIC_SAFETY_BAND(freq)) { *channel = ((freq * 10) + (((freq % 5) == 2) ? 5 : 0) - 49400)/5; } else if ( freq > 4900 ) { *channel = (freq - 4000) / 5; } else { *channel = 15 + ((freq - 2512) / 20); } // Since our chipset does not support bands other than 2.4 Ghz or 5 GHz, // indicate failure here with channel resolved but regulatory class cannot // be resolved. return LBD_NOK; } #define FREQ_5G_CH(_chan_num) (5000 + (5 * _chan_num)) #define CASE_5G_FREQ(_chan_num) \ case FREQ_5G_CH(_chan_num): \ *channel = _chan_num; \ break; if ((freq >= FREQ_5G_CH(36)) && (freq <= FREQ_5G_CH(48))) { switch(freq) { CASE_5G_FREQ(36); CASE_5G_FREQ(40); CASE_5G_FREQ(44); CASE_5G_FREQ(48); default: /* No valid frequency in this range */ return LBD_NOK; } *regClass = IEEE80211_RRM_REGCLASS_115; /* 5 GHz, channels 36..48 */ return LBD_OK; } if ((freq >= FREQ_5G_CH(149)) && (freq <= FREQ_5G_CH(161))) { switch(freq) { CASE_5G_FREQ(149); CASE_5G_FREQ(153); CASE_5G_FREQ(157); CASE_5G_FREQ(161); default: /* No valid frequency in this range */ return LBD_NOK; } *regClass = IEEE80211_RRM_REGCLASS_124; /* 5 GHz, channels 149..161 */ return LBD_OK; } if ((freq >= FREQ_5G_CH(8)) && (freq <= FREQ_5G_CH(16))) { switch(freq) { CASE_5G_FREQ(8); CASE_5G_FREQ(12); CASE_5G_FREQ(16); default: /* No valid frequency in this range */ return LBD_NOK; } *regClass = IEEE80211_RRM_REGCLASS_112; /* 5 GHz, channels 8, 12, 16 */ return LBD_OK; } if ((freq >= FREQ_5G_CH(52)) && (freq <= FREQ_5G_CH(64))) { switch(freq) { CASE_5G_FREQ(52); CASE_5G_FREQ(56); CASE_5G_FREQ(60); CASE_5G_FREQ(64); default: /* No valid frequency in this range */ return LBD_NOK; } *regClass = IEEE80211_RRM_REGCLASS_118; /* 5 GHz, channels 52, 56, 60, 64 */ return LBD_OK; } if ((freq >= FREQ_5G_CH(100)) && (freq <= FREQ_5G_CH(140))) { switch(freq) { CASE_5G_FREQ(100); CASE_5G_FREQ(104); CASE_5G_FREQ(108); CASE_5G_FREQ(112); CASE_5G_FREQ(116); CASE_5G_FREQ(120); CASE_5G_FREQ(124); CASE_5G_FREQ(128); CASE_5G_FREQ(132); CASE_5G_FREQ(136); CASE_5G_FREQ(140); default: /* No valid frequency in this range */ return LBD_NOK; } *regClass = IEEE80211_RRM_REGCLASS_121; /* 5 GHz, channels 100, 104, 108, 112, * 116, 120, 124, 128, 132, 136, 140 */ return LBD_OK; } return LBD_NOK; #undef IS_CHAN_IN_PUBLIC_SAFETY_BAND #undef CASE_5G_FREQ #undef FREQ_5G_CH }