PERFORCE change 134412 for review
Sam Leffler
sam at FreeBSD.org
Tue Jan 29 12:44:58 PST 2008
http://perforce.freebsd.org/chv.cgi?CH=134412
Change 134412 by sam at 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 <net80211/ieee80211_var.h>
#include <net80211/ieee80211_radiotap.h>
+#include <net80211/ieee80211_rssadapt.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
-#include <dev/ral/if_ralrate.h>
#include <dev/ral/rt2560var.h>
#include <dev/ral/rt2661var.h>
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 <net80211/ieee80211_phy.h>
#include <net80211/ieee80211_radiotap.h>
#include <net80211/ieee80211_regdomain.h>
+#include <net80211/ieee80211_rssadapt.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -62,7 +63,6 @@
#include <netinet/ip.h>
#include <netinet/if_ether.h>
-#include <dev/ral/if_ralrate.h>
#include <dev/ral/rt2560reg.h>
#include <dev/ral/rt2560var.h>
@@ -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 <net80211/ieee80211_var.h>
#include <net80211/ieee80211_radiotap.h>
#include <net80211/ieee80211_regdomain.h>
+#include <net80211/ieee80211_rssadapt.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
@@ -61,7 +62,6 @@
#include <netinet/ip.h>
#include <netinet/if_ether.h>
-#include <dev/ral/if_ralrate.h>
#include <dev/ral/rt2661reg.h>
#include <dev/ral/rt2661var.h>
#include <dev/ral/rt2661_ucode.h>
@@ -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 <bsd.kmod.mk>
More information about the p4-projects
mailing list