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() */