From owner-svn-src-head@freebsd.org Wed Jun 8 16:26:45 2016 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id E743DB6FAE1; Wed, 8 Jun 2016 16:26:45 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B299C130C; Wed, 8 Jun 2016 16:26:45 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id u58GQic1004740; Wed, 8 Jun 2016 16:26:44 GMT (envelope-from adrian@FreeBSD.org) Received: (from adrian@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id u58GQiaY004739; Wed, 8 Jun 2016 16:26:44 GMT (envelope-from adrian@FreeBSD.org) Message-Id: <201606081626.u58GQiaY004739@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: adrian set sender to adrian@FreeBSD.org using -f From: Adrian Chadd Date: Wed, 8 Jun 2016 16:26:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r301641 - head/sys/contrib/dev/ath/ath_hal/ar9300 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 08 Jun 2016 16:26:46 -0000 Author: adrian Date: Wed Jun 8 16:26:44 2016 New Revision: 301641 URL: https://svnweb.freebsd.org/changeset/base/301641 Log: [ath_hal] modify the xmit code to use temporary variables for setting qmisc/dmisc. This is in preparation for some other TDMA fixes which will hopefully end with having working TDMA. But, it does avoid lots of read/modify/writes in the txq setup path. Modified: head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c Modified: head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c ============================================================================== --- head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c Wed Jun 8 16:21:38 2016 (r301640) +++ head/sys/contrib/dev/ath/ath_hal/ar9300/ar9300_xmit.c Wed Jun 8 16:26:44 2016 (r301641) @@ -288,6 +288,7 @@ ar9300_reset_tx_queue(struct ath_hal *ah const struct ieee80211_channel *chan = AH_PRIVATE(ah)->ah_curchan; HAL_TX_QUEUE_INFO *qi; u_int32_t cw_min, chan_cw_min, value; + uint32_t qmisc, dmisc; if (q >= p_cap->halTotalQueues) { HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: invalid queue num %u\n", __func__, q); @@ -335,17 +336,15 @@ ar9300_reset_tx_queue(struct ath_hal *ah SM(qi->tqi_shretry, AR_D_RETRY_LIMIT_FR_SH)); /* enable early termination on the QCU */ - OS_REG_WRITE(ah, AR_QMISC(q), AR_Q_MISC_DCU_EARLY_TERM_REQ); + qmisc = AR_Q_MISC_DCU_EARLY_TERM_REQ; /* enable DCU to wait for next fragment from QCU */ if (AR_SREV_WASP(ah) && (AH_PRIVATE((ah))->ah_macRev <= AR_SREV_REVISION_WASP_12)) { /* WAR for EV#85395: Wasp Rx overrun issue - reduces Tx queue backoff * threshold to 1 to avoid Rx overruns - Fixed in Wasp 1.3 */ - OS_REG_WRITE(ah, AR_DMISC(q), - AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x1); + dmisc = AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x1; } else { - OS_REG_WRITE(ah, AR_DMISC(q), - AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2); + dmisc = AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2; } /* multiqueue support */ @@ -355,11 +354,9 @@ ar9300_reset_tx_queue(struct ath_hal *ah SM(qi->tqi_cbrPeriod, AR_Q_CBRCFG_INTERVAL) | SM(qi->tqi_cbrOverflowLimit, AR_Q_CBRCFG_OVF_THRESH)); - OS_REG_WRITE(ah, AR_QMISC(q), - OS_REG_READ(ah, AR_QMISC(q)) | - AR_Q_MISC_FSP_CBR | + qmisc |= AR_Q_MISC_FSP_CBR | (qi->tqi_cbrOverflowLimit ? - AR_Q_MISC_CBR_EXP_CNTR_LIMIT_EN : 0)); + AR_Q_MISC_CBR_EXP_CNTR_LIMIT_EN : 0); } if (qi->tqi_readyTime && (qi->tqi_type != HAL_TX_QUEUE_CAB)) { @@ -374,34 +371,27 @@ ar9300_reset_tx_queue(struct ath_hal *ah if (qi->tqi_burstTime && (qi->tqi_qflags & HAL_TXQ_RDYTIME_EXP_POLICY_ENABLE)) { - OS_REG_WRITE(ah, AR_QMISC(q), OS_REG_READ(ah, AR_QMISC(q)) | - AR_Q_MISC_RDYTIME_EXP_POLICY); + qmisc |= AR_Q_MISC_RDYTIME_EXP_POLICY; } if (qi->tqi_qflags & HAL_TXQ_BACKOFF_DISABLE) { - OS_REG_WRITE(ah, AR_DMISC(q), OS_REG_READ(ah, AR_DMISC(q)) | - AR_D_MISC_POST_FR_BKOFF_DIS); + dmisc |= AR_D_MISC_POST_FR_BKOFF_DIS; } if (qi->tqi_qflags & HAL_TXQ_FRAG_BURST_BACKOFF_ENABLE) { - OS_REG_WRITE(ah, AR_DMISC(q), OS_REG_READ(ah, AR_DMISC(q)) | - AR_D_MISC_FRAG_BKOFF_EN); + dmisc |= AR_D_MISC_FRAG_BKOFF_EN; } switch (qi->tqi_type) { case HAL_TX_QUEUE_BEACON: /* beacon frames */ - OS_REG_WRITE(ah, AR_QMISC(q), - OS_REG_READ(ah, AR_QMISC(q)) - | AR_Q_MISC_FSP_DBA_GATED + qmisc |= AR_Q_MISC_FSP_DBA_GATED | AR_Q_MISC_BEACON_USE - | AR_Q_MISC_CBR_INCR_DIS1); + | AR_Q_MISC_CBR_INCR_DIS1; - OS_REG_WRITE(ah, AR_DMISC(q), - OS_REG_READ(ah, AR_DMISC(q)) - | (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << + dmisc |= (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << AR_D_MISC_ARB_LOCKOUT_CNTRL_S) | AR_D_MISC_BEACON_USE - | AR_D_MISC_POST_FR_BKOFF_DIS); + | AR_D_MISC_POST_FR_BKOFF_DIS; /* XXX cwmin and cwmax should be 0 for beacon queue */ if (AH_PRIVATE(ah)->ah_opmode != HAL_M_IBSS) { OS_REG_WRITE(ah, AR_DLCL_IFS(q), SM(0, AR_D_LCL_IFS_CWMIN) @@ -416,11 +406,9 @@ ar9300_reset_tx_queue(struct ath_hal *ah * not properly refreshing the Tx descriptor if * the TXE clear setting is used. */ - OS_REG_WRITE(ah, AR_QMISC(q), - OS_REG_READ(ah, AR_QMISC(q)) - | AR_Q_MISC_FSP_DBA_GATED + qmisc |= AR_Q_MISC_FSP_DBA_GATED | AR_Q_MISC_CBR_INCR_DIS1 - | AR_Q_MISC_CBR_INCR_DIS0); + | AR_Q_MISC_CBR_INCR_DIS0; if (qi->tqi_readyTime) { OS_REG_WRITE(ah, AR_QRDYTIMECFG(q), @@ -446,9 +434,8 @@ ar9300_reset_tx_queue(struct ath_hal *ah AR_Q_RDYTIMECFG_EN); } - OS_REG_WRITE(ah, AR_DMISC(q), OS_REG_READ(ah, AR_DMISC(q)) - | (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << - AR_D_MISC_ARB_LOCKOUT_CNTRL_S)); + dmisc |= (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << + AR_D_MISC_ARB_LOCKOUT_CNTRL_S); break; case HAL_TX_QUEUE_PSPOLL: /* @@ -459,12 +446,10 @@ ar9300_reset_tx_queue(struct ath_hal *ah * non-TIM elements and send PS-poll PS poll processing * will be done in software */ - OS_REG_WRITE(ah, AR_QMISC(q), - OS_REG_READ(ah, AR_QMISC(q)) | AR_Q_MISC_CBR_INCR_DIS1); + qmisc |= AR_Q_MISC_CBR_INCR_DIS1; break; case HAL_TX_QUEUE_UAPSD: - OS_REG_WRITE(ah, AR_DMISC(q), OS_REG_READ(ah, AR_DMISC(q)) - | AR_D_MISC_POST_FR_BKOFF_DIS); + dmisc |= AR_D_MISC_POST_FR_BKOFF_DIS; break; default: /* NB: silence compiler */ break; @@ -479,15 +464,15 @@ ar9300_reset_tx_queue(struct ath_hal *ah * queue_info->dcumode. */ if (qi->tqi_intFlags & HAL_TXQ_USE_LOCKOUT_BKOFF_DIS) { - OS_REG_WRITE(ah, AR_DMISC(q), - OS_REG_READ(ah, AR_DMISC(q)) | - SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL, + dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL, AR_D_MISC_ARB_LOCKOUT_CNTRL) | - AR_D_MISC_POST_FR_BKOFF_DIS); + AR_D_MISC_POST_FR_BKOFF_DIS; } #endif OS_REG_WRITE(ah, AR_Q_DESC_CRCCHK, AR_Q_DESC_CRCCHK_EN); + OS_REG_WRITE(ah, AR_QMISC(q), qmisc); + OS_REG_WRITE(ah, AR_DMISC(q), dmisc); /* * Always update the secondary interrupt mask registers - this