]> rtime.felk.cvut.cz Git - l4.git/blobdiff - l4/pkg/io/server/src/irqs.cc
update
[l4.git] / l4 / pkg / io / server / src / irqs.cc
index 0df3b9425babfd991764d87492aa25ffb7ff8140..5c14cc761a41bab854fb0e6803759410cded6ee6 100644 (file)
@@ -12,6 +12,16 @@ Kernel_irq_pin::unbind()
 int
 Kernel_irq_pin::bind(L4::Cap<L4::Irq> irq, unsigned mode)
 {
+  if (mode != L4_IRQ_F_NONE)
+    {
+      //printf(" IRQ[%x]: mode=%x ... ", n, mode);
+      int err = l4_error(system_icu()->icu->set_mode(_idx, mode));
+      //printf("result=%d\n", err);
+
+      if (err < 0)
+        return err;
+    }
+
   int err = l4_error(system_icu()->icu->bind(_idx, irq));
 
   // allow sharing if IRQ must be acknowledged via the IRQ object 
@@ -21,10 +31,6 @@ Kernel_irq_pin::bind(L4::Cap<L4::Irq> irq, unsigned mode)
   if (err < 0)
     return err;
 
-  // printf(" IRQ[%x]: mode=%x ... ", n, mode);
-  err = l4_error(system_icu()->icu->set_mode(_idx, mode));
-  // printf("result=%d\n", err);
-
   return err;
 }
 
@@ -42,3 +48,19 @@ Kernel_irq_pin::set_mode(unsigned mode)
   return l4_error(system_icu()->icu->set_mode(_idx, mode));
 }
 
+int
+Io_irq_pin::clear()
+{
+  int cnt = 0;
+  while (!l4_error(l4_ipc_receive(irq().cap(), l4_utcb(), L4_IPC_BOTH_TIMEOUT_0)))
+    ++cnt;
+
+  return cnt;
+}
+
+int
+Kernel_irq_pin::mask()
+{
+  return l4_error(system_icu()->icu->mask(_idx));
+}
+