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.lo...@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
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to