20 bool initialiseController();
24 bool controllerAssignsAddresses()
const override {
27 bool supportsHubDevices()
const override {
30 bool prepareDevice(uint8_t address,
const UsbEndpoint& endpoint)
override;
31 bool addressDevice(uint8_t address,
const UsbEndpoint& endpoint)
override;
32 bool resetEndpoint(
const UsbEndpoint& endpoint)
override;
35 size_t bytes)
override;
36 bool doAsync(uintptr_t transaction,
void (*callback)(uintptr_t, ssize_t) =
nullptr,
37 uintptr_t parameter = 0)
override;
39 uintptr_t parameter)
override;
42 uintptr_t parameter = 0)
override;
43 bool portReset(uint8_t port,
bool errorResponse =
false)
override;
49 uintptr_t,
bool producerAlreadyStopped)
override;
55 uint64_t
executeRequest(uint64_t port, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
56 uint64_t generation)
override;
66 uint64_t retiredAddresses[20]{};
67 size_t retiredCount = 0;
70 Slot() : output(
"xHCI device context") {}
76 uint8_t contextEntries = 1;
77 size_t generation = 0;
82 physical_uintptr_t pages[16]{};
86 uint8_t slot = 0, dci = 0;
87 uintptr_t
id = 0, client = 0;
88 size_t bytes = 0, generation = 0;
90 bool input =
false, setupPresent =
false, statusPresent =
false, bad =
false;
91 bool submitted =
false, cancelling =
false, periodic =
false, captured =
false;
92 bool shortSeen =
false;
93 size_t actual = 0, trbCount = 0;
94 uint64_t trbAddresses[20]{};
95 size_t trbOffsets[20]{}, trbLengths[20]{};
96 uint8_t trbTypes[20]{};
97 void (*callback)(uintptr_t, ssize_t) =
nullptr;
98 uintptr_t parameter = 0;
102 uintptr_t transaction;
107 uint8_t major = 0, slotType = 0;
108 UsbSpeed speeds[16]{};
109 bool validSpeed[16]{};
111 uint32_t resetChanges = 0;
113 uint32_t read(
size_t offset)
const;
114 void write(
size_t offset, uint32_t value);
115 void write64(
size_t offset, uint64_t value);
116 bool wait(
size_t offset, uint32_t mask, uint32_t expected,
size_t milliseconds);
117 bool parseCapabilities(uint32_t hcc);
118 bool command(
XhciHw::Trb trb, uint8_t* returnedSlot =
nullptr);
119 bool collectEventsLocked(
bool fromInterrupt);
120 bool transferEventLocked(
const XhciHw::Trb& event);
121 void notifyPortLocked(
size_t port);
126 uint8_t findSlot(
const UsbEndpoint& endpoint)
const;
127 uint32_t* inputContext(
size_t index);
128 uint32_t* outputContext(uint8_t slot,
size_t index);
129 bool resetEndpointHardware(uint8_t slot, uint8_t dci,
bool stop);
131 static bool decodeCompletion(
Transaction&,
size_t index, uint8_t code,
size_t residual,
132 bool& complete,
size_t& actual);
133 static bool completionRegressions();
134 bool accept(uintptr_t transaction,
void (*callback)(uintptr_t, ssize_t), uintptr_t parameter,
136 void finishLocked(
Transaction& transaction, ssize_t result,
bool natural);
138 static void afterDelivery(
void* context);
139 static void destroyDelivery(
void* context);
140 static int deliveryWorker(
void* context);
141 void freeTransactionLocked(uintptr_t transaction);
142 void cancelTransfer(uintptr_t transaction,
size_t generation,
bool recurring,
143 void (*callback)(uintptr_t, ssize_t), uintptr_t parameter);
145 IoBase* m_Registers =
nullptr;
146 size_t m_Op = 0, m_Runtime = 0, m_Doorbells = 0, m_ContextSize = 32;
147 size_t m_PortCount = 0, m_SlotCount = 0;
149 bool m_HardwareOwned =
false;
150 Atomic<bool> m_Online{
false}, m_Stopping{
false}, m_Failed{
false}, m_PortsClosing{
false};
151 bool m_Shutdown =
false, m_DeliveryStopping =
false, m_PolledInterrupt =
false;
152 bool m_ObservedInterruptCompletion =
false;
153 Mutex m_Lock, m_CommandLock, m_ConfigurationLock, m_CancelLock;
156 MemoryRegion m_Events, m_Erst, m_Dcbaa, m_Input, m_ScratchPointers;
158 size_t m_EventHead = 0, m_EventWraps = 0;
159 bool m_EventCycle =
true;
160 uint64_t m_CommandAddress = 0;
161 uint8_t m_CommandCode = 0, m_CommandSlot = 0;
163 Slot m_Slots[XhciHw::MaxSlots + 1];
164 uint8_t m_Addresses[128]{}, m_PortSlots[XhciHw::MaxPorts]{};
165 Port m_Ports[XhciHw::MaxPorts];
167 Transaction* m_Transactions[XhciHw::MaxTransactions]{};
171 Thread* m_DeliveryThread =
nullptr;
bool addInterruptInHandler(UsbEndpoint endpoint, uintptr_t buffer, uint16_t bytes, void(*callback)(uintptr_t, ssize_t), UsbInterruptInHandle &handle, uintptr_t parameter=0) override
Adds an owned recurring interrupt-IN transaction.