| Seq | Timestamp | Type | Name | Duration |
|---|---|---|---|---|
| 0/0 | 2026/09/19 13:48 | flow | patch-triage |
0mArgs:null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"KMSANReasoning": "",
"NeedsKMSAN": false,
"Reasoning": "The patch modifies error handling paths in brcm_usb_phy_dvr_init() within the Broadcom STB USB PHY driver (drivers/phy/broadcom/phy-brcm-usb.c). This driver is an OF-only platform driver designed specifically for Broadcom Set-Top Box SoCs (ARCH_BRCMSTB / ARCH_BCMBCA). The underlying hardware is not present or emulated in standard virtualized environments (QEMU/GCE) on amd64, rendering this driver and the modified code structurally unreachable.",
"WorthFuzzing": false
} |
| 1/1 | 2026/09/19 13:48 | action | read-patch-diff |
0mArgs:null Results: {
"PatchDiff": "commit a19e3037fd2f1fad159f97021ed02491e75ece94\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate: Sat Sep 19 13:48:41 2026 +0000\n\n syz-cluster: applied patch under review\n\ndiff --git a/drivers/phy/broadcom/phy-brcm-usb.c b/drivers/phy/broadcom/phy-brcm-usb.c\nindex 59d756a10d6cb..8ef8aa025789f 100644\n--- a/drivers/phy/broadcom/phy-brcm-usb.c\n+++ b/drivers/phy/broadcom/phy-brcm-usb.c\n@@ -415,13 +415,14 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,\n \t}\n \terr = clk_prepare_enable(priv-\u003eusb_20_clk);\n \tif (err)\n-\t\treturn err;\n+\t\tgoto err_put_clks;\n \n \tif (priv-\u003ehas_eohci) {\n \t\tgphy = devm_phy_create(dev, NULL, \u0026brcm_usb_phy_ops);\n \t\tif (IS_ERR(gphy)) {\n \t\t\tdev_err(dev, \"failed to create EHCI/OHCI PHY\\n\");\n-\t\t\treturn PTR_ERR(gphy);\n+\t\t\terr = PTR_ERR(gphy);\n+\t\t\tgoto err_put_clks;\n \t\t}\n \t\tpriv-\u003ephys[BRCM_USB_PHY_2_0].phy = gphy;\n \t\tpriv-\u003ephys[BRCM_USB_PHY_2_0].id = BRCM_USB_PHY_2_0;\n@@ -432,7 +433,8 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,\n \t\tgphy = devm_phy_create(dev, NULL, \u0026brcm_usb_phy_ops);\n \t\tif (IS_ERR(gphy)) {\n \t\t\tdev_err(dev, \"failed to create XHCI PHY\\n\");\n-\t\t\treturn PTR_ERR(gphy);\n+\t\t\terr = PTR_ERR(gphy);\n+\t\t\tgoto err_put_clks;\n \t\t}\n \t\tpriv-\u003ephys[BRCM_USB_PHY_3_0].phy = gphy;\n \t\tpriv-\u003ephys[BRCM_USB_PHY_3_0].id = BRCM_USB_PHY_3_0;\n@@ -440,21 +442,25 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,\n \n \t\tpriv-\u003eusb_30_clk = of_clk_get_by_name(dn, \"sw_usb3\");\n \t\tif (IS_ERR(priv-\u003eusb_30_clk)) {\n-\t\t\tif (PTR_ERR(priv-\u003eusb_30_clk) == -EPROBE_DEFER)\n-\t\t\t\treturn -EPROBE_DEFER;\n+\t\t\tif (PTR_ERR(priv-\u003eusb_30_clk) == -EPROBE_DEFER) {\n+\t\t\t\terr = -EPROBE_DEFER;\n+\t\t\t\tgoto err_put_clks;\n+\t\t\t}\n \t\t\tdev_info(dev,\n \t\t\t\t \"USB3.0 clock not found in Device Tree\\n\");\n \t\t\tpriv-\u003eusb_30_clk = NULL;\n \t\t}\n \t\terr = clk_prepare_enable(priv-\u003eusb_30_clk);\n \t\tif (err)\n-\t\t\treturn err;\n+\t\t\tgoto err_put_clks;\n \t}\n \n \tpriv-\u003esuspend_clk = clk_get(dev, \"usb0_freerun\");\n \tif (IS_ERR(priv-\u003esuspend_clk)) {\n-\t\tif (PTR_ERR(priv-\u003esuspend_clk) == -EPROBE_DEFER)\n-\t\t\treturn -EPROBE_DEFER;\n+\t\tif (PTR_ERR(priv-\u003esuspend_clk) == -EPROBE_DEFER) {\n+\t\t\terr = -EPROBE_DEFER;\n+\t\t\tgoto err_put_clks;\n+\t\t}\n \t\tdev_err(dev, \"Suspend Clock not found in Device Tree\\n\");\n \t\tpriv-\u003esuspend_clk = NULL;\n \t}\n@@ -467,7 +473,7 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,\n \t\t\t\t brcm_usb_phy_wake_isr, 0,\n \t\t\t\t dev_name(dev), dev);\n \t\tif (err \u003c 0)\n-\t\t\treturn err;\n+\t\t\tgoto err_put_clks;\n \t\tdevice_set_wakeup_capable(dev, 1);\n \t} else {\n \t\tdev_info(dev,\n@@ -475,6 +481,10 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,\n \t}\n \n \treturn 0;\n+\n+err_put_clks:\n+\tclk_put(priv-\u003eusb_20_clk);\n+\treturn err;\n }\n \n static int brcm_usb_phy_probe(struct platform_device *pdev)\n"
} |
| 2/1 | 2026/09/19 13:48 | agent | patch-evaluator |
0mModel:core Args: null Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies error handling paths in brcm_usb_phy_dvr_init() within the Broadcom STB USB PHY driver (drivers/phy/broadcom/phy-brcm-usb.c). This driver is an OF-only platform driver designed specifically for Broadcom Set-Top Box SoCs (ARCH_BRCMSTB / ARCH_BCMBCA). The underlying hardware is not present or emulated in standard virtualized environments (QEMU/GCE) on amd64, rendering this driver and the modified code structurally unreachable.",
"WorthFuzzing": false
}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 a19e3037fd2f1fad159f97021ed02491e75ece94
Author: syz-cluster <triage@syzkaller.com>
Date: Sat Sep 19 13:48:41 2026 +0000
syz-cluster: applied patch under review
diff --git a/drivers/phy/broadcom/phy-brcm-usb.c b/drivers/phy/broadcom/phy-brcm-usb.c
index 59d756a10d6cb..8ef8aa025789f 100644
--- a/drivers/phy/broadcom/phy-brcm-usb.c
+++ b/drivers/phy/broadcom/phy-brcm-usb.c
@@ -415,13 +415,14 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,
}
err = clk_prepare_enable(priv->usb_20_clk);
if (err)
- return err;
+ goto err_put_clks;
if (priv->has_eohci) {
gphy = devm_phy_create(dev, NULL, &brcm_usb_phy_ops);
if (IS_ERR(gphy)) {
dev_err(dev, "failed to create EHCI/OHCI PHY\n");
- return PTR_ERR(gphy);
+ err = PTR_ERR(gphy);
+ goto err_put_clks;
}
priv->phys[BRCM_USB_PHY_2_0].phy = gphy;
priv->phys[BRCM_USB_PHY_2_0].id = BRCM_USB_PHY_2_0;
@@ -432,7 +433,8 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,
gphy = devm_phy_create(dev, NULL, &brcm_usb_phy_ops);
if (IS_ERR(gphy)) {
dev_err(dev, "failed to create XHCI PHY\n");
- return PTR_ERR(gphy);
+ err = PTR_ERR(gphy);
+ goto err_put_clks;
}
priv->phys[BRCM_USB_PHY_3_0].phy = gphy;
priv->phys[BRCM_USB_PHY_3_0].id = BRCM_USB_PHY_3_0;
@@ -440,21 +442,25 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,
priv->usb_30_clk = of_clk_get_by_name(dn, "sw_usb3");
if (IS_ERR(priv->usb_30_clk)) {
- if (PTR_ERR(priv->usb_30_clk) == -EPROBE_DEFER)
- return -EPROBE_DEFER;
+ if (PTR_ERR(priv->usb_30_clk) == -EPROBE_DEFER) {
+ err = -EPROBE_DEFER;
+ goto err_put_clks;
+ }
dev_info(dev,
"USB3.0 clock not found in Device Tree\n");
priv->usb_30_clk = NULL;
}
err = clk_prepare_enable(priv->usb_30_clk);
if (err)
- return err;
+ goto err_put_clks;
}
priv->suspend_clk = clk_get(dev, "usb0_freerun");
if (IS_ERR(priv->suspend_clk)) {
- if (PTR_ERR(priv->suspend_clk) == -EPROBE_DEFER)
- return -EPROBE_DEFER;
+ if (PTR_ERR(priv->suspend_clk) == -EPROBE_DEFER) {
+ err = -EPROBE_DEFER;
+ goto err_put_clks;
+ }
dev_err(dev, "Suspend Clock not found in Device Tree\n");
priv->suspend_clk = NULL;
}
@@ -467,7 +473,7 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,
brcm_usb_phy_wake_isr, 0,
dev_name(dev), dev);
if (err < 0)
- return err;
+ goto err_put_clks;
device_set_wakeup_capable(dev, 1);
} else {
dev_info(dev,
@@ -475,6 +481,10 @@ static int brcm_usb_phy_dvr_init(struct platform_device *pdev,
}
return 0;
+
+err_put_clks:
+ clk_put(priv->usb_20_clk);
+ return err;
}
static int brcm_usb_phy_probe(struct platform_device *pdev)
|
| 3/2 | 2026/09/19 13:48 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 3897 output: 32 thoughts: 97 Thoughts: **Analyzing a Broadcom USB PHY Patch** Okay, let's dive in. I need to understand this patch, starting with the context. The file being touched is `drivers/phy/broadcom/phy-brcm-usb.c`, and the target architecture is amd64. Straightforward enough, but I always start by understanding the "why." My first step is to quickly analyze `phy-brcm-usb.c` itself. I need to understand what this driver does, and especially, whether it's even relevant in an amd64 environment, potentially even a virtualized one. The Kconfig file is key here. I'll need to figure out how this PHY is configured and conditionally compiled. I'll probably fire up `grepper` or `read-file` to get the lay of the land quickly; I can't be fiddling around for too long. |
| 4/2 | 2026/09/19 13:48 | tool | grepper |
0mArgs:{
"Expression": "PHY_BRCM_USB",
"PathPrefix": "drivers/phy/broadcom"
}Results: {
"Output": "drivers/phy/broadcom/Kconfig=83=config PHY_BRCM_SATA\n--\ndrivers/phy/broadcom/Kconfig-93-\ndrivers/phy/broadcom/Kconfig:94:config PHY_BRCM_USB\ndrivers/phy/broadcom/Kconfig-95-\ttristate \"Broadcom STB USB PHY driver\"\n--\ndrivers/phy/broadcom/Makefile=9=obj-$(CONFIG_PHY_BRCM_SATA)\t\t+= phy-brcm-sata.o\ndrivers/phy/broadcom/Makefile:10:obj-$(CONFIG_PHY_BRCM_USB)\t\t+= phy-brcm-usb-dvr.o\ndrivers/phy/broadcom/Makefile-11-\n"
} |
| 5/2 | 2026/09/19 13:48 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 4402 output: 36 thoughts: 26 Thoughts: Here's my take on the thought process: **Diving into the PHY Configuration** Okay, time to get my hands dirty. I need to investigate the Broadcom PHY configuration, and I have a strong hunch where the relevant information resides. My initial move is to examine the `drivers/phy/broadcom/Kconfig` file. I'll zero in around line 94, as that's often where the core driver options begin or a key section is defined. I'll use `read-file` to efficiently pull that section out and begin my analysis. Let's see what's in there... |
| 6/2 | 2026/09/19 13:48 | tool | read-file |
0mArgs:{
"File": "drivers/phy/broadcom/Kconfig",
"FirstLine": 90,
"LineCount": 30
}Results: {
"Contents": " 90:\t\thelp\n 91:\t\t Enable this to support the Broadcom SATA PHY.\n 92:\t\t If unsure, say N.\n 93:\t\n 94:\tconfig PHY_BRCM_USB\n 95:\t\ttristate \"Broadcom STB USB PHY driver\"\n 96:\t\tdepends on ARCH_BCMBCA || ARCH_BRCMSTB || COMPILE_TEST\n 97:\t\tdepends on OF\n 98:\t\tselect GENERIC_PHY\n 99:\t\tselect SOC_BRCMSTB if ARCH_BRCMSTB\n 100:\t\tdefault ARCH_BCMBCA || ARCH_BRCMSTB\n 101:\t\thelp\n 102:\t\t Enable this to support the Broadcom STB USB PHY.\n 103:\t\t This driver is required by the USB XHCI, EHCI and OHCI\n 104:\t\t drivers.\n 105:\t\t If unsure, say N.\n 106:\t\n 107:\tconfig PHY_BCM_SR_PCIE\n 108:\t\ttristate \"Broadcom Stingray PCIe PHY driver\"\n 109:\t\tdepends on OF \u0026\u0026 (ARCH_BCM_IPROC || COMPILE_TEST)\n 110:\t\tselect GENERIC_PHY\n 111:\t\tselect MFD_SYSCON\n 112:\t\tdefault ARCH_BCM_IPROC\n 113:\t\thelp\n 114:\t\t Enable this to support the Broadcom Stingray PCIe PHY\n 115:\t\t If unsure, say N.\n 116:\t\n 117:\tendmenu\n"
} |
| 7/2 | 2026/09/19 13:48 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 5008 output: 43 thoughts: 88 Thoughts: **Analyzing the Broadcom STB USB PHY Driver** Okay, so I'm looking at this driver, the "Broadcom STB USB PHY driver," specifically the dependencies: `ARCH_BCMBCA || ARCH_BRCMSTB || COMPILE_TEST` and `OF`. That tells me it's built for Broadcom Set-Top Box SoCs. My immediate question is whether this thing can even function – or at least probe – in a virtualized environment. Can I expect it to work in something like Google Compute Engine or with QEMU running on an amd64 machine? I need to figure this out. The next logical step is to dive into the driver's registration and device matching to understand its hardware interaction and probe process. That'll provide the clues I need to determine its compatibility. |
| 8/2 | 2026/09/19 13:48 | tool | read-file |
0mArgs:{
"File": "drivers/phy/broadcom/phy-brcm-usb.c",
"FirstLine": 470,
"LineCount": 80
}Results: {
"Contents": " 470:\t\t\tpriv-\u003ewake_irq = platform_get_irq_byname_optional(pdev, \"wakeup\");\n 471:\t\tif (priv-\u003ewake_irq \u003e= 0) {\n 472:\t\t\terr = devm_request_irq(dev, priv-\u003ewake_irq,\n 473:\t\t\t\t\t brcm_usb_phy_wake_isr, 0,\n 474:\t\t\t\t\t dev_name(dev), dev);\n 475:\t\t\tif (err \u003c 0)\n 476:\t\t\t\tgoto err_put_clks;\n 477:\t\t\tdevice_set_wakeup_capable(dev, 1);\n 478:\t\t} else {\n 479:\t\t\tdev_info(dev,\n 480:\t\t\t\t \"Wake interrupt missing, system wake not supported\\n\");\n 481:\t\t}\n 482:\t\n 483:\t\treturn 0;\n 484:\t\n 485:\terr_put_clks:\n 486:\t\tclk_put(priv-\u003eusb_20_clk);\n 487:\t\treturn err;\n 488:\t}\n 489:\t\n 490:\tstatic int brcm_usb_phy_probe(struct platform_device *pdev)\n 491:\t{\n 492:\t\tstruct device *dev = \u0026pdev-\u003edev;\n 493:\t\tstruct brcm_usb_phy_data *priv;\n 494:\t\tstruct phy_provider *phy_provider;\n 495:\t\tstruct device_node *dn = pdev-\u003edev.of_node;\n 496:\t\tint err;\n 497:\t\tconst char *mode;\n 498:\t\tconst struct match_chip_info *info;\n 499:\t\tstruct regmap *rmap;\n 500:\t\tint x;\n 501:\t\n 502:\t\tpriv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);\n 503:\t\tif (!priv)\n 504:\t\t\treturn -ENOMEM;\n 505:\t\tplatform_set_drvdata(pdev, priv);\n 506:\t\n 507:\t\tpriv-\u003eini.family_id = brcmstb_get_family_id();\n 508:\t\tpriv-\u003eini.product_id = brcmstb_get_product_id();\n 509:\t\n 510:\t\tinfo = of_device_get_match_data(\u0026pdev-\u003edev);\n 511:\t\tif (!info)\n 512:\t\t\treturn -ENOENT;\n 513:\t\n 514:\t\tinfo-\u003einit_func(\u0026priv-\u003eini);\n 515:\t\n 516:\t\tdev_dbg(dev, \"Best mapping table is for %s\\n\",\n 517:\t\t\tpriv-\u003eini.family_name);\n 518:\t\n 519:\t\tof_property_read_u32(dn, \"brcm,ipp\", \u0026priv-\u003eini.ipp);\n 520:\t\tof_property_read_u32(dn, \"brcm,ioc\", \u0026priv-\u003eini.ioc);\n 521:\t\n 522:\t\tpriv-\u003eini.supported_port_modes = USB_CTLR_MODE_HOST;\n 523:\t\terr = of_property_read_string(dn, \"dr_mode\", \u0026mode);\n 524:\t\tif (err == 0) {\n 525:\t\t\tname_to_value(\u0026brcm_dr_mode_to_name[0],\n 526:\t\t\t\t ARRAY_SIZE(brcm_dr_mode_to_name),\n 527:\t\t\t\tmode, \u0026priv-\u003eini.supported_port_modes);\n 528:\t\t}\n 529:\t\t/* Default port_mode to supported port_modes */\n 530:\t\tpriv-\u003eini.port_mode = priv-\u003eini.supported_port_modes;\n 531:\t\n 532:\t\tif (of_property_read_bool(dn, \"brcm,has-xhci\"))\n 533:\t\t\tpriv-\u003ehas_xhci = true;\n 534:\t\tif (of_property_read_bool(dn, \"brcm,has-eohci\"))\n 535:\t\t\tpriv-\u003ehas_eohci = true;\n 536:\t\n 537:\t\tfor (x = 0; x \u003c BRCM_REGS_MAX; x++) {\n 538:\t\t\tif (info-\u003erequired_regs[x] \u003e= BRCM_REGS_MAX)\n 539:\t\t\t\tbreak;\n 540:\t\n 541:\t\t\terr = brcm_usb_get_regs(pdev, info-\u003erequired_regs[x],\n 542:\t\t\t\t\t\t\u0026priv-\u003eini, false);\n 543:\t\t\tif (err)\n 544:\t\t\t\treturn -EINVAL;\n 545:\t\t}\n 546:\t\tif (info-\u003eoptional_reg) {\n 547:\t\t\terr = brcm_usb_get_regs(pdev, info-\u003eoptional_reg,\n 548:\t\t\t\t\t\t\u0026priv-\u003eini, true);\n 549:\t\t\tif (err)\n"
} |
| 9/2 | 2026/09/19 13:48 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 6634 output: 43 thoughts: 23 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Diving into the brcm_usb_phy_probe** Okay, so I need to understand this `brcm_usb_phy_probe` function better. Where is this thing registered? I need to trace its initialization and see how it's integrated into the broader USB PHY framework. I'm thinking about the device tree bindings, and how the driver matches. I suspect there's a good chunk of standard USB PHY code in there, but I need to identify any specific Broadcom customizations or hardware-specific interactions. Time to get my hands dirty and start digging into the registration path. Let's see how they handle the `platform_driver_register` and related functions. |
| 10/2 | 2026/09/19 13:49 | tool | read-file |
0mArgs:{
"File": "drivers/phy/broadcom/phy-brcm-usb.c",
"FirstLine": 550,
"LineCount": 60
}Results: {
"Contents": " 550:\t\t\t\treturn -EINVAL;\n 551:\t\t}\n 552:\t\n 553:\t\terr = brcm_usb_phy_dvr_init(pdev, priv, dn);\n 554:\t\tif (err)\n 555:\t\t\treturn err;\n 556:\t\n 557:\t\tpriv-\u003epm_notifier.notifier_call = brcm_pm_notifier;\n 558:\t\tregister_pm_notifier(\u0026priv-\u003epm_notifier);\n 559:\t\n 560:\t\tmutex_init(\u0026priv-\u003emutex);\n 561:\t\n 562:\t\t/* make sure invert settings are correct */\n 563:\t\tbrcm_usb_init_ipp(\u0026priv-\u003eini);\n 564:\t\n 565:\t\t/*\n 566:\t\t * Create sysfs entries for mode.\n 567:\t\t * Remove \"dual_select\" attribute if not in dual mode\n 568:\t\t */\n 569:\t\tif (priv-\u003eini.supported_port_modes != USB_CTLR_MODE_DRD)\n 570:\t\t\tbrcm_usb_phy_attrs[1] = NULL;\n 571:\t\terr = sysfs_create_group(\u0026dev-\u003ekobj, \u0026brcm_usb_phy_group);\n 572:\t\tif (err)\n 573:\t\t\tdev_warn(dev, \"Error creating sysfs attributes\\n\");\n 574:\t\n 575:\t\t/* Get piarbctl syscon if it exists */\n 576:\t\trmap = syscon_regmap_lookup_by_phandle(dev-\u003eof_node,\n 577:\t\t\t\t\t\t\t \"syscon-piarbctl\");\n 578:\t\tif (IS_ERR(rmap))\n 579:\t\t\trmap = syscon_regmap_lookup_by_phandle(dev-\u003eof_node,\n 580:\t\t\t\t\t\t\t \"brcm,syscon-piarbctl\");\n 581:\t\tif (!IS_ERR(rmap))\n 582:\t\t\tpriv-\u003eini.syscon_piarbctl = rmap;\n 583:\t\n 584:\t\t/* start with everything off */\n 585:\t\tif (priv-\u003ehas_xhci)\n 586:\t\t\tbrcm_usb_uninit_xhci(\u0026priv-\u003eini);\n 587:\t\tif (priv-\u003ehas_eohci)\n 588:\t\t\tbrcm_usb_uninit_eohci(\u0026priv-\u003eini);\n 589:\t\tbrcm_usb_uninit_common(\u0026priv-\u003eini);\n 590:\t\tclk_disable_unprepare(priv-\u003eusb_20_clk);\n 591:\t\tclk_disable_unprepare(priv-\u003eusb_30_clk);\n 592:\t\n 593:\t\tphy_provider = devm_of_phy_provider_register(dev, brcm_usb_phy_xlate);\n 594:\t\n 595:\t\treturn PTR_ERR_OR_ZERO(phy_provider);\n 596:\t}\n 597:\t\n 598:\tstatic void brcm_usb_phy_remove(struct platform_device *pdev)\n 599:\t{\n 600:\t\tstruct brcm_usb_phy_data *priv = dev_get_drvdata(\u0026pdev-\u003edev);\n 601:\t\n 602:\t\tsysfs_remove_group(\u0026pdev-\u003edev.kobj, \u0026brcm_usb_phy_group);\n 603:\t\tunregister_pm_notifier(\u0026priv-\u003epm_notifier);\n 604:\t}\n 605:\t\n 606:\t#ifdef CONFIG_PM_SLEEP\n 607:\tstatic int brcm_usb_phy_suspend(struct device *dev)\n 608:\t{\n 609:\t\tstruct brcm_usb_phy_data *priv = dev_get_drvdata(dev);\n"
} |
| 11/2 | 2026/09/19 13:49 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 7866 output: 43 thoughts: 20 Thoughts: Okay, here's my take on those thoughts, tailored for an expert audience: **Examining Platform Driver Registration and DT Match Table** Right, let's get straight to the point. My immediate thought is to zero in on the core of this driver architecture. I need to quickly grasp how this driver identifies and attaches itself to specific hardware. That means heading straight for the registration process and the Device Tree (DT) match table – the bedrock of platform driver binding in many embedded systems. I want to see precisely how the driver declares its capabilities and, more importantly, how it's matched with the corresponding hardware described in the device tree. I'm looking for the canonical pattern, the `platform_driver_register()` call, and the structure used for the matching mechanism (typically `of_device_id` or similar). I expect to see specific compatible strings, and ideally, I'm hoping it's using the standard properties to describe the hardware. I’m also interested in any custom properties that indicate specific features or configurations. This will provide the foundation for understanding how this driver handles the device, including how it interacts with the system, and what specific features it uses. It will give insight on whether the DT bindings are adhering to existing conventions or if there are any deviations I need to understand. |
| 12/2 | 2026/09/19 13:49 | tool | read-file |
0mArgs:{
"File": "drivers/phy/broadcom/phy-brcm-usb.c",
"FirstLine": 660,
"LineCount": 50
}Results: {
"Contents": " 660:\t\t\t} else if (priv-\u003ehas_eohci) {\n 661:\t\t\t\tbrcm_usb_uninit_eohci(\u0026priv-\u003eini);\n 662:\t\t\t\tclk_disable_unprepare(priv-\u003eusb_20_clk);\n 663:\t\t\t}\n 664:\t\t\tif (priv-\u003ephys[BRCM_USB_PHY_3_0].inited) {\n 665:\t\t\t\tbrcm_usb_init_xhci(\u0026priv-\u003eini);\n 666:\t\t\t} else if (priv-\u003ehas_xhci) {\n 667:\t\t\t\tbrcm_usb_uninit_xhci(\u0026priv-\u003eini);\n 668:\t\t\t\tclk_disable_unprepare(priv-\u003eusb_30_clk);\n 669:\t\t\t\tif (!priv-\u003ehas_eohci)\n 670:\t\t\t\t\tclk_disable_unprepare(priv-\u003eusb_20_clk);\n 671:\t\t\t}\n 672:\t\t} else {\n 673:\t\t\tif (priv-\u003ehas_xhci)\n 674:\t\t\t\tbrcm_usb_uninit_xhci(\u0026priv-\u003eini);\n 675:\t\t\tif (priv-\u003ehas_eohci)\n 676:\t\t\t\tbrcm_usb_uninit_eohci(\u0026priv-\u003eini);\n 677:\t\t\tbrcm_usb_uninit_common(\u0026priv-\u003eini);\n 678:\t\t\tclk_disable_unprepare(priv-\u003eusb_20_clk);\n 679:\t\t\tclk_disable_unprepare(priv-\u003eusb_30_clk);\n 680:\t\t}\n 681:\t\tpriv-\u003eini.wake_enabled = false;\n 682:\t\treturn 0;\n 683:\t}\n 684:\t#endif /* CONFIG_PM_SLEEP */\n 685:\t\n 686:\tstatic const struct dev_pm_ops brcm_usb_phy_pm_ops = {\n 687:\t\tSET_LATE_SYSTEM_SLEEP_PM_OPS(brcm_usb_phy_suspend, brcm_usb_phy_resume)\n 688:\t};\n 689:\t\n 690:\tMODULE_DEVICE_TABLE(of, brcm_usb_dt_ids);\n 691:\t\n 692:\tstatic struct platform_driver brcm_usb_driver = {\n 693:\t\t.probe\t\t= brcm_usb_phy_probe,\n 694:\t\t.remove\t\t= brcm_usb_phy_remove,\n 695:\t\t.driver\t\t= {\n 696:\t\t\t.name\t= \"brcmstb-usb-phy\",\n 697:\t\t\t.pm = \u0026brcm_usb_phy_pm_ops,\n 698:\t\t\t.of_match_table = brcm_usb_dt_ids,\n 699:\t\t},\n 700:\t};\n 701:\t\n 702:\tmodule_platform_driver(brcm_usb_driver);\n 703:\t\n 704:\tMODULE_AUTHOR(\"Al Cooper \u003cacooper@broadcom.com\u003e\");\n 705:\tMODULE_DESCRIPTION(\"BRCM USB PHY driver\");\n 706:\tMODULE_LICENSE(\"GPL v2\");\n"
} |
| 13/2 | 2026/09/19 13:49 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 9025 output: 34 thoughts: 14 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Analyzing the `brcm_usb_dt_ids` Data** Okay, so I need to take a look at `brcm_usb_dt_ids`. Let's see what's in there. I'm assuming this is probably a table or a data structure holding Device Tree compatible strings and corresponding IDs, likely for Broadcom USB devices. I'm immediately thinking about how this list is used by the USB subsystem, likely during probe time. Is it a direct match against the `compatible` property, or are there wildcard or range matching mechanisms in place? The specifics are going to be critical. I'll need to understand if the IDs are vendor-specific, product-specific, or contain other relevant information. I'm wondering if there are any subtle naming conventions or patterns within the IDs that might hint at their meaning or purpose in the Broadcom ecosystem. Are we dealing with hardware-specific IDs, or driver-specific IDs, or a mix of both? This initial investigation will help me understand how Broadcom USB devices are identified and bound to their appropriate drivers within the kernel. |
| 14/2 | 2026/09/19 13:49 | tool | grepper |
0mArgs:{
"Expression": "brcm_usb_dt_ids",
"PathPrefix": "drivers/phy/broadcom"
}Results: {
"Output": "drivers/phy/broadcom/phy-brcm-usb.c=328=static const struct match_chip_info chip_info_7445 = {\n--\ndrivers/phy/broadcom/phy-brcm-usb.c-336-\ndrivers/phy/broadcom/phy-brcm-usb.c:337:static const struct of_device_id brcm_usb_dt_ids[] = {\ndrivers/phy/broadcom/phy-brcm-usb.c-338-\t{\n--\ndrivers/phy/broadcom/phy-brcm-usb.c=686=static const struct dev_pm_ops brcm_usb_phy_pm_ops = {\n--\ndrivers/phy/broadcom/phy-brcm-usb.c-689-\ndrivers/phy/broadcom/phy-brcm-usb.c:690:MODULE_DEVICE_TABLE(of, brcm_usb_dt_ids);\ndrivers/phy/broadcom/phy-brcm-usb.c-691-\ndrivers/phy/broadcom/phy-brcm-usb.c=692=static struct platform_driver brcm_usb_driver = {\n--\ndrivers/phy/broadcom/phy-brcm-usb.c-697-\t\t.pm = \u0026brcm_usb_phy_pm_ops,\ndrivers/phy/broadcom/phy-brcm-usb.c:698:\t\t.of_match_table = brcm_usb_dt_ids,\ndrivers/phy/broadcom/phy-brcm-usb.c-699-\t},\n"
} |
| 15/2 | 2026/09/19 13:49 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 9714 output: 43 thoughts: 28 Thoughts: Here's my attempt at summarizing the thought process, tailored for an expert audience: **Diving into the Broadcom USB PHY Driver** Alright, let's zero in on `drivers/phy/broadcom/phy-brcm-usb.c` and specifically around line 337. I'm guessing we're likely looking at initialization or perhaps clock configuration related to the USB PHY. Given the file path and the context, this is probably a critical piece of the puzzle for getting the USB interface up and running on a Broadcom SoC. I need to understand how the driver interacts with the hardware, particularly the register settings, clock gating, and any specific Broadcom quirks. Line 337 is a good starting point to identify the function or the critical section that could be of interest. Perhaps there is some error or performance issue that the user has brought to my attention and so I will try and determine if I can identify it. |
| 16/2 | 2026/09/19 13:49 | tool | read-file |
0mArgs:{
"File": "drivers/phy/broadcom/phy-brcm-usb.c",
"FirstLine": 330,
"LineCount": 40
}Results: {
"Contents": " 330:\t\t.required_regs = {\n 331:\t\t\tBRCM_REGS_CTRL,\n 332:\t\t\tBRCM_REGS_XHCI_EC,\n 333:\t\t\t-1,\n 334:\t\t},\n 335:\t};\n 336:\t\n 337:\tstatic const struct of_device_id brcm_usb_dt_ids[] = {\n 338:\t\t{\n 339:\t\t\t.compatible = \"brcm,bcm74110-usb-phy\",\n 340:\t\t\t.data = \u0026chip_info_74110,\n 341:\t\t},\n 342:\t\t{\n 343:\t\t\t.compatible = \"brcm,bcm4908-usb-phy\",\n 344:\t\t\t.data = \u0026chip_info_4908,\n 345:\t\t},\n 346:\t\t{\n 347:\t\t\t.compatible = \"brcm,bcm7216-usb-phy\",\n 348:\t\t\t.data = \u0026chip_info_7216,\n 349:\t\t},\n 350:\t\t{\n 351:\t\t\t.compatible = \"brcm,bcm7211-usb-phy\",\n 352:\t\t\t.data = \u0026chip_info_7211b0,\n 353:\t\t},\n 354:\t\t{\n 355:\t\t\t.compatible = \"brcm,brcmstb-usb-phy\",\n 356:\t\t\t.data = \u0026chip_info_7445,\n 357:\t\t},\n 358:\t\t{ /* sentinel */ }\n 359:\t};\n 360:\t\n 361:\tstatic int brcm_usb_get_regs(struct platform_device *pdev,\n 362:\t\t\t\t enum brcmusb_reg_sel regs,\n 363:\t\t\t\t struct brcm_usb_init_params *ini,\n 364:\t\t\t\t bool optional)\n 365:\t{\n 366:\t\tstruct resource *res;\n 367:\t\n 368:\t\t/* Older DT nodes have ctrl and optional xhci_ec by index only */\n 369:\t\tres = platform_get_resource_byname(pdev, IORESOURCE_MEM,\n"
} |
| 17/2 | 2026/09/19 13:49 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 10587 output: 24 thoughts: 410 Thoughts: **My Analysis of the `brcm_usb_driver`** Okay, let's break this down. First, I see that the `brcm_usb_driver` is explicitly an OF-only platform driver, right? It relies solely on the Device Tree (`.of_match_table = brcm_usb_dt_ids`). The compatible strings point to specific Broadcom USB PHY implementations, things like "brcm,bcm74110-usb-phy", and so on. Now, looking at the Kconfig, the `PHY_BRCM_USB` configuration option is conditionally enabled. It's a tristate driver that depends on `ARCH_BCMBCA` or `ARCH_BRCMSTB` or `COMPILE_TEST`, and critically, `OF`. It also selects `GENERIC_PHY` and optionally `SOC_BRCMSTB`. We can see that the BCA architecture is Broadcom Broadband SoC, and BRCMSTB is Broadcom Set-Top-Box SoC. Here's the problem: I'm on an amd64 target. Neither `ARCH_BCMBCA` nor `ARCH_BRCMSTB` are going to be set on amd64 because they depend on ARM, ARM64, or MIPS architectures. Even if I force `COMPILE_TEST` and ensure `OF` is enabled on amd64, I seriously doubt this driver could ever be instantiated on this platform. My experience tells me that Device Tree nodes for Broadcom STB PHYs are only going to show up in Broadcom STB DTBs, running on actual Broadcom hardware. Standard x86/amd64 virtual machines like QEMU and GCE use ACPI, not Device Tree, and they certainly won't be using Broadcom STB nodes. Furthermore, I have to investigate `brcmstb_get_family_id()` to see how it's used. This function seems central to the driver's operation, and knowing how it behaves is key to understanding its full limitations and potential for platform-specific behavior. I need to dive into its implementation to see what's really going on there. |
| 18/2 | 2026/09/19 13:49 | tool | grepper |
0mArgs:{
"Expression": "brcmstb_get_family_id"
}Results: {
"Output": "drivers/phy/broadcom/phy-brcm-usb.c=490=static int brcm_usb_phy_probe(struct platform_device *pdev)\n--\ndrivers/phy/broadcom/phy-brcm-usb.c-506-\ndrivers/phy/broadcom/phy-brcm-usb.c:507:\tpriv-\u003eini.family_id = brcmstb_get_family_id();\ndrivers/phy/broadcom/phy-brcm-usb.c-508-\tpriv-\u003eini.product_id = brcmstb_get_product_id();\n--\ndrivers/soc/bcm/brcmstb/biuctrl.c=206=static void __init mcp_a72_b53_set(void)\n--\ndrivers/soc/bcm/brcmstb/biuctrl.c-210-\ndrivers/soc/bcm/brcmstb/biuctrl.c:211:\treg = brcmstb_get_family_id();\ndrivers/soc/bcm/brcmstb/biuctrl.c-212-\n--\ndrivers/soc/bcm/brcmstb/biuctrl.c=253=static int __init setup_hifcpubiuctrl_regs(struct device_node *np)\n--\ndrivers/soc/bcm/brcmstb/biuctrl.c-286-\ndrivers/soc/bcm/brcmstb/biuctrl.c:287:\tfamily_id = brcmstb_get_family_id();\ndrivers/soc/bcm/brcmstb/biuctrl.c-288-\tif (BRCM_ID(family_id) == 0x7260 \u0026\u0026 BRCM_REV(family_id) == 0)\n--\ndrivers/soc/bcm/brcmstb/common.c=19=static struct brcmstb_soc_info *soc_info;\ndrivers/soc/bcm/brcmstb/common.c-20-\ndrivers/soc/bcm/brcmstb/common.c:21:u32 brcmstb_get_family_id(void)\ndrivers/soc/bcm/brcmstb/common.c-22-{\n--\ndrivers/soc/bcm/brcmstb/common.c-24-}\ndrivers/soc/bcm/brcmstb/common.c:25:EXPORT_SYMBOL(brcmstb_get_family_id);\ndrivers/soc/bcm/brcmstb/common.c-26-\n--\ninclude/linux/soc/brcmstb/brcmstb.h=12=static inline u32 BRCM_REV(u32 reg)\n--\ninclude/linux/soc/brcmstb/brcmstb.h-22- */\ninclude/linux/soc/brcmstb/brcmstb.h:23:u32 brcmstb_get_family_id(void);\ninclude/linux/soc/brcmstb/brcmstb.h-24-u32 brcmstb_get_product_id(void);\n--\ninclude/linux/soc/brcmstb/brcmstb.h-26-#else\ninclude/linux/soc/brcmstb/brcmstb.h:27:static inline u32 brcmstb_get_family_id(void)\ninclude/linux/soc/brcmstb/brcmstb.h-28-{\n"
} |
| 19/2 | 2026/09/19 13:49 | llm | patch-evaluator |
0mModel:gemini-3.8-flash Args: null Results: null Tokens: input: 12351 output: 147 thoughts: 781 Thoughts: **Fuzzing Verdict: Not Worth Fuzzing** Okay, let's break this down methodically. First, I'm examining the criteria laid out. Section 1 makes it crystal clear: reachability is the primary gatekeeper. We only fuzz code that *can* actually execute in standard virtualized environments. If a code path is structurally unreachable – as defined in Section 2 – fuzzing is off the table, period. Assertions or complex logic within that unreachable code are irrelevant. Now, let's zero in on this patch. It's modifying `brcm_usb_phy_dvr_init()` in `drivers/phy/broadcom/phy-brcm-usb.c`. This is a probe error-handling fix in a SoC-specific USB PHY driver designed for Broadcom Set-Top Box (STB) SoCs. I'm focusing on those specific architectures: `ARCH_BCMBCA` and `ARCH_BRCMSTB`. The target architecture is amd64. The key problem: even on ARM or ARM64, these are physical Broadcom STB chips (bcm7445, bcm7216, etc.) and, therefore, not emulated in QEMU. On amd64, these architectures simply don't exist, and the device tree nodes won't be there. Standard virtualized environments running amd64 (QEMU, GCE) cannot instantiate or probe this platform driver. I'm double-checking. Is there *any* possibility of a userspace interface or a mock device that could bind `brcmstb-usb-phy`? No, it's an OF platform driver matching `brcm_usb_dt_ids`. It cannot be probed on amd64. Therefore, the modified code is structurally unreachable on the target architecture (amd64) in standard virtualized environments. The decision is straightforward: `WorthFuzzing` must be false. Let's ensure the output format is correct for `set-results`. It needs to include `EnableConfigs`: [] or null, `FocusSymbols`: [] or null, `Reasoning`: a concise explanation of the verdict, and `WorthFuzzing`: false. Finally, I'll concisely reason as follows: 1. The patch addresses error cleanup paths in `brcm_usb_phy_dvr_init()` within `drivers/phy/broadcom/phy-brcm-usb.c`, which is the Broadcom STB USB PHY driver. 2. The driver is a platform driver instantiated via Device Tree (`brcm_usb_dt_ids`) on Broadcom Set-Top Box SoCs (ARCH_BCMBCA / ARCH_BRCMSTB). 3. The hardware is structurally unreachable in standard virtualized environments (QEMU/GCE) and on the target architecture (amd64). This reasoning is clear, concise, and logically sound. I am confident in the "not worth fuzzing" verdict. |
| 20/2 | 2026/09/19 13:49 | tool | set-results |
0mArgs:{
"EnableConfigs": [],
"FocusSymbols": [],
"Reasoning": "The patch modifies error handling paths in brcm_usb_phy_dvr_init() within the Broadcom STB USB PHY driver (drivers/phy/broadcom/phy-brcm-usb.c). This driver is an OF-only platform driver designed specifically for Broadcom Set-Top Box SoCs (ARCH_BRCMSTB / ARCH_BCMBCA). The underlying hardware is not present or emulated in standard virtualized environments (QEMU/GCE) on amd64, rendering this driver and the modified code structurally unreachable.",
"WorthFuzzing": false
}Results: {
"EnableConfigs": null,
"FocusSymbols": [],
"Reasoning": "The patch modifies error handling paths in brcm_usb_phy_dvr_init() within the Broadcom STB USB PHY driver (drivers/phy/broadcom/phy-brcm-usb.c). This driver is an OF-only platform driver designed specifically for Broadcom Set-Top Box SoCs (ARCH_BRCMSTB / ARCH_BCMBCA). The underlying hardware is not present or emulated in standard virtualized environments (QEMU/GCE) on amd64, rendering this driver and the modified code structurally unreachable.",
"WorthFuzzing": false
} |
| 21/1 | 2026/09/19 13:49 | action | If |
0mArgs:{
"WorthFuzzing": false
}Results: null |
| Total Calls | Total Tokens | Avg Tokens | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|
| Total Calls | Total Duration (Seconds) | Avg Duration (Seconds) |
|---|