On Thu, 2024-06-06 at 20:07 +0200, Felix Fietkau wrote: > > @@ -4577,6 +4579,7 @@ struct mgmt_frame_regs { > * > * @set_hw_timestamp: Enable/disable HW timestamping of TM/FTM frames. > * @set_ttlm: set the TID to link mapping. > + * @get_radio_mask: get bitmask of radios in use > */ > struct cfg80211_ops { > int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); > @@ -4938,6 +4941,8 @@ struct cfg80211_ops { > struct cfg80211_set_hw_timestamp *hwts); > int (*set_ttlm)(struct wiphy *wiphy, struct net_device *dev, > struct cfg80211_ttlm_params *params); > + int (*get_radio_mask)(struct wiphy *wiphy, struct net_device *dev, > + u32 *mask); not sure I see the point of this being a callback rather than being passed in? (Also, if really needed, do you actually expect a device with 32 radios? if not you can use a return value instead of u32 *mask out pointer :) ) > +DEFINE_EVENT(wiphy_netdev_evt, rdev_get_radio_mask, > + TP_PROTO(struct wiphy *wiphy, struct net_device *netdev), > + TP_ARGS(wiphy, netdev) > +); and if we do need it that really should trace not just the fact that it happened but also the return value and mask > static void cfg80211_calculate_bi_data(struct wiphy *wiphy, u32 new_beacon_int, > u32 *beacon_int_gcd, > - bool *beacon_int_different) > + bool *beacon_int_different, > + const struct wiphy_radio *radio) > { > + struct cfg80211_registered_device *rdev; > struct wireless_dev *wdev; > + int radio_idx = -1; > > *beacon_int_gcd = 0; > *beacon_int_different = false; > + if (radio) > + radio_idx = radio - wiphy->radio; This can go oh so wrong ... and technically even be UB. I'd rather pass the index from the driver, I guess, and validate it against n_radios. > + rdev = wiphy_to_rdev(wiphy); > list_for_each_entry(wdev, &wiphy->wdev_list, list) { > int wdev_bi; > + u32 mask; > > /* this feature isn't supported with MLO */ > if (wdev->valid_links) > continue; Are we expecting this to change? because the premise of this patchset is MLO support, and yet with real MLO we won't get here? Or is that because non-MLO interfaces could be created on this wiphy? > > + if (radio_idx >= 0) { > + if (rdev_get_radio_mask(rdev, wdev->netdev, &mask)) > + continue; here: given that 'radio'/'radio_idx' is passed in, not sure I see why the mask couldn't also be passed in? > + if (!(mask & BIT(radio_idx))) > + continue; that could use a comment > - for (i = 0; i < wiphy->n_iface_combinations; i++) { > - const struct ieee80211_iface_combination *c; > + if (radio) { > + c = radio->iface_combinations; > + n = radio->n_iface_combinations; > + } else { > + c = wiphy->iface_combinations; > + n = wiphy->n_iface_combinations; > + } > + for (i = 0; i < n; i++, c++) { that c++ is a bit too hidden for my taste there, but YMMV and I guess if I wasn't reading the diff it'd be more obvious :) johannes