AI Trajectory


Trajectory: (Expand/Collapse All)
Seq Timestamp Type Name Duration
0/0 2026/09/19 12:30 flow patch-triage
4m Args:
null

Results:
{
  "EnableConfigs": [
    "CAN",
    "CAN_DEV",
    "CAN_SLCAN",
    "TTY"
  ],
  "FocusSymbols": [
    "slcan_enable_err_rst_on_open",
    "slcan_set_priv_flags"
  ],
  "KMSANReasoning": "The patch series is a mechanical refactoring across network and wireless drivers that replaces redundant 'if (cond) set_bit(...) else clear_bit(...)' (and non-atomic '__set_bit'/'__clear_bit') constructs with the standard 'assign_bit()' and '__assign_bit()' helpers. The patch introduces no memory allocations, does not touch struct initialization or padding, does not modify any data copied to user space, and does not alter control flow or buffer sizing logic. Since no uninitialized memory access or information leak risks are introduced or exposed, dedicated KMSAN fuzzing is not justified.",
  "NeedsKMSAN": false,
  "Reasoning": "The patch series refactors bit manipulation across various drivers to use assign_bit() and __assign_bit(). While many of the drivers modified correspond to physical PCIe or SoC network hardware, drivers/net/can/slcan/slcan-core.c implements the serial line CAN (slcan) network driver, which is a software line discipline (N_SLCAN) operating over standard TTY devices (e.g., ptys) and is fully accessible in standard virtualized fuzzing environments without physical hardware. The modified function slcan_enable_err_rst_on_open() is reachable via ethtool private flags configuration (SIOCETHTOOL/ETHTOOL_SPFLAGS or netlink).",
  "WorthFuzzing": true
}

1/1 2026/09/19 12:30 action read-patch-diff
0m Args:
null

Results:
{
  "PatchDiff": "commit d24fd365870a2b5506e113bac6e455768ec38f77\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate:   Sat Sep 19 12:30:32 2026 +0000\n\n    syz-cluster: applied patch under review\n\ndiff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slcan-core.c\nindex 7439849d5c840..c9414faafe664 100644\n--- a/drivers/net/can/slcan/slcan-core.c\n+++ b/drivers/net/can/slcan/slcan-core.c\n@@ -131,10 +131,7 @@ int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)\n \tif (netif_running(ndev))\n \t\treturn -EBUSY;\n \n-\tif (on)\n-\t\tset_bit(CF_ERR_RST, \u0026sl-\u003ecmd_flags);\n-\telse\n-\t\tclear_bit(CF_ERR_RST, \u0026sl-\u003ecmd_flags);\n+\tassign_bit(CF_ERR_RST, \u0026sl-\u003ecmd_flags, on);\n \n \treturn 0;\n }\ndiff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c\nindex 12770af031eb8..c56587384d573 100644\n--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c\n+++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c\n@@ -1202,10 +1202,7 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata, bool set_mode)\n \txgbe_an_restart(pdata);\n \n out:\n-\tif (ret)\n-\t\tset_bit(XGBE_LINK_ERR, \u0026pdata-\u003edev_state);\n-\telse\n-\t\tclear_bit(XGBE_LINK_ERR, \u0026pdata-\u003edev_state);\n+\tassign_bit(XGBE_LINK_ERR, \u0026pdata-\u003edev_state, ret);\n \n \tmutex_unlock(\u0026pdata-\u003ean_mutex);\n \ndiff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\nindex 01792f7abf962..42e0fe9248f28 100644\n--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\n+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c\n@@ -1717,10 +1717,7 @@ int aq_nic_setup_tc_min_rate(struct aq_nic_s *self, const unsigned int tc,\n \tif (tc \u003e= AQ_CFG_TCS_MAX)\n \t\treturn -EINVAL;\n \n-\tif (min_rate)\n-\t\tset_bit(tc, \u0026cfg-\u003etc_min_rate_msk);\n-\telse\n-\t\tclear_bit(tc, \u0026cfg-\u003etc_min_rate_msk);\n+\tassign_bit(tc, \u0026cfg-\u003etc_min_rate_msk, min_rate);\n \n \tif (min_rate \u0026\u0026 min_rate \u003c 20) {\n \t\tnetdev_warn(self-\u003endev,\ndiff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c\nindex b8af508f9c985..b337e61f9c81c 100644\n--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c\n+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c\n@@ -207,10 +207,7 @@ void bnx2x_vfop_qctor_prep(struct bnx2x *bp,\n \t */\n \t__set_bit(BNX2X_Q_FLG_TX_SWITCH, \u0026setup_p-\u003eflags);\n \t__set_bit(BNX2X_Q_FLG_TX_SEC, \u0026setup_p-\u003eflags);\n-\tif (vf-\u003espoofchk)\n-\t\t__set_bit(BNX2X_Q_FLG_ANTI_SPOOF, \u0026setup_p-\u003eflags);\n-\telse\n-\t\t__clear_bit(BNX2X_Q_FLG_ANTI_SPOOF, \u0026setup_p-\u003eflags);\n+\t__assign_bit(BNX2X_Q_FLG_ANTI_SPOOF, \u0026setup_p-\u003eflags, vf-\u003espoofchk);\n \n \t/* Setup-op rx parameters */\n \tif (test_bit(BNX2X_Q_TYPE_HAS_RX, \u0026q_type)) {\n@@ -2370,12 +2367,8 @@ static int bnx2x_set_pf_tx_switching(struct bnx2x *bp, bool enable)\n \tq_params.cmd = BNX2X_Q_CMD_UPDATE;\n \t__set_bit(BNX2X_Q_UPDATE_TX_SWITCHING_CHNG,\n \t\t  \u0026q_params.params.update.update_flags);\n-\tif (enable)\n-\t\t__set_bit(BNX2X_Q_UPDATE_TX_SWITCHING,\n-\t\t\t  \u0026q_params.params.update.update_flags);\n-\telse\n-\t\t__clear_bit(BNX2X_Q_UPDATE_TX_SWITCHING,\n-\t\t\t    \u0026q_params.params.update.update_flags);\n+\t__assign_bit(BNX2X_Q_UPDATE_TX_SWITCHING,\n+\t\t     \u0026q_params.params.update.update_flags, enable);\n \n \t/* send the ramrod on all the queues of the PF */\n \tfor_each_eth_queue(bp, i) {\n@@ -2764,10 +2757,7 @@ static void bnx2x_set_vf_vlan_acceptance(struct bnx2x *bp,\n \n \t/* need to remove/add the VF's accept_any_vlan bit */\n \taccept_flags = bnx2x_leading_vfq(vf, accept_flags);\n-\tif (accept)\n-\t\tset_bit(BNX2X_ACCEPT_ANY_VLAN, \u0026accept_flags);\n-\telse\n-\t\tclear_bit(BNX2X_ACCEPT_ANY_VLAN, \u0026accept_flags);\n+\tassign_bit(BNX2X_ACCEPT_ANY_VLAN, \u0026accept_flags, accept);\n \n \tbnx2x_vf_prep_rx_mode(bp, LEADING_IDX, \u0026rx_ramrod, vf,\n \t\t\t      accept_flags);\ndiff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c\nindex 04c49b680709e..c6571b5cc8425 100644\n--- a/drivers/net/ethernet/freescale/enetc/enetc.c\n+++ b/drivers/net/ethernet/freescale/enetc/enetc.c\n@@ -88,10 +88,7 @@ void enetc_set_congestion_mode(struct enetc_ndev_priv *priv, bool enable)\n \n \tspin_lock(\u0026si-\u003egen_lock);\n \n-\tif (enable)\n-\t\tset_bit(ENETC_RXBDR_CM, \u0026priv-\u003eflags);\n-\telse\n-\t\tclear_bit(ENETC_RXBDR_CM, \u0026priv-\u003eflags);\n+\tassign_bit(ENETC_RXBDR_CM, \u0026priv-\u003eflags, enable);\n \n \tfor (int i = 0; i \u003c priv-\u003enum_rx_rings; i++) {\n \t\tu32 old_rbmr = enetc_rxbdr_rd(hw, i, ENETC_RBMR);\ndiff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c\nindex e7318f2363157..7b92a3c73ef6d 100644\n--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c\n+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c\n@@ -474,10 +474,7 @@ static void hns3_update_limit_promisc_mode(struct net_device *netdev,\n {\n \tstruct hnae3_handle *handle = hns3_get_handle(netdev);\n \n-\tif (enable)\n-\t\tset_bit(HNAE3_PFLAG_LIMIT_PROMISC, \u0026handle-\u003epriv_flags);\n-\telse\n-\t\tclear_bit(HNAE3_PFLAG_LIMIT_PROMISC, \u0026handle-\u003epriv_flags);\n+\tassign_bit(HNAE3_PFLAG_LIMIT_PROMISC, \u0026handle-\u003epriv_flags, enable);\n \n \thns3_request_update_promisc_mode(handle);\n }\n@@ -1210,10 +1207,7 @@ static int hns3_set_tx_push(struct net_device *netdev, u32 tx_push)\n \tnetdev_dbg(netdev, \"Changing tx push from %s to %s\\n\",\n \t\t   str_on_off(old_state), str_on_off(tx_push));\n \n-\tif (tx_push)\n-\t\tset_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, \u0026priv-\u003estate);\n-\telse\n-\t\tclear_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, \u0026priv-\u003estate);\n+\tassign_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, \u0026priv-\u003estate, tx_push);\n \n \treturn 0;\n }\ndiff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c\nindex 30e38cb4843ac..08040a4929855 100644\n--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c\n+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c\n@@ -341,11 +341,8 @@ static void hclge_set_vf_promisc_mode(struct hclge_vport *vport,\n \tvport-\u003evf_info.request_mc_en = req-\u003emsg.en_mc;\n \tvport-\u003evf_info.request_bc_en = req-\u003emsg.en_bc;\n \n-\tif (req-\u003emsg.en_limit_promisc)\n-\t\tset_bit(HNAE3_PFLAG_LIMIT_PROMISC, \u0026handle-\u003epriv_flags);\n-\telse\n-\t\tclear_bit(HNAE3_PFLAG_LIMIT_PROMISC,\n-\t\t\t  \u0026handle-\u003epriv_flags);\n+\tassign_bit(HNAE3_PFLAG_LIMIT_PROMISC, \u0026handle-\u003epriv_flags,\n+\t\t   req-\u003emsg.en_limit_promisc);\n \n \tset_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, \u0026vport-\u003estate);\n \thclge_task_schedule(hdev, 0);\ndiff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\nindex ef9d1e78c16a2..6a992df06fa11 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c\n@@ -5263,10 +5263,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)\n \t\t    test_bit(priv_flag-\u003ebitno, orig_flags) != new_val)\n \t\t\treturn -EOPNOTSUPP;\n \n-\t\tif (new_val)\n-\t\t\tset_bit(priv_flag-\u003ebitno, new_flags);\n-\t\telse\n-\t\t\tclear_bit(priv_flag-\u003ebitno, new_flags);\n+\t\tassign_bit(priv_flag-\u003ebitno, new_flags, new_val);\n \t}\n \n \tif (pf-\u003ehw.pf_id != 0)\n@@ -5284,10 +5281,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)\n \t\t    test_bit(priv_flag-\u003ebitno, orig_flags) != new_val)\n \t\t\treturn -EOPNOTSUPP;\n \n-\t\tif (new_val)\n-\t\t\tset_bit(priv_flag-\u003ebitno, new_flags);\n-\t\telse\n-\t\t\tclear_bit(priv_flag-\u003ebitno, new_flags);\n+\t\tassign_bit(priv_flag-\u003ebitno, new_flags, new_val);\n \t}\n \n flags_complete:\ndiff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c\nindex a26c3d47ec156..0087f7ae0c4c0 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c\n@@ -1158,10 +1158,7 @@ static int i40e_alloc_vf_res(struct i40e_vf *vf)\n \t\tpf-\u003equeues_left -=\n \t\t\ttotal_queue_pairs - I40E_DEFAULT_QUEUES_PER_VF;\n \n-\tif (vf-\u003etrusted)\n-\t\tset_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, \u0026vf-\u003evf_caps);\n-\telse\n-\t\tclear_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, \u0026vf-\u003evf_caps);\n+\tassign_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, \u0026vf-\u003evf_caps, vf-\u003etrusted);\n \n \t/* store the total qps number for the runtime\n \t * VF req validation\ndiff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c\nindex bf9a821c543b7..51388ec05a906 100644\n--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c\n+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c\n@@ -1751,10 +1751,7 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)\n \n \t\tpriv_flag = \u0026ice_gstrings_priv_flags[i];\n \n-\t\tif (flags \u0026 BIT(i))\n-\t\t\tset_bit(priv_flag-\u003ebitno, pf-\u003eflags);\n-\t\telse\n-\t\t\tclear_bit(priv_flag-\u003ebitno, pf-\u003eflags);\n+\t\tassign_bit(priv_flag-\u003ebitno, pf-\u003eflags, flags \u0026 BIT(i));\n \t}\n \n \tbitmap_xor(change_flags, pf-\u003eflags, orig_flags, ICE_PF_FLAGS_NBITS);\ndiff --git a/drivers/net/ethernet/intel/ice/ice_txclk.c b/drivers/net/ethernet/intel/ice/ice_txclk.c\nindex 48459f971cbf9..3bca4443f03ab 100644\n--- a/drivers/net/ethernet/intel/ice/ice_txclk.c\n+++ b/drivers/net/ethernet/intel/ice/ice_txclk.c\n@@ -286,12 +286,9 @@ void ice_txclk_update_and_notify(struct ice_pf *pf)\n \t\t\tif (ctrl_pf != pf)\n \t\t\t\tmutex_lock(\u0026ctrl_pf-\u003edplls.lock);\n \t\t\tfor (int i = 0; i \u003c ICE_REF_CLK_MAX; i++) {\n-\t\t\t\tif (clk == i)\n-\t\t\t\t\tset_bit(ptp_port-\u003eport_num,\n-\t\t\t\t\t\t\u0026ctrl_pf-\u003eptp.tx_refclks[phy][i]);\n-\t\t\t\telse\n-\t\t\t\t\tclear_bit(ptp_port-\u003eport_num,\n-\t\t\t\t\t\t  \u0026ctrl_pf-\u003eptp.tx_refclks[phy][i]);\n+\t\t\t\tassign_bit(ptp_port-\u003eport_num,\n+\t\t\t\t\t   \u0026ctrl_pf-\u003eptp.tx_refclks[phy][i],\n+\t\t\t\t\t   clk == i);\n \t\t\t}\n \t\t\tif (ctrl_pf != pf)\n \t\t\t\tmutex_unlock(\u0026ctrl_pf-\u003edplls.lock);\n@@ -315,13 +312,10 @@ void ice_txclk_update_and_notify(struct ice_pf *pf)\n \t */\n \tif (ctrl_pf != pf)\n \t\tmutex_lock(\u0026ctrl_pf-\u003edplls.lock);\n-\tfor (int i = 0; i \u003c ICE_REF_CLK_MAX; i++)\n-\t\tif (clk == i)\n-\t\t\tset_bit(ptp_port-\u003eport_num,\n-\t\t\t\t\u0026ctrl_pf-\u003eptp.tx_refclks[phy][i]);\n-\t\telse\n-\t\t\tclear_bit(ptp_port-\u003eport_num,\n-\t\t\t\t  \u0026ctrl_pf-\u003eptp.tx_refclks[phy][i]);\n+\tfor (int i = 0; i \u003c ICE_REF_CLK_MAX; i++) {\n+\t\tassign_bit(ptp_port-\u003eport_num,\n+\t\t\t   \u0026ctrl_pf-\u003eptp.tx_refclks[phy][i], clk == i);\n+\t}\n \tif (ctrl_pf != pf)\n \t\tmutex_unlock(\u0026ctrl_pf-\u003edplls.lock);\n \ndiff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c\nindex 8ced44a4495e8..ade394c2beba0 100644\n--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c\n+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c\n@@ -981,15 +981,9 @@ int verify_lmac_fc_cfg(void *cgxd, int lmac_id, u8 tx_pause, u8 rx_pause,\n \tif (!lmac)\n \t\treturn -ENODEV;\n \n-\tif (!rx_pause)\n-\t\tclear_bit(pfvf_idx, lmac-\u003erx_fc_pfvf_bmap.bmap);\n-\telse\n-\t\tset_bit(pfvf_idx, lmac-\u003erx_fc_pfvf_bmap.bmap);\n+\tassign_bit(pfvf_idx, lmac-\u003erx_fc_pfvf_bmap.bmap, rx_pause);\n \n-\tif (!tx_pause)\n-\t\tclear_bit(pfvf_idx, lmac-\u003etx_fc_pfvf_bmap.bmap);\n-\telse\n-\t\tset_bit(pfvf_idx, lmac-\u003etx_fc_pfvf_bmap.bmap);\n+\tassign_bit(pfvf_idx, lmac-\u003etx_fc_pfvf_bmap.bmap, tx_pause);\n \n \t/* check if other pfvfs are using flow control */\n \tif (!rx_pause \u0026\u0026 bitmap_weight(lmac-\u003erx_fc_pfvf_bmap.bmap, lmac-\u003erx_fc_pfvf_bmap.max)) {\ndiff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c\nindex 2b67671a2bd8e..7c829b1da3e52 100644\n--- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c\n+++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c\n@@ -857,10 +857,7 @@ npc_cn20k_enable_mcam_entry(struct rvu *rvu, int blkaddr,\n \t}\n \n update_en_map:\n-\tif (enable)\n-\t\tset_bit(index, npc_priv-\u003een_map);\n-\telse\n-\t\tclear_bit(index, npc_priv-\u003een_map);\n+\tassign_bit(index, npc_priv-\u003een_map, enable);\n \n \treturn 0;\n }\ndiff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c\nindex d80d2c00bd843..93c5c4b298bf2 100644\n--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c\n+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c\n@@ -1233,28 +1233,19 @@ static int rvu_nix_blk_aq_enq_inst(struct rvu *rvu, struct nix_hw *nix_hw,\n \t\t\tena = (req-\u003erq.ena \u0026 req-\u003erq_mask.ena) |\n \t\t\t\t(test_bit(req-\u003eqidx, pfvf-\u003erq_bmap) \u0026\n \t\t\t\t~req-\u003erq_mask.ena);\n-\t\t\tif (ena)\n-\t\t\t\t__set_bit(req-\u003eqidx, pfvf-\u003erq_bmap);\n-\t\t\telse\n-\t\t\t\t__clear_bit(req-\u003eqidx, pfvf-\u003erq_bmap);\n+\t\t\t__assign_bit(req-\u003eqidx, pfvf-\u003erq_bmap, ena);\n \t\t}\n \t\tif (req-\u003ectype == NIX_AQ_CTYPE_SQ) {\n \t\t\tena = (req-\u003erq.ena \u0026 req-\u003esq_mask.ena) |\n \t\t\t\t(test_bit(req-\u003eqidx, pfvf-\u003esq_bmap) \u0026\n \t\t\t\t~req-\u003esq_mask.ena);\n-\t\t\tif (ena)\n-\t\t\t\t__set_bit(req-\u003eqidx, pfvf-\u003esq_bmap);\n-\t\t\telse\n-\t\t\t\t__clear_bit(req-\u003eqidx, pfvf-\u003esq_bmap);\n+\t\t\t__assign_bit(req-\u003eqidx, pfvf-\u003esq_bmap, ena);\n \t\t}\n \t\tif (req-\u003ectype == NIX_AQ_CTYPE_CQ) {\n \t\t\tena = (req-\u003erq.ena \u0026 req-\u003ecq_mask.ena) |\n \t\t\t\t(test_bit(req-\u003eqidx, pfvf-\u003ecq_bmap) \u0026\n \t\t\t\t~req-\u003ecq_mask.ena);\n-\t\t\tif (ena)\n-\t\t\t\t__set_bit(req-\u003eqidx, pfvf-\u003ecq_bmap);\n-\t\t\telse\n-\t\t\t\t__clear_bit(req-\u003eqidx, pfvf-\u003ecq_bmap);\n+\t\t\t__assign_bit(req-\u003eqidx, pfvf-\u003ecq_bmap, ena);\n \t\t}\n \t}\n \ndiff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c\nindex e2a33e46b48ad..334dc3e888f48 100644\n--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c\n+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c\n@@ -169,10 +169,7 @@ int rvu_npa_aq_enq_inst(struct rvu *rvu, struct npa_aq_enq_req *req,\n \t\t\tena = (req-\u003eaura.ena \u0026 req-\u003eaura_mask.ena) |\n \t\t\t\t(test_bit(req-\u003eaura_id, pfvf-\u003eaura_bmap) \u0026\n \t\t\t\t~req-\u003eaura_mask.ena);\n-\t\t\tif (ena)\n-\t\t\t\t__set_bit(req-\u003eaura_id, pfvf-\u003eaura_bmap);\n-\t\t\telse\n-\t\t\t\t__clear_bit(req-\u003eaura_id, pfvf-\u003eaura_bmap);\n+\t\t\t__assign_bit(req-\u003eaura_id, pfvf-\u003eaura_bmap, ena);\n \t\t}\n \t}\n \n@@ -184,10 +181,7 @@ int rvu_npa_aq_enq_inst(struct rvu *rvu, struct npa_aq_enq_req *req,\n \t\t\tena = (req-\u003epool.ena \u0026 req-\u003epool_mask.ena) |\n \t\t\t\t(test_bit(req-\u003eaura_id, pfvf-\u003epool_bmap) \u0026\n \t\t\t\t~req-\u003epool_mask.ena);\n-\t\t\tif (ena)\n-\t\t\t\t__set_bit(req-\u003eaura_id, pfvf-\u003epool_bmap);\n-\t\t\telse\n-\t\t\t\t__clear_bit(req-\u003eaura_id, pfvf-\u003epool_bmap);\n+\t\t\t__assign_bit(req-\u003eaura_id, pfvf-\u003epool_bmap, ena);\n \t\t}\n \t}\n \tspin_unlock(\u0026aq-\u003elock);\ndiff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c\nindex 3ed59ced0407a..261c466a4d362 100644\n--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c\n+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c\n@@ -2320,10 +2320,8 @@ static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)\n \n \tfor (i = 0; i \u003c channels-\u003enum; i++) {\n \t\tc = channels-\u003ec[i];\n-\t\tif (enable)\n-\t\t\t__set_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, \u0026c-\u003erq.state);\n-\t\telse\n-\t\t\t__clear_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, \u0026c-\u003erq.state);\n+\t\t__assign_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, \u0026c-\u003erq.state,\n+\t\t\t     enable);\n \t}\n \n \treturn 0;\ndiff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c b/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c\nindex 07440c58713a7..7c0585fe1ee7a 100644\n--- a/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c\n+++ b/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c\n@@ -66,10 +66,8 @@ static int mlx5_fw_reset_enable_remote_dev_reset_set(struct devlink *devlink, u3\n \n \tfw_reset = dev-\u003epriv.fw_reset;\n \n-\tif (ctx-\u003eval.vbool)\n-\t\tclear_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, \u0026fw_reset-\u003ereset_flags);\n-\telse\n-\t\tset_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, \u0026fw_reset-\u003ereset_flags);\n+\tassign_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST,\n+\t\t   \u0026fw_reset-\u003ereset_flags, !ctx-\u003eval.vbool);\n \treturn 0;\n }\n \ndiff --git a/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c b/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c\nindex bc0f38b6a2b2b..ab6e342ec3fa4 100644\n--- a/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c\n+++ b/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c\n@@ -126,12 +126,8 @@ void fbnic_bmc_rpc_all_multi_config(struct fbnic_dev *fbd,\n \t\t\tset_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr-\u003eact_tcam);\n \t\t\tmac_addr-\u003estate = FBNIC_TCAM_S_ADD;\n \t\t}\n-\t\tif (enable_host)\n-\t\t\tset_bit(FBNIC_MAC_ADDR_T_ALLMULTI,\n-\t\t\t\tmac_addr-\u003eact_tcam);\n-\t\telse\n-\t\t\tclear_bit(FBNIC_MAC_ADDR_T_ALLMULTI,\n-\t\t\t\t  mac_addr-\u003eact_tcam);\n+\t\tassign_bit(FBNIC_MAC_ADDR_T_ALLMULTI, mac_addr-\u003eact_tcam,\n+\t\t\t   enable_host);\n \t} else {\n \t\t__fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_BMC);\n \t\t__fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_ALLMULTI);\ndiff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c\nindex fc8c50e8f3651..119ac720c0787 100644\n--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c\n+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c\n@@ -655,15 +655,9 @@ static int ionic_cmb_rings_toggle(struct ionic_lif *lif, bool cmb_tx, bool cmb_r\n \tif (pages_used \u003c 0)\n \t\treturn pages_used;\n \n-\tif (cmb_tx)\n-\t\tset_bit(IONIC_LIF_F_CMB_TX_RINGS, lif-\u003estate);\n-\telse\n-\t\tclear_bit(IONIC_LIF_F_CMB_TX_RINGS, lif-\u003estate);\n+\tassign_bit(IONIC_LIF_F_CMB_TX_RINGS, lif-\u003estate, cmb_tx);\n \n-\tif (cmb_rx)\n-\t\tset_bit(IONIC_LIF_F_CMB_RX_RINGS, lif-\u003estate);\n-\telse\n-\t\tclear_bit(IONIC_LIF_F_CMB_RX_RINGS, lif-\u003estate);\n+\tassign_bit(IONIC_LIF_F_CMB_RX_RINGS, lif-\u003estate, cmb_rx);\n \n \tif (cmb_tx || cmb_rx)\n \t\tnetdev_info(lif-\u003enetdev, \"Enabling CMB %s %s rings - %d pages\\n\",\ndiff --git a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c\nindex 647f30a16a94d..037882a34203b 100644\n--- a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c\n+++ b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c\n@@ -492,10 +492,8 @@ static int qede_set_priv_flags(struct net_device *dev, u32 flags)\n \tif (dflags \u0026 ~BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR))\n \t\treturn -EINVAL;\n \n-\tif (flags \u0026 BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR))\n-\t\tset_bit(QEDE_ERR_IS_RECOVERABLE, \u0026edev-\u003eerr_flags);\n-\telse\n-\t\tclear_bit(QEDE_ERR_IS_RECOVERABLE, \u0026edev-\u003eerr_flags);\n+\tassign_bit(QEDE_ERR_IS_RECOVERABLE, \u0026edev-\u003eerr_flags,\n+\t\t   flags \u0026 BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR));\n \n \treturn 0;\n }\ndiff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c\nindex 776840f60d01d..1466ec85de247 100644\n--- a/drivers/net/ethernet/qlogic/qla3xxx.c\n+++ b/drivers/net/ethernet/qlogic/qla3xxx.c\n@@ -1581,10 +1581,8 @@ static void ql_link_state_machine_work(struct work_struct *work)\n  */\n static void ql_get_phy_owner(struct ql3_adapter *qdev)\n {\n-\tif (ql_this_adapter_controls_port(qdev))\n-\t\tset_bit(QL_LINK_MASTER, \u0026qdev-\u003eflags);\n-\telse\n-\t\tclear_bit(QL_LINK_MASTER, \u0026qdev-\u003eflags);\n+\tassign_bit(QL_LINK_MASTER, \u0026qdev-\u003eflags,\n+\t\t   ql_this_adapter_controls_port(qdev));\n }\n \n /*\n@@ -3343,10 +3341,8 @@ static void ql_set_mac_info(struct ql3_adapter *qdev)\n \t\tqdev-\u003emac_ob_opcode = OUTBOUND_MAC_IOCB | func_number;\n \t\tqdev-\u003emb_bit_mask = FN0_MA_BITS_MASK;\n \t\tqdev-\u003ePHYAddr = PORT0_PHY_ADDRESS;\n-\t\tif (port_status \u0026 PORT_STATUS_SM0)\n-\t\t\tset_bit(QL_LINK_OPTICAL, \u0026qdev-\u003eflags);\n-\t\telse\n-\t\t\tclear_bit(QL_LINK_OPTICAL, \u0026qdev-\u003eflags);\n+\t\tassign_bit(QL_LINK_OPTICAL, \u0026qdev-\u003eflags,\n+\t\t\t   port_status \u0026 PORT_STATUS_SM0);\n \t\tbreak;\n \n \tcase ISP_CONTROL_FN1_NET:\n@@ -3354,10 +3350,8 @@ static void ql_set_mac_info(struct ql3_adapter *qdev)\n \t\tqdev-\u003emac_ob_opcode = OUTBOUND_MAC_IOCB | func_number;\n \t\tqdev-\u003emb_bit_mask = FN1_MA_BITS_MASK;\n \t\tqdev-\u003ePHYAddr = PORT1_PHY_ADDRESS;\n-\t\tif (port_status \u0026 PORT_STATUS_SM1)\n-\t\t\tset_bit(QL_LINK_OPTICAL, \u0026qdev-\u003eflags);\n-\t\telse\n-\t\t\tclear_bit(QL_LINK_OPTICAL, \u0026qdev-\u003eflags);\n+\t\tassign_bit(QL_LINK_OPTICAL, \u0026qdev-\u003eflags,\n+\t\t\t   port_status \u0026 PORT_STATUS_SM1);\n \t\tbreak;\n \n \tcase ISP_CONTROL_FN0_SCSI:\ndiff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c\nindex 576340315e0db..ef4a0376bafff 100644\n--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c\n+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c\n@@ -644,10 +644,7 @@ static void qlcnic_83xx_dcb_aen_handler(struct qlcnic_dcb *dcb, void *data)\n \tif (test_and_set_bit(QLCNIC_DCB_AEN_MODE, \u0026dcb-\u003estate))\n \t\treturn;\n \n-\tif (*val \u0026 BIT_8)\n-\t\tset_bit(QLCNIC_DCB_STATE, \u0026dcb-\u003estate);\n-\telse\n-\t\tclear_bit(QLCNIC_DCB_STATE, \u0026dcb-\u003estate);\n+\tassign_bit(QLCNIC_DCB_STATE, \u0026dcb-\u003estate, *val \u0026 BIT_8);\n \n \tqueue_delayed_work(dcb-\u003ewq, \u0026dcb-\u003eaen_work, 0);\n }\ndiff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c\nindex 0704dbc52d822..a106f961e177b 100644\n--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c\n+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c\n@@ -1488,10 +1488,8 @@ static int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter *adapter, u8 cmd_o\n \t\tgoto out;\n \t}\n \n-\tif (cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)\n-\t\tset_bit(QLC_BC_VF_STATE, \u0026vf-\u003estate);\n-\telse\n-\t\tclear_bit(QLC_BC_VF_STATE, \u0026vf-\u003estate);\n+\tassign_bit(QLC_BC_VF_STATE, \u0026vf-\u003estate,\n+\t\t   cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT);\n \n out:\n \tqlcnic_free_mbx_args(\u0026cmd);\ndiff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c\nindex 7052d34aad459..c69b41e317d26 100644\n--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c\n+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c\n@@ -773,10 +773,8 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,\n \n \tcmd-\u003ersp.arg[0] |= (1 \u003c\u003c 25);\n \n-\tif (trans-\u003ereq_hdr-\u003ecmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)\n-\t\tset_bit(QLC_BC_VF_STATE, \u0026vf-\u003estate);\n-\telse\n-\t\tclear_bit(QLC_BC_VF_STATE, \u0026vf-\u003estate);\n+\tassign_bit(QLC_BC_VF_STATE, \u0026vf-\u003estate,\n+\t\t   trans-\u003ereq_hdr-\u003ecmd_op == QLCNIC_BC_CMD_CHANNEL_INIT);\n \n \treturn err;\n \ndiff --git a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c\nindex 4708e7f3958f7..ea6865b23f5fc 100644\n--- a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c\n+++ b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c\n@@ -450,10 +450,7 @@ static int wx_ptp_feature_enable(struct ptp_clock_info *ptp,\n \t\twx-\u003epps_width = 120000000;\n \t}\n \n-\tif (on)\n-\t\tset_bit(WX_FLAG_PTP_PPS_ENABLED, wx-\u003eflags);\n-\telse\n-\t\tclear_bit(WX_FLAG_PTP_PPS_ENABLED, wx-\u003eflags);\n+\tassign_bit(WX_FLAG_PTP_PPS_ENABLED, wx-\u003eflags, on);\n \n \treturn wx-\u003eptp_setup_sdp(wx);\n }\ndiff --git a/drivers/net/phy/mediatek/mtk-phy-lib.c b/drivers/net/phy/mediatek/mtk-phy-lib.c\nindex 608072fbfde97..4c4eca870bde1 100644\n--- a/drivers/net/phy/mediatek/mtk-phy-lib.c\n+++ b/drivers/net/phy/mediatek/mtk-phy-lib.c\n@@ -136,22 +136,15 @@ int mtk_phy_led_hw_ctrl_get(struct phy_device *phydev, u8 index,\n \tif (blink \u003c 0)\n \t\treturn -EIO;\n \n-\tif ((on \u0026 (on_set | MTK_PHY_LED_ON_FDX |\n-\t\t   MTK_PHY_LED_ON_HDX | MTK_PHY_LED_ON_LINKDOWN)) ||\n-\t    (blink \u0026 (rx_blink_set | tx_blink_set)))\n-\t\tset_bit(bit_netdev, \u0026priv-\u003eled_state);\n-\telse\n-\t\tclear_bit(bit_netdev, \u0026priv-\u003eled_state);\n+\tassign_bit(bit_netdev, \u0026priv-\u003eled_state,\n+\t\t   (on \u0026 (on_set | MTK_PHY_LED_ON_FDX | MTK_PHY_LED_ON_HDX |\n+\t\t    MTK_PHY_LED_ON_LINKDOWN)) ||\n+\t\t    (blink \u0026 (rx_blink_set | tx_blink_set)));\n \n-\tif (on \u0026 MTK_PHY_LED_ON_FORCE_ON)\n-\t\tset_bit(bit_on, \u0026priv-\u003eled_state);\n-\telse\n-\t\tclear_bit(bit_on, \u0026priv-\u003eled_state);\n+\tassign_bit(bit_on, \u0026priv-\u003eled_state, on \u0026 MTK_PHY_LED_ON_FORCE_ON);\n \n-\tif (blink \u0026 MTK_PHY_LED_BLINK_FORCE_BLINK)\n-\t\tset_bit(bit_blink, \u0026priv-\u003eled_state);\n-\telse\n-\t\tclear_bit(bit_blink, \u0026priv-\u003eled_state);\n+\tassign_bit(bit_blink, \u0026priv-\u003eled_state,\n+\t\t   blink \u0026 MTK_PHY_LED_BLINK_FORCE_BLINK);\n \n \tif (!rules)\n \t\treturn 0;\n@@ -254,10 +247,7 @@ int mtk_phy_led_hw_ctrl_set(struct phy_device *phydev, u8 index,\n \t\t}\n \t}\n \n-\tif (blink || on)\n-\t\tset_bit(bit_netdev, \u0026priv-\u003eled_state);\n-\telse\n-\t\tclear_bit(bit_netdev, \u0026priv-\u003eled_state);\n+\tassign_bit(bit_netdev, \u0026priv-\u003eled_state, blink || on);\n \n \tret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ?\n \t\t\t     MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL,\ndiff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c\nindex fb61e53ff4c34..e11eb7a6cdf26 100644\n--- a/drivers/net/wireless/ath/ath10k/debug.c\n+++ b/drivers/net/wireless/ath/ath10k/debug.c\n@@ -2004,10 +2004,7 @@ static ssize_t ath10k_write_btcoex(struct file *file,\n \t\tath10k_core_start_recovery(ar);\n \t}\n \n-\tif (val)\n-\t\tset_bit(ATH10K_FLAG_BTCOEX, \u0026ar-\u003edev_flags);\n-\telse\n-\t\tclear_bit(ATH10K_FLAG_BTCOEX, \u0026ar-\u003edev_flags);\n+\tassign_bit(ATH10K_FLAG_BTCOEX, \u0026ar-\u003edev_flags, val);\n \n \tret = count;\n \n@@ -2118,10 +2115,7 @@ static ssize_t ath10k_write_peer_stats(struct file *file,\n \t\tgoto exit;\n \t}\n \n-\tif (val)\n-\t\tset_bit(ATH10K_FLAG_PEER_STATS, \u0026ar-\u003edev_flags);\n-\telse\n-\t\tclear_bit(ATH10K_FLAG_PEER_STATS, \u0026ar-\u003edev_flags);\n+\tassign_bit(ATH10K_FLAG_PEER_STATS, \u0026ar-\u003edev_flags, val);\n \n \tath10k_info(ar, \"restarting firmware due to Peer stats change\");\n \ndiff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c\nindex 8de133fe2a72f..8f171ab6f4de8 100644\n--- a/drivers/net/wireless/ath/ath10k/snoc.c\n+++ b/drivers/net/wireless/ath/ath10k/snoc.c\n@@ -1532,10 +1532,8 @@ static int ath10k_snoc_modem_notify(struct notifier_block *nb, unsigned long act\n \tcase QCOM_SSR_BEFORE_SHUTDOWN:\n \t\tath10k_dbg(ar, ATH10K_DBG_SNOC, \"received modem %s event\\n\",\n \t\t\t   notify_data-\u003ecrashed ? \"crashed\" : \"stopping\");\n-\t\tif (!notify_data-\u003ecrashed)\n-\t\t\tset_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, \u0026ar_snoc-\u003eflags);\n-\t\telse\n-\t\t\tclear_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, \u0026ar_snoc-\u003eflags);\n+\t\tassign_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, \u0026ar_snoc-\u003eflags,\n+\t\t\t   !notify_data-\u003ecrashed);\n \t\tbreak;\n \n \tcase QCOM_SSR_AFTER_SHUTDOWN:\ndiff --git a/drivers/net/wireless/ath/ath11k/htc.c b/drivers/net/wireless/ath/ath11k/htc.c\nindex 5f9ee5e633da8..07fc959ed74c9 100644\n--- a/drivers/net/wireless/ath/ath11k/htc.c\n+++ b/drivers/net/wireless/ath/ath11k/htc.c\n@@ -244,10 +244,7 @@ static void ath11k_htc_suspend_complete(struct ath11k_base *ab, bool ack)\n {\n \tath11k_dbg(ab, ATH11K_DBG_BOOT, \"suspend complete %d\\n\", ack);\n \n-\tif (ack)\n-\t\tset_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, \u0026ab-\u003edev_flags);\n-\telse\n-\t\tclear_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, \u0026ab-\u003edev_flags);\n+\tassign_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, \u0026ab-\u003edev_flags, ack);\n \n \tcomplete(\u0026ab-\u003ehtc_suspend);\n }\ndiff --git a/drivers/net/wireless/ath/ath12k/htc.c b/drivers/net/wireless/ath/ath12k/htc.c\nindex 92138caa2a82f..7227bed91ade7 100644\n--- a/drivers/net/wireless/ath/ath12k/htc.c\n+++ b/drivers/net/wireless/ath/ath12k/htc.c\n@@ -236,10 +236,7 @@ static void ath12k_htc_suspend_complete(struct ath12k_base *ab, bool ack)\n {\n \tath12k_dbg(ab, ATH12K_DBG_BOOT, \"boot suspend complete %d\\n\", ack);\n \n-\tif (ack)\n-\t\tset_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, \u0026ab-\u003edev_flags);\n-\telse\n-\t\tclear_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, \u0026ab-\u003edev_flags);\n+\tassign_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, \u0026ab-\u003edev_flags, ack);\n \n \tcomplete(\u0026ab-\u003ehtc_suspend);\n }\ndiff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c\nindex 2224cb74b1d41..5ea18c87e12ee 100644\n--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c\n+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c\n@@ -968,10 +968,7 @@ static void ar9003_hw_tx_iq_cal_outlier_detection(struct ath_hw *ah,\n \t\t      AR_PHY_RX_IQCAL_CORR_B0_LOOPBACK_IQCORR_EN, 0x1);\n \n \tif (caldata) {\n-\t\tif (is_reusable)\n-\t\t\tset_bit(TXIQCAL_DONE, \u0026caldata-\u003ecal_flags);\n-\t\telse\n-\t\t\tclear_bit(TXIQCAL_DONE, \u0026caldata-\u003ecal_flags);\n+\t\tassign_bit(TXIQCAL_DONE, \u0026caldata-\u003ecal_flags, is_reusable);\n \t}\n \n \treturn;\ndiff --git a/drivers/net/wireless/ath/ath9k/mci.c b/drivers/net/wireless/ath/ath9k/mci.c\nindex f82bb23499284..62ad761d6a765 100644\n--- a/drivers/net/wireless/ath/ath9k/mci.c\n+++ b/drivers/net/wireless/ath/ath9k/mci.c\n@@ -348,10 +348,7 @@ static u8 ath_mci_process_status(struct ath_softc *sc,\n \tif (status-\u003econn_handle \u003e= ATH_MCI_MAX_PROFILE)\n \t\treturn 0;\n \n-\tif (status-\u003eis_critical)\n-\t\t__set_bit(status-\u003econn_handle, mci-\u003estatus);\n-\telse\n-\t\t__clear_bit(status-\u003econn_handle, mci-\u003estatus);\n+\t__assign_bit(status-\u003econn_handle, mci-\u003estatus, status-\u003eis_critical);\n \n \tmci-\u003enum_mgmt = 0;\n \tdo {\ndiff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c\nindex 2f925d22b9aa7..2c49f3b493bdb 100644\n--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c\n+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c\n@@ -2034,10 +2034,7 @@ int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy,\n \t\t.active = !enable,\n \t};\n \n-\tif (enable)\n-\t\tset_bit(MT76_HW_SCHED_SCANNING, \u0026phy-\u003estate);\n-\telse\n-\t\tclear_bit(MT76_HW_SCHED_SCANNING, \u0026phy-\u003estate);\n+\tassign_bit(MT76_HW_SCHED_SCANNING, \u0026phy-\u003estate, enable);\n \n \treturn mt76_mcu_send_msg(phy-\u003edev, MCU_CE_CMD(SCHED_SCAN_ENABLE),\n \t\t\t\t \u0026req, sizeof(req), false);\ndiff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c\nindex fa29c486a4553..aeb017516186f 100644\n--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c\n+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c\n@@ -3467,10 +3467,7 @@ mt7925_mcu_sched_scan_enable(struct mt76_phy *phy,\n \treq = (struct scan_sched_enable *)tlv;\n \treq-\u003eactive = !enable;\n \n-\tif (enable)\n-\t\tset_bit(MT76_HW_SCHED_SCANNING, \u0026phy-\u003estate);\n-\telse\n-\t\tclear_bit(MT76_HW_SCHED_SCANNING, \u0026phy-\u003estate);\n+\tassign_bit(MT76_HW_SCHED_SCANNING, \u0026phy-\u003estate, enable);\n \n \treturn mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),\n \t\t\t\t     true);\ndiff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c\nindex b67d69b01f879..3a10f1bbe0e0c 100644\n--- a/drivers/net/wireless/realtek/rtw88/debug.c\n+++ b/drivers/net/wireless/realtek/rtw88/debug.c\n@@ -1051,10 +1051,7 @@ static ssize_t rtw_debugfs_set_force_lowest_basic_rate(struct file *filp,\n \tif (err)\n \t\treturn err;\n \n-\tif (input)\n-\t\tset_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev-\u003eflags);\n-\telse\n-\t\tclear_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev-\u003eflags);\n+\tassign_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev-\u003eflags, input);\n \n \treturn count;\n }\ndiff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c\nindex 454d876aeb886..dacc2d889a467 100644\n--- a/drivers/net/wireless/realtek/rtw89/core.c\n+++ b/drivers/net/wireless/realtek/rtw89/core.c\n@@ -7365,10 +7365,7 @@ void rtw89_core_rfkill_poll(struct rtw89_dev *rtwdev, bool force)\n \trtw89_info(rtwdev, \"rfkill hardware state changed to %s\\n\",\n \t\t   str_enable_disable(!blocked));\n \n-\tif (blocked)\n-\t\tset_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev-\u003eflags);\n-\telse\n-\t\tclear_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev-\u003eflags);\n+\tassign_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev-\u003eflags, blocked);\n \n \twiphy_rfkill_set_hw_state(rtwdev-\u003ehw-\u003ewiphy, blocked);\n }\ndiff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c\nindex df396fbfca268..68da8908f14cf 100644\n--- a/drivers/net/wireless/realtek/rtw89/mac.c\n+++ b/drivers/net/wireless/realtek/rtw89/mac.c\n@@ -6046,10 +6046,7 @@ rtw89_mac_c2h_pwr_int_notify(struct rtw89_dev *rtwdev, struct sk_buff *skb, u32\n \t\tgoto out;\n \n \trtwsta = rtwsta_link-\u003ertwsta;\n-\tif (ps)\n-\t\tset_bit(RTW89_REMOTE_STA_IN_PS, rtwsta-\u003eflags);\n-\telse\n-\t\tclear_bit(RTW89_REMOTE_STA_IN_PS, rtwsta-\u003eflags);\n+\tassign_bit(RTW89_REMOTE_STA_IN_PS, rtwsta-\u003eflags, ps);\n \n \tsta = rtwsta_to_sta(rtwsta);\n \tieee80211_sta_ps_transition(sta, ps);\n@@ -7004,10 +7001,7 @@ void rtw89_mac_bf_monitor_calc(struct rtw89_dev *rtwdev,\n \t\t\t\t\t  \u0026data);\n \n \trtw89_debug(rtwdev, RTW89_DBG_BF, \"bfee STA count=%d\\n\", data.count);\n-\tif (data.count)\n-\t\tset_bit(RTW89_FLAG_BFEE_MON, rtwdev-\u003eflags);\n-\telse\n-\t\tclear_bit(RTW89_FLAG_BFEE_MON, rtwdev-\u003eflags);\n+\tassign_bit(RTW89_FLAG_BFEE_MON, rtwdev-\u003eflags, data.count);\n }\n \n void _rtw89_mac_bf_monitor_track(struct rtw89_dev *rtwdev)\ndiff --git a/drivers/net/wireless/realtek/rtw89/regd.c b/drivers/net/wireless/realtek/rtw89/regd.c\nindex 14fab6b1a74a7..b9a5ce218b1da 100644\n--- a/drivers/net/wireless/realtek/rtw89/regd.c\n+++ b/drivers/net/wireless/realtek/rtw89/regd.c\n@@ -421,10 +421,7 @@ static void __rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev, bool block,\n \t\treturn;\n \t}\n \n-\tif (block)\n-\t\tset_bit(index, regulatory-\u003eblock_6ghz);\n-\telse\n-\t\tclear_bit(index, regulatory-\u003eblock_6ghz);\n+\tassign_bit(index, regulatory-\u003eblock_6ghz, block);\n }\n \n static void rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev)\ndiff --git a/drivers/net/wireless/ti/wlcore/rx.c b/drivers/net/wireless/ti/wlcore/rx.c\nindex 307fab21050b7..4d6f5a0477828 100644\n--- a/drivers/net/wireless/ti/wlcore/rx.c\n+++ b/drivers/net/wireless/ti/wlcore/rx.c\n@@ -316,10 +316,7 @@ int wl1271_rx_filter_enable(struct wl1271 *wl,\n \t\treturn ret;\n \t}\n \n-\tif (enable)\n-\t\t__set_bit(index, wl-\u003erx_filter_enabled);\n-\telse\n-\t\t__clear_bit(index, wl-\u003erx_filter_enabled);\n+\t__assign_bit(index, wl-\u003erx_filter_enabled, enable);\n \n \treturn 0;\n }\n"
}

2/1 2026/09/19 12:30 agent patch-evaluator
3m Model:
core

Args:
null

Results:
{
  "EnableConfigs": [
    "CAN",
    "CAN_DEV",
    "CAN_SLCAN",
    "TTY"
  ],
  "FocusSymbols": [
    "slcan_enable_err_rst_on_open",
    "slcan_set_priv_flags"
  ],
  "Reasoning": "The patch series refactors bit manipulation across various drivers to use assign_bit() and __assign_bit(). While many of the drivers modified correspond to physical PCIe or SoC network hardware, drivers/net/can/slcan/slcan-core.c implements the serial line CAN (slcan) network driver, which is a software line discipline (N_SLCAN) operating over standard TTY devices (e.g., ptys) and is fully accessible in standard virtualized fuzzing environments without physical hardware. The modified function slcan_enable_err_rst_on_open() is reachable via ethtool private flags configuration (SIOCETHTOOL/ETHTOOL_SPFLAGS or netlink).",
  "WorthFuzzing": true
}

Instruction:
You are an expert Linux kernel maintainer and security engineer.
Your job is to review a provided patch series and evaluate whether it warrants fuzzing with syzkaller.

IMPORTANT: The changes have ALREADY been applied and committed as the HEAD commit in
your workspace. Do NOT rely on internal assumptions. You must actively use your code access
tools to inspect the actual source code, callers, and surrounding context.

================================================================================
1. CORE TRIAGE PHILOSOPHY
================================================================================
The goal of patch fuzzing is to discover crashes, regressions, exposed latent bugs,
and newly triggered assertions introduced by the patch series.

- REACHABILITY IS THE PRIMARY GATE:
  Fuzzing can only discover bugs in code that can actually execute in standard virtualized
  environments (GCE or QEMU, utilizing software-emulated devices like USB gadgets, netdev, tun/tap).
  If the modified code is structurally unreachable (see Section 2), it MUST NOT be fuzzed,
  regardless of whether it adds assertions or complex logic.

- DO NOT BLINDLY TRUST "NO FUNCTIONAL CHANGE" (NFCI) OR "REFACTORING" CLAIMS:
  Patch authors routinely label changes as "cleanups", "refactorings", or state
  "No functional change intended". Do NOT take these claims at face value.
  Code refactorings that rearrange logic, introduce helper functions, or alter state management
  in core subsystems frequently introduce subtle semantic shifts or uncover latent kernel bugs.
  If reachable executable code is modified or refactored, it MUST be fuzzed.

- NEW OR MODIFIED ASSERTIONS IN REACHABLE CODE MUST BE FUZZED:
  When a patch introduces or modifies runtime checks or assertions (e.g., WARN_ON*, VM_WARN_ON*,
  BUG_ON*, lockdep_assert*) in reachable code paths, it enforces new or stricter invariants.
  Even if the author believes the invariant always holds, fuzzing is essential to verify whether
  an unusual sequence of operations can violate it.

================================================================================
2. WHEN TO RETURN WorthFuzzing=false (NEGATIVE CRITERIA)
================================================================================
Return WorthFuzzing=false ONLY IF all modified code falls strictly into one or more of these categories:

- Non-kernel and non-executable changes:
  * Modifications to Documentation/, comments, or spelling fixes.
  * User-space directories, self-tests, samples, or scripts (e.g., tools/, samples/, scripts/, usr/)
    that do not affect the compiled kernel image (vmlinux) or kernel modules.
  * Purely decorative logging (e.g., message strings in pr_err, printk, dev_info) or tracepoints
    that do not alter control flow or data structures.
  * Build system or Kconfig changes that do not alter compiled C logic.
- Structurally unreachable hardware:
  * Vendor-specific PCIe switches, SmartNICs, or GPU drivers (e.g., mlxsw, pds_core, qed,
    ionic, amdgpu) requiring physical ASIC/PCIe cards not emulated in standard QEMU.
- Unreachable execution paths:
  * Driver teardown callbacks (.remove, .shutdown, pci_unregister_driver) executed only during
    physical PCI hot-unplug or manual sysfs driver unbinding.
  * Code paths exclusive to architectures other than the target architecture.

================================================================================
3. WHEN TO RETURN WorthFuzzing=true (POSITIVE CRITERIA)
================================================================================
Return WorthFuzzing=true whenever the patch touches reachable executable code, including:
- Core Subsystems:
  * Any logic modifications in memory management (mm/), synchronization/locking (kernel/locking/),
    BPF, scheduler, core networking, VFS, or syscall handling.
- Refactorings and Code Cleanups:
  * Any restructuring of reachable data structures, helper abstractions, or algorithm flows.
- Runtime Assertions and Defensive Checks:
  * Any introduction or alteration of assertions (WARN_ON*, VM_WARN_ON*, BUG_ON*, etc.) in reachable paths.
- Reachable Drivers and Protocols:
  * Drivers accessible via virtual buses (virtio, USB gadget, loopback, netlink, binder, sockets, etc.).

================================================================================
4. EXTRACTING FocusSymbols (PREVENTING DILUTION)
================================================================================
When WorthFuzzing=true, you must extract specific kernel functions into FocusSymbols to guide the fuzzer:

- AVOID UBIQUITOUS LIFECYCLE HOT-PATHS:
  Do NOT list generic, ubiquitous functions called by almost every program in the corpus
  (including, but not limited to: general memory allocators and deallocators, page fault
  and trap handlers, or core synchronization primitives; this is not an exhaustive list).
  Listing ubiquitous functions causes the fuzzer to classify thousands of unrelated tests as "focused",
  which severely dilutes fuzzing effort away from the actual changes.

- TARGET SPECIFIC FEATURE LOGIC AND ENTRYPOINTS:
  List functions that specifically implement the logic being added or altered, or direct API entrypoints
  for the subsystem feature under review.

- HANDLING STATIC INLINE FUNCTIONS IN HEADERS (.h):
  Compiler-inlined static functions (such as static inlines in mm/*.h or include/linux/*.h) lack
  distinct symbol addresses in vmlinux and cannot be targeted directly by symbol coverage filters.
  If the changes are primarily in static inline helpers, identify non-static, feature-specific caller
  functions in .c files that exercise them (avoiding ubiquitous lifecycle wrappers).

================================================================================
5. IDENTIFYING EnableConfigs
================================================================================
Identify any specific CONFIG_ options required to properly compile and reach the modified code:
- Inspect Kconfig files and #ifdef guards; do not make assumptions.
- Check "depends on" lines in Kconfig to include any non-standard parent subsystem configs needed.
- Strip any '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:
Target architecture: amd64

For your convenience, here is the diff of the changes:
commit d24fd365870a2b5506e113bac6e455768ec38f77
Author: syz-cluster <triage@syzkaller.com>
Date:   Sat Sep 19 12:30:32 2026 +0000

    syz-cluster: applied patch under review

diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slcan-core.c
index 7439849d5c840..c9414faafe664 100644
--- a/drivers/net/can/slcan/slcan-core.c
+++ b/drivers/net/can/slcan/slcan-core.c
@@ -131,10 +131,7 @@ int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)
 	if (netif_running(ndev))
 		return -EBUSY;
 
-	if (on)
-		set_bit(CF_ERR_RST, &sl->cmd_flags);
-	else
-		clear_bit(CF_ERR_RST, &sl->cmd_flags);
+	assign_bit(CF_ERR_RST, &sl->cmd_flags, on);
 
 	return 0;
 }
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
index 12770af031eb8..c56587384d573 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
@@ -1202,10 +1202,7 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata, bool set_mode)
 	xgbe_an_restart(pdata);
 
 out:
-	if (ret)
-		set_bit(XGBE_LINK_ERR, &pdata->dev_state);
-	else
-		clear_bit(XGBE_LINK_ERR, &pdata->dev_state);
+	assign_bit(XGBE_LINK_ERR, &pdata->dev_state, ret);
 
 	mutex_unlock(&pdata->an_mutex);
 
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
index 01792f7abf962..42e0fe9248f28 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
@@ -1717,10 +1717,7 @@ int aq_nic_setup_tc_min_rate(struct aq_nic_s *self, const unsigned int tc,
 	if (tc >= AQ_CFG_TCS_MAX)
 		return -EINVAL;
 
-	if (min_rate)
-		set_bit(tc, &cfg->tc_min_rate_msk);
-	else
-		clear_bit(tc, &cfg->tc_min_rate_msk);
+	assign_bit(tc, &cfg->tc_min_rate_msk, min_rate);
 
 	if (min_rate && min_rate < 20) {
 		netdev_warn(self->ndev,
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
index b8af508f9c985..b337e61f9c81c 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
@@ -207,10 +207,7 @@ void bnx2x_vfop_qctor_prep(struct bnx2x *bp,
 	 */
 	__set_bit(BNX2X_Q_FLG_TX_SWITCH, &setup_p->flags);
 	__set_bit(BNX2X_Q_FLG_TX_SEC, &setup_p->flags);
-	if (vf->spoofchk)
-		__set_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags);
-	else
-		__clear_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags);
+	__assign_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags, vf->spoofchk);
 
 	/* Setup-op rx parameters */
 	if (test_bit(BNX2X_Q_TYPE_HAS_RX, &q_type)) {
@@ -2370,12 +2367,8 @@ static int bnx2x_set_pf_tx_switching(struct bnx2x *bp, bool enable)
 	q_params.cmd = BNX2X_Q_CMD_UPDATE;
 	__set_bit(BNX2X_Q_UPDATE_TX_SWITCHING_CHNG,
 		  &q_params.params.update.update_flags);
-	if (enable)
-		__set_bit(BNX2X_Q_UPDATE_TX_SWITCHING,
-			  &q_params.params.update.update_flags);
-	else
-		__clear_bit(BNX2X_Q_UPDATE_TX_SWITCHING,
-			    &q_params.params.update.update_flags);
+	__assign_bit(BNX2X_Q_UPDATE_TX_SWITCHING,
+		     &q_params.params.update.update_flags, enable);
 
 	/* send the ramrod on all the queues of the PF */
 	for_each_eth_queue(bp, i) {
@@ -2764,10 +2757,7 @@ static void bnx2x_set_vf_vlan_acceptance(struct bnx2x *bp,
 
 	/* need to remove/add the VF's accept_any_vlan bit */
 	accept_flags = bnx2x_leading_vfq(vf, accept_flags);
-	if (accept)
-		set_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags);
-	else
-		clear_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags);
+	assign_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags, accept);
 
 	bnx2x_vf_prep_rx_mode(bp, LEADING_IDX, &rx_ramrod, vf,
 			      accept_flags);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 04c49b680709e..c6571b5cc8425 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -88,10 +88,7 @@ void enetc_set_congestion_mode(struct enetc_ndev_priv *priv, bool enable)
 
 	spin_lock(&si->gen_lock);
 
-	if (enable)
-		set_bit(ENETC_RXBDR_CM, &priv->flags);
-	else
-		clear_bit(ENETC_RXBDR_CM, &priv->flags);
+	assign_bit(ENETC_RXBDR_CM, &priv->flags, enable);
 
 	for (int i = 0; i < priv->num_rx_rings; i++) {
 		u32 old_rbmr = enetc_rxbdr_rd(hw, i, ENETC_RBMR);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
index e7318f2363157..7b92a3c73ef6d 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
@@ -474,10 +474,7 @@ static void hns3_update_limit_promisc_mode(struct net_device *netdev,
 {
 	struct hnae3_handle *handle = hns3_get_handle(netdev);
 
-	if (enable)
-		set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
-	else
-		clear_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
+	assign_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags, enable);
 
 	hns3_request_update_promisc_mode(handle);
 }
@@ -1210,10 +1207,7 @@ static int hns3_set_tx_push(struct net_device *netdev, u32 tx_push)
 	netdev_dbg(netdev, "Changing tx push from %s to %s\n",
 		   str_on_off(old_state), str_on_off(tx_push));
 
-	if (tx_push)
-		set_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state);
-	else
-		clear_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state);
+	assign_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state, tx_push);
 
 	return 0;
 }
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
index 30e38cb4843ac..08040a4929855 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
@@ -341,11 +341,8 @@ static void hclge_set_vf_promisc_mode(struct hclge_vport *vport,
 	vport->vf_info.request_mc_en = req->msg.en_mc;
 	vport->vf_info.request_bc_en = req->msg.en_bc;
 
-	if (req->msg.en_limit_promisc)
-		set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
-	else
-		clear_bit(HNAE3_PFLAG_LIMIT_PROMISC,
-			  &handle->priv_flags);
+	assign_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags,
+		   req->msg.en_limit_promisc);
 
 	set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
 	hclge_task_schedule(hdev, 0);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index ef9d1e78c16a2..6a992df06fa11 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -5263,10 +5263,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
 		    test_bit(priv_flag->bitno, orig_flags) != new_val)
 			return -EOPNOTSUPP;
 
-		if (new_val)
-			set_bit(priv_flag->bitno, new_flags);
-		else
-			clear_bit(priv_flag->bitno, new_flags);
+		assign_bit(priv_flag->bitno, new_flags, new_val);
 	}
 
 	if (pf->hw.pf_id != 0)
@@ -5284,10 +5281,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
 		    test_bit(priv_flag->bitno, orig_flags) != new_val)
 			return -EOPNOTSUPP;
 
-		if (new_val)
-			set_bit(priv_flag->bitno, new_flags);
-		else
-			clear_bit(priv_flag->bitno, new_flags);
+		assign_bit(priv_flag->bitno, new_flags, new_val);
 	}
 
 flags_complete:
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index a26c3d47ec156..0087f7ae0c4c0 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -1158,10 +1158,7 @@ static int i40e_alloc_vf_res(struct i40e_vf *vf)
 		pf->queues_left -=
 			total_queue_pairs - I40E_DEFAULT_QUEUES_PER_VF;
 
-	if (vf->trusted)
-		set_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps);
-	else
-		clear_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps);
+	assign_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps, vf->trusted);
 
 	/* store the total qps number for the runtime
 	 * VF req validation
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
index bf9a821c543b7..51388ec05a906 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
@@ -1751,10 +1751,7 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
 
 		priv_flag = &ice_gstrings_priv_flags[i];
 
-		if (flags & BIT(i))
-			set_bit(priv_flag->bitno, pf->flags);
-		else
-			clear_bit(priv_flag->bitno, pf->flags);
+		assign_bit(priv_flag->bitno, pf->flags, flags & BIT(i));
 	}
 
 	bitmap_xor(change_flags, pf->flags, orig_flags, ICE_PF_FLAGS_NBITS);
diff --git a/drivers/net/ethernet/intel/ice/ice_txclk.c b/drivers/net/ethernet/intel/ice/ice_txclk.c
index 48459f971cbf9..3bca4443f03ab 100644
--- a/drivers/net/ethernet/intel/ice/ice_txclk.c
+++ b/drivers/net/ethernet/intel/ice/ice_txclk.c
@@ -286,12 +286,9 @@ void ice_txclk_update_and_notify(struct ice_pf *pf)
 			if (ctrl_pf != pf)
 				mutex_lock(&ctrl_pf->dplls.lock);
 			for (int i = 0; i < ICE_REF_CLK_MAX; i++) {
-				if (clk == i)
-					set_bit(ptp_port->port_num,
-						&ctrl_pf->ptp.tx_refclks[phy][i]);
-				else
-					clear_bit(ptp_port->port_num,
-						  &ctrl_pf->ptp.tx_refclks[phy][i]);
+				assign_bit(ptp_port->port_num,
+					   &ctrl_pf->ptp.tx_refclks[phy][i],
+					   clk == i);
 			}
 			if (ctrl_pf != pf)
 				mutex_unlock(&ctrl_pf->dplls.lock);
@@ -315,13 +312,10 @@ void ice_txclk_update_and_notify(struct ice_pf *pf)
 	 */
 	if (ctrl_pf != pf)
 		mutex_lock(&ctrl_pf->dplls.lock);
-	for (int i = 0; i < ICE_REF_CLK_MAX; i++)
-		if (clk == i)
-			set_bit(ptp_port->port_num,
-				&ctrl_pf->ptp.tx_refclks[phy][i]);
-		else
-			clear_bit(ptp_port->port_num,
-				  &ctrl_pf->ptp.tx_refclks[phy][i]);
+	for (int i = 0; i < ICE_REF_CLK_MAX; i++) {
+		assign_bit(ptp_port->port_num,
+			   &ctrl_pf->ptp.tx_refclks[phy][i], clk == i);
+	}
 	if (ctrl_pf != pf)
 		mutex_unlock(&ctrl_pf->dplls.lock);
 
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
index 8ced44a4495e8..ade394c2beba0 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
@@ -981,15 +981,9 @@ int verify_lmac_fc_cfg(void *cgxd, int lmac_id, u8 tx_pause, u8 rx_pause,
 	if (!lmac)
 		return -ENODEV;
 
-	if (!rx_pause)
-		clear_bit(pfvf_idx, lmac->rx_fc_pfvf_bmap.bmap);
-	else
-		set_bit(pfvf_idx, lmac->rx_fc_pfvf_bmap.bmap);
+	assign_bit(pfvf_idx, lmac->rx_fc_pfvf_bmap.bmap, rx_pause);
 
-	if (!tx_pause)
-		clear_bit(pfvf_idx, lmac->tx_fc_pfvf_bmap.bmap);
-	else
-		set_bit(pfvf_idx, lmac->tx_fc_pfvf_bmap.bmap);
+	assign_bit(pfvf_idx, lmac->tx_fc_pfvf_bmap.bmap, tx_pause);
 
 	/* check if other pfvfs are using flow control */
 	if (!rx_pause && bitmap_weight(lmac->rx_fc_pfvf_bmap.bmap, lmac->rx_fc_pfvf_bmap.max)) {
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
index 2b67671a2bd8e..7c829b1da3e52 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
@@ -857,10 +857,7 @@ npc_cn20k_enable_mcam_entry(struct rvu *rvu, int blkaddr,
 	}
 
 update_en_map:
-	if (enable)
-		set_bit(index, npc_priv->en_map);
-	else
-		clear_bit(index, npc_priv->en_map);
+	assign_bit(index, npc_priv->en_map, enable);
 
 	return 0;
 }
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
index d80d2c00bd843..93c5c4b298bf2 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
@@ -1233,28 +1233,19 @@ static int rvu_nix_blk_aq_enq_inst(struct rvu *rvu, struct nix_hw *nix_hw,
 			ena = (req->rq.ena & req->rq_mask.ena) |
 				(test_bit(req->qidx, pfvf->rq_bmap) &
 				~req->rq_mask.ena);
-			if (ena)
-				__set_bit(req->qidx, pfvf->rq_bmap);
-			else
-				__clear_bit(req->qidx, pfvf->rq_bmap);
+			__assign_bit(req->qidx, pfvf->rq_bmap, ena);
 		}
 		if (req->ctype == NIX_AQ_CTYPE_SQ) {
 			ena = (req->rq.ena & req->sq_mask.ena) |
 				(test_bit(req->qidx, pfvf->sq_bmap) &
 				~req->sq_mask.ena);
-			if (ena)
-				__set_bit(req->qidx, pfvf->sq_bmap);
-			else
-				__clear_bit(req->qidx, pfvf->sq_bmap);
+			__assign_bit(req->qidx, pfvf->sq_bmap, ena);
 		}
 		if (req->ctype == NIX_AQ_CTYPE_CQ) {
 			ena = (req->rq.ena & req->cq_mask.ena) |
 				(test_bit(req->qidx, pfvf->cq_bmap) &
 				~req->cq_mask.ena);
-			if (ena)
-				__set_bit(req->qidx, pfvf->cq_bmap);
-			else
-				__clear_bit(req->qidx, pfvf->cq_bmap);
+			__assign_bit(req->qidx, pfvf->cq_bmap, ena);
 		}
 	}
 
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c
index e2a33e46b48ad..334dc3e888f48 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c
@@ -169,10 +169,7 @@ int rvu_npa_aq_enq_inst(struct rvu *rvu, struct npa_aq_enq_req *req,
 			ena = (req->aura.ena & req->aura_mask.ena) |
 				(test_bit(req->aura_id, pfvf->aura_bmap) &
 				~req->aura_mask.ena);
-			if (ena)
-				__set_bit(req->aura_id, pfvf->aura_bmap);
-			else
-				__clear_bit(req->aura_id, pfvf->aura_bmap);
+			__assign_bit(req->aura_id, pfvf->aura_bmap, ena);
 		}
 	}
 
@@ -184,10 +181,7 @@ int rvu_npa_aq_enq_inst(struct rvu *rvu, struct npa_aq_enq_req *req,
 			ena = (req->pool.ena & req->pool_mask.ena) |
 				(test_bit(req->aura_id, pfvf->pool_bmap) &
 				~req->pool_mask.ena);
-			if (ena)
-				__set_bit(req->aura_id, pfvf->pool_bmap);
-			else
-				__clear_bit(req->aura_id, pfvf->pool_bmap);
+			__assign_bit(req->aura_id, pfvf->pool_bmap, ena);
 		}
 	}
 	spin_unlock(&aq->lock);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
index 3ed59ced0407a..261c466a4d362 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
@@ -2320,10 +2320,8 @@ static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
 
 	for (i = 0; i < channels->num; i++) {
 		c = channels->c[i];
-		if (enable)
-			__set_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state);
-		else
-			__clear_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state);
+		__assign_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state,
+			     enable);
 	}
 
 	return 0;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c b/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
index 07440c58713a7..7c0585fe1ee7a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
@@ -66,10 +66,8 @@ static int mlx5_fw_reset_enable_remote_dev_reset_set(struct devlink *devlink, u3
 
 	fw_reset = dev->priv.fw_reset;
 
-	if (ctx->val.vbool)
-		clear_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, &fw_reset->reset_flags);
-	else
-		set_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, &fw_reset->reset_flags);
+	assign_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST,
+		   &fw_reset->reset_flags, !ctx->val.vbool);
 	return 0;
 }
 
diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c b/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c
index bc0f38b6a2b2b..ab6e342ec3fa4 100644
--- a/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c
+++ b/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c
@@ -126,12 +126,8 @@ void fbnic_bmc_rpc_all_multi_config(struct fbnic_dev *fbd,
 			set_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam);
 			mac_addr->state = FBNIC_TCAM_S_ADD;
 		}
-		if (enable_host)
-			set_bit(FBNIC_MAC_ADDR_T_ALLMULTI,
-				mac_addr->act_tcam);
-		else
-			clear_bit(FBNIC_MAC_ADDR_T_ALLMULTI,
-				  mac_addr->act_tcam);
+		assign_bit(FBNIC_MAC_ADDR_T_ALLMULTI, mac_addr->act_tcam,
+			   enable_host);
 	} else {
 		__fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_BMC);
 		__fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_ALLMULTI);
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
index fc8c50e8f3651..119ac720c0787 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
@@ -655,15 +655,9 @@ static int ionic_cmb_rings_toggle(struct ionic_lif *lif, bool cmb_tx, bool cmb_r
 	if (pages_used < 0)
 		return pages_used;
 
-	if (cmb_tx)
-		set_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state);
-	else
-		clear_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state);
+	assign_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state, cmb_tx);
 
-	if (cmb_rx)
-		set_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state);
-	else
-		clear_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state);
+	assign_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state, cmb_rx);
 
 	if (cmb_tx || cmb_rx)
 		netdev_info(lif->netdev, "Enabling CMB %s %s rings - %d pages\n",
diff --git a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
index 647f30a16a94d..037882a34203b 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
@@ -492,10 +492,8 @@ static int qede_set_priv_flags(struct net_device *dev, u32 flags)
 	if (dflags & ~BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR))
 		return -EINVAL;
 
-	if (flags & BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR))
-		set_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags);
-	else
-		clear_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags);
+	assign_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags,
+		   flags & BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR));
 
 	return 0;
 }
diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c
index 776840f60d01d..1466ec85de247 100644
--- a/drivers/net/ethernet/qlogic/qla3xxx.c
+++ b/drivers/net/ethernet/qlogic/qla3xxx.c
@@ -1581,10 +1581,8 @@ static void ql_link_state_machine_work(struct work_struct *work)
  */
 static void ql_get_phy_owner(struct ql3_adapter *qdev)
 {
-	if (ql_this_adapter_controls_port(qdev))
-		set_bit(QL_LINK_MASTER, &qdev->flags);
-	else
-		clear_bit(QL_LINK_MASTER, &qdev->flags);
+	assign_bit(QL_LINK_MASTER, &qdev->flags,
+		   ql_this_adapter_controls_port(qdev));
 }
 
 /*
@@ -3343,10 +3341,8 @@ static void ql_set_mac_info(struct ql3_adapter *qdev)
 		qdev->mac_ob_opcode = OUTBOUND_MAC_IOCB | func_number;
 		qdev->mb_bit_mask = FN0_MA_BITS_MASK;
 		qdev->PHYAddr = PORT0_PHY_ADDRESS;
-		if (port_status & PORT_STATUS_SM0)
-			set_bit(QL_LINK_OPTICAL, &qdev->flags);
-		else
-			clear_bit(QL_LINK_OPTICAL, &qdev->flags);
+		assign_bit(QL_LINK_OPTICAL, &qdev->flags,
+			   port_status & PORT_STATUS_SM0);
 		break;
 
 	case ISP_CONTROL_FN1_NET:
@@ -3354,10 +3350,8 @@ static void ql_set_mac_info(struct ql3_adapter *qdev)
 		qdev->mac_ob_opcode = OUTBOUND_MAC_IOCB | func_number;
 		qdev->mb_bit_mask = FN1_MA_BITS_MASK;
 		qdev->PHYAddr = PORT1_PHY_ADDRESS;
-		if (port_status & PORT_STATUS_SM1)
-			set_bit(QL_LINK_OPTICAL, &qdev->flags);
-		else
-			clear_bit(QL_LINK_OPTICAL, &qdev->flags);
+		assign_bit(QL_LINK_OPTICAL, &qdev->flags,
+			   port_status & PORT_STATUS_SM1);
 		break;
 
 	case ISP_CONTROL_FN0_SCSI:
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c
index 576340315e0db..ef4a0376bafff 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c
@@ -644,10 +644,7 @@ static void qlcnic_83xx_dcb_aen_handler(struct qlcnic_dcb *dcb, void *data)
 	if (test_and_set_bit(QLCNIC_DCB_AEN_MODE, &dcb->state))
 		return;
 
-	if (*val & BIT_8)
-		set_bit(QLCNIC_DCB_STATE, &dcb->state);
-	else
-		clear_bit(QLCNIC_DCB_STATE, &dcb->state);
+	assign_bit(QLCNIC_DCB_STATE, &dcb->state, *val & BIT_8);
 
 	queue_delayed_work(dcb->wq, &dcb->aen_work, 0);
 }
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
index 0704dbc52d822..a106f961e177b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
@@ -1488,10 +1488,8 @@ static int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter *adapter, u8 cmd_o
 		goto out;
 	}
 
-	if (cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
-		set_bit(QLC_BC_VF_STATE, &vf->state);
-	else
-		clear_bit(QLC_BC_VF_STATE, &vf->state);
+	assign_bit(QLC_BC_VF_STATE, &vf->state,
+		   cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT);
 
 out:
 	qlcnic_free_mbx_args(&cmd);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
index 7052d34aad459..c69b41e317d26 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
@@ -773,10 +773,8 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
 
 	cmd->rsp.arg[0] |= (1 << 25);
 
-	if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
-		set_bit(QLC_BC_VF_STATE, &vf->state);
-	else
-		clear_bit(QLC_BC_VF_STATE, &vf->state);
+	assign_bit(QLC_BC_VF_STATE, &vf->state,
+		   trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT);
 
 	return err;
 
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
index 4708e7f3958f7..ea6865b23f5fc 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
+++ b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
@@ -450,10 +450,7 @@ static int wx_ptp_feature_enable(struct ptp_clock_info *ptp,
 		wx->pps_width = 120000000;
 	}
 
-	if (on)
-		set_bit(WX_FLAG_PTP_PPS_ENABLED, wx->flags);
-	else
-		clear_bit(WX_FLAG_PTP_PPS_ENABLED, wx->flags);
+	assign_bit(WX_FLAG_PTP_PPS_ENABLED, wx->flags, on);
 
 	return wx->ptp_setup_sdp(wx);
 }
diff --git a/drivers/net/phy/mediatek/mtk-phy-lib.c b/drivers/net/phy/mediatek/mtk-phy-lib.c
index 608072fbfde97..4c4eca870bde1 100644
--- a/drivers/net/phy/mediatek/mtk-phy-lib.c
+++ b/drivers/net/phy/mediatek/mtk-phy-lib.c
@@ -136,22 +136,15 @@ int mtk_phy_led_hw_ctrl_get(struct phy_device *phydev, u8 index,
 	if (blink < 0)
 		return -EIO;
 
-	if ((on & (on_set | MTK_PHY_LED_ON_FDX |
-		   MTK_PHY_LED_ON_HDX | MTK_PHY_LED_ON_LINKDOWN)) ||
-	    (blink & (rx_blink_set | tx_blink_set)))
-		set_bit(bit_netdev, &priv->led_state);
-	else
-		clear_bit(bit_netdev, &priv->led_state);
+	assign_bit(bit_netdev, &priv->led_state,
+		   (on & (on_set | MTK_PHY_LED_ON_FDX | MTK_PHY_LED_ON_HDX |
+		    MTK_PHY_LED_ON_LINKDOWN)) ||
+		    (blink & (rx_blink_set | tx_blink_set)));
 
-	if (on & MTK_PHY_LED_ON_FORCE_ON)
-		set_bit(bit_on, &priv->led_state);
-	else
-		clear_bit(bit_on, &priv->led_state);
+	assign_bit(bit_on, &priv->led_state, on & MTK_PHY_LED_ON_FORCE_ON);
 
-	if (blink & MTK_PHY_LED_BLINK_FORCE_BLINK)
-		set_bit(bit_blink, &priv->led_state);
-	else
-		clear_bit(bit_blink, &priv->led_state);
+	assign_bit(bit_blink, &priv->led_state,
+		   blink & MTK_PHY_LED_BLINK_FORCE_BLINK);
 
 	if (!rules)
 		return 0;
@@ -254,10 +247,7 @@ int mtk_phy_led_hw_ctrl_set(struct phy_device *phydev, u8 index,
 		}
 	}
 
-	if (blink || on)
-		set_bit(bit_netdev, &priv->led_state);
-	else
-		clear_bit(bit_netdev, &priv->led_state);
+	assign_bit(bit_netdev, &priv->led_state, blink || on);
 
 	ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ?
 			     MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL,
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index fb61e53ff4c34..e11eb7a6cdf26 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -2004,10 +2004,7 @@ static ssize_t ath10k_write_btcoex(struct file *file,
 		ath10k_core_start_recovery(ar);
 	}
 
-	if (val)
-		set_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
-	else
-		clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
+	assign_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags, val);
 
 	ret = count;
 
@@ -2118,10 +2115,7 @@ static ssize_t ath10k_write_peer_stats(struct file *file,
 		goto exit;
 	}
 
-	if (val)
-		set_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
-	else
-		clear_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
+	assign_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags, val);
 
 	ath10k_info(ar, "restarting firmware due to Peer stats change");
 
diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c
index 8de133fe2a72f..8f171ab6f4de8 100644
--- a/drivers/net/wireless/ath/ath10k/snoc.c
+++ b/drivers/net/wireless/ath/ath10k/snoc.c
@@ -1532,10 +1532,8 @@ static int ath10k_snoc_modem_notify(struct notifier_block *nb, unsigned long act
 	case QCOM_SSR_BEFORE_SHUTDOWN:
 		ath10k_dbg(ar, ATH10K_DBG_SNOC, "received modem %s event\n",
 			   notify_data->crashed ? "crashed" : "stopping");
-		if (!notify_data->crashed)
-			set_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, &ar_snoc->flags);
-		else
-			clear_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, &ar_snoc->flags);
+		assign_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, &ar_snoc->flags,
+			   !notify_data->crashed);
 		break;
 
 	case QCOM_SSR_AFTER_SHUTDOWN:
diff --git a/drivers/net/wireless/ath/ath11k/htc.c b/drivers/net/wireless/ath/ath11k/htc.c
index 5f9ee5e633da8..07fc959ed74c9 100644
--- a/drivers/net/wireless/ath/ath11k/htc.c
+++ b/drivers/net/wireless/ath/ath11k/htc.c
@@ -244,10 +244,7 @@ static void ath11k_htc_suspend_complete(struct ath11k_base *ab, bool ack)
 {
 	ath11k_dbg(ab, ATH11K_DBG_BOOT, "suspend complete %d\n", ack);
 
-	if (ack)
-		set_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
-	else
-		clear_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
+	assign_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags, ack);
 
 	complete(&ab->htc_suspend);
 }
diff --git a/drivers/net/wireless/ath/ath12k/htc.c b/drivers/net/wireless/ath/ath12k/htc.c
index 92138caa2a82f..7227bed91ade7 100644
--- a/drivers/net/wireless/ath/ath12k/htc.c
+++ b/drivers/net/wireless/ath/ath12k/htc.c
@@ -236,10 +236,7 @@ static void ath12k_htc_suspend_complete(struct ath12k_base *ab, bool ack)
 {
 	ath12k_dbg(ab, ATH12K_DBG_BOOT, "boot suspend complete %d\n", ack);
 
-	if (ack)
-		set_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
-	else
-		clear_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
+	assign_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags, ack);
 
 	complete(&ab->htc_suspend);
 }
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
index 2224cb74b1d41..5ea18c87e12ee 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
@@ -968,10 +968,7 @@ static void ar9003_hw_tx_iq_cal_outlier_detection(struct ath_hw *ah,
 		      AR_PHY_RX_IQCAL_CORR_B0_LOOPBACK_IQCORR_EN, 0x1);
 
 	if (caldata) {
-		if (is_reusable)
-			set_bit(TXIQCAL_DONE, &caldata->cal_flags);
-		else
-			clear_bit(TXIQCAL_DONE, &caldata->cal_flags);
+		assign_bit(TXIQCAL_DONE, &caldata->cal_flags, is_reusable);
 	}
 
 	return;
diff --git a/drivers/net/wireless/ath/ath9k/mci.c b/drivers/net/wireless/ath/ath9k/mci.c
index f82bb23499284..62ad761d6a765 100644
--- a/drivers/net/wireless/ath/ath9k/mci.c
+++ b/drivers/net/wireless/ath/ath9k/mci.c
@@ -348,10 +348,7 @@ static u8 ath_mci_process_status(struct ath_softc *sc,
 	if (status->conn_handle >= ATH_MCI_MAX_PROFILE)
 		return 0;
 
-	if (status->is_critical)
-		__set_bit(status->conn_handle, mci->status);
-	else
-		__clear_bit(status->conn_handle, mci->status);
+	__assign_bit(status->conn_handle, mci->status, status->is_critical);
 
 	mci->num_mgmt = 0;
 	do {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
index 2f925d22b9aa7..2c49f3b493bdb 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
@@ -2034,10 +2034,7 @@ int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy,
 		.active = !enable,
 	};
 
-	if (enable)
-		set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
-	else
-		clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
+	assign_bit(MT76_HW_SCHED_SCANNING, &phy->state, enable);
 
 	return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SCHED_SCAN_ENABLE),
 				 &req, sizeof(req), false);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index fa29c486a4553..aeb017516186f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -3467,10 +3467,7 @@ mt7925_mcu_sched_scan_enable(struct mt76_phy *phy,
 	req = (struct scan_sched_enable *)tlv;
 	req->active = !enable;
 
-	if (enable)
-		set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
-	else
-		clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
+	assign_bit(MT76_HW_SCHED_SCANNING, &phy->state, enable);
 
 	return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),
 				     true);
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
index b67d69b01f879..3a10f1bbe0e0c 100644
--- a/drivers/net/wireless/realtek/rtw88/debug.c
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
@@ -1051,10 +1051,7 @@ static ssize_t rtw_debugfs_set_force_lowest_basic_rate(struct file *filp,
 	if (err)
 		return err;
 
-	if (input)
-		set_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags);
-	else
-		clear_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags);
+	assign_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags, input);
 
 	return count;
 }
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index 454d876aeb886..dacc2d889a467 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -7365,10 +7365,7 @@ void rtw89_core_rfkill_poll(struct rtw89_dev *rtwdev, bool force)
 	rtw89_info(rtwdev, "rfkill hardware state changed to %s\n",
 		   str_enable_disable(!blocked));
 
-	if (blocked)
-		set_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags);
-	else
-		clear_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags);
+	assign_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags, blocked);
 
 	wiphy_rfkill_set_hw_state(rtwdev->hw->wiphy, blocked);
 }
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index df396fbfca268..68da8908f14cf 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -6046,10 +6046,7 @@ rtw89_mac_c2h_pwr_int_notify(struct rtw89_dev *rtwdev, struct sk_buff *skb, u32
 		goto out;
 
 	rtwsta = rtwsta_link->rtwsta;
-	if (ps)
-		set_bit(RTW89_REMOTE_STA_IN_PS, rtwsta->flags);
-	else
-		clear_bit(RTW89_REMOTE_STA_IN_PS, rtwsta->flags);
+	assign_bit(RTW89_REMOTE_STA_IN_PS, rtwsta->flags, ps);
 
 	sta = rtwsta_to_sta(rtwsta);
 	ieee80211_sta_ps_transition(sta, ps);
@@ -7004,10 +7001,7 @@ void rtw89_mac_bf_monitor_calc(struct rtw89_dev *rtwdev,
 					  &data);
 
 	rtw89_debug(rtwdev, RTW89_DBG_BF, "bfee STA count=%d\n", data.count);
-	if (data.count)
-		set_bit(RTW89_FLAG_BFEE_MON, rtwdev->flags);
-	else
-		clear_bit(RTW89_FLAG_BFEE_MON, rtwdev->flags);
+	assign_bit(RTW89_FLAG_BFEE_MON, rtwdev->flags, data.count);
 }
 
 void _rtw89_mac_bf_monitor_track(struct rtw89_dev *rtwdev)
diff --git a/drivers/net/wireless/realtek/rtw89/regd.c b/drivers/net/wireless/realtek/rtw89/regd.c
index 14fab6b1a74a7..b9a5ce218b1da 100644
--- a/drivers/net/wireless/realtek/rtw89/regd.c
+++ b/drivers/net/wireless/realtek/rtw89/regd.c
@@ -421,10 +421,7 @@ static void __rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev, bool block,
 		return;
 	}
 
-	if (block)
-		set_bit(index, regulatory->block_6ghz);
-	else
-		clear_bit(index, regulatory->block_6ghz);
+	assign_bit(index, regulatory->block_6ghz, block);
 }
 
 static void rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev)
diff --git a/drivers/net/wireless/ti/wlcore/rx.c b/drivers/net/wireless/ti/wlcore/rx.c
index 307fab21050b7..4d6f5a0477828 100644
--- a/drivers/net/wireless/ti/wlcore/rx.c
+++ b/drivers/net/wireless/ti/wlcore/rx.c
@@ -316,10 +316,7 @@ int wl1271_rx_filter_enable(struct wl1271 *wl,
 		return ret;
 	}
 
-	if (enable)
-		__set_bit(index, wl->rx_filter_enabled);
-	else
-		__clear_bit(index, wl->rx_filter_enabled);
+	__assign_bit(index, wl->rx_filter_enabled, enable);
 
 	return 0;
 }

3/2 2026/09/19 12:30 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 18465
							output: 38
							thoughts: 988
						

Thoughts:
**Fuzzing Evaluation: A Network Driver Patch**

Alright, let's break this down. My initial thought is to figure out if this patch is a good candidate for Syzkaller fuzzing. The first thing I need to do is *understand* the patch.  Looking at the files, it's pretty clear that this patch touches a *ton* of network drivers.  We're talking about everything from Ethernet (various vendors: AMD, Intel, Mellanox, etc.) to wireless (Ath, Realtek, Mediatek) to CAN and other low-level network components. That's a lot of surface area.

Now, I need to understand what this patch actually *does*.  This is key to deciding about fuzzing.  After a quick review of the file list, I'm already noticing a pattern: this looks like a code cleanup or refactoring related to bit manipulation. It seems like it's systematically replacing `if (val) set_bit(...) else clear_bit(...)` with `assign_bit(...)` (or similar `__set_bit`/`__clear_bit` calls with `__assign_bit`). These kinds of changes are often considered safe, but because they're widespread, they still warrant a closer look, because a small mistake in one of these macros might have a cascade effect. 

Therefore, my next step is to examine the commit message or the git diff for this patch. I want to see if it's a straightforward mechanical change, or if there's any context that would make it more or less interesting from a fuzzing perspective. Is this a backport, a refactor, or a new feature? A well-written commit message is a good sign, and it'll help me understand the rationale behind the patch.

Based on this analysis, I will determine the priority and scope of a fuzzing campaign to address this patch.



4/2 2026/09/19 12:30 tool grepper
0m Args:
{
  "Expression": "assign_bit",
  "PathPrefix": "drivers/net/can/slcan/slcan-core.c"
}

Results:
{
  "Output": "drivers/net/can/slcan/slcan-core.c=127=int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)\n--\ndrivers/net/can/slcan/slcan-core.c-133-\ndrivers/net/can/slcan/slcan-core.c:134:\tassign_bit(CF_ERR_RST, \u0026sl-\u003ecmd_flags, on);\ndrivers/net/can/slcan/slcan-core.c-135-\n"
}

5/2 2026/09/19 12:30 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 20033
							output: 27
							thoughts: 32
						

Thoughts:
Okay, let's dive into this. I need to refresh my memory on how the `assign_bit` and `__assign_bit` macros are implemented within the Linux kernel, specifically within `bitmap.h` and `bitops.h`. I'm going to quickly check those headers to recall the exact definitions and any subtleties in their behavior. Understanding those low-level bit manipulation functions is critical. It is likely I can quickly recall the basic function, but I need to ensure there are no implementation details that are likely to trip me up later.



6/2 2026/09/19 12:30 tool grepper
0m Args:
{
  "Expression": "static.*assign_bit",
  "PathPrefix": "include/"
}

Results:
{
  "Output": "include/linux/regmap.h=1432=static inline int regmap_clear_bits(struct regmap *map,\n--\ninclude/linux/regmap.h-1437-\ninclude/linux/regmap.h:1438:static inline int regmap_assign_bits(struct regmap *map, unsigned int reg,\ninclude/linux/regmap.h-1439-\t\t\t\t     unsigned int bits, bool value)\n--\ninclude/linux/regmap.h=1918=static inline int regmap_clear_bits(struct regmap *map,\n--\ninclude/linux/regmap.h-1924-\ninclude/linux/regmap.h:1925:static inline int regmap_assign_bits(struct regmap *map, unsigned int reg,\ninclude/linux/regmap.h-1926-\t\t\t\t     unsigned int bits, bool value)\n"
}

7/2 2026/09/19 12:30 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 20435
							output: 27
							thoughts: 23
						

Thoughts:
Here's my thought process, as requested:

**Navigating the Linux Kernel: Finding `assign_bit`**

Okay, so I need to understand how `assign_bit` works within the Linux kernel. My first instinct is to go directly to the source. Given that this is a core bit manipulation function, `include/linux/bitops.h` seems like the most likely place to find it. This is where I'd expect to see the low-level definitions for these kinds of operations. Let's head there and see what we can dig up.



8/2 2026/09/19 12:30 tool grepper
0m Args:
{
  "Expression": "define.*assign_bit",
  "PathPrefix": "include/"
}

Results:
{
  "Output": "include/linux/bitops.h=292=static inline unsigned int fns(unsigned long word, unsigned int n)\n--\ninclude/linux/bitops.h-305- */\ninclude/linux/bitops.h:306:#define assign_bit(nr, addr, value)\t\t\t\t\t\\\ninclude/linux/bitops.h-307-\t((value) ? set_bit((nr), (addr)) : clear_bit((nr), (addr)))\ninclude/linux/bitops.h-308-\ninclude/linux/bitops.h:309:#define __assign_bit(nr, addr, value)\t\t\t\t\t\\\ninclude/linux/bitops.h-310-\t((value) ? __set_bit((nr), (addr)) : __clear_bit((nr), (addr)))\n--\ninclude/linux/ipv6.h=230=struct ipv6_pinfo {\n--\ninclude/linux/ipv6.h-301-\tclear_bit(INET_FLAGS_##nr, \u0026inet_sk(sk)-\u003einet_flags)\ninclude/linux/ipv6.h:302:#define inet6_assign_bit(nr, sk, val)\t\t\\\ninclude/linux/ipv6.h-303-\tassign_bit(INET_FLAGS_##nr, \u0026inet_sk(sk)-\u003einet_flags, val)\n--\ninclude/linux/linkmode.h=40=static inline bool linkmode_andnot(unsigned long *dst,\n--\ninclude/linux/linkmode.h-49-#define linkmode_clear_bit\t__clear_bit\ninclude/linux/linkmode.h:50:#define linkmode_mod_bit\t__assign_bit\ninclude/linux/linkmode.h-51-\n--\ninclude/linux/udp.h=78=struct udp_sock {\n--\ninclude/linux/udp.h-150-\tclear_bit(UDP_FLAGS_##nr, \u0026udp_sk(sk)-\u003eudp_flags)\ninclude/linux/udp.h:151:#define udp_assign_bit(nr, sk, val)\t\t\\\ninclude/linux/udp.h-152-\tassign_bit(UDP_FLAGS_##nr, \u0026udp_sk(sk)-\u003eudp_flags, val)\n--\ninclude/net/inet_sock.h=313=static inline dscp_t inet_sk_dscp(const struct inet_sock *inet)\n--\ninclude/net/inet_sock.h-323-\tclear_bit(INET_FLAGS_##nr, \u0026inet_sk(sk)-\u003einet_flags)\ninclude/net/inet_sock.h:324:#define inet_assign_bit(nr, sk, val)\t\t\\\ninclude/net/inet_sock.h-325-\tassign_bit(INET_FLAGS_##nr, \u0026inet_sk(sk)-\u003einet_flags, val)\n--\ninclude/trace/stages/stage6_event_callback.h-58-#undef __assign_bitmask\ninclude/trace/stages/stage6_event_callback.h:59:#define __assign_bitmask(dst, src, nr_bits)\t\t\t\t\t\\\ninclude/trace/stages/stage6_event_callback.h-60-\tmemcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))\n"
}

9/2 2026/09/19 12:30 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 21415
							output: 31
							thoughts: 1151
						

Thoughts:
**Analyzing the Potential for Fuzzing: A Methodical Approach**

Alright, let's break this down. My initial instinct was to look at those `assign_bit` macros in `bitops.h`. Seemed like a potential spot, but I need to be rigorous. Before making any assumptions, I have to be completely certain, so I will consult the triage guidelines. The core of patch fuzzing is about finding crashes and bugs in code that can actually run in a standard environment, so reachability is the primary criterion. No blind trust in "no functional change" or refactoring claims, because I know those can hide subtle problems. Any change that touches reachable, executable code, or introduces/modifies assertions needs thorough investigation.

Now, according to the negative criteria, I can only say fuzzing is *not* worth it if it involves non-kernel, non-executable changes like documentation or purely decorative logging, unreachable hardware or execution paths, and code exclusive to other architectures. The positive side is clear: Any change affecting core subsystems, refactoring logic, assertions in reachable paths, or any accessible driver, means it MUST be considered for fuzzing.

My next step is to examine the files that were modified. First, I see `drivers/net/can/slcan/slcan-core.c`.  I need to figure out what `slcan` is. Ah, it's Serial Line CAN! Now, the key question: Is SLCAN reachable in a standard environment? Can it be attached to something virtual, like a tty or loopback serial line? I will check how this specific driver works in Linux, and also investigate how syzkaller handles CAN/SLCAN. Since syzkaller fuzzed CAN and line disciplines (tty ldisc), and since slcan uses a tty ldisc ioctl `TIOCSETD` (N_SLCAN), it seems very likely that SLCAN *is* reachable. Now, I will carefully examine `slcan-core.c` and `slcan.h`, to be absolutely certain.



10/2 2026/09/19 12:31 tool grepper
0m Args:
{
  "Expression": "slcan",
  "PathPrefix": "drivers/net/can/slcan/"
}

Results:
{
  "Output": "drivers/net/can/slcan/Makefile-2-\ndrivers/net/can/slcan/Makefile:3:obj-$(CONFIG_CAN_SLCAN) += slcan.o\ndrivers/net/can/slcan/Makefile-4-\ndrivers/net/can/slcan/Makefile:5:slcan-objs :=\ndrivers/net/can/slcan/Makefile:6:slcan-objs += slcan-core.o\ndrivers/net/can/slcan/Makefile:7:slcan-objs += slcan-ethtool.o\n--\ndrivers/net/can/slcan/slcan-core.c-1-/*\ndrivers/net/can/slcan/slcan-core.c:2: * slcan.c - serial line CAN interface driver (using tty line discipline)\ndrivers/net/can/slcan/slcan-core.c-3- *\n--\ndrivers/net/can/slcan/slcan-core.c-9- *                   Fred N. van Kempen \u003cwaltje@uwalt.nl.mugnet.org\u003e\ndrivers/net/can/slcan/slcan-core.c:10: * slcan.c Author  : Oliver Hartkopp \u003csocketcan@hartkopp.net\u003e\ndrivers/net/can/slcan/slcan-core.c-11- * can327.c Author : Max Staudt \u003cmax-linux@enpas.org\u003e\n--\ndrivers/net/can/slcan/slcan-core.c-60-\ndrivers/net/can/slcan/slcan-core.c:61:#include \"slcan.h\"\ndrivers/net/can/slcan/slcan-core.c-62-\n--\ndrivers/net/can/slcan/slcan-core.c=67=MODULE_AUTHOR(\"Dario Binacchi \u003cdario.binacchi@amarulasolutions.com\u003e\");\n--\ndrivers/net/can/slcan/slcan-core.c-89-                                 SLCAN_DATA_LENGTH_LEN)\ndrivers/net/can/slcan/slcan-core.c:90:struct slcan {\ndrivers/net/can/slcan/slcan-core.c-91-\tstruct can_priv         can;\n--\ndrivers/net/can/slcan/slcan-core.c-114-\ndrivers/net/can/slcan/slcan-core.c:115:static const u32 slcan_bitrate_const[] = {\ndrivers/net/can/slcan/slcan-core.c-116-\t10000, 20000, 50000, 100000, 125000,\n--\ndrivers/net/can/slcan/slcan-core.c-119-\ndrivers/net/can/slcan/slcan-core.c:120:bool slcan_err_rst_on_open(struct net_device *ndev)\ndrivers/net/can/slcan/slcan-core.c-121-{\ndrivers/net/can/slcan/slcan-core.c:122:\tstruct slcan *sl = netdev_priv(ndev);\ndrivers/net/can/slcan/slcan-core.c-123-\n--\ndrivers/net/can/slcan/slcan-core.c-126-\ndrivers/net/can/slcan/slcan-core.c:127:int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)\ndrivers/net/can/slcan/slcan-core.c-128-{\ndrivers/net/can/slcan/slcan-core.c:129:\tstruct slcan *sl = netdev_priv(ndev);\ndrivers/net/can/slcan/slcan-core.c-130-\n--\ndrivers/net/can/slcan/slcan-core.c-177-/* Send one completely decapsulated can_frame to the network layer */\ndrivers/net/can/slcan/slcan-core.c:178:static void slcan_bump_frame(struct slcan *sl)\ndrivers/net/can/slcan/slcan-core.c-179-{\n--\ndrivers/net/can/slcan/slcan-core.c-267- */\ndrivers/net/can/slcan/slcan-core.c:268:static void slcan_bump_state(struct slcan *sl)\ndrivers/net/can/slcan/slcan-core.c-269-{\n--\ndrivers/net/can/slcan/slcan-core.c-331- */\ndrivers/net/can/slcan/slcan-core.c:332:static void slcan_bump_err(struct slcan *sl)\ndrivers/net/can/slcan/slcan-core.c-333-{\n--\ndrivers/net/can/slcan/slcan-core.c-447-\ndrivers/net/can/slcan/slcan-core.c:448:static void slcan_bump(struct slcan *sl)\ndrivers/net/can/slcan/slcan-core.c-449-{\n--\ndrivers/net/can/slcan/slcan-core.c-457-\tcase 'T':\ndrivers/net/can/slcan/slcan-core.c:458:\t\treturn slcan_bump_frame(sl);\ndrivers/net/can/slcan/slcan-core.c-459-\tcase 'e':\ndrivers/net/can/slcan/slcan-core.c:460:\t\treturn slcan_bump_err(sl);\ndrivers/net/can/slcan/slcan-core.c-461-\tcase 's':\ndrivers/net/can/slcan/slcan-core.c:462:\t\treturn slcan_bump_state(sl);\ndrivers/net/can/slcan/slcan-core.c-463-\tdefault:\n--\ndrivers/net/can/slcan/slcan-core.c-468-/* parse tty input stream */\ndrivers/net/can/slcan/slcan-core.c:469:static void slcan_unesc(struct slcan *sl, unsigned char s)\ndrivers/net/can/slcan/slcan-core.c-470-{\n--\ndrivers/net/can/slcan/slcan-core.c-472-\t\tif (!test_and_clear_bit(SLF_ERROR, \u0026sl-\u003eflags))\ndrivers/net/can/slcan/slcan-core.c:473:\t\t\tslcan_bump(sl);\ndrivers/net/can/slcan/slcan-core.c-474-\n--\ndrivers/net/can/slcan/slcan-core.c-493-/* Encapsulate one can_frame and stuff into a TTY queue. */\ndrivers/net/can/slcan/slcan-core.c:494:static void slcan_encaps(struct slcan *sl, struct can_frame *cf)\ndrivers/net/can/slcan/slcan-core.c-495-{\n--\ndrivers/net/can/slcan/slcan-core.c-554-/* Write out any remaining transmit buffer. Scheduled when tty is writable */\ndrivers/net/can/slcan/slcan-core.c:555:static void slcan_transmit(struct work_struct *work)\ndrivers/net/can/slcan/slcan-core.c-556-{\ndrivers/net/can/slcan/slcan-core.c:557:\tstruct slcan *sl = container_of(work, struct slcan, tx_work);\ndrivers/net/can/slcan/slcan-core.c-558-\tint actual;\n--\ndrivers/net/can/slcan/slcan-core.c-595- */\ndrivers/net/can/slcan/slcan-core.c:596:static void slcan_write_wakeup(struct tty_struct *tty)\ndrivers/net/can/slcan/slcan-core.c-597-{\ndrivers/net/can/slcan/slcan-core.c:598:\tstruct slcan *sl = tty-\u003edisc_data;\ndrivers/net/can/slcan/slcan-core.c-599-\n--\ndrivers/net/can/slcan/slcan-core.c-603-/* Send a can_frame to a TTY queue. */\ndrivers/net/can/slcan/slcan-core.c:604:static netdev_tx_t slcan_netdev_xmit(struct sk_buff *skb,\ndrivers/net/can/slcan/slcan-core.c-605-\t\t\t\t     struct net_device *dev)\ndrivers/net/can/slcan/slcan-core.c-606-{\ndrivers/net/can/slcan/slcan-core.c:607:\tstruct slcan *sl = netdev_priv(dev);\ndrivers/net/can/slcan/slcan-core.c-608-\n--\ndrivers/net/can/slcan/slcan-core.c-623-\tnetif_stop_queue(sl-\u003edev);\ndrivers/net/can/slcan/slcan-core.c:624:\tslcan_encaps(sl, (struct can_frame *)skb-\u003edata); /* encaps \u0026 send */\ndrivers/net/can/slcan/slcan-core.c-625-\tspin_unlock(\u0026sl-\u003elock);\n--\ndrivers/net/can/slcan/slcan-core.c-637-\ndrivers/net/can/slcan/slcan-core.c:638:static int slcan_transmit_cmd(struct slcan *sl, const unsigned char *cmd)\ndrivers/net/can/slcan/slcan-core.c-639-{\n--\ndrivers/net/can/slcan/slcan-core.c-668-/* Netdevice UP -\u003e DOWN routine */\ndrivers/net/can/slcan/slcan-core.c:669:static int slcan_netdev_close(struct net_device *dev)\ndrivers/net/can/slcan/slcan-core.c-670-{\ndrivers/net/can/slcan/slcan-core.c:671:\tstruct slcan *sl = netdev_priv(dev);\ndrivers/net/can/slcan/slcan-core.c-672-\tint err;\n--\ndrivers/net/can/slcan/slcan-core.c-675-\t    sl-\u003ecan.bittiming.bitrate != CAN_BITRATE_UNKNOWN) {\ndrivers/net/can/slcan/slcan-core.c:676:\t\terr = slcan_transmit_cmd(sl, \"C\\r\");\ndrivers/net/can/slcan/slcan-core.c-677-\t\tif (err)\n--\ndrivers/net/can/slcan/slcan-core.c-697-/* Netdevice DOWN -\u003e UP routine */\ndrivers/net/can/slcan/slcan-core.c:698:static int slcan_netdev_open(struct net_device *dev)\ndrivers/net/can/slcan/slcan-core.c-699-{\ndrivers/net/can/slcan/slcan-core.c:700:\tstruct slcan *sl = netdev_priv(dev);\ndrivers/net/can/slcan/slcan-core.c-701-\tunsigned char cmd[SLCAN_MTU];\n--\ndrivers/net/can/slcan/slcan-core.c-718-\tif (sl-\u003ecan.bittiming.bitrate != CAN_BITRATE_UNKNOWN) {\ndrivers/net/can/slcan/slcan-core.c:719:\t\tfor (s = 0; s \u003c ARRAY_SIZE(slcan_bitrate_const); s++) {\ndrivers/net/can/slcan/slcan-core.c:720:\t\t\tif (sl-\u003ecan.bittiming.bitrate == slcan_bitrate_const[s])\ndrivers/net/can/slcan/slcan-core.c-721-\t\t\t\tbreak;\n--\ndrivers/net/can/slcan/slcan-core.c-727-\t\tsnprintf(cmd, sizeof(cmd), \"C\\rS%d\\r\", s);\ndrivers/net/can/slcan/slcan-core.c:728:\t\terr = slcan_transmit_cmd(sl, cmd);\ndrivers/net/can/slcan/slcan-core.c-729-\t\tif (err) {\n--\ndrivers/net/can/slcan/slcan-core.c-736-\t\tif (test_bit(CF_ERR_RST, \u0026sl-\u003ecmd_flags)) {\ndrivers/net/can/slcan/slcan-core.c:737:\t\t\terr = slcan_transmit_cmd(sl, \"F\\r\");\ndrivers/net/can/slcan/slcan-core.c-738-\t\t\tif (err) {\n--\ndrivers/net/can/slcan/slcan-core.c-745-\t\tif (sl-\u003ecan.ctrlmode \u0026 CAN_CTRLMODE_LISTENONLY) {\ndrivers/net/can/slcan/slcan-core.c:746:\t\t\terr = slcan_transmit_cmd(sl, \"L\\r\");\ndrivers/net/can/slcan/slcan-core.c-747-\t\t\tif (err) {\n--\ndrivers/net/can/slcan/slcan-core.c-752-\t\t} else {\ndrivers/net/can/slcan/slcan-core.c:753:\t\t\terr = slcan_transmit_cmd(sl, \"O\\r\");\ndrivers/net/can/slcan/slcan-core.c-754-\t\t\tif (err) {\n--\ndrivers/net/can/slcan/slcan-core.c-770-\ndrivers/net/can/slcan/slcan-core.c:771:static const struct net_device_ops slcan_netdev_ops = {\ndrivers/net/can/slcan/slcan-core.c:772:\t.ndo_open               = slcan_netdev_open,\ndrivers/net/can/slcan/slcan-core.c:773:\t.ndo_stop               = slcan_netdev_close,\ndrivers/net/can/slcan/slcan-core.c:774:\t.ndo_start_xmit         = slcan_netdev_xmit,\ndrivers/net/can/slcan/slcan-core.c-775-};\n--\ndrivers/net/can/slcan/slcan-core.c-787- */\ndrivers/net/can/slcan/slcan-core.c:788:static void slcan_receive_buf(struct tty_struct *tty, const u8 *cp,\ndrivers/net/can/slcan/slcan-core.c-789-\t\t\t      const u8 *fp, size_t count)\ndrivers/net/can/slcan/slcan-core.c-790-{\ndrivers/net/can/slcan/slcan-core.c:791:\tstruct slcan *sl = tty-\u003edisc_data;\ndrivers/net/can/slcan/slcan-core.c-792-\n--\ndrivers/net/can/slcan/slcan-core.c-803-\t\t}\ndrivers/net/can/slcan/slcan-core.c:804:\t\tslcan_unesc(sl, *cp++);\ndrivers/net/can/slcan/slcan-core.c-805-\t}\n--\ndrivers/net/can/slcan/slcan-core.c-813- */\ndrivers/net/can/slcan/slcan-core.c:814:static int slcan_open(struct tty_struct *tty)\ndrivers/net/can/slcan/slcan-core.c-815-{\ndrivers/net/can/slcan/slcan-core.c-816-\tstruct net_device *dev;\ndrivers/net/can/slcan/slcan-core.c:817:\tstruct slcan *sl;\ndrivers/net/can/slcan/slcan-core.c-818-\tint err;\n--\ndrivers/net/can/slcan/slcan-core.c-836-\tspin_lock_init(\u0026sl-\u003elock);\ndrivers/net/can/slcan/slcan-core.c:837:\tINIT_WORK(\u0026sl-\u003etx_work, slcan_transmit);\ndrivers/net/can/slcan/slcan-core.c-838-\tinit_waitqueue_head(\u0026sl-\u003excmd_wait);\n--\ndrivers/net/can/slcan/slcan-core.c-840-\t/* Configure CAN metadata */\ndrivers/net/can/slcan/slcan-core.c:841:\tsl-\u003ecan.bitrate_const = slcan_bitrate_const;\ndrivers/net/can/slcan/slcan-core.c:842:\tsl-\u003ecan.bitrate_const_cnt = ARRAY_SIZE(slcan_bitrate_const);\ndrivers/net/can/slcan/slcan-core.c-843-\tsl-\u003ecan.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY;\n--\ndrivers/net/can/slcan/slcan-core.c-846-\tsl-\u003edev\t= dev;\ndrivers/net/can/slcan/slcan-core.c:847:\tdev-\u003enetdev_ops = \u0026slcan_netdev_ops;\ndrivers/net/can/slcan/slcan-core.c:848:\tdev-\u003eethtool_ops = \u0026slcan_ethtool_ops;\ndrivers/net/can/slcan/slcan-core.c-849-\n--\ndrivers/net/can/slcan/slcan-core.c-860-\ndrivers/net/can/slcan/slcan-core.c:861:\tnetdev_info(dev, \"slcan on %s.\\n\", tty-\u003ename);\ndrivers/net/can/slcan/slcan-core.c-862-\t/* TTY layer expects 0 on success */\n--\ndrivers/net/can/slcan/slcan-core.c-872- */\ndrivers/net/can/slcan/slcan-core.c:873:static void slcan_close(struct tty_struct *tty)\ndrivers/net/can/slcan/slcan-core.c-874-{\ndrivers/net/can/slcan/slcan-core.c:875:\tstruct slcan *sl = tty-\u003edisc_data;\ndrivers/net/can/slcan/slcan-core.c-876-\n--\ndrivers/net/can/slcan/slcan-core.c-890-\ndrivers/net/can/slcan/slcan-core.c:891:\tnetdev_info(sl-\u003edev, \"slcan off %s.\\n\", tty-\u003ename);\ndrivers/net/can/slcan/slcan-core.c-892-\tfree_candev(sl-\u003edev);\n--\ndrivers/net/can/slcan/slcan-core.c-895-/* Perform I/O control on an active SLCAN channel. */\ndrivers/net/can/slcan/slcan-core.c:896:static int slcan_ioctl(struct tty_struct *tty, unsigned int cmd,\ndrivers/net/can/slcan/slcan-core.c-897-\t\t       unsigned long arg)\ndrivers/net/can/slcan/slcan-core.c-898-{\ndrivers/net/can/slcan/slcan-core.c:899:\tstruct slcan *sl = tty-\u003edisc_data;\ndrivers/net/can/slcan/slcan-core.c-900-\tunsigned int tmp;\n--\ndrivers/net/can/slcan/slcan-core.c-916-\ndrivers/net/can/slcan/slcan-core.c:917:static struct tty_ldisc_ops slcan_ldisc = {\ndrivers/net/can/slcan/slcan-core.c-918-\t.owner\t\t= THIS_MODULE,\n--\ndrivers/net/can/slcan/slcan-core.c-920-\t.name\t\t= KBUILD_MODNAME,\ndrivers/net/can/slcan/slcan-core.c:921:\t.open\t\t= slcan_open,\ndrivers/net/can/slcan/slcan-core.c:922:\t.close\t\t= slcan_close,\ndrivers/net/can/slcan/slcan-core.c:923:\t.ioctl\t\t= slcan_ioctl,\ndrivers/net/can/slcan/slcan-core.c:924:\t.receive_buf\t= slcan_receive_buf,\ndrivers/net/can/slcan/slcan-core.c:925:\t.write_wakeup\t= slcan_write_wakeup,\ndrivers/net/can/slcan/slcan-core.c-926-};\ndrivers/net/can/slcan/slcan-core.c-927-\ndrivers/net/can/slcan/slcan-core.c:928:static int __init slcan_init(void)\ndrivers/net/can/slcan/slcan-core.c-929-{\n--\ndrivers/net/can/slcan/slcan-core.c-934-\t/* Fill in our line protocol discipline, and register it */\ndrivers/net/can/slcan/slcan-core.c:935:\tstatus = tty_register_ldisc(\u0026slcan_ldisc);\ndrivers/net/can/slcan/slcan-core.c-936-\tif (status)\n--\ndrivers/net/can/slcan/slcan-core.c-941-\ndrivers/net/can/slcan/slcan-core.c:942:static void __exit slcan_exit(void)\ndrivers/net/can/slcan/slcan-core.c-943-{\n--\ndrivers/net/can/slcan/slcan-core.c-946-\t */\ndrivers/net/can/slcan/slcan-core.c:947:\ttty_unregister_ldisc(\u0026slcan_ldisc);\ndrivers/net/can/slcan/slcan-core.c-948-}\ndrivers/net/can/slcan/slcan-core.c-949-\ndrivers/net/can/slcan/slcan-core.c:950:module_init(slcan_init);\ndrivers/net/can/slcan/slcan-core.c:951:module_exit(slcan_exit);\n--\ndrivers/net/can/slcan/slcan-ethtool.c-11-\ndrivers/net/can/slcan/slcan-ethtool.c:12:#include \"slcan.h\"\ndrivers/net/can/slcan/slcan-ethtool.c-13-\ndrivers/net/can/slcan/slcan-ethtool.c:14:static const char slcan_priv_flags_strings[][ETH_GSTRING_LEN] = {\ndrivers/net/can/slcan/slcan-ethtool.c-15-#define SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN BIT(0)\n--\ndrivers/net/can/slcan/slcan-ethtool.c-18-\ndrivers/net/can/slcan/slcan-ethtool.c:19:static void slcan_get_strings(struct net_device *ndev, u32 stringset, u8 *data)\ndrivers/net/can/slcan/slcan-ethtool.c-20-{\n--\ndrivers/net/can/slcan/slcan-ethtool.c-22-\tcase ETH_SS_PRIV_FLAGS:\ndrivers/net/can/slcan/slcan-ethtool.c:23:\t\tmemcpy(data, slcan_priv_flags_strings,\ndrivers/net/can/slcan/slcan-ethtool.c:24:\t\t       sizeof(slcan_priv_flags_strings));\ndrivers/net/can/slcan/slcan-ethtool.c-25-\t}\n--\ndrivers/net/can/slcan/slcan-ethtool.c-27-\ndrivers/net/can/slcan/slcan-ethtool.c:28:static u32 slcan_get_priv_flags(struct net_device *ndev)\ndrivers/net/can/slcan/slcan-ethtool.c-29-{\n--\ndrivers/net/can/slcan/slcan-ethtool.c-31-\ndrivers/net/can/slcan/slcan-ethtool.c:32:\tif (slcan_err_rst_on_open(ndev))\ndrivers/net/can/slcan/slcan-ethtool.c-33-\t\tflags |= SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN;\n--\ndrivers/net/can/slcan/slcan-ethtool.c-37-\ndrivers/net/can/slcan/slcan-ethtool.c:38:static int slcan_set_priv_flags(struct net_device *ndev, u32 flags)\ndrivers/net/can/slcan/slcan-ethtool.c-39-{\n--\ndrivers/net/can/slcan/slcan-ethtool.c-41-\ndrivers/net/can/slcan/slcan-ethtool.c:42:\treturn slcan_enable_err_rst_on_open(ndev, err_rst_op_open);\ndrivers/net/can/slcan/slcan-ethtool.c-43-}\ndrivers/net/can/slcan/slcan-ethtool.c-44-\ndrivers/net/can/slcan/slcan-ethtool.c:45:static int slcan_get_sset_count(struct net_device *netdev, int sset)\ndrivers/net/can/slcan/slcan-ethtool.c-46-{\n--\ndrivers/net/can/slcan/slcan-ethtool.c-48-\tcase ETH_SS_PRIV_FLAGS:\ndrivers/net/can/slcan/slcan-ethtool.c:49:\t\treturn ARRAY_SIZE(slcan_priv_flags_strings);\ndrivers/net/can/slcan/slcan-ethtool.c-50-\tdefault:\n--\ndrivers/net/can/slcan/slcan-ethtool.c-54-\ndrivers/net/can/slcan/slcan-ethtool.c:55:const struct ethtool_ops slcan_ethtool_ops = {\ndrivers/net/can/slcan/slcan-ethtool.c:56:\t.get_strings = slcan_get_strings,\ndrivers/net/can/slcan/slcan-ethtool.c:57:\t.get_priv_flags = slcan_get_priv_flags,\ndrivers/net/can/slcan/slcan-ethtool.c:58:\t.set_priv_flags = slcan_set_priv_flags,\ndrivers/net/can/slcan/slcan-ethtool.c:59:\t.get_sset_count = slcan_get_sset_count,\ndrivers/net/can/slcan/slcan-ethtool.c-60-\t.get_ts_info = ethtool_op_get_ts_info,\n--\ndrivers/net/can/slcan/slcan.h-1-/* SPDX-License-Identifier: GPL-2.0\ndrivers/net/can/slcan/slcan.h:2: * slcan.h - serial line CAN interface driver\ndrivers/net/can/slcan/slcan.h-3- *\n--\ndrivers/net/can/slcan/slcan.h-13-\ndrivers/net/can/slcan/slcan.h:14:bool slcan_err_rst_on_open(struct net_device *ndev);\ndrivers/net/can/slcan/slcan.h:15:int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on);\ndrivers/net/can/slcan/slcan.h-16-\ndrivers/net/can/slcan/slcan.h:17:extern const struct ethtool_ops slcan_ethtool_ops;\ndrivers/net/can/slcan/slcan.h-18-\n"
}

11/2 2026/09/19 12:31 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 30174
							output: 25
							thoughts: 168
						

Thoughts:
**My Initial Assessment of the slcan Implementation**

Okay, so `slcan` is essentially a virtual tty line discipline – anyone with the right permissions can create a network device using a pty/tty and the `N_SLCAN` ioctl via `TIOCSETD`. That's interesting, and seems like a relatively straightforward way to establish a `slcan` interface. The next part, setting the private flags with `ethtool` and `SIOCETHTOOL` to enable error reset on open via `slcan_enable_err_rst_on_open`, that's the setup and initial configuration.

But hold on a second... is `slcan` the *only* entry point here? I need to think bigger picture. What about wireless drivers, which often have their own configurations? Are there other network drivers that might interact similarly? This seems like a potential security vulnerability if not handled correctly, or at least a point for further review. I need to be sure this is the only potential entry point for this sort of interface manipulation.

Alright, let's zoom out and look at the broader context. I'll check the patch holistically across the entire codebase to see where `slcan` is used, and how it interacts with other drivers. I'll need to re-examine the commit diff to refresh my memory on the specific changes. Ah, but first, what was the commit hash? Let me quickly use `git log -1` to refresh my memory with the commit subject and body, and the context around this patch.



12/2 2026/09/19 12:31 tool grepper
0m Args:
{
  "Expression": "assign_bit",
  "PathPrefix": "drivers/"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 1566 lines.\nUse more precise expression if possible.\n\ndrivers/auxdisplay/hd44780.c=63=static void hd44780_write_gpio8(struct hd44780 *hd, u8 val, unsigned int rs)\n--\ndrivers/auxdisplay/hd44780.c-68-\tvalues[0] = val;\ndrivers/auxdisplay/hd44780.c:69:\t__assign_bit(8, values, rs);\ndrivers/auxdisplay/hd44780.c-70-\tn = hd-\u003epins[PIN_CTRL_RW] ? 10 : 9;\n--\ndrivers/auxdisplay/hd44780.c=79=static void hd44780_write_gpio4(struct hd44780 *hd, u8 val, unsigned int rs)\n--\ndrivers/auxdisplay/hd44780.c-85-\tvalues[0] = val \u003e\u003e 4;\ndrivers/auxdisplay/hd44780.c:86:\t__assign_bit(4, values, rs);\ndrivers/auxdisplay/hd44780.c-87-\tn = hd-\u003epins[PIN_CTRL_RW] ? 6 : 5;\n--\ndrivers/auxdisplay/max6959.c=86=static int max6959_enable(struct max6959_priv *priv, bool enable)\ndrivers/auxdisplay/max6959.c-87-{\ndrivers/auxdisplay/max6959.c:88:\treturn regmap_assign_bits(priv-\u003eregmap, REG_CONFIGURATION, REG_CONFIGURATION_S_BIT, enable);\ndrivers/auxdisplay/max6959.c-89-}\n--\ndrivers/bluetooth/hci_h5.c=331=static void h5_handle_internal_rx(struct hci_uart *hu)\n--\ndrivers/bluetooth/hci_h5.c-368-\t\t\th5-\u003etx_win = (data[2] \u0026 0x07);\ndrivers/bluetooth/hci_h5.c:369:\t\t\tassign_bit(H5_CRC, \u0026h5-\u003eflags, data[2] \u0026 0x10);\ndrivers/bluetooth/hci_h5.c-370-\t\t}\n--\ndrivers/clk/eswin/clk-eic7700-hsp.c=72=static void hsp_clk_gate_endisable(struct clk_hw *hw, bool enable)\n--\ndrivers/clk/eswin/clk-eic7700-hsp.c-85-\t}\ndrivers/clk/eswin/clk-eic7700-hsp.c:86:\tregmap_assign_bits(gate-\u003eregmap, gate-\u003ereg, BIT(gate-\u003ebit_idx), enable);\ndrivers/clk/eswin/clk-eic7700-hsp.c-87-}\n--\ndrivers/clk/qcom/clk-branch.c=138=static int clk_branch2_mem_enable(struct clk_hw *hw)\n--\ndrivers/clk/qcom/clk-branch.c-144-\ndrivers/clk/qcom/clk-branch.c:145:\tregmap_assign_bits(branch.clkr.regmap, mem_br-\u003emem_enable_reg,\ndrivers/clk/qcom/clk-branch.c-146-\t\t\t   mem_br-\u003emem_enable_mask, !mem_br-\u003emem_enable_invert);\n--\ndrivers/clk/qcom/clk-branch.c=158=static void clk_branch2_mem_disable(struct clk_hw *hw)\n--\ndrivers/clk/qcom/clk-branch.c-161-\ndrivers/clk/qcom/clk-branch.c:162:\tregmap_assign_bits(mem_br-\u003ebranch.clkr.regmap, mem_br-\u003emem_enable_reg,\ndrivers/clk/qcom/clk-branch.c-163-\t\t\t   mem_br-\u003emem_enable_mask, mem_br-\u003emem_enable_invert);\n--\ndrivers/gpio/gpio-adp5585.c=319=static void adp5585_irq_bus_sync_unlock(struct irq_data *d)\n--\ndrivers/gpio/gpio-adp5585.c-339-\t\t\t   masked ? 0 : bit);\ndrivers/gpio/gpio-adp5585.c:340:\tassign_bit(hwirq, \u0026adp5585_gpio-\u003eirq_en, !masked);\ndrivers/gpio/gpio-adp5585.c-341-\n--\ndrivers/gpio/gpio-adp5585.c=366=static int adp5585_irq_set_type(struct irq_data *d, unsigned int type)\n--\ndrivers/gpio/gpio-adp5585.c-374-\ndrivers/gpio/gpio-adp5585.c:375:\tassign_bit(hwirq, \u0026adp5585_gpio-\u003eirq_active_high,\ndrivers/gpio/gpio-adp5585.c-376-\t\t   type == IRQ_TYPE_EDGE_RISING);\n--\ndrivers/gpio/gpio-aggregator.c=300=static int gpio_fwd_get_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,\n--\ndrivers/gpio/gpio-aggregator.c-320-\tfor_each_set_bit(i, mask, fwd-\u003echip.ngpio)\ndrivers/gpio/gpio-aggregator.c:321:\t\t__assign_bit(i, bits, test_bit(j++, values));\ndrivers/gpio/gpio-aggregator.c-322-\n--\ndrivers/gpio/gpio-aggregator.c=385=static int gpio_fwd_set_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,\n--\ndrivers/gpio/gpio-aggregator.c-392-\tfor_each_set_bit(i, mask, fwd-\u003echip.ngpio) {\ndrivers/gpio/gpio-aggregator.c:393:\t\t__assign_bit(j, values, test_bit(i, bits));\ndrivers/gpio/gpio-aggregator.c-394-\t\tdescs[j++] = fwd-\u003edescs[i];\n--\ndrivers/gpio/gpio-latch.c=73=static int gpio_latch_set_unlocked(struct gpio_latch_priv *priv,\n--\ndrivers/gpio/gpio-latch.c-78-\ndrivers/gpio/gpio-latch.c:79:\tassign_bit(offset, priv-\u003eshadow, val);\ndrivers/gpio/gpio-latch.c-80-\n--\ndrivers/gpio/gpio-max3191x.c=111=static int max3191x_readout_locked(struct max3191x_chip *max3191x)\n--\ndrivers/gpio/gpio-max3191x.c-128-\t\t\tval = (status \u0026 0xf8) != crc8(max3191x_crc8, \u0026in, 1, 0);\ndrivers/gpio/gpio-max3191x.c:129:\t\t\t__assign_bit(i, max3191x-\u003ecrc_error, val);\ndrivers/gpio/gpio-max3191x.c-130-\t\t\tif (val)\n--\ndrivers/gpio/gpio-max3191x.c-134-\t\t\tot  = (status \u003e\u003e 1) \u0026 1;\ndrivers/gpio/gpio-max3191x.c:135:\t\t\t__assign_bit(i, max3191x-\u003eovertemp, ot);\ndrivers/gpio/gpio-max3191x.c-136-\t\t\tif (ot)\n--\ndrivers/gpio/gpio-max3191x.c-141-\t\t\t\tuv1 = !((status \u003e\u003e 2) \u0026 1);\ndrivers/gpio/gpio-max3191x.c:142:\t\t\t\t__assign_bit(i, max3191x-\u003eundervolt1, uv1);\ndrivers/gpio/gpio-max3191x.c-143-\t\t\t\tif (uv1)\n--\ndrivers/gpio/gpio-max3191x.c-147-\t\t\t\tval = !(status \u0026 1);\ndrivers/gpio/gpio-max3191x.c:148:\t\t\t\t__assign_bit(i, max3191x-\u003eundervolt2, val);\ndrivers/gpio/gpio-max3191x.c-149-\t\t\t\tif (val \u0026\u0026 !uv1)\n--\ndrivers/gpio/gpio-max3191x.c-167-\t\t\t}\ndrivers/gpio/gpio-max3191x.c:168:\t\t\t__assign_bit(i, max3191x-\u003efault, val);\ndrivers/gpio/gpio-max3191x.c-169-\t\t\tif (val \u0026\u0026 !uv1 \u0026\u0026 !ot)\n--\ndrivers/gpio/gpio-max7360.c=126=static int max7360_handle_mask_sync(const int index,\n--\ndrivers/gpio/gpio-max7360.c-134-\tfor (unsigned int i = 0; i \u003c MAX7360_MAX_GPIO; i++) {\ndrivers/gpio/gpio-max7360.c:135:\t\tret = regmap_assign_bits(regmap, MAX7360_REG_PWMCFG(i),\ndrivers/gpio/gpio-max7360.c-136-\t\t\t\t\t MAX7360_PORT_CFG_INTERRUPT_MASK, mask_buf \u0026 BIT(i));\n--\ndrivers/gpio/gpio-mockup.c=103=static int gpio_mockup_get_multiple(struct gpio_chip *gc,\n--\ndrivers/gpio/gpio-mockup.c-111-\t\t\tval = __gpio_mockup_get(chip, bit);\ndrivers/gpio/gpio-mockup.c:112:\t\t\t__assign_bit(bit, bits, val);\ndrivers/gpio/gpio-mockup.c-113-\t\t}\n--\ndrivers/gpio/gpio-pca953x.c=896=static int pca953x_irq_set_type(struct irq_data *d, unsigned int type)\n--\ndrivers/gpio/gpio-pca953x.c-907-\ndrivers/gpio/gpio-pca953x.c:908:\tassign_bit(hwirq, chip-\u003eirq_trig_fall, type \u0026 IRQ_TYPE_EDGE_FALLING);\ndrivers/gpio/gpio-pca953x.c:909:\tassign_bit(hwirq, chip-\u003eirq_trig_raise, type \u0026 IRQ_TYPE_EDGE_RISING);\ndrivers/gpio/gpio-pca953x.c:910:\tassign_bit(hwirq, chip-\u003eirq_trig_level_low, type \u0026 IRQ_TYPE_LEVEL_LOW);\ndrivers/gpio/gpio-pca953x.c:911:\tassign_bit(hwirq, chip-\u003eirq_trig_level_high, type \u0026 IRQ_TYPE_LEVEL_HIGH);\ndrivers/gpio/gpio-pca953x.c-912-\n--\ndrivers/gpio/gpio-sifive.c=74=static void sifive_gpio_irq_enable(struct irq_data *d)\n--\ndrivers/gpio/gpio-sifive.c-96-\t/* Enable interrupts */\ndrivers/gpio/gpio-sifive.c:97:\tassign_bit(offset, \u0026chip-\u003eirq_state, 1);\ndrivers/gpio/gpio-sifive.c-98-\tsifive_gpio_set_ie(chip, offset);\n--\ndrivers/gpio/gpio-sifive.c=101=static void sifive_gpio_irq_disable(struct irq_data *d)\n--\ndrivers/gpio/gpio-sifive.c-107-\ndrivers/gpio/gpio-sifive.c:108:\tassign_bit(offset, \u0026chip-\u003eirq_state, 0);\ndrivers/gpio/gpio-sifive.c-109-\tsifive_gpio_set_ie(chip, offset);\n--\ndrivers/gpio/gpio-sim.c=68=static int gpio_sim_apply_pull(struct gpio_sim_chip *chip,\n--\ndrivers/gpio/gpio-sim.c-104-\t    test_bit(offset, chip-\u003edirection_map))\ndrivers/gpio/gpio-sim.c:105:\t\t__assign_bit(offset, chip-\u003evalue_map, value);\ndrivers/gpio/gpio-sim.c-106-\ndrivers/gpio/gpio-sim.c-107-set_pull:\ndrivers/gpio/gpio-sim.c:108:\t__assign_bit(offset, chip-\u003epull_map, value);\ndrivers/gpio/gpio-sim.c-109-\treturn 0;\n--\ndrivers/gpio/gpio-sim.c=121=static int gpio_sim_set(struct gpio_chip *gc, unsigned int offset, int value)\n--\ndrivers/gpio/gpio-sim.c-125-\tscoped_guard(mutex, \u0026chip-\u003elock)\ndrivers/gpio/gpio-sim.c:126:\t\t__assign_bit(offset, chip-\u003evalue_map, value);\ndrivers/gpio/gpio-sim.c-127-\n--\ndrivers/gpio/gpio-sim.c=154=static int gpio_sim_direction_output(struct gpio_chip *gc,\n--\ndrivers/gpio/gpio-sim.c-160-\t\t__clear_bit(offset, chip-\u003edirection_map);\ndrivers/gpio/gpio-sim.c:161:\t\t__assign_bit(offset, chip-\u003evalue_map, value);\ndrivers/gpio/gpio-sim.c-162-\t}\n--\ndrivers/gpio/gpio-sim.c=222=static void gpio_sim_free(struct gpio_chip *gc, unsigned int offset)\n--\ndrivers/gpio/gpio-sim.c-226-\tscoped_guard(mutex, \u0026chip-\u003elock) {\ndrivers/gpio/gpio-sim.c:227:\t\t__assign_bit(offset, chip-\u003evalue_map,\ndrivers/gpio/gpio-sim.c-228-\t\t\t     !!test_bit(offset, chip-\u003epull_map));\n--\ndrivers/gpio/gpio-tqmx86.c=88=static void _tqmx86_gpio_set(struct tqmx86_gpio_data *gpio, unsigned int offset,\n--\ndrivers/gpio/gpio-tqmx86.c-91-{\ndrivers/gpio/gpio-tqmx86.c:92:\t__assign_bit(offset, gpio-\u003eoutput, value);\ndrivers/gpio/gpio-tqmx86.c-93-\ttqmx86_gpio_write(gpio, bitmap_get_value8(gpio-\u003eoutput, 0), TQMX86_GPIOD);\n--\ndrivers/gpio/gpio-wcove.c=203=static int wcove_gpio_set(struct gpio_chip *chip, unsigned int gpio, int value)\n--\ndrivers/gpio/gpio-wcove.c-210-\ndrivers/gpio/gpio-wcove.c:211:\treturn regmap_assign_bits(wg-\u003eregmap, reg, 1, value);\ndrivers/gpio/gpio-wcove.c-212-}\n--\ndrivers/gpio/gpio-xilinx.c=151=static int xgpio_set(struct gpio_chip *gc, unsigned int gpio, int val)\n--\ndrivers/gpio/gpio-xilinx.c-159-\t/* Write to GPIO signal and set its direction to output */\ndrivers/gpio/gpio-xilinx.c:160:\t__assign_bit(bit, chip-\u003estate, val);\ndrivers/gpio/gpio-xilinx.c-161-\n--\ndrivers/gpio/gpio-xilinx.c=241=static int xgpio_dir_out(struct gpio_chip *gc, unsigned int gpio, int val)\n--\ndrivers/gpio/gpio-xilinx.c-249-\t/* Write state of GPIO signal */\ndrivers/gpio/gpio-xilinx.c:250:\t__assign_bit(bit, chip-\u003estate, val);\ndrivers/gpio/gpio-xilinx.c-251-\txgpio_write_ch(chip, XGPIO_DATA_OFFSET, bit, chip-\u003estate);\n--\ndrivers/gpio/gpiolib-cdev.c=143=static void linehandle_flags_to_desc_flags(u32 lflags, unsigned long *flagsp)\n--\ndrivers/gpio/gpiolib-cdev.c-146-\ndrivers/gpio/gpiolib-cdev.c:147:\tassign_bit(GPIOD_FLAG_ACTIVE_LOW, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-148-\t\t   lflags \u0026 GPIOHANDLE_REQUEST_ACTIVE_LOW);\ndrivers/gpio/gpiolib-cdev.c:149:\tassign_bit(GPIOD_FLAG_OPEN_DRAIN, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-150-\t\t   lflags \u0026 GPIOHANDLE_REQUEST_OPEN_DRAIN);\ndrivers/gpio/gpiolib-cdev.c:151:\tassign_bit(GPIOD_FLAG_OPEN_SOURCE, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-152-\t\t   lflags \u0026 GPIOHANDLE_REQUEST_OPEN_SOURCE);\ndrivers/gpio/gpiolib-cdev.c:153:\tassign_bit(GPIOD_FLAG_PULL_UP, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-154-\t\t   lflags \u0026 GPIOHANDLE_REQUEST_BIAS_PULL_UP);\ndrivers/gpio/gpiolib-cdev.c:155:\tassign_bit(GPIOD_FLAG_PULL_DOWN, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-156-\t\t   lflags \u0026 GPIOHANDLE_REQUEST_BIAS_PULL_DOWN);\ndrivers/gpio/gpiolib-cdev.c:157:\tassign_bit(GPIOD_FLAG_BIAS_DISABLE, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-158-\t\t   lflags \u0026 GPIOHANDLE_REQUEST_BIAS_DISABLE);\n--\ndrivers/gpio/gpiolib-cdev.c=204=static long linehandle_ioctl(struct file *file, unsigned int cmd,\n--\ndrivers/gpio/gpiolib-cdev.c-248-\t\tfor (i = 0; i \u003c lh-\u003enum_descs; i++)\ndrivers/gpio/gpiolib-cdev.c:249:\t\t\t__assign_bit(i, vals, ghd.values[i]);\ndrivers/gpio/gpiolib-cdev.c-250-\n--\ndrivers/gpio/gpiolib-cdev.c=1226=static void gpio_v2_line_config_flags_to_desc_flags(u64 lflags,\n--\ndrivers/gpio/gpiolib-cdev.c-1230-\ndrivers/gpio/gpiolib-cdev.c:1231:\tassign_bit(GPIOD_FLAG_ACTIVE_LOW, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1232-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_ACTIVE_LOW);\n--\ndrivers/gpio/gpiolib-cdev.c-1238-\ndrivers/gpio/gpiolib-cdev.c:1239:\tassign_bit(GPIOD_FLAG_EDGE_RISING, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1240-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_EDGE_RISING);\ndrivers/gpio/gpiolib-cdev.c:1241:\tassign_bit(GPIOD_FLAG_EDGE_FALLING, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1242-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_EDGE_FALLING);\ndrivers/gpio/gpiolib-cdev.c-1243-\ndrivers/gpio/gpiolib-cdev.c:1244:\tassign_bit(GPIOD_FLAG_OPEN_DRAIN, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1245-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_OPEN_DRAIN);\ndrivers/gpio/gpiolib-cdev.c:1246:\tassign_bit(GPIOD_FLAG_OPEN_SOURCE, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1247-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_OPEN_SOURCE);\ndrivers/gpio/gpiolib-cdev.c-1248-\ndrivers/gpio/gpiolib-cdev.c:1249:\tassign_bit(GPIOD_FLAG_PULL_UP, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1250-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_BIAS_PULL_UP);\ndrivers/gpio/gpiolib-cdev.c:1251:\tassign_bit(GPIOD_FLAG_PULL_DOWN, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1252-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_BIAS_PULL_DOWN);\ndrivers/gpio/gpiolib-cdev.c:1253:\tassign_bit(GPIOD_FLAG_BIAS_DISABLE, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1254-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_BIAS_DISABLED);\ndrivers/gpio/gpiolib-cdev.c-1255-\ndrivers/gpio/gpiolib-cdev.c:1256:\tassign_bit(GPIOD_FLAG_EVENT_CLOCK_REALTIME, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1257-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_EVENT_CLOCK_REALTIME);\ndrivers/gpio/gpiolib-cdev.c:1258:\tassign_bit(GPIOD_FLAG_EVENT_CLOCK_HTE, \u0026flags,\ndrivers/gpio/gpiolib-cdev.c-1259-\t\t   lflags \u0026 GPIO_V2_LINE_FLAG_EVENT_CLOCK_HTE);\n--\ndrivers/gpio/gpiolib-kunit.c=58=static int gpio_test_provider_direction_output(struct gpio_chip *gc, unsigned int offset,\n--\ndrivers/gpio/gpiolib-kunit.c-63-\tset_bit(offset, data-\u003eis_output);\ndrivers/gpio/gpiolib-kunit.c:64:\t__assign_bit(offset, data-\u003evalues, value);\ndrivers/gpio/gpiolib-kunit.c-65-\n--\ndrivers/gpio/gpiolib-kunit.c=76=static int gpio_test_provider_set(struct gpio_chip *gc, unsigned int offset, int value)\n--\ndrivers/gpio/gpiolib-kunit.c-79-\ndrivers/gpio/gpiolib-kunit.c:80:\t__assign_bit(offset, data-\u003evalues, value);\ndrivers/gpio/gpiolib-kunit.c-81-\n--\ndrivers/gpio/gpiolib-sysfs.c=344=static int gpio_sysfs_set_active_low(struct gpiod_data *data, int value)\n--\ndrivers/gpio/gpiolib-sysfs.c-352-\ndrivers/gpio/gpiolib-sysfs.c:353:\tassign_bit(GPIOD_FLAG_ACTIVE_LOW, \u0026desc-\u003eflags, value);\ndrivers/gpio/gpiolib-sysfs.c-354-\n--\ndrivers/gpio/gpiolib.c=453=int gpiod_get_direction(struct gpio_desc *desc)\n--\ndrivers/gpio/gpiolib.c-488-\ndrivers/gpio/gpiolib.c:489:\tassign_bit(GPIOD_FLAG_IS_OUT, \u0026flags, !ret);\ndrivers/gpio/gpiolib.c-490-\tWRITE_ONCE(desc-\u003eflags, flags);\n--\ndrivers/gpio/gpiolib.c=1179=int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,\n--\ndrivers/gpio/gpiolib.c-1316-\t\tif (gc-\u003eget_direction \u0026\u0026 gpiochip_line_is_valid(gc, desc_index))\ndrivers/gpio/gpiolib.c:1317:\t\t\tassign_bit(GPIOD_FLAG_IS_OUT, \u0026desc-\u003eflags,\ndrivers/gpio/gpiolib.c-1318-\t\t\t\t   !gc-\u003eget_direction(gc, desc_index));\ndrivers/gpio/gpiolib.c-1319-\t\telse\ndrivers/gpio/gpiolib.c:1320:\t\t\tassign_bit(GPIOD_FLAG_IS_OUT,\ndrivers/gpio/gpiolib.c-1321-\t\t\t\t   \u0026desc-\u003eflags, !gc-\u003edirection_input);\n--\ndrivers/gpio/gpiolib.c=3363=int gpiod_set_transitory(struct gpio_desc *desc, bool transitory)\n--\ndrivers/gpio/gpiolib.c-3369-\t */\ndrivers/gpio/gpiolib.c:3370:\tassign_bit(GPIOD_FLAG_TRANSITORY, \u0026desc-\u003eflags, transitory);\ndrivers/gpio/gpiolib.c-3371-\n--\ndrivers/gpio/gpiolib.c=3463=static int gpio_chip_get_multiple(struct gpio_chip *gc,\n--\ndrivers/gpio/gpiolib.c-3483-\t\t\t\treturn value;\ndrivers/gpio/gpiolib.c:3484:\t\t\t__assign_bit(i, bits, value);\ndrivers/gpio/gpiolib.c-3485-\t\t}\n--\ndrivers/gpio/gpiolib.c=3499=int gpiod_get_array_value_complex(bool raw, bool can_sleep,\n--\ndrivers/gpio/gpiolib.c-3603-\t\t\t\tvalue = !value;\ndrivers/gpio/gpiolib.c:3604:\t\t\t__assign_bit(j, value_bitmap, value);\ndrivers/gpio/gpiolib.c-3605-\t\t\ttrace_gpio_value(desc_to_gpio(desc), 1, value);\n--\ndrivers/gpio/gpiolib.c=3838=int gpiod_set_array_value_complex(bool raw, bool can_sleep,\n--\ndrivers/gpio/gpiolib.c-3945-\t\t\t\t__set_bit(hwgpio, mask);\ndrivers/gpio/gpiolib.c:3946:\t\t\t\t__assign_bit(hwgpio, bits, value);\ndrivers/gpio/gpiolib.c-3947-\t\t\t\tcount++;\n--\ndrivers/gpu/drm/i915/display/intel_dp.c=6802=static void intel_dp_oob_hotplug_event(struct drm_connector *_connector,\n--\ndrivers/gpu/drm/i915/display/intel_dp.c-6815-\ndrivers/gpu/drm/i915/display/intel_dp.c:6816:\t\t__assign_bit(hpd_pin,\ndrivers/gpu/drm/i915/display/intel_dp.c-6817-\t\t\t     \u0026display-\u003ehotplug.oob_hotplug_last_state,\n--\ndrivers/gpu/drm/verisilicon/vs_bridge.c=145=static void vs_bridge_enable_common(struct vs_crtc *crtc,\n--\ndrivers/gpu/drm/verisilicon/vs_bridge.c-152-\t\t\t  VSDC_DISP_PANEL_CONFIG_DAT_POL);\ndrivers/gpu/drm/verisilicon/vs_bridge.c:153:\tregmap_assign_bits(dc-\u003eregs, VSDC_DISP_PANEL_CONFIG(output),\ndrivers/gpu/drm/verisilicon/vs_bridge.c-154-\t\t\t   VSDC_DISP_PANEL_CONFIG_DE_POL,\n--\ndrivers/gpu/drm/verisilicon/vs_bridge.c-156-\t\t\t   DRM_BUS_FLAG_DE_LOW);\ndrivers/gpu/drm/verisilicon/vs_bridge.c:157:\tregmap_assign_bits(dc-\u003eregs, VSDC_DISP_PANEL_CONFIG(output),\ndrivers/gpu/drm/verisilicon/vs_bridge.c-158-\t\t\t   VSDC_DISP_PANEL_CONFIG_CLK_POL,\n--\ndrivers/gpu/drm/verisilicon/vs_bridge.c=194=static void vs_bridge_atomic_enable_dp(struct drm_bridge *bridge,\n--\ndrivers/gpu/drm/verisilicon/vs_bridge.c-215-\tregmap_write(dc-\u003eregs, VSDC_DISP_DP_CONFIG(output), dp_fmt);\ndrivers/gpu/drm/verisilicon/vs_bridge.c:216:\tregmap_assign_bits(dc-\u003eregs, VSDC_DISP_PANEL_CONFIG(output),\ndrivers/gpu/drm/verisilicon/vs_bridge.c-217-\t\t\t   VSDC_DISP_PANEL_CONFIG_YUV,\n--\ndrivers/gpu/drm/verisilicon/vs_primary_plane.c=98=static void vs_primary_plane_atomic_update(struct drm_plane *plane,\n--\ndrivers/gpu/drm/verisilicon/vs_primary_plane.c-125-\t\t\t   VSDC_FB_CONFIG_SWIZZLE(vs_state-\u003eformat.swizzle));\ndrivers/gpu/drm/verisilicon/vs_primary_plane.c:126:\tregmap_assign_bits(dc-\u003eregs, VSDC_FB_CONFIG(output),\ndrivers/gpu/drm/verisilicon/vs_primary_plane.c-127-\t\t\t   VSDC_FB_CONFIG_UV_SWIZZLE_EN,\n--\ndrivers/hv/mshv_root_main.c=1510=mshv_partition_ioctl_get_gpap_access_bitmap(struct mshv_partition *partition,\n--\ndrivers/hv/mshv_root_main.c-1577-\tfor (i = 0; i \u003c written; ++i)\ndrivers/hv/mshv_root_main.c:1578:\t\t__assign_bit(i, (ulong *)states,\ndrivers/hv/mshv_root_main.c-1579-\t\t\t     states[i].as_uint8 \u0026 hv_type_mask);\n--\ndrivers/hwmon/ltc2992.c=259=static int ltc2992_gpio_set(struct gpio_chip *chip, unsigned int offset,\n--\ndrivers/hwmon/ltc2992.c-273-\tgpio_ctrl = reg;\ndrivers/hwmon/ltc2992.c:274:\tassign_bit(ltc2992_gpio_addr_map[offset].ctrl_bit, \u0026gpio_ctrl, value);\ndrivers/hwmon/ltc2992.c-275-\n--\ndrivers/hwmon/ltc2992.c=283=static int ltc2992_gpio_set_multiple(struct gpio_chip *chip, unsigned long *mask,\n--\ndrivers/hwmon/ltc2992.c-293-\t\tif (gpio_nr \u003c 3)\ndrivers/hwmon/ltc2992.c:294:\t\t\tassign_bit(ltc2992_gpio_addr_map[gpio_nr].ctrl_bit, \u0026gpio_ctrl_io, true);\ndrivers/hwmon/ltc2992.c-295-\ndrivers/hwmon/ltc2992.c-296-\t\tif (gpio_nr == 3)\ndrivers/hwmon/ltc2992.c:297:\t\t\tassign_bit(ltc2992_gpio_addr_map[gpio_nr].ctrl_bit, \u0026gpio_ctrl, true);\ndrivers/hwmon/ltc2992.c-298-\t}\n--\ndrivers/hwmon/ltc4283.c=682=static int ltc4283_write_in_en(struct ltc4283_hwmon *st, u32 channel, bool en)\n--\ndrivers/hwmon/ltc4283.c-699-\ndrivers/hwmon/ltc4283.c:700:\t__assign_bit(channel, \u0026st-\u003ech_enable_mask, en);\ndrivers/hwmon/ltc4283.c-701-\treturn 0;\n--\ndrivers/hwmon/pmbus/mp2975.c=389=static int mp2973_write_word_data(struct i2c_client *client, int page,\n--\ndrivers/hwmon/pmbus/mp2975.c-429-\tcase PMBUS_STATUS_CML:\ndrivers/hwmon/pmbus/mp2975.c:430:\t\t__assign_bit(MP2973_INVALID_DATA, \u0026ret, !(mask \u0026 PB_CML_FAULT_INVALID_DATA));\ndrivers/hwmon/pmbus/mp2975.c:431:\t\t__assign_bit(MP2973_INVALID_COMMAND, \u0026ret, !(mask \u0026 PB_CML_FAULT_INVALID_COMMAND));\ndrivers/hwmon/pmbus/mp2975.c:432:\t\t__assign_bit(MP2973_OTHER_COMM, \u0026ret, !(mask \u0026 PB_CML_FAULT_OTHER_COMM));\ndrivers/hwmon/pmbus/mp2975.c:433:\t\t__assign_bit(MP2973_PACKET_ERROR, \u0026ret, !(mask \u0026 PB_CML_FAULT_PACKET_ERROR));\ndrivers/hwmon/pmbus/mp2975.c-434-\t\tbreak;\ndrivers/hwmon/pmbus/mp2975.c-435-\tcase PMBUS_STATUS_VOUT:\ndrivers/hwmon/pmbus/mp2975.c:436:\t\t__assign_bit(MP2973_VOLTAGE_UV, \u0026ret, !(mask \u0026 PB_VOLTAGE_UV_FAULT));\ndrivers/hwmon/pmbus/mp2975.c:437:\t\t__assign_bit(MP2973_VOLTAGE_OV, \u0026ret, !(mask \u0026 PB_VOLTAGE_OV_FAULT));\ndrivers/hwmon/pmbus/mp2975.c-438-\t\tbreak;\ndrivers/hwmon/pmbus/mp2975.c-439-\tcase PMBUS_STATUS_IOUT:\ndrivers/hwmon/pmbus/mp2975.c:440:\t\t__assign_bit(MP2973_IOUT_OC, \u0026ret, !(mask \u0026 PB_IOUT_OC_FAULT));\ndrivers/hwmon/pmbus/mp2975.c:441:\t\t__assign_bit(MP2973_IOUT_OC_LV, \u0026ret, !(mask \u0026 PB_IOUT_OC_LV_FAULT));\ndrivers/hwmon/pmbus/mp2975.c-442-\t\tbreak;\ndrivers/hwmon/pmbus/mp2975.c-443-\tcase PMBUS_STATUS_TEMPERATURE:\ndrivers/hwmon/pmbus/mp2975.c:444:\t\t__assign_bit(MP2973_TEMP_OT, \u0026ret, !(mask \u0026 PB_TEMP_OT_FAULT));\ndrivers/hwmon/pmbus/mp2975.c-445-\t\tbreak;\n--\ndrivers/hwmon/pmbus/mp2975.c-450-\tcase PMBUS_STATUS_MFR_SPECIFIC:\ndrivers/hwmon/pmbus/mp2975.c:451:\t\t__assign_bit(MP2973_VIN_UVLO, \u0026ret, !(mask \u0026 BIT(1)));\ndrivers/hwmon/pmbus/mp2975.c:452:\t\t__assign_bit(MP2973_VIN_OVP, \u0026ret, !(mask \u0026 BIT(3)));\ndrivers/hwmon/pmbus/mp2975.c:453:\t\t__assign_bit(MP2973_MTP_FAULT, \u0026ret, !(mask \u0026 BIT(4)));\ndrivers/hwmon/pmbus/mp2975.c:454:\t\t__assign_bit(MP2973_MTP_BLK_TRIG, \u0026ret, !(mask \u0026 BIT(6)));\ndrivers/hwmon/pmbus/mp2975.c-455-\t\tbreak;\n--\ndrivers/i2c/busses/i2c-amd-asf-plat.c=126=static void amd_asf_update_ioport_target(unsigned short piix4_smba, u8 bit,\n--\ndrivers/i2c/busses/i2c-amd-asf-plat.c-131-\treg = inb_p(offset);\ndrivers/i2c/busses/i2c-amd-asf-plat.c:132:\t__assign_bit(bit, \u0026reg, set);\ndrivers/i2c/busses/i2c-amd-asf-plat.c-133-\toutb_p(reg, offset);\n--\ndrivers/i2c/busses/i2c-amd-asf-plat.c=136=static void amd_asf_update_mmio_target(struct amd_asf_dev *dev, u8 bit, bool set)\n--\ndrivers/i2c/busses/i2c-amd-asf-plat.c-140-\treg = ioread32(dev-\u003emmio_cfg.addr);\ndrivers/i2c/busses/i2c-amd-asf-plat.c:141:\t__assign_bit(bit, \u0026reg, set);\ndrivers/i2c/busses/i2c-amd-asf-plat.c-142-\tiowrite32(reg, dev-\u003emmio_cfg.addr);\n--\ndrivers/iio/accel/adxl313_core.c=119=static int adxl313_set_measure_en(struct adxl313_data *data, bool en)\ndrivers/iio/accel/adxl313_core.c-120-{\ndrivers/iio/accel/adxl313_core.c:121:\treturn regmap_assign_bits(data-\u003eregmap, ADXL313_REG_POWER_CTL,\ndrivers/iio/accel/adxl313_core.c-122-\t\t\t\t  ADXL313_POWER_CTL_MSK, en);\n--\ndrivers/iio/accel/adxl313_core.c=433=static int adxl313_set_act_inact_ac(struct adxl313_data *data,\n--\ndrivers/iio/accel/adxl313_core.c-451-\ndrivers/iio/accel/adxl313_core.c:452:\treturn regmap_assign_bits(data-\u003eregmap, ADXL313_REG_ACT_INACT_CTL,\ndrivers/iio/accel/adxl313_core.c-453-\t\t\t\t  adxl313_act_acdc_msk[type], act_inact_ac);\n--\ndrivers/iio/accel/adxl313_core.c=497=static int adxl313_set_act_inact_linkbit(struct adxl313_data *data, bool en)\n--\ndrivers/iio/accel/adxl313_core.c-521-\ndrivers/iio/accel/adxl313_core.c:522:\treturn regmap_assign_bits(data-\u003eregmap, ADXL313_REG_POWER_CTL,\ndrivers/iio/accel/adxl313_core.c-523-\t\t\t\t  ADXL313_POWER_CTL_AUTO_SLEEP | ADXL313_POWER_CTL_LINK,\n--\ndrivers/iio/accel/adxl313_core.c=527=static int adxl313_set_act_inact_en(struct adxl313_data *data,\n--\ndrivers/iio/accel/adxl313_core.c-586-\t}\ndrivers/iio/accel/adxl313_core.c:587:\tret = regmap_assign_bits(data-\u003eregmap, ADXL313_REG_ACT_INACT_CTL,\ndrivers/iio/accel/adxl313_core.c-588-\t\t\t\t axis_ctrl, cmd_en);\n--\ndrivers/iio/accel/adxl313_core.c-597-\t/* Enable the interrupt line, according to the command */\ndrivers/iio/accel/adxl313_core.c:598:\tret = regmap_assign_bits(data-\u003eregmap, ADXL313_REG_INT_ENABLE,\ndrivers/iio/accel/adxl313_core.c-599-\t\t\t\t adxl313_act_int_reg[type], cmd_en);\n--\ndrivers/iio/accel/adxl313_core.c=1224=int adxl313_core_probe(struct device *dev,\n--\ndrivers/iio/accel/adxl313_core.c-1282-\t\t\tADXL313_INT_OVERRUN;\ndrivers/iio/accel/adxl313_core.c:1283:\t\tret = regmap_assign_bits(data-\u003eregmap, ADXL313_REG_INT_MAP,\ndrivers/iio/accel/adxl313_core.c-1284-\t\t\t\t\t int_map_msk, int_line == ADXL313_INT2);\n--\ndrivers/iio/accel/adxl345_core.c=351=static int adxl345_set_measure_en(struct adxl345_state *st, bool en)\ndrivers/iio/accel/adxl345_core.c-352-{\ndrivers/iio/accel/adxl345_core.c:353:\treturn regmap_assign_bits(st-\u003eregmap, ADXL345_REG_POWER_CTL,\ndrivers/iio/accel/adxl345_core.c-354-\t\t\t\t  ADXL345_POWER_CTL_MEASURE, en);\n--\ndrivers/iio/accel/adxl345_core.c=519=static int adxl345_set_act_inact_ac(struct adxl345_state *st,\n--\ndrivers/iio/accel/adxl345_core.c-565-\t */\ndrivers/iio/accel/adxl345_core.c:566:\treturn regmap_assign_bits(st-\u003eregmap, ADXL345_REG_ACT_INACT_CTRL,\ndrivers/iio/accel/adxl345_core.c-567-\t\t\t\t  adxl345_act_acdc_msk[type], act_inact_ac);\n--\ndrivers/iio/accel/adxl345_core.c=616=static int adxl345_set_act_inact_linkbit(struct adxl345_state *st,\n--\ndrivers/iio/accel/adxl345_core.c-646-\ndrivers/iio/accel/adxl345_core.c:647:\treturn regmap_assign_bits(st-\u003eregmap, ADXL345_REG_POWER_CTL,\ndrivers/iio/accel/adxl345_core.c-648-\t\t\t\t  ADXL345_POWER_CTL_INACT_MSK,\n--\ndrivers/iio/accel/adxl345_core.c=652=static int adxl345_set_act_inact_en(struct adxl345_state *st,\n--\ndrivers/iio/accel/adxl345_core.c-720-\ndrivers/iio/accel/adxl345_core.c:721:\tret = regmap_assign_bits(st-\u003eregmap, ADXL345_REG_ACT_INACT_CTRL,\ndrivers/iio/accel/adxl345_core.c-722-\t\t\t\t axis_ctrl, cmd_en);\n--\ndrivers/iio/accel/adxl345_core.c-731-\t/* Enable the interrupt line, according to the command */\ndrivers/iio/accel/adxl345_core.c:732:\tret = regmap_assign_bits(st-\u003eregmap, ADXL345_REG_INT_ENABLE,\ndrivers/iio/accel/adxl345_core.c-733-\t\t\t\t adxl345_act_int_reg[type], cmd_en);\n--\ndrivers/iio/accel/adxl345_core.c=868=static int adxl345_set_doubletap_en(struct adxl345_state *st, bool en)\n--\ndrivers/iio/accel/adxl345_core.c-875-\t */\ndrivers/iio/accel/adxl345_core.c:876:\tret = regmap_assign_bits(st-\u003eregmap, ADXL345_REG_TAP_AXIS,\ndrivers/iio/accel/adxl345_core.c-877-\t\t\t\t ADXL345_REG_TAP_SUPPRESS, en);\n--\ndrivers/iio/accel/adxl345_core.c=1884=int adxl345_core_probe(struct device *dev, struct regmap *regmap,\n--\ndrivers/iio/accel/adxl345_core.c-1989-\t\t */\ndrivers/iio/accel/adxl345_core.c:1990:\t\tret = regmap_assign_bits(st-\u003eregmap, ADXL345_REG_INT_MAP,\ndrivers/iio/accel/adxl345_core.c-1991-\t\t\t\t\t U8_MAX, intio);\n--\ndrivers/iio/accel/adxl367.c=367=static int adxl367_set_act_interrupt_en(struct adxl367_state *st,\n--\ndrivers/iio/accel/adxl367.c-372-\ndrivers/iio/accel/adxl367.c:373:\treturn regmap_assign_bits(st-\u003eregmap, st-\u003eint_map_reg, mask, en);\ndrivers/iio/accel/adxl367.c-374-}\n--\ndrivers/iio/accel/adxl367.c=404=static int adxl367_set_fifo_watermark_interrupt_en(struct adxl367_state *st,\n--\ndrivers/iio/accel/adxl367.c-406-{\ndrivers/iio/accel/adxl367.c:407:\treturn regmap_assign_bits(st-\u003eregmap, st-\u003eint_map_reg,\ndrivers/iio/accel/adxl367.c-408-\t\t\t\t  ADXL367_INT_FIFO_WATERMARK_MASK, en);\n--\ndrivers/iio/accel/adxl367.c=633=static int adxl367_set_temp_adc_en(struct adxl367_state *st, unsigned int reg,\n--\ndrivers/iio/accel/adxl367.c-635-{\ndrivers/iio/accel/adxl367.c:636:\treturn regmap_assign_bits(st-\u003eregmap, reg, ADXL367_ADC_EN_MASK, en);\ndrivers/iio/accel/adxl367.c-637-}\n--\ndrivers/iio/adc/88pm886-gpadc.c=144=gpadc_set_bias(struct pm886_gpadc *gpadc, enum pm886_gpadc_channel chan, bool on)\n--\ndrivers/iio/adc/88pm886-gpadc.c-148-\ndrivers/iio/adc/88pm886-gpadc.c:149:\treturn regmap_assign_bits(gpadc-\u003emap, PM886_REG_GPADC_CONFIG(0x14), bits, on);\ndrivers/iio/adc/88pm886-gpadc.c-150-}\n--\ndrivers/iio/adc/ad4062.c=1410=static int ad4062_gpio_init_valid_mask(struct gpio_chip *gc,\n--\ndrivers/iio/adc/ad4062.c-1418-\tfor (unsigned int i = 0; i \u003c ARRAY_SIZE(st-\u003egpo_irq); i++)\ndrivers/iio/adc/ad4062.c:1419:\t\t__assign_bit(i, valid_mask, !st-\u003egpo_irq[i]);\ndrivers/iio/adc/ad4062.c-1420-\n--\ndrivers/iio/adc/ad4130.c=576=static int ad4130_gpio_init_valid_mask(struct gpio_chip *gc,\n--\ndrivers/iio/adc/ad4130.c-591-\ndrivers/iio/adc/ad4130.c:592:\t\t__assign_bit(i, valid_mask, valid);\ndrivers/iio/adc/ad4130.c-593-\t}\n--\ndrivers/iio/adc/ad4170-4.c=1661=static int ad4170_gpio_set(struct gpio_chip *gc, unsigned int offset, int value)\n--\ndrivers/iio/adc/ad4170-4.c-1669-\ndrivers/iio/adc/ad4170-4.c:1670:\tret = regmap_assign_bits(st-\u003eregmap, AD4170_GPIO_OUTPUT_REG,\ndrivers/iio/adc/ad4170-4.c-1671-\t\t\t\t BIT(offset), !!value);\n--\ndrivers/iio/adc/ad4170-4.c=1762=static int ad4170_gpio_init_valid_mask(struct gpio_chip *gc,\n--\ndrivers/iio/adc/ad4170-4.c-1772-\ndrivers/iio/adc/ad4170-4.c:1773:\t\t__assign_bit(i, valid_mask, valid);\ndrivers/iio/adc/ad4170-4.c-1774-\t}\n--\ndrivers/iio/adc/ad4691.c=1746=static int ad4691_config(struct ad4691_state *st)\n\n"
}

13/2 2026/09/19 12:31 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 43810
							output: 43
							thoughts: 4512
						

Thoughts:
**Analysis of the Provided Patch for Fuzzing Suitability**

Okay, let's break this down. The prompt gives us a diff, indicating a commit that touches a substantial number of network device drivers. My initial thought is to quickly identify if any of these changes are in code that can actually be executed within a standard, virtualized environment like QEMU or GCE.

First, I skim the diff list. Many of these are clearly physical NIC drivers (xgbe, atlantic, bnx2x, enetc, hns3, i40e, ice, octeontx2, mlx5, fbnic, ionic, qede, qla3xxx, qlcnic, wx), wireless drivers (ath10k, ath11k, ath12k, ath9k, mt76, rtw88, rtw89, wlcore), or PHY drivers (mtk-phy-lib), and the ionic is explicitly listed as a category to *exclude* from fuzzing.  Those are likely out, as they require physical hardware that isn't emulated.

However, there's one that immediately catches my eye: `drivers/net/can/slcan/slcan-core.c`.  `slcan` – that's a *virtual* serial line CAN network driver. And it uses a tty! This is promising because tty and virtual net devices are often emulated within standard environments! Specifically, it uses `TIOCSETD` ioctl with line discipline `N_SLCAN` (27), and this looks like a way to reach the device from userspace. I need to quickly determine whether the `slcan` code is reachable and whether syzkaller is aware of `N_SLCAN` or related syscalls. If so, that's a big green flag.

The patch includes the code:

```c
int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)
{
	struct slcan *sl = netdev_priv(ndev);

	if (netif_running(ndev))
		return -EBUSY;

-	if (on)
-		set_bit(CF_ERR_RST, &sl->cmd_flags);
-	else
-		clear_bit(CF_ERR_RST, &sl->cmd_flags);
+	assign_bit(CF_ERR_RST, &sl->cmd_flags, on);

	return 0;
}
```

Now, the crucial question.  Is this simple `set_bit`/`clear_bit` replacement with `assign_bit` worth fuzzing? Based on the core triage philosophy, this is a *refactoring* or *cleanup*, that modifies reachable executable code. And reachable drivers accessible via virtual buses are a *positive* criteria.  The change is within a function that is likely reachable via `ioctl` from userspace to configure the device's behavior. The change restructures data. This *must* be fuzzed!

Given the structure of the patch, it seems the focus is on a `slcan` driver and not on the other drivers. If my reasoning is correct, this looks like a good candidate for fuzzing.



14/2 2026/09/19 12:31 tool read-file
0m Args:
{
  "File": "drivers/net/can/slcan/slcan-core.c",
  "FirstLine": 910,
  "LineCount": 45
}

Results:
{
  "Contents": " 910:\t\t\treturn -EINVAL;\n 911:\t\n 912:\t\tdefault:\n 913:\t\t\treturn tty_mode_ioctl(tty, cmd, arg);\n 914:\t\t}\n 915:\t}\n 916:\t\n 917:\tstatic struct tty_ldisc_ops slcan_ldisc = {\n 918:\t\t.owner\t\t= THIS_MODULE,\n 919:\t\t.num\t\t= N_SLCAN,\n 920:\t\t.name\t\t= KBUILD_MODNAME,\n 921:\t\t.open\t\t= slcan_open,\n 922:\t\t.close\t\t= slcan_close,\n 923:\t\t.ioctl\t\t= slcan_ioctl,\n 924:\t\t.receive_buf\t= slcan_receive_buf,\n 925:\t\t.write_wakeup\t= slcan_write_wakeup,\n 926:\t};\n 927:\t\n 928:\tstatic int __init slcan_init(void)\n 929:\t{\n 930:\t\tint status;\n 931:\t\n 932:\t\tpr_info(\"serial line CAN interface driver\\n\");\n 933:\t\n 934:\t\t/* Fill in our line protocol discipline, and register it */\n 935:\t\tstatus = tty_register_ldisc(\u0026slcan_ldisc);\n 936:\t\tif (status)\n 937:\t\t\tpr_err(\"can't register line discipline\\n\");\n 938:\t\n 939:\t\treturn status;\n 940:\t}\n 941:\t\n 942:\tstatic void __exit slcan_exit(void)\n 943:\t{\n 944:\t\t/* This will only be called when all channels have been closed by\n 945:\t\t * userspace - tty_ldisc.c takes care of the module's refcount.\n 946:\t\t */\n 947:\t\ttty_unregister_ldisc(\u0026slcan_ldisc);\n 948:\t}\n 949:\t\n 950:\tmodule_init(slcan_init);\n 951:\tmodule_exit(slcan_exit);\n"
}

15/2 2026/09/19 12:31 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 49654
							output: 43
							thoughts: 57
						

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

**Analyzing the slcan Line Discipline**

Okay, so `slcan` is registering a line discipline called `N_SLCAN`. That's interesting, and important. Any process with sufficient privileges, presumably, can grab a pseudoterminal multiplexer like `/dev/ptmx` and then set the line discipline using `ioctl(fd, TIOCSETD, N_SLCAN)`. That's the key. This implies a specific interaction pattern with the kernel. It’s opening a potential doorway. Let's dig deeper and specifically look at the consequences of `slcan_open`. I need to figure out how this `ioctl` call manipulates the data flow, how the device is initialized, and what limitations or vulnerabilities might arise from this specific line discipline being engaged.



16/2 2026/09/19 12:31 tool read-file
0m Args:
{
  "File": "drivers/net/can/slcan/slcan-core.c",
  "FirstLine": 810,
  "LineCount": 60
}

Results:
{
  "Contents": " 810:\t * SLCAN line discipline is called for.\n 811:\t *\n 812:\t * Called in process context serialized from other ldisc calls.\n 813:\t */\n 814:\tstatic int slcan_open(struct tty_struct *tty)\n 815:\t{\n 816:\t\tstruct net_device *dev;\n 817:\t\tstruct slcan *sl;\n 818:\t\tint err;\n 819:\t\n 820:\t\tif (!capable(CAP_NET_ADMIN))\n 821:\t\t\treturn -EPERM;\n 822:\t\n 823:\t\tif (!tty-\u003eops-\u003ewrite)\n 824:\t\t\treturn -EOPNOTSUPP;\n 825:\t\n 826:\t\tdev = alloc_candev(sizeof(*sl), 1);\n 827:\t\tif (!dev)\n 828:\t\t\treturn -ENFILE;\n 829:\t\n 830:\t\tsl = netdev_priv(dev);\n 831:\t\n 832:\t\t/* Configure TTY interface */\n 833:\t\ttty-\u003ereceive_room = 65536; /* We don't flow control */\n 834:\t\tsl-\u003ercount = 0;\n 835:\t\tsl-\u003exleft = 0;\n 836:\t\tspin_lock_init(\u0026sl-\u003elock);\n 837:\t\tINIT_WORK(\u0026sl-\u003etx_work, slcan_transmit);\n 838:\t\tinit_waitqueue_head(\u0026sl-\u003excmd_wait);\n 839:\t\n 840:\t\t/* Configure CAN metadata */\n 841:\t\tsl-\u003ecan.bitrate_const = slcan_bitrate_const;\n 842:\t\tsl-\u003ecan.bitrate_const_cnt = ARRAY_SIZE(slcan_bitrate_const);\n 843:\t\tsl-\u003ecan.ctrlmode_supported = CAN_CTRLMODE_LISTENONLY;\n 844:\t\n 845:\t\t/* Configure netdev interface */\n 846:\t\tsl-\u003edev\t= dev;\n 847:\t\tdev-\u003enetdev_ops = \u0026slcan_netdev_ops;\n 848:\t\tdev-\u003eethtool_ops = \u0026slcan_ethtool_ops;\n 849:\t\n 850:\t\t/* Mark ldisc channel as alive */\n 851:\t\tsl-\u003etty = tty;\n 852:\t\ttty-\u003edisc_data = sl;\n 853:\t\n 854:\t\terr = register_candev(dev);\n 855:\t\tif (err) {\n 856:\t\t\tfree_candev(dev);\n 857:\t\t\tpr_err(\"can't register candev\\n\");\n 858:\t\t\treturn err;\n 859:\t\t}\n 860:\t\n 861:\t\tnetdev_info(dev, \"slcan on %s.\\n\", tty-\u003ename);\n 862:\t\t/* TTY layer expects 0 on success */\n 863:\t\treturn 0;\n 864:\t}\n 865:\t\n 866:\t/* Close down a SLCAN channel.\n 867:\t * This means flushing out any pending queues, and then returning. This\n 868:\t * call is serialized against other ldisc functions.\n 869:\t * Once this is called, no other ldisc function of ours is entered.\n"
}

17/2 2026/09/19 12:31 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 50824
							output: 43
							thoughts: 65
						

Thoughts:
Here's my summary, as though I'm thinking through this process:

**Diving into the slcan Driver's Registering and Error Handling**

Okay, so `slcan` is registering a CAN network device – that's the core of how it's getting connected, `register_candev(dev)`. Makes sense. But the interesting part is this `slcan_enable_err_rst_on_open`. That's being called through `ethtool`, which means there's some interaction with user-space tools for configuring and monitoring the device, and specifically error handling, on open. I need to understand what's happening.

Right, `slcan-ethtool.c` is the likely place to find that logic. Let's get reading.



18/2 2026/09/19 12:31 tool read-file
0m Args:
{
  "File": "drivers/net/can/slcan/slcan-ethtool.c",
  "FirstLine": 1,
  "LineCount": 60
}

Results:
{
  "Contents": "   1:\t// SPDX-License-Identifier: GPL-2.0+\n   2:\t/* Copyright (c) 2022 Amarula Solutions, Dario Binacchi \u003cdario.binacchi@amarulasolutions.com\u003e\n   3:\t *\n   4:\t */\n   5:\t\n   6:\t#include \u003clinux/can/dev.h\u003e\n   7:\t#include \u003clinux/ethtool.h\u003e\n   8:\t#include \u003clinux/kernel.h\u003e\n   9:\t#include \u003clinux/netdevice.h\u003e\n  10:\t#include \u003clinux/platform_device.h\u003e\n  11:\t\n  12:\t#include \"slcan.h\"\n  13:\t\n  14:\tstatic const char slcan_priv_flags_strings[][ETH_GSTRING_LEN] = {\n  15:\t#define SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN BIT(0)\n  16:\t\t\"err-rst-on-open\",\n  17:\t};\n  18:\t\n  19:\tstatic void slcan_get_strings(struct net_device *ndev, u32 stringset, u8 *data)\n  20:\t{\n  21:\t\tswitch (stringset) {\n  22:\t\tcase ETH_SS_PRIV_FLAGS:\n  23:\t\t\tmemcpy(data, slcan_priv_flags_strings,\n  24:\t\t\t       sizeof(slcan_priv_flags_strings));\n  25:\t\t}\n  26:\t}\n  27:\t\n  28:\tstatic u32 slcan_get_priv_flags(struct net_device *ndev)\n  29:\t{\n  30:\t\tu32 flags = 0;\n  31:\t\n  32:\t\tif (slcan_err_rst_on_open(ndev))\n  33:\t\t\tflags |= SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN;\n  34:\t\n  35:\t\treturn flags;\n  36:\t}\n  37:\t\n  38:\tstatic int slcan_set_priv_flags(struct net_device *ndev, u32 flags)\n  39:\t{\n  40:\t\tbool err_rst_op_open = !!(flags \u0026 SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN);\n  41:\t\n  42:\t\treturn slcan_enable_err_rst_on_open(ndev, err_rst_op_open);\n  43:\t}\n  44:\t\n  45:\tstatic int slcan_get_sset_count(struct net_device *netdev, int sset)\n  46:\t{\n  47:\t\tswitch (sset) {\n  48:\t\tcase ETH_SS_PRIV_FLAGS:\n  49:\t\t\treturn ARRAY_SIZE(slcan_priv_flags_strings);\n  50:\t\tdefault:\n  51:\t\t\treturn -EOPNOTSUPP;\n  52:\t\t}\n  53:\t}\n  54:\t\n  55:\tconst struct ethtool_ops slcan_ethtool_ops = {\n  56:\t\t.get_strings = slcan_get_strings,\n  57:\t\t.get_priv_flags = slcan_get_priv_flags,\n  58:\t\t.set_priv_flags = slcan_set_priv_flags,\n  59:\t\t.get_sset_count = slcan_get_sset_count,\n  60:\t\t.get_ts_info = ethtool_op_get_ts_info,\n"
}

19/2 2026/09/19 12:31 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 52001
							output: 40
							thoughts: 246
						

Thoughts:
**My Initial Assessment of the Code**

Okay, so I'm diving into this `slcan_set_priv_flags` function. It looks like it's calling `slcan_enable_err_rst_on_open`, which is interesting. Let me quickly examine that function in `slcan-core.c`. Ah, there it is: `slcan_enable_err_rst_on_open`. It appears to be manipulating a `cmd_flags` bit related to error reset behavior when the interface is opened. The code checks if the network interface is running, and if it is, returns -EBUSY. Otherwise it uses `assign_bit` to set or clear the `CF_ERR_RST` flag in `sl->cmd_flags`. Nothing immediately alarming here, seems pretty standard error handling logic.

Now, a good practice is to always consider the surrounding context in a patch. Are there any other drivers touched by this change? Let me scan the patch, just to be sure... Hmm, there's `rtw88` also. Okay, let's explore that driver for a moment. I know the Realtek wireless drivers, so the next thing I'll check is the bus rtw88 supports - USB is a common one. Let's dig deeper into the rtw88 driver...



20/2 2026/09/19 12:31 tool grepper
0m Args:
{
  "Expression": "CONFIG_RTW88",
  "PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}

Results:
{
  "Output": "drivers/net/wireless/realtek/rtw88/Makefile-2-\ndrivers/net/wireless/realtek/rtw88/Makefile:3:obj-$(CONFIG_RTW88_CORE)\t+= rtw88_core.o\ndrivers/net/wireless/realtek/rtw88/Makefile-4-rtw88_core-y += main.o \\\n--\ndrivers/net/wireless/realtek/rtw88/Makefile=21=rtw88_core-$(CONFIG_PM) += wow.o\ndrivers/net/wireless/realtek/rtw88/Makefile-22-\ndrivers/net/wireless/realtek/rtw88/Makefile:23:rtw88_core-$(CONFIG_RTW88_LEDS) += led.o\ndrivers/net/wireless/realtek/rtw88/Makefile-24-\ndrivers/net/wireless/realtek/rtw88/Makefile:25:obj-$(CONFIG_RTW88_8822B)\t+= rtw88_8822b.o\ndrivers/net/wireless/realtek/rtw88/Makefile-26-rtw88_8822b-objs\t\t:= rtw8822b.o rtw8822b_table.o\ndrivers/net/wireless/realtek/rtw88/Makefile-27-\ndrivers/net/wireless/realtek/rtw88/Makefile:28:obj-$(CONFIG_RTW88_8822BE)\t+= rtw88_8822be.o\ndrivers/net/wireless/realtek/rtw88/Makefile-29-rtw88_8822be-objs\t\t:= rtw8822be.o\ndrivers/net/wireless/realtek/rtw88/Makefile-30-\ndrivers/net/wireless/realtek/rtw88/Makefile:31:obj-$(CONFIG_RTW88_8822BS)\t+= rtw88_8822bs.o\ndrivers/net/wireless/realtek/rtw88/Makefile-32-rtw88_8822bs-objs\t\t:= rtw8822bs.o\ndrivers/net/wireless/realtek/rtw88/Makefile-33-\ndrivers/net/wireless/realtek/rtw88/Makefile:34:obj-$(CONFIG_RTW88_8822BU)\t+= rtw88_8822bu.o\ndrivers/net/wireless/realtek/rtw88/Makefile-35-rtw88_8822bu-objs\t\t:= rtw8822bu.o\ndrivers/net/wireless/realtek/rtw88/Makefile-36-\ndrivers/net/wireless/realtek/rtw88/Makefile:37:obj-$(CONFIG_RTW88_8822C)\t+= rtw88_8822c.o\ndrivers/net/wireless/realtek/rtw88/Makefile-38-rtw88_8822c-objs\t\t:= rtw8822c.o rtw8822c_table.o\ndrivers/net/wireless/realtek/rtw88/Makefile-39-\ndrivers/net/wireless/realtek/rtw88/Makefile:40:obj-$(CONFIG_RTW88_8822CE)\t+= rtw88_8822ce.o\ndrivers/net/wireless/realtek/rtw88/Makefile-41-rtw88_8822ce-objs\t\t:= rtw8822ce.o\ndrivers/net/wireless/realtek/rtw88/Makefile-42-\ndrivers/net/wireless/realtek/rtw88/Makefile:43:obj-$(CONFIG_RTW88_8822CS)\t+= rtw88_8822cs.o\ndrivers/net/wireless/realtek/rtw88/Makefile-44-rtw88_8822cs-objs\t\t:= rtw8822cs.o\ndrivers/net/wireless/realtek/rtw88/Makefile-45-\ndrivers/net/wireless/realtek/rtw88/Makefile:46:obj-$(CONFIG_RTW88_8822CU)\t+= rtw88_8822cu.o\ndrivers/net/wireless/realtek/rtw88/Makefile-47-rtw88_8822cu-objs\t\t:= rtw8822cu.o\ndrivers/net/wireless/realtek/rtw88/Makefile-48-\ndrivers/net/wireless/realtek/rtw88/Makefile:49:obj-$(CONFIG_RTW88_8723X)\t+= rtw88_8723x.o\ndrivers/net/wireless/realtek/rtw88/Makefile-50-rtw88_8723x-objs\t\t:= rtw8723x.o\ndrivers/net/wireless/realtek/rtw88/Makefile-51-\ndrivers/net/wireless/realtek/rtw88/Makefile:52:obj-$(CONFIG_RTW88_8703B)\t+= rtw88_8703b.o\ndrivers/net/wireless/realtek/rtw88/Makefile-53-rtw88_8703b-objs\t\t:= rtw8703b.o rtw8703b_tables.o\ndrivers/net/wireless/realtek/rtw88/Makefile-54-\ndrivers/net/wireless/realtek/rtw88/Makefile:55:obj-$(CONFIG_RTW88_8723CS)\t+= rtw88_8723cs.o\ndrivers/net/wireless/realtek/rtw88/Makefile-56-rtw88_8723cs-objs\t\t:= rtw8723cs.o\ndrivers/net/wireless/realtek/rtw88/Makefile-57-\ndrivers/net/wireless/realtek/rtw88/Makefile:58:obj-$(CONFIG_RTW88_8723D)\t+= rtw88_8723d.o\ndrivers/net/wireless/realtek/rtw88/Makefile-59-rtw88_8723d-objs\t\t:= rtw8723d.o rtw8723d_table.o\ndrivers/net/wireless/realtek/rtw88/Makefile-60-\ndrivers/net/wireless/realtek/rtw88/Makefile:61:obj-$(CONFIG_RTW88_8723DE)\t+= rtw88_8723de.o\ndrivers/net/wireless/realtek/rtw88/Makefile-62-rtw88_8723de-objs\t\t:= rtw8723de.o\ndrivers/net/wireless/realtek/rtw88/Makefile-63-\ndrivers/net/wireless/realtek/rtw88/Makefile:64:obj-$(CONFIG_RTW88_8723DS)\t+= rtw88_8723ds.o\ndrivers/net/wireless/realtek/rtw88/Makefile-65-rtw88_8723ds-objs\t\t:= rtw8723ds.o\ndrivers/net/wireless/realtek/rtw88/Makefile-66-\ndrivers/net/wireless/realtek/rtw88/Makefile:67:obj-$(CONFIG_RTW88_8723DU)\t+= rtw88_8723du.o\ndrivers/net/wireless/realtek/rtw88/Makefile-68-rtw88_8723du-objs\t\t:= rtw8723du.o\ndrivers/net/wireless/realtek/rtw88/Makefile-69-\ndrivers/net/wireless/realtek/rtw88/Makefile:70:obj-$(CONFIG_RTW88_8821C)\t+= rtw88_8821c.o\ndrivers/net/wireless/realtek/rtw88/Makefile-71-rtw88_8821c-objs\t\t:= rtw8821c.o rtw8821c_table.o\ndrivers/net/wireless/realtek/rtw88/Makefile-72-\ndrivers/net/wireless/realtek/rtw88/Makefile:73:obj-$(CONFIG_RTW88_8821CE)\t+= rtw88_8821ce.o\ndrivers/net/wireless/realtek/rtw88/Makefile-74-rtw88_8821ce-objs\t\t:= rtw8821ce.o\ndrivers/net/wireless/realtek/rtw88/Makefile-75-\ndrivers/net/wireless/realtek/rtw88/Makefile:76:obj-$(CONFIG_RTW88_8821CS)\t+= rtw88_8821cs.o\ndrivers/net/wireless/realtek/rtw88/Makefile-77-rtw88_8821cs-objs\t\t:= rtw8821cs.o\ndrivers/net/wireless/realtek/rtw88/Makefile-78-\ndrivers/net/wireless/realtek/rtw88/Makefile:79:obj-$(CONFIG_RTW88_8821CU)\t+= rtw88_8821cu.o\ndrivers/net/wireless/realtek/rtw88/Makefile-80-rtw88_8821cu-objs\t\t:= rtw8821cu.o\ndrivers/net/wireless/realtek/rtw88/Makefile-81-\ndrivers/net/wireless/realtek/rtw88/Makefile:82:obj-$(CONFIG_RTW88_88XXA)\t+= rtw88_88xxa.o\ndrivers/net/wireless/realtek/rtw88/Makefile-83-rtw88_88xxa-objs\t\t:= rtw88xxa.o\ndrivers/net/wireless/realtek/rtw88/Makefile-84-\ndrivers/net/wireless/realtek/rtw88/Makefile:85:obj-$(CONFIG_RTW88_8821A)\t+= rtw88_8821a.o\ndrivers/net/wireless/realtek/rtw88/Makefile-86-rtw88_8821a-objs\t\t:= rtw8821a.o rtw8821a_table.o\ndrivers/net/wireless/realtek/rtw88/Makefile-87-\ndrivers/net/wireless/realtek/rtw88/Makefile:88:obj-$(CONFIG_RTW88_8812A)\t+= rtw88_8812a.o\ndrivers/net/wireless/realtek/rtw88/Makefile-89-rtw88_8812a-objs\t\t:= rtw8812a.o rtw8812a_table.o\ndrivers/net/wireless/realtek/rtw88/Makefile-90-\ndrivers/net/wireless/realtek/rtw88/Makefile:91:obj-$(CONFIG_RTW88_8821AU)\t+= rtw88_8821au.o\ndrivers/net/wireless/realtek/rtw88/Makefile-92-rtw88_8821au-objs\t\t:= rtw8821au.o\ndrivers/net/wireless/realtek/rtw88/Makefile-93-\ndrivers/net/wireless/realtek/rtw88/Makefile:94:obj-$(CONFIG_RTW88_8812AU)\t+= rtw88_8812au.o\ndrivers/net/wireless/realtek/rtw88/Makefile-95-rtw88_8812au-objs\t\t:= rtw8812au.o\ndrivers/net/wireless/realtek/rtw88/Makefile-96-\ndrivers/net/wireless/realtek/rtw88/Makefile:97:obj-$(CONFIG_RTW88_8814A)\t+= rtw88_8814a.o\ndrivers/net/wireless/realtek/rtw88/Makefile-98-rtw88_8814a-objs\t\t:= rtw8814a.o rtw8814a_table.o\ndrivers/net/wireless/realtek/rtw88/Makefile-99-\ndrivers/net/wireless/realtek/rtw88/Makefile:100:obj-$(CONFIG_RTW88_8814AE)\t+= rtw88_8814ae.o\ndrivers/net/wireless/realtek/rtw88/Makefile-101-rtw88_8814ae-objs\t\t:= rtw8814ae.o\ndrivers/net/wireless/realtek/rtw88/Makefile-102-\ndrivers/net/wireless/realtek/rtw88/Makefile:103:obj-$(CONFIG_RTW88_8814AU)\t+= rtw88_8814au.o\ndrivers/net/wireless/realtek/rtw88/Makefile-104-rtw88_8814au-objs\t\t:= rtw8814au.o\ndrivers/net/wireless/realtek/rtw88/Makefile-105-\ndrivers/net/wireless/realtek/rtw88/Makefile:106:obj-$(CONFIG_RTW88_PCI)\t\t+= rtw88_pci.o\ndrivers/net/wireless/realtek/rtw88/Makefile-107-rtw88_pci-objs\t\t\t:= pci.o\ndrivers/net/wireless/realtek/rtw88/Makefile-108-\ndrivers/net/wireless/realtek/rtw88/Makefile:109:obj-$(CONFIG_RTW88_SDIO)\t+= rtw88_sdio.o\ndrivers/net/wireless/realtek/rtw88/Makefile-110-rtw88_sdio-objs\t\t\t:= sdio.o\ndrivers/net/wireless/realtek/rtw88/Makefile-111-\ndrivers/net/wireless/realtek/rtw88/Makefile:112:obj-$(CONFIG_RTW88_USB)\t\t+= rtw88_usb.o\ndrivers/net/wireless/realtek/rtw88/Makefile-113-rtw88_usb-objs\t\t\t:= usb.o\n--\ndrivers/net/wireless/realtek/rtw88/coex.c=3553=void rtw_coex_wl_ccklock_work(struct work_struct *work)\n--\ndrivers/net/wireless/realtek/rtw88/coex.c-3563-\ndrivers/net/wireless/realtek/rtw88/coex.c:3564:#ifdef CONFIG_RTW88_DEBUGFS\ndrivers/net/wireless/realtek/rtw88/coex.c-3565-#define INFO_SIZE\t80\n--\ndrivers/net/wireless/realtek/rtw88/coex.c=3936=void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m)\n--\ndrivers/net/wireless/realtek/rtw88/coex.c-4204-}\ndrivers/net/wireless/realtek/rtw88/coex.c:4205:#endif /* CONFIG_RTW88_DEBUGFS */\n--\ndrivers/net/wireless/realtek/rtw88/debug.c-16-\ndrivers/net/wireless/realtek/rtw88/debug.c:17:#ifdef CONFIG_RTW88_DEBUGFS\ndrivers/net/wireless/realtek/rtw88/debug.c-18-\n--\ndrivers/net/wireless/realtek/rtw88/debug.c=1346=void rtw_debugfs_deinit(struct rtw_dev *rtwdev)\n--\ndrivers/net/wireless/realtek/rtw88/debug.c-1349-}\ndrivers/net/wireless/realtek/rtw88/debug.c:1350:#endif /* CONFIG_RTW88_DEBUGFS */\ndrivers/net/wireless/realtek/rtw88/debug.c-1351-\ndrivers/net/wireless/realtek/rtw88/debug.c:1352:#ifdef CONFIG_RTW88_DEBUG\ndrivers/net/wireless/realtek/rtw88/debug.c-1353-\n--\ndrivers/net/wireless/realtek/rtw88/debug.c=1370=EXPORT_SYMBOL(rtw_dbg);\ndrivers/net/wireless/realtek/rtw88/debug.c-1371-\ndrivers/net/wireless/realtek/rtw88/debug.c:1372:#endif /* CONFIG_RTW88_DEBUG */\n--\ndrivers/net/wireless/realtek/rtw88/debug.h=8=enum rtw_debug_mask {\n--\ndrivers/net/wireless/realtek/rtw88/debug.h-33-\ndrivers/net/wireless/realtek/rtw88/debug.h:34:#ifdef CONFIG_RTW88_DEBUGFS\ndrivers/net/wireless/realtek/rtw88/debug.h-35-\n--\ndrivers/net/wireless/realtek/rtw88/debug.h=43=static inline void rtw_debugfs_deinit(struct rtw_dev *rtwdev) {}\ndrivers/net/wireless/realtek/rtw88/debug.h-44-\ndrivers/net/wireless/realtek/rtw88/debug.h:45:#endif /* CONFIG_RTW88_DEBUGFS */\ndrivers/net/wireless/realtek/rtw88/debug.h-46-\ndrivers/net/wireless/realtek/rtw88/debug.h:47:#ifdef CONFIG_RTW88_DEBUG\ndrivers/net/wireless/realtek/rtw88/debug.h-48-\n--\ndrivers/net/wireless/realtek/rtw88/debug.h=64=static inline bool rtw_dbg_is_enabled(struct rtw_dev *rtwdev,\n--\ndrivers/net/wireless/realtek/rtw88/debug.h-69-\ndrivers/net/wireless/realtek/rtw88/debug.h:70:#endif /* CONFIG_RTW88_DEBUG */\ndrivers/net/wireless/realtek/rtw88/debug.h-71-\n--\ndrivers/net/wireless/realtek/rtw88/led.h-7-\ndrivers/net/wireless/realtek/rtw88/led.h:8:#ifdef CONFIG_RTW88_LEDS\ndrivers/net/wireless/realtek/rtw88/led.h-9-\n--\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c=1886=const struct rtw_chip_info rtw8703b_hw_spec = {\n--\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c-1995-\t/* These registers are used to read (and print) from if\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c:1996:\t * CONFIG_RTW88_DEBUGFS is enabled.\ndrivers/net/wireless/realtek/rtw88/rtw8703b.c-1997-\t */\n"
}

21/2 2026/09/19 12:31 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 57497
							output: 31
							thoughts: 93
						

Thoughts:
**A Quick Scan of USB and SLCAN Possibilities**

Okay, so I'm thinking about how to approach this... Wait a second, the `rtw88` driver *does* support USB (`CONFIG_RTW88_USB`), and that opens some interesting doors. If it's USB, then it means syzkaller's raw-gadget / USB emulation might be a viable testing avenue here. That's a definite plus.

But then, *slcan* pops into my head. Now that's even better, isn't it? The beauty of `slcan` is that it sidesteps the hardware emulation issue entirely. It just needs a tty, whether that's a pseudo-terminal or a straight tty – no hardware simulation required! That could make things *much* simpler.

Right, so the immediate next step is to quickly check the standard configs and the relevant Kconfig options for `slcan`. Gotta figure out if it's already enabled in commonly used setups, or what dependencies might be in play. This could save some time!



22/2 2026/09/19 12:31 tool grepper
0m Args:
{
  "Expression": "config CAN_SLCAN",
  "PathPrefix": "drivers/net/can/"
}

Results:
{
  "Output": "drivers/net/can/Kconfig=168=config CAN_KVASER_PCIEFD\n--\ndrivers/net/can/Kconfig-188-\ndrivers/net/can/Kconfig:189:config CAN_SLCAN\ndrivers/net/can/Kconfig-190-\ttristate \"Serial / USB serial CAN Adaptors (slcan)\"\n"
}

23/2 2026/09/19 12:31 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 57950
							output: 36
							thoughts: 13
						

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

**Analyzing the CAN_SLCAN Kconfig**

Okay, let's dive into the Kconfig for CAN_SLCAN. Immediately, I'm thinking about the standard organization; what dependencies am I going to see? I expect to see the usual suspects: architecture-specific configurations, potential conflicts with other CAN drivers or platforms, and perhaps some device-tree related options. I'll be looking for the crucial decision points – the `bool`, `tristate`, and `depends on` statements. What are the key hardware dependencies? Are there specific clock configurations or interrupt priorities that are exposed? Are there any options to select different underlying hardware implementations if the Kconfig supports multiple silicon variants? I'm hoping it's well-structured and follows established conventions for kernel configuration. I need to understand where this driver fits into the overall CAN subsystem. And does it use any of the common CAN utilities that are typically defined at the top level? I'll also be mentally noting any unusual or non-obvious configurations, as those are usually the ones that cause the most headaches down the line. I am really interested in how it handles interrupts and if any power-saving features are included. Finally, I'll be keeping an eye out for any comments that might give me insight into the reasoning behind certain choices or potential gotchas. I need to assess its configurability to support different hardware revisions, and what would be needed to adapt this config to custom hardware.



24/2 2026/09/19 12:32 tool read-file
0m Args:
{
  "File": "drivers/net/can/Kconfig",
  "FirstLine": 188,
  "LineCount": 20
}

Results:
{
  "Contents": " 188:\t\n 189:\tconfig CAN_SLCAN\n 190:\t\ttristate \"Serial / USB serial CAN Adaptors (slcan)\"\n 191:\t\tdepends on TTY\n 192:\t\thelp\n 193:\t\t  CAN driver for several 'low cost' CAN interfaces that are attached\n 194:\t\t  via serial lines or via USB-to-serial adapters using the LAWICEL\n 195:\t\t  ASCII protocol. The driver implements the tty linediscipline N_SLCAN.\n 196:\t\n 197:\t\t  As only the sending and receiving of CAN frames is implemented, this\n 198:\t\t  driver should work with the (serial/USB) CAN hardware from:\n 199:\t\t  www.canusb.com / www.can232.com / www.mictronics.de / www.canhack.de\n 200:\t\n 201:\t\t  Userspace tools to attach the SLCAN line discipline (slcan_attach,\n 202:\t\t  slcand) can be found in the can-utils at the linux-can project, see\n 203:\t\t  https://github.com/linux-can/can-utils for details.\n 204:\t\n 205:\t\t  This driver can also be built as a module. If so, the module\n 206:\t\t  will be called slcan.\n 207:\t\n"
}

25/2 2026/09/19 12:32 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 58680
							output: 29
							thoughts: 49
						

Thoughts:
**My Initial Assessment of the CAN_SLCAN Dependency**

Okay, let's break this down. From what I see in the configuration files, `CAN_SLCAN` is clearly contingent on `TTY`, and it lives within the `menuconfig CAN` section, specifically under `drivers/net/can/Kconfig`. That's the starting point. But, hold on a second. Before I get too deep in, I need to understand the broader context. What are the dependencies of the core `CAN` functionality itself? I need to know the bigger picture before I can zero in on the specifics of `CAN_SLCAN`. Let's clarify its base requirements.



26/2 2026/09/19 12:32 tool grepper
0m Args:
{
  "Expression": "menuconfig CAN",
  "PathPrefix": "drivers/net/can/"
}

Results:
{
  "Output": "drivers/net/can/Kconfig-2-\ndrivers/net/can/Kconfig:3:menuconfig CAN_DEV\ndrivers/net/can/Kconfig-4-\ttristate \"CAN Device Drivers\"\n--\ndrivers/net/can/c_can/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/net/can/c_can/Kconfig:2:menuconfig CAN_C_CAN\ndrivers/net/can/c_can/Kconfig-3-\ttristate \"Bosch C_CAN/D_CAN devices\"\n--\ndrivers/net/can/cc770/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/net/can/cc770/Kconfig:2:menuconfig CAN_CC770\ndrivers/net/can/cc770/Kconfig-3-\ttristate \"Bosch CC770 and Intel AN82527 devices\"\n--\ndrivers/net/can/m_can/Kconfig-1-# SPDX-License-Identifier: GPL-2.0-only\ndrivers/net/can/m_can/Kconfig:2:menuconfig CAN_M_CAN\ndrivers/net/can/m_can/Kconfig-3-\ttristate \"Bosch M_CAN support\"\n--\ndrivers/net/can/sja1000/Kconfig-2-\ndrivers/net/can/sja1000/Kconfig:3:menuconfig CAN_SJA1000\ndrivers/net/can/sja1000/Kconfig-4-\ttristate \"Philips/NXP SJA1000 devices\"\n"
}

27/2 2026/09/19 12:32 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 59310
							output: 34
							thoughts: 17
						

Thoughts:
Here's my take on the beginning of `drivers/net/can/Kconfig`:

**Diving into the CAN Driver Configuration**

Okay, let's get down to brass tacks. I'm starting with `drivers/net/can/Kconfig`. This is where the core of my CAN driver configurations begin. What options are being offered to users? What dependencies are being established? I'm expecting to see the fundamental building blocks, the core CAN features, and the enabling/disabling mechanism for various CAN-related hardware. This is where I'll get the lay of the land, understand the architectural decisions, and see how the basic CAN functionality is exposed. I'm looking for the standard CAN, CAN FD, error handling, and the essential network interface definitions. This is the foundation upon which everything else is built. I need to understand what I can select or deselect and why.



28/2 2026/09/19 12:32 tool read-file
0m Args:
{
  "File": "drivers/net/can/Kconfig",
  "FirstLine": 1,
  "LineCount": 30
}

Results:
{
  "Contents": "   1:\t# SPDX-License-Identifier: GPL-2.0-only\n   2:\t\n   3:\tmenuconfig CAN_DEV\n   4:\t\ttristate \"CAN Device Drivers\"\n   5:\t\tdefault y\n   6:\t\tdepends on CAN\n   7:\t\thelp\n   8:\t\t  Controller Area Network (CAN) is serial communications protocol up to\n   9:\t\t  1Mbit/s for its original release (now known as Classical CAN) and up\n  10:\t\t  to 8Mbit/s for the more recent CAN with Flexible Data-Rate\n  11:\t\t  (CAN-FD). The CAN bus was originally mainly for automotive, but is now\n  12:\t\t  widely used in marine (NMEA2000), industrial, and medical\n  13:\t\t  applications. More information on the CAN network protocol family\n  14:\t\t  PF_CAN is contained in \u003cDocumentation/networking/can.rst\u003e.\n  15:\t\n  16:\t\t  This section contains all the CAN(-FD) device drivers including the\n  17:\t\t  virtual ones. If you own such devices or plan to use the virtual CAN\n  18:\t\t  interfaces to develop applications, say Y here.\n  19:\t\n  20:\t\t  To compile as a module, choose M here: the module will be called\n  21:\t\t  can-dev.\n  22:\t\n  23:\tif CAN_DEV\n  24:\t\n  25:\tconfig CAN_VCAN\n  26:\t\ttristate \"Virtual Local CAN Interface (vcan)\"\n  27:\t\thelp\n  28:\t\t  Similar to the network loopback devices, vcan offers a\n  29:\t\t  virtual local CAN interface.\n  30:\t\n"
}

29/2 2026/09/19 12:32 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 59982
							output: 54
							thoughts: 5475
						

Thoughts:
**Fuzzing Decision for the Patch Series**

Okay, so I've got this patch series in front of me, and my initial thought is: `CAN`, `CAN_DEV`, `CAN_SLCAN` - I need to carefully evaluate this. This isn't just about the code changes; it's about whether or not this patch is *worth* fuzzing. I need to dive deep.

First, I re-read the patch. What's actually happening here? It looks like a bunch of `if/else` statements setting or clearing bits are being replaced with the `assign_bit` macro. `slcan-core.c`, `xgbe-mdio.c`, `aq_nic.c`, `bnx2x_sriov.c`, and `rtw88/debug.c` - they're all touched.

Now, I understand `assign_bit` is a macro, I know where it's defined: `include/linux/bitops.h`. And I know it’s *literally* a ternary operator that expands to `set_bit` or `clear_bit`. It's defined as `((value) ? set_bit((nr), (addr)) : clear_bit((nr), (addr)))`. It's a syntactic replacement. The preprocessor literally expands it to the same ternary expression!

Now, the important question is: is there any functional or semantic change, or any introduced side effects or type issues? I need to meticulously verify this by looking at every single change.

Alright, let's re-read the triage guidelines to see whether this "refactoring" requires fuzzing. The guidelines are super clear about this: "DO NOT BLINDLY TRUST 'NO FUNCTIONAL CHANGE' (NFCI) OR 'REFACTORING' CLAIMS." Refactorings that touch *reachable* executable code? They MUST be fuzzed.

I need to confirm if this change modifies reachable code. I *know* `slcan` is reachable. It's a virtual netdev over tty, and therefore accessible in any standard QEMU/GCE environment, doesn't require any special hardware. The other drivers in the patch (xgbe, aq_nic, etc.)? They are all hardware-specific or structurally unreachable. BUT `slcan` is reachable!

I double check what the prompt is saying: "Return WorthFuzzing=false ONLY IF all modified code falls strictly into one or more of these categories:" and "DO NOT BLINDLY TRUST "NO FUNCTIONAL CHANGE" (NFCI) OR "REFACTORING" CLAIMS."

So, I need to make sure that the `slcan` path can be reached.

I need to make sure `slcan_enable_err_rst_on_open()` executes in standard virtualized environments (QEMU/GCE). I know any virtual machine compiled with `CONFIG_CAN` and `CONFIG_CAN_SLCAN` can execute `slcan_enable_err_rst_on_open`.

I know syzkaller has `ioctl$TIOCSETD` definitions! `ioctl(fd, TIOCSETD, &ldisc)` called with 27 calls `slcan_open()` and the `slcan_open` function creates a CAN network device named `slc%d`. I know standard socket ioctls can be invoked on those netdevs.

The guidelines are pretty clear here. *Any* restructuring of reachable data structures or algorithm flows? MUST be fuzzed. And this is not structural unreachable hardware!

`assign_bit` *is* a refactoring. I need to make sure this is not a cosmetic refactoring and it could introduce a bug.

So, *even* if this change looks harmless, the guidelines are quite explicit: refactorings in reachable code MUST be fuzzed. And `slcan` is reachable.

**Therefore, this patch MUST be fuzzed.**



30/2 2026/09/19 12:32 tool read-file
0m Args:
{
  "File": "drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c",
  "FirstLine": 2750,
  "LineCount": 25
}

Results:
{
  "Contents": "2750:\t}\n2751:\t\n2752:\tstatic void bnx2x_set_vf_vlan_acceptance(struct bnx2x *bp,\n2753:\t\t\t\t\t\t struct bnx2x_virtf *vf, bool accept)\n2754:\t{\n2755:\t\tstruct bnx2x_rx_mode_ramrod_params rx_ramrod;\n2756:\t\tunsigned long accept_flags;\n2757:\t\n2758:\t\t/* need to remove/add the VF's accept_any_vlan bit */\n2759:\t\taccept_flags = bnx2x_leading_vfq(vf, accept_flags);\n2760:\t\tassign_bit(BNX2X_ACCEPT_ANY_VLAN, \u0026accept_flags, accept);\n2761:\t\n2762:\t\tbnx2x_vf_prep_rx_mode(bp, LEADING_IDX, \u0026rx_ramrod, vf,\n2763:\t\t\t\t      accept_flags);\n2764:\t\tbnx2x_leading_vfq(vf, accept_flags) = accept_flags;\n2765:\t\tbnx2x_config_rx_mode(bp, \u0026rx_ramrod);\n2766:\t}\n2767:\t\n2768:\tstatic int bnx2x_set_vf_vlan_filter(struct bnx2x *bp, struct bnx2x_virtf *vf,\n2769:\t\t\t\t\t    u16 vlan, bool add)\n2770:\t{\n2771:\t\tstruct bnx2x_vlan_mac_ramrod_params ramrod_param;\n2772:\t\tunsigned long ramrod_flags = 0;\n2773:\t\tint rc = 0;\n2774:\t\n"
}

31/2 2026/09/19 12:32 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 66825
							output: 53
							thoughts: 93
						

Thoughts:
**Analyzing the i40e Ethernet Driver Code**

Okay, hold on a second. I need to take a look at the `drivers/net/ethernet/intel/i40e/i40e_ethtool.c` file. Specifically, I'm zeroing in on this line: `assign_bit(priv_flag->bitno, new_flags, new_val);`. My immediate question is, what is `new_flags`? It's crucial to understand how that variable is being used. Let me quickly jump to lines 5260-5290 within `i40e_ethtool.c` to see how `new_flags` is initialized and manipulated in that context. That should give me the clarity I need.



32/2 2026/09/19 12:32 tool read-file
0m Args:
{
  "File": "drivers/net/ethernet/intel/i40e/i40e_ethtool.c",
  "FirstLine": 5255,
  "LineCount": 35
}

Results:
{
  "Contents": "5255:\t\t\tconst struct i40e_priv_flags *priv_flag;\n5256:\t\t\tbool new_val;\n5257:\t\n5258:\t\t\tpriv_flag = \u0026i40e_gstrings_priv_flags[i];\n5259:\t\t\tnew_val = (flags \u0026 BIT(i)) ? true : false;\n5260:\t\n5261:\t\t\t/* If this is a read-only flag, it can't be changed */\n5262:\t\t\tif (priv_flag-\u003eread_only \u0026\u0026\n5263:\t\t\t    test_bit(priv_flag-\u003ebitno, orig_flags) != new_val)\n5264:\t\t\t\treturn -EOPNOTSUPP;\n5265:\t\n5266:\t\t\tassign_bit(priv_flag-\u003ebitno, new_flags, new_val);\n5267:\t\t}\n5268:\t\n5269:\t\tif (pf-\u003ehw.pf_id != 0)\n5270:\t\t\tgoto flags_complete;\n5271:\t\n5272:\t\tfor (j = 0; j \u003c I40E_GL_PRIV_FLAGS_STR_LEN; j++) {\n5273:\t\t\tconst struct i40e_priv_flags *priv_flag;\n5274:\t\t\tbool new_val;\n5275:\t\n5276:\t\t\tpriv_flag = \u0026i40e_gl_gstrings_priv_flags[j];\n5277:\t\t\tnew_val = (flags \u0026 BIT(i + j)) ? true : false;\n5278:\t\n5279:\t\t\t/* If this is a read-only flag, it can't be changed */\n5280:\t\t\tif (priv_flag-\u003eread_only \u0026\u0026\n5281:\t\t\t    test_bit(priv_flag-\u003ebitno, orig_flags) != new_val)\n5282:\t\t\t\treturn -EOPNOTSUPP;\n5283:\t\n5284:\t\t\tassign_bit(priv_flag-\u003ebitno, new_flags, new_val);\n5285:\t\t}\n5286:\t\n5287:\tflags_complete:\n5288:\t\tbitmap_xor(changed_flags, new_flags, orig_flags, I40E_PF_FLAGS_NBITS);\n5289:\t\n"
}

33/2 2026/09/19 12:32 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 67741
							output: 46
							thoughts: 25
						

Thoughts:
Here's a summary of my thought process, as if I were the one thinking it:

**Digging into the Realtek Wireless Driver Debugging**

Okay, before I go any further, let's just make sure I'm not missing something obvious. Let's head over to the `drivers/net/wireless/realtek/rtw88/debug.c` file. It's a key spot for any Realtek wireless driver debugging. I'm looking for anything that might immediately jump out at me – any obvious logging statements, potential error traps, or specific debug flags that might be relevant to the issue I'm chasing down. Hopefully there is some useful information. It is always a good starting place.



34/2 2026/09/19 12:32 tool read-file
0m Args:
{
  "File": "drivers/net/wireless/realtek/rtw88/debug.c",
  "FirstLine": 1040,
  "LineCount": 25
}

Results:
{
  "Contents": "1040:\tstatic ssize_t rtw_debugfs_set_force_lowest_basic_rate(struct file *filp,\n1041:\t\t\t\t\t\t\t       const char __user *buffer,\n1042:\t\t\t\t\t\t\t       size_t count, loff_t *loff)\n1043:\t{\n1044:\t\tstruct seq_file *seqpriv = (struct seq_file *)filp-\u003eprivate_data;\n1045:\t\tstruct rtw_debugfs_priv *debugfs_priv = seqpriv-\u003eprivate;\n1046:\t\tstruct rtw_dev *rtwdev = debugfs_priv-\u003ertwdev;\n1047:\t\tbool input;\n1048:\t\tint err;\n1049:\t\n1050:\t\terr = kstrtobool_from_user(buffer, count, \u0026input);\n1051:\t\tif (err)\n1052:\t\t\treturn err;\n1053:\t\n1054:\t\tassign_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev-\u003eflags, input);\n1055:\t\n1056:\t\treturn count;\n1057:\t}\n1058:\t\n1059:\tstatic int rtw_debugfs_get_force_lowest_basic_rate(struct seq_file *m, void *v)\n1060:\t{\n1061:\t\tstruct rtw_debugfs_priv *debugfs_priv = m-\u003eprivate;\n1062:\t\tstruct rtw_dev *rtwdev = debugfs_priv-\u003ertwdev;\n1063:\t\n1064:\t\tseq_printf(m, \"force lowest basic rate: %d\\n\",\n"
}

35/2 2026/09/19 12:32 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 68403
							output: 37
							thoughts: 2812
						

Thoughts:
**WorthFuzzing Analysis: slcan Driver and Patch Review**

Okay, so I'm looking at this patch and trying to decide if it's "WorthFuzzing," according to the strict criteria. The initial thought is, hey, this `rtw_debugfs_set_force_lowest_basic_rate` debugfs write... does syzkaller have an emulated rtw88 device? Usually, USB raw-gadget can emulate those, but SLCAN doesn't need USB emulation. SLCAN works over pseudo-terminals, so it's directly accessible. Could any unprivileged process create a pty and use it? Let's check `slcan_open`. Ah, it needs `CAP_NET_ADMIN`. But wait! Syzkaller runs in user namespaces with `CAP_NET_ADMIN` or as root, and its sandbox has `CAP_NET_ADMIN` in its own network namespace. It's looking like this might be fuzzable.

I need to apply the rules: *Reachability is key*. Does all of this code execute in standard virtualized environments? Do *NOT* trust "no functional change" claims. Refactorings that touch reachable code MUST be fuzzed. And only return false if it's truly not reachable: non-kernel stuff, unreachable hardware, or architectures that are not supported.

Okay, now let's apply the criteria. I see a bunch of changes in vendor-specific ethernet and wireless drivers, like xgbe, atlantic, bnx2x, enetc, hns3, i40e, ice, octeontx2, mlx5, fbnic, ionic, qede, qla3xxx, qlcnic, wangxun, mediatek phy, ath10k, ath11k, ath12k, ath9k. These all require physical ASICs. That's *structurally unreachable hardware*, mostly. But then I see: `drivers/net/can/slcan/slcan-core.c`. This is NOT hardware! It's a virtual netdev driver, serial line CAN over a tty. Perfect!

So, the answer is *not* all the modified code falls into the negative categories because SLCAN is accessible. It can be reached. Is `slcan_enable_err_rst_on_open` worth fuzzing? Yes, it is. The answer is `WorthFuzzing = true`.

Wait, but what if someone argues that `assign_bit` is a macro, and it's basically the same instructions? Forget it. The instructions say, *do not trust cleanups.* If there is reachable code that has changed, it MUST be fuzzed.

Now, let's look at all the files in the diff to ensure there aren't any other reachable files in the diff.
I must review them one by one:
1.  `drivers/net/can/slcan/slcan-core.c`: Reachable!
2.  `drivers/net/ethernet/amd/xgbe/xgbe-mdio.c`: Physical hardware
3.  `drivers/net/ethernet/aquantia/atlantic/aq_nic.c`: Physical hardware
4.  `drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c`: Physical hardware
5.  `drivers/net/ethernet/freescale/enetc/enetc.c`: Physical hardware
6.  `drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c`: Physical hardware
7.  `drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c`: Physical hardware
8.  `drivers/net/ethernet/intel/i40e/i40e_ethtool.c`: Physical hardware
9.  `drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c`: Physical hardware
10. `drivers/net/ethernet/intel/ice/ice_ethtool.c`: Physical hardware
11. `drivers/net/ethernet/intel/ice/ice_txclk.c`: Physical hardware
12. `drivers/net/ethernet/marvell/octeontx2/af/cgx.c`: Physical hardware
13. `drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c`: Physical hardware
14. `drivers/net/ethernet/marvell/octeontx2/af/rv


36/2 2026/09/19 12:32 tool grepper
0m Args:
{
  "Expression": "USB_DEVICE",
  "PathPrefix": "drivers/net/wireless/realtek/rtw88/"
}

Results:
{
  "Output": "drivers/net/wireless/realtek/rtw88/rtw8723du.c=11=static const struct usb_device_id rtw_8723du_id_table[] = {\ndrivers/net/wireless/realtek/rtw88/rtw8723du.c:12:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xd723, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8723du.c-13-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8723d_hw_spec) }, /* 8723DU 1*1 */\ndrivers/net/wireless/realtek/rtw88/rtw8723du.c:14:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xd611, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8723du.c-15-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8723d_hw_spec) }, /* Edimax EW-7611ULB V2 */\n--\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c=11=static const struct usb_device_id rtw_8812au_id_table[] = {\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:12:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8812, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-13-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:14:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881a, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-15-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:16:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-17-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:18:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881c, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-19-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:20:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0409, 0x0408, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-21-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* NEC */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:22:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x025d, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-23-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Buffalo */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:24:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x04bb, 0x0952, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-25-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* I-O DATA */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:26:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x1106, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-27-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Belkin */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:28:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x1109, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-29-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Belkin */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:30:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0586, 0x3426, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-31-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* ZyXEL */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:32:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0789, 0x016e, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-33-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Logitec */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:34:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x07b8, 0x8812, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-35-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Abocom */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:36:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9051, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-37-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Netgear */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:38:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x17d2, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-39-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* ASUS */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:40:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0074, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-41-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Sitecom */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:42:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0022, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-43-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Hawking */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:44:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x1058, 0x0632, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-45-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* WD */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:46:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x003f, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-47-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Linksys */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:48:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x148f, 0x9097, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-49-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Amped Wireless */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:50:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x1740, 0x0100, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-51-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* EnGenius */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:52:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x330e, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-53-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* D-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:54:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3313, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-55-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* D-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:56:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3315, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-57-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* D-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:58:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3316, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-59-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* D-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:60:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0xab30, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-61-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Planex */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:62:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x805b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-63-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* TRENDnet */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:64:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0101, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-65-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* TP-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:66:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0103, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-67-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* TP-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:68:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010d, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-69-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* TP-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:70:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010e, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-71-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* TP-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:72:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010f, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-73-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* TP-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:74:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0122, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-75-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* TP-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:76:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2604, 0x0012, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-77-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Tenda */\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c:78:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa822, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8812au.c-79-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8812a_hw_spec) }, /* Edimax */\n--\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c=11=static const struct usb_device_id rtw_8814au_id_table[] = {\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:12:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8813, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-13-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:14:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-15-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:16:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400d, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-17-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:18:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9054, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-19-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:20:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1817, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-21-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:22:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1852, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-23-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:24:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1853, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-25-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:26:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0026, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-27-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:28:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331a, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-29-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:30:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x809a, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-31-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:32:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x809b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-33-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:34:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0106, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-35-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:36:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa834, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-37-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c:38:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa833, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8814au.c-39-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8814a_hw_spec) },\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c=11=static const struct usb_device_id rtw_8821au_id_table[] = {\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:12:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0811, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-13-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:14:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0820, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-15-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:16:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0821, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-17-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:18:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8822, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-19-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:20:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0823, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-21-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:22:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xa811, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-23-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:24:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x0242, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-25-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Buffalo */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:26:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x029b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-27-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Buffalo */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:28:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x04bb, 0x0953, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-29-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* I-O DATA */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:30:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x4007, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-31-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* ELECOM */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:32:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400e, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-33-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* ELECOM */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:34:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400f, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-35-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* ELECOM */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:36:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9052, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-37-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Netgear */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:38:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0023, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-39-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* HAWKING */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:40:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3314, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-41-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* D-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:42:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3318, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-43-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* D-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:44:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0xab32, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-45-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Planex */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:46:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x804b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-47-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* TRENDnet */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:48:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011e, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-49-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* TP Link */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:50:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011f, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-51-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* TP Link */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:52:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0120, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-53-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* TP Link */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:54:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x3823, 0x6249, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-55-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Obihai */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:56:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa811, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-57-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Edimax */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:58:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa812, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-59-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Edimax */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:60:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa813, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-61-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Edimax */\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c:62:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xb611, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821au.c-63-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821a_hw_spec) }, /* Edimax */\n--\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c=11=static const struct usb_device_id rtw_8821cu_id_table[] = {\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:12:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x2006, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-13-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:14:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8731, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-15-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:16:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8811, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-17-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:18:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb820, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-19-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:20:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb82b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-21-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:22:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc80c, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-23-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:24:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc811, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-25-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:26:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc820, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-27-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:28:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc821, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-29-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:30:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82a, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-31-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:32:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xc82b, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-33-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:34:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331d, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-35-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) }, /* D-Link */\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:36:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xc811, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-37-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) }, /* Edimax */\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:38:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xd811, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-39-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) }, /* Edimax */\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c:40:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0105, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8821cu.c-41-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8821c_hw_spec) }, /* Mercusys */\n--\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c=11=static const struct usb_device_id rtw_8822bu_id_table[] = {\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:12:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb812, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-13-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:14:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb82c, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-15-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) },\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:16:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x2102, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-17-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* CCNC */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:18:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xb822, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-19-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Edimax EW-7822ULC */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:20:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xc822, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-21-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Edimax EW-7822UTC */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:22:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xd822, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-23-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Edimax */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:24:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xe822, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-25-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Edimax */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:26:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xf822, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-27-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Edimax EW-7822UAD */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:28:\t{ USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xb81a, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-29-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Default ID */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:30:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x1841, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-31-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* ASUS AC1300 USB-AC55 B1 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:32:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x184c, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-33-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* ASUS U2 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:34:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x19aa, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-35-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* ASUS - USB-AC58 rev A1 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:36:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x1870, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-37-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* ASUS */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:38:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0B05, 0x1874, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-39-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* ASUS */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:40:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331e, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-41-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Dlink - DWA-181 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:42:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331c, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-43-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Dlink - DWA-182 - D1 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:44:\t{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331f, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-45-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec)}, /* Dlink - DWA-183 D Ver */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:46:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0043, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-47-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Linksys WUSB6400M */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:48:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x0045, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-49-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Linksys WUSB3600 v2 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:50:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x012d, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-51-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* TP-Link Archer T3U v1 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:52:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0138, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-53-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* TP-Link Archer T3U Plus v1 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:54:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0115, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-55-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* TP-Link Archer T4U V3 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:56:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x012e, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-57-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* TP-LINK */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:58:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0116, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-59-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* TP-LINK */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:60:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0117, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-61-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* TP-LINK */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:62:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9055, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-63-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Netgear A6150 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:64:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0025, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-65-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Hawking HW12ACU */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:66:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x04ca, 0x8602, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-67-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* LiteOn */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:68:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x808a, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-69-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* TRENDnet TEW-808UBM */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:70:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x805a, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-71-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* TRENDnet TEW-805UBH */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:72:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x4011, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-73-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* ELECOM WDB-867DU3S */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:74:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0107, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-75-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Mercusys MA30H */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:76:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x010a, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-77-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* Mercusys MA30N */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:78:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3322, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-79-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* D-Link DWA-T185 rev. A1 */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:80:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x03d1, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-81-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* BUFFALO WI-U2-866DM */\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c:82:\t{ USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x03d0, 0xff, 0xff, 0xff),\ndrivers/net/wireless/realtek/rtw88/rtw8822bu.c-83-\t  .driver_info = (kernel_ulong_t)\u0026(rtw8822b_hw_spec) }, /* BUFFALO WI-U3-866DHP */\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 */\n"
}

37/2 2026/09/19 12:32 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 89886
							output: 32
							thoughts: 805
						

Thoughts:
**Initial Assessment of Potential Exploitation Vectors**

Okay, this is interesting. I'm seeing extensive USB support in RTW88: RTW88_8822BU, CU, 8723DU, 8821AU, CU, 8812AU, and 8814AU. All these have USB IDs and can be fuzzed via USB Raw Gadget and syzkaller, which is worth keeping in mind for future research.

Then I noticed `rtw_debugfs_set_force_lowest_basic_rate` in `drivers/net/wireless/realtek/rtw88/debug.c`. That function calls `assign_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags, input)`, which is accessible through debugfs. Debugfs is always a tempting target, and this might provide some very low-level control.

But, the real gold might be in `slcan` (`drivers/net/can/slcan/slcan-core.c`). SLCAN is a *software* TTY line discipline network driver (`N_SLCAN`)! No hardware is needed! It's just using standard pseudoterminals (ptys). It's accessible via `ioctl(pty_fd, TIOCSETD, N_SLCAN)` and `ioctl(net_fd, SIOCETHTOOL, ...)` with `SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN`, which calls `slcan_enable_err_rst_on_open(ndev, on)`. That's a direct route into a network driver, which is a common area for vulnerabilities.

Let's look at `slcan_enable_err_rst_on_open` again:

```c
int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)
{
	struct slcan *sl = netdev_priv(ndev);

	if (netif_running(ndev))
		return -EBUSY;

	assign_bit(CF_ERR_RST, &sl->cmd_flags, on);

	return 0;
}
```

Okay, so it checks if the network interface is running, and if not, it calls `assign_bit` on `sl->cmd_flags` with `CF_ERR_RST`. Potential for a race condition there, if we can trigger the interface to be running *just* after the check and before the bit is assigned? That's definitely worth investigating.

Let's make a mental note of all the relevant symbols:

*   `slcan_enable_err_rst_on_open` in `slcan-core.c`
*   `slcan_set_priv_flags` in `slcan-ethtool.c`
*   `rtw_debugfs_set_force_lowest_basic_rate` in `rtw88/debug.c`

Now, the important question: is `slcan_enable_err_rst_on_open` a *non-static* symbol in `vmlinux` or `slcan.ko`? That's critical for exploitability.

`int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)`

Yes, it is! It's a non-static global function declared in `slcan.h` and defined in `slcan-core.c`. Excellent! It's specific to the `slcan` driver, making it less ubiquitous and potentially less well-tested.

Finally, what Kconfigs are needed to compile `slcan-core.c`? Let's check the Kconfig dependencies for `CAN_SLCAN`. Tracing that: `menuconfig CAN_DEV` depends on `CAN`. `config CAN_SLCAN` depends on `TTY`. And it's under `if CAN_DEV`. Let's confirm that by checking `drivers/net/can/Kconfig`. We can check lines 23-195 of `drivers/net/can/Kconfig`.



38/2 2026/09/19 12:33 tool grepper
0m Args:
{
  "Expression": "CAN_SLCAN",
  "PathPrefix": "drivers/net/can/Kconfig"
}

Results:
{
  "Output": "drivers/net/can/Kconfig=168=config CAN_KVASER_PCIEFD\n--\ndrivers/net/can/Kconfig-188-\ndrivers/net/can/Kconfig:189:config CAN_SLCAN\ndrivers/net/can/Kconfig-190-\ttristate \"Serial / USB serial CAN Adaptors (slcan)\"\n"
}

39/2 2026/09/19 12:33 llm patch-evaluator-compressor
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Reply:
### 1. Approaches Tried and Results

* **Diff inspection across patch series:**
  * Analyzed commit `d24fd365870a2b5506e113bac6e455768ec38f77`.
  * The patch refactors multiple networking drivers, replacing conditional `set_bit(...)` / `clear_bit(...)` constructs with `assign_bit(...)` or `__assign_bit(...)`.
  * Examined definition of `assign_bit` in `include/linux/bitops.h`:
    ```c
    #define assign_bit(nr, addr, value) \
        ((value) ? set_bit((nr), (addr)) : clear_bit((nr), (addr)))
    #define __assign_bit(nr, addr, value) \
        ((value) ? __set_bit((nr), (addr)) : __clear_bit((nr), (addr)))
    ```
* **Hardware Reachability Triage across Modified Drivers:**
  * Most drivers modified are physical ASICs / SmartNICs / PCIe / SoC hardware not emulated in standard QEMU/syzkaller environments:
    * `amd/xgbe`: AMD 10GbE physical NIC (`xgbe-mdio.c`)
    * `aquantia/atlantic`: Aquantia AQC physical NIC (`aq_nic.c`)
    * `broadcom/bnx2x`: Broadcom NetXtreme II physical NIC (`bnx2x_sriov.c`)
    * `freescale/enetc`: NXP ENETC SoC physical controller (`enetc.c`)
    * `hisilicon/hns3`: HiSilicon physical network engine (`hns3_ethtool.c`, `hclge_mbx.c`)
    * `intel/i40e`, `intel/ice`: Intel physical 10/40/100GbE PCIe controllers (`i40e_ethtool.c`, `i40e_virtchnl_pf.c`, `ice_ethtool.c`, `ice_txclk.c`)
    * `marvell/octeontx2`: Marvell OcteonTX2 hardware (`cgx.c`, `cn20k/npc.c`, `rvu_nix.c`, `rvu_npa.c`)
    * `mellanox/mlx5`: Mellanox ConnectX physical hardware (`en_ethtool.c`, `fw_reset.c`)
    * `meta/fbnic`: Meta ASIC NIC (`fbnic_rpc.c`)
    * `pensando/ionic`: Pensando SmartNIC ASIC (explicit negative criteria in instructions) (`ionic_ethtool.c`)
    * `qlogic/qede`, `qlcnic`, `qla3xxx`: QLogic physical PCIe NICs (`qede_ethtool.c`, `qla3xxx.c`, `qlcnic_dcb.c`, `qlcnic_sriov_common.c`, `qlcnic_sriov_pf.c`)
    * `wangxun/libwx`: Wangxun physical 10GbE NIC (`wx_ptp.c`)
    * `phy/mediatek/mtk-phy-lib.c`: MediaTek physical ethernet PHY
    * `ath/ath10k`, `ath11k`, `ath12k`, `ath9k`: Qualcomm Atheros PCIe/AHB/SNOC hardware
    * `mediatek/mt76`: MediaTek PCIe/SoC wireless hardware
    * `realtek/rtw89`: Realtek 802.11ax PCIe/USB (mostly PCIe / complex PHY)
    * `ti/wlcore`: TI Wilink SDIO/SPI wireless chip
* **Analysis of Reachable Drivers in Emulated Environments:**
  1. **SLCAN (`drivers/net/can/slcan/slcan-core.c`):**
     * Serial Line CAN interface driver using standard TTY line discipline (`N_SLCAN` = 27).
     * Fully software-emulated / virtual; works over pseudo-terminals (`/dev/ptmx`, `pty`) via `ioctl(fd, TIOCSETD, N_SLCAN)`.
     * Does NOT require any physical hardware. Syzkaller supports TTY and `TIOCSETD` directly.
     * Modified function: `slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)`.
     * Called via standard netlink / ethtool ioctls: `slcan_ethtool_ops.set_priv_flags` -> `slcan_set_priv_flags()` -> `slcan_enable_err_rst_on_open()`.
  2. **Realtek RTW88 (`drivers/net/wireless/realtek/rtw88/debug.c`):**
     * Supports USB devices (`CONFIG_RTW88_USB`), potentially reachable via syzkaller USB raw-gadget emulation.
     * Modified function: `rtw_debugfs_set_force_lowest_basic_rate()`, which is a debugfs write entrypoint (`assign_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags, input)`).

### 2. Current Hypotheses and Working Theories

* **Verdict:** `WorthFuzzing = true`.
  * Rationale: The instructions explicitly state:
    * *"DO NOT BLINDLY TRUST 'NO FUNCTIONAL CHANGE' (NFCI) OR 'REFACTORING' CLAIMS"*
    * *"If reachable executable code is modified or refactored, it MUST be fuzzed."*
    * *"Return WorthFuzzing=false ONLY IF all modified code falls strictly into one or more of these [negative] categories."*
  * `slcan` is a virtual/emulated netdev protocol driver residing on standard TTYs, accessible without physical hardware. Therefore, not all modified code is structurally unreachable.
* **Target Focus:**
  * Subsystem: Serial Line CAN (`slcan`).
  * Target function / symbol: `slcan_enable_err_rst_on_open` (and its caller `slcan_set_priv_flags` in `slcan-ethtool.c`).
  * Secondary target if USB gadget / debugfs is targeted: `rtw_debugfs_set_force_lowest_basic_rate`. However, `slcan_enable_err_rst_on_open` is the primary and direct entrypoint.
* **Required Configs:**
  * SLCAN requires `CONFIG_CAN`, `CONFIG_CAN_DEV`, and `CONFIG_CAN_SLCAN`.
  * `CAN_SLCAN` depends on `TTY`.

### 3. Critical Code Snippets, Paths, and Configurations

#### File: `drivers/net/can/slcan/slcan-core.c`
```c
int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)
{
	struct slcan *sl = netdev_priv(ndev);

	if (netif_running(ndev))
		return -EBUSY;

	assign_bit(CF_ERR_RST, &sl->cmd_flags, on);

	return 0;
}
```

#### File: `drivers/net/can/slcan/slcan-ethtool.c`
```c
static int slcan_set_priv_flags(struct net_device *ndev, u32 flags)
{
	bool err_rst_op_open = !!(flags & SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN);

	return slcan_enable_err_rst_on_open(ndev, err_rst_op_open);
}

const struct ethtool_ops slcan_ethtool_ops = {
	.get_strings = slcan_get_strings,
	.get_priv_flags = slcan_get_priv_flags,
	.set_priv_flags = slcan_set_priv_flags,
	.get_sset_count = slcan_get_sset_count,
	.get_ts_info = ethtool_op_get_ts_info,
};
```

#### Line Discipline and Registration (`drivers/net/can/slcan/slcan-core.c`):
* `N_SLCAN` (27) registered via `tty_register_ldisc(&slcan_ldisc)`.
* When userspace issues `ioctl(fd, TIOCSETD, N_SLCAN)` on a tty/pty, `slcan_open()` allocates and registers a CAN net device (`dev->ethtool_ops = &slcan_ethtool_ops`).
* Userspace can then issue `SIOCETHTOOL` / `ETHTOOL_SPFLAGS` or netlink equivalents targeting `slc%d`.

#### Kconfig Hierarchy:
* `net/can/Kconfig`: `config CAN`
* `drivers/net/can/Kconfig`:
  ```kconfig
  menuconfig CAN_DEV
      tristate "CAN Device Drivers"
      depends on CAN
  ...
  config CAN_SLCAN
      tristate "Serial / USB serial CAN Adaptors (slcan)"
      depends on TTY
  ```
* Config options to enable:
  * `CAN`
  * `CAN_DEV`
  * `CAN_SLCAN`
  * (and for RTW88 if included: `RTW88`, `RTW88_CORE`, `RTW88_USB`, `RTW88_DEBUGFS`)

### 4. Watchouts & Pitfalls

* Repetitive tool calls: Avoid repeated broad grepping on `assign_bit` across the whole repository (generated >1500 lines).
* Do not fall into the trap of assuming that `assign_bit(...)` is a harmless macro refactoring and returning `WorthFuzzing=false`. The system instructions are extremely strict regarding NFCI/refactoring claims: if reachable code is modified, it *must* be fuzzed.
* Avoid ubiquitous hot-paths in `FocusSymbols`. Use specific symbols: `slcan_enable_err_rst_on_open`, `slcan_set_priv_flags`.

Tokens:
							input: 77605
							output: 2345
							thoughts: 0
						

40/2 2026/09/19 12:33 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 21862
							output: 36
							thoughts: 29
						

Thoughts:
Here's my take on the thought process, as requested:

**Diving into the CAN Driver Configuration**

Okay, so I need to understand something about how CAN drivers are configured within the kernel. Let's start with `drivers/net/can/Kconfig`, that's usually the place to go for such things. I'm going to quickly check around line 189 within that file. That should give me a good starting point for my investigation and let me see what's defined and what the dependencies might be. This file is, of course, the heart of defining the configuration options exposed to the user, the core of how you select and build different CAN interfaces. I'm going to use `read-file` to get the contents. Hopefully, that will immediately illuminate whatever I'm currently pondering. Let's see what's in there.



41/2 2026/09/19 12:33 tool read-file
0m Args:
{
  "File": "drivers/net/can/Kconfig",
  "FirstLine": 185,
  "LineCount": 25
}

Results:
{
  "Contents": " 185:\t\t    Kvaser Mini PCI Express 2xCAN v3\n 186:\t\t    Kvaser M.2 PCIe 4xCAN\n 187:\t\t    Kvaser PCIe 8xCAN\n 188:\t\n 189:\tconfig CAN_SLCAN\n 190:\t\ttristate \"Serial / USB serial CAN Adaptors (slcan)\"\n 191:\t\tdepends on TTY\n 192:\t\thelp\n 193:\t\t  CAN driver for several 'low cost' CAN interfaces that are attached\n 194:\t\t  via serial lines or via USB-to-serial adapters using the LAWICEL\n 195:\t\t  ASCII protocol. The driver implements the tty linediscipline N_SLCAN.\n 196:\t\n 197:\t\t  As only the sending and receiving of CAN frames is implemented, this\n 198:\t\t  driver should work with the (serial/USB) CAN hardware from:\n 199:\t\t  www.canusb.com / www.can232.com / www.mictronics.de / www.canhack.de\n 200:\t\n 201:\t\t  Userspace tools to attach the SLCAN line discipline (slcan_attach,\n 202:\t\t  slcand) can be found in the can-utils at the linux-can project, see\n 203:\t\t  https://github.com/linux-can/can-utils for details.\n 204:\t\n 205:\t\t  This driver can also be built as a module. If so, the module\n 206:\t\t  will be called slcan.\n 207:\t\n 208:\tconfig CAN_SUN4I\n 209:\t\ttristate \"Allwinner A10 CAN controller\"\n"
}

42/2 2026/09/19 12:33 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 22561
							output: 36
							thoughts: 34
						

Thoughts:
**Locating CAN_DEV in the Kernel Configuration**

Okay, so I need to find where `CAN_DEV` is defined, likely within the CAN subsystem of the kernel. My first instinct is to check the configuration files, specifically `drivers/net/can/Kconfig`. That's where kernel features and options are typically defined. Alternatively, it might be tied to a specific CAN driver, like Serial Line CAN (slcan), so I should glance at the `drivers/net/can/slcan/Makefile` as well, just in case. It's a fairly straightforward search, but ensuring I check all relevant locations makes me more confident. I'm assuming it will likely be a Kconfig option given the context.



43/2 2026/09/19 12:33 tool read-file
0m Args:
{
  "File": "drivers/net/can/slcan/Makefile",
  "FirstLine": 1,
  "LineCount": 20
}

Results:
{
  "Contents": "   1:\t# SPDX-License-Identifier: GPL-2.0\n   2:\t\n   3:\tobj-$(CONFIG_CAN_SLCAN) += slcan.o\n   4:\t\n   5:\tslcan-objs :=\n   6:\tslcan-objs += slcan-core.o\n   7:\tslcan-objs += slcan-ethtool.o\n"
}

44/2 2026/09/19 12:33 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 22887
							output: 34
							thoughts: 32
						

Thoughts:
Here's my thinking process:

**Diving into the CAN Driver Configuration**

Okay, so I need to understand the top-level configuration options and dependencies for the Controller Area Network (CAN) drivers. My first instinct is to look at the `Kconfig` file, specifically `drivers/net/can/Kconfig`. I'll focus on lines 1 through 25 to get a quick overview of the main menu structure and any immediate dependencies. This should give me a good handle on how the CAN driver options are organized and what the prerequisites are for enabling various features. I anticipate finding the core CAN driver configuration options defined here, along with any necessary platform or hardware-specific checks. This initial scan should give me a solid foundation for further, more in-depth exploration if needed.



45/2 2026/09/19 12:33 tool read-file
0m Args:
{
  "File": "drivers/net/can/Kconfig",
  "FirstLine": 1,
  "LineCount": 25
}

Results:
{
  "Contents": "   1:\t# SPDX-License-Identifier: GPL-2.0-only\n   2:\t\n   3:\tmenuconfig CAN_DEV\n   4:\t\ttristate \"CAN Device Drivers\"\n   5:\t\tdefault y\n   6:\t\tdepends on CAN\n   7:\t\thelp\n   8:\t\t  Controller Area Network (CAN) is serial communications protocol up to\n   9:\t\t  1Mbit/s for its original release (now known as Classical CAN) and up\n  10:\t\t  to 8Mbit/s for the more recent CAN with Flexible Data-Rate\n  11:\t\t  (CAN-FD). The CAN bus was originally mainly for automotive, but is now\n  12:\t\t  widely used in marine (NMEA2000), industrial, and medical\n  13:\t\t  applications. More information on the CAN network protocol family\n  14:\t\t  PF_CAN is contained in \u003cDocumentation/networking/can.rst\u003e.\n  15:\t\n  16:\t\t  This section contains all the CAN(-FD) device drivers including the\n  17:\t\t  virtual ones. If you own such devices or plan to use the virtual CAN\n  18:\t\t  interfaces to develop applications, say Y here.\n  19:\t\n  20:\t\t  To compile as a module, choose M here: the module will be called\n  21:\t\t  can-dev.\n  22:\t\n  23:\tif CAN_DEV\n  24:\t\n  25:\tconfig CAN_VCAN\n"
}

46/2 2026/09/19 12:33 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 23487
							output: 40
							thoughts: 131
						

Thoughts:
**My Configuration Deductions**

Okay, let's break this down systematically. It seems I'm dealing with a configuration dependency chain. My mental model looks something like this: I see that `CAN_SLCAN` is nested within an `if CAN_DEV` block, which, in turn, is contingent on the presence of `CAN`. Furthermore, `CAN_SLCAN` is also conditional on the `TTY` configuration. So, the essential configurations I need to consider for this part are: `CAN`, `CAN_DEV`, `CAN_SLCAN`, and `TTY`. I need to ensure all these are correctly set if I'm enabling SLCAN functionality over CAN.

I'm also going to preemptively glance at the RTW88 wireless configs, just to be thorough. I remember spotting `rtw_debugfs_set_force_lowest_basic_rate` in `drivers/net/wireless/realtek/rtw88/debug.c`. Therefore, I should check the RTW88 Kconfig to fully understand those configurations and how they might relate. It's always good to cover all my bases.



47/2 2026/09/19 12:33 tool grepper
0m Args:
{
  "Expression": "RTW88",
  "PathPrefix": "drivers/net/wireless/realtek/rtw88/Kconfig"
}

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-10-\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\ndrivers/net/wireless/realtek/rtw88/Kconfig:37:\tselect RTW88_8723X\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\ndrivers/net/wireless/realtek/rtw88/Kconfig:41:\tselect RTW88_8723X\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\ndrivers/net/wireless/realtek/rtw88/Kconfig:51:\tselect RTW88_88XXA\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\ndrivers/net/wireless/realtek/rtw88/Kconfig:55:\tselect RTW88_88XXA\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-62-\tdepends on PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:63:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:64:\tselect RTW88_PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:65:\tselect RTW88_8822B\ndrivers/net/wireless/realtek/rtw88/Kconfig-66-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-73-\tdepends on MMC\ndrivers/net/wireless/realtek/rtw88/Kconfig:74:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:75:\tselect RTW88_SDIO\ndrivers/net/wireless/realtek/rtw88/Kconfig:76:\tselect RTW88_8822B\ndrivers/net/wireless/realtek/rtw88/Kconfig-77-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-84-\tdepends on USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:85:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:86:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:87:\tselect RTW88_8822B\ndrivers/net/wireless/realtek/rtw88/Kconfig-88-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-95-\tdepends on PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:96:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:97:\tselect RTW88_PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:98:\tselect RTW88_8822C\ndrivers/net/wireless/realtek/rtw88/Kconfig-99-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-106-\tdepends on MMC\ndrivers/net/wireless/realtek/rtw88/Kconfig:107:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:108:\tselect RTW88_SDIO\ndrivers/net/wireless/realtek/rtw88/Kconfig:109:\tselect RTW88_8822C\ndrivers/net/wireless/realtek/rtw88/Kconfig-110-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-117-\tdepends on USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:118:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:119:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:120:\tselect RTW88_8822C\ndrivers/net/wireless/realtek/rtw88/Kconfig-121-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-128-\tdepends on PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:129:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:130:\tselect RTW88_PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:131:\tselect RTW88_8723D\ndrivers/net/wireless/realtek/rtw88/Kconfig-132-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-139-\tdepends on MMC\ndrivers/net/wireless/realtek/rtw88/Kconfig:140:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:141:\tselect RTW88_SDIO\ndrivers/net/wireless/realtek/rtw88/Kconfig:142:\tselect RTW88_8723D\ndrivers/net/wireless/realtek/rtw88/Kconfig-143-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-150-\tdepends on MMC\ndrivers/net/wireless/realtek/rtw88/Kconfig:151:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:152:\tselect RTW88_SDIO\ndrivers/net/wireless/realtek/rtw88/Kconfig:153:\tselect RTW88_8703B\ndrivers/net/wireless/realtek/rtw88/Kconfig-154-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-164-\tdepends on USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:165:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:166:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:167:\tselect RTW88_8723D\ndrivers/net/wireless/realtek/rtw88/Kconfig-168-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-175-\tdepends on PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:176:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:177:\tselect RTW88_PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:178:\tselect RTW88_8821C\ndrivers/net/wireless/realtek/rtw88/Kconfig-179-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-186-\tdepends on MMC\ndrivers/net/wireless/realtek/rtw88/Kconfig:187:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:188:\tselect RTW88_SDIO\ndrivers/net/wireless/realtek/rtw88/Kconfig:189:\tselect RTW88_8821C\ndrivers/net/wireless/realtek/rtw88/Kconfig-190-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-197-\tdepends on USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:198:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:199:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:200:\tselect RTW88_8821C\ndrivers/net/wireless/realtek/rtw88/Kconfig-201-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-208-\tdepends on USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:209:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:210:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:211:\tselect RTW88_8821A\ndrivers/net/wireless/realtek/rtw88/Kconfig-212-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-219-\tdepends on USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:220:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:221:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:222:\tselect RTW88_8812A\ndrivers/net/wireless/realtek/rtw88/Kconfig-223-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-230-\tdepends on PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:231:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:232:\tselect RTW88_PCI\ndrivers/net/wireless/realtek/rtw88/Kconfig:233:\tselect RTW88_8814A\ndrivers/net/wireless/realtek/rtw88/Kconfig-234-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig-241-\tdepends on USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:242:\tselect RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig:243:\tselect RTW88_USB\ndrivers/net/wireless/realtek/rtw88/Kconfig:244:\tselect RTW88_8814A\ndrivers/net/wireless/realtek/rtw88/Kconfig-245-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig:252:\tdepends on RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig-253-\thelp\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\"\ndrivers/net/wireless/realtek/rtw88/Kconfig:260:\tdepends on RTW88_CORE\ndrivers/net/wireless/realtek/rtw88/Kconfig-261-\thelp\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"
}

48/2 2026/09/19 12:33 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 29708
							output: 41
							thoughts: 53
						

Thoughts:
Here's my take on those thoughts:

**Analyzing CAN_SLCAN Reachability**

Okay, so `CAN_SLCAN` is accessible directly through those pseudo-terminals, or even serial lines, which makes sense. I need to understand how that's being initialized. So, I'll dive into the kernel source and start with `drivers/net/can/slcan/slcan-core.c`. Let's get to the bottom of how this thing is brought up and running. I'll be looking for the initialization flow, the device setup, and how it handles those connections. This is going to give me a good handle on its configuration options, and, hopefully, how to manipulate it to suit my needs.



49/2 2026/09/19 12:33 tool read-file
0m Args:
{
  "File": "drivers/net/can/slcan/slcan-core.c",
  "FirstLine": 1,
  "LineCount": 50
}

Results:
{
  "Contents": "   1:\t/*\n   2:\t * slcan.c - serial line CAN interface driver (using tty line discipline)\n   3:\t *\n   4:\t * This file is derived from linux/drivers/net/slip/slip.c and got\n   5:\t * inspiration from linux/drivers/net/can/can327.c for the rework made\n   6:\t * on the line discipline code.\n   7:\t *\n   8:\t * slip.c Authors  : Laurence Culhane \u003cloz@holmes.demon.co.uk\u003e\n   9:\t *                   Fred N. van Kempen \u003cwaltje@uwalt.nl.mugnet.org\u003e\n  10:\t * slcan.c Author  : Oliver Hartkopp \u003csocketcan@hartkopp.net\u003e\n  11:\t * can327.c Author : Max Staudt \u003cmax-linux@enpas.org\u003e\n  12:\t *\n  13:\t * This program is free software; you can redistribute it and/or modify it\n  14:\t * under the terms of the GNU General Public License as published by the\n  15:\t * Free Software Foundation; either version 2 of the License, or (at your\n  16:\t * option) any later version.\n  17:\t *\n  18:\t * This program is distributed in the hope that it will be useful, but\n  19:\t * WITHOUT ANY WARRANTY; without even the implied warranty of\n  20:\t * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n  21:\t * General Public License for more details.\n  22:\t *\n  23:\t * You should have received a copy of the GNU General Public License along\n  24:\t * with this program; if not, see http://www.gnu.org/licenses/gpl.html\n  25:\t *\n  26:\t * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n  27:\t * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n  28:\t * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n  29:\t * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n  30:\t * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n  31:\t * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n  32:\t * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n  33:\t * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n  34:\t * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n  35:\t * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n  36:\t * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\n  37:\t * DAMAGE.\n  38:\t *\n  39:\t */\n  40:\t\n  41:\t#define pr_fmt(fmt) KBUILD_MODNAME \": \" fmt\n  42:\t\n  43:\t#include \u003clinux/module.h\u003e\n  44:\t\n  45:\t#include \u003clinux/uaccess.h\u003e\n  46:\t#include \u003clinux/bitops.h\u003e\n  47:\t#include \u003clinux/string.h\u003e\n  48:\t#include \u003clinux/tty.h\u003e\n  49:\t#include \u003clinux/errno.h\u003e\n  50:\t#include \u003clinux/netdevice.h\u003e\n"
}

50/2 2026/09/19 12:33 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 30795
							output: 43
							thoughts: 14
						

Thoughts:
Here's a summary of my thought process, as requested:

**Diving into `slcan-ethtool.c`**

Okay, time to get to the heart of the matter. I need to understand how the Slcan interface interacts with ethtool. Let's start by digging into `slcan-ethtool.c`. This is where the magic (or the problems!) are likely to be. I want to see how the code handles the ethtool commands, how it configures the CAN interface based on ethtool settings, and what kind of error checking and handling is in place. Specifically, I'm interested in looking for the ioctl calls, and how they interact with the CAN driver. I need to understand the data structures being used, and if they're properly synchronized. My ultimate goal is to pinpoint the exact location of any potential issue, so I'll be looking for any clues regarding driver state, resource allocation, and any potential race conditions. Let's see what we find.



51/2 2026/09/19 12:33 tool read-file
0m Args:
{
  "File": "drivers/net/can/slcan/slcan-ethtool.c",
  "FirstLine": 1,
  "LineCount": 60
}

Results:
{
  "Contents": "   1:\t// SPDX-License-Identifier: GPL-2.0+\n   2:\t/* Copyright (c) 2022 Amarula Solutions, Dario Binacchi \u003cdario.binacchi@amarulasolutions.com\u003e\n   3:\t *\n   4:\t */\n   5:\t\n   6:\t#include \u003clinux/can/dev.h\u003e\n   7:\t#include \u003clinux/ethtool.h\u003e\n   8:\t#include \u003clinux/kernel.h\u003e\n   9:\t#include \u003clinux/netdevice.h\u003e\n  10:\t#include \u003clinux/platform_device.h\u003e\n  11:\t\n  12:\t#include \"slcan.h\"\n  13:\t\n  14:\tstatic const char slcan_priv_flags_strings[][ETH_GSTRING_LEN] = {\n  15:\t#define SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN BIT(0)\n  16:\t\t\"err-rst-on-open\",\n  17:\t};\n  18:\t\n  19:\tstatic void slcan_get_strings(struct net_device *ndev, u32 stringset, u8 *data)\n  20:\t{\n  21:\t\tswitch (stringset) {\n  22:\t\tcase ETH_SS_PRIV_FLAGS:\n  23:\t\t\tmemcpy(data, slcan_priv_flags_strings,\n  24:\t\t\t       sizeof(slcan_priv_flags_strings));\n  25:\t\t}\n  26:\t}\n  27:\t\n  28:\tstatic u32 slcan_get_priv_flags(struct net_device *ndev)\n  29:\t{\n  30:\t\tu32 flags = 0;\n  31:\t\n  32:\t\tif (slcan_err_rst_on_open(ndev))\n  33:\t\t\tflags |= SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN;\n  34:\t\n  35:\t\treturn flags;\n  36:\t}\n  37:\t\n  38:\tstatic int slcan_set_priv_flags(struct net_device *ndev, u32 flags)\n  39:\t{\n  40:\t\tbool err_rst_op_open = !!(flags \u0026 SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN);\n  41:\t\n  42:\t\treturn slcan_enable_err_rst_on_open(ndev, err_rst_op_open);\n  43:\t}\n  44:\t\n  45:\tstatic int slcan_get_sset_count(struct net_device *netdev, int sset)\n  46:\t{\n  47:\t\tswitch (sset) {\n  48:\t\tcase ETH_SS_PRIV_FLAGS:\n  49:\t\t\treturn ARRAY_SIZE(slcan_priv_flags_strings);\n  50:\t\tdefault:\n  51:\t\t\treturn -EOPNOTSUPP;\n  52:\t\t}\n  53:\t}\n  54:\t\n  55:\tconst struct ethtool_ops slcan_ethtool_ops = {\n  56:\t\t.get_strings = slcan_get_strings,\n  57:\t\t.get_priv_flags = slcan_get_priv_flags,\n  58:\t\t.set_priv_flags = slcan_set_priv_flags,\n  59:\t\t.get_sset_count = slcan_get_sset_count,\n  60:\t\t.get_ts_info = ethtool_op_get_ts_info,\n"
}

52/2 2026/09/19 12:33 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 31967
							output: 26
							thoughts: 1669
						

Thoughts:
**Fuzzing Target Identification: slcan Driver**

Okay, so I've been presented with a patch, and my initial thought is, this looks interesting, let's see where the potential for bugs lies. My first instinct is to zero in on what's easily reachable, as that's where I can have the most immediate impact. `slcan_enable_err_rst_on_open` is called from `slcan_set_priv_flags`, which is hooked up to `ethtool_ops`, accessible through `ioctl` or netlink. More importantly, this happens on the `slc%d` interface, created by `TIOCSETD` with `N_SLCAN` on *any* pty or tty! This is huge! And that Realtek function `rtw_debugfs_set_force_lowest_basic_rate` shows up, but `slcan` looks to be a much easier target because it's software.

I need to confirm if other drivers are affected. I'm going to run through each one and give it a quick once over: AMD, Aquantia, Broadcom, NXP, HiSilicon, Intel, Marvell, Mellanox, Meta, Pensando, QLogic, Wangxun, MediaTek, and the Qualcomm, MediaTek, and Realtek wireless drivers, and TI's Wilink.

The key thing is, `slcan` is *virtual*, a software line discipline driver. It's perfectly reachable in QEMU and other virtualized environments. No special hardware needed. That immediately flags this as a "WorthFuzzing = true" scenario.

Now, let's make sure the criteria in the guidelines are met.

Section 1 emphasizes reachability. This patch *definitely* meets that, because `slcan` is reachable in virtualized environments. Also, I can't just take "no functional change" or "refactoring" claims at face value. Refactoring code, even cleanups, can introduce shifts in semantics, and that *must* be fuzzed if it touches reachable code.

Section 2 is my opportunity to exclude. I only return `false` if the changes are non-kernel, structurally unreachable, or unreachable execution paths. This doesn't apply here. `slcan` is a *reachable* netdev driver.

Section 3 is the big one. It clearly states "return true" when reachable code is touched, particularly: refactorings, driver code, etc. This is perfect!

So, `WorthFuzzing = true`. No question.

Now, I'm thinking about the focus. I want to fuzz `slcan_enable_err_rst_on_open` and `slcan_set_priv_flags`. And if we include `rtw88` let's include `rtw_debugfs_set_force_lowest_basic_rate`. Let's verify the exact function signatures and visibility:

*   `slcan_enable_err_rst_on_open` is a *non-static* function: `int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)`.
*   `slcan_set_priv_flags` is `static`: `static int slcan_set_priv_flags(struct net_device *ndev, u32 flags)`.
*   `rtw_debugfs_set_force_lowest_basic_rate` is `static`: `static ssize_t rtw_debugfs_set_force_lowest_basic_rate(...)`.

Wait a minute, `slcan_enable_err_rst_on_open` can be a symbol for syzkaller! It's non-static! This is ideal. I should quickly check if there are other interesting functions or callers in `slcan`.
I need to check if `slcan_enable_err_rst_on_open` is called anywhere else.



53/2 2026/09/19 12:34 tool grepper
0m Args:
{
  "Expression": "slcan_enable_err_rst_on_open"
}

Results:
{
  "Output": "drivers/net/can/slcan/slcan-core.c=120=bool slcan_err_rst_on_open(struct net_device *ndev)\n--\ndrivers/net/can/slcan/slcan-core.c-126-\ndrivers/net/can/slcan/slcan-core.c:127:int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)\ndrivers/net/can/slcan/slcan-core.c-128-{\n--\ndrivers/net/can/slcan/slcan-ethtool.c=38=static int slcan_set_priv_flags(struct net_device *ndev, u32 flags)\n--\ndrivers/net/can/slcan/slcan-ethtool.c-41-\ndrivers/net/can/slcan/slcan-ethtool.c:42:\treturn slcan_enable_err_rst_on_open(ndev, err_rst_op_open);\ndrivers/net/can/slcan/slcan-ethtool.c-43-}\n--\ndrivers/net/can/slcan/slcan.h=14=bool slcan_err_rst_on_open(struct net_device *ndev);\ndrivers/net/can/slcan/slcan.h:15:int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on);\ndrivers/net/can/slcan/slcan.h-16-\n"
}

54/2 2026/09/19 12:34 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 34904
							output: 24
							thoughts: 1155
						

Thoughts:
**Analysis of Target Driver Reachability**

Okay, so my initial thought is, `slcan_enable_err_rst_on_open` is defined in `slcan-core.c` and isn't static. That's my starting point. I need to figure out if `slcan_open` or anything else within `slcan-core.c` is relevant. Looking at `slcan-core.c`, the only function that's actually modified is `slcan_enable_err_rst_on_open`.

Now, I need to understand the required configurations for `slcan`.  I need to check for:
*   `CAN`
*   `CAN_DEV`
*   `CAN_SLCAN`
*   `TTY`

My next step is to assess the reachability of the other potentially modified drivers in standard QEMU or virtual environments. I'll go through the diff and evaluate each file to see what's actually feasible:

*   `drivers/net/can/slcan/slcan-core.c`: This one's easily reachable, a software TTY line discipline.
*   Then a bunch of PCIe and physical NICs (AMD, Aquantia, Broadcom, NXP, HiSilicon, Intel, Marvell, Mellanox, Meta, Pensando, QLogic, Wangxun). Not very likely in my target environments.
*   Then MediaTek ethernet PHY. Probably not directly relevant.
*   And WiFi drivers (Qualcomm Atheros, MediaTek, Realtek, TI). They're less likely as they are physical devices. However, the Realtek driver has USB support via raw-gadget, which could be interesting.

The conclusion is, `drivers/net/can/slcan/slcan-core.c` is the most straightforward target, as it's virtual and over TTY. And `rtw88` is probably also reachable through raw-gadget if configured.

So, let me re-examine the configs required for `slcan`:
*   `CAN`
*   `CAN_DEV`
*   `CAN_SLCAN`
*   `TTY`

And I need to keep in mind these FocusSymbols:
*   `slcan_enable_err_rst_on_open`
*   `slcan_set_priv_flags`

Finally, I need to check if there are any other symbols in `slcan-core.c` or `slcan-ethtool.c` directly related to `slcan_enable_err_rst_on_open`. It looks like `slcan_err_rst_on_open` just reads the bit flag. Now I'll see how `slcan_err_rst_on_open` is used.



55/2 2026/09/19 12:34 tool grepper
0m Args:
{
  "Expression": "slcan_err_rst_on_open"
}

Results:
{
  "Output": "drivers/net/can/slcan/slcan-core.c=115=static const u32 slcan_bitrate_const[] = {\n--\ndrivers/net/can/slcan/slcan-core.c-119-\ndrivers/net/can/slcan/slcan-core.c:120:bool slcan_err_rst_on_open(struct net_device *ndev)\ndrivers/net/can/slcan/slcan-core.c-121-{\n--\ndrivers/net/can/slcan/slcan-ethtool.c=28=static u32 slcan_get_priv_flags(struct net_device *ndev)\n--\ndrivers/net/can/slcan/slcan-ethtool.c-31-\ndrivers/net/can/slcan/slcan-ethtool.c:32:\tif (slcan_err_rst_on_open(ndev))\ndrivers/net/can/slcan/slcan-ethtool.c-33-\t\tflags |= SLCAN_PRIV_FLAGS_ERR_RST_ON_OPEN;\n--\ndrivers/net/can/slcan/slcan.h-13-\ndrivers/net/can/slcan/slcan.h:14:bool slcan_err_rst_on_open(struct net_device *ndev);\ndrivers/net/can/slcan/slcan.h-15-int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on);\n"
}

56/2 2026/09/19 12:34 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 37069
							output: 34
							thoughts: 40
						

Thoughts:
Okay, let's break this down.

**Investigating the CANopen Interface**

Right, where am I? I'm digging into this `slcan-core.c` file and trying to figure out the right function to use for opening the SLcan interface. Is it `slcan_open()` or that `slc_open()` function? I need to be sure I'm calling the correct thing here. I'm looking for the standard way this is done.

And then, just to double-check my understanding of the error codes, where does `CF_ERR_RST` actually pop up? I need to ensure that I know all the contexts it's relevant to. Understanding the error states is key to robust implementation. This probably relates to a reset or initialization error, I want to see if that's right.



57/2 2026/09/19 12:34 tool grepper
0m Args:
{
  "Expression": "CF_ERR_RST",
  "PathPrefix": "drivers/net/can/slcan"
}

Results:
{
  "Output": "drivers/net/can/slcan/slcan-core.c=90=struct slcan {\n--\ndrivers/net/can/slcan/slcan-core.c-109-\tunsigned long           cmd_flags;      /* Command flags             */\ndrivers/net/can/slcan/slcan-core.c:110:#define CF_ERR_RST\t\t0               /* Reset errors on open      */\ndrivers/net/can/slcan/slcan-core.c-111-\twait_queue_head_t       xcmd_wait;      /* Wait queue for commands   */\n--\ndrivers/net/can/slcan/slcan-core.c=120=bool slcan_err_rst_on_open(struct net_device *ndev)\n--\ndrivers/net/can/slcan/slcan-core.c-123-\ndrivers/net/can/slcan/slcan-core.c:124:\treturn !!test_bit(CF_ERR_RST, \u0026sl-\u003ecmd_flags);\ndrivers/net/can/slcan/slcan-core.c-125-}\n--\ndrivers/net/can/slcan/slcan-core.c=127=int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)\n--\ndrivers/net/can/slcan/slcan-core.c-133-\ndrivers/net/can/slcan/slcan-core.c:134:\tassign_bit(CF_ERR_RST, \u0026sl-\u003ecmd_flags, on);\ndrivers/net/can/slcan/slcan-core.c-135-\n--\ndrivers/net/can/slcan/slcan-core.c=698=static int slcan_netdev_open(struct net_device *dev)\n--\ndrivers/net/can/slcan/slcan-core.c-735-\ndrivers/net/can/slcan/slcan-core.c:736:\t\tif (test_bit(CF_ERR_RST, \u0026sl-\u003ecmd_flags)) {\ndrivers/net/can/slcan/slcan-core.c-737-\t\t\terr = slcan_transmit_cmd(sl, \"F\\r\");\n"
}

58/2 2026/09/19 12:34 llm patch-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 37882
							output: 223
							thoughts: 351
						

Thoughts:
**My Assessment of the slcan Driver's Error Reset Behavior**

Okay, let's break this down. My initial assessment is that the `slcan_enable_err_rst_on_open` function in the slcan driver is setting up an error reset flag (`CF_ERR_RST`) when the network device (`ndev`) is down. This makes sense; it's likely a mechanism to ensure a clean state when the device is brought up. The check for this flag then happens within `slcan_netdev_open` after the network device is brought up.

Specifically, the `slcan_enable_err_rst_on_open` function is triggered through `slcan_set_priv_flags`, which is invoked when an `ETHTOOL_SPFLAGS` command (or equivalent Netlink ethtool command) is used. It's a clean flow, really. The process begins when I invoke `SIOCETHTOOL` / `ETHTOOL_SPFLAGS` (or netlink ethtool), which eventually leads to the configuration setting.

Now, considering this patch series and its broader implications, this area looks ripe for fuzzing. The patch series focuses on refactoring bit manipulation throughout various drivers using `assign_bit` and `__assign_bit`. While the majority of the drivers targeted are likely dealing with physical hardware (PCIe, ASICs, etc.), the slcan driver is a virtual driver that uses the standard TTY line discipline (N_SLCAN) operating over a TTY device. This is a critical distinction because it's fully accessible in virtualized environments, without needing any physical hardware. This is a key reason I want to check it.

The interesting thing is that the modified function `slcan_enable_err_rst_on_open()` is reachable via the standard ethtool private flag ioctl or netlink requests, so it's relatively easy to interact with. So, my conclusion:

*   **WorthFuzzing**: *True* (Absolutely, this is worth exploring in detail)
*   **Reasoning**: This patch series refactors bit manipulation across drivers, and this specific driver is easily accessible in virtualized environments. I can trigger a function via standard ethtool methods, giving me a chance to analyze changes that may have subtle security implications.
*   **FocusSymbols**: `slcan_enable_err_rst_on_open`, `slcan_set_priv_flags` (These are the critical functions to observe)
*   **EnableConfigs**: `CAN`, `CAN_DEV`, `CAN_SLCAN`, `TTY` (These are the configurations I'll need to enable)



59/2 2026/09/19 12:34 tool set-results
0m Args:
{
  "EnableConfigs": [
    "CAN",
    "CAN_DEV",
    "CAN_SLCAN",
    "TTY"
  ],
  "FocusSymbols": [
    "slcan_enable_err_rst_on_open",
    "slcan_set_priv_flags"
  ],
  "Reasoning": "The patch series refactors bit manipulation across various drivers to use assign_bit() and __assign_bit(). While many of the drivers modified correspond to physical PCIe or SoC network hardware, drivers/net/can/slcan/slcan-core.c implements the serial line CAN (slcan) network driver, which is a software line discipline (N_SLCAN) operating over standard TTY devices (e.g., ptys) and is fully accessible in standard virtualized fuzzing environments without physical hardware. The modified function slcan_enable_err_rst_on_open() is reachable via ethtool private flags configuration (SIOCETHTOOL/ETHTOOL_SPFLAGS or netlink).",
  "WorthFuzzing": true
}

Results:
{
  "EnableConfigs": [
    "CAN",
    "CAN_DEV",
    "CAN_SLCAN",
    "TTY"
  ],
  "FocusSymbols": [
    "slcan_enable_err_rst_on_open",
    "slcan_set_priv_flags"
  ],
  "Reasoning": "The patch series refactors bit manipulation across various drivers to use assign_bit() and __assign_bit(). While many of the drivers modified correspond to physical PCIe or SoC network hardware, drivers/net/can/slcan/slcan-core.c implements the serial line CAN (slcan) network driver, which is a software line discipline (N_SLCAN) operating over standard TTY devices (e.g., ptys) and is fully accessible in standard virtualized fuzzing environments without physical hardware. The modified function slcan_enable_err_rst_on_open() is reachable via ethtool private flags configuration (SIOCETHTOOL/ETHTOOL_SPFLAGS or netlink).",
  "WorthFuzzing": true
}

60/1 2026/09/19 12:34 action If
0m Args:
{
  "WorthFuzzing": true
}

Results:
null

61/2 2026/09/19 12:34 agent kmsan-evaluator
0m Model:
core

Args:
null

Results:
{
  "KMSANReasoning": "The patch series is a mechanical refactoring across network and wireless drivers that replaces redundant 'if (cond) set_bit(...) else clear_bit(...)' (and non-atomic '__set_bit'/'__clear_bit') constructs with the standard 'assign_bit()' and '__assign_bit()' helpers. The patch introduces no memory allocations, does not touch struct initialization or padding, does not modify any data copied to user space, and does not alter control flow or buffer sizing logic. Since no uninitialized memory access or information leak risks are introduced or exposed, dedicated KMSAN fuzzing 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:
Target architecture: amd64

For your convenience, here is the diff of the changes:
commit d24fd365870a2b5506e113bac6e455768ec38f77
Author: syz-cluster <triage@syzkaller.com>
Date:   Sat Sep 19 12:30:32 2026 +0000

    syz-cluster: applied patch under review

diff --git a/drivers/net/can/slcan/slcan-core.c b/drivers/net/can/slcan/slcan-core.c
index 7439849d5c840..c9414faafe664 100644
--- a/drivers/net/can/slcan/slcan-core.c
+++ b/drivers/net/can/slcan/slcan-core.c
@@ -131,10 +131,7 @@ int slcan_enable_err_rst_on_open(struct net_device *ndev, bool on)
 	if (netif_running(ndev))
 		return -EBUSY;
 
-	if (on)
-		set_bit(CF_ERR_RST, &sl->cmd_flags);
-	else
-		clear_bit(CF_ERR_RST, &sl->cmd_flags);
+	assign_bit(CF_ERR_RST, &sl->cmd_flags, on);
 
 	return 0;
 }
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
index 12770af031eb8..c56587384d573 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
@@ -1202,10 +1202,7 @@ static int __xgbe_phy_config_aneg(struct xgbe_prv_data *pdata, bool set_mode)
 	xgbe_an_restart(pdata);
 
 out:
-	if (ret)
-		set_bit(XGBE_LINK_ERR, &pdata->dev_state);
-	else
-		clear_bit(XGBE_LINK_ERR, &pdata->dev_state);
+	assign_bit(XGBE_LINK_ERR, &pdata->dev_state, ret);
 
 	mutex_unlock(&pdata->an_mutex);
 
diff --git a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
index 01792f7abf962..42e0fe9248f28 100644
--- a/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
+++ b/drivers/net/ethernet/aquantia/atlantic/aq_nic.c
@@ -1717,10 +1717,7 @@ int aq_nic_setup_tc_min_rate(struct aq_nic_s *self, const unsigned int tc,
 	if (tc >= AQ_CFG_TCS_MAX)
 		return -EINVAL;
 
-	if (min_rate)
-		set_bit(tc, &cfg->tc_min_rate_msk);
-	else
-		clear_bit(tc, &cfg->tc_min_rate_msk);
+	assign_bit(tc, &cfg->tc_min_rate_msk, min_rate);
 
 	if (min_rate && min_rate < 20) {
 		netdev_warn(self->ndev,
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
index b8af508f9c985..b337e61f9c81c 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_sriov.c
@@ -207,10 +207,7 @@ void bnx2x_vfop_qctor_prep(struct bnx2x *bp,
 	 */
 	__set_bit(BNX2X_Q_FLG_TX_SWITCH, &setup_p->flags);
 	__set_bit(BNX2X_Q_FLG_TX_SEC, &setup_p->flags);
-	if (vf->spoofchk)
-		__set_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags);
-	else
-		__clear_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags);
+	__assign_bit(BNX2X_Q_FLG_ANTI_SPOOF, &setup_p->flags, vf->spoofchk);
 
 	/* Setup-op rx parameters */
 	if (test_bit(BNX2X_Q_TYPE_HAS_RX, &q_type)) {
@@ -2370,12 +2367,8 @@ static int bnx2x_set_pf_tx_switching(struct bnx2x *bp, bool enable)
 	q_params.cmd = BNX2X_Q_CMD_UPDATE;
 	__set_bit(BNX2X_Q_UPDATE_TX_SWITCHING_CHNG,
 		  &q_params.params.update.update_flags);
-	if (enable)
-		__set_bit(BNX2X_Q_UPDATE_TX_SWITCHING,
-			  &q_params.params.update.update_flags);
-	else
-		__clear_bit(BNX2X_Q_UPDATE_TX_SWITCHING,
-			    &q_params.params.update.update_flags);
+	__assign_bit(BNX2X_Q_UPDATE_TX_SWITCHING,
+		     &q_params.params.update.update_flags, enable);
 
 	/* send the ramrod on all the queues of the PF */
 	for_each_eth_queue(bp, i) {
@@ -2764,10 +2757,7 @@ static void bnx2x_set_vf_vlan_acceptance(struct bnx2x *bp,
 
 	/* need to remove/add the VF's accept_any_vlan bit */
 	accept_flags = bnx2x_leading_vfq(vf, accept_flags);
-	if (accept)
-		set_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags);
-	else
-		clear_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags);
+	assign_bit(BNX2X_ACCEPT_ANY_VLAN, &accept_flags, accept);
 
 	bnx2x_vf_prep_rx_mode(bp, LEADING_IDX, &rx_ramrod, vf,
 			      accept_flags);
diff --git a/drivers/net/ethernet/freescale/enetc/enetc.c b/drivers/net/ethernet/freescale/enetc/enetc.c
index 04c49b680709e..c6571b5cc8425 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc.c
@@ -88,10 +88,7 @@ void enetc_set_congestion_mode(struct enetc_ndev_priv *priv, bool enable)
 
 	spin_lock(&si->gen_lock);
 
-	if (enable)
-		set_bit(ENETC_RXBDR_CM, &priv->flags);
-	else
-		clear_bit(ENETC_RXBDR_CM, &priv->flags);
+	assign_bit(ENETC_RXBDR_CM, &priv->flags, enable);
 
 	for (int i = 0; i < priv->num_rx_rings; i++) {
 		u32 old_rbmr = enetc_rxbdr_rd(hw, i, ENETC_RBMR);
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
index e7318f2363157..7b92a3c73ef6d 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3_ethtool.c
@@ -474,10 +474,7 @@ static void hns3_update_limit_promisc_mode(struct net_device *netdev,
 {
 	struct hnae3_handle *handle = hns3_get_handle(netdev);
 
-	if (enable)
-		set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
-	else
-		clear_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
+	assign_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags, enable);
 
 	hns3_request_update_promisc_mode(handle);
 }
@@ -1210,10 +1207,7 @@ static int hns3_set_tx_push(struct net_device *netdev, u32 tx_push)
 	netdev_dbg(netdev, "Changing tx push from %s to %s\n",
 		   str_on_off(old_state), str_on_off(tx_push));
 
-	if (tx_push)
-		set_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state);
-	else
-		clear_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state);
+	assign_bit(HNS3_NIC_STATE_TX_PUSH_ENABLE, &priv->state, tx_push);
 
 	return 0;
 }
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
index 30e38cb4843ac..08040a4929855 100644
--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
+++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_mbx.c
@@ -341,11 +341,8 @@ static void hclge_set_vf_promisc_mode(struct hclge_vport *vport,
 	vport->vf_info.request_mc_en = req->msg.en_mc;
 	vport->vf_info.request_bc_en = req->msg.en_bc;
 
-	if (req->msg.en_limit_promisc)
-		set_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags);
-	else
-		clear_bit(HNAE3_PFLAG_LIMIT_PROMISC,
-			  &handle->priv_flags);
+	assign_bit(HNAE3_PFLAG_LIMIT_PROMISC, &handle->priv_flags,
+		   req->msg.en_limit_promisc);
 
 	set_bit(HCLGE_VPORT_STATE_PROMISC_CHANGE, &vport->state);
 	hclge_task_schedule(hdev, 0);
diff --git a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
index ef9d1e78c16a2..6a992df06fa11 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_ethtool.c
@@ -5263,10 +5263,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
 		    test_bit(priv_flag->bitno, orig_flags) != new_val)
 			return -EOPNOTSUPP;
 
-		if (new_val)
-			set_bit(priv_flag->bitno, new_flags);
-		else
-			clear_bit(priv_flag->bitno, new_flags);
+		assign_bit(priv_flag->bitno, new_flags, new_val);
 	}
 
 	if (pf->hw.pf_id != 0)
@@ -5284,10 +5281,7 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
 		    test_bit(priv_flag->bitno, orig_flags) != new_val)
 			return -EOPNOTSUPP;
 
-		if (new_val)
-			set_bit(priv_flag->bitno, new_flags);
-		else
-			clear_bit(priv_flag->bitno, new_flags);
+		assign_bit(priv_flag->bitno, new_flags, new_val);
 	}
 
 flags_complete:
diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index a26c3d47ec156..0087f7ae0c4c0 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -1158,10 +1158,7 @@ static int i40e_alloc_vf_res(struct i40e_vf *vf)
 		pf->queues_left -=
 			total_queue_pairs - I40E_DEFAULT_QUEUES_PER_VF;
 
-	if (vf->trusted)
-		set_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps);
-	else
-		clear_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps);
+	assign_bit(I40E_VIRTCHNL_VF_CAP_PRIVILEGE, &vf->vf_caps, vf->trusted);
 
 	/* store the total qps number for the runtime
 	 * VF req validation
diff --git a/drivers/net/ethernet/intel/ice/ice_ethtool.c b/drivers/net/ethernet/intel/ice/ice_ethtool.c
index bf9a821c543b7..51388ec05a906 100644
--- a/drivers/net/ethernet/intel/ice/ice_ethtool.c
+++ b/drivers/net/ethernet/intel/ice/ice_ethtool.c
@@ -1751,10 +1751,7 @@ static int ice_set_priv_flags(struct net_device *netdev, u32 flags)
 
 		priv_flag = &ice_gstrings_priv_flags[i];
 
-		if (flags & BIT(i))
-			set_bit(priv_flag->bitno, pf->flags);
-		else
-			clear_bit(priv_flag->bitno, pf->flags);
+		assign_bit(priv_flag->bitno, pf->flags, flags & BIT(i));
 	}
 
 	bitmap_xor(change_flags, pf->flags, orig_flags, ICE_PF_FLAGS_NBITS);
diff --git a/drivers/net/ethernet/intel/ice/ice_txclk.c b/drivers/net/ethernet/intel/ice/ice_txclk.c
index 48459f971cbf9..3bca4443f03ab 100644
--- a/drivers/net/ethernet/intel/ice/ice_txclk.c
+++ b/drivers/net/ethernet/intel/ice/ice_txclk.c
@@ -286,12 +286,9 @@ void ice_txclk_update_and_notify(struct ice_pf *pf)
 			if (ctrl_pf != pf)
 				mutex_lock(&ctrl_pf->dplls.lock);
 			for (int i = 0; i < ICE_REF_CLK_MAX; i++) {
-				if (clk == i)
-					set_bit(ptp_port->port_num,
-						&ctrl_pf->ptp.tx_refclks[phy][i]);
-				else
-					clear_bit(ptp_port->port_num,
-						  &ctrl_pf->ptp.tx_refclks[phy][i]);
+				assign_bit(ptp_port->port_num,
+					   &ctrl_pf->ptp.tx_refclks[phy][i],
+					   clk == i);
 			}
 			if (ctrl_pf != pf)
 				mutex_unlock(&ctrl_pf->dplls.lock);
@@ -315,13 +312,10 @@ void ice_txclk_update_and_notify(struct ice_pf *pf)
 	 */
 	if (ctrl_pf != pf)
 		mutex_lock(&ctrl_pf->dplls.lock);
-	for (int i = 0; i < ICE_REF_CLK_MAX; i++)
-		if (clk == i)
-			set_bit(ptp_port->port_num,
-				&ctrl_pf->ptp.tx_refclks[phy][i]);
-		else
-			clear_bit(ptp_port->port_num,
-				  &ctrl_pf->ptp.tx_refclks[phy][i]);
+	for (int i = 0; i < ICE_REF_CLK_MAX; i++) {
+		assign_bit(ptp_port->port_num,
+			   &ctrl_pf->ptp.tx_refclks[phy][i], clk == i);
+	}
 	if (ctrl_pf != pf)
 		mutex_unlock(&ctrl_pf->dplls.lock);
 
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
index 8ced44a4495e8..ade394c2beba0 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cgx.c
@@ -981,15 +981,9 @@ int verify_lmac_fc_cfg(void *cgxd, int lmac_id, u8 tx_pause, u8 rx_pause,
 	if (!lmac)
 		return -ENODEV;
 
-	if (!rx_pause)
-		clear_bit(pfvf_idx, lmac->rx_fc_pfvf_bmap.bmap);
-	else
-		set_bit(pfvf_idx, lmac->rx_fc_pfvf_bmap.bmap);
+	assign_bit(pfvf_idx, lmac->rx_fc_pfvf_bmap.bmap, rx_pause);
 
-	if (!tx_pause)
-		clear_bit(pfvf_idx, lmac->tx_fc_pfvf_bmap.bmap);
-	else
-		set_bit(pfvf_idx, lmac->tx_fc_pfvf_bmap.bmap);
+	assign_bit(pfvf_idx, lmac->tx_fc_pfvf_bmap.bmap, tx_pause);
 
 	/* check if other pfvfs are using flow control */
 	if (!rx_pause && bitmap_weight(lmac->rx_fc_pfvf_bmap.bmap, lmac->rx_fc_pfvf_bmap.max)) {
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
index 2b67671a2bd8e..7c829b1da3e52 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/cn20k/npc.c
@@ -857,10 +857,7 @@ npc_cn20k_enable_mcam_entry(struct rvu *rvu, int blkaddr,
 	}
 
 update_en_map:
-	if (enable)
-		set_bit(index, npc_priv->en_map);
-	else
-		clear_bit(index, npc_priv->en_map);
+	assign_bit(index, npc_priv->en_map, enable);
 
 	return 0;
 }
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
index d80d2c00bd843..93c5c4b298bf2 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
@@ -1233,28 +1233,19 @@ static int rvu_nix_blk_aq_enq_inst(struct rvu *rvu, struct nix_hw *nix_hw,
 			ena = (req->rq.ena & req->rq_mask.ena) |
 				(test_bit(req->qidx, pfvf->rq_bmap) &
 				~req->rq_mask.ena);
-			if (ena)
-				__set_bit(req->qidx, pfvf->rq_bmap);
-			else
-				__clear_bit(req->qidx, pfvf->rq_bmap);
+			__assign_bit(req->qidx, pfvf->rq_bmap, ena);
 		}
 		if (req->ctype == NIX_AQ_CTYPE_SQ) {
 			ena = (req->rq.ena & req->sq_mask.ena) |
 				(test_bit(req->qidx, pfvf->sq_bmap) &
 				~req->sq_mask.ena);
-			if (ena)
-				__set_bit(req->qidx, pfvf->sq_bmap);
-			else
-				__clear_bit(req->qidx, pfvf->sq_bmap);
+			__assign_bit(req->qidx, pfvf->sq_bmap, ena);
 		}
 		if (req->ctype == NIX_AQ_CTYPE_CQ) {
 			ena = (req->rq.ena & req->cq_mask.ena) |
 				(test_bit(req->qidx, pfvf->cq_bmap) &
 				~req->cq_mask.ena);
-			if (ena)
-				__set_bit(req->qidx, pfvf->cq_bmap);
-			else
-				__clear_bit(req->qidx, pfvf->cq_bmap);
+			__assign_bit(req->qidx, pfvf->cq_bmap, ena);
 		}
 	}
 
diff --git a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c
index e2a33e46b48ad..334dc3e888f48 100644
--- a/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c
+++ b/drivers/net/ethernet/marvell/octeontx2/af/rvu_npa.c
@@ -169,10 +169,7 @@ int rvu_npa_aq_enq_inst(struct rvu *rvu, struct npa_aq_enq_req *req,
 			ena = (req->aura.ena & req->aura_mask.ena) |
 				(test_bit(req->aura_id, pfvf->aura_bmap) &
 				~req->aura_mask.ena);
-			if (ena)
-				__set_bit(req->aura_id, pfvf->aura_bmap);
-			else
-				__clear_bit(req->aura_id, pfvf->aura_bmap);
+			__assign_bit(req->aura_id, pfvf->aura_bmap, ena);
 		}
 	}
 
@@ -184,10 +181,7 @@ int rvu_npa_aq_enq_inst(struct rvu *rvu, struct npa_aq_enq_req *req,
 			ena = (req->pool.ena & req->pool_mask.ena) |
 				(test_bit(req->aura_id, pfvf->pool_bmap) &
 				~req->pool_mask.ena);
-			if (ena)
-				__set_bit(req->aura_id, pfvf->pool_bmap);
-			else
-				__clear_bit(req->aura_id, pfvf->pool_bmap);
+			__assign_bit(req->aura_id, pfvf->pool_bmap, ena);
 		}
 	}
 	spin_unlock(&aq->lock);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
index 3ed59ced0407a..261c466a4d362 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
@@ -2320,10 +2320,8 @@ static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
 
 	for (i = 0; i < channels->num; i++) {
 		c = channels->c[i];
-		if (enable)
-			__set_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state);
-		else
-			__clear_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state);
+		__assign_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state,
+			     enable);
 	}
 
 	return 0;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c b/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
index 07440c58713a7..7c0585fe1ee7a 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fw_reset.c
@@ -66,10 +66,8 @@ static int mlx5_fw_reset_enable_remote_dev_reset_set(struct devlink *devlink, u3
 
 	fw_reset = dev->priv.fw_reset;
 
-	if (ctx->val.vbool)
-		clear_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, &fw_reset->reset_flags);
-	else
-		set_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST, &fw_reset->reset_flags);
+	assign_bit(MLX5_FW_RESET_FLAGS_NACK_RESET_REQUEST,
+		   &fw_reset->reset_flags, !ctx->val.vbool);
 	return 0;
 }
 
diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c b/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c
index bc0f38b6a2b2b..ab6e342ec3fa4 100644
--- a/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c
+++ b/drivers/net/ethernet/meta/fbnic/fbnic_rpc.c
@@ -126,12 +126,8 @@ void fbnic_bmc_rpc_all_multi_config(struct fbnic_dev *fbd,
 			set_bit(FBNIC_MAC_ADDR_T_BMC, mac_addr->act_tcam);
 			mac_addr->state = FBNIC_TCAM_S_ADD;
 		}
-		if (enable_host)
-			set_bit(FBNIC_MAC_ADDR_T_ALLMULTI,
-				mac_addr->act_tcam);
-		else
-			clear_bit(FBNIC_MAC_ADDR_T_ALLMULTI,
-				  mac_addr->act_tcam);
+		assign_bit(FBNIC_MAC_ADDR_T_ALLMULTI, mac_addr->act_tcam,
+			   enable_host);
 	} else {
 		__fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_BMC);
 		__fbnic_xc_unsync(mac_addr, FBNIC_MAC_ADDR_T_ALLMULTI);
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
index fc8c50e8f3651..119ac720c0787 100644
--- a/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
+++ b/drivers/net/ethernet/pensando/ionic/ionic_ethtool.c
@@ -655,15 +655,9 @@ static int ionic_cmb_rings_toggle(struct ionic_lif *lif, bool cmb_tx, bool cmb_r
 	if (pages_used < 0)
 		return pages_used;
 
-	if (cmb_tx)
-		set_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state);
-	else
-		clear_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state);
+	assign_bit(IONIC_LIF_F_CMB_TX_RINGS, lif->state, cmb_tx);
 
-	if (cmb_rx)
-		set_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state);
-	else
-		clear_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state);
+	assign_bit(IONIC_LIF_F_CMB_RX_RINGS, lif->state, cmb_rx);
 
 	if (cmb_tx || cmb_rx)
 		netdev_info(lif->netdev, "Enabling CMB %s %s rings - %d pages\n",
diff --git a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
index 647f30a16a94d..037882a34203b 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
@@ -492,10 +492,8 @@ static int qede_set_priv_flags(struct net_device *dev, u32 flags)
 	if (dflags & ~BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR))
 		return -EINVAL;
 
-	if (flags & BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR))
-		set_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags);
-	else
-		clear_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags);
+	assign_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags,
+		   flags & BIT(QEDE_PRI_FLAG_RECOVER_ON_ERROR));
 
 	return 0;
 }
diff --git a/drivers/net/ethernet/qlogic/qla3xxx.c b/drivers/net/ethernet/qlogic/qla3xxx.c
index 776840f60d01d..1466ec85de247 100644
--- a/drivers/net/ethernet/qlogic/qla3xxx.c
+++ b/drivers/net/ethernet/qlogic/qla3xxx.c
@@ -1581,10 +1581,8 @@ static void ql_link_state_machine_work(struct work_struct *work)
  */
 static void ql_get_phy_owner(struct ql3_adapter *qdev)
 {
-	if (ql_this_adapter_controls_port(qdev))
-		set_bit(QL_LINK_MASTER, &qdev->flags);
-	else
-		clear_bit(QL_LINK_MASTER, &qdev->flags);
+	assign_bit(QL_LINK_MASTER, &qdev->flags,
+		   ql_this_adapter_controls_port(qdev));
 }
 
 /*
@@ -3343,10 +3341,8 @@ static void ql_set_mac_info(struct ql3_adapter *qdev)
 		qdev->mac_ob_opcode = OUTBOUND_MAC_IOCB | func_number;
 		qdev->mb_bit_mask = FN0_MA_BITS_MASK;
 		qdev->PHYAddr = PORT0_PHY_ADDRESS;
-		if (port_status & PORT_STATUS_SM0)
-			set_bit(QL_LINK_OPTICAL, &qdev->flags);
-		else
-			clear_bit(QL_LINK_OPTICAL, &qdev->flags);
+		assign_bit(QL_LINK_OPTICAL, &qdev->flags,
+			   port_status & PORT_STATUS_SM0);
 		break;
 
 	case ISP_CONTROL_FN1_NET:
@@ -3354,10 +3350,8 @@ static void ql_set_mac_info(struct ql3_adapter *qdev)
 		qdev->mac_ob_opcode = OUTBOUND_MAC_IOCB | func_number;
 		qdev->mb_bit_mask = FN1_MA_BITS_MASK;
 		qdev->PHYAddr = PORT1_PHY_ADDRESS;
-		if (port_status & PORT_STATUS_SM1)
-			set_bit(QL_LINK_OPTICAL, &qdev->flags);
-		else
-			clear_bit(QL_LINK_OPTICAL, &qdev->flags);
+		assign_bit(QL_LINK_OPTICAL, &qdev->flags,
+			   port_status & PORT_STATUS_SM1);
 		break;
 
 	case ISP_CONTROL_FN0_SCSI:
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c
index 576340315e0db..ef4a0376bafff 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c
@@ -644,10 +644,7 @@ static void qlcnic_83xx_dcb_aen_handler(struct qlcnic_dcb *dcb, void *data)
 	if (test_and_set_bit(QLCNIC_DCB_AEN_MODE, &dcb->state))
 		return;
 
-	if (*val & BIT_8)
-		set_bit(QLCNIC_DCB_STATE, &dcb->state);
-	else
-		clear_bit(QLCNIC_DCB_STATE, &dcb->state);
+	assign_bit(QLCNIC_DCB_STATE, &dcb->state, *val & BIT_8);
 
 	queue_delayed_work(dcb->wq, &dcb->aen_work, 0);
 }
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
index 0704dbc52d822..a106f961e177b 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_common.c
@@ -1488,10 +1488,8 @@ static int qlcnic_sriov_channel_cfg_cmd(struct qlcnic_adapter *adapter, u8 cmd_o
 		goto out;
 	}
 
-	if (cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
-		set_bit(QLC_BC_VF_STATE, &vf->state);
-	else
-		clear_bit(QLC_BC_VF_STATE, &vf->state);
+	assign_bit(QLC_BC_VF_STATE, &vf->state,
+		   cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT);
 
 out:
 	qlcnic_free_mbx_args(&cmd);
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
index 7052d34aad459..c69b41e317d26 100644
--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
+++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_sriov_pf.c
@@ -773,10 +773,8 @@ static int qlcnic_sriov_pf_channel_cfg_cmd(struct qlcnic_bc_trans *trans,
 
 	cmd->rsp.arg[0] |= (1 << 25);
 
-	if (trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT)
-		set_bit(QLC_BC_VF_STATE, &vf->state);
-	else
-		clear_bit(QLC_BC_VF_STATE, &vf->state);
+	assign_bit(QLC_BC_VF_STATE, &vf->state,
+		   trans->req_hdr->cmd_op == QLCNIC_BC_CMD_CHANNEL_INIT);
 
 	return err;
 
diff --git a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
index 4708e7f3958f7..ea6865b23f5fc 100644
--- a/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
+++ b/drivers/net/ethernet/wangxun/libwx/wx_ptp.c
@@ -450,10 +450,7 @@ static int wx_ptp_feature_enable(struct ptp_clock_info *ptp,
 		wx->pps_width = 120000000;
 	}
 
-	if (on)
-		set_bit(WX_FLAG_PTP_PPS_ENABLED, wx->flags);
-	else
-		clear_bit(WX_FLAG_PTP_PPS_ENABLED, wx->flags);
+	assign_bit(WX_FLAG_PTP_PPS_ENABLED, wx->flags, on);
 
 	return wx->ptp_setup_sdp(wx);
 }
diff --git a/drivers/net/phy/mediatek/mtk-phy-lib.c b/drivers/net/phy/mediatek/mtk-phy-lib.c
index 608072fbfde97..4c4eca870bde1 100644
--- a/drivers/net/phy/mediatek/mtk-phy-lib.c
+++ b/drivers/net/phy/mediatek/mtk-phy-lib.c
@@ -136,22 +136,15 @@ int mtk_phy_led_hw_ctrl_get(struct phy_device *phydev, u8 index,
 	if (blink < 0)
 		return -EIO;
 
-	if ((on & (on_set | MTK_PHY_LED_ON_FDX |
-		   MTK_PHY_LED_ON_HDX | MTK_PHY_LED_ON_LINKDOWN)) ||
-	    (blink & (rx_blink_set | tx_blink_set)))
-		set_bit(bit_netdev, &priv->led_state);
-	else
-		clear_bit(bit_netdev, &priv->led_state);
+	assign_bit(bit_netdev, &priv->led_state,
+		   (on & (on_set | MTK_PHY_LED_ON_FDX | MTK_PHY_LED_ON_HDX |
+		    MTK_PHY_LED_ON_LINKDOWN)) ||
+		    (blink & (rx_blink_set | tx_blink_set)));
 
-	if (on & MTK_PHY_LED_ON_FORCE_ON)
-		set_bit(bit_on, &priv->led_state);
-	else
-		clear_bit(bit_on, &priv->led_state);
+	assign_bit(bit_on, &priv->led_state, on & MTK_PHY_LED_ON_FORCE_ON);
 
-	if (blink & MTK_PHY_LED_BLINK_FORCE_BLINK)
-		set_bit(bit_blink, &priv->led_state);
-	else
-		clear_bit(bit_blink, &priv->led_state);
+	assign_bit(bit_blink, &priv->led_state,
+		   blink & MTK_PHY_LED_BLINK_FORCE_BLINK);
 
 	if (!rules)
 		return 0;
@@ -254,10 +247,7 @@ int mtk_phy_led_hw_ctrl_set(struct phy_device *phydev, u8 index,
 		}
 	}
 
-	if (blink || on)
-		set_bit(bit_netdev, &priv->led_state);
-	else
-		clear_bit(bit_netdev, &priv->led_state);
+	assign_bit(bit_netdev, &priv->led_state, blink || on);
 
 	ret = phy_modify_mmd(phydev, MDIO_MMD_VEND2, index ?
 			     MTK_PHY_LED1_ON_CTRL : MTK_PHY_LED0_ON_CTRL,
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index fb61e53ff4c34..e11eb7a6cdf26 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -2004,10 +2004,7 @@ static ssize_t ath10k_write_btcoex(struct file *file,
 		ath10k_core_start_recovery(ar);
 	}
 
-	if (val)
-		set_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
-	else
-		clear_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags);
+	assign_bit(ATH10K_FLAG_BTCOEX, &ar->dev_flags, val);
 
 	ret = count;
 
@@ -2118,10 +2115,7 @@ static ssize_t ath10k_write_peer_stats(struct file *file,
 		goto exit;
 	}
 
-	if (val)
-		set_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
-	else
-		clear_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
+	assign_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags, val);
 
 	ath10k_info(ar, "restarting firmware due to Peer stats change");
 
diff --git a/drivers/net/wireless/ath/ath10k/snoc.c b/drivers/net/wireless/ath/ath10k/snoc.c
index 8de133fe2a72f..8f171ab6f4de8 100644
--- a/drivers/net/wireless/ath/ath10k/snoc.c
+++ b/drivers/net/wireless/ath/ath10k/snoc.c
@@ -1532,10 +1532,8 @@ static int ath10k_snoc_modem_notify(struct notifier_block *nb, unsigned long act
 	case QCOM_SSR_BEFORE_SHUTDOWN:
 		ath10k_dbg(ar, ATH10K_DBG_SNOC, "received modem %s event\n",
 			   notify_data->crashed ? "crashed" : "stopping");
-		if (!notify_data->crashed)
-			set_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, &ar_snoc->flags);
-		else
-			clear_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, &ar_snoc->flags);
+		assign_bit(ATH10K_SNOC_FLAG_MODEM_STOPPED, &ar_snoc->flags,
+			   !notify_data->crashed);
 		break;
 
 	case QCOM_SSR_AFTER_SHUTDOWN:
diff --git a/drivers/net/wireless/ath/ath11k/htc.c b/drivers/net/wireless/ath/ath11k/htc.c
index 5f9ee5e633da8..07fc959ed74c9 100644
--- a/drivers/net/wireless/ath/ath11k/htc.c
+++ b/drivers/net/wireless/ath/ath11k/htc.c
@@ -244,10 +244,7 @@ static void ath11k_htc_suspend_complete(struct ath11k_base *ab, bool ack)
 {
 	ath11k_dbg(ab, ATH11K_DBG_BOOT, "suspend complete %d\n", ack);
 
-	if (ack)
-		set_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
-	else
-		clear_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
+	assign_bit(ATH11K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags, ack);
 
 	complete(&ab->htc_suspend);
 }
diff --git a/drivers/net/wireless/ath/ath12k/htc.c b/drivers/net/wireless/ath/ath12k/htc.c
index 92138caa2a82f..7227bed91ade7 100644
--- a/drivers/net/wireless/ath/ath12k/htc.c
+++ b/drivers/net/wireless/ath/ath12k/htc.c
@@ -236,10 +236,7 @@ static void ath12k_htc_suspend_complete(struct ath12k_base *ab, bool ack)
 {
 	ath12k_dbg(ab, ATH12K_DBG_BOOT, "boot suspend complete %d\n", ack);
 
-	if (ack)
-		set_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
-	else
-		clear_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags);
+	assign_bit(ATH12K_FLAG_HTC_SUSPEND_COMPLETE, &ab->dev_flags, ack);
 
 	complete(&ab->htc_suspend);
 }
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
index 2224cb74b1d41..5ea18c87e12ee 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
@@ -968,10 +968,7 @@ static void ar9003_hw_tx_iq_cal_outlier_detection(struct ath_hw *ah,
 		      AR_PHY_RX_IQCAL_CORR_B0_LOOPBACK_IQCORR_EN, 0x1);
 
 	if (caldata) {
-		if (is_reusable)
-			set_bit(TXIQCAL_DONE, &caldata->cal_flags);
-		else
-			clear_bit(TXIQCAL_DONE, &caldata->cal_flags);
+		assign_bit(TXIQCAL_DONE, &caldata->cal_flags, is_reusable);
 	}
 
 	return;
diff --git a/drivers/net/wireless/ath/ath9k/mci.c b/drivers/net/wireless/ath/ath9k/mci.c
index f82bb23499284..62ad761d6a765 100644
--- a/drivers/net/wireless/ath/ath9k/mci.c
+++ b/drivers/net/wireless/ath/ath9k/mci.c
@@ -348,10 +348,7 @@ static u8 ath_mci_process_status(struct ath_softc *sc,
 	if (status->conn_handle >= ATH_MCI_MAX_PROFILE)
 		return 0;
 
-	if (status->is_critical)
-		__set_bit(status->conn_handle, mci->status);
-	else
-		__clear_bit(status->conn_handle, mci->status);
+	__assign_bit(status->conn_handle, mci->status, status->is_critical);
 
 	mci->num_mgmt = 0;
 	do {
diff --git a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
index 2f925d22b9aa7..2c49f3b493bdb 100644
--- a/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c
@@ -2034,10 +2034,7 @@ int mt76_connac_mcu_sched_scan_enable(struct mt76_phy *phy,
 		.active = !enable,
 	};
 
-	if (enable)
-		set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
-	else
-		clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
+	assign_bit(MT76_HW_SCHED_SCANNING, &phy->state, enable);
 
 	return mt76_mcu_send_msg(phy->dev, MCU_CE_CMD(SCHED_SCAN_ENABLE),
 				 &req, sizeof(req), false);
diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
index fa29c486a4553..aeb017516186f 100644
--- a/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
+++ b/drivers/net/wireless/mediatek/mt76/mt7925/mcu.c
@@ -3467,10 +3467,7 @@ mt7925_mcu_sched_scan_enable(struct mt76_phy *phy,
 	req = (struct scan_sched_enable *)tlv;
 	req->active = !enable;
 
-	if (enable)
-		set_bit(MT76_HW_SCHED_SCANNING, &phy->state);
-	else
-		clear_bit(MT76_HW_SCHED_SCANNING, &phy->state);
+	assign_bit(MT76_HW_SCHED_SCANNING, &phy->state, enable);
 
 	return mt76_mcu_skb_send_msg(mdev, skb, MCU_UNI_CMD(SCAN_REQ),
 				     true);
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
index b67d69b01f879..3a10f1bbe0e0c 100644
--- a/drivers/net/wireless/realtek/rtw88/debug.c
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
@@ -1051,10 +1051,7 @@ static ssize_t rtw_debugfs_set_force_lowest_basic_rate(struct file *filp,
 	if (err)
 		return err;
 
-	if (input)
-		set_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags);
-	else
-		clear_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags);
+	assign_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags, input);
 
 	return count;
 }
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index 454d876aeb886..dacc2d889a467 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -7365,10 +7365,7 @@ void rtw89_core_rfkill_poll(struct rtw89_dev *rtwdev, bool force)
 	rtw89_info(rtwdev, "rfkill hardware state changed to %s\n",
 		   str_enable_disable(!blocked));
 
-	if (blocked)
-		set_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags);
-	else
-		clear_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags);
+	assign_bit(RTW89_FLAG_HW_RFKILL_STATE, rtwdev->flags, blocked);
 
 	wiphy_rfkill_set_hw_state(rtwdev->hw->wiphy, blocked);
 }
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index df396fbfca268..68da8908f14cf 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -6046,10 +6046,7 @@ rtw89_mac_c2h_pwr_int_notify(struct rtw89_dev *rtwdev, struct sk_buff *skb, u32
 		goto out;
 
 	rtwsta = rtwsta_link->rtwsta;
-	if (ps)
-		set_bit(RTW89_REMOTE_STA_IN_PS, rtwsta->flags);
-	else
-		clear_bit(RTW89_REMOTE_STA_IN_PS, rtwsta->flags);
+	assign_bit(RTW89_REMOTE_STA_IN_PS, rtwsta->flags, ps);
 
 	sta = rtwsta_to_sta(rtwsta);
 	ieee80211_sta_ps_transition(sta, ps);
@@ -7004,10 +7001,7 @@ void rtw89_mac_bf_monitor_calc(struct rtw89_dev *rtwdev,
 					  &data);
 
 	rtw89_debug(rtwdev, RTW89_DBG_BF, "bfee STA count=%d\n", data.count);
-	if (data.count)
-		set_bit(RTW89_FLAG_BFEE_MON, rtwdev->flags);
-	else
-		clear_bit(RTW89_FLAG_BFEE_MON, rtwdev->flags);
+	assign_bit(RTW89_FLAG_BFEE_MON, rtwdev->flags, data.count);
 }
 
 void _rtw89_mac_bf_monitor_track(struct rtw89_dev *rtwdev)
diff --git a/drivers/net/wireless/realtek/rtw89/regd.c b/drivers/net/wireless/realtek/rtw89/regd.c
index 14fab6b1a74a7..b9a5ce218b1da 100644
--- a/drivers/net/wireless/realtek/rtw89/regd.c
+++ b/drivers/net/wireless/realtek/rtw89/regd.c
@@ -421,10 +421,7 @@ static void __rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev, bool block,
 		return;
 	}
 
-	if (block)
-		set_bit(index, regulatory->block_6ghz);
-	else
-		clear_bit(index, regulatory->block_6ghz);
+	assign_bit(index, regulatory->block_6ghz, block);
 }
 
 static void rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev)
diff --git a/drivers/net/wireless/ti/wlcore/rx.c b/drivers/net/wireless/ti/wlcore/rx.c
index 307fab21050b7..4d6f5a0477828 100644
--- a/drivers/net/wireless/ti/wlcore/rx.c
+++ b/drivers/net/wireless/ti/wlcore/rx.c
@@ -316,10 +316,7 @@ int wl1271_rx_filter_enable(struct wl1271 *wl,
 		return ret;
 	}
 
-	if (enable)
-		__set_bit(index, wl->rx_filter_enabled);
-	else
-		__clear_bit(index, wl->rx_filter_enabled);
+	__assign_bit(index, wl->rx_filter_enabled, enable);
 
 	return 0;
 }

62/3 2026/09/19 12:34 llm kmsan-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 17677
							output: 18
							thoughts: 2088
						

Thoughts:
**KMSAN Fuzzing Evaluation of `assign_bit` Refactoring**

Alright, let's assess whether this patch series warrants a KMSAN fuzzing session. The core change is a refactoring, replacing conditional `set_bit`/`clear_bit` calls with a new `assign_bit` macro and its internal variant. The goal seems to be code clarity, by consolidating conditional bit setting and clearing into a single call. No functional change has been implemented.

My initial thought is that a KMSAN fuzzing session might not be strictly necessary, since no functionality is altered. The potential risk, if any, lies in incorrect replacement of the bit operations, not in the functionality itself. The code reviews would have to catch that.

I've reviewed the file list, and the uses of `assign_bit` and `__assign_bit` are widespread, predominantly in network device drivers. Based on a brief review of the call sites, this replacement appears straightforward. The affected calls all replace an `if-else` block where `set_bit` or `clear_bit` is called.

The `assign_bit` macro itself seems simple. It checks a boolean value and calls either `set_bit` or `clear_bit` accordingly. So if KMSAN is to be used, the interesting place to check would be the implementation of `assign_bit`, but it is also very simple. Given the simplicity of the macro, the numerous call sites, and the lack of fundamental functional change, I'm leaning toward the notion that a fuzzing session is likely overkill. Still, I should confirm the implementation and behavior using grepper, just to be absolutely sure.



63/3 2026/09/19 12:34 tool grepper
0m Args:
{
  "Expression": "define assign_bit"
}

Results:
{
  "Output": "include/linux/bitops.h=292=static inline unsigned int fns(unsigned long word, unsigned int n)\n--\ninclude/linux/bitops.h-305- */\ninclude/linux/bitops.h:306:#define assign_bit(nr, addr, value)\t\t\t\t\t\\\ninclude/linux/bitops.h-307-\t((value) ? set_bit((nr), (addr)) : clear_bit((nr), (addr)))\n"
}

64/3 2026/09/19 12:34 llm kmsan-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 20255
							output: 19
							thoughts: 60
						

Thoughts:
**My Analysis of Bit Assignment Functions**

Okay, so looking at this, it seems that `assign_bit` and `__assign_bit` are essentially just shorthand for a conditional bit manipulation. Specifically, they're functionally equivalent to using a ternary operator: if `value` is true (or non-zero, presumably), I'm setting bit `(nr)` at address `(addr)` using `set_bit`. Otherwise, if `value` is false (zero), I'm clearing the same bit using `clear_bit`. It's a clean, efficient way to express the conditional bit assignment, but nothing revolutionary.

I'd better just take a quick second to ensure that my assumption regarding `__assign_bit` holds water too, just to be sure. It would be a silly mistake to overlook an edge case.



65/3 2026/09/19 12:34 tool grepper
0m Args:
{
  "Expression": "define __assign_bit"
}

Results:
{
  "Output": "include/linux/bitops.h=292=static inline unsigned int fns(unsigned long word, unsigned int n)\n--\ninclude/linux/bitops.h-308-\ninclude/linux/bitops.h:309:#define __assign_bit(nr, addr, value)\t\t\t\t\t\\\ninclude/linux/bitops.h-310-\t((value) ? __set_bit((nr), (addr)) : __clear_bit((nr), (addr)))\n--\ninclude/trace/stages/stage6_event_callback.h-58-#undef __assign_bitmask\ninclude/trace/stages/stage6_event_callback.h:59:#define __assign_bitmask(dst, src, nr_bits)\t\t\t\t\t\\\ninclude/trace/stages/stage6_event_callback.h-60-\tmemcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))\n"
}

66/3 2026/09/19 12:34 llm kmsan-evaluator
0m Model:
gemini-3.8-flash

Args:
null

Results:
null

Tokens:
							input: 20744
							output: 150
							thoughts: 426
						

Thoughts:
**My Assessment of This Refactoring**

Okay, so this patch is a straightforward refactoring in the network drivers. It's just replacing those verbose `if (val) set_bit(...) else clear_bit(...)` patterns with the more concise `assign_bit()` and `__assign_bit()` macros. My immediate thought is, "does this introduce any risks related to uninitialized memory?" Given my understanding of the codebase and the nature of the change, I need to be thorough.

First, let's break it down: no new memory allocations are happening here. No changes to how data structures are initialized or zeroed. I'm not touching any `copy_to_user` calls or anything related to `ioctl` or `netlink` structures, which is critical. I haven't messed with any variables, buffers, or length calculations either. It's the *same* logic, just expressed differently, with the *same* bit operations being performed as before. Crucially, the same condition is being evaluated. I'm not reading any uninitialized memory because the original `if (condition)` was already ensuring that.

Therefore, after going through those points, the `NeedsKMSAN` flag is definitely `false`. My reasoning here is solid: it's a semantic refactoring, no new allocations, no changes to data structures or their initialization, no changes to user-space interactions, and no new control flow or uninitialized memory read paths. Any potential issues here are purely about bitmasks or flag operations, and that's the domain of standard functional testing or KASAN.

I've re-checked my logic against the checklist:

1.  Kernel structures sent to user space where fields or structure padding might not be fully initialized/zeroed: **Not Applicable**.
2.  Conditional logic or branching that depends on potentially uninitialized variables or struct fields: **Not Applicable**. The conditional logic remains the same, using the same variables as before.
3.  Allocation or initialization of complex data structures where uninitialized fields could be read later: **Not Applicable**. No new allocations or modifications to initialization.
4.  Bounds checks, lengths, or logic in a way that allows surrounding code to access uninitialized bytes: **Not Applicable**.

Alright, based on all that, I'm confident in calling `set-results`.



67/3 2026/09/19 12:35 tool set-results
0m Args:
{
  "KMSANReasoning": "The patch series is a mechanical refactoring across network and wireless drivers that replaces redundant 'if (cond) set_bit(...) else clear_bit(...)' (and non-atomic '__set_bit'/'__clear_bit') constructs with the standard 'assign_bit()' and '__assign_bit()' helpers. The patch introduces no memory allocations, does not touch struct initialization or padding, does not modify any data copied to user space, and does not alter control flow or buffer sizing logic. Since no uninitialized memory access or information leak risks are introduced or exposed, dedicated KMSAN fuzzing is not justified.",
  "NeedsKMSAN": false
}

Results:
{
  "KMSANReasoning": "The patch series is a mechanical refactoring across network and wireless drivers that replaces redundant 'if (cond) set_bit(...) else clear_bit(...)' (and non-atomic '__set_bit'/'__clear_bit') constructs with the standard 'assign_bit()' and '__assign_bit()' helpers. The patch introduces no memory allocations, does not touch struct initialization or padding, does not modify any data copied to user space, and does not alter control flow or buffer sizing logic. Since no uninitialized memory access or information leak risks are introduced or exposed, dedicated KMSAN fuzzing is not justified.",
  "NeedsKMSAN": false
}

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