[RFC v3 6/8] wifi: mac80211: extend ifcomb check functions for multi-radio
Karthikeyan Periyasamy
quic_periyasa at quicinc.com
Fri Jun 7 02:22:04 PDT 2024
On 6/6/2024 11:37 PM, Felix Fietkau wrote:
...
>
> +static u32
> +__ieee80211_get_radio_mask(struct ieee80211_sub_if_data *sdata)
> +{
> + struct ieee80211_local *local = sdata->local;
> + struct ieee80211_chanctx_conf *conf;
> + struct ieee80211_link_data *link;
> + u32 mask = 0;
> +
> + for_each_sdata_link(local, link) {
> + conf = rcu_dereference(link->conf->chanctx_conf);
> + if (!conf || conf->radio_idx < 0)
> + continue;
> +
> + mask |= BIT(conf->radio_idx);
> + }
> +
> + return mask;
> +}
> +
> +int ieee80211_get_radio_mask(struct wiphy *wiphy, struct net_device *dev,
> + u32 *mask)
> +{
> + struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
> +
> + *mask = __ieee80211_get_radio_mask(sdata);
> +
> + return 0;
> +}
> +
> +static bool
> +ieee80211_sdata_uses_radio(struct ieee80211_sub_if_data *sdata, int radio_idx)
> +{
> + if (radio_idx < 0)
> + return true;
> +
> + return __ieee80211_get_radio_mask(sdata) & BIT(radio_idx);
> +}
> +
> +static void
> +ieee80211_fill_ifcomb_params(struct ieee80211_local *local,
> + struct iface_combination_params *params,
> + const struct cfg80211_chan_def *chandef,
> + struct ieee80211_sub_if_data *sdata,
> + int radio_idx)
> +{
> + struct ieee80211_sub_if_data *sdata_iter;
> + struct ieee80211_chanctx *ctx;
> +
> + list_for_each_entry(ctx, &local->chanctx_list, list) {
> + if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
> + continue;
> +
> + if (radio_idx >= 0 && ctx->conf.radio_idx != radio_idx)
> + continue;
> +
> + if (chandef &&
> + cfg80211_chandef_compatible(chandef, &ctx->conf.def))
> + continue;
> +
> + params->num_different_channels++;
> +
> + params->radar_detect |=
> + ieee80211_chanctx_radar_detect(local, ctx);
> + }
> +
> + list_for_each_entry_rcu(sdata_iter, &local->interfaces, list) {
> + struct wireless_dev *wdev_iter;
> +
> + wdev_iter = &sdata_iter->wdev;
> +
> + if (sdata_iter == sdata ||
> + !ieee80211_sdata_running(sdata_iter) ||
> + cfg80211_iftype_allowed(local->hw.wiphy,
> + wdev_iter->iftype, 0, 1))
> + continue;
> +
> + if (!ieee80211_sdata_uses_radio(sdata_iter, radio_idx))
> + continue;
> +
> + params->iftype_num[wdev_iter->iftype]++;
> + }
> +}
> +
> int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
> const struct cfg80211_chan_def *chandef,
> enum ieee80211_chanctx_mode chanmode,
> - u8 radar_detect)
> + u8 radar_detect, int radio_idx)
> {
> + bool shared = chanmode == IEEE80211_CHANCTX_SHARED;
> struct ieee80211_local *local = sdata->local;
> - struct ieee80211_sub_if_data *sdata_iter;
> enum nl80211_iftype iftype = sdata->wdev.iftype;
> struct ieee80211_chanctx *ctx;
> int total = 1;
> @@ -3977,6 +4060,8 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
> if (iftype != NL80211_IFTYPE_UNSPECIFIED)
> params.iftype_num[iftype] = 1;
>
> + ieee80211_fill_ifcomb_params(local, ¶ms, shared ? chandef : NULL,
> + sdata, radio_idx);
> list_for_each_entry(ctx, &local->chanctx_list, list) {
> if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
> continue;
> @@ -3986,28 +4071,9 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
> params.num_different_channels++;
> continue;
> }
> - if (chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
> - cfg80211_chandef_compatible(chandef,
> - &ctx->conf.def))
> - continue;
> params.num_different_channels++;
> }
>
> - list_for_each_entry_rcu(sdata_iter, &local->interfaces, list) {
> - struct wireless_dev *wdev_iter;
> -
> - wdev_iter = &sdata_iter->wdev;
> -
> - if (sdata_iter == sdata ||
> - !ieee80211_sdata_running(sdata_iter) ||
> - cfg80211_iftype_allowed(local->hw.wiphy,
> - wdev_iter->iftype, 0, 1))
> - continue;
> -
> - params.iftype_num[wdev_iter->iftype]++;
> - total++;
> - }
> -
> if (total == 1 && !params.radar_detect)
> return 0;
ieee80211_check_combinations() missed to update "params.radio", no ?
--
Karthikeyan Periyasamy
--
கார்த்திகேயன் பெரியசாமி
More information about the ath12k
mailing list