[rdkb][common][bsp][Refactor and sync wifi from openwrt]
[Description]
ac60b1ff [MAC80211][misc][Add Filogic 880/860/830/820/630 Release Information]
7eb946a0 [MAC80211][WiFi7][hostapd][sync hostapd patches]
91638fc9 [MAC80211][WiFi7][mac80211][sync backports code]
8e45746b [MAC80211][WiFi7][mt76][sync mt76 patches]
1c564afa [MAC80211][WiFi7][mt76][Add Eagle BE19000 ifem default bin]
[Release-log]
Change-Id: I1d4218d3b1211700acb5937fe310cbd0bf219968
diff --git a/recipes-wifi/wpa-supplicant/files/patches-2.10.3/0077-Revert-ACS-upstream-changes.patch b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/0077-Revert-ACS-upstream-changes.patch
new file mode 100644
index 0000000..16f32cf
--- /dev/null
+++ b/recipes-wifi/wpa-supplicant/files/patches-2.10.3/0077-Revert-ACS-upstream-changes.patch
@@ -0,0 +1,398 @@
+From 5a471a9025d9bf2a871339f5306e5c9050357703 Mon Sep 17 00:00:00 2001
+From: Michael-CY Lee <michael-cy.lee@mediatek.com>
+Date: Mon, 29 Jan 2024 10:26:53 +0800
+Subject: [PATCH 077/104] Revert ACS upstream changes
+
+- 348c047af ACS: More consistent checking of the best channel pointer
+- 98f3bd26d ACS: Extend the 320 MHz support
+- 733de8568 ACS: Fix not selecting the best channel in the segment
+- dc57ede01 tests: Full validation of ACS selecting HT40- channel
+- 4881accbb ACS: Add HT40- support in the 2.4 GHz band
+- 29f38ebcf ACS: Check whether iface->current_mode is NULL before use
+- 6f014c0d0 ACS: Add 320 MHz support for EHT
+
+Note that "e6f2494c3 hostapd: Add eht_bw320_offset configuration option"
+is not reverted due to conflict.
+---
+ src/ap/acs.c | 160 +++++++++----------------------------
+ tests/hwsim/test_ap_acs.py | 19 ++---
+ 2 files changed, 41 insertions(+), 138 deletions(-)
+
+diff --git a/src/ap/acs.c b/src/ap/acs.c
+index cb4db7147..cfa4a7d27 100644
+--- a/src/ap/acs.c
++++ b/src/ap/acs.c
+@@ -245,8 +245,6 @@ enum bw_type {
+ ACS_BW40,
+ ACS_BW80,
+ ACS_BW160,
+- ACS_BW320_1,
+- ACS_BW320_2,
+ };
+
+ struct bw_item {
+@@ -288,20 +286,10 @@ static const struct bw_item bw_160[] = {
+ { 6435, 6575, 111 }, { 6595, 6735, 143 },
+ { 6755, 6895, 175 }, { 6915, 7055, 207 }, { -1, -1, -1 }
+ };
+-static const struct bw_item bw_320_1[] = {
+- { 5955, 6255, 31 }, { 6275, 6575, 95 }, { 6595, 6895, 159 },
+- { -1, -1, -1 }
+-};
+-static const struct bw_item bw_320_2[] = {
+- { 6115, 6415, 63 }, { 6435, 6735, 127 }, { 6755, 7055, 191 },
+- { -1, -1, -1 }
+-};
+ static const struct bw_item *bw_desc[] = {
+ [ACS_BW40] = bw_40,
+ [ACS_BW80] = bw_80,
+ [ACS_BW160] = bw_160,
+- [ACS_BW320_1] = bw_320_1,
+- [ACS_BW320_2] = bw_320_2,
+ };
+
+
+@@ -773,42 +761,6 @@ static void acs_update_puncturing_bitmap(struct hostapd_iface *iface,
+ #endif /* CONFIG_IEEE80211BE */
+
+
+-static bool
+-acs_usable_bw320_chan(struct hostapd_iface *iface,
+- struct hostapd_channel_data *chan, int *bw320_offset)
+-{
+- const char *bw320_str[] = { "320 MHz", "320 MHz-1", "320 MHz-2" };
+- int conf_bw320_offset = hostapd_get_bw320_offset(iface->conf);
+-
+- *bw320_offset = 0;
+- switch (conf_bw320_offset) {
+- case 1:
+- if (acs_usable_bw_chan(chan, ACS_BW320_1))
+- *bw320_offset = 1;
+- break;
+- case 2:
+- if (acs_usable_bw_chan(chan, ACS_BW320_2))
+- *bw320_offset = 2;
+- break;
+- case 0:
+- default:
+- conf_bw320_offset = 0;
+- if (acs_usable_bw_chan(chan, ACS_BW320_1))
+- *bw320_offset = 1;
+- else if (acs_usable_bw_chan(chan, ACS_BW320_2))
+- *bw320_offset = 2;
+- break;
+- }
+-
+- if (!*bw320_offset)
+- wpa_printf(MSG_DEBUG,
+- "ACS: Channel %d: not allowed as primary channel for %s bandwidth",
+- chan->chan, bw320_str[conf_bw320_offset]);
+-
+- return *bw320_offset != 0;
+-}
+-
+-
+ static void
+ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ struct hostapd_hw_modes *mode,
+@@ -820,18 +772,14 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ struct hostapd_channel_data *chan, *adj_chan = NULL, *best;
+ long double factor;
+ int i, j;
+- int bw320_offset = 0, ideal_bw320_offset = 0;
+ unsigned int k;
+- int secondary_channel = 1, freq_offset;
+-
+- if (is_24ghz_mode(mode->mode))
+- secondary_channel = iface->conf->secondary_channel;
+
+ for (i = 0; i < mode->num_channels; i++) {
+- double total_weight = 0;
++ double total_weight;
+ struct acs_bias *bias, tmp_bias;
++ bool update_best = true;
+
+- chan = &mode->channels[i];
++ best = chan = &mode->channels[i];
+
+ /* Since in the current ACS implementation the first channel is
+ * always a primary channel, skip channels not available as
+@@ -863,7 +811,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ iface->conf->country[2] == 0x4f)
+ continue;
+
+- if (!chan_bw_allowed(chan, bw, secondary_channel != -1, 1)) {
++ if (!chan_bw_allowed(chan, bw, 1, 1)) {
+ wpa_printf(MSG_DEBUG,
+ "ACS: Channel %d: BW %u is not supported",
+ chan->chan, bw);
+@@ -884,8 +832,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ }
+
+ if (mode->mode == HOSTAPD_MODE_IEEE80211A &&
+- (iface->conf->ieee80211ac || iface->conf->ieee80211ax ||
+- iface->conf->ieee80211be)) {
++ (iface->conf->ieee80211ac || iface->conf->ieee80211ax)) {
+ if (hostapd_get_oper_chwidth(iface->conf) ==
+ CONF_OPER_CHWIDTH_80MHZ &&
+ !acs_usable_bw_chan(chan, ACS_BW80)) {
+@@ -905,25 +852,13 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ }
+ }
+
+- if (mode->mode == HOSTAPD_MODE_IEEE80211A &&
+- iface->conf->ieee80211be) {
+- if (hostapd_get_oper_chwidth(iface->conf) ==
+- CONF_OPER_CHWIDTH_320MHZ &&
+- !acs_usable_bw320_chan(iface, chan, &bw320_offset))
+- continue;
+- }
+-
+ factor = 0;
+- best = NULL;
+- if (acs_usable_chan(chan)) {
++ if (acs_usable_chan(chan))
+ factor = chan->interference_factor;
+- total_weight = 1;
+- best = chan;
+- }
++ total_weight = 1;
+
+ for (j = 1; j < n_chans; j++) {
+- adj_chan = acs_find_chan(iface, chan->freq +
+- j * secondary_channel * 20);
++ adj_chan = acs_find_chan(iface, chan->freq + (j * 20));
+ if (!adj_chan)
+ break;
+
+@@ -934,14 +869,16 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ break;
+ }
+
+- if (!acs_usable_chan(adj_chan))
+- continue;
+-
+- factor += adj_chan->interference_factor;
+- total_weight += 1;
++ if (acs_usable_chan(adj_chan)) {
++ factor += adj_chan->interference_factor;
++ total_weight += 1;
++ } else {
++ update_best = false;
++ }
+
+ /* find the best channel in this segment */
+- if (!best || adj_chan->interference_factor <
++ if (update_best &&
++ adj_chan->interference_factor <
+ best->interference_factor)
+ best = adj_chan;
+ }
+@@ -954,9 +891,8 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+
+ /* If the AP is in the 5 GHz or 6 GHz band, lets prefer a less
+ * crowded primary channel if one was found in the segment */
+- if (iface->current_mode &&
+- iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
+- best && chan != best) {
++ if (iface->current_mode->mode == HOSTAPD_MODE_IEEE80211A &&
++ chan != best) {
+ wpa_printf(MSG_DEBUG,
+ "ACS: promoting channel %d over %d (less interference %Lg/%Lg)",
+ best->chan, chan->chan,
+@@ -969,9 +905,8 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ * channel interference factor. */
+ if (is_24ghz_mode(mode->mode)) {
+ for (j = 0; j < n_chans; j++) {
+- freq_offset = j * 20 * secondary_channel;
+ adj_chan = acs_find_chan(iface, chan->freq +
+- freq_offset - 5);
++ (j * 20) - 5);
+ if (adj_chan && acs_usable_chan(adj_chan)) {
+ factor += ACS_ADJ_WEIGHT *
+ adj_chan->interference_factor;
+@@ -979,7 +914,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ }
+
+ adj_chan = acs_find_chan(iface, chan->freq +
+- freq_offset - 10);
++ (j * 20) - 10);
+ if (adj_chan && acs_usable_chan(adj_chan)) {
+ factor += ACS_NEXT_ADJ_WEIGHT *
+ adj_chan->interference_factor;
+@@ -987,7 +922,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ }
+
+ adj_chan = acs_find_chan(iface, chan->freq +
+- freq_offset + 5);
++ (j * 20) + 5);
+ if (adj_chan && acs_usable_chan(adj_chan)) {
+ factor += ACS_ADJ_WEIGHT *
+ adj_chan->interference_factor;
+@@ -995,7 +930,7 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ }
+
+ adj_chan = acs_find_chan(iface, chan->freq +
+- freq_offset + 10);
++ (j * 20) + 10);
+ if (adj_chan && acs_usable_chan(adj_chan)) {
+ factor += ACS_NEXT_ADJ_WEIGHT *
+ adj_chan->interference_factor;
+@@ -1004,9 +939,6 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ }
+ }
+
+- if (total_weight == 0)
+- continue;
+-
+ factor /= total_weight;
+
+ bias = NULL;
+@@ -1044,7 +976,6 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+
+ *ideal_factor = factor;
+ *ideal_chan = chan;
+- ideal_bw320_offset = bw320_offset;
+
+ #ifdef CONFIG_IEEE80211BE
+ if (iface->conf->ieee80211be)
+@@ -1055,13 +986,9 @@ acs_find_ideal_chan_mode(struct hostapd_iface *iface,
+ }
+
+ /* This channel would at least be usable */
+- if (!(*rand_chan)) {
++ if (!(*rand_chan))
+ *rand_chan = chan;
+- ideal_bw320_offset = bw320_offset;
+- }
+ }
+-
+- hostapd_set_and_check_bw320_offset(iface->conf, ideal_bw320_offset);
+ }
+
+
+@@ -1088,12 +1015,19 @@ acs_find_ideal_chan(struct hostapd_iface *iface)
+ goto bw_selected;
+ }
+
++ /* TODO: HT40- support */
++
++ if (iface->conf->ieee80211n &&
++ iface->conf->secondary_channel == -1) {
++ wpa_printf(MSG_ERROR, "ACS: HT40- is not supported yet. Please try HT40+");
++ return NULL;
++ }
++
+ if (iface->conf->ieee80211n &&
+ iface->conf->secondary_channel)
+ n_chans = 2;
+
+- if (iface->conf->ieee80211ac || iface->conf->ieee80211ax ||
+- iface->conf->ieee80211be) {
++ if (iface->conf->ieee80211ac || iface->conf->ieee80211ax) {
+ switch (hostapd_get_oper_chwidth(iface->conf)) {
+ case CONF_OPER_CHWIDTH_80MHZ:
+ n_chans = 4;
+@@ -1101,9 +1035,6 @@ acs_find_ideal_chan(struct hostapd_iface *iface)
+ case CONF_OPER_CHWIDTH_160MHZ:
+ n_chans = 8;
+ break;
+- case CONF_OPER_CHWIDTH_320MHZ:
+- n_chans = 16;
+- break;
+ default:
+ break;
+ }
+@@ -1153,8 +1084,7 @@ static void acs_adjust_secondary(struct hostapd_iface *iface)
+ acs_find_mode(iface, iface->freq) != HOSTAPD_MODE_IEEE80211A)
+ return;
+
+- wpa_printf(MSG_DEBUG,
+- "ACS: Adjusting HT/VHT/HE/EHT secondary frequency");
++ wpa_printf(MSG_DEBUG, "ACS: Adjusting HT/VHT/HE secondary frequency");
+
+ for (i = 0; bw_desc[ACS_BW40][i].first != -1; i++) {
+ if (iface->freq == bw_desc[ACS_BW40][i].first)
+@@ -1169,7 +1099,7 @@ static void acs_adjust_center_freq(struct hostapd_iface *iface)
+ {
+ int center;
+
+- wpa_printf(MSG_DEBUG, "ACS: Adjusting center frequency");
++ wpa_printf(MSG_DEBUG, "ACS: Adjusting VHT center frequency");
+
+ switch (hostapd_get_oper_chwidth(iface->conf)) {
+ case CONF_OPER_CHWIDTH_USE_HT:
+@@ -1187,29 +1117,12 @@ static void acs_adjust_center_freq(struct hostapd_iface *iface)
+ break;
+ case CONF_OPER_CHWIDTH_160MHZ:
+ center = acs_get_bw_center_chan(iface->freq, ACS_BW160);
+- break;
+- case CONF_OPER_CHWIDTH_320MHZ:
+- switch (hostapd_get_bw320_offset(iface->conf)) {
+- case 1:
+- center = acs_get_bw_center_chan(iface->freq,
+- ACS_BW320_1);
+- break;
+- case 2:
+- center = acs_get_bw_center_chan(iface->freq,
+- ACS_BW320_2);
+- break;
+- default:
+- wpa_printf(MSG_INFO,
+- "ACS: BW320 offset is not selected");
+- return;
+- }
+-
+ break;
+ default:
+ /* TODO: How can this be calculated? Adjust
+ * acs_find_ideal_chan() */
+ wpa_printf(MSG_INFO,
+- "ACS: Only VHT20/40/80/160/320 is supported now");
++ "ACS: Only VHT20/40/80/160 is supported now");
+ return;
+ }
+
+@@ -1272,8 +1185,7 @@ static void acs_study(struct hostapd_iface *iface)
+ iface->conf->punct_bitmap = ideal_chan->punct_bitmap;
+ #endif /* CONFIG_IEEE80211BE */
+
+- if (iface->conf->ieee80211ac || iface->conf->ieee80211ax ||
+- iface->conf->ieee80211be) {
++ if (iface->conf->ieee80211ac || iface->conf->ieee80211ax) {
+ acs_adjust_secondary(iface);
+ acs_adjust_center_freq(iface);
+ }
+diff --git a/tests/hwsim/test_ap_acs.py b/tests/hwsim/test_ap_acs.py
+index 001a5d4fd..e1359b6eb 100644
+--- a/tests/hwsim/test_ap_acs.py
++++ b/tests/hwsim/test_ap_acs.py
+@@ -205,20 +205,11 @@ def test_ap_acs_40mhz_minus(dev, apdev):
+ params['acs_num_scans'] = '1'
+ params['chanlist'] = '1 11'
+ hapd = hostapd.add_ap(apdev[0], params, wait_enabled=False)
+- wait_acs(hapd)
+-
+- freq = hapd.get_status_field("freq")
+- if int(freq) < 2400:
+- raise Exception("Unexpected frequency")
+- sec = hapd.get_status_field("secondary_channel")
+- if int(sec) != -1:
+- raise Exception("Unexpected secondary_channel: " + sec)
+-
+- dev[0].connect("test-acs", psk="12345678", scan_freq=freq)
+- sig = dev[0].request("SIGNAL_POLL").splitlines()
+- logger.info("SIGNAL_POLL: " + str(sig))
+- if "WIDTH=40 MHz" not in sig:
+- raise Exception("Station did not report 40 MHz bandwidth")
++ ev = hapd.wait_event(["AP-ENABLED", "AP-DISABLED"], timeout=10)
++ if not ev:
++ raise Exception("ACS start timed out")
++ # HT40- is not currently supported in hostapd ACS, so do not try to connect
++ # or verify that this operation succeeded.
+
+ def test_ap_acs_5ghz(dev, apdev):
+ """Automatic channel selection on 5 GHz"""
+--
+2.39.2
+