aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2016-02-02 14:28:13 -0500
committerKevin O'Connor <kevin@koconnor.net>2016-02-02 22:36:41 -0500
commit32a2b0e38cdd97ad8b0dc988e8114d191801b9e5 (patch)
treeedd04d5db11fed54ce4d5fac61988aba46e0801b
parente518c0fd03172686d455318338c82acf4fd560ef (diff)
downloadseabios-hppa-32a2b0e38cdd97ad8b0dc988e8114d191801b9e5.zip
seabios-hppa-32a2b0e38cdd97ad8b0dc988e8114d191801b9e5.tar.gz
seabios-hppa-32a2b0e38cdd97ad8b0dc988e8114d191801b9e5.tar.bz2
ehci: Only delay UHCI/OHCI port scan until after EHCI setup completes
EHCI controller setup needs to occur prior to checking any UHCI or OHCI ports to ensure a high speed device is not mistakenly configured on a full speed "companion" controller. However, only the UHCI/OHCI port scan needs to be delayed, not the full UHCI/OHCI controller init. This change moves back the ehci controller setup check until port scan in UHCI/OHCI. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--src/hw/usb-ehci.c10
-rw-r--r--src/hw/usb-ehci.h1
-rw-r--r--src/hw/usb-ohci.c3
-rw-r--r--src/hw/usb-uhci.c4
4 files changed, 15 insertions, 3 deletions
diff --git a/src/hw/usb-ehci.c b/src/hw/usb-ehci.c
index 41f8579..a502d36 100644
--- a/src/hw/usb-ehci.c
+++ b/src/hw/usb-ehci.c
@@ -337,10 +337,14 @@ ehci_setup(void)
if (pci_classprog(pci) == PCI_CLASS_SERIAL_USB_EHCI)
ehci_controller_setup(pci);
}
+}
- // Wait for all EHCI controllers to initialize. This forces OHCI/UHCI
- // setup to always be after any EHCI ports are routed to EHCI.
- while (PendingEHCI)
+// Wait for all EHCI controllers to initialize. This forces OHCI/UHCI
+// setup to always be after any EHCI ports are routed to EHCI.
+void
+ehci_wait_controllers(void)
+{
+ while (CONFIG_USB_EHCI && CONFIG_THREADS && PendingEHCI)
yield();
}
diff --git a/src/hw/usb-ehci.h b/src/hw/usb-ehci.h
index 88f7b6a..0442188 100644
--- a/src/hw/usb-ehci.h
+++ b/src/hw/usb-ehci.h
@@ -3,6 +3,7 @@
// usb-ehci.c
void ehci_setup(void);
+void ehci_wait_controllers(void);
struct usbdevice_s;
struct usb_endpoint_descriptor;
struct usb_pipe;
diff --git a/src/hw/usb-ohci.c b/src/hw/usb-ohci.c
index 42f8a06..7ed964f 100644
--- a/src/hw/usb-ohci.c
+++ b/src/hw/usb-ohci.c
@@ -14,6 +14,7 @@
#include "pci_regs.h" // PCI_BASE_ADDRESS_0
#include "string.h" // memset
#include "usb.h" // struct usb_s
+#include "usb-ehci.h" // ehci_wait_controllers
#include "usb-ohci.h" // struct ohci_hcca
#include "util.h" // msleep
#include "x86.h" // readl
@@ -96,6 +97,8 @@ static int
check_ohci_ports(struct usb_ohci_s *cntl)
{
ASSERT32FLAT();
+ // Wait for ehci init - in case this is a "companion controller"
+ ehci_wait_controllers();
// Turn on power for all devices on roothub.
u32 rha = readl(&cntl->regs->roothub_a);
rha &= ~(RH_A_PSM | RH_A_OCPM);
diff --git a/src/hw/usb-uhci.c b/src/hw/usb-uhci.c
index 69c33ee..6d8aa47 100644
--- a/src/hw/usb-uhci.c
+++ b/src/hw/usb-uhci.c
@@ -13,6 +13,7 @@
#include "pci_regs.h" // PCI_BASE_ADDRESS_4
#include "string.h" // memset
#include "usb.h" // struct usb_s
+#include "usb-ehci.h" // ehci_wait_controllers
#include "usb-uhci.h" // USBLEGSUP
#include "util.h" // msleep
#include "x86.h" // outw
@@ -94,6 +95,9 @@ static int
check_uhci_ports(struct usb_uhci_s *cntl)
{
ASSERT32FLAT();
+ // Wait for ehci init - in case this is a "companion controller"
+ ehci_wait_controllers();
+
struct usbhub_s hub;
memset(&hub, 0, sizeof(hub));
hub.cntl = &cntl->usb;