When several stations match addr2 of a data frame, a failed link lookup
for one station kept every station after it from getting the frame.
Also, the link_id of an MLO station leaked to the stations after it,
which dropped the frame for a non-MLO station.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
399 looks up the AP station by the AP MLD address, 400 matches a channel
switch action against the link that received it, and 401 reports the
BSSID of each link in debugfs. The vbed image of 2026-10-02 builds and
runs with them.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
The station removal event of an MLO station carried the counters of
the default link alone. It now carries the sum over the station's links
and its removed links, as the station dump does.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
mac80211 books all TX of an MLO station on the association link, so a
per-link station dump showed every TX byte, packet and the TX rate on
that link and none on the others.
- 417 exports the conversion of a TX rate to a rate info, with the
documentation of its arguments.
- 418 makes mac80211 ask the driver for the counters of a link before
it removes the link from the driver, and add them to the station's
totals of removed links.
- 419 lets hwsim count TX per link and report it through
link_sta_statistics. It counts the length of a frame before
encryption and one packet per MSDU, only where the frame resolves to
a station link. It starts the record of a link again when the link
station changes, and clears the records of removed links.
Measured on the virtual bed: each link reports its own TX counts and
rate, and the station totals are the sum of the links.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
sta_set_link_sinfo() took the band of a legacy TX rate from
ieee80211_get_sband(), which warns on an MLD interface and does not
return the band of the link. 416 converts the rate with the band of the
channel context of the link.
The last TX rate of an MLO station comes from the TX status of a frame
on any link, so a legacy index can lie beyond the bitrate table of the
band it is converted with. The conversion checks the index against
that table.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
415 fixes 727afb05ef63 of the backport above: a station dump stopped
carrying NL80211_ATTR_MLD_ADDR and NL80211_ATTR_MLO_LINK_ID, so a reader
of the dump no longer saw that a station is an MLD or which link it
associated on. NL80211_CMD_GET_STATION for one station
still carried both. Mainline has the same gap.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
001 to 005 are mainline 5c660b243435, 4b40378ac203, 727afb05ef63,
dd21d1844aa0 and f9202a374ec3. NL80211_ATTR_STA_DUMP_LINK_STATS then
asks a station dump for one message per link of an MLD station after
the aggregated one, so userspace can read the counters and rates of
each affiliated station. Without the flag the dump is as before.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
414 fixes cfg80211_sta_set_mld_sinfo(). It took the TX and RX rate of an
MLO station from the link with the least inactive time, but compared
against a value it had just set to that link's own, so only the first
link could decide. mac80211 records the last TX rate on the association
link, so a station associated on any other link reported no TX bit rate
at all. The TX and RX durations had the same condition and counted the
first link only.
Measured on a mac80211_hwsim bed: an MLO backhaul station associated on
link 1 now reports its TX rate, and the backhaul rates derived from it
read 270 and 3120 Mbit/s instead of 65535.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Add the max_interfaces module parameter. A radio combines up to 2048
interfaces, and userspace that derives the number of BSSes of a radio
from the interface combinations reports that value. The default stays
2048.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
ieee80211_stop_ap() stops one link, but ieee80211_stop_mbssid() walks
every active link of the interface. The STOP_AP of one link of an AP
MLD thus took apart the MBSSID set of each other link and stopped the
interfaces of those sets, on radios that keep running.
Add a patch that takes apart only the MBSSID set of the link that
stops. The stop of the whole interface still walks all its links.
With it, hostapd can remove an affiliated AP of an AP MLD whose other
links carry an MBSSID set. A link that is itself in an MBSSID set still
takes that set apart, and cfg80211_stop_iface() stops each member
interface with all its links.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A link STOP_AP cleared state that belongs to the interface, while the
other links of the AP MLD kept beaconing: cfg80211 the SSID, the owner
and the QoS map, mac80211 the SSID, the S1G and beacon rate flags and
the carrier of every AP_VLAN. The kept links then ran without a DSCP
map, reported no SSID, and their 4-address stations lost their bridge
port carrier.
Add two patches that clear this state only with the last link that
beacons.
With the SSID kept, cfg80211 refuses a START_AP that changes the SSID
of one link while another link beacons with the old one ("require
identical SSID for MLO"). hostapd.uc stops every link of an AP MLD
before an SSID change (the previous commit).
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A non-AP MLD dropped the broadcast deauth an AP sends from a link whose
address differs from the AP MLD address, and kept a dead association.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Add a pending patch. hwsim rewrites the addresses of a frame to an MLO
station to link addresses and then reported the TX status with them,
so mac80211 found no station for that status and recorded no ACK,
retry, lost frame or TX rate for it. hwsim now puts the MLD addresses
back before it reports the TX status.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Add two pending patches. A 4-address AP_VLAN of an AP MLD sends to a
station that is not an MLD with the address of the station's link as
TA, not the AP MLD address. A 4-address MLO station sends with the AP
MLD address as RA, not the BSSID of the default link, which an MLO
connection does not set.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
ieee80211_8023_xmit() leaves info->band at 0 on an interface that is not
an MLD, so ieee80211_get_tx_rates() uses the wrong band for these
frames. The fix is in the wireless tree.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
With HAS_RATE_CONTROL, mac80211 leaves the rate entries of every frame
cleared, so hwsim reported no rate for it, an MLD station reported no
TX bit rate, and a medium in userspace sent the frame at the lowest
rate.
Send such a frame at one rate, with one attempt and the rate list ended
after that entry. For a data frame to a peer, take the highest VHT or
HT MCS that the peer receives on the channel width in use, as a rate
controller settles on for an ideal channel; otherwise take the highest
legacy rate of the band. Stop at four streams, as minstrel_ht does
(MINSTREL_MAX_STREAMS): hwsim declares MCS 0-9 for all eight streams,
and ieee80211_get_rate_duration() warns for more than four streams on
a VHT rate.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A station in 4-address mode sends one 4-address null data frame, and the
access point sets up the 4-address station only when it receives it. If
the driver reports ACK status, send the frame again every second until
the access point acknowledges it, for at most ten transmissions.
Based on 0089-mtk-mac80211-retransmit-4addr-nullfunc-if-the-ACK-is.patch
by Peter Chiu <chui-hao.chiu@mediatek.com> in the MediaTek feed.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
An MLO radio of hwsim declares CONNECTION_MONITOR but reports neither a
beacon loss nor a connection loss, so a station whose AP went away
without a deauthentication that it accepts stayed associated. Leave the
flag out, so that mac80211 monitors the active links of the station.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
An MLO radio of hwsim declares extended, EML and MLD capabilities for
the AP interface type only, so a station interface reports no
simultaneous links. Declare the station interface type as well. The
Association Request of an MLO station of hwsim then announces the
maximum number of simultaneous links of the AP entry instead of 0.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
When ieee80211_check_combinations() refuses a channel,
_ieee80211_link_use_channel() tries to evacuate a NAN channel and then
returns the result of that attempt. Without a NAN interface the attempt
returns -ENOENT, so a refused interface combination reaches userspace as
"No such file or directory" instead of the error of the check.
Keep the error of the combination check when the evacuation does not
help.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
A radio that uses channel contexts gets no radar detection widths in its
global interface combination, because DFS requires a combination with a
single channel. A multi-radio radio always uses channel contexts, and
its global combination multiplies the channel count by the number of
radios. So it loses the radar detection widths as well, while each
per-radio combination keeps them.
mac80211 checks the channel of a radar detection against the global
combination (ieee80211_check_combinations() with radio_idx -1 from
_ieee80211_link_use_channel()). No combination matches, and every CAC on
a multi-radio hwsim radio fails. hostapd reports it as "start_dfs_cac()
failed" and disables the interface.
cfg80211 exempts the global combination of a multi-radio wiphy from the
single channel rule for DFS (wiphy_verify_iface_combinations()), since
it only sums up the radios. Keep the radar detection widths there when
each radio has one channel. With more than one channel per radio, clear
them in the per-radio combination too, which cfg80211 would refuse
otherwise.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
The station hash holds the MLD address of an MLO station. When a driver
neither passes the station nor translates the addresses, a data frame
of an MLO station carries a link address in addr2, and
__ieee80211_rx_handle_packet() does not find the sender. The frame goes
through the per-interface loop, which skips AP_VLAN interfaces. A
4-address MLO station associates and gets its AP_VLAN, but no data
frame of it arrives.
403 looks up the sender in the link station hash when the station hash
has no match, and hands the frame to the interface of that station, as
upstream does since the RX rework.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
mac80211_hwsim accepts CCMP and GCMP keys in mac80211_hwsim_set_key()
and encrypts unicast data frames itself in mac80211_hwsim_tx(), through
ieee80211_encrypt_tx_skb(). It asks mac80211 to reserve tailroom for the
MIC, but not headroom for the CCMP or GCMP header.
For a hardware key without IEEE80211_KEY_FLAG_GENERATE_IV or
IEEE80211_KEY_FLAG_PUT_IV_SPACE, ieee80211_xmit_fast() resizes the frame
with ENCRYPT_NO and reserves only the 802.11 header and
hw.extra_tx_headroom. A locally generated frame usually has room to
spare, but a frame forwarded from a bridge can arrive with none. The
room check in ccmp_encrypt_skb() then warns, ieee80211_encrypt_tx_skb()
returns an error and the frame is freed. An access point that bridges
traffic to its clients sends no downlink unicast data at all.
Reserve the header as driver headroom. IEEE80211_CCMP_HDR_LEN,
IEEE80211_CCMP_256_HDR_LEN and IEEE80211_GCMP_HDR_LEN are all 8 bytes.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
ieee80211_mgmt_tx() walks the links of an AP MLD to decide whether a
frame needs an off-channel transmission. It pins the link that holds the
requested channel only when the destination is a station that already
associated as an MLD. A frame to an address the access point does not
know keeps link_id at -1, the link reaches the driver unspecified, and
the driver picks the default link, which holds a different channel and a
different address.
A DPP Authentication Request shows this: the enrollee announces itself
on channel 6, the access point answers under the address of its 5 GHz
link, and the enrollee never sees the frame.
Pin the link whenever an active link holds the requested channel.
ieee80211_tx_skb_tid() warns on a link id for an interface that is not
an MLD and on one that names an inactive link, and active_links is zero
for an interface that is not an MLD, so that one test covers both. A
station MLD that sends from its MLD address to an address other than its
AP gets the same pin.
A link whose own address is the MLD address also matched the frame on
that address and ended the search, so a lower link that uses the MLD
address hid the link with the requested channel. Skip such a link when
the frame names another channel.
Frames to a station keep their present behaviour: the branch runs only
where the caller named a channel, and where the destination is a station
that associated as an MLD the same branch already pinned the link.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Add support for getting the caldata via NVMEM cells.
It will first try to use the ath10k style calibration NVMEM cells, and then
failover to the existing file based loading.
It should allow dropping most of the userspace caldata loading.
Link: https://github.com/openwrt/openwrt/pull/25566
Signed-off-by: Robert Marko <robimarko@gmail.com>
Backport upstream commit 78183e833195 ("wifi: mac80211: reset the LED
state when ifup fails"). When the first interface fails to come up, the
throughput LED timer keeps running, and unloading the driver afterwards
frees it while it is still armed.
Assisted-by: Claude:claude-opus-5-5
Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de>
Link: https://github.com/openwrt/openwrt/pull/25539
Signed-off-by: Robert Marko <robimarko@gmail.com>
Several rtw88 USB and SDIO chips do not always report the TX status of a
frame within RTW_TX_PROBE_TIMEOUT (500 ms). The driver then drops the
tracking skbs and warns
rtw_8822bu 3-1:1.0: failed to get tx report from firmware
every one to three seconds on an access point serving clients that use
power save. mac80211 never learns the ACK status of those frames, which
hostapd uses to tell whether a polled station is still there.
Add the pending upstream patch that uses the 2500 ms timeout, so far
applied only to RTL8723DU, for every USB and SDIO device and keeps
500 ms for PCIe. It is adapted to backports 7.2, which does not have
the RTL8723BS condition yet.
Pending upstream, submitted to rtw-next:
https://lore.kernel.org/linux-wireless/20260924004637.9958-1-pkshih@realtek.com/
Tested with backports 6.12.96 on a TP-Link Archer T4U v3 (RTL8812BU,
handled by rtw_8822bu) as a 2.4 GHz AP with six associated clients.
Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/25303
Signed-off-by: Jonas Jelonek <jonas@jonasjelonek.de>
Dropping the rt2x00 MTD EEPROM patch changes the modules the package
builds, so bump the release for users to receive the update.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Eight of the rt2x00 patches either carry no From/Date/Subject header at
all or lack the leading "From <sha> Mon Sep 17 00:00:00 2001" line, so
"git am" cannot apply them and the contribution checks reject them. Take
the author, date and subject of each from the commit which first added
it to this tree.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
No device tree uses ralink,mtd-eeprom any more, and since the move from
rt2x00eeprom.c into rt2800lib.c the code is guarded by SOC_RT288X and
SOC_RT305X, so it was compiled out on the only two boards that still
asked for it and dead everywhere else. It also lost its
<linux/mtd/mtd.h> include in that move, which breaks the rt305x build
with implicit declarations of get_mtd_device_nm(), mtd_read() and
put_mtd_device(). Drop the patch; nvmem cells cover every remaining
user.
Fixes: bf44cb5fb0 ("mac80211: update to version 7.2")
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Patch 200 reverted the ath12k conversion from tasklets to BH workqueues.
It arrived with 88f4c32060 ("mac80211: update to version 6.14.11") in May
2025, when main still built kernel 6.6 on 26 targets; BH workqueues only
exist from 6.9, so the revert was doing real work then.
Main now builds 6.12 and 6.18. Both provide system_bh_wq and from_work(),
so there is nothing left for the revert to paper over.
It also leaves the driver inconsistent. backports 7.2 uses intr_wq in
ce.h, pci.c and ahb.c alike, and patch 200 converts only the first two
back to tasklets -- ahb.c was added to the driver after the conversion
landed and never got the same treatment. Building with ATH12K_AHB enabled
therefore fails.
Against pristine backports 7.2 the mac80211 patch series applies 151/151
with this patch removed, and no intr_tq reference survives in ath12k. An
ipq53xx build with ATH12K_AHB enabled links ahb.o cleanly, and the driver
probes an on-chip radio on real hardware.
Bump PKG_RELEASE so existing installs pick up the rebuilt module: it feeds
ABI_VERSION for the kmod packages.
Signed-off-by: Hideo Sumi <hideo.sumi@mugops.com>
Link: https://github.com/openwrt/openwrt/pull/24978
Signed-off-by: Robert Marko <robimarko@gmail.com>
On IPQ8074 a firmware assert reboots the SoC.
ath11k_core_reconfigure_on_crash() frees the data path and clears the
ring list while the DP NAPI is still polling, so the NAPI services a ring
whose address pointer has just been cleared:
Unable to handle kernel read from unreadable memory at virtual address 0
pc : ath11k_hal_srng_access_begin+0xc/0x60 [ath11k]
Call trace:
ath11k_hal_srng_access_begin+0xc/0x60 [ath11k] (P)
ath11k_dp_rx_process_mon_rings+0xa0/0x5d4 [ath11k]
ath11k_dp_service_srng+0x1f4/0x348 [ath11k]
ath11k_ahb_ext_grp_napi_poll+0x34/0xd4 [ath11k_ahb]
951 disables the interrupts on the crash path again. 950 is its
prerequisite: it wires up the CE interrupt ops that
ath11k_ahb_hif_ops_ipq8074 never set, which leaves the CE half of the
quiesce a no-op on AHB. Both are in ath-next as commit a7ab5c835e42
("wifi: ath11k: implement CE interrupt enable/disable for AHB") and
commit f7a74e131d3f ("wifi: ath11k: disable interrupts during firmware
crash recovery"), and are carried here verbatim.
Tested on a Xiaomi AX3600 (IPQ8074 hw2.0) with the debugfs
simulate_fw_crash assert trigger: one assert panics and reboots the SoC
before, five asserts recover after.
Assisted-by: Claude:claude-opus-5
Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de>
Link: https://github.com/openwrt/openwrt/pull/24578
Signed-off-by: Robert Marko <robimarko@gmail.com>
The recent update to mac80211 version 7.2 introduced a new module,
ath12k_wifi7.ko, which contains the hardware-specific code (including
the HAL for QCN9274, WCN7850, and QCC2072).
Because this module was not added to the kmod-ath12k package definition,
ath12k failed to probe or initialize PCIe radios since the required
hardware driver was missing.
Add the missing ath12k_wifi7.ko module to the package FILES and ensure
it is loaded alongside ath12k.ko.
Fixes: bf44cb5fb0 ("mac80211: update to version 7.2")
Signed-off-by: Til Kaiser <mail@tk154.de>
Link: https://github.com/openwrt/openwrt/pull/24966
Signed-off-by: Robert Marko <robimarko@gmail.com>
Refresh all patches. Drop the ones that are upstream now.
Adapt the ath9k channel bandwidth debugfs patch to the removal of
WIPHY_FLAG_SUPPORTS_5_10_MHZ, and the ath11k QCN6122 hw params to
.max_tx_ring moving into struct ath11k_hw_hal_params as .num_tx_rings.
Add build fixes for mwlwifi and mt76: the action code moved out of the
per-type action frame structs into the common part of struct
ieee80211_mgmt and the union lost its 'u' name,
ieee80211_get_fils_discovery_tmpl() and
ieee80211_get_unsol_bcast_probe_resp_tmpl() take a link id, and the EML
capability defines were renamed.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Replace deprecated one-element arrays with flexible array members.
CONFIG_FORTIFY_SOURCE reports the following warning when
one-element arrays are used as variable-length buffers:
sta_cmd.c:1033 mwifiex_sta_prepare_cmd
memcpy: detected field-spanning write (size 84) of single field
"domain->triplet" at .../marvell/mwifiex/sta_cmd.c:1033 (size 3)
Convert affected structs to use flexible array members.
- Preserve existing wire layouts.
- Use DECLARE_FLEX_ARRAY() for structs inside affected unions.
This fix has been accepted upstream:
https://github.com/torvalds/linux/commit/1cb5845a58d8e1f85d5766c6fbcbfddf96c212a1
Tested-on: WRT3200ACM
Signed-off-by: Georgi Valkov <gvalkov@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/24451
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Fix regression in rgpower table loading, caused by using
request_firmware(): when the requested firmware does not exist, e.g.
nxp/rgpower_WW.bin does not exist on OpenWrt builds for WRT3200ACM,
request_firmware() falls back to firmware_fallback_sysfs(), which expects
the firmware to be provided by user space using SYSFS. No such utility is
provided in this configuration, so the entire system locks up for 60
seconds, until the request times out. During this time, no other log
messages are observed, and the device does not respond to commands over
UART.
The request_firmware() call is performed in the following context:
current->comm kworker/1:2 in_task 1 irqs_disabled 0 in_atomic 0
Fixed by using request_firmware_direct(). This prevents fallback to SYSFS,
and avoids delay. The rgpower table is optional. The driver falls back
to the device tree power table if the firmware is not present.
The error code is printed for debugging and returned to the caller,
which only cares for success or failure, so there are no side effects.
Link: #24205Fixes: #24434
Fixes: https://forum.openwrt.org/t/25-12-0-slow-boot-on-linksys-wrt3200acm/247751
Fixes: https://github.com/torvalds/linux/commit/7b6f16a258065f85793fb2597a290041c1e3d201
Signed-off-by: Georgi Valkov <gvalkov@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/24205
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
The patch reverted ath10k/ath11k to iommu_domain_alloc(), which kernel
6.18 removed; iommu_paging_domain_alloc() exists on every kernel this
tree builds. Unnoticed upstream because no 6.18 target builds
ath11k-ahb.
Signed-off-by: Julius Bairaktaris <julius@bairaktaris.de>
Link: https://github.com/openwrt/openwrt/pull/24031
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Currently, trying to start a 5GHz radio on 8devices Kiwi will fail as
despite the phy listing the 5GHz channels in iw phy dump, no radio actually
claims the 5GHz range.
This is because driver assumes that if radio supports 6GHz then it cannot
be used for 5Ghz, this is however not correct for wideband radios.
So, similar to the 103-wifi-ath12k-fix-5GHz-operation-on-wideband-QCN.patch
patch ath12k_regd_update() so that 5Ghz range is listed as well.
Signed-off-by: Robert Marko <robert.marko@sartura.hr>
Link: https://github.com/openwrt/openwrt/pull/24106
Signed-off-by: Robert Marko <robimarko@gmail.com>
ath10k and ath11k support reading calibration variants from the device
tree to locate the correct Board Description File (BDF). The ath12k-wsi
binding already describes using qcom,calibration-variant but it is not
implemented in the driver.
Many ath12k designs expose all the radios under a single phy, each of
which typically require a separate BDF. Without this, the radios may not
come up or will not be calibrated correctly.
Fix this by parsing the device tree for the generation-agnostic
qcom,calibration-variant. This allows the driver to properly select,
read and apply the correct BDF.
Additionally, the ath12k-wsi binding documentation describes using the
generation-specific qcom,ath12k-calibration-variant binding as well as
the generation-agnostic qcom,calibration-variant binding to load
board-specific calibration data from the device tree. However, the
driver never implemented either of these.
Given that no devices currently supported use
qcom,ath12k-calibration-variant and the previous patch implements
qcom,calibration-variant, drop the generation-specific version from the
binding to prevent future confusion.
Tested on Askey SBE1V1K.
Signed-off-by: Andrew LaMarche <andrewjlamarche@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/21767
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Add a new sta_set_airtime_weight driver op so drivers can program the
airtime fairness weight into hardware.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Backport two upstream commits that replace memset() on coherent DMA
descriptor rings with explicit WRITE_ONCE() status word stores.
On 32-bit PowerPC platforms like apm821xx, coherent DMA memory may be
mapped uncached. The optimized memset() path can use dcbz there, which
triggers alignment warnings and spams the kernel log.
Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23776
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
Add a function to allow drivers to query the pending AQL airtime
for a given txq, for both unicast and broadcast.
This will be used for mt76 to limit buffering in AP mode for power-save
stations.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This contains many fixes from upstream Linux.
The code block from this patch was moved a bit in the function:
subsys/110-mac80211_keep_keys_on_stop_ap.patch
This patch was applied upstream:
subsys/330-mac80211-fix-crash-in-ieee80211_chan_bw_change-for-A.patch
Link: https://github.com/openwrt/openwrt/pull/23167
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>