Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Jan 2017 04:56:04 +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: r311361 - head/sys/dev/ath/ath_hal
Message-ID:  <201701050456.v054u4p9086576@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Thu Jan  5 04:56:04 2017
New Revision: 311361
URL: https://svnweb.freebsd.org/changeset/base/311361

Log:
  [ath_hal] mad, mad hacks to get some semblence of correct HT/40 channels populated.
  
  The HT40 channel population logic was "just" doing pairs of channels starting with
  the band entry frequency.  Trouble is, a lot of the rules start way off at 5120MHz,
  which isn't a valid 5GHz channel.  Then, eg for HT40U, it would populate:
  
  * (5120,5140)
  * (5160,5180)
  * (5200,5220)
  * (5240,5260)
  
  .. as the HT40U pairs, with the first being the primary channel.  Channel 36
  is 5180MHz, and since it's not a primary channel here, it wouldn't populate it.
  Then, the next HT40U would be 5200/5220, which is highly wrong.
  
  HT40D had the same problem.
  
  So, this just forces that 5GHz HT40 channels start at channel 36 (5180),
  no matter what the band edge says.  This includes eg doing 4.9GHz channels.
  
  This erm, meant that the HT40 channels for the low band was always wrong.
  
  Oops!
  
  Tested:
  
  * AR9380, STA mode
  * AR9344 SoC, AP mode
  
  MFC after:	1 week

Modified:
  head/sys/dev/ath/ath_hal/ah_regdomain.c

Modified: head/sys/dev/ath/ath_hal/ah_regdomain.c
==============================================================================
--- head/sys/dev/ath/ath_hal/ah_regdomain.c	Thu Jan  5 04:49:23 2017	(r311360)
+++ head/sys/dev/ath/ath_hal/ah_regdomain.c	Thu Jan  5 04:56:04 2017	(r311361)
@@ -426,6 +426,10 @@ addchan(struct ath_hal *ah, struct ieee8
 	if (*nchans >= maxchans)
 		return (HAL_ENOMEM);
 
+	HALDEBUG(ah, HAL_DEBUG_REGDOMAIN,
+	    "%s: %d: freq=%d, flags=0x%08x\n",
+	    __func__, *nchans, (int) freq, flags);
+
 	c = &chans[(*nchans)++];
 	c->ic_freq = freq;
 	c->ic_flags = flags;
@@ -439,7 +443,7 @@ addchan(struct ath_hal *ah, struct ieee8
 
 static int
 copychan_prev(struct ath_hal *ah, struct ieee80211_channel chans[],
-    u_int maxchans, int *nchans, uint16_t freq)
+    u_int maxchans, int *nchans, uint16_t freq, uint32_t flags)
 {
 	struct ieee80211_channel *c;
 
@@ -449,6 +453,10 @@ copychan_prev(struct ath_hal *ah, struct
 	if (*nchans >= maxchans)
 		return (HAL_ENOMEM);
 
+	HALDEBUG(ah, HAL_DEBUG_REGDOMAIN,
+	    "%s: %d: freq=%d, flags=0x%08x\n",
+	    __func__, *nchans, (int) freq, flags);
+
 	c = &chans[(*nchans)++];
 	c[0] = c[-1];
 	c->ic_freq = freq;
@@ -469,9 +477,13 @@ add_chanlist_band(struct ath_hal *ah, st
 	if (freq_hi < freq_lo)
 		return (0);
 
+	HALDEBUG(ah, HAL_DEBUG_REGDOMAIN,
+	    "%s: freq=%d..%d, flags=0x%08x, step=%d\n", __func__,
+	    (int) freq_lo, (int) freq_hi, flags, step);
+
 	error = addchan(ah, chans, maxchans, nchans, freq, flags, fband, rd);
 	for (freq += step; freq <= freq_hi && error == 0; freq += step)
-		error = copychan_prev(ah, chans, maxchans, nchans, freq);
+		error = copychan_prev(ah, chans, maxchans, nchans, freq, flags);
 
 	return (error);
 }
@@ -548,7 +560,6 @@ add_chanlist_mode(struct ath_hal *ah, st
 			continue;
 		}
 #endif
-
 		/*
 		 * XXX TODO: handle REG_EXT_FCC_CH_144.
 		 *
@@ -558,11 +569,52 @@ add_chanlist_mode(struct ath_hal *ah, st
 
 		bfreq_lo = MAX(fband->lowChannel + low_adj, freq_lo);
 		bfreq_hi = MIN(fband->highChannel + hi_adj, freq_hi);
+
+		/*
+		 * Don't start the 5GHz channel list at 5120MHz.
+		 *
+		 * Unfortunately (sigh) the HT40 channel creation
+		 * logic will create HT40U channels at 5120, 5160, 5200.
+		 * This means that 36 (5180) isn't considered as a
+		 * HT40 channel, and everything goes messed up from there.
+		 */
+		if ((cm->flags & IEEE80211_CHAN_5GHZ) &&
+		    (cm->flags & IEEE80211_CHAN_HT40U)) {
+			if (bfreq_lo < 5180)
+				bfreq_lo = 5180;
+		}
+
+		/*
+		 * Same with HT40D - need to start at 5200 or the low
+		 * channels are all wrong again.
+		 */
+		if ((cm->flags & IEEE80211_CHAN_5GHZ) &&
+		    (cm->flags & IEEE80211_CHAN_HT40D)) {
+			if (bfreq_lo < 5200)
+				bfreq_lo = 5200;
+		}
+
 		if (fband->channelSep >= channelSep)
 			step = fband->channelSep;
 		else
 			step = roundup(channelSep, fband->channelSep);
 
+		HALDEBUG(ah, HAL_DEBUG_REGDOMAIN,
+		    "%s: freq_lo=%d, freq_hi=%d, low_adj=%d, hi_adj=%d, "
+		    "bandlo=%d, bandhi=%d, bfreqlo=%d, bfreqhi=%d, step=%d, "
+		    "flags=0x%08x\n",
+		    __func__,
+		    (int) freq_lo,
+		    (int) freq_hi,
+		    (int) low_adj,
+		    (int) hi_adj,
+		    (int) fband->lowChannel,
+		    (int) fband->highChannel,
+		    (int) bfreq_lo,
+		    (int) bfreq_hi,
+		    step,
+		    (int) cm->flags);
+
 		error = add_chanlist_band(ah, chans, maxchans, nchans,
 		    bfreq_lo, bfreq_hi, step, cm->flags, fband, rd);
 		if (error != 0)	{



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