AI Trajectory


Trajectory: (Expand/Collapse All)
Seq Timestamp Type Name Duration
0/0 2026/07/12 00:33 flow patch-triage
1m Args:
null

Results:
{
  "EnableConfigs": [
    "MWIFIEX",
    "MWIFIEX_USB"
  ],
  "FocusSymbols": [
    "mwifiex_search_oui_in_ie",
    "mwifiex_is_rsn_oui_present",
    "mwifiex_is_wpa_oui_present",
    "mwifiex_is_network_compatible",
    "mwifiex_check_network_compatibility",
    "mwifiex_update_curr_bss_params",
    "mwifiex_parse_single_response_buf",
    "mwifiex_ret_802_11_scan",
    "mwifiex_handle_event_ext_scan_report",
    "mwifiex_bss_start"
  ],
  "Reasoning": "The patch fixes an out-of-bounds read in `mwifiex_search_oui_in_ie` when parsing Wi-Fi Information Elements (IEs). This function is reachable when the driver processes scan results or events from the firmware. Since the mwifiex driver supports USB, the firmware responses can be fuzzed via the USB subsystem.",
  "WorthFuzzing": true
}

1/1 2026/07/12 00:33 action read-patch-diff
0m Args:
null

Results:
{
  "PatchDiff": "commit 2c55ecafa6f4a0b2c2aaa1a03790226a66e0811a\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate:   Sun Jul 12 00:33:18 2026 +0000\n\n    syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c\nindex 97c0ec3b822e70..3a55fc6f1b548e 100644\n--- a/drivers/net/wireless/marvell/mwifiex/scan.c\n+++ b/drivers/net/wireless/marvell/mwifiex/scan.c\n@@ -104,12 +104,21 @@ has_vendor_hdr(struct ieee_types_vendor_specific *ie, u8 key)\n  * a given oui in PTK.\n  */\n static u8\n-mwifiex_search_oui_in_ie(struct ie_body *iebody, u8 *oui)\n+mwifiex_search_oui_in_ie(struct ie_body *iebody, u8 *oui, int ie_len)\n {\n \tu8 count;\n \n+\t/* Need grp_key_oui[4] + ptk_cnt[2] before reading the OUI count. */\n+\tif (ie_len \u003c (int)offsetof(struct ie_body, ptk_body))\n+\t\treturn MWIFIEX_OUI_NOT_PRESENT;\n+\n \tcount = iebody-\u003eptk_cnt[0];\n \n+\t/* Reject an OUI count whose list would run past the element. */\n+\tif (offsetof(struct ie_body, ptk_body) +\n+\t    count * sizeof(iebody-\u003eptk_body) \u003e (size_t)ie_len)\n+\t\treturn MWIFIEX_OUI_NOT_PRESENT;\n+\n \t/* There could be multiple OUIs for PTK hence\n \t   1) Take the length.\n \t   2) Check all the OUIs for AES.\n@@ -143,11 +152,14 @@ mwifiex_is_rsn_oui_present(struct mwifiex_bssdescriptor *bss_desc, u32 cipher)\n \tu8 ret = MWIFIEX_OUI_NOT_PRESENT;\n \n \tif (has_ieee_hdr(bss_desc-\u003ebcn_rsn_ie, WLAN_EID_RSN)) {\n+\t\tint ie_len = (int)bss_desc-\u003ebcn_rsn_ie-\u003eieee_hdr.len -\n+\t\t\t     RSN_GTK_OUI_OFFSET;\n+\n \t\tiebody = (struct ie_body *)\n \t\t\t (((u8 *) bss_desc-\u003ebcn_rsn_ie-\u003edata) +\n \t\t\t  RSN_GTK_OUI_OFFSET);\n \t\toui = \u0026mwifiex_rsn_oui[cipher][0];\n-\t\tret = mwifiex_search_oui_in_ie(iebody, oui);\n+\t\tret = mwifiex_search_oui_in_ie(iebody, oui, ie_len);\n \t\tif (ret)\n \t\t\treturn ret;\n \t}\n@@ -169,10 +181,14 @@ mwifiex_is_wpa_oui_present(struct mwifiex_bssdescriptor *bss_desc, u32 cipher)\n \tu8 ret = MWIFIEX_OUI_NOT_PRESENT;\n \n \tif (has_vendor_hdr(bss_desc-\u003ebcn_wpa_ie, WLAN_EID_VENDOR_SPECIFIC)) {\n+\t\tint ie_len = (int)bss_desc-\u003ebcn_wpa_ie-\u003evend_hdr.len -\n+\t\t\t     (int)sizeof(bss_desc-\u003ebcn_wpa_ie-\u003evend_hdr.oui) -\n+\t\t\t     WPA_GTK_OUI_OFFSET;\n+\n \t\tiebody = (struct ie_body *)((u8 *)bss_desc-\u003ebcn_wpa_ie-\u003edata +\n \t\t\t\t\t    WPA_GTK_OUI_OFFSET);\n \t\toui = \u0026mwifiex_wpa_oui[cipher][0];\n-\t\tret = mwifiex_search_oui_in_ie(iebody, oui);\n+\t\tret = mwifiex_search_oui_in_ie(iebody, oui, ie_len);\n \t\tif (ret)\n \t\t\treturn ret;\n \t}\n"
}

2/1 2026/07/12 00:33 agent patch-evaluator
1m Model:
gemini-3.1-pro-preview

Args:
null

Results:
{
  "EnableConfigs": [
    "MWIFIEX",
    "MWIFIEX_USB"
  ],
  "FocusSymbols": [
    "mwifiex_search_oui_in_ie",
    "mwifiex_is_rsn_oui_present",
    "mwifiex_is_wpa_oui_present",
    "mwifiex_is_network_compatible",
    "mwifiex_check_network_compatibility",
    "mwifiex_update_curr_bss_params",
    "mwifiex_parse_single_response_buf",
    "mwifiex_ret_802_11_scan",
    "mwifiex_handle_event_ext_scan_report",
    "mwifiex_bss_start"
  ],
  "Reasoning": "The patch fixes an out-of-bounds read in `mwifiex_search_oui_in_ie` when parsing Wi-Fi Information Elements (IEs). This function is reachable when the driver processes scan results or events from the firmware. Since the mwifiex driver supports USB, the firmware responses can be fuzzed via the USB subsystem.",
  "WorthFuzzing": true
}

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).

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.
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.
   Do not list too generic configs (we already have them enabled). Only list those that
   specifically cover the modified code. 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 2c55ecafa6f4a0b2c2aaa1a03790226a66e0811a
Author: syz-cluster <triage@syzkaller.com>
Date:   Sun Jul 12 00:33:18 2026 +0000

    syz-cluster: applied patch under review

diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c
index 97c0ec3b822e70..3a55fc6f1b548e 100644
--- a/drivers/net/wireless/marvell/mwifiex/scan.c
+++ b/drivers/net/wireless/marvell/mwifiex/scan.c
@@ -104,12 +104,21 @@ has_vendor_hdr(struct ieee_types_vendor_specific *ie, u8 key)
  * a given oui in PTK.
  */
 static u8
-mwifiex_search_oui_in_ie(struct ie_body *iebody, u8 *oui)
+mwifiex_search_oui_in_ie(struct ie_body *iebody, u8 *oui, int ie_len)
 {
 	u8 count;
 
+	/* Need grp_key_oui[4] + ptk_cnt[2] before reading the OUI count. */
+	if (ie_len < (int)offsetof(struct ie_body, ptk_body))
+		return MWIFIEX_OUI_NOT_PRESENT;
+
 	count = iebody->ptk_cnt[0];
 
+	/* Reject an OUI count whose list would run past the element. */
+	if (offsetof(struct ie_body, ptk_body) +
+	    count * sizeof(iebody->ptk_body) > (size_t)ie_len)
+		return MWIFIEX_OUI_NOT_PRESENT;
+
 	/* There could be multiple OUIs for PTK hence
 	   1) Take the length.
 	   2) Check all the OUIs for AES.
@@ -143,11 +152,14 @@ mwifiex_is_rsn_oui_present(struct mwifiex_bssdescriptor *bss_desc, u32 cipher)
 	u8 ret = MWIFIEX_OUI_NOT_PRESENT;
 
 	if (has_ieee_hdr(bss_desc->bcn_rsn_ie, WLAN_EID_RSN)) {
+		int ie_len = (int)bss_desc->bcn_rsn_ie->ieee_hdr.len -
+			     RSN_GTK_OUI_OFFSET;
+
 		iebody = (struct ie_body *)
 			 (((u8 *) bss_desc->bcn_rsn_ie->data) +
 			  RSN_GTK_OUI_OFFSET);
 		oui = &mwifiex_rsn_oui[cipher][0];
-		ret = mwifiex_search_oui_in_ie(iebody, oui);
+		ret = mwifiex_search_oui_in_ie(iebody, oui, ie_len);
 		if (ret)
 			return ret;
 	}
@@ -169,10 +181,14 @@ mwifiex_is_wpa_oui_present(struct mwifiex_bssdescriptor *bss_desc, u32 cipher)
 	u8 ret = MWIFIEX_OUI_NOT_PRESENT;
 
 	if (has_vendor_hdr(bss_desc->bcn_wpa_ie, WLAN_EID_VENDOR_SPECIFIC)) {
+		int ie_len = (int)bss_desc->bcn_wpa_ie->vend_hdr.len -
+			     (int)sizeof(bss_desc->bcn_wpa_ie->vend_hdr.oui) -
+			     WPA_GTK_OUI_OFFSET;
+
 		iebody = (struct ie_body *)((u8 *)bss_desc->bcn_wpa_ie->data +
 					    WPA_GTK_OUI_OFFSET);
 		oui = &mwifiex_wpa_oui[cipher][0];
-		ret = mwifiex_search_oui_in_ie(iebody, oui);
+		ret = mwifiex_search_oui_in_ie(iebody, oui, ie_len);
 		if (ret)
 			return ret;
 	}

3/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 2656
							output: 36
							thoughts: 214
						

Thoughts:
**Analyzing a Wi-Fi Driver Patch: Security and Fuzzing Considerations**

Okay, so I'm looking at a patch for `drivers/net/wireless/marvell/mwifiex/scan.c`. It's a pretty straightforward fix – adding bounds checking to `mwifiex_search_oui_in_ie`. Seems like a standard defense against out-of-bounds reads when parsing Information Elements from Wi-Fi beacons or probe responses. Good, proactive security is always appreciated. It's functional code within a wireless driver, which is where things start to get interesting from a security perspective.

My immediate thought is, can we fuzz this? With Wi-Fi drivers, mac80211_hwsim is often the go-to. But, this is *mwifiex*, a specific hardware driver. So, the question becomes: can we fuzz *mwifiex* in a virtualized environment? That's the real challenge with hardware drivers, right? They're often tied to specific hardware. It's not always easy unless there is specific emulation for the hardware or it’s a USB, SDIO, or PCIe device, where we can potentially fuzz the bus.

Hmm, does mwifiex *have* USB support? That might open up some fuzzing possibilities. Let me check... Yep, the `drivers/net/wireless/marvell/mwifiex/usb.c` file exists. Okay, this is good. Time to dig a bit deeper and see what we can do with this driver and its USB interface. Maybe we're onto something here.



4/2 2026/07/12 00:33 tool grepper
0m Args:
{
  "Expression": "mwifiex",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 18528 lines.\nUse more precise expression if possible.\n\ndrivers/net/wireless/marvell/mwifiex/11ac.c=42=static u16\ndrivers/net/wireless/marvell/mwifiex/11ac.c:43:mwifiex_convert_mcsmap_to_maxrate(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11ac.c-44-\t\t\t\t  u8 bands, u16 mcs_map)\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-48-\tu32 usr_vht_cap_info = 0;\ndrivers/net/wireless/marvell/mwifiex/11ac.c:49:\tstruct mwifiex_adapter *adapter = priv-\u003eadapter;\ndrivers/net/wireless/marvell/mwifiex/11ac.c-50-\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c=85=static void\ndrivers/net/wireless/marvell/mwifiex/11ac.c:86:mwifiex_fill_vht_cap_info(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11ac.c-87-\t\t\t  struct ieee80211_vht_cap *vht_cap, u8 bands)\ndrivers/net/wireless/marvell/mwifiex/11ac.c-88-{\ndrivers/net/wireless/marvell/mwifiex/11ac.c:89:\tstruct mwifiex_adapter *adapter = priv-\u003eadapter;\ndrivers/net/wireless/marvell/mwifiex/11ac.c-90-\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-98-\ndrivers/net/wireless/marvell/mwifiex/11ac.c:99:void mwifiex_fill_vht_cap_tlv(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11ac.c-100-\t\t\t      struct ieee80211_vht_cap *vht_cap, u8 bands)\ndrivers/net/wireless/marvell/mwifiex/11ac.c-101-{\ndrivers/net/wireless/marvell/mwifiex/11ac.c:102:\tstruct mwifiex_adapter *adapter = priv-\u003eadapter;\ndrivers/net/wireless/marvell/mwifiex/11ac.c-103-\tu16 mcs_map_user, mcs_map_resp, mcs_map_result;\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-106-\t/* Fill VHT cap info */\ndrivers/net/wireless/marvell/mwifiex/11ac.c:107:\tmwifiex_fill_vht_cap_info(priv, vht_cap, bands);\ndrivers/net/wireless/marvell/mwifiex/11ac.c-108-\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-128-\ndrivers/net/wireless/marvell/mwifiex/11ac.c:129:\ttmp = mwifiex_convert_mcsmap_to_maxrate(priv, bands, mcs_map_result);\ndrivers/net/wireless/marvell/mwifiex/11ac.c-130-\tvht_cap-\u003esupp_mcs.rx_highest = cpu_to_le16(tmp);\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-150-\ndrivers/net/wireless/marvell/mwifiex/11ac.c:151:\ttmp = mwifiex_convert_mcsmap_to_maxrate(priv, bands, mcs_map_result);\ndrivers/net/wireless/marvell/mwifiex/11ac.c-152-\tvht_cap-\u003esupp_mcs.tx_highest = cpu_to_le16(tmp);\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-156-\ndrivers/net/wireless/marvell/mwifiex/11ac.c:157:int mwifiex_cmd_append_11ac_tlv(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11ac.c:158:\t\t\t     struct mwifiex_bssdescriptor *bss_desc,\ndrivers/net/wireless/marvell/mwifiex/11ac.c-159-\t\t\t     u8 **buffer)\ndrivers/net/wireless/marvell/mwifiex/11ac.c-160-{\ndrivers/net/wireless/marvell/mwifiex/11ac.c:161:\tstruct mwifiex_ie_types_vhtcap *vht_cap;\ndrivers/net/wireless/marvell/mwifiex/11ac.c:162:\tstruct mwifiex_ie_types_oper_mode_ntf *oper_ntf;\ndrivers/net/wireless/marvell/mwifiex/11ac.c-163-\tstruct ieee_types_oper_mode_ntf *ieee_oper_ntf;\ndrivers/net/wireless/marvell/mwifiex/11ac.c:164:\tstruct mwifiex_ie_types_vht_oper *vht_op;\ndrivers/net/wireless/marvell/mwifiex/11ac.c:165:\tstruct mwifiex_adapter *adapter = priv-\u003eadapter;\ndrivers/net/wireless/marvell/mwifiex/11ac.c-166-\tu8 supp_chwd_set;\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-176-\tif (bss_desc-\u003ebcn_vht_cap) {\ndrivers/net/wireless/marvell/mwifiex/11ac.c:177:\t\tvht_cap = (struct mwifiex_ie_types_vhtcap *)*buffer;\ndrivers/net/wireless/marvell/mwifiex/11ac.c-178-\t\tmemset(vht_cap, 0, sizeof(*vht_cap));\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-181-\t\t\t\tcpu_to_le16(sizeof(struct ieee80211_vht_cap));\ndrivers/net/wireless/marvell/mwifiex/11ac.c:182:\t\tmemcpy((u8 *)vht_cap + sizeof(struct mwifiex_ie_types_header),\ndrivers/net/wireless/marvell/mwifiex/11ac.c-183-\t\t       (u8 *)bss_desc-\u003ebcn_vht_cap,\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-185-\ndrivers/net/wireless/marvell/mwifiex/11ac.c:186:\t\tmwifiex_fill_vht_cap_tlv(priv, \u0026vht_cap-\u003evht_cap,\ndrivers/net/wireless/marvell/mwifiex/11ac.c-187-\t\t\t\t\t bss_desc-\u003ebss_band);\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-194-\t\tif (priv-\u003ebss_mode == NL80211_IFTYPE_STATION) {\ndrivers/net/wireless/marvell/mwifiex/11ac.c:195:\t\t\tvht_op = (struct mwifiex_ie_types_vht_oper *)*buffer;\ndrivers/net/wireless/marvell/mwifiex/11ac.c-196-\t\t\tmemset(vht_op, 0, sizeof(*vht_op));\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-199-\t\t\tvht_op-\u003eheader.len  = cpu_to_le16(sizeof(*vht_op) -\ndrivers/net/wireless/marvell/mwifiex/11ac.c:200:\t\t\t\t      sizeof(struct mwifiex_ie_types_header));\ndrivers/net/wireless/marvell/mwifiex/11ac.c-201-\t\t\tmemcpy((u8 *)vht_op +\ndrivers/net/wireless/marvell/mwifiex/11ac.c:202:\t\t\t\tsizeof(struct mwifiex_ie_types_header),\ndrivers/net/wireless/marvell/mwifiex/11ac.c-203-\t\t\t       (u8 *)bss_desc-\u003ebcn_vht_oper,\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-252-\ndrivers/net/wireless/marvell/mwifiex/11ac.c:253:int mwifiex_cmd_11ac_cfg(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11ac.c-254-\t\t\t struct host_cmd_ds_command *cmd, u16 cmd_action,\ndrivers/net/wireless/marvell/mwifiex/11ac.c:255:\t\t\t struct mwifiex_11ac_vht_cfg *cfg)\ndrivers/net/wireless/marvell/mwifiex/11ac.c-256-{\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-272-/* This function initializes the BlockACK setup information for given\ndrivers/net/wireless/marvell/mwifiex/11ac.c:273: * mwifiex_private structure for 11ac enabled networks.\ndrivers/net/wireless/marvell/mwifiex/11ac.c-274- */\ndrivers/net/wireless/marvell/mwifiex/11ac.c:275:void mwifiex_set_11ac_ba_params(struct mwifiex_private *priv)\ndrivers/net/wireless/marvell/mwifiex/11ac.c-276-{\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-293-\ndrivers/net/wireless/marvell/mwifiex/11ac.c:294:bool mwifiex_is_bss_in_11ac_mode(struct mwifiex_private *priv)\ndrivers/net/wireless/marvell/mwifiex/11ac.c-295-{\ndrivers/net/wireless/marvell/mwifiex/11ac.c:296:\tstruct mwifiex_bssdescriptor *bss_desc;\ndrivers/net/wireless/marvell/mwifiex/11ac.c-297-\tstruct ieee80211_vht_operation *vht_oper;\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.c-310-\ndrivers/net/wireless/marvell/mwifiex/11ac.c:311:u8 mwifiex_get_center_freq_index(struct mwifiex_private *priv, u8 band,\ndrivers/net/wireless/marvell/mwifiex/11ac.c-312-\t\t\t\t u32 pri_chan, u8 chan_bw)\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.h=14=enum vht_cfg_misc_config {\n--\ndrivers/net/wireless/marvell/mwifiex/11ac.h-24-\ndrivers/net/wireless/marvell/mwifiex/11ac.h:25:int mwifiex_cmd_append_11ac_tlv(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11ac.h:26:\t\t\t\tstruct mwifiex_bssdescriptor *bss_desc,\ndrivers/net/wireless/marvell/mwifiex/11ac.h-27-\t\t\t\tu8 **buffer);\ndrivers/net/wireless/marvell/mwifiex/11ac.h:28:int mwifiex_cmd_11ac_cfg(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11ac.h-29-\t\t\t struct host_cmd_ds_command *cmd, u16 cmd_action,\ndrivers/net/wireless/marvell/mwifiex/11ac.h:30:\t\t\t struct mwifiex_11ac_vht_cfg *cfg);\ndrivers/net/wireless/marvell/mwifiex/11ac.h:31:void mwifiex_fill_vht_cap_tlv(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11ac.h-32-\t\t\t      struct ieee80211_vht_cap *vht_cap, u8 bands);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-11-\ndrivers/net/wireless/marvell/mwifiex/11h.c:12:void mwifiex_init_11h_params(struct mwifiex_private *priv)\ndrivers/net/wireless/marvell/mwifiex/11h.c-13-{\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-17-\ndrivers/net/wireless/marvell/mwifiex/11h.c:18:inline int mwifiex_is_11h_active(struct mwifiex_private *priv)\ndrivers/net/wireless/marvell/mwifiex/11h.c-19-{\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c=25=static void\ndrivers/net/wireless/marvell/mwifiex/11h.c:26:mwifiex_11h_process_infra_join(struct mwifiex_private *priv, u8 **buffer,\ndrivers/net/wireless/marvell/mwifiex/11h.c:27:\t\t\t       struct mwifiex_bssdescriptor *bss_desc)\ndrivers/net/wireless/marvell/mwifiex/11h.c-28-{\ndrivers/net/wireless/marvell/mwifiex/11h.c:29:\tstruct mwifiex_ie_types_header *ie_header;\ndrivers/net/wireless/marvell/mwifiex/11h.c:30:\tstruct mwifiex_ie_types_pwr_capability *cap;\ndrivers/net/wireless/marvell/mwifiex/11h.c:31:\tstruct mwifiex_ie_types_local_pwr_constraint *constraint;\ndrivers/net/wireless/marvell/mwifiex/11h.c-32-\tstruct ieee80211_supported_band *sband;\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-38-\ndrivers/net/wireless/marvell/mwifiex/11h.c:39:\tradio_type = mwifiex_band_to_radio_type((u8) bss_desc-\u003ebss_band);\ndrivers/net/wireless/marvell/mwifiex/11h.c-40-\tsband = priv-\u003ewdev.wiphy-\u003ebands[radio_type];\ndrivers/net/wireless/marvell/mwifiex/11h.c-41-\ndrivers/net/wireless/marvell/mwifiex/11h.c:42:\tcap = (struct mwifiex_ie_types_pwr_capability *)*buffer;\ndrivers/net/wireless/marvell/mwifiex/11h.c-43-\tcap-\u003eheader.type = cpu_to_le16(WLAN_EID_PWR_CAPABILITY);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-48-\ndrivers/net/wireless/marvell/mwifiex/11h.c:49:\tconstraint = (struct mwifiex_ie_types_local_pwr_constraint *)*buffer;\ndrivers/net/wireless/marvell/mwifiex/11h.c-50-\tconstraint-\u003eheader.type = cpu_to_le16(WLAN_EID_PWR_CONSTRAINT);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-55-\ndrivers/net/wireless/marvell/mwifiex/11h.c:56:\tie_header = (struct mwifiex_ie_types_header *)*buffer;\ndrivers/net/wireless/marvell/mwifiex/11h.c-57-\tie_header-\u003etype = cpu_to_le16(TLV_TYPE_PASSTHROUGH);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-69-/* Enable or disable the 11h extensions in the firmware */\ndrivers/net/wireless/marvell/mwifiex/11h.c:70:int mwifiex_11h_activate(struct mwifiex_private *priv, bool flag)\ndrivers/net/wireless/marvell/mwifiex/11h.c-71-{\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-77-\ndrivers/net/wireless/marvell/mwifiex/11h.c:78:\treturn mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB,\ndrivers/net/wireless/marvell/mwifiex/11h.c-79-\t\t\t\tHostCmd_ACT_GEN_SET, DOT11H_I, \u0026enable, true);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-87- */\ndrivers/net/wireless/marvell/mwifiex/11h.c:88:void mwifiex_11h_process_join(struct mwifiex_private *priv, u8 **buffer,\ndrivers/net/wireless/marvell/mwifiex/11h.c:89:\t\t\t      struct mwifiex_bssdescriptor *bss_desc)\ndrivers/net/wireless/marvell/mwifiex/11h.c-90-{\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-94-\t\t */\ndrivers/net/wireless/marvell/mwifiex/11h.c:95:\t\tmwifiex_11h_activate(priv, true);\ndrivers/net/wireless/marvell/mwifiex/11h.c-96-\t\tpriv-\u003estate_11h.is_11h_active = true;\ndrivers/net/wireless/marvell/mwifiex/11h.c-97-\t\tbss_desc-\u003ecap_info_bitmap |= WLAN_CAPABILITY_SPECTRUM_MGMT;\ndrivers/net/wireless/marvell/mwifiex/11h.c:98:\t\tmwifiex_11h_process_infra_join(priv, buffer, bss_desc);\ndrivers/net/wireless/marvell/mwifiex/11h.c-99-\t} else {\ndrivers/net/wireless/marvell/mwifiex/11h.c-100-\t\t/* Deactivate 11h functions in the firmware */\ndrivers/net/wireless/marvell/mwifiex/11h.c:101:\t\tmwifiex_11h_activate(priv, false);\ndrivers/net/wireless/marvell/mwifiex/11h.c-102-\t\tpriv-\u003estate_11h.is_11h_active = false;\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-110- */\ndrivers/net/wireless/marvell/mwifiex/11h.c:111:void mwifiex_dfs_cac_work_queue(struct work_struct *work)\ndrivers/net/wireless/marvell/mwifiex/11h.c-112-{\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-114-\tstruct delayed_work *delayed_work = to_delayed_work(work);\ndrivers/net/wireless/marvell/mwifiex/11h.c:115:\tstruct mwifiex_private *priv =\ndrivers/net/wireless/marvell/mwifiex/11h.c:116:\t\t\tcontainer_of(delayed_work, struct mwifiex_private,\ndrivers/net/wireless/marvell/mwifiex/11h.c-117-\t\t\t\t     dfs_cac_work);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-120-\tif (priv-\u003ewdev.links[0].cac_started) {\ndrivers/net/wireless/marvell/mwifiex/11h.c:121:\t\tmwifiex_dbg(priv-\u003eadapter, MSG,\ndrivers/net/wireless/marvell/mwifiex/11h.c-122-\t\t\t    \"CAC timer finished; No radar detected\\n\");\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-131- */\ndrivers/net/wireless/marvell/mwifiex/11h.c:132:int mwifiex_cmd_issue_chan_report_request(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11h.c-133-\t\t\t\t\t  struct host_cmd_ds_command *cmd,\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-136-\tstruct host_cmd_ds_chan_rpt_req *cr_req = \u0026cmd-\u003eparams.chan_rpt_req;\ndrivers/net/wireless/marvell/mwifiex/11h.c:137:\tstruct mwifiex_radar_params *radar_params = (void *)data_buf;\ndrivers/net/wireless/marvell/mwifiex/11h.c-138-\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-149-\tif (radar_params-\u003ecac_time_ms)\ndrivers/net/wireless/marvell/mwifiex/11h.c:150:\t\tmwifiex_dbg(priv-\u003eadapter, MSG,\ndrivers/net/wireless/marvell/mwifiex/11h.c-151-\t\t\t    \"11h: issuing DFS Radar check for channel=%d\\n\",\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-153-\telse\ndrivers/net/wireless/marvell/mwifiex/11h.c:154:\t\tmwifiex_dbg(priv-\u003eadapter, MSG, \"cancelling CAC\\n\");\ndrivers/net/wireless/marvell/mwifiex/11h.c-155-\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-158-\ndrivers/net/wireless/marvell/mwifiex/11h.c:159:int mwifiex_stop_radar_detection(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11h.c-160-\t\t\t\t struct cfg80211_chan_def *chandef)\ndrivers/net/wireless/marvell/mwifiex/11h.c-161-{\ndrivers/net/wireless/marvell/mwifiex/11h.c:162:\tstruct mwifiex_radar_params radar_params;\ndrivers/net/wireless/marvell/mwifiex/11h.c-163-\ndrivers/net/wireless/marvell/mwifiex/11h.c:164:\tmemset(\u0026radar_params, 0, sizeof(struct mwifiex_radar_params));\ndrivers/net/wireless/marvell/mwifiex/11h.c-165-\tradar_params.chandef = chandef;\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-167-\ndrivers/net/wireless/marvell/mwifiex/11h.c:168:\treturn mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REPORT_REQUEST,\ndrivers/net/wireless/marvell/mwifiex/11h.c-169-\t\t\t\tHostCmd_ACT_GEN_SET, 0, \u0026radar_params, true);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-174- */\ndrivers/net/wireless/marvell/mwifiex/11h.c:175:void mwifiex_abort_cac(struct mwifiex_private *priv)\ndrivers/net/wireless/marvell/mwifiex/11h.c-176-{\ndrivers/net/wireless/marvell/mwifiex/11h.c-177-\tif (priv-\u003ewdev.links[0].cac_started) {\ndrivers/net/wireless/marvell/mwifiex/11h.c:178:\t\tif (mwifiex_stop_radar_detection(priv, \u0026priv-\u003edfs_chandef))\ndrivers/net/wireless/marvell/mwifiex/11h.c:179:\t\t\tmwifiex_dbg(priv-\u003eadapter, ERROR,\ndrivers/net/wireless/marvell/mwifiex/11h.c-180-\t\t\t\t    \"failed to stop CAC in FW\\n\");\ndrivers/net/wireless/marvell/mwifiex/11h.c:181:\t\tmwifiex_dbg(priv-\u003eadapter, MSG,\ndrivers/net/wireless/marvell/mwifiex/11h.c-182-\t\t\t    \"Aborting delayed work for CAC.\\n\");\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-193- */\ndrivers/net/wireless/marvell/mwifiex/11h.c:194:int mwifiex_11h_handle_chanrpt_ready(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11h.c-195-\t\t\t\t     struct sk_buff *skb)\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-197-\tstruct host_cmd_ds_chan_rpt_event *rpt_event;\ndrivers/net/wireless/marvell/mwifiex/11h.c:198:\tstruct mwifiex_ie_types_chan_rpt_data *rpt;\ndrivers/net/wireless/marvell/mwifiex/11h.c-199-\tu16 event_len, tlv_len;\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-205-\tif (le32_to_cpu(rpt_event-\u003eresult) != HostCmd_RESULT_OK) {\ndrivers/net/wireless/marvell/mwifiex/11h.c:206:\t\tmwifiex_dbg(priv-\u003eadapter, ERROR,\ndrivers/net/wireless/marvell/mwifiex/11h.c-207-\t\t\t    \"Error in channel report event\\n\");\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-210-\ndrivers/net/wireless/marvell/mwifiex/11h.c:211:\twhile (event_len \u003e= sizeof(struct mwifiex_ie_types_header)) {\ndrivers/net/wireless/marvell/mwifiex/11h.c-212-\t\trpt = (void *)\u0026rpt_event-\u003etlvbuf;\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-217-\t\t\tif (rpt-\u003emap.radar) {\ndrivers/net/wireless/marvell/mwifiex/11h.c:218:\t\t\t\tmwifiex_dbg(priv-\u003eadapter, MSG,\ndrivers/net/wireless/marvell/mwifiex/11h.c-219-\t\t\t\t\t    \"RADAR Detected on channel %d!\\n\",\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-238-/* Handler for radar detected event from FW.*/\ndrivers/net/wireless/marvell/mwifiex/11h.c:239:int mwifiex_11h_handle_radar_detected(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11h.c-240-\t\t\t\t      struct sk_buff *skb)\ndrivers/net/wireless/marvell/mwifiex/11h.c-241-{\ndrivers/net/wireless/marvell/mwifiex/11h.c:242:\tstruct mwifiex_radar_det_event *rdr_event;\ndrivers/net/wireless/marvell/mwifiex/11h.c-243-\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-245-\ndrivers/net/wireless/marvell/mwifiex/11h.c:246:\tmwifiex_dbg(priv-\u003eadapter, MSG,\ndrivers/net/wireless/marvell/mwifiex/11h.c-247-\t\t    \"radar detected; indicating kernel\\n\");\ndrivers/net/wireless/marvell/mwifiex/11h.c:248:\tif (mwifiex_stop_radar_detection(priv, \u0026priv-\u003edfs_chandef))\ndrivers/net/wireless/marvell/mwifiex/11h.c:249:\t\tmwifiex_dbg(priv-\u003eadapter, ERROR,\ndrivers/net/wireless/marvell/mwifiex/11h.c-250-\t\t\t    \"Failed to stop CAC in FW\\n\");\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-252-\t\t\t     GFP_KERNEL);\ndrivers/net/wireless/marvell/mwifiex/11h.c:253:\tmwifiex_dbg(priv-\u003eadapter, MSG, \"regdomain: %d\\n\",\ndrivers/net/wireless/marvell/mwifiex/11h.c-254-\t\t    rdr_event-\u003ereg_domain);\ndrivers/net/wireless/marvell/mwifiex/11h.c:255:\tmwifiex_dbg(priv-\u003eadapter, MSG, \"radar detection type: %d\\n\",\ndrivers/net/wireless/marvell/mwifiex/11h.c-256-\t\t    rdr_event-\u003edet_type);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-265- */\ndrivers/net/wireless/marvell/mwifiex/11h.c:266:void mwifiex_dfs_chan_sw_work_queue(struct work_struct *work)\ndrivers/net/wireless/marvell/mwifiex/11h.c-267-{\ndrivers/net/wireless/marvell/mwifiex/11h.c:268:\tstruct mwifiex_uap_bss_param *bss_cfg;\ndrivers/net/wireless/marvell/mwifiex/11h.c-269-\tstruct delayed_work *delayed_work = to_delayed_work(work);\ndrivers/net/wireless/marvell/mwifiex/11h.c:270:\tstruct mwifiex_private *priv =\ndrivers/net/wireless/marvell/mwifiex/11h.c:271:\t\t\tcontainer_of(delayed_work, struct mwifiex_private,\ndrivers/net/wireless/marvell/mwifiex/11h.c-272-\t\t\t\t     dfs_chan_sw_work);\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-275-\tif (!bss_cfg-\u003ebeacon_period) {\ndrivers/net/wireless/marvell/mwifiex/11h.c:276:\t\tmwifiex_dbg(priv-\u003eadapter, ERROR,\ndrivers/net/wireless/marvell/mwifiex/11h.c-277-\t\t\t    \"channel switch: AP already stopped\\n\");\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-280-\ndrivers/net/wireless/marvell/mwifiex/11h.c:281:\tmwifiex_uap_set_channel(priv, bss_cfg, priv-\u003edfs_chandef);\ndrivers/net/wireless/marvell/mwifiex/11h.c-282-\ndrivers/net/wireless/marvell/mwifiex/11h.c:283:\tif (mwifiex_config_start_uap(priv, bss_cfg)) {\ndrivers/net/wireless/marvell/mwifiex/11h.c:284:\t\tmwifiex_dbg(priv-\u003eadapter, ERROR,\ndrivers/net/wireless/marvell/mwifiex/11h.c-285-\t\t\t    \"Failed to start AP after channel switch\\n\");\n--\ndrivers/net/wireless/marvell/mwifiex/11h.c-288-\ndrivers/net/wireless/marvell/mwifiex/11h.c:289:\tmwifiex_dbg(priv-\u003eadapter, MSG,\ndrivers/net/wireless/marvell/mwifiex/11h.c-290-\t\t    \"indicating channel switch completion to kernel\\n\");\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-24- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:25:int mwifiex_fill_cap_info(struct mwifiex_private *priv, u8 radio_type,\ndrivers/net/wireless/marvell/mwifiex/11n.c-26-\t\t\t  struct ieee80211_ht_cap *ht_cap)\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-32-\tif (WARN_ON_ONCE(!sband)) {\ndrivers/net/wireless/marvell/mwifiex/11n.c:33:\t\tmwifiex_dbg(priv-\u003eadapter, ERROR, \"Invalid radio type!\\n\");\ndrivers/net/wireless/marvell/mwifiex/11n.c-34-\t\treturn -EINVAL;\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-69- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:70:static struct mwifiex_tx_ba_stream_tbl *\ndrivers/net/wireless/marvell/mwifiex/11n.c:71:mwifiex_get_ba_status(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11n.c:72:\t\t      enum mwifiex_ba_status ba_status)\ndrivers/net/wireless/marvell/mwifiex/11n.c-73-{\ndrivers/net/wireless/marvell/mwifiex/11n.c:74:\tstruct mwifiex_tx_ba_stream_tbl *tx_ba_tsr_tbl;\ndrivers/net/wireless/marvell/mwifiex/11n.c-75-\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-95- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:96:int mwifiex_ret_11n_delba(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11n.c-97-\t\t\t  struct host_cmd_ds_command *resp)\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-99-\tint tid;\ndrivers/net/wireless/marvell/mwifiex/11n.c:100:\tstruct mwifiex_tx_ba_stream_tbl *tx_ba_tbl;\ndrivers/net/wireless/marvell/mwifiex/11n.c-101-\tstruct host_cmd_ds_11n_delba *del_ba = \u0026resp-\u003eparams.del_ba;\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-105-\tif (del_ba-\u003edel_result == BA_RESULT_SUCCESS) {\ndrivers/net/wireless/marvell/mwifiex/11n.c:106:\t\tmwifiex_del_ba_tbl(priv, tid, del_ba-\u003epeer_mac_addr,\ndrivers/net/wireless/marvell/mwifiex/11n.c-107-\t\t\t\t   TYPE_DELBA_SENT,\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-109-\ndrivers/net/wireless/marvell/mwifiex/11n.c:110:\t\ttx_ba_tbl = mwifiex_get_ba_status(priv, BA_SETUP_INPROGRESS);\ndrivers/net/wireless/marvell/mwifiex/11n.c-111-\t\tif (tx_ba_tbl)\ndrivers/net/wireless/marvell/mwifiex/11n.c:112:\t\t\tmwifiex_send_addba(priv, tx_ba_tbl-\u003etid,\ndrivers/net/wireless/marvell/mwifiex/11n.c-113-\t\t\t\t\t   tx_ba_tbl-\u003era);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-120-\ndrivers/net/wireless/marvell/mwifiex/11n.c:121:\t\tmwifiex_create_ba_tbl(priv, del_ba-\u003epeer_mac_addr, tid,\ndrivers/net/wireless/marvell/mwifiex/11n.c-122-\t\t\t\t      BA_SETUP_INPROGRESS);\ndrivers/net/wireless/marvell/mwifiex/11n.c-123-\ndrivers/net/wireless/marvell/mwifiex/11n.c:124:\t\ttx_ba_tbl = mwifiex_get_ba_status(priv, BA_SETUP_INPROGRESS);\ndrivers/net/wireless/marvell/mwifiex/11n.c-125-\ndrivers/net/wireless/marvell/mwifiex/11n.c-126-\t\tif (tx_ba_tbl)\ndrivers/net/wireless/marvell/mwifiex/11n.c:127:\t\t\tmwifiex_del_ba_tbl(priv, tx_ba_tbl-\u003etid, tx_ba_tbl-\u003era,\ndrivers/net/wireless/marvell/mwifiex/11n.c-128-\t\t\t\t\t   TYPE_DELBA_SENT, true);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-141- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:142:int mwifiex_ret_11n_addba_req(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11n.c-143-\t\t\t      struct host_cmd_ds_command *resp)\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-146-\tstruct host_cmd_ds_11n_addba_rsp *add_ba_rsp = \u0026resp-\u003eparams.add_ba_rsp;\ndrivers/net/wireless/marvell/mwifiex/11n.c:147:\tstruct mwifiex_tx_ba_stream_tbl *tx_ba_tbl;\ndrivers/net/wireless/marvell/mwifiex/11n.c:148:\tstruct mwifiex_ra_list_tbl *ra_list;\ndrivers/net/wireless/marvell/mwifiex/11n.c-149-\tu16 block_ack_param_set = le16_to_cpu(add_ba_rsp-\u003eblock_ack_param_set);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-156-\ndrivers/net/wireless/marvell/mwifiex/11n.c:157:\ttid_down = mwifiex_wmm_downgrade_tid(priv, tid);\ndrivers/net/wireless/marvell/mwifiex/11n.c:158:\tra_list = mwifiex_wmm_get_ralist_node(priv, tid_down, add_ba_rsp-\u003e\ndrivers/net/wireless/marvell/mwifiex/11n.c-159-\t\tpeer_mac_addr);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-164-\t\t}\ndrivers/net/wireless/marvell/mwifiex/11n.c:165:\t\tmwifiex_del_ba_tbl(priv, tid, add_ba_rsp-\u003epeer_mac_addr,\ndrivers/net/wireless/marvell/mwifiex/11n.c-166-\t\t\t\t   TYPE_DELBA_SENT, true);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-172-\ndrivers/net/wireless/marvell/mwifiex/11n.c:173:\ttx_ba_tbl = mwifiex_get_ba_tbl(priv, tid, add_ba_rsp-\u003epeer_mac_addr);\ndrivers/net/wireless/marvell/mwifiex/11n.c-174-\tif (tx_ba_tbl) {\ndrivers/net/wireless/marvell/mwifiex/11n.c:175:\t\tmwifiex_dbg(priv-\u003eadapter, EVENT, \"info: BA stream complete\\n\");\ndrivers/net/wireless/marvell/mwifiex/11n.c-176-\t\ttx_ba_tbl-\u003eba_status = BA_SETUP_COMPLETE;\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-187-\t} else {\ndrivers/net/wireless/marvell/mwifiex/11n.c:188:\t\tmwifiex_dbg(priv-\u003eadapter, ERROR, \"BA stream not created\\n\");\ndrivers/net/wireless/marvell/mwifiex/11n.c-189-\t}\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-201- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:202:int mwifiex_cmd_recfg_tx_buf(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11n.c-203-\t\t\t     struct host_cmd_ds_command *cmd, int cmd_action,\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-214-\tcase HostCmd_ACT_GEN_SET:\ndrivers/net/wireless/marvell/mwifiex/11n.c:215:\t\tmwifiex_dbg(priv-\u003eadapter, CMD,\ndrivers/net/wireless/marvell/mwifiex/11n.c-216-\t\t\t    \"cmd: set tx_buf=%d\\n\", *buf_size);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-234- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:235:int mwifiex_cmd_amsdu_aggr_ctrl(struct host_cmd_ds_command *cmd,\ndrivers/net/wireless/marvell/mwifiex/11n.c-236-\t\t\t\tint cmd_action,\ndrivers/net/wireless/marvell/mwifiex/11n.c:237:\t\t\t\tstruct mwifiex_ds_11n_amsdu_aggr_ctrl *aa_ctrl)\ndrivers/net/wireless/marvell/mwifiex/11n.c-238-{\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-267- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:268:int mwifiex_cmd_11n_cfg(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11n.c-269-\t\t\tstruct host_cmd_ds_command *cmd, u16 cmd_action,\ndrivers/net/wireless/marvell/mwifiex/11n.c:270:\t\t\tstruct mwifiex_ds_11n_tx_cfg *txcfg)\ndrivers/net/wireless/marvell/mwifiex/11n.c-271-{\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c=298=int\ndrivers/net/wireless/marvell/mwifiex/11n.c:299:mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11n.c:300:\t\t\t   struct mwifiex_bssdescriptor *bss_desc,\ndrivers/net/wireless/marvell/mwifiex/11n.c-301-\t\t\t   u8 **buffer)\ndrivers/net/wireless/marvell/mwifiex/11n.c-302-{\ndrivers/net/wireless/marvell/mwifiex/11n.c:303:\tstruct mwifiex_ie_types_htcap *ht_cap;\ndrivers/net/wireless/marvell/mwifiex/11n.c:304:\tstruct mwifiex_ie_types_htinfo *ht_info;\ndrivers/net/wireless/marvell/mwifiex/11n.c:305:\tstruct mwifiex_ie_types_chan_list_param_set *chan_list;\ndrivers/net/wireless/marvell/mwifiex/11n.c:306:\tstruct mwifiex_ie_types_2040bssco *bss_co_2040;\ndrivers/net/wireless/marvell/mwifiex/11n.c:307:\tstruct mwifiex_ie_types_extcap *ext_cap;\ndrivers/net/wireless/marvell/mwifiex/11n.c-308-\tint ret_len = 0;\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-315-\ndrivers/net/wireless/marvell/mwifiex/11n.c:316:\tradio_type = mwifiex_band_to_radio_type((u8) bss_desc-\u003ebss_band);\ndrivers/net/wireless/marvell/mwifiex/11n.c-317-\tsband = priv-\u003ewdev.wiphy-\u003ebands[radio_type];\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-319-\tif (bss_desc-\u003ebcn_ht_cap) {\ndrivers/net/wireless/marvell/mwifiex/11n.c:320:\t\tht_cap = (struct mwifiex_ie_types_htcap *) *buffer;\ndrivers/net/wireless/marvell/mwifiex/11n.c:321:\t\tmemset(ht_cap, 0, sizeof(struct mwifiex_ie_types_htcap));\ndrivers/net/wireless/marvell/mwifiex/11n.c-322-\t\tht_cap-\u003eheader.type = cpu_to_le16(WLAN_EID_HT_CAPABILITY);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-324-\t\t\t\tcpu_to_le16(sizeof(struct ieee80211_ht_cap));\ndrivers/net/wireless/marvell/mwifiex/11n.c:325:\t\tmemcpy((u8 *) ht_cap + sizeof(struct mwifiex_ie_types_header),\ndrivers/net/wireless/marvell/mwifiex/11n.c-326-\t\t       (u8 *)bss_desc-\u003ebcn_ht_cap,\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-328-\ndrivers/net/wireless/marvell/mwifiex/11n.c:329:\t\tmwifiex_fill_cap_info(priv, radio_type, \u0026ht_cap-\u003eht_cap);\ndrivers/net/wireless/marvell/mwifiex/11n.c-330-\t\t/* Update HT40 capability from current channel information */\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-333-\t\t\tu8 radio =\ndrivers/net/wireless/marvell/mwifiex/11n.c:334:\t\t\tmwifiex_band_to_radio_type(bss_desc-\u003ebss_band);\ndrivers/net/wireless/marvell/mwifiex/11n.c-335-\t\t\tint freq =\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-362-\ndrivers/net/wireless/marvell/mwifiex/11n.c:363:\t\t*buffer += sizeof(struct mwifiex_ie_types_htcap);\ndrivers/net/wireless/marvell/mwifiex/11n.c:364:\t\tret_len += sizeof(struct mwifiex_ie_types_htcap);\ndrivers/net/wireless/marvell/mwifiex/11n.c-365-\t}\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-368-\t\tif (priv-\u003ebss_mode == NL80211_IFTYPE_ADHOC) {\ndrivers/net/wireless/marvell/mwifiex/11n.c:369:\t\t\tht_info = (struct mwifiex_ie_types_htinfo *) *buffer;\ndrivers/net/wireless/marvell/mwifiex/11n.c-370-\t\t\tmemset(ht_info, 0,\ndrivers/net/wireless/marvell/mwifiex/11n.c:371:\t\t\t       sizeof(struct mwifiex_ie_types_htinfo));\ndrivers/net/wireless/marvell/mwifiex/11n.c-372-\t\t\tht_info-\u003eheader.type =\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-378-\t\t\tmemcpy((u8 *) ht_info +\ndrivers/net/wireless/marvell/mwifiex/11n.c:379:\t\t\t       sizeof(struct mwifiex_ie_types_header),\ndrivers/net/wireless/marvell/mwifiex/11n.c-380-\t\t\t       (u8 *)bss_desc-\u003ebcn_ht_oper,\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-388-\ndrivers/net/wireless/marvell/mwifiex/11n.c:389:\t\t\t*buffer += sizeof(struct mwifiex_ie_types_htinfo);\ndrivers/net/wireless/marvell/mwifiex/11n.c:390:\t\t\tret_len += sizeof(struct mwifiex_ie_types_htinfo);\ndrivers/net/wireless/marvell/mwifiex/11n.c-391-\t\t}\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-393-\t\tchan_list =\ndrivers/net/wireless/marvell/mwifiex/11n.c:394:\t\t\t(struct mwifiex_ie_types_chan_list_param_set *) *buffer;\ndrivers/net/wireless/marvell/mwifiex/11n.c-395-\t\tmemset(chan_list, 0, struct_size(chan_list, chan_scan_param, 1));\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-397-\t\tchan_list-\u003eheader.len =\ndrivers/net/wireless/marvell/mwifiex/11n.c:398:\t\t\tcpu_to_le16(sizeof(struct mwifiex_chan_scan_param_set));\ndrivers/net/wireless/marvell/mwifiex/11n.c-399-\t\tchan_list-\u003echan_scan_param[0].chan_number =\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-401-\t\tchan_list-\u003echan_scan_param[0].radio_type =\ndrivers/net/wireless/marvell/mwifiex/11n.c:402:\t\t\tmwifiex_band_to_radio_type((u8) bss_desc-\u003ebss_band);\ndrivers/net/wireless/marvell/mwifiex/11n.c-403-\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-416-\tif (bss_desc-\u003ebcn_bss_co_2040) {\ndrivers/net/wireless/marvell/mwifiex/11n.c:417:\t\tbss_co_2040 = (struct mwifiex_ie_types_2040bssco *) *buffer;\ndrivers/net/wireless/marvell/mwifiex/11n.c-418-\t\tmemset(bss_co_2040, 0,\ndrivers/net/wireless/marvell/mwifiex/11n.c:419:\t\t       sizeof(struct mwifiex_ie_types_2040bssco));\ndrivers/net/wireless/marvell/mwifiex/11n.c-420-\t\tbss_co_2040-\u003eheader.type = cpu_to_le16(WLAN_EID_BSS_COEX_2040);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-424-\t\tmemcpy((u8 *) bss_co_2040 +\ndrivers/net/wireless/marvell/mwifiex/11n.c:425:\t\t       sizeof(struct mwifiex_ie_types_header),\ndrivers/net/wireless/marvell/mwifiex/11n.c-426-\t\t       bss_desc-\u003ebcn_bss_co_2040 +\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-429-\ndrivers/net/wireless/marvell/mwifiex/11n.c:430:\t\t*buffer += sizeof(struct mwifiex_ie_types_2040bssco);\ndrivers/net/wireless/marvell/mwifiex/11n.c:431:\t\tret_len += sizeof(struct mwifiex_ie_types_2040bssco);\ndrivers/net/wireless/marvell/mwifiex/11n.c-432-\t}\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-435-\t\thdr = (void *)bss_desc-\u003ebcn_ext_cap;\ndrivers/net/wireless/marvell/mwifiex/11n.c:436:\t\text_cap = (struct mwifiex_ie_types_extcap *) *buffer;\ndrivers/net/wireless/marvell/mwifiex/11n.c:437:\t\tmemset(ext_cap, 0, sizeof(struct mwifiex_ie_types_extcap));\ndrivers/net/wireless/marvell/mwifiex/11n.c-438-\t\text_cap-\u003eheader.type = cpu_to_le16(WLAN_EID_EXT_CAPABILITY);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-450-\ndrivers/net/wireless/marvell/mwifiex/11n.c:451:\t\t*buffer += sizeof(struct mwifiex_ie_types_extcap) + hdr-\u003elen;\ndrivers/net/wireless/marvell/mwifiex/11n.c:452:\t\tret_len += sizeof(struct mwifiex_ie_types_extcap) + hdr-\u003elen;\ndrivers/net/wireless/marvell/mwifiex/11n.c-453-\t}\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-461- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:462:static int mwifiex_is_tx_ba_stream_ptr_valid(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11n.c:463:\t\t\t\tstruct mwifiex_tx_ba_stream_tbl *tx_tbl_ptr)\ndrivers/net/wireless/marvell/mwifiex/11n.c-464-{\ndrivers/net/wireless/marvell/mwifiex/11n.c:465:\tstruct mwifiex_tx_ba_stream_tbl *tx_ba_tsr_tbl;\ndrivers/net/wireless/marvell/mwifiex/11n.c-466-\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-480- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:481:void mwifiex_11n_delete_tx_ba_stream_tbl_entry(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/11n.c:482:\t\t\t\tstruct mwifiex_tx_ba_stream_tbl *tx_ba_tsr_tbl)\ndrivers/net/wireless/marvell/mwifiex/11n.c-483-{\ndrivers/net/wireless/marvell/mwifiex/11n.c-484-\tif (!tx_ba_tsr_tbl \u0026\u0026\ndrivers/net/wireless/marvell/mwifiex/11n.c:485:\t    mwifiex_is_tx_ba_stream_ptr_valid(priv, tx_ba_tsr_tbl))\ndrivers/net/wireless/marvell/mwifiex/11n.c-486-\t\treturn;\ndrivers/net/wireless/marvell/mwifiex/11n.c-487-\ndrivers/net/wireless/marvell/mwifiex/11n.c:488:\tmwifiex_dbg(priv-\u003eadapter, INFO,\ndrivers/net/wireless/marvell/mwifiex/11n.c-489-\t\t    \"info: tx_ba_tsr_tbl %p\\n\", tx_ba_tsr_tbl);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-498- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:499:void mwifiex_11n_delete_all_tx_ba_stream_tbl(struct mwifiex_private *priv)\ndrivers/net/wireless/marvell/mwifiex/11n.c-500-{\ndrivers/net/wireless/marvell/mwifiex/11n.c-501-\tint i;\ndrivers/net/wireless/marvell/mwifiex/11n.c:502:\tstruct mwifiex_tx_ba_stream_tbl *del_tbl_ptr, *tmp_node;\ndrivers/net/wireless/marvell/mwifiex/11n.c-503-\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-506-\t\t\t\t \u0026priv-\u003etx_ba_stream_tbl_ptr, list)\ndrivers/net/wireless/marvell/mwifiex/11n.c:507:\t\tmwifiex_11n_delete_tx_ba_stream_tbl_entry(priv, del_tbl_ptr);\ndrivers/net/wireless/marvell/mwifiex/11n.c-508-\tspin_unlock_bh(\u0026priv-\u003etx_ba_stream_tbl_lock);\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-520- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:521:struct mwifiex_tx_ba_stream_tbl *\ndrivers/net/wireless/marvell/mwifiex/11n.c:522:mwifiex_get_ba_tbl(struct mwifiex_private *priv, int tid, u8 *ra)\ndrivers/net/wireless/marvell/mwifiex/11n.c-523-{\ndrivers/net/wireless/marvell/mwifiex/11n.c:524:\tstruct mwifiex_tx_ba_stream_tbl *tx_ba_tsr_tbl;\ndrivers/net/wireless/marvell/mwifiex/11n.c-525-\n--\ndrivers/net/wireless/marvell/mwifiex/11n.c-541- */\ndrivers/net/wireless/marvell/mwifiex/11n.c:542:void mwifiex_create_ba_tbl(struct mwifiex_private *priv, u8 *ra, int tid,\ndrivers/net/wireless/marvell/mwifiex/11n.c:543:\t\t\t   enum mwifiex_ba_status ba_status)\ndrivers/net/wireless/marvell/mwifiex/11n.c-544-{\ndrivers/net/wireless/marvell/mwifiex/11n.c:545:\tstruct mwifiex_tx_ba_stream_tbl *new_node;\ndrivers/net/wireless/marvell/mwifiex/11n.c:546:\tstruct mwifiex_ra_list_tbl *ra_list;\ndrivers/net/wireless/marvell/mwifiex/11n.c-547-\tint tid_down;\ndrivers/net/wireless/marvell/mwifiex/11n.c-548-\ndrivers/net/wireless/marvell/mwifiex/11n.c:549:\tif (!mwifiex_get_ba_tbl(priv, tid, ra)) {\n\n"
}

5/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 18774
							output: 45
							thoughts: 245
						

Thoughts:
**Fuzzing the `mwifiex` Driver: A Targeted Approach**

Okay, so the `mwifiex` driver is the target. It's multi-faceted, supporting USB, PCIe, and SDIO, which is good news because that opens up several fuzzing avenues. Specifically, since it supports USB, the dummy HCD (USB fuzzer) becomes a viable tool, and that immediately gets my attention.

The core question is, is this fuzzing effort actually *worth* the time? Yes, definitely. It handles Wi-Fi Information Elements (IEs), which are notoriously complex data structures ripe for vulnerability discovery. The patch specifically calls out an out-of-bounds read within `mwifiex_search_oui_in_ie`. Nice!

Now, the crucial step: Determining the attack surface for `mwifiex_search_oui_in_ie`. Can this function be triggered from the host, or is it exclusively a device-side routine? It appears the function parses IEs from `bss_desc->bcn_rsn_ie` and `bss_desc->bcn_wpa_ie`. Aha, these are beacon/probe response IEs, and these come from the AP! So, the device/firmware controls the data we're looking at.

This is where the architecture knowledge comes in handy. `mwifiex`'s firmware handles the Wi-Fi MAC, and the host driver communicates via commands and events. Knowing this, I need to trace the call paths to determine the entry points for the vulnerable function. I need to figure out where `mwifiex_is_rsn_oui_present` and `mwifiex_is_wpa_oui_present` are called. That should give me a good indication on where to focus the fuzzing effort.



6/2 2026/07/12 00:33 tool grepper
0m Args:
{
  "Expression": "mwifiex_is_rsn_oui_present",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/scan.c=147=static u8\ndrivers/net/wireless/marvell/mwifiex/scan.c:148:mwifiex_is_rsn_oui_present(struct mwifiex_bssdescriptor *bss_desc, u32 cipher)\ndrivers/net/wireless/marvell/mwifiex/scan.c-149-{\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c=344=mwifiex_is_network_compatible(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-408-\t\t\t     bss_desc-\u003ebcn_ht_cap) \u0026\u0026\ndrivers/net/wireless/marvell/mwifiex/scan.c:409:\t\t\t    !mwifiex_is_rsn_oui_present(bss_desc,\ndrivers/net/wireless/marvell/mwifiex/scan.c-410-\t\t\t\t\t\t\tCIPHER_SUITE_CCMP)) {\ndrivers/net/wireless/marvell/mwifiex/scan.c-411-\ndrivers/net/wireless/marvell/mwifiex/scan.c:412:\t\t\t\tif (mwifiex_is_rsn_oui_present\ndrivers/net/wireless/marvell/mwifiex/scan.c-413-\t\t\t\t\t\t(bss_desc, CIPHER_SUITE_TKIP)) {\n"
}

7/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 19813
							output: 42
							thoughts: 40
						

Thoughts:
Okay, here's my interpretation of that thought process, tailored for an expert audience, and written in the first person:

**Analyzing the mwifiex Network Compatibility Check**

Alright, I'm digging into the `mwifiex` driver again. I see that `mwifiex_is_network_compatible` is a key function, and it's being invoked during both the scan result processing and the connection establishment phases. This suggests it's a critical gatekeeper for determining which networks the device will even *consider*. Interesting. Now, I need to understand the logic behind that gatekeeping. My next step, naturally, is to trace all the call sites of `mwifiex_is_network_compatible`. I need to precisely understand *when* and *why* this compatibility check is being run. Is it just about security settings? Infrastructure mode versus ad-hoc? Regulatory domain considerations? I'll pinpoint every call, understand the calling context, and that should give me the complete picture of how network compatibility is determined within this driver. Knowing the specific conditions that trigger a network to be considered incompatible will be crucial for debugging any connection issues. And, potentially, identifying any vulnerabilities or areas for optimization.



8/2 2026/07/12 00:33 tool grepper
0m Args:
{
  "Expression": "mwifiex_is_network_compatible",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/scan.c=343=static s32\ndrivers/net/wireless/marvell/mwifiex/scan.c:344:mwifiex_is_network_compatible(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/scan.c-345-\t\t\t      struct mwifiex_bssdescriptor *bss_desc, u32 mode)\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c=1616=int mwifiex_check_network_compatibility(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-1628-\t\tcase NL80211_IFTYPE_ADHOC:\ndrivers/net/wireless/marvell/mwifiex/scan.c:1629:\t\t\tret = mwifiex_is_network_compatible(priv, bss_desc,\ndrivers/net/wireless/marvell/mwifiex/scan.c-1630-\t\t\t\t\t\t\t    priv-\u003ebss_mode);\n"
}

9/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 20425
							output: 42
							thoughts: 15
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Analyzing `mwifiex_check_network_compatibility`'s Invocation**

Okay, so I'm trying to figure out the context of `mwifiex_check_network_compatibility`. The core question is: when does this function get called in the `mwifiex` driver? I need to understand the network compatibility checks and how they are implemented. This function's timing is critical to understanding driver behavior, potential bottlenecks, and any compatibility-related issues that might arise. My goal is to determine the triggers, the surrounding control flow, and any dependencies this function has. So, I need to trace the call paths to figure this out and start with the caller function.



10/2 2026/07/12 00:33 tool grepper
0m Args:
{
  "Expression": "mwifiex_check_network_compatibility",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/main.h=1541=int mwifiex_update_bss_desc_with_ie(struct mwifiex_adapter *adapter,\ndrivers/net/wireless/marvell/mwifiex/main.h-1542-\t\t\t\t    struct mwifiex_bssdescriptor *bss_entry);\ndrivers/net/wireless/marvell/mwifiex/main.h:1543:int mwifiex_check_network_compatibility(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/main.h-1544-\t\t\t\t\tstruct mwifiex_bssdescriptor *bss_desc);\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c=1591=int mwifiex_cmd_802_11_scan(struct host_cmd_ds_command *cmd,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-1615- */\ndrivers/net/wireless/marvell/mwifiex/scan.c:1616:int mwifiex_check_network_compatibility(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/scan.c-1617-\t\t\t\t\tstruct mwifiex_bssdescriptor *bss_desc)\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c=1703=static int mwifiex_update_curr_bss_params(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-1717-\ndrivers/net/wireless/marvell/mwifiex/scan.c:1718:\tret = mwifiex_check_network_compatibility(priv, bss_desc);\ndrivers/net/wireless/marvell/mwifiex/scan.c-1719-\tif (ret)\n--\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c=318=int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,\n--\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c-360-\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c:361:\t\tret = mwifiex_check_network_compatibility(priv, bss_desc);\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c-362-\t\tif (ret)\n--\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c-408-\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c:409:\t\tret = mwifiex_check_network_compatibility(priv, bss_desc);\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c-410-\n"
}

11/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 21368
							output: 37
							thoughts: 83
						

Thoughts:
**Analyzing the mwifiex Configuration and Potential Security Implications**

Okay, so we're talking about the point when a station connects to a Basic Service Set (BSS) or initiates one. The BSS descriptor, crucial for understanding the network, gets populated either from the results of a scan or directly from events reported by the firmware. This is where things get interesting, particularly since mwifiex supports USB. This means that firmware responses, which include the essential beacon and probe response data, are potentially vulnerable to fuzzing through the USB interface. It sounds like a solid attack vector, but let's see what's actually enabled, and if this potential vulnerability is exposed, or if it can be addressed with appropriate configurations. I need to dig into the Kconfig for mwifiex and see what build options are in play. I need to understand what's configured to see just how exposed this might be.



12/2 2026/07/12 00:33 tool grepper
0m Args:
{
  "Expression": "config MWIFIEX",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/net/wireless/marvell/mwifiex/Kconfig:2:config MWIFIEX\ndrivers/net/wireless/marvell/mwifiex/Kconfig-3-\ttristate \"Marvell WiFi-Ex Driver\"\n--\ndrivers/net/wireless/marvell/mwifiex/Kconfig-11-\ndrivers/net/wireless/marvell/mwifiex/Kconfig:12:config MWIFIEX_SDIO\ndrivers/net/wireless/marvell/mwifiex/Kconfig-13-\ttristate \"Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897/SD8977/SD8978/SD8987/SD8997\"\n--\ndrivers/net/wireless/marvell/mwifiex/Kconfig-24-\ndrivers/net/wireless/marvell/mwifiex/Kconfig:25:config MWIFIEX_PCIE\ndrivers/net/wireless/marvell/mwifiex/Kconfig-26-\ttristate \"Marvell WiFi-Ex Driver for PCIE 8766/8897/8997\"\n--\ndrivers/net/wireless/marvell/mwifiex/Kconfig-36-\ndrivers/net/wireless/marvell/mwifiex/Kconfig:37:config MWIFIEX_USB\ndrivers/net/wireless/marvell/mwifiex/Kconfig-38-\ttristate \"Marvell WiFi-Ex Driver for USB8766/8797/8997\"\n"
}

13/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 22103
							output: 42
							thoughts: 125
						

Thoughts:
**Analyzing the MWIFIEX Configuration for Fuzzing**

Okay, so I'm looking at `MWIFIEX` and `MWIFIEX_USB` – those are the key configs for the Marvell Wi-Fi driver, specifically in relation to fuzzing. Right, `MWIFIEX` is the core driver, and `MWIFIEX_USB` is the USB-specific driver. The idea is to leverage the USB driver for fuzzing. If we enable `MWIFIEX_USB`, that gives us a direct entry point via the USB interface, which is a prime target for fuzzing.

My primary question now is: Can we reach something like `mwifiex_search_oui_in_ie` (or similar, like a function that handles information elements) from a USB fuzzing perspective? It’s crucial to map that out. Thinking about it, the USB driver should be receiving data from the USB device itself and then passing it along to the core driver. So, my focus should be on functions within the USB driver that handle incoming data. I need to dig into something like `mwifiex_usb_rx_complete` or something similar, and see how the data flow looks, the data handling and how information from the USB interface integrates with the core functions. I think that's the path.



14/2 2026/07/12 00:33 tool grepper
0m Args:
{
  "Expression": "mwifiex_usb_rx_complete",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/usb.c=46=static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,\n--\ndrivers/net/wireless/marvell/mwifiex/usb.c-151-\ndrivers/net/wireless/marvell/mwifiex/usb.c:152:static void mwifiex_usb_rx_complete(struct urb *urb)\ndrivers/net/wireless/marvell/mwifiex/usb.c-153-{\n--\ndrivers/net/wireless/marvell/mwifiex/usb.c=285=static int mwifiex_usb_submit_rx_urb(struct urb_context *ctx, int size)\n--\ndrivers/net/wireless/marvell/mwifiex/usb.c-315-\t\t\t\t usb_rcvintpipe(card-\u003eudev, ctx-\u003eep),\ndrivers/net/wireless/marvell/mwifiex/usb.c:316:\t\t\t\t ctx-\u003eskb-\u003edata, size, mwifiex_usb_rx_complete,\ndrivers/net/wireless/marvell/mwifiex/usb.c-317-\t\t\t\t (void *)ctx, card-\u003erx_cmd_interval);\n--\ndrivers/net/wireless/marvell/mwifiex/usb.c-320-\t\t\t\t  usb_rcvbulkpipe(card-\u003eudev, ctx-\u003eep),\ndrivers/net/wireless/marvell/mwifiex/usb.c:321:\t\t\t\t  ctx-\u003eskb-\u003edata, size, mwifiex_usb_rx_complete,\ndrivers/net/wireless/marvell/mwifiex/usb.c-322-\t\t\t\t  (void *)ctx);\n"
}

15/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 22963
							output: 42
							thoughts: 59
						

Thoughts:
Okay, here's my understanding, based on that process description.

**My Analysis of the USB Receive Path**

Alright, so the `mwifiex_usb_rx_complete` function is the initial entry point for incoming data on the USB bus – that much is clear. The data I'm getting from there is handed off to `mwifiex_usb_recv`. That's where the real action begins, where I expect the data is further examined and probably parsed. It's likely `mwifiex_usb_recv` then calls a handler function like `mwifiex_handle_rx_packet`, or something very similar, to actually *do* something with the received data.

Now, I need to understand how the scan results flow through all of this. I'm going to follow the logic through these functions to see how the Wi-Fi scan data makes its way to the appropriate processing routines. I need to trace this path specifically from the point that data is received on the USB all the way to its final form. Time to dig in!



16/2 2026/07/12 00:33 tool grepper
0m Args:
{
  "Expression": "mwifiex_handle_rx_packet",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/main.c=174=static int mwifiex_process_rx(struct mwifiex_adapter *adapter)\n--\ndrivers/net/wireless/marvell/mwifiex/main.c-204-\t\t} else {\ndrivers/net/wireless/marvell/mwifiex/main.c:205:\t\t\tmwifiex_handle_rx_packet(adapter, skb);\ndrivers/net/wireless/marvell/mwifiex/main.c-206-\t\t}\n--\ndrivers/net/wireless/marvell/mwifiex/main.h=1102=void mwifiex_process_assoc_resp(struct mwifiex_adapter *adapter);\ndrivers/net/wireless/marvell/mwifiex/main.h:1103:int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,\ndrivers/net/wireless/marvell/mwifiex/main.h-1104-\t\t\t     struct sk_buff *skb);\n--\ndrivers/net/wireless/marvell/mwifiex/pcie.c=1526=static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)\n--\ndrivers/net/wireless/marvell/mwifiex/pcie.c-1588-\t\t\t} else {\ndrivers/net/wireless/marvell/mwifiex/pcie.c:1589:\t\t\t\tmwifiex_handle_rx_packet(adapter, skb_data);\ndrivers/net/wireless/marvell/mwifiex/pcie.c-1590-\t\t\t}\n--\ndrivers/net/wireless/marvell/mwifiex/sdio.c=1593=static void mwifiex_deaggr_sdio_pkt(struct mwifiex_adapter *adapter,\n--\ndrivers/net/wireless/marvell/mwifiex/sdio.c-1633-\ndrivers/net/wireless/marvell/mwifiex/sdio.c:1634:\t\tmwifiex_handle_rx_packet(adapter, skb_deaggr);\ndrivers/net/wireless/marvell/mwifiex/sdio.c-1635-\t\tdata += blk_size;\n--\ndrivers/net/wireless/marvell/mwifiex/sdio.c=1647=static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter,\n--\ndrivers/net/wireless/marvell/mwifiex/sdio.c-1684-\t\t} else {\ndrivers/net/wireless/marvell/mwifiex/sdio.c:1685:\t\t\tmwifiex_handle_rx_packet(adapter, skb);\ndrivers/net/wireless/marvell/mwifiex/sdio.c-1686-\t\t}\n--\ndrivers/net/wireless/marvell/mwifiex/txrx.c-23- */\ndrivers/net/wireless/marvell/mwifiex/txrx.c:24:int mwifiex_handle_rx_packet(struct mwifiex_adapter *adapter,\ndrivers/net/wireless/marvell/mwifiex/txrx.c-25-\t\t\t     struct sk_buff *skb)\n--\ndrivers/net/wireless/marvell/mwifiex/txrx.c-59-}\ndrivers/net/wireless/marvell/mwifiex/txrx.c:60:EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);\ndrivers/net/wireless/marvell/mwifiex/txrx.c-61-\n"
}

17/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 24179
							output: 42
							thoughts: 42
						

Thoughts:
Here's my take on the thought process, as if it were my own:

**RX Packet Processing Discrepancies**

Okay, so I'm digging into this Marvell Wi-Fi driver code again. I was just looking at `mwifiex_handle_rx_packet`, and it's striking me as being *exclusively* focused on data packets. That's what the name and the code seem to indicate. But that can't be the *whole* story, can it? Where are the command and event packets handled? We can't just be dropping those on the floor!

Ah, right, now it's coming back to me. The USB receive completion handler, `mwifiex_usb_rx_complete`, *that's* the one that seems to be the central point for both data packets and those command/event packets. It's handling the completion of a receive operation from the USB interface, so it makes sense that it would need to make the distinction. I should probably focus my attention there to understand the full flow.



18/2 2026/07/12 00:33 tool grepper
0m Error:
no matches

Args:
{
  "Expression": "mwifiex_process_rx_command",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "error": "no matches"
}

19/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 24503
							output: 45
							thoughts: 17
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Revisiting mwifiex_usb_rx_complete**

Okay, let's circle back to `mwifiex_usb_rx_complete`. I need to re-examine that function, specifically within the context of the recent reports. Given the intricacies of the USB receive path in the Marvell WiFi driver, it's critical to ensure there aren't any subtle race conditions or unexpected interactions with the DMA engine lurking in that routine. I want to double-check the handling of descriptor chains, buffer ownership, and interrupt coalescing. The performance issues we are seeing feel like they could stem from improper handling of receive buffers, or potentially an issue in the interrupt servicing flow. I also need to verify again the sequence of events and how they are affected by different host configurations and driver versions. I should also check the error handling and whether errors are gracefully managed to prevent cascading failures. It’s time for a deep dive, again.



20/2 2026/07/12 00:33 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/marvell/mwifiex/usb.c",
  "FirstLine": 152,
  "LineCount": 100
}

Results:
{
  "Contents": " 152:\tstatic void mwifiex_usb_rx_complete(struct urb *urb)\n 153:\t{\n 154:\t\tstruct urb_context *context = (struct urb_context *)urb-\u003econtext;\n 155:\t\tstruct mwifiex_adapter *adapter = context-\u003eadapter;\n 156:\t\tstruct sk_buff *skb = context-\u003eskb;\n 157:\t\tstruct usb_card_rec *card;\n 158:\t\tint recv_length = urb-\u003eactual_length;\n 159:\t\tint size, status;\n 160:\t\n 161:\t\tif (!adapter || !adapter-\u003ecard) {\n 162:\t\t\tpr_err(\"mwifiex adapter or card structure is not valid\\n\");\n 163:\t\t\treturn;\n 164:\t\t}\n 165:\t\n 166:\t\tcard = (struct usb_card_rec *)adapter-\u003ecard;\n 167:\t\tif (card-\u003erx_cmd_ep == context-\u003eep)\n 168:\t\t\tatomic_dec(\u0026card-\u003erx_cmd_urb_pending);\n 169:\t\telse\n 170:\t\t\tatomic_dec(\u0026card-\u003erx_data_urb_pending);\n 171:\t\n 172:\t\tif (recv_length) {\n 173:\t\t\tif (urb-\u003estatus ||\n 174:\t\t\t    test_bit(MWIFIEX_SURPRISE_REMOVED, \u0026adapter-\u003ework_flags)) {\n 175:\t\t\t\tmwifiex_dbg(adapter, ERROR,\n 176:\t\t\t\t\t    \"URB status is failed: %d\\n\", urb-\u003estatus);\n 177:\t\t\t\t/* Do not free skb in case of command ep */\n 178:\t\t\t\tif (card-\u003erx_cmd_ep != context-\u003eep)\n 179:\t\t\t\t\tdev_kfree_skb_any(skb);\n 180:\t\t\t\tgoto setup_for_next;\n 181:\t\t\t}\n 182:\t\t\tif (skb-\u003elen \u003e recv_length)\n 183:\t\t\t\tskb_trim(skb, recv_length);\n 184:\t\t\telse\n 185:\t\t\t\tskb_put(skb, recv_length - skb-\u003elen);\n 186:\t\n 187:\t\t\tstatus = mwifiex_usb_recv(adapter, skb, context-\u003eep);\n 188:\t\n 189:\t\t\tmwifiex_dbg(adapter, INFO,\n 190:\t\t\t\t    \"info: recv_length=%d, status=%d\\n\",\n 191:\t\t\t\t    recv_length, status);\n 192:\t\t\tif (status == -EINPROGRESS) {\n 193:\t\t\t\tmwifiex_queue_main_work(adapter);\n 194:\t\n 195:\t\t\t\t/* urb for data_ep is re-submitted now;\n 196:\t\t\t\t * urb for cmd_ep will be re-submitted in callback\n 197:\t\t\t\t * mwifiex_usb_recv_complete\n 198:\t\t\t\t */\n 199:\t\t\t\tif (card-\u003erx_cmd_ep == context-\u003eep)\n 200:\t\t\t\t\treturn;\n 201:\t\t\t} else {\n 202:\t\t\t\tif (status == -1)\n 203:\t\t\t\t\tmwifiex_dbg(adapter, ERROR,\n 204:\t\t\t\t\t\t    \"received data processing failed!\\n\");\n 205:\t\n 206:\t\t\t\t/* Do not free skb in case of command ep */\n 207:\t\t\t\tif (card-\u003erx_cmd_ep != context-\u003eep)\n 208:\t\t\t\t\tdev_kfree_skb_any(skb);\n 209:\t\t\t}\n 210:\t\t} else if (urb-\u003estatus) {\n 211:\t\t\tif (!test_bit(MWIFIEX_IS_SUSPENDED, \u0026adapter-\u003ework_flags)) {\n 212:\t\t\t\tmwifiex_dbg(adapter, FATAL,\n 213:\t\t\t\t\t    \"Card is removed: %d\\n\", urb-\u003estatus);\n 214:\t\t\t\tset_bit(MWIFIEX_SURPRISE_REMOVED, \u0026adapter-\u003ework_flags);\n 215:\t\t\t}\n 216:\t\t\tdev_kfree_skb_any(skb);\n 217:\t\t\treturn;\n 218:\t\t} else {\n 219:\t\t\t/* Do not free skb in case of command ep */\n 220:\t\t\tif (card-\u003erx_cmd_ep != context-\u003eep)\n 221:\t\t\t\tdev_kfree_skb_any(skb);\n 222:\t\n 223:\t\t\t/* fall through setup_for_next */\n 224:\t\t}\n 225:\t\n 226:\tsetup_for_next:\n 227:\t\tif (card-\u003erx_cmd_ep == context-\u003eep)\n 228:\t\t\tsize = MWIFIEX_RX_CMD_BUF_SIZE;\n 229:\t\telse\n 230:\t\t\tsize = MWIFIEX_RX_DATA_BUF_SIZE;\n 231:\t\n 232:\t\tif (card-\u003erx_cmd_ep == context-\u003eep) {\n 233:\t\t\tmwifiex_usb_submit_rx_urb(context, size);\n 234:\t\t} else {\n 235:\t\t\tif (atomic_read(\u0026adapter-\u003erx_pending) \u003c= HIGH_RX_PENDING) {\n 236:\t\t\t\tmwifiex_usb_submit_rx_urb(context, size);\n 237:\t\t\t} else {\n 238:\t\t\t\tcontext-\u003eskb = NULL;\n 239:\t\t\t}\n 240:\t\t}\n 241:\t\n 242:\t\treturn;\n 243:\t}\n 244:\t\n 245:\tstatic void mwifiex_usb_tx_complete(struct urb *urb)\n 246:\t{\n 247:\t\tstruct urb_context *context = (struct urb_context *)(urb-\u003econtext);\n 248:\t\tstruct mwifiex_adapter *adapter = context-\u003eadapter;\n 249:\t\tstruct usb_card_rec *card = adapter-\u003ecard;\n 250:\t\tstruct usb_tx_data_port *port;\n 251:\t\tint i;\n"
}

21/2 2026/07/12 00:33 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 26370
							output: 44
							thoughts: 21
						

Thoughts:
Okay, here's my attempt at summarizing the thought process, as requested, tailored for an expert audience and in the first person:

**Diving into the Data Reception**

Right, let's get down to brass tacks. I'm focusing on the `mwifiex_usb_recv` function. My analysis needs to begin here, as that's where the rubber meets the road with respect to the received data. I need to understand how this function is managing the incoming traffic. What are the key processes? Are there any obvious bottlenecks? I'll be looking for nuances here, and how this function processes any received data. I'll need to confirm what the data structures are that are being manipulated. Is this where the critical decisions are made about packet parsing, error handling, and ultimately, where the data is passed up to the higher layers? Let's figure this out.



22/2 2026/07/12 00:34 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/marvell/mwifiex/usb.c",
  "FirstLine": 46,
  "LineCount": 100
}

Results:
{
  "Contents": "  46:\tstatic int mwifiex_usb_recv(struct mwifiex_adapter *adapter,\n  47:\t\t\t\t    struct sk_buff *skb, u8 ep)\n  48:\t{\n  49:\t\tu32 recv_type;\n  50:\t\t__le32 tmp;\n  51:\t\tint ret;\n  52:\t\n  53:\t\tif (adapter-\u003ehs_activated)\n  54:\t\t\tmwifiex_process_hs_config(adapter);\n  55:\t\n  56:\t\tif (skb-\u003elen \u003c INTF_HEADER_LEN) {\n  57:\t\t\tmwifiex_dbg(adapter, ERROR,\n  58:\t\t\t\t    \"%s: invalid skb-\u003elen\\n\", __func__);\n  59:\t\t\treturn -1;\n  60:\t\t}\n  61:\t\n  62:\t\tswitch (ep) {\n  63:\t\tcase MWIFIEX_USB_EP_CMD_EVENT:\n  64:\t\t\tmwifiex_dbg(adapter, EVENT,\n  65:\t\t\t\t    \"%s: EP_CMD_EVENT\\n\", __func__);\n  66:\t\t\tskb_copy_from_linear_data(skb, \u0026tmp, INTF_HEADER_LEN);\n  67:\t\t\trecv_type = le32_to_cpu(tmp);\n  68:\t\t\tskb_pull(skb, INTF_HEADER_LEN);\n  69:\t\n  70:\t\t\tswitch (recv_type) {\n  71:\t\t\tcase MWIFIEX_USB_TYPE_CMD:\n  72:\t\t\t\tif (skb-\u003elen \u003e MWIFIEX_SIZE_OF_CMD_BUFFER) {\n  73:\t\t\t\t\tmwifiex_dbg(adapter, ERROR,\n  74:\t\t\t\t\t\t    \"CMD: skb-\u003elen too large\\n\");\n  75:\t\t\t\t\tret = -1;\n  76:\t\t\t\t\tgoto exit_restore_skb;\n  77:\t\t\t\t} else if (!adapter-\u003ecurr_cmd) {\n  78:\t\t\t\t\tmwifiex_dbg(adapter, WARN, \"CMD: no curr_cmd\\n\");\n  79:\t\t\t\t\tif (adapter-\u003eps_state == PS_STATE_SLEEP_CFM) {\n  80:\t\t\t\t\t\tmwifiex_process_sleep_confirm_resp(\n  81:\t\t\t\t\t\t\t\tadapter, skb-\u003edata,\n  82:\t\t\t\t\t\t\t\tskb-\u003elen);\n  83:\t\t\t\t\t\tret = 0;\n  84:\t\t\t\t\t\tgoto exit_restore_skb;\n  85:\t\t\t\t\t}\n  86:\t\t\t\t\tret = -1;\n  87:\t\t\t\t\tgoto exit_restore_skb;\n  88:\t\t\t\t}\n  89:\t\n  90:\t\t\t\tadapter-\u003ecurr_cmd-\u003eresp_skb = skb;\n  91:\t\t\t\tadapter-\u003ecmd_resp_received = true;\n  92:\t\t\t\tbreak;\n  93:\t\t\tcase MWIFIEX_USB_TYPE_EVENT:\n  94:\t\t\t\tif (skb-\u003elen \u003c sizeof(u32)) {\n  95:\t\t\t\t\tmwifiex_dbg(adapter, ERROR,\n  96:\t\t\t\t\t\t    \"EVENT: skb-\u003elen too small\\n\");\n  97:\t\t\t\t\tret = -1;\n  98:\t\t\t\t\tgoto exit_restore_skb;\n  99:\t\t\t\t}\n 100:\t\t\t\tskb_copy_from_linear_data(skb, \u0026tmp, sizeof(u32));\n 101:\t\t\t\tadapter-\u003eevent_cause = le32_to_cpu(tmp);\n 102:\t\t\t\tmwifiex_dbg(adapter, EVENT,\n 103:\t\t\t\t\t    \"event_cause %#x\\n\", adapter-\u003eevent_cause);\n 104:\t\n 105:\t\t\t\tif (skb-\u003elen \u003e MAX_EVENT_SIZE) {\n 106:\t\t\t\t\tmwifiex_dbg(adapter, ERROR,\n 107:\t\t\t\t\t\t    \"EVENT: event body too large\\n\");\n 108:\t\t\t\t\tret = -1;\n 109:\t\t\t\t\tgoto exit_restore_skb;\n 110:\t\t\t\t}\n 111:\t\n 112:\t\t\t\tmemcpy(adapter-\u003eevent_body, skb-\u003edata +\n 113:\t\t\t\t       MWIFIEX_EVENT_HEADER_LEN, skb-\u003elen);\n 114:\t\n 115:\t\t\t\tadapter-\u003eevent_received = true;\n 116:\t\t\t\tadapter-\u003eevent_skb = skb;\n 117:\t\t\t\tbreak;\n 118:\t\t\tdefault:\n 119:\t\t\t\tmwifiex_dbg(adapter, ERROR,\n 120:\t\t\t\t\t    \"unknown recv_type %#x\\n\", recv_type);\n 121:\t\t\t\tret = -1;\n 122:\t\t\t\tgoto exit_restore_skb;\n 123:\t\t\t}\n 124:\t\t\tbreak;\n 125:\t\tcase MWIFIEX_USB_EP_DATA:\n 126:\t\t\tmwifiex_dbg(adapter, DATA, \"%s: EP_DATA\\n\", __func__);\n 127:\t\t\tif (skb-\u003elen \u003e MWIFIEX_RX_DATA_BUF_SIZE) {\n 128:\t\t\t\tmwifiex_dbg(adapter, ERROR,\n 129:\t\t\t\t\t    \"DATA: skb-\u003elen too large\\n\");\n 130:\t\t\t\treturn -1;\n 131:\t\t\t}\n 132:\t\n 133:\t\t\tskb_queue_tail(\u0026adapter-\u003erx_data_q, skb);\n 134:\t\t\tadapter-\u003edata_received = true;\n 135:\t\t\tatomic_inc(\u0026adapter-\u003erx_pending);\n 136:\t\t\tbreak;\n 137:\t\tdefault:\n 138:\t\t\tmwifiex_dbg(adapter, ERROR,\n 139:\t\t\t\t    \"%s: unknown endport %#x\\n\", __func__, ep);\n 140:\t\t\treturn -1;\n 141:\t\t}\n 142:\t\n 143:\t\treturn -EINPROGRESS;\n 144:\t\n 145:\texit_restore_skb:\n"
}

23/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 28126
							output: 40
							thoughts: 90
						

Thoughts:
Here's my understanding of the process, breaking it down step-by-step:

**Network Driver Data Flow Analysis**

Okay, so I'm looking at how this Marvell Wi-Fi driver handles incoming data. It seems like the `mwifiex_usb_recv` function is crucial for receiving data over the USB interface. My immediate observation is that the function sets flags indicating receipt of either a command response or an event – specifically, `adapter->cmd_resp_received = true` or `adapter->event_received = true`. Then, as is often the case when dealing with asynchronous operations, it returns `-EINPROGRESS`. This signals that the receiving is in progress, and the system needs to do other things and return back when the action has finished.

Now, the interesting part is the aftermath. Upon completion of the USB receive operation – as handled in `mwifiex_usb_rx_complete` – a call is made to `mwifiex_queue_main_work(adapter)`. This looks like the driver's way of deferring the actual processing of the data it just received. Which makes sense, especially in a driver context, where you want to minimize the amount of time you're blocking the USB receive path.

Finally, the main work queue, the implication being that the work queue itself is responsible for processing both commands and events. I need to look into `mwifiex_main_process` more closely to understand how it differentiates between command responses and events, and how it handles them appropriately.



24/2 2026/07/12 00:34 tool grepper
0m Args:
{
  "Expression": "mwifiex_main_process",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/main.c=216=static void maybe_quirk_fw_disable_ds(struct mwifiex_adapter *adapter)\n--\ndrivers/net/wireless/marvell/mwifiex/main.c-247- */\ndrivers/net/wireless/marvell/mwifiex/main.c:248:int mwifiex_main_process(struct mwifiex_adapter *adapter)\ndrivers/net/wireless/marvell/mwifiex/main.c-249-{\n--\ndrivers/net/wireless/marvell/mwifiex/main.c-481-}\ndrivers/net/wireless/marvell/mwifiex/main.c:482:EXPORT_SYMBOL_GPL(mwifiex_main_process);\ndrivers/net/wireless/marvell/mwifiex/main.c-483-\n--\ndrivers/net/wireless/marvell/mwifiex/main.c=1419=static void mwifiex_main_work_queue(struct work_struct *work)\n--\ndrivers/net/wireless/marvell/mwifiex/main.c-1425-\t\treturn;\ndrivers/net/wireless/marvell/mwifiex/main.c:1426:\tmwifiex_main_process(adapter);\ndrivers/net/wireless/marvell/mwifiex/main.c-1427-}\n--\ndrivers/net/wireless/marvell/mwifiex/main.h=1529=int mwifiex_set_tx_power(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/main.h-1531-\ndrivers/net/wireless/marvell/mwifiex/main.h:1532:int mwifiex_main_process(struct mwifiex_adapter *);\ndrivers/net/wireless/marvell/mwifiex/main.h-1533-\n--\ndrivers/net/wireless/marvell/mwifiex/sdio.c=1340=mwifiex_sdio_interrupt(struct sdio_func *func)\n--\ndrivers/net/wireless/marvell/mwifiex/sdio.c-1356-\tmwifiex_interrupt_status(adapter);\ndrivers/net/wireless/marvell/mwifiex/sdio.c:1357:\tmwifiex_main_process(adapter);\ndrivers/net/wireless/marvell/mwifiex/sdio.c-1358-}\n"
}

25/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 29202
							output: 40
							thoughts: 44
						

Thoughts:
Here's my analysis of the provided information, as if these were my internal thoughts:

**Analyzing the Core Processing Loop in the Driver**

Okay, so `mwifiex_main_process` seems to be the central function for this Wi-Fi driver. That makes sense. It's the main loop, the heartbeat. The important thing here is *how* it's doing its job.

The text points out that it's calling two key functions: `mwifiex_process_cmdresp` and `mwifiex_process_event`. These are the obvious primary functions to process commands and events received. Of course, that's what I'd expect. `cmdresp` is for handling command responses, that's pretty self-explanatory. But events, that's where the interesting stuff lies, right? So let's dive into `mwifiex_process_event` and see what that's actually doing. That's the part that'll likely reveal how the driver is responding to the environment, the network, and the hardware.



26/2 2026/07/12 00:34 tool grepper
0m Args:
{
  "Expression": "mwifiex_process_event",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/cmdevt.c=421=void mwifiex_free_cmd_buffer(struct mwifiex_adapter *adapter)\n--\ndrivers/net/wireless/marvell/mwifiex/cmdevt.c-469- */\ndrivers/net/wireless/marvell/mwifiex/cmdevt.c:470:int mwifiex_process_event(struct mwifiex_adapter *adapter)\ndrivers/net/wireless/marvell/mwifiex/cmdevt.c-471-{\n--\ndrivers/net/wireless/marvell/mwifiex/main.c=248=int mwifiex_main_process(struct mwifiex_adapter *adapter)\n--\ndrivers/net/wireless/marvell/mwifiex/main.c-350-\t\t\tadapter-\u003eevent_received = false;\ndrivers/net/wireless/marvell/mwifiex/main.c:351:\t\t\tmwifiex_process_event(adapter);\ndrivers/net/wireless/marvell/mwifiex/main.c-352-\t\t}\n--\ndrivers/net/wireless/marvell/mwifiex/main.h=1071=int mwifiex_process_mgmt_packet(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/main.h-1073-\ndrivers/net/wireless/marvell/mwifiex/main.h:1074:int mwifiex_process_event(struct mwifiex_adapter *adapter);\ndrivers/net/wireless/marvell/mwifiex/main.h-1075-\n"
}

27/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 29927
							output: 47
							thoughts: 22
						

Thoughts:
Here's my analysis of the provided thought process, tailored for an expert audience:

**Diving into `mwifiex_process_event`**

Okay, so we're starting with `mwifiex_process_event` in `cmdevt.c`. That's a solid entry point for investigating how the driver handles events, specifically within the Marvell Wi-Fi driver context. This likely means we're dealing with the core event handling loop or dispatch mechanism. My initial expectation is to find the function responsible for receiving events from the firmware or hardware and then routing them to the appropriate handlers based on their type. We're probably talking about the heart of the interrupt processing or polling mechanism here. I'm keen to see if it's a simple switch-case, a more sophisticated lookup table, or something event-driven like a callback registration system. The goal now is to look at the process.



28/2 2026/07/12 00:34 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/marvell/mwifiex/cmdevt.c",
  "FirstLine": 470,
  "LineCount": 100
}

Results:
{
  "Contents": " 470:\tint mwifiex_process_event(struct mwifiex_adapter *adapter)\n 471:\t{\n 472:\t\tint ret, i;\n 473:\t\tstruct mwifiex_private *priv;\n 474:\t\tstruct sk_buff *skb = adapter-\u003eevent_skb;\n 475:\t\tu32 eventcause;\n 476:\t\tstruct mwifiex_rxinfo *rx_info;\n 477:\t\n 478:\t\tif ((adapter-\u003eevent_cause \u0026 EVENT_ID_MASK) == EVENT_RADAR_DETECTED) {\n 479:\t\t\tfor (i = 0; i \u003c adapter-\u003epriv_num; i++) {\n 480:\t\t\t\tpriv = adapter-\u003epriv[i];\n 481:\t\t\t\tif (mwifiex_is_11h_active(priv)) {\n 482:\t\t\t\t\tadapter-\u003eevent_cause |=\n 483:\t\t\t\t\t\t((priv-\u003ebss_num \u0026 0xff) \u003c\u003c 16) |\n 484:\t\t\t\t\t\t((priv-\u003ebss_type \u0026 0xff) \u003c\u003c 24);\n 485:\t\t\t\t\tbreak;\n 486:\t\t\t\t}\n 487:\t\t\t}\n 488:\t\t}\n 489:\t\n 490:\t\teventcause = adapter-\u003eevent_cause;\n 491:\t\n 492:\t\t/* Save the last event to debug log */\n 493:\t\tadapter-\u003edbg.last_event_index =\n 494:\t\t\t\t(adapter-\u003edbg.last_event_index + 1) % DBG_CMD_NUM;\n 495:\t\tadapter-\u003edbg.last_event[adapter-\u003edbg.last_event_index] =\n 496:\t\t\t\t\t\t\t\t(u16) eventcause;\n 497:\t\n 498:\t\t/* Get BSS number and corresponding priv */\n 499:\t\tpriv = mwifiex_get_priv_by_id(adapter, EVENT_GET_BSS_NUM(eventcause),\n 500:\t\t\t\t\t      EVENT_GET_BSS_TYPE(eventcause));\n 501:\t\tif (!priv)\n 502:\t\t\tpriv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_ANY);\n 503:\t\n 504:\t\t/* Clear BSS_NO_BITS from event */\n 505:\t\teventcause \u0026= EVENT_ID_MASK;\n 506:\t\tadapter-\u003eevent_cause = eventcause;\n 507:\t\n 508:\t\tif (skb) {\n 509:\t\t\trx_info = MWIFIEX_SKB_RXCB(skb);\n 510:\t\t\tmemset(rx_info, 0, sizeof(*rx_info));\n 511:\t\t\trx_info-\u003ebss_num = priv-\u003ebss_num;\n 512:\t\t\trx_info-\u003ebss_type = priv-\u003ebss_type;\n 513:\t\t\tmwifiex_dbg_dump(adapter, EVT_D, \"Event Buf:\",\n 514:\t\t\t\t\t skb-\u003edata, skb-\u003elen);\n 515:\t\t}\n 516:\t\n 517:\t\tmwifiex_dbg(adapter, EVENT, \"EVENT: cause: %#x\\n\", eventcause);\n 518:\t\n 519:\t\tif (priv-\u003ebss_role == MWIFIEX_BSS_ROLE_UAP)\n 520:\t\t\tret = mwifiex_process_uap_event(priv);\n 521:\t\telse\n 522:\t\t\tret = mwifiex_process_sta_event(priv);\n 523:\t\n 524:\t\tadapter-\u003eevent_cause = 0;\n 525:\t\tadapter-\u003eevent_skb = NULL;\n 526:\t\tadapter-\u003eif_ops.event_complete(adapter, skb);\n 527:\t\n 528:\t\treturn ret;\n 529:\t}\n 530:\t\n 531:\t/*\n 532:\t * This function prepares a command and send it to the firmware.\n 533:\t *\n 534:\t * Preparation includes -\n 535:\t *      - Sanity tests to make sure the card is still present or the FW\n 536:\t *        is not reset\n 537:\t *      - Getting a new command node from the command free queue\n 538:\t *      - Initializing the command node for default parameters\n 539:\t *      - Fill up the non-default parameters and buffer pointers\n 540:\t *      - Add the command to pending queue\n 541:\t */\n 542:\tint mwifiex_send_cmd(struct mwifiex_private *priv, u16 cmd_no,\n 543:\t\t\t     u16 cmd_action, u32 cmd_oid, void *data_buf, bool sync)\n 544:\t{\n 545:\t\tint ret;\n 546:\t\tstruct mwifiex_adapter *adapter = priv-\u003eadapter;\n 547:\t\tstruct cmd_ctrl_node *cmd_node;\n 548:\t\tstruct host_cmd_ds_command *cmd_ptr;\n 549:\t\n 550:\t\tif (!adapter) {\n 551:\t\t\tpr_err(\"PREP_CMD: adapter is NULL\\n\");\n 552:\t\t\treturn -1;\n 553:\t\t}\n 554:\t\n 555:\t\tif (test_bit(MWIFIEX_IS_SUSPENDED, \u0026adapter-\u003ework_flags)) {\n 556:\t\t\tmwifiex_dbg(adapter, ERROR,\n 557:\t\t\t\t    \"PREP_CMD: device in suspended state\\n\");\n 558:\t\t\treturn -1;\n 559:\t\t}\n 560:\t\n 561:\t\tif (test_bit(MWIFIEX_IS_HS_ENABLING, \u0026adapter-\u003ework_flags) \u0026\u0026\n 562:\t\t    cmd_no != HostCmd_CMD_802_11_HS_CFG_ENH) {\n 563:\t\t\tmwifiex_dbg(adapter, ERROR,\n 564:\t\t\t\t    \"PREP_CMD: host entering sleep state\\n\");\n 565:\t\t\treturn -1;\n 566:\t\t}\n 567:\t\n 568:\t\tif (test_bit(MWIFIEX_SURPRISE_REMOVED, \u0026adapter-\u003ework_flags)) {\n 569:\t\t\tmwifiex_dbg(adapter, ERROR,\n"
}

29/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 31840
							output: 42
							thoughts: 28
						

Thoughts:
Okay, here's my take on those thoughts, framed as an expert's internal monologue:

**Investigating STA Event Handling in mwifiex_process_sta_event**

Alright, I'm digging into `mwifiex_process_sta_event`. Standard Station (STA) events. My initial hunch is that this function will be the focal point for handling a variety of STA-related events. But what I need to pinpoint is how this function processes any scan results that may be associated with it. Is this where the incoming scan results get parsed or used? It’s logical that an STA event handler would need to deal with scan data eventually, but I must know whether this function is the right place to look. I need to understand if it's responsible for the immediate handling, or if it dispatches the scan results to other modules for further processing. I'm going to carefully review the code flow here and see what I can find.



30/2 2026/07/12 00:34 tool grepper
0m Args:
{
  "Expression": "mwifiex_process_sta_event",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/cmdevt.c=470=int mwifiex_process_event(struct mwifiex_adapter *adapter)\n--\ndrivers/net/wireless/marvell/mwifiex/cmdevt.c-521-\telse\ndrivers/net/wireless/marvell/mwifiex/cmdevt.c:522:\t\tret = mwifiex_process_sta_event(priv);\ndrivers/net/wireless/marvell/mwifiex/cmdevt.c-523-\n--\ndrivers/net/wireless/marvell/mwifiex/main.h=1143=int mwifiex_handle_uap_rx_forward(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/main.h-1144-\t\t\t\t  struct sk_buff *skb);\ndrivers/net/wireless/marvell/mwifiex/main.h:1145:int mwifiex_process_sta_event(struct mwifiex_private *);\ndrivers/net/wireless/marvell/mwifiex/main.h-1146-int mwifiex_process_uap_event(struct mwifiex_private *);\n--\ndrivers/net/wireless/marvell/mwifiex/sta_event.c=587=mwifiex_fw_dump_info_event(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/sta_event.c-695- */\ndrivers/net/wireless/marvell/mwifiex/sta_event.c:696:int mwifiex_process_sta_event(struct mwifiex_private *priv)\ndrivers/net/wireless/marvell/mwifiex/sta_event.c-697-{\n"
}

31/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 32560
							output: 47
							thoughts: 23
						

Thoughts:
Here's my attempt at summarizing the thought process, tailored for an expert audience:

**Diving into the STA Event Processing**

Alright, let's get down to brass tacks. I'm going to jump into the `mwifiex_process_sta_event` function within `sta_event.c`. This is where the rubber meets the road when it comes to handling station-related events – the heart of the matter for STA behavior. I need to understand exactly how the driver is responding to these events. What are the key decision points? What are the implications of different event types? I'm going to look for any potential bottlenecks or areas where further optimization could be achieved. My focus is on the efficiency and robustness of the handling, and I'll be particularly interested in race conditions or any unusual control flow. Time to dig in and see what secrets this function holds.



32/2 2026/07/12 00:34 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/marvell/mwifiex/sta_event.c",
  "FirstLine": 696,
  "LineCount": 100
}

Results:
{
  "Contents": " 696:\tint mwifiex_process_sta_event(struct mwifiex_private *priv)\n 697:\t{\n 698:\t\tstruct mwifiex_adapter *adapter = priv-\u003eadapter;\n 699:\t\tint ret = 0, i;\n 700:\t\tu32 eventcause = adapter-\u003eevent_cause;\n 701:\t\tu16 ctrl, reason_code;\n 702:\t\tu8 ibss_sta_addr[ETH_ALEN];\n 703:\t\tstruct mwifiex_sta_node *sta_ptr;\n 704:\t\n 705:\t\tswitch (eventcause) {\n 706:\t\tcase EVENT_DUMMY_HOST_WAKEUP_SIGNAL:\n 707:\t\t\tmwifiex_dbg(adapter, ERROR,\n 708:\t\t\t\t    \"invalid EVENT: DUMMY_HOST_WAKEUP_SIGNAL, ignore it\\n\");\n 709:\t\t\tbreak;\n 710:\t\tcase EVENT_LINK_SENSED:\n 711:\t\t\tmwifiex_dbg(adapter, EVENT, \"event: LINK_SENSED\\n\");\n 712:\t\t\tif (!netif_carrier_ok(priv-\u003enetdev))\n 713:\t\t\t\tnetif_carrier_on(priv-\u003enetdev);\n 714:\t\t\tmwifiex_wake_up_net_dev_queue(priv-\u003enetdev, adapter);\n 715:\t\t\tbreak;\n 716:\t\n 717:\t\tcase EVENT_DEAUTHENTICATED:\n 718:\t\t\tmwifiex_dbg(adapter, EVENT, \"event: Deauthenticated\\n\");\n 719:\t\t\tif (priv-\u003ewps.session_enable) {\n 720:\t\t\t\tmwifiex_dbg(adapter, INFO,\n 721:\t\t\t\t\t    \"info: receive deauth event in wps session\\n\");\n 722:\t\t\t\tbreak;\n 723:\t\t\t}\n 724:\t\t\tadapter-\u003edbg.num_event_deauth++;\n 725:\t\t\tif (priv-\u003emedia_connected) {\n 726:\t\t\t\treason_code =\n 727:\t\t\t\t\tget_unaligned_le16(adapter-\u003eevent_body);\n 728:\t\t\t\tmwifiex_reset_connect_state(priv, reason_code, true);\n 729:\t\t\t}\n 730:\t\t\tbreak;\n 731:\t\n 732:\t\tcase EVENT_DISASSOCIATED:\n 733:\t\t\tmwifiex_dbg(adapter, EVENT, \"event: Disassociated\\n\");\n 734:\t\t\tif (priv-\u003ewps.session_enable) {\n 735:\t\t\t\tmwifiex_dbg(adapter, INFO,\n 736:\t\t\t\t\t    \"info: receive disassoc event in wps session\\n\");\n 737:\t\t\t\tbreak;\n 738:\t\t\t}\n 739:\t\t\tadapter-\u003edbg.num_event_disassoc++;\n 740:\t\t\tif (priv-\u003emedia_connected) {\n 741:\t\t\t\treason_code =\n 742:\t\t\t\t\tget_unaligned_le16(adapter-\u003eevent_body);\n 743:\t\t\t\tmwifiex_reset_connect_state(priv, reason_code, true);\n 744:\t\t\t}\n 745:\t\t\tbreak;\n 746:\t\n 747:\t\tcase EVENT_LINK_LOST:\n 748:\t\t\tmwifiex_dbg(adapter, EVENT, \"event: Link lost\\n\");\n 749:\t\t\tadapter-\u003edbg.num_event_link_lost++;\n 750:\t\t\tif (priv-\u003emedia_connected) {\n 751:\t\t\t\treason_code =\n 752:\t\t\t\t\tget_unaligned_le16(adapter-\u003eevent_body);\n 753:\t\t\t\tif (adapter-\u003ehost_mlme_enabled) {\n 754:\t\t\t\t\tadapter-\u003epriv_link_lost = priv;\n 755:\t\t\t\t\tadapter-\u003ehost_mlme_link_lost = true;\n 756:\t\t\t\t\tqueue_work(adapter-\u003ehost_mlme_workqueue,\n 757:\t\t\t\t\t\t   \u0026adapter-\u003ehost_mlme_work);\n 758:\t\t\t\t} else {\n 759:\t\t\t\t\tmwifiex_reset_connect_state(priv, reason_code,\n 760:\t\t\t\t\t\t\t\t    true);\n 761:\t\t\t\t}\n 762:\t\t\t}\n 763:\t\t\tbreak;\n 764:\t\n 765:\t\tcase EVENT_PS_SLEEP:\n 766:\t\t\tmwifiex_dbg(adapter, EVENT, \"info: EVENT: SLEEP\\n\");\n 767:\t\n 768:\t\t\tadapter-\u003eps_state = PS_STATE_PRE_SLEEP;\n 769:\t\n 770:\t\t\tmwifiex_check_ps_cond(adapter);\n 771:\t\t\tbreak;\n 772:\t\n 773:\t\tcase EVENT_PS_AWAKE:\n 774:\t\t\tmwifiex_dbg(adapter, EVENT, \"info: EVENT: AWAKE\\n\");\n 775:\t\t\tif (!adapter-\u003epps_uapsd_mode \u0026\u0026\n 776:\t\t\t    (priv-\u003eport_open ||\n 777:\t\t\t     (priv-\u003ebss_mode == NL80211_IFTYPE_ADHOC)) \u0026\u0026\n 778:\t\t\t    priv-\u003emedia_connected \u0026\u0026 adapter-\u003esleep_period.period) {\n 779:\t\t\t\tadapter-\u003epps_uapsd_mode = true;\n 780:\t\t\t\tmwifiex_dbg(adapter, EVENT,\n 781:\t\t\t\t\t    \"event: PPS/UAPSD mode activated\\n\");\n 782:\t\t\t}\n 783:\t\t\tadapter-\u003etx_lock_flag = false;\n 784:\t\t\tif (adapter-\u003epps_uapsd_mode \u0026\u0026 adapter-\u003egen_null_pkt) {\n 785:\t\t\t\tif (mwifiex_check_last_packet_indication(priv)) {\n 786:\t\t\t\t\tif (adapter-\u003edata_sent ||\n 787:\t\t\t\t\t    (adapter-\u003eif_ops.is_port_ready \u0026\u0026\n 788:\t\t\t\t\t     !adapter-\u003eif_ops.is_port_ready(priv))) {\n 789:\t\t\t\t\t\tadapter-\u003eps_state = PS_STATE_AWAKE;\n 790:\t\t\t\t\t\tadapter-\u003epm_wakeup_card_req = false;\n 791:\t\t\t\t\t\tadapter-\u003epm_wakeup_fw_try = false;\n 792:\t\t\t\t\t\ttimer_delete(\u0026adapter-\u003ewakeup_timer);\n 793:\t\t\t\t\t\tbreak;\n 794:\t\t\t\t\t}\n 795:\t\t\t\t\tif (!mwifiex_send_null_packet\n"
}

33/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 34480
							output: 44
							thoughts: 181
						

Thoughts:
**Tracing the Function Call Chain**

Okay, so I'm digging into this `mwifiex` code again, trying to understand how network compatibility is actually determined. It looks like `mwifiex_search_oui_in_ie` is a key function here. I see that it's being called by `mwifiex_is_rsn_oui_present` and `mwifiex_is_wpa_oui_present`, which, in turn, are called from `mwifiex_is_network_compatible`. That makes sense; checking for OUI presence is a good indicator of compatibility, especially with WPA/RSN security.

Now, `mwifiex_is_network_compatible` feeds into `mwifiex_check_network_compatibility`. This one's interesting, and is where things start to get more contextually relevant. I need to understand how *this* function is used.

Alright, `mwifiex_check_network_compatibility` is called by `mwifiex_update_curr_bss_params` and `mwifiex_bss_start`. `mwifiex_bss_start` seems pretty straightforward; it's likely a function that initiates the connection to a network. However, `mwifiex_update_curr_bss_params` is also calling this. I thought that function was called by `mwifiex_cmd_802_11_scan`, but I should verify that. Let me double-check how `mwifiex_update_curr_bss_params` is used.



34/2 2026/07/12 00:34 tool grepper
0m Args:
{
  "Expression": "mwifiex_update_curr_bss_params",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/scan.c=1659=static int mwifiex_save_hidden_ssid_channels(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-1702-\ndrivers/net/wireless/marvell/mwifiex/scan.c:1703:static int mwifiex_update_curr_bss_params(struct mwifiex_private *priv,\ndrivers/net/wireless/marvell/mwifiex/scan.c-1704-\t\t\t\t\t  struct cfg80211_bss *bss)\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c=1743=mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-1890-\t\t\t\t\t    ETH_ALEN))\ndrivers/net/wireless/marvell/mwifiex/scan.c:1891:\t\t\t\t\tmwifiex_update_curr_bss_params(priv,\ndrivers/net/wireless/marvell/mwifiex/scan.c-1892-\t\t\t\t\t\t\t\t       bss);\n"
}

35/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 35356
							output: 44
							thoughts: 35
						

Thoughts:
Okay, here's my interpretation of that thought process, from an expert's perspective:

**Diving into the Wi-Fi Scan Response**

Right, so I'm thinking about the low-level processing happening in the Wi-Fi driver, specifically around scan results. I see that `mwifiex_parse_single_response_buf` gets called, and my mind immediately jumps to its origins: either `mwifiex_ret_802_11_scan` or a very similar function responsible for handling the response after a Wi-Fi scan request. That function is clearly a key component in dissecting the data returned by the wireless adapter after it's gone out and looked for available networks. It's the point where we start pulling apart that raw buffer, likely filled with 802.11 information elements (IEs), to extract the meaningful data like SSID, channel, signal strength, security capabilities, and all the juicy details we need to populate our scan results. I'm imagining it's a critical function, potentially complex with all the possible variations in 802.11 frame formats and vendor-specific extensions. I know from experience that this part is where things can get tricky, dealing with all the different ways vendors implement things. I need to be sure it handles everything properly, ensuring no data loss or corruption, and that it remains efficient for good performance.



36/2 2026/07/12 00:34 tool grepper
0m Args:
{
  "Expression": "mwifiex_parse_single_response_buf",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/scan.c=1742=static int\ndrivers/net/wireless/marvell/mwifiex/scan.c:1743:mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info,\ndrivers/net/wireless/marvell/mwifiex/scan.c-1744-\t\t\t\t  u32 *bytes_left, u64 fw_tsf, u8 *radio_type,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c=2102=int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-2228-\ndrivers/net/wireless/marvell/mwifiex/scan.c:2229:\t\tret = mwifiex_parse_single_response_buf(priv, \u0026bss_info,\ndrivers/net/wireless/marvell/mwifiex/scan.c-2230-\t\t\t\t\t\t\t\u0026bytes_left,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c=2603=int mwifiex_handle_event_ext_scan_report(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-2719-\t\t}\ndrivers/net/wireless/marvell/mwifiex/scan.c:2720:\t\tret = mwifiex_parse_single_response_buf(priv, \u0026bss_info,\ndrivers/net/wireless/marvell/mwifiex/scan.c-2721-\t\t\t\t\t\t\t\u0026bytes_left, fw_tsf,\n"
}

37/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 36169
							output: 37
							thoughts: 150
						

Thoughts:
**Analyzing the Attack Surface: Scan Command Handlers**

Okay, so `mwifiex_ret_802_11_scan` is *the* function I need to look at; it's the command response handler for scan commands. I know that `mwifiex_handle_event_ext_scan_report` is also important as it handles scan reports. Both of these are interesting because they get their data from the firmware, which means that I can potentially feed them fuzzing data through USB. This confirms the modified code is indeed reachable and, crucially, processes *untrusted* data directly from the device/firmware.

Considering this is a bug fix for an out-of-bounds read when parsing Wi-Fi IEs, I'm thinking, "Absolutely, this is fuzz-worthy." The potential for a reliable crash here is high, and this sounds like a great use case for fuzzing. I need to make sure `MWIFIEX` and `MWIFIEX_USB` are enabled for the test and ensure I do not neglect any potentially related configs.
Let me check those configurations...



38/2 2026/07/12 00:34 tool grepper
0m Args:
{
  "Expression": "config MWIFIEX",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/net/wireless/marvell/mwifiex/Kconfig:2:config MWIFIEX\ndrivers/net/wireless/marvell/mwifiex/Kconfig-3-\ttristate \"Marvell WiFi-Ex Driver\"\n--\ndrivers/net/wireless/marvell/mwifiex/Kconfig-11-\ndrivers/net/wireless/marvell/mwifiex/Kconfig:12:config MWIFIEX_SDIO\ndrivers/net/wireless/marvell/mwifiex/Kconfig-13-\ttristate \"Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897/SD8977/SD8978/SD8987/SD8997\"\n--\ndrivers/net/wireless/marvell/mwifiex/Kconfig-24-\ndrivers/net/wireless/marvell/mwifiex/Kconfig:25:config MWIFIEX_PCIE\ndrivers/net/wireless/marvell/mwifiex/Kconfig-26-\ttristate \"Marvell WiFi-Ex Driver for PCIE 8766/8897/8997\"\n--\ndrivers/net/wireless/marvell/mwifiex/Kconfig-36-\ndrivers/net/wireless/marvell/mwifiex/Kconfig:37:config MWIFIEX_USB\ndrivers/net/wireless/marvell/mwifiex/Kconfig-38-\ttristate \"Marvell WiFi-Ex Driver for USB8766/8797/8997\"\n"
}

39/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 37019
							output: 40
							thoughts: 1019
						

Thoughts:
**Refining the Target for Fuzzing: A Deep Dive into MWIFIEX Compatibility**

Okay, so I've zeroed in on the `MWIFIEX` and `MWIFIEX_USB` modules as the prime targets for fuzzing. Given the context, I need to understand the data flow and identify key functions. My initial thought process has led me to a few potentially vulnerable functions, so let's walk through my reasoning.

Initially, I identified `mwifiex_search_oui_in_ie` and the functions that call it: `mwifiex_is_rsn_oui_present`, `mwifiex_is_wpa_oui_present`. These are ultimately called by `mwifiex_is_network_compatible`. The focus is to determine network compatibility. I then added functions that are related to these: `mwifiex_check_network_compatibility`, `mwifiex_update_curr_bss_params`, and `mwifiex_parse_single_response_buf`.

Let's quickly check their static status. I confirmed that `mwifiex_search_oui_in_ie`, `mwifiex_is_rsn_oui_present`, `mwifiex_is_wpa_oui_present`, `mwifiex_is_network_compatible`, and `mwifiex_parse_single_response_buf` are static, while `mwifiex_check_network_compatibility`, `mwifiex_ret_802_11_scan`, and `mwifiex_handle_event_ext_scan_report` are not.

Next, I compiled a list of functions that need attention:
*   `mwifiex_search_oui_in_ie`
*   `mwifiex_is_rsn_oui_present`
*   `mwifiex_is_wpa_oui_present`
*   `mwifiex_is_network_compatible`
*   `mwifiex_check_network_compatibility`
*   `mwifiex_update_curr_bss_params`
*   `mwifiex_parse_single_response_buf`
*   `mwifiex_ret_802_11_scan`
*   `mwifiex_handle_event_ext_scan_report`

Then, I looked at the callers of `mwifiex_check_network_compatibility`. I found `mwifiex_bss_start` in `sta_ioctl.c`, so I should add that one.

Now, a crucial point: Is this even reachable through USB fuzzing? The answer is yes. The USB driver receives data from the device in the form of command responses or events. Specifically, `mwifiex_ret_802_11_scan` handles command responses and `mwifiex_handle_event_ext_scan_report` handles events. This means both are reachable through emulation of the USB device sending responses or events from a scan command. These are definitely good fuzzing targets.

Finally, let me re-evaluate my list for the most effective fuzzing scope. `mwifiex_bss_start` might be the entry point to fuzzing a lot of the compatibility checks. While it's called through an ioctl/cfg80211 callback (like from `mwifiex_set_bss_params`), it calls `mwifiex_check_network_compatibility` on a BSS descriptor. This BSS descriptor is, importantly, populated from scan results. Scan results, in turn, *come from the device*. So, the data within the BSS descriptor is indeed device-controlled and fuzzable.

So the refined focus symbols are:

*   `mwifiex_search_oui_in_ie`
*   `mwifiex_is_rsn_oui_present`
*   `mwifiex_is_wpa_oui_present`
*   `mwifiex_is_network_compatible`
*   `mwifiex_check_network_compatibility`
*   `mwifiex_update_curr_bss_params`
*   `mwifiex_parse_single_response_buf`
*   `mwifiex_ret_802_11_scan`
*   `mwifiex_handle_event_ext_scan_report`
*   `mwifiex_bss_start`

Now, let's explore `mwifiex_bss_start` in detail.



40/2 2026/07/12 00:34 tool grepper
0m Args:
{
  "Expression": "mwifiex_bss_start",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/cfg80211.c=2266=mwifiex_cfg80211_assoc(struct mwifiex_private *priv, size_t ssid_len,\n--\ndrivers/net/wireless/marvell/mwifiex/cfg80211.c-2405-\ndrivers/net/wireless/marvell/mwifiex/cfg80211.c:2406:\tret = mwifiex_bss_start(priv, bss, \u0026req_ssid);\ndrivers/net/wireless/marvell/mwifiex/cfg80211.c-2407-\tif (ret)\n--\ndrivers/net/wireless/marvell/mwifiex/cfg80211.c=4428=mwifiex_cfg80211_associate(struct wiphy *wiphy, struct net_device *dev,\n--\ndrivers/net/wireless/marvell/mwifiex/cfg80211.c-4520-\tcfg80211_ref_bss(adapter-\u003ewiphy, req-\u003ebss);\ndrivers/net/wireless/marvell/mwifiex/cfg80211.c:4521:\tret = mwifiex_bss_start(priv, req-\u003ebss, \u0026req_ssid);\ndrivers/net/wireless/marvell/mwifiex/cfg80211.c-4522-\tif (ret) {\n--\ndrivers/net/wireless/marvell/mwifiex/main.h=1478=int mwifiex_wait_queue_complete(struct mwifiex_adapter *adapter,\ndrivers/net/wireless/marvell/mwifiex/main.h-1479-\t\t\t\tstruct cmd_ctrl_node *cmd_queued);\ndrivers/net/wireless/marvell/mwifiex/main.h:1480:int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,\ndrivers/net/wireless/marvell/mwifiex/main.h-1481-\t\t      struct cfg80211_ssid *req_ssid);\n--\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c=249=static int mwifiex_process_country_ie(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c-317- */\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c:318:int mwifiex_bss_start(struct mwifiex_private *priv, struct cfg80211_bss *bss,\ndrivers/net/wireless/marvell/mwifiex/sta_ioctl.c-319-\t\t      struct cfg80211_ssid *req_ssid)\n"
}

41/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 39771
							output: 41
							thoughts: 207
						

Thoughts:
**My Assessment of the Marvell Wi-Fi Driver Configuration**

Okay, so `mwifiex_bss_start` uses a `struct cfg80211_bss *bss`. This is populated by `mac80211/cfg80211`, right? And that information *comes from* the scan results provided by the driver itself, handed off to `cfg80211`, then passed back during association. Got it – the device is the source of the BSS data. That confirms the direction of the data flow, which is helpful. And the `FocusSymbols` are, as expected, a solid starting point.

Now, let's look at the `EnableConfigs`. We have:

*   `MWIFIEX`
*   `MWIFIEX_USB`
*   `MWIFIEX_SDIO`
*   `MWIFIEX_PCIE`

For testing the core logic through USB fuzzing, it seems like `MWIFIEX` and `MWIFIEX_USB` should be enough. That'll keep the scope manageable for now.

But wait a second... before I commit to that, I need to check something. Does `MWIFIEX_USB` depend on any other configurations? Best to check the `drivers/net/wireless/marvell/mwifiex/Kconfig` file quickly, just to be sure there aren't any hidden dependencies. That could impact our testing strategy. I'll take a look.



42/2 2026/07/12 00:34 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/marvell/mwifiex/Kconfig",
  "FirstLine": 1,
  "LineCount": 50
}

Results:
{
  "Contents": "   1:\t# SPDX-License-Identifier: GPL-2.0-only\n   2:\tconfig MWIFIEX\n   3:\t\ttristate \"Marvell WiFi-Ex Driver\"\n   4:\t\tdepends on CFG80211\n   5:\t\thelp\n   6:\t\t  This adds support for wireless adapters based on Marvell\n   7:\t\t  802.11n/ac chipsets.\n   8:\t\n   9:\t\t  If you choose to build it as a module, it will be called\n  10:\t\t  mwifiex.\n  11:\t\n  12:\tconfig MWIFIEX_SDIO\n  13:\t\ttristate \"Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897/SD8977/SD8978/SD8987/SD8997\"\n  14:\t\tdepends on MWIFIEX \u0026\u0026 MMC\n  15:\t\tselect FW_LOADER\n  16:\t\tselect WANT_DEV_COREDUMP\n  17:\t\thelp\n  18:\t\t  This adds support for wireless adapters based on Marvell\n  19:\t\t  8786/8787/8797/8887/8897/8977/8978/8987/8997 chipsets with\n  20:\t\t  SDIO interface. SD8978 is also known as NXP IW416.\n  21:\t\n  22:\t\t  If you choose to build it as a module, it will be called\n  23:\t\t  mwifiex_sdio.\n  24:\t\n  25:\tconfig MWIFIEX_PCIE\n  26:\t\ttristate \"Marvell WiFi-Ex Driver for PCIE 8766/8897/8997\"\n  27:\t\tdepends on MWIFIEX \u0026\u0026 PCI\n  28:\t\tselect FW_LOADER\n  29:\t\tselect WANT_DEV_COREDUMP\n  30:\t\thelp\n  31:\t\t  This adds support for wireless adapters based on Marvell\n  32:\t\t  8766/8897/8997 chipsets with PCIe interface.\n  33:\t\n  34:\t\t  If you choose to build it as a module, it will be called\n  35:\t\t  mwifiex_pcie.\n  36:\t\n  37:\tconfig MWIFIEX_USB\n  38:\t\ttristate \"Marvell WiFi-Ex Driver for USB8766/8797/8997\"\n  39:\t\tdepends on MWIFIEX \u0026\u0026 USB\n  40:\t\tselect FW_LOADER\n  41:\t\thelp\n  42:\t\t  This adds support for wireless adapters based on Marvell\n  43:\t\t  8797/8997 chipset with USB interface.\n  44:\t\n  45:\t\t  If you choose to build it as a module, it will be called\n  46:\t\t  mwifiex_usb.\n"
}

43/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 41102
							output: 45
							thoughts: 477
						

Thoughts:
**Fuzzing Target Identification: MWIFIEX Driver**

Okay, so I've zeroed in on the `MWIFIEX` and `MWIFIEX_USB` modules. They're clearly the key players here, relying on `CFG80211` and the `USB` subsystem, which are usually baked into Syzkaller configurations, making them pretty accessible targets.

Let's break down the strategy. This is what's looking promising:

*   **WorthFuzzing:** Yes, absolutely. This is promising.
*   **Focus Symbols:** We have a solid list of potentially vulnerable functions. I'll need to examine these in more detail, but the initial impressions are good. They're related to parsing Wi-Fi Information Elements (IEs), handling scan results, and managing network compatibility, all of which are common fuzzing targets:
    *   `mwifiex_search_oui_in_ie`
    *   `mwifiex_is_rsn_oui_present`
    *   `mwifiex_is_wpa_oui_present`
    *   `mwifiex_is_network_compatible`
    *   `mwifiex_check_network_compatibility`
    *   `mwifiex_update_curr_bss_params`
    *   `mwifiex_parse_single_response_buf`
    *   `mwifiex_ret_802_11_scan`
    *   `mwifiex_handle_event_ext_scan_report`
    *   `mwifiex_bss_start`
*   **EnableConfigs:** The `MWIFIEX` and `MWIFIEX_USB` configurations need to be enabled.
*   **Reasoning:** The initial motivation stems from a patch that fixes an out-of-bounds read vulnerability in `mwifiex_search_oui_in_ie` when dealing with Wi-Fi IEs. Because the driver operates over USB, this suggests the firmware responses can be fuzzed via the USB subsystem. That's a good attack surface.

Now, let's take a closer look at the call graphs to ensure we haven't missed anything. I've already confirmed that `mwifiex_search_oui_in_ie` is only called by `mwifiex_is_rsn_oui_present` and `mwifiex_is_wpa_oui_present`. `mwifiex_is_rsn_oui_present` gets called by `mwifiex_is_network_compatible`, so we have a good grasp of the control flow within this area. We need to check if `mwifiex_is_wpa_oui_present` is called elsewhere. That helps us solidify the understanding of the attack surface, by mapping the functions that ultimately call the potentially vulnerable code.



44/2 2026/07/12 00:34 tool grepper
0m Args:
{
  "Expression": "mwifiex_is_wpa_oui_present",
  "PathPrefix": "drivers/net/wireless/marvell/mwifiex/"
}

Results:
{
  "Output": "drivers/net/wireless/marvell/mwifiex/scan.c=176=static u8\ndrivers/net/wireless/marvell/mwifiex/scan.c:177:mwifiex_is_wpa_oui_present(struct mwifiex_bssdescriptor *bss_desc, u32 cipher)\ndrivers/net/wireless/marvell/mwifiex/scan.c-178-{\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c=344=mwifiex_is_network_compatible(struct mwifiex_private *priv,\n--\ndrivers/net/wireless/marvell/mwifiex/scan.c-389-\t\t\t     bss_desc-\u003ebcn_ht_cap) \u0026\u0026\ndrivers/net/wireless/marvell/mwifiex/scan.c:390:\t\t\t    !mwifiex_is_wpa_oui_present(bss_desc,\ndrivers/net/wireless/marvell/mwifiex/scan.c-391-\t\t\t\t\t\t\t CIPHER_SUITE_CCMP)) {\ndrivers/net/wireless/marvell/mwifiex/scan.c-392-\ndrivers/net/wireless/marvell/mwifiex/scan.c:393:\t\t\t\tif (mwifiex_is_wpa_oui_present\ndrivers/net/wireless/marvell/mwifiex/scan.c-394-\t\t\t\t\t\t(bss_desc, CIPHER_SUITE_TKIP)) {\n"
}

45/2 2026/07/12 00:34 llm patch-evaluator
0m Model:
gemini-3.1-pro-preview

Args:
null

Results:
null

Tokens:
							input: 42609
							output: 255
							thoughts: 32
						

Thoughts:
Okay, here's the summary, expressed as though I'm the one thinking it:

**Analysis Complete: Focus on Compatibility Check**

Alright, that was a pretty straightforward analysis. I've drilled down, and it's clear the relevant issue resides *exclusively* within `mwifiex_is_network_compatible`. Nothing else seems to factor into this. My understanding of the situation is solid, and I'm confident in my conclusions. I've got a comprehensive picture of what's going on. Time to move forward – I'll initiate the call to `set-results`. Let's get these findings implemented.



46/2 2026/07/12 00:35 tool set-results
0m Args:
{
  "EnableConfigs": [
    "MWIFIEX",
    "MWIFIEX_USB"
  ],
  "FocusSymbols": [
    "mwifiex_search_oui_in_ie",
    "mwifiex_is_rsn_oui_present",
    "mwifiex_is_wpa_oui_present",
    "mwifiex_is_network_compatible",
    "mwifiex_check_network_compatibility",
    "mwifiex_update_curr_bss_params",
    "mwifiex_parse_single_response_buf",
    "mwifiex_ret_802_11_scan",
    "mwifiex_handle_event_ext_scan_report",
    "mwifiex_bss_start"
  ],
  "Reasoning": "The patch fixes an out-of-bounds read in `mwifiex_search_oui_in_ie` when parsing Wi-Fi Information Elements (IEs). This function is reachable when the driver processes scan results or events from the firmware. Since the mwifiex driver supports USB, the firmware responses can be fuzzed via the USB subsystem.",
  "WorthFuzzing": true
}

Results:
{
  "EnableConfigs": [
    "MWIFIEX",
    "MWIFIEX_USB"
  ],
  "FocusSymbols": [
    "mwifiex_search_oui_in_ie",
    "mwifiex_is_rsn_oui_present",
    "mwifiex_is_wpa_oui_present",
    "mwifiex_is_network_compatible",
    "mwifiex_check_network_compatibility",
    "mwifiex_update_curr_bss_params",
    "mwifiex_parse_single_response_buf",
    "mwifiex_ret_802_11_scan",
    "mwifiex_handle_event_ext_scan_report",
    "mwifiex_bss_start"
  ],
  "Reasoning": "The patch fixes an out-of-bounds read in `mwifiex_search_oui_in_ie` when parsing Wi-Fi Information Elements (IEs). This function is reachable when the driver processes scan results or events from the firmware. Since the mwifiex driver supports USB, the firmware responses can be fuzzed via the USB subsystem.",
  "WorthFuzzing": true
}

LLM Calls Summary:
Total Calls Total Tokens Avg Tokens Total Duration (Seconds) Avg Duration (Seconds)
Tool Calls Summary:
Total Calls Total Duration (Seconds) Avg Duration (Seconds)