Date: Fri, 28 Mar 2008 00:17:38 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 138765 for review Message-ID: <200803280017.m2S0Hcq7088181@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=138765 Change 138765 by sam@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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803280017.m2S0Hcq7088181>