PERFORCE change 138765 for review

Sam Leffler sam at FreeBSD.org
Thu Mar 27 17:17:40 PDT 2008


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

Change 138765 by sam at sam_ebb on 2008/03/28 00:17:20

	Checkpoint:
	o set WI_RID_ALT_RETRY_CNT back to 2; 0 was causing poor performance
	  in sta mode
	o enable interrupts before enabling port; the spec says this is the
	  correct order
	o add missing locking in wi_newstate
	o fixup hostap setup on RUN state transition

Affected files ...

.. //depot/projects/vap/sys/dev/wi/if_wi.c#17 edit

Differences ...

==== //depot/projects/vap/sys/dev/wi/if_wi.c#17 (text+ko) ====

@@ -609,26 +609,27 @@
 static void
 wi_enable(struct wi_softc *sc)
 {
+	/* Enable interrupts */
+	CSR_WRITE_2(sc, WI_INT_EN, WI_INTRS);
+
 	/* enable port */
 	wi_cmd(sc, WI_CMD_ENABLE | sc->sc_portnum, 0, 0, 0);
 	sc->sc_enabled = 1;
-
-	/* Enable interrupts */
-	CSR_WRITE_2(sc, WI_INT_EN, WI_INTRS);
 }
 
 static int
-wi_init_locked(struct wi_softc *sc, uint8_t mac[IEEE80211_ADDR_LEN])
+wi_init_locked(struct wi_softc *sc, int porttype, int mode,
+	uint8_t mac[IEEE80211_ADDR_LEN])
 {
 	int i;
 
 	wi_reset(sc);
 
-	wi_write_val(sc, WI_RID_PORTTYPE, sc->sc_porttype);
-	wi_write_val(sc, WI_RID_CREATE_IBSS, 3);	/* join only, don't create */
+	wi_write_val(sc, WI_RID_PORTTYPE, porttype);
+	wi_write_val(sc, WI_RID_CREATE_IBSS, mode);
 	wi_write_val(sc, WI_RID_MAX_DATALEN, 2304);
-	/* NB: for IEEE80211_BPF_NOACK */
-	wi_write_val(sc, WI_RID_ALT_RETRY_CNT, 0);
+	/* XXX IEEE80211_BPF_NOACK wants 0 */
+	wi_write_val(sc, WI_RID_ALT_RETRY_CNT, 2);
 	if (sc->sc_flags & WI_FLAGS_HAS_ROAMING)
 		wi_write_val(sc, WI_RID_ROAMING_MODE, 3); /* NB: disabled */
 
@@ -670,7 +671,7 @@
 		wi_stop_locked(sc, 1);
 
 	IEEE80211_ADDR_COPY(ic->ic_myaddr, IF_LLADDR(ifp));
-	if (wi_init_locked(sc, ic->ic_myaddr) != 0) {
+	if (wi_init_locked(sc, sc->sc_porttype, 3, ic->ic_myaddr) != 0) {
 		if_printf(ifp, "interface not running\n");
 		wi_stop_locked(sc, 1);
 		WI_UNLOCK(sc);
@@ -802,6 +803,7 @@
 {
 	struct ieee80211com *ic = vap->iv_ic;
 	struct ifnet *ifp = ic->ic_ifp;
+	struct ieee80211_node *bss;
 	struct wi_softc *sc = ifp->if_softc;
 	int error;
 
@@ -810,10 +812,9 @@
 		ieee80211_state_name[nstate]));
 
 	if (nstate == IEEE80211_S_AUTH) {
-		struct ieee80211_node *bss = vap->iv_bss;
+		WI_LOCK(sc);
+		wi_init_locked(sc, WI_PORTTYPE_BSS, 3, vap->iv_myaddr);
 
-		wi_init_locked(sc, vap->iv_myaddr);
-
 		if (vap->iv_flags & IEEE80211_F_PMGTON) {
 			wi_write_val(sc, WI_RID_MAX_SLEEP, ic->ic_lintval);
 			wi_write_val(sc, WI_RID_PM_ENABLED, 1);
@@ -824,16 +825,17 @@
 			    vap->iv_fragthreshold);
 		wi_write_txrate(sc, vap);
 
+		bss = vap->iv_bss;
+		wi_write_ssid(sc, WI_RID_DESIRED_SSID, bss->ni_essid, bss->ni_esslen);
+		wi_write_val(sc, WI_RID_OWN_CHNL,
+		    ieee80211_chan2ieee(ic, bss->ni_chan));
+
 		/* Configure WEP. */
 		if (ic->ic_caps & IEEE80211_C_WEP)
 			wi_write_wep(sc, vap);
 		else
 			sc->sc_encryption = 0;
 
-		wi_write_ssid(sc, WI_RID_DESIRED_SSID, bss->ni_essid, bss->ni_esslen);
-		wi_write_val(sc, WI_RID_OWN_CHNL,
-		    ieee80211_chan2ieee(ic, bss->ni_chan));
-
 		wi_enable(sc);		/* enable port */
 
 		/* Lucent firmware does not support the JOIN RID. */
@@ -846,6 +848,8 @@
 			    ieee80211_chan2ieee(ic, bss->ni_chan));
 			wi_write_rid(sc, WI_RID_JOIN_REQ, &join, sizeof(join));
 		}
+		WI_UNLOCK(sc);
+
 		/* NB: don't go through 802.11 layer, it'll send auth frame */
 		vap->iv_state = nstate;
 		return EINPROGRESS;
@@ -854,14 +858,30 @@
 	error = WI_VAP(vap)->wv_newstate(vap, nstate, arg);
 
 	if (nstate == IEEE80211_S_RUN && vap->iv_state != IEEE80211_S_RUN) {
+		WI_LOCK(sc);
 		if (vap->iv_opmode == IEEE80211_M_MONITOR)
 			wi_cmd(sc, WI_CMD_DEBUG | (WI_TEST_MONITOR << 8), 0, 0, 0);
 		if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
+			wi_init_locked(sc, WI_PORTTYPE_HOSTAP, 0, vap->iv_myaddr);
+
+			bss = vap->iv_bss;
+			wi_write_ssid(sc, WI_RID_OWN_SSID,
+			    bss->ni_essid, bss->ni_esslen);
+			wi_write_val(sc, WI_RID_OWN_CHNL,
+			    ieee80211_chan2ieee(ic, bss->ni_chan));
+			wi_write_val(sc, WI_RID_BASIC_RATE, 0x3);
+			wi_write_val(sc, WI_RID_SUPPORT_RATE, 0xf);
+			wi_write_txrate(sc, vap);
+
+			wi_write_val(sc, WI_RID_OWN_BEACON_INT, bss->ni_intval);
+			wi_write_val(sc, WI_RID_DTIM_PERIOD, vap->iv_dtim_period);
+
 			wi_write_val(sc, WI_RID_RTS_THRESH, vap->iv_rtsthreshold);
 			if (sc->sc_flags & WI_FLAGS_HAS_FRAGTHR)
 				wi_write_val(sc, WI_RID_FRAG_THRESH,
 				    vap->iv_fragthreshold);
-			wi_write_txrate(sc, vap);
+
+			wi_write_val(sc, WI_RID_PROMISC, 0);
 
 			/* Configure WEP. */
 			if (ic->ic_caps & IEEE80211_C_WEP)
@@ -869,16 +889,15 @@
 			else
 				sc->sc_encryption = 0;
 
-			/* NB: only Intersil supports HOSTAP so this works for now */
-			wi_write_ssid(sc, WI_RID_OWN_SSID,
-			    vap->iv_des_ssid[0].ssid, vap->iv_des_ssid[0].len);
-			wi_write_val(sc, WI_RID_OWN_BEACON_INT, ic->ic_bintval);
-			wi_write_val(sc, WI_RID_DTIM_PERIOD, vap->iv_dtim_period);
-
-			/* XXX: some cards need to be re-enabled for hostap */
-			wi_cmd(sc, WI_CMD_DISABLE | WI_PORT0, 0, 0, 0);
-			wi_cmd(sc, WI_CMD_ENABLE | WI_PORT0, 0, 0, 0);
+			wi_enable(sc);		/* enable port */
+#if 0
+			if (sc->sc_firmware_type == WI_INTERSIL) {
+				wi_cmd(sc, WI_CMD_DISABLE | WI_PORT0, 0, 0, 0);
+				wi_cmd(sc, WI_CMD_ENABLE | WI_PORT0, 0, 0, 0);
+			}
+#endif
 		}
+		WI_UNLOCK(sc);
 		return WI_VAP(vap)->wv_newstate(vap, nstate, arg);
 	}
 	return 0;


More information about the p4-projects mailing list