]> git.ipfire.org Git - thirdparty/openwrt.git/commitdiff
mac80211: bump to version 6.18.26 23167/head
authorHauke Mehrtens <hauke@hauke-m.de>
Thu, 30 Apr 2026 19:42:43 +0000 (21:42 +0200)
committerHauke Mehrtens <hauke@hauke-m.de>
Sun, 3 May 2026 15:23:16 +0000 (17:23 +0200)
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>
25 files changed:
package/kernel/mac80211/Makefile
package/kernel/mac80211/patches/ath11k/100-wifi-ath11k-use-unique-QRTR-instance-ID.patch
package/kernel/mac80211/patches/ath11k/903-ath11k-support-setting-FW-memory-mode-via-DT.patch
package/kernel/mac80211/patches/ath11k/905-ath11k-remove-intersection-support-for-regulatory-ru.patch
package/kernel/mac80211/patches/ath11k/949-wifi-ath11k-fix-monitor-rx-pktlen.patch
package/kernel/mac80211/patches/ath12k/001-v7.1-wifi-ath12k-add-basic-hwmon-temperature-reporting.patch
package/kernel/mac80211/patches/ath12k/102-wifi-ath12k-limit-WMI_SCAN_CHAN_LIST_CMDID-arg.patch
package/kernel/mac80211/patches/ath12k/103-wifi-ath12k-fix-5GHz-operation-on-wideband-QCN.patch
package/kernel/mac80211/patches/ath9k/550-ath9k-of.patch
package/kernel/mac80211/patches/brcm/870-04-rpi-6.12-brcmfmac-non-upstream-support-DS1-exit-firmware-re-download.patch
package/kernel/mac80211/patches/build/210-wireless_netns_local_backport.patch
package/kernel/mac80211/patches/build/230-fix-init_vqs-build-error-on-kernel-6.6.patch
package/kernel/mac80211/patches/build/300-backports-handle-genlmsg_multicast_allns-upstream-ba.patch
package/kernel/mac80211/patches/build/410-mac80211-convert-short-fops-to-debugfs-files.patch
package/kernel/mac80211/patches/subsys/110-mac80211_keep_keys_on_stop_ap.patch
package/kernel/mac80211/patches/subsys/220-allow-ibss-mixed.patch
package/kernel/mac80211/patches/subsys/230-avoid-crashing-missing-band.patch
package/kernel/mac80211/patches/subsys/305-mac80211-increase-quantum-for-airtime-scheduler.patch
package/kernel/mac80211/patches/subsys/320-mac80211-add-AQL-support-for-broadcast-packets.patch
package/kernel/mac80211/patches/subsys/330-mac80211-fix-crash-in-ieee80211_chan_bw_change-for-A.patch [deleted file]
package/kernel/mac80211/patches/subsys/350-mac80211-allow-scanning-while-on-radar-channel.patch
package/kernel/mac80211/patches/subsys/360-mac80211-factor-out-part-of-ieee80211_calc_expected_.patch
package/kernel/mac80211/patches/subsys/361-mac80211-estimate-expected-throughput-if-not-provide.patch
package/kernel/mac80211/patches/subsys/371-wifi-mac80211-Add-eMLSR-eMLMR-action-frame-parsing-s.patch
package/kernel/mac80211/patches/subsys/380-mac80211-report-assoc_link_id-in-station-info-for-no.patch

index 0beb264db16c38d541a5511286068779f6d24c6f..aec88b692ba08c192cd6e42406b70f180edbb94f 100644 (file)
@@ -10,13 +10,13 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=mac80211
 
-PKG_VERSION:=6.18.7
+PKG_VERSION:=6.18.26
 PKG_RELEASE:=1
 PKG_LICENSE:=GPL-2.0-only
 PKG_LICENSE_FILES:=COPYING
 
 PKG_SOURCE_URL:=https://github.com/openwrt/backports/releases/download/backports-v$(PKG_VERSION)
-PKG_HASH:=623e5cf46ca8e81fd413f4f465e2580a0143e24929f9c22ce1ba7c34f2872989
+PKG_HASH:=2ad578c6cae22f192fefd44e1449725228d4109ee781998b41dcbae872554968
 
 PKG_SOURCE:=backports-$(PKG_VERSION).tar.zst
 PKG_BUILD_DIR:=$(KERNEL_BUILD_DIR)/$(if $(BUILD_VARIANT),$(PKG_NAME)-$(BUILD_VARIANT)/)backports-$(PKG_VERSION)
index 87f8000ec62230b57a87947aec8cdfeb16217b16..99fdfcddfa42256bb34d28afde68ad5038b95bed 100644 (file)
@@ -49,7 +49,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
 
 --- a/drivers/net/wireless/ath/ath11k/mhi.c
 +++ b/drivers/net/wireless/ath/ath11k/mhi.c
-@@ -239,6 +239,34 @@ static void ath11k_mhi_op_runtime_put(st
+@@ -235,6 +235,34 @@ static void ath11k_mhi_op_runtime_put(st
  {
  }
  
@@ -84,7 +84,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
  static char *ath11k_mhi_op_callback_to_str(enum mhi_callback reason)
  {
        switch (reason) {
-@@ -260,6 +288,8 @@ static char *ath11k_mhi_op_callback_to_s
+@@ -256,6 +284,8 @@ static char *ath11k_mhi_op_callback_to_s
                return "MHI_CB_FATAL_ERROR";
        case MHI_CB_BW_REQ:
                return "MHI_CB_BW_REQ";
@@ -93,7 +93,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
        default:
                return "UNKNOWN";
        }
-@@ -290,6 +320,9 @@ static void ath11k_mhi_op_status_cb(stru
+@@ -286,6 +316,9 @@ static void ath11k_mhi_op_status_cb(stru
                        queue_work(ab->workqueue_aux, &ab->reset_work);
  
                break;
@@ -103,7 +103,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
        default:
                break;
        }
-@@ -297,22 +330,6 @@ static void ath11k_mhi_op_status_cb(stru
+@@ -293,22 +326,6 @@ static void ath11k_mhi_op_status_cb(stru
        ab_pci->mhi_pre_cb = cb;
  }
  
index ab915fef4a393357cae6fe110e0f0688cf62d756..c0db0f3091d89987023abbe334c64b14092270bc 100644 (file)
@@ -31,7 +31,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
        {
                .hw_rev = ATH11K_HW_IPQ8074,
                .name = "ipq8074 hw2.0",
-@@ -2521,7 +2521,8 @@ static void ath11k_core_reset(struct wor
+@@ -2576,7 +2576,8 @@ static void ath11k_core_reset(struct wor
  static int ath11k_init_hw_params(struct ath11k_base *ab)
  {
        const struct ath11k_hw_params *hw_params = NULL;
@@ -41,7 +41,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
  
        for (i = 0; i < ARRAY_SIZE(ath11k_hw_params); i++) {
                hw_params = &ath11k_hw_params[i];
-@@ -2537,7 +2538,31 @@ static int ath11k_init_hw_params(struct
+@@ -2592,7 +2593,31 @@ static int ath11k_init_hw_params(struct
  
        ab->hw_params = *hw_params;
  
index 59a2165c0cdb4527bc02022c5843f5521667b7c6..2592a70ce1086bff57e5452d3087502ed776c94f 100644 (file)
@@ -291,9 +291,9 @@ Signed-off-by: Aditya Kumar Singh <quic_adisi@quicinc.com>
        int pdev_idx;
        struct ath11k *ar;
        enum wmi_vdev_type vdev_type;
-@@ -929,24 +772,14 @@ int ath11k_reg_handle_chan_list(struct a
-                   (char *)reg_info->alpha2, 2))
-               goto retfail;
+@@ -932,24 +775,14 @@ int ath11k_reg_handle_chan_list(struct a
+               return 0;
+       }
  
 -      /* Intersect new rules with default regd if a new country setting was
 -       * requested, i.e a default regd was already set during initialization
index 638d2dc7e2e74f7793bca9901c312dfbe9d2bd42..f174d60749c72d4a9863753efafa9dcf09db411b 100644 (file)
@@ -24,7 +24,7 @@ to the monitor RX delivery path.
 
 --- a/drivers/net/wireless/ath/ath11k/dp_rx.c
 +++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
-@@ -4931,8 +4931,13 @@ ath11k_dp_rx_mon_merg_msdus(struct ath11
+@@ -4930,8 +4930,13 @@ ath11k_dp_rx_mon_merg_msdus(struct ath11
                }
  
                prev_buf->next = NULL;
@@ -39,7 +39,7 @@ to the monitor RX delivery path.
        } else if (decap_format == DP_RX_DECAP_TYPE_NATIVE_WIFI) {
                u8 qos_pkt = 0;
  
-@@ -4958,10 +4963,13 @@ ath11k_dp_rx_mon_merg_msdus(struct ath11
+@@ -4957,10 +4962,13 @@ ath11k_dp_rx_mon_merg_msdus(struct ath11
                        prev_buf = msdu;
                        msdu = msdu->next;
                }
@@ -57,7 +57,7 @@ to the monitor RX delivery path.
                ath11k_dbg(ab, ATH11K_DBG_DATA,
                           "mpdu_buf %p mpdu_buf->len %u",
                           prev_buf, prev_buf->len);
-@@ -5086,12 +5094,27 @@ static int ath11k_dp_rx_mon_deliver(stru
+@@ -5085,12 +5093,27 @@ static int ath11k_dp_rx_mon_deliver(stru
  
        header = mon_skb;
  
index f861283ca7c58669de5ef506c7de34e63e93835b..022e332700d2dd10b42f28b06fd3514411236e1b 100644 (file)
@@ -101,7 +101,7 @@ Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
  struct ath12k_hw {
 --- a/drivers/net/wireless/ath/ath12k/mac.c
 +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -14057,6 +14057,10 @@ static void ath12k_mac_setup(struct ath1
+@@ -14063,6 +14063,10 @@ static void ath12k_mac_setup(struct ath1
        init_completion(&ar->mlo_setup_done);
        init_completion(&ar->completed_11d_scan);
        init_completion(&ar->regd_update_completed);
@@ -294,7 +294,7 @@ Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
 +#endif /* _ATH12K_THERMAL_ */
 --- a/drivers/net/wireless/ath/ath12k/wmi.c
 +++ b/drivers/net/wireless/ath/ath12k/wmi.c
-@@ -6674,31 +6674,6 @@ static int ath12k_pull_peer_assoc_conf_e
+@@ -6673,31 +6673,6 @@ static int ath12k_pull_peer_assoc_conf_e
        return 0;
  }
  
@@ -326,7 +326,7 @@ Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
  static void ath12k_wmi_op_ep_tx_credits(struct ath12k_base *ab)
  {
        /* try to send pending beacons first. they take priority */
-@@ -8713,25 +8688,45 @@ static void
+@@ -8712,25 +8687,45 @@ static void
  ath12k_wmi_pdev_temperature_event(struct ath12k_base *ab,
                                  struct sk_buff *skb)
  {
index 36d7d681b8fea710c9b8eb58a6d9a9fc8bb87099..85b10713f8ad0e8765b3cef59fe33cbd87ea82af 100644 (file)
@@ -130,7 +130,7 @@ Best regards,
 
 --- a/drivers/net/wireless/ath/ath12k/wmi.c
 +++ b/drivers/net/wireless/ath/ath12k/wmi.c
-@@ -2894,6 +2894,9 @@ int ath12k_wmi_send_scan_chan_list_cmd(s
+@@ -2900,6 +2900,9 @@ int ath12k_wmi_send_scan_chan_list_cmd(s
                max_chan_limit = (wmi->wmi_ab->max_msg_len[ar->pdev_idx] - len) /
                        sizeof(*chan_info);
  
index 14f6fbb35e644f0179a0a71e976ec2e6dcff27c7..2cb82ae411ff19c95b77565404efa589bdff537e 100644 (file)
@@ -124,7 +124,7 @@ Best regards,
 
 --- a/drivers/net/wireless/ath/ath12k/mac.c
 +++ b/drivers/net/wireless/ath/ath12k/mac.c
-@@ -7724,9 +7724,7 @@ static void ath12k_mac_setup_ht_vht_cap(
+@@ -7727,9 +7727,7 @@ static void ath12k_mac_setup_ht_vht_cap(
                                                    rate_cap_rx_chainmask);
        }
  
index db69efb0354c38e717ff8da6e5dfb759e6441e51..03d126c786c3c8897ce4f92a95171157df220034 100644 (file)
  
 --- a/drivers/net/wireless/ath/ath9k/hw.c
 +++ b/drivers/net/wireless/ath/ath9k/hw.c
-@@ -2429,6 +2429,7 @@ static bool ath9k_hw_dfs_tested(struct ath_hw *ah)
+@@ -2481,6 +2481,7 @@ static bool ath9k_hw_dfs_tested(struct a
  static void ath9k_gpio_cap_init(struct ath_hw *ah)
  {
        struct ath9k_hw_capabilities *pCap = &ah->caps;
  
        if (AR_SREV_9271(ah)) {
                pCap->num_gpio_pins = AR9271_NUM_GPIO;
-@@ -2479,6 +2480,12 @@ static void ath9k_gpio_cap_init(struct ath_hw *ah)
+@@ -2531,6 +2532,12 @@ static void ath9k_gpio_cap_init(struct a
                pCap->num_gpio_pins = AR_NUM_GPIO;
                pCap->gpio_mask = AR_GPIO_MASK;
        }
index ef3e7ee20abaafe1defd979efc6ffeea7da233ac..bbeb4d3744168405c9bf8acacdd62382918f2042 100644 (file)
@@ -518,7 +518,7 @@ JIRA: SWWLAN-136577
        /* ready */
        return;
  
-@@ -4649,3 +4860,40 @@ int brcmf_sdio_sleep(struct brcmf_sdio *
+@@ -4650,3 +4861,40 @@ int brcmf_sdio_sleep(struct brcmf_sdio *
  
        return ret;
  }
index 428d8df0f1f8c53bbc8712a956aa9d91ee38ceb4..222422102e641a5f834a4827b430843ef9383b5a 100644 (file)
@@ -40,7 +40,7 @@
                }
  
                return err;
-@@ -1550,7 +1566,11 @@ static int cfg80211_netdev_notifier_call
+@@ -1549,7 +1565,11 @@ static int cfg80211_netdev_notifier_call
                SET_NETDEV_DEVTYPE(dev, &wiphy_type);
                wdev->netdev = dev;
                /* can only change netns with wiphy */
index 500ebe172e2a745380897726912181d1eeeca950..7948953e269c578e2f3e6c217672d2d86d5552db 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/virtual/mac80211_hwsim.c
 +++ b/drivers/net/wireless/virtual/mac80211_hwsim.c
-@@ -6927,6 +6927,7 @@ static void hwsim_virtio_rx_done(struct
+@@ -6926,6 +6926,7 @@ static void hwsim_virtio_rx_done(struct
  
  static int init_vqs(struct virtio_device *vdev)
  {
@@ -8,7 +8,7 @@
        struct virtqueue_info vqs_info[HWSIM_NUM_VQS] = {
                [HWSIM_VQ_TX] = { "tx", hwsim_virtio_tx_done },
                [HWSIM_VQ_RX] = { "rx", hwsim_virtio_rx_done },
-@@ -6934,6 +6935,19 @@ static int init_vqs(struct virtio_device
+@@ -6933,6 +6934,19 @@ static int init_vqs(struct virtio_device
  
        return virtio_find_vqs(vdev, HWSIM_NUM_VQS,
                               hwsim_vqs, vqs_info, NULL);
index 1e1b03514bca4b81f36ed7f684f15abb6985738e..d4f9d1dfe913e6e4b6993ad175f52ca431403df2 100644 (file)
@@ -44,7 +44,7 @@ Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
 +compat-$(CPTCFG_KERNEL_6_1) += backport-genetlink.o
  compat-$(CPTCFG_KERNEL_6_4) += backport-6.4.o
  compat-$(CPTCFG_KERNEL_6_11) += backport-6.11.o
+ compat-$(CPTCFG_KERNEL_6_14) += backport-faux.o
 --- a/compat/backport-genetlink.c
 +++ b/compat/backport-genetlink.c
 @@ -17,6 +17,7 @@
index e5b0372a30063a1d7f7c94d4c0c4c9dd01a9158a..e4e3d6607e5920befeb09a5bc6951d3d97323c57 100644 (file)
@@ -58,7 +58,7 @@
        .llseek = default_llseek,
  };
  
-@@ -348,9 +353,10 @@ static ssize_t aql_enable_write(struct f
+@@ -344,9 +349,10 @@ static ssize_t aql_enable_write(struct f
        return count;
  }
  
@@ -70,7 +70,7 @@
        .llseek = default_llseek,
  };
  
-@@ -398,9 +404,10 @@ static ssize_t force_tx_status_write(str
+@@ -394,9 +400,10 @@ static ssize_t force_tx_status_write(str
        return count;
  }
  
@@ -82,7 +82,7 @@
        .llseek = default_llseek,
  };
  
-@@ -425,8 +432,9 @@ static ssize_t reset_write(struct file *
+@@ -421,8 +428,9 @@ static ssize_t reset_write(struct file *
        return count;
  }
  
@@ -93,7 +93,7 @@
        .llseek = noop_llseek,
  };
  #endif
-@@ -653,8 +661,9 @@ static ssize_t stats_ ##name## _read(str
+@@ -649,8 +657,9 @@ static ssize_t stats_ ##name## _read(str
                                      print_devstats_##name);           \
  }                                                                     \
                                                                        \
index f9956ea05cf97d89fca7d2e54d625cc424f0ad07..5c79bf87de8258cfcf4a7b140a42df5c934c3a22 100644 (file)
@@ -9,9 +9,9 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnect
 
 --- a/net/mac80211/cfg.c
 +++ b/net/mac80211/cfg.c
-@@ -1872,12 +1872,6 @@ static int ieee80211_stop_ap(struct wiph
-       __sta_info_flush(sdata, true, link_id, NULL);
+@@ -1883,12 +1883,6 @@ static int ieee80211_stop_ap(struct wiph
+       ieee80211_link_info_change_notify(sdata, link,
+                                         BSS_CHANGED_BEACON_ENABLED);
  
 -      ieee80211_remove_link_keys(link, &keys);
 -      if (!list_empty(&keys)) {
@@ -19,6 +19,6 @@ Used for AP+STA support in OpenWrt - preserve AP mode keys across STA reconnect
 -              ieee80211_free_key_list(local, &keys);
 -      }
 -
-       ieee80211_stop_mbssid(sdata);
-       RCU_INIT_POINTER(link_conf->tx_bss_conf, NULL);
+       if (sdata->wdev.links[link_id].cac_started) {
+               chandef = link_conf->chanreq.oper;
+               wiphy_delayed_work_cancel(wiphy, &link->dfs_cac_timer_work);
index 6ef7fb27776c1ef22f9c3b39d561ea02772b44f2..63eeff85ae642eb9e4b5d1e297c1a02270795435 100644 (file)
@@ -16,7 +16,7 @@ and we should ignore this.
 
 --- a/net/wireless/core.c
 +++ b/net/wireless/core.c
-@@ -679,21 +679,6 @@ int wiphy_verify_iface_combinations(stru
+@@ -675,21 +675,6 @@ int wiphy_verify_iface_combinations(stru
                                    c->limits[j].max > 1))
                                return -EINVAL;
  
index 70992c5695b057e813dc24a3186ef0a13136ac9e..5b425bcc208f32f64d5ea0e25a669fc711fa53f4 100644 (file)
@@ -18,7 +18,7 @@ Signed-off-by: David Bauer <mail@david-bauer.net>
 
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -2526,6 +2526,13 @@ static void sta_stats_decode_rate(struct
+@@ -2527,6 +2527,13 @@ static void sta_stats_decode_rate(struct
  
                sband = local->hw.wiphy->bands[band];
  
index e553f11080598c8de4c801a31e823e1fcf4e5cd5..c0820ea23e592f89d486d4a1117f40df8831b8d1 100644 (file)
@@ -23,7 +23,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -4086,7 +4086,7 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4088,7 +4088,7 @@ struct ieee80211_txq *ieee80211_next_txq
  
                if (deficit < 0)
                        sta->airtime[txqi->txq.ac].deficit +=
@@ -32,7 +32,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
                if (deficit < 0 || !aql_check) {
                        list_move_tail(&txqi->schedule_order,
-@@ -4231,7 +4231,8 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4233,7 +4233,8 @@ bool ieee80211_txq_may_transmit(struct i
                }
                sta = container_of(iter->txq.sta, struct sta_info, sta);
                if (ieee80211_sta_deficit(sta, ac) < 0)
@@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                list_move_tail(&iter->schedule_order, &local->active_txqs[ac]);
        }
  
-@@ -4239,7 +4240,7 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4241,7 +4242,7 @@ bool ieee80211_txq_may_transmit(struct i
        if (sta->airtime[ac].deficit >= 0)
                goto out;
  
index f9e917467d142484e769cb133a1dfb364edad288..d1e9c0deb099c9150c1a12148763a0c339940824 100644 (file)
@@ -70,7 +70,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -1428,10 +1428,12 @@ struct ieee80211_local {
+@@ -1426,10 +1426,12 @@ struct ieee80211_local {
        spinlock_t handle_wake_tx_queue_lock;
  
        u16 airtime_flags;
@@ -95,7 +95,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                spin_lock_init(&local->active_txq_lock[i]);
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -2431,13 +2431,28 @@ EXPORT_SYMBOL(ieee80211_sta_recalc_aggre
+@@ -2432,13 +2432,28 @@ EXPORT_SYMBOL(ieee80211_sta_recalc_aggre
  
  void ieee80211_sta_update_pending_airtime(struct ieee80211_local *local,
                                          struct sta_info *sta, u8 ac,
@@ -127,7 +127,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                        atomic_add(tx_airtime,
 --- a/net/mac80211/tx.c
 +++ b/net/mac80211/tx.c
-@@ -2556,7 +2556,7 @@ static u16 ieee80211_store_ack_skb(struc
+@@ -2558,7 +2558,7 @@ static u16 ieee80211_store_ack_skb(struc
  
                spin_lock_irqsave(&local->ack_status_lock, flags);
                id = idr_alloc(&local->ack_status_frames, ack_skb,
@@ -136,7 +136,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
                spin_unlock_irqrestore(&local->ack_status_lock, flags);
  
                if (id >= 0) {
-@@ -3987,20 +3987,20 @@ begin:
+@@ -3989,20 +3989,20 @@ begin:
  encap_out:
        info->control.vif = vif;
  
@@ -167,7 +167,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        }
  
        return skb;
-@@ -4052,6 +4052,7 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4054,6 +4054,7 @@ struct ieee80211_txq *ieee80211_next_txq
        struct ieee80211_txq *ret = NULL;
        struct txq_info *txqi = NULL, *head = NULL;
        bool found_eligible_txq = false;
@@ -175,7 +175,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
        spin_lock_bh(&local->active_txq_lock[ac]);
  
-@@ -4075,26 +4076,26 @@ struct ieee80211_txq *ieee80211_next_txq
+@@ -4077,26 +4078,26 @@ struct ieee80211_txq *ieee80211_next_txq
        if (!head)
                head = txqi;
  
@@ -214,7 +214,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        if (txqi->schedule_round == local->schedule_round[ac])
                goto out;
  
-@@ -4161,7 +4162,8 @@ bool ieee80211_txq_airtime_check(struct
+@@ -4163,7 +4164,8 @@ bool ieee80211_txq_airtime_check(struct
                return true;
  
        if (!txq->sta)
@@ -224,7 +224,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  
        if (unlikely(txq->tid == IEEE80211_NUM_TIDS))
                return true;
-@@ -4210,15 +4212,15 @@ bool ieee80211_txq_may_transmit(struct i
+@@ -4212,15 +4214,15 @@ bool ieee80211_txq_may_transmit(struct i
  
        spin_lock_bh(&local->active_txq_lock[ac]);
  
diff --git a/package/kernel/mac80211/patches/subsys/330-mac80211-fix-crash-in-ieee80211_chan_bw_change-for-A.patch b/package/kernel/mac80211/patches/subsys/330-mac80211-fix-crash-in-ieee80211_chan_bw_change-for-A.patch
deleted file mode 100644 (file)
index 6693829..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-From: Felix Fietkau <nbd@nbd.name>
-Date: Thu, 5 Mar 2026 17:04:11 +0000
-Subject: [PATCH] mac80211: fix crash in ieee80211_chan_bw_change for AP_VLAN
- stations
-
-ieee80211_chan_bw_change() iterates all stations and accesses
-link->reserved.oper via sta->sdata->link[link_id]. For stations on
-AP_VLAN interfaces (e.g. 4addr WDS clients), sta->sdata points to
-the VLAN sdata, whose link never participates in chanctx reservations.
-This leaves link->reserved.oper zero-initialized with chan == NULL,
-causing a NULL pointer dereference in __ieee80211_sta_cap_rx_bw()
-when accessing chandef->chan->band during CSA.
-
-Resolve the VLAN sdata to its parent AP sdata using get_bss_sdata()
-before accessing link data.
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
-
---- a/net/mac80211/chan.c
-+++ b/net/mac80211/chan.c
-@@ -441,13 +441,15 @@ static void ieee80211_chan_bw_change(str
-       rcu_read_lock();
-       list_for_each_entry_rcu(sta, &local->sta_list,
-                               list) {
--              struct ieee80211_sub_if_data *sdata = sta->sdata;
-+              struct ieee80211_sub_if_data *sdata;
-               enum ieee80211_sta_rx_bandwidth new_sta_bw;
-               unsigned int link_id;
-               if (!ieee80211_sdata_running(sta->sdata))
-                       continue;
-+              sdata = get_bss_sdata(sta->sdata);
-+
-               for (link_id = 0; link_id < ARRAY_SIZE(sta->sdata->link); link_id++) {
-                       struct ieee80211_link_data *link =
-                               rcu_dereference(sdata->link[link_id]);
index 9e934f24ffe46fbe1bb923f537fd295133a308fe..ad716186722ec9ee37fdeb24fc226527cc192c99 100644 (file)
@@ -97,7 +97,7 @@
        return false;
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -2022,6 +2022,13 @@ int ieee80211_mesh_finish_csa(struct iee
+@@ -2020,6 +2020,13 @@ int ieee80211_mesh_finish_csa(struct iee
                              u64 *changed);
  
  /* scan/BSS handling */
  void ieee80211_scan_work(struct wiphy *wiphy, struct wiphy_work *work);
  int ieee80211_request_ibss_scan(struct ieee80211_sub_if_data *sdata,
                                const u8 *ssid, u8 ssid_len,
-@@ -2060,6 +2067,7 @@ void ieee80211_sched_scan_stopped_work(s
+@@ -2058,6 +2065,7 @@ void ieee80211_sched_scan_stopped_work(s
  /* off-channel/mgmt-tx */
  void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local);
  void ieee80211_offchannel_return(struct ieee80211_local *local);
  void ieee80211_roc_setup(struct ieee80211_local *local);
  void ieee80211_start_next_roc(struct ieee80211_local *local);
  void ieee80211_reconfig_roc(struct ieee80211_local *local);
-@@ -2719,6 +2727,8 @@ bool ieee80211_chandef_s1g_oper(struct i
+@@ -2717,6 +2725,8 @@ bool ieee80211_chandef_s1g_oper(struct i
                                struct cfg80211_chan_def *chandef);
  void ieee80211_chandef_downgrade(struct cfg80211_chan_def *chandef,
                                 struct ieee80211_conn_settings *conn);
  static inline void
  ieee80211_chanreq_downgrade(struct ieee80211_chan_req *chanreq,
                            struct ieee80211_conn_settings *conn)
-@@ -2775,7 +2785,7 @@ void ieee80211_recalc_chanctx_min_def(st
+@@ -2773,7 +2783,7 @@ void ieee80211_recalc_chanctx_min_def(st
                                      struct ieee80211_chanctx *ctx,
                                      struct ieee80211_link_data *rsvd_for,
                                      bool check_reserved);
                        list_add_tail(&roc->list, &local->roc_list);
 --- a/net/mac80211/scan.c
 +++ b/net/mac80211/scan.c
-@@ -586,25 +586,72 @@ static int ieee80211_start_sw_scan(struc
+@@ -591,25 +591,72 @@ static int ieee80211_start_sw_scan(struc
        return 0;
  }
  
        }
  
        return true;
-@@ -612,12 +659,12 @@ static bool __ieee80211_can_leave_ch(str
+@@ -617,12 +664,12 @@ static bool __ieee80211_can_leave_ch(str
  
  static bool ieee80211_can_scan(struct ieee80211_local *local,
                               struct ieee80211_sub_if_data *sdata,
                return false;
  
        if (sdata->vif.type == NL80211_IFTYPE_STATION &&
-@@ -629,19 +676,22 @@ static bool ieee80211_can_scan(struct ie
+@@ -634,19 +681,22 @@ static bool ieee80211_can_scan(struct ie
  
  void ieee80211_run_deferred_scan(struct ieee80211_local *local)
  {
                return;
  
        wiphy_delayed_work_queue(local->hw.wiphy, &local->scan_work,
-@@ -724,6 +774,7 @@ static int __ieee80211_start_scan(struct
+@@ -729,6 +779,7 @@ static int __ieee80211_start_scan(struct
  {
        struct ieee80211_local *local = sdata->local;
        bool hw_scan = local->ops->hw_scan;
        int rc;
  
        lockdep_assert_wiphy(local->hw.wiphy);
-@@ -738,10 +789,11 @@ static int __ieee80211_start_scan(struct
+@@ -743,10 +794,11 @@ static int __ieee80211_start_scan(struct
            !(sdata->vif.active_links & BIT(req->tsf_report_link_id)))
                return -EINVAL;
  
   * the suspend->resume cycle. Since we can't check each caller
 --- a/net/wireless/util.c
 +++ b/net/wireless/util.c
-@@ -2943,6 +2943,9 @@ bool cfg80211_radio_chandef_valid(const
+@@ -2945,6 +2945,9 @@ bool cfg80211_radio_chandef_valid(const
  {
        u32 freq, width;
  
index 15ec47a078a720177be4a7fe71361e5623e598e6..7a5bfc4c1dd881e126b35c0e1c6afe9859b8c8e2 100644 (file)
@@ -126,7 +126,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
        }
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -2839,6 +2839,11 @@ u8 *ieee80211_get_bssid(struct ieee80211
+@@ -2837,6 +2837,11 @@ u8 *ieee80211_get_bssid(struct ieee80211
  
  extern const struct ethtool_ops ieee80211_ethtool_ops;
  
index bbda2ecdffe13921a7186be1450e028e792eee58..10d945b47fcb3bc31c30066d2813f1c6dbbbf9fa 100644 (file)
@@ -12,7 +12,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -2977,6 +2977,29 @@ static void sta_set_link_sinfo(struct st
+@@ -2980,6 +2980,29 @@ static void sta_set_link_sinfo(struct st
        }
  }
  
@@ -42,7 +42,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
  void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
                   bool tidstats)
  {
-@@ -3201,6 +3224,8 @@ void sta_set_sinfo(struct sta_info *sta,
+@@ -3205,6 +3228,8 @@ void sta_set_sinfo(struct sta_info *sta,
                sinfo->sta_flags.set |= BIT(NL80211_STA_FLAG_TDLS_PEER);
  
        thr = sta_get_expected_throughput(sta);
index c20ed61a629f709eb81622971a7f22979b1701e7..3d1e17cec9647796775dedefc7f1584a05a9017e 100644 (file)
@@ -320,7 +320,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
 +}
 --- a/net/mac80211/ieee80211_i.h
 +++ b/net/mac80211/ieee80211_i.h
-@@ -2859,6 +2859,8 @@ void ieee80211_destroy_frag_cache(struct
+@@ -2857,6 +2857,8 @@ void ieee80211_destroy_frag_cache(struct
  
  u8 ieee80211_ie_len_eht_cap(struct ieee80211_sub_if_data *sdata);
  
@@ -331,7 +331,7 @@ Signed-off-by: Johannes Berg <johannes.berg@intel.com>
                                    struct ieee80211_supported_band *sband,
 --- a/net/mac80211/iface.c
 +++ b/net/mac80211/iface.c
-@@ -1630,7 +1630,15 @@ static void ieee80211_iface_process_skb(
+@@ -1634,7 +1634,15 @@ static void ieee80211_iface_process_skb(
                }
        } else if (ieee80211_is_action(mgmt->frame_control) &&
                   mgmt->u.action.category == WLAN_CATEGORY_PROTECTED_EHT) {
index 44929d29c306572771bd5cb5289f072f84c35a65..8fe3cb2f7d1d606ae603d9c112e6a82984d93dc7 100644 (file)
@@ -19,7 +19,7 @@ Signed-off-by: Felix Fietkau <nbd@nbd.name>
 
 --- a/net/mac80211/sta_info.c
 +++ b/net/mac80211/sta_info.c
-@@ -3252,7 +3252,10 @@ void sta_set_sinfo(struct sta_info *sta,
+@@ -3256,7 +3256,10 @@ void sta_set_sinfo(struct sta_info *sta,
                struct link_sta_info *link_sta;
                int link_id;