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