Artemis Milestone 2e: PORTSC connect/disconnect detection, verified live
xhci_poll_events()'s Port Status Change branch now decodes the Port ID from the event TRB (XHCI_PSC_EVT_PORT_ID, new in xhci.h), reads that port's PORTSC.CCS via a new xhci_port_regs() helper, and logs connect vs. disconnect. Acknowledges by writing back only PP (preserved) and CSC (the bit being cleared) -- PED/PR/other _C bits written 0 so nothing is accidentally disabled, reset, or silently cleared, matching the RW1C discipline already used for ERDP.EHB in 2d. Verified with the real target scenario via QMP hotplug on all three architectures: boot with the xHCI controller present but no USB device attached (confirmed zero port activity at ok>), then live attach/detach/re-attach of a virtual USB thumb drive (disk/usb-thumbdrive-test.img via usb-storage on xhci0.0). Full connect->disconnect->connect cycle confirmed clean (no port wedge) on amd64; single connect confirmed on aarch64 and riscv64. Still open: correlating Command Completion Events back to their issuing command, driving Enable Slot/Address Device from this connect path (currently only a boot-time smoke test), and the callback surface into Section U's higher-level code. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HZ8kNoTuP63pbQtro4qvrm
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
bb84eba7e3
commit
dd043bbfeb
@@ -202,6 +202,11 @@ typedef struct {
|
||||
#define XHCI_EVT_SLOT_ID(control) (((uint32_t)(control) >> 24) & 0xFFu)
|
||||
#define XHCI_COMPLETION_CODE_SUCCESS 1u
|
||||
|
||||
/* Port Status Change Event TRB layout (xHCI 1.2 spec table 6-34):
|
||||
* parameter[31:24] = Port ID (1-based, matches PORTSC array indexing
|
||||
* 1..MaxPorts); parameter[23:0] and the rest of the TRB are reserved. */
|
||||
#define XHCI_PSC_EVT_PORT_ID(parameter) (((uint32_t)(parameter) >> 24) & 0xFFu)
|
||||
|
||||
/* -------------------------------------------------------------------------
|
||||
* Ring sizing — decided up front per Milestone 2's punch list (2a).
|
||||
*
|
||||
|
||||
@@ -78,10 +78,12 @@ int xhci_bringup(xhci_dev_t *dev);
|
||||
|
||||
/*
|
||||
* xhci_poll_events — read Interrupter 0's Event Ring, dispatching each TRB
|
||||
* by type (Port Status Change, Command Completion;
|
||||
* other types logged and skipped -- Milestone 2e/2g
|
||||
* consume them), then advance the Event Ring dequeue
|
||||
* pointer and clear ERDP.EHB.
|
||||
* by type: Port Status Change reads PORTSC to log
|
||||
* connect/disconnect and acknowledges CSC; Command
|
||||
* Completion and Transfer Event are logged only (slot
|
||||
* allocation and BOT transfers are later increments).
|
||||
* Advances the Event Ring dequeue pointer and clears
|
||||
* ERDP.EHB when done.
|
||||
*
|
||||
* Polled, not interrupt-driven: an initial attempt at IRQ delivery
|
||||
* (Milestone 2d's first draft) found the amd64 PCI INTx routing formula
|
||||
|
||||
Reference in New Issue
Block a user