Forráskód Böngészése

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.
Liav A 4 éve
szülő
commit
865aade42b
2 módosított fájl, 10 hozzáadás és 0 törlés
  1. 8 0
      Kernel/Storage/IDEChannel.cpp
  2. 2 0
      Kernel/Storage/IDEChannel.h

+ 8 - 0
Kernel/Storage/IDEChannel.cpp

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

+ 2 - 0
Kernel/Storage/IDEChannel.h

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