Index: uspace/drv/bus/usb/ohci/root_hub.c
===================================================================
--- uspace/drv/bus/usb/ohci/root_hub.c	(revision aa81adc7bcff3b5af18aca49cf5866edf842f157)
+++ uspace/drv/bus/usb/ohci/root_hub.c	(revision ece7f783e6a37b9486a7a9c1852130bf064ac2a6)
@@ -224,20 +224,28 @@
  * @return Error code.
  */
-int rh_init(rh_t *instance, ohci_regs_t *regs) {
-	assert(instance);
+int rh_init(rh_t *instance, ohci_regs_t *regs)
+{
+	assert(instance);
+
 	instance->registers = regs;
 	instance->port_count =
 	    (instance->registers->rh_desc_a >> RHDA_NDS_SHIFT) & RHDA_NDS_MASK;
-	int opResult = rh_init_descriptors(instance);
-	if (opResult != EOK) {
-		return opResult;
-	}
-	// set port power mode to no-power-switching
+	if (port_count > 15) {
+		usb_log_error("OHCI specification does not allow more than 15"
+		    " ports. Max 15 ports will be used");
+		instance->port_count = 15;
+	}
+
+	int ret = rh_init_descriptors(instance);
+	if (ret != EOK) {
+		return ret;
+	}
+	/* Set port power mode to no-power-switching. */
 	instance->registers->rh_desc_a |= RHDA_NPS_FLAG;
 	instance->unfinished_interrupt_transfer = NULL;
-	instance->interrupt_mask_size = (instance->port_count + 8) / 8;
-	instance->interrupt_buffer = malloc(instance->interrupt_mask_size);
-	if (!instance->interrupt_buffer)
-		return ENOMEM;
+	/* 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;
 
 	usb_log_info("Root hub (%zu ports) initialized.\n",
Index: uspace/drv/bus/usb/ohci/root_hub.h
===================================================================
--- uspace/drv/bus/usb/ohci/root_hub.h	(revision aa81adc7bcff3b5af18aca49cf5866edf842f157)
+++ uspace/drv/bus/usb/ohci/root_hub.h	(revision ece7f783e6a37b9486a7a9c1852130bf064ac2a6)
@@ -57,9 +57,8 @@
 	/** pre-allocated interrupt mask
 	 *
-	 * This is allocated when initializing instance, so that memory
-	 * allocation is not needed when processing request. Buffer is used for
-	 * interrupt bitmask.
+	 * OHCI support max 15 ports (specs page 124) + one global bit, it
+	 * gives max 2 bytes.
 	 */
-	uint8_t * interrupt_buffer;
+	uint8_t interrupt_buffer[2];
 	/** size of interrupt buffer */
 	size_t interrupt_mask_size;
