svn commit: r194994 - in projects/mesh11s/sys/dev/ath: . ath_hal
ath_hal/ar5212 ath_hal/ar5416
Sam Leffler
sam at FreeBSD.org
Thu Jun 25 19:06:11 UTC 2009
Author: sam
Date: Thu Jun 25 19:06:08 2009
New Revision: 194994
URL: http://svn.freebsd.org/changeset/base/194994
Log:
Complete HAL_RX_FILTER_BSSID support:
o add HAL_CAP_BSSIDMATCH to identify parts that have the support for
disabling bssid match
o honor capability for set/get rx filter
o use HAL_CAP_BSSIDMATCH in driver to decide whether to use the bssid
match disable or fall back to promisc mode (still need to investigate
whether we can use the bssid mask instead)
Modified:
projects/mesh11s/sys/dev/ath/ath_hal/ah.c
projects/mesh11s/sys/dev/ath/ath_hal/ah.h
projects/mesh11s/sys/dev/ath/ath_hal/ah_internal.h
projects/mesh11s/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c
projects/mesh11s/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c
projects/mesh11s/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
projects/mesh11s/sys/dev/ath/if_ath.c
projects/mesh11s/sys/dev/ath/if_athvar.h
Modified: projects/mesh11s/sys/dev/ath/ath_hal/ah.c
==============================================================================
--- projects/mesh11s/sys/dev/ath/ath_hal/ah.c Thu Jun 25 18:54:56 2009 (r194993)
+++ projects/mesh11s/sys/dev/ath/ath_hal/ah.c Thu Jun 25 19:06:08 2009 (r194994)
@@ -503,6 +503,8 @@ ath_hal_getcapability(struct ath_hal *ah
case HAL_CAP_INTRMASK: /* mask of supported interrupts */
*result = pCap->halIntrMask;
return HAL_OK;
+ case HAL_CAP_BSSIDMATCH: /* hardware has disable bssid match */
+ return pCap->halBsssidMatchSupport ? HAL_OK : HAL_ENOTSUPP;
default:
return HAL_EINVAL;
}
Modified: projects/mesh11s/sys/dev/ath/ath_hal/ah.h
==============================================================================
--- projects/mesh11s/sys/dev/ath/ath_hal/ah.h Thu Jun 25 18:54:56 2009 (r194993)
+++ projects/mesh11s/sys/dev/ath/ath_hal/ah.h Thu Jun 25 19:06:08 2009 (r194994)
@@ -110,6 +110,7 @@ typedef enum {
HAL_CAP_BB_HANG = 35, /* can baseband hang */
HAL_CAP_MAC_HANG = 36, /* can MAC hang */
HAL_CAP_INTRMASK = 37, /* bitmask of supported interrupts */
+ HAL_CAP_BSSIDMATCH = 38, /* hardware has disable bssid match */
} HAL_CAPABILITY_TYPE;
/*
Modified: projects/mesh11s/sys/dev/ath/ath_hal/ah_internal.h
==============================================================================
--- projects/mesh11s/sys/dev/ath/ath_hal/ah_internal.h Thu Jun 25 18:54:56 2009 (r194993)
+++ projects/mesh11s/sys/dev/ath/ath_hal/ah_internal.h Thu Jun 25 19:06:08 2009 (r194994)
@@ -193,7 +193,8 @@ typedef struct {
halExtChanDfsSupport : 1,
halForcePpmSupport : 1,
halEnhancedPmSupport : 1,
- halMbssidAggrSupport : 1;
+ halMbssidAggrSupport : 1,
+ halBsssidMatchSupport : 1;
uint32_t halWirelessModes;
uint16_t halTotalQueues;
uint16_t halKeyCacheSize;
Modified: projects/mesh11s/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c
==============================================================================
--- projects/mesh11s/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c Thu Jun 25 18:54:56 2009 (r194993)
+++ projects/mesh11s/sys/dev/ath/ath_hal/ar5212/ar5212_attach.c Thu Jun 25 19:06:08 2009 (r194994)
@@ -833,11 +833,15 @@ ar5212FillCapabilityInfo(struct ath_hal
ahpriv->ah_rxornIsFatal =
(AH_PRIVATE(ah)->ah_macVersion < AR_SREV_VERSION_VENICE);
- /* h/w phy counters first appeared in Hainan */
- pCap->halHwPhyCounterSupport =
- (AH_PRIVATE(ah)->ah_macVersion == AR_SREV_VERSION_VENICE &&
+ /* enable features that first appeared in Hainan */
+ if ((AH_PRIVATE(ah)->ah_macVersion == AR_SREV_VERSION_VENICE &&
AH_PRIVATE(ah)->ah_macRev == AR_SREV_HAINAN) ||
- AH_PRIVATE(ah)->ah_macVersion > AR_SREV_VERSION_VENICE;
+ AH_PRIVATE(ah)->ah_macVersion > AR_SREV_VERSION_VENICE) {
+ /* h/w phy counters */
+ pCap->halHwPhyCounterSupport = AH_TRUE;
+ /* bssid match disable */
+ pCap->halBssIdMaskSupport = AH_TRUE;
+ }
pCap->halTstampPrecision = 15;
pCap->halIntrMask = HAL_INT_COMMON
Modified: projects/mesh11s/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c
==============================================================================
--- projects/mesh11s/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c Thu Jun 25 18:54:56 2009 (r194993)
+++ projects/mesh11s/sys/dev/ath/ath_hal/ar5212/ar5212_recv.c Thu Jun 25 19:06:08 2009 (r194994)
@@ -163,6 +163,9 @@ ar5212GetRxFilter(struct ath_hal *ah)
bits |= HAL_RX_FILTER_PHYRADAR;
if (phybits & (AR_PHY_ERR_OFDM_TIMING|AR_PHY_ERR_CCK_TIMING))
bits |= HAL_RX_FILTER_PHYERR;
+ if (AH_PRIVATE(ah)->ah_caps.halBsssidMatchSupport &&
+ (OS_REG_READ(ah, AR_MISC_MODE) & AR_MISC_MODE_BSSID_MATCH_FORCE))
+ bits |= HAL_RX_FILTER_BSSID;
return bits;
}
@@ -173,7 +176,6 @@ void
ar5212SetRxFilter(struct ath_hal *ah, uint32_t bits)
{
uint32_t phybits;
- uint32_t miscbits;
OS_REG_WRITE(ah, AR_RX_FILTER,
bits &~ (HAL_RX_FILTER_PHYRADAR|HAL_RX_FILTER_PHYERR|
@@ -191,12 +193,14 @@ ar5212SetRxFilter(struct ath_hal *ah, ui
OS_REG_WRITE(ah, AR_RXCFG,
OS_REG_READ(ah, AR_RXCFG) &~ AR_RXCFG_ZLFDMA);
}
- miscbits = OS_REG_READ(ah, AR_MISC_MODE);
- if (bits & HAL_RX_FILTER_BSSID)
- miscbits |= AR_MISC_MODE_BSSID_MATCH_FORCE;
- else
- miscbits &= ~AR_MISC_MODE_BSSID_MATCH_FORCE;
- OS_REG_WRITE(ah, AR_MISC_MODE, miscbits);
+ if (AH_PRIVATE(ah)->ah_caps.halBsssidMatchSupport) {
+ uint32_t miscbits = OS_REG_READ(ah, AR_MISC_MODE);
+ if (bits & HAL_RX_FILTER_BSSID)
+ miscbits |= AR_MISC_MODE_BSSID_MATCH_FORCE;
+ else
+ miscbits &= ~AR_MISC_MODE_BSSID_MATCH_FORCE;
+ OS_REG_WRITE(ah, AR_MISC_MODE, miscbits);
+ }
}
/*
Modified: projects/mesh11s/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c
==============================================================================
--- projects/mesh11s/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c Thu Jun 25 18:54:56 2009 (r194993)
+++ projects/mesh11s/sys/dev/ath/ath_hal/ar5416/ar5416_attach.c Thu Jun 25 19:06:08 2009 (r194994)
@@ -811,6 +811,7 @@ ar5416FillCapabilityInfo(struct ath_hal
pCap->halMbssidAggrSupport = AH_TRUE;
pCap->halForcePpmSupport = AH_TRUE;
pCap->halEnhancedPmSupport = AH_TRUE;
+ pCap->halBsssidMatchSupport = AH_TRUE;
if (ath_hal_eepromGetFlag(ah, AR_EEP_RFKILL) &&
ath_hal_eepromGet(ah, AR_EEP_RFSILENT, &ahpriv->ah_rfsilent) == HAL_OK) {
Modified: projects/mesh11s/sys/dev/ath/if_ath.c
==============================================================================
--- projects/mesh11s/sys/dev/ath/if_ath.c Thu Jun 25 18:54:56 2009 (r194993)
+++ projects/mesh11s/sys/dev/ath/if_ath.c Thu Jun 25 19:06:08 2009 (r194994)
@@ -656,6 +656,7 @@ ath_attach(u_int16_t devid, struct ath_s
if (ath_hal_hasbursting(ah))
ic->ic_caps |= IEEE80211_C_BURST;
sc->sc_hasbmask = ath_hal_hasbssidmask(ah);
+ sc->sc_hasbmatch = ath_hal_hasbssidmatch(ah);
sc->sc_hastsfadd = ath_hal_hastsfadjust(ah);
if (ath_hal_hasfastframes(ah))
ic->ic_caps |= IEEE80211_C_FF;
@@ -2379,8 +2380,13 @@ ath_calcrxfilter(struct ath_softc *sc)
if (ic->ic_opmode == IEEE80211_M_HOSTAP &&
IEEE80211_IS_CHAN_ANYG(ic->ic_curchan))
rfilt |= HAL_RX_FILTER_BEACON;
- if (ic->ic_opmode == IEEE80211_M_MBSS)
- rfilt |= HAL_RX_FILTER_BEACON | HAL_RX_FILTER_BSSID;
+ if (ic->ic_opmode == IEEE80211_M_MBSS) {
+ rfilt |= HAL_RX_FILTER_BEACON;
+ if (sc->sc_hasbmatch)
+ rfilt |= HAL_RX_FILTER_BSSID;
+ else
+ rfilt |= HAL_RX_FILTER_PROM;
+ }
if (ic->ic_opmode == IEEE80211_M_MONITOR)
rfilt |= HAL_RX_FILTER_CONTROL;
DPRINTF(sc, ATH_DEBUG_MODE, "%s: RX filter 0x%x, %s if_flags 0x%x\n",
Modified: projects/mesh11s/sys/dev/ath/if_athvar.h
==============================================================================
--- projects/mesh11s/sys/dev/ath/if_athvar.h Thu Jun 25 18:54:56 2009 (r194993)
+++ projects/mesh11s/sys/dev/ath/if_athvar.h Thu Jun 25 19:06:08 2009 (r194994)
@@ -235,6 +235,7 @@ struct ath_softc {
sc_outdoor : 1,/* outdoor operation */
sc_dturbo : 1,/* dynamic turbo in use */
sc_hasbmask : 1,/* bssid mask support */
+ sc_hasbmatch: 1,/* bssid match disable support*/
sc_hastsfadd: 1,/* tsf adjust support */
sc_beacons : 1,/* beacons running */
sc_swbmiss : 1,/* sta mode using sw bmiss */
@@ -590,6 +591,8 @@ void ath_intr(void *);
(ath_hal_getcapability(_ah, HAL_CAP_FASTFRAME, 0, NULL) == HAL_OK)
#define ath_hal_hasbssidmask(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_BSSIDMASK, 0, NULL) == HAL_OK)
+#define ath_hal_hasbssidmatch(_ah) \
+ (ath_hal_getcapability(_ah, HAL_CAP_BSSIDMATCH, 0, NULL) == HAL_OK)
#define ath_hal_hastsfadjust(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_TSF_ADJUST, 0, NULL) == HAL_OK)
#define ath_hal_gettsfadjust(_ah) \
More information about the svn-src-projects
mailing list