From d5b9d584a2dcb429fe2dd3d220d9fe586a92653e Mon Sep 17 00:00:00 2001 From: Alexander Egorenkov Date: Wed, 17 Feb 2010 15:42:42 +0100 Subject: [PATCH] Added BBP tuning --- rt2860.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/rt2860.c b/rt2860.c index af12a21..848c05c 100644 --- a/rt2860.c +++ b/rt2860.c @@ -246,6 +246,8 @@ static void rt2860_tx_eof(struct rt2860_softc *sc, static void rt2860_update_stats(struct rt2860_softc *sc); +static void rt2860_bbp_tuning(struct rt2860_softc *sc); + static void rt2860_watchdog(struct rt2860_softc *sc); static void rt2860_drain_fifo_stats(struct rt2860_softc *sc); @@ -4440,6 +4442,8 @@ static void rt2860_periodic_task(void *context, int pending) if ((sc->periodic_round % 10) == 0) { + rt2860_bbp_tuning(sc); + rt2860_update_raw_counters(sc); rt2860_watchdog(sc); @@ -4704,7 +4708,7 @@ static int rt2860_rx_eof(struct rt2860_softc *sc, int limit) ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *) wh); - ieee80211_input(ic, m, ni, rssi_dbm - RT2860_NOISE_FLOOR, RT2860_NOISE_FLOOR, 0); + ieee80211_input(ic, m, ni, rssi_dbm, RT2860_NOISE_FLOOR, 0); ieee80211_free_node(ni); @@ -4878,6 +4882,65 @@ static void rt2860_update_stats(struct rt2860_softc *sc) } /* + * rt2860_bbp_tuning + */ +static void rt2860_bbp_tuning(struct rt2860_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 = rt2860_io_bbp_read(sc, 66); + + if (old != new) + rt2860_io_bbp_write(sc, 66, new); +} + +/* * rt2860_watchdog */ static void rt2860_watchdog(struct rt2860_softc *sc) -- 2.11.4.GIT