diff options
-rw-r--r-- | sys/src/9/pc/fns.h | 2 | ||||
-rw-r--r-- | sys/src/9/pc/trap.c | 3 | ||||
-rw-r--r-- | sys/src/9/pc/uarti8250.c | 4 | ||||
-rw-r--r-- | sys/src/9/pc64/fns.h | 2 | ||||
-rw-r--r-- | sys/src/9/pc64/trap.c | 3 | ||||
-rw-r--r-- | sys/src/9/xen/fns.h | 2 | ||||
-rw-r--r-- | sys/src/9/xen/trap.c | 35 |
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 |