1 /* 2 * Copyright (c) 2013 Qualcomm Atheros, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 * PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include "opt_ah.h" 18 19 #include "ah.h" 20 #include "ah_desc.h" 21 #include "ah_internal.h" 22 23 #include "ar9300/ar9300.h" 24 #include "ar9300/ar9300reg.h" 25 #include "ar9300/ar9300phy.h" 26 #include "ar9300/ar9300desc.h" 27 28 #define TU_TO_USEC(_tu) ((_tu) << 10) 29 #define ONE_EIGHTH_TU_TO_USEC(_tu8) ((_tu8) << 7) 30 31 /* 32 * Update Tx FIFO trigger level. 33 * 34 * Set b_inc_trig_level to TRUE to increase the trigger level. 35 * Set b_inc_trig_level to FALSE to decrease the trigger level. 36 * 37 * Returns TRUE if the trigger level was updated 38 */ 39 HAL_BOOL 40 ar9300_update_tx_trig_level(struct ath_hal *ah, HAL_BOOL b_inc_trig_level) 41 { 42 struct ath_hal_9300 *ahp = AH9300(ah); 43 u_int32_t txcfg, cur_level, new_level; 44 HAL_INT omask; 45 46 if (AH9300(ah)->ah_tx_trig_level >= MAX_TX_FIFO_THRESHOLD && 47 b_inc_trig_level) 48 { 49 return AH_FALSE; 50 } 51 52 /* 53 * Disable interrupts while futzing with the fifo level. 54 */ 55 omask = ar9300_set_interrupts(ah, ahp->ah_mask_reg &~ HAL_INT_GLOBAL, 0); 56 57 txcfg = OS_REG_READ(ah, AR_TXCFG); 58 cur_level = MS(txcfg, AR_FTRIG); 59 new_level = cur_level; 60 61 if (b_inc_trig_level) { /* increase the trigger level */ 62 if (cur_level < MAX_TX_FIFO_THRESHOLD) { 63 new_level++; 64 } 65 } else if (cur_level > MIN_TX_FIFO_THRESHOLD) { 66 new_level--; 67 } 68 69 if (new_level != cur_level) { 70 /* Update the trigger level */ 71 OS_REG_WRITE(ah, 72 AR_TXCFG, (txcfg &~ AR_FTRIG) | SM(new_level, AR_FTRIG)); 73 } 74 75 /* re-enable chip interrupts */ 76 ar9300_set_interrupts(ah, omask, 0); 77 78 AH9300(ah)->ah_tx_trig_level = new_level; 79 80 return (new_level != cur_level); 81 } 82 83 /* 84 * Returns the value of Tx Trigger Level 85 */ 86 u_int16_t 87 ar9300_get_tx_trig_level(struct ath_hal *ah) 88 { 89 return (AH9300(ah)->ah_tx_trig_level); 90 } 91 92 /* 93 * Set the properties of the tx queue with the parameters 94 * from q_info. 95 */ 96 HAL_BOOL 97 ar9300_set_tx_queue_props(struct ath_hal *ah, int q, const HAL_TXQ_INFO *q_info) 98 { 99 struct ath_hal_9300 *ahp = AH9300(ah); 100 HAL_CAPABILITIES *p_cap = &AH_PRIVATE(ah)->ah_caps; 101 102 if (q >= p_cap->halTotalQueues) { 103 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: invalid queue num %u\n", __func__, q); 104 return AH_FALSE; 105 } 106 return ath_hal_setTxQProps(ah, &ahp->ah_txq[q], q_info); 107 } 108 109 /* 110 * Return the properties for the specified tx queue. 111 */ 112 HAL_BOOL 113 ar9300_get_tx_queue_props(struct ath_hal *ah, int q, HAL_TXQ_INFO *q_info) 114 { 115 struct ath_hal_9300 *ahp = AH9300(ah); 116 HAL_CAPABILITIES *p_cap = &AH_PRIVATE(ah)->ah_caps; 117 118 119 if (q >= p_cap->halTotalQueues) { 120 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: invalid queue num %u\n", __func__, q); 121 return AH_FALSE; 122 } 123 return ath_hal_getTxQProps(ah, q_info, &ahp->ah_txq[q]); 124 } 125 126 enum { 127 AH_TX_QUEUE_MINUS_OFFSET_BEACON = 1, 128 AH_TX_QUEUE_MINUS_OFFSET_CAB = 2, 129 AH_TX_QUEUE_MINUS_OFFSET_UAPSD = 3, 130 AH_TX_QUEUE_MINUS_OFFSET_PAPRD = 4, 131 }; 132 133 /* 134 * Allocate and initialize a tx DCU/QCU combination. 135 */ 136 int 137 ar9300_setup_tx_queue(struct ath_hal *ah, HAL_TX_QUEUE type, 138 const HAL_TXQ_INFO *q_info) 139 { 140 struct ath_hal_9300 *ahp = AH9300(ah); 141 HAL_TX_QUEUE_INFO *qi; 142 HAL_CAPABILITIES *p_cap = &AH_PRIVATE(ah)->ah_caps; 143 int q; 144 145 /* XXX move queue assignment to driver */ 146 switch (type) { 147 case HAL_TX_QUEUE_BEACON: 148 /* highest priority */ 149 q = p_cap->halTotalQueues - AH_TX_QUEUE_MINUS_OFFSET_BEACON; 150 break; 151 case HAL_TX_QUEUE_CAB: 152 /* next highest priority */ 153 q = p_cap->halTotalQueues - AH_TX_QUEUE_MINUS_OFFSET_CAB; 154 break; 155 case HAL_TX_QUEUE_UAPSD: 156 q = p_cap->halTotalQueues - AH_TX_QUEUE_MINUS_OFFSET_UAPSD; 157 break; 158 case HAL_TX_QUEUE_PAPRD: 159 q = p_cap->halTotalQueues - AH_TX_QUEUE_MINUS_OFFSET_PAPRD; 160 break; 161 case HAL_TX_QUEUE_DATA: 162 /* 163 * don't infringe on top 4 queues, reserved for: 164 * beacon, CAB, UAPSD, PAPRD 165 */ 166 for (q = 0; 167 q < p_cap->halTotalQueues - AH_TX_QUEUE_MINUS_OFFSET_PAPRD; 168 q++) 169 { 170 if (ahp->ah_txq[q].tqi_type == HAL_TX_QUEUE_INACTIVE) { 171 break; 172 } 173 } 174 if (q == p_cap->halTotalQueues - 3) { 175 HALDEBUG(ah, HAL_DEBUG_QUEUE, 176 "%s: no available tx queue\n", __func__); 177 return -1; 178 } 179 break; 180 default: 181 HALDEBUG(ah, HAL_DEBUG_QUEUE, 182 "%s: bad tx queue type %u\n", __func__, type); 183 return -1; 184 } 185 186 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: queue %u\n", __func__, q); 187 188 qi = &ahp->ah_txq[q]; 189 if (qi->tqi_type != HAL_TX_QUEUE_INACTIVE) { 190 HALDEBUG(ah, HAL_DEBUG_QUEUE, 191 "%s: tx queue %u already active\n", __func__, q); 192 return -1; 193 } 194 195 OS_MEMZERO(qi, sizeof(HAL_TX_QUEUE_INFO)); 196 qi->tqi_type = type; 197 198 if (q_info == AH_NULL) { 199 /* by default enable OK+ERR+DESC+URN interrupts */ 200 qi->tqi_qflags = HAL_TXQ_TXOKINT_ENABLE 201 | HAL_TXQ_TXERRINT_ENABLE 202 | HAL_TXQ_TXDESCINT_ENABLE 203 | HAL_TXQ_TXURNINT_ENABLE; 204 qi->tqi_aifs = INIT_AIFS; 205 qi->tqi_cwmin = HAL_TXQ_USEDEFAULT; /* NB: do at reset */ 206 qi->tqi_cwmax = INIT_CWMAX; 207 qi->tqi_shretry = INIT_SH_RETRY; 208 qi->tqi_lgretry = INIT_LG_RETRY; 209 qi->tqi_physCompBuf = 0; 210 } else { 211 qi->tqi_physCompBuf = q_info->tqi_compBuf; 212 (void) ar9300_set_tx_queue_props(ah, q, q_info); 213 } 214 /* NB: must be followed by ar9300_reset_tx_queue */ 215 return q; 216 } 217 218 /* 219 * Update the h/w interrupt registers to reflect a tx q's configuration. 220 */ 221 static void 222 set_tx_q_interrupts(struct ath_hal *ah, HAL_TX_QUEUE_INFO *qi) 223 { 224 struct ath_hal_9300 *ahp = AH9300(ah); 225 226 HALDEBUG(ah, HAL_DEBUG_INTERRUPT, 227 "%s: tx ok 0x%x err 0x%x eol 0x%x urn 0x%x\n", 228 __func__, 229 ahp->ah_tx_ok_interrupt_mask, 230 ahp->ah_tx_err_interrupt_mask, 231 ahp->ah_tx_eol_interrupt_mask, 232 ahp->ah_tx_urn_interrupt_mask); 233 234 OS_REG_WRITE(ah, AR_IMR_S0, 235 SM(ahp->ah_tx_ok_interrupt_mask, AR_IMR_S0_QCU_TXOK)); 236 OS_REG_WRITE(ah, AR_IMR_S1, 237 SM(ahp->ah_tx_err_interrupt_mask, AR_IMR_S1_QCU_TXERR) 238 | SM(ahp->ah_tx_eol_interrupt_mask, AR_IMR_S1_QCU_TXEOL)); 239 OS_REG_RMW_FIELD(ah, 240 AR_IMR_S2, AR_IMR_S2_QCU_TXURN, ahp->ah_tx_urn_interrupt_mask); 241 ahp->ah_mask2Reg = OS_REG_READ(ah, AR_IMR_S2); 242 } 243 244 /* 245 * Free a tx DCU/QCU combination. 246 */ 247 HAL_BOOL 248 ar9300_release_tx_queue(struct ath_hal *ah, u_int q) 249 { 250 struct ath_hal_9300 *ahp = AH9300(ah); 251 HAL_CAPABILITIES *p_cap = &AH_PRIVATE(ah)->ah_caps; 252 HAL_TX_QUEUE_INFO *qi; 253 254 if (q >= p_cap->halTotalQueues) { 255 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: invalid queue num %u\n", __func__, q); 256 return AH_FALSE; 257 } 258 259 qi = &ahp->ah_txq[q]; 260 if (qi->tqi_type == HAL_TX_QUEUE_INACTIVE) { 261 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: inactive queue %u\n", __func__, q); 262 return AH_FALSE; 263 } 264 265 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: release queue %u\n", __func__, q); 266 267 qi->tqi_type = HAL_TX_QUEUE_INACTIVE; 268 ahp->ah_tx_ok_interrupt_mask &= ~(1 << q); 269 ahp->ah_tx_err_interrupt_mask &= ~(1 << q); 270 ahp->ah_tx_eol_interrupt_mask &= ~(1 << q); 271 ahp->ah_tx_urn_interrupt_mask &= ~(1 << q); 272 set_tx_q_interrupts(ah, qi); 273 274 return AH_TRUE; 275 } 276 277 /* 278 * Set the retry, aifs, cwmin/max, ready_time regs for specified queue 279 * Assumes: 280 * phw_channel has been set to point to the current channel 281 */ 282 HAL_BOOL 283 ar9300_reset_tx_queue(struct ath_hal *ah, u_int q) 284 { 285 struct ath_hal_9300 *ahp = AH9300(ah); 286 // struct ath_hal_private *ap = AH_PRIVATE(ah); 287 HAL_CAPABILITIES *p_cap = &AH_PRIVATE(ah)->ah_caps; 288 const struct ieee80211_channel *chan = AH_PRIVATE(ah)->ah_curchan; 289 HAL_TX_QUEUE_INFO *qi; 290 u_int32_t cw_min, chan_cw_min, value; 291 uint32_t qmisc, dmisc; 292 293 if (q >= p_cap->halTotalQueues) { 294 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: invalid queue num %u\n", __func__, q); 295 return AH_FALSE; 296 } 297 298 qi = &ahp->ah_txq[q]; 299 if (qi->tqi_type == HAL_TX_QUEUE_INACTIVE) { 300 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: inactive queue %u\n", __func__, q); 301 return AH_TRUE; /* XXX??? */ 302 } 303 304 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: reset queue %u\n", __func__, q); 305 306 if (qi->tqi_cwmin == HAL_TXQ_USEDEFAULT) { 307 /* 308 * Select cwmin according to channel type. 309 * NB: chan can be NULL during attach 310 */ 311 if (chan && IEEE80211_IS_CHAN_B(chan)) { 312 chan_cw_min = INIT_CWMIN_11B; 313 } else { 314 chan_cw_min = INIT_CWMIN; 315 } 316 /* make sure that the CWmin is of the form (2^n - 1) */ 317 for (cw_min = 1; cw_min < chan_cw_min; cw_min = (cw_min << 1) | 1) {} 318 } else { 319 cw_min = qi->tqi_cwmin; 320 } 321 322 /* set cw_min/Max and AIFS values */ 323 if (q > 3 || (!AH9300(ah)->ah_fccaifs)) 324 /* values should not be overwritten if domain is FCC and manual rate 325 less than 24Mb is set, this check is making sure this */ 326 { 327 OS_REG_WRITE(ah, AR_DLCL_IFS(q), SM(cw_min, AR_D_LCL_IFS_CWMIN) 328 | SM(qi->tqi_cwmax, AR_D_LCL_IFS_CWMAX) 329 | SM(qi->tqi_aifs, AR_D_LCL_IFS_AIFS)); 330 } 331 332 /* Set retry limit values */ 333 OS_REG_WRITE(ah, AR_DRETRY_LIMIT(q), 334 SM(INIT_SSH_RETRY, AR_D_RETRY_LIMIT_STA_SH) | 335 SM(INIT_SLG_RETRY, AR_D_RETRY_LIMIT_STA_LG) | 336 SM(qi->tqi_shretry, AR_D_RETRY_LIMIT_FR_SH)); 337 338 /* enable early termination on the QCU */ 339 qmisc = AR_Q_MISC_DCU_EARLY_TERM_REQ; 340 341 /* enable DCU to wait for next fragment from QCU */ 342 if (AR_SREV_WASP(ah) && (AH_PRIVATE((ah))->ah_macRev <= AR_SREV_REVISION_WASP_12)) { 343 /* WAR for EV#85395: Wasp Rx overrun issue - reduces Tx queue backoff 344 * threshold to 1 to avoid Rx overruns - Fixed in Wasp 1.3 */ 345 dmisc = AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x1; 346 } else { 347 dmisc = AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2; 348 } 349 350 /* multiqueue support */ 351 if (qi->tqi_cbrPeriod) { 352 OS_REG_WRITE(ah, 353 AR_QCBRCFG(q), 354 SM(qi->tqi_cbrPeriod, AR_Q_CBRCFG_INTERVAL) | 355 SM(qi->tqi_cbrOverflowLimit, 356 AR_Q_CBRCFG_OVF_THRESH)); 357 qmisc |= AR_Q_MISC_FSP_CBR | 358 (qi->tqi_cbrOverflowLimit ? 359 AR_Q_MISC_CBR_EXP_CNTR_LIMIT_EN : 0); 360 } 361 362 if (qi->tqi_readyTime && (qi->tqi_type != HAL_TX_QUEUE_CAB)) { 363 OS_REG_WRITE(ah, AR_QRDYTIMECFG(q), 364 SM(qi->tqi_readyTime, AR_Q_RDYTIMECFG_DURATION) | 365 AR_Q_RDYTIMECFG_EN); 366 } 367 368 OS_REG_WRITE(ah, AR_DCHNTIME(q), SM(qi->tqi_burstTime, AR_D_CHNTIME_DUR) | 369 (qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0)); 370 371 if (qi->tqi_readyTime && 372 (qi->tqi_qflags & HAL_TXQ_RDYTIME_EXP_POLICY_ENABLE)) 373 qmisc |= AR_Q_MISC_RDYTIME_EXP_POLICY; 374 if (qi->tqi_qflags & HAL_TXQ_DBA_GATED) 375 qmisc = (qmisc &~ AR_Q_MISC_FSP) | AR_Q_MISC_FSP_DBA_GATED; 376 if (MS(qmisc, AR_Q_MISC_FSP) != AR_Q_MISC_FSP_ASAP) { 377 /* 378 * These are meangingful only when not scheduled asap. 379 */ 380 if (qi->tqi_qflags & HAL_TXQ_CBR_DIS_BEMPTY) 381 qmisc |= AR_Q_MISC_CBR_INCR_DIS0; 382 else 383 qmisc &= ~AR_Q_MISC_CBR_INCR_DIS0; 384 if (qi->tqi_qflags & HAL_TXQ_CBR_DIS_QEMPTY) 385 qmisc |= AR_Q_MISC_CBR_INCR_DIS1; 386 else 387 qmisc &= ~AR_Q_MISC_CBR_INCR_DIS1; 388 } 389 390 if (qi->tqi_qflags & HAL_TXQ_BACKOFF_DISABLE) 391 dmisc |= AR_D_MISC_POST_FR_BKOFF_DIS; 392 if (qi->tqi_qflags & HAL_TXQ_FRAG_BURST_BACKOFF_ENABLE) 393 dmisc |= AR_D_MISC_FRAG_BKOFF_EN; 394 if (qi->tqi_qflags & HAL_TXQ_ARB_LOCKOUT_GLOBAL) 395 dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL, 396 AR_D_MISC_ARB_LOCKOUT_CNTRL); 397 else if (qi->tqi_qflags & HAL_TXQ_ARB_LOCKOUT_INTRA) 398 dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_INTRA_FR, 399 AR_D_MISC_ARB_LOCKOUT_CNTRL); 400 if (qi->tqi_qflags & HAL_TXQ_IGNORE_VIRTCOL) 401 dmisc |= SM(AR_D_MISC_VIR_COL_HANDLING_IGNORE, 402 AR_D_MISC_VIR_COL_HANDLING); 403 if (qi->tqi_qflags & HAL_TXQ_SEQNUM_INC_DIS) 404 dmisc |= AR_D_MISC_SEQ_NUM_INCR_DIS; 405 406 switch (qi->tqi_type) { 407 case HAL_TX_QUEUE_BEACON: /* beacon frames */ 408 qmisc |= AR_Q_MISC_FSP_DBA_GATED 409 | AR_Q_MISC_BEACON_USE 410 | AR_Q_MISC_CBR_INCR_DIS1; 411 412 dmisc |= (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << 413 AR_D_MISC_ARB_LOCKOUT_CNTRL_S) 414 | AR_D_MISC_BEACON_USE 415 | AR_D_MISC_POST_FR_BKOFF_DIS; 416 /* XXX cwmin and cwmax should be 0 for beacon queue */ 417 if (AH_PRIVATE(ah)->ah_opmode != HAL_M_IBSS) { 418 OS_REG_WRITE(ah, AR_DLCL_IFS(q), SM(0, AR_D_LCL_IFS_CWMIN) 419 | SM(0, AR_D_LCL_IFS_CWMAX) 420 | SM(qi->tqi_aifs, AR_D_LCL_IFS_AIFS)); 421 } 422 break; 423 case HAL_TX_QUEUE_CAB: /* CAB frames */ 424 /* 425 * No longer Enable AR_Q_MISC_RDYTIME_EXP_POLICY, 426 * bug #6079. There is an issue with the CAB Queue 427 * not properly refreshing the Tx descriptor if 428 * the TXE clear setting is used. 429 */ 430 qmisc |= AR_Q_MISC_FSP_DBA_GATED 431 | AR_Q_MISC_CBR_INCR_DIS1 432 | AR_Q_MISC_CBR_INCR_DIS0; 433 434 if (qi->tqi_readyTime) { 435 OS_REG_WRITE(ah, AR_QRDYTIMECFG(q), 436 SM(qi->tqi_readyTime, AR_Q_RDYTIMECFG_DURATION) | 437 AR_Q_RDYTIMECFG_EN); 438 } else { 439 440 value = (ahp->ah_beaconInterval * 50 / 100) 441 - ah->ah_config.ah_additional_swba_backoff 442 - ah->ah_config.ah_sw_beacon_response_time 443 + ah->ah_config.ah_dma_beacon_response_time; 444 /* 445 * XXX Ensure it isn't too low - nothing lower 446 * XXX than 10 TU 447 */ 448 if (value < 10) 449 value = 10; 450 if (value < 0) 451 value = 10; 452 HALDEBUG(ah, HAL_DEBUG_TXQUEUE, 453 "%s: defaulting to rdytime = %d uS\n", 454 __func__, value); 455 OS_REG_WRITE(ah, AR_QRDYTIMECFG(q), 456 SM(TU_TO_USEC(value), AR_Q_RDYTIMECFG_DURATION) | 457 AR_Q_RDYTIMECFG_EN); 458 } 459 dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL, 460 AR_D_MISC_ARB_LOCKOUT_CNTRL); 461 break; 462 case HAL_TX_QUEUE_PSPOLL: 463 /* 464 * We may configure ps_poll QCU to be TIM-gated in the 465 * future; TIM_GATED bit is not enabled currently because 466 * of a hardware problem in Oahu that overshoots the TIM 467 * bitmap in beacon and may find matching associd bit in 468 * non-TIM elements and send PS-poll PS poll processing 469 * will be done in software 470 */ 471 qmisc |= AR_Q_MISC_CBR_INCR_DIS1; 472 break; 473 case HAL_TX_QUEUE_UAPSD: 474 dmisc |= AR_D_MISC_POST_FR_BKOFF_DIS; 475 break; 476 default: /* NB: silence compiler */ 477 break; 478 } 479 480 #ifndef AH_DISABLE_WME 481 /* 482 * Yes, this is a hack and not the right way to do it, but 483 * it does get the lockout bits and backoff set for the 484 * high-pri WME queues for testing. We need to either extend 485 * the meaning of queue_info->mode, or create something like 486 * queue_info->dcumode. 487 */ 488 if (qi->tqi_intFlags & HAL_TXQ_USE_LOCKOUT_BKOFF_DIS) { 489 dmisc |= SM(AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL, 490 AR_D_MISC_ARB_LOCKOUT_CNTRL) | 491 AR_D_MISC_POST_FR_BKOFF_DIS; 492 } 493 #endif 494 495 OS_REG_WRITE(ah, AR_Q_DESC_CRCCHK, AR_Q_DESC_CRCCHK_EN); 496 OS_REG_WRITE(ah, AR_QMISC(q), qmisc); 497 OS_REG_WRITE(ah, AR_DMISC(q), dmisc); 498 499 /* 500 * Always update the secondary interrupt mask registers - this 501 * could be a new queue getting enabled in a running system or 502 * hw getting re-initialized during a reset! 503 * 504 * Since we don't differentiate between tx interrupts corresponding 505 * to individual queues - secondary tx mask regs are always unmasked; 506 * tx interrupts are enabled/disabled for all queues collectively 507 * using the primary mask reg 508 */ 509 if (qi->tqi_qflags & HAL_TXQ_TXOKINT_ENABLE) { 510 ahp->ah_tx_ok_interrupt_mask |= (1 << q); 511 } else { 512 ahp->ah_tx_ok_interrupt_mask &= ~(1 << q); 513 } 514 if (qi->tqi_qflags & HAL_TXQ_TXERRINT_ENABLE) { 515 ahp->ah_tx_err_interrupt_mask |= (1 << q); 516 } else { 517 ahp->ah_tx_err_interrupt_mask &= ~(1 << q); 518 } 519 if (qi->tqi_qflags & HAL_TXQ_TXEOLINT_ENABLE) { 520 ahp->ah_tx_eol_interrupt_mask |= (1 << q); 521 } else { 522 ahp->ah_tx_eol_interrupt_mask &= ~(1 << q); 523 } 524 if (qi->tqi_qflags & HAL_TXQ_TXURNINT_ENABLE) { 525 ahp->ah_tx_urn_interrupt_mask |= (1 << q); 526 } else { 527 ahp->ah_tx_urn_interrupt_mask &= ~(1 << q); 528 } 529 set_tx_q_interrupts(ah, qi); 530 531 return AH_TRUE; 532 } 533 534 /* 535 * Get the TXDP for the specified queue 536 */ 537 u_int32_t 538 ar9300_get_tx_dp(struct ath_hal *ah, u_int q) 539 { 540 HALASSERT(q < AH_PRIVATE(ah)->ah_caps.halTotalQueues); 541 return OS_REG_READ(ah, AR_QTXDP(q)); 542 } 543 544 /* 545 * Set the tx_dp for the specified queue 546 */ 547 HAL_BOOL 548 ar9300_set_tx_dp(struct ath_hal *ah, u_int q, u_int32_t txdp) 549 { 550 HALASSERT(q < AH_PRIVATE(ah)->ah_caps.halTotalQueues); 551 HALASSERT(AH9300(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE); 552 HALASSERT(txdp != 0); 553 554 OS_REG_WRITE(ah, AR_QTXDP(q), txdp); 555 556 return AH_TRUE; 557 } 558 559 /* 560 * Transmit Enable is read-only now 561 */ 562 HAL_BOOL 563 ar9300_start_tx_dma(struct ath_hal *ah, u_int q) 564 { 565 return AH_TRUE; 566 } 567 568 /* 569 * Return the number of pending frames or 0 if the specified 570 * queue is stopped. 571 */ 572 u_int32_t 573 ar9300_num_tx_pending(struct ath_hal *ah, u_int q) 574 { 575 u_int32_t npend; 576 577 HALASSERT(q < AH_PRIVATE(ah)->ah_caps.halTotalQueues); 578 579 npend = OS_REG_READ(ah, AR_QSTS(q)) & AR_Q_STS_PEND_FR_CNT; 580 if (npend == 0) { 581 /* 582 * Pending frame count (PFC) can momentarily go to zero 583 * while TXE remains asserted. In other words a PFC of 584 * zero is not sufficient to say that the queue has stopped. 585 */ 586 if (OS_REG_READ(ah, AR_Q_TXE) & (1 << q)) { 587 npend = 1; /* arbitrarily return 1 */ 588 } 589 } 590 #ifdef DEBUG 591 if (npend && (AH9300(ah)->ah_txq[q].tqi_type == HAL_TX_QUEUE_CAB)) { 592 if (OS_REG_READ(ah, AR_Q_RDYTIMESHDN) & (1 << q)) { 593 HALDEBUG(ah, HAL_DEBUG_QUEUE, "RTSD on CAB queue\n"); 594 /* Clear the ready_time shutdown status bits */ 595 OS_REG_WRITE(ah, AR_Q_RDYTIMESHDN, 1 << q); 596 } 597 } 598 #endif 599 HALASSERT((npend == 0) || 600 (AH9300(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE)); 601 602 return npend; 603 } 604 605 /* 606 * Stop transmit on the specified queue 607 */ 608 HAL_BOOL 609 ar9300_stop_tx_dma(struct ath_hal *ah, u_int q, u_int timeout) 610 { 611 struct ath_hal_9300 *ahp = AH9300(ah); 612 613 /* 614 * If we call abort txdma instead, no need to stop RX. 615 * Otherwise, the RX logic might not be restarted properly. 616 */ 617 ahp->ah_abort_txdma_norx = AH_FALSE; 618 619 /* 620 * Directly call abort. It is better, hardware-wise, to stop all 621 * queues at once than individual ones. 622 */ 623 return ar9300_abort_tx_dma(ah); 624 625 #if 0 626 #define AH_TX_STOP_DMA_TIMEOUT 4000 /* usec */ 627 #define AH_TIME_QUANTUM 100 /* usec */ 628 u_int wait; 629 630 HALASSERT(q < AH_PRIVATE(ah)->ah_caps.hal_total_queues); 631 632 HALASSERT(AH9300(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE); 633 634 if (timeout == 0) { 635 timeout = AH_TX_STOP_DMA_TIMEOUT; 636 } 637 638 OS_REG_WRITE(ah, AR_Q_TXD, 1 << q); 639 640 for (wait = timeout / AH_TIME_QUANTUM; wait != 0; wait--) { 641 if (ar9300_num_tx_pending(ah, q) == 0) { 642 break; 643 } 644 OS_DELAY(AH_TIME_QUANTUM); /* XXX get actual value */ 645 } 646 647 #ifdef AH_DEBUG 648 if (wait == 0) { 649 HALDEBUG(ah, HAL_DEBUG_QUEUE, 650 "%s: queue %u DMA did not stop in 100 msec\n", __func__, q); 651 HALDEBUG(ah, HAL_DEBUG_QUEUE, 652 "%s: QSTS 0x%x Q_TXE 0x%x Q_TXD 0x%x Q_CBR 0x%x\n", 653 __func__, 654 OS_REG_READ(ah, AR_QSTS(q)), 655 OS_REG_READ(ah, AR_Q_TXE), 656 OS_REG_READ(ah, AR_Q_TXD), 657 OS_REG_READ(ah, AR_QCBRCFG(q))); 658 HALDEBUG(ah, HAL_DEBUG_QUEUE, 659 "%s: Q_MISC 0x%x Q_RDYTIMECFG 0x%x Q_RDYTIMESHDN 0x%x\n", 660 __func__, 661 OS_REG_READ(ah, AR_QMISC(q)), 662 OS_REG_READ(ah, AR_QRDYTIMECFG(q)), 663 OS_REG_READ(ah, AR_Q_RDYTIMESHDN)); 664 } 665 #endif /* AH_DEBUG */ 666 667 /* 2413+ and up can kill packets at the PCU level */ 668 if (ar9300_num_tx_pending(ah, q)) { 669 u_int32_t tsf_low, j; 670 671 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: Num of pending TX Frames %d on Q %d\n", 672 __func__, ar9300_num_tx_pending(ah, q), q); 673 674 /* Kill last PCU Tx Frame */ 675 /* TODO - save off and restore current values of Q1/Q2? */ 676 for (j = 0; j < 2; j++) { 677 tsf_low = OS_REG_READ(ah, AR_TSF_L32); 678 OS_REG_WRITE(ah, AR_QUIET2, SM(10, AR_QUIET2_QUIET_DUR)); 679 OS_REG_WRITE(ah, AR_QUIET_PERIOD, 100); 680 OS_REG_WRITE(ah, AR_NEXT_QUIET_TIMER, tsf_low >> 10); 681 OS_REG_SET_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); 682 683 if ((OS_REG_READ(ah, AR_TSF_L32) >> 10) == (tsf_low >> 10)) { 684 break; 685 } 686 687 HALDEBUG(ah, HAL_DEBUG_QUEUE, 688 "%s: TSF have moved while trying to set " 689 "quiet time TSF: 0x%08x\n", 690 __func__, tsf_low); 691 /* TSF shouldn't count twice or reg access is taking forever */ 692 HALASSERT(j < 1); 693 } 694 695 OS_REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 696 697 /* Allow the quiet mechanism to do its work */ 698 OS_DELAY(200); 699 OS_REG_CLR_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); 700 701 /* Verify all transmit is dead */ 702 wait = timeout / AH_TIME_QUANTUM; 703 while (ar9300_num_tx_pending(ah, q)) { 704 if ((--wait) == 0) { 705 HALDEBUG(ah, HAL_DEBUG_TX, 706 "%s: Failed to stop Tx DMA in %d msec " 707 "after killing last frame\n", 708 __func__, timeout / 1000); 709 break; 710 } 711 OS_DELAY(AH_TIME_QUANTUM); 712 } 713 714 OS_REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 715 } 716 717 OS_REG_WRITE(ah, AR_Q_TXD, 0); 718 return (wait != 0); 719 720 #undef AH_TX_STOP_DMA_TIMEOUT 721 #undef AH_TIME_QUANTUM 722 #endif 723 } 724 725 /* 726 * Really Stop transmit on the specified queue 727 */ 728 HAL_BOOL 729 ar9300_stop_tx_dma_indv_que(struct ath_hal *ah, u_int q, u_int timeout) 730 { 731 #define AH_TX_STOP_DMA_TIMEOUT 4000 /* usec */ 732 #define AH_TIME_QUANTUM 100 /* usec */ 733 u_int wait; 734 735 HALASSERT(q < AH_PRIVATE(ah)->ah_caps.hal_total_queues); 736 737 HALASSERT(AH9300(ah)->ah_txq[q].tqi_type != HAL_TX_QUEUE_INACTIVE); 738 739 if (timeout == 0) { 740 timeout = AH_TX_STOP_DMA_TIMEOUT; 741 } 742 743 OS_REG_WRITE(ah, AR_Q_TXD, 1 << q); 744 745 for (wait = timeout / AH_TIME_QUANTUM; wait != 0; wait--) { 746 if (ar9300_num_tx_pending(ah, q) == 0) { 747 break; 748 } 749 OS_DELAY(AH_TIME_QUANTUM); /* XXX get actual value */ 750 } 751 752 #ifdef AH_DEBUG 753 if (wait == 0) { 754 HALDEBUG(ah, HAL_DEBUG_QUEUE, 755 "%s: queue %u DMA did not stop in 100 msec\n", __func__, q); 756 HALDEBUG(ah, HAL_DEBUG_QUEUE, 757 "%s: QSTS 0x%x Q_TXE 0x%x Q_TXD 0x%x Q_CBR 0x%x\n", 758 __func__, 759 OS_REG_READ(ah, AR_QSTS(q)), 760 OS_REG_READ(ah, AR_Q_TXE), 761 OS_REG_READ(ah, AR_Q_TXD), 762 OS_REG_READ(ah, AR_QCBRCFG(q))); 763 HALDEBUG(ah, HAL_DEBUG_QUEUE, 764 "%s: Q_MISC 0x%x Q_RDYTIMECFG 0x%x Q_RDYTIMESHDN 0x%x\n", 765 __func__, 766 OS_REG_READ(ah, AR_QMISC(q)), 767 OS_REG_READ(ah, AR_QRDYTIMECFG(q)), 768 OS_REG_READ(ah, AR_Q_RDYTIMESHDN)); 769 } 770 #endif /* AH_DEBUG */ 771 772 /* 2413+ and up can kill packets at the PCU level */ 773 if (ar9300_num_tx_pending(ah, q)) { 774 u_int32_t tsf_low, j; 775 776 HALDEBUG(ah, HAL_DEBUG_QUEUE, "%s: Num of pending TX Frames %d on Q %d\n", 777 __func__, ar9300_num_tx_pending(ah, q), q); 778 779 /* Kill last PCU Tx Frame */ 780 /* TODO - save off and restore current values of Q1/Q2? */ 781 for (j = 0; j < 2; j++) { 782 tsf_low = OS_REG_READ(ah, AR_TSF_L32); 783 OS_REG_WRITE(ah, AR_QUIET2, SM(10, AR_QUIET2_QUIET_DUR)); 784 OS_REG_WRITE(ah, AR_QUIET_PERIOD, 100); 785 OS_REG_WRITE(ah, AR_NEXT_QUIET_TIMER, tsf_low >> 10); 786 OS_REG_SET_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); 787 788 if ((OS_REG_READ(ah, AR_TSF_L32) >> 10) == (tsf_low >> 10)) { 789 break; 790 } 791 792 HALDEBUG(ah, HAL_DEBUG_QUEUE, 793 "%s: TSF have moved while trying to set " 794 "quiet time TSF: 0x%08x\n", 795 __func__, tsf_low); 796 /* TSF shouldn't count twice or reg access is taking forever */ 797 HALASSERT(j < 1); 798 } 799 800 OS_REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 801 802 /* Allow the quiet mechanism to do its work */ 803 OS_DELAY(200); 804 OS_REG_CLR_BIT(ah, AR_TIMER_MODE, AR_QUIET_TIMER_EN); 805 806 /* Verify all transmit is dead */ 807 wait = timeout / AH_TIME_QUANTUM; 808 while (ar9300_num_tx_pending(ah, q)) { 809 if ((--wait) == 0) { 810 HALDEBUG(ah, HAL_DEBUG_TX, 811 "%s: Failed to stop Tx DMA in %d msec " 812 "after killing last frame\n", 813 __func__, timeout / 1000); 814 break; 815 } 816 OS_DELAY(AH_TIME_QUANTUM); 817 } 818 819 OS_REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH); 820 } 821 822 OS_REG_WRITE(ah, AR_Q_TXD, 0); 823 return (wait != 0); 824 825 #undef AH_TX_STOP_DMA_TIMEOUT 826 #undef AH_TIME_QUANTUM 827 } 828 829 /* 830 * Abort transmit on all queues 831 */ 832 #define AR9300_ABORT_LOOPS 1000 833 #define AR9300_ABORT_WAIT 5 834 #define NEXT_TBTT_NOW 10 835 HAL_BOOL 836 ar9300_abort_tx_dma(struct ath_hal *ah) 837 { 838 struct ath_hal_9300 *ahp = AH9300(ah); 839 int i, q; 840 u_int32_t nexttbtt, nextdba, tsf_tbtt, tbtt, dba; 841 HAL_BOOL stopped; 842 HAL_BOOL status = AH_TRUE; 843 844 if (ahp->ah_abort_txdma_norx) { 845 /* 846 * First of all, make sure RX has been stopped 847 */ 848 if (ar9300_get_power_mode(ah) != HAL_PM_FULL_SLEEP) { 849 /* Need to stop RX DMA before reset otherwise chip might hang */ 850 stopped = ar9300_set_rx_abort(ah, AH_TRUE); /* abort and disable PCU */ 851 ar9300_set_rx_filter(ah, 0); 852 stopped &= ar9300_stop_dma_receive(ah, 0); /* stop and disable RX DMA */ 853 if (!stopped) { 854 /* 855 * During the transition from full sleep to reset, 856 * recv DMA regs are not available to be read 857 */ 858 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 859 "%s[%d]: ar9300_stop_dma_receive failed\n", __func__, __LINE__); 860 //We still continue to stop TX dma 861 //return AH_FALSE; 862 } 863 } else { 864 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 865 "%s[%d]: Chip is already in full sleep\n", __func__, __LINE__); 866 } 867 } 868 869 /* 870 * set txd on all queues 871 */ 872 OS_REG_WRITE(ah, AR_Q_TXD, AR_Q_TXD_M); 873 874 /* 875 * set tx abort bits (also disable rx) 876 */ 877 OS_REG_SET_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); 878 /* Add a new receipe from K31 code */ 879 OS_REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH | AR_DIAG_RX_DIS | 880 AR_DIAG_RX_ABORT | AR_DIAG_FORCE_RX_CLEAR); 881 /* beacon Q flush */ 882 nexttbtt = OS_REG_READ(ah, AR_NEXT_TBTT_TIMER); 883 nextdba = OS_REG_READ(ah, AR_NEXT_DMA_BEACON_ALERT); 884 //printk("%s[%d]:dba: %d, nt: %d \n", __func__, __LINE__, nextdba, nexttbtt); 885 tsf_tbtt = OS_REG_READ(ah, AR_TSF_L32); 886 tbtt = tsf_tbtt + NEXT_TBTT_NOW; 887 dba = tsf_tbtt; 888 OS_REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, dba); 889 OS_REG_WRITE(ah, AR_NEXT_TBTT_TIMER, tbtt); 890 OS_REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); 891 892 /* 893 * Let TXE (all queues) clear before waiting for any pending frames 894 * This is needed before starting the RF_BUS GRANT sequence other wise causes kernel 895 * panic 896 */ 897 for(i = 0; i < AR9300_ABORT_LOOPS; i++) { 898 if(OS_REG_READ(ah, AR_Q_TXE) == 0) { 899 break; 900 } 901 OS_DELAY(AR9300_ABORT_WAIT); 902 } 903 if (i == AR9300_ABORT_LOOPS) { 904 HALDEBUG(ah, HAL_DEBUG_TX, "%s[%d] reached max wait on TXE\n", 905 __func__, __LINE__); 906 } 907 908 /* 909 * wait on all tx queues 910 * This need to be checked in the last to gain extra 50 usec. on avg. 911 * Currently checked first since we dont have a previous channel information currently. 912 * Which is needed to revert the rf changes. 913 */ 914 for (q = AR_NUM_QCU - 1; q >= 0; q--) { 915 for (i = 0; i < AR9300_ABORT_LOOPS; i++) { 916 if (!(ar9300_num_tx_pending(ah, q))) { 917 break; 918 } 919 OS_DELAY(AR9300_ABORT_WAIT); 920 } 921 if (i == AR9300_ABORT_LOOPS) { 922 status = AH_FALSE; 923 HALDEBUG(ah, HAL_DEBUG_UNMASKABLE, 924 "ABORT LOOP finsihsed for Q: %d, num_pending: %d \n", 925 q, ar9300_num_tx_pending(ah, q)); 926 goto exit; 927 } 928 } 929 930 /* Updating the beacon alert register with correct value */ 931 OS_REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, nextdba); 932 OS_REG_WRITE(ah, AR_NEXT_TBTT_TIMER, nexttbtt); 933 934 exit: 935 /* 936 * clear tx abort bits 937 */ 938 OS_REG_CLR_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF); 939 /* Added a new receipe from K31 code */ 940 OS_REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH | AR_DIAG_RX_DIS | 941 AR_DIAG_RX_ABORT | AR_DIAG_FORCE_RX_CLEAR); 942 OS_REG_CLR_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF); 943 944 /* 945 * clear txd 946 */ 947 OS_REG_WRITE(ah, AR_Q_TXD, 0); 948 949 ahp->ah_abort_txdma_norx = AH_TRUE; 950 951 return status; 952 } 953 954 /* 955 * Determine which tx queues need interrupt servicing. 956 */ 957 void 958 ar9300_get_tx_intr_queue(struct ath_hal *ah, u_int32_t *txqs) 959 { 960 HALDEBUG(AH_NULL, HAL_DEBUG_UNMASKABLE, 961 "ar9300_get_tx_intr_queue: Should not be called\n"); 962 #if 0 963 struct ath_hal_9300 *ahp = AH9300(ah); 964 *txqs &= ahp->ah_intr_txqs; 965 ahp->ah_intr_txqs &= ~(*txqs); 966 #endif 967 } 968 969 void 970 ar9300_reset_tx_status_ring(struct ath_hal *ah) 971 { 972 struct ath_hal_9300 *ahp = AH9300(ah); 973 974 ahp->ts_tail = 0; 975 976 /* Zero out the status descriptors */ 977 OS_MEMZERO((void *)ahp->ts_ring, ahp->ts_size * sizeof(struct ar9300_txs)); 978 HALDEBUG(ah, HAL_DEBUG_QUEUE, 979 "%s: TS Start 0x%x End 0x%x Virt %p, Size %d\n", __func__, 980 ahp->ts_paddr_start, ahp->ts_paddr_end, ahp->ts_ring, ahp->ts_size); 981 982 OS_REG_WRITE(ah, AR_Q_STATUS_RING_START, ahp->ts_paddr_start); 983 OS_REG_WRITE(ah, AR_Q_STATUS_RING_END, ahp->ts_paddr_end); 984 } 985 986 void 987 ar9300_setup_tx_status_ring(struct ath_hal *ah, void *ts_start, 988 u_int32_t ts_paddr_start, u_int16_t size) 989 { 990 struct ath_hal_9300 *ahp = AH9300(ah); 991 992 ahp->ts_paddr_start = ts_paddr_start; 993 ahp->ts_paddr_end = ts_paddr_start + (size * sizeof(struct ar9300_txs)); 994 ahp->ts_size = size; 995 ahp->ts_ring = (struct ar9300_txs *)ts_start; 996 997 ar9300_reset_tx_status_ring(ah); 998 } 999