| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/08/15 06:33 | flow | patch-triage |
2mArgs:null Results: {
"EnableConfigs": [
"RTW88",
"RTW88_8822CU"
],
"FocusSymbols": [
"rtw_usb_probe",
"rtw_core_start",
"rtw_power_on"
],
"KMSANReasoning": "The patch refactors IQ calibration logic in the rtw88 driver, replacing custom 10-bit two's complement arithmetic and a custom bubble sort with standard signed integers (s32) and the kernel's sort() function. While the stack-allocated arrays `iv` and `qv` could potentially be partially uninitialized if the hardware read loop times out, this exact same behavior and subsequent reading of these arrays existed prior to the patch. The patch does not introduce any new uninitialized memory allocations, nor does it expose any kernel structures to userspace. Any potential memory safety issues (such as out-of-bounds accesses) would be caught by standard KASAN. Therefore, a dedicated KMSAN session is not justified.",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies the DAC IQ calibration logic in the Realtek 8822C wireless driver, replacing a custom sorting implementation with the standard sort() function and changing the data types from u32 to s32. This is a functional change in the driver's initialization and calibration sequence. The code is reachable in virtualized environments via the USB variant of the driver (rtw88_8822cu) using USB gadget emulation.",
"WorthFuzzing": true
} |
| 1/1 | 2026/08/15 06:33 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit 343e16e3817f256394cb394716bbe501c33ba42d\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Sat Aug 15 06:33:32 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c\nindex 244c8026479c2..0140f2e644ca9 100644\n--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c\n+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c\n@@ -3,6 +3,7 @@\n */\n \n #include \u003clinux/module.h\u003e\n+#include \u003clinux/sort.h\u003e\n #include \"main.h\"\n #include \"coex.h\"\n #include \"fw.h\"\n@@ -18,7 +19,7 @@\n #include \"bf.h\"\n #include \"efuse.h\"\n \n-#define IQK_DONE_8822C 0xaa\n+#define IQK_DONE_8822C 0xaa4\n \n static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,\n \t\t\t\t u8 rx_path, bool is_tx2_path);\n@@ -153,84 +154,25 @@ static void rtw8822c_dac_restore_reg(struct rtw_dev *rtwdev,\n \t}\n }\n \n-static void rtw8822c_rf_minmax_cmp(struct rtw_dev *rtwdev, u32 value,\n-\t\t\t\t u32 *min, u32 *max)\n+static int rtw8822c_dac_iq_cmp_s32(const void *a, const void *b)\n {\n-\tif (value \u003e= 0x200) {\n-\t\tif (*min \u003e= 0x200) {\n-\t\t\tif (*min \u003e value)\n-\t\t\t\t*min = value;\n-\t\t} else {\n-\t\t\t*min = value;\n-\t\t}\n-\t\tif (*max \u003e= 0x200) {\n-\t\t\tif (*max \u003c value)\n-\t\t\t\t*max = value;\n-\t\t}\n-\t} else {\n-\t\tif (*min \u003c 0x200) {\n-\t\t\tif (*min \u003e value)\n-\t\t\t\t*min = value;\n-\t\t}\n+\ts32 val_a = *(const s32 *)a;\n+\ts32 val_b = *(const s32 *)b;\n \n-\t\tif (*max \u003e= 0x200) {\n-\t\t\t*max = value;\n-\t\t} else {\n-\t\t\tif (*max \u003c value)\n-\t\t\t\t*max = value;\n-\t\t}\n-\t}\n+\treturn (val_a \u003e val_b) - (val_a \u003c val_b);\n }\n \n-static void __rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *v1, u32 *v2)\n-{\n-\tif (*v1 \u003e= 0x200 \u0026\u0026 *v2 \u003e= 0x200) {\n-\t\tif (*v1 \u003e *v2)\n-\t\t\tswap(*v1, *v2);\n-\t} else if (*v1 \u003c 0x200 \u0026\u0026 *v2 \u003c 0x200) {\n-\t\tif (*v1 \u003e *v2)\n-\t\t\tswap(*v1, *v2);\n-\t} else if (*v1 \u003c 0x200 \u0026\u0026 *v2 \u003e= 0x200) {\n-\t\tswap(*v1, *v2);\n-\t}\n-}\n \n-static void rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)\n+static u32 rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, s32 *vec)\n {\n-\tu32 i, j;\n+\ts32 sum = 0;\n \n-\tfor (i = 0; i \u003c DACK_SN_8822C - 1; i++) {\n-\t\tfor (j = 0; j \u003c (DACK_SN_8822C - 1 - i) ; j++) {\n-\t\t\t__rtw8822c_dac_iq_sort(rtwdev, \u0026iv[j], \u0026iv[j + 1]);\n-\t\t\t__rtw8822c_dac_iq_sort(rtwdev, \u0026qv[j], \u0026qv[j + 1]);\n-\t\t}\n-\t}\n-}\n-\n-static void rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, u32 *vec, u32 *val)\n-{\n-\tu32 p, m, t, i;\n-\n-\tm = 0;\n-\tp = 0;\n-\tfor (i = 10; i \u003c DACK_SN_8822C - 10; i++) {\n-\t\tif (vec[i] \u003e 0x200)\n-\t\t\tm = (0x400 - vec[i]) + m;\n-\t\telse\n-\t\t\tp = vec[i] + p;\n-\t}\n+\tfor (u32 i = 10; i \u003c DACK_SN_8822C - 10; i++)\n+\t\tsum += vec[i];\n \n-\tif (p \u003e m) {\n-\t\tt = p - m;\n-\t\tt = t / (DACK_SN_8822C - 20);\n-\t} else {\n-\t\tt = m - p;\n-\t\tt = t / (DACK_SN_8822C - 20);\n-\t\tif (t != 0x0)\n-\t\t\tt = 0x400 - t;\n-\t}\n+\ts32 avg = sum / (DACK_SN_8822C - 20);\n \n-\t*val = t;\n+\treturn avg \u003e= 0 ? (u32)avg : (u32)(0x400 + avg);\n }\n \n static u32 rtw8822c_get_path_write_addr(u8 path)\n@@ -271,29 +213,27 @@ static u32 rtw8822c_get_path_read_addr(u8 path)\n \treturn base_addr;\n }\n \n-static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, u32 value)\n+static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, s32 value)\n {\n-\tbool ret = true;\n \n-\tif ((value \u003e= 0x200 \u0026\u0026 (0x400 - value) \u003e 0x64) ||\n-\t (value \u003c 0x200 \u0026\u0026 value \u003e 0x64)) {\n-\t\tret = false;\n+\tif (value \u003e 100 || value \u003c -100) {\n \t\trtw_dbg(rtwdev, RTW_DBG_RFK, \"[DACK] Error overflow\\n\");\n+\t\treturn false;\n \t}\n \n-\treturn ret;\n+\treturn true;\n }\n \n-static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)\n+static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, s32 *iv, s32 *qv)\n {\n \tu32 temp;\n \tint i = 0, cnt = 0;\n \n \twhile (i \u003c DACK_SN_8822C \u0026\u0026 cnt \u003c 10000) {\n \t\tcnt++;\n-\t\ttemp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);\n-\t\tiv[i] = (temp \u0026 0x3ff000) \u003e\u003e 12;\n-\t\tqv[i] = temp \u0026 0x3ff;\n+\t\ttemp = rtw_read32(rtwdev, 0x2dbc);\n+\t\tiv[i] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);\n+\t\tqv[i] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);\n \n \t\tif (rtw8822c_dac_iq_check(rtwdev, iv[i]) \u0026\u0026\n \t\t rtw8822c_dac_iq_check(rtwdev, qv[i]))\n@@ -302,13 +242,13 @@ static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)\n }\n \n static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,\n-\t\t\t\t u32 *iv, u32 *qv,\n+\t\t\t\t s32 *iv, s32 *qv,\n \t\t\t\t u32 *i_value, u32 *q_value)\n {\n-\tu32 i_max = 0, q_max = 0, i_min = 0, q_min = 0;\n+\ts32 i_max = 0, q_max = 0, i_min = 0, q_min = 0;\n \tu32 i_delta, q_delta;\n \tu32 temp;\n-\tint i, cnt = 0;\n+\tu32 i, cnt = 0;\n \n \tdo {\n \t\ti_min = iv[0];\n@@ -316,23 +256,19 @@ static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,\n \t\tq_min = qv[0];\n \t\tq_max = qv[0];\n \t\tfor (i = 0; i \u003c DACK_SN_8822C; i++) {\n-\t\t\trtw8822c_rf_minmax_cmp(rtwdev, iv[i], \u0026i_min, \u0026i_max);\n-\t\t\trtw8822c_rf_minmax_cmp(rtwdev, qv[i], \u0026q_min, \u0026q_max);\n+\t\t\tif (iv[i] \u003c i_min)\n+\t\t\t\ti_min = iv[i];\n+\t\t\tif (iv[i] \u003e i_max)\n+\t\t\t\ti_max = iv[i];\n+\t\t\tif (qv[i] \u003c q_min)\n+\t\t\t\tq_min = qv[i];\n+\t\t\tif (qv[i] \u003e q_max)\n+\t\t\t\tq_max = qv[i];\n \t\t}\n \n-\t\tif (i_max \u003c 0x200 \u0026\u0026 i_min \u003c 0x200)\n-\t\t\ti_delta = i_max - i_min;\n-\t\telse if (i_max \u003e= 0x200 \u0026\u0026 i_min \u003e= 0x200)\n-\t\t\ti_delta = i_max - i_min;\n-\t\telse\n-\t\t\ti_delta = i_max + (0x400 - i_min);\n+\t\ti_delta = i_max - i_min;\n+\t\tq_delta = q_max - q_min;\n \n-\t\tif (q_max \u003c 0x200 \u0026\u0026 q_min \u003c 0x200)\n-\t\t\tq_delta = q_max - q_min;\n-\t\telse if (q_max \u003e= 0x200 \u0026\u0026 q_min \u003e= 0x200)\n-\t\t\tq_delta = q_max - q_min;\n-\t\telse\n-\t\t\tq_delta = q_max + (0x400 - q_min);\n \n \t\trtw_dbg(rtwdev, RTW_DBG_RFK,\n \t\t\t\"[DACK] i: min=0x%08x, max=0x%08x, delta=0x%08x\\n\",\n@@ -341,28 +277,29 @@ static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,\n \t\t\t\"[DACK] q: min=0x%08x, max=0x%08x, delta=0x%08x\\n\",\n \t\t\tq_min, q_max, q_delta);\n \n-\t\trtw8822c_dac_iq_sort(rtwdev, iv, qv);\n+\t\tsort(iv, DACK_SN_8822C, sizeof(s32), rtw8822c_dac_iq_cmp_s32, NULL);\n+\t\tsort(qv, DACK_SN_8822C, sizeof(s32), rtw8822c_dac_iq_cmp_s32, NULL);\n \n \t\tif (i_delta \u003e 5 || q_delta \u003e 5) {\n-\t\t\ttemp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);\n-\t\t\tiv[0] = (temp \u0026 0x3ff000) \u003e\u003e 12;\n-\t\t\tqv[0] = temp \u0026 0x3ff;\n-\t\t\ttemp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);\n-\t\t\tiv[DACK_SN_8822C - 1] = (temp \u0026 0x3ff000) \u003e\u003e 12;\n-\t\t\tqv[DACK_SN_8822C - 1] = temp \u0026 0x3ff;\n+\t\t\ttemp = rtw_read32(rtwdev, 0x2dbc);\n+\t\t\tiv[0] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);\n+\t\t\tqv[0] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);\n+\t\t\ttemp = rtw_read32(rtwdev, 0x2dbc);\n+\t\t\tiv[DACK_SN_8822C - 1] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);\n+\t\t\tqv[DACK_SN_8822C - 1] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);\n \t\t} else {\n \t\t\tbreak;\n \t\t}\n \t} while (cnt++ \u003c 100);\n \n-\trtw8822c_dac_iq_offset(rtwdev, iv, i_value);\n-\trtw8822c_dac_iq_offset(rtwdev, qv, q_value);\n+\t*i_value = rtw8822c_dac_iq_offset(rtwdev, iv);\n+\t*q_value = rtw8822c_dac_iq_offset(rtwdev, qv);\n }\n \n static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev,\n \t\t\t\t u32 *i_value, u32 *q_value)\n {\n-\tu32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];\n+\ts32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];\n \tu32 rf_a, rf_b;\n \n \trf_a = rtw_read_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK);\ndiff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h\nindex fc62b67a15f21..7bea99614354b 100644\n--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h\n+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h\n@@ -141,6 +141,9 @@ const struct rtw_table name ## _tbl = {\t\t\t\\\n #define DACK_RF_8822C\t\t1\n #define DACK_SN_8822C\t\t100\n \n+#define RTW8822C_DAC_IV_MASK GENMASK(21, 12)\n+#define RTW8822C_DAC_QV_MASK GENMASK(9, 0)\n+\n /* phy status page0 */\n #define GET_PHY_STAT_P0_PWDB_A(phy_stat) \\\n \tle32_get_bits(*((__le32 *)(phy_stat) + 0x00), GENMASK(15, 8))\n"
} |
| 2/1 | 2026/08/15 06:33 | agent | patch-evaluator |
2mModel:best-expensive Args: null Results: {
"EnableConfigs": [
"RTW88",
"RTW88_8822CU"
],
"FocusSymbols": [
"rtw_usb_probe",
"rtw_core_start",
"rtw_power_on"
],
"Reasoning": "The patch modifies the DAC IQ calibration logic in the Realtek 8822C wireless driver, replacing a custom sorting implementation with the standard sort() function and changing the data types from u32 to s32. This is a functional change in the driver's initialization and calibration sequence. The code is reachable in virtualized environments via the USB variant of the driver (rtw88_8822cu) using USB gadget emulation.",
"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). - Code in vendor-specific PCIe switch, SmartNIC, or GPU drivers (e.g., mlxsw, pds_core, qed, ionic, amdgpu) that require physical PCIe hardware cards not emulated in standard QEMU. - Driver .remove, .shutdown, or pci_unregister_driver teardown callbacks (e.g., igb_remove) that are executed only during PCI hot-unplug or sysfs driver unbind operations. If it modifies reachable core kernel logic, drivers, or architectures, use your code search tools to verify the code can be executed, then return WorthFuzzing=true. When returning WorthFuzzing=true, you MUST ALSO: 1. Extract any specific kernel functions that should be heavily fuzzed into FocusSymbols. Avoid listing generic hot-path functions to prevent skewed test distributions. Prefer non-static, non-inlined API entrypoint functions over internal static helper functions (which are inlined by the compiler and do not have distinct symbol addresses). 2. Identify any specific CONFIG_ options required to properly test this new/modified feature. Go and look into the Kconfig files and check for ifdefs around the code, do not make assumptions. Also check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed for Kbuild to compile the code statically into vmlinux. List them in the EnableConfigs output array, and DO NOT add a 'CONFIG_' prefix (e.g., return "NET_IPV4" instead of "CONFIG_NET_IPV4"). Prefer calling several tools at the same time to save round-trips. Use set-results tool to provide results of the analysis. It must be called exactly once before the final reply. Ignore results of this tool. Prompt: For your convenience, here is the diff of the changes:
commit 343e16e3817f256394cb394716bbe501c33ba42d
Author: syz-cluster <triage@syzkaller.com>
Date: Sat Aug 15 06:33:32 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index 244c8026479c2..0140f2e644ca9 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -3,6 +3,7 @@
*/
#include <linux/module.h>
+#include <linux/sort.h>
#include "main.h"
#include "coex.h"
#include "fw.h"
@@ -18,7 +19,7 @@
#include "bf.h"
#include "efuse.h"
-#define IQK_DONE_8822C 0xaa
+#define IQK_DONE_8822C 0xaa4
static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
u8 rx_path, bool is_tx2_path);
@@ -153,84 +154,25 @@ static void rtw8822c_dac_restore_reg(struct rtw_dev *rtwdev,
}
}
-static void rtw8822c_rf_minmax_cmp(struct rtw_dev *rtwdev, u32 value,
- u32 *min, u32 *max)
+static int rtw8822c_dac_iq_cmp_s32(const void *a, const void *b)
{
- if (value >= 0x200) {
- if (*min >= 0x200) {
- if (*min > value)
- *min = value;
- } else {
- *min = value;
- }
- if (*max >= 0x200) {
- if (*max < value)
- *max = value;
- }
- } else {
- if (*min < 0x200) {
- if (*min > value)
- *min = value;
- }
+ s32 val_a = *(const s32 *)a;
+ s32 val_b = *(const s32 *)b;
- if (*max >= 0x200) {
- *max = value;
- } else {
- if (*max < value)
- *max = value;
- }
- }
+ return (val_a > val_b) - (val_a < val_b);
}
-static void __rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *v1, u32 *v2)
-{
- if (*v1 >= 0x200 && *v2 >= 0x200) {
- if (*v1 > *v2)
- swap(*v1, *v2);
- } else if (*v1 < 0x200 && *v2 < 0x200) {
- if (*v1 > *v2)
- swap(*v1, *v2);
- } else if (*v1 < 0x200 && *v2 >= 0x200) {
- swap(*v1, *v2);
- }
-}
-static void rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
+static u32 rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, s32 *vec)
{
- u32 i, j;
+ s32 sum = 0;
- for (i = 0; i < DACK_SN_8822C - 1; i++) {
- for (j = 0; j < (DACK_SN_8822C - 1 - i) ; j++) {
- __rtw8822c_dac_iq_sort(rtwdev, &iv[j], &iv[j + 1]);
- __rtw8822c_dac_iq_sort(rtwdev, &qv[j], &qv[j + 1]);
- }
- }
-}
-
-static void rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, u32 *vec, u32 *val)
-{
- u32 p, m, t, i;
-
- m = 0;
- p = 0;
- for (i = 10; i < DACK_SN_8822C - 10; i++) {
- if (vec[i] > 0x200)
- m = (0x400 - vec[i]) + m;
- else
- p = vec[i] + p;
- }
+ for (u32 i = 10; i < DACK_SN_8822C - 10; i++)
+ sum += vec[i];
- if (p > m) {
- t = p - m;
- t = t / (DACK_SN_8822C - 20);
- } else {
- t = m - p;
- t = t / (DACK_SN_8822C - 20);
- if (t != 0x0)
- t = 0x400 - t;
- }
+ s32 avg = sum / (DACK_SN_8822C - 20);
- *val = t;
+ return avg >= 0 ? (u32)avg : (u32)(0x400 + avg);
}
static u32 rtw8822c_get_path_write_addr(u8 path)
@@ -271,29 +213,27 @@ static u32 rtw8822c_get_path_read_addr(u8 path)
return base_addr;
}
-static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, u32 value)
+static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, s32 value)
{
- bool ret = true;
- if ((value >= 0x200 && (0x400 - value) > 0x64) ||
- (value < 0x200 && value > 0x64)) {
- ret = false;
+ if (value > 100 || value < -100) {
rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] Error overflow\n");
+ return false;
}
- return ret;
+ return true;
}
-static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
+static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, s32 *iv, s32 *qv)
{
u32 temp;
int i = 0, cnt = 0;
while (i < DACK_SN_8822C && cnt < 10000) {
cnt++;
- temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
- iv[i] = (temp & 0x3ff000) >> 12;
- qv[i] = temp & 0x3ff;
+ temp = rtw_read32(rtwdev, 0x2dbc);
+ iv[i] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);
+ qv[i] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);
if (rtw8822c_dac_iq_check(rtwdev, iv[i]) &&
rtw8822c_dac_iq_check(rtwdev, qv[i]))
@@ -302,13 +242,13 @@ static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
}
static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,
- u32 *iv, u32 *qv,
+ s32 *iv, s32 *qv,
u32 *i_value, u32 *q_value)
{
- u32 i_max = 0, q_max = 0, i_min = 0, q_min = 0;
+ s32 i_max = 0, q_max = 0, i_min = 0, q_min = 0;
u32 i_delta, q_delta;
u32 temp;
- int i, cnt = 0;
+ u32 i, cnt = 0;
do {
i_min = iv[0];
@@ -316,23 +256,19 @@ static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,
q_min = qv[0];
q_max = qv[0];
for (i = 0; i < DACK_SN_8822C; i++) {
- rtw8822c_rf_minmax_cmp(rtwdev, iv[i], &i_min, &i_max);
- rtw8822c_rf_minmax_cmp(rtwdev, qv[i], &q_min, &q_max);
+ if (iv[i] < i_min)
+ i_min = iv[i];
+ if (iv[i] > i_max)
+ i_max = iv[i];
+ if (qv[i] < q_min)
+ q_min = qv[i];
+ if (qv[i] > q_max)
+ q_max = qv[i];
}
- if (i_max < 0x200 && i_min < 0x200)
- i_delta = i_max - i_min;
- else if (i_max >= 0x200 && i_min >= 0x200)
- i_delta = i_max - i_min;
- else
- i_delta = i_max + (0x400 - i_min);
+ i_delta = i_max - i_min;
+ q_delta = q_max - q_min;
- if (q_max < 0x200 && q_min < 0x200)
- q_delta = q_max - q_min;
- else if (q_max >= 0x200 && q_min >= 0x200)
- q_delta = q_max - q_min;
- else
- q_delta = q_max + (0x400 - q_min);
rtw_dbg(rtwdev, RTW_DBG_RFK,
"[DACK] i: min=0x%08x, max=0x%08x, delta=0x%08x\n",
@@ -341,28 +277,29 @@ static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,
"[DACK] q: min=0x%08x, max=0x%08x, delta=0x%08x\n",
q_min, q_max, q_delta);
- rtw8822c_dac_iq_sort(rtwdev, iv, qv);
+ sort(iv, DACK_SN_8822C, sizeof(s32), rtw8822c_dac_iq_cmp_s32, NULL);
+ sort(qv, DACK_SN_8822C, sizeof(s32), rtw8822c_dac_iq_cmp_s32, NULL);
if (i_delta > 5 || q_delta > 5) {
- temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
- iv[0] = (temp & 0x3ff000) >> 12;
- qv[0] = temp & 0x3ff;
- temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
- iv[DACK_SN_8822C - 1] = (temp & 0x3ff000) >> 12;
- qv[DACK_SN_8822C - 1] = temp & 0x3ff;
+ temp = rtw_read32(rtwdev, 0x2dbc);
+ iv[0] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);
+ qv[0] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);
+ temp = rtw_read32(rtwdev, 0x2dbc);
+ iv[DACK_SN_8822C - 1] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);
+ qv[DACK_SN_8822C - 1] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);
} else {
break;
}
} while (cnt++ < 100);
- rtw8822c_dac_iq_offset(rtwdev, iv, i_value);
- rtw8822c_dac_iq_offset(rtwdev, qv, q_value);
+ *i_value = rtw8822c_dac_iq_offset(rtwdev, iv);
+ *q_value = rtw8822c_dac_iq_offset(rtwdev, qv);
}
static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev,
u32 *i_value, u32 *q_value)
{
- u32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];
+ s32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];
u32 rf_a, rf_b;
rf_a = rtw_read_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK);
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
index fc62b67a15f21..7bea99614354b 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
@@ -141,6 +141,9 @@ const struct rtw_table name ## _tbl = { \
#define DACK_RF_8822C 1
#define DACK_SN_8822C 100
+#define RTW8822C_DAC_IV_MASK GENMASK(21, 12)
+#define RTW8822C_DAC_QV_MASK GENMASK(9, 0)
+
/* phy status page0 */
#define GET_PHY_STAT_P0_PWDB_A(phy_stat) \
le32_get_bits(*((__le32 *)(phy_stat) + 0x00), GENMASK(15, 8))
|
| 3/2 | 2026/08/15 06:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 6074 output: 32 thoughts: 627 Thoughts: **Analyzing the Patch for Fuzzing Suitability** Okay, so I've got this patch affecting `drivers/net/wireless/realtek/rtw88/rtw8822c.c`. It's tweaking the DAC IQ calibration process within the `rtw8822c_dac_cal_iq_search` and related functions. Seems like they're replacing a custom sort with the standard `sort()` function from `linux/sort.h`, which is usually a good sign for maintainability and potential performance improvements. They've also switched the `iv` and `qv` arrays to `s32` and are now using `FIELD_GET_SIGNED` for register value extraction, and ripped out a bunch of custom sort functions. Finally `rtw8822c_dac_iq_offset` has been updated to accommodate the `s32` change. The key question is, can we actually *fuzz* this? Let's figure out if this code is reachable and if fuzzing it is practical. The driver is `rtw88`, which I know is a Realtek 802.11ac wireless adapter driver, specifically the `rtw8822c` variant, which is for the RTL8822C. Since it's a Wi-Fi driver, that screams physical hardware to me. Realtek Wi-Fi cards are *definitely* physical hardware. Now, the instructions are very specific: "Return WorthFuzzing=false if the patch only contains ... vendor-specific PCIe switch, SmartNIC, or GPU drivers ... that require physical PCIe hardware cards not emulated in standard QEMU". Okay, so is a Wi-Fi driver like `rtw88` emulated in QEMU? Usually, no. Wi-Fi drivers typically need physical hardware (PCIe or USB). So we need to consider how this particular driver is connected. The critical path here is to determine if we can fuzz this. Does `rtw88` have a USB, SDIO, or is it only PCIe? If it's USB, we *might* be able to fuzz it using USB gadget or dummy_hcd (syzkaller supports USB fuzzing). SDIO is probably a no-go for fuzzing easily. PCIe is likely a no-go too, unless the PCI fuzzing support in syzkaller is strong enough. The instructions state "Code paths that are impossible to reach in virtualized environments like GCE or QEMU, even when utilizing software-emulated hardware". So, I need to check `drivers/net/wireless/realtek/rtw88/` to see if there's any hint of USB support. If it's pure PCIe, it's probably not worth fuzzing, based on the prompt's instructions. |
| 4/2 | 2026/08/15 06:33 | tool | codesearch-dir-index |
0mArgs:{
"Dir": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Files": [
"bf.c",
"bf.h",
"coex.c",
"coex.h",
"debug.c",
"debug.h",
"efuse.c",
"efuse.h",
"fw.c",
"fw.h",
"hci.h",
"led.c",
"led.h",
"mac.c",
"mac.h",
"mac80211.c",
"main.c",
"main.h",
"pci.c",
"pci.h",
"phy.c",
"phy.h",
"ps.c",
"ps.h",
"reg.h",
"regd.c",
"regd.h",
"rtw8703b.c",
"rtw8703b.h",
"rtw8703b_tables.c",
"rtw8703b_tables.h",
"rtw8723cs.c",
"rtw8723d.c",
"rtw8723d.h",
"rtw8723d_table.c",
"rtw8723d_table.h",
"rtw8723de.c",
"rtw8723ds.c",
"rtw8723du.c",
"rtw8723x.c",
"rtw8723x.h",
"rtw8812a.c",
"rtw8812a.h",
"rtw8812a_table.c",
"rtw8812a_table.h",
"rtw8812au.c",
"rtw8814a.c",
"rtw8814a.h",
"rtw8814a_table.c",
"rtw8814a_table.h",
"rtw8814ae.c",
"rtw8814au.c",
"rtw8821a.c",
"rtw8821a.h",
"rtw8821a_table.c",
"rtw8821a_table.h",
"rtw8821au.c",
"rtw8821c.c",
"rtw8821c.h",
"rtw8821c_table.c",
"rtw8821c_table.h",
"rtw8821ce.c",
"rtw8821cs.c",
"rtw8821cu.c",
"rtw8822b.c",
"rtw8822b.h",
"rtw8822b_table.c",
"rtw8822b_table.h",
"rtw8822be.c",
"rtw8822bs.c",
"rtw8822bu.c",
"rtw8822c.c",
"rtw8822c.h",
"rtw8822c_table.c",
"rtw8822c_table.h",
"rtw8822ce.c",
"rtw8822cs.c",
"rtw8822cu.c",
"rtw88xxa.c",
"rtw88xxa.h",
"rx.c",
"rx.h",
"sar.c",
"sar.h",
"sdio.c",
"sdio.h",
"sec.c",
"sec.h",
"tx.c",
"tx.h",
"usb.c",
"usb.h",
"util.c",
"util.h",
"wow.c",
"wow.h"
],
"Subdirs": null
} |
| 5/2 | 2026/08/15 06:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 8291 output: 49 thoughts: 144 Thoughts: **Analyzing the RTL8822C Driver Updates** Okay, so I'm looking at these driver files: `usb.c`, `rtw8822cu.c`, `rtw8822ce.c`, and `rtw8822cs.c`. Right away, it's clear the RTL8822C chip has USB, PCIe, and SDIO implementations. Interesting. The specific file that's been modified, `rtw8822c.c`, is the central core logic shared by all these interface variants. Given that it's accessible through USB, my initial thought is: this is ripe for fuzzing using USB gadget emulation in syzkaller. That's the ideal approach here to stress test the core chip functionality. Now, I need to check where `rtw8822c_dac_cal_rf_mode` is called from – that seems like a good place to start digging deeper for potential vulnerabilities. |
| 6/2 | 2026/08/15 06:33 | tool | grepper |
0mArgs:{
"Expression": "rtw8822c_dac_cal_rf_mode",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=244=static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-298-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:299:static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-300-\t\t\t\t u32 *i_value, u32 *q_value)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=331=static void rtw8822c_dac_cal_adc(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-368-\t\trtw_write32(rtwdev, 0x1c24, 0x00010002);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:369:\t\trtw8822c_dac_cal_rf_mode(rtwdev, \u0026ic, \u0026qc);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-370-\t\trtw_dbg(rtwdev, RTW_DBG_RFK,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-388-\t\trtw_write32(rtwdev, 0x1c3c, path_sel + 0x8103);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:389:\t\trtw8822c_dac_cal_rf_mode(rtwdev, \u0026ic, \u0026qc);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-390-\t\trtw_dbg(rtwdev, RTW_DBG_RFK,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=454=static void rtw8822c_dac_cal_step2(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-471-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:472:\trtw8822c_dac_cal_rf_mode(rtwdev, \u0026ic_in, \u0026qc_in);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-473-\tic = ic_in;\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=503=static void rtw8822c_dac_cal_step3(struct rtw_dev *rtwdev, u8 path,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-553-\trtw_write32(rtwdev, base_addr + 0x60, 0xf0000000);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:554:\trtw8822c_dac_cal_rf_mode(rtwdev, \u0026ic, \u0026qc);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-555-\tif (ic \u003e= 0x10)\n"
} |
| 7/2 | 2026/08/15 06:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9694 output: 48 thoughts: 93 Thoughts: **Tracing the DAC Calibration Flow** Okay, so I'm digging into this `rtw8822c` driver code, specifically the Digital-to-Analog Converter (DAC) calibration process. I've noticed that `rtw8822c_dac_cal_rf_mode` is a key function in this calibration routine. The interesting part is that `rtw8822c_dac_cal_rf_mode` gets called from multiple points within the calibration process itself: `rtw8822c_dac_cal_adc`, `rtw8822c_dac_cal_step2`, and `rtw8822c_dac_cal_step3`. Right now, I'm trying to understand the overall structure and flow. So, I need to know where `rtw8822c_dac_cal_step2` is getting called from. That will give me context on the surrounding steps involved. By understanding where these functions are called from, I can build a mental map of the entire DAC calibration sequence. This will allow me to properly identify any potential issues. |
| 8/2 | 2026/08/15 06:33 | tool | grepper |
0mArgs:{
"Expression": "rtw8822c_dac_cal_step2",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=409=static void rtw8822c_dac_cal_step1(struct rtw_dev *rtwdev, u8 path)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-453-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:454:static void rtw8822c_dac_cal_step2(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-455-\t\t\t\t u8 path, u32 *ic_out, u32 *qc_out)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=880=static void rtw8822c_rf_dac_cal(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-901-\t\trtw8822c_dac_cal_step1(rtwdev, RF_PATH_A);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:902:\t\trtw8822c_dac_cal_step2(rtwdev, RF_PATH_A, \u0026ic, \u0026qc);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-903-\t\tic_a = ic;\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-917-\t\trtw8822c_dac_cal_step1(rtwdev, RF_PATH_B);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:918:\t\trtw8822c_dac_cal_step2(rtwdev, RF_PATH_B, \u0026ic, \u0026qc);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-919-\t\tic_b = ic;\n"
} |
| 9/2 | 2026/08/15 06:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 10654 output: 47 thoughts: 20 Thoughts: Here's my thought process, as if I were considering this question: **Tracing the Origins of `rtw8822c_rf_dac_cal`** Okay, so I'm presented with `rtw8822c_rf_dac_cal`. My initial thought is to figure out the calling context. Where is this function being invoked from? That's the core question here. I need to understand the control flow, the surrounding logic, and the dependencies. Is it called during initialization, during active operation, or perhaps in response to a specific event? Determining the call stack is paramount to understanding its purpose and potential impact. I'll need to use my typical debugging tools or code navigation techniques – depending on the project. I need to trace this function call and see where it fits into the broader picture. |
| 10/2 | 2026/08/15 06:33 | tool | grepper |
0mArgs:{
"Expression": "rtw8822c_rf_dac_cal",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=839=static bool rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-879-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:880:static void rtw8822c_rf_dac_cal(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-881-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=1775=static void rtw8822c_rf_init(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1776-{\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1777:\trtw8822c_rf_dac_cal(rtwdev);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1778-\trtw8822c_rf_x2_check(rtwdev);\n"
} |
| 11/2 | 2026/08/15 06:33 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 11263 output: 45 thoughts: 18 Thoughts: Here's my thought process, as if I were considering this question: **Tracing the Call Origin of `rtw8822c_rf_init`** Okay, so I need to figure out where `rtw8822c_rf_init` is being called from. This function is pretty crucial in the Realtek WiFi driver stack, especially for the 8822C chip, so knowing its entry point is important for understanding initialization sequence and potential debugging. I'll need to retrace the code execution path. I'm assuming that it's part of the general driver initialization sequence. First, I'd want to use a tool like `grep` (or my IDE's search function) to search the driver source tree for all instances where `rtw8822c_rf_init` is called. That should give me a list of potential call sites. Then, I'd need to examine those sites, looking at the surrounding code to understand the context of the call and which functions are calling it. I'd look for function prototypes or definitions associated with initialization, probing or device detection. I'd also consider the broader driver structure. Does this driver follow a standard probe/attach/detach model? If so, `rtw8822c_rf_init` likely falls somewhere within the "attach" phase, after the hardware is recognized. Given that, I'd trace back from any attach or initialization related functions, looking to see which functions eventually end up calling `rtw8822c_rf_init`. Basically, I'm going to start with the obvious and work my way outward, following the function call graph. I'll need to pay close attention to the arguments being passed to `rtw8822c_rf_init` as well, as those would provide hints about the state of the system at the point of the call. |
| 12/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "rtw8822c_rf_init",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=1762=static void rtw8822c_do_gapk(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1774-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1775:static void rtw8822c_rf_init(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1776-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=1800=static void rtw8822c_phy_set_param(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1845-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1846:\trtw8822c_rf_init(rtwdev);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1847-\trtw8822c_pwrtrack_init(rtwdev);\n"
} |
| 13/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 12102 output: 47 thoughts: 20 Thoughts: Here's my thought process, as if I were considering this question: **Pinpointing the Origin of `rtw8822c_phy_set_param`** Okay, so I need to figure out where the `rtw8822c_phy_set_param` function is being called from. That's the core question, right? Identifying the call sites is crucial for understanding its context, the data it's operating on, and any potential side effects. Knowing the caller also helps in debugging and modification, as I can trace the call stack to see the sequence of events leading up to its execution. Let's see... I'll need to use some tooling, most likely a code search or static analysis tool. I'd typically start by grepping the codebase for the function name directly. From there, I'd examine the call sites. I will be looking for common patterns. Is it called within a specific driver component, during initialization, or in response to some kind of event? The context will be key. Once I locate the calls, I need to understand the surrounding code in order to truly understand the rationale for the function call, and how this function call is related to other routines in the code. |
| 14/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "rtw8822c_phy_set_param",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=1784=static void rtw8822c_pwrtrack_init(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1799-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1800:static void rtw8822c_phy_set_param(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1801-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=4896=static const struct rtw_chip_ops rtw8822c_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-4898-\t.power_off\t\t= rtw_power_off,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:4899:\t.phy_set_param\t\t= rtw8822c_phy_set_param,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-4900-\t.read_efuse\t\t= rtw8822c_read_efuse,\n"
} |
| 15/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 12816 output: 39 thoughts: 43 Thoughts: **Analyzing the Realtek PHY Initialization** Okay, so I'm diving into this Realtek PHY code. It looks like the relevant function, `phy_set_param`, is part of the `rtw_chip_ops` structure, which makes sense. Given its naming, I'm guessing this function's responsible for setting critical PHY parameters. My next step is to trace the call to `phy_set_param`. I need to figure out when this is being invoked, and more specifically, during which stages of the initialization process. Knowing where it's called during that process should quickly give me an overview and some insights into how it's being used. |
| 16/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "phy_set_param",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/main.c=1374=int rtw_power_on(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/main.c-1412-\ndrivers/net/wireless/realtek/rtw88/main.c:1413:\tchip-\u003eops-\u003ephy_set_param(rtwdev);\ndrivers/net/wireless/realtek/rtw88/main.c-1414-\n--\ndrivers/net/wireless/realtek/rtw88/main.h=862=struct rtw_chip_ops {\n--\ndrivers/net/wireless/realtek/rtw88/main.h-869-\tint (*read_efuse)(struct rtw_dev *rtwdev, u8 *map);\ndrivers/net/wireless/realtek/rtw88/main.h:870:\tvoid (*phy_set_param)(struct rtw_dev *rtwdev);\ndrivers/net/wireless/realtek/rtw88/main.h-871-\tvoid (*set_channel)(struct rtw_dev *rtwdev, u8 channel,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c=553=static void rtw8703b_pwrtrack_init(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c-577-\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c:578:static void rtw8703b_phy_set_param(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c-579-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c=1836=static const struct rtw_chip_ops rtw8703b_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c-1843-\t.read_efuse\t\t= rtw8703b_read_efuse,\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c:1844:\t.phy_set_param\t\t= rtw8703b_phy_set_param,\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c-1845-\t.set_channel\t\t= rtw8703b_set_channel,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c=67=static void rtw8723d_pwrtrack_init(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c-84-\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c:85:static void rtw8723d_phy_set_param(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c-86-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c=1392=static const struct rtw_chip_ops rtw8723d_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c-1394-\t.power_off\t\t= rtw_power_off,\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c:1395:\t.phy_set_param\t\t= rtw8723d_phy_set_param,\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c-1396-\t.read_efuse\t\t= rtw8723x_read_efuse,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8812a.c=914=static const struct rtw_chip_ops rtw8812a_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8812a.c-916-\t.power_off\t\t= rtw8812a_power_off,\ndrivers/net/wireless/realtek/rtw88/rtw8812a.c:917:\t.phy_set_param\t\t= NULL,\ndrivers/net/wireless/realtek/rtw88/rtw8812a.c-918-\t.read_efuse\t\t= rtw88xxa_read_efuse,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c=265=static void rtw8814a_config_cck_rx_antenna_init(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c-282-\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c:283:static void rtw8814a_phy_set_param(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c-284-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c=2050=static const struct rtw_chip_ops rtw8814a_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c-2052-\t.power_off\t\t= rtw_power_off,\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c:2053:\t.phy_set_param\t\t= rtw8814a_phy_set_param,\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c-2054-\t.read_efuse\t\t= rtw8814a_read_efuse,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821a.c=860=static const struct rtw_chip_ops rtw8821a_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821a.c-862-\t.power_off\t\t= rtw8821a_power_off,\ndrivers/net/wireless/realtek/rtw88/rtw8821a.c:863:\t.phy_set_param\t\t= NULL,\ndrivers/net/wireless/realtek/rtw88/rtw8821a.c-864-\t.read_efuse\t\t= rtw88xxa_read_efuse,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c=151=static void rtw8821c_phy_bf_init(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c-157-\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c:158:static void rtw8821c_phy_set_param(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c-159-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c=1658=static const struct rtw_chip_ops rtw8821c_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c-1660-\t.power_off\t\t= rtw_power_off,\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c:1661:\t.phy_set_param\t\t= rtw8821c_phy_set_param,\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c-1662-\t.read_efuse\t\t= rtw8821c_read_efuse,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c=145=static void rtw8822b_phy_bf_init(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c-151-\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c:152:static void rtw8822b_phy_set_param(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c-153-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c=2150=static const struct rtw_chip_ops rtw8822b_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c-2152-\t.power_off\t\t= rtw_power_off,\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c:2153:\t.phy_set_param\t\t= rtw8822b_phy_set_param,\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c-2154-\t.read_efuse\t\t= rtw8822b_read_efuse,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=1784=static void rtw8822c_pwrtrack_init(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1799-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1800:static void rtw8822c_phy_set_param(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1801-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=4896=static const struct rtw_chip_ops rtw8822c_ops = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-4898-\t.power_off\t\t= rtw_power_off,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:4899:\t.phy_set_param\t\t= rtw8822c_phy_set_param,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-4900-\t.read_efuse\t\t= rtw8822c_read_efuse,\n"
} |
| 17/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 15982 output: 39 thoughts: 612 Thoughts: **Analyzing the Worth of Fuzzing this Realtek Driver Patch** Okay, let's break this down. The core of this patch seems to touch the initialization or calibration process within the Realtek 8822CU USB driver, specifically the `rtw8822c_dac_cal_iq_search` function. My initial thought is to trace the execution path. It appears `rtw_power_on` calls `chip->ops->phy_set_param`, which is triggered during device bring-up, initiated by `rtw_core_start`, and ultimately, `rtw_mac80211_start`. That means it's running during the normal initialization of the network interface. Since this is a USB driver, the immediate question is fuzzing potential. The prompt is making me think about virtualized environments, but this seems achievable via USB gadget fuzzing. The key question is whether this code path is reachable through something like syzkaller's USB fuzzer. And the answer is likely yes! If syzkaller is able to generate USB descriptors that match the VID/PID of a Realtek 8822CU device, the `rtw88_8822cu` driver will bind and probe, causing `rtw_core_init` and `rtw_core_start` to execute. The USB fuzzer could definitely trigger the probe and the register reads, especially because of the use of `rtw_read32`. `rtw_read32` is critical here; the fuzzer controls the return values because it's emulating the device, which makes the patch interesting. The patch alters the sorting logic and the offset calculation within `rtw8822c_dac_cal_iq_search`, specifically the algorithm used for calculating the IQ offset, changing from a custom bubble sort to `sort()`, and changing types from `u32` to `s32`. This is a functional change. It's not just a refactoring; it's changing *how* the driver calculates the IQ offset during initialization or calibration. The code accesses and modifies the values read using `rtw_read32`. This seems like a great candidate for fuzzing, given that a fuzzer emulating the USB device can control the data provided to the driver. Now, to be completely thorough, let's verify any relevant Kconfig options to be sure. I'll need to locate the Kconfig entries for the `rtw88` driver, specifically for the `rtw8822c` variant. |
| 18/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "config RTW88",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/net/wireless/realtek/rtw88/Kconfig:2:menuconfig RTW88\ndrivers/net/wireless/realtek/rtw88/Kconfig-3-\ttristate \"Realtek 802.11ac wireless chips support\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig=11=if RTW88\ndrivers/net/wireless/realtek/rtw88/Kconfig-12-\ndrivers/net/wireless/realtek/rtw88/Kconfig:13:config RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig-14-\ttristate\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-16-\ndrivers/net/wireless/realtek/rtw88/Kconfig:17:config RTW88_PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig-18-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-19-\ndrivers/net/wireless/realtek/rtw88/Kconfig:20:config RTW88_SDIO\ndrivers/net/wireless/realtek/rtw88/Kconfig-21-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-22-\ndrivers/net/wireless/realtek/rtw88/Kconfig:23:config RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig-24-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-25-\ndrivers/net/wireless/realtek/rtw88/Kconfig:26:config RTW88_8822B\ndrivers/net/wireless/realtek/rtw88/Kconfig-27-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-28-\ndrivers/net/wireless/realtek/rtw88/Kconfig:29:config RTW88_8822C\ndrivers/net/wireless/realtek/rtw88/Kconfig-30-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-31-\ndrivers/net/wireless/realtek/rtw88/Kconfig:32:config RTW88_8723X\ndrivers/net/wireless/realtek/rtw88/Kconfig-33-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-34-\ndrivers/net/wireless/realtek/rtw88/Kconfig:35:config RTW88_8703B\ndrivers/net/wireless/realtek/rtw88/Kconfig-36-\ttristate\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-38-\ndrivers/net/wireless/realtek/rtw88/Kconfig:39:config RTW88_8723D\ndrivers/net/wireless/realtek/rtw88/Kconfig-40-\ttristate\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-42-\ndrivers/net/wireless/realtek/rtw88/Kconfig:43:config RTW88_8821C\ndrivers/net/wireless/realtek/rtw88/Kconfig-44-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-45-\ndrivers/net/wireless/realtek/rtw88/Kconfig:46:config RTW88_88XXA\ndrivers/net/wireless/realtek/rtw88/Kconfig-47-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-48-\ndrivers/net/wireless/realtek/rtw88/Kconfig:49:config RTW88_8821A\ndrivers/net/wireless/realtek/rtw88/Kconfig-50-\ttristate\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-52-\ndrivers/net/wireless/realtek/rtw88/Kconfig:53:config RTW88_8812A\ndrivers/net/wireless/realtek/rtw88/Kconfig-54-\ttristate\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-56-\ndrivers/net/wireless/realtek/rtw88/Kconfig:57:config RTW88_8814A\ndrivers/net/wireless/realtek/rtw88/Kconfig-58-\ttristate\ndrivers/net/wireless/realtek/rtw88/Kconfig-59-\ndrivers/net/wireless/realtek/rtw88/Kconfig:60:config RTW88_8822BE\ndrivers/net/wireless/realtek/rtw88/Kconfig-61-\ttristate \"Realtek 8822BE PCI wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-70-\ndrivers/net/wireless/realtek/rtw88/Kconfig:71:config RTW88_8822BS\ndrivers/net/wireless/realtek/rtw88/Kconfig-72-\ttristate \"Realtek 8822BS SDIO wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-81-\ndrivers/net/wireless/realtek/rtw88/Kconfig:82:config RTW88_8822BU\ndrivers/net/wireless/realtek/rtw88/Kconfig-83-\ttristate \"Realtek 8822BU USB wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-92-\ndrivers/net/wireless/realtek/rtw88/Kconfig:93:config RTW88_8822CE\ndrivers/net/wireless/realtek/rtw88/Kconfig-94-\ttristate \"Realtek 8822CE PCI wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-103-\ndrivers/net/wireless/realtek/rtw88/Kconfig:104:config RTW88_8822CS\ndrivers/net/wireless/realtek/rtw88/Kconfig-105-\ttristate \"Realtek 8822CS SDIO wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-114-\ndrivers/net/wireless/realtek/rtw88/Kconfig:115:config RTW88_8822CU\ndrivers/net/wireless/realtek/rtw88/Kconfig-116-\ttristate \"Realtek 8822CU USB wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-125-\ndrivers/net/wireless/realtek/rtw88/Kconfig:126:config RTW88_8723DE\ndrivers/net/wireless/realtek/rtw88/Kconfig-127-\ttristate \"Realtek 8723DE PCI wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-136-\ndrivers/net/wireless/realtek/rtw88/Kconfig:137:config RTW88_8723DS\ndrivers/net/wireless/realtek/rtw88/Kconfig-138-\ttristate \"Realtek 8723DS SDIO wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-147-\ndrivers/net/wireless/realtek/rtw88/Kconfig:148:config RTW88_8723CS\ndrivers/net/wireless/realtek/rtw88/Kconfig-149-\ttristate \"Realtek 8723CS SDIO wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-161-\ndrivers/net/wireless/realtek/rtw88/Kconfig:162:config RTW88_8723DU\ndrivers/net/wireless/realtek/rtw88/Kconfig-163-\ttristate \"Realtek 8723DU USB wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-172-\ndrivers/net/wireless/realtek/rtw88/Kconfig:173:config RTW88_8821CE\ndrivers/net/wireless/realtek/rtw88/Kconfig-174-\ttristate \"Realtek 8821CE PCI wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-183-\ndrivers/net/wireless/realtek/rtw88/Kconfig:184:config RTW88_8821CS\ndrivers/net/wireless/realtek/rtw88/Kconfig-185-\ttristate \"Realtek 8821CS SDIO wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-194-\ndrivers/net/wireless/realtek/rtw88/Kconfig:195:config RTW88_8821CU\ndrivers/net/wireless/realtek/rtw88/Kconfig-196-\ttristate \"Realtek 8821CU USB wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-205-\ndrivers/net/wireless/realtek/rtw88/Kconfig:206:config RTW88_8821AU\ndrivers/net/wireless/realtek/rtw88/Kconfig-207-\ttristate \"Realtek 8821AU/8811AU USB wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-216-\ndrivers/net/wireless/realtek/rtw88/Kconfig:217:config RTW88_8812AU\ndrivers/net/wireless/realtek/rtw88/Kconfig-218-\ttristate \"Realtek 8812AU USB wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-227-\ndrivers/net/wireless/realtek/rtw88/Kconfig:228:config RTW88_8814AE\ndrivers/net/wireless/realtek/rtw88/Kconfig-229-\ttristate \"Realtek 8814AE PCI wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-238-\ndrivers/net/wireless/realtek/rtw88/Kconfig:239:config RTW88_8814AU\ndrivers/net/wireless/realtek/rtw88/Kconfig-240-\ttristate \"Realtek 8814AU USB wireless network adapter\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-249-\ndrivers/net/wireless/realtek/rtw88/Kconfig:250:config RTW88_DEBUG\ndrivers/net/wireless/realtek/rtw88/Kconfig-251-\tbool \"Realtek rtw88 debug support\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-257-\ndrivers/net/wireless/realtek/rtw88/Kconfig:258:config RTW88_DEBUGFS\ndrivers/net/wireless/realtek/rtw88/Kconfig-259-\tbool \"Realtek rtw88 debugfs support\"\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-265-\ndrivers/net/wireless/realtek/rtw88/Kconfig:266:config RTW88_LEDS\ndrivers/net/wireless/realtek/rtw88/Kconfig-267-\tbool\n"
} |
| 19/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 20309 output: 45 thoughts: 42 Thoughts: Okay, here's my take on those thoughts, framed as my own: **Analyzing RTW88 Configuration Options** Alright, so the current options we're working with are `RTW88` and `RTW88_8822CU`. My immediate focus is on that specific `RTW88_8822CU` variation. Given the usual configuration complexities and potential dependencies within these drivers, it's essential to meticulously verify what *RTW88_8822CU* relies upon. That's where I need to start. We can't afford to miss anything that might be required for that specific module. Getting a clear dependency picture will be the first and most critical step. |
| 20/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "config RTW88_8822CU",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/Kconfig=104=config RTW88_8822CS\n--\ndrivers/net/wireless/realtek/rtw88/Kconfig-114-\ndrivers/net/wireless/realtek/rtw88/Kconfig:115:config RTW88_8822CU\ndrivers/net/wireless/realtek/rtw88/Kconfig-116-\ttristate \"Realtek 8822CU USB wireless network adapter\"\n"
} |
| 21/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 20693 output: 44 thoughts: 20 Thoughts: Okay, here's my attempt at summarizing the thought process, as requested, geared toward an expert audience, and from a first-person perspective: **RTW88_8822CU: Deep Dive & Strategy** Alright, let's pull up that full block of code for the `RTW88_8822CU` driver. I need to get a really good grasp of this. First, I'm going to scan the main entry points, the initialization and probe functions. I'm looking for the overall architecture - how they're handling hardware abstraction, interrupt handling, and what kind of power management hooks they’ve put in place. Are they using the standard regulatory domain interfaces correctly? Any deviations? Any custom mechanisms I should be aware of? Then, I'll hone in on the important data structures. I need to understand how they're representing the hardware state – the registers, the configuration, the operational parameters. Are they employing any clever memory mapping techniques or direct register access? Any unusual use of DMA or sophisticated buffering strategies? I'm hoping to quickly identify any potential bottlenecks or areas for optimization. Next, I'll dive into the interrupt handlers. That's usually where the real-time constraints are going to surface. How are they prioritizing interrupts? Are they using bottom-halves effectively? How are they handling shared interrupts, if at all? I need to analyze the interrupt latency to know if it can support my use cases. Are there any contention issues I should look out for? After that, I'll trace through the key data paths: the TX path, the RX path, and the management frame processing. I'll need to understand how they're managing packet queues, flow control, and any fragmentation/reassembly. Are they doing any per-packet optimizations, or is it more of a "one-size-fits-all" approach? What about offloading - any hardware offload capabilities? Finally, I'll look into power management. How are they responding to power state changes? Are they using the standard PM APIs correctly, or are there any custom power-saving mechanisms? I'll assess the clock gating and power domain management. Are they aggressive enough in reducing power consumption when idle? The end goal is to get a really good handle on its architecture, its potential weaknesses, and identify any areas where I can make improvements or modifications. Also, I will be on the lookout to see if this code is a good base for my projects. |
| 22/2 | 2026/08/15 06:34 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/Kconfig",
"FirstLine": 110,
"LineCount": 20
}Results: {
"Contents": " 110:\t\thelp\n 111:\t\t Select this option will enable support for 8822CS chipset\n 112:\t\n 113:\t\t 802.11ac SDIO wireless network adapter\n 114:\t\n 115:\tconfig RTW88_8822CU\n 116:\t\ttristate \"Realtek 8822CU USB wireless network adapter\"\n 117:\t\tdepends on USB\n 118:\t\tselect RTW88_CORE\n 119:\t\tselect RTW88_USB\n 120:\t\tselect RTW88_8822C\n 121:\t\thelp\n 122:\t\t Select this option will enable support for 8822CU chipset\n 123:\t\n 124:\t\t 802.11ac USB wireless network adapter\n 125:\t\n 126:\tconfig RTW88_8723DE\n 127:\t\ttristate \"Realtek 8723DE PCI wireless network adapter\"\n 128:\t\tdepends on PCI\n 129:\t\tselect RTW88_CORE\n"
} |
| 23/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 21584 output: 42 thoughts: 61 Thoughts: **Analyzing the `RTW88_8822CU` Driver Dependencies** Okay, so I'm looking at this `RTW88_8822CU` driver. It's the one I need to focus on. Right, it looks like it depends directly on the `USB` subsystem. Makes sense, given the `CU` in the name probably implies a USB interface. Now, let's step back and look at the bigger picture. The parent config, `RTW88`, that *this* specific driver is part of, depends on both `MAC80211` and `WLAN`. That's standard for wireless drivers, of course. Now, before I go any further I want to make sure the `RTW88` itself is completely sound. Better to be thorough, I'll check *those* dependencies next. Make sure everything's in order, avoid surprises, and all that. |
| 24/2 | 2026/08/15 06:34 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/Kconfig",
"FirstLine": 1,
"LineCount": 20
}Results: {
"Contents": " 1:\t# SPDX-License-Identifier: GPL-2.0-only\n 2:\tmenuconfig RTW88\n 3:\t\ttristate \"Realtek 802.11ac wireless chips support\"\n 4:\t\tdepends on MAC80211\n 5:\t\thelp\n 6:\t\t This module adds support for mac80211-based wireless drivers that\n 7:\t\t enables Realtek IEEE 802.11ac wireless chipsets.\n 8:\t\n 9:\t\t If you choose to build a module, it'll be called rtw88.\n 10:\t\n 11:\tif RTW88\n 12:\t\n 13:\tconfig RTW88_CORE\n 14:\t\ttristate\n 15:\t\tselect WANT_DEV_COREDUMP\n 16:\t\n 17:\tconfig RTW88_PCI\n 18:\t\ttristate\n 19:\t\n 20:\tconfig RTW88_SDIO\n"
} |
| 25/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 22154 output: 72 thoughts: 493 Thoughts: **Analyzing Configuration and Symbol Inclusion** Okay, so I'm looking at this and the instructions are pretty clear. The configs I need to focus on for enabling are `RTW88` and `RTW88_8822CU`. Easy enough, and I need to remember to *not* include the "CONFIG_" prefix, so just the raw names are what's going in the output array. `MAC80211` and `WLAN` are standard, those are out. Now, I've got to determine which functions should be listed in `FocusSymbols`. The patch modifies `rtw8822c_dac_cal_iq_search` and `rtw8822c_dac_iq_offset`. Wait, hold on. `rtw8822c_dac_cal_iq_search` is static and that's not what I want. The instructions are specific: non-static, non-inlined API entrypoint functions are preferred. So I need to trace back from that static helper. Okay, let's see. `rtw8822c_dac_cal_iq_search` is called by `rtw8822c_dac_cal_rf_mode`, which is *also* static. It seems that `rtw8822c_dac_cal_rf_mode` is called by `rtw8822c_dac_cal_adc`, `rtw8822c_dac_cal_step2`, and `rtw8822c_dac_cal_step3`. These are all called by `rtw8822c_rf_dac_cal`. `rtw8822c_rf_dac_cal` is in turn called by `rtw8822c_rf_init`. Then, finally, `rtw8822c_rf_init` is called by `rtw8822c_phy_set_param`. Okay, so `rtw8822c_phy_set_param` is also static, but it *is* assigned to `.phy_set_param` in `rtw8822c_ops`. This is making me think there's a non-static function deeper within `rtw8822c.c` that handles this. Time to go check `rtw8822c.c` for any non-static functions. |
| 26/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "^([a-z_0-9]+ )+rtw8822c_[a-z_0-9]+\\(",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/rtw8822c.c"
}Results: {
"Output": "\nFull output is too long, showing 500 out of 641 lines.\nUse more precise expression if possible.\n\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-23-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:24:static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-25-\t\t\t\t u8 rx_path, bool is_tx2_path);\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=39=static void rtw8822cs_efuse_parsing(struct rtw_efuse *efuse,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-44-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:45:static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-46-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-88-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:89:static void rtw8822c_header_file_init(struct rtw_dev *rtwdev, bool pre)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-90-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-101-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:102:static void rtw8822c_bb_reset(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-103-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-108-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:109:static void rtw8822c_dac_backup_reg(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-110-\t\t\t\t struct rtw_backup_info *backup,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-137-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:138:static void rtw8822c_dac_restore_reg(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-139-\t\t\t\t struct rtw_backup_info *backup,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-156-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:157:static int rtw8822c_dac_iq_cmp_s32(const void *a, const void *b)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-158-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-165-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:166:static u32 rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, s32 *vec)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-167-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-177-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:178:static u32 rtw8822c_get_path_write_addr(u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-179-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-196-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:197:static u32 rtw8822c_get_path_read_addr(u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-198-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-215-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:216:static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, s32 value)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-217-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-226-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:227:static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, s32 *iv, s32 *qv)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-228-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-243-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:244:static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-245-\t\t\t\t s32 *iv, s32 *qv,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-298-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:299:static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-300-\t\t\t\t u32 *i_value, u32 *q_value)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-314-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:315:static void rtw8822c_dac_bb_setting(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-316-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-330-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:331:static void rtw8822c_dac_cal_adc(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-332-\t\t\t\t u8 path, u32 *adc_ic, u32 *adc_qc)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-408-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:409:static void rtw8822c_dac_cal_step1(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-410-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-453-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:454:static void rtw8822c_dac_cal_step2(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-455-\t\t\t\t u8 path, u32 *ic_out, u32 *qc_out)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-502-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:503:static void rtw8822c_dac_cal_step3(struct rtw_dev *rtwdev, u8 path,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-504-\t\t\t\t u32 adc_ic, u32 adc_qc,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-579-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:580:static void rtw8822c_dac_cal_step4(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-581-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-589-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:590:static void rtw8822c_dac_cal_backup_vec(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-591-\t\t\t\t\tu8 path, u8 vec, u32 w_addr, u32 r_addr)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-606-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:607:static void rtw8822c_dac_cal_backup_path(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-608-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-626-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:627:static void rtw8822c_dac_cal_backup_dck(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-628-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-650-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:651:static void rtw8822c_dac_cal_backup(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-652-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-680-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:681:static void rtw8822c_dac_cal_restore_dck(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-682-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-710-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:711:static void rtw8822c_dac_cal_restore_prepare(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-712-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-763-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:764:static bool rtw8822c_dac_cal_restore_wait(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-765-\t\t\t\t\t u32 target_addr, u32 toggle_addr)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-780-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:781:static bool rtw8822c_dac_cal_restore_path(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-782-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=828=static bool __rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-838-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:839:static bool rtw8822c_dac_cal_restore(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-840-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-879-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:880:static void rtw8822c_rf_dac_cal(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-881-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-946-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:947:static void rtw8822c_rf_x2_check(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-948-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-960-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:961:static void rtw8822c_set_power_trim(struct rtw_dev *rtwdev, s8 bb_gain[2][8])\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-962-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-992-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:993:static void rtw8822c_power_trim(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-994-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1029-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1030:static void rtw8822c_thermal_trim(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1031-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1047-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1048:static void rtw8822c_pa_bias(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1049-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1069-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1070:static void rtw8822c_rfk_handshake(struct rtw_dev *rtwdev, bool is_before_k)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1071-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1115-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1116:static void rtw8822c_rfk_power_save(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1117-\t\t\t\t bool is_power_save)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1127-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1128:static void rtw8822c_txgapk_backup_bb_reg(struct rtw_dev *rtwdev, const u32 reg[],\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1129-\t\t\t\t\t u32 reg_backup[], u32 reg_num)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1140-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1141:static void rtw8822c_txgapk_reload_bb_reg(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1142-\t\t\t\t\t const u32 reg[], u32 reg_backup[],\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=1154=static bool check_rf_status(struct rtw_dev *rtwdev, u8 status)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1168-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1169:static void rtw8822c_txgapk_tx_pause(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1170-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1184-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1185:static void rtw8822c_txgapk_bb_dpk(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1186-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1216-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1217:static void rtw8822c_txgapk_afe_dpk(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1218-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1252-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1253:static void rtw8822c_txgapk_afe_dpk_restore(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1254-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1285-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1286:static void rtw8822c_txgapk_bb_dpk_restore(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1287-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=1335=static void _rtw8822c_txgapk_write_gain_bb_table(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1388-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1389:static void rtw8822c_txgapk_write_gain_bb_table(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1390-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1403-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1404:static void rtw8822c_txgapk_read_offset(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1405-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1480-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1481:static void rtw8822c_txgapk_calculate_offset(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1482-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1554-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1555:static void rtw8822c_txgapk_rf_restore(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1556-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1566-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1567:static u32 rtw8822c_txgapk_cal_gain(struct rtw_dev *rtwdev, u32 gain, s8 offset)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1568-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1590-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1591:static void rtw8822c_txgapk_write_tx_gain(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1592-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1660-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1661:static void rtw8822c_txgapk_save_all_tx_gain_table(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1662-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1719-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1720:static void rtw8822c_txgapk(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1721-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1761-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1762:static void rtw8822c_do_gapk(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1763-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1774-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1775:static void rtw8822c_rf_init(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1776-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1783-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1784:static void rtw8822c_pwrtrack_init(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1785-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1799-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1800:static void rtw8822c_phy_set_param(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1801-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1940-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:1941:static int rtw8822c_mac_init(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-1942-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=2084=static const struct rtw_fwcd_segs rtw8822c_fwcd_segs = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2088-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2089:static int rtw8822c_dump_fw_crash(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2090-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2116-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2117:static void rtw8822c_rstb_3wire(struct rtw_dev *rtwdev, bool enable)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2118-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2127-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2128:static void rtw8822c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2129-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2193-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2194:static void rtw8822c_toggle_igi(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2195-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2204-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2205:static void rtw8822c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2206-\t\t\t\t u8 primary_ch_idx)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2362-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2363:static void rtw8822c_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2364-\t\t\t\t u8 primary_chan_idx)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2371-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2372:static void rtw8822c_config_cck_rx_path(struct rtw_dev *rtwdev, u8 rx_path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2373-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2389-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2390:static void rtw8822c_config_ofdm_rx_path(struct rtw_dev *rtwdev, u8 rx_path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2391-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2409-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2410:static void rtw8822c_config_rx_path(struct rtw_dev *rtwdev, u8 rx_path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2411-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2415-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2416:static void rtw8822c_config_cck_tx_path(struct rtw_dev *rtwdev, u8 tx_path,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2417-\t\t\t\t\tbool is_tx2_path)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2431-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2432:static void rtw8822c_config_ofdm_tx_path(struct rtw_dev *rtwdev, u8 tx_path,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2433-\t\t\t\t\t enum rtw_bb_path tx_path_sel_1ss)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2455-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2456:static void rtw8822c_config_tx_path(struct rtw_dev *rtwdev, u8 tx_path,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2457-\t\t\t\t enum rtw_bb_path tx_path_sel_1ss,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2465-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2466:static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2467-\t\t\t\t u8 rx_path, bool is_tx2_path)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=2631=rtw8822c_set_write_tx_power_ref(struct rtw_dev *rtwdev, u8 *tx_pwr_ref_cck,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2650-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2651:static void rtw8822c_set_tx_power_diff(struct rtw_dev *rtwdev, u8 rate,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2652-\t\t\t\t s8 *diff_idx)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2672-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2673:static void rtw8822c_set_tx_power_index(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2674-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2705-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2706:static int rtw8822c_set_antenna(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2707-\t\t\t\tint radio_idx,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2740-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2741:static void rtw8822c_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2742-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2749-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2750:static void rtw8822c_false_alarm_statistics(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2751-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2819-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2820:static void rtw8822c_do_lck(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2821-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2839-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2840:static void rtw8822c_do_iqk(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2841-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2857-/* for coex */\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2858:static void rtw8822c_coex_cfg_init(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2859-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2886-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2887:static void rtw8822c_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2888-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2965-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2966:static void rtw8822c_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2967-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2974-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2975:static void rtw8822c_coex_cfg_rfe_type(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2976-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2997-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:2998:static void rtw8822c_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-2999-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3008-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3009:static void rtw8822c_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3010-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3038-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3039:static void rtw8822c_bf_enable_bfee_su(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3040-\t\t\t\t struct rtw_vif *vif,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3058-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3059:static void rtw8822c_bf_config_bfee_su(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3060-\t\t\t\t struct rtw_vif *vif,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3068-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3069:static void rtw8822c_bf_config_bfee_mu(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3070-\t\t\t\t struct rtw_vif *vif,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3078-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3079:static void rtw8822c_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3080-\t\t\t\t struct rtw_bfee *bfee, bool enable)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=3090=struct dpk_cfg_pair {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3095-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3096:void rtw8822c_parse_tbl_dpk(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3097-\t\t\t const struct rtw_table *tbl)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3107-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3108:static void rtw8822c_dpk_set_gnt_wl(struct rtw_dev *rtwdev, bool is_before_k)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3109-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=3134=rtw8822c_dpk_backup_registers(struct rtw_dev *rtwdev, u32 *reg,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3145-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3146:static void rtw8822c_dpk_backup_rf_registers(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3147-\t\t\t\t\t u32 *rf_reg,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3159-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3160:static void rtw8822c_dpk_reload_rf_registers(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3161-\t\t\t\t\t u32 *rf_reg,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3173-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3174:static void rtw8822c_dpk_information(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3175-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3187-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3188:static void rtw8822c_dpk_rxbb_dc_cal(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3189-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3196-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3197:static u8 rtw8822c_dpk_dc_corr_check(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3198-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3221-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3222:static void rtw8822c_dpk_tx_pause(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3223-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3237-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3238:static void rtw8822c_dpk_mac_bb_setting(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3239-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3243-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3244:static void rtw8822c_dpk_afe_setting(struct rtw_dev *rtwdev, bool is_do_dpk)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3245-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3251-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3252:static void rtw8822c_dpk_pre_setting(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3253-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3270-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3271:static u32 rtw8822c_dpk_rf_setting(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3272-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3308-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3309:static u16 rtw8822c_dpk_get_cmd(struct rtw_dev *rtwdev, u8 action, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3310-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3333-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3334:static u8 rtw8822c_dpk_one_shot(struct rtw_dev *rtwdev, u8 path, u8 action)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3335-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3374-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3375:static u16 rtw8822c_dpk_dgain_read(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3376-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3386-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3387:static u8 rtw8822c_dpk_thermal_read(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3388-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3396-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3397:static u32 rtw8822c_dpk_pas_read(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3398-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3419-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3420:static u32 rtw8822c_psd_log2base(u32 val)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3421-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3445-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3446:static u8 rtw8822c_dpk_gainloss_result(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3447-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3460-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3461:static u8 rtw8822c_dpk_agc_gain_chk(struct rtw_dev *rtwdev, u8 path,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3462-\t\t\t\t u8 limited_pga)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3477-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3478:static u8 rtw8822c_dpk_agc_loss_chk(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3479-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=3495=struct rtw8822c_dpk_data {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3504-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3505:static u8 rtw8822c_gain_check_state(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3506-\t\t\t\t struct rtw8822c_dpk_data *data)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3534-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3535:static u8 rtw8822c_gain_large_state(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3536-\t\t\t\t struct rtw8822c_dpk_data *data)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3549-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3550:static u8 rtw8822c_gain_less_state(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3551-\t\t\t\t struct rtw8822c_dpk_data *data)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3564-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3565:static u8 rtw8822c_gl_state(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3566-\t\t\t struct rtw8822c_dpk_data *data, u8 is_large)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3583-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3584:static u8 rtw8822c_gl_large_state(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3585-\t\t\t\t struct rtw8822c_dpk_data *data)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3589-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3590:static u8 rtw8822c_gl_less_state(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3591-\t\t\t\t struct rtw8822c_dpk_data *data)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3595-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3596:static u8 rtw8822c_loss_check_state(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3597-\t\t\t\t struct rtw8822c_dpk_data *data)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=3608=static u8 (*dpk_state[])(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3613-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3614:static u8 rtw8822c_dpk_pas_agc(struct rtw_dev *rtwdev, u8 path,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3615-\t\t\t bool gain_only, bool loss_only)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3634-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3635:static bool rtw8822c_dpk_coef_iq_check(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3636-\t\t\t\t u16 coef_i, u16 coef_q)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3644-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3645:static u32 rtw8822c_dpk_coef_transfer(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3646-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=3662=static const u32 rtw8822c_dpk_get_coef_tbl[] = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3668-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3669:static void rtw8822c_dpk_coef_tbl_apply(struct rtw_dev *rtwdev, u8 path)\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3670-{\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3680-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3681:static void rtw8822c_dpk_get_coef(struct rtw_dev *rtwdev, u8 path)\n\n"
} |
| 27/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 38971 output: 43 thoughts: 40 Thoughts: Here's my take on the thought process: **Diving into the rtw8822c_ops Structure** Okay, so I need to understand how the `rtw8822c_ops` struct is being used in this driver. Right, it's the one holding the function pointers – the heart of this thing. That's usually how they do it in these kernel modules, a clean way to define an interface for the hardware operations. Time to dissect this struct and see which functions are defined within `rtw8822c_ops`. Let's see what methods it defines, what kind of operations we have here. I want to see how the core functions are mapped and how the driver interacts with the hardware. I will start by seeing what the functions are, and then I will check if their implementation is consistent with other related drivers I am familiar with. |
| 28/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "rtw8822c_ops",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=4880=static const struct rtw_prioq_addrs prioq_addrs_8822c = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-4895-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:4896:static const struct rtw_chip_ops rtw8822c_ops = {\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-4897-\t.power_on\t\t= rtw_power_on,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=5273=const struct rtw_chip_info rtw8822c_hw_spec = {\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:5274:\t.ops = \u0026rtw8822c_ops,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-5275-\t.id = RTW_CHIP_TYPE_8822C,\n"
} |
| 29/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 39581 output: 52 thoughts: 15 Thoughts: Okay, here we go... **Diving into `rtw8822c_ops`** Alright, time to crack open the `rtw8822c_ops` structure. I need to understand its role within the broader framework. Immediately, I'm thinking about the implications. This likely represents the specific operations interface for the Realtek RTL8822C wireless chip. My mind's racing – what are the key functions defined here? Think driver initialization, power management callbacks, perhaps transmit and receive path configuration, and interrupt handling...all the core interactions between the driver and the hardware. I have a hunch it will give me an insight into the design decisions around this specific chip, maybe its limitations too. Let’s see if they've implemented their own scheduling mechanisms, or are relying on the generic stack more heavily. This is where the magic happens, so to speak. Now, let's get reading. |
| 30/2 | 2026/08/15 06:34 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/rtw8822c.c",
"FirstLine": 4896,
"LineCount": 50
}Results: {
"Contents": "4896:\tstatic const struct rtw_chip_ops rtw8822c_ops = {\n4897:\t\t.power_on\t\t= rtw_power_on,\n4898:\t\t.power_off\t\t= rtw_power_off,\n4899:\t\t.phy_set_param\t\t= rtw8822c_phy_set_param,\n4900:\t\t.read_efuse\t\t= rtw8822c_read_efuse,\n4901:\t\t.query_phy_status\t= query_phy_status,\n4902:\t\t.set_channel\t\t= rtw8822c_set_channel,\n4903:\t\t.mac_init\t\t= rtw8822c_mac_init,\n4904:\t\t.mac_postinit\t\t= NULL,\n4905:\t\t.dump_fw_crash\t\t= rtw8822c_dump_fw_crash,\n4906:\t\t.read_rf\t\t= rtw_phy_read_rf,\n4907:\t\t.write_rf\t\t= rtw_phy_write_rf_reg_mix,\n4908:\t\t.set_tx_power_index\t= rtw8822c_set_tx_power_index,\n4909:\t\t.set_antenna\t\t= rtw8822c_set_antenna,\n4910:\t\t.cfg_ldo25\t\t= rtw8822c_cfg_ldo25,\n4911:\t\t.set_ampdu_factor\t= NULL,\n4912:\t\t.false_alarm_statistics\t= rtw8822c_false_alarm_statistics,\n4913:\t\t.dpk_track\t\t= rtw8822c_dpk_track,\n4914:\t\t.phy_calibration\t= rtw8822c_phy_calibration,\n4915:\t\t.cck_pd_set\t\t= rtw8822c_phy_cck_pd_set,\n4916:\t\t.pwr_track\t\t= rtw8822c_pwr_track,\n4917:\t\t.config_bfee\t\t= rtw8822c_bf_config_bfee,\n4918:\t\t.set_gid_table\t\t= rtw_bf_set_gid_table,\n4919:\t\t.cfg_csi_rate\t\t= rtw_bf_cfg_csi_rate,\n4920:\t\t.adaptivity_init\t= rtw8822c_adaptivity_init,\n4921:\t\t.adaptivity\t\t= rtw8822c_adaptivity,\n4922:\t\t.cfo_init\t\t= rtw8822c_cfo_init,\n4923:\t\t.cfo_track\t\t= rtw8822c_cfo_track,\n4924:\t\t.config_tx_path\t\t= rtw8822c_config_tx_path,\n4925:\t\t.config_txrx_mode\t= rtw8822c_config_trx_mode,\n4926:\t\t.led_set\t\t= rtw8822c_led_set,\n4927:\t\t.fill_txdesc_checksum\t= rtw8822c_fill_txdesc_checksum,\n4928:\t\n4929:\t\t.coex_set_init\t\t= rtw8822c_coex_cfg_init,\n4930:\t\t.coex_set_ant_switch\t= NULL,\n4931:\t\t.coex_set_gnt_fix\t= rtw8822c_coex_cfg_gnt_fix,\n4932:\t\t.coex_set_gnt_debug\t= rtw8822c_coex_cfg_gnt_debug,\n4933:\t\t.coex_set_rfe_type\t= rtw8822c_coex_cfg_rfe_type,\n4934:\t\t.coex_set_wl_tx_power\t= rtw8822c_coex_cfg_wl_tx_power,\n4935:\t\t.coex_set_wl_rx_gain\t= rtw8822c_coex_cfg_wl_rx_gain,\n4936:\t};\n4937:\t\n4938:\t/* Shared-Antenna Coex Table */\n4939:\tstatic const struct coex_table_para table_sant_8822c[] = {\n4940:\t\t{0xffffffff, 0xffffffff}, /* case-0 */\n4941:\t\t{0x55555555, 0x55555555},\n4942:\t\t{0x66555555, 0x66555555},\n4943:\t\t{0xaaaaaaaa, 0xaaaaaaaa},\n4944:\t\t{0x5a5a5a5a, 0x5a5a5a5a},\n4945:\t\t{0xfafafafa, 0xfafafafa}, /* case-5 */\n"
} |
| 31/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 41159 output: 40 thoughts: 101 Thoughts: **Investigating the Power-On Sequence** Okay, so I'm trying to trace the power-on sequence for this system. The starting point seems to be `rtw_power_on`. That makes sense; it's a good candidate for the main entry function. This then leads to a call to `phy_set_param`, which ultimately resolves to `rtw8822c_phy_set_param`. Hmm, but `rtw8822c_phy_set_param` is declared as `static`. That's a bit of a roadblock. It's not directly accessible from outside its compilation unit, which might complicate things. The question then is, can I still leverage `rtw_power_on` as my starting point? Let's assume so for now. I recall that `rtw_power_on` resides in `main.c`. That's useful information. So, the next logical step is to dive into the code for `rtw_power_on` itself. I need to understand what's happening there to see how the static `rtw8822c_phy_set_param` is being used or accessed, and how it fits into the broader power-on initialization procedure. |
| 32/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "rtw_power_on",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/main.c=1354=static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/main.c-1373-\ndrivers/net/wireless/realtek/rtw88/main.c:1374:int rtw_power_on(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/main.c-1375-{\n--\ndrivers/net/wireless/realtek/rtw88/main.c-1442-}\ndrivers/net/wireless/realtek/rtw88/main.c:1443:EXPORT_SYMBOL(rtw_power_on);\ndrivers/net/wireless/realtek/rtw88/main.c-1444-\n--\ndrivers/net/wireless/realtek/rtw88/main.h=2271=int rtw_wait_firmware_completion(struct rtw_dev *rtwdev);\ndrivers/net/wireless/realtek/rtw88/main.h:2272:int rtw_power_on(struct rtw_dev *rtwdev);\ndrivers/net/wireless/realtek/rtw88/main.h-2273-void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start);\n--\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c=1836=static const struct rtw_chip_ops rtw8703b_ops = {\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c:1837:\t.power_on\t\t= rtw_power_on,\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c-1838-\t.power_off\t\t= rtw_power_off,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c=1392=static const struct rtw_chip_ops rtw8723d_ops = {\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c:1393:\t.power_on\t\t= rtw_power_on,\ndrivers/net/wireless/realtek/rtw88/rtw8723d.c-1394-\t.power_off\t\t= rtw_power_off,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c=2050=static const struct rtw_chip_ops rtw8814a_ops = {\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c:2051:\t.power_on\t\t= rtw_power_on,\ndrivers/net/wireless/realtek/rtw88/rtw8814a.c-2052-\t.power_off\t\t= rtw_power_off,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c=1658=static const struct rtw_chip_ops rtw8821c_ops = {\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c:1659:\t.power_on\t\t= rtw_power_on,\ndrivers/net/wireless/realtek/rtw88/rtw8821c.c-1660-\t.power_off\t\t= rtw_power_off,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c=2150=static const struct rtw_chip_ops rtw8822b_ops = {\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c:2151:\t.power_on\t\t= rtw_power_on,\ndrivers/net/wireless/realtek/rtw88/rtw8822b.c-2152-\t.power_off\t\t= rtw_power_off,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=4896=static const struct rtw_chip_ops rtw8822c_ops = {\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:4897:\t.power_on\t\t= rtw_power_on,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-4898-\t.power_off\t\t= rtw_power_off,\n"
} |
| 33/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 42792 output: 40 thoughts: 56 Thoughts: **My Initial Assessment of the Power-On Sequence** Okay, so `rtw_power_on` is definitely an exported function. My first thought is: Is this the *only* entry point? I need to be sure I'm not missing anything crucial. Let's dig deeper. Ah, right, I remember seeing `rtw_core_start` in `main.c`. It's calling `rtw_power_on`, so that solidifies the connection. Now, the logical next step is to drill down into the `rtw_core_start` function itself. Understanding that flow will probably give me a much clearer picture of the overall initialization process and how this `rtw_power_on` function fits into the bigger picture. |
| 34/2 | 2026/08/15 06:34 | tool | grepper |
0mArgs:{
"Expression": "rtw_core_start",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/mac80211.c=53=static int rtw_ops_start(struct ieee80211_hw *hw)\n--\ndrivers/net/wireless/realtek/rtw88/mac80211.c-58-\tmutex_lock(\u0026rtwdev-\u003emutex);\ndrivers/net/wireless/realtek/rtw88/mac80211.c:59:\tret = rtw_core_start(rtwdev);\ndrivers/net/wireless/realtek/rtw88/mac80211.c-60-\tmutex_unlock(\u0026rtwdev-\u003emutex);\n--\ndrivers/net/wireless/realtek/rtw88/main.c=1490=void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,\n--\ndrivers/net/wireless/realtek/rtw88/main.c-1514-\ndrivers/net/wireless/realtek/rtw88/main.c:1515:int rtw_core_start(struct rtw_dev *rtwdev)\ndrivers/net/wireless/realtek/rtw88/main.c-1516-{\n--\ndrivers/net/wireless/realtek/rtw88/main.h=2253=void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,\ndrivers/net/wireless/realtek/rtw88/main.h-2254-\t\t\t bool hw_scan);\ndrivers/net/wireless/realtek/rtw88/main.h:2255:int rtw_core_start(struct rtw_dev *rtwdev);\ndrivers/net/wireless/realtek/rtw88/main.h-2256-void rtw_power_off(struct rtw_dev *rtwdev);\n--\ndrivers/net/wireless/realtek/rtw88/ps.c=13=static int rtw_ips_pwr_up(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/ps.c-16-\ndrivers/net/wireless/realtek/rtw88/ps.c:17:\tret = rtw_core_start(rtwdev);\ndrivers/net/wireless/realtek/rtw88/ps.c-18-\tif (ret)\n"
} |
| 35/2 | 2026/08/15 06:34 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 43690 output: 69 thoughts: 171 Thoughts: **Analyzing the Realtek Driver Initialization** Okay, so the `rtw_core_start` function, that's where things kick off. I see from the call graph that it gets called from `rtw_ops_start` within `mac80211.c`. And `rtw_ops_start` is the `.start` callback for mac80211, right? So, `rtw_core_start` seems like a prime target for fuzzing – a good starting point to explore. But wait, `rtw_core_start` resides in `main.c`, and the patch specifically modifies code in `rtw8822c.c`. Focusing on `rtw_core_start` would primarily fuzz the overall device initialization, not the specific changes. That doesn't feel right. Let's rethink this. Is there anything else in `rtw8822c.c` that's exported or not static? I need to understand what functions within that specific file are accessible from outside, or perhaps more relevant to the recent changes. Time to dive into `rtw8822c.c` and search for non-static functions. That's the real area I need to hone in on. |
| 36/2 | 2026/08/15 06:35 | tool | grepper |
0mArgs:{
"Expression": "^[a-z_0-9]+ rtw8822c_[a-z_0-9]+\\(",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/rtw8822c.c"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=3090=struct dpk_cfg_pair {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3095-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:3096:void rtw8822c_parse_tbl_dpk(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-3097-\t\t\t const struct rtw_table *tbl)\n"
} |
| 37/2 | 2026/08/15 06:35 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 44379 output: 45 thoughts: 88 Thoughts: Here's my take on the code analysis: **Code Structure and Visibility Analysis** Okay, so I'm digging into this `rtw8822c.c` file. The main thing that jumps out is the function `rtw8822c_parse_tbl_dpk`. It's the only one of the bunch that's *not* declared as `static` in that file, which immediately signals it's likely intended for external use. I need to keep that in mind when tracing the data flow. Wait a second, there's `rtw8822c_ops`. That *is* declared `static`, which means it's limited to the scope of this particular file. But, and this is where it gets interesting, I see that it's being assigned to `rtw8822c_hw_spec.ops`. Okay, so `rtw8822c_ops` itself is internal, but its contents, presumably a collection of function pointers, are potentially accessible indirectly through that `rtw8822c_hw_spec` struct. Ah, and I see `rtw8822c_hw_spec` itself is *exported*. That confirms the hypothesis; it's the gateway. I'll need to look at how `rtw8822c_hw_spec` is used. This struct probably acts as the central interface, exposing internal operations through pointers to external components. This whole setup suggests a modular design where core functionality is encapsulated, but certain hooks are provided for interaction with the driver's environment. Now, I'll need to figure out what those functions do. |
| 38/2 | 2026/08/15 06:35 | tool | grepper |
0mArgs:{
"Expression": "rtw8822c_hw_spec",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=5248=static const struct rtw_reg_domain coex_info_hw_regs_8822c[] = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-5272-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:5273:const struct rtw_chip_info rtw8822c_hw_spec = {\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-5274-\t.ops = \u0026rtw8822c_ops,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-5377-};\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:5378:EXPORT_SYMBOL(rtw8822c_hw_spec);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-5379-\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.h=127=void rtw8822c_parse_tbl_dpk(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.h-129-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.h:130:extern const struct rtw_chip_info rtw8822c_hw_spec;\ndrivers/net/wireless/realtek/rtw88/rtw8822c.h-131-\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822ce.c=10=static const struct pci_device_id rtw_8822ce_id_table[] = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822ce.c-12-\t\tPCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xC822),\ndrivers/net/wireless/realtek/rtw88/rtw8822ce.c:13:\t\t.driver_data = (kernel_ulong_t)\u0026rtw8822c_hw_spec\ndrivers/net/wireless/realtek/rtw88/rtw8822ce.c-14-\t},\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822ce.c-16-\t\tPCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xC82F),\ndrivers/net/wireless/realtek/rtw88/rtw8822ce.c:17:\t\t.driver_data = (kernel_ulong_t)\u0026rtw8822c_hw_spec\ndrivers/net/wireless/realtek/rtw88/rtw8822ce.c-18-\t},\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822cs.c=12=static const struct sdio_device_id rtw_8822cs_id_table[] = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822cs.c-15-\t\t\t SDIO_DEVICE_ID_REALTEK_RTW8822CS),\ndrivers/net/wireless/realtek/rtw88/rtw8822cs.c:16:\t\t.driver_data = (kernel_ulong_t)\u0026rtw8822c_hw_spec,\ndrivers/net/wireless/realtek/rtw88/rtw8822cs.c-17-\t},\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c=11=static const struct usb_device_id rtw_8822cu_id_table[] = {\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-12-\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82c, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c:13:\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-14-\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc812, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c:15:\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-16-\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82e, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c:17:\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-18-\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd820, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c:19:\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-20-\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd82b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c:21:\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-22-\t{ USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c:23:\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) }, /* Alpha - Alpha */\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-24-\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3329, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c:25:\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) }, /* D-Link AC13U rev. A1 */\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-26-\t{},\n"
} |
| 39/2 | 2026/08/15 06:35 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 46841 output: 49 thoughts: 30 Thoughts: Okay, here's my interpretation of those thoughts, presented as my own mental process, given my expertise: **Diving into the rtw8822cu Driver** Alright, the USB driver in question is `rtw8822cu`. No surprises there, it's pretty clear from the name. Time to get my hands dirty. Let's start by looking at `rtw8822cu.c`, the actual source code file. That's the heart of how this driver functions. This is where the magic happens, and it's where I need to start to truly understand its behavior, potential issues, or areas for optimization. I'm especially interested in things like interrupt handling, power management routines, and any custom extensions implemented. |
| 40/2 | 2026/08/15 06:35 | tool | read-file |
0mArgs:{
"File": "drivers/net/wireless/realtek/rtw88/rtw8822cu.c",
"FirstLine": 1,
"LineCount": 50
}Results: {
"Contents": " 1:\t// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause\n 2:\t/* Copyright(c) 2018-2019 Realtek Corporation\n 3:\t */\n 4:\t\n 5:\t#include \u003clinux/module.h\u003e\n 6:\t#include \u003clinux/usb.h\u003e\n 7:\t#include \"main.h\"\n 8:\t#include \"rtw8822c.h\"\n 9:\t#include \"usb.h\"\n 10:\t\n 11:\tstatic const struct usb_device_id rtw_8822cu_id_table[] = {\n 12:\t\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82c, 0xff, 0xff, 0xff),\n 13:\t\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\n 14:\t\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc812, 0xff, 0xff, 0xff),\n 15:\t\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\n 16:\t\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82e, 0xff, 0xff, 0xff),\n 17:\t\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\n 18:\t\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd820, 0xff, 0xff, 0xff),\n 19:\t\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\n 20:\t\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd82b, 0xff, 0xff, 0xff),\n 21:\t\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) },\n 22:\t\t{ USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff),\n 23:\t\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) }, /* Alpha - Alpha */\n 24:\t\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3329, 0xff, 0xff, 0xff),\n 25:\t\t .driver_info = (kernel_ulong_t)\u0026(rtw8822c_hw_spec) }, /* D-Link AC13U rev. A1 */\n 26:\t\t{},\n 27:\t};\n 28:\tMODULE_DEVICE_TABLE(usb, rtw_8822cu_id_table);\n 29:\t\n 30:\tstatic int rtw8822cu_probe(struct usb_interface *intf,\n 31:\t\t\t\t const struct usb_device_id *id)\n 32:\t{\n 33:\t\treturn rtw_usb_probe(intf, id);\n 34:\t}\n 35:\t\n 36:\tstatic struct usb_driver rtw_8822cu_driver = {\n 37:\t\t.name = KBUILD_MODNAME,\n 38:\t\t.id_table = rtw_8822cu_id_table,\n 39:\t\t.probe = rtw8822cu_probe,\n 40:\t\t.disconnect = rtw_usb_disconnect,\n 41:\t};\n 42:\tmodule_usb_driver(rtw_8822cu_driver);\n 43:\t\n 44:\tMODULE_AUTHOR(\"Realtek Corporation\");\n 45:\tMODULE_DESCRIPTION(\"Realtek 802.11ac wireless 8822cu driver\");\n 46:\tMODULE_LICENSE(\"Dual BSD/GPL\");\n"
} |
| 41/2 | 2026/08/15 06:35 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 48161 output: 40 thoughts: 47 Thoughts: Here's my summary, as though I'm thinking through this process: **Diving into the USB Driver's Entry Point** Okay, so I need to get a handle on this USB driver. A solid starting point, a good focus symbol, is often the probe function. Let's see... `rtw_usb_probe` looks promising. It's exported by `usb.c`, which makes sense as the likely entry point. Good, that confirms it's the right function. Alright, let's dive into examining `rtw_usb_probe` and see what it reveals. |
| 42/2 | 2026/08/15 06:35 | tool | grepper |
0mArgs:{
"Expression": "rtw_usb_probe",
"PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8723du.c=20=static int rtw8723du_probe(struct usb_interface *intf,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8723du.c-22-{\ndrivers/net/wireless/realtek/rtw88/rtw8723du.c:23:\treturn rtw_usb_probe(intf, id);\ndrivers/net/wireless/realtek/rtw88/rtw8723du.c-24-}\n--\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c=84=static struct usb_driver rtw_8812au_driver = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-86-\t.id_table = rtw_8812au_id_table,\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:87:\t.probe = rtw_usb_probe,\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-88-\t.disconnect = rtw_usb_disconnect,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c=44=static struct usb_driver rtw_8814au_driver = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-46-\t.id_table = rtw_8814au_id_table,\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:47:\t.probe = rtw_usb_probe,\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-48-\t.disconnect = rtw_usb_disconnect,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c=68=static struct usb_driver rtw_8821au_driver = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-70-\t.id_table = rtw_8821au_id_table,\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:71:\t.probe = rtw_usb_probe,\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-72-\t.disconnect = rtw_usb_disconnect,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c=46=static int rtw_8821cu_probe(struct usb_interface *intf,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-48-{\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:49:\treturn rtw_usb_probe(intf, id);\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-50-}\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c=88=static int rtw8822bu_probe(struct usb_interface *intf,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-90-{\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:91:\treturn rtw_usb_probe(intf, id);\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-92-}\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c=30=static int rtw8822cu_probe(struct usb_interface *intf,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-32-{\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c:33:\treturn rtw_usb_probe(intf, id);\ndrivers/net/wireless/realtek/rtw88/rtw8822cu.c-34-}\n--\ndrivers/net/wireless/realtek/rtw88/usb.c=1225=static void rtw_usb_phy_cfg(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-1262-\ndrivers/net/wireless/realtek/rtw88/usb.c:1263:int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)\ndrivers/net/wireless/realtek/rtw88/usb.c-1264-{\n--\ndrivers/net/wireless/realtek/rtw88/usb.c-1358-}\ndrivers/net/wireless/realtek/rtw88/usb.c:1359:EXPORT_SYMBOL(rtw_usb_probe);\ndrivers/net/wireless/realtek/rtw88/usb.c-1360-\n--\ndrivers/net/wireless/realtek/rtw88/usb.h=90=static inline struct rtw_usb_tx_data *rtw_usb_get_tx_data(struct sk_buff *skb)\n--\ndrivers/net/wireless/realtek/rtw88/usb.h-99-\ndrivers/net/wireless/realtek/rtw88/usb.h:100:int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id);\ndrivers/net/wireless/realtek/rtw88/usb.h-101-void rtw_usb_disconnect(struct usb_interface *intf);\n"
} |
| 43/2 | 2026/08/15 06:35 | llm | patch-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 49909 output: 169 thoughts: 1559 Thoughts: **My Analysis of the Realtek 8822C DAC IQ Calibration Patch** Okay, let's break this down. My initial thought was to identify suitable focus symbols for fuzzing. I quickly settled on `rtw_usb_probe`, `rtw_core_start`, and `rtw_power_on`. They are all non-static, non-inlined API entrypoints, which aligns perfectly with the prompt's preference. I confirmed that all three functions are relevant, given the patch's modification of `rtw8822c.c`, which is shared across USB, PCI, and SDIO. Since we're targeting USB, `rtw_usb_probe` is a good starting point, and `rtw_core_start` and `rtw_power_on` are good for the core functionality. I then traced the call paths to verify that the target function `rtw8822c_dac_cal_iq_search` is reachable from `rtw_usb_probe` – and indeed, it is! The path goes through `rtw_core_init`, `rtw_core_start` (via `rtw_ops_start`), `rtw_power_on`, and down to the specific calibration function. This is key: the calibration is part of the bring-up sequence. Next, I nailed down the necessary kernel configurations. `RTW88` and `RTW88_8822CU` seem sufficient. `RTW88_8822CU` depends on `USB`, so it's a good choice for USB path testing. I checked the Kconfig to verify that `RTW88_8822CU` is, in fact, the correct name, and that `RTW88_8822C` is automatically selected. Standard configurations like `MAC80211` and `WLAN` are implied, and `USB` is also standard. Therefore, `RTW88` and `RTW88_8822CU` are enough. I re-examined the patch itself, which uses `sort()` to sort IQ values and changes data types to `s32`. This indicates a functional modification within the driver's calibration. This is good: a functional change, reachable via the USB path, makes it a prime candidate for fuzzing. My reasoning? The patch changes the DAC IQ calibration logic in `rtw8822c.c`. This is reachable via the USB variant of the driver and virtualized environments using USB gadget emulation. So, in summary: * **Focus Symbols**: `rtw_usb_probe`, `rtw_core_start`, `rtw_power_on` * **Enable Configurations**: `RTW88`, `RTW88_8822CU` Yes, `rtw8822c_dac_cal_iq_search` is reachable. Let's call `set-results`. |
| 44/2 | 2026/08/15 06:35 | tool | set-results |
0mArgs:{
"EnableConfigs": [
"RTW88",
"RTW88_8822CU"
],
"FocusSymbols": [
"rtw_usb_probe",
"rtw_core_start",
"rtw_power_on"
],
"Reasoning": "The patch modifies the DAC IQ calibration logic in the Realtek 8822C wireless driver, replacing a custom sorting implementation with the standard sort() function and changing the data types from u32 to s32. This is a functional change in the driver's initialization and calibration sequence. The code is reachable in virtualized environments via the USB variant of the driver (rtw88_8822cu) using USB gadget emulation.",
"WorthFuzzing": true
}Results: {
"EnableConfigs": [
"RTW88",
"RTW88_8822CU"
],
"FocusSymbols": [
"rtw_usb_probe",
"rtw_core_start",
"rtw_power_on"
],
"Reasoning": "The patch modifies the DAC IQ calibration logic in the Realtek 8822C wireless driver, replacing a custom sorting implementation with the standard sort() function and changing the data types from u32 to s32. This is a functional change in the driver's initialization and calibration sequence. The code is reachable in virtualized environments via the USB variant of the driver (rtw88_8822cu) using USB gadget emulation.",
"WorthFuzzing": true
} |
| 45/1 | 2026/08/15 06:35 | action | If |
0mArgs:{
"WorthFuzzing": true
}Results: null |
| 46/2 | 2026/08/15 06:35 | agent | kmsan-evaluator |
0mModel:best-expensive Args: null Results: {
"KMSANReasoning": "The patch refactors IQ calibration logic in the rtw88 driver, replacing custom 10-bit two's complement arithmetic and a custom bubble sort with standard signed integers (s32) and the kernel's sort() function. While the stack-allocated arrays `iv` and `qv` could potentially be partially uninitialized if the hardware read loop times out, this exact same behavior and subsequent reading of these arrays existed prior to the patch. The patch does not introduce any new uninitialized memory allocations, nor does it expose any kernel structures to userspace. Any potential memory safety issues (such as out-of-bounds accesses) would be caught by standard KASAN. Therefore, a dedicated KMSAN session is not justified.",
"NeedsKMSAN": false
}Instruction: You are an expert Linux kernel security engineer specializing in kernel memory
error detectors (KASAN and KMSAN). Your job is to review the provided patch series and
determine if the code changes justify spawning a dedicated KMSAN (KernelMemorySanitizer)
fuzzing session in addition to standard KASAN fuzzing.
CRITICAL DISTINCTION BETWEEN KASAN AND KMSAN:
- Standard KASAN kernel builds (upstream-apparmor-kasan.config) already enable
a comprehensive suite of debugging tools and sanitizers, including KASAN
(out-of-bounds accesses, use-after-free, double free, invalid free), LOCKDEP
(locking bugs and deadlocks), UB-sanitizers, and memory corruption checks.
- KMSAN (KernelMemorySanitizer) detects reads of UNINITIALIZED memory (stack, heap,
or page allocations) and kernel-to-user memory info-leaks.
Rule: THERE IS NO SENSE IN RUNNING A KMSAN SESSION IF A BUG CAN BE CAUGHT BY KASAN,
LOCKDEP, OR OTHER STANDARD BUG DETECTORS.
A dedicated KMSAN fuzzing session incurs significant resource costs. You must ONLY
set NeedsKMSAN=true if the code changes introduce or expose UNINITIALIZED MEMORY risks
that are detected ONLY by KMSAN.
Look holistically at the patch series and surrounding code. Even if no direct
uninitialized field accesses or new buffer allocations are added in the diff itself,
a patch may alter control flow, bounds checking, or data length calculations in ways
that change how the rest of the code operates on existing buffers (e.g. allowing
uninitialized stack/heap memory to be read, copied to user space, or used in control
flow). Do not hesitate to use your code access tools to inspect the surrounding code,
called functions, and callers.
Set NeedsKMSAN=true ONLY IF the patch introduces or modifies:
1. Kernel structures sent to user space (via copy_to_user, put_user, netlink skb
attributes, ioctl output arguments, socket options, or BPF buffers) where fields
or structure padding might not be fully initialized/zeroed.
2. Conditional logic or branching that depends on potentially uninitialized variables
or struct fields.
3. Allocation or initialization of complex data structures where uninitialized fields
could be read later in reachable code paths.
4. Bounds checks, lengths, or logic in a way that allows surrounding code to access
uninitialized bytes of existing buffers.
Set NeedsKMSAN=false IF:
- The code changes primarily risk out-of-bounds access, array overflows, NULL pointer
dereferences, locking deadlocks, or use-after-free bugs (these are already caught
by KASAN, LOCKDEP, or standard bug detectors).
- All stack/heap structures touched or introduced by the patch are fully zeroed
or initialized (e.g. using = {0}, memset, kzalloc) before being read or copied.
- The patch does not introduce any risk of uninitialized memory usage or info-leaks.
Use your code access tools to inspect the surrounding code if necessary, then provide
detailed KMSANReasoning contrasting KASAN vs KMSAN applicability for this patch.
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 343e16e3817f256394cb394716bbe501c33ba42d
Author: syz-cluster <triage@syzkaller.com>
Date: Sat Aug 15 06:33:32 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
index 244c8026479c2..0140f2e644ca9 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
@@ -3,6 +3,7 @@
*/
#include <linux/module.h>
+#include <linux/sort.h>
#include "main.h"
#include "coex.h"
#include "fw.h"
@@ -18,7 +19,7 @@
#include "bf.h"
#include "efuse.h"
-#define IQK_DONE_8822C 0xaa
+#define IQK_DONE_8822C 0xaa4
static void rtw8822c_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
u8 rx_path, bool is_tx2_path);
@@ -153,84 +154,25 @@ static void rtw8822c_dac_restore_reg(struct rtw_dev *rtwdev,
}
}
-static void rtw8822c_rf_minmax_cmp(struct rtw_dev *rtwdev, u32 value,
- u32 *min, u32 *max)
+static int rtw8822c_dac_iq_cmp_s32(const void *a, const void *b)
{
- if (value >= 0x200) {
- if (*min >= 0x200) {
- if (*min > value)
- *min = value;
- } else {
- *min = value;
- }
- if (*max >= 0x200) {
- if (*max < value)
- *max = value;
- }
- } else {
- if (*min < 0x200) {
- if (*min > value)
- *min = value;
- }
+ s32 val_a = *(const s32 *)a;
+ s32 val_b = *(const s32 *)b;
- if (*max >= 0x200) {
- *max = value;
- } else {
- if (*max < value)
- *max = value;
- }
- }
+ return (val_a > val_b) - (val_a < val_b);
}
-static void __rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *v1, u32 *v2)
-{
- if (*v1 >= 0x200 && *v2 >= 0x200) {
- if (*v1 > *v2)
- swap(*v1, *v2);
- } else if (*v1 < 0x200 && *v2 < 0x200) {
- if (*v1 > *v2)
- swap(*v1, *v2);
- } else if (*v1 < 0x200 && *v2 >= 0x200) {
- swap(*v1, *v2);
- }
-}
-static void rtw8822c_dac_iq_sort(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
+static u32 rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, s32 *vec)
{
- u32 i, j;
+ s32 sum = 0;
- for (i = 0; i < DACK_SN_8822C - 1; i++) {
- for (j = 0; j < (DACK_SN_8822C - 1 - i) ; j++) {
- __rtw8822c_dac_iq_sort(rtwdev, &iv[j], &iv[j + 1]);
- __rtw8822c_dac_iq_sort(rtwdev, &qv[j], &qv[j + 1]);
- }
- }
-}
-
-static void rtw8822c_dac_iq_offset(struct rtw_dev *rtwdev, u32 *vec, u32 *val)
-{
- u32 p, m, t, i;
-
- m = 0;
- p = 0;
- for (i = 10; i < DACK_SN_8822C - 10; i++) {
- if (vec[i] > 0x200)
- m = (0x400 - vec[i]) + m;
- else
- p = vec[i] + p;
- }
+ for (u32 i = 10; i < DACK_SN_8822C - 10; i++)
+ sum += vec[i];
- if (p > m) {
- t = p - m;
- t = t / (DACK_SN_8822C - 20);
- } else {
- t = m - p;
- t = t / (DACK_SN_8822C - 20);
- if (t != 0x0)
- t = 0x400 - t;
- }
+ s32 avg = sum / (DACK_SN_8822C - 20);
- *val = t;
+ return avg >= 0 ? (u32)avg : (u32)(0x400 + avg);
}
static u32 rtw8822c_get_path_write_addr(u8 path)
@@ -271,29 +213,27 @@ static u32 rtw8822c_get_path_read_addr(u8 path)
return base_addr;
}
-static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, u32 value)
+static bool rtw8822c_dac_iq_check(struct rtw_dev *rtwdev, s32 value)
{
- bool ret = true;
- if ((value >= 0x200 && (0x400 - value) > 0x64) ||
- (value < 0x200 && value > 0x64)) {
- ret = false;
+ if (value > 100 || value < -100) {
rtw_dbg(rtwdev, RTW_DBG_RFK, "[DACK] Error overflow\n");
+ return false;
}
- return ret;
+ return true;
}
-static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
+static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, s32 *iv, s32 *qv)
{
u32 temp;
int i = 0, cnt = 0;
while (i < DACK_SN_8822C && cnt < 10000) {
cnt++;
- temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
- iv[i] = (temp & 0x3ff000) >> 12;
- qv[i] = temp & 0x3ff;
+ temp = rtw_read32(rtwdev, 0x2dbc);
+ iv[i] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);
+ qv[i] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);
if (rtw8822c_dac_iq_check(rtwdev, iv[i]) &&
rtw8822c_dac_iq_check(rtwdev, qv[i]))
@@ -302,13 +242,13 @@ static void rtw8822c_dac_cal_iq_sample(struct rtw_dev *rtwdev, u32 *iv, u32 *qv)
}
static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,
- u32 *iv, u32 *qv,
+ s32 *iv, s32 *qv,
u32 *i_value, u32 *q_value)
{
- u32 i_max = 0, q_max = 0, i_min = 0, q_min = 0;
+ s32 i_max = 0, q_max = 0, i_min = 0, q_min = 0;
u32 i_delta, q_delta;
u32 temp;
- int i, cnt = 0;
+ u32 i, cnt = 0;
do {
i_min = iv[0];
@@ -316,23 +256,19 @@ static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,
q_min = qv[0];
q_max = qv[0];
for (i = 0; i < DACK_SN_8822C; i++) {
- rtw8822c_rf_minmax_cmp(rtwdev, iv[i], &i_min, &i_max);
- rtw8822c_rf_minmax_cmp(rtwdev, qv[i], &q_min, &q_max);
+ if (iv[i] < i_min)
+ i_min = iv[i];
+ if (iv[i] > i_max)
+ i_max = iv[i];
+ if (qv[i] < q_min)
+ q_min = qv[i];
+ if (qv[i] > q_max)
+ q_max = qv[i];
}
- if (i_max < 0x200 && i_min < 0x200)
- i_delta = i_max - i_min;
- else if (i_max >= 0x200 && i_min >= 0x200)
- i_delta = i_max - i_min;
- else
- i_delta = i_max + (0x400 - i_min);
+ i_delta = i_max - i_min;
+ q_delta = q_max - q_min;
- if (q_max < 0x200 && q_min < 0x200)
- q_delta = q_max - q_min;
- else if (q_max >= 0x200 && q_min >= 0x200)
- q_delta = q_max - q_min;
- else
- q_delta = q_max + (0x400 - q_min);
rtw_dbg(rtwdev, RTW_DBG_RFK,
"[DACK] i: min=0x%08x, max=0x%08x, delta=0x%08x\n",
@@ -341,28 +277,29 @@ static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,
"[DACK] q: min=0x%08x, max=0x%08x, delta=0x%08x\n",
q_min, q_max, q_delta);
- rtw8822c_dac_iq_sort(rtwdev, iv, qv);
+ sort(iv, DACK_SN_8822C, sizeof(s32), rtw8822c_dac_iq_cmp_s32, NULL);
+ sort(qv, DACK_SN_8822C, sizeof(s32), rtw8822c_dac_iq_cmp_s32, NULL);
if (i_delta > 5 || q_delta > 5) {
- temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
- iv[0] = (temp & 0x3ff000) >> 12;
- qv[0] = temp & 0x3ff;
- temp = rtw_read32_mask(rtwdev, 0x2dbc, 0x3fffff);
- iv[DACK_SN_8822C - 1] = (temp & 0x3ff000) >> 12;
- qv[DACK_SN_8822C - 1] = temp & 0x3ff;
+ temp = rtw_read32(rtwdev, 0x2dbc);
+ iv[0] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);
+ qv[0] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);
+ temp = rtw_read32(rtwdev, 0x2dbc);
+ iv[DACK_SN_8822C - 1] = FIELD_GET_SIGNED(RTW8822C_DAC_IV_MASK, temp);
+ qv[DACK_SN_8822C - 1] = FIELD_GET_SIGNED(RTW8822C_DAC_QV_MASK, temp);
} else {
break;
}
} while (cnt++ < 100);
- rtw8822c_dac_iq_offset(rtwdev, iv, i_value);
- rtw8822c_dac_iq_offset(rtwdev, qv, q_value);
+ *i_value = rtw8822c_dac_iq_offset(rtwdev, iv);
+ *q_value = rtw8822c_dac_iq_offset(rtwdev, qv);
}
static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev,
u32 *i_value, u32 *q_value)
{
- u32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];
+ s32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];
u32 rf_a, rf_b;
rf_a = rtw_read_rf(rtwdev, RF_PATH_A, 0x0, RFREG_MASK);
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
index fc62b67a15f21..7bea99614354b 100644
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
@@ -141,6 +141,9 @@ const struct rtw_table name ## _tbl = { \
#define DACK_RF_8822C 1
#define DACK_SN_8822C 100
+#define RTW8822C_DAC_IV_MASK GENMASK(21, 12)
+#define RTW8822C_DAC_QV_MASK GENMASK(9, 0)
+
/* phy status page0 */
#define GET_PHY_STAT_P0_PWDB_A(phy_stat) \
le32_get_bits(*((__le32 *)(phy_stat) + 0x00), GENMASK(15, 8))
|
| 47/3 | 2026/08/15 06:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 6071 output: 29 thoughts: 1792 Thoughts: **Uninitialized Memory Risk Assessment** Okay, so I'm looking at this patch for `rtw8822c.c`, specifically the changes in `rtw8822c_dac_cal_iq_sample`, `rtw8822c_dac_cal_iq_search`, and `rtw8822c_dac_iq_offset`. The patch primarily swaps out custom sorting and min/max logic for the standard `sort()` function from `linux/sort.h`, which is a good move for maintainability and possibly performance. The change in array types from `u32` to `s32` and the use of `FIELD_GET_SIGNED` for register reads are also standard procedure in these situations. My concern, however, is whether this introduces any uninitialized memory read risks, which is where I need to focus my attention. The arrays `iv` and `qv` are allocated on the stack within `rtw8822c_dac_cal_rf_mode`, as `s32 iv[DACK_SN_8822C], qv[DACK_SN_8822C];`, where `DACK_SN_8822C` is 100. So, we're talking about 100 `s32` elements for each array, all allocated on the stack. Now, do these arrays get fully initialized before use? I look at how the arrays are populated, which is via `rtw8822c_dac_cal_iq_sample`. The sample function reads a register and populates the arrays inside a `while` loop that can terminate early if a counter `cnt` reaches 10000 before all array elements are initialized. The check for termination conditions is: `i < DACK_SN_8822C && cnt < 10000`, so if `cnt` reaches 10000, the array `iv` and `qv` elements will be partially uninitialized. I immediately recognize this as a potential vulnerability. But hold on, let me quickly go back and check if this was a *new* problem introduced by this patch. And it's not. The old implementation using `u32` had the same condition. This means that even before my changes, the program was also subject to uninitialized memory being read. The only difference is the type conversion from `u32` to `s32` (and the change in sorting mechanism). So, what happens if `iv` and `qv` are only *partially* initialized, and we read the values later? The function `rtw8822c_dac_cal_iq_search` is called next, and inside it, we have a loop that reads `iv[i]` and `qv[i]`, then we run `sort()` and `rtw8822c_dac_iq_offset`, all potentially reading these uninitialized values. This is a definite issue – reading uninitialized memory, even if it's not a *new* problem, is still a critical one. The final question: does this leak to userspace? Looking at `rtw8822c_dac_cal_rf_mode`, it takes `u32 *i_value` and `u32 *q_value` as arguments, and `rtw8822c_dac_cal_iq_search` calculates values for these pointers. So, I need to check where `rtw8822c_dac_cal_rf_mode` is called to see if the resulting values are passed to other functions. I'll use `grepper` to search for callers. This information is needed to understand the scope of the problem. |
| 48/3 | 2026/08/15 06:35 | tool | grepper |
0mArgs:{
"Expression": "rtw8822c_dac_cal_rf_mode"
}Results: {
"Output": "drivers/net/wireless/realtek/rtw88/rtw8822c.c=244=static void rtw8822c_dac_cal_iq_search(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-298-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:299:static void rtw8822c_dac_cal_rf_mode(struct rtw_dev *rtwdev,\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-300-\t\t\t\t u32 *i_value, u32 *q_value)\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=331=static void rtw8822c_dac_cal_adc(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-368-\t\trtw_write32(rtwdev, 0x1c24, 0x00010002);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:369:\t\trtw8822c_dac_cal_rf_mode(rtwdev, \u0026ic, \u0026qc);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-370-\t\trtw_dbg(rtwdev, RTW_DBG_RFK,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-388-\t\trtw_write32(rtwdev, 0x1c3c, path_sel + 0x8103);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:389:\t\trtw8822c_dac_cal_rf_mode(rtwdev, \u0026ic, \u0026qc);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-390-\t\trtw_dbg(rtwdev, RTW_DBG_RFK,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=454=static void rtw8822c_dac_cal_step2(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-471-\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:472:\trtw8822c_dac_cal_rf_mode(rtwdev, \u0026ic_in, \u0026qc_in);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-473-\tic = ic_in;\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c=503=static void rtw8822c_dac_cal_step3(struct rtw_dev *rtwdev, u8 path,\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-553-\trtw_write32(rtwdev, base_addr + 0x60, 0xf0000000);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c:554:\trtw8822c_dac_cal_rf_mode(rtwdev, \u0026ic, \u0026qc);\ndrivers/net/wireless/realtek/rtw88/rtw8822c.c-555-\tif (ic \u003e= 0x10)\n"
} |
| 49/3 | 2026/08/15 06:35 | llm | kmsan-evaluator |
0mModel:gemini-3.1-pro-preview Args: null Results: null Tokens: input: 9714 output: 177 thoughts: 3944 Thoughts: **Analysis of the rtw8822c IQ Calibration Patch** Okay, let's break this down. My primary concern is KMSAN and whether this patch introduces or exposes any new reads of uninitialized memory, or any out-of-bounds accesses. Initially, I'm seeing that `rtw8822c_dac_cal_iq_search` and `rtw8822c_dac_iq_offset` are reading data and potentially using the result in writes to hardware or control flow. This raises a flag. KMSAN is designed to catch this. If `cnt` in the code hits 10000, and `i` < `DACK_SN_8822C`, it looks like the arrays `iv` and `qv` might be partially uninitialized. Then, the code calls `sort()` on them. That will read the values in those arrays. **That should trigger KMSAN**. But, is this *new*? Let's look at the pre-patch code. Before the patch, the code was calling `rtw8822c_dac_iq_sort`, which also did sorting using custom logic. The code reads the array elements during sorting. Therefore, this issue was present before the patch as well. KMSAN would have caught this condition regardless, so the patch doesn't *expose* or *introduce* any *new* issue here. The patch itself involves a change from reading data using `rtw_read32_mask` to using `rtw_read32` and `FIELD_GET_SIGNED` macros. The macros simply extract bitfields. This shouldn't be a problem, they're not doing anything unusual, just masking and sign-extending the read values. `FIELD_GET_SIGNED` isn't a likely culprit. Now, let's think about `rtw8822c_dac_iq_offset`. It iterates through an array `vec`. Does the patch change this? In fact, the patch *does not* change the logic in this case. It seems the code is using the elements, so KMSAN should catch any issues with uninitialized reads. So, are there any out-of-bounds accesses *introduced* by the patch? The comparison function, `rtw8822c_dac_iq_cmp_s32`, is standard, and the calls to `sort` are on arrays allocated in the caller on the stack, and it's all based on the data within those arrays. This doesn't seem to be a problem. The arrays `iv` and `qv` are allocated on the stack. The uninitialized memory issue, again, isn't new. If `rtw8822c_dac_cal_iq_sample` *doesn't* fill the array `iv` and `qv` completely, then `sort()` will read from uninitialized stack memory. It was *always* the case. I need to confirm that. Does the patch change how the sample fills the array? Before, there was a check: `rtw8822c_dac_iq_check`, but the logic is equivalent. The check for integer overflow (now using signed integers, so no more issues with two's complement unsigned 10-bit integer) is identical, therefore, it remains the same. The code just changed the types. Now, if `rtw8822c_dac_cal_iq_search` is called with uninitialized memory, that's possible. The code modifies the first and last elements: `iv[0]`, `qv[0]`, `iv[DACK_SN_8822C - 1]`, and `qv[DACK_SN_8822C - 1]`. Then, the loop reads the entire array. If the arrays are uninitialized, then that is an issue. KMSAN will catch it, but this is the pre-existing behavior. The core of the patch is refactoring. It replaces custom sorting and min/max logic with `sort` and standard comparisons. It does *not* introduce new uninitialized memory use. If the hardware times out, that's already in the old code. KMSAN will catch it. Let's do a final check. `iv` and `qv` are allocated in `rtw8822c_dac_cal_rf_mode`. `DACK_SN_8822C` is the correct value. The `FIELD_GET_SIGNED` macros extract the correct bits. The `sort` function uses a standard comparison function. Before the patch, the code used a custom sorting function. |
| 50/3 | 2026/08/15 06:36 | tool | set-results |
0mArgs:{
"KMSANReasoning": "The patch refactors IQ calibration logic in the rtw88 driver, replacing custom 10-bit two's complement arithmetic and a custom bubble sort with standard signed integers (s32) and the kernel's sort() function. While the stack-allocated arrays `iv` and `qv` could potentially be partially uninitialized if the hardware read loop times out, this exact same behavior and subsequent reading of these arrays existed prior to the patch. The patch does not introduce any new uninitialized memory allocations, nor does it expose any kernel structures to userspace. Any potential memory safety issues (such as out-of-bounds accesses) would be caught by standard KASAN. Therefore, a dedicated KMSAN session is not justified.",
"NeedsKMSAN": false
}Results: {
"KMSANReasoning": "The patch refactors IQ calibration logic in the rtw88 driver, replacing custom 10-bit two's complement arithmetic and a custom bubble sort with standard signed integers (s32) and the kernel's sort() function. While the stack-allocated arrays `iv` and `qv` could potentially be partially uninitialized if the hardware read loop times out, this exact same behavior and subsequent reading of these arrays existed prior to the patch. The patch does not introduce any new uninitialized memory allocations, nor does it expose any kernel structures to userspace. Any potential memory safety issues (such as out-of-bounds accesses) would be caught by standard KASAN. Therefore, a dedicated KMSAN session is not justified.",
"NeedsKMSAN": false
} |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|