Sergei Shtylyov wrote:
David Daney wrote:
[...]
What stops the following occuring
ATA irq
BUSY still set
Queue tasklet
Other irq on same line
ATA busy clear
Handle command
Is CF interrupt indeed shared with anything?
Tasklet runs but command was sorted out
(or a reset of the ata controller in the gap)
Probably nothing. I will try to sort it out.
It's the need for the tasklet that seems doubtful to me...
The interrupt occurs *before* the device de-asserts BUSY. A small pause
is needed to allow the device to clear BUSY and allow libata to function
normally.
Calling ata_sff_host_intr() while BUSY is asserted causes the driver to
fail, as it is expecting to be called from a true IDE interrupt routine.
Delaying calling ata_sff_host_intr() until BUSY is clear (using the
tasklet) seemed to be the cleanest way to write the driver given that we
are using an interrupt generated by DMA complete.
David Daney.