diff options
| author | dyoung <dyoung@NetBSD.org> | 2003-11-02 01:39:22 +0000 |
|---|---|---|
| committer | dyoung <dyoung@NetBSD.org> | 2003-11-02 01:39:22 +0000 |
| commit | 45f756f52012cc81cbd648b4cdb7d15cfaa58dd3 (patch) | |
| tree | 365df1cc631629926abe24a57be2b82045eb2005 /sys/dev/ic | |
| parent | 85f84a3155648db7316163d0ef6844b3758feba9 (diff) | |
Mark the available channels using the ic_channels table instead of
setting bits in ic_chan_avail, which is the responsibility of
ieee80211_ifattach. I cannot believe the previous code worked.
Diffstat (limited to 'sys/dev/ic')
| -rw-r--r-- | sys/dev/ic/wi.c | 48 |
1 files changed, 21 insertions, 27 deletions
diff --git a/sys/dev/ic/wi.c b/sys/dev/ic/wi.c index 7c4989cd99d..82bce3fbbe0 100644 --- a/sys/dev/ic/wi.c +++ b/sys/dev/ic/wi.c @@ -1,4 +1,4 @@ -/* $NetBSD: wi.c,v 1.141 2003/11/02 00:55:46 dyoung Exp $ */ +/* $NetBSD: wi.c,v 1.142 2003/11/02 01:39:22 dyoung Exp $ */ /* * Copyright (c) 1997, 1998, 1999 @@ -70,7 +70,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.141 2003/11/02 00:55:46 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: wi.c,v 1.142 2003/11/02 01:39:22 dyoung Exp $"); #define WI_HERMES_AUTOINC_WAR /* Work around data write autoinc bug. */ #define WI_HERMES_STATS_WAR /* Work around stats counter bug. */ @@ -211,8 +211,8 @@ wi_attach(struct wi_softc *sc) { struct ieee80211com *ic = &sc->sc_ic; struct ifnet *ifp = &ic->ic_if; - int chan, i, nrate, buflen; - u_int16_t val; + int chan, nrate, buflen; + u_int16_t val, chanavail; u_int8_t ratebuf[2 + IEEE80211_RATE_SIZE]; static const u_int8_t empty_macaddr[IEEE80211_ADDR_LEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 @@ -265,18 +265,28 @@ wi_attach(struct wi_softc *sc) ic->ic_max_aid = WI_MAX_AID; /* Find available channel */ - buflen = sizeof(val); - if (wi_read_rid(sc, WI_RID_CHANNEL_LIST, &val, &buflen) != 0) - val = htole16(0x1fff); /* assume 1-11 */ - for (i = 0; i < 16; i++) { - chan = i + 1; - if (isset((u_int8_t*)&val, i)) - setbit(ic->ic_chan_avail, chan); + buflen = sizeof(chanavail); + if (wi_read_rid(sc, WI_RID_CHANNEL_LIST, &chanavail, &buflen) != 0) + chanavail = htole16(0x1fff); /* assume 1-11 */ + for (chan = 16; chan > 0; chan--) { + if (!isset((u_int8_t*)&chanavail, chan - 1)) + continue; + ic->ic_ibss_chan = &ic->ic_channels[chan]; ic->ic_channels[chan].ic_freq = ieee80211_ieee2mhz(chan, IEEE80211_CHAN_2GHZ); ic->ic_channels[chan].ic_flags = IEEE80211_CHAN_B; } + /* Find default IBSS channel */ + buflen = sizeof(val); + if (wi_read_rid(sc, WI_RID_OWN_CHNL, &val, &buflen) == 0) { + chan = le16toh(val); + if (isset((u_int8_t*)&chanavail, chan - 1)) + ic->ic_ibss_chan = &ic->ic_channels[chan]; + } + if (ic->ic_ibss_chan == NULL) + panic("%s: no available channel\n", sc->sc_dev.dv_xname); + if (sc->sc_firmware_type == WI_LUCENT) { sc->sc_dbm_offset = WI_LUCENT_DBM_OFFSET; } else { @@ -288,22 +298,6 @@ wi_attach(struct wi_softc *sc) sc->sc_dbm_offset = WI_PRISM_DBM_OFFSET; } - /* Find default IBSS channel */ - buflen = sizeof(val); - if (wi_read_rid(sc, WI_RID_OWN_CHNL, &val, &buflen) == 0) - chan = le16toh(val); - else { - /* use lowest available channel */ - for (chan = 0; chan < 16; chan++) { - if (isset(ic->ic_chan_avail, chan)) - break; - } - } - if (!isset(ic->ic_chan_avail, chan)) - panic("%s: no available channel\n", sc->sc_dev.dv_xname); - - ic->ic_ibss_chan = &ic->ic_channels[chan]; - /* * Set flags based on firmware version. */ |
