Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 5 Dec 2009 13:40:51 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r200121 - head/sys/dev/ata
Message-ID:  <200912051340.nB5DepkE089078@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Sat Dec  5 13:40:51 2009
New Revision: 200121
URL: http://svn.freebsd.org/changeset/base/200121

Log:
  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 should fix interrupt storms and command timeouts in many cases.
  
  PR:		kern/103602, sparc64/121539, kern/133122, kern/139654

Modified:
  head/sys/dev/ata/ata-pci.c

Modified: head/sys/dev/ata/ata-pci.c
==============================================================================
--- head/sys/dev/ata/ata-pci.c	Sat Dec  5 13:12:04 2009	(r200120)
+++ head/sys/dev/ata/ata-pci.c	Sat Dec  5 13:40:51 2009	(r200121)
@@ -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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200912051340.nB5DepkE089078>