Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 3 May 2015 22:56:37 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r282382 - head/sys/dev/wpi
Message-ID:  <201505032256.t43MubkL074567@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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 {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201505032256.t43MubkL074567>