svn commit: r191195 - in user/thompsa/vaptq/sys: dev/ipw dev/iwn dev/wi dev/wpi net80211

Andrew Thompson thompsa at FreeBSD.org
Thu Apr 16 22:37:32 PDT 2009


Author: thompsa
Date: Fri Apr 17 05:37:31 2009
New Revision: 191195
URL: http://svn.freebsd.org/changeset/base/191195

Log:
  Move beacon miss handling into the vap taskq so that it is safe to call from
  any context.

Modified:
  user/thompsa/vaptq/sys/dev/ipw/if_ipw.c
  user/thompsa/vaptq/sys/dev/iwn/if_iwn.c
  user/thompsa/vaptq/sys/dev/wi/if_wi.c
  user/thompsa/vaptq/sys/dev/wpi/if_wpi.c
  user/thompsa/vaptq/sys/net80211/ieee80211_proto.c

Modified: user/thompsa/vaptq/sys/dev/ipw/if_ipw.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/ipw/if_ipw.c	Fri Apr 17 04:23:11 2009	(r191194)
+++ user/thompsa/vaptq/sys/dev/ipw/if_ipw.c	Fri Apr 17 05:37:31 2009	(r191195)
@@ -120,7 +120,6 @@ static uint16_t	ipw_read_prom_word(struc
 static void	ipw_rx_cmd_intr(struct ipw_softc *, struct ipw_soft_buf *);
 static void	ipw_assocsuccess(void *, int);
 static void	ipw_assocfailed(void *, int);
-static void	ipw_bmiss(void *, int);
 static void	ipw_rx_newstate_intr(struct ipw_softc *, struct ipw_soft_buf *);
 static void	ipw_rx_data_intr(struct ipw_softc *, struct ipw_status *,
 		    struct ipw_soft_bd *, struct ipw_soft_buf *);
@@ -237,7 +236,6 @@ ipw_attach(device_t dev)
 	    MTX_DEF | MTX_RECURSE);
 
 	TASK_INIT(&sc->sc_init_task, 0, ipw_init_task, sc);
-	TASK_INIT(&sc->sc_bmiss_task, 0, ipw_bmiss, sc);
 	callout_init_mtx(&sc->sc_wdtimer, &sc->sc_mtx, 0);
 
 	if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
@@ -415,7 +413,6 @@ ipw_detach(device_t dev)
 
 	callout_drain(&sc->sc_wdtimer);
 	taskqueue_drain(taskqueue_fast, &sc->sc_init_task);
-	taskqueue_drain(taskqueue_fast, &sc->sc_bmiss_task);
 
 	ipw_release(sc);
 
@@ -1027,14 +1024,6 @@ ipw_assocfailed(void *arg, int npending)
 }
 
 static void
-ipw_bmiss(void *arg, int npending)
-{
-	struct ieee80211com *ic = arg;
-
-	ieee80211_beacon_miss(ic);
-}
-
-static void
 ipw_rx_newstate_intr(struct ipw_softc *sc, struct ipw_soft_buf *sbuf)
 {
 #define	IEEESTATE(vap)	ieee80211_state_name[vap->iv_state]
@@ -1074,7 +1063,7 @@ ipw_rx_newstate_intr(struct ipw_softc *s
 		 */
 		if (sc->flags & IPW_FLAG_ASSOCIATED) {
 			/* XXX probably need to issue disassoc to fw */
-			taskqueue_enqueue(taskqueue_swi, &sc->sc_bmiss_task);
+			ieee80211_beacon_miss(ic);
 		}
 		break;
 

Modified: user/thompsa/vaptq/sys/dev/iwn/if_iwn.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/iwn/if_iwn.c	Fri Apr 17 04:23:11 2009	(r191194)
+++ user/thompsa/vaptq/sys/dev/iwn/if_iwn.c	Fri Apr 17 05:37:31 2009	(r191195)
@@ -129,7 +129,6 @@ void		iwn_rx_intr(struct iwn_softc *, st
 void		iwn_rx_statistics(struct iwn_softc *, struct iwn_rx_desc *);
 void		iwn_tx_intr(struct iwn_softc *, struct iwn_rx_desc *);
 void		iwn_cmd_intr(struct iwn_softc *, struct iwn_rx_desc *);
-static void	iwn_bmiss(void *, int);
 void		iwn_notif_intr(struct iwn_softc *);
 void		iwn_intr(void *);
 void		iwn_read_eeprom(struct iwn_softc *,
@@ -309,7 +308,6 @@ iwn_attach(device_t dev)
                 device_get_nameunit(dev));
 
         TASK_INIT(&sc->sc_ops_task, 0, iwn_ops, sc );
-	TASK_INIT(&sc->sc_bmiss_task, 0, iwn_bmiss, sc);
 
 	/*
 	 * Put adapter into a known state.
@@ -1651,15 +1649,6 @@ iwn_cmd_intr(struct iwn_softc *sc, struc
 	wakeup(&ring->cmd[desc->idx]);
 }
 
-static void
-iwn_bmiss(void *arg, int npending)
-{
-	struct iwn_softc *sc = arg;
-	struct ieee80211com *ic = sc->sc_ifp->if_l2com;
-
-	ieee80211_beacon_miss(ic);
-}
-
 void
 iwn_notif_intr(struct iwn_softc *sc)
 {
@@ -1720,8 +1709,7 @@ iwn_notif_intr(struct iwn_softc *sc)
 			if (vap->iv_state == IEEE80211_S_RUN && misses > 5)
 				(void) iwn_init_sensitivity(sc);
 			if (misses >= vap->iv_bmissthreshold)
-				taskqueue_enqueue(taskqueue_swi,
-				    &sc->sc_bmiss_task);
+				ieee80211_beacon_miss(ic);
 			break;
 		}
 		case IWN_UC_READY: {

Modified: user/thompsa/vaptq/sys/dev/wi/if_wi.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/wi/if_wi.c	Fri Apr 17 04:23:11 2009	(r191194)
+++ user/thompsa/vaptq/sys/dev/wi/if_wi.c	Fri Apr 17 05:37:31 2009	(r191195)
@@ -78,7 +78,6 @@ __FBSDID("$FreeBSD$");
 #include <sys/random.h>
 #include <sys/syslog.h>
 #include <sys/sysctl.h>
-#include <sys/taskqueue.h>
 
 #include <machine/bus.h>
 #include <machine/resource.h>
@@ -134,7 +133,6 @@ static void wi_rx_intr(struct wi_softc *
 static void wi_tx_intr(struct wi_softc *);
 static void wi_tx_ex_intr(struct wi_softc *);
 
-static void wi_status_oor(void *, int);
 static void wi_info_intr(struct wi_softc *);
 
 static int  wi_write_txrate(struct wi_softc *, struct ieee80211vap *);
@@ -448,7 +446,6 @@ wi_attach(device_t dev)
 	}
 
 	sc->sc_portnum = WI_DEFAULT_PORT;
-	TASK_INIT(&sc->sc_oor_task, 0, wi_status_oor, ic);
 
 	ieee80211_ifattach(ic, macaddr);
 	ic->ic_raw_xmit = wi_raw_xmit;
@@ -1505,14 +1502,6 @@ wi_tx_intr(struct wi_softc *sc)
 	}
 }
 
-static void
-wi_status_oor(void *arg, int pending)
-{
-	struct ieee80211com *ic = arg;
-
-	ieee80211_beacon_miss(ic);
-}
-
 static __noinline void
 wi_info_intr(struct wi_softc *sc)
 {
@@ -1555,7 +1544,7 @@ wi_info_intr(struct wi_softc *sc)
 			break;
 		case WI_INFO_LINK_STAT_AP_OOR:
 			/* XXX does this need to be per-vap? */
-			taskqueue_enqueue(taskqueue_swi, &sc->sc_oor_task);
+			ieee80211_beacon_miss(ic);
 			break;
 		case WI_INFO_LINK_STAT_ASSOC_FAILED:
 			if (vap->iv_opmode == IEEE80211_M_STA)

Modified: user/thompsa/vaptq/sys/dev/wpi/if_wpi.c
==============================================================================
--- user/thompsa/vaptq/sys/dev/wpi/if_wpi.c	Fri Apr 17 04:23:11 2009	(r191194)
+++ user/thompsa/vaptq/sys/dev/wpi/if_wpi.c	Fri Apr 17 05:37:31 2009	(r191195)
@@ -192,7 +192,6 @@ static void	wpi_rx_intr(struct wpi_softc
 		    struct wpi_rx_data *);
 static void	wpi_tx_intr(struct wpi_softc *, struct wpi_rx_desc *);
 static void	wpi_cmd_intr(struct wpi_softc *, struct wpi_rx_desc *);
-static void	wpi_bmiss(void *, int);
 static void	wpi_notif_intr(struct wpi_softc *);
 static void	wpi_intr(void *);
 static void	wpi_ops(void *, int);
@@ -525,7 +524,6 @@ wpi_attach(device_t dev)
 
 	/* Create the tasks that can be queued */
 	TASK_INIT(&sc->sc_opstask, 0, wpi_ops, sc);
-	TASK_INIT(&sc->sc_bmiss_task, 0, wpi_bmiss, sc);
 
 	WPI_LOCK_INIT(sc);
 	WPI_CMD_LOCK_INIT(sc);
@@ -1653,15 +1651,6 @@ wpi_cmd_intr(struct wpi_softc *sc, struc
 }
 
 static void
-wpi_bmiss(void *arg, int npending)
-{
-	struct wpi_softc *sc = arg;
-	struct ieee80211com *ic = sc->sc_ifp->if_l2com;
-
-	ieee80211_beacon_miss(ic);
-}
-
-static void
 wpi_notif_intr(struct wpi_softc *sc)
 {
 	struct ifnet *ifp = sc->sc_ifp;
@@ -1770,8 +1759,7 @@ wpi_notif_intr(struct wpi_softc *sc)
 				DPRINTF(("Beacon miss: %u >= %u\n",
 					 le32toh(beacon->consecutive),
 					 vap->iv_bmissthreshold));
-				taskqueue_enqueue(taskqueue_swi,
-				    &sc->sc_bmiss_task);
+				ieee80211_beacon_miss(ic);
 			}
 			break;
 		}
@@ -3041,8 +3029,7 @@ wpi_rfkill_resume(struct wpi_softc *sc)
 	if (vap != NULL) {
 		if ((ic->ic_flags & IEEE80211_F_SCAN) == 0) {
 			if (vap->iv_opmode != IEEE80211_M_MONITOR) {
-				taskqueue_enqueue(taskqueue_swi,
-				    &sc->sc_bmiss_task);
+				ieee80211_beacon_miss(ic);
 				wpi_set_led(sc, WPI_LED_LINK, 0, 1);
 			} else
 				wpi_set_led(sc, WPI_LED_LINK, 5, 5);

Modified: user/thompsa/vaptq/sys/net80211/ieee80211_proto.c
==============================================================================
--- user/thompsa/vaptq/sys/net80211/ieee80211_proto.c	Fri Apr 17 04:23:11 2009	(r191194)
+++ user/thompsa/vaptq/sys/net80211/ieee80211_proto.c	Fri Apr 17 05:37:31 2009	(r191195)
@@ -96,6 +96,7 @@ const char *ieee80211_wme_acnames[] = {
 	"WME_UPSD",
 };
 
+static void beacon_miss(void *, int);
 static void parent_updown(void *, int);
 static void update_mcast(void *, int);
 static void update_promisc(void *, int);
@@ -140,6 +141,7 @@ ieee80211_proto_attach(struct ieee80211c
 	TASK_INIT(&ic->ic_mcast_task, 0, update_mcast, ic);
 	TASK_INIT(&ic->ic_promisc_task, 0, update_promisc, ic);
 	TASK_INIT(&ic->ic_chan_task, 0, update_channel, ic);
+	TASK_INIT(&ic->ic_bmiss_task, 0, beacon_miss, ic);
 
 	ic->ic_wme.wme_hipri_switch_hysteresis =
 		AGGRESSIVE_MODE_SWITCH_HYSTERESIS;
@@ -1120,6 +1122,7 @@ ieee80211_waitfor_parent(struct ieee8021
 	taskqueue_drain(ic->ic_tq, &ic->ic_mcast_task);
 	taskqueue_drain(ic->ic_tq, &ic->ic_promisc_task);
 	taskqueue_drain(ic->ic_tq, &ic->ic_chan_task);
+	taskqueue_drain(ic->ic_tq, &ic->ic_bmiss_task);
 }
 
 /*
@@ -1358,6 +1361,14 @@ ieee80211_resume_all(struct ieee80211com
 void
 ieee80211_beacon_miss(struct ieee80211com *ic)
 {
+	/* Process in a taskq, the bmiss handler may reenter the driver */
+	taskqueue_enqueue(ic->ic_tq, &ic->ic_bmiss_task);
+}
+
+static void
+beacon_miss(void *arg, int npending)
+{
+	struct ieee80211com *ic = arg;
 	struct ieee80211vap *vap;
 
 	if (ic->ic_flags & IEEE80211_F_SCAN)


More information about the svn-src-user mailing list