summaryrefslogtreecommitdiffstats
path: root/sys/contrib
diff options
context:
space:
mode:
authoradrian <adrian@FreeBSD.org>2016-06-20 16:12:27 +0000
committeradrian <adrian@FreeBSD.org>2016-06-20 16:12:27 +0000
commitd086e291831bd99c295e06d2ce5a0afc51045025 (patch)
tree4535a8582144a11143006ce0e2ecfeb3c8553e70 /sys/contrib
parent06125ebef50f0ddd7807915589bd685571774531 (diff)
downloadFreeBSD-src-d086e291831bd99c295e06d2ce5a0afc51045025.zip
FreeBSD-src-d086e291831bd99c295e06d2ce5a0afc51045025.tar.gz
[ath] implement TX queue configuration extensions for the AR9380 HAL.
Among other things, this introduces the idea of DBA-gated queues that aren't the CABQ. The TDMA support requires this. Tested: * AR9580 (hostap mode) * AR9380 (sta mode) Approved by: re (gjb)
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c46
1 files changed, 33 insertions, 13 deletions
diff --git a/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c b/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c
index f6ae73e..4dacde1 100644
--- a/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c
+++ b/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c
@@ -368,19 +368,40 @@ ar9300_reset_tx_queue(struct ath_hal *ah, u_int q)
OS_REG_WRITE(ah, AR_DCHNTIME(q), SM(qi->tqi_burstTime, AR_D_CHNTIME_DUR) |
(qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0));
- if (qi->tqi_burstTime &&
- (qi->tqi_qflags & HAL_TXQ_RDYTIME_EXP_POLICY_ENABLE))
- {
+ if (qi->tqi_readyTime &&
+ (qi->tqi_qflags & HAL_TXQ_RDYTIME_EXP_POLICY_ENABLE))
qmisc |= AR_Q_MISC_RDYTIME_EXP_POLICY;
- }
-
- if (qi->tqi_qflags & HAL_TXQ_BACKOFF_DISABLE) {
+ if (qi->tqi_qflags & HAL_TXQ_DBA_GATED)
+ qmisc = (qmisc &~ AR_Q_MISC_FSP) | AR_Q_MISC_FSP_DBA_GATED;
+ if (MS(qmisc, AR_Q_MISC_FSP) != AR_Q_MISC_FSP_ASAP) {
+ /*
+ * These are meangingful only when not scheduled asap.
+ */
+ if (qi->tqi_qflags & HAL_TXQ_CBR_DIS_BEMPTY)
+ qmisc |= AR_Q_MISC_CBR_INCR_DIS0;
+ else
+ qmisc &= ~AR_Q_MISC_CBR_INCR_DIS0;
+ if (qi->tqi_qflags & HAL_TXQ_CBR_DIS_QEMPTY)
+ qmisc |= AR_Q_MISC_CBR_INCR_DIS1;
+ else
+ qmisc &= ~AR_Q_MISC_CBR_INCR_DIS1;
+ }
+
+ if (qi->tqi_qflags & HAL_TXQ_BACKOFF_DISABLE)
dmisc |= AR_D_MISC_POST_FR_BKOFF_DIS;
- }
-
- if (qi->tqi_qflags & HAL_TXQ_FRAG_BURST_BACKOFF_ENABLE) {
+ if (qi->tqi_qflags & HAL_TXQ_FRAG_BURST_BACKOFF_ENABLE)
dmisc |= AR_D_MISC_FRAG_BKOFF_EN;
- }
+ if (qi->tqi_qflags & HAL_TXQ_ARB_LOCKOUT_GLOBAL)
+ dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL,
+ AR_D_MISC_ARB_LOCKOUT_CNTRL);
+ else if (qi->tqi_qflags & HAL_TXQ_ARB_LOCKOUT_INTRA)
+ dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_INTRA_FR,
+ AR_D_MISC_ARB_LOCKOUT_CNTRL);
+ if (qi->tqi_qflags & HAL_TXQ_IGNORE_VIRTCOL)
+ dmisc |= SM(AR_D_MISC_VIR_COL_HANDLING_IGNORE,
+ AR_D_MISC_VIR_COL_HANDLING);
+ if (qi->tqi_qflags & HAL_TXQ_SEQNUM_INC_DIS)
+ dmisc |= AR_D_MISC_SEQ_NUM_INCR_DIS;
switch (qi->tqi_type) {
case HAL_TX_QUEUE_BEACON: /* beacon frames */
@@ -433,9 +454,8 @@ ar9300_reset_tx_queue(struct ath_hal *ah, u_int q)
SM(TU_TO_USEC(value), AR_Q_RDYTIMECFG_DURATION) |
AR_Q_RDYTIMECFG_EN);
}
-
- dmisc |= (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL <<
- AR_D_MISC_ARB_LOCKOUT_CNTRL_S);
+ dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL,
+ AR_D_MISC_ARB_LOCKOUT_CNTRL);
break;
case HAL_TX_QUEUE_PSPOLL:
/*
OpenPOWER on IntegriCloud