diff --git a/ChangeLog b/ChangeLog
index 52e728f3d..eb8bd7a44 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/bus/pci.c b/bus/pci.c
index a091f4982..2c29c03ab 100644
--- a/bus/pci.c
+++ b/bus/pci.c
@@ -34,12 +34,13 @@ grub_pci_iterate (grub_pci_iteratefunc_t hook)
   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);
@@ -50,6 +51,15 @@ grub_pci_iterate (grub_pci_iteratefunc_t hook)
 
 	      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;
+		}
 	    }
 	}
     }