Index: uspace/drv/uhci-hcd/batch.c
===================================================================
--- uspace/drv/uhci-hcd/batch.c	(revision 299d53e4923f6405cc6c5fc25153881fc851a9fa)
+++ uspace/drv/uhci-hcd/batch.c	(revision 4abc304ad9746878e6ac0f52927611953d8ac861)
@@ -134,4 +134,6 @@
 
 	queue_head_element_td(instance->qh, addr_to_phys(instance->tds));
+	usb_log_debug("Batch(%p) %d:%d memory structures ready.\n",
+	    instance, target.address, target.endpoint);
 	return instance;
 }
@@ -196,8 +198,9 @@
 
 	instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
-	usb_log_debug("Control write last TD status: %x.\n",
+	usb_log_debug2("Control write last TD status: %x.\n",
 		instance->tds[i].status);
 
 	instance->next_step = batch_call_out_and_dispose;
+	usb_log_debug("Batch(%p) CONTROL WRITE initialized.\n", instance);
 	batch_schedule(instance);
 }
@@ -232,8 +235,9 @@
 
 	instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
-	usb_log_debug("Control read last TD status: %x.\n",
+	usb_log_debug2("Control read last TD status: %x.\n",
 		instance->tds[i].status);
 
 	instance->next_step = batch_call_in_and_dispose;
+	usb_log_debug("Batch(%p) CONTROL READ initialized.\n", instance);
 	batch_schedule(instance);
 }
@@ -261,4 +265,5 @@
 
 	instance->next_step = batch_call_in_and_dispose;
+	usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance);
 	batch_schedule(instance);
 }
@@ -288,4 +293,5 @@
 
 	instance->next_step = batch_call_out_and_dispose;
+	usb_log_debug("Batch(%p) INTERRUPT OUT initialized.\n", instance);
 	batch_schedule(instance);
 }
@@ -299,5 +305,5 @@
 
 	int err = instance->error;
-	usb_log_info("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n",
+	usb_log_debug("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n",
 	    instance, instance->transfer_type, str_error(err), err,
 	    instance->transfered_size);
@@ -314,5 +320,5 @@
 
 	int err = instance->error;
-	usb_log_info("Batch(%p) callback OUT(type:%d): %s(%d).\n",
+	usb_log_debug("Batch(%p) callback OUT(type:%d): %s(%d).\n",
 	    instance, instance->transfer_type, str_error(err), err);
 	instance->callback_out(instance->fun,
Index: uspace/drv/uhci-hcd/pci.c
===================================================================
--- uspace/drv/uhci-hcd/pci.c	(revision 299d53e4923f6405cc6c5fc25153881fc851a9fa)
+++ uspace/drv/uhci-hcd/pci.c	(revision 4abc304ad9746878e6ac0f52927611953d8ac861)
@@ -85,11 +85,11 @@
 				irq = res->res.interrupt.irq;
 				irq_found = true;
-				usb_log_debug("Found interrupt: %d.\n", irq);
+				usb_log_debug2("Found interrupt: %d.\n", irq);
 				break;
 			case IO_RANGE:
 				io_address = res->res.io_range.address;
 				io_size = res->res.io_range.size;
-				usb_log_debug("Found io: %llx %zu %zu.\n",
-				    res->res.io_range.address, res->res.io_range.size, io_size);
+				usb_log_debug2("Found io: %llx %zu.\n",
+				    res->res.io_range.address, res->res.io_range.size);
 				io_found = true;
 				break;
Index: uspace/drv/uhci-hcd/root_hub.c
===================================================================
--- uspace/drv/uhci-hcd/root_hub.c	(revision 299d53e4923f6405cc6c5fc25153881fc851a9fa)
+++ uspace/drv/uhci-hcd/root_hub.c	(revision 4abc304ad9746878e6ac0f52927611953d8ac861)
@@ -34,4 +34,5 @@
 #include <assert.h>
 #include <errno.h>
+#include <str_error.h>
 #include <stdio.h>
 #include <ops/hw_res.h>
@@ -118,4 +119,5 @@
 {
 	assert(fun);
+	assert(hc);
 	int ret;
 
@@ -136,7 +138,8 @@
 	ret = ddf_fun_add_match_id(hub, match_str, 100);
 	if (ret != EOK) {
-		usb_log_error("Failed to add root hub match id.\n");
+		usb_log_error("Failed(%d) to add root hub match id: %s\n",
+		    ret, str_error(ret));
 		ddf_fun_destroy(hub);
-		return ENOMEM;
+		return ret;
 	}
 
Index: uspace/drv/uhci-hcd/transfer_list.c
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.c	(revision 299d53e4923f6405cc6c5fc25153881fc851a9fa)
+++ uspace/drv/uhci-hcd/transfer_list.c	(revision 4abc304ad9746878e6ac0f52927611953d8ac861)
@@ -70,5 +70,5 @@
 	assert(instance);
 	assert(batch);
-	usb_log_debug("Adding batch(%p) to queue %s.\n", batch, instance->name);
+	usb_log_debug2("Adding batch(%p) to queue %s.\n", batch, instance->name);
 
 	uint32_t pa = (uintptr_t)addr_to_phys(batch->qh);
@@ -84,5 +84,5 @@
 		list_append(&batch->link, &instance->batch_list);
 		instance->queue_head->element = pa;
-		usb_log_debug2("Added batch(%p) to queue %s first.\n",
+		usb_log_debug("Batch(%p) added to queue %s first.\n",
 			batch, instance->name);
 		fibril_mutex_unlock(&instance->guard);
@@ -97,5 +97,5 @@
 	queue_head_append_qh(last->qh, pa);
 	list_append(&batch->link, &instance->batch_list);
-	usb_log_debug2("Added batch(%p) to queue %s last, first is %p.\n",
+	usb_log_debug("Batch(%p) added to queue %s last, first is %p.\n",
 		batch, instance->name, first );
 	fibril_mutex_unlock(&instance->guard);
@@ -109,13 +109,14 @@
 	assert(instance->queue_head);
 	assert(batch->qh);
+	usb_log_debug2("Removing batch(%p) from queue %s.\n", batch, instance->name);
 
 	/* I'm the first one here */
 	if (batch->link.prev == &instance->batch_list) {
-		usb_log_debug("Removing batch %p was first, next element %x.\n",
-			batch, batch->qh->next_queue);
+		usb_log_debug("Batch(%p) removed (FIRST) from queue %s, next element %x.\n",
+			batch, instance->name, batch->qh->next_queue);
 		instance->queue_head->element = batch->qh->next_queue;
 	} else {
-		usb_log_debug("Removing batch %p was NOT first, next element %x.\n",
-			batch, batch->qh->next_queue);
+		usb_log_debug("Batch(%p) removed (NOT FIRST) from queue, next element %x.\n",
+			batch, instance->name, batch->qh->next_queue);
 		batch_t *prev = list_get_instance(batch->link.prev, batch_t, link);
 		prev->qh->next_queue = batch->qh->next_queue;
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision 299d53e4923f6405cc6c5fc25153881fc851a9fa)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 4abc304ad9746878e6ac0f52927611953d8ac861)
@@ -101,14 +101,17 @@
 	bool low_speed, usb_transfer_type_t, size_t size);
 
-#define CHECK_RET_RETURN(ret, message...) \
+
+int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size)
+{
+	assert(reg_size >= sizeof(regs_t));
+	int ret;
+
+#define CHECK_RET_DEST_FUN_RETURN(ret, message...) \
 	if (ret != EOK) { \
 		usb_log_error(message); \
+		if (instance->ddf_instance) \
+			ddf_fun_destroy(instance->ddf_instance); \
 		return ret; \
 	} else (void) 0
-
-int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size)
-{
-	assert(reg_size >= sizeof(regs_t));
-	int ret;
 
 	/*
@@ -116,24 +119,24 @@
 	 */
 	instance->ddf_instance = ddf_fun_create(dev, fun_exposed, "uhci");
-	if (instance->ddf_instance == NULL) {
-		usb_log_error("Failed to create UHCI device function.\n");
-		return ENOMEM;
-	}
+	ret = (instance->ddf_instance == NULL) ? ENOMEM : EOK;
+	CHECK_RET_DEST_FUN_RETURN(ret, "Failed to create UHCI device function.\n");
+
 	instance->ddf_instance->ops = &uhci_ops;
 	instance->ddf_instance->driver_data = instance;
 
 	ret = ddf_fun_bind(instance->ddf_instance);
-	CHECK_RET_RETURN(ret, "Failed to bind UHCI device function: %s.\n",
-	    str_error(ret));
+	CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to bind UHCI device function: %s.\n",
+	    ret, str_error(ret));
 
 	/* allow access to hc control registers */
 	regs_t *io;
 	ret = pio_enable(regs, reg_size, (void**)&io);
-	CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p.\n", io);
+	CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to gain access to registers at %p: %s.\n",
+	    ret, str_error(ret), io);
 	instance->registers = io;
-	usb_log_debug("Device registers accessible.\n");
+	usb_log_debug("Device registers at %p(%u) accessible.\n", io, reg_size);
 
 	ret = uhci_init_mem_structures(instance);
-	CHECK_RET_RETURN(ret, "Failed to initialize memory structures.\n");
+	CHECK_RET_DEST_FUN_RETURN(ret, "Failed to initialize UHCI memory structures.\n");
 
 	uhci_init_hw(instance);
@@ -145,5 +148,7 @@
 	fibril_add_ready(instance->debug_checker);
 
-	return EOK;
+	usb_log_info("Started UHCI driver.\n");
+	return EOK;
+#undef CHECK_RET_DEST_FUN_RETURN
 }
 /*----------------------------------------------------------------------------*/
@@ -171,5 +176,4 @@
 	pio_write_16(&instance->registers->usbcmd,
 	    UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET | UHCI_CMD_CONFIGURE);
-	usb_log_debug("Started UHCI HC.\n");
 }
 /*----------------------------------------------------------------------------*/
@@ -177,20 +181,29 @@
 {
 	assert(instance);
+#define CHECK_RET_DEST_CMDS_RETURN(ret, message...) \
+	if (ret != EOK) { \
+		usb_log_error(message); \
+		if (instance->interrupt_code.cmds != NULL) \
+			free(instance->interrupt_code.cmds); \
+		return ret; \
+	} else (void) 0
 
 	/* init interrupt code */
-	irq_cmd_t *interrupt_commands = malloc(sizeof(uhci_cmds));
-	if (interrupt_commands == NULL) {
-		return ENOMEM;
-	}
-	memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds));
-	interrupt_commands[0].addr = (void*)&instance->registers->usbsts;
-	interrupt_commands[1].addr = (void*)&instance->registers->usbsts;
-	instance->interrupt_code.cmds = interrupt_commands;
-	instance->interrupt_code.cmdcount =
-	    sizeof(uhci_cmds) / sizeof(irq_cmd_t);
+	instance->interrupt_code.cmds = malloc(sizeof(uhci_cmds));
+	int ret = (instance->interrupt_code.cmds == NULL) ? ENOMEM : EOK;
+	CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to allocate interrupt cmds space.\n");
+
+	{
+		irq_cmd_t *interrupt_commands = instance->interrupt_code.cmds;
+		memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds));
+		interrupt_commands[0].addr = (void*)&instance->registers->usbsts;
+		interrupt_commands[1].addr = (void*)&instance->registers->usbsts;
+		instance->interrupt_code.cmdcount =
+				sizeof(uhci_cmds) / sizeof(irq_cmd_t);
+	}
 
 	/* init transfer lists */
-	int ret = uhci_init_transfer_lists(instance);
-	CHECK_RET_RETURN(ret, "Failed to initialize transfer lists.\n");
+	ret = uhci_init_transfer_lists(instance);
+	CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to initialize transfer lists.\n");
 	usb_log_debug("Initialized transfer lists.\n");
 
@@ -198,5 +211,5 @@
 	instance->frame_list = get_page();
 	ret = instance ? EOK : ENOMEM;
-	CHECK_RET_RETURN(ret, "Failed to get frame list page.\n");
+	CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to get frame list page.\n");
 	usb_log_debug("Initialized frame list.\n");
 
@@ -205,4 +218,5 @@
 	  instance->transfers_interrupt.queue_head_pa
 	  | LINK_POINTER_QUEUE_HEAD_FLAG;
+
 	unsigned i = 0;
 	for(; i < UHCI_FRAME_LIST_COUNT; ++i) {
@@ -215,4 +229,5 @@
 
 	return EOK;
+#undef CHECK_RET_DEST_CMDS_RETURN
 }
 /*----------------------------------------------------------------------------*/
@@ -220,15 +235,24 @@
 {
 	assert(instance);
+#define CHECK_RET_CLEAR_RETURN(ret, message...) \
+	if (ret != EOK) { \
+		usb_log_error(message); \
+		transfer_list_fini(&instance->transfers_bulk_full); \
+		transfer_list_fini(&instance->transfers_control_full); \
+		transfer_list_fini(&instance->transfers_control_slow); \
+		transfer_list_fini(&instance->transfers_interrupt); \
+		return ret; \
+	} else (void) 0
 
 	/* initialize TODO: check errors */
 	int ret;
 	ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL");
-	assert(ret == EOK);
+	CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list.");
 	ret = transfer_list_init(&instance->transfers_control_full, "CONTROL_FULL");
-	assert(ret == EOK);
+	CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list.");
 	ret = transfer_list_init(&instance->transfers_control_slow, "CONTROL_SLOW");
-	assert(ret == EOK);
+	CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list.");
 	ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT");
-	assert(ret == EOK);
+	CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list.");
 
 	transfer_list_set_next(&instance->transfers_control_full,
@@ -257,4 +281,5 @@
 
 	return EOK;
+#undef CHECK_RET_CLEAR_RETURN
 }
 /*----------------------------------------------------------------------------*/
Index: uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c
===================================================================
--- uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c	(revision 299d53e4923f6405cc6c5fc25153881fc851a9fa)
+++ uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c	(revision 4abc304ad9746878e6ac0f52927611953d8ac861)
@@ -67,5 +67,5 @@
 	}
 
-	usb_log_info("Created TD: %X:%X:%X:%X(%p).\n",
+	usb_log_debug2("Created TD: %X:%X:%X:%X(%p).\n",
 		instance->next, instance->status, instance->device,
 	  instance->buffer_ptr, buffer);
