Index: uspace/drv/ohci/root_hub.c
===================================================================
--- uspace/drv/ohci/root_hub.c	(revision 4125b7d6623fde4fc0b0dfa664848db2d491c2b9)
+++ uspace/drv/ohci/root_hub.c	(revision 9014dcdb77df4d415fce62b2bfc7796b796b2ff2)
@@ -217,4 +217,5 @@
 	instance->registers->rh_desc_a |= RHDA_NPS_FLAG;
 	instance->unfinished_interrupt_transfer = NULL;
+	instance->interrupt_buffer = malloc((instance->port_count + 8)/8);
 	usb_log_info("OHCI root hub with %d ports.\n", instance->port_count);
 	return EOK;
@@ -471,7 +472,7 @@
 	size_t * buffer_size) {
 	int bit_count = instance->port_count + 1;
-	(*buffer_size) = (bit_count / 8) + ((bit_count % 8 == 0) ? 0 : 1);
-
-	(*buffer) = malloc(*buffer_size);
+	(*buffer_size) = (bit_count+7 / 8);
+
+	(*buffer) = instance->interrupt_buffer;//malloc(*buffer_size);
 	uint8_t * bitmap = (uint8_t*) (*buffer);
 	uint32_t mask = (1 << (USB_HUB_FEATURE_C_HUB_LOCAL_POWER + 16))
Index: uspace/drv/ohci/root_hub.h
===================================================================
--- uspace/drv/ohci/root_hub.h	(revision 4125b7d6623fde4fc0b0dfa664848db2d491c2b9)
+++ uspace/drv/ohci/root_hub.h	(revision 9014dcdb77df4d415fce62b2bfc7796b796b2ff2)
@@ -56,4 +56,10 @@
 	/** interrupt transfer waiting for an actual interrupt to occur */
 	usb_transfer_batch_t * unfinished_interrupt_transfer;
+	/** pre-allocated interrupt mask
+	 *
+	 * This is allocated when initializing instance, so that memory
+	 * allocation is not needed when processing request.
+	 */
+	uint8_t * interrupt_buffer;
 } rh_t;
 
