Index: uspace/drv/uhci-hcd/hc.c
===================================================================
--- uspace/drv/uhci-hcd/hc.c	(revision a1313b8c0909ff62ef7d65cddbe6d7d99ed02ece)
+++ uspace/drv/uhci-hcd/hc.c	(revision 1273b86c25856657681f875bee0fddc9b227fce4)
@@ -329,11 +329,20 @@
 	if (!usb_is_allowed(
 	    low_speed, batch->transfer_type, batch->max_packet_size)) {
-		usb_log_warning(
-		    "Invalid USB transfer specified %s SPEED %d %zu.\n",
-		    low_speed ? "LOW" : "FULL" , batch->transfer_type,
+		usb_log_error("Invalid USB transfer specified %s %d %zu.\n",
+		    usb_str_speed(batch->speed), batch->transfer_type,
 		    batch->max_packet_size);
 		return ENOTSUP;
 	}
-	/* TODO: check available bandwidth here */
+	/* Check available bandwidth */
+	if (batch->transfer_type == USB_TRANSFER_INTERRUPT ||
+	    batch->transfer_type == USB_TRANSFER_ISOCHRONOUS) {
+		int ret =
+		    bandwidth_use(&instance->bandwidth, batch->target.address,
+		    batch->target.endpoint, batch->direction);
+		if (ret != EOK) {
+			usb_log_warning("Failed(%d) to use reserved bw: %s.\n",
+			    ret, str_error(ret));
+		}
+	}
 
 	transfer_list_t *list =
@@ -362,4 +371,5 @@
 {
 	assert(instance);
+//	status |= 1; //Uncomment to work around qemu hang
 	/* TODO: Resume interrupts are not supported */
 	/* Lower 2 bits are transaction error and transaction complete */
@@ -380,7 +390,23 @@
 			usb_transfer_batch_t *batch =
 			    list_get_instance(item, usb_transfer_batch_t, link);
-			if (batch->transfer_type == USB_TRANSFER_CONTROL) {
+			switch (batch->transfer_type)
+			{
+			case USB_TRANSFER_CONTROL:
 				usb_device_keeper_release_control(
 				    &instance->manager, batch->target.address);
+				break;
+			case USB_TRANSFER_INTERRUPT:
+			case USB_TRANSFER_ISOCHRONOUS: {
+				int ret = bandwidth_free(&instance->bandwidth,
+				    batch->target.address,
+				    batch->target.endpoint,
+				    batch->direction);
+				if (ret != EOK)
+					usb_log_warning("Failed(%d) to free "
+					    "reserved bw: %s.\n", ret,
+					    str_error(ret));
+				}
+			default:
+				break;
 			}
 			batch->next_step(batch);
