svn commit: r188533 - head/sys/net80211

Andrew Thompson thompsa at FreeBSD.org
Thu Feb 12 10:57:20 PST 2009


Author: thompsa
Date: Thu Feb 12 18:57:18 2009
New Revision: 188533
URL: http://svn.freebsd.org/changeset/base/188533

Log:
  Add a ieee80211_waitfor_parent() function that will wait for all deferred
  parent interface tasks to complete. This had been added to the ioctl path but
  it is also need elsewhere like detach so its safe to teardown.
  
  Reported by:	Hans Petter Selasky
  Submitted by:	sam

Modified:
  head/sys/net80211/ieee80211.c
  head/sys/net80211/ieee80211_ioctl.c
  head/sys/net80211/ieee80211_proto.c
  head/sys/net80211/ieee80211_proto.h

Modified: head/sys/net80211/ieee80211.c
==============================================================================
--- head/sys/net80211/ieee80211.c	Thu Feb 12 18:50:27 2009	(r188532)
+++ head/sys/net80211/ieee80211.c	Thu Feb 12 18:57:18 2009	(r188533)
@@ -289,9 +289,9 @@ ieee80211_ifdetach(struct ieee80211com *
 	struct ifnet *ifp = ic->ic_ifp;
 	struct ieee80211vap *vap;
 
-	/* XXX ieee80211_stop_all? */
 	while ((vap = TAILQ_FIRST(&ic->ic_vaps)) != NULL)
 		ieee80211_vap_destroy(vap);
+	ieee80211_waitfor_parent(ic);
 
 	ieee80211_sysctl_detach(ic);
 	ieee80211_regdomain_detach(ic);

Modified: head/sys/net80211/ieee80211_ioctl.c
==============================================================================
--- head/sys/net80211/ieee80211_ioctl.c	Thu Feb 12 18:50:27 2009	(r188532)
+++ head/sys/net80211/ieee80211_ioctl.c	Thu Feb 12 18:57:18 2009	(r188533)
@@ -3265,7 +3265,7 @@ ieee80211_ioctl(struct ifnet *ifp, u_lon
 		}
 		IEEE80211_UNLOCK(ic);
 		/* Wait for parent ioctl handler if it was queued */
-		taskqueue_drain(taskqueue_thread, &ic->ic_parent_task);
+		ieee80211_waitfor_parent(ic);
 		break;
 	case SIOCADDMULTI:
 	case SIOCDELMULTI:

Modified: head/sys/net80211/ieee80211_proto.c
==============================================================================
--- head/sys/net80211/ieee80211_proto.c	Thu Feb 12 18:50:27 2009	(r188532)
+++ head/sys/net80211/ieee80211_proto.c	Thu Feb 12 18:57:18 2009	(r188533)
@@ -1072,6 +1072,17 @@ parent_updown(void *arg, int npending)
 }
 
 /*
+ * Block until the parent is in a known state.  This is
+ * used after any operations that dispatch a task (e.g.
+ * to auto-configure the parent device up/down).
+ */
+void
+ieee80211_waitfor_parent(struct ieee80211com *ic)
+{
+	taskqueue_drain(taskqueue_thread, &ic->ic_parent_task);
+}
+
+/*
  * Start a vap running.  If this is the first vap to be
  * set running on the underlying device then we
  * automatically bring the device up.
@@ -1258,6 +1269,8 @@ ieee80211_stop_all(struct ieee80211com *
 			ieee80211_stop_locked(vap);
 	}
 	IEEE80211_UNLOCK(ic);
+
+	ieee80211_waitfor_parent(ic);
 }
 
 /*
@@ -1278,6 +1291,8 @@ ieee80211_suspend_all(struct ieee80211co
 		}
 	}
 	IEEE80211_UNLOCK(ic);
+
+	ieee80211_waitfor_parent(ic);
 }
 
 /*

Modified: head/sys/net80211/ieee80211_proto.h
==============================================================================
--- head/sys/net80211/ieee80211_proto.h	Thu Feb 12 18:50:27 2009	(r188532)
+++ head/sys/net80211/ieee80211_proto.h	Thu Feb 12 18:57:18 2009	(r188533)
@@ -260,6 +260,7 @@ ieee80211_gettid(const struct ieee80211_
 	return tid;
 }
 
+void	ieee80211_waitfor_parent(struct ieee80211com *);
 void	ieee80211_start_locked(struct ieee80211vap *);
 void	ieee80211_init(void *);
 void	ieee80211_start_all(struct ieee80211com *);


More information about the svn-src-all mailing list