aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndriy Voskoboinyk <avos@FreeBSD.org>2015-10-27 14:21:24 +0000
committerAndriy Voskoboinyk <avos@FreeBSD.org>2015-10-27 14:21:24 +0000
commit240dd2906d97ec34c1015f5c75f39f005627acba (patch)
tree453686219a66c170185f779f13703a11900670e0
parentfe920528c16a3acb04f1fe2700aa6b90fd2a7817 (diff)
downloadsrc-240dd2906d97ec34c1015f5c75f39f005627acba.tar.gz
src-240dd2906d97ec34c1015f5c75f39f005627acba.zip
urtwn(4): fix scanning from AUTH state
Tested with RTL8188EU, STA mode. Reviewed by: kevlo Approved by: adrian (mentor) Differential Revision: https://reviews.freebsd.org/D3968
Notes
Notes: svn path=/head/; revision=290048
-rw-r--r--sys/dev/usb/wlan/if_urtwn.c77
1 files changed, 47 insertions, 30 deletions
diff --git a/sys/dev/usb/wlan/if_urtwn.c b/sys/dev/usb/wlan/if_urtwn.c
index 3d977232575a..0cd1cf342a50 100644
--- a/sys/dev/usb/wlan/if_urtwn.c
+++ b/sys/dev/usb/wlan/if_urtwn.c
@@ -264,6 +264,8 @@ static void urtwn_r88e_get_txpower(struct urtwn_softc *, int,
static void urtwn_set_txpower(struct urtwn_softc *,
struct ieee80211_channel *,
struct ieee80211_channel *);
+static void urtwn_set_rx_bssid_all(struct urtwn_softc *, int);
+static void urtwn_set_gain(struct urtwn_softc *, uint8_t);
static void urtwn_scan_start(struct ieee80211com *);
static void urtwn_scan_end(struct ieee80211com *);
static void urtwn_set_channel(struct ieee80211com *);
@@ -1544,7 +1546,6 @@ urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
struct urtwn_softc *sc = ic->ic_softc;
struct ieee80211_node *ni;
enum ieee80211_state ostate;
- uint32_t reg;
ostate = vap->iv_state;
DPRINTF("%s -> %s\n", ieee80211_state_name[ostate],
@@ -1585,38 +1586,11 @@ urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
urtwn_set_led(sc, URTWN_LED_LINK, 0);
break;
case IEEE80211_S_SCAN:
- if (ostate != IEEE80211_S_SCAN) {
- /* Allow Rx from any BSSID. */
- urtwn_write_4(sc, R92C_RCR,
- urtwn_read_4(sc, R92C_RCR) &
- ~(R92C_RCR_CBSSID_DATA | R92C_RCR_CBSSID_BCN));
-
- /* Set gain for scanning. */
- reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
- reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x20);
- urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
-
- if (!(sc->chip & URTWN_CHIP_88E)) {
- reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
- reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x20);
- urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
- }
- }
/* Pause AC Tx queues. */
urtwn_write_1(sc, R92C_TXPAUSE,
urtwn_read_1(sc, R92C_TXPAUSE) | 0x0f);
break;
case IEEE80211_S_AUTH:
- /* Set initial gain under link. */
- reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
- reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x32);
- urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
-
- if (!(sc->chip & URTWN_CHIP_88E)) {
- reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
- reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, 0x32);
- urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
- }
urtwn_set_chan(sc, ic->ic_curchan, NULL);
break;
case IEEE80211_S_RUN:
@@ -3079,15 +3053,58 @@ urtwn_set_txpower(struct urtwn_softc *sc, struct ieee80211_channel *c,
}
static void
+urtwn_set_rx_bssid_all(struct urtwn_softc *sc, int enable)
+{
+ uint32_t reg;
+
+ reg = urtwn_read_4(sc, R92C_RCR);
+ if (enable)
+ reg &= ~R92C_RCR_CBSSID_BCN;
+ else
+ reg |= R92C_RCR_CBSSID_BCN;
+ urtwn_write_4(sc, R92C_RCR, reg);
+}
+
+static void
+urtwn_set_gain(struct urtwn_softc *sc, uint8_t gain)
+{
+ uint32_t reg;
+
+ reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
+ reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain);
+ urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
+
+ if (!(sc->chip & URTWN_CHIP_88E)) {
+ reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
+ reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain);
+ urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
+ }
+}
+
+static void
urtwn_scan_start(struct ieee80211com *ic)
{
- /* XXX do nothing? */
+ struct urtwn_softc *sc = ic->ic_softc;
+
+ URTWN_LOCK(sc);
+ /* Receive beacons / probe responses from any BSSID. */
+ urtwn_set_rx_bssid_all(sc, 1);
+ /* Set gain for scanning. */
+ urtwn_set_gain(sc, 0x20);
+ URTWN_UNLOCK(sc);
}
static void
urtwn_scan_end(struct ieee80211com *ic)
{
- /* XXX do nothing? */
+ struct urtwn_softc *sc = ic->ic_softc;
+
+ URTWN_LOCK(sc);
+ /* Restore limitations. */
+ urtwn_set_rx_bssid_all(sc, 0);
+ /* Set gain under link. */
+ urtwn_set_gain(sc, 0x32);
+ URTWN_UNLOCK(sc);
}
static void