Interestingly, sata_sil raises spurious interrupts if it's coupled
with Sil SATA_PATA bridge. Currently, sata_sil interrupt handler is
strict about spurious interrupts and freezes the port when it occurs.
This patch makes it more forgiving.
* On SATA PHY event interrupt, serror value is checked to see whether
it really is PHYRDY CHG event. If not, SATA PHY event interrupt is
ignored.
* If ATA interrupt occurs while no command is in progress, it's
cleared and ignored.
This fixes bugzilla bug 9505.
http://bugzilla.kernel.org/show_bug.cgi?id=9505
Signed-off-by: Tejun Heo [EMAIL PROTECTED]
---
drivers/ata/sata_sil.c | 29 +
1 file changed, 17 insertions(+), 12 deletions(-)
Index: work/drivers/ata/sata_sil.c
===
--- work.orig/drivers/ata/sata_sil.c
+++ work/drivers/ata/sata_sil.c
@@ -390,23 +390,28 @@ static void sil_host_intr(struct ata_por
sil_scr_read(ap, SCR_ERROR, serror);
sil_scr_write(ap, SCR_ERROR, serror);
- /* Trigger hotplug and accumulate SError only if the
-* port isn't already frozen. Otherwise, PHY events
-* during hardreset makes controllers with broken SIEN
-* repeat probing needlessly.
+ /* Sometimes spurious interrupts occur, double check
+* it's PHYRDY CHG.
*/
- if (!(ap-pflags ATA_PFLAG_FROZEN)) {
- ata_ehi_hotplugged(ap-link.eh_info);
- ap-link.eh_info.serror |= serror;
+ if (serror SERR_PHYRDY_CHG) {
+ /* Trigger hotplug and accumulate SError only
+* if the port isn't already frozen.
+* Otherwise, PHY events during hardreset
+* makes controllers with broken SIEN repeat
+* probing needlessly.
+*/
+ if (!(ap-pflags ATA_PFLAG_FROZEN)) {
+ ata_ehi_hotplugged(ap-link.eh_info);
+ ap-link.eh_info.serror |= serror;
+ }
+ goto freeze;
}
- goto freeze;
+ if (!(bmdma2 SIL_DMA_COMPLETE))
+ return;
}
- if (unlikely(!qc))
- goto freeze;
-
- if (unlikely(qc-tf.flags ATA_TFLAG_POLLING)) {
+ if (unlikely(!qc || (qc-tf.flags ATA_TFLAG_POLLING))) {
/* this sometimes happens, just clear IRQ */
ata_chk_status(ap);
return;
-
To unsubscribe from this list: send the line unsubscribe linux-ide in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html