summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/src/9/pc/fns.h2
-rw-r--r--sys/src/9/pc/trap.c3
-rw-r--r--sys/src/9/pc/uarti8250.c4
-rw-r--r--sys/src/9/pc64/fns.h2
-rw-r--r--sys/src/9/pc64/trap.c3
-rw-r--r--sys/src/9/xen/fns.h2
-rw-r--r--sys/src/9/xen/trap.c35
7 files changed, 20 insertions, 31 deletions
diff --git a/sys/src/9/pc/fns.h b/sys/src/9/pc/fns.h
index 77eebd2fc..553695b56 100644
--- a/sys/src/9/pc/fns.h
+++ b/sys/src/9/pc/fns.h
@@ -83,7 +83,7 @@ ushort ins(int);
void inss(int, void*, int);
ulong inl(int);
void insl(int, void*, int);
-int intrdisable(int, void (*)(Ureg *, void *), void*, int, char*);
+void intrdisable(int, void (*)(Ureg *, void *), void*, int, char*);
void intrenable(int, void (*)(Ureg*, void*), void*, int, char*);
void introff(void);
void intron(void);
diff --git a/sys/src/9/pc/trap.c b/sys/src/9/pc/trap.c
index 1eef90ea9..04d4b46da 100644
--- a/sys/src/9/pc/trap.c
+++ b/sys/src/9/pc/trap.c
@@ -76,7 +76,7 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name)
iunlock(&vctllock);
}
-int
+void
intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name)
{
Vctl **pv, *v;
@@ -116,7 +116,6 @@ intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name)
break;
}
iunlock(&vctllock);
- return 0;
}
static long
diff --git a/sys/src/9/pc/uarti8250.c b/sys/src/9/pc/uarti8250.c
index 845e4401a..de5156d2c 100644
--- a/sys/src/9/pc/uarti8250.c
+++ b/sys/src/9/pc/uarti8250.c
@@ -542,8 +542,8 @@ i8250disable(Uart* uart)
csr8w(ctlr, Ier, ctlr->sticky[Ier]);
if(ctlr->iena != 0){
- if(intrdisable(ctlr->irq, i8250interrupt, uart, ctlr->tbdf, uart->name) == 0)
- ctlr->iena = 0;
+ ctlr->iena = 0;
+ intrdisable(ctlr->irq, i8250interrupt, uart, ctlr->tbdf, uart->name);
}
}
diff --git a/sys/src/9/pc64/fns.h b/sys/src/9/pc64/fns.h
index 0af15138f..46922f53d 100644
--- a/sys/src/9/pc64/fns.h
+++ b/sys/src/9/pc64/fns.h
@@ -74,7 +74,7 @@ ushort ins(int);
void inss(int, void*, int);
ulong inl(int);
void insl(int, void*, int);
-int intrdisable(int, void (*)(Ureg *, void *), void*, int, char*);
+void intrdisable(int, void (*)(Ureg *, void *), void*, int, char*);
void intrenable(int, void (*)(Ureg*, void*), void*, int, char*);
void introff(void);
void intron(void);
diff --git a/sys/src/9/pc64/trap.c b/sys/src/9/pc64/trap.c
index 7c411f47e..2b8de4b7c 100644
--- a/sys/src/9/pc64/trap.c
+++ b/sys/src/9/pc64/trap.c
@@ -76,7 +76,7 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name)
iunlock(&vctllock);
}
-int
+void
intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name)
{
Vctl **pv, *v;
@@ -116,7 +116,6 @@ intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name)
break;
}
iunlock(&vctllock);
- return 0;
}
static long
diff --git a/sys/src/9/xen/fns.h b/sys/src/9/xen/fns.h
index 71e64ac4c..5b39cfddb 100644
--- a/sys/src/9/xen/fns.h
+++ b/sys/src/9/xen/fns.h
@@ -54,7 +54,7 @@ ushort ins(int);
void inss(int, void*, int);
ulong inl(int);
void insl(int, void*, int);
-int intrdisable(int, void (*)(Ureg *, void *), void*, int, char*);
+void intrdisable(int, void (*)(Ureg *, void *), void*, int, char*);
void intrenable(int, void (*)(Ureg*, void*), void*, int, char*);
int ioalloc(int, int, int, char*);
void ioinit(void);
diff --git a/sys/src/9/xen/trap.c b/sys/src/9/xen/trap.c
index 9d572577b..a81182a8b 100644
--- a/sys/src/9/xen/trap.c
+++ b/sys/src/9/xen/trap.c
@@ -90,36 +90,27 @@ intrenable(int irq, void (*f)(Ureg*, void*), void* a, int tbdf, char *name)
iunlock(&vctllock);
}
-int
+void
intrdisable(int irq, void (*f)(Ureg *, void *), void *a, int tbdf, char *name)
{
Vctl **pv, *v;
int vno;
- /*
- * For now, none of this will work with the APIC code,
- * there is no mapping between irq and vector as the IRQ
- * is pretty meaningless.
- */
- if(arch->intrvecno == nil)
- return -1;
vno = arch->intrvecno(irq);
ilock(&vctllock);
- pv = &vctl[vno];
- while (*pv &&
- ((*pv)->irq != irq || (*pv)->tbdf != tbdf || (*pv)->f != f || (*pv)->a != a ||
- strcmp((*pv)->name, name)))
- pv = &((*pv)->next);
- assert(*pv);
-
- v = *pv;
- *pv = (*pv)->next; /* Link out the entry */
-
- if(vctl[vno] == nil && arch->intrdisable != nil)
- arch->intrdisable(irq);
+ for(pv = &vctl[vno]; (v = *pv) != nil; pv = &v->next){
+ if(v->isintr && v->irq == irq
+ && v->tbdf == tbdf && v->f == f && v->a == a
+ && strcmp(v->name, name) == 0){
+ *pv = v->next;
+ xfree(v);
+
+ if(vctl[vno] == nil && arch->intrdisable != nil)
+ arch->intrdisable(irq);
+ break;
+ }
+ }
iunlock(&vctllock);
- xfree(v);
- return 0;
}
static long