On Thu, 24 Mar 2011, Thomas Gleixner wrote:
> > The ack used to be made in clear_ioasic_irq(), that was called from
> > end_ioasic_dma_irq(), that was used as the .end handler. This semantics
> > has to be preserved or hardware won't work anymore as expected. This is a
> > regression.
> Then that code was broken before. Since MIPS was converted to the flow
> handlers nothing ever called .end(). I seem to miss something.
Hmm, me too then. Whoever did the conversion failed to adjust this piece
or at least notify responsible people that such a change is needed -- if
.end was going away, then all users should have been checked and the
respective maintainers queried. And given these DMA interrupts are really
only in regular use by Linux with the onboard SCSI driver, chances are the
breakage could be left unnoticed for a long time (I tend to run these
systems NFS-rooted for once).
Note these effectively are edge-triggered interrupts and may only be
acked in hardware once all higher-level processing has been done as
otherwise a DMA transfer will resume prematurely and all the hell will
break loose. I don't particularly like this double purpose these bits
have, but there you go -- I can understand the hw engineers saw no reason
to waste silicon for separate interrupt-ack and DMA-inhibit bits.
I'll see what I can do about it, but I need a pointer to the offending
change -- Ralf or anyone, can you provide me with one?