Index: uspace/srv/hw/netif/dp8390/dp8390.c
===================================================================
--- uspace/srv/hw/netif/dp8390/dp8390.c	(revision 6643a19bb92cff616761e36c4c85f59b19676307)
+++ uspace/srv/hw/netif/dp8390/dp8390.c	(revision abe95c994cf957914577df157995e7966c0c7ecb)
@@ -446,13 +446,4 @@
 	ne2k->sq.dirty = false;
 	fibril_mutex_unlock(&ne2k->sq_mutex);
-}
-
-static uint8_t ne2k_isr_ack(ne2k_t *ne2k)
-{
-	uint8_t isr = pio_read_8(ne2k->port + DP_ISR);
-	if (isr != 0)
-		pio_write_8(ne2k->port + DP_ISR, isr);
-	
-	return isr;
 }
 
@@ -554,85 +545,72 @@
 void ne2k_interrupt(ne2k_t *ne2k, uint8_t isr, int nil_phone, device_id_t device_id)
 {
-	bool signal = false;
-	bool stopped = false;
-	
-	for (; (isr & 0x7f) != 0; isr = ne2k_isr_ack(ne2k)) {
-		if (isr & (ISR_PTX | ISR_TXE)) {
-			if (isr & ISR_TXE)
-				ne2k->stats.send_errors++;
-			else {
-				uint8_t tsr = pio_read_8(ne2k->port + DP_TSR);
-				
-				if (tsr & TSR_PTX)
-					ne2k->stats.send_packets++;
-				
-				if (tsr & TSR_COL)
-					ne2k->stats.collisions++;
-				
-				if (tsr & TSR_ABT)
-					ne2k->stats.send_aborted_errors++;
-				
-				if (tsr & TSR_CRS)
-					ne2k->stats.send_carrier_errors++;
-				
-				if (tsr & TSR_FU) {
-					ne2k->underruns++;
-					if (ne2k->underruns < NE2K_ERL)
-						fprintf(stderr, "%s: FIFO underrun\n", NAME);
-				}
-				
-				if (tsr & TSR_CDH) {
-					ne2k->stats.send_heartbeat_errors++;
-					if (ne2k->stats.send_heartbeat_errors < NE2K_ERL)
-						fprintf(stderr, "%s: CD heartbeat failure\n", NAME);
-				}
-				
-				if (tsr & TSR_OWC)
-					ne2k->stats.send_window_errors++;
+	if (isr & (ISR_PTX | ISR_TXE)) {
+		if (isr & ISR_TXE)
+			ne2k->stats.send_errors++;
+		else {
+			uint8_t tsr = pio_read_8(ne2k->port + DP_TSR);
+			
+			if (tsr & TSR_PTX)
+				ne2k->stats.send_packets++;
+			
+			if (tsr & TSR_COL)
+				ne2k->stats.collisions++;
+			
+			if (tsr & TSR_ABT)
+				ne2k->stats.send_aborted_errors++;
+			
+			if (tsr & TSR_CRS)
+				ne2k->stats.send_carrier_errors++;
+			
+			if (tsr & TSR_FU) {
+				ne2k->underruns++;
+				if (ne2k->underruns < NE2K_ERL)
+					fprintf(stderr, "%s: FIFO underrun\n", NAME);
 			}
 			
-			fibril_mutex_lock(&ne2k->sq_mutex);
-			
-			if (ne2k->sq.dirty) {
-				/* Prepare the buffer for next packet */
-				ne2k->sq.dirty = false;
-				ne2k->sq.size = 0;
-				signal = true;
-			} else {
-				ne2k->misses++;
-				if (ne2k->misses < NE2K_ERL)
-					fprintf(stderr, "%s: Spurious PTX interrupt\n", NAME);
+			if (tsr & TSR_CDH) {
+				ne2k->stats.send_heartbeat_errors++;
+				if (ne2k->stats.send_heartbeat_errors < NE2K_ERL)
+					fprintf(stderr, "%s: CD heartbeat failure\n", NAME);
 			}
 			
-			fibril_mutex_unlock(&ne2k->sq_mutex);
+			if (tsr & TSR_OWC)
+				ne2k->stats.send_window_errors++;
 		}
 		
-		if (isr & ISR_PRX)
-			ne2k_receive(ne2k, nil_phone, device_id);
-		
-		if (isr & ISR_RXE)
-			ne2k->stats.receive_errors++;
-		
-		if (isr & ISR_CNT) {
-			ne2k->stats.receive_crc_errors +=
-			    pio_read_8(ne2k->port + DP_CNTR0);
-			ne2k->stats.receive_frame_errors +=
-			    pio_read_8(ne2k->port + DP_CNTR1);
-			ne2k->stats.receive_missed_errors +=
-			    pio_read_8(ne2k->port + DP_CNTR2);
+		fibril_mutex_lock(&ne2k->sq_mutex);
+		
+		if (ne2k->sq.dirty) {
+			/* Prepare the buffer for next packet */
+			ne2k->sq.dirty = false;
+			ne2k->sq.size = 0;
+			
+			/* Signal a next frame to be sent */
+			fibril_condvar_broadcast(&ne2k->sq_cv);
+		} else {
+			ne2k->misses++;
+			if (ne2k->misses < NE2K_ERL)
+				fprintf(stderr, "%s: Spurious PTX interrupt\n", NAME);
 		}
 		
-		if (isr & ISR_RST) {
-			/*
-			 * This means we got an interrupt but the ethernet
-			 * chip is shutdown. We set the flag 'stopped'
-			 * and continue processing arrived packets. When the
-			 * receive buffer is empty, we reset the DP8390.
-			 */
-			stopped = true;
-		}
-	}
-	
-	if (stopped) {
+		fibril_mutex_unlock(&ne2k->sq_mutex);
+	}
+	
+	if (isr & ISR_PRX)
+		ne2k_receive(ne2k, nil_phone, device_id);
+	
+	if (isr & ISR_RXE)
+		ne2k->stats.receive_errors++;
+	
+	if (isr & ISR_CNT) {
+		ne2k->stats.receive_crc_errors +=
+		    pio_read_8(ne2k->port + DP_CNTR0);
+		ne2k->stats.receive_frame_errors +=
+		    pio_read_8(ne2k->port + DP_CNTR1);
+		ne2k->stats.receive_missed_errors +=
+		    pio_read_8(ne2k->port + DP_CNTR2);
+	}
+	
+	if (isr & ISR_RST) {
 		/*
 		 * The chip is stopped, and all arrived
@@ -642,7 +620,7 @@
 	}
 	
-	/* Signal a next frame to be sent */
-	if (signal)
-		fibril_condvar_broadcast(&ne2k->sq_cv);
+	/* Unmask interrupts to be processed in the next round */
+	pio_write_8(ne2k->port + DP_IMR,
+	    IMR_PRXE | IMR_PTXE | IMR_RXEE | IMR_TXEE | IMR_OVWE | IMR_CNTE);
 }
 
Index: uspace/srv/hw/netif/dp8390/ne2000.c
===================================================================
--- uspace/srv/hw/netif/dp8390/ne2000.c	(revision 6643a19bb92cff616761e36c4c85f59b19676307)
+++ uspace/srv/hw/netif/dp8390/ne2000.c	(revision abe95c994cf957914577df157995e7966c0c7ecb)
@@ -76,4 +76,5 @@
 static irq_cmd_t ne2k_cmds[] = {
 	{
+		/* Read Interrupt Status Register */
 		.cmd = CMD_PIO_READ_8,
 		.addr = NULL,
@@ -81,15 +82,28 @@
 	},
 	{
+		/* Mask supported interrupt causes */
 		.cmd = CMD_BTEST,
-		.value = 0x7f,
+		.value = (ISR_PRX | ISR_PTX | ISR_RXE | ISR_TXE | ISR_OVW |
+		    ISR_CNT | ISR_RDC),
 		.srcarg = 2,
 		.dstarg = 3,
 	},
 	{
+		/* Predicate for accepting the interrupt */
 		.cmd = CMD_PREDICATE,
-		.value = 2,
+		.value = 3,
 		.srcarg = 3
 	},
 	{
+		/*
+		 * Mask future interrupts via
+		 * Interrupt Mask Register
+		 */
+		.cmd = CMD_PIO_WRITE_8,
+		.addr = NULL,
+		.value = 0
+	},
+	{
+		/* Acknowledge the current interrupt */
 		.cmd = CMD_PIO_WRITE_A_8,
 		.addr = NULL,
@@ -265,5 +279,6 @@
 		
 		ne2k_cmds[0].addr = ne2k->port + DP_ISR;
-		ne2k_cmds[3].addr = ne2k_cmds[0].addr;
+		ne2k_cmds[3].addr = ne2k->port + DP_IMR;
+		ne2k_cmds[4].addr = ne2k_cmds[0].addr;
 		
 		int rc = ipc_register_irq(ne2k->irq, device->device_id,
