static HAL_CHANNEL_INTERNAL * getchannel(struct ath_hal *ah, const HAL_CHANNEL *c) { #define CHAN_FLAGS (CHANNEL_ALL | CHANNEL_HALF | CHANNEL_QUARTER) HAL_CHANNEL_INTERNAL *base, *cc; int flags = c->channel_flags & CHAN_FLAGS; int n, lim; /* * Check current channel to avoid the lookup. */ cc = AH_PRIVATE(ah)->ah_curchan; if (cc != AH_NULL && cc->channel == c->channel && (cc->channel_flags & CHAN_FLAGS) == flags) { return cc; } /* binary search based on known sorting order */ base = AH_TABLES(ah)->ah_channels; n = AH_PRIVATE(ah)->ah_nchan; /* binary search based on known sorting order */ for (lim = n; lim != 0; lim >>= 1) { int d; cc = &base[lim >> 1]; d = c->channel - cc->channel; if (d == 0) { if ((cc->channel_flags & CHAN_FLAGS) == flags) { return cc; } d = flags - (cc->channel_flags & CHAN_FLAGS); } HDPRINTF(ah, HAL_DBG_DFS, "%s: channel %u/0x%x d %d\n", __func__, cc->channel, cc->channel_flags, d); if (d > 0) { base = cc + 1; lim--; } } HDPRINTF(ah, HAL_DBG_DFS, "%s: no match for %u/0x%x\n", __func__, c->channel, c->channel_flags); return AH_NULL; #undef CHAN_FLAGS }
HAL_CHANNEL *ar9300GetExtensionChannel(struct ath_hal *ah) { struct ath_hal_private *ahp = AH_PRIVATE(ah); struct ath_hal_private_tables *aht = AH_TABLES(ah); int i = 0; HAL_CHANNEL_INTERNAL *ichan = AH_NULL; CHAN_CENTERS centers; ichan = ahp->ah_curchan; ar9300GetChannelCenters(ah, ichan, ¢ers); if (centers.ctl_center == centers.ext_center) { return AH_NULL; } for (i = 0; i < ahp->ah_nchan; i++) { ichan = &aht->ah_channels[i]; if (ichan->channel == centers.ext_center) { return (HAL_CHANNEL*)ichan; } } return AH_NULL; }