On Tue, 2014-02-25 at 10:22 +0100, Michal Kazior wrote: > On 24 February 2014 21:54, Luciano Coelho <luca@xxxxxxxxx> wrote: > > [...] > > > --- a/net/mac80211/util.c > > +++ b/net/mac80211/util.c > > @@ -2801,3 +2801,79 @@ void ieee80211_recalc_dtim(struct ieee80211_local *local, > > > > ps->dtim_count = dtim_count; > > } > > + > > +int ieee80211_check_combinations(struct ieee80211_local *local, > > + struct ieee80211_sub_if_data *sdata, > > + const struct cfg80211_chan_def *chandef, > > + enum ieee80211_chanctx_mode chanmode, > > + u8 radar_detect) > > +{ > > + struct ieee80211_sub_if_data *sdata_iter; > > + enum nl80211_iftype iftype = sdata->wdev.iftype; > > + u32 used_iftypes = 0; > > + int num[NUM_NL80211_IFTYPES]; > > + struct ieee80211_chanctx *ctx; > > + int num_different_channels = 1; > > + int total = 1; > > + > > + lockdep_assert_held(&local->chanctx_mtx); > > + > > + if (WARN_ON(hweight32(radar_detect) > 1)) > > + return -EINVAL; > > + > > + if (WARN_ON(chanmode == IEEE80211_CHANCTX_SHARED && !chandef->chan)) > > + return -EINVAL; > > + > > + if (WARN_ON(iftype >= NUM_NL80211_IFTYPES)) > > + return -EINVAL; > > + > > + /* Always allow software iftypes */ > > + if (local->hw.wiphy->software_iftypes & BIT(iftype)) { > > + if (radar_detect) > > + return -EINVAL; > > + return 0; > > + } > > + > > + memset(num, 0, sizeof(num)); > > + > > + if (iftype != NL80211_IFTYPE_UNSPECIFIED) { > > + used_iftypes = BIT(iftype); > > + num[iftype] = 1; > > + } > > + > > > + list_for_each_entry(ctx, &local->chanctx_list, list) { > > + if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) { > > + num_different_channels++; > > + continue; > > + } > > + if ((chanmode == IEEE80211_CHANCTX_SHARED) && > > + cfg80211_chandef_compatible(chandef, > > + &ctx->conf.def)) > > + continue; > > + num_different_channels++; > > + if (ctx->conf.radar_enabled) > > + radar_detect |= BIT(ctx->conf.def.width); > > + } > > Hmm.. now that I think about it -- is it correct to skip updating > radar_detect when a chanctx is exclusive? Shouldn't the radar_enabled > check be done at the beginning of each iteration? Yes, you're right. It makes sense also for shared, because we need to take into consideration the existing context's width, because the channels may be compatible but with different widths. I'll fix and send v5. -- Luca. -- 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