]> mj.ucw.cz Git - pciutils.git/blobdiff - lib/sysfs.c
By mistake, we were setting PCI_USE_DNS on Linux automatically.
[pciutils.git] / lib / sysfs.c
index c0cf5a3bfef5202db1f69a689fbee9811e03b0ef..ea386fa8fbdfbf4a7dd616ef8469eed2c4bed7a7 100644 (file)
@@ -2,7 +2,7 @@
  *     The PCI Library -- Configuration Access via /sys/bus/pci
  *
  *     Copyright (c) 2003 Matthew Wilcox <willy@fc.hp.com>
- *     Copyright (c) 1997--2003 Martin Mares <mj@ucw.cz>
+ *     Copyright (c) 1997--2008 Martin Mares <mj@ucw.cz>
  *
  *     Can be freely distributed and used under the terms of the GNU GPL.
  */
 static void
 sysfs_config(struct pci_access *a)
 {
-  a->method_params[PCI_ACCESS_SYS_BUS_PCI] = PATH_SYS_BUS_PCI;
+  pci_define_param(a, "sysfs.path", PCI_PATH_SYS_BUS_PCI, "Path to the sysfs device tree");
 }
 
 static inline char *
 sysfs_name(struct pci_access *a)
 {
-  return a->method_params[PCI_ACCESS_SYS_BUS_PCI];
+  return pci_get_param(a, "sysfs.path");
 }
 
 static int
@@ -105,24 +105,18 @@ sysfs_get_resources(struct pci_dev *d)
   file = fopen(namebuf, "r");
   if (!file)
     a->error("Cannot open %s: %s", namebuf, strerror(errno));
-  for (i = 0; i < 8; i++)
+  for (i = 0; i < 7; i++)
     {
       unsigned long long start, end, size;
       if (!fgets(buf, sizeof(buf), file))
        break;
       if (sscanf(buf, "%llx %llx", &start, &end) != 2)
        a->error("Syntax error in %s", namebuf);
-      if (start != (unsigned long long)(pciaddr_t) start ||
-         end != (unsigned long long)(pciaddr_t) end)
-       {
-         a->warning("Resource %d in %s has a 64-bit address, ignoring", namebuf);
-         start = end = 0;
-       }
       if (start)
        size = end - start + 1;
       else
        size = 0;
-      if (i < 7)
+      if (i < 6)
        {
          d->base_addr[i] = start;
          d->size[i] = size;
@@ -169,18 +163,14 @@ static void sysfs_scan(struct pci_access *a)
        {
          sysfs_get_resources(d);
          d->irq = sysfs_get_value(d, "irq");
-         d->known_fields = PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES;
-#if 0
          /*
-          *  We prefer reading these from the config registers, it's faster.
-          *  However, it would be possible and maybe even useful to hack the kernel
-          *  to believe that some device has a different ID. If you do it, just
-          *  enable this piece of code.  --mj
+          *  We could read these faster from the config registers, but we want to give
+          *  the kernel a chance to fix up ID's and especially classes of broken devices.
           */
          d->vendor_id = sysfs_get_value(d, "vendor");
          d->device_id = sysfs_get_value(d, "device");
-         d->known_fields |= PCI_FILL_IDENT;
-#endif
+         d->device_class = sysfs_get_value(d, "class") >> 8;
+         d->known_fields = PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES;
        }
       pci_link_dev(a, d);
     }
@@ -222,10 +212,7 @@ static int sysfs_read(struct pci_dev *d, int pos, byte *buf, int len)
       return 0;
     }
   else if (res != len)
-    {
-      d->access->warning("sysfs_read: tried to read %d bytes at %d, but got only %d", len, pos, res);
-      return 0;
-    }
+    return 0;
   return 1;
 }
 
@@ -244,7 +231,7 @@ static int sysfs_write(struct pci_dev *d, int pos, byte *buf, int len)
     }
   else if (res != len)
     {
-      d->access->warning("sysfs_write: tried to write %d bytes at %d, but got only %d", len, pos, res);
+      d->access->warning("sysfs_write: tried to write %d bytes at %d, but only %d succeeded", len, pos, res);
       return 0;
     }
   return 1;
@@ -263,7 +250,8 @@ static void sysfs_cleanup_dev(struct pci_dev *d)
 }
 
 struct pci_methods pm_linux_sysfs = {
-  "Linux-sysfs",
+  "linux-sysfs",
+  "The sys filesystem on Linux",
   sysfs_config,
   sysfs_detect,
   sysfs_init,