Index: uspace/drv/nic/e1k/e1k.c
===================================================================
--- uspace/drv/nic/e1k/e1k.c	(revision 869d936cb8b287d8cabb51f763c83d6a439adba8)
+++ uspace/drv/nic/e1k/e1k.c	(revision e5424e9c9ff4b025227b44586f4b079542090d74)
@@ -1756,5 +1756,12 @@
 	e1000_enable_interrupts(e1000);
 	
-	irc_enable_interrupt(e1000->irq);
+	int rc = irc_enable_interrupt(e1000->irq);
+	if (rc != EOK) {
+		e1000_disable_interrupts(e1000);
+		fibril_mutex_unlock(&e1000->ctrl_lock);
+		fibril_mutex_unlock(&e1000->tx_lock);
+		fibril_mutex_unlock(&e1000->rx_lock);
+		return rc;
+	}
 	
 	e1000_clear_rx_ring(e1000);
@@ -2375,9 +2382,4 @@
 	printf("%s: HelenOS E1000 network adapter driver\n", NAME);
 	
-	if (irc_init() != EOK) {
-		printf("%s: Failed connecting IRC service\n", NAME);
-		return 1;
-	}
-	
 	if (nic_driver_init(NAME) != EOK)
 		return 1;
Index: uspace/drv/nic/ne2k/ne2k.c
===================================================================
--- uspace/drv/nic/ne2k/ne2k.c	(revision 869d936cb8b287d8cabb51f763c83d6a439adba8)
+++ uspace/drv/nic/ne2k/ne2k.c	(revision e5424e9c9ff4b025227b44586f4b079542090d74)
@@ -257,9 +257,12 @@
 	if (!ne2k->up) {
 		int rc = ne2k_up(ne2k);
+		if (rc != EOK)
+			return rc;
+
+		rc = irc_enable_interrupt(ne2k->irq);
 		if (rc != EOK) {
+			ne2k_down(ne2k);
 			return rc;
 		}
-
-		irc_enable_interrupt(ne2k->irq);
 	}
 	return EOK;
@@ -270,5 +273,5 @@
 	ne2k_t *ne2k = (ne2k_t *) nic_get_specific(nic_data);
 
-	irc_disable_interrupt(ne2k->irq);
+	(void) irc_disable_interrupt(ne2k->irq);
 	ne2k->receive_configuration = RCR_AB | RCR_AM;
 	ne2k_down(ne2k);
@@ -440,9 +443,4 @@
 	printf("%s: HelenOS NE 2000 network adapter driver\n", NAME);
 	
-	if (irc_init() != EOK) {
-		printf("%s: Failed connecting IRC service\n", NAME);
-		return 1;
-	}
-	
 	nic_driver_init(NAME);
 	nic_driver_implement(&ne2k_driver_ops, &ne2k_dev_ops, &ne2k_nic_iface);
Index: uspace/drv/nic/rtl8139/driver.c
===================================================================
--- uspace/drv/nic/rtl8139/driver.c	(revision 869d936cb8b287d8cabb51f763c83d6a439adba8)
+++ uspace/drv/nic/rtl8139/driver.c	(revision e5424e9c9ff4b025227b44586f4b079542090d74)
@@ -956,5 +956,10 @@
 	rtl8139->int_mask = RTL_DEFAULT_INTERRUPTS;
 	rtl8139_hw_int_enable(rtl8139);
-	irc_enable_interrupt(rtl8139->irq);
+
+	int rc = irc_enable_interrupt(rtl8139->irq);
+	if (rc != EOK) {
+		rtl8139_on_stopped(nic_data);
+		return rc;
+	}
 
 	ddf_msg(LVL_DEBUG, "Device activated, interrupt %d registered", rtl8139->irq);
@@ -2170,9 +2175,4 @@
 	printf("%s: HelenOS RTL8139 network adapter driver\n", NAME);
 
-	if (irc_init() != EOK) {
-		printf("%s: Failed connecting IRC service\n", NAME);
-		return 1;
-	}
-
 	int rc = nic_driver_init(NAME);
 	if (rc != EOK)
Index: uspace/lib/c/generic/irc.c
===================================================================
--- uspace/lib/c/generic/irc.c	(revision 869d936cb8b287d8cabb51f763c83d6a439adba8)
+++ uspace/lib/c/generic/irc.c	(revision e5424e9c9ff4b025227b44586f4b079542090d74)
@@ -39,28 +39,7 @@
 #include <irc.h>
 #include <ns.h>
+#include <sysinfo.h>
 
 static async_sess_t *irc_sess;
-
-/** Enable interrupt.
- *
- * @param irq	IRQ number
- */
-void irc_enable_interrupt(int irq)
-{
-	async_exch_t *exch = async_exchange_begin(irc_sess);
-	async_msg_1(exch, IRC_ENABLE_INTERRUPT, irq);
-	async_exchange_end(exch);
-}
-
-/** Disable interrupt.
- *
- * @param irq	IRQ number
- */
-void irc_disable_interrupt(int irq)
-{
-	async_exch_t *exch = async_exchange_begin(irc_sess);
-	async_msg_1(exch, IRC_CLEAR_INTERRUPT, irq);
-	async_exchange_end(exch);
-}
 
 /** Connect to IRC service.
@@ -68,10 +47,17 @@
  * @return	EOK on success, EIO on failure
  */
-int irc_init(void)
+static int irc_init(void)
 {
+	sysarg_t apic;
+	sysarg_t i8259;
+
 	assert(irc_sess == NULL);
 
-	irc_sess = service_connect_blocking(EXCHANGE_SERIALIZE, SERVICE_IRC,
-	    0, 0);
+	if (((sysinfo_get_value("apic", &apic) == EOK) && (apic))
+	    || ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259))) {
+		irc_sess = service_connect_blocking(EXCHANGE_SERIALIZE,
+		    SERVICE_IRC, 0, 0);
+	}
+
 	if (irc_sess == NULL)
 		return EIO;
@@ -80,4 +66,47 @@
 }
 
+/** Enable interrupt.
+ *
+ * @param irq	IRQ number
+ */
+int irc_enable_interrupt(int irq)
+{
+	int rc;
+
+	if (irc_sess == NULL) {
+		rc = irc_init();
+		if (rc != EOK)
+			return rc;
+	}
+
+	async_exch_t *exch = async_exchange_begin(irc_sess);
+	rc = async_req_1_0(exch, IRC_ENABLE_INTERRUPT, irq);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
+
+/** Disable interrupt.
+ *
+ * @param irq	IRQ number
+ */
+int irc_disable_interrupt(int irq)
+{
+	int rc;
+
+	if (irc_sess == NULL) {
+		rc = irc_init();
+		if (rc != EOK)
+			return rc;
+	}
+
+	async_exch_t *exch = async_exchange_begin(irc_sess);
+	rc = async_req_1_0(exch, IRC_CLEAR_INTERRUPT, irq);
+	async_exchange_end(exch);
+
+	return rc;
+}
+
 /** @}
  */
Index: uspace/lib/c/include/irc.h
===================================================================
--- uspace/lib/c/include/irc.h	(revision 869d936cb8b287d8cabb51f763c83d6a439adba8)
+++ uspace/lib/c/include/irc.h	(revision e5424e9c9ff4b025227b44586f4b079542090d74)
@@ -36,7 +36,6 @@
 #define LIBC_IRC_H_
 
-extern int irc_init(void);
-extern void irc_enable_interrupt(int);
-extern void irc_disable_interrupt(int);
+extern int irc_enable_interrupt(int);
+extern int irc_disable_interrupt(int);
 
 #endif
