int zd_geo_init(struct ieee80211_device *ieee, u8 regdomain) { struct ieee80211_geo geo; const struct channel_range *range; int i; u8 channel; dev_dbg(zd_mac_dev(zd_netdev_mac(ieee->dev)), "regdomain %#04x\n", regdomain); range = zd_channel_range(regdomain); if (range->start == 0) { dev_err(zd_mac_dev(zd_netdev_mac(ieee->dev)), "zd1211 regdomain %#04x not supported\n", regdomain); return -EINVAL; } memset(&geo, 0, sizeof(geo)); for (i = 0, channel = range->start; channel < range->end; channel++) { struct ieee80211_channel *chan = &geo.bg[i++]; chan->freq = channel_frequencies[channel - 1]; chan->channel = channel; } geo.bg_channels = i; memcpy(geo.name, "XX ", 4); ieee80211_set_geo(ieee, &geo); return 0; }
int zd_mac_get_range(struct zd_mac *mac, struct iw_range *range) { int i; const struct channel_range *channel_range; u8 regdomain; memset(range, 0, sizeof(*range)); /* FIXME: Not so important and depends on the mode. For 802.11g * usually this value is used. It seems to be that Bit/s number is * given here. */ range->throughput = 27 * 1000 * 1000; range->max_qual.qual = 100; range->max_qual.level = 100; /* FIXME: Needs still to be tuned. */ range->avg_qual.qual = 71; range->avg_qual.level = 80; /* FIXME: depends on standard? */ range->min_rts = 256; range->max_rts = 2346; range->min_frag = MIN_FRAG_THRESHOLD; range->max_frag = MAX_FRAG_THRESHOLD; range->max_encoding_tokens = WEP_KEYS; range->num_encoding_sizes = 2; range->encoding_size[0] = 5; range->encoding_size[1] = WEP_KEY_LEN; range->we_version_compiled = WIRELESS_EXT; range->we_version_source = 20; range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; ZD_ASSERT(!irqs_disabled()); spin_lock_irq(&mac->lock); regdomain = mac->regdomain; spin_unlock_irq(&mac->lock); channel_range = zd_channel_range(regdomain); range->num_channels = channel_range->end - channel_range->start; range->old_num_channels = range->num_channels; range->num_frequency = range->num_channels; range->old_num_frequency = range->num_frequency; for (i = 0; i < range->num_frequency; i++) { struct iw_freq *freq = &range->freq[i]; freq->i = channel_range->start + i; zd_channel_to_freq(freq, freq->i); } return 0; }
static int reset_channel(struct zd_mac *mac) { int r; unsigned long flags; const struct channel_range *range; spin_lock_irqsave(&mac->lock, flags); range = zd_channel_range(mac->regdomain); if (!range->start) { r = -EINVAL; goto out; } mac->requested_channel = range->start; r = 0; out: spin_unlock_irqrestore(&mac->lock, flags); return r; }
int zd_regdomain_supported(u8 regdomain) { const struct channel_range *range = zd_channel_range(regdomain); return range->start != 0; }
int zd_regdomain_supports_channel(u8 regdomain, u8 channel) { const struct channel_range *range = zd_channel_range(regdomain); return range->start <= channel && channel < range->end; }