diff --git a/repos/os/src/drivers/platform/legacy/x86/pci_device.cc b/repos/os/src/drivers/platform/legacy/x86/pci_device.cc index 6587f6ee24..ea4acb6a6a 100644 --- a/repos/os/src/drivers/platform/legacy/x86/pci_device.cc +++ b/repos/os/src/drivers/platform/legacy/x86/pci_device.cc @@ -138,7 +138,8 @@ void Platform::Device_component::config_write(unsigned char address, } /* assign device to device_pd */ - if (address == Device_config::PCI_CMD_REG && + if (!_device_assigned && + address == Device_config::PCI_CMD_REG && (value & Device_config::PCI_CMD_DMA)) { try { _session.assign_device(this); } @@ -147,6 +148,7 @@ void Platform::Device_component::config_write(unsigned char address, catch (...) { error("assignment to device failed"); } + _device_assigned = true; _device_used = true; } diff --git a/repos/os/src/drivers/platform/legacy/x86/pci_device_component.h b/repos/os/src/drivers/platform/legacy/x86/pci_device_component.h index 2be3e506f2..b8e68de77e 100644 --- a/repos/os/src/drivers/platform/legacy/x86/pci_device_component.h +++ b/repos/os/src/drivers/platform/legacy/x86/pci_device_component.h @@ -60,6 +60,7 @@ class Platform::Device_component : public Rpc_object, Irq_session_component *_irq_session = nullptr; unsigned short _irq_line; bool _device_used { false }; + bool _device_assigned { false }; Allocator &_global_heap; class Io_mem : public Io_mem_connection,