X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=lib%2Fsysfs.c;h=ea386fa8fbdfbf4a7dd616ef8469eed2c4bed7a7;hb=69388a6a3cc4c615ac89b9b298c8e70a6ba6e311;hp=c0cf5a3bfef5202db1f69a689fbee9811e03b0ef;hpb=84c8d1bba90d5f9857b0724ebf6a35045ca3f30f;p=pciutils.git diff --git a/lib/sysfs.c b/lib/sysfs.c index c0cf5a3..ea386fa 100644 --- a/lib/sysfs.c +++ b/lib/sysfs.c @@ -2,7 +2,7 @@ * The PCI Library -- Configuration Access via /sys/bus/pci * * Copyright (c) 2003 Matthew Wilcox - * Copyright (c) 1997--2003 Martin Mares + * Copyright (c) 1997--2008 Martin Mares * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -25,13 +25,13 @@ 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,