* 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
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;
{
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);
}
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;
}
}
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;
}
struct pci_methods pm_linux_sysfs = {
- "Linux-sysfs",
+ "linux-sysfs",
+ "The sys filesystem on Linux",
sysfs_config,
sysfs_detect,
sysfs_init,