svn commit: r282382 - head/sys/dev/wpi
Adrian Chadd
adrian at FreeBSD.org
Sun May 3 22:56:37 UTC 2015
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 <s3erios at 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 {
More information about the svn-src-all
mailing list