AI Trajectory


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

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "KMSANReasoning": "",
  "NeedsKMSAN": false,
  "Reasoning": "The patch modifies drivers/usb/gadget/udc/pch_udc.c, which is a PCI driver for Intel EG20T / Quark X1000 USB Device Controllers. This hardware is not emulated in standard QEMU or cloud virtualized environments, making the driver probe unreachable. Additionally, the changes touch initialization within probe (pch_vbus_gpio_init) and teardown cleanup in the PCI remove callback (pch_udc_remove), which is not reachable during normal fuzzing. Therefore, the changes are not worth fuzzing.",
  "WorthFuzzing": false
}

1/1 2026/09/19 23:13 action read-patch-diff
0m Args:
null

Results:
{
  "PatchDiff": "commit 83f3b8e4737de844bf3ca17b17b9bd0bc8f88b2b\nAuthor: syz-cluster \u003ctriage@syzkaller.com\u003e\nDate:   Sat Sep 19 23:13:42 2026 +0000\n\n    syz-cluster: applied patch under review\n\ndiff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c\nindex 99b3ce28210f9..20018c09f6f39 100644\n--- a/drivers/usb/gadget/udc/pch_udc.c\n+++ b/drivers/usb/gadget/udc/pch_udc.c\n@@ -1372,6 +1372,8 @@ static int pch_vbus_gpio_init(struct pch_udc_dev *dev)\n \n \tdev-\u003evbus_gpio.port = NULL;\n \tdev-\u003evbus_gpio.intr = 0;\n+\tINIT_WORK(\u0026dev-\u003evbus_gpio.irq_work_fall, pch_vbus_gpio_work_fall);\n+\tINIT_WORK(\u0026dev-\u003evbus_gpio.irq_work_rise, pch_vbus_gpio_work_rise);\n \n \t/* Retrieve the GPIO line from the USB gadget device */\n \tgpiod = devm_gpiod_get_optional(d, NULL, GPIOD_IN);\n@@ -1380,7 +1382,6 @@ static int pch_vbus_gpio_init(struct pch_udc_dev *dev)\n \tgpiod_set_consumer_name(gpiod, \"pch_vbus\");\n \n \tdev-\u003evbus_gpio.port = gpiod;\n-\tINIT_WORK(\u0026dev-\u003evbus_gpio.irq_work_fall, pch_vbus_gpio_work_fall);\n \n \tirq_num = gpiod_to_irq(gpiod);\n \tif (irq_num \u003e 0) {\n@@ -1389,8 +1390,6 @@ static int pch_vbus_gpio_init(struct pch_udc_dev *dev)\n \t\t\t\"vbus_detect\", dev);\n \t\tif (!err) {\n \t\t\tdev-\u003evbus_gpio.intr = irq_num;\n-\t\t\tINIT_WORK(\u0026dev-\u003evbus_gpio.irq_work_rise,\n-\t\t\t\tpch_vbus_gpio_work_rise);\n \t\t} else {\n \t\t\tpr_err(\"%s: can't request irq %d, err: %d\\n\",\n \t\t\t\t__func__, irq_num, err);\n@@ -2982,6 +2981,9 @@ static void pch_udc_remove(struct pci_dev *pdev)\n {\n \tstruct pch_udc_dev\t*dev = pci_get_drvdata(pdev);\n \n+\tdisable_work_sync(\u0026dev-\u003evbus_gpio.irq_work_fall);\n+\tdisable_work_sync(\u0026dev-\u003evbus_gpio.irq_work_rise);\n+\n \tusb_del_gadget_udc(\u0026dev-\u003egadget);\n \n \t/* gadget driver must not be registered */\n"
}

2/1 2026/09/19 23:13 agent patch-evaluator
1m Model:
core

Args:
null

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch modifies drivers/usb/gadget/udc/pch_udc.c, which is a PCI driver for Intel EG20T / Quark X1000 USB Device Controllers. This hardware is not emulated in standard QEMU or cloud virtualized environments, making the driver probe unreachable. Additionally, the changes touch initialization within probe (pch_vbus_gpio_init) and teardown cleanup in the PCI remove callback (pch_udc_remove), which is not reachable during normal fuzzing. Therefore, the changes are not worth fuzzing.",
  "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 83f3b8e4737de844bf3ca17b17b9bd0bc8f88b2b
Author: syz-cluster <triage@syzkaller.com>
Date:   Sat Sep 19 23:13:42 2026 +0000

    syz-cluster: applied patch under review

diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c
index 99b3ce28210f9..20018c09f6f39 100644
--- a/drivers/usb/gadget/udc/pch_udc.c
+++ b/drivers/usb/gadget/udc/pch_udc.c
@@ -1372,6 +1372,8 @@ static int pch_vbus_gpio_init(struct pch_udc_dev *dev)
 
 	dev->vbus_gpio.port = NULL;
 	dev->vbus_gpio.intr = 0;
+	INIT_WORK(&dev->vbus_gpio.irq_work_fall, pch_vbus_gpio_work_fall);
+	INIT_WORK(&dev->vbus_gpio.irq_work_rise, pch_vbus_gpio_work_rise);
 
 	/* Retrieve the GPIO line from the USB gadget device */
 	gpiod = devm_gpiod_get_optional(d, NULL, GPIOD_IN);
@@ -1380,7 +1382,6 @@ static int pch_vbus_gpio_init(struct pch_udc_dev *dev)
 	gpiod_set_consumer_name(gpiod, "pch_vbus");
 
 	dev->vbus_gpio.port = gpiod;
-	INIT_WORK(&dev->vbus_gpio.irq_work_fall, pch_vbus_gpio_work_fall);
 
 	irq_num = gpiod_to_irq(gpiod);
 	if (irq_num > 0) {
@@ -1389,8 +1390,6 @@ static int pch_vbus_gpio_init(struct pch_udc_dev *dev)
 			"vbus_detect", dev);
 		if (!err) {
 			dev->vbus_gpio.intr = irq_num;
-			INIT_WORK(&dev->vbus_gpio.irq_work_rise,
-				pch_vbus_gpio_work_rise);
 		} else {
 			pr_err("%s: can't request irq %d, err: %d\n",
 				__func__, irq_num, err);
@@ -2982,6 +2981,9 @@ static void pch_udc_remove(struct pci_dev *pdev)
 {
 	struct pch_udc_dev	*dev = pci_get_drvdata(pdev);
 
+	disable_work_sync(&dev->vbus_gpio.irq_work_fall);
+	disable_work_sync(&dev->vbus_gpio.irq_work_rise);
+
 	usb_del_gadget_udc(&dev->gadget);
 
 	/* gadget driver must not be registered */

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

Args:
null

Results:
null

Tokens:
							input: 3397
							output: 35
							thoughts: 67
						

Thoughts:
**Analyzing USB Gadget Driver Changes**

Okay, so the diff points me towards changes within `drivers/usb/gadget/udc/pch_udc.c`. My initial reaction is to figure out exactly what `pch_udc` represents in the grand scheme of things. It's time to dig in and understand the context. I'll need to use either `grepper` to search or `read-file` to get a direct look at both `pch_udc.c` itself and, crucially, its associated `Kconfig` file. This is where the configuration details will be. I need to understand how this driver is compiled, under what conditions, and what dependencies it has. This information will provide context to the recent changes and what areas may be affected.



4/2 2026/09/19 23:13 tool grepper
0m Args:
{
  "Expression": "PCH_UDC",
  "PathPrefix": "drivers/usb/gadget/udc/"
}

Results:
{
  "Output": "drivers/usb/gadget/udc/pch_udc.c-173-\ndrivers/usb/gadget/udc/pch_udc.c:174:#define PCH_UDC_CSR(ep)\t(UDC_CSR_ADDR + ep*4)\ndrivers/usb/gadget/udc/pch_udc.c:175:#define PCH_UDC_EPINT(in, num)\\\ndrivers/usb/gadget/udc/pch_udc.c-176-\t\t(1 \u003c\u003c (num + (in ? UDC_EPINT_IN_SHIFT : UDC_EPINT_OUT_SHIFT)))\n--\ndrivers/usb/gadget/udc/pch_udc.c-182-#define UDC_EPOUT_IDX(ep)\t(ep * 2 + 1)\ndrivers/usb/gadget/udc/pch_udc.c:183:#define PCH_UDC_EP0\t\t0\ndrivers/usb/gadget/udc/pch_udc.c:184:#define PCH_UDC_EP1\t\t1\ndrivers/usb/gadget/udc/pch_udc.c:185:#define PCH_UDC_EP2\t\t2\ndrivers/usb/gadget/udc/pch_udc.c:186:#define PCH_UDC_EP3\t\t3\ndrivers/usb/gadget/udc/pch_udc.c-187-\ndrivers/usb/gadget/udc/pch_udc.c-188-/* Number of endpoint */\ndrivers/usb/gadget/udc/pch_udc.c:189:#define PCH_UDC_EP_NUM\t\t32\t/* Total number of EPs (16 IN,16 OUT) */\ndrivers/usb/gadget/udc/pch_udc.c:190:#define PCH_UDC_USED_EP_NUM\t4\t/* EP number of EP's really used */\ndrivers/usb/gadget/udc/pch_udc.c-191-/* Length Value */\ndrivers/usb/gadget/udc/pch_udc.c:192:#define PCH_UDC_BRLEN\t\t0x0F\t/* Burst length */\ndrivers/usb/gadget/udc/pch_udc.c:193:#define PCH_UDC_THLEN\t\t0x1F\t/* Threshold length */\ndrivers/usb/gadget/udc/pch_udc.c-194-/* Value of EP Buffer Size */\n--\ndrivers/usb/gadget/udc/pch_udc.c=232=struct pch_udc_stp_dma_desc {\n--\ndrivers/usb/gadget/udc/pch_udc.c-239-/* Buffer status */\ndrivers/usb/gadget/udc/pch_udc.c:240:#define PCH_UDC_BUFF_STS\t0xC0000000\ndrivers/usb/gadget/udc/pch_udc.c:241:#define PCH_UDC_BS_HST_RDY\t0x00000000\ndrivers/usb/gadget/udc/pch_udc.c:242:#define PCH_UDC_BS_DMA_BSY\t0x40000000\ndrivers/usb/gadget/udc/pch_udc.c:243:#define PCH_UDC_BS_DMA_DONE\t0x80000000\ndrivers/usb/gadget/udc/pch_udc.c:244:#define PCH_UDC_BS_HST_BSY\t0xC0000000\ndrivers/usb/gadget/udc/pch_udc.c-245-/*  Rx/Tx Status */\ndrivers/usb/gadget/udc/pch_udc.c:246:#define PCH_UDC_RXTX_STS\t0x30000000\ndrivers/usb/gadget/udc/pch_udc.c:247:#define PCH_UDC_RTS_SUCC\t0x00000000\ndrivers/usb/gadget/udc/pch_udc.c:248:#define PCH_UDC_RTS_DESERR\t0x10000000\ndrivers/usb/gadget/udc/pch_udc.c:249:#define PCH_UDC_RTS_BUFERR\t0x30000000\ndrivers/usb/gadget/udc/pch_udc.c-250-/* Last Descriptor Indication */\ndrivers/usb/gadget/udc/pch_udc.c:251:#define PCH_UDC_DMA_LAST\t0x08000000\ndrivers/usb/gadget/udc/pch_udc.c-252-/* Number of Rx/Tx Bytes Mask */\ndrivers/usb/gadget/udc/pch_udc.c:253:#define PCH_UDC_RXTX_BYTES\t0x0000ffff\ndrivers/usb/gadget/udc/pch_udc.c-254-\n--\ndrivers/usb/gadget/udc/pch_udc.c=337=struct pch_udc_dev {\n--\ndrivers/usb/gadget/udc/pch_udc.c-340-\tstruct pci_dev\t\t\t*pdev;\ndrivers/usb/gadget/udc/pch_udc.c:341:\tstruct pch_udc_ep\t\tep[PCH_UDC_EP_NUM];\ndrivers/usb/gadget/udc/pch_udc.c-342-\tspinlock_t\t\t\tlock; /* protects all state */\n--\ndrivers/usb/gadget/udc/pch_udc.c-361-\ndrivers/usb/gadget/udc/pch_udc.c:362:#define PCH_UDC_PCI_BAR_QUARK_X1000\t0\ndrivers/usb/gadget/udc/pch_udc.c:363:#define PCH_UDC_PCI_BAR\t\t\t1\ndrivers/usb/gadget/udc/pch_udc.c-364-\n--\ndrivers/usb/gadget/udc/pch_udc.c=471=static void pch_udc_write_csr(struct pch_udc_dev *dev, unsigned long val,\n--\ndrivers/usb/gadget/udc/pch_udc.c-473-{\ndrivers/usb/gadget/udc/pch_udc.c:474:\tunsigned long reg = PCH_UDC_CSR(ep);\ndrivers/usb/gadget/udc/pch_udc.c-475-\n--\ndrivers/usb/gadget/udc/pch_udc.c=488=static u32 pch_udc_read_csr(struct pch_udc_dev *dev, unsigned int ep)\ndrivers/usb/gadget/udc/pch_udc.c-489-{\ndrivers/usb/gadget/udc/pch_udc.c:490:\tunsigned long reg = PCH_UDC_CSR(ep);\ndrivers/usb/gadget/udc/pch_udc.c-491-\n--\ndrivers/usb/gadget/udc/pch_udc.c=1042=static void pch_udc_init(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-1070-\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR,\ndrivers/usb/gadget/udc/pch_udc.c:1071:\t\t\t(PCH_UDC_THLEN \u003c\u003c UDC_DEVCTL_THLEN_SHIFT) |\ndrivers/usb/gadget/udc/pch_udc.c:1072:\t\t\t(PCH_UDC_BRLEN \u003c\u003c UDC_DEVCTL_BRLEN_SHIFT) |\ndrivers/usb/gadget/udc/pch_udc.c-1073-\t\t\tUDC_DEVCTL_MODE | UDC_DEVCTL_BREN |\n--\ndrivers/usb/gadget/udc/pch_udc.c=1501=static int pch_udc_create_dma_chain(struct pch_udc_ep *ep,\n--\ndrivers/usb/gadget/udc/pch_udc.c-1514-\ttd-\u003edataptr = req-\u003ereq.dma;\ndrivers/usb/gadget/udc/pch_udc.c:1515:\ttd-\u003estatus = PCH_UDC_BS_HST_BSY;\ndrivers/usb/gadget/udc/pch_udc.c-1516-\ndrivers/usb/gadget/udc/pch_udc.c-1517-\tfor (; ; bytes -= buf_len, ++len) {\ndrivers/usb/gadget/udc/pch_udc.c:1518:\t\ttd-\u003estatus = PCH_UDC_BS_HST_BSY | min(buf_len, bytes);\ndrivers/usb/gadget/udc/pch_udc.c-1519-\t\tif (bytes \u003c= buf_len)\n--\ndrivers/usb/gadget/udc/pch_udc.c-1531-\treq-\u003etd_data_last = td;\ndrivers/usb/gadget/udc/pch_udc.c:1532:\ttd-\u003estatus |= PCH_UDC_DMA_LAST;\ndrivers/usb/gadget/udc/pch_udc.c-1533-\ttd-\u003enext = req-\u003etd_data_phys;\n--\ndrivers/usb/gadget/udc/pch_udc.c=1557=static int prepare_dma(struct pch_udc_ep *ep, struct pch_udc_request *req,\n--\ndrivers/usb/gadget/udc/pch_udc.c-1569-\t\treq-\u003etd_data-\u003estatus = (req-\u003etd_data-\u003estatus \u0026\ndrivers/usb/gadget/udc/pch_udc.c:1570:\t\t\t\t~PCH_UDC_BUFF_STS) | PCH_UDC_BS_HST_RDY;\ndrivers/usb/gadget/udc/pch_udc.c-1571-\treturn 0;\n--\ndrivers/usb/gadget/udc/pch_udc.c=1606=static void pch_udc_start_rxrequest(struct pch_udc_ep *ep,\n--\ndrivers/usb/gadget/udc/pch_udc.c-1614-\twhile (1) {\ndrivers/usb/gadget/udc/pch_udc.c:1615:\t\ttd_data-\u003estatus = (td_data-\u003estatus \u0026 ~PCH_UDC_BUFF_STS) |\ndrivers/usb/gadget/udc/pch_udc.c:1616:\t\t\t\t    PCH_UDC_BS_HST_RDY;\ndrivers/usb/gadget/udc/pch_udc.c:1617:\t\tif ((td_data-\u003estatus \u0026 PCH_UDC_DMA_LAST) ==  PCH_UDC_DMA_LAST)\ndrivers/usb/gadget/udc/pch_udc.c-1618-\t\t\tbreak;\n--\ndrivers/usb/gadget/udc/pch_udc.c=1641=static int pch_udc_pcd_ep_enable(struct usb_ep *usbep,\n--\ndrivers/usb/gadget/udc/pch_udc.c-1660-\tep-\u003eep.maxpacket = usb_endpoint_maxp(desc);\ndrivers/usb/gadget/udc/pch_udc.c:1661:\tpch_udc_enable_ep_interrupts(ep-\u003edev, PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-1662-\tspin_unlock_irqrestore(\u0026dev-\u003elock, iflags);\n--\ndrivers/usb/gadget/udc/pch_udc.c=1675=static int pch_udc_pcd_ep_disable(struct usb_ep *usbep)\n--\ndrivers/usb/gadget/udc/pch_udc.c-1690-\tpch_udc_ep_disable(ep);\ndrivers/usb/gadget/udc/pch_udc.c:1691:\tpch_udc_disable_ep_interrupts(ep-\u003edev, PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-1692-\tep-\u003eep.desc = NULL;\n--\ndrivers/usb/gadget/udc/pch_udc.c=1708=static struct usb_request *pch_udc_alloc_request(struct usb_ep *usbep,\n--\ndrivers/usb/gadget/udc/pch_udc.c-1732-\t/* prevent from using desc. - set HOST BUSY */\ndrivers/usb/gadget/udc/pch_udc.c:1733:\tdma_desc-\u003estatus |= PCH_UDC_BS_HST_BSY;\ndrivers/usb/gadget/udc/pch_udc.c-1734-\tdma_desc-\u003edataptr = lower_32_bits(DMA_ADDR_INVALID);\n--\ndrivers/usb/gadget/udc/pch_udc.c=1891=static int pch_udc_pcd_set_halt(struct usb_ep *usbep, int halt)\n--\ndrivers/usb/gadget/udc/pch_udc.c-1906-\t\tif (halt) {\ndrivers/usb/gadget/udc/pch_udc.c:1907:\t\t\tif (ep-\u003enum == PCH_UDC_EP0)\ndrivers/usb/gadget/udc/pch_udc.c-1908-\t\t\t\tep-\u003edev-\u003estall = 1;\n--\ndrivers/usb/gadget/udc/pch_udc.c-1910-\t\t\tpch_udc_enable_ep_interrupts(\ndrivers/usb/gadget/udc/pch_udc.c:1911:\t\t\t\tep-\u003edev, PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-1912-\t\t} else {\n--\ndrivers/usb/gadget/udc/pch_udc.c=1932=static int pch_udc_pcd_set_wedge(struct usb_ep *usbep)\n--\ndrivers/usb/gadget/udc/pch_udc.c-1948-\t} else {\ndrivers/usb/gadget/udc/pch_udc.c:1949:\t\tif (ep-\u003enum == PCH_UDC_EP0)\ndrivers/usb/gadget/udc/pch_udc.c-1950-\t\t\tep-\u003edev-\u003estall = 1;\n--\ndrivers/usb/gadget/udc/pch_udc.c-1952-\t\tpch_udc_enable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:1953:\t\t\t\t\t     PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-1954-\t\tep-\u003edev-\u003eprot_stall = 1;\n--\ndrivers/usb/gadget/udc/pch_udc.c=1994=static void pch_udc_init_setup_buff(struct pch_udc_stp_dma_desc *td_stp)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2001-\tmemset(\u0026td_stp-\u003erequest, 0xFF, sizeof td_stp-\u003erequest);\ndrivers/usb/gadget/udc/pch_udc.c:2002:\ttd_stp-\u003estatus = PCH_UDC_BS_HST_RDY;\ndrivers/usb/gadget/udc/pch_udc.c-2003-}\n--\ndrivers/usb/gadget/udc/pch_udc.c=2010=static void pch_udc_start_next_txrequest(struct pch_udc_ep *ep)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2031-\twhile (1) {\ndrivers/usb/gadget/udc/pch_udc.c:2032:\t\ttd_data-\u003estatus = (td_data-\u003estatus \u0026 ~PCH_UDC_BUFF_STS) |\ndrivers/usb/gadget/udc/pch_udc.c:2033:\t\t\t\t   PCH_UDC_BS_HST_RDY;\ndrivers/usb/gadget/udc/pch_udc.c:2034:\t\tif ((td_data-\u003estatus \u0026 PCH_UDC_DMA_LAST) == PCH_UDC_DMA_LAST)\ndrivers/usb/gadget/udc/pch_udc.c-2035-\t\t\tbreak;\n--\ndrivers/usb/gadget/udc/pch_udc.c-2040-\tpch_udc_ep_set_pd(ep);\ndrivers/usb/gadget/udc/pch_udc.c:2041:\tpch_udc_enable_ep_interrupts(ep-\u003edev, PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2042-\tpch_udc_ep_clear_nak(ep);\n--\ndrivers/usb/gadget/udc/pch_udc.c=2049=static void pch_udc_complete_transfer(struct pch_udc_ep *ep)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2056-\treq = list_entry(ep-\u003equeue.next, struct pch_udc_request, queue);\ndrivers/usb/gadget/udc/pch_udc.c:2057:\tif ((req-\u003etd_data_last-\u003estatus \u0026 PCH_UDC_BUFF_STS) !=\ndrivers/usb/gadget/udc/pch_udc.c:2058:\t    PCH_UDC_BS_DMA_DONE)\ndrivers/usb/gadget/udc/pch_udc.c-2059-\t\treturn;\ndrivers/usb/gadget/udc/pch_udc.c:2060:\tif ((req-\u003etd_data_last-\u003estatus \u0026 PCH_UDC_RXTX_STS) !=\ndrivers/usb/gadget/udc/pch_udc.c:2061:\t     PCH_UDC_RTS_SUCC) {\ndrivers/usb/gadget/udc/pch_udc.c-2062-\t\tdev_err(\u0026dev-\u003epdev-\u003edev, \"Invalid RXTX status (0x%08x) \"\ndrivers/usb/gadget/udc/pch_udc.c-2063-\t\t\t\"epstatus=0x%08x\\n\",\ndrivers/usb/gadget/udc/pch_udc.c:2064:\t\t       (req-\u003etd_data_last-\u003estatus \u0026 PCH_UDC_RXTX_STS),\ndrivers/usb/gadget/udc/pch_udc.c-2065-\t\t       (int)(ep-\u003eepsts));\n--\ndrivers/usb/gadget/udc/pch_udc.c-2069-\treq-\u003ereq.actual = req-\u003ereq.length;\ndrivers/usb/gadget/udc/pch_udc.c:2070:\treq-\u003etd_data_last-\u003estatus = PCH_UDC_BS_HST_BSY | PCH_UDC_DMA_LAST;\ndrivers/usb/gadget/udc/pch_udc.c:2071:\treq-\u003etd_data-\u003estatus = PCH_UDC_BS_HST_BSY | PCH_UDC_DMA_LAST;\ndrivers/usb/gadget/udc/pch_udc.c-2072-\tcomplete_req(ep, req, 0);\n--\ndrivers/usb/gadget/udc/pch_udc.c-2077-\t\tpch_udc_enable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:2078:\t\t\t\t\t     PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2079-\t} else {\ndrivers/usb/gadget/udc/pch_udc.c-2080-\t\tpch_udc_disable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:2081:\t\t\t\t\t      PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2082-\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c=2089=static void pch_udc_complete_receiver(struct pch_udc_ep *ep)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2102-\tpch_udc_ep_set_ddptr(ep, 0);\ndrivers/usb/gadget/udc/pch_udc.c:2103:\tif ((req-\u003etd_data_last-\u003estatus \u0026 PCH_UDC_BUFF_STS) ==\ndrivers/usb/gadget/udc/pch_udc.c:2104:\t    PCH_UDC_BS_DMA_DONE)\ndrivers/usb/gadget/udc/pch_udc.c-2105-\t\ttd = req-\u003etd_data_last;\n--\ndrivers/usb/gadget/udc/pch_udc.c-2109-\twhile (1) {\ndrivers/usb/gadget/udc/pch_udc.c:2110:\t\tif ((td-\u003estatus \u0026 PCH_UDC_RXTX_STS) != PCH_UDC_RTS_SUCC) {\ndrivers/usb/gadget/udc/pch_udc.c-2111-\t\t\tdev_err(\u0026dev-\u003epdev-\u003edev, \"Invalid RXTX status=0x%08x \"\ndrivers/usb/gadget/udc/pch_udc.c-2112-\t\t\t\t\"epstatus=0x%08x\\n\",\ndrivers/usb/gadget/udc/pch_udc.c:2113:\t\t\t\t(req-\u003etd_data-\u003estatus \u0026 PCH_UDC_RXTX_STS),\ndrivers/usb/gadget/udc/pch_udc.c-2114-\t\t\t\t(int)(ep-\u003eepsts));\n--\ndrivers/usb/gadget/udc/pch_udc.c-2116-\t\t}\ndrivers/usb/gadget/udc/pch_udc.c:2117:\t\tif ((td-\u003estatus \u0026 PCH_UDC_BUFF_STS) == PCH_UDC_BS_DMA_DONE)\ndrivers/usb/gadget/udc/pch_udc.c:2118:\t\t\tif (td-\u003estatus \u0026 PCH_UDC_DMA_LAST) {\ndrivers/usb/gadget/udc/pch_udc.c:2119:\t\t\t\tcount = td-\u003estatus \u0026 PCH_UDC_RXTX_BYTES;\ndrivers/usb/gadget/udc/pch_udc.c-2120-\t\t\t\tbreak;\n--\ndrivers/usb/gadget/udc/pch_udc.c-2131-\t\tcount = UDC_DMA_MAXPACKET;\ndrivers/usb/gadget/udc/pch_udc.c:2132:\treq-\u003etd_data-\u003estatus |= PCH_UDC_DMA_LAST;\ndrivers/usb/gadget/udc/pch_udc.c:2133:\ttd-\u003estatus |= PCH_UDC_BS_HST_BSY;\ndrivers/usb/gadget/udc/pch_udc.c-2134-\n--\ndrivers/usb/gadget/udc/pch_udc.c=2151=static void pch_udc_svc_data_in(struct pch_udc_dev *dev, int ep_num)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2170-\t\tpch_udc_enable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:2171:\t\t\t\t\t     PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2172-\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c-2178-\t\t\tpch_udc_enable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:2179:\t\t\t\t\t\tPCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2180-\t\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c=2195=static void pch_udc_svc_data_out(struct pch_udc_dev *dev, int ep_num)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2208-\t\t\t\t queue);\ndrivers/usb/gadget/udc/pch_udc.c:2209:\t\tif ((req-\u003etd_data_last-\u003estatus \u0026 PCH_UDC_BUFF_STS) !=\ndrivers/usb/gadget/udc/pch_udc.c:2210:\t\t     PCH_UDC_BS_DMA_DONE) {\ndrivers/usb/gadget/udc/pch_udc.c-2211-\t\t\tif (!req-\u003edma_going)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2220-\t\tpch_udc_enable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:2221:\t\t\t\t\t     PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2222-\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c-2228-\t\t\tpch_udc_enable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:2229:\t\t\t\t\t\tPCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2230-\t\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c-2236-\t\t\tpch_udc_enable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:2237:\t\t\t\t\t\tPCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2238-\t\t} else {\n--\ndrivers/usb/gadget/udc/pch_udc.c=2265=static void pch_udc_svc_control_in(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2287-\t\tep_out-\u003etd_data-\u003estatus = (ep_out-\u003etd_data-\u003estatus \u0026\ndrivers/usb/gadget/udc/pch_udc.c:2288:\t\t\t\t\t~PCH_UDC_BUFF_STS) |\ndrivers/usb/gadget/udc/pch_udc.c:2289:\t\t\t\t\tPCH_UDC_BS_HST_RDY;\ndrivers/usb/gadget/udc/pch_udc.c-2290-\t\tpch_udc_ep_clear_nak(ep_out);\n--\ndrivers/usb/gadget/udc/pch_udc.c=2305=static void pch_udc_svc_control_out(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2340-\t\t\tep-\u003etd_data-\u003estatus = (ep-\u003etd_data-\u003estatus \u0026\ndrivers/usb/gadget/udc/pch_udc.c:2341:\t\t\t\t\t\t~PCH_UDC_BUFF_STS) |\ndrivers/usb/gadget/udc/pch_udc.c:2342:\t\t\t\t\t\tPCH_UDC_BS_HST_RDY;\ndrivers/usb/gadget/udc/pch_udc.c-2343-\t\t\tpch_udc_ep_set_ddptr(ep, ep-\u003etd_data_phys);\n--\ndrivers/usb/gadget/udc/pch_udc.c-2358-\t\t\tpch_udc_enable_ep_interrupts(ep-\u003edev,\ndrivers/usb/gadget/udc/pch_udc.c:2359:\t\t\t\t\t\tPCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2360-\t\t\tdev-\u003estall = 0;\n--\ndrivers/usb/gadget/udc/pch_udc.c-2370-\t\t\tep-\u003eepsts = stat;\ndrivers/usb/gadget/udc/pch_udc.c:2371:\t\t\tpch_udc_svc_data_out(dev, PCH_UDC_EP0);\ndrivers/usb/gadget/udc/pch_udc.c-2372-\t\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c=2385=static void pch_udc_postsvc_epinters(struct pch_udc_dev *dev, int ep_num)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2389-\t\treturn;\ndrivers/usb/gadget/udc/pch_udc.c:2390:\tpch_udc_enable_ep_interrupts(ep-\u003edev, PCH_UDC_EPINT(ep-\u003ein, ep-\u003enum));\ndrivers/usb/gadget/udc/pch_udc.c-2391-\tpch_udc_ep_clear_nak(ep);\n--\ndrivers/usb/gadget/udc/pch_udc.c=2399=static void pch_udc_read_all_epstatus(struct pch_udc_dev *dev, u32 ep_intr)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2403-\ndrivers/usb/gadget/udc/pch_udc.c:2404:\tfor (i = 0; i \u003c PCH_UDC_USED_EP_NUM; i++) {\ndrivers/usb/gadget/udc/pch_udc.c-2405-\t\t/* IN */\n--\ndrivers/usb/gadget/udc/pch_udc.c=2425=static void pch_udc_activate_control_ep(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2458-\t/* Initialize the dma descriptor */\ndrivers/usb/gadget/udc/pch_udc.c:2459:\tep-\u003etd_data-\u003estatus  = PCH_UDC_DMA_LAST;\ndrivers/usb/gadget/udc/pch_udc.c-2460-\tep-\u003etd_data-\u003edataptr = dev-\u003edma_addr;\n--\ndrivers/usb/gadget/udc/pch_udc.c=2471=static void pch_udc_svc_ur_interrupt(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2482-\ndrivers/usb/gadget/udc/pch_udc.c:2483:\tfor (i = 0; i \u003c PCH_UDC_EP_NUM; i++) {\ndrivers/usb/gadget/udc/pch_udc.c-2484-\t\tep = \u0026dev-\u003eep[i];\n--\ndrivers/usb/gadget/udc/pch_udc.c-2495-\t/* disable ep to empty req queue. Skip the control EP's */\ndrivers/usb/gadget/udc/pch_udc.c:2496:\tfor (i = 0; i \u003c (PCH_UDC_USED_EP_NUM*2); i++) {\ndrivers/usb/gadget/udc/pch_udc.c-2497-\t\tep = \u0026dev-\u003eep[i];\n--\ndrivers/usb/gadget/udc/pch_udc.c=2554=static void pch_udc_svc_intf_interrupt(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2578-\tpch_udc_write_csr(dev, reg, UDC_EP0OUT_IDX);\ndrivers/usb/gadget/udc/pch_udc.c:2579:\tfor (i = 0; i \u003c PCH_UDC_USED_EP_NUM * 2; i++) {\ndrivers/usb/gadget/udc/pch_udc.c-2580-\t\t/* clear stall bits */\n--\ndrivers/usb/gadget/udc/pch_udc.c=2593=static void pch_udc_svc_cfg_interrupt(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2611-\tpch_udc_write_csr(dev, reg, UDC_EP0OUT_IDX);\ndrivers/usb/gadget/udc/pch_udc.c:2612:\tfor (i = 0; i \u003c PCH_UDC_USED_EP_NUM * 2; i++) {\ndrivers/usb/gadget/udc/pch_udc.c-2613-\t\t/* clear stall bits */\n--\ndrivers/usb/gadget/udc/pch_udc.c=2690=static irqreturn_t pch_udc_isr(int irq, void *pdev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2728-\t\t/* Process data in end point interrupts */\ndrivers/usb/gadget/udc/pch_udc.c:2729:\t\tfor (i = 1; i \u003c PCH_UDC_USED_EP_NUM; i++) {\ndrivers/usb/gadget/udc/pch_udc.c-2730-\t\t\tif (ep_intr \u0026 (1 \u003c\u003c  i)) {\n--\ndrivers/usb/gadget/udc/pch_udc.c-2736-\t\tfor (i = UDC_EPINT_OUT_SHIFT + 1; i \u003c (UDC_EPINT_OUT_SHIFT +\ndrivers/usb/gadget/udc/pch_udc.c:2737:\t\t\t\t\t\t PCH_UDC_USED_EP_NUM); i++)\ndrivers/usb/gadget/udc/pch_udc.c-2738-\t\t\tif (ep_intr \u0026 (1 \u003c\u003c  i))\n--\ndrivers/usb/gadget/udc/pch_udc.c=2765=static void pch_udc_pcd_reinit(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2781-\tmemset(dev-\u003eep, 0, sizeof dev-\u003eep);\ndrivers/usb/gadget/udc/pch_udc.c:2782:\tfor (i = 0; i \u003c PCH_UDC_EP_NUM; i++) {\ndrivers/usb/gadget/udc/pch_udc.c-2783-\t\tstruct pch_udc_ep *ep = \u0026dev-\u003eep[i];\n--\ndrivers/usb/gadget/udc/pch_udc.c=2961=static int pch_udc_quark_platform_init(struct device *d)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2964-\ndrivers/usb/gadget/udc/pch_udc.c:2965:\tdev-\u003ebar = PCH_UDC_PCI_BAR_QUARK_X1000;\ndrivers/usb/gadget/udc/pch_udc.c-2966-\treturn 0;\n--\ndrivers/usb/gadget/udc/pch_udc.c=3039=static int pch_udc_probe(struct pci_dev *pdev, const struct pci_device_id *id)\n--\ndrivers/usb/gadget/udc/pch_udc.c-3054-\ndrivers/usb/gadget/udc/pch_udc.c:3055:\tdev-\u003ebar = PCH_UDC_PCI_BAR;\ndrivers/usb/gadget/udc/pch_udc.c-3056-\tdev-\u003epdev = pdev;\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 13088
							output: 34
							thoughts: 13
						

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

**Kconfig Dive for pch_udc**

Okay, first things first, gotta zero in on the `pch_udc` configuration. The most logical starting point is the Kconfig files, since that's where all the build-time options and dependencies are defined. I'm going to quickly check how `pch_udc` is defined and what other options might influence it. I'll need to look for dependencies, any default settings, and of course, any relationships to other USB or platform-specific configurations. The goal is to understand its current state and any potential conflicts or side effects before I start digging into the driver code itself. Gotta make sure the Kconfig settings are sane before I waste time on debugging. It's a fundamental part of the build system, so this is where I need to get it right.



6/2 2026/09/19 23:13 tool grepper
0m Args:
{
  "Expression": "pch_udc",
  "PathPrefix": "drivers/usb/gadget/udc/"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 1855 lines.\nUse more precise expression if possible.\n\ndrivers/usb/gadget/udc/Makefile=31=obj-$(CONFIG_USB_LPC32XX)\t+= lpc32xx_udc.o\ndrivers/usb/gadget/udc/Makefile:32:obj-$(CONFIG_USB_EG20T)\t\t+= pch_udc.o\ndrivers/usb/gadget/udc/Makefile-33-obj-$(CONFIG_USB_GR_UDC)\t+= gr_udc.o\n--\ndrivers/usb/gadget/udc/pch_udc.c-210-/**\ndrivers/usb/gadget/udc/pch_udc.c:211: * struct pch_udc_data_dma_desc - Structure to hold DMA descriptor information\ndrivers/usb/gadget/udc/pch_udc.c-212- *\t\t\t\t  for data\n--\ndrivers/usb/gadget/udc/pch_udc.c-217- */\ndrivers/usb/gadget/udc/pch_udc.c:218:struct pch_udc_data_dma_desc {\ndrivers/usb/gadget/udc/pch_udc.c-219-\tu32 status;\n--\ndrivers/usb/gadget/udc/pch_udc.c-225-/**\ndrivers/usb/gadget/udc/pch_udc.c:226: * struct pch_udc_stp_dma_desc - Structure to hold DMA descriptor information\ndrivers/usb/gadget/udc/pch_udc.c-227- *\t\t\t\t for control data\n--\ndrivers/usb/gadget/udc/pch_udc.c-231- */\ndrivers/usb/gadget/udc/pch_udc.c:232:struct pch_udc_stp_dma_desc {\ndrivers/usb/gadget/udc/pch_udc.c-233-\tu32 status;\n--\ndrivers/usb/gadget/udc/pch_udc.c-255-/**\ndrivers/usb/gadget/udc/pch_udc.c:256: * struct pch_udc_cfg_data - Structure to hold current configuration\ndrivers/usb/gadget/udc/pch_udc.c-257- *\t\t\t     and interface information\n--\ndrivers/usb/gadget/udc/pch_udc.c-261- */\ndrivers/usb/gadget/udc/pch_udc.c:262:struct pch_udc_cfg_data {\ndrivers/usb/gadget/udc/pch_udc.c-263-\tu16 cur_cfg;\n--\ndrivers/usb/gadget/udc/pch_udc.c-268-/**\ndrivers/usb/gadget/udc/pch_udc.c:269: * struct pch_udc_ep - Structure holding a PCH USB device Endpoint information\ndrivers/usb/gadget/udc/pch_udc.c-270- * @ep:\t\t\tembedded ep request\n--\ndrivers/usb/gadget/udc/pch_udc.c-282- */\ndrivers/usb/gadget/udc/pch_udc.c:283:struct pch_udc_ep {\ndrivers/usb/gadget/udc/pch_udc.c-284-\tstruct usb_ep\t\t\tep;\n--\ndrivers/usb/gadget/udc/pch_udc.c-286-\tdma_addr_t\t\t\ttd_data_phys;\ndrivers/usb/gadget/udc/pch_udc.c:287:\tstruct pch_udc_stp_dma_desc\t*td_stp;\ndrivers/usb/gadget/udc/pch_udc.c:288:\tstruct pch_udc_data_dma_desc\t*td_data;\ndrivers/usb/gadget/udc/pch_udc.c:289:\tstruct pch_udc_dev\t\t*dev;\ndrivers/usb/gadget/udc/pch_udc.c-290-\tunsigned long\t\t\toffset_addr;\n--\ndrivers/usb/gadget/udc/pch_udc.c=306=struct pch_vbus_gpio_data {\n--\ndrivers/usb/gadget/udc/pch_udc.c-313-/**\ndrivers/usb/gadget/udc/pch_udc.c:314: * struct pch_udc_dev - Structure holding complete information\ndrivers/usb/gadget/udc/pch_udc.c-315- *\t\t\tof the PCH USB device\n--\ndrivers/usb/gadget/udc/pch_udc.c-336- */\ndrivers/usb/gadget/udc/pch_udc.c:337:struct pch_udc_dev {\ndrivers/usb/gadget/udc/pch_udc.c-338-\tstruct usb_gadget\t\tgadget;\n--\ndrivers/usb/gadget/udc/pch_udc.c-340-\tstruct pci_dev\t\t\t*pdev;\ndrivers/usb/gadget/udc/pch_udc.c:341:\tstruct pch_udc_ep\t\tep[PCH_UDC_EP_NUM];\ndrivers/usb/gadget/udc/pch_udc.c-342-\tspinlock_t\t\t\tlock; /* protects all state */\n--\ndrivers/usb/gadget/udc/pch_udc.c-356-\tunsigned short\t\t\tbar;\ndrivers/usb/gadget/udc/pch_udc.c:357:\tstruct pch_udc_cfg_data\t\tcfg_data;\ndrivers/usb/gadget/udc/pch_udc.c-358-\tstruct pch_vbus_gpio_data\tvbus_gpio;\ndrivers/usb/gadget/udc/pch_udc.c-359-};\ndrivers/usb/gadget/udc/pch_udc.c:360:#define to_pch_udc(g)\t(container_of((g), struct pch_udc_dev, gadget))\ndrivers/usb/gadget/udc/pch_udc.c-361-\n--\ndrivers/usb/gadget/udc/pch_udc.c=375=MODULE_PARM_DESC(speed_fs, \"true for Full speed operation\");\n--\ndrivers/usb/gadget/udc/pch_udc.c-377-/**\ndrivers/usb/gadget/udc/pch_udc.c:378: * struct pch_udc_request - Structure holding a PCH USB device request packet\ndrivers/usb/gadget/udc/pch_udc.c-379- * @req:\t\tembedded ep request\n--\ndrivers/usb/gadget/udc/pch_udc.c-387- */\ndrivers/usb/gadget/udc/pch_udc.c:388:struct pch_udc_request {\ndrivers/usb/gadget/udc/pch_udc.c-389-\tstruct usb_request\t\treq;\ndrivers/usb/gadget/udc/pch_udc.c-390-\tdma_addr_t\t\t\ttd_data_phys;\ndrivers/usb/gadget/udc/pch_udc.c:391:\tstruct pch_udc_data_dma_desc\t*td_data;\ndrivers/usb/gadget/udc/pch_udc.c:392:\tstruct pch_udc_data_dma_desc\t*td_data_last;\ndrivers/usb/gadget/udc/pch_udc.c-393-\tstruct list_head\t\tqueue;\n--\ndrivers/usb/gadget/udc/pch_udc.c-398-\ndrivers/usb/gadget/udc/pch_udc.c:399:static inline u32 pch_udc_readl(struct pch_udc_dev *dev, unsigned long reg)\ndrivers/usb/gadget/udc/pch_udc.c-400-{\n--\ndrivers/usb/gadget/udc/pch_udc.c-403-\ndrivers/usb/gadget/udc/pch_udc.c:404:static inline void pch_udc_writel(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-405-\t\t\t\t    unsigned long val, unsigned long reg)\n--\ndrivers/usb/gadget/udc/pch_udc.c-409-\ndrivers/usb/gadget/udc/pch_udc.c:410:static inline void pch_udc_bit_set(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-411-\t\t\t\t     unsigned long reg,\n--\ndrivers/usb/gadget/udc/pch_udc.c-413-{\ndrivers/usb/gadget/udc/pch_udc.c:414:\tpch_udc_writel(dev, pch_udc_readl(dev, reg) | bitmask, reg);\ndrivers/usb/gadget/udc/pch_udc.c-415-}\ndrivers/usb/gadget/udc/pch_udc.c-416-\ndrivers/usb/gadget/udc/pch_udc.c:417:static inline void pch_udc_bit_clr(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-418-\t\t\t\t     unsigned long reg,\n--\ndrivers/usb/gadget/udc/pch_udc.c-420-{\ndrivers/usb/gadget/udc/pch_udc.c:421:\tpch_udc_writel(dev, pch_udc_readl(dev, reg) \u0026 ~(bitmask), reg);\ndrivers/usb/gadget/udc/pch_udc.c-422-}\ndrivers/usb/gadget/udc/pch_udc.c-423-\ndrivers/usb/gadget/udc/pch_udc.c:424:static inline u32 pch_udc_ep_readl(struct pch_udc_ep *ep, unsigned long reg)\ndrivers/usb/gadget/udc/pch_udc.c-425-{\n--\ndrivers/usb/gadget/udc/pch_udc.c-428-\ndrivers/usb/gadget/udc/pch_udc.c:429:static inline void pch_udc_ep_writel(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-430-\t\t\t\t    unsigned long val, unsigned long reg)\n--\ndrivers/usb/gadget/udc/pch_udc.c-434-\ndrivers/usb/gadget/udc/pch_udc.c:435:static inline void pch_udc_ep_bit_set(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-436-\t\t\t\t     unsigned long reg,\n--\ndrivers/usb/gadget/udc/pch_udc.c-438-{\ndrivers/usb/gadget/udc/pch_udc.c:439:\tpch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) | bitmask, reg);\ndrivers/usb/gadget/udc/pch_udc.c-440-}\ndrivers/usb/gadget/udc/pch_udc.c-441-\ndrivers/usb/gadget/udc/pch_udc.c:442:static inline void pch_udc_ep_bit_clr(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-443-\t\t\t\t     unsigned long reg,\n--\ndrivers/usb/gadget/udc/pch_udc.c-445-{\ndrivers/usb/gadget/udc/pch_udc.c:446:\tpch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) \u0026 ~(bitmask), reg);\ndrivers/usb/gadget/udc/pch_udc.c-447-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-449-/**\ndrivers/usb/gadget/udc/pch_udc.c:450: * pch_udc_csr_busy() - Wait till idle.\ndrivers/usb/gadget/udc/pch_udc.c:451: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-452- */\ndrivers/usb/gadget/udc/pch_udc.c:453:static void pch_udc_csr_busy(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-454-{\n--\ndrivers/usb/gadget/udc/pch_udc.c-457-\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c:458:\twhile ((pch_udc_readl(dev, UDC_CSR_BUSY_ADDR) \u0026 UDC_CSR_BUSY)\ndrivers/usb/gadget/udc/pch_udc.c-459-\t\t\u0026\u0026 --count)\n--\ndrivers/usb/gadget/udc/pch_udc.c-465-/**\ndrivers/usb/gadget/udc/pch_udc.c:466: * pch_udc_write_csr() - Write the command and status registers.\ndrivers/usb/gadget/udc/pch_udc.c:467: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-468- * @val:\tvalue to be written to CSR register\n--\ndrivers/usb/gadget/udc/pch_udc.c-470- */\ndrivers/usb/gadget/udc/pch_udc.c:471:static void pch_udc_write_csr(struct pch_udc_dev *dev, unsigned long val,\ndrivers/usb/gadget/udc/pch_udc.c-472-\t\t\t       unsigned int ep)\n--\ndrivers/usb/gadget/udc/pch_udc.c-475-\ndrivers/usb/gadget/udc/pch_udc.c:476:\tpch_udc_csr_busy(dev);\t\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c:477:\tpch_udc_writel(dev, val, reg);\ndrivers/usb/gadget/udc/pch_udc.c:478:\tpch_udc_csr_busy(dev);\t\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c-479-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-481-/**\ndrivers/usb/gadget/udc/pch_udc.c:482: * pch_udc_read_csr() - Read the command and status registers.\ndrivers/usb/gadget/udc/pch_udc.c:483: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-484- * @ep:\t\tend-point number\n--\ndrivers/usb/gadget/udc/pch_udc.c-487- */\ndrivers/usb/gadget/udc/pch_udc.c:488:static u32 pch_udc_read_csr(struct pch_udc_dev *dev, unsigned int ep)\ndrivers/usb/gadget/udc/pch_udc.c-489-{\n--\ndrivers/usb/gadget/udc/pch_udc.c-491-\ndrivers/usb/gadget/udc/pch_udc.c:492:\tpch_udc_csr_busy(dev);\t\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c:493:\tpch_udc_readl(dev, reg);\t/* Dummy read */\ndrivers/usb/gadget/udc/pch_udc.c:494:\tpch_udc_csr_busy(dev);\t\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c:495:\treturn pch_udc_readl(dev, reg);\ndrivers/usb/gadget/udc/pch_udc.c-496-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-498-/**\ndrivers/usb/gadget/udc/pch_udc.c:499: * pch_udc_rmt_wakeup() - Initiate for remote wakeup\ndrivers/usb/gadget/udc/pch_udc.c:500: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-501- */\ndrivers/usb/gadget/udc/pch_udc.c:502:static inline void pch_udc_rmt_wakeup(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-503-{\ndrivers/usb/gadget/udc/pch_udc.c:504:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c-505-\tmdelay(1);\ndrivers/usb/gadget/udc/pch_udc.c:506:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c-507-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-509-/**\ndrivers/usb/gadget/udc/pch_udc.c:510: * pch_udc_get_frame() - Get the current frame from device status register\ndrivers/usb/gadget/udc/pch_udc.c:511: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-512- * Retern\tcurrent frame\ndrivers/usb/gadget/udc/pch_udc.c-513- */\ndrivers/usb/gadget/udc/pch_udc.c:514:static inline int pch_udc_get_frame(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-515-{\ndrivers/usb/gadget/udc/pch_udc.c:516:\tu32 frame = pch_udc_readl(dev, UDC_DEVSTS_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-517-\treturn (frame \u0026 UDC_DEVSTS_TS_MASK) \u003e\u003e UDC_DEVSTS_TS_SHIFT;\n--\ndrivers/usb/gadget/udc/pch_udc.c-520-/**\ndrivers/usb/gadget/udc/pch_udc.c:521: * pch_udc_clear_selfpowered() - Clear the self power control\ndrivers/usb/gadget/udc/pch_udc.c:522: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-523- */\ndrivers/usb/gadget/udc/pch_udc.c:524:static inline void pch_udc_clear_selfpowered(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-525-{\ndrivers/usb/gadget/udc/pch_udc.c:526:\tpch_udc_bit_clr(dev, UDC_DEVCFG_ADDR, UDC_DEVCFG_SP);\ndrivers/usb/gadget/udc/pch_udc.c-527-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-529-/**\ndrivers/usb/gadget/udc/pch_udc.c:530: * pch_udc_set_selfpowered() - Set the self power control\ndrivers/usb/gadget/udc/pch_udc.c:531: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-532- */\ndrivers/usb/gadget/udc/pch_udc.c:533:static inline void pch_udc_set_selfpowered(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-534-{\ndrivers/usb/gadget/udc/pch_udc.c:535:\tpch_udc_bit_set(dev, UDC_DEVCFG_ADDR, UDC_DEVCFG_SP);\ndrivers/usb/gadget/udc/pch_udc.c-536-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-538-/**\ndrivers/usb/gadget/udc/pch_udc.c:539: * pch_udc_set_disconnect() - Set the disconnect status.\ndrivers/usb/gadget/udc/pch_udc.c:540: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-541- */\ndrivers/usb/gadget/udc/pch_udc.c:542:static inline void pch_udc_set_disconnect(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-543-{\ndrivers/usb/gadget/udc/pch_udc.c:544:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD);\ndrivers/usb/gadget/udc/pch_udc.c-545-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-547-/**\ndrivers/usb/gadget/udc/pch_udc.c:548: * pch_udc_clear_disconnect() - Clear the disconnect status.\ndrivers/usb/gadget/udc/pch_udc.c:549: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-550- */\ndrivers/usb/gadget/udc/pch_udc.c:551:static void pch_udc_clear_disconnect(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-552-{\ndrivers/usb/gadget/udc/pch_udc.c-553-\t/* Clear the disconnect */\ndrivers/usb/gadget/udc/pch_udc.c:554:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c:555:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD);\ndrivers/usb/gadget/udc/pch_udc.c-556-\tmdelay(1);\ndrivers/usb/gadget/udc/pch_udc.c-557-\t/* Resume USB signalling */\ndrivers/usb/gadget/udc/pch_udc.c:558:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c-559-}\ndrivers/usb/gadget/udc/pch_udc.c-560-\ndrivers/usb/gadget/udc/pch_udc.c:561:static void pch_udc_init(struct pch_udc_dev *dev);\ndrivers/usb/gadget/udc/pch_udc.c-562-\ndrivers/usb/gadget/udc/pch_udc.c-563-/**\ndrivers/usb/gadget/udc/pch_udc.c:564: * pch_udc_reconnect() - This API initializes usb device controller,\ndrivers/usb/gadget/udc/pch_udc.c-565- *\t\t\t\t\t\tand clear the disconnect status.\ndrivers/usb/gadget/udc/pch_udc.c:566: * @dev:\t\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-567- */\ndrivers/usb/gadget/udc/pch_udc.c:568:static void pch_udc_reconnect(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-569-{\ndrivers/usb/gadget/udc/pch_udc.c:570:\tpch_udc_init(dev);\ndrivers/usb/gadget/udc/pch_udc.c-571-\ndrivers/usb/gadget/udc/pch_udc.c-572-\t/* enable device interrupts */\ndrivers/usb/gadget/udc/pch_udc.c:573:\t/* pch_udc_enable_interrupts() */\ndrivers/usb/gadget/udc/pch_udc.c:574:\tpch_udc_bit_clr(dev, UDC_DEVIRQMSK_ADDR,\ndrivers/usb/gadget/udc/pch_udc.c-575-\t\t\tUDC_DEVINT_UR | UDC_DEVINT_ENUM);\n--\ndrivers/usb/gadget/udc/pch_udc.c-577-\t/* Clear the disconnect */\ndrivers/usb/gadget/udc/pch_udc.c:578:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c:579:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD);\ndrivers/usb/gadget/udc/pch_udc.c-580-\tmdelay(1);\ndrivers/usb/gadget/udc/pch_udc.c-581-\t/* Resume USB signalling */\ndrivers/usb/gadget/udc/pch_udc.c:582:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c-583-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-585-/**\ndrivers/usb/gadget/udc/pch_udc.c:586: * pch_udc_vbus_session() - set or clearr the disconnect status.\ndrivers/usb/gadget/udc/pch_udc.c:587: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-588- * @is_active:\tParameter specifying the action\n--\ndrivers/usb/gadget/udc/pch_udc.c-591- */\ndrivers/usb/gadget/udc/pch_udc.c:592:static inline void pch_udc_vbus_session(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-593-\t\t\t\t\t  int is_active)\n--\ndrivers/usb/gadget/udc/pch_udc.c-598-\tif (is_active) {\ndrivers/usb/gadget/udc/pch_udc.c:599:\t\tpch_udc_reconnect(dev);\ndrivers/usb/gadget/udc/pch_udc.c-600-\t\tdev-\u003evbus_session = 1;\n--\ndrivers/usb/gadget/udc/pch_udc.c-606-\t\t}\ndrivers/usb/gadget/udc/pch_udc.c:607:\t\tpch_udc_set_disconnect(dev);\ndrivers/usb/gadget/udc/pch_udc.c-608-\t\tdev-\u003evbus_session = 0;\n--\ndrivers/usb/gadget/udc/pch_udc.c-613-/**\ndrivers/usb/gadget/udc/pch_udc.c:614: * pch_udc_ep_set_stall() - Set the stall of endpoint\ndrivers/usb/gadget/udc/pch_udc.c:615: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-616- */\ndrivers/usb/gadget/udc/pch_udc.c:617:static void pch_udc_ep_set_stall(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-618-{\ndrivers/usb/gadget/udc/pch_udc.c-619-\tif (ep-\u003ein) {\ndrivers/usb/gadget/udc/pch_udc.c:620:\t\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_F);\ndrivers/usb/gadget/udc/pch_udc.c:621:\t\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S);\ndrivers/usb/gadget/udc/pch_udc.c-622-\t} else {\ndrivers/usb/gadget/udc/pch_udc.c:623:\t\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S);\ndrivers/usb/gadget/udc/pch_udc.c-624-\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c-627-/**\ndrivers/usb/gadget/udc/pch_udc.c:628: * pch_udc_ep_clear_stall() - Clear the stall of endpoint\ndrivers/usb/gadget/udc/pch_udc.c:629: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-630- */\ndrivers/usb/gadget/udc/pch_udc.c:631:static inline void pch_udc_ep_clear_stall(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-632-{\ndrivers/usb/gadget/udc/pch_udc.c-633-\t/* Clear the stall */\ndrivers/usb/gadget/udc/pch_udc.c:634:\tpch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S);\ndrivers/usb/gadget/udc/pch_udc.c-635-\t/* Clear NAK by writing CNAK */\ndrivers/usb/gadget/udc/pch_udc.c:636:\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_CNAK);\ndrivers/usb/gadget/udc/pch_udc.c-637-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-639-/**\ndrivers/usb/gadget/udc/pch_udc.c:640: * pch_udc_ep_set_trfr_type() - Set the transfer type of endpoint\ndrivers/usb/gadget/udc/pch_udc.c:641: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-642- * @type:\tType of endpoint\ndrivers/usb/gadget/udc/pch_udc.c-643- */\ndrivers/usb/gadget/udc/pch_udc.c:644:static inline void pch_udc_ep_set_trfr_type(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-645-\t\t\t\t\tu8 type)\ndrivers/usb/gadget/udc/pch_udc.c-646-{\ndrivers/usb/gadget/udc/pch_udc.c:647:\tpch_udc_ep_writel(ep, ((type \u003c\u003c UDC_EPCTL_ET_SHIFT) \u0026\ndrivers/usb/gadget/udc/pch_udc.c-648-\t\t\t\tUDC_EPCTL_ET_MASK), UDC_EPCTL_ADDR);\n--\ndrivers/usb/gadget/udc/pch_udc.c-651-/**\ndrivers/usb/gadget/udc/pch_udc.c:652: * pch_udc_ep_set_bufsz() - Set the maximum packet size for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:653: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-654- * @buf_size:\tThe buffer word size\n--\ndrivers/usb/gadget/udc/pch_udc.c-656- */\ndrivers/usb/gadget/udc/pch_udc.c:657:static void pch_udc_ep_set_bufsz(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-658-\t\t\t\t\t\t u32 buf_size, u32 ep_in)\n--\ndrivers/usb/gadget/udc/pch_udc.c-661-\tif (ep_in) {\ndrivers/usb/gadget/udc/pch_udc.c:662:\t\tdata = pch_udc_ep_readl(ep, UDC_BUFIN_FRAMENUM_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-663-\t\tdata = (data \u0026 0xffff0000) | (buf_size \u0026 0xffff);\ndrivers/usb/gadget/udc/pch_udc.c:664:\t\tpch_udc_ep_writel(ep, data, UDC_BUFIN_FRAMENUM_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-665-\t} else {\ndrivers/usb/gadget/udc/pch_udc.c:666:\t\tdata = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-667-\t\tdata = (buf_size \u003c\u003c 16) | (data \u0026 0xffff);\ndrivers/usb/gadget/udc/pch_udc.c:668:\t\tpch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-669-\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c-672-/**\ndrivers/usb/gadget/udc/pch_udc.c:673: * pch_udc_ep_set_maxpkt() - Set the Max packet size for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:674: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-675- * @pkt_size:\tThe packet byte size\ndrivers/usb/gadget/udc/pch_udc.c-676- */\ndrivers/usb/gadget/udc/pch_udc.c:677:static void pch_udc_ep_set_maxpkt(struct pch_udc_ep *ep, u32 pkt_size)\ndrivers/usb/gadget/udc/pch_udc.c-678-{\ndrivers/usb/gadget/udc/pch_udc.c:679:\tu32 data = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-680-\tdata = (data \u0026 0xffff0000) | (pkt_size \u0026 0xffff);\ndrivers/usb/gadget/udc/pch_udc.c:681:\tpch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-682-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-684-/**\ndrivers/usb/gadget/udc/pch_udc.c:685: * pch_udc_ep_set_subptr() - Set the Setup buffer pointer for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:686: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-687- * @addr:\tAddress of the register\ndrivers/usb/gadget/udc/pch_udc.c-688- */\ndrivers/usb/gadget/udc/pch_udc.c:689:static inline void pch_udc_ep_set_subptr(struct pch_udc_ep *ep, u32 addr)\ndrivers/usb/gadget/udc/pch_udc.c-690-{\ndrivers/usb/gadget/udc/pch_udc.c:691:\tpch_udc_ep_writel(ep, addr, UDC_SUBPTR_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-692-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-694-/**\ndrivers/usb/gadget/udc/pch_udc.c:695: * pch_udc_ep_set_ddptr() - Set the Data descriptor pointer for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:696: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-697- * @addr:\tAddress of the register\ndrivers/usb/gadget/udc/pch_udc.c-698- */\ndrivers/usb/gadget/udc/pch_udc.c:699:static inline void pch_udc_ep_set_ddptr(struct pch_udc_ep *ep, u32 addr)\ndrivers/usb/gadget/udc/pch_udc.c-700-{\ndrivers/usb/gadget/udc/pch_udc.c:701:\tpch_udc_ep_writel(ep, addr, UDC_DESPTR_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-702-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-704-/**\ndrivers/usb/gadget/udc/pch_udc.c:705: * pch_udc_ep_set_pd() - Set the poll demand bit for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:706: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-707- */\ndrivers/usb/gadget/udc/pch_udc.c:708:static inline void pch_udc_ep_set_pd(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-709-{\ndrivers/usb/gadget/udc/pch_udc.c:710:\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_P);\ndrivers/usb/gadget/udc/pch_udc.c-711-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-713-/**\ndrivers/usb/gadget/udc/pch_udc.c:714: * pch_udc_ep_set_rrdy() - Set the receive ready bit for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:715: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-716- */\ndrivers/usb/gadget/udc/pch_udc.c:717:static inline void pch_udc_ep_set_rrdy(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-718-{\ndrivers/usb/gadget/udc/pch_udc.c:719:\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY);\ndrivers/usb/gadget/udc/pch_udc.c-720-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-722-/**\ndrivers/usb/gadget/udc/pch_udc.c:723: * pch_udc_ep_clear_rrdy() - Clear the receive ready bit for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:724: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-725- */\ndrivers/usb/gadget/udc/pch_udc.c:726:static inline void pch_udc_ep_clear_rrdy(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-727-{\ndrivers/usb/gadget/udc/pch_udc.c:728:\tpch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY);\ndrivers/usb/gadget/udc/pch_udc.c-729-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-731-/**\ndrivers/usb/gadget/udc/pch_udc.c:732: * pch_udc_set_dma() - Set the 'TDE' or RDE bit of device control\ndrivers/usb/gadget/udc/pch_udc.c-733- *\t\t\tregister depending on the direction specified\ndrivers/usb/gadget/udc/pch_udc.c:734: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-735- * @dir:\twhether Tx or Rx\n--\ndrivers/usb/gadget/udc/pch_udc.c-738- */\ndrivers/usb/gadget/udc/pch_udc.c:739:static inline void pch_udc_set_dma(struct pch_udc_dev *dev, int dir)\ndrivers/usb/gadget/udc/pch_udc.c-740-{\ndrivers/usb/gadget/udc/pch_udc.c-741-\tif (dir == DMA_DIR_RX)\ndrivers/usb/gadget/udc/pch_udc.c:742:\t\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RDE);\ndrivers/usb/gadget/udc/pch_udc.c-743-\telse if (dir == DMA_DIR_TX)\ndrivers/usb/gadget/udc/pch_udc.c:744:\t\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_TDE);\ndrivers/usb/gadget/udc/pch_udc.c-745-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-747-/**\ndrivers/usb/gadget/udc/pch_udc.c:748: * pch_udc_clear_dma() - Clear the 'TDE' or RDE bit of device control\ndrivers/usb/gadget/udc/pch_udc.c-749- *\t\t\t\t register depending on the direction specified\ndrivers/usb/gadget/udc/pch_udc.c:750: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-751- * @dir:\tWhether Tx or Rx\n--\ndrivers/usb/gadget/udc/pch_udc.c-754- */\ndrivers/usb/gadget/udc/pch_udc.c:755:static inline void pch_udc_clear_dma(struct pch_udc_dev *dev, int dir)\ndrivers/usb/gadget/udc/pch_udc.c-756-{\ndrivers/usb/gadget/udc/pch_udc.c-757-\tif (dir == DMA_DIR_RX)\ndrivers/usb/gadget/udc/pch_udc.c:758:\t\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RDE);\ndrivers/usb/gadget/udc/pch_udc.c-759-\telse if (dir == DMA_DIR_TX)\ndrivers/usb/gadget/udc/pch_udc.c:760:\t\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_TDE);\ndrivers/usb/gadget/udc/pch_udc.c-761-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-763-/**\ndrivers/usb/gadget/udc/pch_udc.c:764: * pch_udc_set_csr_done() - Set the device control register\ndrivers/usb/gadget/udc/pch_udc.c-765- *\t\t\t\tCSR done field (bit 13)\ndrivers/usb/gadget/udc/pch_udc.c:766: * @dev:\treference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-767- */\ndrivers/usb/gadget/udc/pch_udc.c:768:static inline void pch_udc_set_csr_done(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-769-{\ndrivers/usb/gadget/udc/pch_udc.c:770:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_CSR_DONE);\ndrivers/usb/gadget/udc/pch_udc.c-771-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-773-/**\ndrivers/usb/gadget/udc/pch_udc.c:774: * pch_udc_disable_interrupts() - Disables the specified interrupts\ndrivers/usb/gadget/udc/pch_udc.c:775: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-776- * @mask:\tMask to disable interrupts\ndrivers/usb/gadget/udc/pch_udc.c-777- */\ndrivers/usb/gadget/udc/pch_udc.c:778:static inline void pch_udc_disable_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-779-\t\t\t\t\t    u32 mask)\ndrivers/usb/gadget/udc/pch_udc.c-780-{\ndrivers/usb/gadget/udc/pch_udc.c:781:\tpch_udc_bit_set(dev, UDC_DEVIRQMSK_ADDR, mask);\ndrivers/usb/gadget/udc/pch_udc.c-782-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-784-/**\ndrivers/usb/gadget/udc/pch_udc.c:785: * pch_udc_enable_interrupts() - Enable the specified interrupts\ndrivers/usb/gadget/udc/pch_udc.c:786: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-787- * @mask:\tMask to enable interrupts\ndrivers/usb/gadget/udc/pch_udc.c-788- */\ndrivers/usb/gadget/udc/pch_udc.c:789:static inline void pch_udc_enable_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-790-\t\t\t\t\t   u32 mask)\ndrivers/usb/gadget/udc/pch_udc.c-791-{\ndrivers/usb/gadget/udc/pch_udc.c:792:\tpch_udc_bit_clr(dev, UDC_DEVIRQMSK_ADDR, mask);\ndrivers/usb/gadget/udc/pch_udc.c-793-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-795-/**\ndrivers/usb/gadget/udc/pch_udc.c:796: * pch_udc_disable_ep_interrupts() - Disable endpoint interrupts\ndrivers/usb/gadget/udc/pch_udc.c:797: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-798- * @mask:\tMask to disable interrupts\ndrivers/usb/gadget/udc/pch_udc.c-799- */\ndrivers/usb/gadget/udc/pch_udc.c:800:static inline void pch_udc_disable_ep_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-801-\t\t\t\t\t\tu32 mask)\ndrivers/usb/gadget/udc/pch_udc.c-802-{\ndrivers/usb/gadget/udc/pch_udc.c:803:\tpch_udc_bit_set(dev, UDC_EPIRQMSK_ADDR, mask);\ndrivers/usb/gadget/udc/pch_udc.c-804-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-806-/**\ndrivers/usb/gadget/udc/pch_udc.c:807: * pch_udc_enable_ep_interrupts() - Enable endpoint interrupts\ndrivers/usb/gadget/udc/pch_udc.c:808: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-809- * @mask:\tMask to enable interrupts\ndrivers/usb/gadget/udc/pch_udc.c-810- */\ndrivers/usb/gadget/udc/pch_udc.c:811:static inline void pch_udc_enable_ep_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-812-\t\t\t\t\t      u32 mask)\ndrivers/usb/gadget/udc/pch_udc.c-813-{\ndrivers/usb/gadget/udc/pch_udc.c:814:\tpch_udc_bit_clr(dev, UDC_EPIRQMSK_ADDR, mask);\ndrivers/usb/gadget/udc/pch_udc.c-815-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-817-/**\ndrivers/usb/gadget/udc/pch_udc.c:818: * pch_udc_read_device_interrupts() - Read the device interrupts\ndrivers/usb/gadget/udc/pch_udc.c:819: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-820- * Retern\tThe device interrupts\ndrivers/usb/gadget/udc/pch_udc.c-821- */\ndrivers/usb/gadget/udc/pch_udc.c:822:static inline u32 pch_udc_read_device_interrupts(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-823-{\ndrivers/usb/gadget/udc/pch_udc.c:824:\treturn pch_udc_readl(dev, UDC_DEVIRQSTS_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-825-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-827-/**\ndrivers/usb/gadget/udc/pch_udc.c:828: * pch_udc_write_device_interrupts() - Write device interrupts\ndrivers/usb/gadget/udc/pch_udc.c:829: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-830- * @val:\tThe value to be written to interrupt register\ndrivers/usb/gadget/udc/pch_udc.c-831- */\ndrivers/usb/gadget/udc/pch_udc.c:832:static inline void pch_udc_write_device_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-833-\t\t\t\t\t\t     u32 val)\ndrivers/usb/gadget/udc/pch_udc.c-834-{\ndrivers/usb/gadget/udc/pch_udc.c:835:\tpch_udc_writel(dev, val, UDC_DEVIRQSTS_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-836-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-838-/**\ndrivers/usb/gadget/udc/pch_udc.c:839: * pch_udc_read_ep_interrupts() - Read the endpoint interrupts\ndrivers/usb/gadget/udc/pch_udc.c:840: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-841- * Retern\tThe endpoint interrupt\ndrivers/usb/gadget/udc/pch_udc.c-842- */\ndrivers/usb/gadget/udc/pch_udc.c:843:static inline u32 pch_udc_read_ep_interrupts(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-844-{\ndrivers/usb/gadget/udc/pch_udc.c:845:\treturn pch_udc_readl(dev, UDC_EPIRQSTS_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-846-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-848-/**\ndrivers/usb/gadget/udc/pch_udc.c:849: * pch_udc_write_ep_interrupts() - Clear endpoint interupts\ndrivers/usb/gadget/udc/pch_udc.c:850: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-851- * @val:\tThe value to be written to interrupt register\n\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 27816
							output: 33
							thoughts: 14
						

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

**Analyzing the Kconfig for USB_EG20T**

Okay, so the prompt directs me to the `Kconfig` for `USB_EG20T`. My initial thought is, this likely relates to the configuration options for a USB-connected device, specifically one designated as an EG20T. Immediately, I'm thinking about the possibilities: is this a specific modem, a development board, or perhaps a reference design? The "EG20T" naming convention makes me curious; is this a manufacturer-specific naming, or a more general industry term? I'll need to dig into the `Kconfig` file itself to understand the specific device type, its dependencies, and the level of customization it allows. I expect to find options related to power management, driver selection, USB protocol versions, perhaps even cellular network settings if the EG20T is indeed a modem. I'll be looking for any clues about the underlying hardware and how it's integrated within the kernel's USB subsystem. Ultimately, I'm hoping to understand how this `USB_EG20T` configuration is intended to be used and any potential quirks or limitations I might encounter.



8/2 2026/09/19 23:13 tool grepper
0m Args:
{
  "Expression": "USB_EG20T",
  "PathPrefix": "drivers/usb/gadget/"
}

Results:
{
  "Output": "drivers/usb/gadget/udc/Kconfig=333=config USB_GOKU\n--\ndrivers/usb/gadget/udc/Kconfig-346-\ndrivers/usb/gadget/udc/Kconfig:347:config USB_EG20T\ndrivers/usb/gadget/udc/Kconfig-348-\ttristate \"Intel QUARK X1000/EG20T PCH/LAPIS Semiconductor IOH(ML7213/ML7831) UDC\"\n--\ndrivers/usb/gadget/udc/Makefile=31=obj-$(CONFIG_USB_LPC32XX)\t+= lpc32xx_udc.o\ndrivers/usb/gadget/udc/Makefile:32:obj-$(CONFIG_USB_EG20T)\t\t+= pch_udc.o\ndrivers/usb/gadget/udc/Makefile-33-obj-$(CONFIG_USB_GR_UDC)\t+= gr_udc.o\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 28382
							output: 40
							thoughts: 25
						

Thoughts:
Here's my summary, as though I'm reading and thinking about the Kconfig file:

**Navigating the USB Gadget Configuration**

Okay, time to dive into the `drivers/usb/gadget/udc/Kconfig` file. Specifically, I need to get my bearings around line 347. I'm already pretty familiar with this area of the kernel configuration, but I want to refresh my memory and pinpoint the specific configuration option I'm interested in right now. I'm probably looking for dependencies or relationships between a particular gadget driver and other parts of the USB subsystem, or maybe a specific feature flag. Knowing this line number should quickly guide me to the exact section I need. Let's get to it.



10/2 2026/09/19 23:14 tool read-file
0m Args:
{
  "File": "drivers/usb/gadget/udc/Kconfig",
  "FirstLine": 340,
  "LineCount": 40
}

Results:
{
  "Contents": " 340:\t\t   The device controller has three configurable (bulk or interrupt)\n 341:\t\t   endpoints, plus endpoint zero (for control transfers).\n 342:\t\n 343:\t\t   Say \"y\" to link the driver statically, or \"m\" to build a\n 344:\t\t   dynamically linked module called \"goku_udc\" and to force all\n 345:\t\t   gadget drivers to also be dynamically linked.\n 346:\t\n 347:\tconfig USB_EG20T\n 348:\t\ttristate \"Intel QUARK X1000/EG20T PCH/LAPIS Semiconductor IOH(ML7213/ML7831) UDC\"\n 349:\t\tdepends on USB_PCI\n 350:\t\thelp\n 351:\t\t  This is a USB device driver for EG20T PCH.\n 352:\t\t  EG20T PCH is the platform controller hub that is used in Intel's\n 353:\t\t  general embedded platform. EG20T PCH has USB device interface.\n 354:\t\t  Using this interface, it is able to access system devices connected\n 355:\t\t  to USB device.\n 356:\t\t  This driver enables USB device function.\n 357:\t\t  USB device is a USB peripheral controller which\n 358:\t\t  supports both full and high speed USB 2.0 data transfers.\n 359:\t\t  This driver supports both control transfer and bulk transfer modes.\n 360:\t\t  This driver dose not support interrupt transfer or isochronous\n 361:\t\t  transfer modes.\n 362:\t\n 363:\t\t  This driver also can be used for LAPIS Semiconductor's ML7213 which is\n 364:\t\t  for IVI(In-Vehicle Infotainment) use.\n 365:\t\t  ML7831 is for general purpose use.\n 366:\t\t  ML7213/ML7831 is companion chip for Intel Atom E6xx series.\n 367:\t\t  ML7213/ML7831 is completely compatible for Intel EG20T PCH.\n 368:\t\n 369:\t\t  This driver can be used with Intel's Quark X1000 SOC platform\n 370:\t\n 371:\tconfig USB_GADGET_XILINX\n 372:\t\ttristate \"Xilinx USB Driver\"\n 373:\t\tdepends on HAS_DMA\n 374:\t\tdepends on OF\n 375:\t\thelp\n 376:\t\t  USB peripheral controller driver for Xilinx USB2 device.\n 377:\t\t  Xilinx USB2 device is a soft IP which supports both full\n 378:\t\t  and high speed USB 2.0 data transfers. It has seven configurable\n 379:\t\t  endpoints(bulk or interrupt or isochronous), as well as\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 29346
							output: 42
							thoughts: 47
						

Thoughts:
Here's my thought process, as it went down:

**Diving into pch_udc**

Okay, `pch_udc`... that sounds like a PCI driver. I need to confirm that suspicion. Let's start by digging into `pch_udc.c` – that's usually the place to start for source code. Right, let's see, I need to check the PCI IDs, see how it's registered. I need to confirm the device IDs it handles and the mechanism used to attach to the bus. That should quickly clear this up. I want to see how it's interfacing with the PCI bus.



12/2 2026/09/19 23:14 tool grepper
0m Error:
no matches

Args:
{
  "Expression": "pci_register_driver",
  "PathPrefix": "drivers/usb/gadget/udc/pch_udc.c"
}

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

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

Args:
null

Results:
null

Tokens:
							input: 29586
							output: 45
							thoughts: 24
						

Thoughts:
Okay, here's my interpretation of those thoughts, summarized in the first person, assuming an expert-level understanding:

**Examining the Driver Code**

Alright, let's get down to brass tacks. My initial thought is to zero in on the tail end of `pch_udc.c`. Specifically, I'm expecting to find the implementation of the `module_pci_driver` macro or something functionally equivalent there. That's where I'd anticipate the driver's registration with the PCI subsystem to be located. It's the standard place to define the driver's entry points and its interaction with the PCI bus. I'm looking for the structure that ties this code to the hardware.



14/2 2026/09/19 23:14 tool read-file
0m Args:
{
  "File": "drivers/usb/gadget/udc/pch_udc.c",
  "FirstLine": 3100,
  "LineCount": 70
}

Results:
{
  "Contents": "3100:\t\tdev-\u003egadget.max_speed = USB_SPEED_HIGH;\n3101:\t\n3102:\t\t/* Put the device in disconnected state till a driver is bound */\n3103:\t\tpch_udc_set_disconnect(dev);\n3104:\t\tretval = usb_add_gadget_udc(\u0026pdev-\u003edev, \u0026dev-\u003egadget);\n3105:\t\tif (retval)\n3106:\t\t\tgoto finished;\n3107:\t\treturn 0;\n3108:\t\n3109:\tfinished:\n3110:\t\tpch_udc_remove(pdev);\n3111:\t\treturn retval;\n3112:\t}\n3113:\t\n3114:\tstatic const struct pci_device_id pch_udc_pcidev_id[] = {\n3115:\t\t{\n3116:\t\t\tPCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC),\n3117:\t\t\t.class = PCI_CLASS_SERIAL_USB_DEVICE,\n3118:\t\t\t.class_mask = 0xffffffff,\n3119:\t\t\t.driver_data = (kernel_ulong_t)\u0026pch_udc_quark_platform_init,\n3120:\t\t},\n3121:\t\t{\n3122:\t\t\tPCI_DEVICE_SUB(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC,\n3123:\t\t\t\t       PCI_VENDOR_ID_CIRCUITCO, PCI_SUBSYSTEM_ID_CIRCUITCO_MINNOWBOARD),\n3124:\t\t\t.class = PCI_CLASS_SERIAL_USB_DEVICE,\n3125:\t\t\t.class_mask = 0xffffffff,\n3126:\t\t\t.driver_data = (kernel_ulong_t)\u0026pch_udc_minnow_platform_init,\n3127:\t\t},\n3128:\t\t{\n3129:\t\t\tPCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC),\n3130:\t\t\t.class = PCI_CLASS_SERIAL_USB_DEVICE,\n3131:\t\t\t.class_mask = 0xffffffff,\n3132:\t\t},\n3133:\t\t{\n3134:\t\t\tPCI_DEVICE(PCI_VENDOR_ID_ROHM, PCI_DEVICE_ID_ML7213_IOH_UDC),\n3135:\t\t\t.class = PCI_CLASS_SERIAL_USB_DEVICE,\n3136:\t\t\t.class_mask = 0xffffffff,\n3137:\t\t},\n3138:\t\t{\n3139:\t\t\tPCI_DEVICE(PCI_VENDOR_ID_ROHM, PCI_DEVICE_ID_ML7831_IOH_UDC),\n3140:\t\t\t.class = PCI_CLASS_SERIAL_USB_DEVICE,\n3141:\t\t\t.class_mask = 0xffffffff,\n3142:\t\t},\n3143:\t\t{ 0 },\n3144:\t};\n3145:\t\n3146:\tMODULE_DEVICE_TABLE(pci, pch_udc_pcidev_id);\n3147:\t\n3148:\tstatic struct pci_driver pch_udc_driver = {\n3149:\t\t.name =\tKBUILD_MODNAME,\n3150:\t\t.id_table =\tpch_udc_pcidev_id,\n3151:\t\t.probe =\tpch_udc_probe,\n3152:\t\t.remove =\tpch_udc_remove,\n3153:\t\t.shutdown =\tpch_udc_shutdown,\n3154:\t\t.driver = {\n3155:\t\t\t.pm = \u0026pch_udc_pm,\n3156:\t\t},\n3157:\t};\n3158:\t\n3159:\tmodule_pci_driver(pch_udc_driver);\n3160:\t\n3161:\tMODULE_DESCRIPTION(\"Intel EG20T USB Device Controller\");\n3162:\tMODULE_AUTHOR(\"LAPIS Semiconductor, \u003ctomoya-linux@dsn.lapis-semi.com\u003e\");\n3163:\tMODULE_LICENSE(\"GPL\");\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 30906
							output: 38
							thoughts: 1133
						

Thoughts:
**Analyzing the Fuzzing Suitability of a Driver Patch**

Okay, let's break this down. First, I need to evaluate if this patch makes the code "WorthFuzzing=false," meaning it introduces changes that make fuzzing less effective, based on very specific criteria. The critical part is determining if the modified code falls exclusively into certain categories, particularly those related to hardware that isn't emulated in standard QEMU.

Alright, the negative criteria are: structurally unreachable hardware, and unreachable execution paths.

So, the key questions are: Does this patch touch code related to hardware that QEMU *doesn't* emulate? Is it related to execution paths that are rarely exercised?

First, I see that this patch is related to Intel EG20T / Quark X1000 UDC hardware. And a quick check reveals that QEMU doesn't have a model for either of those. If the modified code *relates specifically* to that hardware and nothing else, then this might be a "no go" for fuzzing.

Now, let's look at the patch itself to determine where the modifications are, the specific files and functions.  It's touching `drivers/usb/gadget/udc/pch_udc.c`.

The patch has changes in two sections: `pch_vbus_gpio_init()` and the `pch_udc_remove` function. The first part introduces some work queue initialization, the second part disables the same work queues, with `disable_work_sync`. I'll need to figure out where `pch_vbus_gpio_init()` is called, and what the overall function of this code is. The key question is whether this code path is exclusively linked to the EG20T/Quark X1000 UDC hardware, and whether these functions are used in paths that are reachable during standard fuzzing. If this is *only* hardware specific, we likely have our answer.



16/2 2026/09/19 23:14 tool grepper
0m Args:
{
  "Expression": "pch_vbus_gpio_init",
  "PathPrefix": "drivers/usb/gadget/udc/"
}

Results:
{
  "Output": "drivers/usb/gadget/udc/pch_udc.c=1343=static irqreturn_t pch_vbus_gpio_irq(int irq, void *data)\n--\ndrivers/usb/gadget/udc/pch_udc.c-1358-/**\ndrivers/usb/gadget/udc/pch_udc.c:1359: * pch_vbus_gpio_init() - This API initializes GPIO port detecting VBUS.\ndrivers/usb/gadget/udc/pch_udc.c-1360- * @dev:\t\tReference to the driver structure\n--\ndrivers/usb/gadget/udc/pch_udc.c-1365- */\ndrivers/usb/gadget/udc/pch_udc.c:1366:static int pch_vbus_gpio_init(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-1367-{\n--\ndrivers/usb/gadget/udc/pch_udc.c=2829=static int pch_udc_pcd_init(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2835-\ndrivers/usb/gadget/udc/pch_udc.c:2836:\tret = pch_vbus_gpio_init(dev);\ndrivers/usb/gadget/udc/pch_udc.c-2837-\tif (ret)\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 32887
							output: 39
							thoughts: 20
						

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

**Tracing the UDC Initialization**

Alright, let's dive in. My immediate focus is understanding the call chain for `pch_udc_pcd_init`. I need to figure out the initiating point, the context in which it's invoked, and any potential dependencies or setup that precedes it. Knowing the caller function is the most critical step. From there, I can analyze how the Peripheral Controller Driver (PCD) is initialized within the larger system architecture. This also should reveal the driver's role in the USB device stack. Is it a direct initialization called by a specific controller or perhaps a layered approach tied to a board bring-up sequence? Knowing the calling function(s) gives me the best way to understand those details.



18/2 2026/09/19 23:14 tool grepper
0m Args:
{
  "Expression": "pch_udc_pcd_init",
  "PathPrefix": "drivers/usb/gadget/udc/"
}

Results:
{
  "Output": "drivers/usb/gadget/udc/pch_udc.c=2765=static void pch_udc_pcd_reinit(struct pch_udc_dev *dev)\n--\ndrivers/usb/gadget/udc/pch_udc.c-2821-/**\ndrivers/usb/gadget/udc/pch_udc.c:2822: * pch_udc_pcd_init() - This API initializes the driver structure\ndrivers/usb/gadget/udc/pch_udc.c-2823- * @dev:\tReference to the driver structure\n--\ndrivers/usb/gadget/udc/pch_udc.c-2828- */\ndrivers/usb/gadget/udc/pch_udc.c:2829:static int pch_udc_pcd_init(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-2830-{\n--\ndrivers/usb/gadget/udc/pch_udc.c=3039=static int pch_udc_probe(struct pci_dev *pdev, const struct pci_device_id *id)\n--\ndrivers/usb/gadget/udc/pch_udc.c-3073-\t/* initialize the hardware */\ndrivers/usb/gadget/udc/pch_udc.c:3074:\tretval = pch_udc_pcd_init(dev);\ndrivers/usb/gadget/udc/pch_udc.c-3075-\tif (retval)\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 33521
							output: 18
							thoughts: 1303
						

Thoughts:
**Unreachable Code Analysis: pch_udc Driver**

Okay, here's what I'm thinking.  My initial assessment is that this code, specifically around the `pch_udc` driver, is likely unreachable for fuzzing purposes. Let me break down my reasoning:

First, `pch_vbus_gpio_init` is the entry point, and it's called only from `pch_udc_pcd_init`, which in turn is only called from `pch_udc_probe`.  And, crucially, `pch_udc_remove` is the driver's `.remove` callback. This is our key. `pch_udc` is a PCI driver designed for Intel's EG20T and Quark X1000 hardware devices.

Now, the question is, can we trigger this in a fuzzer-friendly environment like QEMU or using syzkaller?  I'm pretty sure not. Syzkaller is pretty limited to virtio devices and standard QEMU devices or USB gadgets.  It doesn't generally emulate PCI devices unless it's virtio or standard QEMU devices. No, we cannot use `raw-gadget` or `dummy_hcd` to test `pch_udc`. `dummy_hcd` is itself a UDC driver, which won't work.

Looking into USB Device Controller (UDC) drivers in Linux, we can see that `pch_udc` is a *specific* hardware controller on the PCI bus, unlike the software-emulated `dummy_hcd`.

Specifically:
- Intel (0x8086), Rohm (0x10db)
- PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC (0x0939)
- PCI_DEVICE_ID_INTEL_EG20T_UDC (0x8808)
- PCI_DEVICE_ID_ML7213_IOH_UDC (0x801d)
- PCI_DEVICE_ID_ML7831_IOH_UDC (0x8808)

Now, to see if we can emulate this, EG20T was an Intel Platform Controller Hub from around 2010. Quark X1000 was a 32-bit SoC from around 2013. Neither are typically supported or emulated by QEMU in a standard way.

Based on the instructions, "REACHABILITY IS THE PRIMARY GATE", and we cannot fuzz code that can't execute in a standard, virtualized environment. Hardware like this, that requires actual ASICs or physical PCIe cards, and isn't supported in QEMU, should not be fuzzed.

The provided patch changes `INIT_WORK` in `pch_vbus_gpio_init` and adds `disable_work_sync` to `pch_udc_remove`, which is the `.remove` callback.

Both of these locations, as already established, are within the scope of code that's only reachable during PCI probe/remove for specific hardware.  And the `.remove` callback is explicitly mentioned as an unreachable execution path.

So, summing this up: This `pch_udc` driver targets very specific hardware (EG20T/Quark X1000) that's not emulated or supported in standard fuzzing environments. The modified code, which is in `pch_vbus_gpio_init` and `pch_udc_remove`, is unreachable unless you have that specific hardware and are able to trigger a PCI hot-unplug, or are manually unbinding the driver. This fails the "REACHABILITY IS THE PRIMARY GATE" criteria, and should not be fuzzed.

I'll search the kernel tree again to double-check that this driver isn't instantiated by some virtual bus or mock device, but I'm pretty confident in my initial assessment.



20/2 2026/09/19 23:14 tool grepper
0m Args:
{
  "Expression": "pch_udc"
}

Results:
{
  "Output": "\nFull output is too long, showing 500 out of 1861 lines.\nUse more precise expression if possible.\n\ndrivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h=30=struct pch_gbe_regs_mac_adr {\n--\ndrivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h-34-/**\ndrivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h:35: * pch_udc_regs - Structure holding values of MAC registers\ndrivers/net/ethernet/oki-semi/pch_gbe/pch_gbe.h-36- */\n--\ndrivers/usb/gadget/udc/Makefile=31=obj-$(CONFIG_USB_LPC32XX)\t+= lpc32xx_udc.o\ndrivers/usb/gadget/udc/Makefile:32:obj-$(CONFIG_USB_EG20T)\t\t+= pch_udc.o\ndrivers/usb/gadget/udc/Makefile-33-obj-$(CONFIG_USB_GR_UDC)\t+= gr_udc.o\n--\ndrivers/usb/gadget/udc/pch_udc.c-210-/**\ndrivers/usb/gadget/udc/pch_udc.c:211: * struct pch_udc_data_dma_desc - Structure to hold DMA descriptor information\ndrivers/usb/gadget/udc/pch_udc.c-212- *\t\t\t\t  for data\n--\ndrivers/usb/gadget/udc/pch_udc.c-217- */\ndrivers/usb/gadget/udc/pch_udc.c:218:struct pch_udc_data_dma_desc {\ndrivers/usb/gadget/udc/pch_udc.c-219-\tu32 status;\n--\ndrivers/usb/gadget/udc/pch_udc.c-225-/**\ndrivers/usb/gadget/udc/pch_udc.c:226: * struct pch_udc_stp_dma_desc - Structure to hold DMA descriptor information\ndrivers/usb/gadget/udc/pch_udc.c-227- *\t\t\t\t for control data\n--\ndrivers/usb/gadget/udc/pch_udc.c-231- */\ndrivers/usb/gadget/udc/pch_udc.c:232:struct pch_udc_stp_dma_desc {\ndrivers/usb/gadget/udc/pch_udc.c-233-\tu32 status;\n--\ndrivers/usb/gadget/udc/pch_udc.c-255-/**\ndrivers/usb/gadget/udc/pch_udc.c:256: * struct pch_udc_cfg_data - Structure to hold current configuration\ndrivers/usb/gadget/udc/pch_udc.c-257- *\t\t\t     and interface information\n--\ndrivers/usb/gadget/udc/pch_udc.c-261- */\ndrivers/usb/gadget/udc/pch_udc.c:262:struct pch_udc_cfg_data {\ndrivers/usb/gadget/udc/pch_udc.c-263-\tu16 cur_cfg;\n--\ndrivers/usb/gadget/udc/pch_udc.c-268-/**\ndrivers/usb/gadget/udc/pch_udc.c:269: * struct pch_udc_ep - Structure holding a PCH USB device Endpoint information\ndrivers/usb/gadget/udc/pch_udc.c-270- * @ep:\t\t\tembedded ep request\n--\ndrivers/usb/gadget/udc/pch_udc.c-282- */\ndrivers/usb/gadget/udc/pch_udc.c:283:struct pch_udc_ep {\ndrivers/usb/gadget/udc/pch_udc.c-284-\tstruct usb_ep\t\t\tep;\n--\ndrivers/usb/gadget/udc/pch_udc.c-286-\tdma_addr_t\t\t\ttd_data_phys;\ndrivers/usb/gadget/udc/pch_udc.c:287:\tstruct pch_udc_stp_dma_desc\t*td_stp;\ndrivers/usb/gadget/udc/pch_udc.c:288:\tstruct pch_udc_data_dma_desc\t*td_data;\ndrivers/usb/gadget/udc/pch_udc.c:289:\tstruct pch_udc_dev\t\t*dev;\ndrivers/usb/gadget/udc/pch_udc.c-290-\tunsigned long\t\t\toffset_addr;\n--\ndrivers/usb/gadget/udc/pch_udc.c=306=struct pch_vbus_gpio_data {\n--\ndrivers/usb/gadget/udc/pch_udc.c-313-/**\ndrivers/usb/gadget/udc/pch_udc.c:314: * struct pch_udc_dev - Structure holding complete information\ndrivers/usb/gadget/udc/pch_udc.c-315- *\t\t\tof the PCH USB device\n--\ndrivers/usb/gadget/udc/pch_udc.c-336- */\ndrivers/usb/gadget/udc/pch_udc.c:337:struct pch_udc_dev {\ndrivers/usb/gadget/udc/pch_udc.c-338-\tstruct usb_gadget\t\tgadget;\n--\ndrivers/usb/gadget/udc/pch_udc.c-340-\tstruct pci_dev\t\t\t*pdev;\ndrivers/usb/gadget/udc/pch_udc.c:341:\tstruct pch_udc_ep\t\tep[PCH_UDC_EP_NUM];\ndrivers/usb/gadget/udc/pch_udc.c-342-\tspinlock_t\t\t\tlock; /* protects all state */\n--\ndrivers/usb/gadget/udc/pch_udc.c-356-\tunsigned short\t\t\tbar;\ndrivers/usb/gadget/udc/pch_udc.c:357:\tstruct pch_udc_cfg_data\t\tcfg_data;\ndrivers/usb/gadget/udc/pch_udc.c-358-\tstruct pch_vbus_gpio_data\tvbus_gpio;\ndrivers/usb/gadget/udc/pch_udc.c-359-};\ndrivers/usb/gadget/udc/pch_udc.c:360:#define to_pch_udc(g)\t(container_of((g), struct pch_udc_dev, gadget))\ndrivers/usb/gadget/udc/pch_udc.c-361-\n--\ndrivers/usb/gadget/udc/pch_udc.c=375=MODULE_PARM_DESC(speed_fs, \"true for Full speed operation\");\n--\ndrivers/usb/gadget/udc/pch_udc.c-377-/**\ndrivers/usb/gadget/udc/pch_udc.c:378: * struct pch_udc_request - Structure holding a PCH USB device request packet\ndrivers/usb/gadget/udc/pch_udc.c-379- * @req:\t\tembedded ep request\n--\ndrivers/usb/gadget/udc/pch_udc.c-387- */\ndrivers/usb/gadget/udc/pch_udc.c:388:struct pch_udc_request {\ndrivers/usb/gadget/udc/pch_udc.c-389-\tstruct usb_request\t\treq;\ndrivers/usb/gadget/udc/pch_udc.c-390-\tdma_addr_t\t\t\ttd_data_phys;\ndrivers/usb/gadget/udc/pch_udc.c:391:\tstruct pch_udc_data_dma_desc\t*td_data;\ndrivers/usb/gadget/udc/pch_udc.c:392:\tstruct pch_udc_data_dma_desc\t*td_data_last;\ndrivers/usb/gadget/udc/pch_udc.c-393-\tstruct list_head\t\tqueue;\n--\ndrivers/usb/gadget/udc/pch_udc.c-398-\ndrivers/usb/gadget/udc/pch_udc.c:399:static inline u32 pch_udc_readl(struct pch_udc_dev *dev, unsigned long reg)\ndrivers/usb/gadget/udc/pch_udc.c-400-{\n--\ndrivers/usb/gadget/udc/pch_udc.c-403-\ndrivers/usb/gadget/udc/pch_udc.c:404:static inline void pch_udc_writel(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-405-\t\t\t\t    unsigned long val, unsigned long reg)\n--\ndrivers/usb/gadget/udc/pch_udc.c-409-\ndrivers/usb/gadget/udc/pch_udc.c:410:static inline void pch_udc_bit_set(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-411-\t\t\t\t     unsigned long reg,\n--\ndrivers/usb/gadget/udc/pch_udc.c-413-{\ndrivers/usb/gadget/udc/pch_udc.c:414:\tpch_udc_writel(dev, pch_udc_readl(dev, reg) | bitmask, reg);\ndrivers/usb/gadget/udc/pch_udc.c-415-}\ndrivers/usb/gadget/udc/pch_udc.c-416-\ndrivers/usb/gadget/udc/pch_udc.c:417:static inline void pch_udc_bit_clr(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-418-\t\t\t\t     unsigned long reg,\n--\ndrivers/usb/gadget/udc/pch_udc.c-420-{\ndrivers/usb/gadget/udc/pch_udc.c:421:\tpch_udc_writel(dev, pch_udc_readl(dev, reg) \u0026 ~(bitmask), reg);\ndrivers/usb/gadget/udc/pch_udc.c-422-}\ndrivers/usb/gadget/udc/pch_udc.c-423-\ndrivers/usb/gadget/udc/pch_udc.c:424:static inline u32 pch_udc_ep_readl(struct pch_udc_ep *ep, unsigned long reg)\ndrivers/usb/gadget/udc/pch_udc.c-425-{\n--\ndrivers/usb/gadget/udc/pch_udc.c-428-\ndrivers/usb/gadget/udc/pch_udc.c:429:static inline void pch_udc_ep_writel(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-430-\t\t\t\t    unsigned long val, unsigned long reg)\n--\ndrivers/usb/gadget/udc/pch_udc.c-434-\ndrivers/usb/gadget/udc/pch_udc.c:435:static inline void pch_udc_ep_bit_set(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-436-\t\t\t\t     unsigned long reg,\n--\ndrivers/usb/gadget/udc/pch_udc.c-438-{\ndrivers/usb/gadget/udc/pch_udc.c:439:\tpch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) | bitmask, reg);\ndrivers/usb/gadget/udc/pch_udc.c-440-}\ndrivers/usb/gadget/udc/pch_udc.c-441-\ndrivers/usb/gadget/udc/pch_udc.c:442:static inline void pch_udc_ep_bit_clr(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-443-\t\t\t\t     unsigned long reg,\n--\ndrivers/usb/gadget/udc/pch_udc.c-445-{\ndrivers/usb/gadget/udc/pch_udc.c:446:\tpch_udc_ep_writel(ep, pch_udc_ep_readl(ep, reg) \u0026 ~(bitmask), reg);\ndrivers/usb/gadget/udc/pch_udc.c-447-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-449-/**\ndrivers/usb/gadget/udc/pch_udc.c:450: * pch_udc_csr_busy() - Wait till idle.\ndrivers/usb/gadget/udc/pch_udc.c:451: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-452- */\ndrivers/usb/gadget/udc/pch_udc.c:453:static void pch_udc_csr_busy(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-454-{\n--\ndrivers/usb/gadget/udc/pch_udc.c-457-\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c:458:\twhile ((pch_udc_readl(dev, UDC_CSR_BUSY_ADDR) \u0026 UDC_CSR_BUSY)\ndrivers/usb/gadget/udc/pch_udc.c-459-\t\t\u0026\u0026 --count)\n--\ndrivers/usb/gadget/udc/pch_udc.c-465-/**\ndrivers/usb/gadget/udc/pch_udc.c:466: * pch_udc_write_csr() - Write the command and status registers.\ndrivers/usb/gadget/udc/pch_udc.c:467: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-468- * @val:\tvalue to be written to CSR register\n--\ndrivers/usb/gadget/udc/pch_udc.c-470- */\ndrivers/usb/gadget/udc/pch_udc.c:471:static void pch_udc_write_csr(struct pch_udc_dev *dev, unsigned long val,\ndrivers/usb/gadget/udc/pch_udc.c-472-\t\t\t       unsigned int ep)\n--\ndrivers/usb/gadget/udc/pch_udc.c-475-\ndrivers/usb/gadget/udc/pch_udc.c:476:\tpch_udc_csr_busy(dev);\t\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c:477:\tpch_udc_writel(dev, val, reg);\ndrivers/usb/gadget/udc/pch_udc.c:478:\tpch_udc_csr_busy(dev);\t\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c-479-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-481-/**\ndrivers/usb/gadget/udc/pch_udc.c:482: * pch_udc_read_csr() - Read the command and status registers.\ndrivers/usb/gadget/udc/pch_udc.c:483: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-484- * @ep:\t\tend-point number\n--\ndrivers/usb/gadget/udc/pch_udc.c-487- */\ndrivers/usb/gadget/udc/pch_udc.c:488:static u32 pch_udc_read_csr(struct pch_udc_dev *dev, unsigned int ep)\ndrivers/usb/gadget/udc/pch_udc.c-489-{\n--\ndrivers/usb/gadget/udc/pch_udc.c-491-\ndrivers/usb/gadget/udc/pch_udc.c:492:\tpch_udc_csr_busy(dev);\t\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c:493:\tpch_udc_readl(dev, reg);\t/* Dummy read */\ndrivers/usb/gadget/udc/pch_udc.c:494:\tpch_udc_csr_busy(dev);\t\t/* Wait till idle */\ndrivers/usb/gadget/udc/pch_udc.c:495:\treturn pch_udc_readl(dev, reg);\ndrivers/usb/gadget/udc/pch_udc.c-496-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-498-/**\ndrivers/usb/gadget/udc/pch_udc.c:499: * pch_udc_rmt_wakeup() - Initiate for remote wakeup\ndrivers/usb/gadget/udc/pch_udc.c:500: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-501- */\ndrivers/usb/gadget/udc/pch_udc.c:502:static inline void pch_udc_rmt_wakeup(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-503-{\ndrivers/usb/gadget/udc/pch_udc.c:504:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c-505-\tmdelay(1);\ndrivers/usb/gadget/udc/pch_udc.c:506:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c-507-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-509-/**\ndrivers/usb/gadget/udc/pch_udc.c:510: * pch_udc_get_frame() - Get the current frame from device status register\ndrivers/usb/gadget/udc/pch_udc.c:511: * @dev:\tReference to pch_udc_dev structure\ndrivers/usb/gadget/udc/pch_udc.c-512- * Retern\tcurrent frame\ndrivers/usb/gadget/udc/pch_udc.c-513- */\ndrivers/usb/gadget/udc/pch_udc.c:514:static inline int pch_udc_get_frame(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-515-{\ndrivers/usb/gadget/udc/pch_udc.c:516:\tu32 frame = pch_udc_readl(dev, UDC_DEVSTS_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-517-\treturn (frame \u0026 UDC_DEVSTS_TS_MASK) \u003e\u003e UDC_DEVSTS_TS_SHIFT;\n--\ndrivers/usb/gadget/udc/pch_udc.c-520-/**\ndrivers/usb/gadget/udc/pch_udc.c:521: * pch_udc_clear_selfpowered() - Clear the self power control\ndrivers/usb/gadget/udc/pch_udc.c:522: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-523- */\ndrivers/usb/gadget/udc/pch_udc.c:524:static inline void pch_udc_clear_selfpowered(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-525-{\ndrivers/usb/gadget/udc/pch_udc.c:526:\tpch_udc_bit_clr(dev, UDC_DEVCFG_ADDR, UDC_DEVCFG_SP);\ndrivers/usb/gadget/udc/pch_udc.c-527-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-529-/**\ndrivers/usb/gadget/udc/pch_udc.c:530: * pch_udc_set_selfpowered() - Set the self power control\ndrivers/usb/gadget/udc/pch_udc.c:531: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-532- */\ndrivers/usb/gadget/udc/pch_udc.c:533:static inline void pch_udc_set_selfpowered(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-534-{\ndrivers/usb/gadget/udc/pch_udc.c:535:\tpch_udc_bit_set(dev, UDC_DEVCFG_ADDR, UDC_DEVCFG_SP);\ndrivers/usb/gadget/udc/pch_udc.c-536-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-538-/**\ndrivers/usb/gadget/udc/pch_udc.c:539: * pch_udc_set_disconnect() - Set the disconnect status.\ndrivers/usb/gadget/udc/pch_udc.c:540: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-541- */\ndrivers/usb/gadget/udc/pch_udc.c:542:static inline void pch_udc_set_disconnect(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-543-{\ndrivers/usb/gadget/udc/pch_udc.c:544:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD);\ndrivers/usb/gadget/udc/pch_udc.c-545-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-547-/**\ndrivers/usb/gadget/udc/pch_udc.c:548: * pch_udc_clear_disconnect() - Clear the disconnect status.\ndrivers/usb/gadget/udc/pch_udc.c:549: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-550- */\ndrivers/usb/gadget/udc/pch_udc.c:551:static void pch_udc_clear_disconnect(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-552-{\ndrivers/usb/gadget/udc/pch_udc.c-553-\t/* Clear the disconnect */\ndrivers/usb/gadget/udc/pch_udc.c:554:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c:555:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD);\ndrivers/usb/gadget/udc/pch_udc.c-556-\tmdelay(1);\ndrivers/usb/gadget/udc/pch_udc.c-557-\t/* Resume USB signalling */\ndrivers/usb/gadget/udc/pch_udc.c:558:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c-559-}\ndrivers/usb/gadget/udc/pch_udc.c-560-\ndrivers/usb/gadget/udc/pch_udc.c:561:static void pch_udc_init(struct pch_udc_dev *dev);\ndrivers/usb/gadget/udc/pch_udc.c-562-\ndrivers/usb/gadget/udc/pch_udc.c-563-/**\ndrivers/usb/gadget/udc/pch_udc.c:564: * pch_udc_reconnect() - This API initializes usb device controller,\ndrivers/usb/gadget/udc/pch_udc.c-565- *\t\t\t\t\t\tand clear the disconnect status.\ndrivers/usb/gadget/udc/pch_udc.c:566: * @dev:\t\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-567- */\ndrivers/usb/gadget/udc/pch_udc.c:568:static void pch_udc_reconnect(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-569-{\ndrivers/usb/gadget/udc/pch_udc.c:570:\tpch_udc_init(dev);\ndrivers/usb/gadget/udc/pch_udc.c-571-\ndrivers/usb/gadget/udc/pch_udc.c-572-\t/* enable device interrupts */\ndrivers/usb/gadget/udc/pch_udc.c:573:\t/* pch_udc_enable_interrupts() */\ndrivers/usb/gadget/udc/pch_udc.c:574:\tpch_udc_bit_clr(dev, UDC_DEVIRQMSK_ADDR,\ndrivers/usb/gadget/udc/pch_udc.c-575-\t\t\tUDC_DEVINT_UR | UDC_DEVINT_ENUM);\n--\ndrivers/usb/gadget/udc/pch_udc.c-577-\t/* Clear the disconnect */\ndrivers/usb/gadget/udc/pch_udc.c:578:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c:579:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_SD);\ndrivers/usb/gadget/udc/pch_udc.c-580-\tmdelay(1);\ndrivers/usb/gadget/udc/pch_udc.c-581-\t/* Resume USB signalling */\ndrivers/usb/gadget/udc/pch_udc.c:582:\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RES);\ndrivers/usb/gadget/udc/pch_udc.c-583-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-585-/**\ndrivers/usb/gadget/udc/pch_udc.c:586: * pch_udc_vbus_session() - set or clearr the disconnect status.\ndrivers/usb/gadget/udc/pch_udc.c:587: * @dev:\tReference to pch_udc_regs structure\ndrivers/usb/gadget/udc/pch_udc.c-588- * @is_active:\tParameter specifying the action\n--\ndrivers/usb/gadget/udc/pch_udc.c-591- */\ndrivers/usb/gadget/udc/pch_udc.c:592:static inline void pch_udc_vbus_session(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-593-\t\t\t\t\t  int is_active)\n--\ndrivers/usb/gadget/udc/pch_udc.c-598-\tif (is_active) {\ndrivers/usb/gadget/udc/pch_udc.c:599:\t\tpch_udc_reconnect(dev);\ndrivers/usb/gadget/udc/pch_udc.c-600-\t\tdev-\u003evbus_session = 1;\n--\ndrivers/usb/gadget/udc/pch_udc.c-606-\t\t}\ndrivers/usb/gadget/udc/pch_udc.c:607:\t\tpch_udc_set_disconnect(dev);\ndrivers/usb/gadget/udc/pch_udc.c-608-\t\tdev-\u003evbus_session = 0;\n--\ndrivers/usb/gadget/udc/pch_udc.c-613-/**\ndrivers/usb/gadget/udc/pch_udc.c:614: * pch_udc_ep_set_stall() - Set the stall of endpoint\ndrivers/usb/gadget/udc/pch_udc.c:615: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-616- */\ndrivers/usb/gadget/udc/pch_udc.c:617:static void pch_udc_ep_set_stall(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-618-{\ndrivers/usb/gadget/udc/pch_udc.c-619-\tif (ep-\u003ein) {\ndrivers/usb/gadget/udc/pch_udc.c:620:\t\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_F);\ndrivers/usb/gadget/udc/pch_udc.c:621:\t\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S);\ndrivers/usb/gadget/udc/pch_udc.c-622-\t} else {\ndrivers/usb/gadget/udc/pch_udc.c:623:\t\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S);\ndrivers/usb/gadget/udc/pch_udc.c-624-\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c-627-/**\ndrivers/usb/gadget/udc/pch_udc.c:628: * pch_udc_ep_clear_stall() - Clear the stall of endpoint\ndrivers/usb/gadget/udc/pch_udc.c:629: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-630- */\ndrivers/usb/gadget/udc/pch_udc.c:631:static inline void pch_udc_ep_clear_stall(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-632-{\ndrivers/usb/gadget/udc/pch_udc.c-633-\t/* Clear the stall */\ndrivers/usb/gadget/udc/pch_udc.c:634:\tpch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_S);\ndrivers/usb/gadget/udc/pch_udc.c-635-\t/* Clear NAK by writing CNAK */\ndrivers/usb/gadget/udc/pch_udc.c:636:\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_CNAK);\ndrivers/usb/gadget/udc/pch_udc.c-637-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-639-/**\ndrivers/usb/gadget/udc/pch_udc.c:640: * pch_udc_ep_set_trfr_type() - Set the transfer type of endpoint\ndrivers/usb/gadget/udc/pch_udc.c:641: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-642- * @type:\tType of endpoint\ndrivers/usb/gadget/udc/pch_udc.c-643- */\ndrivers/usb/gadget/udc/pch_udc.c:644:static inline void pch_udc_ep_set_trfr_type(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-645-\t\t\t\t\tu8 type)\ndrivers/usb/gadget/udc/pch_udc.c-646-{\ndrivers/usb/gadget/udc/pch_udc.c:647:\tpch_udc_ep_writel(ep, ((type \u003c\u003c UDC_EPCTL_ET_SHIFT) \u0026\ndrivers/usb/gadget/udc/pch_udc.c-648-\t\t\t\tUDC_EPCTL_ET_MASK), UDC_EPCTL_ADDR);\n--\ndrivers/usb/gadget/udc/pch_udc.c-651-/**\ndrivers/usb/gadget/udc/pch_udc.c:652: * pch_udc_ep_set_bufsz() - Set the maximum packet size for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:653: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-654- * @buf_size:\tThe buffer word size\n--\ndrivers/usb/gadget/udc/pch_udc.c-656- */\ndrivers/usb/gadget/udc/pch_udc.c:657:static void pch_udc_ep_set_bufsz(struct pch_udc_ep *ep,\ndrivers/usb/gadget/udc/pch_udc.c-658-\t\t\t\t\t\t u32 buf_size, u32 ep_in)\n--\ndrivers/usb/gadget/udc/pch_udc.c-661-\tif (ep_in) {\ndrivers/usb/gadget/udc/pch_udc.c:662:\t\tdata = pch_udc_ep_readl(ep, UDC_BUFIN_FRAMENUM_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-663-\t\tdata = (data \u0026 0xffff0000) | (buf_size \u0026 0xffff);\ndrivers/usb/gadget/udc/pch_udc.c:664:\t\tpch_udc_ep_writel(ep, data, UDC_BUFIN_FRAMENUM_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-665-\t} else {\ndrivers/usb/gadget/udc/pch_udc.c:666:\t\tdata = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-667-\t\tdata = (buf_size \u003c\u003c 16) | (data \u0026 0xffff);\ndrivers/usb/gadget/udc/pch_udc.c:668:\t\tpch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-669-\t}\n--\ndrivers/usb/gadget/udc/pch_udc.c-672-/**\ndrivers/usb/gadget/udc/pch_udc.c:673: * pch_udc_ep_set_maxpkt() - Set the Max packet size for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:674: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-675- * @pkt_size:\tThe packet byte size\ndrivers/usb/gadget/udc/pch_udc.c-676- */\ndrivers/usb/gadget/udc/pch_udc.c:677:static void pch_udc_ep_set_maxpkt(struct pch_udc_ep *ep, u32 pkt_size)\ndrivers/usb/gadget/udc/pch_udc.c-678-{\ndrivers/usb/gadget/udc/pch_udc.c:679:\tu32 data = pch_udc_ep_readl(ep, UDC_BUFOUT_MAXPKT_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-680-\tdata = (data \u0026 0xffff0000) | (pkt_size \u0026 0xffff);\ndrivers/usb/gadget/udc/pch_udc.c:681:\tpch_udc_ep_writel(ep, data, UDC_BUFOUT_MAXPKT_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-682-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-684-/**\ndrivers/usb/gadget/udc/pch_udc.c:685: * pch_udc_ep_set_subptr() - Set the Setup buffer pointer for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:686: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-687- * @addr:\tAddress of the register\ndrivers/usb/gadget/udc/pch_udc.c-688- */\ndrivers/usb/gadget/udc/pch_udc.c:689:static inline void pch_udc_ep_set_subptr(struct pch_udc_ep *ep, u32 addr)\ndrivers/usb/gadget/udc/pch_udc.c-690-{\ndrivers/usb/gadget/udc/pch_udc.c:691:\tpch_udc_ep_writel(ep, addr, UDC_SUBPTR_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-692-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-694-/**\ndrivers/usb/gadget/udc/pch_udc.c:695: * pch_udc_ep_set_ddptr() - Set the Data descriptor pointer for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:696: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-697- * @addr:\tAddress of the register\ndrivers/usb/gadget/udc/pch_udc.c-698- */\ndrivers/usb/gadget/udc/pch_udc.c:699:static inline void pch_udc_ep_set_ddptr(struct pch_udc_ep *ep, u32 addr)\ndrivers/usb/gadget/udc/pch_udc.c-700-{\ndrivers/usb/gadget/udc/pch_udc.c:701:\tpch_udc_ep_writel(ep, addr, UDC_DESPTR_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-702-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-704-/**\ndrivers/usb/gadget/udc/pch_udc.c:705: * pch_udc_ep_set_pd() - Set the poll demand bit for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:706: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-707- */\ndrivers/usb/gadget/udc/pch_udc.c:708:static inline void pch_udc_ep_set_pd(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-709-{\ndrivers/usb/gadget/udc/pch_udc.c:710:\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_P);\ndrivers/usb/gadget/udc/pch_udc.c-711-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-713-/**\ndrivers/usb/gadget/udc/pch_udc.c:714: * pch_udc_ep_set_rrdy() - Set the receive ready bit for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:715: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-716- */\ndrivers/usb/gadget/udc/pch_udc.c:717:static inline void pch_udc_ep_set_rrdy(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-718-{\ndrivers/usb/gadget/udc/pch_udc.c:719:\tpch_udc_ep_bit_set(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY);\ndrivers/usb/gadget/udc/pch_udc.c-720-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-722-/**\ndrivers/usb/gadget/udc/pch_udc.c:723: * pch_udc_ep_clear_rrdy() - Clear the receive ready bit for the endpoint\ndrivers/usb/gadget/udc/pch_udc.c:724: * @ep:\t\tReference to structure of type pch_udc_ep_regs\ndrivers/usb/gadget/udc/pch_udc.c-725- */\ndrivers/usb/gadget/udc/pch_udc.c:726:static inline void pch_udc_ep_clear_rrdy(struct pch_udc_ep *ep)\ndrivers/usb/gadget/udc/pch_udc.c-727-{\ndrivers/usb/gadget/udc/pch_udc.c:728:\tpch_udc_ep_bit_clr(ep, UDC_EPCTL_ADDR, UDC_EPCTL_RRDY);\ndrivers/usb/gadget/udc/pch_udc.c-729-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-731-/**\ndrivers/usb/gadget/udc/pch_udc.c:732: * pch_udc_set_dma() - Set the 'TDE' or RDE bit of device control\ndrivers/usb/gadget/udc/pch_udc.c-733- *\t\t\tregister depending on the direction specified\ndrivers/usb/gadget/udc/pch_udc.c:734: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-735- * @dir:\twhether Tx or Rx\n--\ndrivers/usb/gadget/udc/pch_udc.c-738- */\ndrivers/usb/gadget/udc/pch_udc.c:739:static inline void pch_udc_set_dma(struct pch_udc_dev *dev, int dir)\ndrivers/usb/gadget/udc/pch_udc.c-740-{\ndrivers/usb/gadget/udc/pch_udc.c-741-\tif (dir == DMA_DIR_RX)\ndrivers/usb/gadget/udc/pch_udc.c:742:\t\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RDE);\ndrivers/usb/gadget/udc/pch_udc.c-743-\telse if (dir == DMA_DIR_TX)\ndrivers/usb/gadget/udc/pch_udc.c:744:\t\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_TDE);\ndrivers/usb/gadget/udc/pch_udc.c-745-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-747-/**\ndrivers/usb/gadget/udc/pch_udc.c:748: * pch_udc_clear_dma() - Clear the 'TDE' or RDE bit of device control\ndrivers/usb/gadget/udc/pch_udc.c-749- *\t\t\t\t register depending on the direction specified\ndrivers/usb/gadget/udc/pch_udc.c:750: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-751- * @dir:\tWhether Tx or Rx\n--\ndrivers/usb/gadget/udc/pch_udc.c-754- */\ndrivers/usb/gadget/udc/pch_udc.c:755:static inline void pch_udc_clear_dma(struct pch_udc_dev *dev, int dir)\ndrivers/usb/gadget/udc/pch_udc.c-756-{\ndrivers/usb/gadget/udc/pch_udc.c-757-\tif (dir == DMA_DIR_RX)\ndrivers/usb/gadget/udc/pch_udc.c:758:\t\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_RDE);\ndrivers/usb/gadget/udc/pch_udc.c-759-\telse if (dir == DMA_DIR_TX)\ndrivers/usb/gadget/udc/pch_udc.c:760:\t\tpch_udc_bit_clr(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_TDE);\ndrivers/usb/gadget/udc/pch_udc.c-761-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-763-/**\ndrivers/usb/gadget/udc/pch_udc.c:764: * pch_udc_set_csr_done() - Set the device control register\ndrivers/usb/gadget/udc/pch_udc.c-765- *\t\t\t\tCSR done field (bit 13)\ndrivers/usb/gadget/udc/pch_udc.c:766: * @dev:\treference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-767- */\ndrivers/usb/gadget/udc/pch_udc.c:768:static inline void pch_udc_set_csr_done(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-769-{\ndrivers/usb/gadget/udc/pch_udc.c:770:\tpch_udc_bit_set(dev, UDC_DEVCTL_ADDR, UDC_DEVCTL_CSR_DONE);\ndrivers/usb/gadget/udc/pch_udc.c-771-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-773-/**\ndrivers/usb/gadget/udc/pch_udc.c:774: * pch_udc_disable_interrupts() - Disables the specified interrupts\ndrivers/usb/gadget/udc/pch_udc.c:775: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-776- * @mask:\tMask to disable interrupts\ndrivers/usb/gadget/udc/pch_udc.c-777- */\ndrivers/usb/gadget/udc/pch_udc.c:778:static inline void pch_udc_disable_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-779-\t\t\t\t\t    u32 mask)\ndrivers/usb/gadget/udc/pch_udc.c-780-{\ndrivers/usb/gadget/udc/pch_udc.c:781:\tpch_udc_bit_set(dev, UDC_DEVIRQMSK_ADDR, mask);\ndrivers/usb/gadget/udc/pch_udc.c-782-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-784-/**\ndrivers/usb/gadget/udc/pch_udc.c:785: * pch_udc_enable_interrupts() - Enable the specified interrupts\ndrivers/usb/gadget/udc/pch_udc.c:786: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-787- * @mask:\tMask to enable interrupts\ndrivers/usb/gadget/udc/pch_udc.c-788- */\ndrivers/usb/gadget/udc/pch_udc.c:789:static inline void pch_udc_enable_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-790-\t\t\t\t\t   u32 mask)\ndrivers/usb/gadget/udc/pch_udc.c-791-{\ndrivers/usb/gadget/udc/pch_udc.c:792:\tpch_udc_bit_clr(dev, UDC_DEVIRQMSK_ADDR, mask);\ndrivers/usb/gadget/udc/pch_udc.c-793-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-795-/**\ndrivers/usb/gadget/udc/pch_udc.c:796: * pch_udc_disable_ep_interrupts() - Disable endpoint interrupts\ndrivers/usb/gadget/udc/pch_udc.c:797: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-798- * @mask:\tMask to disable interrupts\ndrivers/usb/gadget/udc/pch_udc.c-799- */\ndrivers/usb/gadget/udc/pch_udc.c:800:static inline void pch_udc_disable_ep_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-801-\t\t\t\t\t\tu32 mask)\ndrivers/usb/gadget/udc/pch_udc.c-802-{\ndrivers/usb/gadget/udc/pch_udc.c:803:\tpch_udc_bit_set(dev, UDC_EPIRQMSK_ADDR, mask);\ndrivers/usb/gadget/udc/pch_udc.c-804-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-806-/**\ndrivers/usb/gadget/udc/pch_udc.c:807: * pch_udc_enable_ep_interrupts() - Enable endpoint interrupts\ndrivers/usb/gadget/udc/pch_udc.c:808: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-809- * @mask:\tMask to enable interrupts\ndrivers/usb/gadget/udc/pch_udc.c-810- */\ndrivers/usb/gadget/udc/pch_udc.c:811:static inline void pch_udc_enable_ep_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-812-\t\t\t\t\t      u32 mask)\ndrivers/usb/gadget/udc/pch_udc.c-813-{\ndrivers/usb/gadget/udc/pch_udc.c:814:\tpch_udc_bit_clr(dev, UDC_EPIRQMSK_ADDR, mask);\ndrivers/usb/gadget/udc/pch_udc.c-815-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-817-/**\ndrivers/usb/gadget/udc/pch_udc.c:818: * pch_udc_read_device_interrupts() - Read the device interrupts\ndrivers/usb/gadget/udc/pch_udc.c:819: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-820- * Retern\tThe device interrupts\ndrivers/usb/gadget/udc/pch_udc.c-821- */\ndrivers/usb/gadget/udc/pch_udc.c:822:static inline u32 pch_udc_read_device_interrupts(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-823-{\ndrivers/usb/gadget/udc/pch_udc.c:824:\treturn pch_udc_readl(dev, UDC_DEVIRQSTS_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-825-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-827-/**\ndrivers/usb/gadget/udc/pch_udc.c:828: * pch_udc_write_device_interrupts() - Write device interrupts\ndrivers/usb/gadget/udc/pch_udc.c:829: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-830- * @val:\tThe value to be written to interrupt register\ndrivers/usb/gadget/udc/pch_udc.c-831- */\ndrivers/usb/gadget/udc/pch_udc.c:832:static inline void pch_udc_write_device_interrupts(struct pch_udc_dev *dev,\ndrivers/usb/gadget/udc/pch_udc.c-833-\t\t\t\t\t\t     u32 val)\ndrivers/usb/gadget/udc/pch_udc.c-834-{\ndrivers/usb/gadget/udc/pch_udc.c:835:\tpch_udc_writel(dev, val, UDC_DEVIRQSTS_ADDR);\ndrivers/usb/gadget/udc/pch_udc.c-836-}\n--\ndrivers/usb/gadget/udc/pch_udc.c-838-/**\ndrivers/usb/gadget/udc/pch_udc.c:839: * pch_udc_read_ep_interrupts() - Read the endpoint interrupts\ndrivers/usb/gadget/udc/pch_udc.c:840: * @dev:\tReference to structure of type pch_udc_regs\ndrivers/usb/gadget/udc/pch_udc.c-841- * Retern\tThe endpoint interrupt\ndrivers/usb/gadget/udc/pch_udc.c-842- */\ndrivers/usb/gadget/udc/pch_udc.c:843:static inline u32 pch_udc_read_ep_interrupts(struct pch_udc_dev *dev)\ndrivers/usb/gadget/udc/pch_udc.c-844-{\ndrivers/usb/gadget/udc/pch_udc.c:845:\treturn pch_udc_readl(dev, UDC_EPIRQSTS_ADDR);\n\n"
}

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

Args:
null

Results:
null

Tokens:
							input: 50170
							output: 150
							thoughts: 1357
						

Thoughts:
**Analysis of the pch_udc Driver for Fuzzing Eligibility**

Okay, so I've got this `pch_udc` driver, specifically designed for Intel EG20T / Quark X1000 PCI devices. My initial thought is to figure out what this patch is about. I'd normally use `git log` to get the commit message and reasoning, but since I don't have that tool available right now, I have the diff.

Looking at the code, particularly the `pch_vbus_gpio_init` and `pch_udc_remove` functions, a few things jump out. The first is that the code deals with initializing and configuring GPIO for VBUS detection, and the second deals with cleaning up the driver and resources when the PCI device is removed.

Now, considering fuzzing, I need to evaluate if this driver is a viable target. Given the nature of `pch_udc`, it *strongly* suggests that this is specific hardware (Intel EG20T / Quark X1000 PCI) not easily emulated or reachable in a typical QEMU/GCE setup.

The `pch_vbus_gpio_init` function, in particular, relies on this hardware. It interacts directly with the PCI device. Without this device, the execution path is simply not reachable.

Similarly, the `pch_udc_remove` function, while important for driver teardown, is only called during driver removal or PCI hot-unplug, events unlikely to be simulated in a standard fuzzing environment. The device must be removed, a hardware event.

Thinking about USB gadget fuzzing, I know there are dummy controllers like `dummy_hcd` and `raw_gadget`, along with associated UDCs. `pch_udc` doesn't fall into this category. It's a hardware-specific UDC driver. It registers itself with the USB gadget subsystem only when it detects the physical PCI device, using `usb_add_gadget_udc` and `pci_driver pch_udc_driver`. Therefore, `pch_udc_probe` is needed and must bind to that device. Without the physical hardware, the `pch_udc` driver never gets initialized, and none of its functions run. The .remove callback only runs during the removal of the device.

Based on this analysis, I'm concluding this driver is *not* suitable for fuzzing. The required hardware dependencies make it a structurally unreachable execution path.



22/2 2026/09/19 23:15 tool set-results
0m Args:
{
  "EnableConfigs": [],
  "FocusSymbols": [],
  "Reasoning": "The patch modifies drivers/usb/gadget/udc/pch_udc.c, which is a PCI driver for Intel EG20T / Quark X1000 USB Device Controllers. This hardware is not emulated in standard QEMU or cloud virtualized environments, making the driver probe unreachable. Additionally, the changes touch initialization within probe (pch_vbus_gpio_init) and teardown cleanup in the PCI remove callback (pch_udc_remove), which is not reachable during normal fuzzing. Therefore, the changes are not worth fuzzing.",
  "WorthFuzzing": false
}

Results:
{
  "EnableConfigs": null,
  "FocusSymbols": [],
  "Reasoning": "The patch modifies drivers/usb/gadget/udc/pch_udc.c, which is a PCI driver for Intel EG20T / Quark X1000 USB Device Controllers. This hardware is not emulated in standard QEMU or cloud virtualized environments, making the driver probe unreachable. Additionally, the changes touch initialization within probe (pch_vbus_gpio_init) and teardown cleanup in the PCI remove callback (pch_udc_remove), which is not reachable during normal fuzzing. Therefore, the changes are not worth fuzzing.",
  "WorthFuzzing": false
}

23/1 2026/09/19 23:15 action If
0m Args:
{
  "WorthFuzzing": false
}

Results:
null

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)