[PATCH] libata: make sure IRQ is cleared after ata_bmdma_freeze()
authorTejun Heo <htejun@gmail.com>
Fri, 17 Nov 2006 03:24:22 +0000 (12:24 +0900)
committerTejun Heo <htejun@gmail.com>
Sun, 3 Dec 2006 08:56:24 +0000 (17:56 +0900)
commit0f0a3ad3741fd93461fcfb85dc577103c58d9be8
tree1d91117b58b6c3878f6b346e8e8f4c7b93dbca9f
parentea54763f8a7c51b9f8fcb14431812ae63fcbaf96
[PATCH] libata: make sure IRQ is cleared after ata_bmdma_freeze()

Now that BMDMA status is recorded in irq handler.  ata_bmdma_freeze()
is free to manipulate host status.  Under certain circumstances, some
controllers (ICH7 in enhanced mode w/ IRQ shared) raise IRQ when CTL
register is written to and ATA_NIEN doesn't mask it.

This patch makes ata_bmdma_freeze() clear all pending IRQs after
freezing a port.  This change makes explicit clearing in
ata_device_add() unnecessary and thus kills it.  The removed code was
SFF-specific and was in the wrong place.

Note that ->freeze() handler is always called under ap->lock held and
irq disabled.  Even if CTL manipulation causes stuck IRQ, it's cleared
immediately.  This should be safe (enough) even in SMP environment.
More correct solution is to mask the IRQ from IRQ controller but that
would be an overkill.

Signed-off-by: Tejun Heo <htejun@gmail.com>
drivers/ata/libata-core.c
drivers/ata/libata-sff.c