Index: uspace/srv/hw/bus/cuda_adb/cuda_adb.c
===================================================================
--- uspace/srv/hw/bus/cuda_adb/cuda_adb.c	(revision 3385dd3b26afd849db4e380a2afc06d472d89881)
+++ uspace/srv/hw/bus/cuda_adb/cuda_adb.c	(revision d8bb8213173f9665d9d1f2f90ef7d87a8eb96e7c)
@@ -109,5 +109,5 @@
 	{
 		.base = 0,
-		.size = sizeof(cuda_t) 
+		.size = sizeof(cuda_t)
 	}
 };
@@ -157,4 +157,10 @@
 
 	printf(NAME ": VIA-CUDA Apple Desktop Bus driver\n");
+	
+	/*
+	 * Alleviate the virtual memory / page table pressure caused by
+	 * interrupt storms when the default large stacks are used.
+	 */
+	async_set_notification_handler_stack_size(PAGE_SIZE);
 
 	for (i = 0; i < ADB_MAX_ADDR; ++i) {
@@ -306,15 +312,25 @@
 	fibril_mutex_lock(&instance->dev_lock);
 
+	switch (instance->xstate) {
+	case cx_listen:
+		cuda_irq_listen();
+		break;
+	case cx_receive:
+		cuda_irq_receive();
+		break;
+	case cx_rcv_end:
+		cuda_irq_rcv_end(rbuf, &len);
+		handle = true;
+		break;
+	case cx_send_start:
+		cuda_irq_send_start();
+		break;
+	case cx_send:
+		cuda_irq_send();
+		break;
+	}
+	
 	/* Lower IFR.SR_INT so that CUDA can generate next int by raising it. */
 	pio_write_8(&instance->cuda->ifr, SR_INT);
-
-	switch (instance->xstate) {
-	case cx_listen: cuda_irq_listen(); break;
-	case cx_receive: cuda_irq_receive(); break;
-	case cx_rcv_end: cuda_irq_rcv_end(rbuf, &len);
-	    handle = true; break;
-	case cx_send_start: cuda_irq_send_start(); break;
-	case cx_send: cuda_irq_send(); break;
-	}
 
 	fibril_mutex_unlock(&instance->dev_lock);
@@ -331,15 +347,12 @@
 static void cuda_irq_listen(void)
 {
-	uint8_t b;
-
-	b = pio_read_8(&dev->b);
-
+	uint8_t b = pio_read_8(&dev->b);
+	
 	if ((b & TREQ) != 0) {
 		printf("cuda_irq_listen: no TREQ?!\n");
 		return;
 	}
-
-	pio_read_8(&dev->sr);
-	pio_write_8(&dev->b, pio_read_8(&dev->b) & ~TIP);
+	
+	pio_write_8(&dev->b, b & ~TIP);
 	instance->xstate = cx_receive;
 }
@@ -351,12 +364,10 @@
 static void cuda_irq_receive(void)
 {
-	uint8_t b, data;
-
-	data = pio_read_8(&dev->sr);
+	uint8_t data = pio_read_8(&dev->sr);
 	if (instance->bidx < CUDA_RCV_BUF_SIZE)
 		instance->rcv_buf[instance->bidx++] = data;
-
-	b = pio_read_8(&dev->b);
-
+	
+	uint8_t b = pio_read_8(&dev->b);
+	
 	if ((b & TREQ) == 0) {
 		pio_write_8(&dev->b, b ^ TACK);
@@ -374,8 +385,5 @@
 static void cuda_irq_rcv_end(void *buf, size_t *len)
 {
-	uint8_t b;
-	
-	b = pio_read_8(&dev->b);
-	pio_read_8(&dev->sr);
+	uint8_t b = pio_read_8(&dev->b);
 	
 	if ((b & TREQ) == 0) {
@@ -523,5 +531,4 @@
 }
 
-
 /** @}
  */
