mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 10:07:44 +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:
parent
8aca5ab3b3
commit
4a3a0ac19e
3 changed files with 62 additions and 41 deletions
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue