aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2006-12-10 05:20:39 -0500
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-10 12:57:20 -0500
commitee2f344b33b507af23610c8fdfdde38d7c10fb33 (patch)
tree7908a16d267168a74178aad61e30a82590ca6aac
parent33859f7f9788da2ac9aa23be4dc8e948112809ca (diff)
[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>
-rw-r--r--drivers/ide/ide-cd.c7
-rw-r--r--drivers/ide/pci/piix.c4
-rw-r--r--include/linux/ide.h1
3 files changed, 12 insertions, 0 deletions
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 88214943d00a..5969cec58dc1 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -687,8 +687,15 @@ static void ide_dump_status_no_sense(ide_drive_t *drive, const char *msg, u8 sta
687static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) 687static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret)
688{ 688{
689 struct request *rq = HWGROUP(drive)->rq; 689 struct request *rq = HWGROUP(drive)->rq;
690 ide_hwif_t *hwif = HWIF(drive);
690 int stat, err, sense_key; 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 /* Check for errors. */ 699 /* Check for errors. */
693 stat = HWIF(drive)->INB(IDE_STATUS_REG); 700 stat = HWIF(drive)->INB(IDE_STATUS_REG);
694 if (stat_ret) 701 if (stat_ret)
diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c
index cdc3aab9ebcb..b1e9a8eba6b6 100644
--- a/drivers/ide/pci/piix.c
+++ b/drivers/ide/pci/piix.c
@@ -505,6 +505,10 @@ static void __devinit init_hwif_piix(ide_hwif_t *hwif)
505 /* This is a painful system best to let it self tune for now */ 505 /* This is a painful system best to let it self tune for now */
506 return; 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 hwif->autodma = 0; 513 hwif->autodma = 0;
510 hwif->tuneproc = &piix_tune_drive; 514 hwif->tuneproc = &piix_tune_drive;
diff --git a/include/linux/ide.h b/include/linux/ide.h
index 9c2050293f17..64e070f62a87 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -796,6 +796,7 @@ typedef struct hwif_s {
796 unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */ 796 unsigned sg_mapped : 1; /* sg_table and sg_nents are ready */
797 unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */ 797 unsigned no_io_32bit : 1; /* 1 = can not do 32-bit IO ops */
798 unsigned err_stops_fifo : 1; /* 1=data FIFO is cleared by an error */ 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 struct device gendev; 801 struct device gendev;
801 struct completion gendev_rel_comp; /* To deal with device release() */ 802 struct completion gendev_rel_comp; /* To deal with device release() */