ide: make ide_pci_check_iomem() actually work
authorSergei Shtylyov <sshtylyov@ru.mvista.com>
Sat, 26 Apr 2008 15:36:31 +0000 (17:36 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Sat, 26 Apr 2008 15:36:31 +0000 (17:36 +0200)
This function didn't actually check if a given BAR is in I/O space because of
using the bogus PCI_BASE_ADDRESS_IO_MASK (which equals ~3) to test the resource
flags instead of IORESOURCE_IO -- fix this, make ide_hwif_configure() check the
results failing if necessary, and move the printk() call to the failure path.

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/setup-pci.c

index f7ede0e42881f5ae56d63780fdbd8d635548a355..2dc3835478eccf2ca142ce492114eedc6371a3e4 100644 (file)
@@ -301,11 +301,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);
        
@@ -313,14 +314,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;
 }
 
@@ -348,9 +346,12 @@ static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev,
        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);