diff options
-rw-r--r-- | drivers/scsi/sata_sil.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/scsi/sata_sil.c b/drivers/scsi/sata_sil.c index a7e99a1def2f..bc9f918a7f28 100644 --- a/drivers/scsi/sata_sil.c +++ b/drivers/scsi/sata_sil.c | |||
@@ -344,7 +344,25 @@ static void sil_host_intr(struct ata_port *ap, u32 bmdma2) | |||
344 | u8 status; | 344 | u8 status; |
345 | 345 | ||
346 | if (unlikely(bmdma2 & SIL_DMA_SATA_IRQ)) { | 346 | if (unlikely(bmdma2 & SIL_DMA_SATA_IRQ)) { |
347 | ata_ehi_hotplugged(&ap->eh_info); | 347 | u32 serror; |
348 | |||
349 | /* SIEN doesn't mask SATA IRQs on some 3112s. Those | ||
350 | * controllers continue to assert IRQ as long as | ||
351 | * SError bits are pending. Clear SError immediately. | ||
352 | */ | ||
353 | serror = sil_scr_read(ap, SCR_ERROR); | ||
354 | sil_scr_write(ap, SCR_ERROR, serror); | ||
355 | |||
356 | /* Trigger hotplug and accumulate SError only if the | ||
357 | * port isn't already frozen. Otherwise, PHY events | ||
358 | * during hardreset makes controllers with broken SIEN | ||
359 | * repeat probing needlessly. | ||
360 | */ | ||
361 | if (!(ap->flags & ATA_FLAG_FROZEN)) { | ||
362 | ata_ehi_hotplugged(&ap->eh_info); | ||
363 | ap->eh_info.serror |= serror; | ||
364 | } | ||
365 | |||
348 | goto freeze; | 366 | goto freeze; |
349 | } | 367 | } |
350 | 368 | ||