linux/drivers/ata
Tejun Heo 332ac7ff77 libata-sff: fix spurious IRQ handling
Commit 27943620cb introduced spurious
IRQ handling but it has a race condition where valid completion can be
lost while trying to clear spurious IRQ leading to occassional command
timeouts.

This patch improves SFF interrupt handler such that

1. Once BMDMA HSM is stopped, the condition is never considered
   spurious.  As there's no way to resume stopped BMDMA HSM, if device
   status doesn't agree with BMDMA status, the only way out is
   aborting the command (otherwise, it will just end up timing out).

2. ap->ops->sff_check_status() can be safely called to clear spurious
   device IRQ as it atomically returns completion status but BMDMA IRQ
   status can't be cleared in safe way if command is in flight.  After
   a spurious IRQ, call ap->ops->sff_irq_clear() only if the
   respective device is idle and retry completion if
   sff_check_status() indicates command completion.

Please note that ata_piix uses bmdma_status for sff_irq_check() and #2
won't weaken spurious IRQ handling even with in-flight command because
if bmdma_status indicates IRQ pending but device status is not on
spurious check, the next IRQ handler invocation will abort the command
due to #1.

This fixes bko#15537.

   https://bugzilla.kernel.org/show_bug.cgi?id=15537

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: Andrew Benton <b3nton@gmail.com>
Cc: Petr Uzel <petr.uzel@centrum.cz>
Cc: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
2010-03-23 09:39:08 -04:00
..
ahci.c ahci: pp->active_link is not reliable when FBS is enabled 2010-03-17 15:54:55 -04:00
ata_generic.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
ata_piix.c libata: implement spurious irq handling for SFF and apply it to piix 2010-03-01 14:58:44 -05:00
Kconfig libata: Allow pata_legacy to be built on non-ISA but PCI systems 2010-03-01 14:58:46 -05:00
libata-acpi.c ACPI: replace acpi_integer by u64 2010-01-28 01:47:33 -05:00
libata-core.c Merge branch 'for-next' into for-linus 2010-03-08 16:55:37 +01:00
libata-eh.c libata: retry FS IOs even if it has failed with AC_ERR_INVALID 2010-01-20 14:25:11 -05:00
libata-pmp.c
libata-scsi.c block: Rename blk_queue_max_sectors to blk_queue_max_hw_sectors 2010-02-26 13:58:08 +01:00
libata-sff.c libata-sff: fix spurious IRQ handling 2010-03-23 09:39:08 -04:00
libata.h
Makefile
pata_acpi.c Merge branch 'for-next' into for-linus 2010-03-08 16:55:37 +01:00
pata_ali.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_amd.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_artop.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_at32.c
pata_at91.c [libata] pata_at91: fix backslash-continued string 2010-03-01 14:58:46 -05:00
pata_atiixp.c pata_atiixp: enable parallel scan 2010-03-01 15:07:01 -05:00
pata_atp867x.c
pata_bf54x.c
pata_cmd64x.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_cmd640.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_cs5520.c
pata_cs5530.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_cs5535.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_cs5536.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_cypress.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_efar.c pata_efar: Enable parallel scanning 2010-03-01 15:07:21 -05:00
pata_hpt3x2n.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_hpt3x3.c tree-wide: Assorted spelling fixes 2010-02-09 11:13:56 +01:00
pata_hpt37x.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_hpt366.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_icside.c
pata_isapnp.c
pata_it821x.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_it8213.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_ixp4xx_cf.c
pata_jmicron.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_legacy.c
pata_macio.c
pata_marvell.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_mpc52xx.c
pata_mpiix.c
pata_netcell.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_ninja32.c
pata_ns87410.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_ns87415.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_octeon_cf.c
pata_of_platform.c
pata_oldpiix.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_opti.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_optidma.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_palmld.c
pata_pcmcia.c Merge branch 'for-next' into for-linus 2010-03-08 16:55:37 +01:00
pata_pdc202xx_old.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_pdc2027x.c
pata_piccolo.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_platform.c
pata_qdi.c
pata_radisys.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_rb532_cf.c
pata_rdc.c
pata_rz1000.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_sc1200.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_scc.c
pata_sch.c
pata_serverworks.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_sil680.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_sis.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_sl82c105.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_triflex.c libata: Pass host flags into the pci helper 2010-03-01 14:58:46 -05:00
pata_via.c pata_via: Add VIA VX900 support 2010-03-22 22:44:17 -04:00
pata_winbond.c
pdc_adma.c
sata_fsl.c
sata_inic162x.c
sata_mv.c
sata_nv.c block: Consolidate phys_segment and hw_segment limits 2010-02-26 13:58:08 +01:00
sata_promise.c sata_promise: don't classify overruns as HSM errors 2010-01-12 14:33:07 -05:00
sata_promise.h
sata_qstor.c
sata_sil24.c
sata_sil.c
sata_sis.c
sata_svw.c
sata_sx4.c
sata_uli.c
sata_via.c sata_via: Delay on vt6420 when starting ATAPI DMA write 2010-03-01 15:19:21 -05:00
sata_vsc.c
sis.h