diff options
author | gonzo <gonzo@FreeBSD.org> | 2016-11-06 18:40:12 +0000 |
---|---|---|
committer | gonzo <gonzo@FreeBSD.org> | 2016-11-06 18:40:12 +0000 |
commit | b82022461caea290c7bce683816b76f5bad5d78d (patch) | |
tree | 4a04888a8377ec5623ae862e2b374ecdf586d221 /sys/arm/arm | |
parent | 476fa99d66ff006a890ec0755cee69ff5fb89759 (diff) | |
download | FreeBSD-src-b82022461caea290c7bce683816b76f5bad5d78d.zip FreeBSD-src-b82022461caea290c7bce683816b76f5bad5d78d.tar.gz |
MFC r306899, r307059, r307151
r306899:
Fix release MSI method for ARM GIC
r307059:
INTRNG - fix MSI/MSIX release path
Use isrc in attached MSI data structure instead of using map's
isrc directly. map's isrc is set to NULL on IRQ deactivation
which happens prior to pci_release_msi so MSI_RELEASE_MSI
receives array of NULLs
Reviewed by: mmel
Differential Revision: https://reviews.freebsd.org/D8206
r307151:
INTRNG: Propagate IRQ activation error to API consumer
Keep resource state consistent with INTRNG state - if intr_activate_irq
fails - deactivate resource and propagate error to calling function
Reviewed by: mmel
Diffstat (limited to 'sys/arm/arm')
-rw-r--r-- | sys/arm/arm/gic.c | 4 | ||||
-rw-r--r-- | sys/arm/arm/nexus.c | 6 |
2 files changed, 7 insertions, 3 deletions
diff --git a/sys/arm/arm/gic.c b/sys/arm/arm/gic.c index 133cc7f..ce8c28e 100644 --- a/sys/arm/arm/gic.c +++ b/sys/arm/arm/gic.c @@ -1700,15 +1700,15 @@ arm_gicv2m_release_msi(device_t dev, device_t child, int count, mtx_lock(&sc->sc_mutex); for (i = 0; i < count; i++) { - gi = (struct gic_irqsrc *)isrc; + gi = (struct gic_irqsrc *)isrc[i]; KASSERT((gi->gi_flags & GI_FLAG_MSI_USED) == GI_FLAG_MSI_USED, ("%s: Trying to release an unused MSI-X interrupt", __func__)); gi->gi_flags &= ~GI_FLAG_MSI_USED; - mtx_unlock(&sc->sc_mutex); } + mtx_unlock(&sc->sc_mutex); return (0); } diff --git a/sys/arm/arm/nexus.c b/sys/arm/arm/nexus.c index 9bf1b44..879bc30 100644 --- a/sys/arm/arm/nexus.c +++ b/sys/arm/arm/nexus.c @@ -383,7 +383,11 @@ nexus_activate_resource(device_t bus, device_t child, int type, int rid, return (0); } else if (type == SYS_RES_IRQ) { #ifdef INTRNG - intr_activate_irq(child, r); + err = intr_activate_irq(child, r); + if (err != 0) { + rman_deactivate_resource(r); + return (err); + } #endif } return (0); |