IDE: Report errors during drive reset back to user space
[pandora-kernel.git] / drivers / ide / pci / siimage.c
index 4cf8fc5..6e9d765 100644 (file)
@@ -94,7 +94,7 @@ static unsigned long siimage_selreg(ide_hwif_t *hwif, int r)
        unsigned long base = (unsigned long)hwif->hwif_data;
 
        base += 0xA0 + r;
-       if (hwif->mmio)
+       if (hwif->host_flags & IDE_HFLAG_MMIO)
                base += hwif->channel << 6;
        else
                base += hwif->channel << 4;
@@ -117,7 +117,7 @@ static inline unsigned long siimage_seldev(ide_drive_t *drive, int r)
        unsigned long base      = (unsigned long)hwif->hwif_data;
 
        base += 0xA0 + r;
-       if (hwif->mmio)
+       if (hwif->host_flags & IDE_HFLAG_MMIO)
                base += hwif->channel << 6;
        else
                base += hwif->channel << 4;
@@ -190,7 +190,9 @@ static u8 sil_pata_udma_filter(ide_drive_t *drive)
        unsigned long base      = (unsigned long)hwif->hwif_data;
        u8 scsc, mask           = 0;
 
-       scsc = sil_ioread8(dev, base + (hwif->mmio ? 0x4A : 0x8A));
+       base += (hwif->host_flags & IDE_HFLAG_MMIO) ? 0x4A : 0x8A;
+
+       scsc = sil_ioread8(dev, base);
 
        switch (scsc & 0x30) {
        case 0x10:      /* 133 */
@@ -238,8 +240,9 @@ static void sil_set_pio_mode(ide_drive_t *drive, u8 pio)
        unsigned long tfaddr    = siimage_selreg(hwif,  0x02);
        unsigned long base      = (unsigned long)hwif->hwif_data;
        u8 tf_pio               = pio;
-       u8 addr_mask            = hwif->channel ? (hwif->mmio ? 0xF4 : 0x84)
-                                               : (hwif->mmio ? 0xB4 : 0x80);
+       u8 mmio                 = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
+       u8 addr_mask            = hwif->channel ? (mmio ? 0xF4 : 0x84)
+                                               : (mmio ? 0xB4 : 0x80);
        u8 mode                 = 0;
        u8 unit                 = drive->select.b.unit;
 
@@ -290,13 +293,13 @@ static void sil_set_dma_mode(ide_drive_t *drive, const u8 speed)
        u16 ultra = 0, multi    = 0;
        u8 mode = 0, unit       = drive->select.b.unit;
        unsigned long base      = (unsigned long)hwif->hwif_data;
-       u8 scsc = 0, addr_mask  = hwif->channel ?
-                                       (hwif->mmio ? 0xF4 : 0x84) :
-                                       (hwif->mmio ? 0xB4 : 0x80);
+       u8 mmio                 = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
+       u8 scsc = 0, addr_mask  = hwif->channel ? (mmio ? 0xF4 : 0x84)
+                                               : (mmio ? 0xB4 : 0x80);
        unsigned long ma        = siimage_seldev(drive, 0x08);
        unsigned long ua        = siimage_seldev(drive, 0x0C);
 
-       scsc  = sil_ioread8 (dev, base + (hwif->mmio ? 0x4A : 0x8A));
+       scsc  = sil_ioread8 (dev, base + (mmio ? 0x4A : 0x8A));
        mode  = sil_ioread8 (dev, base + addr_mask);
        multi = sil_ioread16(dev, ma);
        ultra = sil_ioread16(dev, ua);
@@ -391,7 +394,7 @@ static int siimage_mmio_dma_test_irq(ide_drive_t *drive)
 
 static int siimage_dma_test_irq(ide_drive_t *drive)
 {
-       if (drive->hwif->mmio)
+       if (drive->hwif->host_flags & IDE_HFLAG_MMIO)
                return siimage_mmio_dma_test_irq(drive);
        else
                return siimage_io_dma_test_irq(drive);
@@ -418,8 +421,7 @@ static int sil_sata_reset_poll(ide_drive_t *drive)
                if ((sata_stat & 0x03) != 0x03) {
                        printk(KERN_WARNING "%s: reset phy dead, status=0x%08x\n",
                                            hwif->name, sata_stat);
-                       HWGROUP(drive)->polling = 0;
-                       return ide_started;
+                       return -ENXIO;
                }
        }
 
@@ -640,8 +642,6 @@ static void __devinit init_mmio_iops_siimage(ide_hwif_t *hwif)
        hwif->irq = dev->irq;
 
        hwif->dma_base = (unsigned long)addr + (ch ? 0x08 : 0x00);
-
-       hwif->mmio = 1;
 }
 
 static int is_dev_seagate_sata(ide_drive_t *drive)
@@ -737,8 +737,15 @@ static const struct ide_port_ops sil_sata_port_ops = {
        .cable_detect           = sil_cable_detect,
 };
 
-static struct ide_dma_ops sil_dma_ops = {
+static const struct ide_dma_ops sil_dma_ops = {
+       .dma_host_set           = ide_dma_host_set,
+       .dma_setup              = ide_dma_setup,
+       .dma_exec_cmd           = ide_dma_exec_cmd,
+       .dma_start              = ide_dma_start,
+       .dma_end                = __ide_dma_end,
        .dma_test_irq           = siimage_dma_test_irq,
+       .dma_timeout            = ide_dma_timeout,
+       .dma_lost_irq           = ide_dma_lost_irq,
 };
 
 #define DECLARE_SII_DEV(name_str, p_ops)               \