From owner-p4-projects@FreeBSD.ORG Tue Jan 29 20:44:58 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 8F32A16A420; Tue, 29 Jan 2008 20:44:58 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 53B4C16A417 for ; Tue, 29 Jan 2008 20:44:58 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 421E913C44B for ; Tue, 29 Jan 2008 20:44:58 +0000 (UTC) (envelope-from sam@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0TKiw6u008920 for ; Tue, 29 Jan 2008 20:44:58 GMT (envelope-from sam@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0TKiwfe008917 for perforce@freebsd.org; Tue, 29 Jan 2008 20:44:58 GMT (envelope-from sam@freebsd.org) Date: Tue, 29 Jan 2008 20:44:58 GMT Message-Id: <200801292044.m0TKiwfe008917@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sam@freebsd.org using -f From: Sam Leffler To: Perforce Change Reviews Cc: Subject: PERFORCE change 134412 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 29 Jan 2008 20:44:58 -0000 http://perforce.freebsd.org/chv.cgi?CH=134412 Change 134412 by sam@sam_ebb on 2008/01/29 20:44:56 convert ral to use wlan_rssadapt instead of its private copy of the code; this is mostly a first step towards ripping rssadapt use out entirely; lightly tested in sta mode on both 2560 and 2661 cards Affected files ... .. //depot/projects/vap/sys/dev/ral/if_ral_pci.c#5 edit .. //depot/projects/vap/sys/dev/ral/if_ralrate.c#4 delete .. //depot/projects/vap/sys/dev/ral/if_ralrate.h#4 delete .. //depot/projects/vap/sys/dev/ral/rt2560.c#12 edit .. //depot/projects/vap/sys/dev/ral/rt2560var.h#8 edit .. //depot/projects/vap/sys/dev/ral/rt2661.c#9 edit .. //depot/projects/vap/sys/dev/ral/rt2661var.h#6 edit .. //depot/projects/vap/sys/modules/ral/Makefile#5 edit Differences ... ==== //depot/projects/vap/sys/dev/ral/if_ral_pci.c#5 (text+ko) ==== @@ -50,16 +50,17 @@ #include #include +#include #include #include -#include #include #include MODULE_DEPEND(ral, pci, 1, 1, 1); MODULE_DEPEND(ral, wlan, 1, 1, 1); +MODULE_DEPEND(ral, wlan_rssadapt, 1, 1, 1); struct ral_pci_ident { uint16_t vendor; ==== //depot/projects/vap/sys/dev/ral/rt2560.c#12 (text) ==== @@ -55,6 +55,7 @@ #include #include #include +#include #include #include @@ -62,7 +63,6 @@ #include #include -#include #include #include @@ -108,6 +108,7 @@ struct ieee80211_node_table *); static void rt2560_iter_func(void *, struct ieee80211_node *); static void rt2560_update_rssadapt(void *); +static void rt2560_newassoc(struct ieee80211_node *, int); static int rt2560_newstate(struct ieee80211vap *, enum ieee80211_state, int); static uint16_t rt2560_eeprom_read(struct rt2560_softc *, uint8_t); @@ -211,7 +212,6 @@ MTX_DEF | MTX_RECURSE); callout_init_mtx(&sc->watchdog_ch, &sc->sc_mtx, 0); - callout_init(&sc->rssadapt_ch, CALLOUT_MPSAFE); /* retrieve RT2560 rev. no */ sc->asic_rev = RAL_READ(sc, RT2560_CSR0); @@ -296,6 +296,7 @@ ieee80211_init_channels(ic, NULL, &bands); ieee80211_ifattach(ic); + ic->ic_newassoc = rt2560_newassoc; ic->ic_raw_xmit = rt2560_raw_xmit; ic->ic_updateslot = rt2560_update_slot; ic->ic_node_alloc = rt2560_node_alloc; @@ -358,7 +359,6 @@ rt2560_stop(sc); RAL_LOCK(sc); - callout_stop(&sc->rssadapt_ch); bpfdetach(ifp); ieee80211_ifdetach(ic); @@ -401,6 +401,9 @@ vap->iv_newstate = rt2560_newstate; vap->iv_update_beacon = rt2560_beacon_update; + callout_init(&rvp->rssadapt_ch, CALLOUT_MPSAFE); + ieee80211_rssadapt_init(&rvp->rssadapt, vap); + /* complete setup */ ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status); ic->ic_opmode = opmode; @@ -412,6 +415,7 @@ { struct rt2560_vap *rvp = RT2560_VAP(vap); + callout_stop(&rvp->rssadapt_ch); ieee80211_vap_detach(vap); free(rvp, M_80211_VAP); } @@ -748,9 +752,10 @@ static void rt2560_iter_func(void *arg, struct ieee80211_node *ni) { - struct rt2560_node *rn = (struct rt2560_node *)ni; + struct ieee80211vap *vap = arg; - ral_rssadapt_updatestats(&rn->rssadapt); + if (ni->ni_vap == vap) + ieee80211_rssadapt_updatestats(&RT2560_NODE(ni)->rssadapt); } /* @@ -760,15 +765,25 @@ static void rt2560_update_rssadapt(void *arg) { - struct rt2560_softc *sc = arg; - struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211vap *vap = arg; + struct rt2560_vap *rvp = RT2560_VAP(vap); + + if (vap->iv_opmode != IEEE80211_M_STA) { + struct ieee80211com *ic = vap->iv_ic; + ieee80211_iterate_nodes(&ic->ic_sta, rt2560_iter_func, arg); + } else + rt2560_iter_func(arg, vap->iv_bss); - RAL_LOCK(sc); + callout_reset(&rvp->rssadapt_ch, hz / 10, rt2560_update_rssadapt, vap); +} - ieee80211_iterate_nodes(&ic->ic_sta, rt2560_iter_func, arg); - callout_reset(&sc->rssadapt_ch, hz / 10, rt2560_update_rssadapt, sc); +static void +rt2560_newassoc(struct ieee80211_node *ni, int isnew) +{ + struct ieee80211vap *vap = ni->ni_vap; - RAL_UNLOCK(sc); + ieee80211_rssadapt_node_init(&RT2560_VAP(vap)->rssadapt, + &RT2560_NODE(ni)->rssadapt, ni); } static int @@ -776,6 +791,7 @@ { struct rt2560_vap *rvp = RT2560_VAP(vap); struct rt2560_softc *sc = vap->iv_ic->ic_ifp->if_softc; + const struct ieee80211_txparam *tp; enum ieee80211_state ostate; struct ieee80211_node *ni; struct mbuf *m; @@ -785,9 +801,9 @@ switch (nstate) { case IEEE80211_S_INIT: - callout_stop(&sc->rssadapt_ch); + if (ostate == IEEE80211_S_RUN) { + callout_stop(&rvp->rssadapt_ch); - if (ostate == IEEE80211_S_RUN) { /* abort TSF synchronization */ RAL_WRITE(sc, RT2560_CSR14, 0); @@ -824,15 +840,19 @@ rt2560_update_led(sc, 1, 0); if (vap->iv_opmode != IEEE80211_M_MONITOR) { - callout_reset(&sc->rssadapt_ch, hz / 10, - rt2560_update_rssadapt, sc); + if (vap->iv_opmode == IEEE80211_M_STA) { + /* fake a join to init the tx rate */ + rt2560_newassoc(ni, 1); + } + + tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; + if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) + callout_reset(&rvp->rssadapt_ch, hz / 10, + rt2560_update_rssadapt, vap); rt2560_enable_tsf_sync(sc); } break; - case IEEE80211_S_SCAN: - case IEEE80211_S_AUTH: - case IEEE80211_S_ASSOC: default: break; } @@ -958,6 +978,7 @@ struct rt2560_tx_desc *desc; struct rt2560_tx_data *data; struct rt2560_node *rn; + struct mbuf *m; bus_dmamap_sync(sc->txq.desc_dmat, sc->txq.desc_map, BUS_DMASYNC_POSTREAD); @@ -972,13 +993,14 @@ break; rn = (struct rt2560_node *)data->ni; + m = data->m; switch (le32toh(desc->flags) & RT2560_TX_RESULT_MASK) { case RT2560_TX_SUCCESS: DPRINTFN(sc, 10, "%s\n", "data frame sent successfully"); - if (data->id.id_node != NULL) { - ral_rssadapt_raise_rate(&rn->rssadapt, - &data->id); + if (data->rix != IEEE80211_FIXED_RATE_NONE) { + ieee80211_rssadapt_tx_complete(&rn->rssadapt, 1, + m->m_pkthdr.len, data->rix, data->rssi); } ifp->if_opackets++; break; @@ -992,9 +1014,9 @@ case RT2560_TX_FAIL_RETRY: DPRINTFN(sc, 9, "%s\n", "sending data frame failed (too much retries)"); - if (data->id.id_node != NULL) { - ral_rssadapt_lower_rate(data->ni, - &rn->rssadapt, &data->id); + if (data->rix != IEEE80211_FIXED_RATE_NONE) { + ieee80211_rssadapt_tx_complete(&rn->rssadapt, 0, + m->m_pkthdr.len, data->rix, data->rssi); } ifp->if_oerrors++; break; @@ -1010,7 +1032,7 @@ bus_dmamap_sync(sc->txq.data_dmat, data->map, BUS_DMASYNC_POSTWRITE); bus_dmamap_unload(sc->txq.data_dmat, data->map); - m_freem(data->m); + m_freem(m); data->m = NULL; ieee80211_free_node(data->ni); data->ni = NULL; @@ -1126,7 +1148,7 @@ /* * Some frames were processed by the hardware cipher engine and are ready for - * transmission to the IEEE802.11 layer. + * handoff to the IEEE802.11 layer. */ static void rt2560_decryption_intr(struct rt2560_softc *sc) @@ -1138,7 +1160,6 @@ bus_addr_t physaddr; struct ieee80211_frame *wh; struct ieee80211_node *ni; - struct rt2560_node *rn; struct mbuf *mnew, *m; int hw, error; @@ -1229,8 +1250,6 @@ htole64(((uint64_t)tsf_hi << 32) | tsf_lo); tap->wr_flags = 0; tap->wr_rate = rt2560_rxrate(desc); - tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq); - tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); tap->wr_antenna = sc->rx_ant; tap->wr_antsignal = RT2560_RSSI(sc, desc->rssi); @@ -1245,12 +1264,6 @@ if (ni != NULL) { (void) ieee80211_input(ni, m, RT2560_RSSI(sc, desc->rssi), RT2560_NOISE_FLOOR, 0); - - /* give rssi to the rate adatation algorithm */ - rn = (struct rt2560_node *)ni; - ral_rssadapt_input(ni, &rn->rssadapt, - RT2560_RSSI(sc, desc->rssi)); - ieee80211_free_node(ni); } else (void) ieee80211_input_all(ic, m, @@ -1538,7 +1551,8 @@ rt2560_tx_bcn(struct rt2560_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) { - struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211com *ic = ni->ni_ic; struct rt2560_tx_desc *desc; struct rt2560_tx_data *data; bus_dma_segment_t segs[RT2560_MAX_SCATTER]; @@ -1547,7 +1561,8 @@ desc = &sc->bcnq.desc[sc->bcnq.cur]; data = &sc->bcnq.data[sc->bcnq.cur]; - rate = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? 12 : 2; + /* XXX maybe a separate beacon rate? */ + rate = vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)].mgmtrate; error = bus_dmamap_load_mbuf_sg(sc->bcnq.data_dmat, data->map, m0, segs, &nsegs, BUS_DMA_NOWAIT); @@ -1592,7 +1607,8 @@ rt2560_tx_mgt(struct rt2560_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) { - struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211com *ic = ni->ni_ic; struct rt2560_tx_desc *desc; struct rt2560_tx_data *data; struct ieee80211_frame *wh; @@ -1605,7 +1621,7 @@ desc = &sc->prioq.desc[sc->prioq.cur]; data = &sc->prioq.data[sc->prioq.cur]; - rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2; + rate = vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)].mgmtrate; wh = mtod(m0, struct ieee80211_frame *); @@ -1640,6 +1656,8 @@ data->m = m0; data->ni = ni; + /* management frames are not taken into account for rssadapt */ + data->rix = IEEE80211_FIXED_RATE_NONE; wh = mtod(m0, struct ieee80211_frame *); @@ -1693,6 +1711,7 @@ rate = params->ibp_rate0 & IEEE80211_RATE_VAL; /* XXX validate */ if (rate == 0) { + /* XXX fall back to mcast/mgmt rate? */ m_freem(m0); return EINVAL; } @@ -1805,9 +1824,9 @@ struct ieee80211_rateset *rs; rs = &ni->ni_rates; - rn = (struct rt2560_node *)ni; - ni->ni_txrate = ral_rssadapt_choose(&rn->rssadapt, rs, wh, - m0->m_pkthdr.len, NULL, 0); + rn = RT2560_NODE(ni); + ni->ni_txrate = ieee80211_rssadapt_choose(&rn->rssadapt, rs, + m0->m_pkthdr.len); rate = rs->rs_rates[ni->ni_txrate]; } rate &= IEEE80211_RATE_VAL; @@ -1866,7 +1885,7 @@ data->ni = ni; /* RTS frames are not taken into account for rssadapt */ - data->id.id_node = NULL; + data->rix = IEEE80211_FIXED_RATE_NONE; rt2560_setup_tx_desc(sc, desc, RT2560_TX_ACK | RT2560_TX_MORE_FRAG, m->m_pkthdr.len, rtsrate, 1, @@ -1926,8 +1945,6 @@ tap->wt_flags = 0; tap->wt_rate = rate; - tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); - tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); tap->wt_antenna = sc->tx_ant; bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0); @@ -1938,13 +1955,11 @@ /* remember link conditions for rate adaptation algorithm */ if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) { - data->id.id_len = m0->m_pkthdr.len; - data->id.id_rateidx = ni->ni_txrate; - data->id.id_node = ni; + data->rix = ni->ni_txrate; /* XXX probably need last rssi value and not avg */ - data->id.id_rssi = ic->ic_node_getrssi(ni); + data->rssi = ic->ic_node_getrssi(ni); } else - data->id.id_node = NULL; + data->rix = IEEE80211_FIXED_RATE_NONE; if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { flags |= RT2560_TX_ACK; @@ -2254,6 +2269,11 @@ RAL_LOCK(sc); rt2560_set_chan(sc, ic->ic_curchan); + + sc->sc_txtap.wt_chan_freq = htole16(ic->ic_curchan->ic_freq); + sc->sc_txtap.wt_chan_flags = htole16(ic->ic_curchan->ic_flags); + sc->sc_rxtap.wr_chan_freq = htole16(ic->ic_curchan->ic_freq); + sc->sc_rxtap.wr_chan_flags = htole16(ic->ic_curchan->ic_flags); RAL_UNLOCK(sc); } ==== //depot/projects/vap/sys/dev/ral/rt2560var.h#8 (text) ==== @@ -55,7 +55,8 @@ bus_dmamap_t map; struct mbuf *m; struct ieee80211_node *ni; - struct ral_rssdesc id; + uint8_t rix; + int8_t rssi; }; struct rt2560_tx_ring { @@ -94,12 +95,15 @@ struct rt2560_node { struct ieee80211_node ni; - struct ral_rssadapt rssadapt; + struct ieee80211_rssadapt_node rssadapt; }; +#define RT2560_NODE(ni) ((struct rt2560_node *)(ni)) struct rt2560_vap { struct ieee80211vap ral_vap; struct ieee80211_beacon_offsets ral_bo; + struct ieee80211_rssadapt rssadapt; + struct callout rssadapt_ch; int (*ral_newstate)(struct ieee80211vap *, enum ieee80211_state, int); @@ -116,7 +120,6 @@ struct mtx sc_mtx; struct callout watchdog_ch; - struct callout rssadapt_ch; int sc_tx_timer; int sc_invalid; ==== //depot/projects/vap/sys/dev/ral/rt2661.c#9 (text) ==== @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -61,7 +62,6 @@ #include #include -#include #include #include #include @@ -102,6 +102,7 @@ struct rt2661_rx_ring *); static struct ieee80211_node *rt2661_node_alloc( struct ieee80211_node_table *); +static void rt2661_newassoc(struct ieee80211_node *, int); static int rt2661_newstate(struct ieee80211vap *, enum ieee80211_state, int); static uint16_t rt2661_eeprom_read(struct rt2661_softc *, uint8_t); @@ -215,7 +216,6 @@ MTX_DEF | MTX_RECURSE); callout_init_mtx(&sc->watchdog_ch, &sc->sc_mtx, 0); - callout_init(&sc->rssadapt_ch, CALLOUT_MPSAFE); /* wait for NIC to initialize */ for (ntries = 0; ntries < 1000; ntries++) { @@ -327,6 +327,7 @@ ieee80211_init_channels(ic, NULL, &bands); ieee80211_ifattach(ic); + ic->ic_newassoc = rt2661_newassoc; ic->ic_node_alloc = rt2661_node_alloc; /* ic->ic_wme.wme_update = rt2661_wme_update;*/ ic->ic_scan_start = rt2661_scan_start; @@ -378,7 +379,6 @@ RAL_LOCK(sc); rt2661_stop_locked(sc); callout_stop(&sc->watchdog_ch); - callout_stop(&sc->rssadapt_ch); bpfdetach(ifp); ieee80211_ifdetach(ic); @@ -425,6 +425,9 @@ vap->iv_update_beacon = rt2661_beacon_update; #endif + callout_init(&rvp->rssadapt_ch, CALLOUT_MPSAFE); + ieee80211_rssadapt_init(&rvp->rssadapt, vap); + /* complete setup */ ieee80211_vap_attach(vap, ieee80211_media_change, ieee80211_media_status); ic->ic_opmode = opmode; @@ -436,6 +439,7 @@ { struct rt2661_vap *rvp = RT2661_VAP(vap); + callout_stop(&rvp->rssadapt_ch); ieee80211_vap_detach(vap); free(rvp, M_80211_VAP); } @@ -781,9 +785,10 @@ static void rt2661_iter_func(void *arg, struct ieee80211_node *ni) { - struct rt2661_node *rn = (struct rt2661_node *)ni; + struct ieee80211vap *vap = arg; - ral_rssadapt_updatestats(&rn->rssadapt); + if (ni->ni_vap == vap) + ieee80211_rssadapt_updatestats(&RT2661_NODE(ni)->rssadapt); } /* @@ -793,15 +798,25 @@ static void rt2661_update_rssadapt(void *arg) { - struct rt2661_softc *sc = arg; - struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211vap *vap = arg; + struct rt2661_vap *rvp = RT2661_VAP(vap); + + if (vap->iv_opmode != IEEE80211_M_STA) { + struct ieee80211com *ic = vap->iv_ic; + ieee80211_iterate_nodes(&ic->ic_sta, rt2661_iter_func, arg); + } else + rt2661_iter_func(arg, vap->iv_bss); - RAL_LOCK(sc); + callout_reset(&rvp->rssadapt_ch, hz / 10, rt2661_update_rssadapt, vap); +} - ieee80211_iterate_nodes(&ic->ic_sta, rt2661_iter_func, arg); - callout_reset(&sc->rssadapt_ch, hz / 10, rt2661_update_rssadapt, sc); +static void +rt2661_newassoc(struct ieee80211_node *ni, int isnew) +{ + struct ieee80211vap *vap = ni->ni_vap; - RAL_UNLOCK(sc); + ieee80211_rssadapt_node_init(&RT2661_VAP(vap)->rssadapt, + &RT2661_NODE(ni)->rssadapt, ni); } static int @@ -810,6 +825,7 @@ struct rt2661_vap *rvp = RT2661_VAP(vap); struct ieee80211com *ic = vap->iv_ic; struct rt2661_softc *sc = ic->ic_ifp->if_softc; + const struct ieee80211_txparam *tp; enum ieee80211_state ostate; struct ieee80211_node *ni; uint32_t tmp; @@ -819,9 +835,9 @@ switch (nstate) { case IEEE80211_S_INIT: - callout_stop(&sc->rssadapt_ch); + if (ostate == IEEE80211_S_RUN) { + callout_stop(&rvp->rssadapt_ch); - if (ostate == IEEE80211_S_RUN) { /* abort TSF synchronization */ tmp = RAL_READ(sc, RT2661_TXRX_CSR9); RAL_WRITE(sc, RT2661_TXRX_CSR9, tmp & ~0x00ffffff); @@ -844,14 +860,19 @@ } if (vap->iv_opmode != IEEE80211_M_MONITOR) { - callout_reset(&sc->rssadapt_ch, hz / 10, - rt2661_update_rssadapt, sc); + if (vap->iv_opmode == IEEE80211_M_STA) { + /* fake a join to init the tx rate */ + rt2661_newassoc(ni, 1); + } + + tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; + if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) + callout_reset(&rvp->rssadapt_ch, hz / 10, + rt2661_update_rssadapt, vap); + rt2661_enable_tsf_sync(sc); } break; - case IEEE80211_S_SCAN: - case IEEE80211_S_AUTH: - case IEEE80211_S_ASSOC: default: break; } @@ -959,9 +980,10 @@ DPRINTFN(sc, 10, "data frame sent successfully after " "%d retries\n", retrycnt); - if (retrycnt == 0 && data->id.id_node != NULL) { - ral_rssadapt_raise_rate(&rn->rssadapt, - &data->id); + if (retrycnt == 0 && + data->rix != IEEE80211_FIXED_RATE_NONE) { + ieee80211_rssadapt_tx_complete(&rn->rssadapt, 1, + m->m_pkthdr.len, data->rix, data->rssi); } ifp->if_opackets++; break; @@ -969,9 +991,9 @@ case RT2661_TX_RETRY_FAIL: DPRINTFN(sc, 9, "%s\n", "sending data frame failed (too much retries)"); - if (data->id.id_node != NULL) { - ral_rssadapt_lower_rate(ni, - &rn->rssadapt, &data->id); + if (data->rix != IEEE80211_FIXED_RATE_NONE) { + ieee80211_rssadapt_tx_complete(&rn->rssadapt, 0, + m->m_pkthdr.len, data->rix, data->rssi); } ifp->if_oerrors++; break; @@ -1043,7 +1065,6 @@ bus_addr_t physaddr; struct ieee80211_frame *wh; struct ieee80211_node *ni; - struct rt2661_node *rn; struct mbuf *mnew, *m; int error; @@ -1139,8 +1160,6 @@ htole64(((uint64_t)tsf_hi << 32) | tsf_lo); tap->wr_flags = 0; tap->wr_rate = rt2661_rxrate(desc); - tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq); - tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); tap->wr_antsignal = rssi < 0 ? 0 : rssi; bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m); @@ -1159,11 +1178,6 @@ (void) ieee80211_input(ni, m, rssi, RT2661_NOISE_FLOOR, 0); - - /* give rssi to the rate adatation algorithm */ - rn = (struct rt2661_node *)ni; - ral_rssadapt_input(ni, &rn->rssadapt, rssi); - ieee80211_free_node(ni); } else (void) ieee80211_input_all(ic, m, rssi, @@ -1462,7 +1476,8 @@ rt2661_tx_mgt(struct rt2661_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) { - struct ieee80211com *ic = &sc->sc_ic; + struct ieee80211vap *vap = ni->ni_vap; + struct ieee80211com *ic = ni->ni_ic; struct rt2661_tx_desc *desc; struct rt2661_tx_data *data; struct ieee80211_frame *wh; @@ -1475,8 +1490,7 @@ desc = &sc->mgtq.desc[sc->mgtq.cur]; data = &sc->mgtq.data[sc->mgtq.cur]; - /* send mgt frames at the lowest available rate */ - rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2; + rate = vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)].mgmtrate; wh = mtod(m0, struct ieee80211_frame *); @@ -1502,14 +1516,14 @@ tap->wt_flags = 0; tap->wt_rate = rate; - tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); - tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0); } data->m = m0; data->ni = ni; + /* management frames are not taken into account for rssadapt */ + data->rix = IEEE80211_FIXED_RATE_NONE; wh = mtod(m0, struct ieee80211_frame *); @@ -1608,8 +1622,8 @@ rs = &ni->ni_rates; rn = (struct rt2661_node *)ni; - ni->ni_txrate = ral_rssadapt_choose(&rn->rssadapt, rs, - wh, m0->m_pkthdr.len, NULL, 0); + ni->ni_txrate = ieee80211_rssadapt_choose(&rn->rssadapt, rs, + m0->m_pkthdr.len); rate = rs->rs_rates[ni->ni_txrate]; } rate &= IEEE80211_RATE_VAL; @@ -1672,7 +1686,7 @@ data->ni = ni; /* RTS frames are not taken into account for rssadapt */ - data->id.id_node = NULL; + data->rix = IEEE80211_FIXED_RATE_NONE; rt2661_setup_tx_desc(sc, desc, RT2661_TX_NEED_ACK | RT2661_TX_MORE_FRAG, 0, m->m_pkthdr.len, rtsrate, segs, @@ -1742,13 +1756,11 @@ /* remember link conditions for rate adaptation algorithm */ if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE) { - data->id.id_len = m0->m_pkthdr.len; - data->id.id_rateidx = ni->ni_txrate; - data->id.id_node = ni; - /* XXX probably want last value, not avg */ - data->id.id_rssi = ic->ic_node_getrssi(ni); + data->rix = ni->ni_txrate; + /* XXX probably need last rssi value and not avg */ + data->rssi = ic->ic_node_getrssi(ni); } else - data->id.id_node = NULL; + data->rix = IEEE80211_FIXED_RATE_NONE; if (!noack && !IEEE80211_IS_MULTICAST(wh->i_addr1)) { flags |= RT2661_TX_NEED_ACK; @@ -2166,8 +2178,7 @@ u_int i, chan; chan = ieee80211_chan2ieee(ic, c); - if (chan == 0 || chan == IEEE80211_CHAN_ANY) - return; + KASSERT(chan != 0 && chan != IEEE80211_CHAN_ANY, ("chan 0x%x", chan)); /* select the appropriate RF settings based on what EEPROM says */ rfprog = (sc->rfprog == 0) ? rt2661_rf5225_1 : rt2661_rf5225_2; @@ -2956,6 +2967,11 @@ RAL_LOCK(sc); rt2661_set_chan(sc, ic->ic_curchan); + + sc->sc_txtap.wt_chan_freq = htole16(ic->ic_curchan->ic_freq); + sc->sc_txtap.wt_chan_flags = htole16(ic->ic_curchan->ic_flags); + sc->sc_rxtap.wr_chan_freq = htole16(ic->ic_curchan->ic_freq); + sc->sc_rxtap.wr_chan_flags = htole16(ic->ic_curchan->ic_flags); RAL_UNLOCK(sc); } ==== //depot/projects/vap/sys/dev/ral/rt2661var.h#6 (text) ==== @@ -51,7 +51,8 @@ bus_dmamap_t map; struct mbuf *m; struct ieee80211_node *ni; - struct ral_rssdesc id; + uint8_t rix; + int8_t rssi; }; struct rt2661_tx_ring { @@ -87,11 +88,14 @@ struct rt2661_node { struct ieee80211_node ni; - struct ral_rssadapt rssadapt; + struct ieee80211_rssadapt_node rssadapt; }; +#define RT2661_NODE(ni) ((struct rt2661_node *)(ni)) struct rt2661_vap { struct ieee80211vap ral_vap; + struct ieee80211_rssadapt rssadapt; + struct callout rssadapt_ch; int (*ral_newstate)(struct ieee80211vap *, enum ieee80211_state, int); @@ -108,7 +112,6 @@ struct mtx sc_mtx; struct callout watchdog_ch; - struct callout rssadapt_ch; int sc_tx_timer; int sc_invalid; ==== //depot/projects/vap/sys/modules/ral/Makefile#5 (text+ko) ==== @@ -2,8 +2,8 @@ .PATH: ${.CURDIR}/../../dev/ral -KMOD = if_ral -SRCS = rt2560.c rt2661.c if_ralrate.c if_ral_pci.c \ - device_if.h bus_if.h pci_if.h +KMOD= if_ral +SRCS= rt2560.c rt2661.c if_ral_pci.c +SRCS+= device_if.h bus_if.h pci_if.h .include