diff --git a/repos/dde_linux/README b/repos/dde_linux/README
index 00ae88a3e5..a2228aa5d7 100644
--- a/repos/dde_linux/README
+++ b/repos/dde_linux/README
@@ -9,7 +9,7 @@ Controller configuration
The driver can be started using different or all USB controller types a platform
offers (USB 1.0/2.0/3.0). Note that not all controllers are supported by all
platforms. Controllers can be enabled as attribute in the config node of the
-driver. Supported attributes are: 'uhci', 'ehci', and 'xhci'.
+driver. Supported attributes are: 'uhci', 'ohci', 'ehci', and 'xhci'.
Configuration snippet to enable UHCI and EHCI
@@ -40,7 +40,7 @@ Configuration snippet:
!
!
!
-!
+!
!
!
!
@@ -80,7 +80,7 @@ Configuration snippet:
!
!
!
-!
+!
Network (Nic)
@@ -119,7 +119,7 @@ Configuration snippet:
!
!
!
-!
+!
!
!
!
@@ -150,7 +150,7 @@ access the device 'usb-1-6':
!
!
!
-!
+!
!
!
!
diff --git a/repos/dde_linux/lib/mk/spec/x86/usb.inc b/repos/dde_linux/lib/mk/spec/x86/usb.inc
index 199f937947..bd7f3a9b81 100644
--- a/repos/dde_linux/lib/mk/spec/x86/usb.inc
+++ b/repos/dde_linux/lib/mk/spec/x86/usb.inc
@@ -1,4 +1,4 @@
-SRC_C += $(addprefix usb/host/,pci-quirks.c uhci-hcd.c ehci-pci.c)
+SRC_C += $(addprefix usb/host/,pci-quirks.c uhci-hcd.c ehci-pci.c ohci-hcd.c ohci-pci.c)
SRC_C += usb/core/hcd-pci.c
#
diff --git a/repos/dde_linux/ports/dde_linux.hash b/repos/dde_linux/ports/dde_linux.hash
index 2ff3fc02ff..5cbaa5f384 100644
--- a/repos/dde_linux/ports/dde_linux.hash
+++ b/repos/dde_linux/ports/dde_linux.hash
@@ -1 +1 @@
-ed9880704fad6f3d85514dd47b65a5eb7bfbf16f
+bf950a363006ca4414e3cbb7d96b4e9b009d788b
diff --git a/repos/dde_linux/run/usb_hid.run b/repos/dde_linux/run/usb_hid.run
index 1d3db4a068..379a5bc619 100644
--- a/repos/dde_linux/run/usb_hid.run
+++ b/repos/dde_linux/run/usb_hid.run
@@ -115,7 +115,7 @@ append config {
-
+
diff --git a/repos/dde_linux/run/usb_net.run b/repos/dde_linux/run/usb_net.run
index 1ae8b3991a..7db1af4d00 100644
--- a/repos/dde_linux/run/usb_net.run
+++ b/repos/dde_linux/run/usb_net.run
@@ -59,7 +59,7 @@ set config {
-
+
diff --git a/repos/dde_linux/run/usb_storage.run b/repos/dde_linux/run/usb_storage.run
index fce5e8aebe..8eae6a82d5 100644
--- a/repos/dde_linux/run/usb_storage.run
+++ b/repos/dde_linux/run/usb_storage.run
@@ -66,7 +66,7 @@ append config {
-
+
diff --git a/repos/dde_linux/run/usb_terminal.run b/repos/dde_linux/run/usb_terminal.run
index 25330cb1d1..fc214fc852 100644
--- a/repos/dde_linux/run/usb_terminal.run
+++ b/repos/dde_linux/run/usb_terminal.run
@@ -73,7 +73,7 @@ append config {
-
+
diff --git a/repos/dde_linux/src/include/lx_emul/byteorder.h b/repos/dde_linux/src/include/lx_emul/byteorder.h
index e10018aaa3..967dfe2019 100644
--- a/repos/dde_linux/src/include/lx_emul/byteorder.h
+++ b/repos/dde_linux/src/include/lx_emul/byteorder.h
@@ -37,7 +37,9 @@
#define cpu_to_le16s __cpu_to_le16s
#define cpu_to_be16 __cpu_to_be16
#define cpu_to_le32 __cpu_to_le32
+#define cpu_to_le32p __cpu_to_le32p
#define cpu_to_be32 __cpu_to_be32
+#define cpu_to_be32p __cpu_to_be32p
#define cpu_to_le32s __cpu_to_le32s
#define cpu_to_le64 __cpu_to_le64
#define le16_to_cpup __le16_to_cpup
diff --git a/repos/dde_linux/src/lib/usb/include/lx_emul.h b/repos/dde_linux/src/lib/usb/include/lx_emul.h
index f48bb0a548..40431557a7 100644
--- a/repos/dde_linux/src/lib/usb/include/lx_emul.h
+++ b/repos/dde_linux/src/lib/usb/include/lx_emul.h
@@ -1518,6 +1518,7 @@ enum {
GFP_NOWAIT = 0x2000000u,
};
+unsigned long get_zeroed_page(gfp_t gfp_mask);
unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order);
#define __get_free_page(gfp_mask) __get_free_pages((gfp_mask), 0)
diff --git a/repos/dde_linux/src/lib/usb/include/platform.h b/repos/dde_linux/src/lib/usb/include/platform.h
index 5189ce2c1c..492fb55a4b 100644
--- a/repos/dde_linux/src/lib/usb/include/platform.h
+++ b/repos/dde_linux/src/lib/usb/include/platform.h
@@ -35,6 +35,7 @@ struct Services
/* Controller types */
bool uhci = false; /* 1.0 */
+ bool ohci = false;
bool ehci = false; /* 2.0 */
bool xhci = false; /* 3.0 */
@@ -105,6 +106,11 @@ struct Services
log("Enabled UHCI (USB 1.0/1.1) support");
}
+ if (config_node.attribute_value("ohci", false)) {
+ ohci = true;
+ log("Enabled OHCI (USB 1.0/1.1) support");
+ }
+
if (config_node.attribute_value("ehci", false)) {
ehci = true;
log("Enabled EHCI (USB 2.0) support");
@@ -115,9 +121,9 @@ struct Services
log("Enabled XHCI (USB 3.0) support");
}
- if (!(uhci | ehci | xhci))
+ if (!(uhci | ohci | ehci | xhci))
warning("Warning: No USB controllers enabled.\n"
- "Use in your 'usb_drv' configuration");
+ "Use in your 'usb_drv' configuration");
}
};
diff --git a/repos/dde_linux/src/lib/usb/lx_emul.cc b/repos/dde_linux/src/lib/usb/lx_emul.cc
index 4f95fed70d..98ccc9e141 100644
--- a/repos/dde_linux/src/lib/usb/lx_emul.cc
+++ b/repos/dde_linux/src/lib/usb/lx_emul.cc
@@ -256,6 +256,16 @@ void *memscan(void *addr, int c, size_t size)
}
+/*****************
+ ** linux/gfp.h **
+ *****************/
+
+unsigned long get_zeroed_page(gfp_t gfp_mask)
+{
+ return (unsigned long)kzalloc(PAGE_SIZE, 0);
+}
+
+
/******************
** linux/log2.h **
******************/
diff --git a/repos/dde_linux/src/lib/usb/raw/raw.cc b/repos/dde_linux/src/lib/usb/raw/raw.cc
index 8b906c7df1..afdb8c6be0 100644
--- a/repos/dde_linux/src/lib/usb/raw/raw.cc
+++ b/repos/dde_linux/src/lib/usb/raw/raw.cc
@@ -786,11 +786,13 @@ class Usb::Root : public Genode::Root_component
bool const uhci = config.attribute_value("uhci", false);
bool const ehci = config.attribute_value("ehci", false);
bool const xhci = config.attribute_value("xhci", false);
+ bool const ohci = config.attribute_value("ohci", false);
Genode::Reporter::Xml_generator xml(_config_reporter, [&] {
if (uhci) xml.attribute("uhci", "yes");
if (ehci) xml.attribute("ehci", "yes");
if (xhci) xml.attribute("xhci", "yes");
+ if (ohci) xml.attribute("ohci", "yes");
xml.append(config.content_base(), config.content_size());
});
diff --git a/repos/dde_linux/src/lib/usb/spec/x86/platform.cc b/repos/dde_linux/src/lib/usb/spec/x86/platform.cc
index 77a3fb4eee..ac623a78b7 100644
--- a/repos/dde_linux/src/lib/usb/spec/x86/platform.cc
+++ b/repos/dde_linux/src/lib/usb/spec/x86/platform.cc
@@ -18,6 +18,8 @@ extern "C" void module_ax88179_178a_driver_init();
extern "C" void module_usbnet_init();
extern "C" void module_ehci_hcd_init();
extern "C" void module_ehci_pci_init();
+extern "C" void module_ohci_hcd_mod_init();
+extern "C" void module_ohci_pci_init();
extern "C" void module_uhci_hcd_init();
extern "C" void module_xhci_hcd_init();
extern "C" void module_xhci_pci_init();
@@ -40,6 +42,12 @@ void platform_hcd_init(Services *s)
module_ehci_pci_init();
}
- if (s->uhci)
+ if (s->ohci) {
+ module_ohci_hcd_mod_init();
+ module_ohci_pci_init();
+ }
+
+ if (s->uhci) {
module_uhci_hcd_init();
+ }
}
diff --git a/repos/dde_linux/usb.list b/repos/dde_linux/usb.list
index d68057c2ef..978308a33b 100644
--- a/repos/dde_linux/usb.list
+++ b/repos/dde_linux/usb.list
@@ -68,6 +68,13 @@ linux-4.4.3/drivers/usb/host/ehci-q.c
linux-4.4.3/drivers/usb/host/ehci-sched.c
linux-4.4.3/drivers/usb/host/ehci-sysfs.c
linux-4.4.3/drivers/usb/host/ehci-timer.c
+linux-4.4.3/drivers/usb/host/ohci-hcd.c
+linux-4.4.3/drivers/usb/host/ohci.h
+linux-4.4.3/drivers/usb/host/ohci-hub.c
+linux-4.4.3/drivers/usb/host/ohci-dbg.c
+linux-4.4.3/drivers/usb/host/ohci-mem.c
+linux-4.4.3/drivers/usb/host/ohci-q.c
+linux-4.4.3/drivers/usb/host/ohci-pci.c
linux-4.4.3/drivers/usb/host/pci-quirks.h
linux-4.4.3/drivers/usb/host/pci-quirks.c
linux-4.4.3/drivers/usb/host/uhci-debug.c