On Wed, 2012-02-22 at 23:21 +0530, Mahesh wrote: > This change is for marking 80Mhz bandwidth supported channel flags in > 5Gig band. This patch is not only completely mangled, it also neglects to actually support this in the regdb etc. What's the point? johannes > Signed-off-by: Mahesh Palivela (maheshp@xxxxxxxxxxx) > --- > > include/net/cfg80211.h | 20 +++++++++---- > net/wireless/reg.c | 72 > ++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 86 insertions(+), 6 deletions(-) > > diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h > index e0c9ff3..7fb77d5 100644 > --- a/include/net/cfg80211.h > +++ b/include/net/cfg80211.h > @@ -93,18 +93,26 @@ enum ieee80211_band { > * is not permitted. > * @IEEE80211_CHAN_NO_HT40MINUS: extension channel below this channel > * is not permitted. > + * @IEEE80211_CHAN_NO_VHT80PLUS: extension channel above this channel > + * is not permitted. > + * @IEEE80211_CHAN_NO_VHT80MINUS: extension channel below this channel > + * is not permitted. > */ > enum ieee80211_channel_flags { > - IEEE80211_CHAN_DISABLED = 1<<0, > - IEEE80211_CHAN_PASSIVE_SCAN = 1<<1, > - IEEE80211_CHAN_NO_IBSS = 1<<2, > - IEEE80211_CHAN_RADAR = 1<<3, > - IEEE80211_CHAN_NO_HT40PLUS = 1<<4, > - IEEE80211_CHAN_NO_HT40MINUS = 1<<5, > + IEEE80211_CHAN_DISABLED = 1<<0, > + IEEE80211_CHAN_PASSIVE_SCAN = 1<<1, > + IEEE80211_CHAN_NO_IBSS = 1<<2, > + IEEE80211_CHAN_RADAR = 1<<3, > + IEEE80211_CHAN_NO_HT40PLUS = 1<<4, > + IEEE80211_CHAN_NO_HT40MINUS = 1<<5, > + IEEE80211_CHAN_NO_VHT80PLUS = 1<<6, > + IEEE80211_CHAN_NO_VHT80MINUS = 1<<7, > }; > > #define IEEE80211_CHAN_NO_HT40 \ > (IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS) > +#define IEEE80211_CHAN_NO_VHT80 \ > + (IEEE80211_CHAN_NO_VHT80PLUS | IEEE80211_CHAN_NO_VHT80MINUS) > > /** > * struct ieee80211_channel - channel definition > diff --git a/net/wireless/reg.c b/net/wireless/reg.c > index e9a0ac8..dfa8f5d 100644 > --- a/net/wireless/reg.c > +++ b/net/wireless/reg.c > @@ -1048,6 +1048,77 @@ static void reg_process_beacons(struct wiphy > *wiphy) > wiphy_update_beacon_reg(wiphy); > } > > +static bool is_vht80_not_allowed(struct ieee80211_channel *chan) > +{ > + if (!chan) > + return true; > + if (chan->flags & IEEE80211_CHAN_DISABLED) > + return true; > + /* This would happen when regulatory rules disallow VHT80 completely > */ > + if (IEEE80211_CHAN_NO_VHT80 == (chan->flags & > (IEEE80211_CHAN_NO_VHT80))) > + return true; > + return false; > +} > + > +static void reg_process_vht_flags_channel(struct wiphy *wiphy, > + unsigned int chan_idx) > +{ > + struct ieee80211_supported_band *sband; > + struct ieee80211_channel *channel; > + struct ieee80211_channel *channel_before = NULL, *channel_after = > NULL; > + unsigned int i; > + > + assert_cfg80211_lock(); > + > + sband = wiphy->bands[IEEE80211_BAND_5GHZ]; > + BUG_ON(chan_idx >= sband->n_channels); > + channel = &sband->channels[chan_idx]; > + > + if (is_vht80_not_allowed(channel)) { > + channel->flags |= IEEE80211_CHAN_NO_VHT80; > + return; > + } > + > + /* > + * We need to ensure the extension channels exist to > + * be able to use VHT80- or VHT80+, this finds them (or not) > + */ > + for (i = 0; i < sband->n_channels; i++) { > + struct ieee80211_channel *c = &sband->channels[i]; > + if (c->center_freq == (channel->center_freq - 40)) > + channel_before = c; > + if (c->center_freq == (channel->center_freq + 40)) > + channel_after = c; > + } > + > + /* > + * Please note that this assumes target bandwidth is 40 MHz, > + * if that ever changes we also need to change the below logic > + * to include that as well. > + */ > + if (is_vht80_not_allowed(channel_before)) > + channel->flags |= IEEE80211_CHAN_NO_VHT80MINUS; > + else > + channel->flags &= ~IEEE80211_CHAN_NO_VHT80MINUS; > + > + if (is_vht80_not_allowed(channel_after)) > + channel->flags |= IEEE80211_CHAN_NO_VHT80PLUS; > + else > + channel->flags &= ~IEEE80211_CHAN_NO_VHT80PLUS; > +} > + > +static void reg_process_vht_flags(struct wiphy *wiphy) > +{ > + unsigned int i; > + struct ieee80211_supported_band *sband; > + > + BUG_ON(!wiphy->bands[IEEE80211_BAND_5GHZ]); > + sband = wiphy->bands[IEEE80211_BAND_5GHZ]; > + > + for (i = 0; i < sband->n_channels; i++) > + reg_process_vht_flags_channel(wiphy, i); > +} > + > static bool is_ht40_not_allowed(struct ieee80211_channel *chan) > { > if (!chan) > @@ -1154,6 +1225,7 @@ static void wiphy_update_regulatory(struct wiphy > *wiphy, > > reg_process_beacons(wiphy); > reg_process_ht_flags(wiphy); > + reg_process_vht_flags(wiphy); > if (wiphy->reg_notifier) > wiphy->reg_notifier(wiphy, last_request); > } > > -- > To unsubscribe from this list: send the line "unsubscribe linux-wireless" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html