PERFORCE change 140220 for review

Sam Leffler sam at FreeBSD.org
Fri Apr 18 18:44:04 UTC 2008


http://perforce.freebsd.org/chv.cgi?CH=140220

Change 140220 by sam at sam_ebb on 2008/04/18 18:43:38

	Cleanup stop handling the same way as init: defer the parent
	ioctl op to the taskq so we can avoid dropping the com lock.
	This also eliminates the bogus futzing of the parent's running
	flag to avoid problems.
	
	Also move taskq ops to run in a thread instead of a swi so
	the driver has a blocking context.  We're likely to add our
	own thread to help with other issues at which point we can
	do these operations there.

Affected files ...

.. //depot/projects/vap/sys/net80211/ieee80211_proto.c#29 edit

Differences ...

==== //depot/projects/vap/sys/net80211/ieee80211_proto.c#29 (text+ko) ====

@@ -96,7 +96,7 @@
 	"WME_UPSD",
 };
 
-static void parent_up(void *, int);
+static void parent_updown(void *, int);
 static int ieee80211_new_state_locked(struct ieee80211vap *,
 	enum ieee80211_state, int);
 
@@ -130,7 +130,7 @@
 	}
 	ic->ic_protmode = IEEE80211_PROT_CTSONLY;
 
-	TASK_INIT(&ic->ic_parent_task, 0, parent_up, ifp);
+	TASK_INIT(&ic->ic_parent_task, 0, parent_updown, ifp);
 
 	ic->ic_wme.wme_hipri_switch_hysteresis =
 		AGGRESSIVE_MODE_SWITCH_HYSTERESIS;
@@ -1064,7 +1064,7 @@
 }
 
 static void
-parent_up(void *arg, int npending)
+parent_updown(void *arg, int npending)
 {
 	struct ifnet *parent = arg;
 
@@ -1109,7 +1109,7 @@
 			    IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG,
 			    "%s: up parent %s\n", __func__, parent->if_xname);
 			parent->if_flags |= IFF_UP;
-			taskqueue_enqueue(taskqueue_swi, &ic->ic_parent_task);
+			taskqueue_enqueue(taskqueue_thread, &ic->ic_parent_task);
 			return;
 		}
 	}
@@ -1228,10 +1228,7 @@
 			    IEEE80211_MSG_STATE | IEEE80211_MSG_DEBUG,
 			    "down parent %s\n", parent->if_xname);
 			parent->if_flags &= ~IFF_UP;
-			/* XXX must drop lock */
-			IEEE80211_UNLOCK(ic);
-			parent->if_ioctl(parent, SIOCSIFFLAGS, NULL);
-			IEEE80211_LOCK(ic);
+			taskqueue_enqueue(taskqueue_thread, &ic->ic_parent_task);
 		}
 	}
 }
@@ -1252,22 +1249,13 @@
 void
 ieee80211_stop_all(struct ieee80211com *ic)
 {
-	struct ifnet *parent = ic->ic_ifp;
 	struct ieee80211vap *vap;
 
 	IEEE80211_LOCK(ic);
-	/* XXX why do we do this? */
-	/* XXX shouldn't touch driver state */
-	parent->if_drv_flags &= ~IFF_DRV_RUNNING;
 	TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
 		struct ifnet *ifp = vap->iv_ifp;
-		if (IFNET_IS_UP_RUNNING(ifp)) {	/* NB: avoid recursion */
-			/*
-			 * NB: since parent is marked !RUNNING
-			 * this won't drop com lock
-			 */
+		if (IFNET_IS_UP_RUNNING(ifp))	/* NB: avoid recursion */
 			ieee80211_stop_locked(vap);
-		}
 	}
 	IEEE80211_UNLOCK(ic);
 }


More information about the p4-projects mailing list