ide: IDE_HFLAG_BOOTABLE -> IDE_HFLAG_NON_BOOTABLE
[safe/jmp/linux-2.6] / drivers / ide / setup-pci.c
index 6b41d6c..8947597 100644 (file)
@@ -1,9 +1,8 @@
 /*
- *  linux/drivers/ide/setup-pci.c              Version 1.10    2002/08/19
+ *  Copyright (C) 1998-2000  Andre Hedrick <andre@linux-ide.org>
+ *  Copyright (C) 1995-1998  Mark Lord
+ *  Copyright (C)      2007  Bartlomiej Zolnierkiewicz
  *
- *  Copyright (c) 1998-2000  Andre Hedrick <andre@linux-ide.org>
- *
- *  Copyright (c) 1995-1998  Mark Lord
  *  May be copied or modified under the terms of the GNU General Public License
  */
 
 
 
 /**
- *     ide_match_hwif  -       match a PCI IDE against an ide_hwif
- *     @io_base: I/O base of device
- *     @bootable: set if its bootable
- *     @name: name of device
- *
- *     Match a PCI IDE port against an entry in ide_hwifs[],
- *     based on io_base port if possible. Return the matching hwif,
- *     or a new hwif. If we find an error (clashing, out of devices, etc)
- *     return NULL
+ *     ide_match_hwif  -       find free ide_hwifs[] slot
+ *     @bootable: bootable flag
  *
- *     FIXME: we need to handle mmio matches here too
+ *     Return the new hwif.  If we are out of free slots return NULL.
  */
 
-static ide_hwif_t *ide_match_hwif(unsigned long io_base, u8 bootable, const char *name)
+static ide_hwif_t *ide_match_hwif(u8 bootable)
 {
-       int h;
        ide_hwif_t *hwif;
+       int h;
 
        /*
-        * Look for a hwif with matching io_base specified using
-        * parameters to ide_setup().
-        */
-       for (h = 0; h < MAX_HWIFS; ++h) {
-               hwif = &ide_hwifs[h];
-               if (hwif->io_ports[IDE_DATA_OFFSET] == io_base) {
-                       if (hwif->chipset == ide_forced)
-                               return hwif; /* a perfect match */
-               }
-       }
-       /*
-        * Look for a hwif with matching io_base default value.
-        * If chipset is "ide_unknown", then claim that hwif slot.
-        * Otherwise, some other chipset has already claimed it..  :(
-        */
-       for (h = 0; h < MAX_HWIFS; ++h) {
-               hwif = &ide_hwifs[h];
-               if (hwif->io_ports[IDE_DATA_OFFSET] == io_base) {
-                       if (hwif->chipset == ide_unknown)
-                               return hwif; /* match */
-                       printk(KERN_ERR "%s: port 0x%04lx already claimed by %s\n",
-                               name, io_base, hwif->name);
-                       return NULL;    /* already claimed */
-               }
-       }
-       /*
-        * Okay, there is no hwif matching our io_base,
-        * so we'll just claim an unassigned slot.
+        * Claim an unassigned slot.
+        *
         * Give preference to claiming other slots before claiming ide0/ide1,
         * just in case there's another interface yet-to-be-scanned
         * which uses ports 1f0/170 (the ide0/ide1 defaults).
@@ -95,7 +61,7 @@ static ide_hwif_t *ide_match_hwif(unsigned long io_base, u8 bootable, const char
                if (hwif->chipset == ide_unknown)
                        return hwif;    /* pick an unused entry */
        }
-       printk(KERN_ERR "%s: too many IDE interfaces, no room in table\n", name);
+
        return NULL;
 }
 
@@ -229,7 +195,9 @@ EXPORT_SYMBOL_GPL(ide_setup_pci_noise);
  *     @d: IDE port info
  *
  *     Enable the IDE PCI device. We attempt to enable the device in full
- *     but if that fails then we only need BAR4 so we will enable that.
+ *     but if that fails then we only need IO space. The PCI code should
+ *     have setup the proper resources for us already for controllers in
+ *     legacy mode.
  *     
  *     Returns zero on success or an error code
  */
@@ -239,7 +207,7 @@ static int ide_pci_enable(struct pci_dev *dev, const struct ide_port_info *d)
        int ret;
 
        if (pci_enable_device(dev)) {
-               ret = pci_enable_device_bars(dev, 1 << 4);
+               ret = pci_enable_device_io(dev);
                if (ret < 0) {
                        printk(KERN_WARNING "%s: (ide_setup_pci_device:) "
                                "Could not enable device.\n", d->name);
@@ -311,11 +279,12 @@ static int ide_pci_configure(struct pci_dev *dev, const struct ide_port_info *d)
  *     @d: IDE port info
  *     @bar: BAR number
  *
- *     Checks if a BAR is configured and points to MMIO space. If so
- *     print an error and return an error code. Otherwise return 0
+ *     Checks if a BAR is configured and points to MMIO space. If so,
+ *     return an error code. Otherwise return 0
  */
 
-static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *d, int bar)
+static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *d,
+                              int bar)
 {
        ulong flags = pci_resource_flags(dev, bar);
        
@@ -323,14 +292,11 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *
        if (!flags || pci_resource_len(dev, bar) == 0)
                return 0;
 
-       /* I/O space */         
-       if(flags & PCI_BASE_ADDRESS_IO_MASK)
+       /* I/O space */
+       if (flags & IORESOURCE_IO)
                return 0;
                
        /* Bad */
-       printk(KERN_ERR "%s: IO baseregs (BIOS) are reported "
-                       "as MEM, report to "
-                       "<andre@linux-ide.org>.\n", d->name);
        return -EINVAL;
 }
 
@@ -338,7 +304,8 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *
  *     ide_hwif_configure      -       configure an IDE interface
  *     @dev: PCI device holding interface
  *     @d: IDE port info
- *     @mate: Paired interface if any
+ *     @port: port number
+ *     @irq: PCI IRQ
  *
  *     Perform the initial set up for the hardware interface structure. This
  *     is done per interface port rather than per PCI device. There may be
@@ -347,18 +314,22 @@ static int ide_pci_check_iomem(struct pci_dev *dev, const struct ide_port_info *
  *     Returns the new hardware interface structure, or NULL on a failure
  */
 
-static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, const struct ide_port_info *d, ide_hwif_t *mate, int port, int irq)
+static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev,
+                                     const struct ide_port_info *d,
+                                     unsigned int port, int irq)
 {
        unsigned long ctl = 0, base = 0;
        ide_hwif_t *hwif;
-       u8 bootable = (d->host_flags & IDE_HFLAG_BOOTABLE) ? 1 : 0;
-       u8 oldnoprobe = 0;
+       u8 bootable = (d->host_flags & IDE_HFLAG_NON_BOOTABLE) ? 0 : 1;
        struct hw_regs_s hw;
 
        if ((d->host_flags & IDE_HFLAG_ISA_PORTS) == 0) {
-               /*  Possibly we should fail if these checks report true */
-               ide_pci_check_iomem(dev, d, 2*port);
-               ide_pci_check_iomem(dev, d, 2*port+1);
+               if (ide_pci_check_iomem(dev, d, 2 * port) ||
+                   ide_pci_check_iomem(dev, d, 2 * port + 1)) {
+                       printk(KERN_ERR "%s: I/O baseregs (BIOS) are reported "
+                                       "as MEM for port %d!\n", d->name, port);
+                       return NULL;
+               }
  
                ctl  = pci_resource_start(dev, 2*port+1);
                base = pci_resource_start(dev, 2*port);
@@ -374,48 +345,42 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, const struct ide_port
                ctl = port ? 0x374 : 0x3f4;
                base = port ? 0x170 : 0x1f0;
        }
-       if ((hwif = ide_match_hwif(base, bootable, d->name)) == NULL)
-               return NULL;    /* no room in ide_hwifs[] */
+
+       hwif = ide_match_hwif(bootable);
+       if (hwif == NULL) {
+               printk(KERN_ERR "%s: too many IDE interfaces, no room in "
+                               "table\n", d->name);
+               return NULL;
+       }
 
        memset(&hw, 0, sizeof(hw));
-       hw.irq = hwif->irq ? hwif->irq : irq;
+       hw.irq = irq;
        hw.dev = &dev->dev;
        hw.chipset = d->chipset ? d->chipset : ide_pci;
        ide_std_init_ports(&hw, base, ctl | 2);
 
-       if (hwif->io_ports[IDE_DATA_OFFSET] == base &&
-           hwif->io_ports[IDE_CONTROL_OFFSET] == (ctl | 2))
-               oldnoprobe = hwif->noprobe;
-
        ide_init_port_hw(hwif, &hw);
 
-       hwif->noprobe = oldnoprobe;
-
        hwif->dev = &dev->dev;
        hwif->cds = d;
-       hwif->channel = port;
 
-       if (mate) {
-               hwif->mate = mate;
-               mate->mate = hwif;
-       }
        return hwif;
 }
 
+#ifdef CONFIG_BLK_DEV_IDEDMA_PCI
 /**
  *     ide_hwif_setup_dma      -       configure DMA interface
- *     @dev: PCI device
- *     @d: IDE port info
  *     @hwif: IDE interface
+ *     @d: IDE port info
  *
  *     Set up the DMA base for the interface. Enable the master bits as
  *     necessary and attempt to bring the device DMA into a ready to use
  *     state
  */
 
-static void ide_hwif_setup_dma(struct pci_dev *dev, const struct ide_port_info *d, ide_hwif_t *hwif)
+void ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d)
 {
-#ifdef CONFIG_BLK_DEV_IDEDMA_PCI
+       struct pci_dev *dev = to_pci_dev(hwif->dev);
        u16 pcicmd;
 
        pci_read_config_word(dev, PCI_COMMAND, &pcicmd);
@@ -447,8 +412,8 @@ static void ide_hwif_setup_dma(struct pci_dev *dev, const struct ide_port_info *
                                "(BIOS)\n", hwif->name, d->name);
                }
        }
-#endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/
 }
+#endif /* CONFIG_BLK_DEV_IDEDMA_PCI */
 
 /**
  *     ide_setup_pci_controller        -       set up IDE PCI
@@ -510,7 +475,7 @@ out:
 void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, int pciirq, u8 *idx)
 {
        int channels = (d->host_flags & IDE_HFLAG_SINGLE) ? 1 : 2, port;
-       ide_hwif_t *hwif, *mate = NULL;
+       ide_hwif_t *hwif;
        u8 tmp;
 
        /*
@@ -526,56 +491,11 @@ void ide_pci_setup_ports(struct pci_dev *dev, const struct ide_port_info *d, int
                        continue;       /* port not enabled */
                }
 
-               if ((hwif = ide_hwif_configure(dev, d, mate, port, pciirq)) == NULL)
+               hwif = ide_hwif_configure(dev, d, port, pciirq);
+               if (hwif == NULL)
                        continue;
 
                *(idx + port) = hwif->index;
-
-               if (d->init_iops)
-                       d->init_iops(hwif);
-
-               if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0)
-                       ide_hwif_setup_dma(dev, d, hwif);
-
-               if ((!hwif->irq && (d->host_flags & IDE_HFLAG_LEGACY_IRQS)) ||
-                   (d->host_flags & IDE_HFLAG_FORCE_LEGACY_IRQS))
-                       hwif->irq = port ? 15 : 14;
-
-               hwif->host_flags = d->host_flags;
-               hwif->pio_mask = d->pio_mask;
-
-               if ((d->host_flags & IDE_HFLAG_SERIALIZE) && hwif->mate)
-                       hwif->mate->serialized = hwif->serialized = 1;
-
-               if (d->host_flags & IDE_HFLAG_IO_32BIT) {
-                       hwif->drives[0].io_32bit = 1;
-                       hwif->drives[1].io_32bit = 1;
-               }
-
-               if (d->host_flags & IDE_HFLAG_UNMASK_IRQS) {
-                       hwif->drives[0].unmask = 1;
-                       hwif->drives[1].unmask = 1;
-               }
-
-               if (hwif->dma_base) {
-                       hwif->swdma_mask = d->swdma_mask;
-                       hwif->mwdma_mask = d->mwdma_mask;
-                       hwif->ultra_mask = d->udma_mask;
-               }
-
-               hwif->drives[0].autotune = 1;
-               hwif->drives[1].autotune = 1;
-
-               if (d->host_flags & IDE_HFLAG_RQSIZE_256)
-                       hwif->rqsize = 256;
-
-               if (d->init_hwif)
-                       /* Call chipset-specific routine
-                        * for each enabled hwif
-                        */
-                       d->init_hwif(hwif);
-
-               mate = hwif;
        }
 }
 
@@ -657,7 +577,7 @@ int ide_setup_pci_device(struct pci_dev *dev, const struct ide_port_info *d)
        ret = do_ide_setup_pci_device(dev, d, &idx[0], 1);
 
        if (ret >= 0)
-               ide_device_add(idx);
+               ide_device_add(idx, d);
 
        return ret;
 }
@@ -681,7 +601,7 @@ int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2,
                        goto out;
        }
 
-       ide_device_add(idx);
+       ide_device_add(idx, d);
 out:
        return ret;
 }