Index: uspace/lib/c/generic/irc.c
===================================================================
--- uspace/lib/c/generic/irc.c	(revision 869d936cb8b287d8cabb51f763c83d6a439adba8)
+++ uspace/lib/c/generic/irc.c	(revision 3d353861de6cebab6ab932a2b33b6625786f8aa4)
@@ -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 3d353861de6cebab6ab932a2b33b6625786f8aa4)
@@ -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
