Index: uspace/lib/usbhost/include/usb/host/bus.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/bus.h	(revision 239eea4167f0ebbd6c42050e2c252fd03a7f3c08)
+++ uspace/lib/usbhost/include/usb/host/bus.h	(revision d345ce2f2396010ea2fd5ad90e85202da83d5197)
@@ -157,7 +157,7 @@
     usbhc_iface_transfer_callback_t, void *, const char *);
 
-ssize_t bus_device_send_batch_sync(device_t *, usb_target_t,
+errno_t bus_device_send_batch_sync(device_t *, usb_target_t,
     usb_direction_t direction, char *, size_t, uint64_t,
-    const char *);
+    const char *, size_t *);
 
 int bus_endpoint_add(device_t *, const usb_endpoint_descriptors_t *, endpoint_t **);
Index: uspace/lib/usbhost/src/bus.c
===================================================================
--- uspace/lib/usbhost/src/bus.c	(revision 239eea4167f0ebbd6c42050e2c252fd03a7f3c08)
+++ uspace/lib/usbhost/src/bus.c	(revision d345ce2f2396010ea2fd5ad90e85202da83d5197)
@@ -646,7 +646,7 @@
  * @param name Communication identifier (for nicer output).
  */
-ssize_t bus_device_send_batch_sync(device_t *device, usb_target_t target,
+errno_t bus_device_send_batch_sync(device_t *device, usb_target_t target,
     usb_direction_t direction, char *data, size_t size, uint64_t setup_data,
-    const char *name)
+    const char *name, size_t *transferred_size)
 {
 	sync_data_t sd = { .done = false };
@@ -668,7 +668,8 @@
 	fibril_mutex_unlock(&sd.done_mtx);
 
-	return (sd.error == EOK)
-		? (ssize_t) sd.transferred_size
-		: (ssize_t) sd.error;
+	if (transferred_size)
+		*transferred_size = sd.transferred_size;
+
+	return sd.error;
 }
 
Index: uspace/lib/usbhost/src/usb2_bus.c
===================================================================
--- uspace/lib/usbhost/src/usb2_bus.c	(revision 239eea4167f0ebbd6c42050e2c252fd03a7f3c08)
+++ uspace/lib/usbhost/src/usb2_bus.c	(revision d345ce2f2396010ea2fd5ad90e85202da83d5197)
@@ -140,6 +140,6 @@
 	usb_log_debug("Device(%d): Setting USB address.", address);
 	err = bus_device_send_batch_sync(dev, usb2_default_target, USB_DIRECTION_OUT,
-	    NULL, 0, *(uint64_t *)&set_address, "set address");
-	if (err != 0) {
+	    NULL, 0, *(uint64_t *)&set_address, "set address", NULL);
+	if (err) {
 		usb_log_error("Device(%d): Failed to set new address: %s.",
 		    address, str_error(err));
Index: uspace/lib/usbhost/src/utility.c
===================================================================
--- uspace/lib/usbhost/src/utility.c	(revision 239eea4167f0ebbd6c42050e2c252fd03a7f3c08)
+++ uspace/lib/usbhost/src/utility.c	(revision d345ce2f2396010ea2fd5ad90e85202da83d5197)
@@ -94,10 +94,11 @@
 
 	usb_log_debug("Requesting first 8B of device descriptor to determine MPS.");
-	ssize_t got = bus_device_send_batch_sync(dev, control_ep, USB_DIRECTION_IN,
-	    (char *) &desc, CTRL_PIPE_MIN_PACKET_SIZE, *(uint64_t *)&get_device_desc_8,
-	    "read first 8 bytes of dev descriptor");
+	size_t got;
+	const errno_t err = bus_device_send_batch_sync(dev, control_ep,
+	    USB_DIRECTION_IN, (char *) &desc, CTRL_PIPE_MIN_PACKET_SIZE,
+	    *(uint64_t *)&get_device_desc_8,
+	    "read first 8 bytes of dev descriptor", &got);
 
 	if (got != CTRL_PIPE_MIN_PACKET_SIZE) {
-		const int err = got < 0 ? got : EOVERFLOW;
 		usb_log_error("Failed to get 8B of dev descr: %s.", str_error(err));
 		return err;
@@ -133,12 +134,13 @@
 	usb_log_debug("Device(%d): Requesting full device descriptor.",
 	    device->address);
-	ssize_t got = bus_device_send_batch_sync(device, control_ep, USB_DIRECTION_IN,
-	    (char *) desc, sizeof(*desc), *(uint64_t *)&get_device_desc,
-	    "read device descriptor");
-
-	if (got < 0)
-		return got;
-
-	return got == sizeof(*desc) ? EOK : EOVERFLOW;
+	size_t got;
+	errno_t err = bus_device_send_batch_sync(device, control_ep,
+	    USB_DIRECTION_IN, (char *) desc, sizeof(*desc),
+	    *(uint64_t *)&get_device_desc, "read device descriptor", &got);
+
+	if (!err && got != sizeof(*desc))
+		err = EOVERFLOW;
+
+	return err;
 }
 
@@ -164,12 +166,14 @@
 	usb_log_debug("Device(%d): Requesting hub descriptor.",
 	    device->address);
-	ssize_t got = bus_device_send_batch_sync(device, control_ep, USB_DIRECTION_IN,
-	    (char *) desc, sizeof(*desc), *(uint64_t *)&get_hub_desc,
-	    "get hub descriptor");
-
-	if (got < 0)
-		return got;
-
-	return got == sizeof(*desc) ? EOK : EOVERFLOW;
+
+	size_t got;
+	errno_t err = bus_device_send_batch_sync(device, control_ep,
+	    USB_DIRECTION_IN, (char *) desc, sizeof(*desc),
+	    *(uint64_t *)&get_hub_desc, "get hub descriptor", &got);
+
+	if (!err && got != sizeof(*desc))
+		err = EOVERFLOW;
+
+	return err;
 }
 
