Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 27922b4260f65d317aabda37e42bbbff > files > 1562

kernel-2.6.18-238.el5.src.rpm

From: Alan Cox <alan@redhat.com>
Subject: [RHEL 5.0 PATCH] BZ #212060 - Spurious interrups from ESB2 in native mode
Date: Mon, 4 Dec 2006 14:09:34 -0500
Bugzilla: 212060
Message-Id: <20061204190934.GA3508@devserv.devel.redhat.com>
Changelog: Spurious interrups from ESB2 in native mode


Found by Stratus. This patch uses their fix but with a quirk to apply it only
to ESB2 to reduce risk as far as possible. The quirk can be extended to
other chip variants without kABI problems if it turns out this is a more
generalised problem.

Index: latest/drivers/ide/ide-cd.c
===================================================================
--- latest.orig/drivers/ide/ide-cd.c
+++ latest/drivers/ide/ide-cd.c
@@ -687,8 +687,15 @@ static void ide_dump_status_no_sense(ide
 static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
 {
 	struct request *rq = HWGROUP(drive)->rq;
+	ide_hwif_t *hwif = HWIF(drive);
 	int stat, err, sense_key;
 	
+	/* We may have bogus stock DMA interrupts in PIO state here */
+	if (HWIF(drive)->dma_status && hwif->atapi_irq_bogon) {
+		stat = hwif->INB(hwif->dma_status);
+		/* Should we force the bit as well ? */
+		hwif->OUTB(stat, hwif->dma_status);
+	}
 	/* Check for errors. */
 	stat = HWIF(drive)->INB(IDE_STATUS_REG);
 	if (stat_ret)
Index: latest/drivers/ide/pci/piix.c
===================================================================
--- latest.orig/drivers/ide/pci/piix.c
+++ latest/drivers/ide/pci/piix.c
@@ -492,6 +492,10 @@ static void __devinit init_hwif_piix(ide
 		/* This is a painful system best to let it self tune for now */
 		return;
 	}
+	/* ESB2 appears to generate spurious DMA interrupts in PIO mode
+	   when in native mode */
+	if (hwif->pci_dev->device == PCI_DEVICE_ID_INTEL_ESB2_18)
+		hwif->atapi_irq_bogon = 1;
 
 	hwif->autodma = 0;
 	hwif->tuneproc = &piix_tune_drive;
Index: latest/include/linux/ide.h
===================================================================
--- latest.orig/include/linux/ide.h
+++ latest/include/linux/ide.h
@@ -794,6 +794,7 @@ typedef struct hwif_s {
 	unsigned	sg_mapped  : 1;	/* sg_table and sg_nents are ready */
 	unsigned	no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */
 	unsigned	err_stops_fifo : 1; /* 1=data FIFO is cleared by an error */
+	unsigned	atapi_irq_bogon : 1; /* Generates spurious DMA interrupts in PIO mode */
 
 	struct device	gendev;
 	struct completion gendev_rel_comp; /* To deal with device release() */