1*dd1de374Slin wang - Sun Microsystems - Beijing China /* 2*dd1de374Slin wang - Sun Microsystems - Beijing China * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 3*dd1de374Slin wang - Sun Microsystems - Beijing China * Use is subject to license terms. 4*dd1de374Slin wang - Sun Microsystems - Beijing China */ 5*dd1de374Slin wang - Sun Microsystems - Beijing China 6*dd1de374Slin wang - Sun Microsystems - Beijing China /* 7*dd1de374Slin wang - Sun Microsystems - Beijing China * Copyright (c) 2008 Atheros Communications Inc. 8*dd1de374Slin wang - Sun Microsystems - Beijing China * 9*dd1de374Slin wang - Sun Microsystems - Beijing China * Permission to use, copy, modify, and/or distribute this software for any 10*dd1de374Slin wang - Sun Microsystems - Beijing China * purpose with or without fee is hereby granted, provided that the above 11*dd1de374Slin wang - Sun Microsystems - Beijing China * copyright notice and this permission notice appear in all copies. 12*dd1de374Slin wang - Sun Microsystems - Beijing China * 13*dd1de374Slin wang - Sun Microsystems - Beijing China * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 14*dd1de374Slin wang - Sun Microsystems - Beijing China * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 15*dd1de374Slin wang - Sun Microsystems - Beijing China * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 16*dd1de374Slin wang - Sun Microsystems - Beijing China * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 17*dd1de374Slin wang - Sun Microsystems - Beijing China * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 18*dd1de374Slin wang - Sun Microsystems - Beijing China * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 19*dd1de374Slin wang - Sun Microsystems - Beijing China * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 20*dd1de374Slin wang - Sun Microsystems - Beijing China */ 21*dd1de374Slin wang - Sun Microsystems - Beijing China 22*dd1de374Slin wang - Sun Microsystems - Beijing China #include <sys/ddi.h> 23*dd1de374Slin wang - Sun Microsystems - Beijing China 24*dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_core.h" 25*dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_hw.h" 26*dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_reg.h" 27*dd1de374Slin wang - Sun Microsystems - Beijing China #include "arn_phy.h" 28*dd1de374Slin wang - Sun Microsystems - Beijing China 29*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 30*dd1de374Slin wang - Sun Microsystems - Beijing China static void 31*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set_txq_interrupts(struct ath_hal *ah, 32*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_tx_queue_info *qi) 33*dd1de374Slin wang - Sun Microsystems - Beijing China { 34*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 35*dd1de374Slin wang - Sun Microsystems - Beijing China 36*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, 37*dd1de374Slin wang - Sun Microsystems - Beijing China "%s: tx ok 0x%x err 0x%x desc 0x%x eol 0x%x urn 0x%x\n", 38*dd1de374Slin wang - Sun Microsystems - Beijing China __func__, ahp->ah_txOkInterruptMask, 39*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txErrInterruptMask, ahp->ah_txDescInterruptMask, 40*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txEolInterruptMask, ahp->ah_txUrnInterruptMask)); 41*dd1de374Slin wang - Sun Microsystems - Beijing China 42*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_IMR_S0, 43*dd1de374Slin wang - Sun Microsystems - Beijing China SM(ahp->ah_txOkInterruptMask, AR_IMR_S0_QCU_TXOK) | 44*dd1de374Slin wang - Sun Microsystems - Beijing China SM(ahp->ah_txDescInterruptMask, AR_IMR_S0_QCU_TXDESC)); 45*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_IMR_S1, 46*dd1de374Slin wang - Sun Microsystems - Beijing China SM(ahp->ah_txErrInterruptMask, AR_IMR_S1_QCU_TXERR)| 47*dd1de374Slin wang - Sun Microsystems - Beijing China SM(ahp->ah_txEolInterruptMask, AR_IMR_S1_QCU_TXEOL)); 48*dd1de374Slin wang - Sun Microsystems - Beijing China REG_RMW_FIELD(ah, AR_IMR_S2, 49*dd1de374Slin wang - Sun Microsystems - Beijing China AR_IMR_S2_QCU_TXURN, ahp->ah_txUrnInterruptMask); 50*dd1de374Slin wang - Sun Microsystems - Beijing China } 51*dd1de374Slin wang - Sun Microsystems - Beijing China 52*dd1de374Slin wang - Sun Microsystems - Beijing China void 53*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_dmaRegDump(struct ath_hal *ah) 54*dd1de374Slin wang - Sun Microsystems - Beijing China { 55*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t val[ATH9K_NUM_DMA_DEBUG_REGS]; 56*dd1de374Slin wang - Sun Microsystems - Beijing China int qcuOffset = 0, dcuOffset = 0; 57*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t *qcuBase = &val[0], *dcuBase = &val[4]; 58*dd1de374Slin wang - Sun Microsystems - Beijing China int i; 59*dd1de374Slin wang - Sun Microsystems - Beijing China 60*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_MACMISC, 61*dd1de374Slin wang - Sun Microsystems - Beijing China ((AR_MACMISC_DMA_OBS_LINE_8 << AR_MACMISC_DMA_OBS_S) | 62*dd1de374Slin wang - Sun Microsystems - Beijing China (AR_MACMISC_MISC_OBS_BUS_1 << 63*dd1de374Slin wang - Sun Microsystems - Beijing China AR_MACMISC_MISC_OBS_BUS_MSB_S))); 64*dd1de374Slin wang - Sun Microsystems - Beijing China 65*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, "Raw DMA Debug values:\n")); 66*dd1de374Slin wang - Sun Microsystems - Beijing China 67*dd1de374Slin wang - Sun Microsystems - Beijing China for (i = 0; i < ATH9K_NUM_DMA_DEBUG_REGS; i++) { 68*dd1de374Slin wang - Sun Microsystems - Beijing China if (i % 4 == 0) 69*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, "\n")); 70*dd1de374Slin wang - Sun Microsystems - Beijing China 71*dd1de374Slin wang - Sun Microsystems - Beijing China val[i] = REG_READ(ah, AR_DMADBG_0 + (i * sizeof (uint32_t))); 72*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, "%d: %08x ", i, val[i])); 73*dd1de374Slin wang - Sun Microsystems - Beijing China } 74*dd1de374Slin wang - Sun Microsystems - Beijing China 75*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, "\n\n")); 76*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 77*dd1de374Slin wang - Sun Microsystems - Beijing China "Num QCU: chain_st fsp_ok fsp_st DCU: chain_st\n")); 78*dd1de374Slin wang - Sun Microsystems - Beijing China 79*dd1de374Slin wang - Sun Microsystems - Beijing China for (i = 0; i < ATH9K_NUM_QUEUES; 80*dd1de374Slin wang - Sun Microsystems - Beijing China i++, qcuOffset += 4, dcuOffset += 5) { 81*dd1de374Slin wang - Sun Microsystems - Beijing China if (i == 8) { 82*dd1de374Slin wang - Sun Microsystems - Beijing China qcuOffset = 0; 83*dd1de374Slin wang - Sun Microsystems - Beijing China qcuBase++; 84*dd1de374Slin wang - Sun Microsystems - Beijing China } 85*dd1de374Slin wang - Sun Microsystems - Beijing China 86*dd1de374Slin wang - Sun Microsystems - Beijing China if (i == 6) { 87*dd1de374Slin wang - Sun Microsystems - Beijing China dcuOffset = 0; 88*dd1de374Slin wang - Sun Microsystems - Beijing China dcuBase++; 89*dd1de374Slin wang - Sun Microsystems - Beijing China } 90*dd1de374Slin wang - Sun Microsystems - Beijing China 91*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 92*dd1de374Slin wang - Sun Microsystems - Beijing China "%2d %2x %1x %2x %2x\n", 93*dd1de374Slin wang - Sun Microsystems - Beijing China i, (*qcuBase & (0x7 << qcuOffset)) >> qcuOffset, 94*dd1de374Slin wang - Sun Microsystems - Beijing China (*qcuBase & (0x8 << qcuOffset)) >> (qcuOffset + 3), 95*dd1de374Slin wang - Sun Microsystems - Beijing China val[2] & (0x7 << (i * 3)) >> (i * 3), 96*dd1de374Slin wang - Sun Microsystems - Beijing China (*dcuBase & (0x1f << dcuOffset)) >> dcuOffset)); 97*dd1de374Slin wang - Sun Microsystems - Beijing China } 98*dd1de374Slin wang - Sun Microsystems - Beijing China 99*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, "\n")); 100*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 101*dd1de374Slin wang - Sun Microsystems - Beijing China "qcu_stitch state: %2x qcu_fetch state: %2x\n", 102*dd1de374Slin wang - Sun Microsystems - Beijing China (val[3] & 0x003c0000) >> 18, (val[3] & 0x03c00000) >> 22)); 103*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 104*dd1de374Slin wang - Sun Microsystems - Beijing China "qcu_complete state: %2x dcu_complete state: %2x\n", 105*dd1de374Slin wang - Sun Microsystems - Beijing China (val[3] & 0x1c000000) >> 26, (val[6] & 0x3))); 106*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 107*dd1de374Slin wang - Sun Microsystems - Beijing China "dcu_arb state: %2x dcu_fp state: %2x\n", 108*dd1de374Slin wang - Sun Microsystems - Beijing China (val[5] & 0x06000000) >> 25, (val[5] & 0x38000000) >> 27)); 109*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 110*dd1de374Slin wang - Sun Microsystems - Beijing China "chan_idle_dur: %3d chan_idle_dur_valid: %1d\n", 111*dd1de374Slin wang - Sun Microsystems - Beijing China (val[6] & 0x000003fc) >> 2, (val[6] & 0x00000400) >> 10)); 112*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 113*dd1de374Slin wang - Sun Microsystems - Beijing China "txfifo_valid_0: %1d txfifo_valid_1: %1d\n", 114*dd1de374Slin wang - Sun Microsystems - Beijing China (val[6] & 0x00000800) >> 11, (val[6] & 0x00001000) >> 12)); 115*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 116*dd1de374Slin wang - Sun Microsystems - Beijing China "txfifo_dcu_num_0: %2d txfifo_dcu_num_1: %2d\n", 117*dd1de374Slin wang - Sun Microsystems - Beijing China (val[6] & 0x0001e000) >> 13, (val[6] & 0x001e0000) >> 17)); 118*dd1de374Slin wang - Sun Microsystems - Beijing China 119*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, "pcu observe 0x%x \n", 120*dd1de374Slin wang - Sun Microsystems - Beijing China REG_READ(ah, AR_OBS_BUS_1))); 121*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_REG_IO, 122*dd1de374Slin wang - Sun Microsystems - Beijing China "AR_CR 0x%x \n", REG_READ(ah, AR_CR))); 123*dd1de374Slin wang - Sun Microsystems - Beijing China } 124*dd1de374Slin wang - Sun Microsystems - Beijing China 125*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t 126*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_gettxbuf(struct ath_hal *ah, uint32_t q) 127*dd1de374Slin wang - Sun Microsystems - Beijing China { 128*dd1de374Slin wang - Sun Microsystems - Beijing China return (REG_READ(ah, AR_QTXDP(q))); 129*dd1de374Slin wang - Sun Microsystems - Beijing China } 130*dd1de374Slin wang - Sun Microsystems - Beijing China 131*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 132*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_puttxbuf(struct ath_hal *ah, uint32_t q, uint32_t txdp) 133*dd1de374Slin wang - Sun Microsystems - Beijing China { 134*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QTXDP(q), txdp); 135*dd1de374Slin wang - Sun Microsystems - Beijing China 136*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 137*dd1de374Slin wang - Sun Microsystems - Beijing China } 138*dd1de374Slin wang - Sun Microsystems - Beijing China 139*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 140*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_txstart(struct ath_hal *ah, uint32_t q) 141*dd1de374Slin wang - Sun Microsystems - Beijing China { 142*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_XMIT, "arn: ath9k_hw_txstart(): " 143*dd1de374Slin wang - Sun Microsystems - Beijing China "tramist queue is %u\n", q)); 144*dd1de374Slin wang - Sun Microsystems - Beijing China 145*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_Q_TXE, 1 << q); 146*dd1de374Slin wang - Sun Microsystems - Beijing China 147*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 148*dd1de374Slin wang - Sun Microsystems - Beijing China } 149*dd1de374Slin wang - Sun Microsystems - Beijing China 150*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t 151*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_numtxpending(struct ath_hal *ah, uint32_t q) 152*dd1de374Slin wang - Sun Microsystems - Beijing China { 153*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t npend; 154*dd1de374Slin wang - Sun Microsystems - Beijing China 155*dd1de374Slin wang - Sun Microsystems - Beijing China npend = REG_READ(ah, AR_QSTS(q)) & AR_Q_STS_PEND_FR_CNT; 156*dd1de374Slin wang - Sun Microsystems - Beijing China if (npend == 0) { 157*dd1de374Slin wang - Sun Microsystems - Beijing China 158*dd1de374Slin wang - Sun Microsystems - Beijing China if (REG_READ(ah, AR_Q_TXE) & (1 << q)) 159*dd1de374Slin wang - Sun Microsystems - Beijing China npend = 1; 160*dd1de374Slin wang - Sun Microsystems - Beijing China } 161*dd1de374Slin wang - Sun Microsystems - Beijing China 162*dd1de374Slin wang - Sun Microsystems - Beijing China return (npend); 163*dd1de374Slin wang - Sun Microsystems - Beijing China } 164*dd1de374Slin wang - Sun Microsystems - Beijing China 165*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 166*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_updatetxtriglevel(struct ath_hal *ah, boolean_t bIncTrigLevel) 167*dd1de374Slin wang - Sun Microsystems - Beijing China { 168*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 169*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t txcfg, curLevel, newLevel; 170*dd1de374Slin wang - Sun Microsystems - Beijing China enum ath9k_int omask; 171*dd1de374Slin wang - Sun Microsystems - Beijing China 172*dd1de374Slin wang - Sun Microsystems - Beijing China if (ah->ah_txTrigLevel >= MAX_TX_FIFO_THRESHOLD) 173*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 174*dd1de374Slin wang - Sun Microsystems - Beijing China 175*dd1de374Slin wang - Sun Microsystems - Beijing China omask = ath9k_hw_set_interrupts(ah, 176*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_maskReg & ~ATH9K_INT_GLOBAL); 177*dd1de374Slin wang - Sun Microsystems - Beijing China 178*dd1de374Slin wang - Sun Microsystems - Beijing China txcfg = REG_READ(ah, AR_TXCFG); 179*dd1de374Slin wang - Sun Microsystems - Beijing China curLevel = MS(txcfg, AR_FTRIG); 180*dd1de374Slin wang - Sun Microsystems - Beijing China newLevel = curLevel; 181*dd1de374Slin wang - Sun Microsystems - Beijing China if (bIncTrigLevel) { 182*dd1de374Slin wang - Sun Microsystems - Beijing China if (curLevel < MAX_TX_FIFO_THRESHOLD) 183*dd1de374Slin wang - Sun Microsystems - Beijing China newLevel++; 184*dd1de374Slin wang - Sun Microsystems - Beijing China } else if (curLevel > MIN_TX_FIFO_THRESHOLD) 185*dd1de374Slin wang - Sun Microsystems - Beijing China newLevel--; 186*dd1de374Slin wang - Sun Microsystems - Beijing China if (newLevel != curLevel) 187*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_TXCFG, 188*dd1de374Slin wang - Sun Microsystems - Beijing China (txcfg & ~AR_FTRIG) | SM(newLevel, AR_FTRIG)); 189*dd1de374Slin wang - Sun Microsystems - Beijing China 190*dd1de374Slin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_interrupts(ah, omask); 191*dd1de374Slin wang - Sun Microsystems - Beijing China 192*dd1de374Slin wang - Sun Microsystems - Beijing China ah->ah_txTrigLevel = (uint16_t)newLevel; /* ??? */ 193*dd1de374Slin wang - Sun Microsystems - Beijing China 194*dd1de374Slin wang - Sun Microsystems - Beijing China return (newLevel != curLevel); 195*dd1de374Slin wang - Sun Microsystems - Beijing China } 196*dd1de374Slin wang - Sun Microsystems - Beijing China 197*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 198*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_stoptxdma(struct ath_hal *ah, uint32_t q) 199*dd1de374Slin wang - Sun Microsystems - Beijing China { 200*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t tsfLow, j, wait; 201*dd1de374Slin wang - Sun Microsystems - Beijing China 202*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_Q_TXD, 1 << q); 203*dd1de374Slin wang - Sun Microsystems - Beijing China 204*dd1de374Slin wang - Sun Microsystems - Beijing China for (wait = 1000; wait != 0; wait--) { 205*dd1de374Slin wang - Sun Microsystems - Beijing China if (ath9k_hw_numtxpending(ah, q) == 0) 206*dd1de374Slin wang - Sun Microsystems - Beijing China break; 207*dd1de374Slin wang - Sun Microsystems - Beijing China drv_usecwait(100); 208*dd1de374Slin wang - Sun Microsystems - Beijing China } 209*dd1de374Slin wang - Sun Microsystems - Beijing China 210*dd1de374Slin wang - Sun Microsystems - Beijing China if (ath9k_hw_numtxpending(ah, q)) { 211*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, 212*dd1de374Slin wang - Sun Microsystems - Beijing China "%s: Num of pending TX Frames %d on Q %d\n", 213*dd1de374Slin wang - Sun Microsystems - Beijing China __func__, ath9k_hw_numtxpending(ah, q), q)); 214*dd1de374Slin wang - Sun Microsystems - Beijing China 215*dd1de374Slin wang - Sun Microsystems - Beijing China for (j = 0; j < 2; j++) { 216*dd1de374Slin wang - Sun Microsystems - Beijing China tsfLow = REG_READ(ah, AR_TSF_L32); 217*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QUIET2, SM(10, AR_QUIET2_QUIET_DUR)); 218*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QUIET_PERIOD, 100); 219*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_NEXT_QUIET_TIMER, tsfLow >> 10); 220*dd1de374Slin wang - Sun Microsystems - Beijing China REG_SET_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); 221*dd1de374Slin wang - Sun Microsystems - Beijing China 222*dd1de374Slin wang - Sun Microsystems - Beijing China if ((REG_READ(ah, AR_TSF_L32) >> 10) == (tsfLow >> 10)) 223*dd1de374Slin wang - Sun Microsystems - Beijing China break; 224*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, 225*dd1de374Slin wang - Sun Microsystems - Beijing China "%s: TSF have moved while trying to set " 226*dd1de374Slin wang - Sun Microsystems - Beijing China "quiet time TSF: 0x%08x\n", 227*dd1de374Slin wang - Sun Microsystems - Beijing China __func__, tsfLow)); 228*dd1de374Slin wang - Sun Microsystems - Beijing China } 229*dd1de374Slin wang - Sun Microsystems - Beijing China 230*dd1de374Slin wang - Sun Microsystems - Beijing China REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 231*dd1de374Slin wang - Sun Microsystems - Beijing China 232*dd1de374Slin wang - Sun Microsystems - Beijing China drv_usecwait(200); 233*dd1de374Slin wang - Sun Microsystems - Beijing China REG_CLR_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); 234*dd1de374Slin wang - Sun Microsystems - Beijing China 235*dd1de374Slin wang - Sun Microsystems - Beijing China wait = 1000; 236*dd1de374Slin wang - Sun Microsystems - Beijing China 237*dd1de374Slin wang - Sun Microsystems - Beijing China while (ath9k_hw_numtxpending(ah, q)) { 238*dd1de374Slin wang - Sun Microsystems - Beijing China if ((--wait) == 0) { 239*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_XMIT, 240*dd1de374Slin wang - Sun Microsystems - Beijing China "%s: Failed to stop Tx DMA in 100 " 241*dd1de374Slin wang - Sun Microsystems - Beijing China "msec after killing last frame\n", 242*dd1de374Slin wang - Sun Microsystems - Beijing China __func__)); 243*dd1de374Slin wang - Sun Microsystems - Beijing China break; 244*dd1de374Slin wang - Sun Microsystems - Beijing China } 245*dd1de374Slin wang - Sun Microsystems - Beijing China drv_usecwait(100); 246*dd1de374Slin wang - Sun Microsystems - Beijing China } 247*dd1de374Slin wang - Sun Microsystems - Beijing China 248*dd1de374Slin wang - Sun Microsystems - Beijing China REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 249*dd1de374Slin wang - Sun Microsystems - Beijing China } 250*dd1de374Slin wang - Sun Microsystems - Beijing China 251*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_Q_TXD, 0); 252*dd1de374Slin wang - Sun Microsystems - Beijing China 253*dd1de374Slin wang - Sun Microsystems - Beijing China return (wait != 0); 254*dd1de374Slin wang - Sun Microsystems - Beijing China } 255*dd1de374Slin wang - Sun Microsystems - Beijing China 256*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 257*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 258*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_filltxdesc(struct ath_hal *ah, struct ath_desc *ds, 259*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t segLen, boolean_t firstSeg, 260*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t lastSeg, const struct ath_desc *ds0) 261*dd1de374Slin wang - Sun Microsystems - Beijing China { 262*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 263*dd1de374Slin wang - Sun Microsystems - Beijing China 264*dd1de374Slin wang - Sun Microsystems - Beijing China if (firstSeg) { 265*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 |= segLen | (lastSeg ? 0 : AR_TxMore); 266*dd1de374Slin wang - Sun Microsystems - Beijing China } else if (lastSeg) { 267*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl0 = 0; 268*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 = segLen; 269*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl2 = AR5416DESC_CONST(ds0)->ds_ctl2; 270*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl3 = AR5416DESC_CONST(ds0)->ds_ctl3; 271*dd1de374Slin wang - Sun Microsystems - Beijing China } else { 272*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl0 = 0; 273*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 = segLen | AR_TxMore; 274*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl2 = 0; 275*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl3 = 0; 276*dd1de374Slin wang - Sun Microsystems - Beijing China } 277*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus0 = ads->ds_txstatus1 = 0; 278*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus2 = ads->ds_txstatus3 = 0; 279*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus4 = ads->ds_txstatus5 = 0; 280*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus6 = ads->ds_txstatus7 = 0; 281*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus8 = ads->ds_txstatus9 = 0; 282*dd1de374Slin wang - Sun Microsystems - Beijing China 283*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 284*dd1de374Slin wang - Sun Microsystems - Beijing China } 285*dd1de374Slin wang - Sun Microsystems - Beijing China 286*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 287*dd1de374Slin wang - Sun Microsystems - Beijing China void 288*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_cleartxdesc(struct ath_hal *ah, struct ath_desc *ds) 289*dd1de374Slin wang - Sun Microsystems - Beijing China { 290*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 291*dd1de374Slin wang - Sun Microsystems - Beijing China 292*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus0 = ads->ds_txstatus1 = 0; 293*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus2 = ads->ds_txstatus3 = 0; 294*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus4 = ads->ds_txstatus5 = 0; 295*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus6 = ads->ds_txstatus7 = 0; 296*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_txstatus8 = ads->ds_txstatus9 = 0; 297*dd1de374Slin wang - Sun Microsystems - Beijing China } 298*dd1de374Slin wang - Sun Microsystems - Beijing China 299*dd1de374Slin wang - Sun Microsystems - Beijing China int 300*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_txprocdesc(struct ath_hal *ah, struct ath_desc *ds) 301*dd1de374Slin wang - Sun Microsystems - Beijing China { 302*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 303*dd1de374Slin wang - Sun Microsystems - Beijing China 304*dd1de374Slin wang - Sun Microsystems - Beijing China if ((ads->ds_txstatus9 & AR_TxDone) == 0) 305*dd1de374Slin wang - Sun Microsystems - Beijing China return (EINPROGRESS); 306*dd1de374Slin wang - Sun Microsystems - Beijing China 307*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_seqnum = MS(ads->ds_txstatus9, AR_SeqNum); 308*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_tstamp = ads->AR_SendTimestamp; 309*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_status = 0; 310*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_flags = 0; 311*dd1de374Slin wang - Sun Microsystems - Beijing China 312*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus1 & AR_ExcessiveRetries) { 313*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: ATH9K_TXERR_XRETRY\n")); 314*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_status |= ATH9K_TXERR_XRETRY; 315*dd1de374Slin wang - Sun Microsystems - Beijing China } 316*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus1 & AR_Filtered) { 317*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: AR_Filtered\n")); 318*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_status |= ATH9K_TXERR_FILT; 319*dd1de374Slin wang - Sun Microsystems - Beijing China } 320*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus1 & AR_FIFOUnderrun) { 321*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: ATH9K_TXERR_FIFO\n")); 322*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_status |= ATH9K_TXERR_FIFO; 323*dd1de374Slin wang - Sun Microsystems - Beijing China (void) ath9k_hw_updatetxtriglevel(ah, B_TRUE); 324*dd1de374Slin wang - Sun Microsystems - Beijing China } 325*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus9 & AR_TxOpExceeded) { 326*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: ATH9K_TXERR_XTXOP\n")); 327*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_status |= ATH9K_TXERR_XTXOP; 328*dd1de374Slin wang - Sun Microsystems - Beijing China } 329*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus1 & AR_TxTimerExpired) { 330*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, 331*dd1de374Slin wang - Sun Microsystems - Beijing China "arn: ATH9K_TXERR_TIMER_EXPIRED\n")); 332*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_status |= ATH9K_TXERR_TIMER_EXPIRED; 333*dd1de374Slin wang - Sun Microsystems - Beijing China } 334*dd1de374Slin wang - Sun Microsystems - Beijing China 335*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus1 & AR_DescCfgErr) { 336*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_INTERRUPT, "arn: ATH9K_TX_DESC_CFG_ERR\n")); 337*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_flags |= ATH9K_TX_DESC_CFG_ERR; 338*dd1de374Slin wang - Sun Microsystems - Beijing China } 339*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus1 & AR_TxDataUnderrun) { 340*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_flags |= ATH9K_TX_DATA_UNDERRUN; 341*dd1de374Slin wang - Sun Microsystems - Beijing China (void) ath9k_hw_updatetxtriglevel(ah, B_TRUE); 342*dd1de374Slin wang - Sun Microsystems - Beijing China } 343*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus1 & AR_TxDelimUnderrun) { 344*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_flags |= ATH9K_TX_DELIM_UNDERRUN; 345*dd1de374Slin wang - Sun Microsystems - Beijing China (void) ath9k_hw_updatetxtriglevel(ah, B_TRUE); 346*dd1de374Slin wang - Sun Microsystems - Beijing China } 347*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads->ds_txstatus0 & AR_TxBaStatus) { 348*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_flags |= ATH9K_TX_BA; 349*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ba_low = ads->AR_BaBitmapLow; 350*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ba_high = ads->AR_BaBitmapHigh; 351*dd1de374Slin wang - Sun Microsystems - Beijing China } 352*dd1de374Slin wang - Sun Microsystems - Beijing China 353*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_rateindex = MS(ads->ds_txstatus9, AR_FinalTxIdx); 354*dd1de374Slin wang - Sun Microsystems - Beijing China switch (ds->ds_txstat.ts_rateindex) { 355*dd1de374Slin wang - Sun Microsystems - Beijing China case 0: 356*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate0); 357*dd1de374Slin wang - Sun Microsystems - Beijing China break; 358*dd1de374Slin wang - Sun Microsystems - Beijing China case 1: 359*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate1); 360*dd1de374Slin wang - Sun Microsystems - Beijing China break; 361*dd1de374Slin wang - Sun Microsystems - Beijing China case 2: 362*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate2); 363*dd1de374Slin wang - Sun Microsystems - Beijing China break; 364*dd1de374Slin wang - Sun Microsystems - Beijing China case 3: 365*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate3); 366*dd1de374Slin wang - Sun Microsystems - Beijing China break; 367*dd1de374Slin wang - Sun Microsystems - Beijing China } 368*dd1de374Slin wang - Sun Microsystems - Beijing China 369*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_rssi = MS(ads->ds_txstatus5, AR_TxRSSICombined); 370*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_rssi_ctl0 = MS(ads->ds_txstatus0, AR_TxRSSIAnt00); 371*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_rssi_ctl1 = MS(ads->ds_txstatus0, AR_TxRSSIAnt01); 372*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_rssi_ctl2 = MS(ads->ds_txstatus0, AR_TxRSSIAnt02); 373*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_rssi_ext0 = MS(ads->ds_txstatus5, AR_TxRSSIAnt10); 374*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_rssi_ext1 = MS(ads->ds_txstatus5, AR_TxRSSIAnt11); 375*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_rssi_ext2 = MS(ads->ds_txstatus5, AR_TxRSSIAnt12); 376*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.evm0 = ads->AR_TxEVM0; 377*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.evm1 = ads->AR_TxEVM1; 378*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.evm2 = ads->AR_TxEVM2; 379*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_shortretry = MS(ads->ds_txstatus1, AR_RTSFailCnt); 380*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_longretry = MS(ads->ds_txstatus1, AR_DataFailCnt); 381*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_virtcol = MS(ads->ds_txstatus1, AR_VirtRetryCnt); 382*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_txstat.ts_antenna = 1; 383*dd1de374Slin wang - Sun Microsystems - Beijing China 384*dd1de374Slin wang - Sun Microsystems - Beijing China return (0); 385*dd1de374Slin wang - Sun Microsystems - Beijing China } 386*dd1de374Slin wang - Sun Microsystems - Beijing China 387*dd1de374Slin wang - Sun Microsystems - Beijing China void 388*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set11n_txdesc(struct ath_hal *ah, struct ath_desc *ds, 389*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t pktLen, enum ath9k_pkt_type type, uint32_t txPower, 390*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t keyIx, enum ath9k_key_type keyType, uint32_t flags) 391*dd1de374Slin wang - Sun Microsystems - Beijing China { 392*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 393*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 394*dd1de374Slin wang - Sun Microsystems - Beijing China 395*dd1de374Slin wang - Sun Microsystems - Beijing China txPower += ahp->ah_txPowerIndexOffset; 396*dd1de374Slin wang - Sun Microsystems - Beijing China if (txPower > 63) 397*dd1de374Slin wang - Sun Microsystems - Beijing China txPower = 63; 398*dd1de374Slin wang - Sun Microsystems - Beijing China 399*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl0 = (pktLen & AR_FrameLen) | 400*dd1de374Slin wang - Sun Microsystems - Beijing China (flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) | 401*dd1de374Slin wang - Sun Microsystems - Beijing China SM(txPower, AR_XmitPower) | 402*dd1de374Slin wang - Sun Microsystems - Beijing China (flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) | 403*dd1de374Slin wang - Sun Microsystems - Beijing China (flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0) | 404*dd1de374Slin wang - Sun Microsystems - Beijing China (flags & ATH9K_TXDESC_INTREQ ? AR_TxIntrReq : 0) | 405*dd1de374Slin wang - Sun Microsystems - Beijing China (keyIx != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0); 406*dd1de374Slin wang - Sun Microsystems - Beijing China 407*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 = 408*dd1de374Slin wang - Sun Microsystems - Beijing China (keyIx != ATH9K_TXKEYIX_INVALID ? SM(keyIx, AR_DestIdx) : 0) | 409*dd1de374Slin wang - Sun Microsystems - Beijing China SM(type, AR_FrameType) | 410*dd1de374Slin wang - Sun Microsystems - Beijing China (flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0) | 411*dd1de374Slin wang - Sun Microsystems - Beijing China (flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0) | 412*dd1de374Slin wang - Sun Microsystems - Beijing China (flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0); 413*dd1de374Slin wang - Sun Microsystems - Beijing China 414*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl6 = SM(keyType, AR_EncrType); 415*dd1de374Slin wang - Sun Microsystems - Beijing China 416*dd1de374Slin wang - Sun Microsystems - Beijing China if (AR_SREV_9285(ah)) { 417*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl8 = 0; 418*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl9 = 0; 419*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl10 = 0; 420*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl11 = 0; 421*dd1de374Slin wang - Sun Microsystems - Beijing China } 422*dd1de374Slin wang - Sun Microsystems - Beijing China 423*dd1de374Slin wang - Sun Microsystems - Beijing China } 424*dd1de374Slin wang - Sun Microsystems - Beijing China 425*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 426*dd1de374Slin wang - Sun Microsystems - Beijing China void 427*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set11n_ratescenario(struct ath_hal *ah, struct ath_desc *ds, 428*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_desc *lastds, 429*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t durUpdateEn, uint32_t rtsctsRate, 430*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t rtsctsDuration, 431*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_11n_rate_series series[], 432*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t nseries, uint32_t flags) 433*dd1de374Slin wang - Sun Microsystems - Beijing China { 434*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 435*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *last_ads = AR5416DESC(lastds); 436*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t ds_ctl0; 437*dd1de374Slin wang - Sun Microsystems - Beijing China 438*dd1de374Slin wang - Sun Microsystems - Beijing China (void) nseries; 439*dd1de374Slin wang - Sun Microsystems - Beijing China (void) rtsctsDuration; 440*dd1de374Slin wang - Sun Microsystems - Beijing China 441*dd1de374Slin wang - Sun Microsystems - Beijing China if (flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)) { 442*dd1de374Slin wang - Sun Microsystems - Beijing China ds_ctl0 = ads->ds_ctl0; 443*dd1de374Slin wang - Sun Microsystems - Beijing China 444*dd1de374Slin wang - Sun Microsystems - Beijing China if (flags & ATH9K_TXDESC_RTSENA) { 445*dd1de374Slin wang - Sun Microsystems - Beijing China ds_ctl0 &= ~AR_CTSEnable; 446*dd1de374Slin wang - Sun Microsystems - Beijing China ds_ctl0 |= AR_RTSEnable; 447*dd1de374Slin wang - Sun Microsystems - Beijing China } else { 448*dd1de374Slin wang - Sun Microsystems - Beijing China ds_ctl0 &= ~AR_RTSEnable; 449*dd1de374Slin wang - Sun Microsystems - Beijing China ds_ctl0 |= AR_CTSEnable; 450*dd1de374Slin wang - Sun Microsystems - Beijing China } 451*dd1de374Slin wang - Sun Microsystems - Beijing China 452*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl0 = ds_ctl0; 453*dd1de374Slin wang - Sun Microsystems - Beijing China } else { 454*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl0 = 455*dd1de374Slin wang - Sun Microsystems - Beijing China (ads->ds_ctl0 & ~(AR_RTSEnable | AR_CTSEnable)); 456*dd1de374Slin wang - Sun Microsystems - Beijing China } 457*dd1de374Slin wang - Sun Microsystems - Beijing China 458*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl2 = set11nTries(series, 0) | 459*dd1de374Slin wang - Sun Microsystems - Beijing China set11nTries(series, 1) | 460*dd1de374Slin wang - Sun Microsystems - Beijing China set11nTries(series, 2) | 461*dd1de374Slin wang - Sun Microsystems - Beijing China set11nTries(series, 3) | 462*dd1de374Slin wang - Sun Microsystems - Beijing China (durUpdateEn ? AR_DurUpdateEna : 0) | 463*dd1de374Slin wang - Sun Microsystems - Beijing China SM(0, AR_BurstDur); 464*dd1de374Slin wang - Sun Microsystems - Beijing China 465*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl3 = set11nRate(series, 0) | 466*dd1de374Slin wang - Sun Microsystems - Beijing China set11nRate(series, 1) | 467*dd1de374Slin wang - Sun Microsystems - Beijing China set11nRate(series, 2) | 468*dd1de374Slin wang - Sun Microsystems - Beijing China set11nRate(series, 3); 469*dd1de374Slin wang - Sun Microsystems - Beijing China 470*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl4 = set11nPktDurRTSCTS(series, 0) | 471*dd1de374Slin wang - Sun Microsystems - Beijing China set11nPktDurRTSCTS(series, 1); 472*dd1de374Slin wang - Sun Microsystems - Beijing China 473*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl5 = set11nPktDurRTSCTS(series, 2) | 474*dd1de374Slin wang - Sun Microsystems - Beijing China set11nPktDurRTSCTS(series, 3); 475*dd1de374Slin wang - Sun Microsystems - Beijing China 476*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl7 = set11nRateFlags(series, 0) | 477*dd1de374Slin wang - Sun Microsystems - Beijing China set11nRateFlags(series, 1) | 478*dd1de374Slin wang - Sun Microsystems - Beijing China set11nRateFlags(series, 2) | 479*dd1de374Slin wang - Sun Microsystems - Beijing China set11nRateFlags(series, 3) | 480*dd1de374Slin wang - Sun Microsystems - Beijing China SM(rtsctsRate, AR_RTSCTSRate); 481*dd1de374Slin wang - Sun Microsystems - Beijing China last_ads->ds_ctl2 = ads->ds_ctl2; 482*dd1de374Slin wang - Sun Microsystems - Beijing China last_ads->ds_ctl3 = ads->ds_ctl3; 483*dd1de374Slin wang - Sun Microsystems - Beijing China } 484*dd1de374Slin wang - Sun Microsystems - Beijing China 485*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 486*dd1de374Slin wang - Sun Microsystems - Beijing China void 487*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set11n_aggr_first(struct ath_hal *ah, struct ath_desc *ds, 488*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t aggrLen) 489*dd1de374Slin wang - Sun Microsystems - Beijing China { 490*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 491*dd1de374Slin wang - Sun Microsystems - Beijing China 492*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 |= (AR_IsAggr | AR_MoreAggr); 493*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl6 &= ~AR_AggrLen; 494*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl6 |= SM(aggrLen, AR_AggrLen); 495*dd1de374Slin wang - Sun Microsystems - Beijing China } 496*dd1de374Slin wang - Sun Microsystems - Beijing China 497*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 498*dd1de374Slin wang - Sun Microsystems - Beijing China void 499*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set11n_aggr_middle(struct ath_hal *ah, struct ath_desc *ds, 500*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t numDelims) 501*dd1de374Slin wang - Sun Microsystems - Beijing China { 502*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 503*dd1de374Slin wang - Sun Microsystems - Beijing China unsigned int ctl6; 504*dd1de374Slin wang - Sun Microsystems - Beijing China 505*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 |= (AR_IsAggr | AR_MoreAggr); 506*dd1de374Slin wang - Sun Microsystems - Beijing China 507*dd1de374Slin wang - Sun Microsystems - Beijing China ctl6 = ads->ds_ctl6; 508*dd1de374Slin wang - Sun Microsystems - Beijing China ctl6 &= ~AR_PadDelim; 509*dd1de374Slin wang - Sun Microsystems - Beijing China ctl6 |= SM(numDelims, AR_PadDelim); 510*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl6 = ctl6; 511*dd1de374Slin wang - Sun Microsystems - Beijing China } 512*dd1de374Slin wang - Sun Microsystems - Beijing China 513*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 514*dd1de374Slin wang - Sun Microsystems - Beijing China void 515*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set11n_aggr_last(struct ath_hal *ah, struct ath_desc *ds) 516*dd1de374Slin wang - Sun Microsystems - Beijing China { 517*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 518*dd1de374Slin wang - Sun Microsystems - Beijing China 519*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 |= AR_IsAggr; 520*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 &= ~AR_MoreAggr; 521*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl6 &= ~AR_PadDelim; 522*dd1de374Slin wang - Sun Microsystems - Beijing China } 523*dd1de374Slin wang - Sun Microsystems - Beijing China 524*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 525*dd1de374Slin wang - Sun Microsystems - Beijing China void 526*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_clr11n_aggr(struct ath_hal *ah, struct ath_desc *ds) 527*dd1de374Slin wang - Sun Microsystems - Beijing China { 528*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 529*dd1de374Slin wang - Sun Microsystems - Beijing China 530*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 &= (~AR_IsAggr & ~AR_MoreAggr); 531*dd1de374Slin wang - Sun Microsystems - Beijing China } 532*dd1de374Slin wang - Sun Microsystems - Beijing China 533*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 534*dd1de374Slin wang - Sun Microsystems - Beijing China void 535*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set11n_burstduration(struct ath_hal *ah, struct ath_desc *ds, 536*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t burstDuration) 537*dd1de374Slin wang - Sun Microsystems - Beijing China { 538*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 539*dd1de374Slin wang - Sun Microsystems - Beijing China 540*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl2 &= ~AR_BurstDur; 541*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl2 |= SM(burstDuration, AR_BurstDur); 542*dd1de374Slin wang - Sun Microsystems - Beijing China } 543*dd1de374Slin wang - Sun Microsystems - Beijing China 544*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 545*dd1de374Slin wang - Sun Microsystems - Beijing China void 546*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set11n_virtualmorefrag(struct ath_hal *ah, struct ath_desc *ds, 547*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t vmf) 548*dd1de374Slin wang - Sun Microsystems - Beijing China { 549*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 550*dd1de374Slin wang - Sun Microsystems - Beijing China 551*dd1de374Slin wang - Sun Microsystems - Beijing China if (vmf) 552*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl0 |= AR_VirtMoreFrag; 553*dd1de374Slin wang - Sun Microsystems - Beijing China else 554*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl0 &= ~AR_VirtMoreFrag; 555*dd1de374Slin wang - Sun Microsystems - Beijing China } 556*dd1de374Slin wang - Sun Microsystems - Beijing China 557*dd1de374Slin wang - Sun Microsystems - Beijing China void 558*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_gettxintrtxqs(struct ath_hal *ah, uint32_t *txqs) 559*dd1de374Slin wang - Sun Microsystems - Beijing China { 560*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 561*dd1de374Slin wang - Sun Microsystems - Beijing China 562*dd1de374Slin wang - Sun Microsystems - Beijing China *txqs &= ahp->ah_intrTxqs; 563*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_intrTxqs &= ~(*txqs); 564*dd1de374Slin wang - Sun Microsystems - Beijing China } 565*dd1de374Slin wang - Sun Microsystems - Beijing China 566*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 567*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set_txq_props(struct ath_hal *ah, int q, 568*dd1de374Slin wang - Sun Microsystems - Beijing China const struct ath9k_tx_queue_info *qinfo) 569*dd1de374Slin wang - Sun Microsystems - Beijing China { 570*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t cw; 571*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 572*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_hw_capabilities *pCap = &ah->ah_caps; 573*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_tx_queue_info *qi; 574*dd1de374Slin wang - Sun Microsystems - Beijing China 575*dd1de374Slin wang - Sun Microsystems - Beijing China if (q >= pCap->total_queues) { 576*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "%s: invalid queue num %u\n", 577*dd1de374Slin wang - Sun Microsystems - Beijing China __func__, q)); 578*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 579*dd1de374Slin wang - Sun Microsystems - Beijing China } 580*dd1de374Slin wang - Sun Microsystems - Beijing China 581*dd1de374Slin wang - Sun Microsystems - Beijing China qi = &ahp->ah_txq[q]; 582*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) { 583*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "%s: inactive queue\n", 584*dd1de374Slin wang - Sun Microsystems - Beijing China __func__)); 585*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 586*dd1de374Slin wang - Sun Microsystems - Beijing China } 587*dd1de374Slin wang - Sun Microsystems - Beijing China 588*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "%s: queue %p\n", __func__, qi)); 589*dd1de374Slin wang - Sun Microsystems - Beijing China 590*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_ver = qinfo->tqi_ver; 591*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_subtype = qinfo->tqi_subtype; 592*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_qflags = qinfo->tqi_qflags; 593*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_priority = qinfo->tqi_priority; 594*dd1de374Slin wang - Sun Microsystems - Beijing China if (qinfo->tqi_aifs != ATH9K_TXQ_USEDEFAULT) 595*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_aifs = min(qinfo->tqi_aifs, 255U); 596*dd1de374Slin wang - Sun Microsystems - Beijing China else 597*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_aifs = INIT_AIFS; 598*dd1de374Slin wang - Sun Microsystems - Beijing China if (qinfo->tqi_cwmin != ATH9K_TXQ_USEDEFAULT) { 599*dd1de374Slin wang - Sun Microsystems - Beijing China cw = min(qinfo->tqi_cwmin, 1024U); 600*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cwmin = 1; 601*dd1de374Slin wang - Sun Microsystems - Beijing China while (qi->tqi_cwmin < cw) 602*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cwmin = (qi->tqi_cwmin << 1) | 1; 603*dd1de374Slin wang - Sun Microsystems - Beijing China } else 604*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cwmin = qinfo->tqi_cwmin; 605*dd1de374Slin wang - Sun Microsystems - Beijing China if (qinfo->tqi_cwmax != ATH9K_TXQ_USEDEFAULT) { 606*dd1de374Slin wang - Sun Microsystems - Beijing China cw = min(qinfo->tqi_cwmax, 1024U); 607*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cwmax = 1; 608*dd1de374Slin wang - Sun Microsystems - Beijing China while (qi->tqi_cwmax < cw) 609*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cwmax = (qi->tqi_cwmax << 1) | 1; 610*dd1de374Slin wang - Sun Microsystems - Beijing China } else 611*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cwmax = INIT_CWMAX; 612*dd1de374Slin wang - Sun Microsystems - Beijing China 613*dd1de374Slin wang - Sun Microsystems - Beijing China if (qinfo->tqi_shretry != 0) 614*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_shretry = min((uint32_t)qinfo->tqi_shretry, 15U); 615*dd1de374Slin wang - Sun Microsystems - Beijing China else 616*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_shretry = INIT_SH_RETRY; 617*dd1de374Slin wang - Sun Microsystems - Beijing China if (qinfo->tqi_lgretry != 0) 618*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_lgretry = min((uint32_t)qinfo->tqi_lgretry, 15U); 619*dd1de374Slin wang - Sun Microsystems - Beijing China else 620*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_lgretry = INIT_LG_RETRY; 621*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cbrPeriod = qinfo->tqi_cbrPeriod; 622*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cbrOverflowLimit = qinfo->tqi_cbrOverflowLimit; 623*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_burstTime = qinfo->tqi_burstTime; 624*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_readyTime = qinfo->tqi_readyTime; 625*dd1de374Slin wang - Sun Microsystems - Beijing China 626*dd1de374Slin wang - Sun Microsystems - Beijing China switch (qinfo->tqi_subtype) { 627*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_WME_UPSD: 628*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_type == ATH9K_TX_QUEUE_DATA) 629*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_intFlags = ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS; 630*dd1de374Slin wang - Sun Microsystems - Beijing China break; 631*dd1de374Slin wang - Sun Microsystems - Beijing China default: 632*dd1de374Slin wang - Sun Microsystems - Beijing China break; 633*dd1de374Slin wang - Sun Microsystems - Beijing China } 634*dd1de374Slin wang - Sun Microsystems - Beijing China 635*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 636*dd1de374Slin wang - Sun Microsystems - Beijing China } 637*dd1de374Slin wang - Sun Microsystems - Beijing China 638*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 639*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_get_txq_props(struct ath_hal *ah, int q, 640*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_tx_queue_info *qinfo) 641*dd1de374Slin wang - Sun Microsystems - Beijing China { 642*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 643*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_hw_capabilities *pCap = &ah->ah_caps; 644*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_tx_queue_info *qi; 645*dd1de374Slin wang - Sun Microsystems - Beijing China 646*dd1de374Slin wang - Sun Microsystems - Beijing China if (q >= pCap->total_queues) { 647*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "arn: ath9k_hw_get_txq_props(): " 648*dd1de374Slin wang - Sun Microsystems - Beijing China "invalid queue num %u\n", q)); 649*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 650*dd1de374Slin wang - Sun Microsystems - Beijing China } 651*dd1de374Slin wang - Sun Microsystems - Beijing China 652*dd1de374Slin wang - Sun Microsystems - Beijing China qi = &ahp->ah_txq[q]; 653*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) { 654*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "arn: ath9k_hw_get_txq_props(): " 655*dd1de374Slin wang - Sun Microsystems - Beijing China "inactive queue\n")); 656*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 657*dd1de374Slin wang - Sun Microsystems - Beijing China } 658*dd1de374Slin wang - Sun Microsystems - Beijing China 659*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_qflags = qi->tqi_qflags; 660*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_ver = qi->tqi_ver; 661*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_subtype = qi->tqi_subtype; 662*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_qflags = qi->tqi_qflags; 663*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_priority = qi->tqi_priority; 664*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_aifs = qi->tqi_aifs; 665*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_cwmin = qi->tqi_cwmin; 666*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_cwmax = qi->tqi_cwmax; 667*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_shretry = qi->tqi_shretry; 668*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_lgretry = qi->tqi_lgretry; 669*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_cbrPeriod = qi->tqi_cbrPeriod; 670*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_cbrOverflowLimit = qi->tqi_cbrOverflowLimit; 671*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_burstTime = qi->tqi_burstTime; 672*dd1de374Slin wang - Sun Microsystems - Beijing China qinfo->tqi_readyTime = qi->tqi_readyTime; 673*dd1de374Slin wang - Sun Microsystems - Beijing China 674*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 675*dd1de374Slin wang - Sun Microsystems - Beijing China } 676*dd1de374Slin wang - Sun Microsystems - Beijing China 677*dd1de374Slin wang - Sun Microsystems - Beijing China int 678*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_setuptxqueue(struct ath_hal *ah, enum ath9k_tx_queue type, 679*dd1de374Slin wang - Sun Microsystems - Beijing China const struct ath9k_tx_queue_info *qinfo) 680*dd1de374Slin wang - Sun Microsystems - Beijing China { 681*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 682*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_tx_queue_info *qi; 683*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_hw_capabilities *pCap = &ah->ah_caps; 684*dd1de374Slin wang - Sun Microsystems - Beijing China int q; 685*dd1de374Slin wang - Sun Microsystems - Beijing China 686*dd1de374Slin wang - Sun Microsystems - Beijing China switch (type) { 687*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_BEACON: 688*dd1de374Slin wang - Sun Microsystems - Beijing China q = pCap->total_queues - 1; 689*dd1de374Slin wang - Sun Microsystems - Beijing China break; 690*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_CAB: 691*dd1de374Slin wang - Sun Microsystems - Beijing China q = pCap->total_queues - 2; 692*dd1de374Slin wang - Sun Microsystems - Beijing China break; 693*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_PSPOLL: 694*dd1de374Slin wang - Sun Microsystems - Beijing China q = 1; 695*dd1de374Slin wang - Sun Microsystems - Beijing China break; 696*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_UAPSD: 697*dd1de374Slin wang - Sun Microsystems - Beijing China q = pCap->total_queues - 3; 698*dd1de374Slin wang - Sun Microsystems - Beijing China break; 699*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_DATA: 700*dd1de374Slin wang - Sun Microsystems - Beijing China for (q = 0; q < pCap->total_queues; q++) 701*dd1de374Slin wang - Sun Microsystems - Beijing China if (ahp->ah_txq[q].tqi_type == 702*dd1de374Slin wang - Sun Microsystems - Beijing China ATH9K_TX_QUEUE_INACTIVE) 703*dd1de374Slin wang - Sun Microsystems - Beijing China break; 704*dd1de374Slin wang - Sun Microsystems - Beijing China if (q == pCap->total_queues) { 705*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, 706*dd1de374Slin wang - Sun Microsystems - Beijing China "arn: ath9k_hw_setuptxqueue(): " 707*dd1de374Slin wang - Sun Microsystems - Beijing China "no available tx queue\n")); 708*dd1de374Slin wang - Sun Microsystems - Beijing China return (-1); 709*dd1de374Slin wang - Sun Microsystems - Beijing China } 710*dd1de374Slin wang - Sun Microsystems - Beijing China break; 711*dd1de374Slin wang - Sun Microsystems - Beijing China default: 712*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, 713*dd1de374Slin wang - Sun Microsystems - Beijing China "arn: ath9k_hw_setuptxqueue(): " 714*dd1de374Slin wang - Sun Microsystems - Beijing China "bad tx queue type %u\n", type)); 715*dd1de374Slin wang - Sun Microsystems - Beijing China 716*dd1de374Slin wang - Sun Microsystems - Beijing China return (-1); 717*dd1de374Slin wang - Sun Microsystems - Beijing China } 718*dd1de374Slin wang - Sun Microsystems - Beijing China 719*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "arn: ath9k_hw_setuptxqueue(): " 720*dd1de374Slin wang - Sun Microsystems - Beijing China "queue %u\n", q)); 721*dd1de374Slin wang - Sun Microsystems - Beijing China 722*dd1de374Slin wang - Sun Microsystems - Beijing China qi = &ahp->ah_txq[q]; 723*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_type != ATH9K_TX_QUEUE_INACTIVE) { 724*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "arn: ath9k_hw_setuptxqueue(): " 725*dd1de374Slin wang - Sun Microsystems - Beijing China "tx queue %u already active\n", q)); 726*dd1de374Slin wang - Sun Microsystems - Beijing China 727*dd1de374Slin wang - Sun Microsystems - Beijing China return (-1); 728*dd1de374Slin wang - Sun Microsystems - Beijing China } 729*dd1de374Slin wang - Sun Microsystems - Beijing China (void) memset(qi, 0, sizeof (struct ath9k_tx_queue_info)); 730*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_type = type; 731*dd1de374Slin wang - Sun Microsystems - Beijing China if (qinfo == NULL) { 732*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_qflags = TXQ_FLAG_TXOKINT_ENABLE | 733*dd1de374Slin wang - Sun Microsystems - Beijing China TXQ_FLAG_TXERRINT_ENABLE | 734*dd1de374Slin wang - Sun Microsystems - Beijing China TXQ_FLAG_TXDESCINT_ENABLE | 735*dd1de374Slin wang - Sun Microsystems - Beijing China TXQ_FLAG_TXURNINT_ENABLE; 736*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_aifs = INIT_AIFS; 737*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cwmin = ATH9K_TXQ_USEDEFAULT; 738*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_cwmax = INIT_CWMAX; 739*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_shretry = INIT_SH_RETRY; 740*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_lgretry = INIT_LG_RETRY; 741*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_physCompBuf = 0; 742*dd1de374Slin wang - Sun Microsystems - Beijing China } else { 743*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_physCompBuf = qinfo->tqi_physCompBuf; 744*dd1de374Slin wang - Sun Microsystems - Beijing China (void) ath9k_hw_set_txq_props(ah, q, qinfo); 745*dd1de374Slin wang - Sun Microsystems - Beijing China } 746*dd1de374Slin wang - Sun Microsystems - Beijing China 747*dd1de374Slin wang - Sun Microsystems - Beijing China return (q); 748*dd1de374Slin wang - Sun Microsystems - Beijing China } 749*dd1de374Slin wang - Sun Microsystems - Beijing China 750*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 751*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_releasetxqueue(struct ath_hal *ah, uint32_t q) 752*dd1de374Slin wang - Sun Microsystems - Beijing China { 753*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 754*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_hw_capabilities *pCap = &ah->ah_caps; 755*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_tx_queue_info *qi; 756*dd1de374Slin wang - Sun Microsystems - Beijing China 757*dd1de374Slin wang - Sun Microsystems - Beijing China if (q >= pCap->total_queues) { 758*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "arn: arn_txq_setup(): " 759*dd1de374Slin wang - Sun Microsystems - Beijing China "invalid queue num %u\n", q)); 760*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 761*dd1de374Slin wang - Sun Microsystems - Beijing China } 762*dd1de374Slin wang - Sun Microsystems - Beijing China qi = &ahp->ah_txq[q]; 763*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) { 764*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "arn: arn_txq_setup(): " 765*dd1de374Slin wang - Sun Microsystems - Beijing China "inactive queue %u\n", q)); 766*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 767*dd1de374Slin wang - Sun Microsystems - Beijing China } 768*dd1de374Slin wang - Sun Microsystems - Beijing China 769*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "arn: arn_txq_setup(): " 770*dd1de374Slin wang - Sun Microsystems - Beijing China "release queue %u\n", q)); 771*dd1de374Slin wang - Sun Microsystems - Beijing China 772*dd1de374Slin wang - Sun Microsystems - Beijing China 773*dd1de374Slin wang - Sun Microsystems - Beijing China qi->tqi_type = ATH9K_TX_QUEUE_INACTIVE; 774*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txOkInterruptMask &= ~(1 << q); 775*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txErrInterruptMask &= ~(1 << q); 776*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txDescInterruptMask &= ~(1 << q); 777*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txEolInterruptMask &= ~(1 << q); 778*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txUrnInterruptMask &= ~(1 << q); 779*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set_txq_interrupts(ah, qi); 780*dd1de374Slin wang - Sun Microsystems - Beijing China 781*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 782*dd1de374Slin wang - Sun Microsystems - Beijing China } 783*dd1de374Slin wang - Sun Microsystems - Beijing China 784*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 785*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_resettxqueue(struct ath_hal *ah, uint32_t q) 786*dd1de374Slin wang - Sun Microsystems - Beijing China { 787*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_hal_5416 *ahp = AH5416(ah); 788*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_hw_capabilities *pCap = &ah->ah_caps; 789*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_channel *chan = ah->ah_curchan; 790*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_tx_queue_info *qi; 791*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t cwMin, chanCwMin, value; 792*dd1de374Slin wang - Sun Microsystems - Beijing China 793*dd1de374Slin wang - Sun Microsystems - Beijing China if (q >= pCap->total_queues) { 794*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "%s: invalid queue num %u\n", 795*dd1de374Slin wang - Sun Microsystems - Beijing China __func__, q)); 796*dd1de374Slin wang - Sun Microsystems - Beijing China 797*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 798*dd1de374Slin wang - Sun Microsystems - Beijing China } 799*dd1de374Slin wang - Sun Microsystems - Beijing China 800*dd1de374Slin wang - Sun Microsystems - Beijing China qi = &ahp->ah_txq[q]; 801*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_type == ATH9K_TX_QUEUE_INACTIVE) { 802*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "%s: inactive queue %u\n", 803*dd1de374Slin wang - Sun Microsystems - Beijing China __func__, q)); 804*dd1de374Slin wang - Sun Microsystems - Beijing China 805*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 806*dd1de374Slin wang - Sun Microsystems - Beijing China } 807*dd1de374Slin wang - Sun Microsystems - Beijing China 808*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, 809*dd1de374Slin wang - Sun Microsystems - Beijing China "%s: reset queue %u\n", __func__, q)); 810*dd1de374Slin wang - Sun Microsystems - Beijing China 811*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_cwmin == ATH9K_TXQ_USEDEFAULT) { 812*dd1de374Slin wang - Sun Microsystems - Beijing China if (chan && IS_CHAN_B(chan)) 813*dd1de374Slin wang - Sun Microsystems - Beijing China chanCwMin = INIT_CWMIN_11B; 814*dd1de374Slin wang - Sun Microsystems - Beijing China else 815*dd1de374Slin wang - Sun Microsystems - Beijing China chanCwMin = INIT_CWMIN; 816*dd1de374Slin wang - Sun Microsystems - Beijing China 817*dd1de374Slin wang - Sun Microsystems - Beijing China for (cwMin = 1; cwMin < chanCwMin; cwMin = (cwMin << 1) | 1) { 818*dd1de374Slin wang - Sun Microsystems - Beijing China /* Nothing to do */ 819*dd1de374Slin wang - Sun Microsystems - Beijing China } 820*dd1de374Slin wang - Sun Microsystems - Beijing China } else 821*dd1de374Slin wang - Sun Microsystems - Beijing China cwMin = qi->tqi_cwmin; 822*dd1de374Slin wang - Sun Microsystems - Beijing China 823*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DLCL_IFS(q), 824*dd1de374Slin wang - Sun Microsystems - Beijing China SM(cwMin, AR_D_LCL_IFS_CWMIN) | 825*dd1de374Slin wang - Sun Microsystems - Beijing China SM(qi->tqi_cwmax, AR_D_LCL_IFS_CWMAX) | 826*dd1de374Slin wang - Sun Microsystems - Beijing China SM(qi->tqi_aifs, AR_D_LCL_IFS_AIFS)); 827*dd1de374Slin wang - Sun Microsystems - Beijing China 828*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DRETRY_LIMIT(q), 829*dd1de374Slin wang - Sun Microsystems - Beijing China SM(INIT_SSH_RETRY, AR_D_RETRY_LIMIT_STA_SH) | 830*dd1de374Slin wang - Sun Microsystems - Beijing China SM(INIT_SLG_RETRY, AR_D_RETRY_LIMIT_STA_LG) | 831*dd1de374Slin wang - Sun Microsystems - Beijing China SM(qi->tqi_shretry, AR_D_RETRY_LIMIT_FR_SH)); 832*dd1de374Slin wang - Sun Microsystems - Beijing China 833*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QMISC(q), AR_Q_MISC_DCU_EARLY_TERM_REQ); 834*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DMISC(q), 835*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2); 836*dd1de374Slin wang - Sun Microsystems - Beijing China 837*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_cbrPeriod) { 838*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QCBRCFG(q), 839*dd1de374Slin wang - Sun Microsystems - Beijing China SM(qi->tqi_cbrPeriod, AR_Q_CBRCFG_INTERVAL) | 840*dd1de374Slin wang - Sun Microsystems - Beijing China SM(qi->tqi_cbrOverflowLimit, AR_Q_CBRCFG_OVF_THRESH)); 841*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QMISC(q), 842*dd1de374Slin wang - Sun Microsystems - Beijing China REG_READ(ah, AR_QMISC(q)) | AR_Q_MISC_FSP_CBR | 843*dd1de374Slin wang - Sun Microsystems - Beijing China (qi->tqi_cbrOverflowLimit ? 844*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_MISC_CBR_EXP_CNTR_LIMIT_EN : 0)); 845*dd1de374Slin wang - Sun Microsystems - Beijing China } 846*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_readyTime && (qi->tqi_type != ATH9K_TX_QUEUE_CAB)) { 847*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QRDYTIMECFG(q), 848*dd1de374Slin wang - Sun Microsystems - Beijing China SM(qi->tqi_readyTime, AR_Q_RDYTIMECFG_DURATION) | 849*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_RDYTIMECFG_EN); 850*dd1de374Slin wang - Sun Microsystems - Beijing China } 851*dd1de374Slin wang - Sun Microsystems - Beijing China 852*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DCHNTIME(q), 853*dd1de374Slin wang - Sun Microsystems - Beijing China SM(qi->tqi_burstTime, AR_D_CHNTIME_DUR) | 854*dd1de374Slin wang - Sun Microsystems - Beijing China (qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0)); 855*dd1de374Slin wang - Sun Microsystems - Beijing China 856*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_burstTime && 857*dd1de374Slin wang - Sun Microsystems - Beijing China (qi->tqi_qflags & TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE)) { 858*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QMISC(q), 859*dd1de374Slin wang - Sun Microsystems - Beijing China REG_READ(ah, AR_QMISC(q)) | 860*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_MISC_RDYTIME_EXP_POLICY); 861*dd1de374Slin wang - Sun Microsystems - Beijing China 862*dd1de374Slin wang - Sun Microsystems - Beijing China } 863*dd1de374Slin wang - Sun Microsystems - Beijing China 864*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_qflags & TXQ_FLAG_BACKOFF_DISABLE) { 865*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DMISC(q), 866*dd1de374Slin wang - Sun Microsystems - Beijing China REG_READ(ah, AR_DMISC(q)) | 867*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_POST_FR_BKOFF_DIS); 868*dd1de374Slin wang - Sun Microsystems - Beijing China } 869*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_qflags & TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE) { 870*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DMISC(q), 871*dd1de374Slin wang - Sun Microsystems - Beijing China REG_READ(ah, AR_DMISC(q)) | 872*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_FRAG_BKOFF_EN); 873*dd1de374Slin wang - Sun Microsystems - Beijing China } 874*dd1de374Slin wang - Sun Microsystems - Beijing China switch (qi->tqi_type) { 875*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_BEACON: 876*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QMISC(q), REG_READ(ah, AR_QMISC(q)) | 877*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_MISC_FSP_DBA_GATED | 878*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_MISC_BEACON_USE | 879*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_MISC_CBR_INCR_DIS1); 880*dd1de374Slin wang - Sun Microsystems - Beijing China 881*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DMISC(q), REG_READ(ah, AR_DMISC(q)) | 882*dd1de374Slin wang - Sun Microsystems - Beijing China (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << 883*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_ARB_LOCKOUT_CNTRL_S) | 884*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_BEACON_USE | 885*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_POST_FR_BKOFF_DIS); 886*dd1de374Slin wang - Sun Microsystems - Beijing China break; 887*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_CAB: 888*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QMISC(q), REG_READ(ah, AR_QMISC(q)) | 889*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_MISC_FSP_DBA_GATED | 890*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_MISC_CBR_INCR_DIS1 | 891*dd1de374Slin wang - Sun Microsystems - Beijing China AR_Q_MISC_CBR_INCR_DIS0); 892*dd1de374Slin wang - Sun Microsystems - Beijing China value = (qi->tqi_readyTime - 893*dd1de374Slin wang - Sun Microsystems - Beijing China (ah->ah_config.sw_beacon_response_time - 894*dd1de374Slin wang - Sun Microsystems - Beijing China ah->ah_config.dma_beacon_response_time) - 895*dd1de374Slin wang - Sun Microsystems - Beijing China ah->ah_config.additional_swba_backoff) * 1024; 896*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QRDYTIMECFG(q), 897*dd1de374Slin wang - Sun Microsystems - Beijing China value | AR_Q_RDYTIMECFG_EN); 898*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DMISC(q), REG_READ(ah, AR_DMISC(q)) | 899*dd1de374Slin wang - Sun Microsystems - Beijing China (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << 900*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_ARB_LOCKOUT_CNTRL_S)); 901*dd1de374Slin wang - Sun Microsystems - Beijing China break; 902*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_PSPOLL: 903*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_QMISC(q), 904*dd1de374Slin wang - Sun Microsystems - Beijing China REG_READ(ah, AR_QMISC(q)) | AR_Q_MISC_CBR_INCR_DIS1); 905*dd1de374Slin wang - Sun Microsystems - Beijing China break; 906*dd1de374Slin wang - Sun Microsystems - Beijing China case ATH9K_TX_QUEUE_UAPSD: 907*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DMISC(q), REG_READ(ah, AR_DMISC(q)) | 908*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_POST_FR_BKOFF_DIS); 909*dd1de374Slin wang - Sun Microsystems - Beijing China break; 910*dd1de374Slin wang - Sun Microsystems - Beijing China default: 911*dd1de374Slin wang - Sun Microsystems - Beijing China break; 912*dd1de374Slin wang - Sun Microsystems - Beijing China } 913*dd1de374Slin wang - Sun Microsystems - Beijing China 914*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_intFlags & ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS) { 915*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_DMISC(q), REG_READ(ah, AR_DMISC(q)) | 916*dd1de374Slin wang - Sun Microsystems - Beijing China SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL, 917*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_ARB_LOCKOUT_CNTRL) | 918*dd1de374Slin wang - Sun Microsystems - Beijing China AR_D_MISC_POST_FR_BKOFF_DIS); 919*dd1de374Slin wang - Sun Microsystems - Beijing China } 920*dd1de374Slin wang - Sun Microsystems - Beijing China 921*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_qflags & TXQ_FLAG_TXOKINT_ENABLE) 922*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txOkInterruptMask |= 1 << q; 923*dd1de374Slin wang - Sun Microsystems - Beijing China else 924*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txOkInterruptMask &= ~(1 << q); 925*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_qflags & TXQ_FLAG_TXERRINT_ENABLE) 926*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txErrInterruptMask |= 1 << q; 927*dd1de374Slin wang - Sun Microsystems - Beijing China else 928*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txErrInterruptMask &= ~(1 << q); 929*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_qflags & TXQ_FLAG_TXDESCINT_ENABLE) 930*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txDescInterruptMask |= 1 << q; 931*dd1de374Slin wang - Sun Microsystems - Beijing China else 932*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txDescInterruptMask &= ~(1 << q); 933*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_qflags & TXQ_FLAG_TXEOLINT_ENABLE) 934*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txEolInterruptMask |= 1 << q; 935*dd1de374Slin wang - Sun Microsystems - Beijing China else 936*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txEolInterruptMask &= ~(1 << q); 937*dd1de374Slin wang - Sun Microsystems - Beijing China if (qi->tqi_qflags & TXQ_FLAG_TXURNINT_ENABLE) 938*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txUrnInterruptMask |= 1 << q; 939*dd1de374Slin wang - Sun Microsystems - Beijing China else 940*dd1de374Slin wang - Sun Microsystems - Beijing China ahp->ah_txUrnInterruptMask &= ~(1 << q); 941*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_set_txq_interrupts(ah, qi); 942*dd1de374Slin wang - Sun Microsystems - Beijing China 943*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 944*dd1de374Slin wang - Sun Microsystems - Beijing China } 945*dd1de374Slin wang - Sun Microsystems - Beijing China 946*dd1de374Slin wang - Sun Microsystems - Beijing China /* ARGSUSED */ 947*dd1de374Slin wang - Sun Microsystems - Beijing China int 948*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_rxprocdesc(struct ath_hal *ah, struct ath_desc *ds, 949*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t pa, 950*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath_desc *nds, 951*dd1de374Slin wang - Sun Microsystems - Beijing China uint64_t tsf) 952*dd1de374Slin wang - Sun Microsystems - Beijing China { 953*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc ads; 954*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *adsp = AR5416DESC(ds); 955*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t phyerr; 956*dd1de374Slin wang - Sun Microsystems - Beijing China 957*dd1de374Slin wang - Sun Microsystems - Beijing China if ((adsp->ds_rxstatus8 & AR_RxDone) == 0) 958*dd1de374Slin wang - Sun Microsystems - Beijing China return (EINPROGRESS); 959*dd1de374Slin wang - Sun Microsystems - Beijing China 960*dd1de374Slin wang - Sun Microsystems - Beijing China ads.u.rx = adsp->u.rx; 961*dd1de374Slin wang - Sun Microsystems - Beijing China 962*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_status = 0; 963*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_flags = 0; 964*dd1de374Slin wang - Sun Microsystems - Beijing China 965*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_datalen = ads.ds_rxstatus1 & AR_DataLen; 966*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_tstamp = ads.AR_RcvTimestamp; 967*dd1de374Slin wang - Sun Microsystems - Beijing China 968*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined); 969*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_rssi_ctl0 = MS(ads.ds_rxstatus0, AR_RxRSSIAnt00); 970*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_rssi_ctl1 = MS(ads.ds_rxstatus0, AR_RxRSSIAnt01); 971*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_rssi_ctl2 = MS(ads.ds_rxstatus0, AR_RxRSSIAnt02); 972*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_rssi_ext0 = MS(ads.ds_rxstatus4, AR_RxRSSIAnt10); 973*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_rssi_ext1 = MS(ads.ds_rxstatus4, AR_RxRSSIAnt11); 974*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_rssi_ext2 = MS(ads.ds_rxstatus4, AR_RxRSSIAnt12); 975*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads.ds_rxstatus8 & AR_RxKeyIdxValid) 976*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_keyix = MS(ads.ds_rxstatus8, AR_KeyIdx); 977*dd1de374Slin wang - Sun Microsystems - Beijing China else 978*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_keyix = ATH9K_RXKEYIX_INVALID; 979*dd1de374Slin wang - Sun Microsystems - Beijing China 980*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_rate = RXSTATUS_RATE(ah, (&ads)); 981*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_more = (ads.ds_rxstatus1 & AR_RxMore) ? 1 : 0; 982*dd1de374Slin wang - Sun Microsystems - Beijing China 983*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_isaggr = (ads.ds_rxstatus8 & AR_RxAggr) ? 1 : 0; 984*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_moreaggr = 985*dd1de374Slin wang - Sun Microsystems - Beijing China (ads.ds_rxstatus8 & AR_RxMoreAggr) ? 1 : 0; 986*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_antenna = MS(ads.ds_rxstatus3, AR_RxAntenna); 987*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_flags = 988*dd1de374Slin wang - Sun Microsystems - Beijing China (ads.ds_rxstatus3 & AR_GI) ? ATH9K_RX_GI : 0; 989*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_flags |= 990*dd1de374Slin wang - Sun Microsystems - Beijing China (ads.ds_rxstatus3 & AR_2040) ? ATH9K_RX_2040 : 0; 991*dd1de374Slin wang - Sun Microsystems - Beijing China 992*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads.ds_rxstatus8 & AR_PreDelimCRCErr) 993*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_flags |= ATH9K_RX_DELIM_CRC_PRE; 994*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) 995*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_flags |= ATH9K_RX_DELIM_CRC_POST; 996*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads.ds_rxstatus8 & AR_DecryptBusyErr) 997*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_flags |= ATH9K_RX_DECRYPT_BUSY; 998*dd1de374Slin wang - Sun Microsystems - Beijing China 999*dd1de374Slin wang - Sun Microsystems - Beijing China if ((ads.ds_rxstatus8 & AR_RxFrameOK) == 0) { 1000*dd1de374Slin wang - Sun Microsystems - Beijing China if (ads.ds_rxstatus8 & AR_CRCErr) 1001*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_status |= ATH9K_RXERR_CRC; 1002*dd1de374Slin wang - Sun Microsystems - Beijing China else if (ads.ds_rxstatus8 & AR_PHYErr) { 1003*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_status |= ATH9K_RXERR_PHY; 1004*dd1de374Slin wang - Sun Microsystems - Beijing China phyerr = MS(ads.ds_rxstatus8, AR_PHYErrCode); 1005*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_phyerr = (uint8_t)phyerr; /* LINT */ 1006*dd1de374Slin wang - Sun Microsystems - Beijing China } else if (ads.ds_rxstatus8 & AR_DecryptCRCErr) 1007*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_status |= ATH9K_RXERR_DECRYPT; 1008*dd1de374Slin wang - Sun Microsystems - Beijing China else if (ads.ds_rxstatus8 & AR_MichaelErr) 1009*dd1de374Slin wang - Sun Microsystems - Beijing China ds->ds_rxstat.rs_status |= ATH9K_RXERR_MIC; 1010*dd1de374Slin wang - Sun Microsystems - Beijing China } 1011*dd1de374Slin wang - Sun Microsystems - Beijing China 1012*dd1de374Slin wang - Sun Microsystems - Beijing China return (0); 1013*dd1de374Slin wang - Sun Microsystems - Beijing China } 1014*dd1de374Slin wang - Sun Microsystems - Beijing China 1015*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 1016*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_setuprxdesc(struct ath_hal *ah, struct ath_desc *ds, 1017*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t size, uint32_t flags) 1018*dd1de374Slin wang - Sun Microsystems - Beijing China { 1019*dd1de374Slin wang - Sun Microsystems - Beijing China struct ar5416_desc *ads = AR5416DESC(ds); 1020*dd1de374Slin wang - Sun Microsystems - Beijing China struct ath9k_hw_capabilities *pCap = &ah->ah_caps; 1021*dd1de374Slin wang - Sun Microsystems - Beijing China 1022*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 = size & AR_BufLen; 1023*dd1de374Slin wang - Sun Microsystems - Beijing China if (flags & ATH9K_RXDESC_INTREQ) 1024*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_ctl1 |= AR_RxIntrReq; 1025*dd1de374Slin wang - Sun Microsystems - Beijing China 1026*dd1de374Slin wang - Sun Microsystems - Beijing China ads->ds_rxstatus8 &= ~AR_RxDone; 1027*dd1de374Slin wang - Sun Microsystems - Beijing China if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) 1028*dd1de374Slin wang - Sun Microsystems - Beijing China (void) memset(&(ads->u), 0, sizeof (ads->u)); 1029*dd1de374Slin wang - Sun Microsystems - Beijing China 1030*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 1031*dd1de374Slin wang - Sun Microsystems - Beijing China } 1032*dd1de374Slin wang - Sun Microsystems - Beijing China 1033*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 1034*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_setrxabort(struct ath_hal *ah, boolean_t set) 1035*dd1de374Slin wang - Sun Microsystems - Beijing China { 1036*dd1de374Slin wang - Sun Microsystems - Beijing China uint32_t reg; 1037*dd1de374Slin wang - Sun Microsystems - Beijing China 1038*dd1de374Slin wang - Sun Microsystems - Beijing China if (set) { 1039*dd1de374Slin wang - Sun Microsystems - Beijing China REG_SET_BIT(ah, AR_DIAG_SW, 1040*dd1de374Slin wang - Sun Microsystems - Beijing China (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); 1041*dd1de374Slin wang - Sun Microsystems - Beijing China 1042*dd1de374Slin wang - Sun Microsystems - Beijing China if (!ath9k_hw_wait(ah, AR_OBS_BUS_1, 1043*dd1de374Slin wang - Sun Microsystems - Beijing China AR_OBS_BUS_1_RX_STATE, 0)) { 1044*dd1de374Slin wang - Sun Microsystems - Beijing China REG_CLR_BIT(ah, AR_DIAG_SW, 1045*dd1de374Slin wang - Sun Microsystems - Beijing China (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); 1046*dd1de374Slin wang - Sun Microsystems - Beijing China 1047*dd1de374Slin wang - Sun Microsystems - Beijing China reg = REG_READ(ah, AR_OBS_BUS_1); 1048*dd1de374Slin wang - Sun Microsystems - Beijing China 1049*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_FATAL, 1050*dd1de374Slin wang - Sun Microsystems - Beijing China "%s: rx failed to go idle in 10 ms RXSM=0x%x\n", 1051*dd1de374Slin wang - Sun Microsystems - Beijing China __func__, reg)); 1052*dd1de374Slin wang - Sun Microsystems - Beijing China 1053*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 1054*dd1de374Slin wang - Sun Microsystems - Beijing China } 1055*dd1de374Slin wang - Sun Microsystems - Beijing China } else { 1056*dd1de374Slin wang - Sun Microsystems - Beijing China REG_CLR_BIT(ah, AR_DIAG_SW, 1057*dd1de374Slin wang - Sun Microsystems - Beijing China (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); 1058*dd1de374Slin wang - Sun Microsystems - Beijing China } 1059*dd1de374Slin wang - Sun Microsystems - Beijing China 1060*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 1061*dd1de374Slin wang - Sun Microsystems - Beijing China } 1062*dd1de374Slin wang - Sun Microsystems - Beijing China 1063*dd1de374Slin wang - Sun Microsystems - Beijing China void 1064*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_putrxbuf(struct ath_hal *ah, uint32_t rxdp) 1065*dd1de374Slin wang - Sun Microsystems - Beijing China { 1066*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_RXDP, rxdp); 1067*dd1de374Slin wang - Sun Microsystems - Beijing China } 1068*dd1de374Slin wang - Sun Microsystems - Beijing China 1069*dd1de374Slin wang - Sun Microsystems - Beijing China void 1070*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_rxena(struct ath_hal *ah) 1071*dd1de374Slin wang - Sun Microsystems - Beijing China { 1072*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_CR, AR_CR_RXE); 1073*dd1de374Slin wang - Sun Microsystems - Beijing China } 1074*dd1de374Slin wang - Sun Microsystems - Beijing China 1075*dd1de374Slin wang - Sun Microsystems - Beijing China void 1076*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_startpcureceive(struct ath_hal *ah) 1077*dd1de374Slin wang - Sun Microsystems - Beijing China { 1078*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_enable_mib_counters(ah); 1079*dd1de374Slin wang - Sun Microsystems - Beijing China 1080*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_ani_reset(ah); 1081*dd1de374Slin wang - Sun Microsystems - Beijing China 1082*dd1de374Slin wang - Sun Microsystems - Beijing China REG_CLR_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); 1083*dd1de374Slin wang - Sun Microsystems - Beijing China } 1084*dd1de374Slin wang - Sun Microsystems - Beijing China 1085*dd1de374Slin wang - Sun Microsystems - Beijing China void 1086*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_stoppcurecv(struct ath_hal *ah) 1087*dd1de374Slin wang - Sun Microsystems - Beijing China { 1088*dd1de374Slin wang - Sun Microsystems - Beijing China REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_DIS); 1089*dd1de374Slin wang - Sun Microsystems - Beijing China 1090*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_disable_mib_counters(ah); 1091*dd1de374Slin wang - Sun Microsystems - Beijing China } 1092*dd1de374Slin wang - Sun Microsystems - Beijing China 1093*dd1de374Slin wang - Sun Microsystems - Beijing China boolean_t 1094*dd1de374Slin wang - Sun Microsystems - Beijing China ath9k_hw_stopdmarecv(struct ath_hal *ah) 1095*dd1de374Slin wang - Sun Microsystems - Beijing China { 1096*dd1de374Slin wang - Sun Microsystems - Beijing China REG_WRITE(ah, AR_CR, AR_CR_RXD); 1097*dd1de374Slin wang - Sun Microsystems - Beijing China 1098*dd1de374Slin wang - Sun Microsystems - Beijing China if (!ath9k_hw_wait(ah, AR_CR, AR_CR_RXE, 0)) { 1099*dd1de374Slin wang - Sun Microsystems - Beijing China ARN_DBG((ARN_DBG_QUEUE, "arn: ath9k_hw_stopdmarecv(): " 1100*dd1de374Slin wang - Sun Microsystems - Beijing China "dma failed to stop in 10ms\n" 1101*dd1de374Slin wang - Sun Microsystems - Beijing China "AR_CR=0x%08x\nAR_DIAG_SW=0x%08x\n", 1102*dd1de374Slin wang - Sun Microsystems - Beijing China REG_READ(ah, AR_CR), REG_READ(ah, AR_DIAG_SW))); 1103*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_FALSE); 1104*dd1de374Slin wang - Sun Microsystems - Beijing China } else { 1105*dd1de374Slin wang - Sun Microsystems - Beijing China return (B_TRUE); 1106*dd1de374Slin wang - Sun Microsystems - Beijing China } 1107*dd1de374Slin wang - Sun Microsystems - Beijing China } 1108