PERFORCE change 141154 for review

Andrew Thompson thompsa at FreeBSD.org
Sun May 4 19:04:12 UTC 2008


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

Change 141154 by thompsa at thompsa_burger on 2008/05/04 19:03:39

	Associate from a taskq as we can (and will) deadlock on the ndis hal
	and the com lock.

Affected files ...

.. //depot/projects/vap/sys/dev/if_ndis/if_ndis.c#20 edit
.. //depot/projects/vap/sys/dev/if_ndis/if_ndisvar.h#12 edit

Differences ...

==== //depot/projects/vap/sys/dev/if_ndis/if_ndis.c#20 (text+ko) ====

@@ -164,11 +164,13 @@
 static void ndis_watchdog	(struct ifnet *);
 static int ndis_ifmedia_upd	(struct ifnet *);
 static void ndis_ifmedia_sts	(struct ifnet *, struct ifmediareq *);
+static void ndis_auth		(void *, int);
+static void ndis_assoc		(void *, int);
 static int ndis_get_assoc	(struct ndis_softc *, ndis_wlan_bssid_ex **);
 static int ndis_probe_offload	(struct ndis_softc *);
 static int ndis_set_offload	(struct ndis_softc *);
 static void ndis_getstate_80211	(struct ndis_softc *);
-static void ndis_setstate_80211	(struct ndis_softc *);
+static void ndis_auth_and_assoc	(struct ndis_softc *, struct ieee80211vap *);
 static int ndis_set_cipher	(struct ndis_softc *, int);
 static int ndis_set_wpa		(struct ndis_softc *, void *, int);
 static int ndis_add_key		(struct ieee80211vap *,
@@ -714,6 +716,8 @@
 		taskqueue_start_threads(&sc->ndis_tq, 1, PI_NET, "%s taskq",
 		    device_get_nameunit(dev));
 		TASK_INIT(&sc->ndis_scantask, 0, ndis_scan, sc);
+		TASK_INIT(&sc->ndis_authtask, 0, ndis_auth, sc);
+		TASK_INIT(&sc->ndis_assoctask, 0, ndis_assoc, sc);
 
 		ifp->if_ioctl = ndis_ioctl_80211;
 		ic->ic_ifp = ifp;
@@ -1003,8 +1007,11 @@
 	} else
 		NDIS_UNLOCK(sc);
 
-	if (sc->ndis_80211)
+	if (sc->ndis_80211) {
 		taskqueue_drain(sc->ndis_tq, &sc->ndis_scantask);
+		taskqueue_drain(sc->ndis_tq, &sc->ndis_authtask);
+		taskqueue_drain(sc->ndis_tq, &sc->ndis_assoctask);
+	}
 
 	if (sc->ndis_tickitem != NULL)
 		IoFreeWorkItem(sc->ndis_tickitem);
@@ -2196,11 +2203,35 @@
 }
 
 static void
-ndis_setstate_80211(sc)
+ndis_auth(void *arg, int npending)
+{
+	struct ndis_softc *sc = arg;
+	struct ifnet *ifp = sc->ifp;
+	struct ieee80211com *ic = ifp->if_l2com;
+	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
+
+	vap->iv_state = IEEE80211_S_AUTH;
+	ndis_auth_and_assoc(sc, vap);
+}
+
+static void
+ndis_assoc(void *arg, int npending)
+{
+	struct ndis_softc *sc = arg;
+	struct ifnet *ifp = sc->ifp;
+	struct ieee80211com *ic = ifp->if_l2com;
+	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
+
+	vap->iv_state = IEEE80211_S_ASSOC;
+	ndis_auth_and_assoc(sc, vap);
+}
+
+static void
+ndis_auth_and_assoc(sc, vap)
 	struct ndis_softc	*sc;
+	struct ieee80211vap	*vap;
 {
 	struct ieee80211com	*ic;
-	struct ieee80211vap	*vap;
 	struct ieee80211_node	*ni;
 	ndis_80211_ssid		ssid;
 	ndis_80211_macaddr	bssid;
@@ -2212,7 +2243,6 @@
 
 	ifp = sc->ifp;
 	ic = ifp->if_l2com;
-	vap = TAILQ_FIRST(&ic->ic_vaps);
 	ni = vap->iv_bss;
 
 	if (!NDIS_INITIALIZED(sc)) {
@@ -3131,16 +3161,15 @@
 	case IEEE80211_S_INIT:
 	case IEEE80211_S_SCAN:
 		return nvp->newstate(vap, nstate, arg);
-
 	case IEEE80211_S_ASSOC:
-		if (ostate != IEEE80211_S_AUTH)
-			ndis_setstate_80211(sc);
+		if (ostate != IEEE80211_S_AUTH) {
+			taskqueue_enqueue(sc->ndis_tq, &sc->ndis_assoctask);
+			return EINPROGRESS;
+		}
 		break;
-
 	case IEEE80211_S_AUTH:
-		ndis_setstate_80211(sc);
-		break;
-
+		taskqueue_enqueue(sc->ndis_tq, &sc->ndis_authtask);
+		return EINPROGRESS;
 	default:
 		break;
 	}

==== //depot/projects/vap/sys/dev/if_ndis/if_ndisvar.h#12 (text+ko) ====

@@ -177,6 +177,8 @@
 
 	struct taskqueue	*ndis_tq;		/* private task queue */
 	struct task		ndis_scantask;
+	struct task		ndis_authtask;
+	struct task		ndis_assoctask;
 	int			(*ndis_newstate)(struct ieee80211com *,
 				    enum ieee80211_state, int);
 };


More information about the p4-projects mailing list