From e4dfdd15191070371543be2546a48fd3b3ba2227 Mon Sep 17 00:00:00 2001 From: Alexander Egorenkov Date: Wed, 17 Feb 2010 16:20:40 +0100 Subject: [PATCH] Added BBP tuning --- rt2870.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/rt2870.c b/rt2870.c index 662023b..d43dc94 100644 --- a/rt2870.c +++ b/rt2870.c @@ -284,6 +284,8 @@ static void rt2870_tx_eof(struct rt2870_softc *sc, static void rt2870_update_stats(struct rt2870_softc *sc); +static void rt2870_bbp_tuning(struct rt2870_softc *sc); + static void rt2870_watchdog(struct rt2870_softc *sc); static void rt2870_drain_fifo_stats(struct rt2870_softc *sc); @@ -3941,7 +3943,7 @@ static void rt2870_rx_frame(struct rt2870_softc *sc, ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *) wh); - ieee80211_input(ic, m, ni, rssi_dbm - RT2870_NOISE_FLOOR, RT2870_NOISE_FLOOR, 0); + ieee80211_input(ic, m, ni, rssi_dbm, RT2870_NOISE_FLOOR, 0); ieee80211_free_node(ni); } @@ -4480,6 +4482,8 @@ static void rt2870_periodic_task(void *context, int pending) if ((sc->periodic_round % 10) == 0) { + rt2870_bbp_tuning(sc); + rt2870_update_raw_counters(sc); rt2870_watchdog(sc); @@ -4698,7 +4702,7 @@ static void rt2870_update_stats(struct rt2870_softc *sc) uint8_t wcid; ifp = sc->ifp; - ic = ifp->if_l2com; + ic = &sc->ic; RT2870_DPRINTF(sc, RT2870_DEBUG_STATS, "%s: update statistic\n", @@ -4745,6 +4749,65 @@ static void rt2870_update_stats(struct rt2870_softc *sc) } /* + * rt2870_bbp_tuning + */ +static void rt2870_bbp_tuning(struct rt2870_softc *sc) +{ + struct ieee80211com *ic; + struct ieee80211_node *ni; + int chan, group; + int8_t rssi, old, new; + + /* RT2860C does not support BBP tuning */ + + if (sc->mac_rev == 0x28600100) + return; + + ic = &sc->ic; + + if ((ic->ic_flags & IEEE80211_F_SCAN) || + ic->ic_opmode != IEEE80211_M_STA || ic->ic_state != IEEE80211_S_RUN) + return; + + ni = ic->ic_bss; + + chan = ieee80211_chan2ieee(ic, ni->ni_chan); + + if (chan <= 14) + group = 0; + else if (chan <= 64) + group = 1; + else if (chan <= 128) + group = 2; + else + group = 3; + + rssi = ieee80211_getrssi(ic); + + if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) + { + new = 0x2e + sc->lna_gain[group]; + } + else + { + if (!IEEE80211_IS_CHAN_HT40(ni->ni_chan)) + new = 0x32 + sc->lna_gain[group] * 5 / 3; + else + new = 0x3a + sc->lna_gain[group] * 5 / 3; + } + + /* Tune if absolute average RSSI is greater than -80 */ + + if (rssi > -80) + new += 0x10; + + old = rt2870_io_bbp_read(sc, 66); + + if (old != new) + rt2870_io_bbp_write(sc, 66, new); +} + +/* * rt2870_watchdog */ static void rt2870_watchdog(struct rt2870_softc *sc) -- 2.11.4.GIT