Make all network interrupt service routines MPSAFE part 1/3.
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 28 Nov 2005 17:13:47 +0000 (17:13 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 28 Nov 2005 17:13:47 +0000 (17:13 +0000)
Replace the critical section that was previously used to serialize access
with the LWKT serializer.  Integrate the serializer into the IFNET structure.
Note that kern.intr_mpsafe must be set to 1 for network interrupts to actually
run MPSAFE.  Also note that any interrupts shared with othre non-MP drivers
will cause all drivers on that interrupt to run with the Big Giant Lock.

Network interrupt - Each network driver then simply passes that serializer
to bus_setup_intr() so only a single serializer is required to process the
entire interrupt path.  LWKT serialization support is already 100% integrated
into the interrupt subsystem so it will already be held as of when the
registered interrupt procedure is called.

Ioctl and if_* functions - All callers of if_* functions (such as if_start,
if_ioctl, etc) now obtain the IFNET serializer before making the call.  Thus
all of these entry points into the driver will now be serialized.

if_input - All code that calls if_input now ensures that the serializer
is held.  It will either already be held (when called from a driver), or
the serializer will be wrapped around the call.  When packets are forwarded
or bridged between interfaces, the target interface serializer will be
dropped temporarily to avoid a deadlock.

Device Driver access - dev_* entry points into certain pseudo-network
devices now obtain and release the serializer.  This had to be done on
a device-by-device basis (but there are only a few such devices).

Thanks to several people for helping test the patch, in particular
Sepherosa Ziehau.

161 files changed:
sys/bus/usb/usb_ethersubr.c
sys/bus/usb/usb_port.h
sys/conf/files.i386
sys/contrib/ipfilter/netinet/ip_fil.c
sys/dev/atm/en/midway.c
sys/dev/netif/an/if_an.c
sys/dev/netif/an/if_an_isa.c
sys/dev/netif/an/if_an_pccard.c
sys/dev/netif/an/if_an_pci.c
sys/dev/netif/ar/if_ar.c
sys/dev/netif/aue/if_aue.c
sys/dev/netif/awi/awi.c
sys/dev/netif/awi/awivar.h
sys/dev/netif/awi/if_awi_pccard.c
sys/dev/netif/axe/if_axe.c
sys/dev/netif/bfe/if_bfe.c
sys/dev/netif/bge/if_bge.c
sys/dev/netif/cm/if_cm_isa.c
sys/dev/netif/cm/smc90cx6.c
sys/dev/netif/cs/if_cs.c
sys/dev/netif/cue/if_cue.c
sys/dev/netif/cx/if_cx.c
sys/dev/netif/dc/if_dc.c
sys/dev/netif/de/if_de.c
sys/dev/netif/de/if_devar.h
sys/dev/netif/ed/if_ed.c
sys/dev/netif/ed/if_ed_isa.c
sys/dev/netif/ed/if_ed_pccard.c
sys/dev/netif/ed/if_ed_pci.c
sys/dev/netif/el/if_el.c
sys/dev/netif/em/if_em.c
sys/dev/netif/em/if_em.h
sys/dev/netif/ep/if_ep.c
sys/dev/netif/ep/if_ep_eisa.c
sys/dev/netif/ep/if_ep_isa.c
sys/dev/netif/ep/if_ep_pccard.c
sys/dev/netif/ex/if_ex.c
sys/dev/netif/ex/if_ex_isa.c
sys/dev/netif/ex/if_ex_pccard.c
sys/dev/netif/fe/if_fe.c
sys/dev/netif/fe/if_fe_pccard.c
sys/dev/netif/fea/if_fea.c
sys/dev/netif/fpa/if_fpa.c
sys/dev/netif/fwe/if_fwe.c
sys/dev/netif/fxp/if_fxp.c
sys/dev/netif/gx/if_gx.c
sys/dev/netif/ic/if_ic.c
sys/dev/netif/ie/if_ie.c
sys/dev/netif/kue/if_kue.c
sys/dev/netif/le/if_le.c
sys/dev/netif/lge/if_lge.c
sys/dev/netif/lnc/if_lnc.c
sys/dev/netif/lnc/if_lnc_isa.c
sys/dev/netif/lnc/if_lnc_pci.c
sys/dev/netif/mn/if_mn.c
sys/dev/netif/my/if_my.c
sys/dev/netif/my/if_myreg.h
sys/dev/netif/ndis/if_ndis.c
sys/dev/netif/nge/if_nge.c
sys/dev/netif/nv/if_nv.c
sys/dev/netif/nv/if_nvreg.h
sys/dev/netif/owi/if_owi.c
sys/dev/netif/pcn/if_pcn.c
sys/dev/netif/pdq_layer/pdq_ifsubr.c
sys/dev/netif/plip/if_plip.c
sys/dev/netif/ray/if_ray.c
sys/dev/netif/rdp/if_rdp.c
sys/dev/netif/re/if_re.c
sys/dev/netif/rl/if_rl.c
sys/dev/netif/rue/if_rue.c
sys/dev/netif/sbni/Makefile
sys/dev/netif/sbni/if_sbni.c
sys/dev/netif/sbni/if_sbni_isa.c [deleted file]
sys/dev/netif/sbni/if_sbni_pci.c
sys/dev/netif/sbsh/if_sbsh.c
sys/dev/netif/sf/if_sf.c
sys/dev/netif/sis/if_sis.c
sys/dev/netif/sk/if_sk.c
sys/dev/netif/sn/if_sn.c
sys/dev/netif/sr/if_sr.c
sys/dev/netif/ste/if_ste.c
sys/dev/netif/ti/if_ti.c
sys/dev/netif/tl/if_tl.c
sys/dev/netif/tx/if_tx.c
sys/dev/netif/txp/if_txp.c
sys/dev/netif/vr/if_vr.c
sys/dev/netif/vx/if_vx.c
sys/dev/netif/vx/if_vx_eisa.c
sys/dev/netif/vx/if_vx_pci.c
sys/dev/netif/wb/if_wb.c
sys/dev/netif/wl/if_wl.c
sys/dev/netif/xe/if_xe.c
sys/dev/netif/xl/if_xl.c
sys/kern/kern_poll.c
sys/net/altq/altq_rmclass.c
sys/net/altq/altq_subr.c
sys/net/bpf.c
sys/net/bridge/bridge.c
sys/net/disc/if_disc.c
sys/net/dummynet/ip_dummynet.c
sys/net/ef/if_ef.c
sys/net/faith/if_faith.c
sys/net/gif/if_gif.c
sys/net/gre/if_gre.c
sys/net/i4b/driver/i4b_ipr.c
sys/net/i4b/driver/i4b_isppp.c
sys/net/if.c
sys/net/if_arc.h
sys/net/if_arcsubr.c
sys/net/if_atm.h
sys/net/if_atmsubr.c
sys/net/if_ethersubr.c
sys/net/if_fddisubr.c
sys/net/if_iso88025subr.c
sys/net/if_loop.c
sys/net/if_media.c
sys/net/if_var.h
sys/net/ifq_var.h
sys/net/iso88025.h
sys/net/oldbridge/bridge.c
sys/net/pf/if_pflog.c
sys/net/pf/if_pfsync.c
sys/net/pf/pf.c
sys/net/ppp/if_ppp.c
sys/net/sl/if_sl.c
sys/net/sppp/if_spppsubr.c
sys/net/stf/if_stf.c
sys/net/tap/if_tap.c
sys/net/tun/if_tun.c
sys/net/vlan/if_vlan.c
sys/netgraph/eiface/ng_eiface.c
sys/netgraph/ether/ng_ether.c
sys/netgraph/fec/ng_fec.c
sys/netgraph/iface/ng_iface.c
sys/netinet/if_atm.c
sys/netinet/if_ether.c
sys/netinet/if_fddi.h
sys/netinet/in.c
sys/netinet/in_var.h
sys/netinet/ip_flow.c
sys/netinet/ip_output.c
sys/netinet6/in6.c
sys/netinet6/ip6_mroute.c
sys/netinet6/nd6.c
sys/netproto/802_11/ieee80211.c
sys/netproto/802_11/ieee80211_input.c
sys/netproto/802_11/wlan/ieee80211.c
sys/netproto/802_11/wlan/ieee80211_input.c
sys/netproto/atalk/aarp.c
sys/netproto/atalk/at_control.c
sys/netproto/atalk/ddp_output.c
sys/netproto/atm/atm_if.c
sys/netproto/atm/atm_var.h
sys/netproto/ipx/ipx.c
sys/netproto/ipx/ipx_ip.c
sys/netproto/ipx/ipx_outputfl.c
sys/netproto/natm/natm.c
sys/netproto/ns/ns.c
sys/netproto/ns/ns_ip.c
sys/netproto/ns/ns_output.c
sys/sys/bus.h

index 1b4dc29..5cc5885 100644 (file)
@@ -31,7 +31,7 @@
  *
  *
  * $FreeBSD: src/sys/dev/usb/usb_ethersubr.c,v 1.17 2003/11/14 11:09:45 johan Exp $
- * $DragonFly: src/sys/bus/usb/usb_ethersubr.c,v 1.13 2005/06/02 20:40:40 dillon Exp $
+ * $DragonFly: src/sys/bus/usb/usb_ethersubr.c,v 1.14 2005/11/28 17:13:23 dillon Exp $
  */
 
 /*
@@ -78,10 +78,10 @@ Static int usbintr(struct netmsg *msg)
        struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet;
        struct ifnet *ifp;
 
-       crit_enter();
        ifp = m->m_pkthdr.rcvif;
+       lwkt_serialize_enter(ifp->if_serializer);
        (*ifp->if_input)(ifp, m);
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 
        lwkt_replymsg(&msg->nm_lmsg, 0);
        return EASYNC;
index a3ae3f2..eaa52c2 100644 (file)
@@ -2,7 +2,7 @@
  * $OpenBSD: usb_port.h,v 1.18 2000/09/06 22:42:10 rahnds Exp $
  * $NetBSD: usb_port.h,v 1.68 2005/07/30 06:14:50 skrll Exp $
  * $FreeBSD: src/sys/dev/usb/usb_port.h,v 1.65 2003/11/09 23:54:21 joe Exp $
- * $DragonFly: src/sys/bus/usb/usb_port.h,v 1.13 2005/08/27 19:00:49 asmodai Exp $
+ * $DragonFly: src/sys/bus/usb/usb_port.h,v 1.14 2005/11/28 17:13:23 dillon Exp $
  */
 
 /* Also already merged from NetBSD:
@@ -108,7 +108,6 @@ typedef struct callout usb_callout_t;
 typedef struct malloc_type *usb_malloc_type;
 
 #define Ether_ifattach ether_ifattach
-#define IF_INPUT(ifp, m) (*(ifp)->if_input)((ifp), (m))
 
 #define logprintf printf
 
@@ -223,7 +222,6 @@ typedef int usb_malloc_type;
 
 #define Ether_ifattach ether_ifattach
 #define if_deactivate(x)
-#define IF_INPUT(ifp, m) (*(ifp)->if_input)(ifp, m)
 
 #define        usbpoll                 usbselect
 #define        uhidpoll                uhidselect
index 4ef116f..c029bf7 100644 (file)
@@ -2,7 +2,7 @@
 # files marked standard are always included.
 #
 # $FreeBSD: src/sys/conf/files.i386,v 1.307.2.38 2003/01/02 20:41:33 kan Exp $
-# $DragonFly: src/sys/conf/Attic/files.i386,v 1.37 2005/11/02 17:19:56 dillon Exp $
+# $DragonFly: src/sys/conf/Attic/files.i386,v 1.38 2005/11/28 17:13:25 dillon Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -138,7 +138,6 @@ dev/raid/pst/pst-raid.c             optional        pst
 dev/misc/puc/puc.c                     optional        puc
 dev/misc/puc/pucdata.c         optional        puc
 dev/netif/sbni/if_sbni.c               optional        sbni
-dev/netif/sbni/if_sbni_isa.c           optional        sbni isa
 dev/netif/sr/if_sr_isa.c               optional        sr isa
 dev/misc/syscons/schistory.c           optional        sc
 dev/misc/syscons/scmouse.c             optional        sc
index bc3ba1f..f917003 100644 (file)
@@ -6,7 +6,7 @@
  * @(#)ip_fil.c     2.41 6/5/96 (C) 1993-2000 Darren Reed
  * @(#)$Id: ip_fil.c,v 2.42.2.60 2002/08/28 12:40:39 darrenr Exp $
  * $FreeBSD: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.25.2.7 2004/07/04  09:24:38 darrenr Exp $
- * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.19 2005/06/12 15:37:19 hsu Exp $
+ * $DragonFly: src/sys/contrib/ipfilter/netinet/ip_fil.c,v 1.20 2005/11/28 17:13:35 dillon Exp $
  */
 #ifndef        SOLARIS
 #define        SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
@@ -1843,13 +1843,17 @@ frdest_t *fdp;
 #  ifdef IRIX
                IFNET_UPPERLOCK(ifp);
 #  endif
+               lwkt_serialize_enter(ifp->if_serializer);
                error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst,
                                          ro->ro_rt);
+               lwkt_serialize_exit(ifp->if_serializer);
 #  ifdef IRIX
                IFNET_UPPERUNLOCK(ifp);
 #  endif
 # else
+               lwkt_serialize_enter(ifp->if_serializer);
                error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst);
+               lwkt_serialize_exit(ifp->if_serializer);
 # endif
                goto done;
        }
@@ -1938,7 +1942,8 @@ sendorfree:
        for (m = m0; m; m = m0) {
                m0 = m->m_act;
                m->m_act = 0;
-               if (error == 0)
+               if (error == 0) {
+                       lwkt_serialize_enter(ifp->if_serializer);
 # if (BSD >= 199306) || (defined(IRIX) && (IRIX >= 605))
                        error = (*ifp->if_output)(ifp, m,
                            (struct sockaddr *)dst, ro->ro_rt);
@@ -1946,8 +1951,10 @@ sendorfree:
                        error = (*ifp->if_output)(ifp, m,
                            (struct sockaddr *)dst);
 # endif
-               else
+                       lwkt_serialize_exit(ifp->if_serializer);
+               } else {
                        m_freem(m);
+               }
        }
     }  
 done:
index 3b07650..937e055 100644 (file)
@@ -33,7 +33,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/en/midway.c,v 1.19.2.1 2003/01/23 21:06:42 sam Exp $
- * $DragonFly: src/sys/dev/atm/en/midway.c,v 1.20 2005/08/27 03:05:24 hsu Exp $
+ * $DragonFly: src/sys/dev/atm/en/midway.c,v 1.21 2005/11/28 17:13:37 dillon Exp $
  */
 
 /*
@@ -785,7 +785,7 @@ done_probe:
   /*
    * final commit
    */
-  atm_ifattach(ifp); 
+  atm_ifattach(ifp, NULL);
 }
 
 
index 0c1b8e5..9868b96 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an.c,v 1.2.2.13 2003/02/11 03:32:48 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an.c,v 1.33 2005/11/22 00:24:14 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an.c,v 1.34 2005/11/28 17:13:38 dillon Exp $
  */
 
 /*
@@ -801,7 +801,7 @@ an_attach(sc, dev, flags)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, sc->an_caps.an_oemaddr);
+       ether_ifattach(ifp, sc->an_caps.an_oemaddr, NULL);
 
        return(0);
 }
@@ -812,14 +812,13 @@ an_detach(device_t dev)
        struct an_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
        an_stop(sc);
        ifmedia_removeall(&sc->an_ifmedia);
        ether_ifdetach(ifp);
        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
-       crit_exit();
-
        an_release_resources(dev);
+       lwkt_serialize_exit(ifp->if_serializer);
        return 0;
 }
 
@@ -980,7 +979,7 @@ an_rxeof(sc)
                                rx_frame.an_rx_signal_strength,
                                rx_frame.an_rsvd0);
 #endif
-                       (*ifp->if_input)(ifp, m);
+                       ifp->if_input(ifp, m);
                }
 
        } else { /* MPI-350 */
@@ -1041,7 +1040,7 @@ an_rxeof(sc)
                                        rx_frame.an_rsvd0);
 #endif
 #endif
-                               (*ifp->if_input)(ifp, m);
+                               ifp->if_input(ifp, m);
                        
                                an_rx_desc.an_valid = 1;
                                an_rx_desc.an_len = AN_RX_BUFFER_SIZE;
@@ -1127,7 +1126,7 @@ an_stats_update(xsc)
        sc = xsc;
        ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
 
        sc->an_status.an_type = AN_RID_STATUS;
        sc->an_status.an_len = sizeof(struct an_ltv_status);
@@ -1147,7 +1146,7 @@ an_stats_update(xsc)
 
        callout_reset(&sc->an_stat_timer, hz, an_stats_update, sc);
 
-       crit_exit();
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
 }
 
 void
@@ -1868,8 +1867,6 @@ an_ioctl(ifp, command, data, cr)
        ifr = (struct ifreq *)data;
        ireq = (struct ieee80211req *)data;
 
-       crit_enter();
-
        config = (struct an_ltv_genconfig *)&sc->areq;
        key = (struct an_ltv_key *)&sc->areq;
        status = (struct an_ltv_status *)&sc->areq;
@@ -2421,8 +2418,6 @@ an_ioctl(ifp, command, data, cr)
                break;
        }
 
-       crit_exit();
-
        return(error != 0);
 }
 
@@ -2457,7 +2452,6 @@ an_init(xsc)
        struct an_softc         *sc = xsc;
        struct ifnet            *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
        if (ifp->if_flags & IFF_RUNNING)
                an_stop(sc);
 
@@ -2469,7 +2463,6 @@ an_init(xsc)
                if (sc->mpi350)
                        an_init_mpi350_desc(sc);        
                if (an_init_tx_ring(sc)) {
-                       crit_exit();
                        if_printf(ifp, "tx buffer allocation failed\n");
                        return;
                }
@@ -2508,7 +2501,6 @@ an_init(xsc)
        sc->an_ssidlist.an_type = AN_RID_SSIDLIST;
        sc->an_ssidlist.an_len = sizeof(struct an_ltv_ssidlist_new);
        if (an_write_record(sc, (struct an_ltv_gen *)&sc->an_ssidlist)) {
-               crit_exit();
                if_printf(ifp, "failed to set ssid list\n");
                return;
        }
@@ -2517,7 +2509,6 @@ an_init(xsc)
        sc->an_aplist.an_type = AN_RID_APLIST;
        sc->an_aplist.an_len = sizeof(struct an_ltv_aplist);
        if (an_write_record(sc, (struct an_ltv_gen *)&sc->an_aplist)) {
-               crit_exit();
                if_printf(ifp, "failed to set AP list\n");
                return;
        }
@@ -2526,14 +2517,12 @@ an_init(xsc)
        sc->an_config.an_len = sizeof(struct an_ltv_genconfig);
        sc->an_config.an_type = AN_RID_GENCONFIG;
        if (an_write_record(sc, (struct an_ltv_gen *)&sc->an_config)) {
-               crit_exit();
                if_printf(ifp, "failed to set configuration\n");
                return;
        }
 
        /* Enable the MAC */
        if (an_cmd(sc, AN_CMD_ENABLE, 0)) {
-               crit_exit();
                if_printf(ifp, "failed to enable MAC\n");
                return;
        }
@@ -2548,8 +2537,6 @@ an_init(xsc)
        ifp->if_flags &= ~IFF_OACTIVE;
 
        callout_reset(&sc->an_stat_timer, hz, an_stats_update, sc);
-
-       crit_exit();
 }
 
 static void
@@ -2730,8 +2717,6 @@ an_stop(sc)
 
        ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
-
        an_cmd(sc, AN_CMD_FORCE_SYNCLOSS, 0);
        CSR_WRITE_2(sc, AN_INT_EN(sc->mpi350), 0);
        an_cmd(sc, AN_CMD_DISABLE, 0);
@@ -2747,8 +2732,6 @@ an_stop(sc)
                free(sc->an_flash_buffer, M_DEVBUF);
                sc->an_flash_buffer = NULL;
        }
-
-       crit_exit();
 }
 
 static void
@@ -2759,14 +2742,12 @@ an_watchdog(ifp)
 
        sc = ifp->if_softc;
 
-       crit_enter();
        an_reset(sc);
        if (sc->mpi350)
                an_init_mpi350_desc(sc);        
        an_init(sc);
 
        ifp->if_oerrors++;
-       crit_exit();
 
        if_printf(ifp, "device timeout\n");
 }
index 4e7d9e2..2357efd 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an_isa.c,v 1.1.2.5 2003/02/01 03:25:12 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an_isa.c,v 1.13 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an_isa.c,v 1.14 2005/11/28 17:13:38 dillon Exp $
  */
 
 /*
@@ -120,8 +120,9 @@ an_attach_isa(dev)
        if (error)
                goto fail;
 
-       error = bus_setup_intr(dev, sc->irq_res, 0,
-                              an_intr, sc, &sc->irq_handle, NULL);
+       error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
+                              an_intr, sc, &sc->irq_handle, 
+                              sc->arpcom.ac_if.if_serializer);
        if (error) {
                ether_ifdetach(&sc->arpcom.ac_if);
                ifmedia_removeall(&sc->an_ifmedia);
index b72b39c..17ae603 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an_pccard.c,v 1.1.2.6 2003/02/01 03:25:12 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an_pccard.c,v 1.13 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an_pccard.c,v 1.14 2005/11/28 17:13:38 dillon Exp $
  */
 
 /*
@@ -161,8 +161,9 @@ an_pccard_attach(device_t dev)
        /*
         * Must setup the interrupt after the an_attach to prevent racing.
         */
-       error = bus_setup_intr(dev, sc->irq_res, 0,
-                              an_intr, sc, &sc->irq_handle, NULL);
+       error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
+                              an_intr, sc, &sc->irq_handle,
+                              sc->arpcom.ac_if.if_serializer);
        if (error) {
                ether_ifdetach(&sc->arpcom.ac_if);
                ifmedia_removeall(&sc->an_ifmedia);
index da3bff9..4e06764 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/an/if_an_pci.c,v 1.2.2.8 2003/02/11 03:32:48 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/an/if_an_pci.c,v 1.17 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/an/if_an_pci.c,v 1.18 2005/11/28 17:13:38 dillon Exp $
  */
 
 /*
@@ -205,8 +205,9 @@ an_attach_pci(dev)
        if (error)
                goto fail;
 
-       error = bus_setup_intr(dev, sc->irq_res, 0,
-                              an_intr, sc, &sc->irq_handle, NULL);
+       error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
+                              an_intr, sc, &sc->irq_handle, 
+                              sc->arpcom.ac_if.if_serializer);
        if (error) {
                ifmedia_removeall(&sc->an_ifmedia);
                ether_ifdetach(&sc->arpcom.ac_if);
index e26c1a7..fd6f852 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ar/if_ar.c,v 1.66 2005/01/06 01:42:28 imp Exp $
- * $DragonFly: src/sys/dev/netif/ar/if_ar.c,v 1.17 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ar/if_ar.c,v 1.18 2005/11/28 17:13:39 dillon Exp $
  */
 
 /*
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/module.h>
-#include <sys/thread2.h>
 #include <sys/bus.h>
+#include <sys/serialize.h>
 #include <machine/bus.h>
 #include <machine/resource.h>
 #include <machine/bus_pio.h>
 #include <machine/bus_memio.h>
 #include <sys/rman.h>
 
+#include <sys/thread2.h>
+
 #include <net/if.h>
 #ifdef NETGRAPH
 #include <netgraph/ng_message.h>
@@ -149,6 +151,7 @@ struct ar_softc {
 };
 
 static int     next_ar_unit = 0;
+static struct lwkt_serialize ar_serializer;
 
 #ifdef NETGRAPH
 #define DOG_HOLDOFF    6       /* dog holds off for 6 secs */
@@ -260,6 +263,7 @@ ar_attach(device_t device)
        int error;
 
        hc = (struct ar_hardc *)device_get_softc(device);
+       lwkt_serialize_init(&ar_serializer);
 
        printf("arc%d: %uK RAM, %u ports, rev %u.\n",
                hc->cunit,
@@ -271,7 +275,7 @@ ar_attach(device_t device)
 
        error = BUS_SETUP_INTR(device_get_parent(device), device, hc->res_irq,
                               0, arintr, hc,
-                              &hc->intr_cookie, NULL);
+                              &hc->intr_cookie, &ar_serializer);
        if (error)
                return (1);
 
@@ -324,7 +328,7 @@ ar_attach(device_t device)
                        iface);
 
                sppp_attach((struct ifnet *)&sc->ifsppp);
-               if_attach(ifp);
+               if_attach(ifp, &ar_serializer);
 
                bpfattach(ifp, DLT_PPP, PPP_HEADER_LEN);
 #else  /* NETGRAPH */
@@ -358,6 +362,9 @@ ar_detach(device_t device)
 {
        device_t parent = device_get_parent(device);
        struct ar_hardc *hc = device_get_softc(device);
+       int error;
+
+       lwkt_serialize_enter(&ar_serializer);
 
        if (hc->intr_cookie != NULL) {
                if (BUS_TEARDOWN_INTR(parent, device,
@@ -374,7 +381,10 @@ ar_detach(device_t device)
        FREE(hc->sc, M_DEVBUF);
        hc->sc = NULL;
        hc->mem_start = NULL;
-       return (ar_deallocate_resources(device));
+       error = ar_deallocate_resources(device);
+       lwkt_serialize_exit(&ar_serializer);
+
+       return (error);
 }
 
 int
@@ -792,8 +802,6 @@ arioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
        TRC(if_printf(ifp, "arioctl %s.\n",
                (cmd == SIOCSIFFLAGS) ? "SIOCSIFFLAGS" : "SIOCSIFADDR");)
 
-       crit_enter();
-
        should_be_up = ifp->if_flags & IFF_RUNNING;
 
        if(!was_up && should_be_up) {
@@ -808,8 +816,6 @@ arioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
                ar_down(sc);
                sppp_flush(ifp);
        }
-
-       crit_exit();
        return (0);
 }
 #endif /* NETGRAPH */
@@ -2057,13 +2063,12 @@ ngar_watchdog_frame(void * arg)
        struct ar_softc * sc = arg;
        int     speed;
 
-       crit_enter();
-
        if (sc->running == 0) {
-               crit_exit();
                return; /* if we are not running let timeouts die */
        }
 
+       lwkt_serialize_enter(&ar_serializer);
+
        /*
         * calculate the apparent throughputs 
         *  XXX a real hack
@@ -2078,39 +2083,29 @@ ngar_watchdog_frame(void * arg)
                sc->outrate = speed;
        sc->inlast++;
 
-       crit_exit();
-
        if ((sc->inlast > QUITE_A_WHILE)
        && (sc->out_deficit > LOTS_OF_PACKETS)) {
                log(LOG_ERR, "ar%d: No response from remote end\n", sc->unit);
 
-               crit_enter();
-
                ar_down(sc);
                ar_up(sc);
                sc->inlast = sc->out_deficit = 0;
-
-               crit_exit();
        } else if ( sc->xmit_busy ) { /* no TX -> no TX timeouts */
                if (sc->out_dog == 0) { 
                        log(LOG_ERR, "ar%d: Transmit failure.. no clock?\n",
                                        sc->unit);
 
-                       crit_enter();
-
                        arwatchdog(sc);
 #if 0
                        ar_down(sc);
                        ar_up(sc);
 #endif
-
-                       crit_exit();
-
                        sc->inlast = sc->out_deficit = 0;
                } else {
                        sc->out_dog--;
                }
        }
+       lwkt_serialize_exit(&ar_serializer);
        callout_reset(&sc->timer, hz, ngar_watchdog_frame, sc);
 }
 
@@ -2248,20 +2243,15 @@ ngar_rcvdata(hook_p hook, struct mbuf *m, meta_p meta)
        else
                xmitq_p = (&sc->xmitq);
 
-       crit_enter();
-
        if (IF_QFULL(xmitq_p)) {
                IF_DROP(xmitq_p);
 
-               crit_exit();
-
                error = ENOBUFS;
                goto bad;
        }
        IF_ENQUEUE(xmitq_p, m);
        arstart(sc);
 
-       crit_exit();
        return (0);
 
 bad:
@@ -2331,13 +2321,9 @@ ngar_disconnect(hook_p hook)
         * If it's the data hook, then free resources etc.
         */
        if (NG_HOOK_PRIVATE(hook)) {
-               crit_enter();
-
                sc->datahooks--;
                if (sc->datahooks == 0)
                        ar_down(sc);
-
-               crit_exit();
        } else {
                sc->debug_hook = NULL;
        }
index 5cfca45..1f6af85 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_aue.c,v 1.78 2003/12/17 14:23:07 sanpei Exp $
- * $DragonFly: src/sys/dev/netif/aue/if_aue.c,v 1.28 2005/11/22 00:24:15 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/aue/if_aue.c,v 1.29 2005/11/28 17:13:41 dillon Exp $
  */
 
 /*
@@ -725,7 +725,7 @@ USB_ATTACH(aue)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
        usb_register_netisr();
        sc->aue_dying = 0;
 
index 1e76237..10a0cc3 100644 (file)
@@ -1,7 +1,3 @@
-/*     $NetBSD: awi.c,v 1.26 2000/07/21 04:48:55 onoe Exp $    */
-/* $FreeBSD: src/sys/dev/awi/awi.c,v 1.10.2.2 2003/01/23 21:06:42 sam Exp $ */
-/* $DragonFly: src/sys/dev/netif/awi/Attic/awi.c,v 1.24 2005/11/22 00:24:17 dillon Exp $ */
-
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
  * All rights reserved.
  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $NetBSD: awi.c,v 1.26 2000/07/21 04:48:55 onoe Exp $
+ * $FreeBSD: src/sys/dev/awi/awi.c,v 1.10.2.2 2003/01/23 21:06:42 sam Exp $
+ * $DragonFly: src/sys/dev/netif/awi/Attic/awi.c,v 1.25 2005/11/28 17:13:41 dillon Exp $
  */
 /*
  * Driver for AMD 802.11 firmware.
@@ -165,8 +165,6 @@ static int awi_cmd_scan (struct awi_softc *sc);
 static int awi_cmd (struct awi_softc *sc, u_int8_t cmd);
 static void awi_cmd_done (struct awi_softc *sc);
 static int awi_next_txd (struct awi_softc *sc, int len, u_int32_t *framep, u_int32_t*ntxdp);
-static int awi_lock (struct awi_softc *sc);
-static void awi_unlock (struct awi_softc *sc);
 static int awi_intr_lock (struct awi_softc *sc);
 static void awi_intr_unlock (struct awi_softc *sc);
 static int awi_cmd_wait (struct awi_softc *sc);
@@ -210,23 +208,19 @@ awi_attach(sc)
        struct ifmediareq imr;
 #endif
 
-       crit_enter();
        /*
         * Even if we can sleep in initialization state,
         * all other processes (e.g. ifconfig) have to wait for
         * completion of attaching interface.
         */
-       sc->sc_busy = 1;
        sc->sc_status = AWI_ST_INIT;
        TAILQ_INIT(&sc->sc_scan);
        error = awi_init_hw(sc);
        if (error) {
                sc->sc_invalid = 1;
-               crit_exit();
                return error;
        }
        error = awi_init_mibs(sc);
-       crit_exit();
        if (error) {
                sc->sc_invalid = 1;
                return error;
@@ -251,7 +245,9 @@ awi_attach(sc)
        if_printf(ifp, "IEEE802.11 %s %dMbps (firmware %s)\n",
            sc->sc_mib_phy.IEEE_PHY_Type == AWI_PHY_TYPE_FH ? "FH" : "DS",
            sc->sc_tx_rate / 10, sc->sc_banner);
-       ether_ifattach(ifp, sc->sc_mib_addr.aMAC_Address);
+       ether_ifattach(ifp, sc->sc_mib_addr.aMAC_Address, NULL);
+
+       lwkt_serialize_enter(ifp->if_serializer);
 
 #ifdef IFM_IEEE80211
        ifmedia_init(&sc->sc_media, 0, awi_media_change, awi_media_status);
@@ -271,12 +267,9 @@ awi_attach(sc)
        awi_media_status(ifp, &imr);
        ifmedia_set(&sc->sc_media, imr.ifm_active);
 #endif
-
-       /* ready to accept ioctl */
-       awi_unlock(sc);
-
        /* Attach is successful. */
        sc->sc_attached = 1;
+       lwkt_serialize_exit(ifp->if_serializer);
        return 0;
 }
 
@@ -294,12 +287,8 @@ awi_ioctl(ifp, cmd, data, cr)
        struct ieee80211_nwid nwid;
        u_int8_t *p;
 
-       crit_enter();
+       error = 0;
 
-       /* serialize ioctl */
-       error = awi_lock(sc);
-       if (error)
-               goto cantlock;
        switch (cmd) {
        case SIOCSIFADDR:
                ifp->if_flags |= IFF_UP;
@@ -395,9 +384,6 @@ awi_ioctl(ifp, cmd, data, cr)
                error = awi_wicfg(ifp, cmd, data);
                break;
        }
-       awi_unlock(sc);
-  cantlock:
-       crit_exit();
        return error;
 }
 
@@ -545,7 +531,7 @@ awi_intr(arg)
 {
        struct awi_softc *sc = arg;
        u_int16_t status;
-       int error, handled = 0, ocansleep;
+       int error, handled = 0;
 
        if (!sc->sc_enabled || !sc->sc_enab_intr || sc->sc_invalid)
                return 0;
@@ -553,8 +539,6 @@ awi_intr(arg)
        am79c930_gcr_setbits(&sc->sc_chip,
            AM79C930_GCR_DISPWDN | AM79C930_GCR_ECINT);
        awi_write_1(sc, AWI_DIS_PWRDN, 1);
-       ocansleep = sc->sc_cansleep;
-       sc->sc_cansleep = 0;
 
        for (;;) {
                error = awi_intr_lock(sc);
@@ -584,7 +568,6 @@ awi_intr(arg)
                                (void)awi_next_scan(sc);
                }
        }
-       sc->sc_cansleep = ocansleep;
        am79c930_gcr_clearbits(&sc->sc_chip, AM79C930_GCR_DISPWDN);
        awi_write_1(sc, AWI_DIS_PWRDN, 0);
        return handled;
@@ -692,15 +675,12 @@ awi_watchdog(ifp)
        struct ifnet *ifp;
 {
        struct awi_softc *sc = ifp->if_softc;
-       int ocansleep;
 
        if (sc->sc_invalid) {
                ifp->if_timer = 0;
                return;
        }
 
-       ocansleep = sc->sc_cansleep;
-       sc->sc_cansleep = 0;
        if (sc->sc_tx_timer && --sc->sc_tx_timer == 0) {
                if_printf(ifp, "transmit timeout\n");
                awi_txint(sc);
@@ -733,7 +713,6 @@ awi_watchdog(ifp)
                ifp->if_timer = 0;
        else
                ifp->if_timer = 1;
-       sc->sc_cansleep = ocansleep;
 }
 
 static void
@@ -1039,7 +1018,7 @@ awi_input(sc, m, rxts, rssi)
                        break;
                }
                ifp->if_ipackets++;
-               (*ifp->if_input)(ifp, m);
+               ifp->if_input(ifp, m);
                break;
        case IEEE80211_FC0_TYPE_MGT:
                if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) !=
@@ -1225,13 +1204,9 @@ awi_init_hw(sc)
                status = awi_read_1(sc, AWI_SELFTEST);
                if ((status & 0xf0) == 0xf0)
                        break;
-               if (sc->sc_cansleep) {
-                       sc->sc_sleep_cnt++;
-                       (void)tsleep(sc, 0, "awitst", 1);
-                       sc->sc_sleep_cnt--;
-               } else {
-                       DELAY(1000*1000/hz);
-               }
+               sc->sc_sleep_cnt++;
+               (void)tsleep(sc, 0, "awitst", 1);
+               sc->sc_sleep_cnt--;
        }
        if (status != AWI_SELFTEST_PASSED) {
                if_printf(ifp, "failed to complete selftest (code %x)\n",
@@ -1271,8 +1246,6 @@ awi_init_hw(sc)
                        printf(" (no hardware)\n");
                else if (error != EWOULDBLOCK)
                        printf(" (error %d)\n", error);
-               else if (sc->sc_cansleep)
-                       printf(" (lost interrupt)\n");
                else
                        printf(" (command timeout)\n");
        }
@@ -2315,53 +2288,6 @@ awi_next_txd(sc, len, framep, ntxdp)
        return 0;
 }
 
-static int
-awi_lock(sc)
-       struct awi_softc *sc;
-{
-       int error = 0;
-
-       if (curproc == NULL) {
-               /*
-                * XXX
-                * Though driver ioctl should be called with context,
-                * KAME ipv6 stack calls ioctl in interrupt for now.
-                * We simply abort the request if there are other
-                * ioctl requests in progress.
-                */
-               if (sc->sc_busy) {
-                       return EWOULDBLOCK;
-                       if (sc->sc_invalid)
-                               return ENXIO;
-               }
-               sc->sc_busy = 1;
-               sc->sc_cansleep = 0;
-               return 0;
-       }
-       while (sc->sc_busy) {
-               if (sc->sc_invalid)
-                       return ENXIO;
-               sc->sc_sleep_cnt++;
-               error = tsleep(sc, PCATCH, "awilck", 0);
-               sc->sc_sleep_cnt--;
-               if (error)
-                       return error;
-       }
-       sc->sc_busy = 1;
-       sc->sc_cansleep = 1;
-       return 0;
-}
-
-static void
-awi_unlock(sc)
-       struct awi_softc *sc;
-{
-       sc->sc_busy = 0;
-       sc->sc_cansleep = 0;
-       if (sc->sc_sleep_cnt)
-               wakeup(sc);
-}
-
 static int
 awi_intr_lock(sc)
        struct awi_softc *sc;
@@ -2415,21 +2341,9 @@ awi_cmd_wait(sc)
                        sc->sc_invalid = 1;
                        return ENXIO;
                }
-               if (sc->sc_cansleep) {
-                       sc->sc_sleep_cnt++;
-                       error = tsleep(sc, 0, "awicmd",
-                           AWI_CMD_TIMEOUT*hz/1000);
-                       sc->sc_sleep_cnt--;
-               } else {
-                       if (awi_read_1(sc, AWI_CMD_STATUS) != AWI_STAT_IDLE) {
-                               awi_cmd_done(sc);
-                               break;
-                       }
-                       if (i++ >= AWI_CMD_TIMEOUT*1000/10)
-                               error = EWOULDBLOCK;
-                       else
-                               DELAY(10);
-               }
+               sc->sc_sleep_cnt++;
+               error = tsleep(sc, 0, "awicmd", AWI_CMD_TIMEOUT*hz/1000);
+               sc->sc_sleep_cnt--;
                if (error)
                        break;
        }
index 68aeeae..55e8004 100644 (file)
@@ -1,6 +1,6 @@
 /* $NetBSD: awivar.h,v 1.12 2000/07/21 04:48:56 onoe Exp $ */
 /* $FreeBSD: src/sys/dev/awi/awivar.h,v 1.6.2.1 2000/12/07 04:09:39 imp Exp $ */
-/* $DragonFly: src/sys/dev/netif/awi/Attic/awivar.h,v 1.6 2005/06/13 20:25:56 joerg Exp $ */
+/* $DragonFly: src/sys/dev/netif/awi/Attic/awivar.h,v 1.7 2005/11/28 17:13:41 dillon Exp $ */
 
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
@@ -99,8 +99,6 @@ struct awi_softc
        struct ifmedia          sc_media;
        enum awi_status         sc_status;
        unsigned int            sc_enabled:1,
-                               sc_busy:1,
-                               sc_cansleep:1,
                                sc_invalid:1,
                                sc_enab_intr:1,
                                sc_format_llc:1,
index d17281f..bd60232 100644 (file)
@@ -23,7 +23,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/awi/if_awi_pccard.c,v 1.5.2.1 2000/12/07 04:09:39 imp Exp $
- * $DragonFly: src/sys/dev/netif/awi/Attic/if_awi_pccard.c,v 1.13 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/awi/Attic/if_awi_pccard.c,v 1.14 2005/11/28 17:13:41 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -187,23 +187,25 @@ awi_pccard_attach(device_t dev)
        } else
                am79c930_chip_init(&sc->sc_chip, 0);
 
-       error = bus_setup_intr(dev, psc->sc_irq_res, 0,
-                              (void (*)(void *))awi_intr, sc,
-                              &psc->sc_intrhand, NULL);
-       if (error) {
-               device_printf(dev, "awi_pccard_attach: intr setup failed\n");
-               goto fail;
-       }
-
-       sc->sc_cansleep = 1;
        sc->sc_enabled = 1;
        sc->sc_ifp = &sc->sc_ec.ac_if;
 
        error = awi_attach(sc);
        sc->sc_enabled = 0;     /*XXX*/
-       if (error == 0)
-               return 0;
-       device_printf(dev, "awi_pccard_attach: awi_attach failed\n");
+
+       if (error) {
+               device_printf(dev, "awi_pccard_attach: awi_attach failed\n");
+               goto fail;
+       }
+
+       error = bus_setup_intr(dev, psc->sc_irq_res, INTR_NETSAFE,
+                              (void (*)(void *))awi_intr, sc,
+                              &psc->sc_intrhand, sc->sc_ifp->if_serializer);
+       if (error) {
+               device_printf(dev, "awi_pccard_attach: intr setup failed\n");
+               goto fail;
+       }
+       return 0;
 
   fail:
        if (psc->sc_intrhand) {
index de154d4..8faa08f 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_axe.c,v 1.10 2003/12/08 07:54:14 obrien Exp $
- * $DragonFly: src/sys/dev/netif/axe/if_axe.c,v 1.18 2005/11/22 00:24:18 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/axe/if_axe.c,v 1.19 2005/11/28 17:13:41 dillon Exp $
  */
 /*
  * ASIX Electronics AX88172 USB 2.0 ethernet driver. Used in the
@@ -209,10 +209,7 @@ axe_miibus_readreg(device_ptr_t dev, int phy, int reg)
        usbd_status             err;
        u_int16_t               val;
 
-       crit_enter();
-
        if (sc->axe_dying) {
-               crit_exit();
                return(0);
        }
 
@@ -223,17 +220,14 @@ axe_miibus_readreg(device_ptr_t dev, int phy, int reg)
         */
 
        if (sc->axe_phyaddrs[0] != AXE_NOPHY && phy != sc->axe_phyaddrs[0]) {
-               crit_exit();
                return (0);
        }
 
        if (sc->axe_phyaddrs[1] != AXE_NOPHY && phy != sc->axe_phyaddrs[1]) {
-               crit_exit();
                return (0);
        }
 #endif
        if (sc->axe_phyaddrs[0] != 0xFF && sc->axe_phyaddrs[0] != phy) {
-               crit_exit();
                return (0);
        }
 
@@ -241,8 +235,6 @@ axe_miibus_readreg(device_ptr_t dev, int phy, int reg)
        err = axe_cmd(sc, AXE_CMD_MII_READ_REG, reg, phy, (void *)&val);
        axe_cmd(sc, AXE_CMD_MII_OPMODE_HW, 0, 0, NULL);
 
-       crit_exit();
-
        if (err) {
                if_printf(&sc->arpcom.ac_if, "read PHY failed\n");
                return(-1);
@@ -260,10 +252,7 @@ axe_miibus_writereg(device_ptr_t dev, int phy, int reg, int val)
        struct axe_softc        *sc = USBGETSOFTC(dev);
        usbd_status             err;
 
-       crit_enter();
-
        if (sc->axe_dying) {
-               crit_exit();
                return(0);
        }
 
@@ -271,8 +260,6 @@ axe_miibus_writereg(device_ptr_t dev, int phy, int reg, int val)
        err = axe_cmd(sc, AXE_CMD_MII_WRITE_REG, reg, phy, (void *)&val);
        axe_cmd(sc, AXE_CMD_MII_OPMODE_HW, 0, 0, NULL);
 
-       crit_exit();
-
        if (err) {
                if_printf(&sc->arpcom.ac_if, "write PHY failed\n");
                return(-1);
@@ -338,14 +325,11 @@ axe_setmulti(struct axe_softc *sc)
        u_int16_t               rxmode;
        u_int8_t                hashtbl[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
 
-       crit_enter();
-
        axe_cmd(sc, AXE_CMD_RXCTL_READ, 0, 0, (void *)&rxmode);
 
        if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) {
                rxmode |= AXE_RXCMD_ALLMULTI;
                axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL);
-               crit_exit();
                return;
        } else
                rxmode &= ~AXE_RXCMD_ALLMULTI;
@@ -363,8 +347,6 @@ axe_setmulti(struct axe_softc *sc)
 
        axe_cmd(sc, AXE_CMD_WRITE_MCAST, 0, 0, (void *)&hashtbl);
        axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL);
-
-       crit_exit();
 }
 
 Static void
@@ -502,7 +484,7 @@ USB_ATTACH(axe)
         * Call MI attach routine.
         */
 
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
 
        sc->axe_dying = 0;
 
@@ -517,8 +499,6 @@ axe_detach(device_ptr_t dev)
        struct axe_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
-
        sc->axe_dying = 1;
        callout_stop(&sc->axe_stat_timer);
        ether_ifdetach(ifp);
@@ -530,8 +510,6 @@ axe_detach(device_ptr_t dev)
        if (sc->axe_ep[AXE_ENDPT_INTR] != NULL)
                usbd_abort_pipe(sc->axe_ep[AXE_ENDPT_INTR]);
 
-       crit_exit();
-
        return(0);
 }
 
@@ -619,12 +597,10 @@ axe_rxstart(struct ifnet *ifp)
        struct axe_softc *sc = ifp->if_softc;
        struct axe_chain *c;
 
-       crit_enter();
        c = &sc->axe_cdata.axe_rx_chain[sc->axe_cdata.axe_rx_prod];
 
        if (axe_newbuf(sc, c, NULL) == ENOBUFS) {
                ifp->if_ierrors++;
-               crit_exit();
                return;
        }
 
@@ -633,8 +609,6 @@ axe_rxstart(struct ifnet *ifp)
            c, mtod(c->axe_mbuf, char *), AXE_BUFSZ, USBD_SHORT_XFER_OK,
            USBD_NO_TIMEOUT, axe_rxeof);
        usbd_transfer(c->axe_xfer);
-
-       crit_exit();
 }
 
 /*
@@ -650,16 +624,16 @@ axe_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
         struct mbuf *m;
        int total_len = 0;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (!(ifp->if_flags & IFF_RUNNING)) {
-               crit_exit();
+               lwkt_serialize_exit(ifp->if_serializer);
                return;
        }
 
        if (status != USBD_NORMAL_COMPLETION) {
                if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) {
-                       crit_exit();
+                       lwkt_serialize_exit(ifp->if_serializer);
                        return;
                }
                if (usbd_ratecheck(&sc->axe_rx_notice)) {
@@ -687,8 +661,7 @@ axe_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
        /* Put the packet on the special USB input queue. */
        usb_ether_input(m);
        axe_rxstart(ifp);
-
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
        return;
 done:
        /* Setup new transfer. */
@@ -696,8 +669,7 @@ done:
            c, mtod(c->axe_mbuf, char *), AXE_BUFSZ, USBD_SHORT_XFER_OK,
            USBD_NO_TIMEOUT, axe_rxeof);
        usbd_transfer(c->axe_xfer);
-
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 /*
@@ -713,17 +685,16 @@ axe_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        usbd_status err;
 
-       crit_enter();
-
+       lwkt_serialize_enter(ifp->if_serializer);
        if (status != USBD_NORMAL_COMPLETION) {
                if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) {
-                       crit_exit();
+                       lwkt_serialize_exit(ifp->if_serializer);
                        return;
                }
                if_printf(ifp, "usb error on tx: %s\n", usbd_errstr(status));
                if (status == USBD_STALLED)
                        usbd_clear_endpoint_stall(sc->axe_ep[AXE_ENDPT_TX]);
-               crit_exit();
+               lwkt_serialize_exit(ifp->if_serializer);
                return;
        }
 
@@ -743,8 +714,7 @@ axe_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
 
        if (!ifq_is_empty(&ifp->if_snd))
                (*ifp->if_start)(ifp);
-
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 Static void
@@ -758,8 +728,7 @@ axe_tick(void *xsc)
        if (mii == NULL)
                return;
 
-       crit_enter();
-
+       lwkt_serialize_enter(ifp->if_serializer);
        mii_tick(mii);
        if (!sc->axe_link && mii->mii_media_status & IFM_ACTIVE &&
            IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
@@ -767,10 +736,8 @@ axe_tick(void *xsc)
                if (!ifq_is_empty(&ifp->if_snd))
                        axe_start(ifp);
        }
-
        callout_reset(&sc->axe_stat_timer, hz, axe_tick, sc);
-
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 Static int
@@ -810,27 +777,21 @@ axe_start(struct ifnet *ifp)
        struct axe_softc *sc = ifp->if_softc;
        struct mbuf *m_head = NULL;
 
-       crit_enter();
-
        if (!sc->axe_link) {
-               crit_exit();
                return;
        }
 
        if (ifp->if_flags & IFF_OACTIVE) {
-               crit_exit();
                return;
        }
 
        m_head = ifq_poll(&ifp->if_snd);
        if (m_head == NULL) {
-               crit_exit();
                return;
        }
 
        if (axe_encap(sc, m_head, 0)) {
                ifp->if_flags |= IFF_OACTIVE;
-               crit_exit();
                return;
        }
        ifq_dequeue(&ifp->if_snd, m_head);
@@ -847,8 +808,6 @@ axe_start(struct ifnet *ifp)
         * Set a timeout in case the chip goes out to lunch.
         */
        ifp->if_timer = 5;
-
-       crit_exit();
 }
 
 Static void
@@ -860,10 +819,7 @@ axe_init(void *xsc)
        usbd_status             err;
        int i, rxmode;
 
-       crit_enter();
-
        if (ifp->if_flags & IFF_RUNNING) {
-               crit_exit();
                return;
        }
 
@@ -882,14 +838,12 @@ axe_init(void *xsc)
 
        /* Init TX ring. */
        if (axe_tx_list_init(sc) == ENOBUFS) {
-               crit_exit();
                if_printf(ifp, "tx list init failed\n");
                return;
        }
 
        /* Init RX ring. */
        if (axe_rx_list_init(sc) == ENOBUFS) {
-               crit_exit();
                if_printf(ifp, "rx list init failed\n");
                return;
        }
@@ -918,7 +872,6 @@ axe_init(void *xsc)
        err = usbd_open_pipe(sc->axe_iface, sc->axe_ed[AXE_ENDPT_RX],
            USBD_EXCLUSIVE_USE, &sc->axe_ep[AXE_ENDPT_RX]);
        if (err) {
-               crit_exit();
                if_printf(ifp, "open rx pipe failed: %s\n", usbd_errstr(err));
                return;
        }
@@ -926,7 +879,6 @@ axe_init(void *xsc)
        err = usbd_open_pipe(sc->axe_iface, sc->axe_ed[AXE_ENDPT_TX],
            USBD_EXCLUSIVE_USE, &sc->axe_ep[AXE_ENDPT_TX]);
        if (err) {
-               crit_exit();
                if_printf(ifp, "open tx pipe failed: %s\n", usbd_errstr(err));
                return;
        }
@@ -944,8 +896,6 @@ axe_init(void *xsc)
        ifp->if_flags &= ~IFF_OACTIVE;
 
        callout_reset(&sc->axe_stat_timer, hz, axe_tick, sc);
-
-       crit_exit();
 }
 
 Static int
@@ -957,8 +907,6 @@ axe_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        u_int16_t               rxmode;
        int error = 0;
 
-       crit_enter();
-
        switch(command) {
        case SIOCSIFFLAGS:
                if (ifp->if_flags & IFF_UP) {
@@ -1004,9 +952,6 @@ axe_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
-
        return(error);
 }
 
@@ -1017,8 +962,6 @@ axe_watchdog(struct ifnet *ifp)
        struct axe_chain *c;
        usbd_status stat;
 
-       crit_enter();
-
        ifp->if_oerrors++;
        if_printf(ifp, "watchdog timeout\n");
 
@@ -1028,8 +971,6 @@ axe_watchdog(struct ifnet *ifp)
 
        if (!ifq_is_empty(&ifp->if_snd))
                axe_start(ifp);
-
-       crit_exit();
 }
 
 /*
@@ -1043,8 +984,6 @@ axe_stop(struct axe_softc *sc)
        struct ifnet            *ifp;
        int i;
 
-       crit_enter();
-
        ifp = &sc->arpcom.ac_if;
        ifp->if_timer = 0;
 
@@ -1129,8 +1068,6 @@ axe_stop(struct axe_softc *sc)
 
        ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
         sc->axe_link = 0;
-
-       crit_exit();
 }
 
 /*
index ae4e826..a319ab7 100644 (file)
@@ -29,7 +29,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bfe/if_bfe.c 1.4.4.7 2004/03/02 08:41:33 julian Exp  v
- * $DragonFly: src/sys/dev/netif/bfe/if_bfe.c,v 1.26 2005/11/22 00:24:19 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/bfe/if_bfe.c,v 1.27 2005/11/28 17:13:41 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -414,13 +414,14 @@ bfe_attach(device_t dev)
                goto fail;
        }
 
-       ether_ifattach(ifp, sc->arpcom.ac_enaddr);
+       ether_ifattach(ifp, sc->arpcom.ac_enaddr, NULL);
 
        /*
         * Hook interrupt last to avoid having to lock softc
         */
-       error = bus_setup_intr(dev, sc->bfe_irq, 0,
-                              bfe_intr, sc, &sc->bfe_intrhand, NULL);
+       error = bus_setup_intr(dev, sc->bfe_irq, INTR_NETSAFE,
+                              bfe_intr, sc, &sc->bfe_intrhand, 
+                              sc->arpcom.ac_if.if_serializer);
 
        if (error) {
                ether_ifdetach(ifp);
@@ -439,7 +440,7 @@ bfe_detach(device_t dev)
        struct bfe_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (device_is_attached(dev)) {
                bfe_stop(sc);
@@ -453,8 +454,6 @@ bfe_detach(device_t dev)
        if (sc->bfe_intrhand != NULL)
                bus_teardown_intr(dev, sc->bfe_irq, sc->bfe_intrhand);
 
-       crit_exit();
-
        if (sc->bfe_irq != NULL)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->bfe_irq);
 
@@ -462,8 +461,8 @@ bfe_detach(device_t dev)
                bus_release_resource(dev, SYS_RES_MEMORY, BFE_PCI_MEMLO,
                                     sc->bfe_res);
        }
-
        bfe_dma_free(sc);
+       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
@@ -475,12 +474,11 @@ static void
 bfe_shutdown(device_t dev)
 {
        struct bfe_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
-
+       lwkt_serialize_enter(ifp->if_serializer);
        bfe_stop(sc); 
-
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 static int
@@ -655,15 +653,11 @@ bfe_clear_stats(struct bfe_softc *sc)
 {
        u_long reg;
 
-       crit_enter();
-
        CSR_WRITE_4(sc, BFE_MIB_CTRL, BFE_MIB_CLR_ON_READ);
        for (reg = BFE_TX_GOOD_O; reg <= BFE_TX_PAUSE; reg += 4)
                CSR_READ_4(sc, reg);
        for (reg = BFE_RX_GOOD_O; reg <= BFE_RX_NPAUSE; reg += 4)
                CSR_READ_4(sc, reg);
-
-       crit_exit();
 }
 
 static int 
@@ -671,27 +665,20 @@ bfe_resetphy(struct bfe_softc *sc)
 {
        uint32_t val;
 
-       crit_enter();
-
        bfe_writephy(sc, 0, BMCR_RESET);
        DELAY(100);
        bfe_readphy(sc, 0, &val);
        if (val & BMCR_RESET) {
-               crit_exit();
                if_printf(&sc->arpcom.ac_if,
                          "PHY Reset would not complete.\n");
                return(ENXIO);
        }
-
-       crit_exit();
        return(0);
 }
 
 static void
 bfe_chip_halt(struct bfe_softc *sc)
 {
-       crit_enter();
-
        /* disable interrupts - not that it actually does..*/
        CSR_WRITE_4(sc, BFE_IMASK, 0);
        CSR_READ_4(sc, BFE_IMASK);
@@ -702,8 +689,6 @@ bfe_chip_halt(struct bfe_softc *sc)
        CSR_WRITE_4(sc, BFE_DMARX_CTRL, 0);
        CSR_WRITE_4(sc, BFE_DMATX_CTRL, 0);
        DELAY(10);
-
-       crit_exit();
 }
 
 static void
@@ -711,8 +696,6 @@ bfe_chip_reset(struct bfe_softc *sc)
 {
        uint32_t val;    
 
-       crit_enter();
-
        /* Set the interrupt vector for the enet core */
        bfe_pci_setup(sc, BFE_INTVEC_ENET0);
 
@@ -787,8 +770,6 @@ bfe_chip_reset(struct bfe_softc *sc)
 
        bfe_resetphy(sc);
        bfe_setupphy(sc);
-
-       crit_exit();
 }
 
 static void
@@ -1009,8 +990,6 @@ bfe_readphy(struct bfe_softc *sc, uint32_t reg, uint32_t *val)
 {
        int err; 
 
-       crit_enter();
-
        /* Clear MII ISR */
        CSR_WRITE_4(sc, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII);
        CSR_WRITE_4(sc, BFE_MDIO_DATA, (BFE_MDIO_SB_START |
@@ -1020,8 +999,6 @@ bfe_readphy(struct bfe_softc *sc, uint32_t reg, uint32_t *val)
                                (BFE_MDIO_TA_VALID << BFE_MDIO_TA_SHIFT)));
        err = bfe_wait_bit(sc, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII, 100, 0);
        *val = CSR_READ_4(sc, BFE_MDIO_DATA) & BFE_MDIO_DATA_DATA;
-
-       crit_exit();
        return(err);
 }
 
@@ -1030,8 +1007,6 @@ bfe_writephy(struct bfe_softc *sc, uint32_t reg, uint32_t val)
 {
        int status;
 
-       crit_enter();
-
        CSR_WRITE_4(sc, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII);
        CSR_WRITE_4(sc, BFE_MDIO_DATA, (BFE_MDIO_SB_START |
                                (BFE_MDIO_OP_WRITE << BFE_MDIO_OP_SHIFT) |
@@ -1041,8 +1016,6 @@ bfe_writephy(struct bfe_softc *sc, uint32_t reg, uint32_t val)
                                (val & BFE_MDIO_DATA_DATA)));
        status = bfe_wait_bit(sc, BFE_EMAC_ISTAT, BFE_EMAC_INT_MII, 100, 0);
 
-       crit_exit();
-
        return status;
 }
 
@@ -1055,8 +1028,6 @@ bfe_setupphy(struct bfe_softc *sc)
 {
        uint32_t val;
        
-       crit_enter();
-
        /* Enable activity LED */
        bfe_readphy(sc, 26, &val);
        bfe_writephy(sc, 26, val & 0x7fff); 
@@ -1066,7 +1037,6 @@ bfe_setupphy(struct bfe_softc *sc)
        bfe_readphy(sc, 27, &val);
        bfe_writephy(sc, 27, val | (1 << 6));
 
-       crit_exit();
        return(0);
 }
 
@@ -1090,8 +1060,6 @@ bfe_txeof(struct bfe_softc *sc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        uint32_t i, chipidx;
 
-       crit_enter();
-
        chipidx = CSR_READ_4(sc, BFE_DMATX_STAT) & BFE_STAT_CDMASK;
        chipidx /= sizeof(struct bfe_desc);
 
@@ -1118,8 +1086,6 @@ bfe_txeof(struct bfe_softc *sc)
                ifp->if_timer = 0;
        else
                ifp->if_timer = 5;
-
-       crit_exit();
 }
 
 /* Pass a received packet up the stack */
@@ -1132,8 +1098,6 @@ bfe_rxeof(struct bfe_softc *sc)
        struct bfe_data *r;
        uint32_t cons, status, current, len, flags;
 
-       crit_enter();
-
        cons = sc->bfe_rx_cons;
        status = CSR_READ_4(sc, BFE_DMARX_STAT);
        current = (status & BFE_STAT_CDMASK) / sizeof(struct bfe_desc);
@@ -1175,12 +1139,10 @@ bfe_rxeof(struct bfe_softc *sc)
                ifp->if_ipackets++;
                m->m_pkthdr.rcvif = ifp;
 
-               (*ifp->if_input)(ifp, m);
+               ifp->if_input(ifp, m);
                BFE_INC(cons, BFE_RX_LIST_CNT);
        }
        sc->bfe_rx_cons = cons;
-
-       crit_exit();
 }
 
 static void
@@ -1190,8 +1152,6 @@ bfe_intr(void *xsc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        uint32_t istat, imask, flag;
 
-       crit_enter();
-
        istat = CSR_READ_4(sc, BFE_ISTAT);
        imask = CSR_READ_4(sc, BFE_IMASK);
 
@@ -1206,7 +1166,6 @@ bfe_intr(void *xsc)
 
        /* not expecting this interrupt, disregard it */
        if (istat == 0) {
-               crit_exit();
                return;
        }
 
@@ -1234,8 +1193,6 @@ bfe_intr(void *xsc)
        /* We have packets pending, fire them out */ 
        if ((ifp->if_flags & IFF_RUNNING) && !ifq_is_empty(&ifp->if_snd))
                bfe_start(ifp);
-
-       crit_exit();
 }
 
 static int
@@ -1311,21 +1268,15 @@ bfe_start(struct ifnet *ifp)
        struct mbuf *m_head = NULL;
        int idx, need_trans;
 
-       crit_enter();
-
        /* 
         * Not much point trying to send if the link is down
         * or we have nothing to send.
         */
-       if (!sc->bfe_link) {
-               crit_exit();
+       if (!sc->bfe_link)
                return;
-       }
 
-       if (ifp->if_flags & IFF_OACTIVE) {
-               crit_exit();
+       if (ifp->if_flags & IFF_OACTIVE)
                return;
-       }
 
        idx = sc->bfe_tx_prod;
 
@@ -1353,10 +1304,8 @@ bfe_start(struct ifnet *ifp)
                BPF_MTAP(ifp, m_head);
        }
 
-       if (!need_trans) {
-               crit_exit();
+       if (!need_trans)
                return;
-       }
 
        sc->bfe_tx_prod = idx;
        /* Transmit - twice due to apparent hardware bug */
@@ -1367,8 +1316,6 @@ bfe_start(struct ifnet *ifp)
         * Set a timeout in case the chip goes out to lunch.
         */
        ifp->if_timer = 5;
-
-       crit_exit();
 }
 
 static void
@@ -1377,12 +1324,8 @@ bfe_init(void *xsc)
        struct bfe_softc *sc = (struct bfe_softc*)xsc;
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
-
-       if (ifp->if_flags & IFF_RUNNING) {
-               crit_exit();
+       if (ifp->if_flags & IFF_RUNNING)
                return;
-       }
 
        bfe_stop(sc);
        bfe_chip_reset(sc);
@@ -1391,7 +1334,6 @@ bfe_init(void *xsc)
                if_printf(ifp, "bfe_init failed. "
                          " Not enough memory for list buffers\n");
                bfe_stop(sc);
-               crit_exit();
                return;
        }
 
@@ -1407,7 +1349,6 @@ bfe_init(void *xsc)
        ifp->if_flags &= ~IFF_OACTIVE;
 
        callout_reset(&sc->bfe_stat_timer, hz, bfe_tick, sc);
-       crit_exit();
 }
 
 /*
@@ -1419,8 +1360,6 @@ bfe_ifmedia_upd(struct ifnet *ifp)
        struct bfe_softc *sc = ifp->if_softc;
        struct mii_data *mii;
 
-       crit_enter();
-
        mii = device_get_softc(sc->bfe_miibus);
        sc->bfe_link = 0;
        if (mii->mii_instance) {
@@ -1431,7 +1370,6 @@ bfe_ifmedia_upd(struct ifnet *ifp)
        }
        mii_mediachg(mii);
 
-       crit_exit();
        return(0);
 }
 
@@ -1444,14 +1382,10 @@ bfe_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
        struct bfe_softc *sc = ifp->if_softc;
        struct mii_data *mii;
 
-       crit_enter();
-
        mii = device_get_softc(sc->bfe_miibus);
        mii_pollstat(mii);
        ifmr->ifm_active = mii->mii_media_active;
        ifmr->ifm_status = mii->mii_media_status;
-
-       crit_exit();
 }
 
 static int
@@ -1462,8 +1396,6 @@ bfe_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        struct mii_data *mii;
        int error = 0;
 
-       crit_enter();
-
        switch (command) {
                case SIOCSIFFLAGS:
                        if (ifp->if_flags & IFF_UP)
@@ -1489,9 +1421,6 @@ bfe_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                        error = ether_ioctl(ifp, command, data);
                        break;
        }
-
-       crit_exit();
-
        return error;
 }
 
@@ -1502,14 +1431,10 @@ bfe_watchdog(struct ifnet *ifp)
 
        if_printf(ifp, "watchdog timeout -- resetting\n");
 
-       crit_enter();
-
        ifp->if_flags &= ~IFF_RUNNING;
        bfe_init(sc);
 
        ifp->if_oerrors++;
-
-       crit_exit();
 }
 
 static void
@@ -1517,28 +1442,25 @@ bfe_tick(void *xsc)
 {
        struct bfe_softc *sc = xsc;
        struct mii_data *mii;
-
-       crit_enter();
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
        mii = device_get_softc(sc->bfe_miibus);
 
+       lwkt_serialize_enter(ifp->if_serializer);
+
        bfe_stats_update(sc);
        callout_reset(&sc->bfe_stat_timer, hz, bfe_tick, sc);
 
-       if (sc->bfe_link) {
-               crit_exit();
-               return;
+       if (sc->bfe_link == NULL) {
+               mii_tick(mii);
+               if (!sc->bfe_link && mii->mii_media_status & IFM_ACTIVE &&
+                   IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE)  {
+                       sc->bfe_link++;
+               }
+               if (!sc->bfe_link)
+                       sc->bfe_link++;
        }
-
-       mii_tick(mii);
-       if (!sc->bfe_link && mii->mii_media_status & IFM_ACTIVE &&
-                       IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) 
-               sc->bfe_link++;
-
-       if (!sc->bfe_link)
-               sc->bfe_link++;
-
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 /*
@@ -1550,8 +1472,6 @@ bfe_stop(struct bfe_softc *sc)
 {
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
-
        callout_stop(&sc->bfe_stat_timer);
 
        bfe_chip_halt(sc);
@@ -1559,6 +1479,5 @@ bfe_stop(struct bfe_softc *sc)
        bfe_rx_ring_free(sc);
 
        ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
-
-       crit_exit();
 }
+
index c327c04..fcc29da 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/bge/if_bge.c,v 1.3.2.29 2003/12/01 21:06:59 ambrisko Exp $
- * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.49 2005/11/22 00:24:20 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/bge/if_bge.c,v 1.50 2005/11/28 17:13:41 dillon Exp $
  *
  */
 
@@ -200,6 +200,7 @@ static void bge_txeof(struct bge_softc *);
 static void    bge_rxeof(struct bge_softc *);
 
 static void    bge_tick(void *);
+static void    bge_tick_serialized(void *);
 static void    bge_stats_update(struct bge_softc *);
 static void    bge_stats_update_regs(struct bge_softc *);
 static int     bge_encap(struct bge_softc *, struct mbuf *, uint32_t *);
@@ -1718,10 +1719,11 @@ bge_attach(device_t dev)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, ether_addr);
+       ether_ifattach(ifp, ether_addr, NULL);
 
-       error = bus_setup_intr(dev, sc->bge_irq, 0,
-                              bge_intr, sc, &sc->bge_intrhand, NULL);
+       error = bus_setup_intr(dev, sc->bge_irq, INTR_NETSAFE,
+                              bge_intr, sc, &sc->bge_intrhand, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                device_printf(dev, "couldn't set up irq\n");
@@ -1742,7 +1744,7 @@ bge_detach(device_t dev)
        struct bge_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (device_is_attached(dev)) {
                ether_ifdetach(ifp);
@@ -1758,12 +1760,12 @@ bge_detach(device_t dev)
 
        bge_release_resources(sc);
 
-       crit_exit();
-
        if (sc->bge_asicrev != BGE_ASICREV_BCM5705 &&
            sc->bge_asicrev != BGE_ASICREV_BCM5750)
                bge_free_jumbo_mem(sc);
 
+       lwkt_serialize_exit(ifp->if_serializer);
+
        return(0);
 }
 
@@ -2030,10 +2032,9 @@ bge_rxeof(struct bge_softc *sc)
                if (have_tag) {
                        VLAN_INPUT_TAG(m, vlan_tag);
                        have_tag = vlan_tag = 0;
-                       continue;
+               } else {
+                       ifp->if_input(ifp, m);
                }
-
-               (*ifp->if_input)(ifp, m);
        }
 
        CSR_WRITE_4(sc, BGE_MBX_RX_CONS0_LO, sc->bge_rx_saved_considx);
@@ -2112,7 +2113,7 @@ bge_intr(void *xsc)
                if (status & BGE_MACSTAT_MI_INTERRUPT) {
                        sc->bge_link = 0;
                        callout_stop(&sc->bge_stat_timer);
-                       bge_tick(sc);
+                       bge_tick_serialized(sc);
                        /* Clear the interrupt */
                        CSR_WRITE_4(sc, BGE_MAC_EVT_ENB,
                            BGE_EVTENB_MI_INTERRUPT);
@@ -2148,11 +2149,11 @@ bge_intr(void *xsc)
                            (!sc->bge_tbi && (mimode & BGE_MIMODE_AUTOPOLL))) {
                                sc->bge_link = 0;
                                callout_stop(&sc->bge_stat_timer);
-                               bge_tick(sc);
+                               bge_tick_serialized(sc);
                        }
                        sc->bge_link = 0;
                        callout_stop(&sc->bge_stat_timer);
-                       bge_tick(sc);
+                       bge_tick_serialized(sc);
                        /* Clear the interrupt */
                        CSR_WRITE_4(sc, BGE_MAC_STS, BGE_MACSTAT_SYNC_CHANGED|
                            BGE_MACSTAT_CFG_CHANGED|BGE_MACSTAT_MI_COMPLETE|
@@ -2182,14 +2183,23 @@ bge_intr(void *xsc)
 
 static void
 bge_tick(void *xsc)
+{
+       struct bge_softc *sc = xsc;
+       struct ifnet *ifp = &sc->arpcom.ac_if;
+
+       lwkt_serialize_enter(ifp->if_serializer);
+       bge_tick_serialized(xsc);
+       lwkt_serialize_exit(ifp->if_serializer);
+}
+
+static void
+bge_tick_serialized(void *xsc)
 {
        struct bge_softc *sc = xsc;
        struct ifnet *ifp = &sc->arpcom.ac_if;
        struct mii_data *mii = NULL;
        struct ifmedia *ifm = NULL;
 
-       crit_enter();
-
        if (sc->bge_asicrev == BGE_ASICREV_BCM5705 ||
            sc->bge_asicrev == BGE_ASICREV_BCM5750)
                bge_stats_update_regs(sc);
@@ -2199,7 +2209,6 @@ bge_tick(void *xsc)
        callout_reset(&sc->bge_stat_timer, hz, bge_tick, sc);
 
        if (sc->bge_link) {
-               crit_exit();
                return;
        }
 
@@ -2217,7 +2226,6 @@ bge_tick(void *xsc)
                        if (!ifq_is_empty(&ifp->if_snd))
                                (*ifp->if_start)(ifp);
                }
-               crit_exit();
                return;
        }
 
@@ -2236,8 +2244,6 @@ bge_tick(void *xsc)
                                (*ifp->if_start)(ifp);
                }
        }
-
-       crit_exit();
 }
 
 static void
@@ -2445,10 +2451,7 @@ bge_init(void *xsc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        uint16_t *m;
 
-       crit_enter();
-
        if (ifp->if_flags & IFF_RUNNING) {
-               crit_exit();
                return;
        }
 
@@ -2463,7 +2466,6 @@ bge_init(void *xsc)
         */
        if (bge_blockinit(sc)) {
                if_printf(ifp, "initialization failure\n");
-               crit_exit();
                return;
        }
 
@@ -2536,8 +2538,6 @@ bge_init(void *xsc)
        ifp->if_flags &= ~IFF_OACTIVE;
 
        callout_reset(&sc->bge_stat_timer, hz, bge_tick, sc);
-
-       crit_exit();
 }
 
 /*
@@ -2642,8 +2642,6 @@ bge_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        int mask, error = 0;
        struct mii_data *mii;
 
-       crit_enter();
-
        switch(command) {
        case SIOCSIFMTU:
                /* Disallow jumbo frames on 5705/5750. */
@@ -2719,9 +2717,6 @@ bge_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
-
        return(error);
 }
 
index 1e3b096..46c9bc7 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: if_bah_zbus.c,v 1.6 2000/01/23 21:06:12 aymeric Exp $ */
 /*     $FreeBSD: src/sys/dev/cm/if_cm_isa.c,v 1.1.2.1 2002/02/13 22:33:41 fjoe Exp $ */
-/*     $DragonFly: src/sys/dev/netif/cm/Attic/if_cm_isa.c,v 1.12 2005/10/12 17:35:51 dillon Exp $ */
+/*     $DragonFly: src/sys/dev/netif/cm/Attic/if_cm_isa.c,v 1.13 2005/11/28 17:13:41 dillon Exp $ */
 
 /*-
  * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -86,8 +86,9 @@ cm_isa_attach(dev)
        if (error)
                return error;
 
-       error = bus_setup_intr(dev, sc->irq_res, 0,
-                              cmintr, sc, &sc->irq_handle, NULL);
+       error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
+                              cmintr, sc, &sc->irq_handle,
+                              sc->sc_arccom.ac_if.if_serializer);
        if (error) {
                arc_ifdetach(&sc->sc_arccom.ac_if);
                cm_release_resources(dev);
@@ -102,15 +103,12 @@ cm_isa_detach(device_t dev)
 {
        struct cm_softc *sc = device_get_softc(dev);
 
-       crit_enter();
-
+       lwkt_serialize_enter(sc->sc_arccom.ac_if.if_serializer);
        cm_stop(sc);
        arc_ifdetach(&sc->sc_arccom.ac_if);
        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
-
-       crit_exit();
-
        cm_release_resources(dev);
+       lwkt_serialize_exit(sc->sc_arccom.ac_if.if_serializer);
 
        return (0);
 }
index c799696..97d47c5 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: smc90cx6.c,v 1.38 2001/07/07 15:57:53 thorpej Exp $ */
 /*     $FreeBSD: src/sys/dev/cm/smc90cx6.c,v 1.1.2.3 2003/02/05 18:42:14 fjoe Exp $ */
-/*     $DragonFly: src/sys/dev/netif/cm/Attic/smc90cx6.c,v 1.19 2005/09/01 12:59:38 sephe Exp $ */
+/*     $DragonFly: src/sys/dev/netif/cm/Attic/smc90cx6.c,v 1.20 2005/11/28 17:13:41 dillon Exp $ */
 
 /*-
  * Copyright (c) 1994, 1995, 1998 The NetBSD Foundation, Inc.
@@ -313,7 +313,7 @@ cm_attach(dev)
        ifp->if_timer = 0;
        ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX;
 
-       arc_ifattach(ifp, linkaddress);
+       arc_ifattach(ifp, linkaddress, NULL);
        return 0;
 }
 
@@ -329,11 +329,9 @@ cm_init(xsc)
        struct ifnet *ifp = &sc->sc_arccom.ac_if;
 
        if ((ifp->if_flags & IFF_RUNNING) == 0) {
-               crit_enter();
                ifp->if_flags |= IFF_RUNNING;
                cm_reset(sc);
                cm_start(ifp);
-               crit_exit();
        }
 }
 
@@ -461,23 +459,15 @@ cm_start(ifp)
        if_printf(ifp, "start(%p)\n", ifp);
 #endif
 
-       crit_enter();
-
-       if ((ifp->if_flags & IFF_RUNNING) == 0) {
-               crit_exit();
+       if ((ifp->if_flags & IFF_RUNNING) == 0)
                return;
-       }
 
-       if (sc->sc_tx_fillcount >= 2) {
-               crit_exit();
+       if (sc->sc_tx_fillcount >= 2)
                return;
-       }
 
        m = arc_frag_next(ifp);
        buffer = sc->sc_tx_act ^ 1;
 
-       crit_exit();
-
        if (m == 0)
                return;
 
@@ -543,7 +533,6 @@ cm_start(ifp)
        sc->sc_retransmits[buffer] = (m->m_flags & M_BCAST) ? 1 : 5;
 
        /* actually transmit the packet */
-       crit_enter();
 
        if (++sc->sc_tx_fillcount > 1) {
                /*
@@ -569,9 +558,6 @@ cm_start(ifp)
 
                sc->sc_arccom.ac_if.if_timer = ARCTIMEOUT;
        }
-
-       crit_exit();
-
        m_freem(m);
 
        /*
@@ -599,9 +585,7 @@ cm_srint(vsc)
        struct arc_header *ah;
        struct ifnet *ifp = &sc->sc_arccom.ac_if;
 
-       crit_enter();
        buffer = sc->sc_rx_act ^ 1;
-       crit_exit();
 
        /*
         * Align so that IP packet will be longword aligned. Here we
@@ -651,7 +635,7 @@ cm_srint(vsc)
            rman_get_bustag(sc->mem_res), rman_get_bushandle(sc->mem_res),
            cm_ram_ptr + offset, mtod(m, u_char *) + 2, len);
 
-       (*ifp->if_input)(ifp, m);
+       ifp->if_input(ifp, m);
 
        m = NULL;
        ifp->if_ipackets++;
@@ -664,8 +648,6 @@ cleanup:
        /* mark buffer as invalid by source id 0 */
        PUTMEM(buffer << 9, 0);
 
-       crit_enter();
-
        if (--sc->sc_rx_fillcount == 2 - 1) {
 
                /* was off, restart it on buffer just emptied */
@@ -680,7 +662,6 @@ cleanup:
                if_printf(ifp, "srint: restarted rx on buf %d\n", buffer);
 #endif
        }
-       crit_exit();
 }
 
 __inline static void
@@ -901,12 +882,14 @@ cm_reconwatch(arg)
        struct cm_softc *sc = arg;
        struct ifnet *ifp = &sc->sc_arccom.ac_if;
 
+       lwkt_serialize_enter(ifp->if_serializer);
        if (sc->sc_reconcount >= ARC_EXCESSIVE_RECONS) {
                sc->sc_reconcount = 0;
                log(LOG_WARNING, "%s: token valid again.\n",
                    ifp->if_xname);
        }
        sc->sc_reconcount = 0;
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 
@@ -927,8 +910,6 @@ cm_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        ifa = (struct ifaddr *)data;
        ifr = (struct ifreq *)data;
 
-       crit_enter();
-
 #if defined(CM_DEBUG) && (CM_DEBUG > 2)
        if_printf(ifp, "ioctl() called, cmd = 0x%lx\n", command);
 #endif
@@ -956,8 +937,6 @@ cm_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                error = arc_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
        return (error);
 }
 
index 3b25863..e4d50ed 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/cs/if_cs.c,v 1.19.2.1 2001/01/25 20:13:48 imp Exp $
- * $DragonFly: src/sys/dev/netif/cs/if_cs.c,v 1.22 2005/11/22 00:24:21 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/cs/if_cs.c,v 1.23 2005/11/28 17:13:41 dillon Exp $
  */
 
 /*
@@ -587,7 +587,7 @@ cs_attach(device_t dev)
 {
         struct cs_softc *sc = device_get_softc(dev);
         int media = 0, error;
-       struct ifnet *ifp = &(sc->arpcom.ac_if);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
        /*
         * Initialize the media structures.
@@ -671,10 +671,11 @@ cs_attach(device_t dev)
        ifmedia_set(&sc->media, media);
        cs_mediaset(sc, media);
 
-       ether_ifattach(ifp, sc->arpcom.ac_enaddr);
+       ether_ifattach(ifp, sc->arpcom.ac_enaddr, NULL);
 
-       error = bus_setup_intr(dev, sc->irq_res, 0,
-                              csintr, sc, &sc->irq_handle, NULL);
+       error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
+                              csintr, sc, &sc->irq_handle, 
+                              ifp->if_serializer);
        if (error) {
                device_printf(dev, "Couldn't set up irq");
                ether_ifdetach(ifp);
@@ -692,19 +693,17 @@ int
 cs_detach(device_t dev)
 {
        struct cs_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (device_is_attached(dev)) {
                cs_stop(sc);
                ether_ifdetach(&sc->arpcom.ac_if);
        }
-
        if (sc->irq_handle != NULL)
                bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
 
-       crit_exit();
-
 #if 0
        /*
         * this code still in progress (DMA support)
@@ -715,11 +714,10 @@ cs_detach(device_t dev)
 
        if (sc->buffer != NULL)
                free(sc->buffer, M_DEVBUF);
-
        cs_release_resources(dev);
-
        ifmedia_removeall(&sc->media);
 
+       lwkt_serialize_exit(ifp->if_serializer);
        return 0;
 }
 
@@ -733,8 +731,6 @@ cs_init(void *xsc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        int i, rx_cfg;
 
-       crit_enter();
-
        /*
         * reset whatchdog timer
         */
@@ -801,8 +797,6 @@ cs_init(void *xsc)
         * Start sending process
         */
        cs_start(ifp);
-
-       crit_exit();
 }
 
 /*
@@ -863,7 +857,7 @@ cs_get_packet(struct cs_softc *sc)
 
        if (status & (RX_IA | RX_BROADCAST) || 
            (ifp->if_flags & IFF_MULTICAST && status & RX_HASHED)) {
-               (*ifp->if_input)(ifp, m);
+               ifp->if_input(ifp, m);
 
                ifp->if_ipackets++;
 
@@ -984,8 +978,6 @@ cs_start(struct ifnet *ifp)
        struct mbuf *m, *mp;
        struct cs_softc *sc = ifp->if_softc;
 
-       crit_enter();
-
        for (;;) {
                if (sc->buf_len)
                        length = sc->buf_len;
@@ -993,7 +985,6 @@ cs_start(struct ifnet *ifp)
                        m = ifq_dequeue(&ifp->if_snd, NULL);
 
                        if (m==NULL) {
-                               crit_exit();
                                return;
                        }
 
@@ -1027,7 +1018,6 @@ cs_start(struct ifnet *ifp)
                if (!(cs_readreg(sc->nic_addr, PP_BusST) & READY_FOR_TX_NOW)) {
                        ifp->if_timer = sc->buf_len;
                        ifp->if_flags |= IFF_OACTIVE;
-                       crit_exit();
                        return;
                }
 
@@ -1040,7 +1030,6 @@ cs_start(struct ifnet *ifp)
                 */
                ifp->if_timer = length;
 
-               crit_exit();
                ifp->if_flags |= IFF_OACTIVE;
                return;
        }
@@ -1052,8 +1041,6 @@ cs_start(struct ifnet *ifp)
 static void
 cs_stop(struct cs_softc *sc)
 {
-       crit_enter();
-
        cs_writereg(sc->nic_addr, PP_RxCFG, 0);
        cs_writereg(sc->nic_addr, PP_TxCFG, 0);
        cs_writereg(sc->nic_addr, PP_BufCFG, 0);
@@ -1061,8 +1048,6 @@ cs_stop(struct cs_softc *sc)
 
        sc->arpcom.ac_if.if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
        sc->arpcom.ac_if.if_timer = 0;
-
-       crit_exit();
 }
 
 /*
@@ -1130,8 +1115,6 @@ cs_ioctl(register struct ifnet *ifp, u_long command, caddr_t data,
        if_printf(ifp, "ioctl(%lx)\n", command);
 #endif
 
-       crit_enter();
-
        switch (command) {
        case SIOCSIFFLAGS:
                /*
@@ -1177,8 +1160,6 @@ cs_ioctl(register struct ifnet *ifp, u_long command, caddr_t data,
                break;
         }
 
-       crit_exit();
-
        return error;
 }
 
index 52ce40f..b719704 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_cue.c,v 1.45 2003/12/08 07:54:14 obrien Exp $
- * $DragonFly: src/sys/dev/netif/cue/if_cue.c,v 1.23 2005/11/22 00:24:22 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/cue/if_cue.c,v 1.24 2005/11/28 17:13:41 dillon Exp $
  */
 
 /*
@@ -492,7 +492,7 @@ USB_ATTACH(cue)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
        usb_register_netisr();
        sc->cue_dying = 0;
 
index afbbf11..410c0c6 100644 (file)
@@ -17,7 +17,7 @@
  * Version 1.9, Wed Oct  4 18:58:15 MSK 1995
  *
  * $FreeBSD: src/sys/i386/isa/if_cx.c,v 1.32 1999/11/18 08:36:42 peter Exp $
- * $DragonFly: src/sys/dev/netif/cx/if_cx.c,v 1.18 2005/10/13 08:50:33 sephe Exp $
+ * $DragonFly: src/sys/dev/netif/cx/if_cx.c,v 1.19 2005/11/28 17:13:41 dillon Exp $
  *
  */
 #undef DEBUG
@@ -281,7 +281,7 @@ cxattach (struct isa_device *id)
                        c->ifp->if_watchdog = (watchdog_func_t) cxwatchdog;
                        /* Init routine is never called by upper level? */
                        sppp_attach (c->ifp);
-                       if_attach (c->ifp);
+                       if_attach (c->ifp, NULL);
                        sp = (struct sppp*) c->ifp;
                        /* If BPF is in the kernel, call the attach for it. */
                        bpfattach (c->ifp, DLT_PPP, PPP_HEADER_LEN);
index 4fcffdb..28cfa63 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_dc.c,v 1.9.2.45 2003/06/08 14:31:53 mux Exp $
- * $DragonFly: src/sys/dev/netif/dc/if_dc.c,v 1.46 2005/11/22 00:24:25 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/dc/if_dc.c,v 1.47 2005/11/28 17:13:41 dillon Exp $
  */
 
 /*
@@ -637,8 +637,6 @@ dc_mii_readreg(struct dc_softc *sc, struct dc_mii_frame *frame)
 {
        int ack, i;
 
-       crit_enter();
-
        /*
         * Set up frame for RX.
         */
@@ -692,8 +690,6 @@ fail:
        dc_mii_writebit(sc, 0);
        dc_mii_writebit(sc, 0);
 
-       crit_exit();
-
        if (ack)
                return(1);
        return(0);
@@ -705,8 +701,6 @@ fail:
 static int
 dc_mii_writereg(struct dc_softc *sc, struct dc_mii_frame *frame)
 {
-       crit_enter();
-
        /*
         * Set up frame for TX.
         */
@@ -731,8 +725,6 @@ dc_mii_writereg(struct dc_softc *sc, struct dc_mii_frame *frame)
        dc_mii_writebit(sc, 0);
        dc_mii_writebit(sc, 0);
 
-       crit_exit();
-
        return(0);
 }
 
@@ -2030,7 +2022,7 @@ dc_attach(device_t dev)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
 
        if (DC_IS_ADMTEK(sc)) {
                /*
@@ -2044,8 +2036,9 @@ dc_attach(device_t dev)
         */
        ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
 
-       error = bus_setup_intr(dev, sc->dc_irq, 0,
-                              dc_intr, sc, &sc->dc_intrhand, NULL);
+       error = bus_setup_intr(dev, sc->dc_irq, INTR_NETSAFE,
+                              dc_intr, sc, &sc->dc_intrhand, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                device_printf(dev, "couldn't set up irq\n");
@@ -2066,7 +2059,7 @@ dc_detach(device_t dev)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        struct dc_mediainfo *m;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (device_is_attached(dev)) {
                dc_stop(sc);
@@ -2080,8 +2073,6 @@ dc_detach(device_t dev)
        if (sc->dc_intrhand)
                bus_teardown_intr(dev, sc->dc_irq, sc->dc_intrhand);
 
-       crit_exit();
-
        if (sc->dc_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->dc_irq);
        if (sc->dc_res)
@@ -2101,6 +2092,7 @@ dc_detach(device_t dev)
        if (sc->dc_srom)
                free(sc->dc_srom, M_DEVBUF);
 
+       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
@@ -2460,7 +2452,7 @@ dc_rxeof(struct dc_softc *sc)
                }
 
                ifp->if_ipackets++;
-               (*ifp->if_input)(ifp, m);
+               ifp->if_input(ifp, m);
        }
 
        sc->dc_cdata.dc_rx_prod = i;
@@ -2580,7 +2572,7 @@ dc_tick(void *xsc)
        struct mii_data *mii;
        u_int32_t r;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        mii = device_get_softc(sc->dc_miibus);
 
@@ -2608,8 +2600,9 @@ dc_tick(void *xsc)
                                        sc->dc_link = 0;
                        }
                }
-       } else
+       } else {
                mii_tick(mii);
+       }
 
        /*
         * When the init routine completes, we expect to be able to send
@@ -2645,7 +2638,7 @@ dc_tick(void *xsc)
        else
                callout_reset(&sc->dc_stat_timer, hz, dc_tick, sc);
 
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 /*
@@ -3024,8 +3017,6 @@ dc_init(void *xsc)
        struct ifnet            *ifp = &sc->arpcom.ac_if;
        struct mii_data         *mii;
 
-       crit_enter();
-
        mii = device_get_softc(sc->dc_miibus);
 
        /*
@@ -3107,7 +3098,6 @@ dc_init(void *xsc)
                if_printf(ifp, "initialization failed: no "
                          "memory for rx buffers\n");
                dc_stop(sc);
-               crit_exit();
                return;
        }
 
@@ -3170,8 +3160,6 @@ dc_init(void *xsc)
        ifp->if_flags |= IFF_RUNNING;
        ifp->if_flags &= ~IFF_OACTIVE;
 
-       crit_exit();
-
        /* Don't start the ticker if this is a homePNA link. */
        if (IFM_SUBTYPE(mii->mii_media.ifm_media) == IFM_HPNA_1)
                sc->dc_link = 1;
@@ -3244,8 +3232,6 @@ dc_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        struct mii_data         *mii;
        int                     error = 0;
 
-       crit_enter();
-
        switch(command) {
        case SIOCSIFFLAGS:
                if (ifp->if_flags & IFF_UP) {
@@ -3280,8 +3266,6 @@ dc_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                break;
        }
 
-       crit_exit();
-
        return(error);
 }
 
@@ -3370,13 +3354,16 @@ dc_stop(struct dc_softc *sc)
 static void
 dc_shutdown(device_t dev)
 {
-       struct dc_softc         *sc;
+       struct dc_softc *sc;
+       struct ifnet *ifp;
 
        sc = device_get_softc(dev);
+       ifp = &sc->arpcom.ac_if;
+       lwkt_serialize_enter(ifp->if_serializer);
 
        dc_stop(sc);
 
-       return;
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 /*
@@ -3388,12 +3375,11 @@ static int
 dc_suspend(device_t dev)
 {
        struct dc_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
        int i;
-
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        dc_stop(sc);
-
        for (i = 0; i < 5; i++)
                sc->saved_maps[i] = pci_read_config(dev, PCIR_MAPS + i * 4, 4);
        sc->saved_biosaddr = pci_read_config(dev, PCIR_BIOS, 4);
@@ -3403,7 +3389,7 @@ dc_suspend(device_t dev)
 
        sc->suspended = 1;
 
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
        return (0);
 }
 
@@ -3419,8 +3405,7 @@ dc_resume(device_t dev)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        int i;
 
-       crit_enter();
-
+       lwkt_serialize_enter(ifp->if_serializer);
        dc_acpi(dev);
 
        /* better way to do this? */
@@ -3440,7 +3425,7 @@ dc_resume(device_t dev)
                 dc_init(sc);
 
        sc->suspended = 0;
+       lwkt_serialize_exit(ifp->if_serializer);
 
-       crit_exit();
        return (0);
 }
index 894fbf2..938225d 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.40 2005/10/12 17:35:51 dillon Exp $ */
+/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.41 2005/11/28 17:13:42 dillon Exp $ */
 
 /*-
  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
@@ -129,13 +129,11 @@ tulip_timeout_callback(void *arg)
 {
     tulip_softc_t *sc = arg;
 
-    crit_enter();
-
+    lwkt_serialize_enter(&sc->tulip_serializer);
     sc->tulip_flags &= ~TULIP_TIMEOUTPENDING;
     sc->tulip_probe_timeout -= 1000 / TULIP_HZ;
     (sc->tulip_boardsw->bd_media_poll)(sc, TULIP_MEDIAPOLL_TIMER);
-
-    crit_exit();
+    lwkt_serialize_exit(&sc->tulip_serializer);
 }
 
 static void
@@ -152,6 +150,7 @@ static int
 tulip_txprobe(tulip_softc_t *sc)
 {
     struct mbuf *m;
+
     /*
      * Before we are sure this is the right media we need
      * to send a small packet to make sure there's carrier.
@@ -3026,7 +3025,6 @@ tulip_rx_intr(tulip_softc_t *sc)
     int fillok = 1;
 
     for (;;) {
-       struct ether_header eh;
        tulip_desc_t *eop = ri->ri_nextin;
        int total_len = 0, last_offset = 0;
        struct mbuf *ms = NULL, *me = NULL;
@@ -3106,7 +3104,6 @@ tulip_rx_intr(tulip_softc_t *sc)
                )) {
            me->m_len = total_len - last_offset;
 
-           eh = *mtod(ms, struct ether_header *);
            sc->tulip_flags |= TULIP_RXACT;
            accept = 1;
        } else {
@@ -3163,9 +3160,7 @@ tulip_rx_intr(tulip_softc_t *sc)
                ) {
 #if !defined(TULIP_COPY_RXDATA)
                ms->m_pkthdr.len = total_len;
-               ms->m_pkthdr.rcvif = ifp;
-               m_adj(ms, sizeof(struct ether_header));
-               ether_input(ifp, &eh, ms);
+               ifp->if_input(ifp, ms);
 #else
 #ifdef BIG_PACKET
 #error BIG_PACKET is incompatible with TULIP_COPY_RXDATA
@@ -3174,8 +3169,7 @@ tulip_rx_intr(tulip_softc_t *sc)
                m_copydata(ms, 0, total_len, mtod(m0, caddr_t));
                m0->m_len = m0->m_pkthdr.len = total_len;
                m0->m_pkthdr.rcvif = ifp;
-               m_adj(m0, sizeof(struct ether_header));
-               ether_input(ifp, &eh, m0);
+               ifp->if_input(ifp, m0);
                m0 = ms;
 #endif /* ! TULIP_COPY_RXDATA */
            }
@@ -3723,8 +3717,6 @@ tulip_ifioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred * cr)
     struct ifreq *ifr = (struct ifreq *)data;
     int error = 0;
 
-    crit_enter();
-
     switch (cmd) {
        case SIOCSIFADDR: {
            ifp->if_flags |= IFF_UP;
@@ -3849,9 +3841,6 @@ tulip_ifioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred * cr)
            break;
        }
     }
-
-    crit_exit();
-
     return error;
 }
 
@@ -3951,7 +3940,7 @@ tulip_attach(tulip_softc_t *sc)
 
     tulip_reset(sc);
 
-    ether_ifattach(&(sc)->tulip_if, sc->tulip_enaddr);
+    ether_ifattach(&(sc)->tulip_if, sc->tulip_enaddr, NULL);
     ifp->if_snd.ifq_maxlen = ifqmaxlen;
 }
 
@@ -4041,10 +4030,13 @@ static int
 tulip_shutdown(device_t dev)
 {
     tulip_softc_t *sc = device_get_softc(dev);
+
+    lwkt_serialize_enter(&sc->tulip_serializer);
     TULIP_CSR_WRITE(sc, csr_busmode, TULIP_BUSMODE_SWRESET);
     DELAY(10); /* Wait 10 microseconds (actually 50 PCI cycles but at 
                   33MHz that comes to two microseconds but wait a
                   bit longer anyways) */
+    lwkt_serialize_exit(&sc->tulip_serializer);
     return 0;
 }
 
@@ -4098,6 +4090,7 @@ tulip_pci_attach(device_t dev)
     }
 
     sc = device_get_softc(dev);
+    lwkt_serialize_init(&sc->tulip_serializer);
     sc->tulip_dev = dev;
     sc->tulip_pci_busno = pci_get_bus(dev);
     sc->tulip_pci_devno = pci_get_slot(dev);
@@ -4163,6 +4156,7 @@ tulip_pci_attach(device_t dev)
                   33MHz that comes to two microseconds but wait a
                   bit longer anyways) */
 
+    lwkt_serialize_enter(&sc->tulip_serializer);
     if ((retval = tulip_read_macaddr(sc)) < 0) {
        device_printf(dev, "can't read ENET ROM (why=%d) (", retval);
        for (idx = 0; idx < 32; idx++)
@@ -4184,18 +4178,18 @@ tulip_pci_attach(device_t dev)
            rid = 0;
            res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid,
                                         RF_SHAREABLE | RF_ACTIVE);
-           if (res == 0 || bus_setup_intr(dev, res, 0,
-                                          intr_rtn, sc, &ih, NULL)) {
+           if (res == 0 || bus_setup_intr(dev, res, INTR_NETSAFE,
+                                          intr_rtn, sc, &ih,
+                                          &sc->tulip_serializer)) {
+               lwkt_serialize_exit(&sc->tulip_serializer);
                device_printf(dev, "couldn't map interrupt\n");
                free((caddr_t) sc->tulip_rxdescs, M_DEVBUF);
                free((caddr_t) sc->tulip_txdescs, M_DEVBUF);
                return ENXIO;
            }
        }
-
-       crit_enter();
        tulip_attach(sc);
-       crit_exit();
+       lwkt_serialize_exit(&sc->tulip_serializer);
     }
     return 0;
 }
index 9b4a514..b4b4dbc 100644 (file)
@@ -1,7 +1,7 @@
 /*     $NetBSD: if_devar.h,v 1.32 1999/04/01 14:55:25 tsubai Exp $     */
 
 /* $FreeBSD: src/sys/pci/if_devar.h,v 1.23.2.1 2000/08/04 23:25:10 peter Exp $ */
-/* $DragonFly: src/sys/dev/netif/de/if_devar.h,v 1.13 2005/05/11 20:58:35 joerg Exp $ */
+/* $DragonFly: src/sys/dev/netif/de/if_devar.h,v 1.14 2005/11/28 17:13:42 dillon Exp $ */
 
 /*-
  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
@@ -428,9 +428,11 @@ typedef struct {
  * come from??? No idea) for the tulip device.  
  */
 struct _tulip_softc_t {
-    struct ifmedia tulip_ifmedia;
-    struct callout tulip_timer, tulip_fast_timer;
     struct arpcom tulip_ac;
+    struct ifmedia tulip_ifmedia;
+    struct callout tulip_timer;
+    struct callout tulip_fast_timer;
+    struct lwkt_serialize tulip_serializer;
     bus_space_tag_t tulip_csrs_bst;
     bus_space_handle_t tulip_csrs_bsh;
     tulip_regfile_t tulip_csrs;
index 6a07319..55981ca 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed.c,v 1.224 2003/12/08 07:54:12 obrien Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed.c,v 1.27 2005/11/22 00:24:26 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed.c,v 1.28 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
@@ -1725,7 +1725,7 @@ ed_attach(device_t dev)
        /*
         * Attach the interface
         */
-       ether_ifattach(ifp, sc->arpcom.ac_enaddr);
+       ether_ifattach(ifp, sc->arpcom.ac_enaddr, NULL);
 
        /* device attach does transition from UNCONFIGURED to IDLE state */
 
@@ -1822,8 +1822,10 @@ ed_tick(void *arg)
 {
        struct ed_softc *sc = arg;
        struct mii_data *mii;
+       struct ifnet *ifp;
 
-       crit_enter();
+       ifp = &sc->arpcom.ac_if;
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (sc->gone) {
                crit_exit();
@@ -1836,8 +1838,7 @@ ed_tick(void *arg)
        }
 
        callout_reset(&sc->ed_timer, hz, ed_tick, sc);
-
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 #endif
 
@@ -2786,7 +2787,7 @@ ed_get_packet(struct ed_softc *sc, char *buf, u_short len)
 
        m->m_pkthdr.len = m->m_len = len;
 
-       (*ifp->if_input)(ifp, m);
+       ifp->if_input(ifp, m);
 }
 
 /*
index 329a14e..b3c9399 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_isa.c,v 1.15 2003/10/31 18:31:58 brooks Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_isa.c,v 1.12 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_isa.c,v 1.13 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -48,6 +48,7 @@
 
 static int ed_isa_probe                (device_t);
 static int ed_isa_attach       (device_t);
+static int ed_isa_detach       (device_t);
 
 static struct isa_pnp_id ed_ids[] = {
        { 0x1684a34d,   NULL },         /* SMC8416 */
@@ -129,20 +130,45 @@ ed_isa_attach(device_t dev)
 
        ed_alloc_irq(dev, sc->irq_rid, 0);
 
-       error = bus_setup_intr(dev, sc->irq_res, 0,
-                              edintr, sc, &sc->irq_handle, NULL);
-       if (error) {
+       error = ed_attach(dev);
+       if (error == 0) {
+               error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
+                                      edintr, sc, &sc->irq_handle,
+                                      sc->arpcom.ac_if.if_serializer);
+               if (error)
+                       ed_isa_detach(dev);
+       } else {
                ed_release_resources(dev);
-               return (error);
        }
+       return (error);
+}
 
-       return ed_attach(dev);
+static int
+ed_isa_detach(device_t dev)
+{
+        struct ed_softc *sc = device_get_softc(dev);
+        struct ifnet *ifp = &sc->arpcom.ac_if;
+
+        lwkt_serialize_enter(ifp->if_serializer);
+        if (sc->gone) {
+                device_printf(dev, "already unloaded\n");
+                return (0);
+        }
+        ed_stop(sc);
+        ifp->if_flags &= ~IFF_RUNNING;
+        ether_ifdetach(ifp);
+        sc->gone = 1;
+        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
+        ed_release_resources(dev);
+        lwkt_serialize_exit(ifp->if_serializer);
+        return (0);
 }
 
 static device_method_t ed_isa_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         ed_isa_probe),
        DEVMETHOD(device_attach,        ed_isa_attach),
+       DEVMETHOD(device_attach,        ed_isa_detach),
 
        { 0, 0 }
 };
index bc23bb9..04091dd 100644 (file)
@@ -25,7 +25,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_pccard.c,v 1.55 2003/12/31 04:25:00 kato Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_pccard.c,v 1.13 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_pccard.c,v 1.14 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include "opt_ed.h"
@@ -102,6 +102,7 @@ ed_pccard_detach(device_t dev)
        struct ed_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
+       lwkt_serialize_enter(ifp->if_serializer);
        if (sc->gone) {
                device_printf(dev, "already unloaded\n");
                return (0);
@@ -112,6 +113,7 @@ ed_pccard_detach(device_t dev)
        sc->gone = 1;
        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
        ed_release_resources(dev);
+       lwkt_serialize_exit(ifp->if_serializer);
        return (0);
 }
 
@@ -258,7 +260,7 @@ ed_pccard_attach(device_t dev)
                ed_alloc_memory(dev, sc->mem_rid, sc->mem_used);
        ed_alloc_irq(dev, sc->irq_rid, 0);
                
-       error = bus_setup_intr(dev, sc->irq_res, 0,
+       error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
                               edintr, sc, &sc->irq_handle, NULL);
        if (error) {
                printf("setup intr failed %d \n", error);
index 52f0124..8c0a5d6 100644 (file)
@@ -18,7 +18,7 @@
  *    are met.
  *
  * $FreeBSD: src/sys/dev/ed/if_ed_pci.c,v 1.34 2003/10/31 18:31:58 brooks Exp $
- * $DragonFly: src/sys/dev/netif/ed/if_ed_pci.c,v 1.9 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ed/if_ed_pci.c,v 1.10 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -42,6 +42,8 @@
 
 #include "if_edvar.h"
 
+static int ed_pci_detach(device_t dev);
+
 static struct _pcsid
 {
        u_int32_t       type;
@@ -95,22 +97,45 @@ ed_pci_attach(device_t dev)
                 return (error);
         }
 
-        error = bus_setup_intr(dev, sc->irq_res, 0,
-                               edintr, sc, &sc->irq_handle, NULL);
-        if (error) {
+       error = ed_attach(dev);
+       if (error == 0) {
+               error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
+                                      edintr, sc, &sc->irq_handle, 
+                                      sc->arpcom.ac_if.if_serializer);
+               if (error)
+                       ed_pci_detach(dev);
+       } else {
                 ed_release_resources(dev);
-                return (error);
-        }
+       }
+       return (error);
+}
 
-       error = ed_attach(dev);
+static int
+ed_pci_detach(device_t dev)
+{
+       struct ed_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       return (error);
+       lwkt_serialize_enter(ifp->if_serializer);
+       if (sc->gone) {
+               device_printf(dev, "already unloaded\n");
+               return (0);
+       }
+       ed_stop(sc);
+       ifp->if_flags &= ~IFF_RUNNING;
+       ether_ifdetach(ifp);
+       sc->gone = 1;
+       bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
+       ed_release_resources(dev);
+       lwkt_serialize_exit(ifp->if_serializer);
+       return (0);
 }
 
 static device_method_t ed_pci_methods[] = {
        /* Device interface */
        DEVMETHOD(device_probe,         ed_pci_probe),
        DEVMETHOD(device_attach,        ed_pci_attach),
+       DEVMETHOD(device_attach,        ed_pci_detach),
 
        { 0, 0 }
 };
index d203eff..a91fdec 100644 (file)
@@ -7,7 +7,7 @@
  * Questions, comments, bug reports and fixes to kimmel@cs.umass.edu.
  *
  * $FreeBSD: src/sys/i386/isa/if_el.c,v 1.47.2.2 2000/07/17 21:24:30 archie Exp $
- * $DragonFly: src/sys/dev/netif/el/if_el.c,v 1.19 2005/11/22 00:24:27 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/el/if_el.c,v 1.20 2005/11/28 17:13:42 dillon Exp $
  */
 /* Except of course for the portions of code lifted from other FreeBSD
  * drivers (mainly elread, elget and el_ioctl)
@@ -32,6 +32,7 @@
 #include <sys/syslog.h>
 #include <sys/linker_set.h>
 #include <sys/module.h>
+#include <sys/serialize.h>
 #include <sys/thread2.h>
 
 #include <net/ethernet.h>
@@ -85,6 +86,8 @@ struct isa_driver eldriver = {
        el_probe, el_attach, "el"
 };
 
+static struct lwkt_serialize el_serializer;
+
 /* Probe routine.  See if the card is there and at the right place. */
 static int
 el_probe(struct isa_device *idev)
@@ -94,6 +97,8 @@ el_probe(struct isa_device *idev)
        u_char station_addr[ETHER_ADDR_LEN];
        int i;
 
+       lwkt_serialize_init(&el_serializer);
+
        /* Grab some info for our structure */
        sc = &el_softc[idev->id_unit];
        sc->el_base = idev->id_iobase;
@@ -199,7 +204,7 @@ el_attach(struct isa_device *idev)
 
        /* Now we can attach the interface */
        dprintf(("Attaching interface...\n"));
-       ether_ifattach(ifp, sc->arpcom.ac_enaddr);
+       ether_ifattach(ifp, sc->arpcom.ac_enaddr, &el_serializer);
 
        dprintf(("el_attach() finished.\n"));
        return(1);
@@ -213,10 +218,8 @@ el_reset(xsc)
        struct el_softc *sc = xsc;
 
        dprintf(("elreset()\n"));
-       crit_enter();
        el_stop(sc);
        el_init(sc);
-       crit_exit();
 }
 
 static void el_stop(xsc)
@@ -236,7 +239,6 @@ el_init(xsc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        u_short base = sc->el_base;
 
-       crit_enter();
 
        /* First, reset the board. */
        dprintf(("Resetting board...\n"));
@@ -264,8 +266,6 @@ el_init(xsc)
 
        /* And start output. */
        el_start(ifp);
-
-       crit_exit();
 }
 
 /* Start output on interface.  Get datagrams from the queue and output
@@ -285,7 +285,6 @@ el_start(struct ifnet *ifp)
        base = sc->el_base;
 
        dprintf(("el_start()...\n"));
-       crit_enter();
 
        /* Don't do anything if output is active */
        if (ifp->if_flags & IFF_OACTIVE)
@@ -302,7 +301,6 @@ el_start(struct ifnet *ifp)
                /* If there's nothing to send, return. */
                if(m0 == NULL) {
                        sc->arpcom.ac_if.if_flags &= ~IFF_OACTIVE;
-                       crit_exit();
                        return;
                }
 
@@ -367,8 +365,6 @@ el_start(struct ifnet *ifp)
                 */
                (void)inb(base+EL_AS);
                outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));
-               crit_exit();
-               crit_enter();
        }
 }
 
@@ -403,19 +399,14 @@ el_xmit(struct el_softc *sc,int len)
 static __inline void
 elread(struct el_softc *sc,caddr_t buf,int len)
 {
-       struct ether_header *eh;
        struct mbuf *m;
 
-       eh = (struct ether_header *)buf;
-
        /*
         * Put packet into an mbuf chain
         */
        m = elget(buf,len,&sc->arpcom.ac_if);
-       if(m == 0)
-               return;
-
-       ether_input(&sc->arpcom.ac_if,eh,m);
+       if(m)
+               sc->arpcom.ac_if.if_input(&sc->arpcom.ac_if, m);
 }
 
 /* controller interrupt */
@@ -427,6 +418,8 @@ elintr(void *arg)
        int base;
        int stat, rxstat, len, done;
 
+       lwkt_serialize_enter(&el_serializer);
+
        /* Get things pointing properly */
        sc = &el_softc[unit];
        base = sc->el_base;
@@ -438,6 +431,7 @@ elintr(void *arg)
        if(stat & EL_AS_RXBUSY) {
                (void)inb(base+EL_RXC);
                outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));
+               lwkt_serialize_exit(&el_serializer);
                return;
        }
 
@@ -447,6 +441,7 @@ elintr(void *arg)
                if(rxstat & EL_RXS_STALE) {
                        (void)inb(base+EL_RXC);
                        outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));
+                       lwkt_serialize_exit(&el_serializer);
                        return;
                }
 
@@ -463,6 +458,7 @@ elintr(void *arg)
                        outb(base+EL_RBC,0);
                        (void)inb(base+EL_RXC);
                        outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));
+                       lwkt_serialize_exit(&el_serializer);
                        return;
                }
 
@@ -483,6 +479,7 @@ elintr(void *arg)
                        outb(base+EL_RBC,0);
                        (void)inb(base+EL_RXC);
                        outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));
+                       lwkt_serialize_exit(&el_serializer);
                        return;
                }
 
@@ -498,7 +495,6 @@ elintr(void *arg)
                dprintf(("%6D\n",sc->el_pktbuf,":"));
 
                /* Pass data up to upper levels */
-               len -= sizeof(struct ether_header);
                elread(sc,(caddr_t)(sc->el_pktbuf),len);
 
                /* Is there another packet? */
@@ -513,7 +509,7 @@ elintr(void *arg)
 
        (void)inb(base+EL_RXC);
        outb(base+EL_AC,(EL_AC_IRQE|EL_AC_RX));
-       return;
+       lwkt_serialize_exit(&el_serializer);
 }
 
 /*
@@ -531,14 +527,12 @@ elget(buf, totlen, ifp)
         caddr_t cp;
         char *epkt;
 
-        buf += sizeof(struct ether_header);
         cp = buf;
         epkt = cp + totlen;
 
         MGETHDR(m, MB_DONTWAIT, MT_DATA);
         if (m == 0)
                 return (0);
-        m->m_pkthdr.rcvif = ifp;
         m->m_pkthdr.len = totlen;
         m->m_len = MHLEN;
         top = 0;
@@ -590,8 +584,6 @@ el_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
 {
        int error = 0;
 
-       crit_enter();
-
        switch (command) {
        case SIOCSIFFLAGS:
                /*
@@ -614,9 +606,6 @@ el_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
-
        return (error);
 }
 
index 11eb935..e0670b9 100644 (file)
@@ -1,40 +1,97 @@
-/**************************************************************************
-
-Copyright (c) 2004 Joerg Sonnenberger <joerg@bec.de>.  All rights reserved.
-
-Copyright (c) 2001-2005, Intel Corporation
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are met:
-
- 1. Redistributions of source code must retain the above copyright notice,
-    this list of conditions and the following disclaimer.
-
- 2. Redistributions in binary form must reproduce the above copyright
-    notice, this list of conditions and the following disclaimer in the
-    documentation and/or other materials provided with the distribution.
-
- 3. Neither the name of the Intel Corporation nor the names of its
-    contributors may be used to endorse or promote products derived from
-    this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.
-
-***************************************************************************/
-
-/*$FreeBSD: src/sys/dev/em/if_em.c,v 1.2.2.15 2003/06/09 22:10:15 pdeuskar Exp $*/
-/*$DragonFly: src/sys/dev/netif/em/if_em.c,v 1.43 2005/11/22 00:24:28 dillon Exp $*/
+/*
+ *
+ * Copyright (c) 2004 Joerg Sonnenberger <joerg@bec.de>.  All rights reserved.
+ *
+ * Copyright (c) 2001-2005, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * 
+ *  1. Redistributions of source code must retain the above copyright notice,
+ *     this list of conditions and the following disclaimer.
+ * 
+ *  2. Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ * 
+ *  3. Neither the name of the Intel Corporation nor the names of its
+ *     contributors may be used to endorse or promote products derived from
+ *     this software without specific prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ *
+ * Copyright (c) 2005 The DragonFly Project.  All rights reserved.
+ * 
+ * This code is derived from software contributed to The DragonFly Project
+ * by Matthew Dillon <dillon@backplane.com>
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of The DragonFly Project nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific, prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * $DragonFly: src/sys/dev/netif/em/if_em.c,v 1.44 2005/11/28 17:13:42 dillon Exp $
+ * $FreeBSD$
+ */
+/*
+ * SERIALIZATION API RULES:
+ *
+ * - If the driver uses the same serializer for the interrupt as for the
+ *   ifnet, most of the serialization will be done automatically for the
+ *   driver.  
+ *
+ * - ifmedia entry points will be serialized by the ifmedia code using the
+ *   ifnet serializer.
+ *
+ * - if_* entry points except for if_input will be serialized by the IF
+ *   and protocol layers.
+ *
+ * - The device driver must be sure to serialize access from timeout code
+ *   installed by the device driver.
+ *
+ * - The device driver typically holds the serializer at the time it wishes
+ *   to call if_input.  If so, it should pass the serializer to if_input and
+ *   note that the serializer might be dropped temporarily by if_input 
+ *   (e.g. in case it has to bridge the packet to another interface).
+ *
+ *   NOTE!  Since callers into the device driver hold the ifnet serializer,
+ *   the device driver may be holding a serializer at the time it calls
+ *   if_input even if it is not serializer-aware.
+ */
 
 #include "opt_polling.h"
 
@@ -144,11 +201,9 @@ static int em_detach(device_t);
 static int     em_shutdown(device_t);
 static void    em_intr(void *);
 static void    em_start(struct ifnet *);
-static void    em_start_serialized(struct ifnet *);
 static int     em_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *);
 static void    em_watchdog(struct ifnet *);
 static void    em_init(void *);
-static void    em_init_serialized(void *);
 static void    em_stop(void *);
 static void    em_media_status(struct ifnet *, struct ifmediareq *);
 static int     em_media_change(struct ifnet *);
@@ -317,8 +372,6 @@ em_attach(device_t dev)
 
        adapter = device_get_softc(dev);
 
-       lwkt_serialize_init(&adapter->serializer);
-
        callout_init(&adapter->timer);
        callout_init(&adapter->tx_fifo_timer);
 
@@ -535,9 +588,10 @@ em_attach(device_t dev)
         else
                adapter->pcix_82544 = FALSE;
 
-       error = bus_setup_intr(dev, adapter->res_interrupt, 0,
+       error = bus_setup_intr(dev, adapter->res_interrupt, INTR_NETSAFE,
                           (void (*)(void *)) em_intr, adapter,
-                          &adapter->int_handler_tag, &adapter->serializer);
+                          &adapter->int_handler_tag,
+                          adapter->interface_data.ac_if.if_serializer);
        if (error) {
                device_printf(dev, "Error registering interrupt handler!\n");
                ether_ifdetach(&adapter->interface_data.ac_if);
@@ -565,11 +619,11 @@ fail:
 static int
 em_detach(device_t dev)
 {
-       struct adapter * adapter = device_get_softc(dev);
+       struct adapter *adapter = device_get_softc(dev);
 
        INIT_DEBUGOUT("em_detach: begin");
 
-       lwkt_serialize_enter(&adapter->serializer);
+       lwkt_serialize_enter(adapter->interface_data.ac_if.if_serializer);
        adapter->in_detach = 1;
 
        if (device_is_attached(dev)) {
@@ -612,7 +666,7 @@ em_detach(device_t dev)
        adapter->sysctl_tree = NULL;
        sysctl_ctx_free(&adapter->sysctl_ctx);
 
-       lwkt_serialize_exit(&adapter->serializer);
+       lwkt_serialize_exit(adapter->interface_data.ac_if.if_serializer);
        return(0);
 }
 
@@ -642,20 +696,12 @@ em_shutdown(device_t dev)
 
 static void
 em_start(struct ifnet *ifp)
-{
-       struct adapter *adapter = ifp->if_softc;
-
-       lwkt_serialize_enter(&adapter->serializer);
-       em_start_serialized(ifp);
-       lwkt_serialize_exit(&adapter->serializer);
-}
-
-static void
-em_start_serialized(struct ifnet *ifp)
 {
        struct mbuf *m_head;
        struct adapter *adapter = ifp->if_softc;
 
+       ASSERT_SERIALIZED(adapter->interface_data.ac_if.if_serializer);
+
        if (!adapter->link_active)
                return;
        while (!ifq_is_empty(&ifp->if_snd)) {
@@ -694,7 +740,7 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        struct ifreq *ifr = (struct ifreq *) data;
        struct adapter *adapter = ifp->if_softc;
 
-       lwkt_serialize_enter(&adapter->serializer);
+       ASSERT_SERIALIZED(adapter->interface_data.ac_if.if_serializer);
 
        if (adapter->in_detach)
                goto out;
@@ -703,9 +749,7 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        case SIOCSIFADDR:
        case SIOCGIFADDR:
                IOCTL_DEBUGOUT("ioctl rcv'd: SIOCxIFADDR (Get/Set Interface Addr)");
-               lwkt_serialize_exit(&adapter->serializer);
                ether_ioctl(ifp, command, data);
-               lwkt_serialize_enter(&adapter->serializer);
                break;
        case SIOCSIFMTU:
                IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFMTU (Set Interface MTU)");
@@ -729,14 +773,14 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                        ifp->if_mtu = ifr->ifr_mtu;
                        adapter->hw.max_frame_size = 
                        ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN;
-                       em_init_serialized(adapter);
+                       em_init(adapter);
                }
                break;
        case SIOCSIFFLAGS:
                IOCTL_DEBUGOUT("ioctl rcv'd: SIOCSIFFLAGS (Set Interface Flags)");
                if (ifp->if_flags & IFF_UP) {
                        if (!(ifp->if_flags & IFF_RUNNING))
-                               em_init_serialized(adapter);
+                               em_init(adapter);
                        em_disable_promisc(adapter);
                        em_set_promisc(adapter);
                } else {
@@ -769,7 +813,7 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                        else
                                ifp->if_capenable |= IFCAP_HWCSUM;
                        if (ifp->if_flags & IFF_RUNNING)
-                               em_init_serialized(adapter);
+                               em_init(adapter);
                }
                break;
        default:
@@ -778,7 +822,6 @@ em_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        }
 
 out:
-       lwkt_serialize_exit(&adapter->serializer);
        return(error);
 }
 
@@ -826,16 +869,6 @@ em_watchdog(struct ifnet *ifp)
 
 static void
 em_init(void *arg)
-{
-       struct adapter *adapter = arg;
-
-       lwkt_serialize_enter(&adapter->serializer);
-       em_init_serialized(arg);
-       lwkt_serialize_exit(&adapter->serializer);
-}
-
-static void
-em_init_serialized(void *arg)
 {
        struct adapter *adapter = arg;
        uint32_t pba;
@@ -942,7 +975,8 @@ em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
        struct adapter *adapter = ifp->if_softc;
        uint32_t reg_icr;
 
-       lwkt_serialize_enter(&adapter->serializer);
+       ASSERT_SERIALIZED(ifp->if_serializer);
+
        switch(cmd) {
        case POLL_REGISTER:
                em_disable_intr(adapter);
@@ -968,11 +1002,10 @@ em_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                }
                if (ifp->if_flags & IFF_RUNNING) {
                        if (!ifq_is_empty(&ifp->if_snd))
-                               em_start_serialized(ifp);
+                               em_start(ifp);
                }
                break;
        }
-       lwkt_serialize_exit(&adapter->serializer);
 }
 
 #endif /* DEVICE_POLLING */
@@ -991,6 +1024,8 @@ em_intr(void *arg)
 
        ifp = &adapter->interface_data.ac_if;  
 
+       ASSERT_SERIALIZED(ifp->if_serializer);
+
        reg_icr = E1000_READ_REG(&adapter->hw, ICR);
        if (!reg_icr)
                return;
@@ -1015,7 +1050,7 @@ em_intr(void *arg)
        }
 
        if ((ifp->if_flags & IFF_RUNNING) && !ifq_is_empty(&ifp->if_snd))
-               em_start_serialized(ifp);
+               em_start(ifp);
 }
 
 /*********************************************************************
@@ -1033,6 +1068,8 @@ em_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
 
        INIT_DEBUGOUT("em_media_status: begin");
 
+       ASSERT_SERIALIZED(ifp->if_serializer);
+
        em_check_for_link(&adapter->hw);
        if (E1000_READ_REG(&adapter->hw, STATUS) & E1000_STATUS_LU) {
                if (adapter->link_active == 0) {
@@ -1097,7 +1134,7 @@ em_media_change(struct ifnet *ifp)
        if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
                return(EINVAL);
 
-       lwkt_serialize_enter(&adapter->serializer);
+       ASSERT_SERIALIZED(ifp->if_serializer);
 
        switch (IFM_SUBTYPE(ifm->ifm_media)) {
        case IFM_AUTO:
@@ -1134,9 +1171,8 @@ em_media_change(struct ifnet *ifp)
         */
        adapter->hw.phy_reset_disable = FALSE;
 
-       em_init_serialized(adapter);
+       em_init(adapter);
 
-       lwkt_serialize_exit(&adapter->serializer);
        return(0);
 }
 
@@ -1338,9 +1374,9 @@ em_82547_move_tail(void *arg)
 {
        struct adapter *adapter = arg;
 
-       lwkt_serialize_enter(&adapter->serializer);
+       lwkt_serialize_enter(adapter->interface_data.ac_if.if_serializer);
        em_82547_move_tail_serialized(arg);
-       lwkt_serialize_exit(&adapter->serializer);
+       lwkt_serialize_exit(adapter->interface_data.ac_if.if_serializer);
 }
 
 static void
@@ -1557,7 +1593,7 @@ em_local_timer(void *arg)
        struct adapter *adapter = arg;
        ifp = &adapter->interface_data.ac_if;
 
-       lwkt_serialize_enter(&adapter->serializer);
+       lwkt_serialize_enter(ifp->if_serializer);
 
        em_check_for_link(&adapter->hw);
        em_print_link_status(adapter);
@@ -1568,7 +1604,7 @@ em_local_timer(void *arg)
 
        callout_reset(&adapter->timer, hz, em_local_timer, adapter);
 
-       lwkt_serialize_exit(&adapter->serializer);
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 static void
@@ -1772,7 +1808,7 @@ em_setup_interface(device_t dev, struct adapter *adapter)
 
        ifp->if_capenable = ifp->if_capabilities;
 
-       ether_ifattach(ifp, adapter->hw.mac_addr);
+       ether_ifattach(ifp, adapter->hw.mac_addr, NULL);
 
        /*
         * Tell the upper layer(s) we support long frames.
@@ -2646,9 +2682,7 @@ em_process_receive_interrupts(struct adapter *adapter, int count)
                                                       (current_desc->special & 
                                                        E1000_RXD_SPC_VLAN_MASK));
                                } else {
-                                       /* lwkt_serialize_exit() */
-                                       (*ifp->if_input)(ifp, adapter->fmp);
-                                       /* lwkt_serialize_enter() */
+                                       ifp->if_input(ifp, adapter->fmp);
                                }
                                adapter->fmp = NULL;
                                adapter->lmp = NULL;
@@ -2749,7 +2783,7 @@ em_enable_intr(struct adapter *adapter)
        struct ifnet *ifp = &adapter->interface_data.ac_if;
        
        if ((ifp->if_flags & IFF_POLLING) == 0) {
-               lwkt_serialize_handler_enable(&adapter->serializer);
+               lwkt_serialize_handler_enable(ifp->if_serializer);
                E1000_WRITE_REG(&adapter->hw, IMS, (IMS_ENABLE_MASK));
        }
 }
@@ -2772,7 +2806,7 @@ em_disable_intr(struct adapter *adapter)
                E1000_WRITE_REG(&adapter->hw, IMC, 0xffffffff);
        }
 
-       lwkt_serialize_handler_disable(&adapter->serializer);
+       lwkt_serialize_handler_disable(adapter->interface_data.ac_if.if_serializer);
 }
 
 static int
@@ -3137,7 +3171,7 @@ em_sysctl_int_delay(SYSCTL_HANDLER_ARGS)
        info->value = usecs;
        ticks = E1000_USECS_TO_TICKS(usecs);
 
-       lwkt_serialize_enter(&adapter->serializer);
+       lwkt_serialize_enter(adapter->interface_data.ac_if.if_serializer);
        regval = E1000_READ_OFFSET(&adapter->hw, info->offset);
        regval = (regval & ~0xffff) | (ticks & 0xffff);
        /* Handle a few special cases. */
@@ -3157,7 +3191,7 @@ em_sysctl_int_delay(SYSCTL_HANDLER_ARGS)
                break;
        }
        E1000_WRITE_OFFSET(&adapter->hw, info->offset, regval);
-       lwkt_serialize_exit(&adapter->serializer);
+       lwkt_serialize_exit(adapter->interface_data.ac_if.if_serializer);
        return(0);
 }
 
@@ -3194,15 +3228,15 @@ em_sysctl_int_throttle(SYSCTL_HANDLER_ARGS)
                 * recalculate sysctl value assignment to get exact frequency.
                 */
                throttle = 1000000000 / 256 / throttle;
-               lwkt_serialize_enter(&adapter->serializer);
+               lwkt_serialize_enter(adapter->interface_data.ac_if.if_serializer);
                em_int_throttle_ceil = 1000000000 / 256 / throttle;
                E1000_WRITE_REG(&adapter->hw, ITR, throttle);
-               lwkt_serialize_exit(&adapter->serializer);
+               lwkt_serialize_exit(adapter->interface_data.ac_if.if_serializer);
        } else {
-               lwkt_serialize_enter(&adapter->serializer);
+               lwkt_serialize_enter(adapter->interface_data.ac_if.if_serializer);
                em_int_throttle_ceil = 0;
                E1000_WRITE_REG(&adapter->hw, ITR, 0);
-               lwkt_serialize_exit(&adapter->serializer);
+               lwkt_serialize_exit(adapter->interface_data.ac_if.if_serializer);
        }
        device_printf(adapter->dev, "Interrupt moderation set to %d/sec\n", 
                        em_int_throttle_ceil);
index 6e20881..1a660f1 100644 (file)
@@ -32,7 +32,7 @@ POSSIBILITY OF SUCH DAMAGE.
 ***************************************************************************/
 
 /*$FreeBSD: src/sys/dev/em/if_em.h,v 1.1.2.13 2003/06/09 21:43:41 pdeuskar Exp $*/
-/*$DragonFly: src/sys/dev/netif/em/if_em.h,v 1.12 2005/11/08 12:48:18 sephe Exp $*/
+/*$DragonFly: src/sys/dev/netif/em/if_em.h,v 1.13 2005/11/28 17:13:42 dillon Exp $*/
 
 #ifndef _EM_H_DEFINED_
 #define _EM_H_DEFINED_
@@ -334,7 +334,6 @@ struct adapter {
        struct em_hw    hw;
 
        /* Operating-system-specific structures */
-       struct lwkt_serialize serializer;
        struct em_osdep osdep;
        struct device   *dev;
        struct resource *res_memory;
index b6b1cd3..722aaf1 100644 (file)
@@ -39,7 +39,7 @@
 
 /*
  * $FreeBSD: src/sys/dev/ep/if_ep.c,v 1.95.2.3 2002/03/06 07:26:35 imp Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep.c,v 1.21 2005/11/22 00:24:29 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep.c,v 1.22 2005/11/28 17:13:42 dillon Exp $
  *
  *  Promiscuous mode added and interrupt logic slightly changed
  *  to reduce the number of adapter failures. Transceiver select
@@ -316,7 +316,7 @@ ep_attach(sc)
                ep_ifmedia_upd(ifp);
        }
 
-       ether_ifattach(ifp, ether_addr);
+       ether_ifattach(ifp, ether_addr, NULL);
 
 #ifdef EP_LOCAL_STATS
        sc->rx_no_first = sc->rx_no_mbuf = sc->rx_bpf_disc =
@@ -748,7 +748,7 @@ read_again:
     top->m_pkthdr.rcvif = &sc->arpcom.ac_if;
     top->m_pkthdr.len = sc->cur_len;
 
-    (*ifp->if_input)(ifp, top);
+    ifp->if_input(ifp, top);
     sc->top = 0;
     while (inw(BASE + EP_STATUS) & S_COMMAND_IN_PROGRESS);
     outw(BASE + EP_COMMAND, SET_RX_EARLY_THRESH | RX_INIT_EARLY_THRESH);
index 1facc46..4d25960 100644 (file)
@@ -20,7 +20,7 @@
  *    are met.
  *
  * $FreeBSD: src/sys/dev/ep/if_ep_eisa.c,v 1.18 2000/01/14 07:14:00 peter Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep_eisa.c,v 1.10 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep_eisa.c,v 1.11 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -231,8 +231,10 @@ ep_eisa_attach(device_t dev)
                goto bad;
        }
 
-       if ((error = bus_setup_intr(dev, sc->irq, 0, ep_intr,
-                                  sc, &sc->ep_intrhand, NULL))) {
+       error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE,
+                              ep_intr, sc, &sc->ep_intrhand, 
+                              sc->arpcom.ac_if.if_serializer);
+       if (error) {
                device_printf(dev, "bus_setup_intr() failed! (%d)\n", error);
                goto bad;
        }
index efad310..040ec9b 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ep/if_ep_isa.c,v 1.8.2.1 2000/12/16 03:47:57 nyan Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep_isa.c,v 1.9 2005/10/30 04:41:15 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep_isa.c,v 1.10 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -327,8 +327,10 @@ ep_isa_attach (device_t dev)
                goto bad;
        }
 
-       if ((error = bus_setup_intr(dev, sc->irq, 0, ep_intr,
-                                  sc, &sc->ep_intrhand, NULL))) {
+       error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE, ep_intr,
+                              sc, &sc->ep_intrhand, 
+                              sc->arpcom.ac_if.if_serializer);
+       if (error) {
                device_printf(dev, "bus_setup_intr() failed! (%d)\n", error);
                goto bad;
        }
index a8ac23d..79121b6 100644 (file)
@@ -28,7 +28,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ep/if_ep_pccard.c,v 1.12.2.2 2000/08/08 23:55:02 peter Exp $
- * $DragonFly: src/sys/dev/netif/ep/if_ep_pccard.c,v 1.8 2005/10/12 17:35:51 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ep/if_ep_pccard.c,v 1.9 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
@@ -212,8 +212,10 @@ ep_pccard_attach(device_t dev)
                goto bad;
        }
 
-       if ((error = bus_setup_intr(dev, sc->irq, 0, ep_intr,
-                                   sc, &sc->ep_intrhand, NULL))) {
+       error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE, ep_intr,
+                                   sc, &sc->ep_intrhand, 
+                                   sc->arpcom.ac_if.if_serializer);
+       if (error) {
                device_printf(dev, "bus_setup_intr() failed! (%d)\n", error);
                goto bad;
        }
index bc2b348..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.20 2005/11/22 00:24:30 dillon 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>
@@ -49,6 +49,7 @@
 
 #include <sys/module.h>
 #include <sys/bus.h>
+#include <sys/serialize.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -268,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);
 }
@@ -284,8 +285,6 @@ ex_init(void *xsc)
 
        DODEBUG(Start_End, printf("ex_init%d: start\n", ifp->if_dunit););
 
-       crit_enter();
-
        ifp->if_timer = 0;
 
        /*
@@ -358,8 +357,6 @@ ex_init(void *xsc)
 
        ex_start(ifp);
 
-       crit_exit();
-
        DODEBUG(Start_End, printf("ex_init%d: finish\n", ifp->if_dunit););
 }
 
@@ -376,8 +373,6 @@ ex_start(struct ifnet *ifp)
 
        DODEBUG(Start_End, printf("ex_start%d: start\n", unit););
 
-       crit_enter();
-
        /*
         * Main loop: send outgoing packets to network card until there are no
         * more packets left, or the card cannot accept any more yet.
@@ -536,9 +531,6 @@ ex_start(struct ifnet *ifp)
                        DODEBUG(Status, printf("OACTIVE start\n"););
                }
        }
-
-       crit_exit();
-
        DODEBUG(Start_End, printf("ex_start%d: finish\n", unit););
 }
 
@@ -742,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 {
@@ -772,8 +764,6 @@ ex_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
 
        DODEBUG(Start_End, printf("ex_ioctl%d: start ", ifp->if_dunit););
 
-       crit_enter();
-
        switch(cmd) {
                case SIOCSIFFLAGS:
                        DODEBUG(Start_End, printf("SIOCSIFFLAGS"););
@@ -810,8 +800,6 @@ ex_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
                        break;
        }
 
-       crit_exit();
-
        DODEBUG(Start_End, printf("\nex_ioctl%d: finish\n", ifp->if_dunit););
 
        return(error);
@@ -822,14 +810,10 @@ static void
 ex_reset(struct ex_softc *sc)
 {
        DODEBUG(Start_End, printf("ex_reset%d: start\n", unit););
-  
-       crit_enter();
 
        ex_stop(sc);
        ex_init(sc);
 
-       crit_exit();
-
        DODEBUG(Start_End, printf("ex_reset%d: finish\n", unit););
 }
 
index 86fc2f8..130ad9d 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/ex/if_ex_isa.c,v 1.3.2.1 2001/03/05 05:33:20 imp Exp $
- *     $DragonFly: src/sys/dev/netif/ex/if_ex_isa.c,v 1.10 2005/10/30 04:41:15 dillon Exp $
+ *     $DragonFly: src/sys/dev/netif/ex/if_ex_isa.c,v 1.11 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -34,6 +34,7 @@
 
 #include <sys/module.h>
 #include <sys/bus.h>
+#include <sys/serialize.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -312,9 +313,9 @@ ex_isa_attach(device_t dev)
                goto bad;
        }
 
-       error = bus_setup_intr(dev, sc->irq, 0,
-                               ex_intr, (void *)sc,
-                               &sc->ih, NULL);
+       error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE,
+                               ex_intr, (void *)sc, &sc->ih, 
+                               sc->arpcom.ac_if.if_serializer);
        if (error) {
                device_printf(dev, "bus_setup_intr() failed!\n");
                goto bad;
index c8be613..563b022 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  *     $FreeBSD: src/sys/dev/ex/if_ex_pccard.c,v 1.2.2.1 2001/03/05 05:33:20 imp Exp $
- *     $DragonFly: src/sys/dev/netif/ex/if_ex_pccard.c,v 1.9 2005/10/12 17:35:51 dillon Exp $
+ *     $DragonFly: src/sys/dev/netif/ex/if_ex_pccard.c,v 1.10 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -34,6 +34,7 @@
 
 #include <sys/module.h>
 #include <sys/bus.h>
+#include <sys/serialize.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -162,8 +163,9 @@ ex_pccard_attach(device_t dev)
                goto bad;
        }
 
-       error = bus_setup_intr(dev, sc->irq, 0,
-                               ex_intr, (void *)sc, &sc->ih, NULL);
+       error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE,
+                               ex_intr, (void *)sc, &sc->ih, 
+                               sc->arpcom.ac_if.if_serializer);
        if (error) {
                device_printf(dev, "bus_setup_intr() failed!\n");
                goto bad;
@@ -181,9 +183,11 @@ ex_pccard_detach(device_t dev)
        struct ex_softc         *sc = device_get_softc(dev);
        struct ifnet            *ifp = &sc->arpcom.ac_if;
 
+       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
        ex_stop(sc);
        ifp->if_flags &= ~IFF_RUNNING;
        if_detach(ifp);
        ex_release_resources(dev);
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
        return (0);
 }
index 47f2605..7d1d59a 100644 (file)
@@ -22,7 +22,7 @@
 
 /*
  * $FreeBSD: src/sys/dev/fe/if_fe.c,v 1.65.2.1 2000/09/22 10:01:47 nyan Exp $
- * $DragonFly: src/sys/dev/netif/fe/if_fe.c,v 1.22 2005/11/22 00:24:31 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/fe/if_fe.c,v 1.23 2005/11/28 17:13:42 dillon Exp $
  *
  * Device driver for Fujitsu MB86960A/MB86965A based Ethernet cards.
  * Contributed by M. Sekiguchi. <seki@sysrap.cs.fujitsu.co.jp>
@@ -744,13 +744,6 @@ fe_attach (device_t dev)
        int flags = device_get_flags(dev);
        int b, error;
 
-       error = bus_setup_intr(dev, sc->irq_res, 0,
-                              fe_intr, sc, &sc->irq_handle, NULL);
-       if (error) {
-               fe_release_resource(dev);
-               return ENXIO;
-       }
-
        /*
         * Initialize ifnet structure
         */
@@ -819,8 +812,18 @@ fe_attach (device_t dev)
 #endif
 
        /* Attach and stop the interface. */
-       ether_ifattach(&sc->sc_if, sc->sc_enaddr);
+       ether_ifattach(&sc->sc_if, sc->sc_enaddr, NULL);
        fe_stop(sc);
+
+       error = bus_setup_intr(dev, sc->irq_res, INTR_NETSAFE,
+                              fe_intr, sc, &sc->irq_handle, 
+                              sc->sc_if.if_serializer);
+       if (error) {
+               if_detach(&sc->sc_if);
+               fe_release_resource(dev);
+               return ENXIO;
+       }
+
   
        /* Print additional info when attached.  */
        device_printf(dev, "type %s%s\n", sc->typestr,
@@ -943,8 +946,6 @@ fe_reset (struct fe_softc *sc)
 void
 fe_stop (struct fe_softc *sc)
 {
-       crit_enter();
-
        /* Disable interrupts.  */
        fe_outb(sc, FE_DLCR2, 0x00);
        fe_outb(sc, FE_DLCR3, 0x00);
@@ -976,8 +977,6 @@ fe_stop (struct fe_softc *sc)
        /* Call a device-specific hook.  */
        if (sc->stop)
                sc->stop(sc);
-
-       crit_exit();
 }
 
 /*
@@ -1007,8 +1006,6 @@ fe_init (void * xsc)
        struct fe_softc *sc = xsc;
 
        /* Start initializing 86960.  */
-       crit_enter();
-
        /* Call a hook before we start initializing the chip.  */
        if (sc->init)
                sc->init(sc);
@@ -1116,8 +1113,6 @@ fe_init (void * xsc)
            delay.  */
        fe_start(&sc->sc_if);
 #endif
-
-       crit_exit();
 }
 
 /*
@@ -1752,8 +1747,6 @@ fe_ioctl (struct ifnet * ifp, u_long command, caddr_t data, struct ucred *cr)
        struct ifreq *ifr = (struct ifreq *)data;
        int error = 0;
 
-       crit_enter();
-
        switch (command) {
          case SIOCSIFFLAGS:
                /*
@@ -1797,9 +1790,6 @@ fe_ioctl (struct ifnet * ifp, u_long command, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
-
        return (error);
 }
 
@@ -1885,7 +1875,7 @@ fe_get_packet (struct fe_softc * sc, u_short len)
        }
 
        /* Feed the packet to upper layer.  */
-       (*sc->sc_if.if_input)(&sc->sc_if, m);
+       sc->sc_if.if_input(&sc->sc_if, m);
        return 0;
 }
 
index b0d4a37..79f709e 100644 (file)
@@ -20,7 +20,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/fe/if_fe_pccard.c,v 1.2.2.1 2000/09/22 10:01:47 nyan Exp $
- * $DragonFly: src/sys/dev/netif/fe/if_fe_pccard.c,v 1.7 2004/03/14 15:36:50 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/fe/if_fe_pccard.c,v 1.8 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include "opt_fe.h"
@@ -186,10 +186,12 @@ fe_pccard_detach(device_t dev)
        struct fe_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
+       lwkt_serialize_enter(ifp->if_serializer);
        fe_stop(sc);
        ether_ifdetach(ifp);
        bus_teardown_intr(dev, sc->irq_res, sc->irq_handle);
        fe_release_resource(dev);
+       lwkt_serialize_exit(ifp->if_serializer);
 
        return 0;
 }
index d517872..65ffb7b 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/pdq/if_fea.c,v 1.19 2000/01/14 07:14:03 peter Exp $
- * $DragonFly: src/sys/dev/netif/fea/Attic/if_fea.c,v 1.9 2005/10/12 17:35:52 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/fea/Attic/if_fea.c,v 1.10 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
@@ -35,6 +35,7 @@
 #include <sys/systm.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
+#include <sys/serialize.h>
 
 #include <net/if.h>
 #include <net/if_arp.h>
@@ -217,12 +218,16 @@ pdq_eisa_attach (dev)
                goto bad;
        }
 
-       if (bus_setup_intr(dev, irq, 0, pdq_eisa_intr, dev, &ih, NULL)) {
+       pdq_ifattach(sc, NULL);
+
+       if (bus_setup_intr(dev, irq, INTR_NETSAFE,
+                          pdq_eisa_intr, dev, &ih, 
+                          sc->sc_if.if_serializer)
+        ) {
                goto bad;
        }
 
        bcopy((caddr_t) sc->sc_pdq->pdq_hwaddr.lanaddr_bytes, sc->sc_ac.ac_enaddr, 6);
-       pdq_ifattach(sc, NULL);
 
        return (0);
 
@@ -242,8 +247,10 @@ pdq_eisa_shutdown(dev)
        device_t        dev;
 {
        pdq_softc_t     *sc = device_get_softc(dev);
-
+       lwkt_serialize_enter(sc->sc_if.if_serializer);
        pdq_hwreset(sc->sc_pdq);
+       lwkt_serialize_exit(sc->sc_if.if_serializer);
 
        return (0);
 }
index 0a09ac9..b3dfa76 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/pdq/if_fpa.c,v 1.13 1999/08/28 00:50:50 peter Exp $
- * $DragonFly: src/sys/dev/netif/fpa/Attic/if_fpa.c,v 1.11 2005/11/02 08:33:15 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/fpa/Attic/if_fpa.c,v 1.12 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
@@ -37,6 +37,7 @@
 #if defined(__bsdi__) || defined(__NetBSD__)
 #include <sys/device.h>
 #endif
+#include <sys/serialize.h>
 
 #include <net/if.h>
 
@@ -111,7 +112,11 @@ static void
 pdq_pci_ifintr(
     void *arg)
 {
-    (void) pdq_interrupt(((pdq_softc_t *) arg)->sc_pdq);
+    pdq_softc_t *sc = arg;
+
+    lwkt_serialize_enter(sc->sc_if.if_serializer);
+    pdq_interrupt(sc->sc_pdq);
+    lwkt_serialize_exit(sc->sc_if.if_serializer);
 }
 #else
 static int
@@ -198,7 +203,9 @@ pdq_pci_shutdown(
     void *sc,
     int howto)
 {
+    lwkt_serialize_enter(sc->sc_if.if_serializer);
     pdq_hwreset(((pdq_softc_t *)sc)->sc_pdq);
+    lwkt_serialize_exit(sc->sc_if.if_serializer);
 }
 
 static u_long pdq_pci_count;
index 3a74322..103c660 100644 (file)
@@ -32,7 +32,7 @@
  * SUCH DAMAGE.
  * 
  * $FreeBSD: src/sys/dev/firewire/if_fwe.c,v 1.27 2004/01/08 14:58:09 simokawa Exp $
- * $DragonFly: src/sys/dev/netif/fwe/if_fwe.c,v 1.22 2005/11/22 00:24:32 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/fwe/if_fwe.c,v 1.23 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include "opt_inet.h"
@@ -199,7 +199,7 @@ fwe_attach(device_t dev)
        ifq_set_maxlen(&ifp->if_snd, TX_MAX_QUEUE);
        ifq_set_ready(&ifp->if_snd);
 
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
 
         /* Tell the upper layer(s) we support long frames. */
        ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
@@ -253,12 +253,10 @@ fwe_detach(device_t dev)
 {
        struct fwe_softc *fwe = device_get_softc(dev);
 
-       crit_enter();
-
+       lwkt_serialize_enter(fwe->fwe_if.if_serializer);
        fwe_stop(fwe);
        ether_ifdetach(&fwe->fwe_if);
-
-       crit_exit();
+       lwkt_serialize_exit(fwe->fwe_if.if_serializer);
        return 0;
 }
 
@@ -359,8 +357,6 @@ fwe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
        struct ifstat *ifs = NULL;
        int error = 0, len;
 
-       crit_enter();
-
        switch (cmd) {
        case SIOCSIFFLAGS:
                if (ifp->if_flags & IFF_UP) {
@@ -390,9 +386,6 @@ fwe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, cmd, data);
                break;
        }
-
-       crit_exit();
-
        return (error);
 }
 
@@ -404,6 +397,7 @@ fwe_output_callback(struct fw_xfer *xfer)
 
        fwe = (struct fwe_softc *)xfer->sc;
        ifp = &fwe->fwe_if;
+       lwkt_serialize_enter(ifp->if_serializer);
        /* XXX error check */
        FWEDEBUG(ifp, "resp = %d\n", xfer->resp);
        if (xfer->resp != 0)
@@ -412,15 +406,12 @@ fwe_output_callback(struct fw_xfer *xfer)
        m_freem(xfer->mbuf);
        fw_xfer_unload(xfer);
 
-       crit_enter();
-
        STAILQ_INSERT_TAIL(&fwe->xferlist, xfer, link);
 
-       crit_exit();
-
        /* for queue full */
        if (!ifq_is_empty(&ifp->if_snd))
                fwe_start(ifp);
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 static void
@@ -430,8 +421,6 @@ fwe_start(struct ifnet *ifp)
 
        FWEDEBUG(ifp, "starting\n");
 
-       crit_enter();
-
        if (fwe->dma_ch < 0) {
                FWEDEBUG(ifp, "not ready\n");
 
@@ -444,8 +433,6 @@ fwe_start(struct ifnet *ifp)
 
                ifp->if_flags &= ~IFF_OACTIVE;
        }
-
-       crit_exit();
 }
 
 #define HDR_LEN 4
@@ -515,6 +502,7 @@ fwe_as_input(struct fw_xferq *xferq)
 
        fwe = (struct fwe_softc *)xferq->sc;
        ifp = &fwe->fwe_if;
+       lwkt_serialize_enter(ifp->if_serializer);
        while ((sxfer = STAILQ_FIRST(&xferq->stvalid)) != NULL) {
                STAILQ_REMOVE_HEAD(&xferq->stvalid, link);
                fp = mtod(sxfer->mbuf, struct fw_pkt *);
@@ -558,11 +546,12 @@ fwe_as_input(struct fw_xferq *xferq)
                         c[20], c[21], c[22], c[23]
                 );
 #endif
-               (*ifp->if_input)(ifp, m);
+               ifp->if_input(ifp, m);
                ifp->if_ipackets ++;
        }
        if (STAILQ_FIRST(&xferq->stfree) != NULL)
                fwe->fd.fc->irx_enable(fwe->fd.fc, fwe->dma_ch);
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 
index 1e5b364..dd5568e 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/fxp/if_fxp.c,v 1.110.2.30 2003/06/12 16:47:05 mux Exp $
- * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.38 2005/11/22 00:24:32 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.39 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
@@ -658,7 +658,7 @@ fxp_attach(device_t dev)
        /*
         * Attach the interface.
         */
-       ether_ifattach(ifp, sc->arpcom.ac_enaddr);
+       ether_ifattach(ifp, sc->arpcom.ac_enaddr, NULL);
 
        /*
         * Tell the upper layer(s) we support long frames.
@@ -672,8 +672,9 @@ fxp_attach(device_t dev)
        ifq_set_maxlen(&ifp->if_snd, FXP_NTXCB - 1);
        ifq_set_ready(&ifp->if_snd);
 
-       error = bus_setup_intr(dev, sc->irq, 0,
-                              fxp_intr, sc, &sc->ih, NULL);
+       error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE,
+                              fxp_intr, sc, &sc->ih, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                if (sc->flags & FXP_FLAG_SERIAL_MEDIA)
@@ -732,7 +733,7 @@ fxp_detach(device_t dev)
        /* disable interrupts */
        CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTR_DISABLE);
 
-       crit_enter();
+       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
 
        /*
         * Stop DMA and drop transmit queue.
@@ -753,10 +754,9 @@ fxp_detach(device_t dev)
        if (sc->ih)
                bus_teardown_intr(dev, sc->irq, sc->ih);
 
-       crit_exit();
-
        /* Release our allocated resources. */
        fxp_release(dev);
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
 
        return (0);
 }
@@ -789,7 +789,7 @@ fxp_suspend(device_t dev)
        struct fxp_softc *sc = device_get_softc(dev);
        int i;
 
-       crit_enter();
+       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
 
        fxp_stop(sc);
        
@@ -802,7 +802,7 @@ fxp_suspend(device_t dev)
 
        sc->suspended = 1;
 
-       crit_exit();
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
        return (0);
 }
 
@@ -818,7 +818,7 @@ fxp_resume(device_t dev)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        int i;
 
-       crit_enter();
+       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
 
        fxp_powerstate_d0(dev);
 
@@ -843,7 +843,7 @@ fxp_resume(device_t dev)
 
        sc->suspended = 0;
 
-       crit_exit();
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
        return (0);
 }
 
@@ -1348,7 +1348,7 @@ fxp_intr_body(struct fxp_softc *sc, u_int8_t statack, int count)
                                continue;
                        }
                        m->m_pkthdr.len = m->m_len = total_len;
-                       (*ifp->if_input)(ifp, m);
+                       ifp->if_input(ifp, m);
                }
        }
        if (rnr) {
@@ -1380,6 +1380,8 @@ fxp_tick(void *xsc)
        struct fxp_cb_tx *txp;
        struct mbuf *m;
 
+       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
+
        ifp->if_opackets += sp->tx_good;
        ifp->if_collisions += sp->tx_total_collisions;
        if (sp->rx_good) {
@@ -1406,8 +1408,6 @@ fxp_tick(void *xsc)
                        tx_threshold += 64;
        }
 
-       crit_enter();
-
        /*
         * Release any xmit buffers that have completed DMA. This isn't
         * strictly necessary to do here, but it's advantagous for mbufs
@@ -1473,7 +1473,7 @@ fxp_tick(void *xsc)
         */
        callout_reset(&sc->fxp_stat_timer, hz, fxp_tick, sc);
 
-       crit_exit();
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
 }
 
 /*
@@ -1560,8 +1560,6 @@ fxp_init(void *xsc)
        struct fxp_cb_mcs *mcsp;
        int i, prm;
 
-       crit_enter();
-
        /*
         * Cancel any pending I/O
         */
@@ -1800,8 +1798,6 @@ fxp_init(void *xsc)
         * Start stats updater.
         */
        callout_reset(&sc->fxp_stat_timer, hz, fxp_tick, sc);
-
-       crit_exit();
 }
 
 static int
@@ -1968,8 +1964,6 @@ fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        struct mii_data *mii;
        int error = 0;
 
-       crit_enter();
-
        switch (command) {
 
        case SIOCSIFFLAGS:
@@ -2028,9 +2022,6 @@ fxp_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
-
        return (error);
 }
 
index 1c08757..235f74d 100644 (file)
@@ -27,7 +27,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/gx/if_gx.c,v 1.2.2.3 2001/12/14 19:51:39 jlemon Exp $
- * $DragonFly: src/sys/dev/netif/gx/Attic/if_gx.c,v 1.21 2005/11/22 00:24:32 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/gx/Attic/if_gx.c,v 1.22 2005/11/28 17:13:42 dillon Exp $
  */
 
 #include <sys/param.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
-#include <sys/thread2.h>
 #include <sys/queue.h>
+#include <sys/serialize.h>
+
+#include <sys/thread2.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -368,10 +370,11 @@ gx_attach(device_t dev)
        /*
         * Call MI attach routines.
         */
-       ether_ifattach(ifp, gx->arpcom.ac_enaddr);
+       ether_ifattach(ifp, gx->arpcom.ac_enaddr, NULL);
 
-       error = bus_setup_intr(dev, gx->gx_irq, 0,
-                              gx_intr, gx, &gx->gx_intrhand, NULL);
+       error = bus_setup_intr(dev, gx->gx_irq, INTR_NETSAFE,
+                              gx_intr, gx, &gx->gx_intrhand, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                device_printf(dev, "couldn't setup irq\n");
@@ -395,8 +398,6 @@ gx_init(void *xsc)
        u_int32_t ctrl;
        int i, tmp;
 
-       crit_enter();
-
        /* Disable host interrupts, halt chip. */
        gx_reset(gx);
 
@@ -547,8 +548,6 @@ printf("66mhz: %s  64bit: %s\n",
        CSR_READ_4(gx, GX_STATUS) & GX_STAT_PCI66 ? "yes" : "no",
        CSR_READ_4(gx, GX_STATUS) & GX_STAT_BUS64 ? "yes" : "no");
 #endif
-
-       crit_exit();
 }
 
 /*
@@ -571,6 +570,7 @@ gx_detach(device_t dev)
        struct gx_softc *gx = device_get_softc(dev);
        struct ifnet *ifp = &gx->arpcom.ac_if;
 
+       lwkt_serialize_enter(ifp->if_serializer);
        if (device_is_attached(dev)) {
                ether_ifdetach(ifp);
                gx_reset(gx);
@@ -584,8 +584,6 @@ gx_detach(device_t dev)
        if (gx->gx_intrhand)
                bus_teardown_intr(gx->gx_dev, gx->gx_irq, gx->gx_intrhand);
 
-       crit_exit();
-
        if (gx->gx_irq)
                bus_release_resource(gx->gx_dev, SYS_RES_IRQ, 0, gx->gx_irq);
        if (gx->gx_res)
@@ -599,6 +597,7 @@ gx_detach(device_t dev)
        if (gx->gx_tbimode)
                ifmedia_removeall(&gx->gx_media);
 
+       lwkt_serialize_exit(ifp->if_serializer);
        return (0);
 }
 
@@ -862,8 +861,6 @@ gx_miibus_statchg(device_t dev)
         */
        mii = device_get_softc(gx->gx_miibus);
 
-       crit_enter();
-
        reg = CSR_READ_4(gx, GX_CTRL);
        if (mii->mii_media_active & IFM_FLAG0)
                reg |= GX_CTRL_RX_FLOWCTRL;
@@ -874,8 +871,6 @@ gx_miibus_statchg(device_t dev)
        else
                reg &= ~GX_CTRL_TX_FLOWCTRL;
        CSR_WRITE_4(gx, GX_CTRL, reg);
-
-       crit_exit();
 }
 
 static int
@@ -886,8 +881,6 @@ gx_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        struct mii_data *mii;
        int mask, error = 0;
 
-       crit_enter();
-
        switch (command) {
        case SIOCSIFMTU:
                if (ifr->ifr_mtu > GX_MAX_MTU) {
@@ -942,9 +935,6 @@ gx_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
-
        return (error);
 }
 
@@ -1282,7 +1272,7 @@ gx_rxeof(struct gx_softc *gx)
                if (staterr & GX_RXSTAT_VLAN_PKT)
                        VLAN_INPUT_TAG(m, rx->rx_special);
                else
-                       (*ifp->if_input)(ifp, m);
+                       ifp->if_input(ifp, m);
                continue;
 
   ierror:
@@ -1368,8 +1358,6 @@ gx_intr(void *xsc)
        struct ifnet *ifp = &gx->arpcom.ac_if;
        u_int32_t intr;
 
-       crit_enter();
-
        gx->gx_interrupts++;
 
        /* Disable host interrupts. */
@@ -1412,8 +1400,6 @@ gx_intr(void *xsc)
 
        if (ifp->if_flags & IFF_RUNNING && !ifq_is_empty(&ifp->if_snd))
                gx_start(ifp);
-
-       crit_exit();
 }
 
 /*
@@ -1544,8 +1530,6 @@ gx_start(struct ifnet *ifp)
        struct gx_softc *gx = ifp->if_softc;
        struct mbuf *m_head;
 
-       crit_enter();
-
        for (;;) {
                m_head = ifq_poll(&ifp->if_snd);
                if (m_head == NULL)
@@ -1569,6 +1553,4 @@ gx_start(struct ifnet *ifp)
                 */
                ifp->if_timer = 5;
        }
-
-       crit_exit();
 }
index 2d41a82..9c12d22 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/iicbus/if_ic.c,v 1.8 1999/12/29 04:35:39 peter Exp $
- * $DragonFly: src/sys/dev/netif/ic/if_ic.c,v 1.13 2005/06/13 22:27:52 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/ic/if_ic.c,v 1.14 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
@@ -147,7 +147,7 @@ icattach(device_t dev)
        ifp->if_addrlen = 0;
        ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
 
-       if_attach(ifp);
+       if_attach(ifp, NULL);
 
        bpfattach(ifp, DLT_NULL, ICHDRLEN);
 
index f0fa5cc..b5ef64e 100644 (file)
@@ -48,7 +48,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/ie/if_ie.c,v 1.72.2.4 2003/03/27 21:01:49 mdodd Exp $
- * $DragonFly: src/sys/dev/netif/ie/if_ie.c,v 1.25 2005/11/22 00:24:32 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ie/if_ie.c,v 1.26 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
@@ -204,8 +204,7 @@ static int  ierint(int unit, struct ie_softc * ie);
 static int     ietint(int unit, struct ie_softc * ie);
 static int     iernr(int unit, struct ie_softc * ie);
 static void    start_receiver(int unit);
-static __inline int ieget(int, struct ie_softc *, struct mbuf **,
-                         struct ether_header *);
+static __inline int ieget(int, struct ie_softc *, struct mbuf **);
 static v_caddr_t setup_rfa(v_caddr_t ptr, struct ie_softc * ie);
 static int     mc_setup(int, v_caddr_t, volatile struct ie_sys_ctl_block *);
 static void    ie_mc_reset(int unit);
@@ -831,7 +830,7 @@ ieattach(struct isa_device *dvp)
                EVENTHANDLER_REGISTER(shutdown_post_sync, ee16_shutdown,
                                      ie, SHUTDOWN_PRI_DEFAULT);
 
-       ether_ifattach(ifp, ie->arpcom.ac_enaddr);
+       ether_ifattach(ifp, ie->arpcom.ac_enaddr, NULL);
        return (1);
 }
 
@@ -845,6 +844,8 @@ ieintr(void *arg)
        struct ie_softc *ie = &ie_softc[unit];
        u_short status;
 
+       lwkt_serialize_enter(ie->arpcom.ac_if.if_serializer);
+
        /* Clear the interrupt latch on the 3C507. */
        if (ie->hard_type == IE_3C507
         && (inb(PORT + IE507_CTRL) & EL_CTRL_INTL))
@@ -907,6 +908,7 @@ loop:
        if (ie->hard_type == IE_EE16)
                outb(PORT + IEE16_IRQ, ie->irq_encoded | IEE16_IRQ_ENABLE);
 
+       lwkt_serialize_exit(ie->arpcom.ac_if.if_serializer);
 }
 
 /*
@@ -1158,9 +1160,10 @@ ie_packet_len(int unit, struct ie_softc * ie)
  * operation considerably.  (Provided that it works, of course.)
  */
 static __inline int
-ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
+ieget(int unit, struct ie_softc *ie, struct mbuf **mp)
 {
        struct  mbuf *m, *top, **mymp;
+       struct  ether_header eh;
        int     i;
        int     offset;
        int     totlen, resid;
@@ -1176,7 +1179,7 @@ ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
        /*
         * Snarf the Ethernet header.
         */
-       bcopy((v_caddr_t) ie->cbuffs[i], (caddr_t) ehp, sizeof *ehp);
+       bcopy((v_caddr_t) ie->cbuffs[i], (caddr_t) &eh, sizeof eh);
        /* ignore cast-qual warning here */
 
        /*
@@ -1185,14 +1188,14 @@ ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
         * This is only a consideration when FILTER is defined; i.e., when
         * we are either running BPF or doing multicasting.
         */
-       if (!check_eh(ie, ehp)) {
+       if (!check_eh(ie, &eh)) {
                ie_drop_packet_buffer(unit, ie);
                ie->arpcom.ac_if.if_ierrors--;  /* just this case, it's not an
                                                 * error
                                                 */
                return (-1);
        }
-       totlen -= (offset = sizeof *ehp);
+       offset = 0;
 
        MGETHDR(*mp, MB_DONTWAIT, MT_DATA);
        if (!*mp) {
@@ -1200,7 +1203,6 @@ ieget(int unit, struct ie_softc *ie, struct mbuf **mp, struct ether_header *ehp)
                return (-1);
        }
        m = *mp;
-       m->m_pkthdr.rcvif = &ie->arpcom.ac_if;
        m->m_len = MHLEN;
        resid = m->m_pkthdr.len = totlen;
        top = 0;
@@ -1333,8 +1335,7 @@ static void
 ie_readframe(int unit, struct ie_softc *ie, int        num/* frame number to read */)
 {
        struct ie_recv_frame_desc rfd;
-       struct mbuf *m = 0;
-       struct ether_header eh;
+       struct mbuf *m = NULL;
 
        bcopy((v_caddr_t) (ie->rframes[num]), &rfd,
              sizeof(struct ie_recv_frame_desc));
@@ -1350,21 +1351,12 @@ ie_readframe(int unit, struct ie_softc *ie, int num/* frame number to read */)
        ie->rfhead = (ie->rfhead + 1) % ie->nframes;
 
        if (rfd.ie_fd_status & IE_FD_OK) {
-               if (ieget(unit, ie, &m, &eh)) {
+               if (ieget(unit, ie, &m)) {
                        ie->arpcom.ac_if.if_ierrors++;  /* this counts as an
                                                         * error */
                        return;
                }
        }
-#ifdef DEBUG
-       if (ie_debug & IED_READFRAME) {
-               printf("ie%d: frame from ether %6D type %x\n", unit,
-                      eh.ether_shost, ":", (unsigned) eh.ether_type);
-       }
-       if (ntohs(eh.ether_type) > ETHERTYPE_TRAIL
-           && ntohs(eh.ether_type) < (ETHERTYPE_TRAIL + ETHERTYPE_NTRAILER))
-               printf("received trailer!\n");
-#endif
 
        if (!m)
                return;
@@ -1372,7 +1364,7 @@ ie_readframe(int unit, struct ie_softc *ie, int   num/* frame number to read */)
        /*
         * Finally pass this packet up to higher layers.
         */
-       ether_input(&ie->arpcom.ac_if, &eh, m);
+       ie->arpcom.ac_if.if_input(&ie->arpcom.ac_if, m);
 }
 
 static void
@@ -1497,8 +1489,6 @@ check_ie_present(int unit, caddr_t where, unsigned size)
        volatile struct ie_sys_ctl_block *scb;
        u_long  realbase;
 
-       crit_exit();
-
        realbase = (uintptr_t) where + size - (1 << 24);
 
        scp = (volatile struct ie_sys_conf_ptr *) (uintptr_t)
@@ -1530,7 +1520,6 @@ check_ie_present(int unit, caddr_t where, unsigned size)
        DELAY(100);             /* wait a while... */
 
        if (iscp->ie_busy) {
-               crit_exit();
                return (0);
        }
        /*
@@ -1554,7 +1543,6 @@ check_ie_present(int unit, caddr_t where, unsigned size)
        DELAY(100);
 
        if (iscp->ie_busy) {
-               crit_exit();
                return (0);
        }
        ie_softc[unit].iosize = size;
@@ -1568,8 +1556,6 @@ check_ie_present(int unit, caddr_t where, unsigned size)
         */
        ie_ack(scb, IE_ST_WHENCE, unit, ie_softc[unit].ie_chan_attn);
 
-       crit_exit();
-
        return (1);
 }
 
@@ -1732,10 +1718,7 @@ sl_read_ether(int unit, unsigned char addr[6])
 static void
 iereset(int unit)
 {
-       crit_enter();
-
        if (unit >= NIE) {
-               crit_exit();
                return;
        }
        printf("ie%d: reset\n", unit);
@@ -1759,8 +1742,6 @@ iereset(int unit)
 
        ie_softc[unit].arpcom.ac_if.if_flags |= IFF_UP;
        ieioctl(&ie_softc[unit].arpcom.ac_if, SIOCSIFFLAGS, 0, (struct ucred *)NULL);
-
-       crit_exit();
 }
 
 /*
@@ -1860,14 +1841,10 @@ run_tdr(int unit, volatile struct ie_tdr_cmd *cmd)
 static void
 start_receiver(int unit)
 {
-       crit_enter();
-
        ie_softc[unit].scb->ie_recv_list = MK_16(MEM, ie_softc[unit].rframes[0]);
        command_and_wait(unit, IE_RU_START, 0, 0);
 
        ie_ack(ie_softc[unit].scb, IE_ST_WHENCE, unit, ie_softc[unit].ie_chan_attn);
-
-       crit_exit();
 }
 
 /*
@@ -1988,8 +1965,6 @@ ieinit(xsc)
        int     i;
        int     unit = ie->unit;
 
-       crit_enter();
-
        ptr = Alignvol((volatile char *) scb + sizeof *scb);
 
        /*
@@ -2008,7 +1983,6 @@ ieinit(xsc)
 
                if (command_and_wait(unit, IE_CU_START, cmd, IE_STAT_COMPL)
                 || !(cmd->com.ie_cmd_status & IE_STAT_OK)) {
-                       crit_exit();
                        printf("ie%d: configure command failed\n", unit);
                        return;
                }
@@ -2028,7 +2002,6 @@ ieinit(xsc)
                scb->ie_command_list = MK_16(MEM, cmd);
                if (command_and_wait(unit, IE_CU_START, cmd, IE_STAT_COMPL)
                    || !(cmd->com.ie_cmd_status & IE_STAT_OK)) {
-                       crit_exit();
                        printf("ie%d: individual address "
                               "setup command failed\n", unit);
                        return;
@@ -2098,8 +2071,6 @@ ieinit(xsc)
        ie->arpcom.ac_if.if_flags |= IFF_RUNNING;       /* tell higher levels
                                                         * we're here */
        start_receiver(unit);
-
-       crit_exit();
 }
 
 static void
@@ -2113,8 +2084,6 @@ ieioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
 {
        int error = 0;
 
-       crit_enter();
-
        switch (command) {
        case SIOCSIFFLAGS:
                /*
@@ -2153,8 +2122,6 @@ ieioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
        return (error);
 }
 
index 7d5551e..213b39f 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/usb/if_kue.c,v 1.17.2.9 2003/04/13 02:39:25 murray Exp $
- * $DragonFly: src/sys/dev/netif/kue/if_kue.c,v 1.17 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/kue/if_kue.c,v 1.18 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
@@ -489,7 +489,7 @@ USB_ATTACH(kue)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, sc->kue_desc.kue_macaddr);
+       ether_ifattach(ifp, sc->kue_desc.kue_macaddr, NULL);
        usb_register_netisr();
        sc->kue_dying = 0;
 
index c874391..7b82b41 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/i386/isa/if_le.c,v 1.56.2.4 2002/06/05 23:24:10 paul Exp $
- * $DragonFly: src/sys/dev/netif/le/if_le.c,v 1.32 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/le/if_le.c,v 1.33 2005/11/28 17:13:42 dillon Exp $
  */
 
 /*
 #include <sys/mbuf.h>
 #include <sys/socket.h>
 #include <sys/sockio.h>
-#include <sys/thread2.h>
 #include <sys/malloc.h>
 #include <sys/linker_set.h>
 #include <sys/module.h>
+#include <sys/serialize.h>
+
+#include <sys/thread2.h>
 
 #include <net/ethernet.h>
 #include <net/if.h>
@@ -231,6 +233,8 @@ static const struct le_board le_boards[] = {
     { NULL }                           /* Must Be Last! */
 };
 
+static struct lwkt_serialize   le_serialize;
+
 /*
  * This tells the autoconf code how to set us up.
  */
@@ -254,6 +258,8 @@ le_probe(struct isa_device *dvp)
     const struct le_board *bd;
     int iospace;
 
+    lwkt_serialize_init(&le_serialize);
+
     if (dvp->id_unit >= NLE) {
        printf("%s%d not configured -- too many devices\n",
               ledriver.name, dvp->id_unit);
@@ -300,7 +306,7 @@ le_attach(struct isa_device *dvp)
     ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
     ifq_set_ready(&ifp->if_snd);
 
-    ether_ifattach(ifp, sc->le_ac.ac_enaddr);
+    ether_ifattach(ifp, sc->le_ac.ac_enaddr, &le_serialize);
 
     return 1;
 }
@@ -310,8 +316,10 @@ le_intr(void *arg)
 {
     int unit = (int)arg;
 
+    lwkt_serialize_enter(&le_serialize);
     le_intrs[unit]++;
     (*le_intrvec[unit])(&le_softc[unit]);
+    lwkt_serialize_exit(&le_serialize);
 }
 
 #define        LE_XTRA         0
@@ -320,33 +328,20 @@ static void
 le_input(struct le_softc *sc, caddr_t seg1, size_t total_len,
     size_t len1, caddr_t seg2)
 {
-    struct ether_header eh;
     struct mbuf *m;
 
-    if (total_len - sizeof(eh) > ETHERMTU
-           || total_len - sizeof(eh) < ETHERMIN) {
-       sc->le_if.if_ierrors++;
-       return;
-    }
-    bcopy(seg1, &eh, ETHER_HDR_LEN);
-
-    seg1 += ETHER_HDR_LEN;
-    total_len -= ETHER_HDR_LEN;
-    len1 -= ETHER_HDR_LEN;
-
     m = m_getl(total_len + LE_XTRA, MB_DONTWAIT, MT_DATA, M_PKTHDR, NULL);
     if (m == NULL) {
        sc->le_if.if_ierrors++;
        return;
     }
-    m->m_pkthdr.rcvif = &sc->le_if;
     m->m_data += LE_XTRA;
     m->m_len = m->m_pkthdr.len = total_len;
 
     bcopy(seg1, mtod(m, caddr_t), len1);
     if (seg2 != NULL)
        bcopy(seg2, mtod(m, caddr_t) + len1, total_len - len1);
-    ether_input(&sc->le_if, &eh, m);
+    sc->le_if.if_input(&sc->le_if, m);
 }
 
 static int
@@ -358,8 +353,6 @@ le_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
     if ((sc->le_flags & IFF_UP) == 0)
        return EIO;
 
-    crit_enter();
-
     switch (cmd) {
        case SIOCSIFFLAGS: {
            sc->if_init(sc);
@@ -379,9 +372,6 @@ le_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, cmd, data);
                break;
     }
-
-    crit_exit();
-
     return error;
 }
 
@@ -679,8 +669,6 @@ lemac_init(void *xsc)
     if ((sc->le_flags & IFF_UP) == 0)
        return;
 
-    crit_enter();
-
     /*
      * If the interface has the up flag
      */
@@ -720,8 +708,6 @@ lemac_init(void *xsc)
        LEMAC_INTR_DISABLE(sc);
        sc->le_if.if_flags &= ~IFF_RUNNING;
     }
-
-    crit_exit();
 }
 
 /*
index b8a5bf5..ec94bc1 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lge/if_lge.c,v 1.5.2.2 2001/12/14 19:49:23 jlemon Exp $
- * $DragonFly: src/sys/dev/netif/lge/if_lge.c,v 1.32 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/lge/if_lge.c,v 1.33 2005/11/28 17:13:43 dillon Exp $
  */
 
 /*
@@ -81,6 +81,7 @@
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
+#include <sys/serialize.h>
 #include <sys/thread2.h>
 
 #include <net/if.h>
@@ -139,6 +140,7 @@ static void lge_rxeoc(struct lge_softc *);
 static void    lge_txeof(struct lge_softc *);
 static void    lge_intr(void *);
 static void    lge_tick(void *);
+static void    lge_tick_serialized(void *);
 static void    lge_start(struct ifnet *);
 static int     lge_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *);
 static void    lge_init(void *);
@@ -544,10 +546,11 @@ lge_attach(device_t dev)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
 
-       error = bus_setup_intr(dev, sc->lge_irq, 0,
-                              lge_intr, sc, &sc->lge_intrhand, NULL);
+       error = bus_setup_intr(dev, sc->lge_irq, INTR_NETSAFE,
+                              lge_intr, sc, &sc->lge_intrhand, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                printf("lge%d: couldn't set up irq\n", unit);
@@ -567,8 +570,7 @@ lge_detach(device_t dev)
        struct lge_softc *sc= device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
-
+       lwkt_serialize_enter(ifp->if_serializer);
        if (device_is_attached(dev)) {
                lge_reset(sc);
                lge_stop(sc);
@@ -582,8 +584,6 @@ lge_detach(device_t dev)
        if (sc->lge_intrhand)
                bus_teardown_intr(dev, sc->lge_irq, sc->lge_intrhand);
 
-       crit_exit();
-
        if (sc->lge_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->lge_irq);
        if (sc->lge_res)
@@ -594,6 +594,7 @@ lge_detach(device_t dev)
                           M_DEVBUF);
        lge_free_jumbo_mem(sc);
 
+       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
@@ -909,7 +910,7 @@ lge_rxeof(struct lge_softc *sc, int cnt)
                        m->m_pkthdr.csum_data = 0xffff;
                }
 
-               (*ifp->if_input)(ifp, m);
+               ifp->if_input(ifp, m);
        }
 
        sc->lge_cdata.lge_rx_cons = i;
@@ -970,10 +971,19 @@ static void
 lge_tick(void *xsc)
 {
        struct lge_softc *sc = xsc;
-       struct mii_data *mii;
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
+       lge_tick_serialized(xsc);
+       lwkt_serialize_exit(ifp->if_serializer);
+}
+
+static void
+lge_tick_serialized(void *xsc)
+{
+       struct lge_softc *sc = xsc;
+       struct mii_data *mii;
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
        CSR_WRITE_4(sc, LGE_STATSIDX, LGE_STATS_SINGLE_COLL_PKTS);
        ifp->if_collisions += CSR_READ_4(sc, LGE_STATSVAL);
@@ -997,8 +1007,6 @@ lge_tick(void *xsc)
        }
 
        callout_reset(&sc->lge_stat_timer, hz, lge_tick, sc);
-
-       crit_exit();
 }
 
 static void
@@ -1037,7 +1045,7 @@ lge_intr(void *arg)
                if (status & LGE_ISR_PHY_INTR) {
                        sc->lge_link = 0;
                        callout_stop(&sc->lge_stat_timer);
-                       lge_tick(sc);
+                       lge_tick_serialized(sc);
                }
        }
 
@@ -1153,12 +1161,8 @@ lge_init(void *xsc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        struct mii_data *mii;
 
-       crit_enter();
-
-       if (ifp->if_flags & IFF_RUNNING) {
-               crit_exit();
+       if (ifp->if_flags & IFF_RUNNING)
                return;
-       }
 
        /*
         * Cancel pending I/O and free all RX/TX buffers.
@@ -1177,7 +1181,6 @@ lge_init(void *xsc)
                printf("lge%d: initialization failed: no "
                    "memory for rx buffers\n", sc->lge_unit);
                lge_stop(sc);
-               crit_exit();
                return;
        }
 
@@ -1275,8 +1278,6 @@ lge_init(void *xsc)
        ifp->if_flags &= ~IFF_OACTIVE;
 
        callout_reset(&sc->lge_stat_timer, hz, lge_tick, sc);
-
-       crit_exit();
 }
 
 /*
@@ -1322,8 +1323,6 @@ lge_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        struct mii_data  *mii;
        int error = 0;
 
-       crit_enter();
-
        switch(command) {
        case SIOCSIFMTU:
                if (ifr->ifr_mtu > LGE_JUMBO_MTU)
@@ -1370,8 +1369,6 @@ lge_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                break;
        }
 
-       crit_exit();
-
        return(error);
 }
 
index e8aa383..611f884 100644 (file)
@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lnc/if_lnc.c,v 1.89 2001/07/04 13:00:19 nyan Exp $
- * $DragonFly: src/sys/dev/netif/lnc/Attic/if_lnc.c,v 1.23 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/lnc/Attic/if_lnc.c,v 1.24 2005/11/28 17:13:43 dillon Exp $
  */
 
 /*
@@ -71,6 +71,7 @@
 #include <sys/socket.h>
 #include <sys/sockio.h>
 #include <sys/syslog.h>
+#include <sys/serialize.h>
 #include <sys/thread2.h>
 
 #include <machine/bus.h>
@@ -576,7 +577,7 @@ lnc_rint(struct lnc_softc *sc)
                                      sc->arpcom.ac_enaddr, ETHER_ADDR_LEN) == 0) {
                                    m_freem(head);
                                } else {
-                                       (ifp->if_input)(ifp, head);
+                                       ifp->if_input(ifp, head);
                                }
                        } else {
                                int unit = ifp->if_dunit;
@@ -873,7 +874,7 @@ lnc_attach_common(device_t dev)
         * XXX -- should check return status of if_attach
         */
 
-       ether_ifattach(&sc->arpcom.ac_if, sc->arpcom.ac_enaddr);
+       ether_ifattach(&sc->arpcom.ac_if, sc->arpcom.ac_enaddr, NULL);
 
        if (sc->nic.ic == LANCE || sc->nic.ic == C_LANCE)
                if_printf(ifp, "%s (%s)", nic_ident[sc->nic.ident],
index 2a35a9b..69d01e9 100644 (file)
@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lnc/if_lnc_isa.c,v 1.12 2001/07/04 13:00:19 nyan Exp $
- * $DragonFly: src/sys/dev/netif/lnc/if_lnc_isa.c,v 1.6 2005/10/12 17:35:52 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/lnc/if_lnc_isa.c,v 1.7 2005/11/28 17:13:43 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -37,6 +37,7 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/socket.h>
+#include <sys/serialize.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -243,8 +244,9 @@ lnc_isa_attach(device_t dev)
                goto fail;
        }
 
-       error = bus_setup_intr(dev, sc->irqres, 0, lncintr,
-                              sc, &sc->intrhand, NULL);
+       error = bus_setup_intr(dev, sc->irqres, INTR_NETSAFE, lncintr,
+                              sc, &sc->intrhand, 
+                              sc->arpcom.ac_if.if_serializer);
        if (error) {
                device_printf(dev, "Failed to setup irq handler\n");
                ether_ifdetach(&sc->arpcom.ac_if);
@@ -263,7 +265,7 @@ lnc_isa_detach(device_t dev)
 {
        lnc_softc_t *sc = device_get_softc(dev);
 
-       crit_enter();
+       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
 
        if (device_is_attached(dev)) {
                ether_ifdetach(&sc->arpcom.ac_if);
@@ -273,8 +275,6 @@ lnc_isa_detach(device_t dev)
        if (sc->intrhand)
                bus_teardown_intr(dev, sc->irqres, sc->intrhand);
 
-       crit_exit();
-
        if (sc->irqres)
                bus_release_resource(dev, SYS_RES_IRQ, sc->irqrid, sc->irqres);
        if (sc->portres)
@@ -289,6 +289,7 @@ lnc_isa_detach(device_t dev)
        if (sc->dmat)
                bus_dma_tag_destroy(sc->dmat);
 
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
        return (0);
 }
 
index b9aba0e..051455a 100644 (file)
@@ -28,7 +28,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/lnc/if_lnc_pci.c,v 1.25 2001/07/04 13:00:19 nyan Exp $
- * $DragonFly: src/sys/dev/netif/lnc/if_lnc_pci.c,v 1.7 2005/10/12 17:35:52 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/lnc/if_lnc_pci.c,v 1.8 2005/11/28 17:13:43 dillon Exp $
  */
 
 #include <sys/param.h>
 #include <sys/socket.h>
 #include <sys/malloc.h>
 #include <sys/kernel.h>
-#include <sys/thread2.h>
+#include <sys/serialize.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
 #include <sys/bus.h>
 #include <sys/rman.h>
 
+#include <sys/thread2.h>
+
 #include <net/ethernet.h>
 #include <net/if.h>
 #include <net/if_arp.h>
@@ -186,8 +188,9 @@ lnc_pci_attach(device_t dev)
                goto fail;
        }
 
-       error = bus_setup_intr(dev, sc->irqres, 0, lncintr,
-                            sc, &sc->intrhand, NULL);
+       error = bus_setup_intr(dev, sc->irqres, INTR_NETSAFE, lncintr,
+                            sc, &sc->intrhand, 
+                            sc->arpcom.ac_if.if_serializer);
        if (error) {
                device_printf(dev, "Cannot setup irq handler\n");
                ether_ifdetach(&sc->arpcom.ac_if);
@@ -206,7 +209,7 @@ lnc_pci_detach(device_t dev)
 {
        lnc_softc_t *sc = device_get_softc(dev);
 
-       crit_enter();
+       lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer);
 
        if (device_is_attached(dev)) {
                ether_ifdetach(&sc->arpcom.ac_if);
@@ -216,8 +219,6 @@ lnc_pci_detach(device_t dev)
        if (sc->intrhand)
                bus_teardown_intr(dev, sc->irqres, sc->intrhand);
 
-       crit_exit();
-
        if (sc->irqres)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irqres);
        if (sc->portres)
@@ -231,6 +232,8 @@ lnc_pci_detach(device_t dev)
        if (sc->dmat)
                bus_dma_tag_destroy(sc->dmat);
 
+       lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer);
+
        return (0);
 }
 
index 3f7546a..43ae838 100644 (file)
@@ -22,7 +22,7 @@
  * this gadget.
  *
  * $FreeBSD: src/sys/pci/if_mn.c,v 1.11.2.3 2001/01/23 12:47:09 phk Exp $
- * $DragonFly: src/sys/dev/netif/mn/if_mn.c,v 1.10 2005/10/12 17:35:52 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/mn/if_mn.c,v 1.11 2005/11/28 17:13:43 dillon Exp $
  */
 
 /*
@@ -1348,7 +1348,7 @@ mn_attach (device_t self)
                return(ENXIO);
        }
 
-       error = bus_setup_intr(self, sc->irq, 0, mn_intr, sc, 
+       error = bus_setup_intr(self, sc->irq, INTR_NETSAFE, mn_intr, sc, 
                               &sc->intrhand, NULL);
 
        if (error) {
index 04bb486..b78f981 100644 (file)
@@ -26,7 +26,7 @@
  * Written by: yen_cw@myson.com.tw  available at: http://www.myson.com.tw/
  *
  * $FreeBSD: src/sys/dev/my/if_my.c,v 1.2.2.4 2002/04/17 02:05:27 julian Exp $
- * $DragonFly: src/sys/dev/netif/my/if_my.c,v 1.22 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/my/if_my.c,v 1.23 2005/11/28 17:13:43 dillon Exp $
  *
  * Myson fast ethernet PCI NIC driver
  *
 #include <sys/kernel.h>
 #include <sys/socket.h>
 #include <sys/queue.h>
-#include <sys/thread2.h>
 #include <sys/bus.h>
 #include <sys/module.h>
+#include <sys/serialize.h>
+
+#include <sys/thread2.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -861,7 +863,6 @@ my_attach(device_t dev)
                error = ENXIO;
                goto fail;
        }
-       callout_init(&sc->my_stat_ch);
 
        sc->my_info = t;
 
@@ -962,10 +963,11 @@ my_attach(device_t dev)
        my_stop(sc);
        ifmedia_set(&sc->ifmedia, media);
 
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
 
-       error = bus_setup_intr(dev, sc->my_irq, 0,
-                              my_intr, sc, &sc->my_intrhand, NULL);
+       error = bus_setup_intr(dev, sc->my_irq, INTR_NETSAFE,
+                              my_intr, sc, &sc->my_intrhand, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                printf("my%d: couldn't set up irq\n", unit);
@@ -985,7 +987,7 @@ my_detach(device_t dev)
        struct my_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
        if (device_is_attached(dev)) {
                ether_ifdetach(ifp);
                my_stop(sc);
@@ -994,7 +996,7 @@ my_detach(device_t dev)
        if (sc->my_intrhand)
                bus_teardown_intr(dev, sc->my_irq, sc->my_intrhand);
 
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 
        if (sc->my_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->my_irq);
@@ -1144,7 +1146,7 @@ my_rxeof(struct my_softc * sc)
                        m->m_pkthdr.len = m->m_len = total_len;
                }
                ifp->if_ipackets++;
-               (*ifp->if_input)(ifp, m);
+               ifp->if_input(ifp, m);
        }
 }
 
index 82d924c..3893f31 100644 (file)
@@ -26,7 +26,7 @@
  * Written by: yen_cw@myson.com.tw  available at: http://www.myson.com.tw/
  *
  * $FreeBSD: src/sys/dev/my/if_myreg.h,v 1.1.2.2 2002/04/17 02:05:27 julian Exp $
- * $DragonFly: src/sys/dev/netif/my/if_myreg.h,v 1.4 2005/06/14 11:05:47 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/my/if_myreg.h,v 1.5 2005/11/28 17:13:43 dillon Exp $
  *
  * Myson MTD80x register definitions.
  *
@@ -371,7 +371,6 @@ struct my_softc {
         struct my_list_data     *my_ldata;
         struct my_chain_data    my_cdata;
        device_t                my_miibus;
-       struct callout          my_stat_ch;
 
 };
 
index 7a8928e..90740a3 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/if_ndis/if_ndis.c,v 1.65 2004/07/07 17:46:30 wpaul Exp $
- * $DragonFly: src/sys/dev/netif/ndis/if_ndis.c,v 1.10 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/ndis/if_ndis.c,v 1.11 2005/11/28 17:13:43 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -42,9 +42,8 @@
 #include <sys/socket.h>
 #include <sys/queue.h>
 #include <sys/proc.h>
-#if __FreeBSD_version < 502113
 #include <sys/sysctl.h>
-#endif
+#include <sys/serialize.h>
 
 #include <net/if.h>
 #include <net/ifq_var.h>
@@ -376,20 +375,6 @@ ndis_attach(dev)
        NDIS_LOCK_INIT(&sc->ndis_lock);
        NDIS_LOCK_INIT(&sc->ndis_intrlock);
 
-        /*
-        * Hook interrupt early, since calling the driver's
-        * init routine may trigger an interrupt.
-        */
-
-       error = bus_setup_intr(dev, sc->ndis_irq, INTR_MPSAFE,
-                              ndis_intr, sc,
-                              &sc->ndis_intrhand, NULL);
-
-       if (error) {
-               device_printf(dev, "couldn't set up irq\n");
-               goto fail;
-       }
-
        sc->ndis_regvals = ndis_regvals;
 
 #if __FreeBSD_version < 502113
@@ -674,9 +659,21 @@ nonettypes:
                    IFM_ETHER|IFM_100_TX|IFM_FDX, 0, NULL);
                ifmedia_add(&sc->ifmedia, IFM_ETHER|IFM_AUTO, 0, NULL);
                ifmedia_set(&sc->ifmedia, IFM_ETHER|IFM_AUTO);
-               ether_ifattach(ifp, eaddr);
+               ether_ifattach(ifp, eaddr, NULL);
+       }
+
+       if (error == 0) {
+               error = bus_setup_intr(dev, sc->ndis_irq, INTR_NETSAFE,
+                                      ndis_intr, sc,
+                                      &sc->ndis_intrhand, 
+                                      ifp->if_serializer);
+               if (error) {
+                       device_printf(dev, "couldn't set up irq\n");
+                       goto fail;
+               }
        }
 
+
        /* Override the status handler so we can detect link changes. */
        sc->ndis_block.nmb_status_func = ndis_linksts;
        sc->ndis_block.nmb_statusdone_func = ndis_linksts_done;
@@ -706,8 +703,10 @@ ndis_detach(dev)
        NDIS_LOCK_INFO;
 
        sc = device_get_softc(dev);
-       NDIS_LOCK(sc);
        ifp = &sc->arpcom.ac_if;
+       lwkt_serialize_enter(ifp->if_serializer);
+
+       NDIS_LOCK(sc);
        ifp->if_flags &= ~IFF_UP;
 
        if (device_is_attached(dev)) {
@@ -751,6 +750,7 @@ ndis_detach(dev)
        NDIS_LOCK_DESTROY(&sc->ndis_lock);
        NDIS_LOCK_DESTROY(&sc->ndis_intrlock);
 
+       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
@@ -763,12 +763,13 @@ ndis_suspend(dev)
 
        sc = device_get_softc(dev);
        ifp = &sc->arpcom.ac_if;
+       lwkt_serialize_enter(ifp->if_serializer);
 
 #ifdef notdef
        if (NDIS_INITIALIZED(sc))
                ndis_stop(sc);
 #endif
-
+       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
@@ -782,8 +783,10 @@ ndis_resume(dev)
        sc = device_get_softc(dev);
        ifp = &sc->arpcom.ac_if;
 
+       lwkt_serialize_enter(ifp->if_serializer);
        if (NDIS_INITIALIZED(sc))
                ndis_init(sc);
+       lwkt_serialize_exit(ifp->if_serializer);
 
        return(0);
 }
@@ -876,7 +879,7 @@ ndis_rxeof(adapter, packets, pktcnt)
                                }
                        }
 
-                       (*ifp->if_input)(ifp, m0);
+                       ifp->if_input(ifp, m0);
                }
        }
 
@@ -988,12 +991,14 @@ ndis_intrtask(arg)
        sc = arg;
        ifp = &sc->arpcom.ac_if;
 
+       lwkt_serialize_enter(ifp->serializer);
        irql = FASTCALL1(hal_raise_irql, DISPATCH_LEVEL);
        ndis_intrhand(sc);
        FASTCALL1(hal_lower_irql, irql);
        NDIS_INTRLOCK(sc);
        ndis_enable_intr(sc);
        NDIS_INTRUNLOCK(sc);
+       lwkt_serialize_exit(ifp->serializer);
 
        return;
 }
@@ -1047,6 +1052,7 @@ ndis_ticktask(xsc)
        void                    *xsc;
 {
        struct ndis_softc       *sc;
+       struct ifnet            *ifp;
        __stdcall ndis_checkforhang_handler hangfunc;
        uint8_t                 rval;
        ndis_media_state        linkstate;
@@ -1054,13 +1060,16 @@ ndis_ticktask(xsc)
        NDIS_LOCK_INFO;
 
        sc = xsc;
+       ifp = &sc->arpcom.ac_if;
 
+       lwkt_serialize_enter(ifp->serializer);
        hangfunc = sc->ndis_chars.nmc_checkhang_func;
 
        if (hangfunc != NULL) {
                rval = hangfunc(sc->ndis_block.nmb_miniportadapterctx);
                if (rval == TRUE) {
                        ndis_reset_nic(sc);
+                       lwkt_serialize_exit(ifp->serializer);
                        return;
                }
        }
@@ -1094,8 +1103,7 @@ ndis_ticktask(xsc)
        }
 
        NDIS_UNLOCK(sc);
-
-       return;
+       lwkt_serialize_exit(ifp->serializer);
 }
 
 static void
index e26a7f3..56d6f11 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/nge/if_nge.c,v 1.13.2.13 2003/02/05 22:03:57 mbr Exp $
- * $DragonFly: src/sys/dev/netif/nge/if_nge.c,v 1.33 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/nge/if_nge.c,v 1.34 2005/11/28 17:13:43 dillon Exp $
  */
 
 /*
@@ -97,6 +97,8 @@
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
+#include <sys/serialize.h>
+
 #include <sys/thread2.h>
 
 #include <net/if.h>
@@ -404,8 +406,6 @@ nge_mii_readreg(struct nge_softc *sc, struct nge_mii_frame *frame)
 {
        int ack, i;
 
-       crit_enter();
-
        /*
         * Set up frame for RX.
         */
@@ -478,8 +478,6 @@ fail:
        SIO_SET(NGE_MEAR_MII_CLK);
        DELAY(1);
 
-       crit_exit();
-
        if (ack)
                return(1);
        return(0);
@@ -491,8 +489,6 @@ fail:
 static int
 nge_mii_writereg(struct nge_softc *sc, struct nge_mii_frame *frame)
 {
-       crit_enter();
-
        /*
         * Set up frame for TX.
         */
@@ -526,8 +522,6 @@ nge_mii_writereg(struct nge_softc *sc, struct nge_mii_frame *frame)
         */
        SIO_CLR(NGE_MEAR_MII_DIR);
 
-       crit_exit();
-
        return(0);
 }
 
@@ -903,10 +897,11 @@ nge_attach(device_t dev)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
 
-       error = bus_setup_intr(dev, sc->nge_irq, 0,
-                              nge_intr, sc, &sc->nge_intrhand, NULL);
+       error = bus_setup_intr(dev, sc->nge_irq, INTR_NETSAFE,
+                              nge_intr, sc, &sc->nge_intrhand, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                device_printf(dev, "couldn't set up irq\n");
@@ -925,7 +920,7 @@ nge_detach(device_t dev)
        struct nge_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (device_is_attached(dev)) {
                nge_reset(sc);
@@ -940,8 +935,6 @@ nge_detach(device_t dev)
        if (sc->nge_intrhand)
                bus_teardown_intr(dev, sc->nge_irq, sc->nge_intrhand);
 
-       crit_exit();
-
        if (sc->nge_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->nge_irq);
        if (sc->nge_res)
@@ -953,6 +946,7 @@ nge_detach(device_t dev)
        if (sc->nge_cdata.nge_jumbo_buf)
                contigfree(sc->nge_cdata.nge_jumbo_buf, NGE_JMEM, M_DEVBUF);
 
+       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
@@ -1285,10 +1279,12 @@ nge_rxeof(struct nge_softc *sc)
                 * If we received a packet with a vlan tag, pass it
                 * to vlan_input() instead of ether_input().
                 */
+               lwkt_serialize_enter(ifp->if_serializer);
                if (extsts & NGE_RXEXTSTS_VLANPKT)
                        VLAN_INPUT_TAG(m, extsts & NGE_RXEXTSTS_VTCI);
                else
-                       (*ifp->if_input)(ifp, m);
+                       ifp->if_input(ifp, m);
+               lwkt_serialize_exit(ifp->if_serializer);
        }
 
        sc->nge_cdata.nge_rx_prod = i;
@@ -1360,7 +1356,7 @@ nge_tick(void *xsc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        struct mii_data *mii;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (sc->nge_tbi) {
                if (sc->nge_link == 0) {
@@ -1393,7 +1389,7 @@ nge_tick(void *xsc)
        }
        callout_reset(&sc->nge_stat_timer, hz, nge_tick, sc);
 
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 #ifdef DEVICE_POLLING
@@ -1504,7 +1500,7 @@ nge_intr(void *arg)
                /* mii_tick should only be called once per second */
                if (status & NGE_ISR_PHY_INTR) {
                        sc->nge_link = 0;
-                       nge_tick(sc);
+                       nge_tick_serialized(sc);
                }
 #endif
        }
@@ -1652,10 +1648,7 @@ nge_init(void *xsc)
        struct ifnet *ifp = &sc->arpcom.ac_if;
        struct mii_data *mii;
 
-       crit_enter();
-
        if (ifp->if_flags & IFF_RUNNING) {
-               crit_exit();
                return;
        }
 
@@ -1686,7 +1679,6 @@ nge_init(void *xsc)
                printf("nge%d: initialization failed: no "
                        "memory for rx buffers\n", sc->nge_unit);
                nge_stop(sc);
-               crit_exit();
                return;
        }
 
@@ -1828,8 +1820,6 @@ nge_init(void *xsc)
 
        ifp->if_flags |= IFF_RUNNING;
        ifp->if_flags &= ~IFF_OACTIVE;
-
-       crit_exit();
 }
 
 /*
@@ -1940,8 +1930,6 @@ nge_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        struct mii_data *mii;
        int error = 0;
 
-       crit_enter();
-
        switch(command) {
        case SIOCSIFMTU:
                if (ifr->ifr_mtu > NGE_JUMBO_MTU) {
@@ -2006,9 +1994,6 @@ nge_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
-
        return(error);
 }
 
@@ -2114,7 +2099,11 @@ static void
 nge_shutdown(device_t dev)
 {
        struct nge_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
+       lwkt_serialize_enter(ifp->if_serializer);
        nge_reset(sc);
        nge_stop(sc);
+       lwkt_serialize_exit(ifp->if_serializer);
 }
+
index b879fb7..98841a6 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  * 
  * $Id: if_nv.c,v 1.20 2005/03/12 01:11:00 q Exp $
- * $DragonFly: src/sys/dev/netif/nv/Attic/if_nv.c,v 1.22 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/nv/Attic/if_nv.c,v 1.23 2005/11/28 17:13:43 dillon Exp $
  */
 
 /*
@@ -126,15 +126,12 @@ static int      nv_probe(device_t);
 static int      nv_attach(device_t);
 static int      nv_detach(device_t);
 static void     nv_init(void *);
-static void    nv_init_serialized(struct nv_softc *);
 static void     nv_stop(struct nv_softc *);
-static void    nv_stop_serialized(struct nv_softc *);
 static void     nv_shutdown(device_t);
 static int      nv_init_rings(struct nv_softc *);
 static void     nv_free_rings(struct nv_softc *);
 
 static void     nv_ifstart(struct ifnet *);
-static void     nv_ifstart_serialized(struct ifnet *);
 static int      nv_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *);
 static void     nv_intr(void *);
 static void     nv_tick(void *);
@@ -313,7 +310,6 @@ nv_attach(device_t dev)
 
        sc->dev = dev;
        sc->unit = unit;
-       lwkt_serialize_init(&sc->serializer);
        callout_init(&sc->nv_stat_timer);
 
        /* Preinitialize data structures */
@@ -529,11 +525,11 @@ nv_attach(device_t dev)
        ifq_set_ready(&ifp->if_snd);
 
        /* Attach to OS's managers. */
-       ether_ifattach(ifp, sc->sc_macaddr);
+       ether_ifattach(ifp, sc->sc_macaddr, NULL);
 
        /* Activate our interrupt handler. - attach last to avoid lock */
-       error = bus_setup_intr(sc->dev, sc->irq, 0,
-                              nv_intr, sc, &sc->sc_ih, &sc->serializer);
+       error = bus_setup_intr(sc->dev, sc->irq, INTR_NETSAFE,
+                              nv_intr, sc, &sc->sc_ih, ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                device_printf(sc->dev, "couldn't set up interrupt handler\n");
@@ -555,17 +551,14 @@ nv_detach(device_t dev)
        struct nv_softc *sc = device_get_softc(dev);
        struct ifnet   *ifp;
 
-       lwkt_serialize_enter(&sc->serializer);
+       ifp = &sc->arpcom.ac_if;
+       lwkt_serialize_enter(ifp->if_serializer);
 
        DEBUGOUT(NV_DEBUG_DEINIT, "nv: nv_detach - entry\n");
 
-       ifp = &sc->arpcom.ac_if;
-
        if (device_is_attached(dev)) {
-               nv_stop_serialized(sc);
-               lwkt_serialize_exit(&sc->serializer);
+               nv_stop(sc);
                ether_ifdetach(ifp);
-               lwkt_serialize_enter(&sc->serializer);
        }
 
        if (sc->miibus)
@@ -602,27 +595,17 @@ nv_detach(device_t dev)
        if (sc->rtag)
                bus_dma_tag_destroy(sc->rtag);
 
-       lwkt_serialize_exit(&sc->serializer);
+       lwkt_serialize_exit(ifp->if_serializer);
 
        DEBUGOUT(NV_DEBUG_DEINIT, "nv: nv_detach - exit\n");
-
        return (0);
 }
 
+/* Initialise interface and start it "RUNNING" */
 static void
 nv_init(void *xsc)
 {
        struct nv_softc *sc = xsc;
-
-       lwkt_serialize_enter(&sc->serializer);
-       nv_init_serialized(sc);
-       lwkt_serialize_exit(&sc->serializer);
-}
-
-/* Initialise interface and start it "RUNNING" */
-static void
-nv_init_serialized(struct nv_softc *sc)
-{
        struct ifnet   *ifp;
        int             error;
 
@@ -634,7 +617,7 @@ nv_init_serialized(struct nv_softc *sc)
        if (ifp->if_flags & IFF_RUNNING)
                return;
 
-       nv_stop_serialized(sc);
+       nv_stop(sc);
 
        DEBUGOUT(NV_DEBUG_INIT, "nv: do pfnInit\n");
        /* Setup Hardware interface and allocate memory structures */
@@ -670,11 +653,11 @@ nv_init_serialized(struct nv_softc *sc)
         * a reset, renegotiation, or timeout.
         */
 #if 1
-       lwkt_serialize_handler_enable(&sc->serializer);
+       lwkt_serialize_handler_enable(ifp->if_serializer);
        sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX);
 #else
        if ((ifp->if_flags & IFF_POLLING) == 0) {
-               lwkt_serialize_handler_enable(&sc->serializer);
+               lwkt_serialize_handler_enable(ifp->if_serializer);
                sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX);
        }
 #endif
@@ -700,8 +683,6 @@ nv_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
 {
        struct nv_softc *sc = ifp->if_softc;
 
-       lwkt_serialize_enter(&sc->serializer);
-
        switch(cmd) {
        case POLL_REGISTER:
                /*
@@ -715,12 +696,12 @@ nv_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                 */
 #if 0
                sc->hwapi->pfnDisableInterrupts(sc->hwapi->pADCX);
-               lwkt_serialize_handler_disable(&sc->serializer);
+               lwkt_serialize_handler_disable(ifp->if_serializer);
 #endif
                break;
        case POLL_DEREGISTER:
 #if 0
-               lwkt_serialize_handler_enable(&sc->serializer);
+               lwkt_serialize_handler_enable(ifp->if_serializer);
                sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX);
 #endif
                break;
@@ -732,26 +713,17 @@ nv_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
                }
                if (ifp->if_flags & IFF_RUNNING) {
                        if (!ifq_is_empty(&ifp->if_snd))
-                               nv_ifstart_serialized(ifp);
+                               nv_ifstart(ifp);
                }
                break;
        }
-       lwkt_serialize_exit(&sc->serializer);
 }
 
 #endif
 
-static void
-nv_stop(struct nv_softc *sc)
-{
-       lwkt_serialize_enter(&sc->serializer);
-       nv_stop_serialized(sc);
-       lwkt_serialize_exit(&sc->serializer);
-}
-
 /* Stop interface activity ie. not "RUNNING" */
 static void
-nv_stop_serialized(struct nv_softc *sc)
+nv_stop(struct nv_softc *sc)
 {
        struct ifnet   *ifp;
 
@@ -769,7 +741,7 @@ nv_stop_serialized(struct nv_softc *sc)
         * the handler.
         */
        sc->hwapi->pfnDisableInterrupts(sc->hwapi->pADCX);
-       lwkt_serialize_handler_disable(&sc->serializer);
+       lwkt_serialize_handler_disable(ifp->if_serializer);
 
        sc->hwapi->pfnStop(sc->hwapi->pADCX, 0);
        sc->hwapi->pfnClearTxDesc(sc->hwapi->pADCX);
@@ -799,7 +771,9 @@ nv_shutdown(device_t dev)
        sc = device_get_softc(dev);
 
        /* Stop hardware activity */
+       lwkt_serialize_enter(sc->sc_if.if_serializer);
        nv_stop(sc);
+       lwkt_serialize_exit(sc->sc_if.if_serializer);
 }
 
 /* Allocate TX ring buffers */
@@ -909,16 +883,6 @@ nv_free_rings(struct nv_softc *sc)
 
 static void
 nv_ifstart(struct ifnet *ifp)
-{
-       struct nv_softc *sc = ifp->if_softc;
-
-       lwkt_serialize_enter(&sc->serializer);
-       nv_ifstart_serialized(ifp);
-       lwkt_serialize_exit(&sc->serializer);
-}
-
-static void
-nv_ifstart_serialized(struct ifnet *ifp)
 {
        struct nv_softc *sc = ifp->if_softc;
        struct nv_map_buffer *buf;
@@ -1037,8 +1001,6 @@ nv_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
        struct mii_data *mii;
        int             error = 0;
 
-       lwkt_serialize_enter(&sc->serializer);
-
        DEBUGOUT(NV_DEBUG_IOCTL, "nv: nv_ioctl - entry\n");
 
        switch (command) {
@@ -1048,8 +1010,8 @@ nv_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                        break;
                if (ifr->ifr_mtu + ifp->if_hdrlen <= MAX_PACKET_SIZE_1518) {
                        ifp->if_mtu = ifr->ifr_mtu;
-                       nv_stop_serialized(sc);
-                       nv_init_serialized(sc);
+                       nv_stop(sc);
+                       nv_init(sc);
                } else
                        error = EINVAL;
                break;
@@ -1058,12 +1020,12 @@ nv_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
                /* Setup interface flags */
                if (ifp->if_flags & IFF_UP) {
                        if ((ifp->if_flags & IFF_RUNNING) == 0) {
-                               nv_init_serialized(sc);
+                               nv_init(sc);
                                break;
                        }
                } else {
                        if (ifp->if_flags & IFF_RUNNING) {
-                               nv_stop_serialized(sc);
+                               nv_stop(sc);
                                break;
                        }
                }
@@ -1088,16 +1050,12 @@ nv_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
 
        default:
                /* Everything else we forward to generic ether ioctl */
-               lwkt_serialize_exit(&sc->serializer);
                error = ether_ioctl(ifp, command, data);
-               lwkt_serialize_enter(&sc->serializer);
                break;
        }
 
        DEBUGOUT(NV_DEBUG_IOCTL, "nv: nv_ioctl - exit\n");
 
-       lwkt_serialize_exit(&sc->serializer);
-
        return (error);
 }
 
@@ -1121,17 +1079,17 @@ nv_intr(void *arg)
        if (sc->hwapi->pfnQueryInterrupt(sc->hwapi->pADCX)) {
                sc->hwapi->pfnHandleInterrupt(sc->hwapi->pADCX);
 #if 1
-               lwkt_serialize_handler_enable(&sc->serializer);
+               lwkt_serialize_handler_enable(ifp->if_serializer);
                sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX);
 #else
                if ((ifp->if_flags & IFF_POLLING) == 0) {
-                       lwkt_serialize_handler_enable(&sc->serializer);
+                       lwkt_serialize_handler_enable(ifp->if_serializer);
                        sc->hwapi->pfnEnableInterrupts(sc->hwapi->pADCX);
                }
 #endif
        }
        if (!ifq_is_empty(&ifp->if_snd))
-               nv_ifstart_serialized(ifp);
+               nv_ifstart(ifp);
 
        /* If no pending packets we don't need a timeout */
        if (sc->pending_txs == 0)
@@ -1253,9 +1211,8 @@ nv_tick(void *xsc)
        struct mii_data *mii;
        struct ifnet   *ifp;
 
-       lwkt_serialize_enter(&sc->serializer);
-
        ifp = &sc->sc_if;
+       lwkt_serialize_enter(ifp->if_serializer);
        nv_update_stats(sc);
 
        mii = device_get_softc(sc->miibus);
@@ -1264,10 +1221,10 @@ nv_tick(void *xsc)
        if ((mii->mii_media_status & IFM_ACTIVE) &&
            IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                if (!ifq_is_empty(&ifp->if_snd))
-                       nv_ifstart_serialized(ifp);
+                       nv_ifstart(ifp);
        }
        callout_reset(&sc->nv_stat_timer, hz, nv_tick, sc);
-       lwkt_serialize_exit(&sc->serializer);
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 /* Update ifnet data structure with collected interface stats from API */
@@ -1334,21 +1291,17 @@ nv_watchdog(struct ifnet *ifp)
 {
        struct nv_softc *sc = ifp->if_softc;
 
-       lwkt_serialize_enter(&sc->serializer);
-
        device_printf(sc->dev, "device timeout (%d) flags %d\n",
                        sc->pending_txs, ifp->if_flags & IFF_OACTIVE);
 
        sc->tx_errors++;
 
-       nv_stop_serialized(sc);
+       nv_stop(sc);
        ifp->if_flags &= ~IFF_RUNNING;
-       nv_init_serialized(sc);
+       nv_init(sc);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               nv_ifstart_serialized(ifp);
-
-       lwkt_serialize_exit(&sc->serializer);
+               nv_ifstart(ifp);
 }
 
 /* --- Start of NVOSAPI interface --- */
@@ -1580,7 +1533,7 @@ nv_ospackettx(PNV_VOID ctx, PNV_VOID id, NV_UINT32 success)
        if (sc->pending_txs < TX_RING_SIZE) {
                ifp->if_flags &= ~IFF_OACTIVE;
                if (!ifq_is_empty(&ifp->if_snd))
-                       nv_ifstart_serialized(ifp);
+                       nv_ifstart(ifp);
        }
 fail:
        return (1);
@@ -1618,7 +1571,7 @@ nv_ospacketrx(PNV_VOID ctx, PNV_VOID data, NV_UINT32 success,
                bus_dmamap_unload(sc->mtag, buf->map);
 
                /* Give mbuf to OS. */
-               (*ifp->if_input) (ifp, buf->mbuf);
+               ifp->if_input(ifp, buf->mbuf);
                if (readdata->ulFilterMatch & ADREADFL_MULTICAST_MATCH)
                        ifp->if_imcasts++;
 
@@ -1695,6 +1648,17 @@ nv_osinittimer(PNV_VOID ctx, PNV_VOID timer, PTIMER_FUNC func, PNV_VOID paramete
        return (1);
 }
 
+static void
+nv_ostimer_callback(void *data)
+{
+       struct nv_softc *sc = data;
+       struct ifnet *ifp = &sc->sc_if;
+
+       lwkt_serialize_enter(ifp->if_serializer);
+       sc->ostimer_func(sc->ostimer_params);
+       lwkt_serialize_exit(ifp->if_serializer);
+}
+
 /* 
  * Set the timer to go off 
  *
@@ -1708,8 +1672,7 @@ nv_ossettimer(PNV_VOID ctx, PNV_VOID timer, NV_UINT32 delay)
        DEBUGOUT(NV_DEBUG_BROKEN, "nv: nv_ossettimer\n");
        printf("nv_ossettimer %d\n", (int)delay);
 
-       callout_reset(&sc->ostimer, delay, sc->ostimer_func,
-                     sc->ostimer_params);
+       callout_reset(&sc->ostimer, delay, nv_ostimer_callback, sc);
 
        return (1);
 }
index 1a1c5b9..ea52c1b 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $Id: if_nvreg.h,v 1.6 2004/08/12 14:00:05 q Exp $
- * $DragonFly: src/sys/dev/netif/nv/Attic/if_nvreg.h,v 1.9 2005/10/12 01:09:31 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/nv/Attic/if_nvreg.h,v 1.10 2005/11/28 17:13:43 dillon Exp $
  */
  
 #ifndef _IF_NVREG_H_
@@ -122,8 +122,6 @@ struct nv_softc {
        struct resource *res;
        struct resource *irq;
 
-       struct lwkt_serialize serializer;
-
        ADAPTER_API *hwapi;
        OS_API osapi;
                
index b7192bc..5ee0255 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/wi/if_wi.c,v 1.103.2.2 2002/08/02 07:11:34 imp Exp $
- * $DragonFly: src/sys/dev/netif/owi/Attic/if_owi.c,v 1.12 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/owi/Attic/if_owi.c,v 1.13 2005/11/28 17:13:43 dillon Exp $
  */
 
 /*
@@ -75,6 +75,7 @@
 #include <sys/random.h>
 #include <sys/syslog.h>
 #include <sys/sysctl.h>
+#include <sys/serialize.h>
 #include <sys/thread2.h>
 
 #include <machine/bus.h>
@@ -183,11 +184,11 @@ owi_generic_detach(dev)
        struct wi_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (sc->wi_gone) {
                device_printf(dev, "already unloaded\n");
-               crit_exit();
+               lwkt_serialize_exit(ifp->if_serializer);
                return(ENODEV);
        }
 
@@ -195,15 +196,12 @@ owi_generic_detach(dev)
 
        /* Delete all remaining media. */
        ifmedia_removeall(&sc->ifmedia);
-
        ether_ifdetach(ifp);
        bus_teardown_intr(dev, sc->irq, sc->wi_intrhand);
-
-       crit_exit();
-
        owi_free(dev);
        sc->wi_gone = 1;
 
+       lwkt_serialize_exit(ifp->if_serializer);
        return(0);
 }
 
@@ -439,10 +437,11 @@ owi_generic_attach(device_t dev)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, sc->arpcom.ac_enaddr);
+       ether_ifattach(ifp, sc->arpcom.ac_enaddr, NULL);
 
-       error = bus_setup_intr(dev, sc->irq, 0,
-                              wi_intr, sc, &sc->wi_intrhand, NULL);
+       error = bus_setup_intr(dev, sc->irq, INTR_NETSAFE,
+                              wi_intr, sc, &sc->wi_intrhand, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                device_printf(dev, "bus_setup_intr() failed! (%d)\n", error);
@@ -795,7 +794,7 @@ wi_rxeof(sc)
 #ifdef WICACHE
                wi_cache_store(sc, m, rx_frame.wi_q_info);
 #endif  
-               (*ifp->if_input)(ifp,  m);
+               ifp->if_input(ifp, m);
        }
 }
 
@@ -826,19 +825,16 @@ wi_inquire(xsc)
        struct wi_softc *sc = xsc;
        struct ifnet            *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        callout_reset(&sc->wi_stat_timer, hz* 60, wi_inquire, sc);
 
        /* Don't do this while we're transmitting */
-       if (ifp->if_flags & IFF_OACTIVE) {
-               crit_exit();
-               return;
+       if ((ifp->if_flags & IFF_OACTIVE) == 0) {
+               wi_cmd(sc, WI_CMD_INQUIRE, WI_INFO_COUNTERS, 0, 0);
        }
 
-       wi_cmd(sc, WI_CMD_INQUIRE, WI_INFO_COUNTERS, 0, 0);
-
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 static void
@@ -1608,8 +1604,6 @@ wi_ioctl(ifp, command, data, cr)
        ifr = (struct ifreq *)data;
        ireq = (struct ieee80211req *)data;
 
-       crit_enter();
-
        if (sc->wi_gone) {
                error = ENODEV;
                goto out;
@@ -1974,8 +1968,6 @@ wi_ioctl(ifp, command, data, cr)
                break;
        }
 out:
-       crit_exit();
-
        return(error);
 }
 
@@ -1988,12 +1980,8 @@ wi_init(xsc)
        struct wi_ltv_macaddr   mac;
        int                     id = 0;
 
-       crit_enter();
-
-       if (sc->wi_gone) {
-               crit_exit();
+       if (sc->wi_gone)
                return;
-       }
 
        if (ifp->if_flags & IFF_RUNNING)
                wi_stop(sc);
@@ -2116,8 +2104,6 @@ wi_init(xsc)
        ifp->if_flags &= ~IFF_OACTIVE;
 
        callout_reset(&sc->wi_stat_timer, hz * 60, wi_inquire, sc);
-
-       crit_exit();
 }
 
 #define RC4STATE 256
@@ -2210,24 +2196,16 @@ wi_start(ifp)
        struct ether_header     *eh;
        int                     id;
 
-       crit_enter();
-
-       if (sc->wi_gone) {
-               crit_exit();
+       if (sc->wi_gone)
                return;
-       }
 
-       if (ifp->if_flags & IFF_OACTIVE) {
-               crit_exit();
+       if (ifp->if_flags & IFF_OACTIVE)
                return;
-       }
 
 nextpkt:
        m0 = ifq_dequeue(&ifp->if_snd, NULL);
-       if (m0 == NULL) {
-               crit_exit();
+       if (m0 == NULL)
                return;
-       }
 
        bzero((char *)&tx_frame, sizeof(tx_frame));
        tx_frame.wi_frame_ctl = htole16(WI_FTYPE_DATA);
@@ -2338,8 +2316,6 @@ nextpkt:
         * Set a timeout in case the chip goes out to lunch.
         */
        ifp->if_timer = 5;
-
-       crit_exit();
 }
 
 int
@@ -2387,12 +2363,8 @@ wi_stop(sc)
 {
        struct ifnet            *ifp;
 
-       crit_enter();
-
-       if (sc->wi_gone) {
-               crit_exit();
+       if (sc->wi_gone)
                return;
-       }
 
        owihap_shutdown(sc);
 
@@ -2411,8 +2383,6 @@ wi_stop(sc)
        callout_stop(&sc->wi_stat_timer);
 
        ifp->if_flags &= ~(IFF_RUNNING|IFF_OACTIVE);
-
-       crit_exit();
 }
 
 static void
@@ -2510,12 +2480,14 @@ void
 owi_shutdown(dev)
        device_t                dev;
 {
-       struct wi_softc         *sc;
+       struct wi_softc *sc;
+       struct ifnet *ifp;
 
        sc = device_get_softc(dev);
+       ifp = &sc->arpcom.ac_if;
+       lwkt_serialize_enter(ifp->if_serializer);
        wi_stop(sc);
-
-       return;
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 #ifdef WICACHE
index e073aef..86ec54c 100644 (file)
@@ -31,7 +31,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_pcn.c,v 1.5.2.10 2003/03/05 18:42:33 njl Exp $
- * $DragonFly: src/sys/dev/netif/pcn/if_pcn.c,v 1.25 2005/11/22 00:24:33 dillon Exp $
+ * $DragonFly: src/sys/dev/netif/pcn/if_pcn.c,v 1.26 2005/11/28 17:13:43 dillon Exp $
  */
 
 /*
@@ -63,6 +63,7 @@
 #include <sys/malloc.h>
 #include <sys/kernel.h>
 #include <sys/socket.h>
+#include <sys/serialize.h>
 #include <sys/thread2.h>
 
 #include <net/if.h>
@@ -129,8 +130,8 @@ static int pcn_ioctl                (struct ifnet *, u_long, caddr_t,
                                        struct ucred *);
 static void pcn_init           (void *);
 static void pcn_stop           (struct pcn_softc *);
-static void pcn_watchdog               (struct ifnet *);
-static void pcn_shutdown               (device_t);
+static void pcn_watchdog       (struct ifnet *);
+static void pcn_shutdown       (device_t);
 static int pcn_ifmedia_upd     (struct ifnet *);
 static void pcn_ifmedia_sts    (struct ifnet *, struct ifmediareq *);
 
@@ -619,10 +620,11 @@ static int pcn_attach(dev)
        /*
         * Call MI attach routine.
         */
-       ether_ifattach(ifp, eaddr);
+       ether_ifattach(ifp, eaddr, NULL);
 
-       error = bus_setup_intr(dev, sc->pcn_irq, 0,
-                              pcn_intr, sc, &sc->pcn_intrhand, NULL);
+       error = bus_setup_intr(dev, sc->pcn_irq, INTR_NETSAFE,
+                              pcn_intr, sc, &sc->pcn_intrhand, 
+                              ifp->if_serializer);
        if (error) {
                ether_ifdetach(ifp);
                device_printf(dev, "couldn't set up irq\n");
@@ -640,7 +642,7 @@ static int pcn_detach(dev)
        struct pcn_softc *sc = device_get_softc(dev);
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        if (device_is_attached(dev)) {
                pcn_reset(sc);
@@ -655,8 +657,6 @@ static int pcn_detach(dev)
        if (sc->pcn_intrhand)
                bus_teardown_intr(dev, sc->pcn_irq, sc->pcn_intrhand);
 
-       crit_enter();
-
        if (sc->pcn_irq)
                bus_release_resource(dev, SYS_RES_IRQ, 0, sc->pcn_irq);
        if (sc->pcn_res)
@@ -666,6 +666,7 @@ static int pcn_detach(dev)
                contigfree(sc->pcn_ldata, sizeof(struct pcn_list_data),
                           M_DEVBUF);
        }
+       lwkt_serialize_exit(ifp->if_serializer);
 
        return(0);
 }
@@ -809,7 +810,7 @@ static void pcn_rxeof(sc)
                    cur_rx->pcn_rxlen - ETHER_CRC_LEN;
                m->m_pkthdr.rcvif = ifp;
 
-               (*ifp->if_input)(ifp, m);
+               ifp->if_input(ifp, m);
        }
 
        sc->pcn_cdata.pcn_rx_prod = i;
@@ -886,7 +887,7 @@ static void pcn_tick(xsc)
        struct mii_data *mii;
        struct ifnet *ifp = &sc->arpcom.ac_if;
 
-       crit_enter();
+       lwkt_serialize_enter(ifp->if_serializer);
 
        mii = device_get_softc(sc->pcn_miibus);
        mii_tick(mii);
@@ -902,10 +903,9 @@ static void pcn_tick(xsc)
                        if (!ifq_is_empty(&ifp->if_snd))
                                pcn_start(ifp);
        }
-
        callout_reset(&sc->pcn_stat_timer, hz, pcn_tick, sc);
 
-       crit_exit();
+       lwkt_serialize_exit(ifp->if_serializer);
 }
 
 static void pcn_intr(arg)
@@ -1084,8 +1084,6 @@ static void pcn_init(xsc)
        struct ifnet            *ifp = &sc->arpcom.ac_if;
        struct mii_data         *mii = NULL;
 
-       crit_enter();
-
        /*
         * Cancel pending I/O and free all RX/TX buffers.
         */
@@ -1108,7 +1106,6 @@ static void pcn_init(xsc)
                    "memory for rx buffers\n", sc->pcn_unit);
                pcn_stop(sc);
 
-               crit_exit();
                return;
        }
 
@@ -1180,8 +1177,6 @@ static void pcn_init(xsc)
        ifp->if_flags &= ~IFF_OACTIVE;
 
        callout_reset(&sc->pcn_stat_timer, hz, pcn_tick, sc);
-
-       crit_exit();
 }
 
 /*
@@ -1239,8 +1234,6 @@ static int pcn_ioctl(ifp, command, data, cr)
        struct mii_data         *mii = NULL;
        int                     error = 0;
 
-       crit_enter();
-
        switch(command) {
        case SIOCSIFFLAGS:
                if (ifp->if_flags & IFF_UP) {
@@ -1287,9 +1280,6 @@ static int pcn_ioctl(ifp, command, data, cr)
                error = ether_ioctl(ifp, command, data);
                break;
        }
-
-       crit_exit();
-
        return(error);
 }
 
@@ -1367,12 +1357,12 @@ static void pcn_stop(sc)
 static void pcn_shutdown(dev)
        device_t                dev;
 {
-       struct pcn_softc        *sc;
-
-       sc = device_get_softc(dev);
+       struct pcn_softc *sc = device_get_softc(dev);
+       struct ifnet *ifp = &sc->arpcom.ac_if;
 
+       lwkt_serialize_enter(ifp->if_serializer);
        pcn_reset(sc);
        pcn_stop(sc);
-
-       return;
+       lwkt_serialize_exit(ifp->if_serializer);
 }
+
index 6bd817b..22cee9f 100644 (file)
@@ -22,7 +22,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/pdq/pdq_ifsubr.c,v 1.11.2.1 2000/08/02 22:39:30 peter Exp $
- * $DragonFly: src/sys/dev/netif/pdq_layer/Attic/pdq_ifsubr.c,v 1.13 2005/06/20 15:10:41 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/pdq_layer/Attic/pdq_ifsubr.c,v 1.14 2005/11/28 17:13:43 dillon Exp $
  *
  */
 
@@ -185,7 +185,7 @@ pdq_os_receive_pdu(