summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authoronoe <onoe@NetBSD.org>2002-09-30 15:48:41 +0000
committeronoe <onoe@NetBSD.org>2002-09-30 15:48:41 +0000
commit9fadcea3726baa167a47523cfa282a4e51cd4f3b (patch)
tree95621a8eaba8c054f0f24b01a931bb4aceeff576 /sys/dev
parent92ef00aebaa1b02d89fcbfcbf52dac2678e445e0 (diff)
old lucent adhoc-demo mode (adhoc,flag0 or wiconfig -p 3) wasn't handled
correctly. To avoid massive extra code in each driver, now if_iee80211subr.c also handles non-standard old lucent adhoc-demo mode. This also fixes PR 14227.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ic/awi.c145
-rw-r--r--sys/dev/ic/awivar.h3
-rw-r--r--sys/dev/ic/wi.c93
-rw-r--r--sys/dev/ic/wivar.h3
4 files changed, 117 insertions, 127 deletions
diff --git a/sys/dev/ic/awi.c b/sys/dev/ic/awi.c
index b137aeb1f3d..e81f9748a07 100644
--- a/sys/dev/ic/awi.c
+++ b/sys/dev/ic/awi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: awi.c,v 1.48 2002/09/30 06:38:10 onoe Exp $ */
+/* $NetBSD: awi.c,v 1.49 2002/09/30 15:48:46 onoe Exp $ */
/*-
* Copyright (c) 1999,2000,2001 The NetBSD Foundation, Inc.
@@ -85,7 +85,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.48 2002/09/30 06:38:10 onoe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: awi.c,v 1.49 2002/09/30 15:48:46 onoe Exp $");
#include "opt_inet.h"
#include "bpfilter.h"
@@ -234,12 +234,14 @@ awi_attach(struct awi_softc *sc)
IFQ_SET_READY(&ifp->if_snd);
memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
+ ic->ic_flags =
+ IEEE80211_F_HASWEP | IEEE80211_F_HASIBSS | IEEE80211_F_HASHOSTAP;
if (sc->sc_mib_phy.IEEE_PHY_Type == AWI_PHY_TYPE_FH)
ic->ic_phytype = IEEE80211_T_FH;
- else
+ else {
ic->ic_phytype = IEEE80211_T_DS;
- ic->ic_flags =
- IEEE80211_F_HASWEP | IEEE80211_F_HASIBSS | IEEE80211_F_HASHAP;
+ ic->ic_flags |= IEEE80211_F_HASAHDEMO;
+ }
ic->ic_opmode = IEEE80211_M_STA;
ic->ic_state = IEEE80211_S_INIT;
ic->ic_newstate = awi_newstate;
@@ -486,10 +488,23 @@ awi_init(struct ifnet *ifp)
}
ic->ic_state = IEEE80211_S_INIT;
- sc->sc_mib_local.Network_Mode =
- (ic->ic_opmode == IEEE80211_M_ADHOC) ? 0 : 1;
- sc->sc_mib_local.Acting_as_AP =
- (ic->ic_opmode == IEEE80211_M_HOSTAP) ? 1 : 0;
+ ic->ic_flags &= ~IEEE80211_F_IBSSON;
+ switch (ic->ic_opmode) {
+ case IEEE80211_M_STA:
+ sc->sc_mib_local.Network_Mode = 1;
+ sc->sc_mib_local.Acting_as_AP = 0;
+ break;
+ case IEEE80211_M_IBSS:
+ ic->ic_flags |= IEEE80211_F_IBSSON;
+ case IEEE80211_M_AHDEMO:
+ sc->sc_mib_local.Network_Mode = 0;
+ sc->sc_mib_local.Acting_as_AP = 0;
+ break;
+ case IEEE80211_M_HOSTAP:
+ sc->sc_mib_local.Network_Mode = 1;
+ sc->sc_mib_local.Acting_as_AP = 1;
+ break;
+ }
memset(&sc->sc_mib_mac.aDesired_ESS_ID, 0, AWI_ESS_ID_SIZE);
sc->sc_mib_mac.aDesired_ESS_ID[0] = IEEE80211_ELEMID_SSID;
sc->sc_mib_mac.aDesired_ESS_ID[1] = ic->ic_des_esslen;
@@ -534,7 +549,7 @@ awi_init(struct ifnet *ifp)
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
- if ((ic->ic_opmode == IEEE80211_M_ADHOC && sc->sc_no_bssid) ||
+ if (ic->ic_opmode == IEEE80211_M_AHDEMO ||
ic->ic_opmode == IEEE80211_M_HOSTAP) {
ni->ni_chan = ic->ic_ibss_chan;
ni->ni_intval = ic->ic_lintval;
@@ -564,7 +579,8 @@ awi_init(struct ifnet *ifp)
}
if (ic->ic_flags & IEEE80211_F_WEPON)
ni->ni_capinfo |= IEEE80211_CAPINFO_PRIVACY;
- ic->ic_flags |= IEEE80211_F_SIBSS;
+ if (ic->ic_opmode != IEEE80211_M_AHDEMO)
+ ic->ic_flags |= IEEE80211_F_SIBSS;
ic->ic_state = IEEE80211_S_SCAN; /*XXX*/
sc->sc_substate = AWI_ST_NONE;
ieee80211_new_state(&ic->ic_if, IEEE80211_S_RUN, -1);
@@ -679,8 +695,8 @@ awi_start(struct ifnet *ifp)
}
wh = mtod(m0, struct ieee80211_frame *);
if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
- ic->ic_opmode != IEEE80211_M_STA &&
- sc->sc_no_bssid == 0 &&
+ (ic->ic_opmode == IEEE80211_M_HOSTAP ||
+ ic->ic_opmode == IEEE80211_M_IBSS) &&
sc->sc_adhoc_ap == 0 &&
(ifp->if_flags & IFF_LINK0) == 0 &&
(wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
@@ -849,11 +865,12 @@ awi_media_change(struct ifnet *ifp)
struct awi_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
struct ifmedia_entry *ime;
- int i, rate, error = 0;
+ enum ieee80211_opmode newmode;
+ int i, rate, newadhoc_ap, error = 0;
ime = sc->sc_media.ifm_cur;
if (IFM_SUBTYPE(ime->ifm_media) == IFM_AUTO) {
- ic->ic_fixed_rate = -1;
+ i = -1;
} else {
rate = ieee80211_media2rate(ime->ifm_media, ic->ic_phytype);
if (rate == 0)
@@ -864,64 +881,43 @@ awi_media_change(struct ifnet *ifp)
}
if (i == IEEE80211_RATE_SIZE)
return EINVAL;
+ }
+ if (ic->ic_fixed_rate != i) {
ic->ic_fixed_rate = i;
+ error = ENETRESET;
}
/*
* combination of mediaopt
*
- * hostap adhoc flag0 opmode no_bssid adhoc_ap comment
- * + - - HOSTAP 0 0 HostAP
- * - + - ADHOC 0 0 IBSS
- * - + + ADHOC 1 0 WaveLAN adhoc
- * - - + ADHOC 0 1 Melco old Sta
+ * hostap adhoc flag0 opmode adhoc_ap comment
+ * + - - HOSTAP 0 HostAP
+ * - + - IBSS 0 IBSS
+ * - + + AHDEMO 0 WaveLAN adhoc
+ * - - + IBSS 1 Melco old Sta
* also LINK0
- * - - - STA 0 0 Infra Station
+ * - - - STA 0 Infra Station
*/
- ic->ic_flags &= ~IEEE80211_F_IBSSON;
- if (ime->ifm_media & IFM_IEEE80211_HOSTAP) {
- if (ic->ic_opmode != IEEE80211_M_HOSTAP) {
- ic->ic_opmode = IEEE80211_M_HOSTAP;
- sc->sc_no_bssid = 0;
- sc->sc_adhoc_ap = 0;
- error = ENETRESET;
- }
- } else if (ime->ifm_media & IFM_IEEE80211_ADHOC) {
- if (ic->ic_opmode != IEEE80211_M_ADHOC ||
- sc->sc_adhoc_ap != 0) {
- ic->ic_opmode = IEEE80211_M_ADHOC;
- sc->sc_adhoc_ap = 0;
- error = ENETRESET;
- }
+ newadhoc_ap = 0;
+ if (ime->ifm_media & IFM_IEEE80211_HOSTAP)
+ newmode = IEEE80211_M_HOSTAP;
+ else if (ime->ifm_media & IFM_IEEE80211_ADHOC) {
if (ic->ic_phytype == IEEE80211_T_DS &&
- (ime->ifm_media & IFM_FLAG0)) {
- if (sc->sc_no_bssid == 0) {
- sc->sc_no_bssid = 1;
- error = ENETRESET;
- }
- } else {
- if (sc->sc_no_bssid) {
- sc->sc_no_bssid = 0;
- error = ENETRESET;
- }
- ic->ic_flags |= IEEE80211_F_IBSSON;
- }
+ (ime->ifm_media & IFM_FLAG0))
+ newmode = IEEE80211_M_AHDEMO;
+ else
+ newmode = IEEE80211_M_IBSS;
} else if (ime->ifm_media & IFM_FLAG0) {
- if (ic->ic_opmode != IEEE80211_M_ADHOC ||
- sc->sc_adhoc_ap == 0) {
- ic->ic_opmode = IEEE80211_M_ADHOC;
- sc->sc_adhoc_ap = 1;
- sc->sc_no_bssid = 0;
- error = ENETRESET;
- }
- } else {
- if (ic->ic_opmode != IEEE80211_M_STA) {
- ic->ic_opmode = IEEE80211_M_STA;
- sc->sc_no_bssid = 0;
- sc->sc_adhoc_ap = 0;
- error = ENETRESET;
- }
+ newmode = IEEE80211_M_IBSS;
+ newadhoc_ap = 1;
+ } else
+ newmode = IEEE80211_M_STA;
+ if (ic->ic_opmode != newmode || sc->sc_adhoc_ap != newadhoc_ap) {
+ ic->ic_opmode = newmode;
+ sc->sc_adhoc_ap = newadhoc_ap;
+ error = ENETRESET;
}
+
if (error == ENETRESET) {
if (sc->sc_enabled)
error = awi_init(ifp);
@@ -956,14 +952,14 @@ awi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
switch (ic->ic_opmode) {
case IEEE80211_M_STA:
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
if (sc->sc_adhoc_ap)
imr->ifm_active |= IFM_FLAG0;
- else {
+ else
imr->ifm_active |= IFM_IEEE80211_ADHOC;
- if (sc->sc_no_bssid)
- imr->ifm_active |= IFM_FLAG0;
- }
+ break;
+ case IEEE80211_M_AHDEMO:
+ imr->ifm_active |= IFM_IEEE80211_ADHOC | IFM_FLAG0;
break;
case IEEE80211_M_HOSTAP:
imr->ifm_active |= IFM_IEEE80211_HOSTAP;
@@ -1722,7 +1718,8 @@ awi_newstate(void *arg, enum ieee80211_state nstate)
awi_drvstate(sc, AWI_DRV_RESET);
break;
case IEEE80211_S_SCAN:
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
+ ic->ic_opmode == IEEE80211_M_AHDEMO)
awi_drvstate(sc, AWI_DRV_ADHSC);
else
awi_drvstate(sc, AWI_DRV_INFSY);
@@ -1734,7 +1731,8 @@ awi_newstate(void *arg, enum ieee80211_state nstate)
awi_drvstate(sc, AWI_DRV_INFAUTH);
break;
case IEEE80211_S_RUN:
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
+ ic->ic_opmode == IEEE80211_M_AHDEMO)
awi_drvstate(sc, AWI_DRV_ADHSY);
else
awi_drvstate(sc, AWI_DRV_INFASSOC);
@@ -1886,8 +1884,7 @@ awi_newstate(void *arg, enum ieee80211_state nstate)
awi_write_1(sc, AWI_CA_SYNC_IDX, 0);
awi_write_2(sc, AWI_CA_SYNC_DWELL, 0);
}
- if ((ic->ic_flags & IEEE80211_F_SIBSS) &&
- !sc->sc_no_bssid)
+ if (ic->ic_flags & IEEE80211_F_SIBSS)
awi_write_1(sc, AWI_CA_SYNC_STARTBSS, 1);
else
awi_write_1(sc, AWI_CA_SYNC_STARTBSS, 0);
@@ -1954,7 +1951,8 @@ awi_ether_encap(struct awi_softc *sc, struct mbuf *m)
*(u_int16_t *)wh->i_seq =
htole16(ni->ni_txseq << IEEE80211_SEQ_SEQ_SHIFT);
ni->ni_txseq++;
- if (ic->ic_opmode == IEEE80211_M_ADHOC) {
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
+ ic->ic_opmode == IEEE80211_M_AHDEMO) {
wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
if (sc->sc_adhoc_ap)
IEEE80211_ADDR_COPY(wh->i_addr1, ni->ni_macaddr);
@@ -1989,7 +1987,8 @@ awi_ether_modcap(struct awi_softc *sc, struct mbuf *m)
return m;
memcpy(&eh, mtod(m, caddr_t) + sizeof(wh), sizeof(eh));
m_adj(m, sizeof(eh) - sizeof(*llc));
- if (ic->ic_opmode == IEEE80211_M_ADHOC)
+ if (ic->ic_opmode == IEEE80211_M_IBSS ||
+ ic->ic_opmode == IEEE80211_M_AHDEMO)
IEEE80211_ADDR_COPY(wh.i_addr2, eh.ether_shost);
memcpy(mtod(m, caddr_t), &wh, sizeof(wh));
llc = (struct llc *)(mtod(m, caddr_t) + sizeof(wh));
diff --git a/sys/dev/ic/awivar.h b/sys/dev/ic/awivar.h
index f459ebf3e24..0a9362cd48e 100644
--- a/sys/dev/ic/awivar.h
+++ b/sys/dev/ic/awivar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: awivar.h,v 1.16 2001/09/19 04:09:55 onoe Exp $ */
+/* $NetBSD: awivar.h,v 1.17 2002/09/30 15:48:48 onoe Exp $ */
/*-
* Copyright (c) 1999,2000,2001 The NetBSD Foundation, Inc.
@@ -87,7 +87,6 @@ struct awi_softc {
sc_busy:1,
sc_cansleep:1,
sc_enab_intr:1,
- sc_no_bssid:1,
sc_adhoc_ap:1,
sc_invalid:1;
struct ifmedia sc_media;
diff --git a/sys/dev/ic/wi.c b/sys/dev/ic/wi.c
index 2803a178fbb..3b0af7ac3ff 100644
--- a/sys/dev/ic/wi.c
+++ b/sys/dev/ic/wi.c
@@ -1,4 +1,4 @@
-/* $NetBSD: wi.c,v 1.90 2002/09/30 06:50:35 onoe Exp $ */
+/* $NetBSD: wi.c,v 1.91 2002/09/30 15:48:44 onoe Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -70,7 +70,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.90 2002/09/30 06:50:35 onoe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.91 2002/09/30 15:48:44 onoe Exp $");
#define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */
#define WI_HERMES_STATS_WAR /* Work around stats counter bug. */
@@ -241,7 +241,7 @@ wi_attach(struct wi_softc *sc)
ic->ic_phytype = IEEE80211_T_DS;
ic->ic_opmode = IEEE80211_M_STA;
- ic->ic_flags = IEEE80211_F_HASPMGT;
+ ic->ic_flags = IEEE80211_F_HASPMGT | IEEE80211_F_HASAHDEMO;
ic->ic_state = IEEE80211_S_INIT;
ic->ic_newstate = wi_newstate;
@@ -290,7 +290,7 @@ wi_attach(struct wi_softc *sc)
sc->sc_flags |= WI_FLAGS_HAS_ROAMING;
sc->sc_flags |= WI_FLAGS_HAS_SYSSCALE;
if (sc->sc_sta_firmware_ver >= 800) {
- ic->ic_flags |= IEEE80211_F_HASHAP;
+ ic->ic_flags |= IEEE80211_F_HASHOSTAP;
ic->ic_flags |= IEEE80211_F_HASIBSS;
}
sc->sc_ibss_port = 0;
@@ -333,7 +333,7 @@ wi_attach(struct wi_softc *sc)
#define ADD(s, o) ifmedia_add(&sc->sc_media, \
IFM_MAKEWORD(IFM_IEEE80211, (s), (o), 0), 0, NULL)
ADD(IFM_AUTO, 0);
- if (ic->ic_flags & IEEE80211_F_HASHAP)
+ if (ic->ic_flags & IEEE80211_F_HASHOSTAP)
ADD(IFM_AUTO, IFM_IEEE80211_HOSTAP);
if (ic->ic_flags & IEEE80211_F_HASIBSS)
ADD(IFM_AUTO, IFM_IEEE80211_ADHOC);
@@ -346,7 +346,7 @@ wi_attach(struct wi_softc *sc)
printf("%s%d%sMbps", (i != 0 ? " " : ""),
(r & IEEE80211_RATE_VAL) / 2, ((r & 0x1) != 0 ? ".5" : ""));
ADD(mword, 0);
- if (ic->ic_flags & IEEE80211_F_HASHAP)
+ if (ic->ic_flags & IEEE80211_F_HASHOSTAP)
ADD(mword, IFM_IEEE80211_HOSTAP);
if (ic->ic_flags & IEEE80211_F_HASIBSS)
ADD(mword, IFM_IEEE80211_ADHOC);
@@ -531,9 +531,12 @@ wi_init(struct ifnet *ifp)
case IEEE80211_M_STA:
wi_write_val(sc, WI_RID_PORTTYPE, WI_PORTTYPE_BSS);
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
wi_write_val(sc, WI_RID_PORTTYPE, sc->sc_ibss_port);
break;
+ case IEEE80211_M_AHDEMO:
+ wi_write_val(sc, WI_RID_PORTTYPE, WI_PORTTYPE_ADHOC);
+ break;
case IEEE80211_M_HOSTAP:
wi_write_val(sc, WI_RID_PORTTYPE, WI_PORTTYPE_HOSTAP);
break;
@@ -613,14 +616,17 @@ wi_init(struct ifnet *ifp)
sc->sc_txd[i].d_fid));
sc->sc_txd[i].d_len = 0;
}
+ if (ic->ic_opmode == IEEE80211_M_IBSS)
+ ic->ic_flags |= IEEE80211_F_IBSSON;
+ else
+ ic->ic_flags &= ~IEEE80211_F_IBSSON;
/* Enable port 0 */
wi_cmd(sc, WI_CMD_ENABLE | WI_PORT0, 0, 0, 0);
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
- if ((ic->ic_opmode == IEEE80211_M_ADHOC &&
- (sc->sc_flags & WI_FLAGS_NO_BSSID)) ||
- (ic->ic_opmode == IEEE80211_M_HOSTAP))
+ if (ic->ic_opmode == IEEE80211_M_AHDEMO ||
+ ic->ic_opmode == IEEE80211_M_HOSTAP)
wi_newstate(sc, IEEE80211_S_RUN);
/* Enable interrupts */
@@ -936,11 +942,12 @@ wi_media_change(struct ifnet *ifp)
struct wi_softc *sc = ifp->if_softc;
struct ieee80211com *ic = &sc->sc_ic;
struct ifmedia_entry *ime;
+ enum ieee80211_opmode newmode;
int i, rate, error = 0;
ime = sc->sc_media.ifm_cur;
if (IFM_SUBTYPE(ime->ifm_media) == IFM_AUTO) {
- ic->ic_fixed_rate = -1;
+ i = -1;
} else {
rate = ieee80211_media2rate(ime->ifm_media, IEEE80211_T_DS);
if (rate == 0)
@@ -951,40 +958,24 @@ wi_media_change(struct ifnet *ifp)
}
if (i == IEEE80211_RATE_SIZE)
return EINVAL;
+ }
+ if (ic->ic_fixed_rate != i) {
ic->ic_fixed_rate = i;
+ error = ENETRESET;
}
if ((ime->ifm_media & IFM_IEEE80211_ADHOC) &&
- (ime->ifm_media & IFM_FLAG0)) {
- if (ic->ic_opmode != IEEE80211_M_ADHOC ||
- (sc->sc_flags & WI_FLAGS_NO_BSSID) == 0) {
- ic->ic_opmode = IEEE80211_M_ADHOC;
- ic->ic_flags &= ~IEEE80211_F_IBSSON;
- sc->sc_flags |= WI_FLAGS_NO_BSSID;
- error = ENETRESET;
- }
- } else if (ime->ifm_media & IFM_IEEE80211_ADHOC) {
- if (ic->ic_opmode != IEEE80211_M_ADHOC ||
- (sc->sc_flags & WI_FLAGS_NO_BSSID)) {
- ic->ic_opmode = IEEE80211_M_ADHOC;
- ic->ic_flags |= IEEE80211_F_IBSSON;
- sc->sc_flags &= ~WI_FLAGS_NO_BSSID;
- error = ENETRESET;
- }
- } else if (ime->ifm_media & IFM_IEEE80211_HOSTAP) {
- if (ic->ic_opmode != IEEE80211_M_HOSTAP) {
- ic->ic_opmode = IEEE80211_M_HOSTAP;
- ic->ic_flags &= ~IEEE80211_F_IBSSON;
- sc->sc_flags &= ~WI_FLAGS_NO_BSSID;
- error = ENETRESET;
- }
- } else {
- if (ic->ic_opmode != IEEE80211_M_STA) {
- ic->ic_opmode = IEEE80211_M_STA;
- ic->ic_flags &= ~IEEE80211_F_IBSSON;
- sc->sc_flags &= ~WI_FLAGS_NO_BSSID;
- error = ENETRESET;
- }
+ (ime->ifm_media & IFM_FLAG0))
+ newmode = IEEE80211_M_AHDEMO;
+ else if (ime->ifm_media & IFM_IEEE80211_ADHOC)
+ newmode = IEEE80211_M_IBSS;
+ else if (ime->ifm_media & IFM_IEEE80211_HOSTAP)
+ newmode = IEEE80211_M_HOSTAP;
+ else
+ newmode = IEEE80211_M_STA;
+ if (ic->ic_opmode != newmode) {
+ ic->ic_opmode = newmode;
+ error = ENETRESET;
}
if (error == ENETRESET) {
if (sc->sc_enabled)
@@ -994,7 +985,7 @@ wi_media_change(struct ifnet *ifp)
}
ifp->if_baudrate = ifmedia_baudrate(sc->sc_media.ifm_cur->ifm_media);
- return 0;
+ return error;
}
static void
@@ -1032,10 +1023,11 @@ wi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
switch (ic->ic_opmode) {
case IEEE80211_M_STA:
break;
- case IEEE80211_M_ADHOC:
+ case IEEE80211_M_IBSS:
imr->ifm_active |= IFM_IEEE80211_ADHOC;
- if ((sc->sc_flags & WI_FLAGS_NO_BSSID))
- imr->ifm_active |= IFM_FLAG0;
+ break;
+ case IEEE80211_M_AHDEMO:
+ imr->ifm_active |= IFM_IEEE80211_ADHOC | IFM_FLAG0;
break;
case IEEE80211_M_HOSTAP:
imr->ifm_active |= IFM_IEEE80211_HOSTAP;
@@ -1199,11 +1191,7 @@ wi_info_intr(struct wi_softc *sc)
/* FALLTHROUGH */
case DISCONNECTED:
case ASSOC_FAILED:
- if ((ic->ic_opmode == IEEE80211_M_ADHOC &&
- (sc->sc_flags & WI_FLAGS_NO_BSSID)) ||
- ic->ic_opmode == IEEE80211_M_HOSTAP)
- ;
- else
+ if (ic->ic_opmode == IEEE80211_M_STA)
ieee80211_new_state(ifp, IEEE80211_S_INIT, -1);
break;
}
@@ -1537,6 +1525,7 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, caddr_t data)
sc->sc_nodelen = le16toh(wreq.wi_val[0]) * 2;
memcpy(sc->sc_nodename, &wreq.wi_val[1], sc->sc_nodelen);
break;
+
case WI_RID_MICROWAVE_OVEN:
case WI_RID_ROAMING_MODE:
case WI_RID_SYSTEM_SCALE:
@@ -1580,6 +1569,7 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, caddr_t data)
break;
}
break;
+
case WI_RID_TX_RATE:
switch (le16toh(wreq.wi_val[0])) {
case 3:
@@ -1598,10 +1588,12 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, caddr_t data)
if (sc->sc_enabled)
error = wi_write_txrate(sc);
break;
+
case WI_RID_SCAN_APS:
if (sc->sc_enabled && ic->ic_opmode != IEEE80211_M_HOSTAP)
error = wi_scan_ap(sc);
break;
+
case WI_RID_MGMT_XMIT:
if (!sc->sc_enabled) {
error = ENETDOWN;
@@ -1619,6 +1611,7 @@ wi_set_cfg(struct ifnet *ifp, u_long cmd, caddr_t data)
}
IF_ENQUEUE(&ic->ic_mgtq, m);
break;
+
default:
if (sc->sc_enabled) {
error = wi_write_rid(sc, wreq.wi_type, wreq.wi_val,
diff --git a/sys/dev/ic/wivar.h b/sys/dev/ic/wivar.h
index 9349b8cfbfa..49ecdc443ce 100644
--- a/sys/dev/ic/wivar.h
+++ b/sys/dev/ic/wivar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: wivar.h,v 1.21 2002/09/30 06:50:36 onoe Exp $ */
+/* $NetBSD: wivar.h,v 1.22 2002/09/30 15:48:45 onoe Exp $ */
/*
* Copyright (c) 1997, 1998, 1999
@@ -100,7 +100,6 @@ struct wi_softc {
/* Values for wi_flags. */
#define WI_FLAGS_ATTACHED 0x0001
#define WI_FLAGS_INITIALIZED 0x0002
-#define WI_FLAGS_NO_BSSID 0x0004
#define WI_FLAGS_HAS_MOR 0x0010
#define WI_FLAGS_HAS_ROAMING 0x0020
#define WI_FLAGS_HAS_DIVERSITY 0x0040