Use queue(3) macros for if_multiaddrs.
[dragonfly.git] / sys / dev / netif / de / if_de.c
index 8af328f..a6ff7c8 100644 (file)
@@ -1,7 +1,7 @@
 /*     $NetBSD: if_de.c,v 1.86 1999/06/01 19:17:59 thorpej Exp $       */
 
 /* $FreeBSD: src/sys/pci/if_de.c,v 1.123.2.4 2000/08/04 23:25:09 peter Exp $ */
-/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.33 2005/05/11 20:58:35 joerg Exp $ */
+/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.39 2005/06/20 15:10:40 joerg Exp $ */
 
 /*-
  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
@@ -48,7 +48,7 @@
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/eventhandler.h>
-#include <machine/clock.h>
+#include <sys/thread2.h>
 #include <machine/bus.h>
 #include <machine/resource.h>
 #include <sys/bus.h>
@@ -128,12 +128,14 @@ static void
 tulip_timeout_callback(void *arg)
 {
     tulip_softc_t *sc = arg;
-    int s = splimp();
+
+    crit_enter();
 
     sc->tulip_flags &= ~TULIP_TIMEOUTPENDING;
     sc->tulip_probe_timeout -= 1000 / TULIP_HZ;
     (sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_TIMER);
-    splx(s);
+
+    crit_exit();
 }
 
 static void
@@ -2756,9 +2758,7 @@ tulip_addr_filter(tulip_softc_t *sc)
 #endif
 
     multicnt = 0;
-    for (ifma = sc->tulip_if.if_multiaddrs.lh_first; ifma != NULL;
-        ifma = ifma->ifma_link.le_next) {
-
+    LIST_FOREACH(ifma, &sc->tulip_if.if_multiaddrs, ifma_link) {
            if (ifma->ifma_addr->sa_family == AF_LINK)
                multicnt++;
     }
@@ -2785,9 +2785,7 @@ tulip_addr_filter(tulip_softc_t *sc)
         */
        bzero(sc->tulip_setupdata, sizeof(sc->tulip_setupdata));
 
-       for (ifma = sc->tulip_if.if_multiaddrs.lh_first; ifma != NULL;
-            ifma = ifma->ifma_link.le_next) {
-
+       LIST_FOREACH(ifma, &sc->tulip_if.if_multiaddrs, ifma_link) {
                if (ifma->ifma_addr->sa_family != AF_LINK)
                        continue;
 
@@ -2836,8 +2834,7 @@ tulip_addr_filter(tulip_softc_t *sc)
            /*
             * Else can get perfect filtering for 16 addresses.
             */
-           for (ifma = sc->tulip_if.if_multiaddrs.lh_first; ifma != NULL;
-                ifma = ifma->ifma_link.le_next) {
+           LIST_FOREACH(ifma, &sc->tulip_if.if_multiaddrs, ifma_link) {
                    if (ifma->ifma_addr->sa_family != AF_LINK)
                            continue;
                    addrp = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
@@ -3149,20 +3146,16 @@ tulip_rx_intr(tulip_softc_t *sc)
         */
        if (accept || ms == NULL) {
            struct mbuf *m0;
-           MGETHDR(m0, MB_DONTWAIT, MT_DATA);
-           if (m0 != NULL) {
-#if defined(TULIP_COPY_RXDATA)
-               if (!accept || total_len >= (MHLEN - 2)) {
-#endif
-                   MCLGET(m0, MB_DONTWAIT);
-                   if ((m0->m_flags & M_EXT) == 0) {
-                       m_freem(m0);
-                       m0 = NULL;
-                   }
+
 #if defined(TULIP_COPY_RXDATA)
-               }
+           if (!accept || total_len >= (MHLEN - 2))
+               m0 = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR);
+           else
+               m0 = m_gethdr(MB_DONTWAIT, MT_DATA);
+#else
+           m0 = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR);
 #endif
-           }
+
            if (accept
 #if defined(TULIP_COPY_RXDATA)
                && m0 != NULL
@@ -3728,10 +3721,10 @@ tulip_ifioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred * cr)
     tulip_softc_t *sc = (tulip_softc_t *)ifp->if_softc;
     struct ifaddr *ifa = (struct ifaddr *)data;
     struct ifreq *ifr = (struct ifreq *)data;
-    int s;
     int error = 0;
 
-    s = splimp();
+    crit_enter();
+
     switch (cmd) {
        case SIOCSIFADDR: {
            ifp->if_flags |= IFF_UP;
@@ -3857,7 +3850,8 @@ tulip_ifioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred * cr)
        }
     }
 
-    splx(s);
+    crit_exit();
+
     return error;
 }
 
@@ -4138,12 +4132,10 @@ tulip_pci_attach(device_t dev)
     sc->tulip_if.if_softc = sc;
 #if defined(TULIP_IOMAPPED)
     rid = PCI_CBIO;
-    res = bus_alloc_resource(dev, SYS_RES_IOPORT, &rid,
-                            0, ~0, 1, RF_ACTIVE);
+    res = bus_alloc_resource_any(dev, SYS_RES_IOPORT, &rid, RF_ACTIVE);
 #else
     rid = PCI_CBMA;
-    res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
-                            0, ~0, 1, RF_ACTIVE);
+    res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
 #endif
     if (!res)
        return ENXIO;
@@ -4179,9 +4171,8 @@ tulip_pci_attach(device_t dev)
        device_printf(dev, "%s%s pass %d.%d\n",
               sc->tulip_boardid, tulip_chipdescs[sc->tulip_chipid],
               (sc->tulip_revinfo & 0xF0) >> 4, sc->tulip_revinfo & 0x0F);
-       device_printf("address unknown\n");
+       device_printf(dev, "address unknown\n");
     } else {
-       int s;
        void (*intr_rtn)(void *) = tulip_intr_normal;
 
        if (sc->tulip_features & TULIP_HAVE_SHAREDINTR)
@@ -4191,10 +4182,10 @@ tulip_pci_attach(device_t dev)
            void *ih;
 
            rid = 0;
-           res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid,
-                                    0, ~0, 1, RF_SHAREABLE | RF_ACTIVE);
+           res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
+                                        RF_SHAREABLE | RF_ACTIVE);
            if (res == 0 || bus_setup_intr(dev, res, INTR_TYPE_NET,
-                                          intr_rtn, sc, &ih)) {
+                                          intr_rtn, sc, &ih, NULL)) {
                device_printf(dev, "couldn't map interrupt\n");
                free((caddr_t) sc->tulip_rxdescs, M_DEVBUF);
                free((caddr_t) sc->tulip_txdescs, M_DEVBUF);
@@ -4202,9 +4193,9 @@ tulip_pci_attach(device_t dev)
            }
        }
 
-       s = splimp();
+       crit_enter();
        tulip_attach(sc);
-       splx(s);
+       crit_exit();
     }
     return 0;
 }