dma_stat &= ~(1 << (5 + unit));
 
        if (hwif->host_flags & IDE_HFLAG_MMIO)
-               writeb(dma_stat, (void __iomem *)hwif->dma_status);
+               writeb(dma_stat,
+                      (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
        else
-               outb(dma_stat, hwif->dma_status);
+               outb(dma_stat, hwif->dma_base + ATA_DMA_STATUS);
 }
 
 EXPORT_SYMBOL_GPL(ide_dma_host_set);
 
        /* specify r/w */
        if (mmio)
-               writeb(reading, (void __iomem *)hwif->dma_command);
+               writeb(reading, (void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
        else
-               outb(reading, hwif->dma_command);
+               outb(reading, hwif->dma_base + ATA_DMA_CMD);
 
        /* read DMA status for INTR & ERROR flags */
        dma_stat = hwif->read_sff_dma_status(hwif);
 
        /* clear INTR & ERROR flags */
        if (mmio)
-               writeb(dma_stat | 6, (void __iomem *)hwif->dma_status);
+               writeb(dma_stat | 6,
+                      (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
        else
-               outb(dma_stat | 6, hwif->dma_status);
+               outb(dma_stat | 6, hwif->dma_base + ATA_DMA_STATUS);
 
        drive->waiting_for_dma = 1;
        return 0;
         * we do this part before issuing the drive cmd.
         */
        if (hwif->host_flags & IDE_HFLAG_MMIO) {
-               dma_cmd = readb((void __iomem *)hwif->dma_command);
+               dma_cmd = readb((void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
                /* start DMA */
-               writeb(dma_cmd | 1, (void __iomem *)hwif->dma_command);
+               writeb(dma_cmd | 1,
+                      (void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
        } else {
-               dma_cmd = inb(hwif->dma_command);
-               outb(dma_cmd | 1, hwif->dma_command);
+               dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
+               outb(dma_cmd | 1, hwif->dma_base + ATA_DMA_CMD);
        }
 
        hwif->dma = 1;
 
        if (mmio) {
                /* get DMA command mode */
-               dma_cmd = readb((void __iomem *)hwif->dma_command);
+               dma_cmd = readb((void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
                /* stop DMA */
-               writeb(dma_cmd & ~1, (void __iomem *)hwif->dma_command);
+               writeb(dma_cmd & ~1,
+                      (void __iomem *)(hwif->dma_base + ATA_DMA_CMD));
        } else {
-               dma_cmd = inb(hwif->dma_command);
-               outb(dma_cmd & ~1, hwif->dma_command);
+               dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
+               outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
        }
 
        /* get DMA status */
 
        if (mmio)
                /* clear the INTR & ERROR bits */
-               writeb(dma_stat | 6, (void __iomem *)hwif->dma_status);
+               writeb(dma_stat | 6,
+                      (void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
        else
-               outb(dma_stat | 6, hwif->dma_status);
+               outb(dma_stat | 6, hwif->dma_base + ATA_DMA_STATUS);
 
        /* purge DMA mappings */
        ide_destroy_dmatable(drive);
 {
        hwif->dma_base = base;
 
-       if (!hwif->dma_command)
-               hwif->dma_command       = hwif->dma_base + 0;
-       if (!hwif->dma_status)
-               hwif->dma_status        = hwif->dma_base + 2;
-
        hwif->dma_ops = &sff_dma_ops;
 }
 
 
 static u8 ide_read_sff_dma_status(ide_hwif_t *hwif)
 {
        if (hwif->host_flags & IDE_HFLAG_MMIO)
-               return readb((void __iomem *)hwif->dma_status);
+               return readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
        else
-               return inb(hwif->dma_status);
+               return inb(hwif->dma_base + ATA_DMA_STATUS);
 }
 
 static void ide_tf_load(ide_drive_t *drive, ide_task_t *task)
 
        unsigned long base      = hwif->dma_base - (hwif->channel * 8);
        u8 irq_mask             = hwif->channel ? MRDMODE_INTR_CH1 :
                                                  MRDMODE_INTR_CH0;
-       u8 dma_stat             = inb(hwif->dma_status);
+       u8 dma_stat             = inb(hwif->dma_base + ATA_DMA_STATUS);
        u8 mrdmode              = inb(base + 1);
 
 #ifdef DEBUG
        int irq_reg             = hwif->channel ? ARTTIM23 : CFR;
        u8  irq_mask            = hwif->channel ? ARTTIM23_INTR_CH1 :
                                                  CFR_INTR_CH0;
-       u8  dma_stat            = inb(hwif->dma_status);
+       u8  dma_stat            = inb(hwif->dma_base + ATA_DMA_STATUS);
        u8  irq_stat            = 0;
 
        (void) pci_read_config_byte(dev, irq_reg, &irq_stat);
 
        drive->waiting_for_dma = 0;
        /* get DMA status */
-       dma_stat = inb(hwif->dma_status);
+       dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
        /* read DMA command state */
-       dma_cmd = inb(hwif->dma_command);
+       dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
        /* stop DMA */
-       outb(dma_cmd & ~1, hwif->dma_command);
+       outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
        /* clear the INTR & ERROR bits */
-       outb(dma_stat | 6, hwif->dma_status);
+       outb(dma_stat | 6, hwif->dma_base + ATA_DMA_STATUS);
        /* and free any DMA resources */
        ide_destroy_dmatable(drive);
        /* verify good DMA status */
 
        printk(KERN_DEBUG "%s: %d bytes in FIFO\n", drive->name, bfifo & 0x1ff);
 
        /* get DMA command mode */
-       dma_cmd = inb(hwif->dma_command);
+       dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
        /* stop DMA */
-       outb(dma_cmd & ~0x1, hwif->dma_command);
+       outb(dma_cmd & ~0x1, hwif->dma_base + ATA_DMA_CMD);
        hpt370_clear_engine(drive);
 }
 
 static int hpt370_dma_end(ide_drive_t *drive)
 {
        ide_hwif_t *hwif        = HWIF(drive);
-       u8  dma_stat            = inb(hwif->dma_status);
+       u8  dma_stat            = inb(hwif->dma_base + ATA_DMA_STATUS);
 
        if (dma_stat & 0x01) {
                /* wait a little */
                udelay(20);
-               dma_stat = inb(hwif->dma_status);
+               dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
                if (dma_stat & 0x01)
                        hpt370_irq_timeout(drive);
        }
                return 0;
        }
 
-       dma_stat = inb(hwif->dma_status);
+       dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
        /* return 1 if INTR asserted */
        if (dma_stat & 4)
                return 1;
 
 
 static u8 superio_read_sff_dma_status(ide_hwif_t *hwif)
 {
-       return superio_ide_inb(hwif->dma_status);
+       return superio_ide_inb(hwif->dma_base + ATA_DMA_STATUS);
 }
 
 static void superio_tf_read(ide_drive_t *drive, ide_task_t *task)
 
        drive->waiting_for_dma = 0;
        dma_stat = hwif->read_sff_dma_status(hwif);
-       /* get dma command mode */
-       dma_cmd = inb(hwif->dma_command);
+       /* get DMA command mode */
+       dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
        /* stop DMA */
-       outb(dma_cmd & ~1, hwif->dma_command);
+       outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
        /* from ERRATA: clear the INTR & ERROR bits */
-       dma_cmd = inb(hwif->dma_command);
-       outb(dma_cmd | 6, hwif->dma_command);
+       dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
+       outb(dma_cmd | 6, hwif->dma_base + ATA_DMA_CMD);
        /* and free any DMA resources */
        ide_destroy_dmatable(drive);
        /* verify good DMA status */
        if (!hwif->dma_base)
                return;
 
-       outb(0x60, hwif->dma_status);
+       outb(0x60, hwif->dma_base + ATA_DMA_STATUS);
 }
 
 static const struct ide_port_ops ns87415_port_ops = {
 
 {
        ide_hwif_t *hwif        = HWIF(drive);
        unsigned long high_16   = hwif->extra_base - 16;
-       u8 dma_stat             = inb(hwif->dma_status);
+       u8 dma_stat             = inb(hwif->dma_base + ATA_DMA_STATUS);
        u8 sc1d                 = inb(high_16 + 0x001d);
 
        if (hwif->channel) {
 
        u8 dma_stat;
 
        /* clear the INTR & ERROR bits */
-       dma_stat = inb(hwif->dma_status);
+       dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
        /* Should we force the bit as well ? */
-       outb(dma_stat, hwif->dma_status);
+       outb(dma_stat, hwif->dma_base + ATA_DMA_STATUS);
 }
 
 struct ich_laptop {
 
 
 static u8 scc_read_sff_dma_status(ide_hwif_t *hwif)
 {
-       return (u8)in_be32((void *)hwif->dma_status);
+       return (u8)in_be32((void *)(hwif->dma_base + 4));
 }
 
 static void scc_ide_insw(unsigned long port, void *addr, u32 count)
 {
        ide_hwif_t *hwif = drive->hwif;
        u8 unit = (drive->select.b.unit & 0x01);
-       u8 dma_stat = scc_ide_inb(hwif->dma_status);
+       u8 dma_stat = scc_ide_inb(hwif->dma_base + 4);
 
        if (on)
                dma_stat |= (1 << (5 + unit));
        else
                dma_stat &= ~(1 << (5 + unit));
 
-       scc_ide_outb(dma_stat, hwif->dma_status);
+       scc_ide_outb(dma_stat, hwif->dma_base + 4);
 }
 
 /**
        out_be32((void __iomem *)(hwif->dma_base + 8), hwif->dmatable_dma);
 
        /* specify r/w */
-       out_be32((void __iomem *)hwif->dma_command, reading);
+       out_be32((void __iomem *)hwif->dma_base, reading);
 
-       /* read dma_status for INTR & ERROR flags */
-       dma_stat = in_be32((void __iomem *)hwif->dma_status);
+       /* read DMA status for INTR & ERROR flags */
+       dma_stat = in_be32((void __iomem *)(hwif->dma_base + 4));
 
        /* clear INTR & ERROR flags */
-       out_be32((void __iomem *)hwif->dma_status, dma_stat|6);
+       out_be32((void __iomem *)(hwif->dma_base + 4), dma_stat | 6);
        drive->waiting_for_dma = 1;
        return 0;
 }
 static void scc_dma_start(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = drive->hwif;
-       u8 dma_cmd = scc_ide_inb(hwif->dma_command);
+       u8 dma_cmd = scc_ide_inb(hwif->dma_base);
 
        /* start DMA */
-       scc_ide_outb(dma_cmd | 1, hwif->dma_command);
+       scc_ide_outb(dma_cmd | 1, hwif->dma_base);
        hwif->dma = 1;
        wmb();
 }
 
        drive->waiting_for_dma = 0;
        /* get DMA command mode */
-       dma_cmd = scc_ide_inb(hwif->dma_command);
+       dma_cmd = scc_ide_inb(hwif->dma_base);
        /* stop DMA */
-       scc_ide_outb(dma_cmd & ~1, hwif->dma_command);
+       scc_ide_outb(dma_cmd & ~1, hwif->dma_base);
        /* get DMA status */
-       dma_stat = scc_ide_inb(hwif->dma_status);
+       dma_stat = scc_ide_inb(hwif->dma_base + 4);
        /* clear the INTR & ERROR bits */
-       scc_ide_outb(dma_stat | 6, hwif->dma_status);
+       scc_ide_outb(dma_stat | 6, hwif->dma_base + 4);
        /* purge DMA mappings */
        ide_destroy_dmatable(drive);
        /* verify good DMA status */
 static int scc_dma_end(ide_drive_t *drive)
 {
        ide_hwif_t *hwif = HWIF(drive);
+       void __iomem *dma_base = (void __iomem *)hwif->dma_base;
        unsigned long intsts_port = hwif->dma_base + 0x014;
        u32 reg;
        int dma_stat, data_loss = 0;
                        printk(KERN_WARNING "%s: SERROR\n", SCC_PATA_NAME);
                        out_be32((void __iomem *)intsts_port, INTSTS_SERROR|INTSTS_BMSINT);
 
-                       out_be32((void __iomem *)hwif->dma_command, in_be32((void __iomem *)hwif->dma_command) & ~QCHCD_IOS_SS);
+                       out_be32(dma_base, in_be32(dma_base) & ~QCHCD_IOS_SS);
                        continue;
                }
 
 
                        out_be32((void __iomem *)intsts_port, INTSTS_PRERR|INTSTS_BMSINT);
 
-                       out_be32((void __iomem *)hwif->dma_command, in_be32((void __iomem *)hwif->dma_command) & ~QCHCD_IOS_SS);
+                       out_be32(dma_base, in_be32(dma_base) & ~QCHCD_IOS_SS);
                        continue;
                }
 
                        printk(KERN_WARNING "%s: Response Error\n", SCC_PATA_NAME);
                        out_be32((void __iomem *)intsts_port, INTSTS_RERR|INTSTS_BMSINT);
 
-                       out_be32((void __iomem *)hwif->dma_command, in_be32((void __iomem *)hwif->dma_command) & ~QCHCD_IOS_SS);
+                       out_be32(dma_base, in_be32(dma_base) & ~QCHCD_IOS_SS);
                        continue;
                }
 
                if (reg & INTSTS_ICERR) {
-                       out_be32((void __iomem *)hwif->dma_command, in_be32((void __iomem *)hwif->dma_command) & ~QCHCD_IOS_SS);
+                       out_be32(dma_base, in_be32(dma_base) & ~QCHCD_IOS_SS);
 
                        printk(KERN_WARNING "%s: Illegal Configuration\n", SCC_PATA_NAME);
                        out_be32((void __iomem *)intsts_port, INTSTS_ICERR|INTSTS_BMSINT);
 
        ports->hwif = hwif;
 
-       hwif->dma_command = hwif->dma_base;
-       hwif->dma_status = hwif->dma_base + 0x04;
-
        /* PTERADD */
        out_be32((void __iomem *)(hwif->dma_base + 0x018), hwif->dmatable_dma);
 
 
        unsigned long addr      = siimage_selreg(hwif, 1);
 
        /* return 1 if INTR asserted */
-       if (hwif->INB(hwif->dma_status) & 4)
+       if (inb(hwif->dma_base + ATA_DMA_STATUS) & 4)
                return 1;
 
        /* return 1 if Device INTR asserted */
        }
 
        /* return 1 if INTR asserted */
-       if (readb((void __iomem *)hwif->dma_status) & 0x04)
+       if (readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS)) & 4)
                return 1;
 
        /* return 1 if Device INTR asserted */
 
         * Was DMA enabled?  If so, disable it - we're resetting the
         * host.  The IDE layer will be handling the drive for us.
         */
-       dma_cmd = inb(hwif->dma_command);
+       dma_cmd = inb(hwif->dma_base + ATA_DMA_CMD);
        if (dma_cmd & 1) {
-               outb(dma_cmd & ~1, hwif->dma_command);
+               outb(dma_cmd & ~1, hwif->dma_base + ATA_DMA_CMD);
                printk("sl82c105: DMA was enabled\n");
        }
 
 
        ide_hwif_t *hwif        = HWIF(drive);
        ide_expiry_t *expiry    = ide_get_hwifdata(hwif);
        ide_hwgroup_t *hwgroup  = HWGROUP(drive);
-       u8 dma_stat             = inb(hwif->dma_status);
+       u8 dma_stat             = inb(hwif->dma_base + ATA_DMA_STATUS);
 
        /* Restore a higher level driver's expiry handler first. */
        hwgroup->expiry = expiry;
        if ((dma_stat & 5) == 1) {      /* DMA active and no interrupt */
                unsigned long sc_base   = hwif->config_data;
                unsigned long twcr_port = sc_base + (drive->dn ? 0x06 : 0x04);
-               u8 dma_cmd              = inb(hwif->dma_command);
+               u8 dma_cmd              = inb(hwif->dma_base + ATA_DMA_CMD);
 
                printk(KERN_WARNING "%s: DMA interrupt possibly stuck, "
                       "attempting recovery...\n", drive->name);
 
                /* Stop DMA */
-               outb(dma_cmd & ~0x01, hwif->dma_command);
+               outb(dma_cmd & ~0x01, hwif->dma_base + ATA_DMA_CMD);
 
                /* Setup the dummy DMA transfer */
                outw(0, sc_base + 0x0a);        /* Sector Count */
                outw(0, twcr_port);     /* Transfer Word Count 1 or 2 */
 
                /* Start the dummy DMA transfer */
-               outb(0x00, hwif->dma_command); /* clear R_OR_WCTR for write */
-               outb(0x01, hwif->dma_command); /* set START_STOPBM */
+
+               /* clear R_OR_WCTR for write */
+               outb(0x00, hwif->dma_base + ATA_DMA_CMD);
+               /* set START_STOPBM */
+               outb(0x01, hwif->dma_base + ATA_DMA_CMD);
 
                /*
                 * If an interrupt was pending, it should come thru shortly.
 
        int             irq;            /* our irq number */
 
        unsigned long   dma_base;       /* base addr for dma ports */
-       unsigned long   dma_command;    /* dma command register */
-       unsigned long   dma_status;     /* dma status register */
 
        unsigned long   config_data;    /* for use by chipset-specific code */
        unsigned long   select_data;    /* for use by chipset-specific code */