Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 123529
b: refs/heads/master
c: 1d35364
h: refs/heads/master
i:
  123527: a9cfbce
v: v3
  • Loading branch information
Bartlomiej Zolnierkiewicz committed Dec 29, 2008
1 parent 3944ad8 commit ae9bddc
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 30 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2f996acb6191b6b5f188eca1d1ad76cf1d8ecf76
refs/heads/master: 1d35364acbd5ab7d67bb39cfc5dd3ed0fbefb4b8
52 changes: 23 additions & 29 deletions trunk/drivers/ide/ide-dma-sff.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,15 +176,10 @@ int ide_dma_setup(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
struct request *rq = hwif->hwgroup->rq;
unsigned int reading;
unsigned int reading = rq_data_dir(rq) ? 0 : ATA_DMA_WR;
u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
u8 dma_stat;

if (rq_data_dir(rq))
reading = 0;
else
reading = 1 << 3;

/* fall back to pio! */
if (!ide_build_dmatable(drive, rq)) {
ide_map_sg(drive, rq);
Expand All @@ -209,10 +204,11 @@ int ide_dma_setup(ide_drive_t *drive)

/* clear INTR & ERROR flags */
if (mmio)
writeb(dma_stat | 6,
writeb(dma_stat | ATA_DMA_ERR | ATA_DMA_INTR,
(void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
else
outb(dma_stat | 6, hwif->dma_base + ATA_DMA_STATUS);
outb(dma_stat | ATA_DMA_ERR | ATA_DMA_INTR,
hwif->dma_base + ATA_DMA_STATUS);

drive->waiting_for_dma = 1;
return 0;
Expand Down Expand Up @@ -246,14 +242,13 @@ static int dma_timer_expiry(ide_drive_t *drive)

hwif->hwgroup->expiry = NULL; /* one free ride for now */

/* 1 dmaing, 2 error, 4 intr */
if (dma_stat & 2) /* ERROR */
if (dma_stat & ATA_DMA_ERR) /* ERROR */
return -1;

if (dma_stat & 1) /* DMAing */
if (dma_stat & ATA_DMA_ACTIVE) /* DMAing */
return WAIT_CMD;

if (dma_stat & 4) /* Got an Interrupt */
if (dma_stat & ATA_DMA_INTR) /* Got an Interrupt */
return WAIT_CMD;

return 0; /* Status is unknown -- reset the bus */
Expand All @@ -279,12 +274,11 @@ void ide_dma_start(ide_drive_t *drive)
*/
if (hwif->host_flags & IDE_HFLAG_MMIO) {
dma_cmd = readb((void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
/* start DMA */
writeb(dma_cmd | 1,
writeb(dma_cmd | ATA_DMA_START,
(void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
} else {
dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
outb(dma_cmd | 1, hwif->dma_base + ATA_DMA_CMD);
outb(dma_cmd | ATA_DMA_START, hwif->dma_base + ATA_DMA_CMD);
}

wmb();
Expand All @@ -296,36 +290,40 @@ int ide_dma_end(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
u8 dma_stat = 0, dma_cmd = 0;
u8 dma_stat = 0, dma_cmd = 0, mask;

drive->waiting_for_dma = 0;

/* stop DMA */
if (mmio) {
/* get DMA command mode */
dma_cmd = readb((void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
/* stop DMA */
writeb(dma_cmd & ~1,
writeb(dma_cmd & ~ATA_DMA_START,
(void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
} else {
dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
outb(dma_cmd & ~ATA_DMA_START, hwif->dma_base + ATA_DMA_CMD);
}

/* get DMA status */
dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);

if (mmio)
/* clear the INTR & ERROR bits */
writeb(dma_stat | 6,
writeb(dma_stat | ATA_DMA_ERR | ATA_DMA_INTR,
(void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
else
outb(dma_stat | 6, hwif->dma_base + ATA_DMA_STATUS);
outb(dma_stat | ATA_DMA_ERR | ATA_DMA_INTR,
hwif->dma_base + ATA_DMA_STATUS);

/* purge DMA mappings */
ide_destroy_dmatable(drive);
/* verify good DMA status */
wmb();
return (dma_stat & 7) != 4 ? (0x10 | dma_stat) : 0;

/* verify good DMA status */
mask = ATA_DMA_ACTIVE | ATA_DMA_ERR | ATA_DMA_INTR;
if ((dma_stat & mask) != ATA_DMA_INTR)
return 0x10 | dma_stat;
return 0;
}
EXPORT_SYMBOL_GPL(ide_dma_end);

Expand All @@ -335,11 +333,7 @@ int ide_dma_test_irq(ide_drive_t *drive)
ide_hwif_t *hwif = drive->hwif;
u8 dma_stat = hwif->tp_ops->read_sff_dma_status(hwif);

/* return 1 if INTR asserted */
if ((dma_stat & 4) == 4)
return 1;

return 0;
return (dma_stat & ATA_DMA_INTR) ? 1 : 0;
}
EXPORT_SYMBOL_GPL(ide_dma_test_irq);

Expand Down

0 comments on commit ae9bddc

Please sign in to comment.