mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 09:27:34 +00:00
Kernel/AHCI: Dont assume ports start at 0
This fixes a bug that occurs when the controller's ports are not (internally) numbered sequentially. This is done by checking the bits set in PI. This bug was found on bare-metal, on a laptop with 1 Port that was reported as port 4.
This commit is contained in:
parent
e9b7d58d10
commit
2b4cab284c
1 changed files with 8 additions and 2 deletions
|
@ -181,12 +181,18 @@ RefPtr<StorageDevice> AHCIController::device_by_port(u32 port_index) const
|
||||||
RefPtr<StorageDevice> AHCIController::device(u32 index) const
|
RefPtr<StorageDevice> AHCIController::device(u32 index) const
|
||||||
{
|
{
|
||||||
NonnullRefPtrVector<StorageDevice> connected_devices;
|
NonnullRefPtrVector<StorageDevice> connected_devices;
|
||||||
for (size_t index = 0; index < capabilities().ports_count; index++) {
|
u32 pi = hba().control_regs.pi;
|
||||||
auto checked_device = device_by_port(index);
|
u32 bit = __builtin_ffsl(pi);
|
||||||
|
while (bit) {
|
||||||
|
dbgln_if(AHCI_DEBUG, "Checking implemented port {}, pi {:b}", bit - 1, pi);
|
||||||
|
pi &= ~(1u << (bit - 1));
|
||||||
|
auto checked_device = device_by_port(bit - 1);
|
||||||
|
bit = __builtin_ffsl(pi);
|
||||||
if (checked_device.is_null())
|
if (checked_device.is_null())
|
||||||
continue;
|
continue;
|
||||||
connected_devices.append(checked_device.release_nonnull());
|
connected_devices.append(checked_device.release_nonnull());
|
||||||
}
|
}
|
||||||
|
dbgln_if(AHCI_DEBUG, "Connected device count: {}, Index: {}", connected_devices.size(), index);
|
||||||
if (index >= connected_devices.size())
|
if (index >= connected_devices.size())
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return connected_devices[index];
|
return connected_devices[index];
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue