Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Apr 2009 04:23:11 +0000 (UTC)
From:      Andrew Thompson <thompsa@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r191194 - user/thompsa/vaptq/sys/dev/usb/wlan
Message-ID:  <200904170423.n3H4NBZt008376@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: thompsa
Date: Fri Apr 17 04:23:11 2009
New Revision: 191194
URL: http://svn.freebsd.org/changeset/base/191194

Log:
  Convert the usb drivers over to the vap taskqueue system
   - remove usb2_proc_*
   - remove the deferral of scanning/state callbacks
   - remove deferred attach/init/stop
  
  The switch off async operation of the drivers is a huge win in complexity, race
  conditions and reduced code size.

Modified:
  user/thompsa/vaptq/sys/dev/usb/wlan/if_rum.c
  user/thompsa/vaptq/sys/dev/usb/wlan/if_rumvar.h
  user/thompsa/vaptq/sys/dev/usb/wlan/if_uath.c
  user/thompsa/vaptq/sys/dev/usb/wlan/if_ural.c
  user/thompsa/vaptq/sys/dev/usb/wlan/if_uralvar.h
  user/thompsa/vaptq/sys/dev/usb/wlan/if_zyd.c
  user/thompsa/vaptq/sys/dev/usb/wlan/if_zydreg.h

Modified: user/thompsa/vaptq/sys/dev/usb/wlan/if_rum.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/usb/wlan/if_rum.c	Fri Apr 17 04:07:56 2009	(r191193)
+++ user/thompsa/vaptq/sys/dev/usb/wlan/if_rum.c	Fri Apr 17 04:23:11 2009	(r191194)
@@ -40,6 +40,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kdb.h>
+#include <sys/taskqueue.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -72,7 +73,6 @@ __FBSDID("$FreeBSD$");
 #include <dev/usb/usb_error.h>
 #include <dev/usb/usb_core.h>
 #include <dev/usb/usb_lookup.h>
-#include <dev/usb/usb_process.h>
 #include <dev/usb/usb_debug.h>
 #include <dev/usb/usb_request.h>
 #include <dev/usb/usb_busdma.h>
@@ -153,16 +153,6 @@ static device_detach_t rum_detach;
 static usb2_callback_t rum_bulk_read_callback;
 static usb2_callback_t rum_bulk_write_callback;
 
-static usb2_proc_callback_t rum_command_wrapper;
-static usb2_proc_callback_t rum_attach_post;
-static usb2_proc_callback_t rum_task;
-static usb2_proc_callback_t rum_scantask;
-static usb2_proc_callback_t rum_promisctask;
-static usb2_proc_callback_t rum_amrr_task;
-static usb2_proc_callback_t rum_init_task;
-static usb2_proc_callback_t rum_stop_task;
-static usb2_proc_callback_t rum_flush_task;
-
 static usb2_error_t	rum_do_request(struct rum_softc *sc,
 			    struct usb2_device_request *req, void *data);
 static struct ieee80211vap *rum_vap_create(struct ieee80211com *,
@@ -211,10 +201,13 @@ static void		rum_update_slot(struct ifne
 static void		rum_set_bssid(struct rum_softc *, const uint8_t *);
 static void		rum_set_macaddr(struct rum_softc *, const uint8_t *);
 static void		rum_update_promisc(struct ifnet *);
+static void		rum_setpromisc(struct rum_softc *);
 static const char	*rum_get_rf(int);
 static void		rum_read_eeprom(struct rum_softc *);
 static int		rum_bbp_init(struct rum_softc *);
+static void		rum_init_locked(struct rum_softc *);
 static void		rum_init(void *);
+static void		rum_stop(struct rum_softc *);
 static void		rum_load_microcode(struct rum_softc *, const uint8_t *,
 			    size_t);
 static int		rum_prepare_beacon(struct rum_softc *,
@@ -231,10 +224,8 @@ static int		rum_get_rssi(struct rum_soft
 static void		rum_amrr_start(struct rum_softc *,
 			    struct ieee80211_node *);
 static void		rum_amrr_timeout(void *);
+static void		rum_amrr_task(void *, int);
 static int		rum_pause(struct rum_softc *, int);
-static void		rum_queue_command(struct rum_softc *,
-			    usb2_proc_callback_t *, struct usb2_proc_msg *,
-			    struct usb2_proc_msg *);
 
 static const struct {
 	uint32_t	reg;
@@ -435,8 +426,11 @@ rum_attach(device_t self)
 {
 	struct usb2_attach_arg *uaa = device_get_ivars(self);
 	struct rum_softc *sc = device_get_softc(self);
-	uint8_t iface_index;
-	int error;
+	struct ieee80211com *ic;
+	struct ifnet *ifp;
+	uint8_t iface_index, bands;
+	uint32_t tmp;
+	int error, ntries;
 
 	device_set_usb2_desc(self);
 	sc->sc_udev = uaa->device;
@@ -445,8 +439,6 @@ rum_attach(device_t self)
 	mtx_init(&sc->sc_mtx, device_get_nameunit(self),
 	    MTX_NETWORK_LOCK, MTX_DEF);
 
-	cv_init(&sc->sc_cmd_cv, "wtxdone");
-
 	iface_index = RT2573_IFACE_INDEX;
 	error = usb2_transfer_setup(uaa->device, &iface_index,
 	    sc->sc_xfer, rum_config, RUM_N_TRANSFER, sc, &sc->sc_mtx);
@@ -455,37 +447,8 @@ rum_attach(device_t self)
 		    "err=%s\n", usb2_errstr(error));
 		goto detach;
 	}
-	error = usb2_proc_create(&sc->sc_tq, &sc->sc_mtx,
-	    device_get_nameunit(self), USB_PRI_MED);
-	if (error) {
-		device_printf(self, "could not setup config thread!\n");
-		goto detach;
-	}
 
-	/* fork rest of the attach code */
 	RUM_LOCK(sc);
-	rum_queue_command(sc, rum_attach_post,
-	    &sc->sc_synctask[0].hdr,
-	    &sc->sc_synctask[1].hdr);
-	RUM_UNLOCK(sc);
-	return (0);
-
-detach:
-	rum_detach(self);
-	return (ENXIO);			/* failure */
-}
-
-static void
-rum_attach_post(struct usb2_proc_msg *pm)
-{
-	struct rum_task *task = (struct rum_task *)pm;
-	struct rum_softc *sc = task->sc;
-	struct ifnet *ifp;
-	struct ieee80211com *ic;
-	unsigned int ntries;
-	uint32_t tmp;
-	uint8_t bands;
-
 	/* retrieve RT2573 rev. no */
 	for (ntries = 0; ntries < 100; ntries++) {
 		if ((tmp = rum_read(sc, RT2573_MAC_CSR0)) != 0)
@@ -495,7 +458,8 @@ rum_attach_post(struct usb2_proc_msg *pm
 	}
 	if (ntries == 100) {
 		device_printf(sc->sc_dev, "timeout waiting for chip to settle\n");
-		return;
+		RUM_UNLOCK(sc);
+		goto detach;
 	}
 
 	/* retrieve MAC address and various other things from EEPROM */
@@ -505,18 +469,12 @@ rum_attach_post(struct usb2_proc_msg *pm
 	    tmp, rum_get_rf(sc->rf_rev));
 
 	rum_load_microcode(sc, rt2573_ucode, sizeof(rt2573_ucode));
-
-	/* XXX Async attach race */
-	if (usb2_proc_is_gone(&sc->sc_tq))
-		return;
-
 	RUM_UNLOCK(sc);
 
 	ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
 	if (ifp == NULL) {
 		device_printf(sc->sc_dev, "can not if_alloc()\n");
-		RUM_LOCK(sc);
-		return;
+		goto detach;
 	}
 	ic = ifp->if_l2com;
 
@@ -579,7 +537,11 @@ rum_attach_post(struct usb2_proc_msg *pm
 	if (bootverbose)
 		ieee80211_announce(ic);
 
-	RUM_LOCK(sc);
+	return (0);
+
+detach:
+	rum_detach(self);
+	return (ENXIO);			/* failure */
 }
 
 static int
@@ -589,12 +551,8 @@ rum_detach(device_t self)
 	struct ifnet *ifp = sc->sc_ifp;
 	struct ieee80211com *ic;
 
-	/* wait for any post attach or other command to complete */
-	usb2_proc_drain(&sc->sc_tq);
-
 	/* stop all USB transfers */
 	usb2_transfer_unsetup(sc->sc_xfer, RUM_N_TRANSFER);
-	usb2_proc_free(&sc->sc_tq);
 
 	/* free TX list, if any */
 	RUM_LOCK(sc);
@@ -607,7 +565,6 @@ rum_detach(device_t self)
 		ieee80211_ifdetach(ic);
 		if_free(ifp);
 	}
-	cv_destroy(&sc->sc_cmd_cv);
 	mtx_destroy(&sc->sc_mtx);
 
 	return (0);
@@ -621,7 +578,7 @@ rum_do_request(struct rum_softc *sc,
 	int ntries = 10;
 
 	while (ntries--) {
-		err = usb2_do_request_proc(sc->sc_udev, &sc->sc_tq,
+		err = usb2_do_request_flags(sc->sc_udev, &sc->sc_mtx,
 		    req, data, 0, NULL, 250 /* ms */);
 		if (err == 0)
 			break;
@@ -659,8 +616,8 @@ rum_vap_create(struct ieee80211com *ic,
 	rvp->newstate = vap->iv_newstate;
 	vap->iv_newstate = rum_newstate;
 
-	rvp->sc = sc;
 	usb2_callout_init_mtx(&rvp->amrr_ch, &sc->sc_mtx, 0);
+	TASK_INIT(&rvp->amrr_task, 0, rum_amrr_task, rvp);
 	ieee80211_amrr_init(&rvp->amrr, vap,
 	    IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD,
 	    IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD,
@@ -673,25 +630,13 @@ rum_vap_create(struct ieee80211com *ic,
 }
 
 static void
-rum_flush_task(struct usb2_proc_msg *pm)
-{
-	/* Nothing to do */
-}
-
-static void
 rum_vap_delete(struct ieee80211vap *vap)
 {
 	struct rum_vap *rvp = RUM_VAP(vap);
-	struct rum_softc *sc = rvp->sc;
-
-	RUM_LOCK(sc);
-	/* wait for any pending tasks to complete */
-	rum_queue_command(sc, rum_flush_task,
-	    &sc->sc_synctask[0].hdr,
-	    &sc->sc_synctask[1].hdr);
-	RUM_UNLOCK(sc);
+	struct ieee80211com *ic = vap->iv_ic;
 
 	usb2_callout_drain(&rvp->amrr_ch);
+	taskqueue_drain(ic->ic_tq, &rvp->amrr_task);
 	ieee80211_amrr_cleanup(&rvp->amrr);
 	ieee80211_vap_detach(vap);
 	free(rvp, M_80211_VAP);
@@ -761,23 +706,27 @@ rum_unsetup_tx_list(struct rum_softc *sc
 	}
 }
 
-static void
-rum_task(struct usb2_proc_msg *pm)
+static int
+rum_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
 {
-	struct rum_task *task = (struct rum_task *)pm;
-	struct rum_softc *sc = task->sc;
-	struct ifnet *ifp = sc->sc_ifp;
-	struct ieee80211com *ic = ifp->if_l2com;
-	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
 	struct rum_vap *rvp = RUM_VAP(vap);
+	struct ieee80211com *ic = vap->iv_ic;
+	struct rum_softc *sc = ic->ic_ifp->if_softc;
 	const struct ieee80211_txparam *tp;
 	enum ieee80211_state ostate;
 	struct ieee80211_node *ni;
 	uint32_t tmp;
 
 	ostate = vap->iv_state;
+	DPRINTF("%s -> %s\n",
+		ieee80211_state_name[ostate],
+		ieee80211_state_name[nstate]);
 
-	switch (sc->sc_state) {
+	IEEE80211_UNLOCK(ic);
+	RUM_LOCK(sc);
+	usb2_callout_stop(&rvp->amrr_ch);
+
+	switch (nstate) {
 	case IEEE80211_S_INIT:
 		if (ostate == IEEE80211_S_RUN) {
 			/* abort TSF synchronization */
@@ -813,45 +762,9 @@ rum_task(struct usb2_proc_msg *pm)
 	default:
 		break;
 	}
-
 	RUM_UNLOCK(sc);
 	IEEE80211_LOCK(ic);
-	rvp->newstate(vap, sc->sc_state, sc->sc_arg);
-	if (vap->iv_newstate_cb != NULL)
-		vap->iv_newstate_cb(vap, sc->sc_state, sc->sc_arg);
-	IEEE80211_UNLOCK(ic);
-	RUM_LOCK(sc);
-}
-
-static int
-rum_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
-{
-	struct rum_vap *rvp = RUM_VAP(vap);
-	struct ieee80211com *ic = vap->iv_ic;
-	struct rum_softc *sc = ic->ic_ifp->if_softc;
-
-	DPRINTF("%s -> %s\n",
-		ieee80211_state_name[vap->iv_state],
-		ieee80211_state_name[nstate]);
-
-	RUM_LOCK(sc);
-	usb2_callout_stop(&rvp->amrr_ch);
-
-	/* do it in a process context */
-	sc->sc_state = nstate;
-	sc->sc_arg = arg;
-	RUM_UNLOCK(sc);
-
-	if (nstate == IEEE80211_S_INIT) {
-		rvp->newstate(vap, nstate, arg);
-		return 0;
-	} else {
-		RUM_LOCK(sc);
-		rum_queue_command(sc, rum_task, &sc->sc_task[0].hdr,
-		    &sc->sc_task[1].hdr);
-		RUM_UNLOCK(sc);
-		return EINPROGRESS;
-	}
+	return (rvp->newstate(vap, nstate, arg));
 }
 
 static void
@@ -865,10 +778,6 @@ rum_bulk_write_callback(struct usb2_xfer
 	struct mbuf *m;
 	unsigned int len;
 
-	/* wakeup waiting command, if any */
-	if (sc->sc_last_task != NULL)
-		cv_signal(&sc->sc_cmd_cv);
-
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_TRANSFERRED:
 		DPRINTFN(11, "transfer complete, %d bytes\n", xfer->actlen);
@@ -884,10 +793,6 @@ rum_bulk_write_callback(struct usb2_xfer
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
-		/* wait for command to complete, if any */
-		if (sc->sc_last_task != NULL)
-			break;
-
 		data = STAILQ_FIRST(&sc->tx_q);
 		if (data) {
 			STAILQ_REMOVE_HEAD(&sc->tx_q, next);
@@ -1414,20 +1319,13 @@ rum_ioctl(struct ifnet *ifp, u_long cmd,
 		RUM_LOCK(sc);
 		if (ifp->if_flags & IFF_UP) {
 			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
-				rum_queue_command(sc, rum_init_task,
-				    &sc->sc_synctask[0].hdr,
-				    &sc->sc_synctask[1].hdr);
+				rum_init_locked(sc);
 				startall = 1;
 			} else
-				rum_queue_command(sc, rum_promisctask,
-				    &sc->sc_promisctask[0].hdr,
-				    &sc->sc_promisctask[1].hdr);
+				rum_setpromisc(sc);
 		} else {
-			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
-				rum_queue_command(sc, rum_stop_task,
-				    &sc->sc_synctask[0].hdr,
-				    &sc->sc_synctask[1].hdr);
-			}
+			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
+				rum_stop(sc);
 		}
 		RUM_UNLOCK(sc);
 		if (startall)
@@ -1881,10 +1779,8 @@ rum_set_macaddr(struct rum_softc *sc, co
 }
 
 static void
-rum_promisctask(struct usb2_proc_msg *pm)
+rum_setpromisc(struct rum_softc *sc)
 {
-	struct rum_task *task = (struct rum_task *)pm;
-	struct rum_softc *sc = task->sc;
 	struct ifnet *ifp = sc->sc_ifp;
 	uint32_t tmp;
 
@@ -1909,9 +1805,7 @@ rum_update_promisc(struct ifnet *ifp)
 		return;
 
 	RUM_LOCK(sc);
-	rum_queue_command(sc, rum_promisctask,
-	    &sc->sc_promisctask[0].hdr,
-	    &sc->sc_promisctask[1].hdr);
+	rum_setpromisc(sc);
 	RUM_UNLOCK(sc);
 }
 
@@ -2045,11 +1939,9 @@ rum_bbp_init(struct rum_softc *sc)
 }
 
 static void
-rum_init_task(struct usb2_proc_msg *pm)
+rum_init_locked(struct rum_softc *sc)
 {
 #define N(a)	(sizeof (a) / sizeof ((a)[0]))
-	struct rum_task *task = (struct rum_task *)pm;
-	struct rum_softc *sc = task->sc;
 	struct ifnet *ifp = sc->sc_ifp;
 	struct ieee80211com *ic = ifp->if_l2com;
 	uint32_t tmp;
@@ -2058,7 +1950,7 @@ rum_init_task(struct usb2_proc_msg *pm)
 
 	RUM_LOCK_ASSERT(sc, MA_OWNED);
 
-	rum_stop_task(pm);
+	rum_stop(sc);
 
 	/* initialize MAC registers to default values */
 	for (i = 0; i < N(rum_def_mac); i++)
@@ -2123,7 +2015,7 @@ rum_init_task(struct usb2_proc_msg *pm)
 	usb2_transfer_start(sc->sc_xfer[RUM_BULK_RD]);
 	return;
 
-fail:	rum_stop_task(pm);
+fail:	rum_stop(sc);
 #undef N
 }
 
@@ -2135,9 +2027,7 @@ rum_init(void *priv)
 	struct ieee80211com *ic = ifp->if_l2com;
 
 	RUM_LOCK(sc);
-	rum_queue_command(sc, rum_init_task,
-	    &sc->sc_synctask[0].hdr,
-	    &sc->sc_synctask[1].hdr);
+	rum_init_locked(sc);
 	RUM_UNLOCK(sc);
 
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
@@ -2145,10 +2035,8 @@ rum_init(void *priv)
 }
 
 static void
-rum_stop_task(struct usb2_proc_msg *pm)
+rum_stop(struct rum_softc *sc)
 {
-	struct rum_task *task = (struct rum_task *)pm;
-	struct rum_softc *sc = task->sc;
 	struct ifnet *ifp = sc->sc_ifp;
 	uint32_t tmp;
 
@@ -2308,21 +2196,20 @@ static void
 rum_amrr_timeout(void *arg)
 {
 	struct rum_vap *rvp = arg;
-	struct rum_softc *sc = rvp->sc;
+	struct ieee80211vap *vap = &rvp->vap;
+	struct ieee80211com *ic = vap->iv_ic;
 
-	rum_queue_command(sc, rum_amrr_task,
-	    &rvp->amrr_task[0].hdr, &rvp->amrr_task[1].hdr);
+	taskqueue_enqueue(ic->ic_tq, &rvp->amrr_task);
 }
 
 static void
-rum_amrr_task(struct usb2_proc_msg *pm)
+rum_amrr_task(void *arg, int pending)
 {
-	struct rum_task *task = (struct rum_task *)pm;
-	struct rum_softc *sc = task->sc;
-	struct ifnet *ifp = sc->sc_ifp;
-	struct ieee80211com *ic = ifp->if_l2com;
-	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
-	struct rum_vap *rvp = RUM_VAP(vap);
+	struct rum_vap *rvp = arg;
+	struct ieee80211vap *vap = &rvp->vap;
+	struct ieee80211com *ic = vap->iv_ic;
+	struct ifnet *ifp = ic->ic_ifp;
+	struct rum_softc *sc = ifp->if_softc;
 	struct ieee80211_node *ni = vap->iv_bss;
 	int ok, fail;
 
@@ -2364,13 +2251,15 @@ rum_newassoc(struct ieee80211_node *ni, 
 static void
 rum_scan_start(struct ieee80211com *ic)
 {
-	struct rum_softc *sc = ic->ic_ifp->if_softc;
+	struct ifnet *ifp = ic->ic_ifp;
+	struct rum_softc *sc = ifp->if_softc;
+	uint32_t tmp;
 
 	RUM_LOCK(sc);
-	/* do it in a process context */
-	sc->sc_scan_action = RUM_SCAN_START;
-	rum_queue_command(sc, rum_scantask,
-	    &sc->sc_scantask[0].hdr, &sc->sc_scantask[1].hdr);
+	/* abort TSF synchronization */
+	tmp = rum_read(sc, RT2573_TXRX_CSR9);
+	rum_write(sc, RT2573_TXRX_CSR9, tmp & ~0x00ffffff);
+	rum_set_bssid(sc, ifp->if_broadcastaddr);
 	RUM_UNLOCK(sc);
 
 }
@@ -2381,10 +2270,8 @@ rum_scan_end(struct ieee80211com *ic)
 	struct rum_softc *sc = ic->ic_ifp->if_softc;
 
 	RUM_LOCK(sc);
-	/* do it in a process context */
-	sc->sc_scan_action = RUM_SCAN_END;
-	rum_queue_command(sc, rum_scantask,
-	    &sc->sc_scantask[0].hdr, &sc->sc_scantask[1].hdr);
+	rum_enable_tsf_sync(sc);
+	rum_set_bssid(sc, sc->sc_bssid);
 	RUM_UNLOCK(sc);
 
 }
@@ -2395,43 +2282,10 @@ rum_set_channel(struct ieee80211com *ic)
 	struct rum_softc *sc = ic->ic_ifp->if_softc;
 
 	RUM_LOCK(sc);
-	/* do it in a process context */
-	sc->sc_scan_action = RUM_SET_CHANNEL;
-	rum_queue_command(sc, rum_scantask,
-	    &sc->sc_scantask[0].hdr, &sc->sc_scantask[1].hdr);
+	rum_set_chan(sc, ic->ic_curchan);
 	RUM_UNLOCK(sc);
 }
 
-static void
-rum_scantask(struct usb2_proc_msg *pm)
-{
-	struct rum_task *task = (struct rum_task *)pm;
-	struct rum_softc *sc = task->sc;
-	struct ifnet *ifp = sc->sc_ifp;
-	struct ieee80211com *ic = ifp->if_l2com;
-	uint32_t tmp;
-
-	RUM_LOCK_ASSERT(sc, MA_OWNED);
-
-	switch (sc->sc_scan_action) {
-	case RUM_SCAN_START:
-		/* abort TSF synchronization */
-		tmp = rum_read(sc, RT2573_TXRX_CSR9);
-		rum_write(sc, RT2573_TXRX_CSR9, tmp & ~0x00ffffff);
-		rum_set_bssid(sc, ifp->if_broadcastaddr);
-		break;
-
-	case RUM_SET_CHANNEL:
-		rum_set_chan(sc, ic->ic_curchan);
-		break;
-
-	default: /* RUM_SCAN_END */
-		rum_enable_tsf_sync(sc);
-		rum_set_bssid(sc, sc->sc_bssid);
-		break;
-	}
-}
-
 static int
 rum_get_rssi(struct rum_softc *sc, uint8_t raw)
 {
@@ -2482,72 +2336,11 @@ rum_get_rssi(struct rum_softc *sc, uint8
 static int
 rum_pause(struct rum_softc *sc, int timeout)
 {
-	if (usb2_proc_is_gone(&sc->sc_tq))
-		return (1);
 
 	usb2_pause_mtx(&sc->sc_mtx, timeout);
 	return (0);
 }
 
-static void
-rum_command_wrapper(struct usb2_proc_msg *pm)
-{
-	struct rum_task *task = (struct rum_task *)pm;
-	struct rum_softc *sc = task->sc;
-	struct ifnet *ifp;
-
-	/* wait for pending transfer, if any */
-	while (usb2_transfer_pending(sc->sc_xfer[RUM_BULK_WR]))
-		cv_wait(&sc->sc_cmd_cv, &sc->sc_mtx);
-
-	/* make sure any hardware buffers are emptied */
-	rum_pause(sc, hz / 1000);
-
-	/* execute task */
-	task->func(pm);
-
-	/* check if this is the last task executed */
-	if (sc->sc_last_task == task) {
-		sc->sc_last_task = NULL;
-		ifp = sc->sc_ifp;
-		/* re-start TX, if any */
-		if ((ifp != NULL) && (ifp->if_drv_flags & IFF_DRV_RUNNING))
-			usb2_transfer_start(sc->sc_xfer[RUM_BULK_WR]);
-	}
-}
-
-static void
-rum_queue_command(struct rum_softc *sc, usb2_proc_callback_t *fn,
-    struct usb2_proc_msg *t0, struct usb2_proc_msg *t1)
-{
-	struct rum_task *task;
-
-	RUM_LOCK_ASSERT(sc, MA_OWNED);
-
-	/*
-	 * NOTE: The task cannot get executed before we drop the
-	 * "sc_mtx" mutex. It is safe to update fields in the message
-	 * structure after that the message got queued.
-	 */
-	task = (struct rum_task *)
-	  usb2_proc_msignal(&sc->sc_tq, t0, t1);
-
-	/* Setup callback and softc pointers */
-	task->hdr.pm_callback = rum_command_wrapper;
-	task->func = fn;
-	task->sc = sc;
-
-	/* Make sure that any TX operation will stop */
-	sc->sc_last_task = task;
-
-	/*
-	 * Init, stop and flush must be synchronous!
-	 */
-	if ((fn == rum_init_task) || (fn == rum_stop_task) || 
-	    (fn == rum_flush_task))
-		usb2_proc_mwait(&sc->sc_tq, t0, t1);
-}
-
 static device_method_t rum_methods[] = {
 	/* Device interface */
 	DEVMETHOD(device_probe,		rum_match),

Modified: user/thompsa/vaptq/sys/dev/usb/wlan/if_rumvar.h
==============================================================================
--- user/thompsa/vaptq/sys/dev/usb/wlan/if_rumvar.h	Fri Apr 17 04:07:56 2009	(r191193)
+++ user/thompsa/vaptq/sys/dev/usb/wlan/if_rumvar.h	Fri Apr 17 04:23:11 2009	(r191194)
@@ -54,12 +54,6 @@ struct rum_tx_radiotap_header {
 
 struct rum_softc;
 
-struct rum_task {
-	struct usb2_proc_msg	hdr;
-	usb2_proc_callback_t	*func;
-	struct rum_softc	*sc;
-};
-
 struct rum_tx_data {
 	STAILQ_ENTRY(rum_tx_data)	next;
 	struct rum_softc		*sc;
@@ -78,11 +72,10 @@ struct rum_node {
 
 struct rum_vap {
 	struct ieee80211vap		vap;
-	struct rum_softc		*sc;
 	struct ieee80211_beacon_offsets	bo;
 	struct ieee80211_amrr		amrr;
 	struct usb2_callout		amrr_ch;
-	struct rum_task			amrr_task[2];
+	struct task			amrr_task;
 
 	int				(*newstate)(struct ieee80211vap *,
 					    enum ieee80211_state, int);
@@ -99,32 +92,18 @@ struct rum_softc {
 	struct ifnet			*sc_ifp;
 	device_t			sc_dev;
 	struct usb2_device		*sc_udev;
-	struct usb2_process		sc_tq;
 
 	struct usb2_xfer		*sc_xfer[RUM_N_TRANSFER];
-	struct rum_task			*sc_last_task;
 
 	uint8_t				rf_rev;
 	uint8_t				rffreq;
 
-	enum ieee80211_state		sc_state;
-	int				sc_arg;
-	struct rum_task			sc_synctask[2];
-	struct rum_task			sc_task[2];
-	struct rum_task			sc_promisctask[2];
-	struct rum_task			sc_scantask[2];
-	int				sc_scan_action;
-#define RUM_SCAN_START	0
-#define RUM_SCAN_END	1
-#define RUM_SET_CHANNEL	2
-
 	struct rum_tx_data		tx_data[RUM_TX_LIST_COUNT];
 	rum_txdhead			tx_q;
 	rum_txdhead			tx_free;
 	int				tx_nfree;
 	struct rum_rx_desc		sc_rx_desc;
 
-	struct cv			sc_cmd_cv;
 	struct mtx			sc_mtx;
 
 	uint32_t			sta[6];

Modified: user/thompsa/vaptq/sys/dev/usb/wlan/if_uath.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/usb/wlan/if_uath.c	Fri Apr 17 04:07:56 2009	(r191193)
+++ user/thompsa/vaptq/sys/dev/usb/wlan/if_uath.c	Fri Apr 17 04:23:11 2009	(r191194)
@@ -2062,8 +2062,8 @@ uath_newstate(struct ieee80211vap *vap, 
 	    "%s: %s -> %s\n", __func__, ieee80211_state_name[vap->iv_state],
 	    ieee80211_state_name[nstate]);
 
+	IEEE80211_UNLOCK(ic);
 	UATH_LOCK(sc);
-
 	callout_stop(&sc->stat_ch);
 	callout_stop(&sc->watchdog_ch);
 
@@ -2139,14 +2139,8 @@ uath_newstate(struct ieee80211vap *vap, 
 		break;
 	}
 	UATH_UNLOCK(sc);
-
 	IEEE80211_LOCK(ic);
-	uvp->newstate(vap, nstate, arg);
-	if (vap->iv_newstate_cb != NULL)
-		vap->iv_newstate_cb(vap, nstate, arg);
-	IEEE80211_UNLOCK(ic);
-
-	return (0);
+	return (uvp->newstate(vap, nstate, arg));
 }
 
 static int

Modified: user/thompsa/vaptq/sys/dev/usb/wlan/if_ural.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/usb/wlan/if_ural.c	Fri Apr 17 04:07:56 2009	(r191193)
+++ user/thompsa/vaptq/sys/dev/usb/wlan/if_ural.c	Fri Apr 17 04:23:11 2009	(r191194)
@@ -42,6 +42,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/bus.h>
 #include <sys/endian.h>
 #include <sys/kdb.h>
+#include <sys/taskqueue.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -74,7 +75,6 @@ __FBSDID("$FreeBSD$");
 #include <dev/usb/usb_error.h>
 #include <dev/usb/usb_core.h>
 #include <dev/usb/usb_lookup.h>
-#include <dev/usb/usb_process.h>
 #include <dev/usb/usb_debug.h>
 #include <dev/usb/usb_request.h>
 #include <dev/usb/usb_busdma.h>
@@ -133,10 +133,6 @@ static const struct usb2_device_id ural_
 static usb2_callback_t ural_bulk_read_callback;
 static usb2_callback_t ural_bulk_write_callback;
 
-static usb2_proc_callback_t ural_command_wrapper;
-static usb2_proc_callback_t ural_attach_post;
-static usb2_proc_callback_t ural_amrr_task;
-
 static usb2_error_t	ural_do_request(struct ural_softc *sc,
 			    struct usb2_device_request *req, void *data);
 static struct ieee80211vap *ural_vap_create(struct ieee80211com *,
@@ -196,16 +192,14 @@ static void		ural_set_txantenna(struct u
 static void		ural_set_rxantenna(struct ural_softc *, int);
 static void		ural_init_locked(struct ural_softc *);
 static void		ural_init(void *);
-static void		ural_stop(void *);
+static void		ural_stop(struct ural_softc *);
 static int		ural_raw_xmit(struct ieee80211_node *, struct mbuf *,
 			    const struct ieee80211_bpf_params *);
 static void		ural_amrr_start(struct ural_softc *,
 			    struct ieee80211_node *);
 static void		ural_amrr_timeout(void *);
+static void		ural_amrr_task(void *, int);
 static int		ural_pause(struct ural_softc *sc, int timeout);
-static void		ural_queue_command(struct ural_softc *,
-			    usb2_proc_callback_t *, struct usb2_proc_msg *,
-			    struct usb2_proc_msg *);
 
 /*
  * Default values for MAC registers; values taken from the reference driver.
@@ -435,8 +429,10 @@ ural_attach(device_t self)
 {
 	struct usb2_attach_arg *uaa = device_get_ivars(self);
 	struct ural_softc *sc = device_get_softc(self);
+	struct ifnet *ifp;
+	struct ieee80211com *ic;
+	uint8_t iface_index, bands;
 	int error;
-	uint8_t iface_index;
 
 	device_set_usb2_desc(self);
 	sc->sc_udev = uaa->device;
@@ -445,8 +441,6 @@ ural_attach(device_t self)
 	mtx_init(&sc->sc_mtx, device_get_nameunit(self),
 	    MTX_NETWORK_LOCK, MTX_DEF);
 
-	cv_init(&sc->sc_cmd_cv, "wtxdone");
-
 	iface_index = RAL_IFACE_INDEX;
 	error = usb2_transfer_setup(uaa->device,
 	    &iface_index, sc->sc_xfer, ural_config,
@@ -456,55 +450,22 @@ ural_attach(device_t self)
 		    "err=%s\n", usb2_errstr(error));
 		goto detach;
 	}
-	error = usb2_proc_create(&sc->sc_tq, &sc->sc_mtx,
-	    device_get_nameunit(self), USB_PRI_MED);
-	if (error) {
-		device_printf(self, "could not setup config thread!\n");
-		goto detach;
-	}
 
-	/* fork rest of the attach code */
 	RAL_LOCK(sc);
-	ural_queue_command(sc, ural_attach_post,
-	    &sc->sc_synctask[0].hdr,
-	    &sc->sc_synctask[1].hdr);
-	RAL_UNLOCK(sc);
-	return (0);
-
-detach:
-	ural_detach(self);
-	return (ENXIO);			/* failure */
-}
-
-static void
-ural_attach_post(struct usb2_proc_msg *pm)
-{
-	struct ural_task *task = (struct ural_task *)pm;
-	struct ural_softc *sc = task->sc;
-	struct ifnet *ifp;
-	struct ieee80211com *ic;
-	uint8_t bands;
-
 	/* retrieve RT2570 rev. no */
 	sc->asic_rev = ural_read(sc, RAL_MAC_CSR0);
 
 	/* retrieve MAC address and various other things from EEPROM */
 	ural_read_eeprom(sc);
-
-	/* XXX Async attach race */
-	if (usb2_proc_is_gone(&sc->sc_tq))
-		return;
-
 	RAL_UNLOCK(sc);
 
-	device_printf(sc->sc_dev, "MAC/BBP RT2570 (rev 0x%02x), RF %s\n",
+	device_printf(self, "MAC/BBP RT2570 (rev 0x%02x), RF %s\n",
 	    sc->asic_rev, ural_get_rf(sc->rf_rev));
 
 	ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
 	if (ifp == NULL) {
 		device_printf(sc->sc_dev, "can not if_alloc()\n");
-		RAL_LOCK(sc);
-		return;
+		goto detach;
 	}
 	ic = ifp->if_l2com;
 
@@ -567,7 +528,11 @@ ural_attach_post(struct usb2_proc_msg *p
 	if (bootverbose)
 		ieee80211_announce(ic);
 
-	RAL_LOCK(sc);
+	return (0);
+
+detach:
+	ural_detach(self);
+	return (ENXIO);			/* failure */
 }
 
 static int
@@ -577,12 +542,8 @@ ural_detach(device_t self)
 	struct ifnet *ifp = sc->sc_ifp;
 	struct ieee80211com *ic;
 
-	/* wait for any post attach or other command to complete */
-	usb2_proc_drain(&sc->sc_tq);
-
 	/* stop all USB transfers */
 	usb2_transfer_unsetup(sc->sc_xfer, URAL_N_TRANSFER);
-	usb2_proc_free(&sc->sc_tq);
 
 	/* free TX list, if any */
 	RAL_LOCK(sc);
@@ -595,7 +556,6 @@ ural_detach(device_t self)
 		ieee80211_ifdetach(ic);
 		if_free(ifp);
 	}
-	cv_destroy(&sc->sc_cmd_cv);
 	mtx_destroy(&sc->sc_mtx);
 
 	return (0);
@@ -609,7 +569,7 @@ ural_do_request(struct ural_softc *sc,
 	int ntries = 10;
 
 	while (ntries--) {
-		err = usb2_do_request_proc(sc->sc_udev, &sc->sc_tq,
+		err = usb2_do_request_flags(sc->sc_udev, &sc->sc_mtx,
 		    req, data, 0, NULL, 250 /* ms */);
 		if (err == 0)
 			break;
@@ -647,8 +607,8 @@ ural_vap_create(struct ieee80211com *ic,
 	uvp->newstate = vap->iv_newstate;
 	vap->iv_newstate = ural_newstate;
 
-	uvp->sc = sc;
 	usb2_callout_init_mtx(&uvp->amrr_ch, &sc->sc_mtx, 0);
+	TASK_INIT(&uvp->amrr_task, 0, ural_amrr_task, uvp);
 	ieee80211_amrr_init(&uvp->amrr, vap,
 	    IEEE80211_AMRR_MIN_SUCCESS_THRESHOLD,
 	    IEEE80211_AMRR_MAX_SUCCESS_THRESHOLD,
@@ -664,8 +624,10 @@ static void
 ural_vap_delete(struct ieee80211vap *vap)
 {
 	struct ural_vap *uvp = URAL_VAP(vap);
+	struct ieee80211com *ic = vap->iv_ic;
 
 	usb2_callout_drain(&uvp->amrr_ch);
+	taskqueue_drain(ic->ic_tq, &uvp->amrr_task);
 	ieee80211_amrr_cleanup(&uvp->amrr);
 	ieee80211_vap_detach(vap);
 	free(uvp, M_80211_VAP);
@@ -828,10 +790,6 @@ ural_bulk_write_callback(struct usb2_xfe
 	struct mbuf *m;
 	unsigned int len;
 
-	/* wakeup waiting command, if any */
-	if (sc->sc_last_task != NULL)
-		cv_signal(&sc->sc_cmd_cv);
-
 	switch (USB_GET_STATE(xfer)) {
 	case USB_ST_TRANSFERRED:
 		DPRINTFN(11, "transfer complete, %d bytes\n", xfer->actlen);
@@ -847,10 +805,6 @@ ural_bulk_write_callback(struct usb2_xfe
 		/* FALLTHROUGH */
 	case USB_ST_SETUP:
 tr_setup:
-		/* wait for command to complete, if any */
-		if (sc->sc_last_task != NULL)
-			break;
-
 		data = STAILQ_FIRST(&sc->tx_q);
 		if (data) {
 			STAILQ_REMOVE_HEAD(&sc->tx_q, next);
@@ -1653,8 +1607,8 @@ ural_newassoc(struct ieee80211_node *ni,
 static void
 ural_scan_start(struct ieee80211com *ic)
 {
-	struct ural_softc *sc = ic->ic_ifp->if_softc;
 	struct ifnet *ifp = ic->ic_ifp;
+	struct ural_softc *sc = ifp->if_softc;
 
 	RAL_LOCK(sc);
 	ural_write(sc, RAL_TXRX_CSR19, 0);
@@ -2190,9 +2144,8 @@ ural_init(void *priv)
 }
 
 static void
-ural_stop(void *priv)
+ural_stop(struct ural_softc *sc)
 {
-	struct ural_softc *sc = priv;
 	struct ifnet *ifp = sc->sc_ifp;
 
 	RAL_LOCK_ASSERT(sc, MA_OWNED);
@@ -2288,21 +2241,20 @@ static void
 ural_amrr_timeout(void *arg)
 {
 	struct ural_vap *uvp = arg;
-	struct ural_softc *sc = uvp->sc;
+	struct ieee80211vap *vap = &uvp->vap;
+	struct ieee80211com *ic = vap->iv_ic;
 
-	ural_queue_command(sc, ural_amrr_task,
-	    &uvp->amrr_task[0].hdr, &uvp->amrr_task[1].hdr);
+	taskqueue_enqueue(ic->ic_tq, &uvp->amrr_task);
 }
 
 static void
-ural_amrr_task(struct usb2_proc_msg *pm)
+ural_amrr_task(void *arg, int pending)
 {
-	struct ural_task *task = (struct ural_task *)pm;
-	struct ural_softc *sc = task->sc;
-	struct ifnet *ifp = sc->sc_ifp;
-	struct ieee80211com *ic = ifp->if_l2com;
-	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
-	struct ural_vap *uvp = URAL_VAP(vap);
+	struct ural_vap *uvp = arg;
+	struct ieee80211vap *vap = &uvp->vap;
+	struct ieee80211com *ic = vap->iv_ic;
+	struct ifnet *ifp = ic->ic_ifp;
+	struct ural_softc *sc = ifp->if_softc;
 	struct ieee80211_node *ni = vap->iv_bss;
 	int ok, fail;
 
@@ -2325,61 +2277,7 @@ ural_amrr_task(struct usb2_proc_msg *pm)
 static int
 ural_pause(struct ural_softc *sc, int timeout)
 {
-	if (usb2_proc_is_gone(&sc->sc_tq))
-		return (1);
 
 	usb2_pause_mtx(&sc->sc_mtx, timeout);
 	return (0);
 }
-
-static void
-ural_command_wrapper(struct usb2_proc_msg *pm)
-{
-	struct ural_task *task = (struct ural_task *)pm;
-	struct ural_softc *sc = task->sc;
-	struct ifnet *ifp;
-
-	/* wait for pending transfer, if any */
-	while (usb2_transfer_pending(sc->sc_xfer[URAL_BULK_WR]))
-		cv_wait(&sc->sc_cmd_cv, &sc->sc_mtx);
-
-	/* make sure any hardware FIFOs are emptied */

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200904170423.n3H4NBZt008376>