summaryrefslogtreecommitdiff
path: root/Kernel/Devices/Audio/AC97.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel/Devices/Audio/AC97.cpp')
-rw-r--r--Kernel/Devices/Audio/AC97.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/Kernel/Devices/Audio/AC97.cpp b/Kernel/Devices/Audio/AC97.cpp
index 7d2ced170e..70326df7e4 100644
--- a/Kernel/Devices/Audio/AC97.cpp
+++ b/Kernel/Devices/Audio/AC97.cpp
@@ -4,6 +4,7 @@
* SPDX-License-Identifier: BSD-2-Clause
*/
+#include <AK/Format.h>
#include <Kernel/Devices/Audio/AC97.h>
#include <Kernel/Devices/DeviceManagement.h>
#include <Kernel/Memory/AnonymousVMObject.h>
@@ -274,8 +275,12 @@ ErrorOr<void> AC97::write_single_buffer(UserOrKernelBuffer const& data, size_t o
void AC97::AC97Channel::handle_dma_stopped()
{
dbgln_if(AC97_DEBUG, "AC97 @ {}: channel {}: DMA engine has stopped", m_device.pci_address(), name());
- VERIFY(m_dma_running);
- m_dma_running = false;
+ m_dma_running.with([this](auto& dma_running) {
+ // NOTE: QEMU might send spurious interrupts while we're not running, so we don't want to panic here.
+ if (!dma_running)
+ dbgln("AC97 @ {}: received DMA interrupt while it wasn't running", m_device.pci_address());
+ dma_running = false;
+ });
}
void AC97::AC97Channel::reset()
@@ -288,7 +293,9 @@ void AC97::AC97Channel::reset()
while ((control_register.in<u8>() & AudioControlRegisterFlag::ResetRegisters) > 0)
IO::delay(50);
- m_dma_running = false;
+ m_dma_running.with([](auto& dma_running) {
+ dma_running = false;
+ });
}
void AC97::AC97Channel::set_last_valid_index(u32 buffer_address, u8 last_valid_index)
@@ -310,7 +317,9 @@ void AC97::AC97Channel::start_dma()
control |= AudioControlRegisterFlag::InterruptOnCompletionEnable;
control_register.out(control);
- m_dma_running = true;
+ m_dma_running.with([](auto& dma_running) {
+ dma_running = true;
+ });
}
}