| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/09/01 20:12 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies the Qualcomm Wi-Fi 7 (ath12k) wireless driver (drivers/net/wireless/ath/ath12k). ath12k requires physical Qualcomm PCIe or AHB hardware (such as WCN7850 or QCN9274) that is not emulated in standard virtualized fuzzing environments like QEMU or GCE. As a result, these modified code paths are impossible to reach during virtualized fuzzing.",
"WorthFuzzing": false
} |
| 1/1 | 2026/09/01 20:12 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 68fb585355d0276ceae7e31db6aefb854edea379\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Tue Sep 1 20:12:50 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h\nindex a98fc6e0699d7..a04757a038f23 100644\n--- a/drivers/net/wireless/ath/ath12k/core.h\n+++ b/drivers/net/wireless/ath/ath12k/core.h\n@@ -529,6 +529,8 @@ struct ath12k_sta {\n \tenum ieee80211_sta_state state;\n \n \tbool enable_4addr;\n+\n+\tbool is_authorized;\n };\n \n #define ATH12K_HALF_20MHZ_BW\t10\ndiff --git a/drivers/net/wireless/ath/ath12k/dp_htt.c b/drivers/net/wireless/ath/ath12k/dp_htt.c\nindex 68968f96b4f1b..72069640bd388 100644\n--- a/drivers/net/wireless/ath/ath12k/dp_htt.c\n+++ b/drivers/net/wireless/ath/ath12k/dp_htt.c\n@@ -276,7 +276,7 @@ ath12k_update_per_peer_tx_stats(struct ath12k_pdev_dp *dp_pdev,\n \trcu_read_lock();\n \tpeer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, usr_stats-\u003epeer_id);\n \n-\tif (!peer || !peer-\u003esta) {\n+\tif (!ath12k_dp_link_peer_get_sta(peer)) {\n \t\trcu_read_unlock();\n \t\treturn;\n \t}\ndiff --git a/drivers/net/wireless/ath/ath12k/dp_peer.c b/drivers/net/wireless/ath/ath12k/dp_peer.c\nindex bb5341b4251a1..06f6eccfb5744 100644\n--- a/drivers/net/wireless/ath/ath12k/dp_peer.c\n+++ b/drivers/net/wireless/ath/ath12k/dp_peer.c\n@@ -195,35 +195,6 @@ void ath12k_dp_link_peer_map_event(struct ath12k_base *ab, u8 vdev_id, u16 peer_\n \tspin_unlock_bh(\u0026dp-\u003edp_lock);\n }\n \n-struct ath12k_link_sta *ath12k_dp_link_peer_to_link_sta(struct ath12k_base *ab,\n-\t\t\t\t\t\t\tstruct ath12k_dp_link_peer *peer)\n-{\n-\tstruct ath12k_sta *ahsta;\n-\tstruct ath12k_link_sta *arsta;\n-\n-\tRCU_LOCKDEP_WARN(!rcu_read_lock_held(),\n-\t\t\t \"ath12k_dp_link_peer to ath12k_link_sta called without rcu lock\");\n-\n-\tif (!peer-\u003esta)\n-\t\treturn NULL;\n-\n-\tahsta = ath12k_sta_to_ahsta(peer-\u003esta);\n-\tif (peer-\u003eml_id \u0026 ATH12K_PEER_ML_ID_VALID) {\n-\t\tif (!(ahsta-\u003elinks_map \u0026 BIT(peer-\u003elink_id))) {\n-\t\t\tath12k_warn(ab, \"peer %pM id %d link_id %d can't found in STA link_map 0x%x\\n\",\n-\t\t\t\t peer-\u003eaddr, peer-\u003epeer_id, peer-\u003elink_id,\n-\t\t\t\t ahsta-\u003elinks_map);\n-\t\t\treturn NULL;\n-\t\t}\n-\t\tarsta = rcu_dereference(ahsta-\u003elink[peer-\u003elink_id]);\n-\t\tif (!arsta)\n-\t\t\treturn NULL;\n-\t} else {\n-\t\tarsta = \u0026ahsta-\u003edeflink;\n-\t}\n-\treturn arsta;\n-}\n-\n static int ath12k_dp_link_peer_rhash_addr_tbl_init(struct ath12k_dp *dp)\n {\n \tstruct ath12k_base *ab = dp-\u003eab;\ndiff --git a/drivers/net/wireless/ath/ath12k/dp_peer.h b/drivers/net/wireless/ath/ath12k/dp_peer.h\nindex 3503840b03295..d01ef1aea48b2 100644\n--- a/drivers/net/wireless/ath/ath12k/dp_peer.h\n+++ b/drivers/net/wireless/ath/ath12k/dp_peer.h\n@@ -70,7 +70,6 @@ DECLARE_EWMA(avg_rssi, 10, 8)\n \n struct ath12k_dp_link_peer {\n \tstruct list_head list;\n-\tstruct ieee80211_sta *sta;\n \tstruct ath12k_dp_peer *dp_peer;\n \tint vdev_id;\n \tu8 addr[ETH_ALEN];\n@@ -81,7 +80,6 @@ struct ath12k_dp_link_peer {\n \n \tstruct ppdu_user_delayba ppdu_stats_delayba;\n \tbool delayba_flag;\n-\tbool is_authorized;\n \tbool mlo;\n \t/* protected by ab-\u003edata_lock */\n \n@@ -159,8 +157,6 @@ ath12k_dp_link_peer_find_by_ast(struct ath12k_dp *dp, int ast_hash);\n struct ath12k_dp_link_peer *\n ath12k_dp_link_peer_find_by_pdev_and_addr(struct ath12k_dp *dp, u8 pdev_idx,\n \t\t\t\t\t const u8 *addr);\n-struct ath12k_link_sta *ath12k_dp_link_peer_to_link_sta(struct ath12k_base *ab,\n-\t\t\t\t\t\t\tstruct ath12k_dp_link_peer *peer);\n int ath12k_dp_link_peer_rhash_tbl_init(struct ath12k_dp *dp);\n void ath12k_dp_link_peer_rhash_tbl_destroy(struct ath12k_dp *dp);\n int ath12k_dp_link_peer_rhash_add(struct ath12k_dp *dp,\n@@ -183,4 +179,17 @@ ath12k_dp_link_peer_find_by_peerid(struct ath12k_pdev_dp *dp_pdev, u16 peer_id);\n void ath12k_dp_link_peer_free(struct ath12k_dp_link_peer *peer);\n int ath12k_dp_peer_fixup_peer_id(struct ath12k_base *ab, const u8 *peer_addr,\n \t\t\t\t u16 peer_id);\n+\n+static inline struct ieee80211_sta *__must_check\n+ath12k_dp_peer_get_sta(const struct ath12k_dp_peer *peer)\n+{\n+\treturn peer ? peer-\u003esta : NULL;\n+}\n+\n+static inline struct ieee80211_sta *__must_check\n+ath12k_dp_link_peer_get_sta(const struct ath12k_dp_link_peer *link_peer)\n+{\n+\treturn link_peer \u0026\u0026 link_peer-\u003edp_peer ?\n+\t\tlink_peer-\u003edp_peer-\u003esta : NULL;\n+}\n #endif\ndiff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c\nindex 8fa0e90b45316..cdb795567e8c7 100644\n--- a/drivers/net/wireless/ath/ath12k/dp_rx.c\n+++ b/drivers/net/wireless/ath/ath12k/dp_rx.c\n@@ -1382,7 +1382,7 @@ void ath12k_dp_rx_deliver_msdu(struct ath12k_pdev_dp *dp_pdev, struct napi_struc\n \n \tpeer = ath12k_dp_peer_find_by_peerid(dp_pdev, rxcb-\u003epeer_id);\n \n-\tpubsta = peer ? peer-\u003esta : NULL;\n+\tpubsta = ath12k_dp_peer_get_sta(peer);\n \n \tstatus-\u003elink_valid = 0;\n \tif (pubsta \u0026\u0026 pubsta-\u003evalid_links)\ndiff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c\nindex 99bf5cf79d102..4ec2ee1b17fc6 100644\n--- a/drivers/net/wireless/ath/ath12k/mac.c\n+++ b/drivers/net/wireless/ath/ath12k/mac.c\n@@ -1232,7 +1232,7 @@ void ath12k_mac_peer_cleanup_all(struct ath12k *ar)\n \tspin_lock_bh(\u0026dp-\u003edp_lock);\n \tlist_for_each_entry_safe(peer, tmp, \u0026dp-\u003epeers, list) {\n \t\t/* Skip Rx TID cleanup for self peer */\n-\t\tif (peer-\u003esta \u0026\u0026 peer-\u003edp_peer)\n+\t\tif (ath12k_dp_link_peer_get_sta(peer))\n \t\t\tath12k_dp_rx_peer_tid_cleanup(ar, peer);\n \n \t\t/* cleanup dp peer */\n@@ -3914,11 +3914,8 @@ static void ath12k_bss_assoc(struct ath12k *ar,\n \tstruct ath12k_link_sta *arsta;\n \tstruct ieee80211_sta *ap_sta;\n \tstruct ath12k_sta *ahsta;\n-\tstruct ath12k_dp_link_peer *peer;\n-\tbool is_auth = false;\n \tu32 hemode = 0;\n \tint ret;\n-\tstruct ath12k_dp *dp = ath12k_ab_to_dp(ar-\u003eab);\n \n \tlockdep_assert_wiphy(ath12k_ar_to_hw(ar)-\u003ewiphy);\n \n@@ -4022,17 +4019,8 @@ static void ath12k_bss_assoc(struct ath12k *ar,\n \t\t \"mac vdev %d up (associated) bssid %pM aid %d\\n\",\n \t\t arvif-\u003evdev_id, bss_conf-\u003ebssid, vif-\u003ecfg.aid);\n \n-\tspin_lock_bh(\u0026dp-\u003edp_lock);\n-\n-\tpeer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif-\u003evdev_id,\n-\t\t\t\t\t\t\t arvif-\u003ebssid);\n-\tif (peer \u0026\u0026 peer-\u003eis_authorized)\n-\t\tis_auth = true;\n-\n-\tspin_unlock_bh(\u0026dp-\u003edp_lock);\n-\n \t/* Authorize BSS Peer */\n-\tif (is_auth) {\n+\tif (ahsta-\u003eis_authorized) {\n \t\tret = ath12k_wmi_set_peer_param(ar, arvif-\u003ebssid,\n \t\t\t\t\t\tarvif-\u003evdev_id,\n \t\t\t\t\t\tWMI_PEER_AUTHORIZE,\n@@ -7005,10 +6993,9 @@ static void ath12k_mac_station_post_remove(struct ath12k *ar,\n \n \tpeer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif-\u003evdev_id,\n \t\t\t\t\t\t\t arsta-\u003eaddr);\n-\tif (peer \u0026\u0026 peer-\u003esta == sta) {\n+\tif (peer \u0026\u0026 ath12k_dp_link_peer_get_sta(peer) == sta) {\n \t\tath12k_warn(ar-\u003eab, \"Found peer entry %pM n vdev %i after it was supposedly removed\\n\",\n \t\t\t vif-\u003eaddr, arvif-\u003evdev_id);\n-\t\tpeer-\u003esta = NULL;\n \n \t\tath12k_dp_link_peer_free(peer);\n \t\tar-\u003enum_peers--;\n@@ -7021,20 +7008,11 @@ static int ath12k_mac_station_unauthorize(struct ath12k *ar,\n \t\t\t\t\t struct ath12k_link_vif *arvif,\n \t\t\t\t\t struct ath12k_link_sta *arsta)\n {\n-\tstruct ath12k_dp_link_peer *peer;\n \tint ret;\n-\tstruct ath12k_dp *dp = ath12k_ab_to_dp(ar-\u003eab);\n \n \tlockdep_assert_wiphy(ath12k_ar_to_hw(ar)-\u003ewiphy);\n \n-\tspin_lock_bh(\u0026dp-\u003edp_lock);\n-\n-\tpeer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif-\u003evdev_id,\n-\t\t\t\t\t\t\t arsta-\u003eaddr);\n-\tif (peer)\n-\t\tpeer-\u003eis_authorized = false;\n-\n-\tspin_unlock_bh(\u0026dp-\u003edp_lock);\n+\tarsta-\u003eahsta-\u003eis_authorized = false;\n \n \t/* Driver must clear the keys during the state change from\n \t * IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after\n@@ -7056,21 +7034,12 @@ static int ath12k_mac_station_authorize(struct ath12k *ar,\n \t\t\t\t\tstruct ath12k_link_vif *arvif,\n \t\t\t\t\tstruct ath12k_link_sta *arsta)\n {\n-\tstruct ath12k_dp_link_peer *peer;\n \tstruct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif-\u003eahvif);\n \tint ret;\n-\tstruct ath12k_dp *dp = ath12k_ab_to_dp(ar-\u003eab);\n \n \tlockdep_assert_wiphy(ath12k_ar_to_hw(ar)-\u003ewiphy);\n \n-\tspin_lock_bh(\u0026dp-\u003edp_lock);\n-\n-\tpeer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif-\u003evdev_id,\n-\t\t\t\t\t\t\t arsta-\u003eaddr);\n-\tif (peer)\n-\t\tpeer-\u003eis_authorized = true;\n-\n-\tspin_unlock_bh(\u0026dp-\u003edp_lock);\n+\tarsta-\u003eahsta-\u003eis_authorized = true;\n \n \tif (vif-\u003etype == NL80211_IFTYPE_STATION \u0026\u0026 arvif-\u003eis_up) {\n \t\tret = ath12k_wmi_set_peer_param(ar, arsta-\u003eaddr,\n@@ -13292,6 +13261,7 @@ ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band ban\n \tbool eht_fixed_rate = false, he_fixed_rate = false, vht_fixed_rate = false;\n \tconst u16 *vht_mcs_mask, *he_mcs_mask, *eht_mcs_mask;\n \tstruct ieee80211_link_sta *link_sta;\n+\tstruct ieee80211_sta *sta;\n \tstruct ath12k_dp_link_peer *peer, *tmp;\n \tu8 vht_nss, he_nss, eht_nss;\n \tint ret = true;\n@@ -13321,8 +13291,9 @@ ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band ban\n \trcu_read_lock();\n \tspin_lock_bh(\u0026dp-\u003edp_lock);\n \tlist_for_each_entry_safe(peer, tmp, \u0026dp-\u003epeers, list) {\n-\t\tif (peer-\u003esta) {\n-\t\t\tlink_sta = rcu_dereference(peer-\u003esta-\u003elink[link_id]);\n+\t\tsta = ath12k_dp_link_peer_get_sta(peer);\n+\t\tif (sta) {\n+\t\t\tlink_sta = rcu_dereference(sta-\u003elink[link_id]);\n \t\t\tif (!link_sta) {\n \t\t\t\tret = false;\n \t\t\t\tgoto exit;\ndiff --git a/drivers/net/wireless/ath/ath12k/peer.c b/drivers/net/wireless/ath/ath12k/peer.c\nindex 80edebf0e364b..0e894408e97fd 100644\n--- a/drivers/net/wireless/ath/ath12k/peer.c\n+++ b/drivers/net/wireless/ath/ath12k/peer.c\n@@ -266,8 +266,6 @@ int ath12k_peer_create(struct ath12k *ar, struct ath12k_link_vif *arvif,\n \t}\n \n \tpeer-\u003epdev_idx = ar-\u003epdev_idx;\n-\tpeer-\u003esta = sta;\n-\n \tif (vif-\u003etype == NL80211_IFTYPE_STATION) {\n \t\tdp_link_vif-\u003east_hash = peer-\u003east_hash;\n \t\tdp_link_vif-\u003east_idx = peer-\u003ehw_peer_id;\ndiff --git a/drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c b/drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c\nindex 016b0c38e51e2..71b85394d4874 100644\n--- a/drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c\n+++ b/drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c\n@@ -3362,7 +3362,7 @@ ath12k_wifi7_dp_mon_srng_process(struct ath12k_pdev_dp *pdev_dp, int *budget,\n \n \t\trcu_read_lock();\n \t\tpeer = ath12k_dp_link_peer_find_by_peerid(pdev_dp, ppdu_info-\u003epeer_id);\n-\t\tif (!peer || !peer-\u003esta) {\n+\t\tif (!ath12k_dp_link_peer_get_sta(peer)) {\n \t\t\tath12k_dbg(ab, ATH12K_DBG_DATA,\n \t\t\t\t \"failed to find the peer with monitor peer_id %d\\n\",\n \t\t\t\t ppdu_info-\u003epeer_id);\ndiff --git a/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c b/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c\nindex 587d58eeccfa5..2a05e03194aa9 100644\n--- a/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c\n+++ b/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c\n@@ -552,13 +552,12 @@ ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_dp *dp,\n \t}\n \n \tpeer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, peer_id);\n-\tif (!peer || !peer-\u003esta) {\n+\tstatus.sta = ath12k_dp_link_peer_get_sta(peer);\n+\tif (!status.sta) {\n \t\tath12k_dbg(ab, ATH12K_DBG_DATA,\n \t\t\t \"dp_tx: failed to find the peer with peer_id %d\\n\", peer_id);\n \t\tieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);\n \t\tgoto exit;\n-\t} else {\n-\t\tstatus.sta = peer-\u003esta;\n \t}\n \n \tstatus.info = info;\n@@ -627,7 +626,8 @@ static void ath12k_wifi7_dp_tx_update_txcompl(struct ath12k_pdev_dp *dp_pdev,\n \tint ret;\n \n \tpeer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, ts-\u003epeer_id);\n-\tif (!peer || !peer-\u003esta) {\n+\tsta = ath12k_dp_link_peer_get_sta(peer);\n+\tif (!sta) {\n \t\tath12k_dbg(dp-\u003eab, ATH12K_DBG_DP_TX,\n \t\t\t \"failed to find the peer by id %u\\n\", ts-\u003epeer_id);\n \t\treturn;\n@@ -635,7 +635,6 @@ static void ath12k_wifi7_dp_tx_update_txcompl(struct ath12k_pdev_dp *dp_pdev,\n \n \tspin_lock_bh(\u0026dp-\u003edp_lock);\n \n-\tsta = peer-\u003esta;\n \tahsta = ath12k_sta_to_ahsta(sta);\n \tarsta = \u0026ahsta-\u003edeflink;\n \n@@ -752,6 +751,7 @@ static void ath12k_wifi7_dp_tx_complete_msdu(struct ath12k_pdev_dp *dp_pdev,\n \tstruct ieee80211_rate_status status_rate = {};\n \tstruct ath12k_dp_link_peer *peer;\n \tstruct rate_info rate;\n+\tstruct ieee80211_sta *sta;\n \n \tif (WARN_ON_ONCE(ts-\u003ebuf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)) {\n \t\t/* Must not happen */\n@@ -846,7 +846,8 @@ static void ath12k_wifi7_dp_tx_complete_msdu(struct ath12k_pdev_dp *dp_pdev,\n \tath12k_wifi7_dp_tx_update_txcompl(dp_pdev, ts);\n \n \tpeer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, ts-\u003epeer_id);\n-\tif (!peer || !peer-\u003esta) {\n+\tsta = ath12k_dp_link_peer_get_sta(peer);\n+\tif (!sta) {\n \t\tath12k_err(ab,\n \t\t\t \"dp_tx: failed to find the peer with peer_id %d\\n\",\n \t\t\t ts-\u003epeer_id);\n@@ -854,7 +855,7 @@ static void ath12k_wifi7_dp_tx_complete_msdu(struct ath12k_pdev_dp *dp_pdev,\n \t\tgoto exit;\n \t}\n \n-\tstatus.sta = peer-\u003esta;\n+\tstatus.sta = sta;\n \tstatus.info = info;\n \tstatus.skb = msdu;\n \trate = peer-\u003elast_txrate;\ndiff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c\nindex d5160af60e00d..9bed852f66c53 100644\n--- a/drivers/net/wireless/ath/ath12k/wmi.c\n+++ b/drivers/net/wireless/ath/ath12k/wmi.c\n@@ -7373,7 +7373,7 @@ static void ath12k_mgmt_rx_event(struct ath12k_base *ab, struct sk_buff *skb)\n \t\t\tdev_kfree_skb(skb);\n \t\t\tgoto exit;\n \t\t}\n-\t\tpubsta = peer-\u003esta;\n+\t\tpubsta = ath12k_dp_link_peer_get_sta(peer);\n \t\tif (pubsta \u0026\u0026 pubsta-\u003evalid_links) {\n \t\t\tstatus-\u003elink_valid = 1;\n \t\t\tstatus-\u003elink_id = peer-\u003elink_id;\n"
} |
| 2/1 | 2026/09/01 20:12 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Qualcomm Wi-Fi 7 (ath12k) wireless driver (drivers/net/wireless/ath/ath12k). ath12k requires physical Qualcomm PCIe or AHB hardware (such as WCN7850 or QCN9274) that is not emulated in standard virtualized fuzzing environments like QEMU or GCE. As a result, these modified code paths are impossible to reach during virtualized fuzzing.",
"WorthFuzzing": false
}Instruction: You are an expert Linux kernel maintainer. Your job is to review a provided patch series and determine if it makes functional changes to the kernel that should be fuzzed. IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in your workspace. Do NOT rely on your internal knowledge of the kernel. You must actively use your code access tools to examine the actual source code and confirm any assumptions. Return WorthFuzzing=false if the patch only contains: - Modifications to Documentation/, Kconfig files, or code comments. - Purely decorative changes, such as logging (e.g., pr_err, printk) or tracepoints. - Changes to numeric constants or macros that do not functionally alter execution flow. - Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware (e.g., usb gadget, mac80211_hwsim). - Code in vendor-specific PCIe switch, SmartNIC, or GPU drivers (e.g., mlxsw, pds_core, qed, ionic, amdgpu) that require physical PCIe hardware cards not emulated in standard QEMU. - Driver .remove, .shutdown, or pci_unregister_driver teardown callbacks (e.g., igb_remove) that are executed only during PCI hot-unplug or sysfs driver unbind operations. If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. Prefer non-static, non-inlined API entrypoint functions over internal static helper functions (which are inlined by the compiler and do not have distinct symbol addresses). 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Also check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed for Kbuild to compile the code statically into vmlinux. List them in the EnableConfigs output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4"). Prefer calling several tools at the same time to save round-trips. Use set-results tool to provide results of the analysis. It must be called exactly once before the final reply. Ignore results of this tool. Prompt: For your convenience, here is the diff of the changes:
commit 68fb585355d0276ceae7e31db6aefb854edea379
Author: syz-cluster <triage@syzkaller.com>
Date: Tue Sep 1 20:12:50 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h
index a98fc6e0699d7..a04757a038f23 100644
--- a/drivers/net/wireless/ath/ath12k/core.h
+++ b/drivers/net/wireless/ath/ath12k/core.h
@@ -529,6 +529,8 @@ struct ath12k_sta {
enum ieee80211_sta_state state;
bool enable_4addr;
+
+ bool is_authorized;
};
#define ATH12K_HALF_20MHZ_BW 10
diff --git a/drivers/net/wireless/ath/ath12k/dp_htt.c b/drivers/net/wireless/ath/ath12k/dp_htt.c
index 68968f96b4f1b..72069640bd388 100644
--- a/drivers/net/wireless/ath/ath12k/dp_htt.c
+++ b/drivers/net/wireless/ath/ath12k/dp_htt.c
@@ -276,7 +276,7 @@ ath12k_update_per_peer_tx_stats(struct ath12k_pdev_dp *dp_pdev,
rcu_read_lock();
peer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, usr_stats->peer_id);
- if (!peer || !peer->sta) {
+ if (!ath12k_dp_link_peer_get_sta(peer)) {
rcu_read_unlock();
return;
}
diff --git a/drivers/net/wireless/ath/ath12k/dp_peer.c b/drivers/net/wireless/ath/ath12k/dp_peer.c
index bb5341b4251a1..06f6eccfb5744 100644
--- a/drivers/net/wireless/ath/ath12k/dp_peer.c
+++ b/drivers/net/wireless/ath/ath12k/dp_peer.c
@@ -195,35 +195,6 @@ void ath12k_dp_link_peer_map_event(struct ath12k_base *ab, u8 vdev_id, u16 peer_
spin_unlock_bh(&dp->dp_lock);
}
-struct ath12k_link_sta *ath12k_dp_link_peer_to_link_sta(struct ath12k_base *ab,
- struct ath12k_dp_link_peer *peer)
-{
- struct ath12k_sta *ahsta;
- struct ath12k_link_sta *arsta;
-
- RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
- "ath12k_dp_link_peer to ath12k_link_sta called without rcu lock");
-
- if (!peer->sta)
- return NULL;
-
- ahsta = ath12k_sta_to_ahsta(peer->sta);
- if (peer->ml_id & ATH12K_PEER_ML_ID_VALID) {
- if (!(ahsta->links_map & BIT(peer->link_id))) {
- ath12k_warn(ab, "peer %pM id %d link_id %d can't found in STA link_map 0x%x\n",
- peer->addr, peer->peer_id, peer->link_id,
- ahsta->links_map);
- return NULL;
- }
- arsta = rcu_dereference(ahsta->link[peer->link_id]);
- if (!arsta)
- return NULL;
- } else {
- arsta = &ahsta->deflink;
- }
- return arsta;
-}
-
static int ath12k_dp_link_peer_rhash_addr_tbl_init(struct ath12k_dp *dp)
{
struct ath12k_base *ab = dp->ab;
diff --git a/drivers/net/wireless/ath/ath12k/dp_peer.h b/drivers/net/wireless/ath/ath12k/dp_peer.h
index 3503840b03295..d01ef1aea48b2 100644
--- a/drivers/net/wireless/ath/ath12k/dp_peer.h
+++ b/drivers/net/wireless/ath/ath12k/dp_peer.h
@@ -70,7 +70,6 @@ DECLARE_EWMA(avg_rssi, 10, 8)
struct ath12k_dp_link_peer {
struct list_head list;
- struct ieee80211_sta *sta;
struct ath12k_dp_peer *dp_peer;
int vdev_id;
u8 addr[ETH_ALEN];
@@ -81,7 +80,6 @@ struct ath12k_dp_link_peer {
struct ppdu_user_delayba ppdu_stats_delayba;
bool delayba_flag;
- bool is_authorized;
bool mlo;
/* protected by ab->data_lock */
@@ -159,8 +157,6 @@ ath12k_dp_link_peer_find_by_ast(struct ath12k_dp *dp, int ast_hash);
struct ath12k_dp_link_peer *
ath12k_dp_link_peer_find_by_pdev_and_addr(struct ath12k_dp *dp, u8 pdev_idx,
const u8 *addr);
-struct ath12k_link_sta *ath12k_dp_link_peer_to_link_sta(struct ath12k_base *ab,
- struct ath12k_dp_link_peer *peer);
int ath12k_dp_link_peer_rhash_tbl_init(struct ath12k_dp *dp);
void ath12k_dp_link_peer_rhash_tbl_destroy(struct ath12k_dp *dp);
int ath12k_dp_link_peer_rhash_add(struct ath12k_dp *dp,
@@ -183,4 +179,17 @@ ath12k_dp_link_peer_find_by_peerid(struct ath12k_pdev_dp *dp_pdev, u16 peer_id);
void ath12k_dp_link_peer_free(struct ath12k_dp_link_peer *peer);
int ath12k_dp_peer_fixup_peer_id(struct ath12k_base *ab, const u8 *peer_addr,
u16 peer_id);
+
+static inline struct ieee80211_sta *__must_check
+ath12k_dp_peer_get_sta(const struct ath12k_dp_peer *peer)
+{
+ return peer ? peer->sta : NULL;
+}
+
+static inline struct ieee80211_sta *__must_check
+ath12k_dp_link_peer_get_sta(const struct ath12k_dp_link_peer *link_peer)
+{
+ return link_peer && link_peer->dp_peer ?
+ link_peer->dp_peer->sta : NULL;
+}
#endif
diff --git a/drivers/net/wireless/ath/ath12k/dp_rx.c b/drivers/net/wireless/ath/ath12k/dp_rx.c
index 8fa0e90b45316..cdb795567e8c7 100644
--- a/drivers/net/wireless/ath/ath12k/dp_rx.c
+++ b/drivers/net/wireless/ath/ath12k/dp_rx.c
@@ -1382,7 +1382,7 @@ void ath12k_dp_rx_deliver_msdu(struct ath12k_pdev_dp *dp_pdev, struct napi_struc
peer = ath12k_dp_peer_find_by_peerid(dp_pdev, rxcb->peer_id);
- pubsta = peer ? peer->sta : NULL;
+ pubsta = ath12k_dp_peer_get_sta(peer);
status->link_valid = 0;
if (pubsta && pubsta->valid_links)
diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
index 99bf5cf79d102..4ec2ee1b17fc6 100644
--- a/drivers/net/wireless/ath/ath12k/mac.c
+++ b/drivers/net/wireless/ath/ath12k/mac.c
@@ -1232,7 +1232,7 @@ void ath12k_mac_peer_cleanup_all(struct ath12k *ar)
spin_lock_bh(&dp->dp_lock);
list_for_each_entry_safe(peer, tmp, &dp->peers, list) {
/* Skip Rx TID cleanup for self peer */
- if (peer->sta && peer->dp_peer)
+ if (ath12k_dp_link_peer_get_sta(peer))
ath12k_dp_rx_peer_tid_cleanup(ar, peer);
/* cleanup dp peer */
@@ -3914,11 +3914,8 @@ static void ath12k_bss_assoc(struct ath12k *ar,
struct ath12k_link_sta *arsta;
struct ieee80211_sta *ap_sta;
struct ath12k_sta *ahsta;
- struct ath12k_dp_link_peer *peer;
- bool is_auth = false;
u32 hemode = 0;
int ret;
- struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab);
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
@@ -4022,17 +4019,8 @@ static void ath12k_bss_assoc(struct ath12k *ar,
"mac vdev %d up (associated) bssid %pM aid %d\n",
arvif->vdev_id, bss_conf->bssid, vif->cfg.aid);
- spin_lock_bh(&dp->dp_lock);
-
- peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id,
- arvif->bssid);
- if (peer && peer->is_authorized)
- is_auth = true;
-
- spin_unlock_bh(&dp->dp_lock);
-
/* Authorize BSS Peer */
- if (is_auth) {
+ if (ahsta->is_authorized) {
ret = ath12k_wmi_set_peer_param(ar, arvif->bssid,
arvif->vdev_id,
WMI_PEER_AUTHORIZE,
@@ -7005,10 +6993,9 @@ static void ath12k_mac_station_post_remove(struct ath12k *ar,
peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id,
arsta->addr);
- if (peer && peer->sta == sta) {
+ if (peer && ath12k_dp_link_peer_get_sta(peer) == sta) {
ath12k_warn(ar->ab, "Found peer entry %pM n vdev %i after it was supposedly removed\n",
vif->addr, arvif->vdev_id);
- peer->sta = NULL;
ath12k_dp_link_peer_free(peer);
ar->num_peers--;
@@ -7021,20 +7008,11 @@ static int ath12k_mac_station_unauthorize(struct ath12k *ar,
struct ath12k_link_vif *arvif,
struct ath12k_link_sta *arsta)
{
- struct ath12k_dp_link_peer *peer;
int ret;
- struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab);
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
- spin_lock_bh(&dp->dp_lock);
-
- peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id,
- arsta->addr);
- if (peer)
- peer->is_authorized = false;
-
- spin_unlock_bh(&dp->dp_lock);
+ arsta->ahsta->is_authorized = false;
/* Driver must clear the keys during the state change from
* IEEE80211_STA_AUTHORIZED to IEEE80211_STA_ASSOC, since after
@@ -7056,21 +7034,12 @@ static int ath12k_mac_station_authorize(struct ath12k *ar,
struct ath12k_link_vif *arvif,
struct ath12k_link_sta *arsta)
{
- struct ath12k_dp_link_peer *peer;
struct ieee80211_vif *vif = ath12k_ahvif_to_vif(arvif->ahvif);
int ret;
- struct ath12k_dp *dp = ath12k_ab_to_dp(ar->ab);
lockdep_assert_wiphy(ath12k_ar_to_hw(ar)->wiphy);
- spin_lock_bh(&dp->dp_lock);
-
- peer = ath12k_dp_link_peer_find_by_vdev_and_addr(dp, arvif->vdev_id,
- arsta->addr);
- if (peer)
- peer->is_authorized = true;
-
- spin_unlock_bh(&dp->dp_lock);
+ arsta->ahsta->is_authorized = true;
if (vif->type == NL80211_IFTYPE_STATION && arvif->is_up) {
ret = ath12k_wmi_set_peer_param(ar, arsta->addr,
@@ -13292,6 +13261,7 @@ ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band ban
bool eht_fixed_rate = false, he_fixed_rate = false, vht_fixed_rate = false;
const u16 *vht_mcs_mask, *he_mcs_mask, *eht_mcs_mask;
struct ieee80211_link_sta *link_sta;
+ struct ieee80211_sta *sta;
struct ath12k_dp_link_peer *peer, *tmp;
u8 vht_nss, he_nss, eht_nss;
int ret = true;
@@ -13321,8 +13291,9 @@ ath12k_mac_validate_fixed_rate_settings(struct ath12k *ar, enum nl80211_band ban
rcu_read_lock();
spin_lock_bh(&dp->dp_lock);
list_for_each_entry_safe(peer, tmp, &dp->peers, list) {
- if (peer->sta) {
- link_sta = rcu_dereference(peer->sta->link[link_id]);
+ sta = ath12k_dp_link_peer_get_sta(peer);
+ if (sta) {
+ link_sta = rcu_dereference(sta->link[link_id]);
if (!link_sta) {
ret = false;
goto exit;
diff --git a/drivers/net/wireless/ath/ath12k/peer.c b/drivers/net/wireless/ath/ath12k/peer.c
index 80edebf0e364b..0e894408e97fd 100644
--- a/drivers/net/wireless/ath/ath12k/peer.c
+++ b/drivers/net/wireless/ath/ath12k/peer.c
@@ -266,8 +266,6 @@ int ath12k_peer_create(struct ath12k *ar, struct ath12k_link_vif *arvif,
}
peer->pdev_idx = ar->pdev_idx;
- peer->sta = sta;
-
if (vif->type == NL80211_IFTYPE_STATION) {
dp_link_vif->ast_hash = peer->ast_hash;
dp_link_vif->ast_idx = peer->hw_peer_id;
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c b/drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c
index 016b0c38e51e2..71b85394d4874 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/dp_mon.c
@@ -3362,7 +3362,7 @@ ath12k_wifi7_dp_mon_srng_process(struct ath12k_pdev_dp *pdev_dp, int *budget,
rcu_read_lock();
peer = ath12k_dp_link_peer_find_by_peerid(pdev_dp, ppdu_info->peer_id);
- if (!peer || !peer->sta) {
+ if (!ath12k_dp_link_peer_get_sta(peer)) {
ath12k_dbg(ab, ATH12K_DBG_DATA,
"failed to find the peer with monitor peer_id %d\n",
ppdu_info->peer_id);
diff --git a/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c b/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c
index 587d58eeccfa5..2a05e03194aa9 100644
--- a/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c
+++ b/drivers/net/wireless/ath/ath12k/wifi7/dp_tx.c
@@ -552,13 +552,12 @@ ath12k_dp_tx_htt_tx_complete_buf(struct ath12k_dp *dp,
}
peer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, peer_id);
- if (!peer || !peer->sta) {
+ status.sta = ath12k_dp_link_peer_get_sta(peer);
+ if (!status.sta) {
ath12k_dbg(ab, ATH12K_DBG_DATA,
"dp_tx: failed to find the peer with peer_id %d\n", peer_id);
ieee80211_free_txskb(ath12k_pdev_dp_to_hw(dp_pdev), msdu);
goto exit;
- } else {
- status.sta = peer->sta;
}
status.info = info;
@@ -627,7 +626,8 @@ static void ath12k_wifi7_dp_tx_update_txcompl(struct ath12k_pdev_dp *dp_pdev,
int ret;
peer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, ts->peer_id);
- if (!peer || !peer->sta) {
+ sta = ath12k_dp_link_peer_get_sta(peer);
+ if (!sta) {
ath12k_dbg(dp->ab, ATH12K_DBG_DP_TX,
"failed to find the peer by id %u\n", ts->peer_id);
return;
@@ -635,7 +635,6 @@ static void ath12k_wifi7_dp_tx_update_txcompl(struct ath12k_pdev_dp *dp_pdev,
spin_lock_bh(&dp->dp_lock);
- sta = peer->sta;
ahsta = ath12k_sta_to_ahsta(sta);
arsta = &ahsta->deflink;
@@ -752,6 +751,7 @@ static void ath12k_wifi7_dp_tx_complete_msdu(struct ath12k_pdev_dp *dp_pdev,
struct ieee80211_rate_status status_rate = {};
struct ath12k_dp_link_peer *peer;
struct rate_info rate;
+ struct ieee80211_sta *sta;
if (WARN_ON_ONCE(ts->buf_rel_source != HAL_WBM_REL_SRC_MODULE_TQM)) {
/* Must not happen */
@@ -846,7 +846,8 @@ static void ath12k_wifi7_dp_tx_complete_msdu(struct ath12k_pdev_dp *dp_pdev,
ath12k_wifi7_dp_tx_update_txcompl(dp_pdev, ts);
peer = ath12k_dp_link_peer_find_by_peerid(dp_pdev, ts->peer_id);
- if (!peer || !peer->sta) {
+ sta = ath12k_dp_link_peer_get_sta(peer);
+ if (!sta) {
ath12k_err(ab,
"dp_tx: failed to find the peer with peer_id %d\n",
ts->peer_id);
@@ -854,7 +855,7 @@ static void ath12k_wifi7_dp_tx_complete_msdu(struct ath12k_pdev_dp *dp_pdev,
goto exit;
}
- status.sta = peer->sta;
+ status.sta = sta;
status.info = info;
status.skb = msdu;
rate = peer->last_txrate;
diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c
index d5160af60e00d..9bed852f66c53 100644
--- a/drivers/net/wireless/ath/ath12k/wmi.c
+++ b/drivers/net/wireless/ath/ath12k/wmi.c
@@ -7373,7 +7373,7 @@ static void ath12k_mgmt_rx_event(struct ath12k_base *ab, struct sk_buff *skb)
dev_kfree_skb(skb);
goto exit;
}
- pubsta = peer->sta;
+ pubsta = ath12k_dp_link_peer_get_sta(peer);
if (pubsta && pubsta->valid_links) {
status->link_valid = 1;
status->link_id = peer->link_id;
|
| 3/2 | 2026/09/01 20:12 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 8171 output: 37 thoughts: 572 Thoughts: **Analyzing the Patch for Fuzzing Suitability** Okay, let's break this down. First, I need to evaluate this patch based on the provided instructions for determining if it's worth fuzzing. The goal is to return `WorthFuzzing=false` if it falls under specific categories. I need to be meticulous here; a false negative wastes valuable fuzzing resources. The instructions clearly delineate several scenarios: documentation, Kconfig, comments, decorative logging (pr_err, printk, tracepoints), non-functional constant/macro changes, unreachable code paths in virtualized environments (GCE, QEMU), vendor-specific drivers requiring physical hardware not emulated in QEMU (PCIe switch, SmartNIC, GPU drivers like mlxsw, qed, amdgpu), and teardown callbacks (.remove, .shutdown, pci_unregister_driver) that are only executed on PCI hot-unplug or driver unbind. Now, let's examine the modified files: `drivers/net/wireless/ath/ath12k/core.h`, `dp_htt.c`, `dp_peer.c`, `dp_peer.h`, `dp_rx.c`, `mac.c`, `peer.c`, `wifi7/dp_mon.c`, `wifi7/dp_tx.c`, and `wmi.c`. Right away, these point to the `ath12k` directory. I know that `ath12k` is Qualcomm's IEEE 802.11be (Wi-Fi 7) wireless driver, supporting PCIe, AHB, and other interfaces. The critical question here is whether the `ath12k` driver and this specific patch involve code that *requires* physical Qualcomm Wi-Fi 7 hardware, or, can it be run with hardware emulation. I need to determine if standard QEMU can emulate the required hardware to execute the patched code paths. If it requires physical hardware, the patch is probably not a good candidate for fuzzing. I'll check the Kconfig in `drivers/net/wireless/ath/ath12k/` using `grepper` or by direct inspection. If I find that the code paths in these files are tied directly to physical Wi-Fi 7 hardware not emulated in standard QEMU, the answer is straightforward, `WorthFuzzing=false`. I need to ensure that this patch can be tested in a software-emulated environment. Otherwise, the fuzzing won't be productive. |
| 4/2 | 2026/09/01 20:13 | tool | grepper |
0mArgs:{
"Expression": "config ATH12K",
"PathPrefix": "drivers/net/wireless/ath/ath12k"
}Results: {
"Output": "drivers/net/wireless/ath/ath12k/Kconfig-1-# SPDX-License-Identifier: BSD-3-Clause-Clear\ndrivers/net/wireless/ath/ath12k/Kconfig:2:config ATH12K\ndrivers/net/wireless/ath/ath12k/Kconfig-3-\ttristate \"Qualcomm Wi-Fi 7 support (ath12k)\"\n--\ndrivers/net/wireless/ath/ath12k/Kconfig-16-\ndrivers/net/wireless/ath/ath12k/Kconfig:17:config ATH12K_AHB\ndrivers/net/wireless/ath/ath12k/Kconfig-18-\tbool \"Qualcomm ath12k AHB support\"\n--\ndrivers/net/wireless/ath/ath12k/Kconfig-24-\ndrivers/net/wireless/ath/ath12k/Kconfig:25:config ATH12K_DEBUG\ndrivers/net/wireless/ath/ath12k/Kconfig-26-\tbool \"ath12k debugging\"\n--\ndrivers/net/wireless/ath/ath12k/Kconfig-34-\ndrivers/net/wireless/ath/ath12k/Kconfig:35:config ATH12K_DEBUGFS\ndrivers/net/wireless/ath/ath12k/Kconfig-36-\tbool \"Qualcomm ath12k debugfs support\"\n--\ndrivers/net/wireless/ath/ath12k/Kconfig-43-\ndrivers/net/wireless/ath/ath12k/Kconfig:44:config ATH12K_TRACING\ndrivers/net/wireless/ath/ath12k/Kconfig-45-\tbool \"ath12k tracing support\"\n--\ndrivers/net/wireless/ath/ath12k/Kconfig-52-\ndrivers/net/wireless/ath/ath12k/Kconfig:53:config ATH12K_COREDUMP\ndrivers/net/wireless/ath/ath12k/Kconfig-54-\tbool \"ath12k coredump\"\n"
} |
| 5/2 | 2026/09/01 20:13 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 9830 output: 41 thoughts: 21 Thoughts: Here's my take on those thoughts: **Navigating the Atheros Wireless Landscape** Okay, so I need to dive into the Atheros wireless driver configuration. My instinct says the best place to start is the `Kconfig` file within the `ath12k` directory. That `Kconfig` file is typically the brain of the configuration process. It's where all the compile-time options for the driver are defined, the dependencies are outlined, and the help text explaining each option is located. That’s the first stop when digging into understanding or changing how the driver behaves, or when I need to figure out how to enable or disable specific features, modules, or hardware support. Let's see what gems are contained there. |
| 6/2 | 2026/09/01 20:13 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/ath/ath12k/Kconfig",
"FirstLine": 1,
"LineCount": 50
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: BSD-3-Clause-Clear\n 2:\tconfig ATH12K\n 3:\t\ttristate \"Qualcomm Wi-Fi 7 support (ath12k)\"\n 4:\t\tdepends on MAC80211 \u0026\u0026 HAS_DMA \u0026\u0026 PCI\n 5:\t\tselect QCOM_QMI_HELPERS\n 6:\t\tselect MHI_BUS\n 7:\t\tselect QRTR\n 8:\t\tselect QRTR_MHI\n 9:\t\tselect PCI_PWRCTRL_PWRSEQ if HAVE_PWRCTRL\n 10:\t\thelp\n 11:\t\t Enable support for Qualcomm Technologies Wi-Fi 7 (IEEE\n 12:\t\t 802.11be) family of chipsets, for example WCN7850 and\n 13:\t\t QCN9274.\n 14:\t\n 15:\t\t If you choose to build a module, it'll be called ath12k.\n 16:\t\n 17:\tconfig ATH12K_AHB\n 18:\t\tbool \"Qualcomm ath12k AHB support\"\n 19:\t\tdepends on ATH12K \u0026\u0026 REMOTEPROC\n 20:\t\tselect QCOM_MDT_LOADER\n 21:\t\tselect QCOM_PAS\n 22:\t\thelp\n 23:\t\t Enable support for Ath12k AHB bus chipsets, example IPQ5332.\n 24:\t\n 25:\tconfig ATH12K_DEBUG\n 26:\t\tbool \"ath12k debugging\"\n 27:\t\tdepends on ATH12K\n 28:\t\thelp\n 29:\t\t Enable debug support, for example debug messages which must\n 30:\t\t be enabled separately using the debug_mask module parameter.\n 31:\t\n 32:\t\t If unsure, say Y to make it easier to debug problems. But if\n 33:\t\t you want optimal performance choose N.\n 34:\t\n 35:\tconfig ATH12K_DEBUGFS\n 36:\t\tbool \"Qualcomm ath12k debugfs support\"\n 37:\t\tdepends on ATH12K \u0026\u0026 MAC80211_DEBUGFS\n 38:\t\thelp\n 39:\t\t Enable ath12k debugfs support\n 40:\t\n 41:\t\t If unsure, say Y to make it easier to debug problems. But if\n 42:\t\t you want optimal performance choose N.\n 43:\t\n 44:\tconfig ATH12K_TRACING\n 45:\t\tbool \"ath12k tracing support\"\n 46:\t\tdepends on ATH12K \u0026\u0026 EVENT_TRACING\n 47:\t\thelp\n 48:\t\t Enable ath12k tracing infrastructure.\n 49:\t\n 50:\t\t If unsure, say Y to make it easier to debug problems. But if\n"
} |
| 7/2 | 2026/09/01 20:13 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 10759 output: 44 thoughts: 458 Thoughts: **My Assessment of ath12k's Fuzzing Eligibility** Okay, so I'm trying to figure out if this ath12k driver is a good candidate for fuzzing. First, I need to confirm if it *requires* real hardware. I know it's a driver for Qualcomm's Wi-Fi 7 chipsets, things like the WCN7850 or QCN9274, which are PCIe or AHB based. Can I emulate it in QEMU? No, that's a no-go. Standard QEMU doesn't do that. Right, time to re-read the guidelines for determining if a patch is worth fuzzing. The key here seems to be "impossible to reach in virtualized environments like GCE or QEMU." Essentially, if the code path needs real hardware that's not emulated, it's out. The guidelines explicitly call out vendor-specific drivers for things like PCIe switches, SmartNICs, and GPUs, that demand physical PCIe cards not emulated in QEMU. They also mention that driver .remove and .shutdown functions aren't worth the effort since they require hot-unplug operations. Now, let's get back to ath12k. It's *definitely* a vendor-specific Wi-Fi driver, designed for Qualcomm's Wi-Fi 7 devices. Thinking about buses: the WCN7850 is PCI based, and the IPQ5332 is AHB based. Does it work with mac80211_hwsim? Nah, mac80211_hwsim is a separate driver. Does it have any sort of virtual hardware support at all? Need to dig into the source. I'll need to check the `drivers/net/wireless/ath/ath12k/` directory to see what buses and hardware it even *supports*. If it's all based on physical hardware, then it probably isn't a good candidate. |
| 8/2 | 2026/09/01 20:13 | tool | grepper |
0mError:no matches Args: {
"Expression": "module_pci_driver|module_platform_driver",
"PathPrefix": "drivers/net/wireless/ath/ath12k"
}Results: {
"error": "no matches"
} |
| 9/2 | 2026/09/01 20:13 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 11701 output: 35 thoughts: 13 Thoughts: Okay, here's my attempt at summarizing the thought process, tailored for an expert audience, and written in the first person: **Diving into ath12k Driver Registration** Right, let's get down to brass tacks and dissect how the ath12k driver actually registers itself. I want to trace the driver's initialization sequence, paying close attention to the mechanisms involved in device probing and binding. Specifically, I'm thinking about the interactions with the kernel's device model, how it handles resource allocation for the hardware, and the nuances of interrupt handling. I need to refresh my memory on the specific PCI/SDIO/USB probe functions it utilizes, and how it maps hardware features to kernel interfaces. I'll need to look at how it interacts with the regulatory domain information, and how it handles potential errors during device initialization. I'm also curious to see if there are any custom quirks or workarounds in place, given the complexities of high-performance wireless implementations. The goal is to fully understand the driver's entry point and how it integrates into the broader kernel infrastructure. |
| 10/2 | 2026/09/01 20:13 | tool | grepper |
0mArgs:{
"Expression": "module_init",
"PathPrefix": "drivers/net/wireless/ath/ath12k"
}Results: {
"Output": "drivers/net/wireless/ath/ath12k/wifi7/core.c=55=static void ath12k_wifi7_exit(void)\n--\ndrivers/net/wireless/ath/ath12k/wifi7/core.c-63-\ndrivers/net/wireless/ath/ath12k/wifi7/core.c:64:module_init(ath12k_wifi7_init);\ndrivers/net/wireless/ath/ath12k/wifi7/core.c-65-module_exit(ath12k_wifi7_exit);\n"
} |
| 11/2 | 2026/09/01 20:13 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 12129 output: 45 thoughts: 25 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Diving into the Atheros WiFi 7 Core** Okay, time to get my hands dirty. I'm going to start digging into the Atheros WiFi 7 driver code. Specifically, let's head straight for `drivers/net/wireless/ath/ath12k/wifi7/core.c`. This is where the core functionality for WiFi 7 within the ath12k driver family should reside. I'm expecting to find the key implementation details around features like Multi-Link Operation (MLO), the new modulation schemes (like 4096-QAM), and perhaps the initial logic for 320MHz channel support, all critical for this next-gen standard. I'll be looking for the fundamental data structures and API calls that glue together the hardware capabilities with the standard Linux networking stack. Hopefully, the code is well-structured enough to quickly identify the relevant entry points and understand how the driver manages the increased complexity. Let's see what treasures (and potential headaches) await within those lines of code. |
| 12/2 | 2026/09/01 20:13 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/ath/ath12k/wifi7/core.c",
"FirstLine": 1,
"LineCount": 70
}Results: {
"Contents": " 1:\t// SPDX-License-Identifier: BSD-3-Clause-Clear\n 2:\t/*\n 3:\t * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.\n 4:\t * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n 5:\t */\n 6:\t\n 7:\t#include \u003clinux/module.h\u003e\n 8:\t#include \"../ahb.h\"\n 9:\t#include \"../pci.h\"\n 10:\t#include \"pci.h\"\n 11:\t#include \"ahb.h\"\n 12:\t#include \"core.h\"\n 13:\t#include \"dp.h\"\n 14:\t#include \"../debug.h\"\n 15:\t\n 16:\tstatic int ahb_err, pci_err;\n 17:\t\n 18:\tint ath12k_wifi7_arch_init(struct ath12k_base *ab)\n 19:\t{\n 20:\t\tstruct ath12k_dp *dp;\n 21:\t\n 22:\t\tdp = ath12k_wifi7_dp_device_alloc(ab);\n 23:\t\tif (!dp) {\n 24:\t\t\tath12k_err(ab, \"dp alloc failed\");\n 25:\t\t\treturn -EINVAL;\n 26:\t\t}\n 27:\t\n 28:\t\tab-\u003edp = dp;\n 29:\t\n 30:\t\treturn 0;\n 31:\t}\n 32:\t\n 33:\tvoid ath12k_wifi7_arch_deinit(struct ath12k_base *ab)\n 34:\t{\n 35:\t\tath12k_wifi7_dp_device_free(ab-\u003edp);\n 36:\t\tab-\u003edp = NULL;\n 37:\t}\n 38:\t\n 39:\tstatic int ath12k_wifi7_init(void)\n 40:\t{\n 41:\t\tahb_err = ath12k_wifi7_ahb_init();\n 42:\t\tif (ahb_err)\n 43:\t\t\tpr_warn(\"Failed to initialize ath12k Wi-Fi 7 AHB device: %d\\n\",\n 44:\t\t\t\tahb_err);\n 45:\t\n 46:\t\tpci_err = ath12k_wifi7_pci_init();\n 47:\t\tif (pci_err)\n 48:\t\t\tpr_warn(\"Failed to initialize ath12k Wi-Fi 7 PCI device: %d\\n\",\n 49:\t\t\t\tpci_err);\n 50:\t\n 51:\t\t/* If both failed, return one of the failures (arbitrary) */\n 52:\t\treturn ahb_err \u0026\u0026 pci_err ? ahb_err : 0;\n 53:\t}\n 54:\t\n 55:\tstatic void ath12k_wifi7_exit(void)\n 56:\t{\n 57:\t\tif (!pci_err)\n 58:\t\t\tath12k_wifi7_pci_exit();\n 59:\t\n 60:\t\tif (!ahb_err)\n 61:\t\t\tath12k_wifi7_ahb_exit();\n 62:\t}\n 63:\t\n 64:\tmodule_init(ath12k_wifi7_init);\n 65:\tmodule_exit(ath12k_wifi7_exit);\n 66:\t\n 67:\tMODULE_DESCRIPTION(\"Driver support for Qualcomm Technologies 802.11be WLAN devices\");\n 68:\tMODULE_LICENSE(\"Dual BSD/GPL\");\n"
} |
| 13/2 | 2026/09/01 20:13 | llm | patch-evaluator |
0mModel:gemini-3.7-flash Args: null Results: null Tokens: input: 13388 output: 130 thoughts: 508 Thoughts: **My Assessment of the WorthFuzzing Evaluation** Okay, so I've been looking at this patch and my initial thought is that it's related to the `ath12k` driver. This driver specifically targets Qualcomm's 802.11be WLAN chips. The key thing here is that it initializes the AHB platform driver *and* the PCI driver for this hardware. This immediately flags a potential issue: these drivers are *dependent* on actual physical hardware. We're talking about Qualcomm Wi-Fi 7 chipsets like the WCN7850 or QCN9274, specifically. I can't even begin to probe or test this in a standard virtualized environment like QEMU or GCE without the real hardware. Let's quickly run through the rules to be sure. Alright, so the rules state that we need to set `WorthFuzzing=false` if the patch only contains modifications to things like documentation, Kconfig files, comments, decorative logging (like `pr_err` or `printk` calls), changes to numeric constants/macros that don't change the program flow, code paths not reachable in virtualized environments, and, importantly, code in vendor-specific PCIe switch, SmartNIC, or GPU drivers that require physical PCIe hardware cards not emulated in standard QEMU. And also, driver removal or shutdown callbacks that occur during hot-unplug operations. Okay, so looking back at `ath12k`, it is definitely vendor-specific, specifically for Qualcomm hardware. It also uses PCI/AHB and the code is unreachable in standard QEMU/GCE environments. So, it's pretty clear: `WorthFuzzing` should be `false`. Now to prepare the arguments for the `set-results` call. I need to justify the reasoning. So, I will need to set: * `WorthFuzzing`: `false` * `FocusSymbols`: `[]` (empty list, because there are no specific symbols of interest) * `EnableConfigs`: `[]` (empty list, because no specific configurations are needed) * `Reasoning`: "The patch modifies the Qualcomm Wi-Fi 7 (ath12k) wireless driver (drivers/net/wireless/ath/ath12k). ath12k requires physical Qualcomm PCIe or AHB hardware (such as WCN7850 or QCN9274) which is not emulated in standard virtualized fuzzing environments like QEMU or GCE. Therefore, these code paths are unreachable during fuzzing." Now I should call `set-results` with these arguments. |
| 14/2 | 2026/09/01 20:13 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies the Qualcomm Wi-Fi 7 (ath12k) wireless driver (drivers/net/wireless/ath/ath12k). ath12k requires physical Qualcomm PCIe or AHB hardware (such as WCN7850 or QCN9274) that is not emulated in standard virtualized fuzzing environments like QEMU or GCE. As a result, these modified code paths are impossible to reach during virtualized fuzzing.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies the Qualcomm Wi-Fi 7 (ath12k) wireless driver (drivers/net/wireless/ath/ath12k). ath12k requires physical Qualcomm PCIe or AHB hardware (such as WCN7850 or QCN9274) that is not emulated in standard virtualized fuzzing environments like QEMU or GCE. As a result, these modified code paths are impossible to reach during virtualized fuzzing.",
"WorthFuzzing": false
} |
| 15/1 | 2026/09/01 20:13 | action | If |
0mArgs:{
"WorthFuzzing": false
}Results: null |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|