Index: uspace/drv/bus/usb/ohci/hc.c
===================================================================
--- uspace/drv/bus/usb/ohci/hc.c	(revision 32e093e9873c25920e4db0effd1e8179f5f7ed84)
+++ uspace/drv/bus/usb/ohci/hc.c	(revision b02308e24a4eb526d32288a583894e2468b57aee)
@@ -238,14 +238,12 @@
 		return ENOMEM;
 
-	hcd_endpoint_t *hcd_ep = hcd_endpoint_assign(ep);
-	if (hcd_ep == NULL) {
+	int ret = hcd_endpoint_assign(ep);
+	if (ret != EOK) {
 		endpoint_destroy(ep);
-		return ENOMEM;
-	}
-
-	int ret =
-	    usb_endpoint_manager_register_ep(&instance->ep_manager, ep, size);
+		return ret;
+	}
+
+	ret = usb_endpoint_manager_register_ep(&instance->ep_manager, ep, size);
 	if (ret != EOK) {
-		hcd_endpoint_clear(ep);
 		endpoint_destroy(ep);
 		return ret;
@@ -257,5 +255,5 @@
 		instance->registers->control &= ~C_CLE;
 		endpoint_list_add_ep(
-		    &instance->lists[ep->transfer_type], hcd_ep);
+		    &instance->lists[ep->transfer_type], hcd_endpoint_get(ep));
 		instance->registers->control_current = 0;
 		instance->registers->control |= C_CLE;
@@ -264,5 +262,5 @@
 		instance->registers->control &= ~C_BLE;
 		endpoint_list_add_ep(
-		    &instance->lists[ep->transfer_type], hcd_ep);
+		    &instance->lists[ep->transfer_type], hcd_endpoint_get(ep));
 		instance->registers->control |= C_BLE;
 		break;
@@ -271,5 +269,5 @@
 		instance->registers->control &= (~C_PLE & ~C_IE);
 		endpoint_list_add_ep(
-		    &instance->lists[ep->transfer_type], hcd_ep);
+		    &instance->lists[ep->transfer_type], hcd_endpoint_get(ep));
 		instance->registers->control |= C_PLE | C_IE;
 		break;
@@ -327,5 +325,4 @@
 			break;
 		}
-		hcd_endpoint_clear(ep);
 	} else {
 		usb_log_warning("Endpoint without hcd equivalent structure.\n");
Index: uspace/drv/bus/usb/ohci/hcd_endpoint.c
===================================================================
--- uspace/drv/bus/usb/ohci/hcd_endpoint.c	(revision 32e093e9873c25920e4db0effd1e8179f5f7ed84)
+++ uspace/drv/bus/usb/ohci/hcd_endpoint.c	(revision b02308e24a4eb526d32288a583894e2468b57aee)
@@ -61,4 +61,18 @@
 }
 /*----------------------------------------------------------------------------*/
+/** Disposes hcd endpoint structure
+ *
+ * @param[in] hcd_ep endpoint structure
+ */
+static void hcd_ep_destroy(void *hcd_ep)
+{
+	if (hcd_ep) {
+		hcd_endpoint_t *instance = hcd_ep;
+		free32(instance->ed);
+		free32(instance->td);
+		free(instance);
+	}
+}
+/*----------------------------------------------------------------------------*/
 /** Creates new hcd endpoint representation.
  *
@@ -66,15 +80,15 @@
  * @return pointer to a new hcd endpoint structure, NULL on failure.
  */
-hcd_endpoint_t * hcd_endpoint_assign(endpoint_t *ep)
+int hcd_endpoint_assign(endpoint_t *ep)
 {
 	assert(ep);
 	hcd_endpoint_t *hcd_ep = malloc(sizeof(hcd_endpoint_t));
 	if (hcd_ep == NULL)
-		return NULL;
+		return ENOMEM;
 
 	hcd_ep->ed = malloc32(sizeof(ed_t));
 	if (hcd_ep->ed == NULL) {
 		free(hcd_ep);
-		return NULL;
+		return ENOMEM;
 	}
 
@@ -83,5 +97,5 @@
 		free32(hcd_ep->ed);
 		free(hcd_ep);
-		return NULL;
+		return ENOMEM;
 	}
 
@@ -89,21 +103,7 @@
 	ed_set_td(hcd_ep->ed, hcd_ep->td);
 	endpoint_set_hc_data(
-	    ep, hcd_ep, NULL, hcd_ep_toggle_get, hcd_ep_toggle_set);
+	    ep, hcd_ep, hcd_ep_destroy, hcd_ep_toggle_get, hcd_ep_toggle_set);
 
-	return hcd_ep;
-}
-/*----------------------------------------------------------------------------*/
-/** Disposes assigned hcd endpoint structure
- *
- * @param[in] ep USBD endpoint structure
- */
-void hcd_endpoint_clear(endpoint_t *ep)
-{
-	assert(ep);
-	hcd_endpoint_t *hcd_ep = ep->hc_data.data;
-	assert(hcd_ep);
-	free32(hcd_ep->ed);
-	free32(hcd_ep->td);
-	free(hcd_ep);
+	return EOK;
 }
 /**
Index: uspace/drv/bus/usb/ohci/hcd_endpoint.h
===================================================================
--- uspace/drv/bus/usb/ohci/hcd_endpoint.h	(revision 32e093e9873c25920e4db0effd1e8179f5f7ed84)
+++ uspace/drv/bus/usb/ohci/hcd_endpoint.h	(revision b02308e24a4eb526d32288a583894e2468b57aee)
@@ -52,6 +52,5 @@
 } hcd_endpoint_t;
 
-hcd_endpoint_t * hcd_endpoint_assign(endpoint_t *ep);
-void hcd_endpoint_clear(endpoint_t *ep);
+int hcd_endpoint_assign(endpoint_t *ep);
 
 /** Get and convert assigned hcd_endpoint_t structure
