Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'wireless-2025-12-17' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless

Johannes Berg says:

====================
Various fixes all over, most are recent regressions but
also some long-standing issues:

- cfg80211:
- fix an issue with overly long SSIDs

- mac80211:
- long-standing beacon protection issue on some devices
- for for a multi-BSSID AP-side issue
- fix a syzbot warning on OCB (not really used in practice)
- remove WARN on connections using disabled channels,
as that can happen due to changes in the disable flag
- fix monitor mode list iteration

- iwlwifi:
- fix firmware loading on certain (really old) devices
- add settime64 to PTP clock to avoid a warning and clock
registration failure, but it's not actually supported

- rtw88:
- remove WQ_UNBOUND since it broke USB adapters
(because it can't be used with WQ_BH)
- fix SDIO issues with certain devices

- rtl8192cu: fix TID array out-of-bounds (since 6.9)

- wlcore (TI): add missing skb push headroom increase

* tag 'wireless-2025-12-17' of https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless:
wifi: iwlwifi: Implement settime64 as stub for MVM/MLD PTP
wifi: iwlwifi: Fix firmware version handling
wifi: mac80211: ocb: skip rx_no_sta when interface is not joined
wifi: mac80211: do not use old MBSSID elements
wifi: mac80211: don't WARN for connections on invalid channels
wifi: wlcore: ensure skb headroom before skb_push
wifi: cfg80211: sme: store capped length in __cfg80211_connect_result()
wifi: mac80211: fix list iteration in ieee80211_add_virtual_monitor()
wifi: mac80211: Discard Beacon frames to non-broadcast address
Revert "wifi: rtw88: add WQ_UNBOUND to alloc_workqueue users"
wifi: rtlwifi: 8192cu: fix tid out of range in rtl92cu_tx_fill_desc()
wifi: rtw88: limit indirect IO under powered off for RTL8822CS
====================

Link: https://patch.msgid.link/20251217201441.59876-3-johannes@sipsolutions.net
Signed-off-by: Paolo Abeni <pabeni@redhat.com>

+41 -19
+2 -2
drivers/net/wireless/intel/iwlwifi/iwl-drv.c
··· 1597 1597 */ 1598 1598 static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context) 1599 1599 { 1600 - unsigned int min_core, max_core, loaded_core; 1600 + int min_core, max_core, loaded_core; 1601 1601 struct iwl_drv *drv = context; 1602 1602 struct iwl_fw *fw = &drv->fw; 1603 1603 const struct iwl_ucode_header *ucode; ··· 1676 1676 if (loaded_core < min_core || loaded_core > max_core) { 1677 1677 IWL_ERR(drv, 1678 1678 "Driver unable to support your firmware API. " 1679 - "Driver supports FW core %u..%u, firmware is %u.\n", 1679 + "Driver supports FW core %d..%d, firmware is %d.\n", 1680 1680 min_core, max_core, loaded_core); 1681 1681 goto try_again; 1682 1682 }
+7
drivers/net/wireless/intel/iwlwifi/mld/ptp.c
··· 121 121 return 0; 122 122 } 123 123 124 + static int iwl_mld_ptp_settime(struct ptp_clock_info *ptp, 125 + const struct timespec64 *ts) 126 + { 127 + return -EOPNOTSUPP; 128 + } 129 + 124 130 static int iwl_mld_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) 125 131 { 126 132 struct iwl_mld *mld = container_of(ptp, struct iwl_mld, ··· 285 279 286 280 mld->ptp_data.ptp_clock_info.owner = THIS_MODULE; 287 281 mld->ptp_data.ptp_clock_info.gettime64 = iwl_mld_ptp_gettime; 282 + mld->ptp_data.ptp_clock_info.settime64 = iwl_mld_ptp_settime; 288 283 mld->ptp_data.ptp_clock_info.max_adj = 0x7fffffff; 289 284 mld->ptp_data.ptp_clock_info.adjtime = iwl_mld_ptp_adjtime; 290 285 mld->ptp_data.ptp_clock_info.adjfine = iwl_mld_ptp_adjfine;
+7
drivers/net/wireless/intel/iwlwifi/mvm/ptp.c
··· 220 220 return 0; 221 221 } 222 222 223 + static int iwl_mvm_ptp_settime(struct ptp_clock_info *ptp, 224 + const struct timespec64 *ts) 225 + { 226 + return -EOPNOTSUPP; 227 + } 228 + 223 229 static int iwl_mvm_ptp_adjtime(struct ptp_clock_info *ptp, s64 delta) 224 230 { 225 231 struct iwl_mvm *mvm = container_of(ptp, struct iwl_mvm, ··· 287 281 mvm->ptp_data.ptp_clock_info.adjfine = iwl_mvm_ptp_adjfine; 288 282 mvm->ptp_data.ptp_clock_info.adjtime = iwl_mvm_ptp_adjtime; 289 283 mvm->ptp_data.ptp_clock_info.gettime64 = iwl_mvm_ptp_gettime; 284 + mvm->ptp_data.ptp_clock_info.settime64 = iwl_mvm_ptp_settime; 290 285 mvm->ptp_data.scaled_freq = SCALE_FACTOR; 291 286 292 287 /* Give a short 'friendly name' to identify the PHC clock */
+2 -1
drivers/net/wireless/realtek/rtlwifi/rtl8192cu/trx.c
··· 511 511 if (sta) { 512 512 sta_entry = (struct rtl_sta_info *)sta->drv_priv; 513 513 tid = ieee80211_get_tid(hdr); 514 - agg_state = sta_entry->tids[tid].agg.agg_state; 514 + if (tid < MAX_TID_COUNT) 515 + agg_state = sta_entry->tids[tid].agg.agg_state; 515 516 ampdu_density = sta->deflink.ht_cap.ampdu_density; 516 517 } 517 518
+3 -1
drivers/net/wireless/realtek/rtw88/sdio.c
··· 144 144 145 145 static bool rtw_sdio_use_direct_io(struct rtw_dev *rtwdev, u32 addr) 146 146 { 147 + bool might_indirect_under_power_off = rtwdev->chip->id == RTW_CHIP_TYPE_8822C; 148 + 147 149 if (!test_bit(RTW_FLAG_POWERON, rtwdev->flags) && 148 - !rtw_sdio_is_bus_addr(addr)) 150 + !rtw_sdio_is_bus_addr(addr) && might_indirect_under_power_off) 149 151 return false; 150 152 151 153 return !rtw_sdio_is_sdio30_supported(rtwdev) ||
+1 -2
drivers/net/wireless/realtek/rtw88/usb.c
··· 965 965 struct sk_buff *rx_skb; 966 966 int i; 967 967 968 - rtwusb->rxwq = alloc_workqueue("rtw88_usb: rx wq", WQ_BH | WQ_UNBOUND, 969 - 0); 968 + rtwusb->rxwq = alloc_workqueue("rtw88_usb: rx wq", WQ_BH, 0); 970 969 if (!rtwusb->rxwq) { 971 970 rtw_err(rtwdev, "failed to create RX work queue\n"); 972 971 return -ENOMEM;
+5
drivers/net/wireless/ti/wlcore/tx.c
··· 207 207 total_blocks = wlcore_hw_calc_tx_blocks(wl, total_len, spare_blocks); 208 208 209 209 if (total_blocks <= wl->tx_blocks_available) { 210 + if (skb_headroom(skb) < (total_len - skb->len) && 211 + pskb_expand_head(skb, (total_len - skb->len), 0, GFP_ATOMIC)) { 212 + wl1271_free_tx_id(wl, id); 213 + return -EAGAIN; 214 + } 210 215 desc = skb_push(skb, total_len - skb->len); 211 216 212 217 wlcore_hw_set_tx_desc_blocks(wl, desc, total_blocks,
-10
net/mac80211/cfg.c
··· 1345 1345 1346 1346 size = sizeof(*new) + new_head_len + new_tail_len; 1347 1347 1348 - /* new or old multiple BSSID elements? */ 1349 1348 if (params->mbssid_ies) { 1350 1349 mbssid = params->mbssid_ies; 1351 1350 size += struct_size(new->mbssid_ies, elem, mbssid->cnt); 1352 1351 if (params->rnr_ies) { 1353 1352 rnr = params->rnr_ies; 1354 - size += struct_size(new->rnr_ies, elem, rnr->cnt); 1355 - } 1356 - size += ieee80211_get_mbssid_beacon_len(mbssid, rnr, 1357 - mbssid->cnt); 1358 - } else if (old && old->mbssid_ies) { 1359 - mbssid = old->mbssid_ies; 1360 - size += struct_size(new->mbssid_ies, elem, mbssid->cnt); 1361 - if (old && old->rnr_ies) { 1362 - rnr = old->rnr_ies; 1363 1353 size += struct_size(new->rnr_ies, elem, rnr->cnt); 1364 1354 } 1365 1355 size += ieee80211_get_mbssid_beacon_len(mbssid, rnr,
+1 -1
net/mac80211/iface.c
··· 1251 1251 if (!creator_sdata) { 1252 1252 struct ieee80211_sub_if_data *other; 1253 1253 1254 - list_for_each_entry(other, &local->mon_list, list) { 1254 + list_for_each_entry_rcu(other, &local->mon_list, u.mntr.list) { 1255 1255 if (!other->vif.bss_conf.mu_mimo_owner) 1256 1256 continue; 1257 1257
+4 -1
net/mac80211/mlme.c
··· 1126 1126 1127 1127 while (!ieee80211_chandef_usable(sdata, &chanreq->oper, 1128 1128 IEEE80211_CHAN_DISABLED)) { 1129 - if (WARN_ON(chanreq->oper.width == NL80211_CHAN_WIDTH_20_NOHT)) { 1129 + if (chanreq->oper.width == NL80211_CHAN_WIDTH_20_NOHT) { 1130 + link_id_info(sdata, link_id, 1131 + "unusable channel (%d MHz) for connection\n", 1132 + chanreq->oper.chan->center_freq); 1130 1133 ret = -EINVAL; 1131 1134 goto free; 1132 1135 }
+3
net/mac80211/ocb.c
··· 47 47 struct sta_info *sta; 48 48 int band; 49 49 50 + if (!ifocb->joined) 51 + return; 52 + 50 53 /* XXX: Consider removing the least recently used entry and 51 54 * allow new one to be added. 52 55 */
+5
net/mac80211/rx.c
··· 3511 3511 rx->skb->len < IEEE80211_MIN_ACTION_SIZE) 3512 3512 return RX_DROP_U_RUNT_ACTION; 3513 3513 3514 + /* Drop non-broadcast Beacon frames */ 3515 + if (ieee80211_is_beacon(mgmt->frame_control) && 3516 + !is_broadcast_ether_addr(mgmt->da)) 3517 + return RX_DROP; 3518 + 3514 3519 if (rx->sdata->vif.type == NL80211_IFTYPE_AP && 3515 3520 ieee80211_is_beacon(mgmt->frame_control) && 3516 3521 !(rx->flags & IEEE80211_RX_BEACON_REPORTED)) {
+1 -1
net/wireless/sme.c
··· 910 910 911 911 ssid_len = min(ssid->datalen, IEEE80211_MAX_SSID_LEN); 912 912 memcpy(wdev->u.client.ssid, ssid->data, ssid_len); 913 - wdev->u.client.ssid_len = ssid->datalen; 913 + wdev->u.client.ssid_len = ssid_len; 914 914 break; 915 915 } 916 916 rcu_read_unlock();