svn commit: r187556 - user/sam/wifi/sys/dev/ath/ath_hal
Sam Leffler
sam at FreeBSD.org
Wed Jan 21 10:41:50 PST 2009
Author: sam
Date: Wed Jan 21 18:41:48 2009
New Revision: 187556
URL: http://svn.freebsd.org/changeset/base/187556
Log:
move CTL out of the private channel data so we can pack channels
Modified:
user/sam/wifi/sys/dev/ath/ath_hal/ah_internal.h
user/sam/wifi/sys/dev/ath/ath_hal/ah_regdomain.c
Modified: user/sam/wifi/sys/dev/ath/ath_hal/ah_internal.h
==============================================================================
--- user/sam/wifi/sys/dev/ath/ath_hal/ah_internal.h Wed Jan 21 18:38:12 2009 (r187555)
+++ user/sam/wifi/sys/dev/ath/ath_hal/ah_internal.h Wed Jan 21 18:41:48 2009 (r187556)
@@ -192,7 +192,6 @@ typedef struct {
uint8_t halNumAntCfg5GHz;
} HAL_CAPABILITIES;
-struct regDomainPair;
struct regDomain;
/*
@@ -277,9 +276,8 @@ struct ath_hal_private {
HAL_REG_DOMAIN ah_currentRD; /* EEPROM regulatory domain */
HAL_CHANNEL_INTERNAL ah_channels[256]; /* calculated channel list */
u_int ah_nchan; /* valid channels in list */
- const struct regDomainPair *ah_regpair; /* reg state */
- const struct regDomain *ah_reg2G; /* reg state for 2G band */
- const struct regDomain *ah_reg5G; /* reg state for 5G band */
+ const struct regDomain *ah_rd2GHz; /* reg state for 2G band */
+ const struct regDomain *ah_rd5GHz; /* reg state for 5G band */
uint8_t ah_coverageClass; /* coverage class */
HAL_BOOL ah_regdomainUpdate; /* regdomain is updated? */
@@ -519,13 +517,9 @@ ath_hal_getantennareduction(struct ath_h
/*
* Return the test group for the specific channel based on
- * the current regulator domain.
+ * the current regulatory setup.
*/
-static OS_INLINE u_int
-ath_hal_getctl(struct ath_hal *ah, const HAL_CHANNEL_INTERNAL *chan)
-{
- return chan->ctl;
-}
+u_int ath_hal_getctl(struct ath_hal *, const HAL_CHANNEL_INTERNAL *);
/*
* Map a public channel definition to the corresponding
Modified: user/sam/wifi/sys/dev/ath/ath_hal/ah_regdomain.c
==============================================================================
--- user/sam/wifi/sys/dev/ath/ath_hal/ah_regdomain.c Wed Jan 21 18:38:12 2009 (r187555)
+++ user/sam/wifi/sys/dev/ath/ath_hal/ah_regdomain.c Wed Jan 21 18:41:48 2009 (r187556)
@@ -2191,22 +2191,6 @@ ath_hal_getchannels(struct ath_hal *ah,
return status;
}
-static uint8_t
-getctl(const struct ieee80211_channel *c, uint8_t ctl)
-{
- if (IEEE80211_IS_CHAN_B(c))
- return ctl | CTL_11B;
- if (IEEE80211_IS_CHAN_G(c))
- return ctl | CTL_11G;
- if (IEEE80211_IS_CHAN_108G(c))
- return ctl | CTL_108G;
- if (IEEE80211_IS_CHAN_ST(c))
- return ctl | CTL_TURBO;
- if (IEEE80211_IS_CHAN_A(c))
- return ctl | CTL_11A;
- return ctl;
-}
-
/*
* Setup the channel list based on the information in the EEPROM.
*/
@@ -2241,10 +2225,6 @@ ath_hal_init_channels(struct ath_hal *ah
ic->maxTxPower = c->ic_maxpower;
ic->minTxPower = c->ic_minpower;
ic->antennaMax = c->ic_maxantgain;
- ic->ctl = getctl(c,
- IEEE80211_IS_CHAN_2GHZ(c) ?
- rd2GHz->conformanceTestLimit :
- rd5GHz->conformanceTestLimit);
c->ic_devdata = i;
@@ -2264,7 +2244,9 @@ ath_hal_init_channels(struct ath_hal *ah
c->ic_maxantgain, ic->ctl);
}
AH_PRIVATE(ah)->ah_nchan = *nchans;
- /* XXX copy private setting to public area */
+ AH_PRIVATE(ah)->ah_rd2GHz = rd2GHz;
+ AH_PRIVATE(ah)->ah_rd5GHz = rd5GHz;
+
ah->ah_countryCode = country->countryCode;
HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n",
__func__, ah->ah_countryCode);
@@ -2288,6 +2270,8 @@ ath_hal_set_channels(struct ath_hal *ah,
int i;
if (nchans > N(AH_PRIVATE(ah)->ah_channels)) {
+ HALDEBUG(ah, HAL_DEBUG_ANY, "%s: too many channels, %u > %u\n",
+ __func__, nchans, N(AH_PRIVATE(ah)->ah_channels));
return HAL_EINVAL;
}
status = getregstate(ah, cc, regDmn, &country, &rd2GHz, &rd5GHz);
@@ -2305,9 +2289,7 @@ ath_hal_set_channels(struct ath_hal *ah,
ic->maxTxPower = c->ic_maxpower;
ic->minTxPower = c->ic_minpower;
ic->antennaMax = c->ic_maxantgain;
- ic->ctl = getctl(c, IEEE80211_IS_CHAN_2GHZ(c) ?
- rd2GHz->conformanceTestLimit :
- rd5GHz->conformanceTestLimit);
+
c->ic_devdata = i;
HALDEBUG(ah, HAL_DEBUG_REGDOMAIN,
@@ -2318,7 +2300,9 @@ ath_hal_set_channels(struct ath_hal *ah,
ic->antennaMax, ic->ctl);
}
AH_PRIVATE(ah)->ah_nchan = nchans;
- /* XXX copy private setting to public area */
+ AH_PRIVATE(ah)->ah_rd2GHz = rd2GHz;
+ AH_PRIVATE(ah)->ah_rd5GHz = rd5GHz;
+
ah->ah_countryCode = country->countryCode;
HALDEBUG(ah, HAL_DEBUG_REGDOMAIN, "%s: cc %u\n",
__func__, ah->ah_countryCode);
@@ -2352,3 +2336,36 @@ ath_hal_checkchannel(struct ath_hal *ah,
return AH_NULL;
#undef CHAN_FLAGS
}
+
+#define isWwrSKU(_ah) \
+ ((getEepromRD((_ah)) & WORLD_SKU_MASK) == WORLD_SKU_PREFIX || \
+ getEepromRD(_ah) == WORLD)
+
+/*
+ * Return the test group for the specific channel based on
+ * the current regulatory setup.
+ */
+u_int
+ath_hal_getctl(struct ath_hal *ah, const HAL_CHANNEL_INTERNAL *c)
+{
+ u_int ctl;
+
+ if (AH_PRIVATE(ah)->ah_rd2GHz == AH_PRIVATE(ah)->ah_rd5GHz ||
+ (ah->ah_countryCode == CTRY_DEFAULT && isWwrSKU(ah)))
+ ctl = SD_NO_CTL;
+ else if (IS_CHAN_2GHZ(c))
+ ctl = AH_PRIVATE(ah)->ah_rd2GHz->conformanceTestLimit;
+ else
+ ctl = AH_PRIVATE(ah)->ah_rd5GHz->conformanceTestLimit;
+ if (IS_CHAN_B(c))
+ return ctl | CTL_11B;
+ if (IS_CHAN_G(c))
+ return ctl | CTL_11G;
+ if (IS_CHAN_108G(c))
+ return ctl | CTL_108G;
+ if (IS_CHAN_TURBO(c))
+ return ctl | CTL_TURBO;
+ if (IS_CHAN_A(c))
+ return ctl | CTL_11A;
+ return ctl;
+}
More information about the svn-src-user
mailing list