Ejemplo n.º 1
0
/*
 * 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;
	}
}
Ejemplo n.º 2
0
/*
 * 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;
}
Ejemplo n.º 3
0
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
}