static void sysfs_scan(struct pci_access *a) { char dirname[1024]; DIR *dir; struct dirent *entry; int n; n = snprintf(dirname, sizeof(dirname), "%s/devices", sysfs_name(a)); if (n < 0 || n >= (int) sizeof(dirname)) a->error("Directory name too long"); dir = opendir(dirname); if (!dir) a->error("Cannot open %s", dirname); while ((entry = readdir(dir))) { struct pci_dev *d; unsigned int dom, bus, dev, func; /* ".", ".." or a special non-device perhaps */ if (entry->d_name[0] == '.') continue; d = pci_alloc_dev(a); if (sscanf(entry->d_name, "%x:%x:%x.%d", &dom, &bus, &dev, &func) < 4) a->error("sysfs_scan: Couldn't parse entry name %s", entry->d_name); d->domain = dom; d->bus = bus; d->dev = dev; d->func = func; if (!a->buscentric) { 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 */ d->vendor_id = sysfs_get_value(d, "vendor"); d->device_id = sysfs_get_value(d, "device"); d->known_fields |= PCI_FILL_IDENT; #endif } pci_link_dev(a, d); } closedir(dir); }
static void sysfs_scan(struct pci_access *a) { char dirname[1024]; DIR *dir; struct dirent *entry; int n; n = snprintf(dirname, sizeof(dirname), "%s/devices", sysfs_name(a)); if (n < 0 || n >= (int) sizeof(dirname)) a->error("Directory name too long"); dir = opendir(dirname); if (!dir) a->error("Cannot open %s", dirname); while ((entry = readdir(dir))) { struct pci_dev *d; unsigned int dom, bus, dev, func; /* ".", ".." or a special non-device perhaps */ if (entry->d_name[0] == '.') continue; d = pci_alloc_dev(a); if (sscanf(entry->d_name, "%x:%x:%x.%d", &dom, &bus, &dev, &func) < 4) a->error("sysfs_scan: Couldn't parse entry name %s", entry->d_name); d->domain = dom; d->bus = bus; d->dev = dev; d->func = func; if (!a->buscentric) { sysfs_get_resources(d); d->irq = sysfs_get_value(d, "irq"); /* * 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->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); }