aboutsummaryrefslogtreecommitdiff
path: root/sys/arm64/broadcom/genet/if_genet.c
diff options
context:
space:
mode:
authorMike Karels <karels@FreeBSD.org>2021-06-20 16:10:26 +0000
committerMike Karels <karels@FreeBSD.org>2021-06-20 16:17:13 +0000
commit13604fb0fd43c85e6bb3a0ad6400a684f150bdea (patch)
tree9e60866f4fbfe3ac97b7125e7e535b04de790858 /sys/arm64/broadcom/genet/if_genet.c
parent9d1cafb304974e0e919abb269c260a52273bd0b9 (diff)
downloadsrc-13604fb0fd43c85e6bb3a0ad6400a684f150bdea.tar.gz
src-13604fb0fd43c85e6bb3a0ad6400a684f150bdea.zip
genet: Fix potential crash during attach
As pointed out in the bug, the genet driver (RPi4 Ethernet) was attaching the interrupts before the data structures were fully initialized, causing a crash if an interrupt came in during the attach. Fix by reordering code blocks. PR: 256334 Reported by: < ghuckriede at blackberry.com > Reviewed by: < ghuckriede at blackberry.com > (informally) MFC after: 3 days
Diffstat (limited to 'sys/arm64/broadcom/genet/if_genet.c')
-rw-r--r--sys/arm64/broadcom/genet/if_genet.c30
1 files changed, 15 insertions, 15 deletions
diff --git a/sys/arm64/broadcom/genet/if_genet.c b/sys/arm64/broadcom/genet/if_genet.c
index d0fe2b0d5e71..5d70c7075c3a 100644
--- a/sys/arm64/broadcom/genet/if_genet.c
+++ b/sys/arm64/broadcom/genet/if_genet.c
@@ -279,21 +279,6 @@ gen_attach(device_t dev)
goto fail;
}
- /* Install interrupt handlers */
- error = bus_setup_intr(dev, sc->res[_RES_IRQ1],
- INTR_TYPE_NET | INTR_MPSAFE, NULL, gen_intr, sc, &sc->ih);
- if (error != 0) {
- device_printf(dev, "cannot setup interrupt handler1\n");
- goto fail;
- }
-
- error = bus_setup_intr(dev, sc->res[_RES_IRQ2],
- INTR_TYPE_NET | INTR_MPSAFE, NULL, gen_intr2, sc, &sc->ih2);
- if (error != 0) {
- device_printf(dev, "cannot setup interrupt handler2\n");
- goto fail;
- }
-
/* Setup ethernet interface */
sc->ifp = if_alloc(IFT_ETHER);
if_setsoftc(sc->ifp, sc);
@@ -310,6 +295,21 @@ gen_attach(device_t dev)
IFCAP_HWCSUM_IPV6);
if_setcapenable(sc->ifp, if_getcapabilities(sc->ifp));
+ /* Install interrupt handlers */
+ error = bus_setup_intr(dev, sc->res[_RES_IRQ1],
+ INTR_TYPE_NET | INTR_MPSAFE, NULL, gen_intr, sc, &sc->ih);
+ if (error != 0) {
+ device_printf(dev, "cannot setup interrupt handler1\n");
+ goto fail;
+ }
+
+ error = bus_setup_intr(dev, sc->res[_RES_IRQ2],
+ INTR_TYPE_NET | INTR_MPSAFE, NULL, gen_intr2, sc, &sc->ih2);
+ if (error != 0) {
+ device_printf(dev, "cannot setup interrupt handler2\n");
+ goto fail;
+ }
+
/* Attach MII driver */
mii_flags = 0;
switch (sc->phy_mode)