mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-07 06:18:54 +00:00
1bfcc1ea8a
Brings lots of driver updates and API changes needed for mt76 updates. Disable iwlwifi and ath11k on 5.15, since backport is too difficult, and the only remaining targets won't need those drivers. Signed-off-by: Felix Fietkau <nbd@nbd.name>
146 lines
4.3 KiB
Diff
146 lines
4.3 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Tue, 4 Jun 2024 14:31:09 +0200
|
|
Subject: [PATCH] wifi: nl80211: split helper function from
|
|
nl80211_put_iface_combinations
|
|
|
|
Create a helper function that puts the data from struct
|
|
ieee80211_iface_combination to a nl80211 message.
|
|
This will be used for adding per-radio interface combination data.
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/net/wireless/nl80211.c
|
|
+++ b/net/wireless/nl80211.c
|
|
@@ -1620,71 +1620,78 @@ nla_put_failure:
|
|
return -ENOBUFS;
|
|
}
|
|
|
|
-static int nl80211_put_iface_combinations(struct wiphy *wiphy,
|
|
- struct sk_buff *msg,
|
|
- bool large)
|
|
+static int nl80211_put_ifcomb_data(struct sk_buff *msg, bool large, int idx,
|
|
+ const struct ieee80211_iface_combination *c)
|
|
{
|
|
- struct nlattr *nl_combis;
|
|
- int i, j;
|
|
+ struct nlattr *nl_combi, *nl_limits;
|
|
+ int i;
|
|
|
|
- nl_combis = nla_nest_start_noflag(msg,
|
|
- NL80211_ATTR_INTERFACE_COMBINATIONS);
|
|
- if (!nl_combis)
|
|
+ nl_combi = nla_nest_start_noflag(msg, idx);
|
|
+ if (!nl_combi)
|
|
goto nla_put_failure;
|
|
|
|
- for (i = 0; i < wiphy->n_iface_combinations; i++) {
|
|
- const struct ieee80211_iface_combination *c;
|
|
- struct nlattr *nl_combi, *nl_limits;
|
|
+ nl_limits = nla_nest_start_noflag(msg, NL80211_IFACE_COMB_LIMITS);
|
|
+ if (!nl_limits)
|
|
+ goto nla_put_failure;
|
|
|
|
- c = &wiphy->iface_combinations[i];
|
|
+ for (i = 0; i < c->n_limits; i++) {
|
|
+ struct nlattr *nl_limit;
|
|
|
|
- nl_combi = nla_nest_start_noflag(msg, i + 1);
|
|
- if (!nl_combi)
|
|
+ nl_limit = nla_nest_start_noflag(msg, i + 1);
|
|
+ if (!nl_limit)
|
|
goto nla_put_failure;
|
|
-
|
|
- nl_limits = nla_nest_start_noflag(msg,
|
|
- NL80211_IFACE_COMB_LIMITS);
|
|
- if (!nl_limits)
|
|
+ if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX, c->limits[i].max))
|
|
goto nla_put_failure;
|
|
+ if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
|
|
+ c->limits[i].types))
|
|
+ goto nla_put_failure;
|
|
+ nla_nest_end(msg, nl_limit);
|
|
+ }
|
|
|
|
- for (j = 0; j < c->n_limits; j++) {
|
|
- struct nlattr *nl_limit;
|
|
+ nla_nest_end(msg, nl_limits);
|
|
|
|
- nl_limit = nla_nest_start_noflag(msg, j + 1);
|
|
- if (!nl_limit)
|
|
- goto nla_put_failure;
|
|
- if (nla_put_u32(msg, NL80211_IFACE_LIMIT_MAX,
|
|
- c->limits[j].max))
|
|
- goto nla_put_failure;
|
|
- if (nl80211_put_iftypes(msg, NL80211_IFACE_LIMIT_TYPES,
|
|
- c->limits[j].types))
|
|
- goto nla_put_failure;
|
|
- nla_nest_end(msg, nl_limit);
|
|
- }
|
|
+ if (c->beacon_int_infra_match &&
|
|
+ nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
|
|
+ goto nla_put_failure;
|
|
+ if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
|
|
+ c->num_different_channels) ||
|
|
+ nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
|
|
+ c->max_interfaces))
|
|
+ goto nla_put_failure;
|
|
+ if (large &&
|
|
+ (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
|
|
+ c->radar_detect_widths) ||
|
|
+ nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
|
|
+ c->radar_detect_regions)))
|
|
+ goto nla_put_failure;
|
|
+ if (c->beacon_int_min_gcd &&
|
|
+ nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
|
|
+ c->beacon_int_min_gcd))
|
|
+ goto nla_put_failure;
|
|
|
|
- nla_nest_end(msg, nl_limits);
|
|
+ nla_nest_end(msg, nl_combi);
|
|
|
|
- if (c->beacon_int_infra_match &&
|
|
- nla_put_flag(msg, NL80211_IFACE_COMB_STA_AP_BI_MATCH))
|
|
- goto nla_put_failure;
|
|
- if (nla_put_u32(msg, NL80211_IFACE_COMB_NUM_CHANNELS,
|
|
- c->num_different_channels) ||
|
|
- nla_put_u32(msg, NL80211_IFACE_COMB_MAXNUM,
|
|
- c->max_interfaces))
|
|
- goto nla_put_failure;
|
|
- if (large &&
|
|
- (nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_WIDTHS,
|
|
- c->radar_detect_widths) ||
|
|
- nla_put_u32(msg, NL80211_IFACE_COMB_RADAR_DETECT_REGIONS,
|
|
- c->radar_detect_regions)))
|
|
- goto nla_put_failure;
|
|
- if (c->beacon_int_min_gcd &&
|
|
- nla_put_u32(msg, NL80211_IFACE_COMB_BI_MIN_GCD,
|
|
- c->beacon_int_min_gcd))
|
|
- goto nla_put_failure;
|
|
+ return 0;
|
|
+nla_put_failure:
|
|
+ return -ENOBUFS;
|
|
+}
|
|
|
|
- nla_nest_end(msg, nl_combi);
|
|
- }
|
|
+static int nl80211_put_iface_combinations(struct wiphy *wiphy,
|
|
+ struct sk_buff *msg,
|
|
+ bool large)
|
|
+{
|
|
+ struct nlattr *nl_combis;
|
|
+ int i;
|
|
+
|
|
+ nl_combis = nla_nest_start_noflag(msg,
|
|
+ NL80211_ATTR_INTERFACE_COMBINATIONS);
|
|
+ if (!nl_combis)
|
|
+ goto nla_put_failure;
|
|
+
|
|
+ for (i = 0; i < wiphy->n_iface_combinations; i++)
|
|
+ if (nl80211_put_ifcomb_data(msg, large, i + 1,
|
|
+ &wiphy->iface_combinations[i]))
|
|
+ goto nla_put_failure;
|
|
|
|
nla_nest_end(msg, nl_combis);
|
|
|