summaryrefslogtreecommitdiffstats
path: root/sys/dev/ath/if_athvar.h
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2013-02-25 22:42:43 +0000
committeradrian <adrian@FreeBSD.org>2013-02-25 22:42:43 +0000
commit703d39b9460dca13766e75438d0bbc426166cf93 (patch)
treee71b5c949400df48d43a1b41509308c7a675d94c /sys/dev/ath/if_athvar.h
parent06605a4421e89ad0dfea62aabf93103b5ea4a534 (diff)
downloadFreeBSD-src-703d39b9460dca13766e75438d0bbc426166cf93.zip
FreeBSD-src-703d39b9460dca13766e75438d0bbc426166cf93.tar.gz
Begin adding support to explicitly set the current chainmask.
Right now the only way to set the chainmask is to set the hardware configured chainmask through capabilities. This is fine for forcing the chainmask to be something other than what the hardware is capable of (eg to reduce TX/RX to one connected antenna) but it does change what the HAL hardware chainmask configuration is. For operational mode changes, it (may?) make sense to separately control the TX/RX chainmask. Right now it's done as part of ar5416_reset.c - ar5416UpdateChainMasks() calculates which TX/RX chainmasks to enable based on the operating mode. (1 for legacy and whatever is supported for 11n operation.) But doing this in the HAL is suboptimal - the driver needs to know the currently configured chainmask in order to correctly enable things for each TX descriptor. This is currently done by overriding the chainmask config in the ar5416 TX routines but this has to disappear - the AR9300 HAL support requires the driver to dynamically set the TX chainmask based on the TX power and TX rate in order to meet mini-PCIe slot power requirements. So: * Introduce a new HAL method to set the operational chainmask variables; * Introduce null methods for the previous generation chipsets; * Add new driver state to record the current chainmask separate from the hardware configured chainmask. Part #2 of this will involve disabling ar5416UpdateChainMasks() and moving it into the driver; as well as properly programming the TX chainmask based on the currently configured HAL chainmask. Tested: * AR5416, STA mode - both legacy (11a/11bg) and 11n rates - verified that AR_SELFGEN_MASK (the chainmask used for self-generated frames like ACKs and RTSes) is correct, as well as the TX descriptor contents is correct.
Diffstat (limited to 'sys/dev/ath/if_athvar.h')
-rw-r--r--sys/dev/ath/if_athvar.h8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/dev/ath/if_athvar.h b/sys/dev/ath/if_athvar.h
index 1b6e160..e8fdeff 100644
--- a/sys/dev/ath/if_athvar.h
+++ b/sys/dev/ath/if_athvar.h
@@ -715,8 +715,10 @@ struct ath_softc {
u_int32_t sc_avgtsfdeltap;/* TDMA slot adjust (+) */
u_int32_t sc_avgtsfdeltam;/* TDMA slot adjust (-) */
uint16_t *sc_eepromdata; /* Local eeprom data, if AR9100 */
- int sc_txchainmask; /* currently configured TX chainmask */
- int sc_rxchainmask; /* currently configured RX chainmask */
+ int sc_txchainmask; /* hardware TX chainmask */
+ int sc_rxchainmask; /* hardware RX chainmask */
+ int sc_cur_txchainmask; /* currently configured TX chainmask */
+ int sc_cur_rxchainmask; /* currently configured RX chainmask */
int sc_rts_aggr_limit; /* TX limit on RTS aggregates */
int sc_aggr_limit; /* TX limit on all aggregates */
int sc_delim_min_pad; /* Minimum delimiter count */
@@ -1334,6 +1336,8 @@ void ath_intr(void *);
((*(_ah)->ah_getMibCycleCounts)((_ah), (_sample)))
#define ath_hal_get_chan_ext_busy(_ah) \
((*(_ah)->ah_get11nExtBusy)((_ah)))
+#define ath_hal_setchainmasks(_ah, _txchainmask, _rxchainmask) \
+ ((*(_ah)->ah_setChainMasks)((_ah), (_txchainmask), (_rxchainmask)))
#define ath_hal_spectral_supported(_ah) \
(ath_hal_getcapability(_ah, HAL_CAP_SPECTRAL_SCAN, 0, NULL) == HAL_OK)
OpenPOWER on IntegriCloud