Index: uspace/drv/ohci/iface.c
===================================================================
--- uspace/drv/ohci/iface.c	(revision b0beee8234f973c71ea5675425ade580ec0e65a2)
+++ uspace/drv/ohci/iface.c	(revision 3954a63bd87b69fbec5d8bc2146206516a2c83ea)
@@ -176,5 +176,5 @@
 	return ENOTSUP;
 }
-
+/*----------------------------------------------------------------------------*/
 /** Schedule interrupt out transfer.
  *
@@ -198,9 +198,25 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	UNSUPPORTED("interrupt_out");
-
-	return ENOTSUP;
-}
-
+  hc_t *hc = fun_to_hc(fun);
+  assert(hc);
+  usb_speed_t speed = device_keeper_speed(&hc->manager, target.address);
+
+  usb_log_debug("Interrupt OUT %d:%d %zu(%zu).\n",
+      target.address, target.endpoint, size, max_packet_size);
+
+  batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,
+      max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg,
+      &hc->manager);
+  if (!batch)
+    return ENOMEM;
+  batch_interrupt_out(batch);
+  const int ret = hc_schedule(hc, batch);
+  if (ret != EOK) {
+    batch_dispose(batch);
+    return ret;
+  }
+  return EOK;
+}
+/*----------------------------------------------------------------------------*/
 /** Schedule interrupt in transfer.
  *
@@ -224,9 +240,25 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	UNSUPPORTED("interrupt_in");
-
-	return ENOTSUP;
-}
-
+  assert(fun);
+  hc_t *hc = fun_to_hc(fun);
+  assert(hc);
+  usb_speed_t speed = device_keeper_speed(&hc->manager, target.address);
+  usb_log_debug("Interrupt IN %d:%d %zu(%zu).\n", 
+      target.address, target.endpoint, size, max_packet_size);
+
+  batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,
+      max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg,
+      &hc->manager);
+  if (!batch)
+    return ENOMEM;
+  batch_interrupt_in(batch);
+  const int ret = hc_schedule(hc, batch);
+  if (ret != EOK) {
+    batch_dispose(batch);
+    return ret;
+  }
+  return EOK;
+}
+/*----------------------------------------------------------------------------*/
 /** Schedule bulk out transfer.
  *
@@ -250,9 +282,27 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	UNSUPPORTED("bulk_out");
-
-	return ENOTSUP;
-}
-
+  assert(fun);
+  hc_t *hc = fun_to_hc(fun);
+  assert(hc);
+  usb_speed_t speed = device_keeper_speed(&hc->manager, target.address);
+
+  usb_log_debug("Bulk OUT %d:%d %zu(%zu).\n",
+      target.address, target.endpoint, size, max_packet_size);
+
+  batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK,
+      max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg,
+      &hc->manager);
+  if (!batch)
+    return ENOMEM;
+  batch_bulk_out(batch);
+  const int ret = hc_schedule(hc, batch);
+  if (ret != EOK) {
+    batch_dispose(batch);
+    return ret;
+  }
+  return EOK;
+
+}
+/*----------------------------------------------------------------------------*/
 /** Schedule bulk in transfer.
  *
@@ -276,9 +326,25 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	UNSUPPORTED("bulk_in");
-
-	return ENOTSUP;
-}
-
+  assert(fun);
+  hc_t *hc = fun_to_hc(fun);
+  assert(hc);
+  usb_speed_t speed = device_keeper_speed(&hc->manager, target.address);
+  usb_log_debug("Bulk IN %d:%d %zu(%zu).\n",
+      target.address, target.endpoint, size, max_packet_size);
+
+  batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK,
+      max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg,
+      &hc->manager);
+  if (!batch)
+    return ENOMEM;
+  batch_bulk_in(batch);
+  const int ret = hc_schedule(hc, batch);
+  if (ret != EOK) {
+    batch_dispose(batch);
+    return ret;
+  }
+  return EOK;
+}
+/*----------------------------------------------------------------------------*/
 /** Schedule control write transfer.
  *
@@ -303,13 +369,33 @@
 static int control_write(ddf_fun_t *fun, usb_target_t target,
     size_t max_packet_size,
-    void *setup_packet, size_t setup_packet_size,
-    void *data_buffer, size_t data_buffer_size,
+    void *setup_data, size_t setup_size,
+    void *data, size_t size,
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	UNSUPPORTED("control_write");
-
-	return ENOTSUP;
-}
-
+  assert(fun);
+  hc_t *hc = fun_to_hc(fun);
+  assert(hc);
+  usb_speed_t speed = device_keeper_speed(&hc->manager, target.address);
+  usb_log_debug("Control WRITE (%d) %d:%d %zu(%zu).\n",
+      speed, target.address, target.endpoint, size, max_packet_size);
+
+  if (setup_size != 8)
+    return EINVAL;
+
+  batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,
+      max_packet_size, speed, data, size, setup_data, setup_size,
+      NULL, callback, arg, &hc->manager);
+  if (!batch)
+    return ENOMEM;
+  device_keeper_reset_if_need(&hc->manager, target, setup_data);
+  batch_control_write(batch);
+  const int ret = hc_schedule(hc, batch);
+  if (ret != EOK) {
+    batch_dispose(batch);
+    return ret;
+  }
+  return EOK;
+}
+/*----------------------------------------------------------------------------*/
 /** Schedule control read transfer.
  *
@@ -334,13 +420,29 @@
 static int control_read(ddf_fun_t *fun, usb_target_t target,
     size_t max_packet_size,
-    void *setup_packet, size_t setup_packet_size,
-    void *data_buffer, size_t data_buffer_size,
+    void *setup_data, size_t setup_size,
+    void *data, size_t size,
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	UNSUPPORTED("control_read");
-
-	return ENOTSUP;
-}
-
+  assert(fun);
+  hc_t *hc = fun_to_hc(fun);
+  assert(hc);
+  usb_speed_t speed = device_keeper_speed(&hc->manager, target.address);
+
+  usb_log_debug("Control READ(%d) %d:%d %zu(%zu).\n",
+      speed, target.address, target.endpoint, size, max_packet_size);
+  batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,
+      max_packet_size, speed, data, size, setup_data, setup_size, callback,
+      NULL, arg, &hc->manager);
+  if (!batch)
+    return ENOMEM;
+  batch_control_read(batch);
+  const int ret = hc_schedule(hc, batch);
+  if (ret != EOK) {
+    batch_dispose(batch);
+    return ret;
+  }
+  return EOK;
+}
+/*----------------------------------------------------------------------------*/
 /** Host controller interface implementation for OHCI. */
 usbhc_iface_t hc_iface = {
