mirror of
https://github.com/genodelabs/genode.git
synced 2025-04-10 21:01:49 +00:00
nvme_drv: do not mask interrupts
During interrupt handling the driver masked and cleared interrupts as recommended in the spec to prevent spurious or unnecessary interrupts from occurring. Due to the way the current implementation operates new Block requests got submitted while handling completions for already finished ones. Since interrupts where masked at this point the controller did not generate interrupts when the newly submitted requests got completed. As the mask/clear optimization is apparently not strictly needed and according to the spec undefined when using MSI-X it is removed. Fixes #4684
This commit is contained in:
parent
c58d799f16
commit
4bacba431b
@ -1082,11 +1082,12 @@ class Nvme::Controller : Platform::Device,
|
||||
/**
|
||||
* Clean interrupts
|
||||
*/
|
||||
void clear_intr()
|
||||
{
|
||||
write<Intmc>(1);
|
||||
ack();
|
||||
}
|
||||
void clear_intr() { write<Intmc>(1); }
|
||||
|
||||
/**
|
||||
* Acknowledge interrupt
|
||||
*/
|
||||
void ack_irq() { Platform::Device::Irq::ack(); }
|
||||
|
||||
/*
|
||||
* Identify NVM system
|
||||
@ -1798,14 +1799,9 @@ class Nvme::Driver : Genode::Noncopyable
|
||||
_submits_pending = true;
|
||||
}
|
||||
|
||||
void mask_irq()
|
||||
{
|
||||
_nvme_ctrlr.mask_intr();
|
||||
}
|
||||
|
||||
void ack_irq()
|
||||
{
|
||||
_nvme_ctrlr.clear_intr();
|
||||
_nvme_ctrlr.ack_irq();
|
||||
}
|
||||
|
||||
bool execute()
|
||||
@ -1869,7 +1865,6 @@ struct Nvme::Main : Rpc_object<Typed_root<Block::Session>>
|
||||
|
||||
void _handle_irq()
|
||||
{
|
||||
_driver.mask_irq();
|
||||
_handle_requests();
|
||||
_driver.ack_irq();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user