diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c index 29dee2c25ba09c58c42889e9cb9b724ad2e94065..f7cf90b9e170ab54e8f9240e3999c2a6a8d30b2b 100644 --- a/drivers/scsi/libata-core.c +++ b/drivers/scsi/libata-core.c @@ -2145,6 +2145,22 @@ static void ata_pio_task(void *_data) } } +/** + * ata_check_bmdma - read PCI IDE BMDMA status + * @ap: struct ata_port + */ + +static u8 ata_check_bmdma(struct ata_port *ap) +{ + u8 host_stat; + if (ap->flags & ATA_FLAG_MMIO) { + void *mmio = (void *) ap->ioaddr.bmdma_addr; + host_stat = readb(mmio + ATA_DMA_STATUS); + } else + host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); + return host_stat; +} + /** * ata_eng_timeout - Handle timeout of queued command * @ap: Port on which timed-out command is active @@ -2188,11 +2204,7 @@ void ata_eng_timeout(struct ata_port *ap) switch (qc->tf.protocol) { case ATA_PROT_DMA: - if (ap->flags & ATA_FLAG_MMIO) { - void *mmio = (void *) ap->ioaddr.bmdma_addr; - host_stat = readb(mmio + ATA_DMA_STATUS); - } else - host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); + host_stat = ata_check_bmdma(ap); printk(KERN_ERR "ata%u: DMA timeout, stat 0x%x\n", ap->id, host_stat); @@ -2622,11 +2634,7 @@ inline unsigned int ata_host_intr (struct ata_port *ap, /* BMDMA completion */ case ATA_PROT_DMA: case ATA_PROT_ATAPI_DMA: - if (ap->flags & ATA_FLAG_MMIO) { - void *mmio = (void *) ap->ioaddr.bmdma_addr; - host_stat = readb(mmio + ATA_DMA_STATUS); - } else - host_stat = inb(ap->ioaddr.bmdma_addr + ATA_DMA_STATUS); + host_stat = ata_check_bmdma(ap); VPRINTK("BUS_DMA (host_stat 0x%X)\n", host_stat); if (!(host_stat & ATA_DMA_INTR)) {