Skip to content

Commit cdab213

Browse files
supercomputer7awesomekling
authored andcommitted
Kernel/SysFS: Adapt USB plug code to work with SysFS patterns
1 parent 70afa0b commit cdab213

File tree

6 files changed

+36
-47
lines changed

6 files changed

+36
-47
lines changed

Kernel/Bus/USB/USBDevice.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include <Kernel/Bus/USB/USBDescriptors.h>
1212
#include <Kernel/Bus/USB/USBDevice.h>
1313
#include <Kernel/Bus/USB/USBRequest.h>
14+
#include <Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h>
1415
#include <Kernel/StdLib.h>
1516

1617
namespace Kernel::USB {

Kernel/Bus/USB/USBDevice.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
#include <Kernel/Bus/USB/USBConfiguration.h>
1313
#include <Kernel/Bus/USB/USBPipe.h>
1414

15+
namespace Kernel {
16+
class SysFSUSBDeviceInformation;
17+
}
18+
1519
namespace Kernel::USB {
1620

1721
class USBController;
@@ -22,6 +26,7 @@ class USBConfiguration;
2226
// glues together:
2327
//
2428
// https://www.ftdichip.com/Support/Documents/TechnicalNotes/TN_113_Simplified%20Description%20of%20USB%20Device%20Enumeration.pdf
29+
class Hub;
2530
class Device : public RefCounted<Device> {
2631
public:
2732
enum class DeviceSpeed : u8 {
@@ -51,6 +56,8 @@ class Device : public RefCounted<Device> {
5156

5257
Vector<USBConfiguration> const& configurations() const { return m_configurations; }
5358

59+
SysFSUSBDeviceInformation& sysfs_device_info_node(Badge<USB::Hub>) { return *m_sysfs_device_info_node; }
60+
5461
protected:
5562
Device(NonnullRefPtr<USBController> controller, u8 address, u8 port, DeviceSpeed speed, NonnullOwnPtr<Pipe> default_pipe);
5663

@@ -70,6 +77,9 @@ class Device : public RefCounted<Device> {
7077
private:
7178
IntrusiveListNode<Device, NonnullRefPtr<Device>> m_hub_child_node;
7279

80+
protected:
81+
RefPtr<SysFSUSBDeviceInformation> m_sysfs_device_info_node;
82+
7383
public:
7484
using List = IntrusiveList<&Device::m_hub_child_node>;
7585
};

Kernel/Bus/USB/USBHub.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ ErrorOr<void> Hub::enumerate_and_power_on_hub()
4545
// USBDevice::enumerate_device must be called before this.
4646
VERIFY(m_address > 0);
4747

48+
m_sysfs_device_info_node = TRY(SysFSUSBDeviceInformation::create(*this));
49+
4850
if (m_device_descriptor.device_class != USB_CLASS_HUB) {
4951
dbgln("USB Hub: Trying to enumerate and power on a device that says it isn't a hub.");
5052
return EINVAL;
@@ -131,7 +133,7 @@ ErrorOr<void> Hub::set_port_feature(u8 port, HubFeatureSelector feature_selector
131133
void Hub::remove_children_from_sysfs()
132134
{
133135
for (auto& child : m_children)
134-
SysFSUSBBusDirectory::the().unplug(child);
136+
SysFSUSBBusDirectory::the().unplug({}, child.sysfs_device_info_node({}));
135137
}
136138

137139
void Hub::check_for_port_updates()
@@ -257,10 +259,10 @@ void Hub::check_for_port_updates()
257259

258260
auto hub = hub_or_error.release_value();
259261
m_children.append(hub);
260-
SysFSUSBBusDirectory::the().plug(hub);
262+
SysFSUSBBusDirectory::the().plug({}, hub->sysfs_device_info_node({}));
261263
} else {
262264
m_children.append(device);
263-
SysFSUSBBusDirectory::the().plug(device);
265+
SysFSUSBBusDirectory::the().plug({}, device->sysfs_device_info_node({}));
264266
}
265267

266268
} else {
@@ -275,13 +277,12 @@ void Hub::check_for_port_updates()
275277
}
276278

277279
if (device_to_remove) {
278-
m_children.remove(*device_to_remove);
279-
SysFSUSBBusDirectory::the().unplug(*device_to_remove);
280-
280+
SysFSUSBBusDirectory::the().unplug({}, device_to_remove->sysfs_device_info_node({}));
281281
if (device_to_remove->device_descriptor().device_class == USB_CLASS_HUB) {
282282
auto* hub_child = static_cast<Hub*>(device_to_remove.ptr());
283283
hub_child->remove_children_from_sysfs();
284284
}
285+
m_children.remove(*device_to_remove);
285286
} else {
286287
dbgln_if(USB_DEBUG, "USB Hub: No child set up on port {}, ignoring detachment.", port_number);
287288
}

Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.cpp

Lines changed: 14 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -10,44 +10,27 @@
1010

1111
namespace Kernel {
1212

13-
static SysFSUSBBusDirectory* s_procfs_usb_bus_directory;
13+
static SysFSUSBBusDirectory* s_sysfs_usb_bus_directory;
1414

15-
RefPtr<SysFSUSBDeviceInformation> SysFSUSBBusDirectory::device_node_for(USB::Device& device)
15+
void SysFSUSBBusDirectory::plug(Badge<USB::Hub>, SysFSUSBDeviceInformation& new_device_info_node)
1616
{
17-
RefPtr<USB::Device> checked_device = device;
18-
for (auto& device_node : m_device_nodes) {
19-
if (device_node.device().ptr() == checked_device.ptr())
20-
return device_node;
21-
}
22-
return {};
17+
MUST(m_child_components.with([&](auto& list) -> ErrorOr<void> {
18+
list.append(new_device_info_node);
19+
return {};
20+
}));
2321
}
24-
25-
void SysFSUSBBusDirectory::plug(USB::Device& new_device)
26-
{
27-
SpinlockLocker lock(m_lock);
28-
auto device_node = device_node_for(new_device);
29-
VERIFY(!device_node);
30-
auto sysfs_usb_device_or_error = SysFSUSBDeviceInformation::create(new_device);
31-
if (sysfs_usb_device_or_error.is_error()) {
32-
dbgln("Failed to create SysFSUSBDevice for device id {}", new_device.address());
33-
return;
34-
}
35-
36-
m_device_nodes.append(sysfs_usb_device_or_error.release_value());
37-
}
38-
39-
void SysFSUSBBusDirectory::unplug(USB::Device& deleted_device)
22+
void SysFSUSBBusDirectory::unplug(Badge<USB::Hub>, SysFSUSBDeviceInformation& removed_device_info_node)
4023
{
41-
SpinlockLocker lock(m_lock);
42-
auto device_node = device_node_for(deleted_device);
43-
VERIFY(device_node);
44-
device_node->m_list_node.remove();
24+
MUST(m_child_components.with([&](auto& list) -> ErrorOr<void> {
25+
list.remove(removed_device_info_node);
26+
return {};
27+
}));
4528
}
4629

4730
SysFSUSBBusDirectory& SysFSUSBBusDirectory::the()
4831
{
49-
VERIFY(s_procfs_usb_bus_directory);
50-
return *s_procfs_usb_bus_directory;
32+
VERIFY(s_sysfs_usb_bus_directory);
33+
return *s_sysfs_usb_bus_directory;
5134
}
5235

5336
UNMAP_AFTER_INIT SysFSUSBBusDirectory::SysFSUSBBusDirectory(SysFSBusDirectory& buses_directory)
@@ -59,7 +42,7 @@ UNMAP_AFTER_INIT void SysFSUSBBusDirectory::initialize()
5942
{
6043
auto directory = adopt_ref(*new SysFSUSBBusDirectory(SysFSComponentRegistry::the().buses_directory()));
6144
SysFSComponentRegistry::the().register_new_bus_directory(directory);
62-
s_procfs_usb_bus_directory = directory;
45+
s_sysfs_usb_bus_directory = directory;
6346
}
6447

6548
ErrorOr<NonnullRefPtr<SysFSUSBDeviceInformation>> SysFSUSBDeviceInformation::create(USB::Device& device)

Kernel/FileSystem/SysFS/Subsystems/Bus/USB/BusDirectory.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66

77
#pragma once
88

9+
#include <AK/Badge.h>
910
#include <Kernel/Bus/USB/USBDevice.h>
11+
#include <Kernel/Bus/USB/USBHub.h>
1012
#include <Kernel/FileSystem/SysFS/Component.h>
1113
#include <Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h>
1214
#include <Kernel/Locking/Spinlock.h>
@@ -20,15 +22,11 @@ class SysFSUSBBusDirectory final : public SysFSDirectory {
2022

2123
virtual StringView name() const override { return "usb"sv; }
2224

23-
void plug(USB::Device&);
24-
void unplug(USB::Device&);
25+
void plug(Badge<USB::Hub>, SysFSUSBDeviceInformation&);
26+
void unplug(Badge<USB::Hub>, SysFSUSBDeviceInformation&);
2527

2628
private:
2729
explicit SysFSUSBBusDirectory(SysFSBusDirectory&);
28-
29-
RefPtr<SysFSUSBDeviceInformation> device_node_for(USB::Device& device);
30-
31-
IntrusiveList<&SysFSUSBDeviceInformation::m_list_node> m_device_nodes;
3230
mutable Spinlock m_lock;
3331
};
3432

Kernel/FileSystem/SysFS/Subsystems/Bus/USB/DeviceInformation.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,11 @@ class SysFSUSBDeviceInformation : public SysFSComponent {
2323
static ErrorOr<NonnullRefPtr<SysFSUSBDeviceInformation>> create(USB::Device&);
2424
virtual StringView name() const override { return m_device_name->view(); }
2525

26-
RefPtr<USB::Device> device() const { return m_device; }
27-
2826
protected:
2927
SysFSUSBDeviceInformation(NonnullOwnPtr<KString> device_name, USB::Device& device);
3028

3129
virtual ErrorOr<size_t> read_bytes(off_t offset, size_t count, UserOrKernelBuffer& buffer, OpenFileDescription*) const override;
3230

33-
IntrusiveListNode<SysFSUSBDeviceInformation, RefPtr<SysFSUSBDeviceInformation>> m_list_node;
34-
3531
NonnullRefPtr<USB::Device> m_device;
3632

3733
private:

0 commit comments

Comments
 (0)