diff --git a/Kernel/Bus/USB/Drivers/HID/MouseDriver.cpp b/Kernel/Bus/USB/Drivers/HID/MouseDriver.cpp index d7c411bb56..4cbfe4aca2 100644 --- a/Kernel/Bus/USB/Drivers/HID/MouseDriver.cpp +++ b/Kernel/Bus/USB/Drivers/HID/MouseDriver.cpp @@ -20,7 +20,7 @@ USB_DEVICE_DRIVER(MouseDriver); void MouseDriver::init() { auto driver = MUST(adopt_nonnull_lock_ref_or_enomem(new MouseDriver())); - USBManagement::the().register_driver(driver); + USBManagement::register_driver(driver); } ErrorOr MouseDriver::checkout_interface(USB::Device& device, USBInterface const& interface) diff --git a/Kernel/Bus/USB/Drivers/MassStorage/MassStorageDriver.cpp b/Kernel/Bus/USB/Drivers/MassStorage/MassStorageDriver.cpp index 2e3def05b1..284366b34e 100644 --- a/Kernel/Bus/USB/Drivers/MassStorage/MassStorageDriver.cpp +++ b/Kernel/Bus/USB/Drivers/MassStorage/MassStorageDriver.cpp @@ -24,7 +24,7 @@ USB_DEVICE_DRIVER(MassStorageDriver); void MassStorageDriver::init() { auto driver = MUST(adopt_nonnull_lock_ref_or_enomem(new MassStorageDriver())); - USBManagement::the().register_driver(driver); + USBManagement::register_driver(driver); } ErrorOr MassStorageDriver::checkout_interface(USB::Device& device, USBInterface const& interface) diff --git a/Kernel/Bus/USB/USBManagement.cpp b/Kernel/Bus/USB/USBManagement.cpp index 0dea349094..82cb13e908 100644 --- a/Kernel/Bus/USB/USBManagement.cpp +++ b/Kernel/Bus/USB/USBManagement.cpp @@ -81,22 +81,29 @@ UNMAP_AFTER_INIT void USBManagement::initialize() void USBManagement::register_driver(NonnullLockRefPtr driver) { + if (!initialized()) + return; dbgln_if(USB_DEBUG, "Registering driver {}", driver->name()); - m_available_drivers.append(driver); + the().m_available_drivers.append(driver); } LockRefPtr USBManagement::get_driver_by_name(StringView name) { - auto it = m_available_drivers.find_if([name](auto driver) { return driver->name() == name; }); + if (!initialized()) + return nullptr; + auto it = the().m_available_drivers.find_if([name](auto driver) { return driver->name() == name; }); return it.is_end() ? nullptr : LockRefPtr { *it }; } void USBManagement::unregister_driver(NonnullLockRefPtr driver) { + if (!initialized()) + return; + auto& the_instance = the(); dbgln_if(USB_DEBUG, "Unregistering driver {}", driver->name()); - auto const& found_driver = m_available_drivers.find(driver); + auto const& found_driver = the_instance.m_available_drivers.find(driver); if (!found_driver.is_end()) - m_available_drivers.remove(found_driver.index()); + the_instance.m_available_drivers.remove(found_driver.index()); } USBManagement& USBManagement::the() diff --git a/Kernel/Bus/USB/USBManagement.h b/Kernel/Bus/USB/USBManagement.h index 3940be2181..ff0c05115e 100644 --- a/Kernel/Bus/USB/USBManagement.h +++ b/Kernel/Bus/USB/USBManagement.h @@ -21,9 +21,9 @@ public: static void initialize(); static USBManagement& the(); - void register_driver(NonnullLockRefPtr driver); - LockRefPtr get_driver_by_name(StringView name); - void unregister_driver(NonnullLockRefPtr driver); + static void register_driver(NonnullLockRefPtr driver); + static LockRefPtr get_driver_by_name(StringView name); + static void unregister_driver(NonnullLockRefPtr driver); Vector>& available_drivers() { return m_available_drivers; }