aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2007-06-11 05:40:07 -0400
committerJeff Garzik <jeff@garzik.org>2007-06-20 19:56:21 -0400
commit374abf2cb16a9df8be96675c606996458872e8b3 (patch)
tree7d82b5165a8d6bca8569ed6722413ef5688a294f
parent9f7897554eeca34ec23dd877cc27402bd327a1ce (diff)
pata_it821x: (partially) fix DMA in RAID mode
Code intended to check DMA status was checking DMA command register. Moreover firmware seems to "forget" to set DMA capable bit for the slave device (at least in RAID mode but without ITE RAID volumes) so check device ID for DMA capable bit when deciding whether to use DMA and remove DMA status check completely. Thanks to Pavol Simo for the bugreport and testing the initial fix. This change unfortunately still doesn't fix DMA in RAID mode (which works fine with IDE it821x) but Alan is working on the missing pieces (pata_it821x vs libata EH issues). Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> Acked-by: Alan Cox <alan@redhat.com> Cc: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/ata/pata_it821x.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c
index b3456d7a592c..525c9c142891 100644
--- a/drivers/ata/pata_it821x.c
+++ b/drivers/ata/pata_it821x.c
@@ -2,6 +2,7 @@
2 * pata_it821x.c - IT821x PATA for new ATA layer 2 * pata_it821x.c - IT821x PATA for new ATA layer
3 * (C) 2005 Red Hat Inc 3 * (C) 2005 Red Hat Inc
4 * Alan Cox <alan@redhat.com> 4 * Alan Cox <alan@redhat.com>
5 * (C) 2007 Bartlomiej Zolnierkiewicz
5 * 6 *
6 * based upon 7 * based upon
7 * 8 *
@@ -79,7 +80,7 @@
79 80
80 81
81#define DRV_NAME "pata_it821x" 82#define DRV_NAME "pata_it821x"
82#define DRV_VERSION "0.3.6" 83#define DRV_VERSION "0.3.7"
83 84
84struct it821x_dev 85struct it821x_dev
85{ 86{
@@ -460,14 +461,8 @@ static unsigned int it821x_passthru_qc_issue_prot(struct ata_queued_cmd *qc)
460 461
461static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused) 462static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused)
462{ 463{
463 int dma_enabled = 0;
464 int i; 464 int i;
465 465
466 /* Bits 5 and 6 indicate if DMA is active on master/slave */
467 /* It is possible that BMDMA isn't allocated */
468 if (ap->ioaddr.bmdma_addr)
469 dma_enabled = ioread8(ap->ioaddr.bmdma_addr + ATA_DMA_CMD);
470
471 for (i = 0; i < ATA_MAX_DEVICES; i++) { 466 for (i = 0; i < ATA_MAX_DEVICES; i++) {
472 struct ata_device *dev = &ap->device[i]; 467 struct ata_device *dev = &ap->device[i];
473 if (ata_dev_enabled(dev)) { 468 if (ata_dev_enabled(dev)) {
@@ -476,7 +471,7 @@ static int it821x_smart_set_mode(struct ata_port *ap, struct ata_device **unused
476 dev->dma_mode = XFER_MW_DMA_0; 471 dev->dma_mode = XFER_MW_DMA_0;
477 /* We do need the right mode information for DMA or PIO 472 /* We do need the right mode information for DMA or PIO
478 and this comes from the current configuration flags */ 473 and this comes from the current configuration flags */
479 if (dma_enabled & (1 << (5 + i))) { 474 if (ata_id_has_dma(dev->id)) {
480 ata_dev_printk(dev, KERN_INFO, "configured for DMA\n"); 475 ata_dev_printk(dev, KERN_INFO, "configured for DMA\n");
481 dev->xfer_mode = XFER_MW_DMA_0; 476 dev->xfer_mode = XFER_MW_DMA_0;
482 dev->xfer_shift = ATA_SHIFT_MWDMA; 477 dev->xfer_shift = ATA_SHIFT_MWDMA;