Date: Sun, 30 Mar 2008 04:31:47 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 138962 for review Message-ID: <200803300431.m2U4Vlp1022692@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=138962 Change 138962 by sam@sam_ebb on 2008/03/30 04:31:16 o remove NBPFILTER compat stuff o don't waste effort supporting h/w WEP; at 11b rates and even really old cpu's it's hardly worth not doing it in the host o use m_getcl and m_gethdr o use conversion tables instead of open code in mapping a tx rate to a firmware code o misc style cleanups Affected files ... .. //depot/projects/vap/sys/dev/wi/if_wi.c#20 edit .. //depot/projects/vap/sys/dev/wi/if_wivar.h#14 edit Differences ... ==== //depot/projects/vap/sys/dev/wi/if_wi.c#20 (text+ko) ==== @@ -64,8 +64,6 @@ #define WI_HERMES_STATS_WAR /* Work around stats counter bug. */ -#define NBPFILTER 1 - #include <sys/param.h> #include <sys/systm.h> #include <sys/endian.h> @@ -135,9 +133,6 @@ static void wi_tx_ex_intr(struct wi_softc *); static void wi_info_intr(struct wi_softc *); -static int wi_key_alloc(struct ieee80211vap *, const struct ieee80211_key *, - ieee80211_keyix *, ieee80211_keyix *); - static int wi_write_txrate(struct wi_softc *, struct ieee80211vap *); static int wi_write_wep(struct wi_softc *, struct ieee80211vap *); static int wi_write_multi(struct wi_softc *); @@ -180,7 +175,6 @@ static int wi_debug = 0; SYSCTL_INT(_hw_wi, OID_AUTO, debug, CTLFLAG_RW, &wi_debug, 0, "control debugging printfs"); - #define DPRINTF(X) if (wi_debug) printf X #else #define DPRINTF(X) @@ -332,7 +326,6 @@ ic->ic_opmode = IEEE80211_M_STA; ic->ic_caps = IEEE80211_C_PMGT | IEEE80211_C_MONITOR - | IEEE80211_C_WEP /* everyone supports WEP */ ; /* @@ -449,7 +442,6 @@ ic->ic_vap_delete = wi_vap_delete; ic->ic_update_mcast = wi_update_mcast; -#if NBPFILTER > 0 bpfattach(ifp, DLT_IEEE802_11_RADIO, sizeof(struct ieee80211_frame) + sizeof(sc->sc_tx_th)); /* @@ -468,7 +460,6 @@ sc->sc_rx_th_len = roundup(sizeof(sc->sc_rx_th), sizeof(u_int32_t)); sc->sc_rx_th.wr_ihdr.it_len = htole16(sc->sc_rx_th_len); sc->sc_rx_th.wr_ihdr.it_present = htole32(WI_RX_RADIOTAP_PRESENT); -#endif if (bootverbose) ieee80211_announce(ic); @@ -489,9 +480,7 @@ wi_stop_locked(sc, 0); WI_UNLOCK(sc); -#if NBPFILTER > 0 bpfdetach(ifp); -#endif ieee80211_ifdetach(&sc->sc_ic); bus_teardown_intr(dev, sc->irq, sc->wi_intrhand); @@ -520,8 +509,6 @@ vap = &wvp->wv_vap; ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac); - wvp->wv_key_alloc = vap->iv_key_alloc; - vap->iv_key_alloc = wi_key_alloc; vap->iv_max_aid = WI_MAX_AID; switch (opmode) { @@ -742,12 +729,11 @@ WI_LOCK(sc); wi_write_val(sc, WI_RID_OWN_CHNL, ieee80211_chan2ieee(ic, ic->ic_curchan)); -#if NBPFILTER > 0 + sc->sc_tx_th.wt_chan_freq = sc->sc_rx_th.wr_chan_freq = htole16(ic->ic_curchan->ic_freq); sc->sc_tx_th.wt_chan_flags = sc->sc_rx_th.wr_chan_flags = htole16(ic->ic_curchan->ic_flags); -#endif WI_UNLOCK(sc); } @@ -948,6 +934,7 @@ struct ieee80211_node *ni; struct ieee80211_frame *wh; struct mbuf *m0; + struct ieee80211_key *k; struct wi_frame frmhdr; int cur; @@ -978,13 +965,10 @@ ieee80211_free_node(ni); continue; } + wh = mtod(m0, struct ieee80211_frame *); frmhdr.wi_tx_ctl = htole16(WI_ENC_TX_802_11|WI_TXCNTL_TX_EX); - /* XXX check key for SWCRYPT instead of using operating mode */ - if ((wh->i_fc[1] & IEEE80211_FC1_WEP) && - (sc->sc_encryption & HOST_ENCRYPT)) { - struct ieee80211_key *k; - + if (wh->i_fc[1] & IEEE80211_FC1_WEP) { k = ieee80211_crypto_encap(ni, m0); if (k == NULL) { ieee80211_free_node(ni); @@ -993,13 +977,13 @@ } frmhdr.wi_tx_ctl |= htole16(WI_TXCNTL_NOCRYPT); } -#if NBPFILTER > 0 + if (bpf_peers_present(ifp->if_bpf)) { sc->sc_tx_th.wt_rate = ni->ni_txrate; bpf_mtap2(ifp->if_bpf, &sc->sc_tx_th, sc->sc_tx_th_len, m0); } -#endif + m_copydata(m0, 0, sizeof(struct ieee80211_frame), (caddr_t)&frmhdr.wi_whdr); m_adj(m0, sizeof(struct ieee80211_frame)); @@ -1058,6 +1042,7 @@ struct ieee80211com *ic = ni->ni_ic; struct ifnet *ifp = ic->ic_ifp; struct wi_softc *sc = ifp->if_softc; + struct ieee80211_key *k; struct ieee80211_frame *wh; struct wi_frame frmhdr; int cur; @@ -1086,27 +1071,19 @@ frmhdr.wi_tx_ctl = htole16(WI_ENC_TX_802_11|WI_TXCNTL_TX_EX); if (params && (params->ibp_flags & IEEE80211_BPF_NOACK)) frmhdr.wi_tx_ctl |= htole16(WI_TXCNTL_ALTRTRY); - /* XXX check key for SWCRYPT instead of using operating mode */ if ((wh->i_fc[1] & IEEE80211_FC1_WEP) && - (sc->sc_encryption & HOST_ENCRYPT)) { - if (!params || - (params && (params->ibp_flags & IEEE80211_BPF_CRYPTO))) { - struct ieee80211_key *k; - - k = ieee80211_crypto_encap(ni, m0); - if (k == NULL) { - rc = ENOMEM; - goto out; - } - frmhdr.wi_tx_ctl |= htole16(WI_TXCNTL_NOCRYPT); + (!params || (params && (params->ibp_flags & IEEE80211_BPF_CRYPTO)))) { + k = ieee80211_crypto_encap(ni, m0); + if (k == NULL) { + rc = ENOMEM; + goto out; } + frmhdr.wi_tx_ctl |= htole16(WI_TXCNTL_NOCRYPT); } -#if NBPFILTER > 0 if (bpf_peers_present(ifp->if_bpf)) { sc->sc_tx_th.wt_rate = ni->ni_txrate; bpf_mtap2(ifp->if_bpf, &sc->sc_tx_th, sc->sc_tx_th_len, m0); } -#endif m_copydata(m0, 0, sizeof(struct ieee80211_frame), (caddr_t)&frmhdr.wi_whdr); m_adj(m0, sizeof(struct ieee80211_frame)); @@ -1343,24 +1320,16 @@ len = 0; } - MGETHDR(m, M_DONTWAIT, MT_DATA); + if (off + len > MHLEN) + m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); + else + m = m_gethdr(M_DONTWAIT, MT_DATA); if (m == NULL) { CSR_WRITE_2(sc, WI_EVENT_ACK, WI_EV_RX); ifp->if_ierrors++; DPRINTF(("wi_rx_intr: MGET failed\n")); return; } - if (off + len > MHLEN) { - MCLGET(m, M_DONTWAIT); - if ((m->m_flags & M_EXT) == 0) { - CSR_WRITE_2(sc, WI_EVENT_ACK, WI_EV_RX); - m_freem(m); - ifp->if_ierrors++; - DPRINTF(("wi_rx_intr: MCLGET failed\n")); - return; - } - } - m->m_data += off - sizeof(struct ieee80211_frame); memcpy(m->m_data, &frmhdr.wi_whdr, sizeof(struct ieee80211_frame)); wi_read_bap(sc, fid, sizeof(frmhdr), @@ -1370,7 +1339,6 @@ CSR_WRITE_2(sc, WI_EVENT_ACK, WI_EV_RX); -#if NBPFILTER > 0 if (bpf_peers_present(ifp->if_bpf)) { /* XXX replace divide by table */ sc->sc_rx_th.wr_rate = frmhdr.wi_rx_rate / 5; @@ -1383,7 +1351,7 @@ sc->sc_rx_th.wr_flags |= IEEE80211_RADIOTAP_F_WEP; bpf_mtap2(ifp->if_bpf, &sc->sc_rx_th, sc->sc_rx_th_len, m); } -#endif + /* synchronize driver's BSSID with firmware's BSSID */ wh = mtod(m, struct ieee80211_frame *); dir = wh->i_fc[1] & IEEE80211_FC1_DIR_MASK; @@ -1413,7 +1381,6 @@ /* Read in the frame header */ if (wi_read_bap(sc, fid, 0, &frmhdr, sizeof(frmhdr)) == 0) { u_int16_t status = le16toh(frmhdr.wi_status); - /* * Spontaneous station disconnects appear as xmit * errors. Don't announce them and/or count them @@ -1686,78 +1653,32 @@ static int wi_write_txrate(struct wi_softc *sc, struct ieee80211vap *vap) { + static const uint16_t lucent_rates[12] = { + [ 0] = 3, /* auto */ + [ 1] = 1, /* 1Mb/s */ + [ 2] = 2, /* 2Mb/s */ + [ 5] = 4, /* 5.5Mb/s */ + [11] = 5 /* 11Mb/s */ + }; + static const uint16_t intersil_rates[12] = { + [ 0] = 0xf, /* auto */ + [ 1] = 0, /* 1Mb/s */ + [ 2] = 1, /* 2Mb/s */ + [ 5] = 2, /* 5.5Mb/s */ + [11] = 3, /* 11Mb/s */ + }; + const uint16_t *rates = sc->sc_firmware_type == WI_LUCENT ? + lucent_rates : intersil_rates; + struct ieee80211com *ic = vap->iv_ic; const struct ieee80211_txparam *tp; - struct ieee80211com *ic = vap->iv_ic; - int i; - u_int16_t rate; tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_bsschan)]; - if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) - rate = 0; /* auto */ - else - rate = tp->ucastrate / 2; - - /* rate: 0, 1, 2, 5, 11 */ - - switch (sc->sc_firmware_type) { - case WI_LUCENT: - switch (rate) { - case 0: /* auto == 11mbps auto */ - rate = 3; - break; - /* case 1, 2 map to 1, 2*/ - case 5: /* 5.5Mbps -> 4 */ - rate = 4; - break; - case 11: /* 11mbps -> 5 */ - rate = 5; - break; - default: - break; - } - break; - default: - /* Choose a bit according to this table. - * - * bit | data rate - * ----+------------------- - * 0 | 1Mbps - * 1 | 2Mbps - * 2 | 5.5Mbps - * 3 | 11Mbps - */ - for (i = 8; i > 0; i >>= 1) { - if (rate >= i) - break; - } - if (i == 0) - rate = 0xf; /* auto */ - else - rate = i; - break; - } - return wi_write_val(sc, WI_RID_TX_RATE, rate); + return wi_write_val(sc, WI_RID_TX_RATE, + (tp->ucastrate == IEEE80211_FIXED_RATE_NONE ? + rates[0] : rates[tp->ucastrate / 2])); } static int -wi_key_alloc(struct ieee80211vap *vap, const struct ieee80211_key *k, - ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix) -{ - struct wi_softc *sc = vap->iv_ic->ic_ifp->if_softc; - - /* - * When doing host encryption of outbound frames fail requests - * for keys that are not marked w/ the SWCRYPT flag so the - * net80211 layer falls back to s/w crypto. Note that we also - * fixup existing keys below to handle mode changes. - */ - if ((sc->sc_encryption & HOST_ENCRYPT) && - (k->wk_flags & IEEE80211_KEY_SWCRYPT) == 0) - return 0; - return WI_VAP(vap)->wv_key_alloc(vap, k, keyix, rxkeyix); -} - -static int wi_write_wep(struct wi_softc *sc, struct ieee80211vap *vap) { int error = 0; @@ -1816,47 +1737,9 @@ sc->sc_encryption = val; if ((val & PRIVACY_INVOKED) == 0) break; - error = wi_write_val(sc, WI_RID_P2_TX_CRYPT_KEY, - vap->iv_def_txkey); - if (error) - break; - if (val & HOST_DECRYPT) - break; - /* - * It seems that the firmware accept 104bit key only if - * all the keys have 104bit length. We get the length of - * the transmit key and use it for all other keys. - * Perhaps we should use software WEP for such situation. - */ - if (vap->iv_def_txkey != IEEE80211_KEYIX_NONE) - keylen = vap->iv_nw_keys[vap->iv_def_txkey].wk_keylen; - else /* XXX should not hapen */ - keylen = IEEE80211_WEP_KEYLEN; - if (keylen > IEEE80211_WEP_KEYLEN) - keylen = 13; /* 104bit keys */ - else - keylen = IEEE80211_WEP_KEYLEN; - for (i = 0; i < IEEE80211_WEP_NKID; i++) { - error = wi_write_rid(sc, WI_RID_P2_CRYPT_KEY0 + i, - vap->iv_nw_keys[i].wk_key, keylen); - if (error) - break; - } + error = wi_write_val(sc, WI_RID_P2_TX_CRYPT_KEY, vap->iv_def_txkey); break; } - /* - * XXX horrible hack; insure pre-existing keys are - * setup properly to do s/w crypto. - */ - for (i = 0; i < IEEE80211_WEP_NKID; i++) { - struct ieee80211_key *k = &vap->iv_nw_keys[i]; - if (k->wk_flags & IEEE80211_KEY_XMIT) { - if (sc->sc_encryption & HOST_ENCRYPT) - k->wk_flags |= IEEE80211_KEY_SWCRYPT; - else - k->wk_flags &= ~IEEE80211_KEY_SWCRYPT; - } - } return error; } @@ -2125,9 +2008,9 @@ sc->iobase = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->iobase_rid, 0, ~0, (1 << 6), rman_make_alignment_flags(1 << 6) | RF_ACTIVE); - if (!sc->iobase) { + if (sc->iobase == NULL) { device_printf(dev, "No I/O space?!\n"); - return (ENXIO); + return ENXIO; } sc->wi_io_addr = rman_get_start(sc->iobase); @@ -2137,10 +2020,9 @@ sc->mem_rid = rid; sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid, RF_ACTIVE); - - if (!sc->mem) { + if (sc->mem == NULL) { device_printf(dev, "No Mem space on prism2.5?\n"); - return (ENXIO); + return ENXIO; } sc->wi_btag = rman_get_bustag(sc->mem); @@ -2151,17 +2033,15 @@ sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid, RF_ACTIVE | ((sc->wi_bus_type == WI_BUS_PCCARD) ? 0 : RF_SHAREABLE)); - - if (!sc->irq) { + if (sc->irq == NULL) { wi_free(dev); device_printf(dev, "No irq?!\n"); - return (ENXIO); + return ENXIO; } sc->sc_dev = dev; sc->sc_unit = device_get_unit(dev); - - return (0); + return 0; } void @@ -2181,6 +2061,4 @@ bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem); sc->mem = NULL; } - - return; } ==== //depot/projects/vap/sys/dev/wi/if_wivar.h#14 (text+ko) ==== @@ -64,9 +64,6 @@ struct mbuf *, int, int, int, u_int32_t); int (*wv_newstate)(struct ieee80211vap *, enum ieee80211_state, int); - int (*wv_key_alloc)(struct ieee80211vap *, - const struct ieee80211_key *, - ieee80211_keyix *, ieee80211_keyix *); }; #define WI_VAP(vap) ((struct wi_vap *)(vap))
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200803300431.m2U4Vlp1022692>