Hi,
> Since monitor_sdata->vif.type is also NL80211_IFTYPE_MONITOR,
> the warning would still appear with the patch to cfg.c, so I excluded
> that case from the WARN_ON_ONCE condition.
>
> I hope that makes sense?!
Yeah, looks good.
> if (wdev) {
> sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
>
> + if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
> + sdata = rtnl_dereference(local->monitor_sdata);
> + if (!sdata)
> + return -EOPNOTSUPP;
> + }
This part makes perfect sense.
> mutex_lock(&local->iflist_mtx);
> list_for_each_entry(sdata, &local->interfaces, list) {
> + if (sdata->vif.type == NL80211_IFTYPE_MONITOR) {
> + has_monitor = true;
> + continue;
> + }
> sdata->user_power_level = local->user_power_level;
> if (txp_type != sdata->vif.bss_conf.txpower_type)
> update_txp_type = true;
> sdata->vif.bss_conf.txpower_type = txp_type;
> }
> - list_for_each_entry(sdata, &local->interfaces, list)
> + list_for_each_entry(sdata, &local->interfaces, list) {
> + if (sdata->vif.type == NL80211_IFTYPE_MONITOR)
> + continue;
> ieee80211_recalc_txpower(sdata, update_txp_type);
> + }
> mutex_unlock(&local->iflist_mtx);
>
> + if (has_monitor) {
> + sdata = rtnl_dereference(local->monitor_sdata);
> + if (sdata) {
> + sdata->user_power_level = local->user_power_level;
> + if (txp_type != sdata->vif.bss_conf.txpower_type)
> + update_txp_type = true;
> + sdata->vif.bss_conf.txpower_type = txp_type;
> +
> + ieee80211_recalc_txpower(sdata, update_txp_type);
> + }
> + }
But do we really need this? I think we can probably live with just not
having monitor handled here, i.e. only have the "if monitor continue;"
part?
johannes