Deleted Added
full compact
65c65
< __FBSDID("$FreeBSD: head/sys/dev/wi/if_wi.c 116898 2003-06-27 00:49:04Z sam $");
---
> __FBSDID("$FreeBSD: head/sys/dev/wi/if_wi.c 116951 2003-06-28 06:17:26Z sam $");
90a91
> #include <machine/atomic.h>
99d99
< #include <net/if_ieee80211.h>
100a101,103
> #include <net80211/ieee80211_var.h>
> #include <net80211/ieee80211_ioctl.h>
>
242,243c245
< int i, nrate, mword, buflen;
< u_int8_t r;
---
> int i, nrates, buflen;
245a248
> struct ieee80211_rateset *rs;
310c313
< ic->ic_flags = IEEE80211_F_HASPMGT | IEEE80211_F_HASAHDEMO;
---
> ic->ic_caps = IEEE80211_C_PMGT | IEEE80211_C_AHDEMO;
313d315
< ic->ic_fixed_rate = -1; /* Auto */
315c317,320
< /* Find available channels */
---
> /*
> * Query the card for available channels and setup the
> * channel table. We assume these are all 11b channels.
> */
319,321c324,332
< for (i = 0; i < 16; i++) {
< if (isset((u_int8_t*)&val, i))
< setbit(ic->ic_chan_avail, i + 1);
---
> KASSERT(val != 0, ("wi_attach: no available channels listed!"));
>
> val <<= 1; /* shift for base 1 indices */
> for (i = 1; i < 16; i++) {
> if (isset((u_int8_t*)&val, i)) {
> ic->ic_channels[i].ic_freq =
> ieee80211_ieee2mhz(i, IEEE80211_CHAN_B);
> ic->ic_channels[i].ic_flags = IEEE80211_CHAN_B;
> }
323,324d333
< KASSERT(ic->ic_chan_avail != 0,
< ("wi_attach: no available channels listed!"));
330a340,341
> *
> * If no channel is specified, let the 802.11 code select.
333,339c344,349
< if (wi_read_rid(sc, WI_RID_OWN_CHNL, &val, &buflen) == 0)
< ic->ic_ibss_chan = le16toh(val);
< else {
< /* use lowest available channel */
< for (i = 0; i < 16 && !isset(ic->ic_chan_avail, i); i++)
< ;
< ic->ic_ibss_chan = i;
---
> if (wi_read_rid(sc, WI_RID_OWN_CHNL, &val, &buflen) == 0) {
> val = le16toh(val);
> KASSERT(val < IEEE80211_CHAN_MAX &&
> ic->ic_channels[val].ic_flags != 0,
> ("wi_attach: invalid own channel %u!", val));
> ic->ic_ibss_chan = &ic->ic_channels[val];
358c368
< ic->ic_flags |= IEEE80211_F_HASIBSS;
---
> ic->ic_caps |= IEEE80211_C_IBSS;
370c380
< ic->ic_flags |= IEEE80211_F_HASIBSS;
---
> ic->ic_caps |= IEEE80211_C_IBSS;
377c387
< ic->ic_flags |= IEEE80211_F_HASHOSTAP;
---
> ic->ic_caps |= IEEE80211_C_HOSTAP;
385c395
< ic->ic_flags |= IEEE80211_F_HASIBSS;
---
> ic->ic_caps |= IEEE80211_C_IBSS;
396c406
< ic->ic_flags |= IEEE80211_F_HASWEP;
---
> ic->ic_caps |= IEEE80211_C_WEP;
399a410
> rs = &ic->ic_sup_rates[IEEE80211_MODE_11B];
401,404c412,418
< nrate = le16toh(*(u_int16_t *)ratebuf);
< if (nrate > IEEE80211_RATE_SIZE)
< nrate = IEEE80211_RATE_SIZE;
< memcpy(ic->ic_sup_rates, ratebuf + 2, nrate);
---
> nrates = le16toh(*(u_int16_t *)ratebuf);
> if (nrates > IEEE80211_RATE_MAXSIZE)
> nrates = IEEE80211_RATE_MAXSIZE;
> rs->rs_nrates = 0;
> for (i = 0; i < nrates; i++)
> if (ratebuf[2+i])
> rs->rs_rates[rs->rs_nrates++] = ratebuf[2+i];
407c421
< nrate = 0;
---
> rs->rs_nrates = 0;
418,419d431
< sc->sc_rts_thresh = 2347;
< sc->sc_frag_thresh = 2346;
435,462d446
< ifmedia_init(&sc->sc_media, 0, wi_media_change, wi_media_status);
< if_printf(ifp, "supported rates: ");
< #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_HASHOSTAP)
< ADD(IFM_AUTO, IFM_IEEE80211_HOSTAP);
< if (ic->ic_flags & IEEE80211_F_HASIBSS)
< ADD(IFM_AUTO, IFM_IEEE80211_ADHOC);
< ADD(IFM_AUTO, IFM_IEEE80211_ADHOC | IFM_FLAG0);
< for (i = 0; i < nrate; i++) {
< r = ic->ic_sup_rates[i];
< mword = ieee80211_rate2media(r, IEEE80211_T_DS);
< if (mword == 0)
< continue;
< printf("%s%d%sMbps", (i != 0 ? " " : ""),
< (r & IEEE80211_RATE_VAL) / 2, ((r & 0x1) != 0 ? ".5" : ""));
< ADD(mword, 0);
< if (ic->ic_flags & IEEE80211_F_HASHOSTAP)
< ADD(mword, IFM_IEEE80211_HOSTAP);
< if (ic->ic_flags & IEEE80211_F_HASIBSS)
< ADD(mword, IFM_IEEE80211_ADHOC);
< ADD(mword, IFM_IEEE80211_ADHOC | IFM_FLAG0);
< }
< printf("\n");
< ifmedia_set(&sc->sc_media, IFM_MAKEWORD(IFM_IEEE80211, IFM_AUTO, 0, 0));
< #undef ADD
<
466a451
> ieee80211_media_init(ifp, wi_media_change, wi_media_status);
485,487d469
< /* Delete all remaining media. */
< ifmedia_removeall(&sc->sc_media);
<
648c630,631
< wi_write_val(sc, WI_RID_OWN_CHNL, ic->ic_ibss_chan);
---
> wi_write_val(sc, WI_RID_OWN_CHNL,
> ieee80211_chan2ieee(ic, ic->ic_ibss_chan));
661c644
< wi_write_val(sc, WI_RID_RTS_THRESH, sc->sc_rts_thresh);
---
> wi_write_val(sc, WI_RID_RTS_THRESH, ic->ic_rtsthreshold);
663c646
< wi_write_val(sc, WI_RID_FRAG_THRESH, sc->sc_frag_thresh);
---
> wi_write_val(sc, WI_RID_FRAG_THRESH, ic->ic_fragthreshold);
699c682
< if (ic->ic_flags & IEEE80211_F_HASWEP)
---
> if (ic->ic_caps & IEEE80211_C_WEP)
747c730
< ic->ic_des_chan != IEEE80211_CHAN_ANY)) {
---
> ic->ic_des_chan != IEEE80211_CHAN_ANYC)) {
751,752c734,736
< if (ic->ic_des_chan != IEEE80211_CHAN_ANY)
< join.wi_chan = htole16(ic->ic_des_chan);
---
> if (ic->ic_des_chan != IEEE80211_CHAN_ANYC)
> join.wi_chan = htole16(
> ieee80211_chan2ieee(ic, ic->ic_des_chan));
786a771
> sc->sc_enabled = 0;
788d772
< sc->sc_enabled = 0;
807d790
< struct ieee80211_node *ni = NULL;
865,870c848,858
< IEEE80211_FC0_TYPE_DATA &&
< ((ni = ieee80211_find_node(ic, wh->i_addr1)) ==
< NULL || ni->ni_associd == 0)) {
< m_freem(m0);
< ifp->if_oerrors++;
< continue;
---
> IEEE80211_FC0_TYPE_DATA) {
> struct ieee80211_node *ni =
> ieee80211_find_node(ic, wh->i_addr1);
> int err = (ni == NULL || ni->ni_associd == 0);
> if (ni != NULL)
> ieee80211_unref_node(&ni);
> if (err) {
> m_freem(m0);
> ifp->if_oerrors++;
> continue;
> }
910c898
< wi_dump_pkt(&frmhdr, ni, -1);
---
> wi_dump_pkt(&frmhdr, NULL, -1);
1074,1077d1061
< case SIOCSIFMEDIA:
< case SIOCGIFMEDIA:
< error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
< break;
1161c1145
< wi_init(ifp->if_softc); /* XXX no error return */
---
> wi_init(sc); /* XXX no error return */
1174,1177c1158
< struct ieee80211com *ic = &sc->sc_ic;
< struct ifmedia_entry *ime;
< enum ieee80211_opmode newmode;
< int i, rate, error = 0;
---
> int error;
1179,1210c1160
< ime = sc->sc_media.ifm_cur;
< if (IFM_SUBTYPE(ime->ifm_media) == IFM_AUTO) {
< i = -1;
< } else {
< rate = ieee80211_media2rate(ime->ifm_media, IEEE80211_T_DS);
< if (rate == 0)
< return EINVAL;
< for (i = 0; i < IEEE80211_RATE_SIZE; i++) {
< if ((ic->ic_sup_rates[i] & IEEE80211_RATE_VAL) == rate)
< break;
< }
< 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))
< 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;
< }
---
> error = ieee80211_media_change(ifp);
1213c1163
< wi_init(ifp->if_softc); /* XXX error code lost */
---
> wi_init(sc); /* XXX no error return */
1216,1218d1165
< #if 0
< ifp->if_baudrate = ifmedia_baudrate(sc->sc_media.ifm_cur->ifm_media);
< #endif
1259c1206
< imr->ifm_active |= ieee80211_rate2media(rate, IEEE80211_T_DS);
---
> imr->ifm_active |= ieee80211_rate2media(ic, rate, IEEE80211_MODE_11B);
1279c1226
< struct ieee80211_node *ni = &ic->ic_bss;
---
> struct ieee80211_node *ni = ic->ic_bss;
1492c1439
< ieee80211_input(ifp, m, rssi, rstamp);
---
> ieee80211_input(ifp, m, rssi, rstamp, 0);
1859c1806
< wreq.wi_val[0] = htole16(sc->sc_frag_thresh);
---
> wreq.wi_val[0] = htole16(ic->ic_fragthreshold);
1967c1914
< wreq.wi_val[0] = htole16(sc->sc_rts_thresh);
---
> wreq.wi_val[0] = htole16(ic->ic_rtsthreshold);
2003a1951
> struct ieee80211_rateset *rs;
2057c2005
< sc->sc_frag_thresh = le16toh(wreq.wi_val[0]);
---
> ic->ic_fragthreshold = le16toh(wreq.wi_val[0]);
2060c2008
< sc->sc_rts_thresh = le16toh(wreq.wi_val[0]);
---
> ic->ic_rtsthreshold = le16toh(wreq.wi_val[0]);
2086,2087c2034,2036
< for (i = 0; i < IEEE80211_RATE_SIZE; i++) {
< if ((ic->ic_sup_rates[i] & IEEE80211_RATE_VAL)
---
> rs = &ic->ic_sup_rates[IEEE80211_MODE_11B];
> for (i = 0; i < rs->rs_nrates; i++) {
> if ((rs->rs_rates[i] & IEEE80211_RATE_VAL)
2091c2040
< if (i == IEEE80211_RATE_SIZE)
---
> if (i == rs->rs_nrates)
2171c2120
< rate = (ic->ic_sup_rates[ic->ic_fixed_rate] &
---
> rate = (ic->ic_sup_rates[IEEE80211_MODE_11B].rs_rates[ic->ic_fixed_rate] &
2573,2574c2522,2523
< struct ieee80211_node *ni = &ic->ic_bss;
< int i, buflen;
---
> struct ieee80211_node *ni = ic->ic_bss;
> int buflen;
2601c2550,2551
< ni->ni_chan = le16toh(val);
---
> /* XXX validate channel */
> ni->ni_chan = &ic->ic_channels[le16toh(val)];
2611,2616c2561
< ni->ni_nrate = 0;
< for (i = 0; i < IEEE80211_RATE_SIZE; i++) {
< if (ic->ic_sup_rates[i])
< ni->ni_rates[ni->ni_nrate++] =
< ic->ic_sup_rates[i];
< }
---
> ni->ni_rates = ic->ic_sup_rates[IEEE80211_MODE_11B];
2745c2690
< ni ? ni->ni_rates[ni->ni_txrate] & IEEE80211_RATE_VAL : -1, rssi);
---
> ni ? ni->ni_rates.rs_rates[ni->ni_txrate] & IEEE80211_RATE_VAL : -1, rssi);