drivers/usb/mtu3/mtu3_gadget_ep0.c
Source file repositories/reference/linux-study-clean/drivers/usb/mtu3/mtu3_gadget_ep0.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/usb/mtu3/mtu3_gadget_ep0.c- Extension
.c- Size
- 21628 bytes
- Lines
- 917
- Domain
- Driver Families
- Bucket
- drivers/usb
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/iopoll.hlinux/usb/composite.hmtu3.hmtu3_debug.hmtu3_trace.h
Detected Declarations
function ep0_req_givebackfunction forward_to_driverfunction ep0_write_fifofunction ep0_read_fifofunction ep0_load_test_packetfunction ep0_stall_setfunction ep0_do_status_stagefunction ep0_dummy_completefunction ep0_set_selfunction ep0_get_statusfunction handle_test_modefunction ep0_handle_feature_devfunction ep0_handle_featurefunction handle_standard_requestfunction ep0_rx_statefunction ep0_tx_statefunction ep0_read_setupfunction ep0_handle_setupfunction mtu3_ep0_isrfunction mtu3_ep0_enablefunction mtu3_ep0_disablefunction ep0_queuefunction mtu3_ep0_queuefunction mtu3_ep0_dequeuefunction mtu3_ep0_halt
Annotated Snippet
if (mtu->g.speed >= USB_SPEED_SUPER) {
result[0] |= mtu->u1_enable << USB_DEV_STAT_U1_ENABLED;
result[0] |= mtu->u2_enable << USB_DEV_STAT_U2_ENABLED;
}
dev_dbg(mtu->dev, "%s result=%x, U1=%x, U2=%x\n", __func__,
result[0], mtu->u1_enable, mtu->u2_enable);
break;
case USB_RECIP_INTERFACE:
/* status of function remote wakeup, forward request */
handled = 0;
break;
case USB_RECIP_ENDPOINT:
epnum = (u8) le16_to_cpu(setup->wIndex);
is_in = epnum & USB_DIR_IN;
epnum &= USB_ENDPOINT_NUMBER_MASK;
if (epnum >= mtu->num_eps) {
handled = -EINVAL;
break;
}
if (!epnum)
break;
mep = (is_in ? mtu->in_eps : mtu->out_eps) + epnum;
if (!mep->desc) {
handled = -EINVAL;
break;
}
if (mep->flags & MTU3_EP_STALL)
result[0] |= 1 << USB_ENDPOINT_HALT;
break;
default:
/* class, vendor, etc ... delegate */
handled = 0;
break;
}
if (handled > 0) {
int ret;
/* prepare a data stage for GET_STATUS */
dev_dbg(mtu->dev, "get_status=%x\n", *(u16 *)result);
memcpy(mtu->setup_buf, result, sizeof(result));
mtu->ep0_req.mep = mtu->ep0;
mtu->ep0_req.request.length = 2;
mtu->ep0_req.request.buf = &mtu->setup_buf;
mtu->ep0_req.request.complete = ep0_dummy_complete;
ret = ep0_queue(mtu->ep0, &mtu->ep0_req);
if (ret < 0)
handled = ret;
}
return handled;
}
static int handle_test_mode(struct mtu3 *mtu, struct usb_ctrlrequest *setup)
{
void __iomem *mbase = mtu->mac_base;
int handled = 1;
u32 value;
switch (le16_to_cpu(setup->wIndex) >> 8) {
case USB_TEST_J:
dev_dbg(mtu->dev, "USB_TEST_J\n");
mtu->test_mode_nr = TEST_J_MODE;
break;
case USB_TEST_K:
dev_dbg(mtu->dev, "USB_TEST_K\n");
mtu->test_mode_nr = TEST_K_MODE;
break;
case USB_TEST_SE0_NAK:
dev_dbg(mtu->dev, "USB_TEST_SE0_NAK\n");
mtu->test_mode_nr = TEST_SE0_NAK_MODE;
break;
case USB_TEST_PACKET:
dev_dbg(mtu->dev, "USB_TEST_PACKET\n");
mtu->test_mode_nr = TEST_PACKET_MODE;
break;
default:
handled = -EINVAL;
goto out;
}
mtu->test_mode = true;
/* no TX completion interrupt, and need restart platform after test */
if (mtu->test_mode_nr == TEST_PACKET_MODE)
ep0_load_test_packet(mtu);
Annotation
- Immediate include surface: `linux/iopoll.h`, `linux/usb/composite.h`, `mtu3.h`, `mtu3_debug.h`, `mtu3_trace.h`.
- Detected declarations: `function ep0_req_giveback`, `function forward_to_driver`, `function ep0_write_fifo`, `function ep0_read_fifo`, `function ep0_load_test_packet`, `function ep0_stall_set`, `function ep0_do_status_stage`, `function ep0_dummy_complete`, `function ep0_set_sel`, `function ep0_get_status`.
- Atlas domain: Driver Families / drivers/usb.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.