diff --git a/repos/dde_linux/lib/mk/spec/x86/usb.inc b/repos/dde_linux/lib/mk/spec/x86/usb.inc index 3f609d78cf..04bc44abb0 100644 --- a/repos/dde_linux/lib/mk/spec/x86/usb.inc +++ b/repos/dde_linux/lib/mk/spec/x86/usb.inc @@ -4,7 +4,7 @@ SRC_C += usb/core/hcd-pci.c # # USB netwpork support # -SRC_C += $(addprefix net/usb/, usbnet.c ax88179_178a.c cdc_ether.c) +SRC_C += $(addprefix net/usb/, usbnet.c ax88179_178a.c cdc_ether.c rndis_host.c) # XHCI SRC_C += usb/host/xhci-pci.c diff --git a/repos/dde_linux/patches/usb_rndis.patch b/repos/dde_linux/patches/usb_rndis.patch new file mode 100644 index 0000000000..8667e2716c --- /dev/null +++ b/repos/dde_linux/patches/usb_rndis.patch @@ -0,0 +1,30 @@ +diff -Nur a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c +--- a/drivers/net/usb/rndis_host.c ++++ b/drivers/net/usb/rndis_host.c +@@ -318,7 +318,7 @@ + unsigned char *bp; + + /* we can't rely on i/o from stack working, or stack allocation */ +- u.buf = kmalloc(CONTROL_BUFFER_SIZE, GFP_KERNEL); ++ u.buf = kzalloc(CONTROL_BUFFER_SIZE, GFP_KERNEL | GFP_LX_DMA); + if (!u.buf) + return -ENOMEM; + retval = usbnet_generic_cdc_bind(dev, intf); +@@ -475,7 +475,7 @@ + struct rndis_halt *halt; + + /* try to clear any rndis state/activity (no i/o from stack!) */ +- halt = kzalloc(CONTROL_BUFFER_SIZE, GFP_KERNEL); ++ halt = kzalloc(CONTROL_BUFFER_SIZE, GFP_KERNEL | GFP_LX_DMA); + if (halt) { + halt->msg_type = cpu_to_le32(RNDIS_MSG_HALT); + halt->msg_len = cpu_to_le32(sizeof *halt); +@@ -573,7 +573,7 @@ + * packets; Linux minimizes wasted bandwidth through tx queues. + */ + fill: +- hdr = (void *) __skb_push(skb, sizeof *hdr); ++ hdr = (void *) skb_push(skb, sizeof *hdr); + memset(hdr, 0, sizeof *hdr); + hdr->msg_type = cpu_to_le32(RNDIS_MSG_PACKET); + hdr->msg_len = cpu_to_le32(skb->len); diff --git a/repos/dde_linux/ports/dde_linux.hash b/repos/dde_linux/ports/dde_linux.hash index b19da56bd6..26a54fbe01 100644 --- a/repos/dde_linux/ports/dde_linux.hash +++ b/repos/dde_linux/ports/dde_linux.hash @@ -1 +1 @@ -570bd3cf50c3ae2307931ae9eb6bb706423167ef +7f835ced1dfbfc678eaabf532d3650f822a6897e diff --git a/repos/dde_linux/ports/dde_linux.port b/repos/dde_linux/ports/dde_linux.port index f7f924866e..51eec2b469 100644 --- a/repos/dde_linux/ports/dde_linux.port +++ b/repos/dde_linux/ports/dde_linux.port @@ -190,6 +190,7 @@ PATCH_OPT(patches/usb_csum.patch) := $(USB_OPT) PATCH_OPT(patches/usb_evdev.patch) := $(USB_OPT) PATCH_OPT(patches/usb_mem.patch) := $(USB_OPT) PATCH_OPT(patches/usb_usbnet.patch) := $(USB_OPT) +PATCH_OPT(patches/usb_rndis.patch) := $(USB_OPT) # INTEL FB PATCH_OPT(patches/intel_fb_export_api.patch) := -p1 -d$(SRC_DIR_INTEL_FB) diff --git a/repos/dde_linux/run/usb_rndis.run b/repos/dde_linux/run/usb_rndis.run new file mode 100644 index 0000000000..edba48bbce --- /dev/null +++ b/repos/dde_linux/run/usb_rndis.run @@ -0,0 +1,130 @@ +# +# \brief Test for using the TCP/IP terminal over USB (RNDIS, CDC_ETHER or USB NIC) +# \author Alexander Senier +# \date 2017-10-19 +# + +# +# Build +# + +set build_components { + core init + drivers/timer drivers/usb + server/tcp_terminal + test/terminal_echo +} + +proc gpio_drv { } { if {[have_spec rpi] && [have_spec hw]} { return hw_gpio_drv } + if {[have_spec rpi] && [have_spec foc]} { return foc_gpio_drv } + return gpio_drv } + +source ${genode_dir}/repos/base/run/platform_drv.inc +append_platform_drv_build_components + +lappend_if [have_spec gpio] build_components drivers/gpio + +build $build_components + +create_boot_directory + +# +# Generate config +# + +set config { + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + } + +append_platform_drv_config + +append_if [have_spec gpio] config " + + + + + " + +append config { + +} + +install_config $config + +# +# Boot modules +# + +# generic modules +set boot_modules { + core ld.lib.so init timer usb_drv + libc.lib.so libc_pipe.lib.so lwip.lib.so pthread.lib.so + tcp_terminal + test-terminal_echo +} + +append_platform_drv_boot_modules +lappend_if [have_spec gpio] boot_modules [gpio_drv] + +build_boot_image $boot_modules + +append qemu_args " -device usb-ehci,id=ehci" + +# Samsung RNDIS (tested with S5, Galaxy Tab S +append qemu_args " -device usb-host,bus=ehci.0,vendorid=0x04e8,productid=0x6860" +append qemu_args " -device usb-host,bus=ehci.0,vendorid=0x04e8,productid=0x6863" +append qemu_args " -device usb-host,bus=ehci.0,vendorid=0x04e8,productid=0x6864" + +# ASIX Electronics Corp. AX88179 Gigabit Ethernet +append qemu_args " -device usb-host,bus=ehci.0,vendorid=0x0b95,productid=0x1790" + +# Motorola Moto E +append qemu_args " -device usb-host,id=motoe,bus=ehci.0,vendorid=0x22b8,productid=0x2e25" + +append qemu_args " -nographic" + +run_genode_until forever + +# vi: set ft=tcl : diff --git a/repos/dde_linux/src/include/lx_emul/errno.h b/repos/dde_linux/src/include/lx_emul/errno.h index b2e08920a4..e0d0a5d24b 100644 --- a/repos/dde_linux/src/include/lx_emul/errno.h +++ b/repos/dde_linux/src/include/lx_emul/errno.h @@ -102,6 +102,8 @@ enum { ETIME = 209, EPROBE_DEFER = 210, + EL3RST = 211, + MAX_ERRNO = 4095, }; 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 1b0a5f31bc..7d7fcd4cb7 100644 --- a/repos/dde_linux/src/lib/usb/spec/x86/platform.cc +++ b/repos/dde_linux/src/lib/usb/spec/x86/platform.cc @@ -16,6 +16,7 @@ extern "C" void module_ax88179_178a_driver_init(); extern "C" void module_cdc_driver_init(); +extern "C" void module_rndis_driver_init(); extern "C" void module_usbnet_init(); extern "C" void module_ehci_hcd_init(); extern "C" void module_ehci_pci_init(); @@ -31,6 +32,7 @@ void platform_hcd_init(Services *s) module_usbnet_init(); module_ax88179_178a_driver_init(); module_cdc_driver_init(); + module_rndis_driver_init(); } if (s->xhci) { diff --git a/repos/dde_linux/usb.list b/repos/dde_linux/usb.list index e4be263837..2327b7633a 100644 --- a/repos/dde_linux/usb.list +++ b/repos/dde_linux/usb.list @@ -22,6 +22,7 @@ linux-x.x.x/drivers/net/usb/asix.h linux-x.x.x/drivers/net/usb/ax88172a.c linux-x.x.x/drivers/net/usb/ax88179_178a.c linux-x.x.x/drivers/net/usb/cdc_ether.c +linux-x.x.x/drivers/net/usb/rndis_host.c linux-x.x.x/drivers/net/usb/smsc95xx.h linux-x.x.x/drivers/net/usb/smsc95xx.c linux-x.x.x/drivers/net/usb/usbnet.c @@ -144,6 +145,7 @@ linux-x.x.x/include/linux/netdev_features.h linux-x.x.x/include/linux/pci_ids.h linux-x.x.x/include/linux/platform_data/usb-omap.h linux-x.x.x/include/linux/power_supply.h +linux-x.x.x/include/linux/rndis.h linux-x.x.x/include/linux/swab.h linux-x.x.x/include/linux/usb.h linux-x.x.x/include/linux/usb_usual.h @@ -153,6 +155,7 @@ linux-x.x.x/include/linux/usb/ehci-dbgp.h linux-x.x.x/include/linux/usb/ehci_def.h linux-x.x.x/include/linux/usb/hcd.h linux-x.x.x/include/linux/usb/input.h +linux-x.x.x/include/linux/usb/rndis_host.h linux-x.x.x/include/linux/io-64-nonatomic-lo-hi.h linux-x.x.x/include/linux/usb/otg.h linux-x.x.x/include/linux/usb/phy.h