diff --git a/kernel/include/kernel/USB/Device.h b/kernel/include/kernel/USB/Device.h index 4816a132..fc1e1b46 100644 --- a/kernel/include/kernel/USB/Device.h +++ b/kernel/include/kernel/USB/Device.h @@ -68,7 +68,7 @@ namespace Kernel const BAN::Vector& configurations() { return m_descriptor.configurations; } - virtual BAN::ErrorOr initialize_endpoint(const USBEndpointDescriptor&) = 0; + virtual BAN::ErrorOr configure_endpoint(const USBEndpointDescriptor&) = 0; virtual BAN::ErrorOr send_request(const USBDeviceRequest&, paddr_t buffer) = 0; virtual void send_data_buffer(uint8_t endpoint_id, paddr_t buffer, size_t buffer_len) = 0; diff --git a/kernel/include/kernel/USB/XHCI/Device.h b/kernel/include/kernel/USB/XHCI/Device.h index ce3cea10..5017d8d2 100644 --- a/kernel/include/kernel/USB/XHCI/Device.h +++ b/kernel/include/kernel/USB/XHCI/Device.h @@ -33,7 +33,7 @@ namespace Kernel public: static BAN::ErrorOr> create(XHCIController&, uint32_t port_id, uint32_t slot_id); - BAN::ErrorOr initialize_endpoint(const USBEndpointDescriptor&) override; + BAN::ErrorOr configure_endpoint(const USBEndpointDescriptor&) override; BAN::ErrorOr send_request(const USBDeviceRequest&, paddr_t buffer) override; void send_data_buffer(uint8_t endpoint_id, paddr_t buffer, size_t buffer_size) override; diff --git a/kernel/kernel/USB/HID/HIDDriver.cpp b/kernel/kernel/USB/HID/HIDDriver.cpp index a8fa37a4..ee4f20d1 100644 --- a/kernel/kernel/USB/HID/HIDDriver.cpp +++ b/kernel/kernel/USB/HID/HIDDriver.cpp @@ -194,7 +194,7 @@ namespace Kernel if ((desc.bmAttributes & 0x03) != 0x03) continue; - TRY(m_device.initialize_endpoint(desc)); + TRY(m_device.configure_endpoint(desc)); m_data_buffer = TRY(DMARegion::create(desc.wMaxPacketSize & 0x07FF)); m_data_endpoint_id = (desc.bEndpointAddress & 0x0F) * 2 + !!(desc.bEndpointAddress & 0x80); diff --git a/kernel/kernel/USB/MassStorage/MassStorageDriver.cpp b/kernel/kernel/USB/MassStorage/MassStorageDriver.cpp index 376a1f76..b40af3ef 100644 --- a/kernel/kernel/USB/MassStorage/MassStorageDriver.cpp +++ b/kernel/kernel/USB/MassStorage/MassStorageDriver.cpp @@ -74,8 +74,8 @@ namespace Kernel return BAN::Error::from_errno(EFAULT); } - TRY(m_device.initialize_endpoint(m_interface.endpoints[bulk_in_index].descriptor)); - TRY(m_device.initialize_endpoint(m_interface.endpoints[bulk_out_index].descriptor)); + TRY(m_device.configure_endpoint(m_interface.endpoints[bulk_in_index].descriptor)); + TRY(m_device.configure_endpoint(m_interface.endpoints[bulk_out_index].descriptor)); { const auto& desc = m_interface.endpoints[bulk_in_index].descriptor; diff --git a/kernel/kernel/USB/XHCI/Device.cpp b/kernel/kernel/USB/XHCI/Device.cpp index 3bc78bdd..b3b6c35e 100644 --- a/kernel/kernel/USB/XHCI/Device.cpp +++ b/kernel/kernel/USB/XHCI/Device.cpp @@ -195,18 +195,13 @@ namespace Kernel ASSERT_NOT_REACHED(); } - BAN::ErrorOr XHCIDevice::initialize_endpoint(const USBEndpointDescriptor& endpoint_descriptor) + BAN::ErrorOr XHCIDevice::configure_endpoint(const USBEndpointDescriptor& endpoint_descriptor) { const bool is_control { (endpoint_descriptor.bmAttributes & 0x03) == 0x00 }; const bool is_isoch { (endpoint_descriptor.bmAttributes & 0x03) == 0x01 }; const bool is_bulk { (endpoint_descriptor.bmAttributes & 0x03) == 0x02 }; const bool is_interrupt { (endpoint_descriptor.bmAttributes & 0x03) == 0x03 }; - (void)is_control; - (void)is_isoch; - (void)is_bulk; - (void)is_interrupt; - XHCI::EndpointType endpoint_type; switch ((endpoint_descriptor.bEndpointAddress & 0x80) | (endpoint_descriptor.bmAttributes & 0x03)) { @@ -231,20 +226,29 @@ namespace Kernel const uint32_t average_trb_length = (is_control) ? 8 : max_esit_payload; const uint32_t error_count = (is_isoch) ? 0 : 3; - auto& endpoint = m_endpoints[endpoint_id - 1]; - ASSERT(!endpoint.transfer_ring); - uint32_t last_valid_endpoint_id = endpoint_id; for (size_t i = endpoint_id; i < m_endpoints.size(); i++) if (m_endpoints[i].transfer_ring) last_valid_endpoint_id = i + 1; - endpoint.transfer_ring = TRY(DMARegion::create(m_transfer_ring_trb_count * sizeof(XHCI::TRB))); - endpoint.max_packet_size = max_packet_size; - endpoint.dequeue_index = 0; - endpoint.enqueue_index = 0; - endpoint.cycle_bit = 1; - endpoint.callback = (is_interrupt || is_bulk) ? &XHCIDevice::on_interrupt_or_bulk_endpoint_event : nullptr; + auto& endpoint = m_endpoints[endpoint_id - 1]; + LockGuard _(endpoint.mutex); + + if (!endpoint.transfer_ring) + { + endpoint.transfer_ring = TRY(DMARegion::create(m_transfer_ring_trb_count * sizeof(XHCI::TRB))); + endpoint.max_packet_size = max_packet_size; + endpoint.dequeue_index = 0; + endpoint.enqueue_index = 0; + endpoint.cycle_bit = 1; + endpoint.callback = (is_interrupt || is_bulk) ? &XHCIDevice::on_interrupt_or_bulk_endpoint_event : nullptr; + } + else + { + endpoint.dequeue_index = 0; + endpoint.enqueue_index = 0; + endpoint.cycle_bit = 1; + } memset(reinterpret_cast(endpoint.transfer_ring->vaddr()), 0, endpoint.transfer_ring->size()); @@ -256,9 +260,8 @@ namespace Kernel auto& endpoint_context = *reinterpret_cast (m_input_context->vaddr() + (endpoint_id + 1) * context_size); memset(&input_control_context, 0, context_size); - input_control_context.add_context_flags = (1u << endpoint_id) | 1; + input_control_context.add_context_flags = (1u << endpoint_id) | (1 << 0); - memset(&slot_context, 0, context_size); slot_context.context_entries = last_valid_endpoint_id; // FIXME: 4.5.2 hub