1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 01:07:36 +00:00

Kernel/USB: Rework queued transfer schedule

Modifies the way the UHCI schedule is set up & modified to allow for
multiple transfers of the same type, from one or more devices, to be
queued up and handled simultaneously.
This commit is contained in:
b14ckcat 2022-07-13 19:02:58 -04:00 committed by Andreas Kling
parent 8aca5ab3b3
commit 4a3a0ac19e
3 changed files with 62 additions and 41 deletions

View file

@ -17,6 +17,7 @@
#include <Kernel/Bus/USB/UHCI/UHCIRootHub.h>
#include <Kernel/Bus/USB/USBController.h>
#include <Kernel/Interrupts/IRQHandler.h>
#include <Kernel/Locking/Spinlock.h>
#include <Kernel/Memory/AnonymousVMObject.h>
#include <Kernel/Process.h>
#include <Kernel/Time/TimeManagement.h>
@ -76,6 +77,10 @@ private:
ErrorOr<void> create_structures();
void setup_schedule();
void enqueue_qh(QueueHead* transfer_queue, QueueHead* anchor);
void dequeue_qh(QueueHead* transfer_queue);
size_t poll_transfer_queue(QueueHead& transfer_queue);
TransferDescriptor* create_transfer_descriptor(Pipe& pipe, PacketID direction, size_t data_len);
@ -89,16 +94,20 @@ private:
IOAddress m_io_base;
Spinlock m_schedule_lock;
OwnPtr<UHCIRootHub> m_root_hub;
OwnPtr<UHCIDescriptorPool<QueueHead>> m_queue_head_pool;
OwnPtr<UHCIDescriptorPool<TransferDescriptor>> m_transfer_descriptor_pool;
Vector<TransferDescriptor*> m_iso_td_list;
QueueHead* m_interrupt_transfer_queue;
QueueHead* m_lowspeed_control_qh;
QueueHead* m_fullspeed_control_qh;
QueueHead* m_bulk_qh;
QueueHead* m_dummy_qh; // Needed for PIIX4 hack
QueueHead* m_schedule_begin_anchor;
QueueHead* m_interrupt_qh_anchor;
QueueHead* m_ls_control_qh_anchor;
QueueHead* m_fs_control_qh_anchor;
// Always final queue in the schedule, may loop back to previous QH for bandwidth
// reclamation instead of actually terminating
QueueHead* m_bulk_qh_anchor;
OwnPtr<Memory::Region> m_framelist;
OwnPtr<Memory::Region> m_isochronous_transfer_pool;