[SeaBIOS] [PATCH 09/10] Convert USB detection code to use struct pci_device.
Kevin O'Connor
kevin at koconnor.net
Tue Jun 21 05:59:21 CEST 2011
---
src/pci.h | 3 +++
src/usb.c | 41 ++++++++++++++++++-----------------------
2 files changed, 21 insertions(+), 23 deletions(-)
diff --git a/src/pci.h b/src/pci.h
index a214bb1..7aa2dfe 100644
--- 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)
diff --git a/src/usb.c b/src/usb.c
index 454e2d4..26d1017 100644
--- 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++);
}
}
--
1.7.4.4
More information about the SeaBIOS
mailing list