Index: uspace/drv/uhci-hcd/iface.c
===================================================================
--- uspace/drv/uhci-hcd/iface.c	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-hcd/iface.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -44,5 +44,5 @@
 {
 	assert(dev);
-	uhci_t *hc = (uhci_t *)dev->driver_data;
+	uhci_t *hc = dev_to_uhci(dev);
 	assert(hc);
 	*address = usb_address_keeping_find(&hc->address_manager, handle);
@@ -55,5 +55,5 @@
 {
 	assert(dev);
-	uhci_t *hc = (uhci_t *)dev->driver_data;
+	uhci_t *hc = dev_to_uhci(dev);
 	assert(hc);
 	usb_address_keeping_reserve_default(&hc->address_manager);
@@ -64,5 +64,5 @@
 {
 	assert(dev);
-	uhci_t *hc = (uhci_t *)dev->driver_data;
+	uhci_t *hc = dev_to_uhci(dev);
 	assert(hc);
 	usb_address_keeping_release_default(&hc->address_manager);
@@ -73,5 +73,5 @@
 {
 	assert(dev);
-	uhci_t *hc = (uhci_t *)dev->driver_data;
+	uhci_t *hc = dev_to_uhci(dev);
 	assert(hc);
 	*address = usb_address_keeping_request(&hc->address_manager);
@@ -85,5 +85,5 @@
 {
 	assert(dev);
-	uhci_t *hc = (uhci_t *)dev->driver_data;
+	uhci_t *hc = dev_to_uhci(dev);
 	assert(hc);
 	usb_address_keeping_devman_bind(&hc->address_manager, address, handle);
@@ -94,5 +94,5 @@
 {
 	assert(dev);
-	uhci_t *hc = (uhci_t *)dev->driver_data;
+	uhci_t *hc = dev_to_uhci(dev);
 	assert(hc);
 	usb_address_keeping_release_default(&hc->address_manager);
@@ -104,5 +104,8 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	return uhci_transfer(dev, target, USB_TRANSFER_INTERRUPT, 0, USB_PID_OUT,
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+	return uhci_transfer(hc, dev, target, USB_TRANSFER_INTERRUPT, 0, USB_PID_OUT,
 		data, size, callback, NULL, arg);
 }
@@ -112,5 +115,8 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	return uhci_transfer(dev, target, USB_TRANSFER_INTERRUPT, 0, USB_PID_IN,
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+	return uhci_transfer(hc, dev, target, USB_TRANSFER_INTERRUPT, 0, USB_PID_IN,
 		data, size, NULL, callback, arg);
 }
@@ -120,5 +126,8 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_SETUP,
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+	return uhci_transfer(hc, dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_SETUP,
 		data, size, callback, NULL, arg);
 }
@@ -128,5 +137,8 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 1, USB_PID_OUT,
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+	return uhci_transfer(hc, dev, target, USB_TRANSFER_CONTROL, 1, USB_PID_OUT,
 		data, size, callback, NULL, arg);
 }
@@ -135,5 +147,8 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_IN,
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+	return uhci_transfer(hc, dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_IN,
 		NULL, 0, NULL, callback, arg);
 }
@@ -143,5 +158,8 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_SETUP,
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+	return uhci_transfer(hc, dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_SETUP,
 		data, size, callback, NULL, arg);
 }
@@ -151,5 +169,8 @@
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 1, USB_PID_IN,
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+	return uhci_transfer(hc, dev, target, USB_TRANSFER_CONTROL, 1, USB_PID_IN,
 		data, size, NULL, callback, arg);
 }
@@ -158,5 +179,8 @@
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	return uhci_transfer(dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_OUT,
+	assert(dev);
+	uhci_t *hc = dev_to_uhci(dev);
+	assert(hc);
+	return uhci_transfer(hc, dev, target, USB_TRANSFER_CONTROL, 0, USB_PID_OUT,
 		NULL, 0, callback, NULL, arg);
 }
Index: uspace/drv/uhci-hcd/main.c
===================================================================
--- uspace/drv/uhci-hcd/main.c	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-hcd/main.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -87,6 +87,11 @@
 	    io_reg_base, io_reg_size, irq);
 
-	int ret = uhci_init(device, (void*)io_reg_base, io_reg_size);
+	uhci_t *uhci_hc = malloc(sizeof(uhci_t));
+	if (!uhci_hc) {
+		usb_log_error("Failed to allocaete memory for uhci hcd driver.\n");
+		return ENOMEM;
+	}
 
+	int ret = uhci_init(uhci_hc, (void*)io_reg_base, io_reg_size);
 	if (ret != EOK) {
 		usb_log_error("Failed to init uhci-hcd.\n");
@@ -108,4 +113,6 @@
 		return ret;
 	}
+
+	device->driver_data = uhci_hc;
 
 	return EOK;
Index: uspace/drv/uhci-hcd/transfer_list.c
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.c	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-hcd/transfer_list.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -43,5 +43,5 @@
 	instance->first = NULL;
 	instance->last = NULL;
-	instance->queue_head = malloc32(sizeof(queue_head_t));
+	instance->queue_head = queue_head_get();
 	if (!instance->queue_head) {
 		usb_log_error("Failed to allocate queue head.\n");
Index: uspace/drv/uhci-hcd/transfer_list.h
===================================================================
--- uspace/drv/uhci-hcd/transfer_list.h	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-hcd/transfer_list.h	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -37,5 +37,4 @@
 #include "uhci_struct/queue_head.h"
 #include "uhci_struct/transfer_descriptor.h"
-#include "utils/malloc32.h"
 
 typedef struct transfer_list
@@ -52,6 +51,5 @@
 {
 	assert(instance);
-	if (instance->queue_head)
-		free32(instance->queue_head);
+	queue_head_dispose(instance->queue_head);
 }
 
Index: uspace/drv/uhci-hcd/uhci.c
===================================================================
--- uspace/drv/uhci-hcd/uhci.c	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-hcd/uhci.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -37,5 +37,4 @@
 #include <usb/usb.h>
 
-#include "utils/malloc32.h"
 #include "uhci.h"
 
@@ -44,24 +43,11 @@
 static int uhci_debug_checker(void *arg);
 
-int uhci_init(device_t *device, void *regs, size_t reg_size)
-{
-	assert(device);
-	usb_log_info("Initializing device at address %p.\n", device);
-
-#define CHECK_RET_FREE_INSTANCE(message...) \
+int uhci_init(uhci_t *instance, void *regs, size_t reg_size)
+{
+#define CHECK_RET_RETURN(message...) \
 	if (ret != EOK) { \
 		usb_log_error(message); \
-		if (instance) { \
-			free(instance); \
-		} \
 		return ret; \
 	} else (void) 0
-
-	/* create instance */
-	uhci_t *instance = malloc(sizeof(uhci_t));
-	int ret = instance ? EOK : ENOMEM;
-	CHECK_RET_FREE_INSTANCE("Failed to allocate uhci driver instance.\n");
-
-	bzero(instance, sizeof(uhci_t));
 
 	/* init address keeper(libusb) */
@@ -72,6 +58,6 @@
 	regs_t *io;
 	assert(reg_size >= sizeof(regs_t));
-	ret = pio_enable(regs, reg_size, (void**)&io);
-	CHECK_RET_FREE_INSTANCE("Failed to gain access to registers at %p.\n", io);
+	int ret = pio_enable(regs, reg_size, (void**)&io);
+	CHECK_RET_RETURN("Failed to gain access to registers at %p.\n", io);
 	instance->registers = io;
 	usb_log_debug("Device registers accessible.\n");
@@ -79,5 +65,5 @@
 	/* init transfer lists */
 	ret = uhci_init_transfer_lists(instance->transfers);
-	CHECK_RET_FREE_INSTANCE("Failed to initialize transfer lists.\n");
+	CHECK_RET_RETURN("Failed to initialize transfer lists.\n");
 	usb_log_debug("Transfer lists initialized.\n");
 
@@ -86,11 +72,11 @@
 	instance->frame_list = get_page();
 	ret = instance ? EOK : ENOMEM;
-	CHECK_RET_FREE_INSTANCE("Failed to get frame list page.\n");
+	CHECK_RET_RETURN("Failed to get frame list page.\n");
 
 	/* initialize all frames to point to the first queue head */
-	unsigned i = 0;
 	const uint32_t queue =
 	  instance->transfers[USB_TRANSFER_INTERRUPT].queue_head_pa
 	  | LINK_POINTER_QUEUE_HEAD_FLAG;
+	unsigned i = 0;
 	for(; i < UHCI_FRAME_LIST_COUNT; ++i) {
 		instance->frame_list[i] = queue;
@@ -107,6 +93,8 @@
 	fibril_add_ready(instance->debug_checker);
 
-	usb_log_debug("Starting UHCI HC.\n");
-	pio_write_16(&instance->registers->usbcmd, UHCI_CMD_RUN_STOP);
+	/* Start the hc with large(64b) packet FSBR */
+	pio_write_16(&instance->registers->usbcmd,
+	    UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET);
+	usb_log_debug("Started UHCI HC.\n");
 /*
 	uint16_t cmd = pio_read_16(&instance->registers->usbcmd);
@@ -114,5 +102,4 @@
 	pio_write_16(&instance->registers->usbcmd, cmd);
 */
-	device->driver_data = instance;
 	return EOK;
 }
@@ -152,4 +139,5 @@
 /*----------------------------------------------------------------------------*/
 int uhci_transfer(
+  uhci_t *instance,
   device_t *dev,
   usb_target_t target,
@@ -172,4 +160,5 @@
 	callback_t *job = NULL;
 	int ret = EOK;
+	assert(dev);
 
 #define CHECK_RET_TRANS_FREE_JOB_TD(message) \
@@ -183,5 +172,4 @@
 	} else (void) 0
 
-
 	job = callback_get(dev, buffer, size, callback_in, callback_out, arg);
 	ret = job ? EOK : ENOMEM;
@@ -193,8 +181,4 @@
 
 	td->callback = job;
-
-	assert(dev);
-	uhci_t *instance = (uhci_t*)dev->driver_data;
-	assert(instance);
 
 	usb_log_debug("Appending a new transfer to queue.\n");
Index: uspace/drv/uhci-hcd/uhci.h
===================================================================
--- uspace/drv/uhci-hcd/uhci.h	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-hcd/uhci.h	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -85,9 +85,10 @@
 
 /* init uhci specifics in device.driver_data */
-int uhci_init(device_t *device, void *regs, size_t reg_size);
+int uhci_init(uhci_t *instance, void *regs, size_t reg_size);
 
-int uhci_destroy(device_t *device);
+int uhci_fini(uhci_t *device);
 
 int uhci_transfer(
+  uhci_t *instance,
   device_t *dev,
   usb_target_t target,
@@ -100,4 +101,7 @@
   void *arg );
 
+static inline uhci_t * dev_to_uhci(device_t *dev)
+	{ return (uhci_t*)dev->driver_data; }
+
 #endif
 /**
Index: uspace/drv/uhci-hcd/uhci_struct/queue_head.h
===================================================================
--- uspace/drv/uhci-hcd/uhci_struct/queue_head.h	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-hcd/uhci_struct/queue_head.h	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -36,7 +36,9 @@
 #define DRV_UHCI_QH_H
 
+/* libc */
 #include <assert.h>
 
 #include "link_pointer.h"
+#include "utils/malloc32.h"
 
 typedef struct queue_head {
@@ -59,4 +61,11 @@
 }
 
+static inline queue_head_t * queue_head_get()
+	{ return malloc32(sizeof(queue_head_t)); }
+
+static inline void queue_head_dispose(queue_head_t *head)
+	{ free32(head); }
+
+
 #endif
 /**
Index: uspace/drv/uhci-hcd/utils/malloc32.h
===================================================================
--- uspace/drv/uhci-hcd/utils/malloc32.h	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-hcd/utils/malloc32.h	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -74,6 +74,6 @@
 	{ return memalign(alignment, size); }
 
-static inline void free32(void * addr)
-	{ free(addr); }
+static inline void free32(void *addr)
+	{ if (addr) free(addr); }
 
 #endif
Index: uspace/drv/uhci-rhd/main.c
===================================================================
--- uspace/drv/uhci-rhd/main.c	(revision c56dbe0145daee356fb1f4205867f51767935e91)
+++ uspace/drv/uhci-rhd/main.c	(revision 5944244047980ad57454f72c6698d28d54fdee4e)
@@ -86,5 +86,5 @@
 
 	device->driver_data = rh;
-	usb_log_info("Sucessfully initialized driver isntance for device:%d.\n",
+	usb_log_info("Sucessfully initialized driver instance for device:%d.\n",
 	    device->handle);
 	return EOK;
