summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2009-04-18 03:10:28 +0000
committerimp <imp@FreeBSD.org>2009-04-18 03:10:28 +0000
commitfa43940cbb76d0a72cbba1fd434ed749293b9b0a (patch)
tree3072d3eb02a44a13a41b884b04a608d1fdf0104f
parentf2f5ef69b6e29713bde02e719cb499342097d9c2 (diff)
downloadFreeBSD-src-fa43940cbb76d0a72cbba1fd434ed749293b9b0a.zip
FreeBSD-src-fa43940cbb76d0a72cbba1fd434ed749293b9b0a.tar.gz
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....
-rw-r--r--sys/dev/ed/if_ed_cbus.c13
-rw-r--r--sys/dev/ed/if_ed_isa.c13
-rw-r--r--sys/dev/ed/if_ed_pccard.c15
-rw-r--r--sys/dev/ed/if_ed_pci.c10
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 bcc0d85..7302619 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 1beac27..c3fd8f6 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 647c301..7fb9e50 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 1b2e17d..21ddb74 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);
OpenPOWER on IntegriCloud