]> git.ipfire.org Git - thirdparty/pciutils.git/commitdiff
Fix base address flags when using sysfs method
authorYu Zhao <yu.zhao@intel.com>
Fri, 26 Dec 2008 01:59:28 +0000 (09:59 +0800)
committerMartin Mares <mj@ucw.cz>
Tue, 30 Dec 2008 11:02:03 +0000 (12:02 +0100)
The base address flags are ignored when using sysfs method, while
the proc and generic methods combined the flags into 'base_addr'.
This inconsistency may fail some applications using libpci.

Signed-off-by: Yu Zhao <yu.zhao@intel.com>
lib/pci.h
lib/sysfs.c

index 1453f751cc8f9e90420f9e2eccb591d67aaf6250..294f3a9c526277a843283f00c6a708c0cb13347c 100644 (file)
--- a/lib/pci.h
+++ b/lib/pci.h
@@ -142,6 +142,7 @@ struct pci_dev {
 
 #define PCI_ADDR_IO_MASK (~(pciaddr_t) 0x3)
 #define PCI_ADDR_MEM_MASK (~(pciaddr_t) 0xf)
+#define PCI_ADDR_FLAG_MASK 0xf
 
 u8 pci_read_byte(struct pci_dev *, int pos) PCI_ABI; /* Access to configuration space */
 u16 pci_read_word(struct pci_dev *, int pos) PCI_ABI;
index 43945fe394ea7ca5be966a1b33acfa95e2fc0ab2..2419b414351c4293b7139251240cae97281007ff 100644 (file)
@@ -120,23 +120,24 @@ sysfs_get_resources(struct pci_dev *d)
     a->error("Cannot open %s: %s", namebuf, strerror(errno));
   for (i = 0; i < 7; i++)
     {
-      unsigned long long start, end, size;
+      unsigned long long start, end, size, flags;
       if (!fgets(buf, sizeof(buf), file))
        break;
-      if (sscanf(buf, "%llx %llx", &start, &end) != 2)
+      if (sscanf(buf, "%llx %llx %llx", &start, &end, &flags) != 3)
        a->error("Syntax error in %s", namebuf);
       if (start)
        size = end - start + 1;
       else
        size = 0;
+      flags &= PCI_ADDR_FLAG_MASK;
       if (i < 6)
        {
-         d->base_addr[i] = start;
+         d->base_addr[i] = start | flags;
          d->size[i] = size;
        }
       else
        {
-         d->rom_base_addr = start;
+         d->rom_base_addr = start | flags;
          d->rom_size = size;
        }
     }