Module Name: src Committed By: jmcneill Date: Sun Jul 15 13:34:43 UTC 2018
Modified Files: src/sys/arch/arm/fdt: gic_fdt.c Log Message: Return the real interrupt handle from gic_fdt_establish To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/fdt/gic_fdt.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/fdt/gic_fdt.c diff -u src/sys/arch/arm/fdt/gic_fdt.c:1.11 src/sys/arch/arm/fdt/gic_fdt.c:1.12 --- src/sys/arch/arm/fdt/gic_fdt.c:1.11 Tue Jul 3 12:12:03 2018 +++ src/sys/arch/arm/fdt/gic_fdt.c Sun Jul 15 13:34:43 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: gic_fdt.c,v 1.11 2018/07/03 12:12:03 jmcneill Exp $ */ +/* $NetBSD: gic_fdt.c,v 1.12 2018/07/15 13:34:43 jmcneill Exp $ */ /*- * Copyright (c) 2015-2017 Jared McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: gic_fdt.c,v 1.11 2018/07/03 12:12:03 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: gic_fdt.c,v 1.12 2018/07/15 13:34:43 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -37,6 +37,7 @@ __KERNEL_RCSID(0, "$NetBSD: gic_fdt.c,v #include <sys/kernel.h> #include <sys/lwp.h> #include <sys/kmem.h> +#include <sys/queue.h> #include <arm/cortex/gic_intr.h> #include <arm/cortex/mpcore_var.h> @@ -238,28 +239,36 @@ gic_fdt_establish(device_t dev, u_int *s firqh->ih_arg = arg; TAILQ_INSERT_TAIL(&firq->intr_handlers, firqh, ih_next); - return firqh; + return firq->intr_ih; } static void gic_fdt_disestablish(device_t dev, void *ih) { struct gic_fdt_softc * const sc = device_private(dev); - struct gic_fdt_irqhandler *firqh = ih; - struct gic_fdt_irq *firq = firqh->ih_irq; - const int irq = firq->intr_irq; + struct gic_fdt_irqhandler *firqh; + struct gic_fdt_irq *firq; + u_int n; + + for (n = 0; n < GIC_MAXIRQ; n++) { + firq = sc->sc_irq[n]; + if (firq->intr_ih != ih) + continue; - KASSERT(firq->intr_refcnt > 0); + KASSERT(firq->intr_refcnt > 0); - TAILQ_REMOVE(&firq->intr_handlers, firqh, ih_next); - kmem_free(firqh, sizeof(*firqh)); + if (firq->intr_refcnt > 1) + panic("%s: cannot disestablish shared irq", __func__); - firq->intr_refcnt--; - if (firq->intr_refcnt == 0) { + firqh = TAILQ_FIRST(&firq->intr_handlers); + kmem_free(firqh, sizeof(*firqh)); intr_disestablish(firq->intr_ih); kmem_free(firq, sizeof(*firq)); - sc->sc_irq[irq] = NULL; + sc->sc_irq[n] = NULL; + return; } + + panic("%s: interrupt not established", __func__); } static int