Index: uspace/drv/bus/usb/ohci/root_hub.c
===================================================================
--- uspace/drv/bus/usb/ohci/root_hub.c	(revision 5af769c028ef53f881fbebb7bbd1037196e201fa)
+++ uspace/drv/bus/usb/ohci/root_hub.c	(revision 00694c5a8db25e7cdffdfda7f799d6057ab36515)
@@ -58,5 +58,5 @@
 	.device_version = 0,
 	.length = sizeof (usb_standard_device_descriptor_t),
-	.max_packet_size = 8,
+	.max_packet_size = 64,
 	.vendor_id = 0x16db,
 	.product_id = 0x0001,
@@ -101,21 +101,8 @@
 	.descriptor_type = USB_DESCTYPE_ENDPOINT,
 	.endpoint_address = 1 + (1 << 7),
-	.length = sizeof (usb_standard_endpoint_descriptor_t),
-	.max_packet_size = 8,
+	.length = sizeof(usb_standard_endpoint_descriptor_t),
+	.max_packet_size = 2,
 	.poll_interval = 255,
 };
-
-/**
- * bitmask of hub features that are valid to be set
- */
-static const uint32_t hub_set_feature_valid_mask =
-    RHS_LPSC_FLAG |
-    RHS_OCIC_FLAG;
-
-/**
- * bitmask of hub features that are set by writing 1 and cleared by writing 0
- */
-static const uint32_t hub_set_feature_direct_mask =
-    RHS_SET_PORT_POWER;
 
 /**
@@ -145,38 +132,19 @@
 //USB_HUB_FEATURE_PORT_LOW_SPEED for port set feature request
 
-/**
- * bitmask with port status changes
- */
-static const uint32_t port_status_change_mask = RHPS_CHANGE_WC_MASK;
-
 static void create_serialized_hub_descriptor(rh_t *instance);
-
 static void rh_init_descriptors(rh_t *instance);
-
 static void create_interrupt_mask_in_instance(rh_t *instance);
-
-static int get_status_request(
-    rh_t *instance, usb_transfer_batch_t *request);
-
+static int get_status_request(rh_t *instance, usb_transfer_batch_t *request);
 static int get_descriptor_request(
     rh_t *instance, usb_transfer_batch_t *request);
-
 static int port_feature_set_request(
     rh_t *instance, uint16_t feature, uint16_t port);
-
 static int port_feature_clear_request(
     rh_t *instance, uint16_t feature, uint16_t port);
-
-static int request_with_output(
+static int request_with_output(rh_t *instance, usb_transfer_batch_t *request);
+static int request_without_data(rh_t *instance, usb_transfer_batch_t *request);
+static int ctrl_request(rh_t *instance, usb_transfer_batch_t *request);
+static void interrupt_mask_in_instance(
     rh_t *instance, usb_transfer_batch_t *request);
-
-static int request_without_data(
-    rh_t *instance, usb_transfer_batch_t *request);
-
-static int ctrl_request(rh_t *instance, usb_transfer_batch_t *request);
-
-static int interrupt_mask_in_instance(
-    rh_t *instance, usb_transfer_batch_t *request);
-
 static bool is_zeros(const void *buffer, size_t size);
 
@@ -381,4 +349,5 @@
 	}
 
+	/* Hub status: just filter relevant info from rh_status reg */
 	if (request_packet->request_type == USB_HUB_REQ_TYPE_GET_HUB_STATUS) {
 		const uint32_t data = instance->registers->rh_status &
@@ -388,6 +357,8 @@
 	}
 
+	/* Copy appropriate rh_port_status register, OHCI designers were
+	 * kind enough to make those bit values match USB specification */
 	if (request_packet->request_type == USB_HUB_REQ_TYPE_GET_PORT_STATUS) {
-		unsigned port = request_packet->index;
+		const unsigned port = request_packet->index;
 		if (port < 1 || port > instance->port_count)
 			return EINVAL;
@@ -417,16 +388,16 @@
 
 	uint8_t * bitmap = instance->interrupt_buffer;
-	uint32_t mask = (1 << (USB_HUB_FEATURE_C_HUB_LOCAL_POWER + 16))
-	    | (1 << (USB_HUB_FEATURE_C_HUB_OVER_CURRENT + 16));
 	bzero(bitmap, instance->interrupt_mask_size);
-	if ((instance->registers->rh_status & mask) != 0) {
+	/* Only local power source change and over-current change can happen */
+	if (instance->registers->rh_status & (RHS_LPSC_FLAG | RHS_OCIC_FLAG)) {
 		bitmap[0] = 1;
 	}
-	mask = port_status_change_mask;
 	size_t port = 1;
 	for (; port <= instance->port_count; ++port) {
-		if ((mask & instance->registers->rh_port_status[port - 1]) != 0) {
-
-			bitmap[(port) / 8] += 1 << (port % 8);
+		/* Write-clean bits are those that indicate change */
+		if (RHPS_CHANGE_WC_MASK
+		    & instance->registers->rh_port_status[port - 1]) {
+
+			bitmap[(port) / 8] |= 1 << (port % 8);
 		}
 	}
@@ -731,5 +702,5 @@
 /*----------------------------------------------------------------------------*/
 /**
- * process hanging interrupt request
+ * Process waiting interrupt request
  *
  * If an interrupt transfer has been received and there was no change,
@@ -743,6 +714,5 @@
  * @return
  */
-int interrupt_mask_in_instance(
-    rh_t *instance, usb_transfer_batch_t *request)
+void interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t *request)
 {
 	assert(instance);
@@ -754,6 +724,4 @@
 	instance->unfinished_interrupt_transfer = NULL;
 	usb_transfer_batch_finish_error(request, EOK);
-
-	return EOK;
 }
 /*----------------------------------------------------------------------------*/
