Kernel: Remove kmalloc identity map requirement from XHCI device init

This commit is contained in:
2026-05-03 01:18:16 +03:00
parent 0c6d713c4a
commit 8773e80917

View File

@@ -1,4 +1,3 @@
#include <BAN/Bitcast.h>
#include <BAN/ByteSpan.h> #include <BAN/ByteSpan.h>
#include <kernel/Lock/LockGuard.h> #include <kernel/Lock/LockGuard.h>
@@ -125,8 +124,7 @@ namespace Kernel
dprintln_if(DEBUG_XHCI, "Retrieving actual max packet size"); dprintln_if(DEBUG_XHCI, "Retrieving actual max packet size");
BAN::Vector<uint8_t> buffer; auto response_region = TRY(DMARegion::create(PAGE_SIZE, PageTable::MemoryType::Normal));
TRY(buffer.resize(8, 0));
USBDeviceRequest request; USBDeviceRequest request;
request.bmRequestType = USB::RequestType::DeviceToHost | USB::RequestType::Standard | USB::RequestType::Device; request.bmRequestType = USB::RequestType::DeviceToHost | USB::RequestType::Standard | USB::RequestType::Device;
@@ -134,12 +132,17 @@ namespace Kernel
request.wValue = USB::DescriptorType::DEVICE << 8; request.wValue = USB::DescriptorType::DEVICE << 8;
request.wIndex = 0; request.wIndex = 0;
request.wLength = 8; request.wLength = 8;
TRY(send_request(request, kmalloc_paddr_of((vaddr_t)buffer.data()).value())); TRY(send_request(request, response_region->paddr()));
uint8_t bMaxPacketSize0;
PageTable::with_fast_page(response_region->paddr(), [&bMaxPacketSize0] {
bMaxPacketSize0 = PageTable::fast_page_as_sized<uint8_t>(7);
});
dprintln_if(DEBUG_XHCI, "Got device descriptor"); dprintln_if(DEBUG_XHCI, "Got device descriptor");
const bool is_usb3 = (m_speed_class == USB::SpeedClass::SuperSpeed); const bool is_usb3 = (m_speed_class == USB::SpeedClass::SuperSpeed);
const uint32_t new_max_packet_size = is_usb3 ? 1u << buffer.back() : buffer.back(); const uint32_t new_max_packet_size = is_usb3 ? 1u << bMaxPacketSize0 : bMaxPacketSize0;
if (m_endpoints[0].max_packet_size == new_max_packet_size) if (m_endpoints[0].max_packet_size == new_max_packet_size)
return {}; return {};