diff options
-rw-r--r-- | Kernel/Bus/USB/UHCI/UHCIController.cpp | 12 | ||||
-rw-r--r-- | Kernel/Bus/USB/UHCI/UHCIDescriptorPool.h | 36 |
2 files changed, 20 insertions, 28 deletions
diff --git a/Kernel/Bus/USB/UHCI/UHCIController.cpp b/Kernel/Bus/USB/UHCI/UHCIController.cpp index 64a0583e16..cda1767672 100644 --- a/Kernel/Bus/USB/UHCI/UHCIController.cpp +++ b/Kernel/Bus/USB/UHCI/UHCIController.cpp @@ -130,11 +130,7 @@ KResult UHCIController::reset() UNMAP_AFTER_INIT KResult UHCIController::create_structures() { - m_queue_head_pool = UHCIDescriptorPool<QueueHead>::try_create("Queue Head Pool"); - if (!m_queue_head_pool) { - dmesgln("UHCI: Failed to create Queue Head Pool!"); - return ENOMEM; - } + m_queue_head_pool = TRY(UHCIDescriptorPool<QueueHead>::try_create("Queue Head Pool"sv)); // Create the Full Speed, Low Speed Control and Bulk Queue Heads m_interrupt_transfer_queue = allocate_queue_head(); @@ -146,11 +142,7 @@ UNMAP_AFTER_INIT KResult UHCIController::create_structures() // Now the Transfer Descriptor pool auto td_pool_vmobject = TRY(Memory::AnonymousVMObject::try_create_physically_contiguous_with_size(PAGE_SIZE)); - m_transfer_descriptor_pool = UHCIDescriptorPool<TransferDescriptor>::try_create("Transfer Descriptor Pool"); - if (!m_transfer_descriptor_pool) { - dmesgln("UHCI: Failed to create Transfer Descriptor Pool!"); - return ENOMEM; - } + m_transfer_descriptor_pool = TRY(UHCIDescriptorPool<TransferDescriptor>::try_create("Transfer Descriptor Pool"sv)); m_isochronous_transfer_pool = MM.allocate_kernel_region_with_vmobject(move(td_pool_vmobject), PAGE_SIZE, "UHCI Isochronous Descriptor Pool", Memory::Region::Access::ReadWrite); if (!m_isochronous_transfer_pool) { diff --git a/Kernel/Bus/USB/UHCI/UHCIDescriptorPool.h b/Kernel/Bus/USB/UHCI/UHCIDescriptorPool.h index d7358b40c1..d58b3984d8 100644 --- a/Kernel/Bus/USB/UHCI/UHCIDescriptorPool.h +++ b/Kernel/Bus/USB/UHCI/UHCIDescriptorPool.h @@ -20,36 +20,23 @@ namespace Kernel::USB { // that can fit in a single page. template<typename T> class UHCIDescriptorPool { + AK_MAKE_NONCOPYABLE(UHCIDescriptorPool); + AK_MAKE_NONMOVABLE(UHCIDescriptorPool); // Ensure that we can't get into a situation where we'll write past the page // and blow up static_assert(sizeof(T) <= PAGE_SIZE); public: - static OwnPtr<UHCIDescriptorPool<T>> try_create(const StringView name) + static KResultOr<NonnullOwnPtr<UHCIDescriptorPool<T>>> try_create(StringView name) { auto pool_memory_block = MM.allocate_kernel_region(PAGE_SIZE, "UHCI Descriptor Pool", Memory::Region::Access::ReadWrite); if (!pool_memory_block) - return {}; + return ENOMEM; - return adopt_own_if_nonnull(new (nothrow) UHCIDescriptorPool(pool_memory_block.release_nonnull(), name)); + return adopt_nonnull_own_or_enomem(new (nothrow) UHCIDescriptorPool(pool_memory_block.release_nonnull(), name)); } - UHCIDescriptorPool(NonnullOwnPtr<Memory::Region> pool_memory_block, const StringView& name) - : m_pool_name(name) - , m_pool_region(move(pool_memory_block)) - { - // Go through the number of descriptors to create in the pool, and create a virtual/physical address mapping - for (size_t i = 0; i < PAGE_SIZE / sizeof(T); i++) { - auto placement_address = reinterpret_cast<void*>(m_pool_region->vaddr().get() + (i * sizeof(T))); - auto physical_address = static_cast<u32>(m_pool_region->physical_page(0)->paddr().get() + (i * sizeof(T))); - auto* object = new (placement_address) T(physical_address); - m_free_descriptor_stack.push(object); // Push the descriptor's pointer onto the free list - } - } - -public: - UHCIDescriptorPool() = delete; ~UHCIDescriptorPool() = default; [[nodiscard]] T* try_take_free_descriptor() @@ -78,6 +65,19 @@ public: } private: + UHCIDescriptorPool(NonnullOwnPtr<Memory::Region> pool_memory_block, StringView name) + : m_pool_name(name) + , m_pool_region(move(pool_memory_block)) + { + // Go through the number of descriptors to create in the pool, and create a virtual/physical address mapping + for (size_t i = 0; i < PAGE_SIZE / sizeof(T); i++) { + auto placement_address = reinterpret_cast<void*>(m_pool_region->vaddr().get() + (i * sizeof(T))); + auto physical_address = static_cast<u32>(m_pool_region->physical_page(0)->paddr().get() + (i * sizeof(T))); + auto* object = new (placement_address) T(physical_address); + m_free_descriptor_stack.push(object); // Push the descriptor's pointer onto the free list + } + } + StringView m_pool_name; // Name of this pool NonnullOwnPtr<Memory::Region> m_pool_region; // Memory region where descriptors actually reside Stack<T*, PAGE_SIZE / sizeof(T)> m_free_descriptor_stack; // Stack of currently free descriptor pointers |