mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-02 03:56:49 +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>
89 lines
2.7 KiB
Diff
89 lines
2.7 KiB
Diff
From: Felix Fietkau <nbd@nbd.name>
|
|
Date: Thu, 6 Jun 2024 12:19:08 +0200
|
|
Subject: [PATCH] wifi: mac80211: add support for DFS with multiple
|
|
radios
|
|
|
|
DFS can be supported with multi-channel combinations, as long as each DFS
|
|
capable radio only supports one channel.
|
|
|
|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
|
|
---
|
|
|
|
--- a/net/mac80211/main.c
|
|
+++ b/net/mac80211/main.c
|
|
@@ -1084,6 +1084,27 @@ static int ieee80211_init_cipher_suites(
|
|
return 0;
|
|
}
|
|
|
|
+static bool
|
|
+ieee80211_ifcomb_check(const struct ieee80211_iface_combination *c, int n_comb)
|
|
+{
|
|
+ int i, j;
|
|
+
|
|
+ for (i = 0; i < n_comb; i++, c++) {
|
|
+ /* DFS is not supported with multi-channel combinations yet */
|
|
+ if (c->radar_detect_widths &&
|
|
+ c->num_different_channels > 1)
|
|
+ return false;
|
|
+
|
|
+ /* mac80211 doesn't support more than one IBSS interface */
|
|
+ for (j = 0; j < c->n_limits; j++)
|
|
+ if ((c->limits[j].types & BIT(NL80211_IFTYPE_ADHOC)) &&
|
|
+ c->limits[j].max > 1)
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ return true;
|
|
+}
|
|
+
|
|
int ieee80211_register_hw(struct ieee80211_hw *hw)
|
|
{
|
|
struct ieee80211_local *local = hw_to_local(hw);
|
|
@@ -1173,17 +1194,20 @@ int ieee80211_register_hw(struct ieee802
|
|
if (comb->num_different_channels > 1)
|
|
return -EINVAL;
|
|
}
|
|
- } else {
|
|
- /* DFS is not supported with multi-channel combinations yet */
|
|
- for (i = 0; i < local->hw.wiphy->n_iface_combinations; i++) {
|
|
- const struct ieee80211_iface_combination *comb;
|
|
+ }
|
|
|
|
- comb = &local->hw.wiphy->iface_combinations[i];
|
|
+ if (hw->wiphy->n_radio) {
|
|
+ for (i = 0; i < hw->wiphy->n_radio; i++) {
|
|
+ const struct wiphy_radio *radio = &hw->wiphy->radio[i];
|
|
|
|
- if (comb->radar_detect_widths &&
|
|
- comb->num_different_channels > 1)
|
|
+ if (!ieee80211_ifcomb_check(radio->iface_combinations,
|
|
+ radio->n_iface_combinations))
|
|
return -EINVAL;
|
|
}
|
|
+ } else {
|
|
+ if (!ieee80211_ifcomb_check(hw->wiphy->iface_combinations,
|
|
+ hw->wiphy->n_iface_combinations))
|
|
+ return -EINVAL;
|
|
}
|
|
|
|
/* Only HW csum features are currently compatible with mac80211 */
|
|
@@ -1313,18 +1337,6 @@ int ieee80211_register_hw(struct ieee802
|
|
hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_MONITOR);
|
|
hw->wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR);
|
|
|
|
- /* mac80211 doesn't support more than one IBSS interface right now */
|
|
- for (i = 0; i < hw->wiphy->n_iface_combinations; i++) {
|
|
- const struct ieee80211_iface_combination *c;
|
|
- int j;
|
|
-
|
|
- c = &hw->wiphy->iface_combinations[i];
|
|
-
|
|
- for (j = 0; j < c->n_limits; j++)
|
|
- if ((c->limits[j].types & BIT(NL80211_IFTYPE_ADHOC)) &&
|
|
- c->limits[j].max > 1)
|
|
- return -EINVAL;
|
|
- }
|
|
|
|
local->int_scan_req = kzalloc(sizeof(*local->int_scan_req) +
|
|
sizeof(void *) * channels, GFP_KERNEL);
|