Files
LithosAnanake/include/starkernel/blkio_usb.h
T
Robert Allan JamesandClaude Sonnet 5 9e81de3f43
Build / build-amd64-iso (push) Waiting to run
Build / build-aarch64-iso (push) Waiting to run
Build / build-riscv64-img (push) Waiting to run
xHCI/BOT driver: genuine multi-device support (FABRIC-3.md §VII)
Per-slot registry (xhci_msc_slot_t/dev->msc_slots, sized off the
controller's own reported max_slots) replaces the single-device scalar
fields the driver carried since Milestones 2e-2h. Boot-time port scan no
longer stops at the first connected device; a connect/disconnect that
arrives while the Command Ring is busy is now queued and drained instead
of dropped. blkio_usb.c and repl.c's own single-device state (device
descriptor buffers, blkio_dev_t, attach bookkeeping) became per-slot
registries the same way.

Live multi-device testing (not just compiling) surfaced a second, more
severe bug outside the original plan: transfer_purpose and next_action
were also single scalars shared across the whole controller. Two devices
enumerating concurrently could have one's completion silently overwrite
the other's still-outstanding one, permanently stalling it with no error.
Fixed by moving both per-slot and, critically, reading the Transfer Event
TRB's own real Slot ID field instead of trusting external bookkeeping.

Verified live, all three architectures, mandatory clean-qemu acceptance:
existing single-device path unchanged, and two devices attached
simultaneously (amd64) both progress independently through enumeration
without corrupting or stalling each other.

Also in this pass (implemented and verified in earlier turns this
session, committed together per direct instruction):
- Headless-until-login console policy: no prompt/banner until a real
  identity logs in via an attached thumbdrive (WIREBIND or Zuse, neither
  special), reusing EMERGENCY_CONSOLE_ENABLED as the debug/recovery
  escape hatch (now default-off).
- KILL/g_repl_active_vm dangling-pointer fix: killing the VM the console
  is currently USE'd onto now detaches back to Hera first, matching the
  existing EJECT/UNCLEAN precedent.

FABRIC-3.md §VII/§VIII carry full closure notes for all three.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018EjXFo7mPXjUMjfJeuUUz4
2026-09-05 22:14:14 -04:00

60 lines
2.8 KiB
C

/*
* blkio_usb.h — USB Mass Storage (Bulk-Only Transport) blkio_dev backend
* for StarKernel, Milestone 2h. Presents a blkio_dev_t interface for
* attachment to the StarForth block subsystem via blk_subsys_attach_device(),
* matching virtio_blk.h's own precedent — built on top of the xHCI BOT
* driver's synchronous bridge (xhci_bot_wait_for_idle(), xhci_bot_get_capacity(),
* xhci_bot_read_block()) from Milestone 2h's foundational increment.
*
* Read-write since 2026-08-28 (FABRIC-2.md §F.1): SCSI WRITE(10) is real
* (xhci_bot_send_write10()/xhci_bot_write_block()/xhci_bot_write_data_out(),
* xhci.c), mirroring READ(10)'s existing CBW/data-stage/CSW machinery with
* the data direction flipped. Verified live on amd64: BLK-CONFIRM-FORMAT's
* BAM/reloc zero-page writes and an explicit block content write both
* survived a cold reboot and read back correctly.
*
* FABRIC-3.md §VII (2026-09-05): multiple simultaneously-attached USB MSC
* devices are now supported -- each open() call is backed by its own
* per-slot state (blkio_usb.c's own registry, keyed by xHCI slot ID,
* mirroring xhci_dev_t's msc_slots[]). The underlying xHCI/BOT command
* machinery still runs one bulk transfer at a time across the whole
* controller (real xHCI semantics, not a limitation introduced here) --
* see xhci_msc_slot_t's own doc comment for the persistent-vs-in-flight
* distinction this rests on.
*/
#ifndef STARKERNEL_BLKIO_USB_H
#define STARKERNEL_BLKIO_USB_H
#include <stdint.h>
#include "blkio.h"
#include "starkernel/xhci_driver.h"
/*
* blkio_usb_open_msc — synchronously query a confirmed Mass Storage/BOT
* device's capacity (SCSI READ CAPACITY(10), via
* xhci_bot_get_capacity() + xhci_bot_wait_for_idle())
* and fill in *dev_out so the caller can pass it to
* blk_subsys_attach_device().
*
* xdev/slot_id identify an already-enumerated, already-configured Mass
* Storage/BOT device (SET_CONFIGURATION already succeeded) — this function
* does not enumerate or configure anything itself.
*
* MUST be called from outside xhci_poll_events()'s own call frame, same
* constraint as xhci_bot_wait_for_idle() itself (see its own doc comment
* in xhci_driver.h) — this function calls it directly.
*
* dev_out must point to a zero-initialised blkio_dev_t.
*
* Returns 0 on success.
* Returns -1 if xdev/slot_id are invalid, or the capacity query didn't PASS.
* Returns -2 if the device's reported SCSI block size doesn't evenly divide
* BLKIO_FORTH_BLOCK_SIZE (1024) — this backend has no way to
* serve a partial Forth block, so it refuses rather than
* silently misbehaving.
*/
int blkio_usb_open_msc(blkio_dev_t *dev_out, xhci_dev_t *xdev, uint32_t slot_id);
#endif /* STARKERNEL_BLKIO_USB_H */