Index: uspace/drv/bus/usb/ehci/hw_struct/queue_head.c
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/drv/bus/usb/ehci/hw_struct/queue_head.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -79,11 +79,10 @@
 	}
 
-	// TODO Fix 'multi' 1 packet should be safe. Probably won't work
-	// without enabling parking mode in async schedule
 	// TODO Figure out how to correctly use CMASK and SMASK for LS/FS
 	// INT transfers. Current values are just guesses
-	/* Setting TT stuff on HS endpoints is OK, the fields are ignored */
+	/* Setting TT stuff on HS endpoints is OK, the fields are ignored,
+	 * and so is setting multi on async (should be 1 anyway)*/
 	EHCI_MEM32_WR(instance->ep_cap,
-	    QH_EP_CAP_MULTI_SET(1) |
+	    QH_EP_CAP_MULTI_SET(ep->packets) |
 	    QH_EP_CAP_TT_PORT_SET(ep->tt.port) |
 	    QH_EP_CAP_TT_ADDR_SET(ep->tt.address) |
Index: uspace/drv/bus/usb/ehci/hw_struct/queue_head.h
===================================================================
--- uspace/drv/bus/usb/ehci/hw_struct/queue_head.h	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/drv/bus/usb/ehci/hw_struct/queue_head.h	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -39,4 +39,5 @@
 #include <usb/host/endpoint.h>
 
+#include "../utils/malloc32.h"
 #include "link_pointer.h"
 #include "mem_access.h"
Index: uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c
===================================================================
--- uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/drv/bus/usb/ohci/hw_struct/endpoint_descriptor.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -63,5 +63,5 @@
 {
 	assert(instance);
-	memset(instance, 0, sizeof(ed_t));
+	memset(instance, 0, sizeof(*instance));
 
 	if (ep == NULL) {
Index: uspace/lib/drv/generic/remote_usb.c
===================================================================
--- uspace/lib/drv/generic/remote_usb.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/drv/generic/remote_usb.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -161,17 +161,25 @@
 }
 
+int static_assert[sizeof(sysarg_t) >= 4 ? 1 : -1];
+typedef union {
+	uint8_t arr[sizeof(sysarg_t)];
+	sysarg_t arg;
+} pack8_t;
+
 int usb_register_endpoint(async_exch_t *exch, usb_endpoint_t endpoint,
     usb_transfer_type_t type, usb_direction_t direction,
-    size_t mps, unsigned interval)
-{
-	if (!exch)
-		return EBADMEM;
-#define _PACK2(high, low) (((high & 0xffff) << 16) | (low & 0xffff))
+    size_t mps, unsigned packets, unsigned interval)
+{
+	if (!exch)
+		return EBADMEM;
+	pack8_t pack;
+	pack.arr[0] = type;
+	pack.arr[1] = direction;
+	pack.arr[2] = interval;
+	pack.arr[3] = packets;
 
 	return async_req_4_0(exch, DEV_IFACE_ID(USB_DEV_IFACE),
-	    IPC_M_USB_REGISTER_ENDPOINT, endpoint,
-	    _PACK2(type, direction), _PACK2(mps, interval));
-
-#undef _PACK2
+	    IPC_M_USB_REGISTER_ENDPOINT, endpoint, pack.arg, mps);
+
 }
 
@@ -408,22 +416,15 @@
 	}
 
-#define _INIT_FROM_HIGH_DATA2(type, var, arg_no) \
-	type var = (type) (DEV_IPC_GET_ARG##arg_no(*call) >> 16)
-#define _INIT_FROM_LOW_DATA2(type, var, arg_no) \
-	type var = (type) (DEV_IPC_GET_ARG##arg_no(*call) & 0xffff)
-
 	const usb_endpoint_t endpoint = DEV_IPC_GET_ARG1(*call);
-
-	_INIT_FROM_HIGH_DATA2(usb_transfer_type_t, transfer_type, 2);
-	_INIT_FROM_LOW_DATA2(usb_direction_t, direction, 2);
-
-	_INIT_FROM_HIGH_DATA2(size_t, max_packet_size, 3);
-	_INIT_FROM_LOW_DATA2(unsigned int, interval, 3);
-
-#undef _INIT_FROM_HIGH_DATA2
-#undef _INIT_FROM_LOW_DATA2
+	const pack8_t pack = { .arg = DEV_IPC_GET_ARG2(*call)};
+	const size_t max_packet_size = DEV_IPC_GET_ARG3(*call);
+
+	const usb_transfer_type_t transfer_type = pack.arr[0];
+	const usb_direction_t direction = pack.arr[1];
+	unsigned packets = pack.arr[2];
+	unsigned interval = pack.arr[3];
 
 	const int ret = usb_iface->register_endpoint(fun, endpoint,
-	    transfer_type, direction, max_packet_size, interval);
+	    transfer_type, direction, max_packet_size, packets, interval);
 
 	async_answer_0(callid, ret);
Index: uspace/lib/drv/include/usb_iface.h
===================================================================
--- uspace/lib/drv/include/usb_iface.h	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/drv/include/usb_iface.h	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -58,5 +58,5 @@
 
 int usb_register_endpoint(async_exch_t *, usb_endpoint_t, usb_transfer_type_t,
-    usb_direction_t, size_t, unsigned);
+    usb_direction_t, size_t, unsigned, unsigned);
 int usb_unregister_endpoint(async_exch_t *, usb_endpoint_t, usb_direction_t);
 int usb_read(async_exch_t *, usb_endpoint_t, uint64_t, void *, size_t, size_t *);
@@ -81,5 +81,5 @@
 
 	int (*register_endpoint)(ddf_fun_t *, usb_endpoint_t,
-	    usb_transfer_type_t, usb_direction_t, size_t, unsigned);
+	    usb_transfer_type_t, usb_direction_t, size_t, unsigned, unsigned);
 	int (*unregister_endpoint)(ddf_fun_t *, usb_endpoint_t,
 	    usb_direction_t);
Index: uspace/lib/usb/include/usb/descriptor.h
===================================================================
--- uspace/lib/usb/include/usb/descriptor.h	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usb/include/usb/descriptor.h	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -197,6 +197,14 @@
 	 */
 	uint8_t attributes;
-	/** Maximum packet size. */
+	/** Maximum packet size.
+	 * Lower 10 bits represent the actuall size
+	 * Bits 11,12 specify addtional transfer opportunitities for
+	 * HS INT and ISO transfers. */
 	uint16_t max_packet_size;
+#define ED_MPS_PACKET_SIZE_MASK  0x3ff
+#define ED_MPS_PACKET_SIZE_GET(value) \
+	((value) & ED_MPS_PACKET_SIZE_MASK)
+#define ED_MPS_TRANS_OPPORTUNITIES_GET(value) \
+	((((value) >> 10) & 0x3) + 1)
 	/** Polling interval in milliseconds.
 	 * Ignored for bulk and control endpoints.
Index: uspace/lib/usbdev/include/usb/dev/pipes.h
===================================================================
--- uspace/lib/usbdev/include/usb/dev/pipes.h	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbdev/include/usb/dev/pipes.h	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -61,4 +61,8 @@
 	size_t max_packet_size;
 
+	/** Number of packets per frame/uframe.
+	 * Only valid for HS INT and ISO transfers. All others should set to 1*/
+	unsigned packets;
+
 	/** Whether to automatically reset halt on the endpoint.
 	 * Valid only for control endpoint zero.
@@ -105,5 +109,5 @@
 
 int usb_pipe_initialize(usb_pipe_t *, usb_endpoint_t, usb_transfer_type_t,
-    size_t, usb_direction_t, usb_dev_session_t *);
+    size_t, usb_direction_t, unsigned, usb_dev_session_t *);
 int usb_pipe_initialize_default_control(usb_pipe_t *, usb_dev_session_t *);
 
Index: uspace/lib/usbdev/src/pipes.c
===================================================================
--- uspace/lib/usbdev/src/pipes.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbdev/src/pipes.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -254,5 +254,5 @@
 int usb_pipe_initialize(usb_pipe_t *pipe, usb_endpoint_t endpoint_no,
     usb_transfer_type_t transfer_type, size_t max_packet_size,
-    usb_direction_t direction, usb_dev_session_t *bus_session)
+    usb_direction_t direction, unsigned packets, usb_dev_session_t *bus_session)
 {
 	assert(pipe);
@@ -260,4 +260,5 @@
 	pipe->endpoint_no = endpoint_no;
 	pipe->transfer_type = transfer_type;
+	pipe->packets = packets;
 	pipe->max_packet_size = max_packet_size;
 	pipe->direction = direction;
@@ -279,5 +280,5 @@
 
 	const int rc = usb_pipe_initialize(pipe, 0, USB_TRANSFER_CONTROL,
-	    CTRL_PIPE_MIN_PACKET_SIZE, USB_DIRECTION_BOTH, bus_session);
+	    CTRL_PIPE_MIN_PACKET_SIZE, USB_DIRECTION_BOTH, 1, bus_session);
 
 	pipe->auto_reset_halt = true;
@@ -301,5 +302,5 @@
 	const int ret = usb_register_endpoint(exch, pipe->endpoint_no,
 	    pipe->transfer_type, pipe->direction, pipe->max_packet_size,
-	    interval);
+	    pipe->packets, interval);
 	async_exchange_end(exch);
 	return ret;
Index: uspace/lib/usbdev/src/pipesinit.c
===================================================================
--- uspace/lib/usbdev/src/pipesinit.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbdev/src/pipesinit.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -196,6 +196,9 @@
 	int rc = usb_pipe_initialize(&ep_mapping->pipe,
 	    ep_no, description.transfer_type,
-	    uint16_usb2host(endpoint_desc->max_packet_size),
-	    description.direction, bus_session);
+	    ED_MPS_PACKET_SIZE_GET(
+	        uint16_usb2host(endpoint_desc->max_packet_size)),
+	    description.direction,
+	    ED_MPS_TRANS_OPPORTUNITIES_GET(
+	        uint16_usb2host(endpoint_desc->max_packet_size)), bus_session);
 	if (rc != EOK) {
 		return rc;
Index: uspace/lib/usbhost/include/usb/host/endpoint.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/endpoint.h	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbhost/include/usb/host/endpoint.h	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -57,4 +57,6 @@
 	/** Maximum size of data packets. */
 	size_t max_packet_size;
+	/** Additional opportunities per uframe */
+	unsigned packets;
 	/** Necessary bandwidth. */
 	size_t bandwidth;
@@ -85,6 +87,6 @@
 endpoint_t * endpoint_create(usb_address_t address, usb_endpoint_t endpoint,
     usb_direction_t direction, usb_transfer_type_t type, usb_speed_t speed,
-    size_t max_packet_size, size_t bw, usb_address_t tt_address,
-    unsigned tt_port);
+    size_t max_packet_size, unsigned packets, size_t bw,
+    usb_address_t tt_address, unsigned tt_port);
 void endpoint_destroy(endpoint_t *instance);
 
Index: uspace/lib/usbhost/include/usb/host/hcd.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/hcd.h	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbhost/include/usb/host/hcd.h	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -109,6 +109,6 @@
 
 int hcd_add_ep(hcd_t *hcd, usb_target_t target, usb_direction_t dir,
-    usb_transfer_type_t type, size_t max_packet_size, size_t size,
-    usb_address_t tt_address, unsigned tt_port);
+    usb_transfer_type_t type, size_t max_packet_size, unsigned packets,
+    size_t size, usb_address_t tt_address, unsigned tt_port);
 
 int hcd_remove_ep(hcd_t *hcd, usb_target_t target, usb_direction_t dir);
Index: uspace/lib/usbhost/include/usb/host/usb_bus.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/usb_bus.h	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbhost/include/usb/host/usb_bus.h	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -97,7 +97,7 @@
 int usb_bus_add_ep(usb_bus_t *instance,
     usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,
-    usb_transfer_type_t type, size_t max_packet_size, size_t data_size,
-    ep_add_callback_t callback, void *arg, usb_address_t tt_address,
-    unsigned tt_port);
+    usb_transfer_type_t type, size_t max_packet_size, unsigned packets,
+    size_t data_size, ep_add_callback_t callback, void *arg,
+    usb_address_t tt_address, unsigned tt_port);
 
 int usb_bus_remove_ep(usb_bus_t *instance,
Index: uspace/lib/usbhost/src/ddf_helpers.c
===================================================================
--- uspace/lib/usbhost/src/ddf_helpers.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbhost/src/ddf_helpers.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -110,5 +110,5 @@
     ddf_fun_t *fun, usb_endpoint_t endpoint,
     usb_transfer_type_t transfer_type, usb_direction_t direction,
-    size_t max_packet_size, unsigned interval)
+    size_t max_packet_size, unsigned packets, unsigned interval)
 {
 	assert(fun);
@@ -126,5 +126,5 @@
 
 	return hcd_add_ep(hcd, target, direction, transfer_type,
-	    max_packet_size, size, dev->tt_address, dev->port);
+	    max_packet_size, packets, size, dev->tt_address, dev->port);
 }
 
@@ -491,5 +491,5 @@
 	ret = hcd_add_ep(hcd,
 	    default_target, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL,
-	    CTRL_PIPE_MIN_PACKET_SIZE, CTRL_PIPE_MIN_PACKET_SIZE,
+	    CTRL_PIPE_MIN_PACKET_SIZE, CTRL_PIPE_MIN_PACKET_SIZE, 1,
 	    tt_address, port);
 
@@ -517,5 +517,8 @@
 	/* Register EP on the new address */
 	ret = hcd_add_ep(hcd, target, USB_DIRECTION_BOTH, USB_TRANSFER_CONTROL,
-	    desc.max_packet_size, desc.max_packet_size, tt_address, port);
+	    ED_MPS_PACKET_SIZE_GET(uint16_usb2host(desc.max_packet_size)),
+	    ED_MPS_TRANS_OPPORTUNITIES_GET(uint16_usb2host(desc.max_packet_size)),
+	    ED_MPS_PACKET_SIZE_GET(uint16_usb2host(desc.max_packet_size)),
+	    tt_address, port);
 	if (ret != EOK) {
 		hcd_remove_ep(hcd, default_target, USB_DIRECTION_BOTH);
Index: uspace/lib/usbhost/src/endpoint.c
===================================================================
--- uspace/lib/usbhost/src/endpoint.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbhost/src/endpoint.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -50,5 +50,6 @@
 endpoint_t * endpoint_create(usb_address_t address, usb_endpoint_t endpoint,
     usb_direction_t direction, usb_transfer_type_t type, usb_speed_t speed,
-    size_t max_packet_size, size_t bw, usb_address_t tt_address, unsigned tt_p)
+    size_t max_packet_size, unsigned packets, size_t bw,
+    usb_address_t tt_address, unsigned tt_p)
 {
 	endpoint_t *instance = malloc(sizeof(endpoint_t));
@@ -60,4 +61,5 @@
 		instance->speed = speed;
 		instance->max_packet_size = max_packet_size;
+		instance->packets = packets;
 		instance->bandwidth = bw;
 		instance->toggle = 0;
Index: uspace/lib/usbhost/src/hcd.c
===================================================================
--- uspace/lib/usbhost/src/hcd.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbhost/src/hcd.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -132,11 +132,11 @@
 
 int hcd_add_ep(hcd_t *hcd, usb_target_t target, usb_direction_t dir,
-    usb_transfer_type_t type, size_t max_packet_size, size_t size,
-    usb_address_t tt_address, unsigned tt_port)
+    usb_transfer_type_t type, size_t max_packet_size, unsigned packets,
+    size_t size, usb_address_t tt_address, unsigned tt_port)
 {
 	assert(hcd);
 	return usb_bus_add_ep(&hcd->bus, target.address,
-	    target.endpoint, dir, type, max_packet_size, size, register_helper,
-	    hcd, tt_address, tt_port);
+	    target.endpoint, dir, type, max_packet_size, packets, size,
+	    register_helper, hcd, tt_address, tt_port);
 }
 
Index: uspace/lib/usbhost/src/usb_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb_bus.c	(revision 3de7a6235f59404fe29b5e6146634adbfaf9e3bf)
+++ uspace/lib/usbhost/src/usb_bus.c	(revision 4e732f1aa54271f1ae2860aba3864e766f33cddc)
@@ -301,7 +301,7 @@
 int usb_bus_add_ep(usb_bus_t *instance,
     usb_address_t address, usb_endpoint_t endpoint, usb_direction_t direction,
-    usb_transfer_type_t type, size_t max_packet_size, size_t data_size,
-    ep_add_callback_t callback, void *arg, usb_address_t tt_address,
-    unsigned tt_port)
+    usb_transfer_type_t type, size_t max_packet_size, unsigned packets,
+    size_t data_size, ep_add_callback_t callback, void *arg,
+    usb_address_t tt_address, unsigned tt_port)
 {
 	assert(instance);
@@ -337,5 +337,5 @@
 
 	ep = endpoint_create(address, endpoint, direction, type, speed,
-	    max_packet_size, bw, tt_address, tt_port);
+	    max_packet_size, packets, bw, tt_address, tt_port);
 	if (!ep) {
 		fibril_mutex_unlock(&instance->guard);
