Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfashe...
[sfrench/cifs-2.6.git] / drivers / ide / pci / sgiioc4.c
index c292e1de1d56aba4bd574eb4ed03fb7cbc521733..7e9dade5648d4e13e20df4cb125f5a5351cba4a5 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/mm.h>
 #include <linux/ioport.h>
 #include <linux/blkdev.h>
+#include <linux/scatterlist.h>
 #include <linux/ioc4.h>
 #include <asm/io.h>
 
@@ -291,26 +292,8 @@ static void sgiioc4_dma_off_quietly(ide_drive_t *drive)
        drive->hwif->dma_host_off(drive);
 }
 
-static int sgiioc4_speedproc(ide_drive_t *drive, const u8 speed)
+static void sgiioc4_set_dma_mode(ide_drive_t *drive, const u8 speed)
 {
-       if (speed != XFER_MW_DMA_2)
-               return 1;
-
-       return ide_config_drive_speed(drive, speed);
-}
-
-static int sgiioc4_ide_dma_check(ide_drive_t *drive)
-{
-       if (ide_tune_dma(drive))
-               return 0;
-
-       /*
-        * ->set_pio_mode is not implemented currently
-        * so this is just for the completness
-        */
-       ide_set_max_pio(drive);
-
-       return -1;
 }
 
 /* returns 1 if dma irq issued, 0 otherwise */
@@ -541,7 +524,7 @@ sgiioc4_build_dma_table(ide_drive_t * drive, struct request *rq, int ddir)
                        }
                }
 
-               sg++;
+               sg = sg_next(sg);
                i--;
        }
 
@@ -591,25 +574,28 @@ static void __devinit
 ide_init_sgiioc4(ide_hwif_t * hwif)
 {
        hwif->mmio = 1;
-       hwif->atapi_dma = 1;
-       hwif->mwdma_mask = 0x04;
        hwif->pio_mask = 0x00;
        hwif->set_pio_mode = NULL; /* Sets timing for PIO mode */
-       hwif->speedproc = &sgiioc4_speedproc;
+       hwif->set_dma_mode = &sgiioc4_set_dma_mode;
        hwif->selectproc = NULL;/* Use the default routine to select drive */
        hwif->reset_poll = NULL;/* No HBA specific reset_poll needed */
        hwif->pre_reset = NULL; /* No HBA specific pre_set needed */
        hwif->resetproc = &sgiioc4_resetproc;/* Reset DMA engine,
                                                clear interrupts */
-       hwif->intrproc = NULL;  /* Enable or Disable interrupt from drive */
        hwif->maskproc = &sgiioc4_maskproc;     /* Mask on/off NIEN register */
        hwif->quirkproc = NULL;
        hwif->busproc = NULL;
 
+       hwif->INB = &sgiioc4_INB;
+
+       if (hwif->dma_base == 0)
+               return;
+
+       hwif->mwdma_mask = ATA_MWDMA2_ONLY;
+
        hwif->dma_setup = &sgiioc4_ide_dma_setup;
        hwif->dma_start = &sgiioc4_ide_dma_start;
        hwif->ide_dma_end = &sgiioc4_ide_dma_end;
-       hwif->ide_dma_check = &sgiioc4_ide_dma_check;
        hwif->ide_dma_on = &sgiioc4_ide_dma_on;
        hwif->dma_off_quietly = &sgiioc4_dma_off_quietly;
        hwif->ide_dma_test_irq = &sgiioc4_ide_dma_test_irq;
@@ -617,8 +603,6 @@ ide_init_sgiioc4(ide_hwif_t * hwif)
        hwif->dma_host_off = &sgiioc4_dma_host_off;
        hwif->dma_lost_irq = &sgiioc4_dma_lost_irq;
        hwif->dma_timeout = &ide_dma_timeout;
-
-       hwif->INB = &sgiioc4_INB;
 }
 
 static int __devinit
@@ -629,6 +613,7 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
        void __iomem *virt_base;
        ide_hwif_t *hwif;
        int h;
+       u8 idx[4] = { 0xff, 0xff, 0xff, 0xff };
 
        /*
         * Find an empty HWIF; if none available, return -ENOMEM.
@@ -669,10 +654,12 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
        }
 
        if (hwif->io_ports[IDE_DATA_OFFSET] != cmd_base) {
+               hw_regs_t hw;
+
                /* Initialize the IO registers */
-               sgiioc4_init_hwif_ports(&hwif->hw, cmd_base, ctl, irqport);
-               memcpy(hwif->io_ports, hwif->hw.io_ports,
-                      sizeof (hwif->io_ports));
+               memset(&hw, 0, sizeof(hw));
+               sgiioc4_init_hwif_ports(&hw, cmd_base, ctl, irqport);
+               memcpy(hwif->io_ports, hw.io_ports, sizeof(hwif->io_ports));
                hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET];
        }
 
@@ -688,22 +675,16 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
        /* Initializing chipset IRQ Registers */
        writel(0x03, (void __iomem *)(irqport + IOC4_INTR_SET * 4));
 
-       ide_init_sgiioc4(hwif);
-
-       hwif->autodma = 0;
-
-       if (dma_base && ide_dma_sgiioc4(hwif, dma_base) == 0) {
-               hwif->autodma = 1;
-               hwif->drives[1].autodma = hwif->drives[0].autodma = 1;
-       } else
+       if (dma_base == 0 || ide_dma_sgiioc4(hwif, dma_base))
                printk(KERN_INFO "%s: %s Bus-Master DMA disabled\n",
                                 hwif->name, DRV_NAME);
 
-       if (probe_hwif_init(hwif))
-               return -EIO;
+       ide_init_sgiioc4(hwif);
 
-       /* Create /proc/ide entries */
-       ide_proc_register_port(hwif);
+       idx[0] = hwif->index;
+
+       if (ide_device_add(idx))
+               return -EIO;
 
        return 0;
 }
@@ -711,14 +692,12 @@ sgiioc4_ide_setup_pci_device(struct pci_dev *dev)
 static unsigned int __devinit
 pci_init_sgiioc4(struct pci_dev *dev)
 {
-       unsigned int class_rev;
        int ret;
 
-       pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
-       class_rev &= 0xff;
        printk(KERN_INFO "%s: IDE controller at PCI slot %s, revision %d\n",
-                        DRV_NAME, pci_name(dev), class_rev);
-       if (class_rev < IOC4_SUPPORTED_FIRMWARE_REV) {
+                        DRV_NAME, pci_name(dev), dev->revision);
+
+       if (dev->revision < IOC4_SUPPORTED_FIRMWARE_REV) {
                printk(KERN_ERR "Skipping %s IDE controller in slot %s: "
                                "firmware is obsolete - please upgrade to "
                                "revision46 or higher\n",