Index: uspace/drv/ohci/hc.c
===================================================================
--- uspace/drv/ohci/hc.c	(revision 2c617b054f38d6bc24c9be033fa1ae5398436f74)
+++ uspace/drv/ohci/hc.c	(revision c2be0e5eb78189c14457ea5e8b08ae52f1e2acf2)
@@ -79,12 +79,21 @@
 	assert(instance);
 	int ret = EOK;
+#define CHECK_RET_RETURN(ret, message...) \
+if (ret != EOK) { \
+	usb_log_error(message); \
+	return ret; \
+} else (void)0
 
 	ret = pio_enable((void*)regs, reg_size, (void**)&instance->registers);
-	if (ret != EOK) {
-		usb_log_error("Failed to gain access to device registers.\n");
-		return ret;
-	}
+	CHECK_RET_RETURN(ret,
+	    "Failed(%d) to gain access to device registers: %s.\n",
+	    ret, str_error(ret));
+
 	instance->ddf_instance = fun;
 	usb_device_keeper_init(&instance->manager);
+	ret = bandwidth_init(&instance->bandwidth, BANDWIDTH_AVAILABLE_USB11,
+	    bandwidth_count_usb11);
+	CHECK_RET_RETURN(ret, "Failed to initialize bandwidth allocator: %s.\n",
+	    ret, str_error(ret));
 
 	if (!interrupts) {
@@ -185,4 +194,9 @@
 	assert((instance->registers->command_status & CS_HCR) == 0);
 	/* hc is now in suspend state */
+	/* TODO: init HCCA block */
+	/* TODO: init queues */
+	/* TODO: enable queues */
+	/* TODO: enable interrupts */
+	/* TODO: set periodic start to 90% */
 
 	instance->registers->control &= (C_HCFS_OPERATIONAL << C_HCFS_SHIFT);
Index: uspace/drv/ohci/hc.h
===================================================================
--- uspace/drv/ohci/hc.h	(revision 2c617b054f38d6bc24c9be033fa1ae5398436f74)
+++ uspace/drv/ohci/hc.h	(revision c2be0e5eb78189c14457ea5e8b08ae52f1e2acf2)
@@ -42,4 +42,5 @@
 #include <usb/usb.h>
 #include <usb/host/device_keeper.h>
+#include <usb/host/bandwidth.h>
 #include <usbhc_iface.h>
 
@@ -54,4 +55,5 @@
 	ddf_fun_t *ddf_instance;
 	usb_device_keeper_t manager;
+	bandwidth_t bandwidth;
 	fid_t interrupt_emulator;
 } hc_t;
Index: uspace/drv/ohci/iface.c
===================================================================
--- uspace/drv/ohci/iface.c	(revision 2c617b054f38d6bc24c9be033fa1ae5398436f74)
+++ uspace/drv/ohci/iface.c	(revision c2be0e5eb78189c14457ea5e8b08ae52f1e2acf2)
@@ -151,7 +151,17 @@
     size_t max_packet_size, unsigned int interval)
 {
-	UNSUPPORTED("register_endpoint");
-
-	return ENOTSUP;
+	assert(fun);
+	hc_t *hc = fun_to_hc(fun);
+	assert(hc);
+	if (address == hc->rh.address)
+		return EOK;
+	const usb_speed_t speed =
+		usb_device_keeper_get_speed(&hc->manager, address);
+	const size_t size = max_packet_size;
+	usb_log_debug("Register endpoint %d:%d %s %s(%d) %zu(%zu) %u.\n",
+	    address, endpoint, usb_str_transfer_type(transfer_type),
+	    usb_str_speed(speed), direction, size, max_packet_size, interval);
+	return bandwidth_reserve(&hc->bandwidth, address, endpoint, direction,
+	    speed, transfer_type, max_packet_size, size, interval);
 }
 /*----------------------------------------------------------------------------*/
@@ -168,5 +178,10 @@
     usb_endpoint_t endpoint, usb_direction_t direction)
 {
-	UNSUPPORTED("unregister_endpoint");
+	assert(fun);
+	hc_t *hc = fun_to_hc(fun);
+	assert(hc);
+	usb_log_debug("Unregister endpoint %d:%d %d.\n",
+	    address, endpoint, direction);
+	return bandwidth_release(&hc->bandwidth, address, endpoint, direction);
 
 	return ENOTSUP;
