sata_rcar: fix interrupt handling
authorSergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Fri, 31 May 2013 22:38:35 +0000 (02:38 +0400)
committerTejun Heo <tj@kernel.org>
Sun, 2 Jun 2013 07:54:45 +0000 (00:54 -0700)
commit52a2a1087b5924de00484f35ef5e2a73f61dbd22
treeb1887001bdf51e25024fc288552d6bead78b6f1e
parentfcce9a35f8faaa1f52236c554ef1b15d99a7537e
sata_rcar: fix interrupt handling

The driver's interrupt handling code is too picky in deciding whether it should
handle an interrupt or not which causes completely unneeded spurious interrupts.
Thus make sata_rcar_{ata|serr}_interrupt() *void*; add ATA status register read
to sata_rcar_ata_interrupt() to clear an unexpected ATA interrupt -- it doesn't
get cleared by writing to the SATAINTSTAT register in the interrupt mode we use.

Also, in sata_rcar_ata_interrupt() we should check SATAINTSTAT register only for
enabled interrupts and we should clear  only those interrupts  that we have read
as active first time around, because else we have  a  race and risk clearing  an
interrupt that  can  occur between read  and write of the  SATAINTSTAT  register
and never registering it...

Signed-off-by: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: stable@vger.kernel.org
drivers/ata/sata_rcar.c