svn commit: r295865 - head/sys/dev/rtwn
Andriy Voskoboinyk
avos at FreeBSD.org
Sun Feb 21 18:51:50 UTC 2016
Author: avos
Date: Sun Feb 21 18:51:48 2016
New Revision: 295865
URL: https://svnweb.freebsd.org/changeset/base/295865
Log:
rtwn: import r290048.
- Fix scanning from AUTH state.
Tested by: Simone Mario Lombardo <evil.lombo at gmail.com>
PR: 203105
Reviewed by: kevlo
Approved by: adrian (mentor)
Differential Revision: https://reviews.freebsd.org/D4820
Modified:
head/sys/dev/rtwn/if_rtwn.c
Modified: head/sys/dev/rtwn/if_rtwn.c
==============================================================================
--- head/sys/dev/rtwn/if_rtwn.c Sun Feb 21 18:35:01 2016 (r295864)
+++ head/sys/dev/rtwn/if_rtwn.c Sun Feb 21 18:51:48 2016 (r295865)
@@ -168,6 +168,8 @@ static void rtwn_get_txpower(struct rtwn
uint16_t[]);
static void rtwn_set_txpower(struct rtwn_softc *,
struct ieee80211_channel *, struct ieee80211_channel *);
+static void rtwn_set_rx_bssid_all(struct rtwn_softc *, int);
+static void rtwn_set_gain(struct rtwn_softc *, uint8_t);
static void rtwn_scan_start(struct ieee80211com *);
static void rtwn_scan_end(struct ieee80211com *);
static void rtwn_set_channel(struct ieee80211com *);
@@ -1237,22 +1239,6 @@ rtwn_newstate(struct ieee80211vap *vap,
rtwn_set_led(sc, RTWN_LED_LINK, 0);
break;
case IEEE80211_S_SCAN:
- if (vap->iv_state != IEEE80211_S_SCAN) {
- /* Allow Rx from any BSSID. */
- rtwn_write_4(sc, R92C_RCR,
- rtwn_read_4(sc, R92C_RCR) &
- ~(R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN));
-
- /* Set gain for scanning. */
- reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
- reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x20);
- rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
-
- reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
- reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x20);
- rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
- }
-
/* Make link LED blink during scan. */
rtwn_set_led(sc, RTWN_LED_LINK, !sc->ledlink);
@@ -1261,14 +1247,6 @@ rtwn_newstate(struct ieee80211vap *vap,
rtwn_read_1(sc, R92C_TXPAUSE) | 0x0f);
break;
case IEEE80211_S_AUTH:
- /* Set initial gain under link. */
- reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
- reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x32);
- rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
-
- reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
- reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x32);
- rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
rtwn_set_chan(sc, ic->ic_curchan, NULL);
break;
case IEEE80211_S_RUN:
@@ -2684,17 +2662,56 @@ rtwn_set_txpower(struct rtwn_softc *sc,
}
static void
+rtwn_set_rx_bssid_all(struct rtwn_softc *sc, int enable)
+{
+ uint32_t reg;
+
+ reg = rtwn_read_4(sc, R92C_RCR);
+ if (enable)
+ reg &= ~R92C_RCR_CBSSID_BCN;
+ else
+ reg |= R92C_RCR_CBSSID_BCN;
+ rtwn_write_4(sc, R92C_RCR, reg);
+}
+
+static void
+rtwn_set_gain(struct rtwn_softc *sc, uint8_t gain)
+{
+ uint32_t reg;
+
+ reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
+ reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain);
+ rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
+
+ reg = rtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
+ reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain);
+ rtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
+}
+
+static void
rtwn_scan_start(struct ieee80211com *ic)
{
+ struct rtwn_softc *sc = ic->ic_softc;
- /* XXX do nothing? */
+ RTWN_LOCK(sc);
+ /* Receive beacons / probe responses from any BSSID. */
+ rtwn_set_rx_bssid_all(sc, 1);
+ /* Set gain for scanning. */
+ rtwn_set_gain(sc, 0x20);
+ RTWN_UNLOCK(sc);
}
static void
rtwn_scan_end(struct ieee80211com *ic)
{
+ struct rtwn_softc *sc = ic->ic_softc;
- /* XXX do nothing? */
+ RTWN_LOCK(sc);
+ /* Restore limitations. */
+ rtwn_set_rx_bssid_all(sc, 0);
+ /* Set gain under link. */
+ rtwn_set_gain(sc, 0x32);
+ RTWN_UNLOCK(sc);
}
static void
More information about the svn-src-all
mailing list