diff options
-rw-r--r-- | drivers/ide/ide-cd.c | 7 | ||||
-rw-r--r-- | drivers/ide/pci/piix.c | 4 | ||||
-rw-r--r-- | include/linux/ide.h | 1 |
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 | |||
687 | static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) | 687 | static 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() */ |