if: Add if_devstart_sched to schedule ifnet.if_start call
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 3 Jan 2013 12:03:50 +0000 (20:03 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Thu, 3 Jan 2013 12:06:23 +0000 (20:06 +0800)
Mainly to hide ifnet.if_start_nmsg from drivers, avoid code duplication
and ease upcoming multiple tx queues work.

sys/dev/netif/aue/if_aue.c
sys/dev/netif/lgue/if_lgue.c
sys/net/if.c
sys/net/if_var.h

index baf5be6..4f75f11 100644 (file)
@@ -966,30 +966,6 @@ done:
        usbd_transfer(xfer);
 }
 
-static void
-aue_start_ipifunc(void *arg)
-{
-       struct ifnet *ifp = arg;
-       struct lwkt_msg *lmsg = &ifp->if_start_nmsg[mycpuid].lmsg;
-
-       crit_enter();
-       if (lmsg->ms_flags & MSGF_DONE)
-               lwkt_sendmsg(netisr_portfn(mycpuid), lmsg);
-       crit_exit();
-}
-
-static void
-aue_start_schedule(struct ifnet *ifp)
-{
-        int cpu;
-
-       cpu = ifp->if_start_cpuid(ifp);
-       if (cpu != mycpuid)
-               lwkt_send_ipiq(globaldata_find(cpu), aue_start_ipifunc, ifp);
-       else
-               aue_start_ipifunc(ifp);
-}
-
 /*
  * A frame was downloaded to the chip. It's safe for us to clean up
  * the list buffers.
@@ -1024,7 +1000,7 @@ aue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
        ifq_clr_oactive(&ifp->if_snd);
 
        if (!ifq_is_empty(&ifp->if_snd))
-               aue_start_schedule(ifp);
+               if_devstart_sched(ifp);
 }
 
 static void
@@ -1052,7 +1028,7 @@ aue_tick(void *xsc)
            IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) {
                sc->aue_link++;
                if (!ifq_is_empty(&ifp->if_snd))
-                       aue_start_schedule(ifp);
+                       if_devstart_sched(ifp);
        }
 
        callout_reset(&sc->aue_stat_timer, hz, aue_tick, sc);
index 3a94b09..0721cc7 100644 (file)
@@ -58,9 +58,6 @@ static int lgue_start_transfer(struct lgue_softc *);
 
 static void lgue_txeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
 
-static void lgue_start_ipifunc(void *);
-static void lgue_start_schedule(struct ifnet *);
-
 static int lgue_newbuf(struct lgue_softc *, int, struct mbuf **);
 static void lgue_rxstart(struct ifnet *);
 static void lgue_rxeof(usbd_xfer_handle, usbd_private_handle, usbd_status);
@@ -456,38 +453,6 @@ lgue_start_transfer(struct lgue_softc *sc) {
        return(0);
 }
 
-/*
- * Start call
- */
-static void
-lgue_start_ipifunc(void *arg)
-{
-       struct ifnet *ifp;
-       struct lwkt_msg *lmsg;
-
-       ifp = arg;
-       lmsg = &ifp->if_start_nmsg[mycpuid].lmsg;
-       crit_enter();
-       if (lmsg->ms_flags & MSGF_DONE)
-               lwkt_sendmsg(netisr_portfn(mycpuid), lmsg);
-       crit_exit();
-}
-
-/*
- * Schedule start call
- */
-static void
-lgue_start_schedule(struct ifnet *ifp)
-{
-       int cpu;
-
-       cpu = ifp->if_start_cpuid(ifp);
-       if (cpu != mycpuid)
-               lwkt_send_ipiq(globaldata_find(cpu), lgue_start_ipifunc, ifp);
-       else
-               lgue_start_ipifunc(ifp);
-}
-
 /*
  * End of sending
  */
@@ -518,7 +483,7 @@ lgue_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
                ifp->if_opackets++;
 
        if (!STAILQ_EMPTY(&sc->lgue_tx_queue)) {
-               lgue_start_schedule(ifp);
+               if_devstart_sched(ifp);
        }
 
        ifp->if_timer = 0;
@@ -881,7 +846,7 @@ lgue_watchdog(struct ifnet *ifp)
        ifp->if_oerrors++;
 
        if (!ifq_is_empty(&ifp->if_snd))
-               lgue_start_schedule(ifp);
+               if_devstart_sched(ifp);
 }
 
 /*
index 0c5cee1..4093179 100644 (file)
@@ -407,6 +407,13 @@ if_devstart(struct ifnet *ifp)
        }
 }
 
+/* Device driver ifnet.if_start schedule helper function */
+void
+if_devstart_sched(struct ifnet *ifp)
+{
+       ifq_ifstart_schedule(&ifp->if_snd, 1);
+}
+
 static void
 if_default_serialize(struct ifnet *ifp, enum ifnet_serialize slz __unused)
 {
index fe39ba5..031d547 100644 (file)
@@ -850,6 +850,7 @@ struct ifaddr *ifaddr_byindex(unsigned short);
 struct ifmultiaddr *ifmaof_ifpforaddr(struct sockaddr *, struct ifnet *);
 int    if_simloop(struct ifnet *ifp, struct mbuf *m, int af, int hlen);
 void   if_devstart(struct ifnet *ifp);
+void   if_devstart_sched(struct ifnet *ifp);
 int    if_ring_count2(int cnt, int cnt_max);
 
 #define IF_LLSOCKADDR(ifp)                                             \