+2008-04-05 Pavel Roskin <proski@gnu.org>
+
+ * bus/pci.c (grub_pci_iterate): For multifunction devices, probe
+ all 8 functions. Otherwise, probe function 0 only.
+
2008-04-04 Pavel Roskin <proski@gnu.org>
* commands/lspci.c (grub_lspci_iter): Print the bus number
int func;
grub_pci_address_t addr;
grub_pci_id_t id;
+ grub_uint32_t hdr;
for (bus = 0; bus < 256; bus++)
{
for (dev = 0; dev < 32; dev++)
{
- for (func = 0; func < 3; func++)
+ for (func = 0; func < 8; func++)
{
addr = grub_pci_make_address (bus, dev, func, 0);
id = grub_pci_read (addr);
if (hook (bus, dev, func, id))
return;
+
+ /* Probe only func = 0 if the device if not multifunction */
+ if (func == 0)
+ {
+ addr = grub_pci_make_address (bus, dev, func, 3);
+ hdr = grub_pci_read (addr);
+ if (!(hdr & 0x800000))
+ break;
+ }
}
}
}