diff --git a/sys/dev/usb/if_atu.c b/sys/dev/usb/if_atu.c index 4a806d7..91912f7 100644 --- a/sys/dev/usb/if_atu.c +++ b/sys/dev/usb/if_atu.c @@ -1452,9 +1452,8 @@ atu_complete_attach(struct atu_softc *sc) IFQ_SET_READY(&ifp->if_snd); /* Call MI attach routine. */ - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); sc->sc_newstate = ic->ic_newstate; ic->ic_newstate = atu_newstate; diff --git a/sys/dev/usb/if_aue.c b/sys/dev/usb/if_aue.c index c8ff1d1..76face1 100644 --- a/sys/dev/usb/if_aue.c +++ b/sys/dev/usb/if_aue.c @@ -856,9 +856,8 @@ aue_attach(device_t parent, device_t self, void *aux) ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); /* Attach the interface. */ - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, eaddr); - if_register(ifp); rnd_attach_source(&sc->rnd_source, device_xname(sc->aue_dev), RND_TYPE_NET, RND_FLAG_DEFAULT); diff --git a/sys/dev/usb/if_axe.c b/sys/dev/usb/if_axe.c index 3ee9fbf..5698259 100644 --- a/sys/dev/usb/if_axe.c +++ b/sys/dev/usb/if_axe.c @@ -840,9 +840,8 @@ axe_attach(device_t parent, device_t self, void *aux) ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); /* Attach the interface. */ - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, eaddr); - if_register(ifp); rnd_attach_source(&sc->rnd_source, device_xname(sc->axe_dev), RND_TYPE_NET, RND_FLAG_DEFAULT); diff --git a/sys/dev/usb/if_axen.c b/sys/dev/usb/if_axen.c index 110f35e..8d1e216 100644 --- a/sys/dev/usb/if_axen.c +++ b/sys/dev/usb/if_axen.c @@ -791,9 +791,8 @@ axen_attach(device_t parent, device_t self, void *aux) ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); /* Attach the interface. */ - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, eaddr); - if_register(ifp); rnd_attach_source(&sc->rnd_source, device_xname(sc->axen_dev), RND_TYPE_NET, RND_FLAG_DEFAULT); diff --git a/sys/dev/usb/if_cdce.c b/sys/dev/usb/if_cdce.c index b45edaf..45cc622 100644 --- a/sys/dev/usb/if_cdce.c +++ b/sys/dev/usb/if_cdce.c @@ -285,9 +285,8 @@ cdce_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, eaddr); - if_register(ifp); sc->cdce_attached = 1; splx(s); diff --git a/sys/dev/usb/if_cue.c b/sys/dev/usb/if_cue.c index 7142b88..58d3c5f 100644 --- a/sys/dev/usb/if_cue.c +++ b/sys/dev/usb/if_cue.c @@ -547,9 +547,8 @@ cue_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); /* Attach the interface. */ - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, eaddr); - if_register(ifp); rnd_attach_source(&sc->rnd_source, device_xname(sc->cue_dev), RND_TYPE_NET, RND_FLAG_DEFAULT); diff --git a/sys/dev/usb/if_kue.c b/sys/dev/usb/if_kue.c index 946b805..77b8ceb 100644 --- a/sys/dev/usb/if_kue.c +++ b/sys/dev/usb/if_kue.c @@ -504,9 +504,8 @@ kue_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); /* Attach the interface. */ - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, sc->kue_desc.kue_macaddr); - if_register(ifp); rnd_attach_source(&sc->rnd_source, device_xname(sc->kue_dev), RND_TYPE_NET, RND_FLAG_DEFAULT); diff --git a/sys/dev/usb/if_otus.c b/sys/dev/usb/if_otus.c index f95f618..302353d 100644 --- a/sys/dev/usb/if_otus.c +++ b/sys/dev/usb/if_otus.c @@ -850,9 +850,8 @@ otus_attachhook(device_t arg) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); ic->ic_node_alloc = otus_node_alloc; ic->ic_newassoc = otus_newassoc; diff --git a/sys/dev/usb/if_rum.c b/sys/dev/usb/if_rum.c index 30f6830..49158c4 100644 --- a/sys/dev/usb/if_rum.c +++ b/sys/dev/usb/if_rum.c @@ -457,9 +457,8 @@ rum_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); ic->ic_newassoc = rum_newassoc; /* override state transition machine */ diff --git a/sys/dev/usb/if_run.c b/sys/dev/usb/if_run.c index fc77bfa..d3f3bcb 100644 --- a/sys/dev/usb/if_run.c +++ b/sys/dev/usb/if_run.c @@ -632,9 +632,8 @@ run_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); ic->ic_node_alloc = run_node_alloc; ic->ic_newassoc = run_newassoc; ic->ic_updateslot = run_updateslot; diff --git a/sys/dev/usb/if_smsc.c b/sys/dev/usb/if_smsc.c index 63cb924..314d0bd 100644 --- a/sys/dev/usb/if_smsc.c +++ b/sys/dev/usb/if_smsc.c @@ -1113,9 +1113,8 @@ smsc_attach(device_t parent, device_t self, void *aux) } else ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, sc->sc_enaddr); - if_register(ifp); rnd_attach_source(&sc->sc_rnd_source, device_xname(sc->sc_dev), RND_TYPE_NET, RND_FLAG_DEFAULT); diff --git a/sys/dev/usb/if_udav.c b/sys/dev/usb/if_udav.c index 8c46689..e707021 100644 --- a/sys/dev/usb/if_udav.c +++ b/sys/dev/usb/if_udav.c @@ -315,9 +315,8 @@ udav_attach(device_t parent, device_t self, void *aux) skipmii: /* attach the interface */ - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, eaddr); - if_register(ifp); rnd_attach_source(&sc->rnd_source, device_xname(self), RND_TYPE_NET, RND_FLAG_DEFAULT); diff --git a/sys/dev/usb/if_upgt.c b/sys/dev/usb/if_upgt.c index 00c7c66..957f18a 100644 --- a/sys/dev/usb/if_upgt.c +++ b/sys/dev/usb/if_upgt.c @@ -449,9 +449,8 @@ upgt_attach_hook(device_t arg) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); ic->ic_newassoc = upgt_newassoc; sc->sc_newstate = ic->ic_newstate; diff --git a/sys/dev/usb/if_upl.c b/sys/dev/usb/if_upl.c index f659b61..bfe2f02 100644 --- a/sys/dev/usb/if_upl.c +++ b/sys/dev/usb/if_upl.c @@ -306,9 +306,8 @@ upl_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); /* Attach the interface. */ - if_initialize(ifp); + if_attach(ifp); if_register(ifp); - if_alloc_sadl(ifp); bpf_attach(ifp, DLT_RAW, 0); rnd_attach_source(&sc->sc_rnd_source, device_xname(sc->sc_dev), diff --git a/sys/dev/usb/if_ural.c b/sys/dev/usb/if_ural.c index 1476a31..be57979 100644 --- a/sys/dev/usb/if_ural.c +++ b/sys/dev/usb/if_ural.c @@ -499,9 +499,8 @@ ural_attach(device_t parent, device_t self, void *aux) IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; } - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); ic->ic_reset = ural_reset; /* override state transition machine */ diff --git a/sys/dev/usb/if_url.c b/sys/dev/usb/if_url.c index 57eae41..1d54c5b 100644 --- a/sys/dev/usb/if_url.c +++ b/sys/dev/usb/if_url.c @@ -311,9 +311,8 @@ url_attach(device_t parent, device_t self, void *aux) ifmedia_set(&mii->mii_media, IFM_ETHER | IFM_AUTO); /* attach the interface */ - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, eaddr); - if_register(ifp); rnd_attach_source(&sc->rnd_source, device_xname(self), RND_TYPE_NET, RND_FLAG_DEFAULT); diff --git a/sys/dev/usb/if_urndis.c b/sys/dev/usb/if_urndis.c index 5880bcb..5448fef 100644 --- a/sys/dev/usb/if_urndis.c +++ b/sys/dev/usb/if_urndis.c @@ -1490,9 +1490,8 @@ urndis_attach(device_t parent, device_t self, void *aux) return; } - if_initialize(ifp); + if_attach(ifp); ether_ifattach(ifp, eaddr); - if_register(ifp); sc->sc_attached = 1; splx(s); diff --git a/sys/dev/usb/if_urtw.c b/sys/dev/usb/if_urtw.c index 9a71ac4..e6b1136 100644 --- a/sys/dev/usb/if_urtw.c +++ b/sys/dev/usb/if_urtw.c @@ -729,9 +729,8 @@ urtw_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ); - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); /* override state transition machine */ sc->sc_newstate = ic->ic_newstate; diff --git a/sys/dev/usb/if_urtwn.c b/sys/dev/usb/if_urtwn.c index 75cb9b0..2294a92 100644 --- a/sys/dev/usb/if_urtwn.c +++ b/sys/dev/usb/if_urtwn.c @@ -439,9 +439,8 @@ urtwn_attach(device_t parent, device_t self, void *aux) IFQ_SET_READY(&ifp->if_snd); memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); /* override default methods */ ic->ic_newassoc = urtwn_newassoc; diff --git a/sys/dev/usb/if_zyd.c b/sys/dev/usb/if_zyd.c index 36072b6..913dd41 100644 --- a/sys/dev/usb/if_zyd.c +++ b/sys/dev/usb/if_zyd.c @@ -426,9 +426,8 @@ zyd_complete_attach(struct zyd_softc *sc) IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; } - if_initialize(ifp); + if_attach(ifp); ieee80211_ifattach(ic); - if_register(ifp); ic->ic_node_alloc = zyd_node_alloc; ic->ic_newassoc = zyd_newassoc; diff --git a/sys/net/if.c b/sys/net/if.c index 506331c..89011f8 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -649,18 +649,34 @@ if_register(ifnet_t *ifp) TAILQ_INSERT_TAIL(&ifnet_list, ifp, if_list); } +/* + * The if_percpuq framework + * + * It allows network device drivers to execute the network stack + * in softint (so called softint-based if_input). It utilizes + * softint and percpu ifqueue. It doesn't distribute any packets + * between CPUs, unlike pktqueue(9). + * + * Currently we support two options for device drivers to apply the framework: + * - Use it implicitly with less changes + * - If you use if_attach in driver's _attach function and if_input in + * driver's Rx interrupt handler, a packet is queued and a softint handles + * the packet implicitly + * - Use it explicitly in each driver (recommended) + * - You can use if_percpuq_* directly in your driver + * - In this case, you need to allocate struct if_percpuq in driver's softc + * - See wm(4) as a reference implementation + */ + static void if_percpuq_softint(void *arg) { struct if_percpuq *ipq = arg; struct ifnet *ifp = ipq->ipq_ifp; struct mbuf *m; - int s; - s = splnet(); while ((m = if_percpuq_dequeue(ipq)) != NULL) ifp->_if_input(ifp, m); - splx(s); } static void @@ -695,10 +711,13 @@ if_percpuq_dequeue(struct if_percpuq *ipq) { struct mbuf *m; struct ifqueue *ifq; + int s; + s = splnet(); ifq = percpu_getref(ipq->ipq_ifqs); IF_DEQUEUE(ifq, m); percpu_putref(ipq->ipq_ifqs); + splx(s); return m; } @@ -759,8 +778,12 @@ if_input(struct ifnet *ifp, struct mbuf *m) } /* - * Deprecated. Use if_initialize and if_register instead. + * DEPRECATED. Use if_initialize and if_register instead. * See the above comment of if_initialize. + * + * Note that it implicitly enables if_percpuq to make drivers easy to + * migrate softinet-based if_input without much changes. If you don't + * want to enable it, use if_initialize instead. */ void if_attach(ifnet_t *ifp)