Index: uspace/drv/vhc/connhost.c
===================================================================
--- uspace/drv/vhc/connhost.c	(revision 46e078a088fe8c3ab8b11e525495ff063c8d7aca)
+++ uspace/drv/vhc/connhost.c	(revision 357a3021b85ee61052a29e8e5188756e124b7ba3)
@@ -48,5 +48,5 @@
 	usbhc_iface_transfer_out_callback_t out_callback;
 	usbhc_iface_transfer_in_callback_t in_callback;
-	ddf_fun_t *fun;
+	device_t *dev;
 	size_t reported_size;
 	void *arg;
@@ -58,5 +58,5 @@
 	usbhc_iface_transfer_out_callback_t out_callback;
 	usbhc_iface_transfer_in_callback_t in_callback;
-	ddf_fun_t *fun;
+	device_t *dev;
 	void *arg;
 	void *data_buffer;
@@ -75,10 +75,10 @@
 	switch (transfer->direction) {
 		case USB_DIRECTION_IN:
-			transfer->in_callback(transfer->fun,
+			transfer->in_callback(transfer->dev,
 			    outcome, size,
 			    transfer->arg);
 			break;
 		case USB_DIRECTION_OUT:
-			transfer->out_callback(transfer->fun,
+			transfer->out_callback(transfer->dev,
 			    outcome,
 			    transfer->arg);
@@ -92,5 +92,5 @@
 }
 
-static transfer_info_t *create_transfer_info(ddf_fun_t *fun,
+static transfer_info_t *create_transfer_info(device_t *dev,
     usb_direction_t direction, void *arg)
 {
@@ -101,5 +101,5 @@
 	transfer->out_callback = NULL;
 	transfer->arg = arg;
-	transfer->fun = fun;
+	transfer->dev = dev;
 	transfer->reported_size = (size_t) -1;
 
@@ -112,10 +112,10 @@
 	switch (transfer->direction) {
 		case USB_DIRECTION_IN:
-			transfer->in_callback(transfer->fun,
+			transfer->in_callback(transfer->dev,
 			    outcome, size,
 			    transfer->arg);
 			break;
 		case USB_DIRECTION_OUT:
-			transfer->out_callback(transfer->fun,
+			transfer->out_callback(transfer->dev,
 			    outcome,
 			    transfer->arg);
@@ -138,5 +138,5 @@
 	}
 
-	transfer_info_t *transfer  = create_transfer_info(ctrl_transfer->fun,
+	transfer_info_t *transfer  = create_transfer_info(ctrl_transfer->dev,
 	    ctrl_transfer->direction, ctrl_transfer->arg);
 	transfer->out_callback = ctrl_transfer->out_callback;
@@ -195,5 +195,5 @@
 }
 
-static control_transfer_info_t *create_control_transfer_info(ddf_fun_t *fun,
+static control_transfer_info_t *create_control_transfer_info(device_t *dev,
     usb_direction_t direction, usb_target_t target,
     void *data_buffer, size_t data_buffer_size,
@@ -208,5 +208,5 @@
 	transfer->out_callback = NULL;
 	transfer->arg = arg;
-	transfer->fun = fun;
+	transfer->dev = dev;
 	transfer->data_buffer = data_buffer;
 	transfer->data_buffer_size = data_buffer_size;
@@ -215,5 +215,5 @@
 }
 
-static int enqueue_transfer_out(ddf_fun_t *fun,
+static int enqueue_transfer_out(device_t *dev,
     usb_target_t target, usb_transfer_type_t transfer_type,
     void *buffer, size_t size,
@@ -226,5 +226,5 @@
 
 	transfer_info_t *transfer
-	    = create_transfer_info(fun, USB_DIRECTION_OUT, arg);
+	    = create_transfer_info(dev, USB_DIRECTION_OUT, arg);
 	transfer->out_callback = callback;
 
@@ -235,5 +235,5 @@
 }
 
-static int enqueue_transfer_in(ddf_fun_t *fun,
+static int enqueue_transfer_in(device_t *dev,
     usb_target_t target, usb_transfer_type_t transfer_type,
     void *buffer, size_t size,
@@ -246,5 +246,5 @@
 
 	transfer_info_t *transfer
-	    = create_transfer_info(fun, USB_DIRECTION_IN, arg);
+	    = create_transfer_info(dev, USB_DIRECTION_IN, arg);
 	transfer->in_callback = callback;
 
@@ -256,23 +256,26 @@
 
 
-static int interrupt_out(ddf_fun_t *fun, usb_target_t target,
+static int interrupt_out(device_t *dev, usb_target_t target,
+    size_t max_packet_size,
     void *data, size_t size,
     usbhc_iface_transfer_out_callback_t callback, void *arg)
 {
-	return enqueue_transfer_out(fun, target, USB_TRANSFER_INTERRUPT,
+	return enqueue_transfer_out(dev, target, USB_TRANSFER_INTERRUPT,
 	    data, size,
 	    callback, arg);
 }
 
-static int interrupt_in(ddf_fun_t *fun, usb_target_t target,
+static int interrupt_in(device_t *dev, usb_target_t target,
+    size_t max_packet_size,
     void *data, size_t size,
     usbhc_iface_transfer_in_callback_t callback, void *arg)
 {
-	return enqueue_transfer_in(fun, target, USB_TRANSFER_INTERRUPT,
+	return enqueue_transfer_in(dev, target, USB_TRANSFER_INTERRUPT,
 	    data, size,
 	    callback, arg);
 }
 
-static int control_write(ddf_fun_t *fun, usb_target_t target,
+static int control_write(device_t *dev, usb_target_t target,
+    size_t max_packet_size,
     void *setup_packet, size_t setup_packet_size,
     void *data, size_t data_size,
@@ -280,5 +283,5 @@
 {
 	control_transfer_info_t *transfer
-	    = create_control_transfer_info(fun, USB_DIRECTION_OUT, target,
+	    = create_control_transfer_info(dev, USB_DIRECTION_OUT, target,
 	    data, data_size, arg);
 	transfer->out_callback = callback;
@@ -291,5 +294,6 @@
 }
 
-static int control_read(ddf_fun_t *fun, usb_target_t target,
+static int control_read(device_t *dev, usb_target_t target,
+    size_t max_packet_size,
     void *setup_packet, size_t setup_packet_size,
     void *data, size_t data_size,
@@ -297,5 +301,5 @@
 {
 	control_transfer_info_t *transfer
-	    = create_control_transfer_info(fun, USB_DIRECTION_IN, target,
+	    = create_control_transfer_info(dev, USB_DIRECTION_IN, target,
 	    data, data_size, arg);
 	transfer->in_callback = callback;
@@ -310,9 +314,7 @@
 static usb_address_keeping_t addresses;
 
-static int tell_address(ddf_fun_t *fun, devman_handle_t handle,
+static int tell_address(device_t *dev, devman_handle_t handle,
     usb_address_t *address)
 {
-	usb_log_debug("tell_address(fun \"%s\", handle %zu)\n",
-	    fun->name, (size_t) fun->handle);
 	usb_address_t addr = usb_address_keeping_find(&addresses, handle);
 	if (addr < 0) {
@@ -324,5 +326,17 @@
 }
 
-static int request_address(ddf_fun_t *fun, usb_speed_t ignored,
+static int reserve_default_address(device_t *dev, usb_speed_t ignored)
+{
+	usb_address_keeping_reserve_default(&addresses);
+	return EOK;
+}
+
+static int release_default_address(device_t *dev)
+{
+	usb_address_keeping_release_default(&addresses);
+	return EOK;
+}
+
+static int request_address(device_t *dev, usb_speed_t ignored,
     usb_address_t *address)
 {
@@ -336,10 +350,10 @@
 }
 
-static int release_address(ddf_fun_t *fun, usb_address_t address)
+static int release_address(device_t *dev, usb_address_t address)
 {
 	return usb_address_keeping_release(&addresses, address);
 }
 
-static int bind_address(ddf_fun_t *fun, usb_address_t address,
+static int bind_address(device_t *dev, usb_address_t address,
     devman_handle_t handle)
 {
@@ -348,26 +362,4 @@
 }
 
-static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun,
-    devman_handle_t *handle)
-{
-	ddf_fun_t *hc_fun = root_hub_fun->driver_data;
-	assert(hc_fun != NULL);
-
-	*handle = hc_fun->handle;
-
-	usb_log_debug("usb_iface_get_hc_handle_rh_impl returns %zu\n", *handle);
-
-	return EOK;
-}
-
-static int tell_address_rh(ddf_fun_t *root_hub_fun, devman_handle_t handle,
-    usb_address_t *address)
-{
-	ddf_fun_t *hc_fun = root_hub_fun->driver_data;
-	assert(hc_fun != NULL);
-
-	return tell_address(hc_fun, root_hub_fun->handle, address);
-}
-
 void address_init(void)
 {
@@ -376,4 +368,6 @@
 
 usbhc_iface_t vhc_iface = {
+	.reserve_default_address = reserve_default_address,
+	.release_default_address = release_default_address,
 	.request_address = request_address,
 	.bind_address = bind_address,
@@ -392,9 +386,4 @@
 };
 
-usb_iface_t rh_usb_iface = {
-	.get_hc_handle = usb_iface_get_hc_handle_rh_impl,
-	.get_address = tell_address_rh
-};
-
 
 /**
