1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-08 22:57:36 +00:00

Kernel: Clear pending interrupts before enabling IRQs of IDE Channel

Calling detect_disks() can generate interrupts, so we must clear it to
allow proper function when booting with kernel argument smp=on.
This commit is contained in:
Liav A 2021-02-05 06:51:47 +02:00 committed by Andreas Kling
parent f2faf11d61
commit 865aade42b
2 changed files with 10 additions and 0 deletions

View file

@ -142,9 +142,17 @@ IDEChannel::IDEChannel(const IDEController& controller, IOAddressGroup io_group,
initialize(force_pio); initialize(force_pio);
detect_disks(); detect_disks();
// Note: calling to detect_disks could generate an interrupt, clear it if that's the case
clear_pending_interrupts();
enable_irq(); enable_irq();
} }
void IDEChannel::clear_pending_interrupts() const
{
m_io_group.io_base().offset(ATA_REG_STATUS).in<u8>();
}
IDEChannel::~IDEChannel() IDEChannel::~IDEChannel()
{ {
} }

View file

@ -138,6 +138,8 @@ private:
void start_request(AsyncBlockDeviceRequest&, bool, bool, u16); void start_request(AsyncBlockDeviceRequest&, bool, bool, u16);
void complete_current_request(AsyncDeviceRequest::RequestResult); void complete_current_request(AsyncDeviceRequest::RequestResult);
void clear_pending_interrupts() const;
void ata_access(Direction, bool, u32, u8, u16, bool); void ata_access(Direction, bool, u32, u8, u16, bool);
void ata_read_sectors_with_dma(bool, u16); void ata_read_sectors_with_dma(bool, u16);
void ata_read_sectors(bool, u16); void ata_read_sectors(bool, u16);