linux/drivers/ata
Tejun Heo 0f0a3ad374 [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>
2006-12-03 17:56:24 +09:00
..
ahci.c [PATCH] ahci: honor PORTS_IMPL on ICH8s 2006-12-01 22:44:53 -05:00
ata_generic.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
ata_piix.c [PATCH] ata_piix: strip now unneded MAP related stuff 2006-12-01 22:45:55 -05:00
Kconfig [libata] ARM: add ixp4xx PATA driver 2006-12-01 22:42:51 -05:00
libata-core.c [PATCH] libata: make sure IRQ is cleared after ata_bmdma_freeze() 2006-12-03 17:56:24 +09:00
libata-eh.c [PATCH] libata: don't request sense if the port is frozen 2006-12-03 17:56:23 +09:00
libata-scsi.c [PATCH] libata: make sure sdev doesn't go away while rescanning 2006-12-03 17:56:24 +09:00
libata-sff.c [PATCH] libata: make sure IRQ is cleared after ata_bmdma_freeze() 2006-12-03 17:56:24 +09:00
libata.h [PATCH] libata: implement ata_tf_read_block() 2006-12-01 22:46:00 -05:00
Makefile [libata] ARM: add ixp4xx PATA driver 2006-12-01 22:42:51 -05:00
pata_ali.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_amd.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_artop.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_atiixp.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_cmd64x.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_cs5520.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_cs5530.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_cs5535.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_cypress.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_efar.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_hpt3x2n.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_hpt3x3.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_hpt37x.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_hpt366.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_isapnp.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_it821x.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_ixp4xx_cf.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_jmicron.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_legacy.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_marvell.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_mpiix.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_netcell.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_ns87410.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_oldpiix.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_opti.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_optidma.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_pcmcia.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_pdc202xx_old.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_pdc2027x.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_platform.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_qdi.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_radisys.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_rz1000.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_sc1200.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_serverworks.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_sil680.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_sis.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_sl82c105.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_triflex.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pata_via.c [PATCH] libata: implement ATA_FLAG_SETXFER_POLLING and use it in pata_via, take #2 2006-12-03 17:56:23 +09:00
pata_winbond.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
pdc_adma.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
sata_mv.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
sata_nv.c [PATCH] libata: kill unnecessary sht->max_sectors initializations 2006-12-03 17:56:22 +09:00
sata_promise.c [PATCH] sata_promise fixes and updates 2006-12-01 22:46:41 -05:00
sata_promise.h Move libata to drivers/ata. 2006-08-10 07:31:37 -04:00
sata_qstor.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
sata_sil24.c [PATCH] sata_sil24: add PMP related constants 2006-12-01 22:40:29 -05:00
sata_sil.c [PATCH] libata: move BMDMA host status recording from EH to interrupt handler 2006-12-03 17:56:24 +09:00
sata_sis.c [PATCH] sata_sis: slave support on SiS965 2006-12-01 22:42:51 -05:00
sata_svw.c [PATCH] misc sata __iomem annotations 2006-10-10 15:37:21 -07:00
sata_sx4.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
sata_uli.c [libata] PCI ID table cleanup in various drivers 2006-09-28 20:21:59 -04:00
sata_via.c [libata] sata_via: fix obvious typo 2006-11-08 07:46:02 -05:00
sata_vsc.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00