static void add_chanlist_mode(struct ath_hal *ah, struct ieee80211_channel chans[], u_int maxchans, int *nchans, const struct cmode *cm, REG_DOMAIN *rd, HAL_BOOL enableExtendedChannels) { uint64_t *channelBM; uint16_t freq_lo, freq_hi; int b, error, low_adj, hi_adj, channelSep; if (!ath_hal_getChannelEdges(ah, cm->flags, &freq_lo, &freq_hi)) { /* channel not supported by hardware, skip it */ HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: channels 0x%x not supported by hardware\n", __func__, cm->flags); return; } channelBM = getchannelBM(cm->mode, rd); if (isChanBitMaskZero(channelBM)) return; /* * Setup special handling for HT40 channels; e.g. * 5G HT40 channels require 40Mhz channel separation. */ adj_freq_ht40(cm->mode, &low_adj, &hi_adj, &channelSep); for (b = 0; b < 64*BMLEN; b++) { REG_DMN_FREQ_BAND *fband; uint16_t bfreq_lo, bfreq_hi; int step; if (!IS_BIT_SET(b, channelBM)) continue; fband = &cm->freqs[b]; if ((fband->usePassScan & IS_ECM_CHAN) && !enableExtendedChannels) { HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "skip ecm channels\n"); continue; } #if 0 if ((fband->useDfs & rd->dfsMask) && (cm->flags & IEEE80211_CHAN_HT40)) { /* NB: DFS and HT40 don't mix */ HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "skip HT40 chan, DFS required\n"); continue; } #endif /* * XXX TODO: handle REG_EXT_FCC_CH_144. * * Figure out which instances/uses cause us to not * be allowed to use channel 144 (pri or sec overlap.) */ bfreq_lo = MAX(fband->lowChannel + low_adj, freq_lo); bfreq_hi = MIN(fband->highChannel + hi_adj, freq_hi); /* * Don't start the 5GHz channel list at 5120MHz. * * Unfortunately (sigh) the HT40 channel creation * logic will create HT40U channels at 5120, 5160, 5200. * This means that 36 (5180) isn't considered as a * HT40 channel, and everything goes messed up from there. */ if ((cm->flags & IEEE80211_CHAN_5GHZ) && (cm->flags & IEEE80211_CHAN_HT40U)) { if (bfreq_lo < 5180) bfreq_lo = 5180; } /* * Same with HT40D - need to start at 5200 or the low * channels are all wrong again. */ if ((cm->flags & IEEE80211_CHAN_5GHZ) && (cm->flags & IEEE80211_CHAN_HT40D)) { if (bfreq_lo < 5200) bfreq_lo = 5200; } if (fband->channelSep >= channelSep) step = fband->channelSep; else step = roundup(channelSep, fband->channelSep); HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: freq_lo=%d, freq_hi=%d, low_adj=%d, hi_adj=%d, " "bandlo=%d, bandhi=%d, bfreqlo=%d, bfreqhi=%d, step=%d, " "flags=0x%08x\n", __func__, (int) freq_lo, (int) freq_hi, (int) low_adj, (int) hi_adj, (int) fband->lowChannel, (int) fband->highChannel, (int) bfreq_lo, (int) bfreq_hi, step, (int) cm->flags); error = add_chanlist_band(ah, chans, maxchans, nchans, bfreq_lo, bfreq_hi, step, cm->flags, fband, rd); if (error != 0) { HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: too many channels for channel table\n", __func__); return; } } }
static void add_chanlist_mode(struct ath_hal *ah, struct ieee80211_channel chans[], u_int maxchans, int *nchans, const struct cmode *cm, REG_DOMAIN *rd, HAL_BOOL enableExtendedChannels) { uint64_t *channelBM; uint16_t freq_lo, freq_hi; int b, error, low_adj, hi_adj, channelSep; if (!ath_hal_getChannelEdges(ah, cm->flags, &freq_lo, &freq_hi)) { /* channel not supported by hardware, skip it */ HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: channels 0x%x not supported by hardware\n", __func__, cm->flags); return; } channelBM = getchannelBM(cm->mode, rd); if (isChanBitMaskZero(channelBM)) return; /* * Setup special handling for HT40 channels; e.g. * 5G HT40 channels require 40Mhz channel separation. */ adj_freq_ht40(cm->mode, &low_adj, &hi_adj, &channelSep); for (b = 0; b < 64*BMLEN; b++) { REG_DMN_FREQ_BAND *fband; uint16_t bfreq_lo, bfreq_hi; int step; if (!IS_BIT_SET(b, channelBM)) continue; fband = &cm->freqs[b]; if ((fband->usePassScan & IS_ECM_CHAN) && !enableExtendedChannels) { HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "skip ecm channels\n"); continue; } #if 0 if ((fband->useDfs & rd->dfsMask) && (cm->flags & IEEE80211_CHAN_HT40)) { /* NB: DFS and HT40 don't mix */ HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "skip HT40 chan, DFS required\n"); continue; } #endif /* * XXX TODO: handle REG_EXT_FCC_CH_144. * * Figure out which instances/uses cause us to not * be allowed to use channel 144 (pri or sec overlap.) */ bfreq_lo = MAX(fband->lowChannel + low_adj, freq_lo); bfreq_hi = MIN(fband->highChannel + hi_adj, freq_hi); if (fband->channelSep >= channelSep) step = fband->channelSep; else step = roundup(channelSep, fband->channelSep); error = add_chanlist_band(ah, chans, maxchans, nchans, bfreq_lo, bfreq_hi, step, cm->flags, fband, rd); if (error != 0) { HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: too many channels for channel table\n", __func__); return; } } }