Date: Sat, 26 Nov 2005 06:34:06 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 87257 for review Message-ID: <200511260634.jAQ6Y608042011@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=87257 Change 87257 by sam@sam_ebb on 2005/11/26 06:33:35 first cut at wme and fixing ifs parameters Affected files ... .. //depot/projects/wifi/sys/dev/ral/if_ral.c#14 edit .. //depot/projects/wifi/sys/dev/ral/if_ralvar.h#5 edit Differences ... ==== //depot/projects/wifi/sys/dev/ral/if_ral.c#14 (text+ko) ==== @@ -109,7 +109,7 @@ static uint8_t ral_plcp_signal(int); static void ral_setup_tx_desc(struct ral_softc *, struct ral_tx_desc *, uint32_t, int, int, int, - bus_addr_t); + u_int, u_int, u_int, bus_addr_t); static int ral_tx_bcn(struct ral_softc *, struct mbuf *, struct ieee80211_node *); static int ral_tx_mgt(struct ral_softc *, struct mbuf *, @@ -136,6 +136,7 @@ static void ral_enable_tsf_sync(struct ral_softc *); static void ral_update_plcp(struct ral_softc *); static void ral_update_slot(struct ifnet *); +static int ral_wme_update(struct ieee80211com *); static void ral_update_led(struct ral_softc *, int, int); static void ral_set_bssid(struct ral_softc *, const uint8_t *); static void ral_set_macaddr(struct ral_softc *, uint8_t *); @@ -427,6 +428,7 @@ | IEEE80211_C_TXPMGT | IEEE80211_C_BGSCAN /* capable of bg scanning */ | IEEE80211_C_WPA /* capable of WPA1+WPA2 */ + | IEEE80211_C_WME /* capable of WME */ ; if (sc->rf_rev == RAL_RF_5222) { @@ -473,6 +475,7 @@ ieee80211_ifattach(ic); ic->ic_node_alloc = ral_node_alloc; ic->ic_updateslot = ral_update_slot; + ic->ic_wme.wme_update = ral_wme_update; ic->ic_reset = ral_reset; ic->ic_scan_start = ral_scan_start; ic->ic_scan_end = ral_scan_end; @@ -1650,7 +1653,8 @@ static void ral_setup_tx_desc(struct ral_softc *sc, struct ral_tx_desc *desc, - uint32_t flags, int len, int rate, int encrypt, bus_addr_t physaddr) + uint32_t flags, int len, int rate, int encrypt, + u_int aifsn, u_int logcwmin, u_int logcwmax, bus_addr_t physaddr) { struct ieee80211com *ic = &sc->sc_ic; uint16_t plcp_length; @@ -1664,7 +1668,10 @@ desc->flags |= htole32(RAL_TX_OFDM); desc->physaddr = htole32(physaddr); - desc->wme = htole16(RAL_AIFSN(3) | RAL_LOGCWMIN(4) | RAL_LOGCWMAX(6)); + desc->wme = htole16(RAL_AIFSN(aifsn) + | RAL_LOGCWMIN(logcwmin) + | RAL_LOGCWMAX(logcwmax)) + ; /* * Fill PLCP fields. @@ -1738,8 +1745,27 @@ data->m = m0; data->ni = ni; - ral_setup_tx_desc(sc, desc, RAL_TX_IFS_NEWBACKOFF | RAL_TX_TIMESTAMP, - m0->m_pkthdr.len, rate, 0, segs->ds_addr); + if (ic->ic_opmode == IEEE80211_M_HOSTAP) { + /* + * Always burst out beacon and CAB traffic. + */ + ral_setup_tx_desc(sc, desc, + RAL_TX_IFS_NEWBACKOFF | RAL_TX_TIMESTAMP, + m0->m_pkthdr.len, rate, 0, RAL_BEACON_AIFS_DEFAULT, + RAL_BEACON_CWMIN_DEFAULT, RAL_BEACON_CWMAX_DEFAULT, + segs->ds_addr); + } else { + struct wmeParams *wmep = + &ic->ic_wme.wme_chanParams.cap_wmeParams[WME_AC_BE]; + /* + * Adhoc mode; important thing is to use 2x cwmin. + */ + ral_setup_tx_desc(sc, desc, + RAL_TX_IFS_NEWBACKOFF | RAL_TX_TIMESTAMP, + m0->m_pkthdr.len, rate, 0, wmep->wmep_aifsn, + wmep->wmep_logcwmin+1, wmep->wmep_logcwmax, + segs->ds_addr); + } DPRINTFN(10, ("sending beacon frame len=%u idx=%u rate=%u\n", m0->m_pkthdr.len, sc->bcnq.cur, rate)); @@ -1757,6 +1783,7 @@ ral_tx_mgt(struct ral_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) { struct ieee80211com *ic = &sc->sc_ic; + const struct wmeParams *wmep; struct ral_tx_desc *desc; struct ral_tx_data *data; struct ieee80211_frame *wh; @@ -1765,6 +1792,13 @@ uint32_t flags = 0; int nsegs, rate, error; + /* NB: force all management frames to highest queue */ + if (ni->ni_flags & IEEE80211_NODE_QOS) { + /* NB: force all management frames to highest queue */ + wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[WME_AC_VO]; + } else + wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[WME_AC_BE]; + /* XXX use different queue's */ desc = &sc->prioq.desc[sc->prioq.cur]; data = &sc->prioq.data[sc->prioq.cur]; @@ -1797,7 +1831,8 @@ wh = mtod(m0, struct ieee80211_frame *); if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { - flags |= RAL_TX_ACK; + if (!wmep->wmep_noackPolicy) + flags |= RAL_TX_ACK; dur = ral_txtime(RAL_ACK_SIZE, rate, ic->ic_flags) + RAL_SIFS; *(uint16_t *)wh->i_dur = htole16(dur); @@ -1811,6 +1846,7 @@ } ral_setup_tx_desc(sc, desc, flags, m0->m_pkthdr.len, rate, 0, + wmep->wmep_aifsn, wmep->wmep_logcwmin, wmep->wmep_logcwmax, segs->ds_addr); bus_dmamap_sync(sc->prioq.data_dmat, data->map, BUS_DMASYNC_PREWRITE); @@ -1862,6 +1898,8 @@ ral_tx_data(struct ral_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) { struct ieee80211com *ic = &sc->sc_ic; + const struct wmeParams * wmep = + &ic->ic_wme.wme_chanParams.cap_wmeParams[M_WME_GETAC(m0)]; struct ral_tx_desc *desc; struct ral_tx_data *data; struct ral_node *rn; @@ -1941,7 +1979,8 @@ data->id.id_node = NULL; ral_setup_tx_desc(sc, desc, RAL_TX_ACK | RAL_TX_MORE_FRAG, - m->m_pkthdr.len, rtsrate, 1, segs->ds_addr); + m->m_pkthdr.len, rtsrate, 1, wmep->wmep_aifsn, + wmep->wmep_logcwmin, wmep->wmep_logcwmax, segs->ds_addr); bus_dmamap_sync(sc->txq.data_dmat, data->map, BUS_DMASYNC_PREWRITE); @@ -2017,7 +2056,8 @@ data->id.id_node = NULL; if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { - flags |= RAL_TX_ACK; + if (!wmep->wmep_noackPolicy) + flags |= RAL_TX_ACK; dur = ral_txtime(RAL_ACK_SIZE, ral_ack_rate(ic, rate), ic->ic_flags) + RAL_SIFS; @@ -2025,6 +2065,7 @@ } ral_setup_tx_desc(sc, desc, flags, m0->m_pkthdr.len, rate, 1, + wmep->wmep_aifsn, wmep->wmep_logcwmin, wmep->wmep_logcwmax, segs->ds_addr); bus_dmamap_sync(sc->txq.data_dmat, data->map, BUS_DMASYNC_PREWRITE); @@ -2113,6 +2154,12 @@ ieee80211_free_node(ni); continue; } + /* calculate priority so we can find the tx queue */ + if (ieee80211_classify(ic, m0, ni)) { + m_freem(m0); + ieee80211_free_node(ni); + continue; + } BPF_MTAP(ifp, m0); m0 = ieee80211_encap(ic, m0, ni); @@ -2543,6 +2590,16 @@ DPRINTF(("setting slottime to %uus\n", slottime)); } +/* + * Callback from the 802.11 layer to update WME parameters. + */ +static int +ral_wme_update(struct ieee80211com *ic) +{ + /* NB: nothing to do right now */ + return 0; +} + static void ral_update_led(struct ral_softc *sc, int led1, int led2) { ==== //depot/projects/wifi/sys/dev/ral/if_ralvar.h#5 (text+ko) ==== @@ -17,6 +17,10 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#define RAL_BEACON_AIFS_DEFAULT 0 /* default aifs for ap beacon q */ +#define RAL_BEACON_CWMIN_DEFAULT 0 /* default cwmin for ap beacon q */ +#define RAL_BEACON_CWMAX_DEFAULT 0 /* default cwmax for ap beacon q */ + struct ral_rx_radiotap_header { struct ieee80211_radiotap_header wr_ihdr; uint64_t wr_tsf;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200511260634.jAQ6Y608042011>