drivers/usb/host/uhci-q.c
Source file repositories/reference/linux-study-clean/drivers/usb/host/uhci-q.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/usb/host/uhci-q.c- Extension
.c- Size
- 47277 bytes
- Lines
- 1794
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
- No C-style include directives detected by the generator.
Detected Declarations
function uhci_set_next_interruptfunction uhci_clear_next_interruptfunction uhci_fsbr_onfunction uhci_fsbr_offfunction uhci_add_fsbrfunction uhci_urbp_wants_fsbrfunction uhci_fsbr_timeoutfunction uhci_free_tdfunction uhci_fill_tdfunction uhci_add_td_to_urbpfunction uhci_remove_td_from_urbpfunction uhci_insert_td_in_frame_listfunction uhci_remove_td_from_frame_listfunction uhci_remove_tds_from_framefunction uhci_unlink_isochronous_tdsfunction uhci_free_qhfunction linkfunction uhci_urb_dequeuefunction earlyfunction list_for_each_entryfunction link_isofunction link_interruptfunction link_asyncfunction uhci_activate_qhfunction unlink_interruptfunction unlink_asyncfunction uhci_unlink_qhfunction schedulefunction uhci_highest_loadfunction uhci_check_bandwidthfunction uhci_reserve_bandwidthfunction uhci_release_bandwidthfunction uhci_free_urb_privfunction list_for_each_entry_safefunction uhci_status_bitsfunction uhci_submit_controlfunction uhci_submit_commonfunction hencefunction uhci_submit_bulkfunction uhci_submit_interruptfunction uhci_fixup_short_transferfunction uhci_result_commonfunction list_for_each_entry_safefunction uhci_submit_isochronousfunction uhci_result_isochronousfunction list_for_each_entry_safefunction uhci_urb_enqueuefunction uhci_urb_dequeue
Annotated Snippet
else if (uhci->fsbr_expiring) {
uhci->fsbr_expiring = 0;
timer_delete(&uhci->fsbr_timer);
}
}
}
static void uhci_fsbr_timeout(struct timer_list *t)
{
struct uhci_hcd *uhci = timer_container_of(uhci, t, fsbr_timer);
unsigned long flags;
spin_lock_irqsave(&uhci->lock, flags);
if (uhci->fsbr_expiring) {
uhci->fsbr_expiring = 0;
uhci_fsbr_off(uhci);
}
spin_unlock_irqrestore(&uhci->lock, flags);
}
static struct uhci_td *uhci_alloc_td(struct uhci_hcd *uhci)
{
dma_addr_t dma_handle;
struct uhci_td *td;
td = dma_pool_alloc(uhci->td_pool, GFP_ATOMIC, &dma_handle);
if (!td)
return NULL;
td->dma_handle = dma_handle;
td->frame = -1;
INIT_LIST_HEAD(&td->list);
INIT_LIST_HEAD(&td->fl_list);
return td;
}
static void uhci_free_td(struct uhci_hcd *uhci, struct uhci_td *td)
{
if (!list_empty(&td->list))
dev_WARN(uhci_dev(uhci), "td %p still in list!\n", td);
if (!list_empty(&td->fl_list))
dev_WARN(uhci_dev(uhci), "td %p still in fl_list!\n", td);
dma_pool_free(uhci->td_pool, td, td->dma_handle);
}
static inline void uhci_fill_td(struct uhci_hcd *uhci, struct uhci_td *td,
u32 status, u32 token, u32 buffer)
{
td->status = cpu_to_hc32(uhci, status);
td->token = cpu_to_hc32(uhci, token);
td->buffer = cpu_to_hc32(uhci, buffer);
}
static void uhci_add_td_to_urbp(struct uhci_td *td, struct urb_priv *urbp)
{
list_add_tail(&td->list, &urbp->td_list);
}
static void uhci_remove_td_from_urbp(struct uhci_td *td)
{
list_del_init(&td->list);
}
/*
* We insert Isochronous URBs directly into the frame list at the beginning
*/
static inline void uhci_insert_td_in_frame_list(struct uhci_hcd *uhci,
struct uhci_td *td, unsigned framenum)
{
framenum &= (UHCI_NUMFRAMES - 1);
td->frame = framenum;
/* Is there a TD already mapped there? */
if (uhci->frame_cpu[framenum]) {
struct uhci_td *ftd, *ltd;
ftd = uhci->frame_cpu[framenum];
ltd = list_entry(ftd->fl_list.prev, struct uhci_td, fl_list);
list_add_tail(&td->fl_list, &ftd->fl_list);
td->link = ltd->link;
wmb();
ltd->link = LINK_TO_TD(uhci, td);
} else {
Annotation
- Detected declarations: `function uhci_set_next_interrupt`, `function uhci_clear_next_interrupt`, `function uhci_fsbr_on`, `function uhci_fsbr_off`, `function uhci_add_fsbr`, `function uhci_urbp_wants_fsbr`, `function uhci_fsbr_timeout`, `function uhci_free_td`, `function uhci_fill_td`, `function uhci_add_td_to_urbp`.
- 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.
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.