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
Merge commit 'origin/master' into next
2009-12-09 17:14:38 +11:00
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_bf54x: handle portmuxing of pins through GPIO PORTs
2009-12-21 13:55:38 -05:00
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_cs5520: remove dead VDMA support
2009-12-03 15:52:51 -05:00
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_legacy: add pointers to QDI65x0 documentation
2009-12-03 16:06:47 -05:00
pata_macio.c
libata/drivers: Add driver for Apple "MacIO" IDE controller
2009-12-09 17:09:28 +11:00
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_octeon_cf: use resource_size(), to fix resource sizing bug
2009-12-17 01:02:50 -05:00
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
[libata] MWDMA0 is unsupported on PIIX-like PATA controllers
2009-12-03 17:52:16 -05:00
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
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial
2009-12-09 19:43:33 -08:00
sata_inic162x.c
sata_mv.c
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jgarzik/libata-dev
2009-12-19 11:04:29 -08:00
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_sil.c
sata_sil24.c
sata_sil24: MSI support, disabled by default
2009-12-03 02:46:34 -05:00
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