Index: uspace/drv/ohci/root_hub.c
===================================================================
--- uspace/drv/ohci/root_hub.c	(revision fefc27db2a77b80715febbcfb47ed77bf9c669c3)
+++ uspace/drv/ohci/root_hub.c	(revision 6c399765066bb4c35f189205cab7bbd61db00d88)
@@ -244,5 +244,5 @@
 {
 	assert(instance);
-	instance->address = -1;
+	//instance->address = -1;
 	instance->registers = regs;
 	instance->device = dev;
@@ -278,4 +278,12 @@
 	request->transfered_size = 4;
 	uint32_buffer[0] = instance->registers->rh_port_status[port -1];
+#if 0
+	int i;
+	for(i=0;i<instance->port_count;++i){
+		usb_log_debug("port status %d,x%x\n",
+				instance->registers->rh_port_status[i],
+				instance->registers->rh_port_status[i]);
+	}
+#endif
 	return EOK;
 }
@@ -298,5 +306,4 @@
 	uint32_buffer[0] = mask & instance->registers->rh_status;
 	return EOK;
-
 }
 
@@ -339,5 +346,6 @@
  * Result contains bitmap where bit 0 indicates change on hub and
  * bit i indicates change on i`th port (i>0). For more info see
- * Hub and Port status bitmap specification in USB specification.
+ * Hub and Port status bitmap specification in USB specification
+ * (chapter 11.13.4)
  * @param instance root hub instance
  * @param@out buffer pointer to created interrupt mas
@@ -347,8 +355,10 @@
 		size_t * buffer_size){
 	int bit_count = instance->port_count + 1;
-	(*buffer_size) = (bit_count / 8) + (bit_count%8==0)?0:1;
+	(*buffer_size) = (bit_count / 8) + ((bit_count%8==0)?0:1);
+	
 	(*buffer) = malloc(*buffer_size);
 	uint8_t * bitmap = (uint8_t*)(*buffer);
-	uint32_t mask = (1<<16) + (1<<17);
+	uint32_t mask = (1<<(USB_HUB_FEATURE_C_HUB_LOCAL_POWER+16))
+			| (1<<(USB_HUB_FEATURE_C_HUB_OVER_CURRENT+16));
 	bzero(bitmap,(*buffer_size));
 	if(instance->registers->rh_status & mask){
@@ -358,9 +368,10 @@
 	mask = 0;
 	int i;
-	for(i=16;i<=20;++i)
+	for(i=16;i<=20;++i){
 		mask += 1<<i;
+	}
 	for(port = 1; port<=instance->port_count;++port){
 		if(mask & instance->registers->rh_port_status[port-1]){
-			bitmap[(port+1)/8] += 1<<(port%8);
+			bitmap[(port)/8] += 1<<(port%8);
 		}
 	}
@@ -436,6 +447,4 @@
 	request->transfered_size = size;
 	memcpy(request->transport_buffer,result_descriptor,size);
-	usb_log_debug("sent desctiptor: %s\n",
-			usb_debug_str_buffer((uint8_t*)request->transport_buffer,size,size));
 	if (del)
 		free(result_descriptor);
Index: uspace/drv/usbhub/usbhub.c
===================================================================
--- uspace/drv/usbhub/usbhub.c	(revision fefc27db2a77b80715febbcfb47ed77bf9c669c3)
+++ uspace/drv/usbhub/usbhub.c	(revision 6c399765066bb4c35f189205cab7bbd61db00d88)
@@ -54,5 +54,5 @@
 
 
-static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port,
+static int usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port,
 		usb_speed_t speed);
 
@@ -76,4 +76,5 @@
 		async_usleep(1000 * 1000 * 10 );/// \TODO proper number once
 		errorCode = usb_hub_check_hub_changes(hub_info);
+		
 	}
 	usb_log_error("something in ctrl loop went wrong, errno %d\n",errorCode);
@@ -125,12 +126,15 @@
 	 * these lines allow to reset hub once more, it can be used as
 	 * brute-force initialization for non-removable devices
-	int opResult = usb_request_set_configuration(&result->endpoints.control, 1);
+	 */
+	int opResult = usb_request_set_configuration(hub_info->control_pipe,
+			1);
 	if(opResult!=EOK){
 		usb_log_error("could not set default configuration, errno %d",opResult);
 		return opResult;
 	}
-	 */
+	 
+	 
 	size_t received_size;
-	int opResult = usb_request_get_descriptor(&hub_info->usb_device->ctrl_pipe,
+	opResult = usb_request_get_descriptor(&hub_info->usb_device->ctrl_pipe,
 			USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_DEVICE,
 			USB_DESCTYPE_HUB,
@@ -163,6 +167,14 @@
 	usb_log_debug2("freeing data\n");
 	free(serialized_descriptor);
-	free(descriptor->devices_removable);
-	free(descriptor);
+	hub_info->descriptor = descriptor;
+	hub_info->not_initialized_non_removables =
+		(uint8_t*)malloc((hub_info->port_count+8)/8);
+	memcpy(hub_info->not_initialized_non_removables,
+		descriptor->devices_removable,
+		(hub_info->port_count+8)/8
+		);
+
+	//free(descriptor->devices_removable);
+	//free(descriptor);
 	return EOK;
 }
@@ -289,14 +301,23 @@
  * @return error code
  */
-static int usb_hub_trigger_connecting_non_removable_devices(usb_hub_info_t * hub,
+static int usb_hub_trigger_connecting_non_removable_devices(
+		usb_hub_info_t * hub,
 		usb_hub_descriptor_t * descriptor)
 {
 	usb_log_info("attaching non-removable devices(if any)\n");
-	usb_device_request_setup_packet_t request;
+	//usb_device_request_setup_packet_t request;
 	int opResult;
-	size_t rcvd_size;
-	usb_port_status_t status;
+	//size_t rcvd_size;
+	//usb_port_status_t status;
 	uint8_t * non_removable_dev_bitmap = descriptor->devices_removable;
 	int port;
+
+	opResult = usb_request_set_configuration(hub->control_pipe,
+			1);
+	if(opResult!=EOK){
+		usb_log_error("could not set default configuration, errno %d",opResult);
+		return opResult;
+	}
+#if 0
 	for(port=1;port<=descriptor->ports_count;++port){
 		bool is_non_removable =
@@ -315,21 +336,25 @@
 				return opResult;
 			}
-			if(usb_port_dev_connected(&status)){
-			usb_hub_set_enable_port_feature_request(&request, port,
-					USB_HUB_FEATURE_PORT_RESET);
-			opResult = usb_pipe_control_read(
-					hub->control_pipe,
-					&request, sizeof(usb_device_request_setup_packet_t),
-					&status, 4, &rcvd_size
-					);
-			if (opResult != EOK) {
-				usb_log_warning(
-						"could not reset port %d errno:%d\n",
-						port, opResult);
-			}
-			usb_log_debug("port reset\n");
+			//try to reset port
+			if(usb_port_dev_connected(&status) || true){
+				usb_hub_set_enable_port_feature_request(&request, port,
+						USB_HUB_FEATURE_PORT_RESET);
+				opResult = usb_pipe_control_read(
+						hub->control_pipe,
+						&request, sizeof(usb_device_request_setup_packet_t),
+						&status, 4, &rcvd_size
+						);
+				if (opResult != EOK) {
+					usb_log_warning(
+							"could not reset port %d errno:%d\n",
+							port, opResult);
+				}
+				usb_log_debug("port reset, should look like %d,x%x\n",
+						(1<<USB_HUB_FEATURE_PORT_RESET),
+						(1<<USB_HUB_FEATURE_PORT_RESET)
+						);
 			}
 			//set the status change bit, so it will be noticed in driver loop
-			/*if(usb_port_dev_connected(&status)){
+			if(usb_port_dev_connected(&status) && false){
 				usb_hub_set_disable_port_feature_request(&request, port,
 						USB_HUB_FEATURE_PORT_CONNECTION);
@@ -358,7 +383,9 @@
 				}
 				usb_log_debug("port set to enabled - should lead to connection change\n");
-			}*/
+			}
 		}
 	}
+#endif
+
 	/// \TODO this is just a debug code
 	for(port=1;port<=descriptor->ports_count;++port){
@@ -366,5 +393,5 @@
 				((non_removable_dev_bitmap[port/8]) >> (port%8)) %2;
 		if(is_non_removable){
-			usb_log_debug("port %d is non-removable\n",port);
+			usb_log_debug("CHECKING port %d is non-removable\n",port);
 			usb_port_status_t status;
 			size_t rcvd_size;
@@ -392,4 +419,5 @@
 		}
 	}
+
 	return EOK;
 }
@@ -419,9 +447,10 @@
  * @param port port number, starting from 1
  * @param speed transfer speed of attached device, one of low, full or high
- */
-static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port,
+ * @return error code
+ */
+static int usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port,
 		usb_speed_t speed) {
 	//if this hub already uses default address, it cannot request it once more
-	if(hub->is_default_address_used) return;
+	if(hub->is_default_address_used) return EREFUSED;
 	usb_log_debug("some connection changed\n");
 	assert(hub->control_pipe->hc_phone);
@@ -439,5 +468,5 @@
 		usb_log_warning("cannot assign default address, it is probably used %d\n",
 				opResult);
-		return;
+		return opResult;
 	}
 	hub->is_default_address_used = true;
@@ -453,5 +482,5 @@
 		usb_hub_release_default_address(hub);
 	}
-	return;
+	return opResult;
 }
 
@@ -670,5 +699,5 @@
 		}
 	}
-	usb_log_debug("status %x\n ",status);
+	usb_log_debug("status x%x : %d\n ",status,status);
 
 	usb_port_set_connect_change(&status, false);
@@ -683,4 +712,41 @@
 }
 
+
+static int initialize_non_removable(usb_hub_info_t * hub_info,
+	unsigned int port){
+	int opResult;
+	usb_log_debug("there is not pluged in non-removable device on "
+		"port %d\n",port
+		);
+	//usb_hub_init_add_device(hub_info, port, usb_port_speed(&status));
+	usb_port_status_t status;
+	size_t rcvd_size;
+	usb_device_request_setup_packet_t request;
+	//int opResult;
+	usb_hub_set_port_status_request(&request, port);
+	//endpoint 0
+
+	opResult = usb_pipe_control_read(
+			hub_info->control_pipe,
+			&request, sizeof(usb_device_request_setup_packet_t),
+			&status, 4, &rcvd_size
+			);
+	if (opResult != EOK) {
+		usb_log_error("could not get port status %d\n",opResult);
+		return opResult;
+	}
+	if (rcvd_size != sizeof (usb_port_status_t)) {
+		usb_log_error("received status has incorrect size\n");
+		return opResult;
+	}
+	usb_log_debug("port status %d, x%x\n",status,status);
+	if(usb_port_dev_connected(&status)){
+		usb_log_debug("there is connected device on this port\n");
+	}
+	if(!hub_info->is_default_address_used)
+		usb_hub_init_add_device(hub_info, port, usb_port_speed(&status));
+	return opResult;
+}
+
 /**
  * check changes on hub
@@ -694,4 +760,6 @@
 	opResult = usb_pipe_start_session(
 			hub_info->status_change_pipe);
+	//this might not be necessary - if all non-removables are ok, it is not needed here
+	opResult = usb_pipe_start_session(hub_info->control_pipe);
 	if(opResult != EOK){
 		usb_log_error("could not initialize communication for hub; %d\n",
@@ -701,4 +769,17 @@
 
 	size_t port_count = hub_info->port_count;
+	//first check non-removable devices
+	{
+	unsigned int port;
+	for(port = 1; port<=port_count; ++port){
+		bool is_non_removable =
+			hub_info->not_initialized_non_removables[port/8]
+			& (1 << (port%8));
+		if(is_non_removable){
+			opResult = initialize_non_removable(hub_info,port);
+		}
+	}
+	}
+
 
 	/// FIXME: count properly
@@ -722,5 +803,5 @@
 	}
 	unsigned int port;
-	opResult = usb_pipe_start_session(hub_info->control_pipe);
+	
 	if(opResult!=EOK){
 		usb_log_error("could not start control pipe session %d\n", opResult);
Index: uspace/drv/usbhub/usbhub.h
===================================================================
--- uspace/drv/usbhub/usbhub.h	(revision fefc27db2a77b80715febbcfb47ed77bf9c669c3)
+++ uspace/drv/usbhub/usbhub.h	(revision 6c399765066bb4c35f189205cab7bbd61db00d88)
@@ -43,4 +43,5 @@
 
 #include <usb/hub.h>
+#include <usb/classes/hub.h>
 
 #include <usb/pipes.h>
@@ -84,4 +85,11 @@
 	/** generic usb device data*/
 	usb_device_t * usb_device;
+
+	/** usb hub specific descriptor */
+	usb_hub_descriptor_t * descriptor;
+
+	/** not yet initialized non-removable devices */
+	uint8_t * not_initialized_non_removables;
+
 } usb_hub_info_t;
 
