Make all network interrupt service routines MPSAFE part 1/3.
[dragonfly.git] / sys / dev / netif / ex / if_ex.c
index 841a65f..3514d74 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ex/if_ex.c,v 1.26.2.3 2001/03/05 05:33:20 imp Exp $
- * $DragonFly: src/sys/dev/netif/ex/if_ex.c,v 1.17 2005/05/27 15:36:09 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/ex/if_ex.c,v 1.21 2005/11/28 17:13:42 dillon Exp $
  *
  * MAINTAINER: Matthew N. Dodd <winter@jurai.net>
  *                             <mdodd@FreeBSD.org>
 #include <sys/sockio.h>
 #include <sys/mbuf.h>
 #include <sys/socket.h>
+#include <sys/thread2.h>
 
 #include <sys/module.h>
 #include <sys/bus.h>
+#include <sys/serialize.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -267,7 +269,7 @@ ex_attach(device_t dev)
        /*
         * Attach the interface.
         */
-       ether_ifattach(ifp, sc->arpcom.ac_enaddr);
+       ether_ifattach(ifp, sc->arpcom.ac_enaddr, NULL);
 
        return(0);
 }
@@ -277,17 +279,12 @@ ex_init(void *xsc)
 {
        struct ex_softc *       sc = (struct ex_softc *) xsc;
        struct ifnet *          ifp = &sc->arpcom.ac_if;
-       int                     s;
        int                     i;
        int                     iobase = sc->iobase;
        unsigned short          temp_reg;
 
        DODEBUG(Start_End, printf("ex_init%d: start\n", ifp->if_dunit););
 
-       if (TAILQ_FIRST(&ifp->if_addrhead) == NULL) {
-               return;
-       }
-       s = splimp();
        ifp->if_timer = 0;
 
        /*
@@ -359,7 +356,6 @@ ex_init(void *xsc)
        outb(iobase + CMD_REG, Rcv_Enable_CMD);
 
        ex_start(ifp);
-       splx(s);
 
        DODEBUG(Start_End, printf("ex_init%d: finish\n", ifp->if_dunit););
 }
@@ -370,15 +366,13 @@ ex_start(struct ifnet *ifp)
 {
        struct ex_softc *       sc = ifp->if_softc;
        int                     iobase = sc->iobase;
-       int                     i, s, len, data_len, avail, dest, next;
+       int                     i, len, data_len, avail, dest, next;
        unsigned char           tmp16[2];
        struct mbuf *           opkt;
        struct mbuf *           m;
 
        DODEBUG(Start_End, printf("ex_start%d: start\n", unit););
 
-       s = splimp();
-
        /*
         * Main loop: send outgoing packets to network card until there are no
         * more packets left, or the card cannot accept any more yet.
@@ -419,7 +413,7 @@ ex_start(struct ifnet *ifp)
                DODEBUG(Sent_Pkts, printf("i=%d, avail=%d\n", i, avail););
 
                if (avail >= len + XMT_HEADER_LEN) {
-                       opkt = ifq_dequeue(&ifp->if_snd);
+                       ifq_dequeue(&ifp->if_snd, opkt);
 
 #ifdef EX_PSA_INTR      
                        /*
@@ -537,9 +531,6 @@ ex_start(struct ifnet *ifp)
                        DODEBUG(Status, printf("OACTIVE start\n"););
                }
        }
-
-       splx(s);
-
        DODEBUG(Start_End, printf("ex_start%d: finish\n", unit););
 }
 
@@ -743,7 +734,7 @@ ex_rx_intr(struct ex_softc *sc)
                                                m->m_len = MLEN;
                                        }
                                }
-                               (*ifp->if_input)(ifp, ipkt);
+                               ifp->if_input(ifp, ipkt);
                                ifp->if_ipackets++;
                        }
                } else {
@@ -769,13 +760,10 @@ ex_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
 {
        struct ex_softc *       sc = ifp->if_softc;
        struct ifreq *          ifr = (struct ifreq *)data;
-       int                     s;
        int                     error = 0;
 
        DODEBUG(Start_End, printf("ex_ioctl%d: start ", ifp->if_dunit););
 
-       s = splimp();
-
        switch(cmd) {
                case SIOCSIFFLAGS:
                        DODEBUG(Start_End, printf("SIOCSIFFLAGS"););
@@ -812,8 +800,6 @@ ex_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
                        break;
        }
 
-       splx(s);
-
        DODEBUG(Start_End, printf("\nex_ioctl%d: finish\n", ifp->if_dunit););
 
        return(error);
@@ -823,20 +809,12 @@ ex_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
 static void
 ex_reset(struct ex_softc *sc)
 {
-       int s;
-
        DODEBUG(Start_End, printf("ex_reset%d: start\n", unit););
-  
-       s = splimp();
 
        ex_stop(sc);
        ex_init(sc);
 
-       splx(s);
-
        DODEBUG(Start_End, printf("ex_reset%d: finish\n", unit););
-
-       return;
 }
 
 static void