]> xenbits.xensource.com Git - people/andrewcoop/seabios.git/commitdiff
Convert USB detection code to use struct pci_device.
authorKevin O'Connor <kevin@koconnor.net>
Tue, 21 Jun 2011 02:23:02 +0000 (22:23 -0400)
committerKevin O'Connor <kevin@koconnor.net>
Tue, 21 Jun 2011 03:58:04 +0000 (23:58 -0400)
src/pci.h
src/usb.c

index a214bb1170190d86752a29fe847887790ad5e7a9..7aa2dfeb60f466489232e8fa3978baeb37e9a1fa 100644 (file)
--- a/src/pci.h
+++ b/src/pci.h
@@ -52,6 +52,9 @@ struct pci_device {
 extern struct pci_device *PCIDevices;
 extern int MaxPCIBus;
 void pci_probe(void);
+static inline u32 pci_classprog(struct pci_device *pci) {
+    return (pci->class << 8) | pci->prog_if;
+}
 
 #define foreachpci(PCI)                         \
     for (PCI=PCIDevices; PCI; PCI=PCI->next)
index 454e2d45d47727411bbcf127a525df8d8803e3ab..26d1017bda5e827adb9c0b220678b3da4ffdba7e 100644 (file)
--- a/src/usb.c
+++ b/src/usb.c
@@ -5,7 +5,7 @@
 // This file may be distributed under the terms of the GNU LGPLv3 license.
 
 #include "util.h" // dprintf
-#include "pci.h" // foreachbdf
+#include "pci.h" // foreachpci
 #include "config.h" // CONFIG_*
 #include "pci_regs.h" // PCI_CLASS_REVISION
 #include "pci_ids.h" // PCI_CLASS_SERIAL_USB_UHCI
@@ -428,46 +428,41 @@ usb_setup(void)
     dprintf(3, "init usb\n");
 
     // Look for USB controllers
-    int ehcibdf = -1;
     int count = 0;
-    int bdf, max;
-    foreachbdf(bdf, max) {
-        u32 code = pci_config_readl(bdf, PCI_CLASS_REVISION) >> 8;
-
-        if (code >> 8 != PCI_CLASS_SERIAL_USB)
+    struct pci_device *ehcipci = PCIDevices;
+    struct pci_device *pci;
+    foreachpci(pci) {
+        if (pci->class != PCI_CLASS_SERIAL_USB)
             continue;
 
-        if (bdf > ehcibdf) {
+        if (pci->bdf >= ehcipci->bdf) {
             // Check to see if this device has an ehci controller
-            ehcibdf = bdf;
-            u32 ehcicode = code;
             int found = 0;
+            ehcipci = pci;
             for (;;) {
-                if (ehcicode == PCI_CLASS_SERIAL_USB_EHCI) {
+                if (pci_classprog(ehcipci) == PCI_CLASS_SERIAL_USB_EHCI) {
                     // Found an ehci controller.
-                    int ret = ehci_init(ehcibdf, count++, bdf);
+                    int ret = ehci_init(ehcipci->bdf, count++, pci->bdf);
                     if (ret)
                         // Error
                         break;
                     count += found;
-                    bdf = ehcibdf;
-                    code = 0;
+                    pci = ehcipci;
                     break;
                 }
-                if (ehcicode >> 8 == PCI_CLASS_SERIAL_USB)
+                if (ehcipci->class == PCI_CLASS_SERIAL_USB)
                     found++;
-                ehcibdf = pci_next(ehcibdf+1, &max);
-                if (ehcibdf < 0
-                    || pci_bdf_to_busdev(ehcibdf) != pci_bdf_to_busdev(bdf))
+                ehcipci = ehcipci->next;
+                if (!ehcipci || (pci_bdf_to_busdev(ehcipci->bdf)
+                                 != pci_bdf_to_busdev(pci->bdf)))
                     // No ehci controller found.
                     break;
-                ehcicode = pci_config_readl(ehcibdf, PCI_CLASS_REVISION) >> 8;
             }
         }
 
-        if (code == PCI_CLASS_SERIAL_USB_UHCI)
-            uhci_init(bdf, count++);
-        else if (code == PCI_CLASS_SERIAL_USB_OHCI)
-            ohci_init(bdf, count++);
+        if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_UHCI)
+            uhci_init(pci->bdf, count++);
+        else if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_OHCI)
+            ohci_init(pci->bdf, count++);
     }
 }