--- pciutils-2.2.1/lib/sysfs.c.devicetype 2005-09-21 07:51:00.000000000 -0400 +++ pciutils-2.2.1/lib/sysfs.c 2005-12-13 17:02:12.000000000 -0500 @@ -164,7 +164,6 @@ 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 @@ -173,8 +172,8 @@ */ 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_link_dev(a, d); } --- pciutils-2.2.1/lib/pci.h.devicetype 2005-09-10 08:10:54.000000000 -0400 +++ pciutils-2.2.1/lib/pci.h 2005-12-13 17:02:12.000000000 -0500 @@ -84,6 +84,7 @@ /* These fields are set by pci_fill_info() */ int known_fields; /* Set of info fields already known */ u16 vendor_id, device_id; /* Identity of the device */ + u16 device_class; /* PCI device class */ int irq; /* IRQ number */ pciaddr_t base_addr[6]; /* Base addresses */ pciaddr_t size[6]; /* Region sizes */ @@ -118,6 +119,7 @@ #define PCI_FILL_BASES 4 #define PCI_FILL_ROM_BASE 8 #define PCI_FILL_SIZES 16 +#define PCI_FILL_CLASS 32 #define PCI_FILL_RESCAN 0x10000 void pci_setup_cache(struct pci_dev *, u8 *cache, int len); --- pciutils-2.2.1/lib/generic.c.devicetype 2004-08-13 16:15:23.000000000 -0400 +++ pciutils-2.2.1/lib/generic.c 2005-12-13 17:02:12.000000000 -0500 @@ -46,7 +46,8 @@ d->func = t->func; d->vendor_id = vd & 0xffff; d->device_id = vd >> 16U; - d->known_fields = PCI_FILL_IDENT; + d->device_class = pci_read_byte(t,PCI_CLASS_DEVICE+1) << 8 | pci_read_byte(t, PCI_CLASS_DEVICE); + d->known_fields = PCI_FILL_IDENT | PCI_FILL_CLASS; d->hdrtype = ht; pci_link_dev(a, d); switch (ht) @@ -86,6 +87,8 @@ d->vendor_id = pci_read_word(d, PCI_VENDOR_ID); d->device_id = pci_read_word(d, PCI_DEVICE_ID); } + if (flags & PCI_FILL_CLASS) + d->device_class = pci_read_byte(d, PCI_CLASS_DEVICE+1) << 8 | pci_read_byte(d, PCI_CLASS_DEVICE); if (flags & PCI_FILL_IRQ) d->irq = pci_read_byte(d, PCI_INTERRUPT_LINE); if (flags & PCI_FILL_BASES) --- pciutils-2.2.1/lib/example.c.devicetype 2000-03-09 03:38:33.000000000 -0500 +++ pciutils-2.2.1/lib/example.c 2005-12-13 17:02:12.000000000 -0500 @@ -21,7 +21,7 @@ pci_scan_bus(pacc); /* We want to get the list of devices */ for(dev=pacc->devices; dev; dev=dev->next) /* Iterate over all devices */ { - pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES); /* Fill in header info we need */ + pci_fill_info(dev, PCI_FILL_IDENT | PCI_FILL_BASES | PCI_FILL_CLASS); /* Fill in header info we need */ c = pci_read_word(dev, PCI_CLASS_DEVICE); /* Read config register directly */ printf("%02x:%02x.%d vendor=%04x device=%04x class=%04x irq=%d base0=%lx\n", dev->bus, dev->dev, dev->func, dev->vendor_id, dev->device_id, --- pciutils-2.2.1/lspci.c.devicetype 2005-11-26 06:48:29.000000000 -0500 +++ pciutils-2.2.1/lspci.c 2005-12-13 17:04:39.000000000 -0500 @@ -123,7 +123,7 @@ d->config_cached += 64; } pci_setup_cache(p, d->config, d->config_cached); - pci_fill_info(p, PCI_FILL_IDENT | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES); + pci_fill_info(p, PCI_FILL_IDENT | PCI_FILL_CLASS | PCI_FILL_IRQ | PCI_FILL_BASES | PCI_FILL_ROM_BASE | PCI_FILL_SIZES); return d; } @@ -255,7 +255,7 @@ printf(" %s: %s", pci_lookup_name(pacc, classbuf, sizeof(classbuf), PCI_LOOKUP_CLASS, - get_conf_word(d, PCI_CLASS_DEVICE)), + p->device_class), pci_lookup_name(pacc, devbuf, sizeof(devbuf), PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE, p->vendor_id, p->device_id)); @@ -267,7 +267,7 @@ c = get_conf_byte(d, PCI_CLASS_PROG); x = pci_lookup_name(pacc, devbuf, sizeof(devbuf), PCI_LOOKUP_PROGIF | PCI_LOOKUP_NO_NUMBERS, - get_conf_word(d, PCI_CLASS_DEVICE), c); + p->device_class, c); if (c || x) { printf(" (prog-if %02x", c); @@ -1585,7 +1585,7 @@ struct pci_dev *p = d->dev; word status = get_conf_word(d, PCI_STATUS); word cmd = get_conf_word(d, PCI_COMMAND); - word class = get_conf_word(d, PCI_CLASS_DEVICE); + word class = p->device_class; byte bist = get_conf_byte(d, PCI_BIST); byte htype = get_conf_byte(d, PCI_HEADER_TYPE) & 0x7f; byte latency = get_conf_byte(d, PCI_LATENCY_TIMER); @@ -1783,7 +1783,7 @@ show_slot_name(d); putchar('\n'); printf("Class:\t%s\n", - pci_lookup_name(pacc, classbuf, sizeof(classbuf), PCI_LOOKUP_CLASS, get_conf_word(d, PCI_CLASS_DEVICE))); + pci_lookup_name(pacc, classbuf, sizeof(classbuf), PCI_LOOKUP_CLASS, p->device_class)); printf("Vendor:\t%s\n", pci_lookup_name(pacc, vendbuf, sizeof(vendbuf), PCI_LOOKUP_VENDOR, p->vendor_id, p->device_id)); printf("Device:\t%s\n", @@ -1805,7 +1805,7 @@ show_slot_name(d); printf(" \"%s\" \"%s\" \"%s\"", pci_lookup_name(pacc, classbuf, sizeof(classbuf), PCI_LOOKUP_CLASS, - get_conf_word(d, PCI_CLASS_DEVICE)), + p->device_class), pci_lookup_name(pacc, vendbuf, sizeof(vendbuf), PCI_LOOKUP_VENDOR, p->vendor_id, p->device_id), pci_lookup_name(pacc, devbuf, sizeof(devbuf), PCI_LOOKUP_DEVICE, @@ -1929,7 +1929,7 @@ last_br = &host_bridge.chain; for(d=first_dev; d; d=d->next) { - word class = get_conf_word(d, PCI_CLASS_DEVICE); + word class = d->dev->device_class; byte ht = get_conf_byte(d, PCI_HEADER_TYPE) & 0x7f; if (class == PCI_CLASS_BRIDGE_PCI && (ht == PCI_HEADER_TYPE_BRIDGE || ht == PCI_HEADER_TYPE_CARDBUS))