Author: imp
Date: Sat Apr 18 03:10:28 2009
New Revision: 191234
URL: http://svn.freebsd.org/changeset/base/191234

Log:
  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....

Modified:
  head/sys/dev/ed/if_ed_cbus.c
  head/sys/dev/ed/if_ed_isa.c
  head/sys/dev/ed/if_ed_pccard.c
  head/sys/dev/ed/if_ed_pci.c

Modified: head/sys/dev/ed/if_ed_cbus.c
==============================================================================
--- head/sys/dev/ed/if_ed_cbus.c        Sat Apr 18 03:02:44 2009        
(r191233)
+++ head/sys/dev/ed/if_ed_cbus.c        Sat Apr 18 03:10:28 2009        
(r191234)
@@ -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);
 }
 
 /*

Modified: head/sys/dev/ed/if_ed_isa.c
==============================================================================
--- head/sys/dev/ed/if_ed_isa.c Sat Apr 18 03:02:44 2009        (r191233)
+++ head/sys/dev/ed/if_ed_isa.c Sat Apr 18 03:10:28 2009        (r191234)
@@ -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[] = {

Modified: head/sys/dev/ed/if_ed_pccard.c
==============================================================================
--- head/sys/dev/ed/if_ed_pccard.c      Sat Apr 18 03:02:44 2009        
(r191233)
+++ head/sys/dev/ed/if_ed_pccard.c      Sat Apr 18 03:10:28 2009        
(r191234)
@@ -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);

Modified: head/sys/dev/ed/if_ed_pci.c
==============================================================================
--- head/sys/dev/ed/if_ed_pci.c Sat Apr 18 03:02:44 2009        (r191233)
+++ head/sys/dev/ed/if_ed_pci.c Sat Apr 18 03:10:28 2009        (r191234)
@@ -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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to