svn commit: r200297 - stable/8/sys/dev/ata

Alexander Motin mav at FreeBSD.org
Wed Dec 9 09:20:10 PST 2009


Author: mav
Date: Wed Dec  9 17:20:10 2009
New Revision: 200297
URL: http://svn.freebsd.org/changeset/base/200297

Log:
  MFC r200121:
  Do not ignore device interrupt if bus mastering is still active. It is
  normal in case of media read error and some ATAPI cases, when transfer size
  is unknown beforehand. PCI ATA BM specification tells that in case of such
  underrun driver should just manually stop DMA engine. DMA engine should
  same time guarantie that all bus mastering transfers completed at the moment
  of driver reads interrupt flag asserted.
  This change fixes interrupt storms and command timeouts in many cases.
  
  PR:             kern/103602, sparc64/121539, kern/133122, kern/139654

Modified:
  stable/8/sys/dev/ata/ata-pci.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/ata/ata-pci.c
==============================================================================
--- stable/8/sys/dev/ata/ata-pci.c	Wed Dec  9 17:11:09 2009	(r200296)
+++ stable/8/sys/dev/ata/ata-pci.c	Wed Dec  9 17:20:10 2009	(r200297)
@@ -462,8 +462,7 @@ ata_pci_status(device_t dev)
 	 (ch->dma.flags & ATA_DMA_ACTIVE))) {
 	int bmstat = ATA_IDX_INB(ch, ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK;
 
-	if ((bmstat & (ATA_BMSTAT_ACTIVE | ATA_BMSTAT_INTERRUPT)) !=
-	    ATA_BMSTAT_INTERRUPT)
+	if ((bmstat & ATA_BMSTAT_INTERRUPT) == 0)
 	    return 0;
 	ATA_IDX_OUTB(ch, ATA_BMSTAT_PORT, bmstat & ~ATA_BMSTAT_ERROR);
 	DELAY(1);


More information about the svn-src-stable mailing list