Index: uspace/lib/usbhost/include/usb/host/bandwidth.h
===================================================================
--- uspace/lib/usbhost/include/usb/host/bandwidth.h	(revision 3dc3f991ae1647de604511b72c9e9023346aaa12)
+++ uspace/lib/usbhost/include/usb/host/bandwidth.h	(revision eb928c41f71932f3f5d29785e9599d8fa22a271d)
@@ -44,8 +44,10 @@
 #define BANDWIDTH_TOTAL_USB11 (12000000 / 8)
 /** 90% of total bandwidth is available for periodic transfers */
-#define BANDWIDTH_AVAILABLE_USB11 ((BANDWIDTH_TOTAL_USB11 / 10) * 9)
+#define BANDWIDTH_AVAILABLE_USB11 ((BANDWIDTH_TOTAL_USB11 * 9) / 10)
 
-//TODO: Implement
-#define BANDWIDTH_AVAILABLE_USB20  1
+/** Number of nanoseconds in one microframe */
+#define BANDWIDTH_TOTAL_USB20 (125000)
+/** 90% of total bandwidth is available for periodic transfers */
+#define BANDWIDTH_AVAILABLE_USB20  ((BANDWIDTH_TOTAL_USB20 * 9) / 10)
 
 typedef struct endpoint endpoint_t;
Index: uspace/lib/usbhost/src/bandwidth.c
===================================================================
--- uspace/lib/usbhost/src/bandwidth.c	(revision 3dc3f991ae1647de604511b72c9e9023346aaa12)
+++ uspace/lib/usbhost/src/bandwidth.c	(revision eb928c41f71932f3f5d29785e9599d8fa22a271d)
@@ -96,9 +96,12 @@
 
 /** Calculate bandwidth that needs to be reserved for communication with EP.
- * Calculation follows USB 2.0 specification.
+ * Calculation follows USB 2.0 specification, chapter 5.11.3.
+ *
  * @param speed Device's speed.
  * @param type Type of the transfer.
  * @param size Number of byte to transfer.
  * @param max_packet_size Maximum bytes in one packet.
+ * @return Number of nanoseconds transaction with @c size bytes payload will
+ *         take.
  */
 ssize_t bandwidth_count_usb20(endpoint_t *ep, size_t size)
@@ -113,5 +116,36 @@
 		return 0;
 	}
-	//TODO Implement
-	return 0;
+
+	// FIXME: Come up with some upper bound for these (in ns).
+	const size_t host_delay = 0;
+	const size_t hub_ls_setup = 0;
+
+	// Approx. Floor(3.167 + BitStuffTime(Data_bc))
+	const size_t base_time = (size * 8 + 19) / 6;
+
+	switch (ep->device->speed) {
+	case USB_SPEED_LOW:
+		if (ep->direction == USB_DIRECTION_IN)
+			return 64060 + (2 * hub_ls_setup) + (677 * base_time) + host_delay;
+		else
+			return 64107 + (2 * hub_ls_setup) + (667 * base_time) + host_delay;
+
+	case USB_SPEED_FULL:
+		if (ep->transfer_type == USB_TRANSFER_INTERRUPT)
+			return 9107 + 84 * base_time + host_delay;
+
+		if (ep->direction == USB_DIRECTION_IN)
+			return 7268 + 84 * base_time + host_delay;
+		else
+			return 6265 + 84 * base_time + host_delay;
+
+	case USB_SPEED_HIGH:
+		if (ep->transfer_type == USB_TRANSFER_INTERRUPT)
+			return (3648 + 25 * base_time + 11) / 12 + host_delay;
+		else
+			return (5280 + 25 * base_time + 11) / 12 + host_delay;
+
+	default:
+		return 0;
+	}
 }
