Index: uspace/lib/drv/generic/remote_usb.c
===================================================================
--- uspace/lib/drv/generic/remote_usb.c	(revision 19b3cc6e811d9121b454895875bdd47387821c1e)
+++ uspace/lib/drv/generic/remote_usb.c	(revision 5ee3ce050de57c0e5c95d397830a6a2b7a7cfe37)
@@ -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 19b3cc6e811d9121b454895875bdd47387821c1e)
+++ uspace/lib/drv/include/usb_iface.h	(revision 5ee3ce050de57c0e5c95d397830a6a2b7a7cfe37)
@@ -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);
