diff options
author | Albert Lee <albertcc@tw.ibm.com> | 2007-02-16 20:40:21 -0500 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-02-16 20:40:21 -0500 |
commit | f0dd8712eb8cc5687b4582fbc41cfbcd55bba0d2 (patch) | |
tree | 190bc6cf68e056ae72d895dc2c9074de2c0ed18f /drivers/ide/ide-io.c | |
parent | fdb77da4ca68ae17a39d58c9d5c00479a7e124c0 (diff) |
ide: clear bmdma status in ide_intr() for ICHx controllers (revised #4)
patch 1/2 (revised):
- Fix drive->waiting_for_dma to work with CDB-intr devices.
- Do the dma status clearing in ide_intr() and add a new
hwif->ide_dma_clear_irq for Intel ICHx controllers.
Revised per Alan, Sergei and Bart's advice.
Patch against 2.6.20-rc6. Tested ok on my ICH4 and pdc20275 adapters.
Please review/apply, thanks.
Signed-off-by: Albert Lee <albertcc@tw.ibm.com>
Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: "Adam W. Hawks" <awhawks@us.ibm.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide-io.c')
-rw-r--r-- | drivers/ide/ide-io.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 2614f41b5074..99d1c43f433e 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -1646,6 +1646,17 @@ irqreturn_t ide_intr (int irq, void *dev_id) | |||
1646 | del_timer(&hwgroup->timer); | 1646 | del_timer(&hwgroup->timer); |
1647 | spin_unlock(&ide_lock); | 1647 | spin_unlock(&ide_lock); |
1648 | 1648 | ||
1649 | /* Some controllers might set DMA INTR no matter DMA or PIO; | ||
1650 | * bmdma status might need to be cleared even for | ||
1651 | * PIO interrupts to prevent spurious/lost irq. | ||
1652 | */ | ||
1653 | if (hwif->ide_dma_clear_irq && !(drive->waiting_for_dma)) | ||
1654 | /* ide_dma_end() needs bmdma status for error checking. | ||
1655 | * So, skip clearing bmdma status here and leave it | ||
1656 | * to ide_dma_end() if this is dma interrupt. | ||
1657 | */ | ||
1658 | hwif->ide_dma_clear_irq(drive); | ||
1659 | |||
1649 | if (drive->unmask) | 1660 | if (drive->unmask) |
1650 | local_irq_enable_in_hardirq(); | 1661 | local_irq_enable_in_hardirq(); |
1651 | /* service this interrupt, may set handler for next interrupt */ | 1662 | /* service this interrupt, may set handler for next interrupt */ |