Re: [RFC v3] initial channel context implementation
From: Johannes Berg <johannes@sipsolutions.net>
Date: 2012-06-28 07:31:34
On Thu, 2012-06-28 at 08:04 +0200, Michal Kazior wrote:
quoted
In any case, I think you're turning it upside down. I think we should get rid of local->oper_channel(_type) completely, and instead use the channel contexts in mac80211 everywhere. If the driver doesn't implement channel contexts it can only support a single channel. Thus, we can have at most one channel context, so whenever a new context is added (there could be zero) or any context is modified (the only one) we can set hw.conf.channel and call hw_config() with the CHANNEL_CHANGE flag. IOW, nothing in mac80211 would ever call hw_config() for the channel or channel type change, it would all do channel contexts, but the channel context code would see that if the driver doesn't support channel contexts 1) there will be at most one context in mac80211 2) this context is programmed into the device by using hw_config() instead of the context callbacksYes, this is more or less what I also had in mind. I was just thinking about solving the issue of channel context and hw.conf.channel consistency. If we switch a channel we either modify channel in channel context directly (violating the immutability of channel contexts) or we iterate and re-set the new channel on each interface (because single-channel drivers may still have multiple interfaces and we probably want to use sdata->vif.chanctx_conf->channel instead of hw.conf.channel inside mac80211). Now that I think about it I guess violating the immutability for the single-channel case is okay. It would greatly simplify the code and we'd just put a comment down in hw_config where the only violation would occur.
I'm not sure why we would violate it? The way I see it, you'd never
change the channel context channel since internally in mac80211 you'd
never want to see a different channel, just like today we use
local->oper_channel everywhere we'd then use sdata->vif.chanctx->channel
throughout, right?
I think the only thing we need to do is put something like this into
hw_config:
if (local->tmp_channel) {
local->hw.conf.channel = local->tmp_channel;
...
} else {
local->hw.conf.channel = chanctx->channel;
}
No?
johannes