Index: uspace/drv/ohci/batch.c
===================================================================
--- uspace/drv/ohci/batch.c	(revision fd153d38cfe71e2675e78a4e120517490eb3a96b)
+++ uspace/drv/ohci/batch.c	(revision aa9ccf72e4d3364dd14dd7f3705614afea848a26)
@@ -145,6 +145,7 @@
 		    data->tds[i].status, data->tds[i].cbp, data->tds[i].next,
 		    data->tds[i].be);
-		if (!td_is_finished(&data->tds[i]))
+		if (!td_is_finished(&data->tds[i])) {
 			return false;
+		}
 		instance->error = td_error(&data->tds[i]);
 		/* FIXME: calculate real transfered size */
@@ -287,5 +288,5 @@
 
 	/* data stage */
-	size_t td_current = 1;
+	size_t td_current = 0;
 	size_t remain_size = instance->buffer_size;
 	char *transfer_buffer = instance->transport_buffer;
Index: uspace/drv/ohci/hc.c
===================================================================
--- uspace/drv/ohci/hc.c	(revision fd153d38cfe71e2675e78a4e120517490eb3a96b)
+++ uspace/drv/ohci/hc.c	(revision aa9ccf72e4d3364dd14dd7f3705614afea848a26)
@@ -113,4 +113,5 @@
 	    ret, str_error(ret));
 	hc_init_hw(instance);
+	fibril_mutex_initialize(&instance->guard);
 
 	rh_init(&instance->rh, dev, instance->registers);
@@ -135,4 +136,5 @@
 	}
 
+	fibril_mutex_lock(&instance->guard);
 	switch (batch->transfer_type) {
 	case USB_TRANSFER_CONTROL:
@@ -157,12 +159,15 @@
 	case USB_TRANSFER_INTERRUPT:
 	case USB_TRANSFER_ISOCHRONOUS:
-		instance->registers->control &= ~C_PLE;
+		instance->registers->control &= (~C_PLE & ~C_IE);
 		transfer_list_add_batch(
 		    instance->transfers[batch->transfer_type], batch);
-		instance->registers->control |= C_PLE;
+		instance->registers->control |= C_PLE | C_IE;
+		usb_log_debug2("Added periodic transfer: %x.\n",
+		    instance->registers->periodic_current);
 		break;
 	default:
 		break;
 	}
+	fibril_mutex_unlock(&instance->guard);
 	return EOK;
 }
@@ -178,6 +183,10 @@
 	usb_log_debug("OHCI interrupt: %x.\n", status);
 
-
 	if (status & IS_WDH) {
+		fibril_mutex_lock(&instance->guard);
+		usb_log_debug2("HCCA: %p-%p(%p).\n", instance->hcca,
+		    instance->registers->hcca, addr_to_phys(instance->hcca));
+		usb_log_debug2("Periodic current: %p.\n",
+		    instance->registers->periodic_current);
 		LIST_INITIALIZE(done);
 		transfer_list_remove_finished(
@@ -197,4 +206,5 @@
 			usb_transfer_batch_finish(batch);
 		}
+		fibril_mutex_unlock(&instance->guard);
 	}
 }
@@ -208,5 +218,5 @@
 		instance->registers->interrupt_status = status;
 		hc_interrupt(instance, status);
-		async_usleep(10000);
+		async_usleep(50000);
 	}
 	return EOK;
@@ -345,5 +355,5 @@
 	SETUP_TRANSFER_LIST(transfers_control, "CONTROL");
 	SETUP_TRANSFER_LIST(transfers_bulk, "BULK");
-
+#undef SETUP_TRANSFER_LIST
 	transfer_list_set_next(&instance->transfers_interrupt,
 	    &instance->transfers_isochronous);
@@ -360,5 +370,4 @@
 
 	return EOK;
-#undef CHECK_RET_CLEAR_RETURN
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/ohci/hc.h
===================================================================
--- uspace/drv/ohci/hc.h	(revision fd153d38cfe71e2675e78a4e120517490eb3a96b)
+++ uspace/drv/ohci/hc.h	(revision aa9ccf72e4d3364dd14dd7f3705614afea848a26)
@@ -69,4 +69,5 @@
 	usb_endpoint_manager_t ep_manager;
 	fid_t interrupt_emulator;
+	fibril_mutex_t guard;
 } hc_t;
 
Index: uspace/drv/ohci/main.c
===================================================================
--- uspace/drv/ohci/main.c	(revision fd153d38cfe71e2675e78a4e120517490eb3a96b)
+++ uspace/drv/ohci/main.c	(revision aa9ccf72e4d3364dd14dd7f3705614afea848a26)
@@ -92,5 +92,5 @@
 int main(int argc, char *argv[])
 {
-	usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
+	usb_log_enable(USB_LOG_LEVEL_DEBUG2, NAME);
 	sleep(5);
 	return ddf_driver_main(&ohci_driver);
Index: uspace/drv/ohci/ohci_regs.h
===================================================================
--- uspace/drv/ohci/ohci_regs.h	(revision fd153d38cfe71e2675e78a4e120517490eb3a96b)
+++ uspace/drv/ohci/ohci_regs.h	(revision aa9ccf72e4d3364dd14dd7f3705614afea848a26)
@@ -100,6 +100,6 @@
 #define HCCA_PTR_MASK 0xffffff00 /* HCCA is 256B aligned */
 
-	/** Currently executed period endpoint */
-	const volatile uint32_t period_current;
+	/** Currently executed periodic endpoint */
+	const volatile uint32_t periodic_current;
 
 	/** The first control endpoint */
Index: uspace/drv/ohci/transfer_list.c
===================================================================
--- uspace/drv/ohci/transfer_list.c	(revision fd153d38cfe71e2675e78a4e120517490eb3a96b)
+++ uspace/drv/ohci/transfer_list.c	(revision aa9ccf72e4d3364dd14dd7f3705614afea848a26)
@@ -79,5 +79,4 @@
 	assert(instance);
 	assert(next);
-	/* Set both queue_head.next to point to the follower */
 	ed_append_ed(instance->list_head, next->list_head);
 }
@@ -125,7 +124,8 @@
 		batch, instance->name, first, batch_ed(first));
 	if (last_ed == instance->list_head) {
-		usb_log_debug2("%s head ED: %x:%x:%x:%x.\n", instance->name,
-			last_ed->status, last_ed->td_tail, last_ed->td_head,
-			last_ed->next);
+		usb_log_debug2("%s head ED(%p-%p): %x:%x:%x:%x.\n",
+		    instance->name, last_ed, instance->list_head_pa,
+		    last_ed->status, last_ed->td_tail, last_ed->td_head,
+		    last_ed->next);
 	}
 	fibril_mutex_unlock(&instance->guard);
