Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] ide-cd: Handle strange interrupt on the Intel ESB2

The ESB2 appears to emit spurious DMA interrupts when configured for native
mode and handling ATAPI devices. Stratus were able to pin this bug down and
produce a patch. This is a rework which applies the fixup only to the ESB2
(for now). We can apply it to other chips later if the same problem is found.

This code has been tested and confirmed to fix the problem on the tested
systems.

Signed-off-by: Alan Cox <alan@redhat.com>
(Most of the hard work done by Stratus however)
Cc: Jens Axboe <axboe@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Alan Cox and committed by
Linus Torvalds
ee2f344b 33859f7f

+12
+7
drivers/ide/ide-cd.c
··· 687 687 static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) 688 688 { 689 689 struct request *rq = HWGROUP(drive)->rq; 690 + ide_hwif_t *hwif = HWIF(drive); 690 691 int stat, err, sense_key; 691 692 693 + /* We may have bogus DMA interrupts in PIO state here */ 694 + if (HWIF(drive)->dma_status && hwif->atapi_irq_bogon) { 695 + stat = hwif->INB(hwif->dma_status); 696 + /* Should we force the bit as well ? */ 697 + hwif->OUTB(stat, hwif->dma_status); 698 + } 692 699 /* Check for errors. */ 693 700 stat = HWIF(drive)->INB(IDE_STATUS_REG); 694 701 if (stat_ret)
+4
drivers/ide/pci/piix.c
··· 505 505 /* This is a painful system best to let it self tune for now */ 506 506 return; 507 507 } 508 + /* ESB2 appears to generate spurious DMA interrupts in PIO mode 509 + when in native mode */ 510 + if (hwif->pci_dev->device == PCI_DEVICE_ID_INTEL_ESB2_18) 511 + hwif->atapi_irq_bogon = 1; 508 512 509 513 hwif->autodma = 0; 510 514 hwif->tuneproc = &piix_tune_drive;
+1
include/linux/ide.h
··· 796 796 unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */ 797 797 unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */ 798 798 unsigned err_stops_fifo : 1; /* 1=data FIFO is cleared by an error */ 799 + unsigned atapi_irq_bogon : 1; /* Generates spurious DMA interrupts in PIO mode */ 799 800 800 801 struct device gendev; 801 802 struct completion gendev_rel_comp; /* To deal with device release() */