Artemis Milestone 2f: SET_CONFIGURATION -- 2f complete

Chains off a confirmed Mass Storage/SCSI/BOT interface match via the
existing next_action deferral mechanism: device descriptor -> config
descriptor -> SET_CONFIGURATION is now a single automatic sequence.
bConfigurationValue is read directly out of the already-fetched
config_descriptor buffer, no extra transfer needed.

First write control transfer this driver has issued (every prior one was
a read), so it needed its own submission helper,
xhci_ep0_control_write_nodata() -- SET_CONFIGURATION has no Data Stage
(wLength=0), and per USB 2.0 spec 8.5.3 a no-data control transfer's
Status Stage is always IN, the reverse of an OUT-data request's status
stage. XHCI_SETUP_TRT_NO_DATA already existed in xhci.h, unused until now.

Verified live via QMP hotplug, all three architectures, worked first try,
byte-identical: "set configuration submitted" -> "device configured",
guest stays running throughout (checked via QMP query-status). Disconnect
confirmed clean on every arch afterward, no wedge. FABRIC-2.md Section X
Milestone 2f updated -- 2f is now fully complete, 2g (Bulk-Only Transport)
can start.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QPfdtaXs9ay1nbwuMnrscu
This commit is contained in:
Robert Allan James
2026-08-25 07:40:16 -04:00
co-authored by Claude Sonnet 5
parent b9c540a78b
commit b4bbd043d0
12 changed files with 27309 additions and 9 deletions
+25 -2
View File
@@ -99,7 +99,8 @@ typedef struct {
XHCI_XFER_NONE = 0,
XHCI_XFER_DEVICE_DESC,
XHCI_XFER_CONFIG_DESC_SHORT,
XHCI_XFER_CONFIG_DESC_FULL
XHCI_XFER_CONFIG_DESC_FULL,
XHCI_XFER_SET_CONFIG
} transfer_purpose;
uint32_t pending_transfer_slot_id;
uint8_t device_descriptor[18];
@@ -120,10 +121,14 @@ typedef struct {
enum {
XHCI_NEXT_ACTION_NONE = 0,
XHCI_NEXT_ACTION_GET_DEVICE_DESC,
XHCI_NEXT_ACTION_GET_CONFIG_DESC
XHCI_NEXT_ACTION_GET_CONFIG_DESC,
XHCI_NEXT_ACTION_SET_CONFIG
} next_action;
uint32_t next_action_slot_id;
uint16_t next_action_length;
uint8_t next_action_config_value; /* SET_CONFIGURATION's wValue, staged by
* the CONFIG_DESC_FULL handler once
* bConfigurationValue is known */
} xhci_dev_t;
/*
@@ -267,4 +272,22 @@ int xhci_ep0_get_device_descriptor(xhci_dev_t *dev, uint32_t slot_id);
*/
int xhci_ep0_get_config_descriptor(xhci_dev_t *dev, uint32_t slot_id, uint16_t length);
/*
* xhci_ep0_set_configuration — issue a SET_CONFIGURATION control transfer
* (Setup + Status stage only, no Data stage)
* with wValue = config_value. Moves the
* device from Addressed into Configured
* state -- required before any endpoint
* other than EP0 (i.e. the bulk IN/OUT
* endpoints 2g needs) can be used.
*
* Called once the Configuration descriptor read confirms a Mass Storage/
* SCSI/BOT device, with config_value = that descriptor's own
* bConfigurationValue field -- not called directly by other code.
*
* Returns 0 if the transfer was posted, -1 if dev/dev->ep0_ring is not
* set up.
*/
int xhci_ep0_set_configuration(xhci_dev_t *dev, uint32_t slot_id, uint8_t config_value);
#endif /* STARKERNEL_XHCI_DRIVER_H */