Index: uspace/drv/bus/usb/ohci/root_hub.c
===================================================================
--- uspace/drv/bus/usb/ohci/root_hub.c	(revision b21dfbabefa5a7a97d32e69fdad365484bb5d02c)
+++ uspace/drv/bus/usb/ohci/root_hub.c	(revision f20bc823786a039142a212d589d3c7eef2f0f527)
@@ -134,5 +134,5 @@
 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 uint16_t create_interrupt_mask_in_instance(rh_t *instance);
 static int get_status_request(rh_t *instance, usb_transfer_batch_t *request);
 static int get_descriptor_request(
@@ -145,8 +145,4 @@
 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 bool is_zeros(const void *buffer, size_t size);
-
 
 #define TRANSFER_OK(bytes) \
@@ -175,6 +171,4 @@
 	/* Don't forget the hub status bit and round up */
 	instance->interrupt_mask_size = (instance->port_count + 1 + 8) / 8;
-	instance->interrupt_buffer[0] = 0;
-	instance->interrupt_buffer[1] = 0;
 	instance->unfinished_interrupt_transfer = NULL;
 
@@ -210,7 +204,7 @@
 	case USB_TRANSFER_INTERRUPT:
 		usb_log_debug("Root hub got INTERRUPT packet\n");
-		create_interrupt_mask_in_instance(instance);
-		if (is_zeros(instance->interrupt_buffer,
-		    instance->interrupt_mask_size)) {
+		const uint16_t mask =
+		    create_interrupt_mask_in_instance(instance);
+		if (mask == 0) {
 			usb_log_debug("No changes..\n");
 			instance->unfinished_interrupt_transfer = request;
@@ -218,5 +212,9 @@
 		} else {
 			usb_log_debug("Processing changes..\n");
-			interrupt_mask_in_instance(instance, request);
+			memcpy(request->data_buffer, &mask,
+			    instance->interrupt_mask_size);
+			request->transfered_size = instance->interrupt_mask_size;
+			instance->unfinished_interrupt_transfer = NULL;
+			usb_transfer_batch_finish_error(request, EOK);
 		}
 		break;
@@ -240,7 +238,12 @@
 
 	usb_log_debug("Finalizing interrupt transfer\n");
-	create_interrupt_mask_in_instance(instance);
-	interrupt_mask_in_instance(instance,
-	    instance->unfinished_interrupt_transfer);
+	const uint16_t mask = create_interrupt_mask_in_instance(instance);
+	memcpy(instance->unfinished_interrupt_transfer->data_buffer,
+	    &mask, instance->interrupt_mask_size);
+	instance->unfinished_interrupt_transfer->transfered_size =
+	   instance->interrupt_mask_size;
+	usb_transfer_batch_finish(instance->unfinished_interrupt_transfer);
+
+	instance->unfinished_interrupt_transfer = NULL;
 }
 /*----------------------------------------------------------------------------*/
@@ -383,13 +386,12 @@
  * @param instance root hub instance
  */
-void create_interrupt_mask_in_instance(rh_t *instance)
-{
-	assert(instance);
-
-	uint8_t * bitmap = instance->interrupt_buffer;
-	bzero(bitmap, instance->interrupt_mask_size);
+uint16_t create_interrupt_mask_in_instance(rh_t *instance)
+{
+	assert(instance);
+	uint16_t 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 |= 1;
 	}
 	size_t port = 1;
@@ -399,7 +401,8 @@
 		    & instance->registers->rh_port_status[port - 1]) {
 
-			bitmap[(port) / 8] |= 1 << (port % 8);
+			mask |= (1 << port);
 		}
 	}
+	return host2uint32_t_le(mask);
 }
 /*----------------------------------------------------------------------------*/
@@ -700,49 +703,4 @@
 	}
 }
-/*----------------------------------------------------------------------------*/
-/**
- * Process waiting interrupt request
- *
- * If an interrupt transfer has been received and there was no change,
- * the driver stores the transfer information and waits for change to occur.
- * This routine is called when that happens and it finalizes the interrupt
- * transfer.
- *
- * @param instance hub instance
- * @param request batch request to be processed
- *
- * @return
- */
-void interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t *request)
-{
-	assert(instance);
-	assert(request);
-
-	memcpy(request->data_buffer, instance->interrupt_buffer,
-	    instance->interrupt_mask_size);
-	request->transfered_size = instance->interrupt_mask_size;
-	instance->unfinished_interrupt_transfer = NULL;
-	usb_transfer_batch_finish_error(request, EOK);
-}
-/*----------------------------------------------------------------------------*/
-/**
- * return whether the buffer is full of zeros
- *
- * Convenience function.
- * @param buffer
- * @param size
- * @return
- */
-bool is_zeros(const void *buffer, size_t size)
-{
-	if (!buffer) return true;
-	const char * const end = buffer + size;
-	const char *data = buffer;
-	for (; data < end; ++data) {
-		if (*data)
-			return false;
-	}
-	return true;
-}
 
 /**
Index: uspace/drv/bus/usb/ohci/root_hub.h
===================================================================
--- uspace/drv/bus/usb/ohci/root_hub.h	(revision b21dfbabefa5a7a97d32e69fdad365484bb5d02c)
+++ uspace/drv/bus/usb/ohci/root_hub.h	(revision f20bc823786a039142a212d589d3c7eef2f0f527)
@@ -42,5 +42,4 @@
 
 #define HUB_DESCRIPTOR_MAX_SIZE (7 + 2 + 2)
-#define INTERRUPT_BUFFER_MAX_SIZE 2
 
 /**
@@ -56,10 +55,4 @@
 	/** interrupt transfer waiting for an actual interrupt to occur */
 	usb_transfer_batch_t *unfinished_interrupt_transfer;
-	/** Interrupt mask of changes
-	 *
-	 * OHCI support max 15 ports (specs page 124) + one global bit, it
-	 * gives max 2 bytes.
-	 */
-	uint8_t interrupt_buffer[INTERRUPT_BUFFER_MAX_SIZE];
 	/** size of interrupt buffer */
 	size_t interrupt_mask_size;
