From 74677fb82b415bb4f1c81d5fa4a9b2704f682201 Mon Sep 17 00:00:00 2001 From: Warner Losh Date: Sat, 18 Apr 2009 03:10:28 +0000 Subject: [PATCH] Establish the interrupt handler AFTER we successfully attach. We need to do this in case we have a shared interrupt that fires during the attach process.... --- sys/dev/ed/if_ed_cbus.c | 13 ++++++++----- sys/dev/ed/if_ed_isa.c | 13 ++++++++----- sys/dev/ed/if_ed_pccard.c | 15 ++++++++------- sys/dev/ed/if_ed_pci.c | 10 +++++----- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/sys/dev/ed/if_ed_cbus.c b/sys/dev/ed/if_ed_cbus.c index bcc0d85b7cf..73026198bf5 100644 --- a/sys/dev/ed/if_ed_cbus.c +++ b/sys/dev/ed/if_ed_cbus.c @@ -242,15 +242,18 @@ ed_cbus_attach(dev) ed_alloc_irq(dev, sc->irq_rid, 0); - error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, - NULL, edintr, sc, &sc->irq_handle); + if (sc->sc_media_ioctl == NULL) + ed_gen_ifmedia_init(sc); + error = ed_attach(dev); if (error) { ed_release_resources(dev); return (error); } - if (sc->sc_media_ioctl == NULL) - ed_gen_ifmedia_init(sc); - return ed_attach(dev); + error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, + NULL, edintr, sc, &sc->irq_handle); + if (error) + ed_release_resources(dev); + return (error); } /* diff --git a/sys/dev/ed/if_ed_isa.c b/sys/dev/ed/if_ed_isa.c index 1beac2720bd..c3fd8f69542 100644 --- a/sys/dev/ed/if_ed_isa.c +++ b/sys/dev/ed/if_ed_isa.c @@ -169,15 +169,18 @@ ed_isa_attach(device_t dev) ed_alloc_irq(dev, sc->irq_rid, 0); - error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, - NULL, edintr, sc, &sc->irq_handle); + if (sc->sc_media_ioctl == NULL) + ed_gen_ifmedia_init(sc); + error = ed_attach(dev); if (error) { ed_release_resources(dev); return (error); } - if (sc->sc_media_ioctl == NULL) - ed_gen_ifmedia_init(sc); - return ed_attach(dev); + error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, + NULL, edintr, sc, &sc->irq_handle); + if (error) + ed_release_resources(dev); + return (error); } static device_method_t ed_isa_methods[] = { diff --git a/sys/dev/ed/if_ed_pccard.c b/sys/dev/ed/if_ed_pccard.c index 647c301a971..7fb9e50bb2a 100644 --- a/sys/dev/ed/if_ed_pccard.c +++ b/sys/dev/ed/if_ed_pccard.c @@ -495,13 +495,6 @@ ed_pccard_attach(device_t dev) if (error) goto bad; - error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, - NULL, edintr, sc, &sc->irq_handle); - if (error) { - device_printf(dev, "setup intr failed %d \n", error); - goto bad; - } - /* * There are several ways to get the MAC address for the card. * Some of the above probe routines can fill in the enaddr. If @@ -589,6 +582,14 @@ ed_pccard_attach(device_t dev) } if (sc->modem_rid != -1) ed_pccard_add_modem(dev); + + error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, + NULL, edintr, sc, &sc->irq_handle); + if (error) { + device_printf(dev, "setup intr failed %d \n", error); + goto bad; + } + return (0); bad: ed_detach(dev); diff --git a/sys/dev/ed/if_ed_pci.c b/sys/dev/ed/if_ed_pci.c index 1b2e17d8a6a..21ddb741ae8 100644 --- a/sys/dev/ed/if_ed_pci.c +++ b/sys/dev/ed/if_ed_pci.c @@ -110,15 +110,15 @@ ed_pci_attach(device_t dev) ed_release_resources(dev); return (error); } - error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, - NULL, edintr, sc, &sc->irq_handle); + if (sc->sc_media_ioctl == NULL) + ed_gen_ifmedia_init(sc); + error = ed_attach(dev); if (error) { ed_release_resources(dev); return (error); } - if (sc->sc_media_ioctl == NULL) - ed_gen_ifmedia_init(sc); - error = ed_attach(dev); + error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET | INTR_MPSAFE, + NULL, edintr, sc, &sc->irq_handle); if (error) ed_release_resources(dev); return (error); -- 2.45.2