X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/dec883f791d1f4f1b538e198b59fbf12b0363773..78195a764d5e70464a6d4f49bc08332a2a8bb4d0:/sys/dev/netif/rl/if_rl.c diff --git a/sys/dev/netif/rl/if_rl.c b/sys/dev/netif/rl/if_rl.c index c6af965778..fe4fd63e45 100644 --- a/sys/dev/netif/rl/if_rl.c +++ b/sys/dev/netif/rl/if_rl.c @@ -30,7 +30,7 @@ * THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/pci/if_rl.c,v 1.38.2.16 2003/03/05 18:42:33 njl Exp $ - * $DragonFly: src/sys/dev/netif/rl/if_rl.c,v 1.25 2005/06/14 14:19:22 joerg Exp $ + * $DragonFly: src/sys/dev/netif/rl/if_rl.c,v 1.29 2005/11/28 17:13:43 dillon Exp $ */ /* @@ -84,6 +84,8 @@ * to select which interface to use depending on the chip type. */ +#include "opt_polling.h" + #include #include #include @@ -93,6 +95,7 @@ #include #include #include +#include #include #include @@ -415,8 +418,6 @@ rl_mii_readreg(struct rl_softc *sc, struct rl_mii_frame *frame) { int ack, i; - crit_enter(); - /* * Set up frame for RX. */ @@ -488,8 +489,6 @@ rl_mii_readreg(struct rl_softc *sc, struct rl_mii_frame *frame) MII_SET(RL_MII_CLK); DELAY(1); - crit_exit(); - return(ack ? 1 : 0); } @@ -499,8 +498,6 @@ rl_mii_readreg(struct rl_softc *sc, struct rl_mii_frame *frame) static int rl_mii_writereg(struct rl_softc *sc, struct rl_mii_frame *frame) { - crit_enter(); - /* * Set up frame for TX. */ @@ -533,8 +530,6 @@ rl_mii_writereg(struct rl_softc *sc, struct rl_mii_frame *frame) */ MII_CLR(RL_MII_DIR); - crit_exit(); - return(0); } @@ -932,10 +927,10 @@ rl_attach(device_t dev) /* * Call MI attach routine. */ - ether_ifattach(ifp, eaddr); + ether_ifattach(ifp, eaddr, NULL); - error = bus_setup_intr(dev, sc->rl_irq, INTR_TYPE_NET, rl_intr, - sc, &sc->rl_intrhand, NULL); + error = bus_setup_intr(dev, sc->rl_irq, INTR_NETSAFE, rl_intr, + sc, &sc->rl_intrhand, ifp->if_serializer); if (error) { device_printf(dev, "couldn't set up irq\n"); @@ -959,7 +954,7 @@ rl_detach(device_t dev) sc = device_get_softc(dev); ifp = &sc->arpcom.ac_if; - crit_enter(); + lwkt_serialize_enter(ifp->if_serializer); if (device_is_attached(dev)) { rl_stop(sc); @@ -973,8 +968,6 @@ rl_detach(device_t dev) if (sc->rl_intrhand) bus_teardown_intr(dev, sc->rl_irq, sc->rl_intrhand); - crit_exit(); - if (sc->rl_irq) bus_release_resource(dev, SYS_RES_IRQ, 0, sc->rl_irq); if (sc->rl_res) @@ -990,6 +983,8 @@ rl_detach(device_t dev) if (sc->rl_parent_tag) bus_dma_tag_destroy(sc->rl_parent_tag); + lwkt_serialize_exit(ifp->if_serializer); + return(0); } @@ -1159,7 +1154,7 @@ rl_rxeof(struct rl_softc *sc) ifp->if_ipackets++; - (*ifp->if_input)(ifp, m); + ifp->if_input(ifp, m); } } @@ -1223,14 +1218,14 @@ rl_tick(void *xsc) struct rl_softc *sc = xsc; struct mii_data *mii; - crit_enter(); + lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer); mii = device_get_softc(sc->rl_miibus); mii_tick(mii); callout_reset(&sc->rl_stat_timer, hz, rl_tick, sc); - crit_exit(); + lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer); } #ifdef DEVICE_POLLING @@ -1380,7 +1375,7 @@ rl_start(struct ifnet *ifp) sc = ifp->if_softc; while(RL_CUR_TXMBUF(sc) == NULL) { - m_head = ifq_dequeue(&ifp->if_snd); + m_head = ifq_dequeue(&ifp->if_snd, NULL); if (m_head == NULL) break; @@ -1432,8 +1427,6 @@ rl_init(void *xsc) struct mii_data *mii; uint32_t rxcfg = 0; - crit_enter(); - mii = device_get_softc(sc->rl_miibus); /* @@ -1533,8 +1526,6 @@ rl_init(void *xsc) ifp->if_flags &= ~IFF_OACTIVE; callout_reset(&sc->rl_stat_timer, hz, rl_tick, sc); - - crit_exit(); } /* @@ -1575,8 +1566,6 @@ rl_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) { @@ -1604,8 +1593,6 @@ rl_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr) break; } - crit_exit(); - return(error); } @@ -1616,7 +1603,7 @@ rl_watchdog(struct ifnet *ifp) device_printf(sc->rl_dev, "watchdog timeout\n"); - crit_enter(); + lwkt_serialize_enter(ifp->if_serializer); ifp->if_oerrors++; @@ -1624,7 +1611,7 @@ rl_watchdog(struct ifnet *ifp) rl_rxeof(sc); rl_init(sc); - crit_exit(); + lwkt_serialize_exit(ifp->if_serializer); } /* @@ -1673,8 +1660,9 @@ rl_shutdown(device_t dev) struct rl_softc *sc; sc = device_get_softc(dev); - + lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer); rl_stop(sc); + lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer); } /* @@ -1688,6 +1676,7 @@ rl_suspend(device_t dev) struct rl_softc *sc = device_get_softc(dev); int i; + lwkt_serialize_enter(sc->arpcom.ac_if.if_serializer); rl_stop(sc); for (i = 0; i < 5; i++) @@ -1699,6 +1688,7 @@ rl_suspend(device_t dev) sc->suspended = 1; + lwkt_serialize_exit(sc->arpcom.ac_if.if_serializer); return (0); } @@ -1713,6 +1703,8 @@ static int rl_resume(device_t dev) struct ifnet *ifp = &sc->arpcom.ac_if; int i; + lwkt_serialize_enter(ifp->if_serializer); + /* better way to do this? */ for (i = 0; i < 5; i++) pci_write_config(dev, PCIR_BAR(i), sc->saved_maps[i], 4); @@ -1730,6 +1722,6 @@ static int rl_resume(device_t dev) rl_init(sc); sc->suspended = 0; - + lwkt_serialize_exit(ifp->if_serializer); return (0); }