Author: adrian
Date: Sun May  3 22:56:36 2015
New Revision: 282382
URL: https://svnweb.freebsd.org/changeset/base/282382

Log:
  Fix active/passive dwell calculation.
  
  PR:           kern/197143
  Submitted by: Andriy Voskoboinyk <s3er...@gmail.com>

Modified:
  head/sys/dev/wpi/if_wpi.c
  head/sys/dev/wpi/if_wpireg.h

Modified: head/sys/dev/wpi/if_wpi.c
==============================================================================
--- head/sys/dev/wpi/if_wpi.c   Sun May  3 22:55:06 2015        (r282381)
+++ head/sys/dev/wpi/if_wpi.c   Sun May  3 22:56:36 2015        (r282382)
@@ -3818,7 +3818,7 @@ wpi_get_active_dwell_time(struct wpi_sof
 }
 
 /*
- * Limit the total dwell time to 85% of the beacon interval.
+ * Limit the total dwell time.
  *
  * Returns the dwell time in milliseconds.
  */
@@ -3843,11 +3843,11 @@ wpi_limit_dwell(struct wpi_softc *sc, ui
        if (bintval > 0) {
                DPRINTF(sc, WPI_DEBUG_SCAN, "%s: bintval=%d\n", __func__,
                    bintval);
-               return (MIN(WPI_PASSIVE_DWELL_BASE, ((bintval * 85) / 100)));
+               return (MIN(dwell_time, bintval - WPI_CHANNEL_TUNE_TIME * 2));
        }
 
        /* No association context? Default. */
-       return (WPI_PASSIVE_DWELL_BASE);
+       return dwell_time;
 }
 
 static uint16_t
@@ -3882,7 +3882,7 @@ wpi_scan(struct wpi_softc *sc, struct ie
        struct ieee80211_rateset *rs;
        uint16_t dwell_active, dwell_passive;
        uint8_t *buf, *frm;
-       int buflen, error, i, nssid;
+       int bgscan, bintval, buflen, error, i, nssid;
 
        DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
 
@@ -3893,10 +3893,16 @@ wpi_scan(struct wpi_softc *sc, struct ie
        if (callout_pending(&sc->scan_timeout)) {
                device_printf(sc->sc_dev, "%s: called whilst scanning!\n",
                    __func__);
+               error = EAGAIN;
+               goto fail;
+       }
 
-               DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR, __func__);
-
-               return (EAGAIN);
+       bgscan = wpi_check_bss_filter(sc);
+       bintval = vap->iv_bss->ni_intval;
+       if (bgscan != 0 &&
+           bintval < WPI_QUIET_TIME_DEFAULT + WPI_CHANNEL_TUNE_TIME * 2) {
+               error = EOPNOTSUPP;
+               goto fail;
        }
 
        buf = malloc(WPI_SCAN_MAXSZ, M_DEVBUF, M_NOWAIT | M_ZERO);
@@ -3913,8 +3919,8 @@ wpi_scan(struct wpi_softc *sc, struct ie
         * Move to the next channel if no packets are received within 10 msecs
         * after sending the probe request.
         */
-       hdr->quiet_time = htole16(10);          /* timeout in milliseconds */
-       hdr->quiet_threshold = htole16(1);      /* min # of packets */
+       hdr->quiet_time = htole16(WPI_QUIET_TIME_DEFAULT);
+       hdr->quiet_threshold = htole16(1);
        /*
         * Max needs to be greater than active and passive and quiet!
         * It's also in microseconds!
@@ -4003,8 +4009,8 @@ wpi_scan(struct wpi_softc *sc, struct ie
        dwell_passive = wpi_get_passive_dwell_time(sc, c);
 
        /* Make sure they're valid. */
-       if (dwell_passive <= dwell_active)
-               dwell_passive = dwell_active + 1;
+       if (dwell_active > dwell_passive)
+               dwell_active = dwell_passive;
 
        chan->active = htole16(dwell_active);
        chan->passive = htole16(dwell_passive);

Modified: head/sys/dev/wpi/if_wpireg.h
==============================================================================
--- head/sys/dev/wpi/if_wpireg.h        Sun May  3 22:55:06 2015        
(r282381)
+++ head/sys/dev/wpi/if_wpireg.h        Sun May  3 22:56:36 2015        
(r282382)
@@ -611,8 +611,10 @@ struct wpi_scan_hdr {
        uint16_t        len;
        uint8_t         reserved1;
        uint8_t         nchan;
-       uint16_t        quiet_time;
-       uint16_t        quiet_threshold;
+       uint16_t        quiet_time;     /* timeout in milliseconds */
+#define WPI_QUIET_TIME_DEFAULT         10
+
+       uint16_t        quiet_threshold; /* min # of packets */
        uint16_t        crc_threshold;
        uint16_t        reserved2;
        uint32_t        max_svc;        /* background scans */
@@ -652,6 +654,7 @@ struct wpi_scan_chan {
 #define WPI_PASSIVE_DWELL_TIME_2GHZ    ( 20)
 #define WPI_PASSIVE_DWELL_TIME_5GHZ    ( 10)
 #define WPI_PASSIVE_DWELL_BASE         (100)
+#define WPI_CHANNEL_TUNE_TIME          (  6)
 
 /* Structure for command WPI_CMD_TXPOWER. */
 struct wpi_cmd_txpower {
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to