1 /* 2 * Copyright (c) 2008-2009 Atheros Communications 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 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #include "ath9k.h" 18 19 #define FUDGE 2 20 21 /* 22 * This function will modify certain transmit queue properties depending on 23 * the operating mode of the station (AP or AdHoc). Parameters are AIFS 24 * settings and channel width min/max 25 */ 26 int ath_beaconq_config(struct ath_softc *sc) 27 { 28 struct ath_hw *ah = sc->sc_ah; 29 struct ath_common *common = ath9k_hw_common(ah); 30 struct ath9k_tx_queue_info qi, qi_be; 31 int qnum; 32 33 ath9k_hw_get_txq_props(ah, sc->beacon.beaconq, &qi); 34 if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) { 35 /* Always burst out beacon and CAB traffic. */ 36 qi.tqi_aifs = 1; 37 qi.tqi_cwmin = 0; 38 qi.tqi_cwmax = 0; 39 } else { 40 /* Adhoc mode; important thing is to use 2x cwmin. */ 41 qnum = ath_tx_get_qnum(sc, ATH9K_TX_QUEUE_DATA, 42 ATH9K_WME_AC_BE); 43 ath9k_hw_get_txq_props(ah, qnum, &qi_be); 44 qi.tqi_aifs = qi_be.tqi_aifs; 45 qi.tqi_cwmin = 4*qi_be.tqi_cwmin; 46 qi.tqi_cwmax = qi_be.tqi_cwmax; 47 } 48 49 if (!ath9k_hw_set_txq_props(ah, sc->beacon.beaconq, &qi)) { 50 ath_print(common, ATH_DBG_FATAL, 51 "Unable to update h/w beacon queue parameters\n"); 52 return 0; 53 } else { 54 ath9k_hw_resettxqueue(ah, sc->beacon.beaconq); 55 return 1; 56 } 57 } 58 59 /* 60 * Associates the beacon frame buffer with a transmit descriptor. Will set 61 * up all required antenna switch parameters, rate codes, and channel flags. 62 * Beacons are always sent out at the lowest rate, and are not retried. 63 */ 64 static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, 65 struct ath_buf *bf, int rateidx) 66 { 67 struct sk_buff *skb = bf->bf_mpdu; 68 struct ath_hw *ah = sc->sc_ah; 69 struct ath_common *common = ath9k_hw_common(ah); 70 struct ath_desc *ds; 71 struct ath9k_11n_rate_series series[4]; 72 int flags, antenna, ctsrate = 0, ctsduration = 0; 73 struct ieee80211_supported_band *sband; 74 u8 rate = 0; 75 76 ds = bf->bf_desc; 77 flags = ATH9K_TXDESC_NOACK; 78 79 ds->ds_link = 0; 80 /* 81 * Switch antenna every beacon. 82 * Should only switch every beacon period, not for every SWBA 83 * XXX assumes two antennae 84 */ 85 antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1); 86 87 sband = &sc->sbands[common->hw->conf.channel->band]; 88 rate = sband->bitrates[rateidx].hw_value; 89 if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) 90 rate |= sband->bitrates[rateidx].hw_value_short; 91 92 ath9k_hw_set11n_txdesc(ah, ds, skb->len + FCS_LEN, 93 ATH9K_PKT_TYPE_BEACON, 94 MAX_RATE_POWER, 95 ATH9K_TXKEYIX_INVALID, 96 ATH9K_KEY_TYPE_CLEAR, 97 flags); 98 99 /* NB: beacon's BufLen must be a multiple of 4 bytes */ 100 ath9k_hw_filltxdesc(ah, ds, roundup(skb->len, 4), 101 true, true, ds, bf->bf_buf_addr, 102 sc->beacon.beaconq); 103 104 memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); 105 series[0].Tries = 1; 106 series[0].Rate = rate; 107 series[0].ChSel = common->tx_chainmask; 108 series[0].RateFlags = (ctsrate) ? ATH9K_RATESERIES_RTS_CTS : 0; 109 ath9k_hw_set11n_ratescenario(ah, ds, ds, 0, ctsrate, ctsduration, 110 series, 4, 0); 111 } 112 113 static struct ath_buf *ath_beacon_generate(struct ieee80211_hw *hw, 114 struct ieee80211_vif *vif) 115 { 116 struct ath_wiphy *aphy = hw->priv; 117 struct ath_softc *sc = aphy->sc; 118 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 119 struct ath_buf *bf; 120 struct ath_vif *avp; 121 struct sk_buff *skb; 122 struct ath_txq *cabq; 123 struct ieee80211_tx_info *info; 124 int cabq_depth; 125 126 if (aphy->state != ATH_WIPHY_ACTIVE) 127 return NULL; 128 129 avp = (void *)vif->drv_priv; 130 cabq = sc->beacon.cabq; 131 132 if (avp->av_bcbuf == NULL) 133 return NULL; 134 135 /* Release the old beacon first */ 136 137 bf = avp->av_bcbuf; 138 skb = bf->bf_mpdu; 139 if (skb) { 140 dma_unmap_single(sc->dev, bf->bf_dmacontext, 141 skb->len, DMA_TO_DEVICE); 142 dev_kfree_skb_any(skb); 143 } 144 145 /* Get a new beacon from mac80211 */ 146 147 skb = ieee80211_beacon_get(hw, vif); 148 bf->bf_mpdu = skb; 149 if (skb == NULL) 150 return NULL; 151 ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp = 152 avp->tsf_adjust; 153 154 info = IEEE80211_SKB_CB(skb); 155 if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { 156 /* 157 * TODO: make sure the seq# gets assigned properly (vs. other 158 * TX frames) 159 */ 160 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; 161 sc->tx.seq_no += 0x10; 162 hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); 163 hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no); 164 } 165 166 bf->bf_buf_addr = bf->bf_dmacontext = 167 dma_map_single(sc->dev, skb->data, 168 skb->len, DMA_TO_DEVICE); 169 if (unlikely(dma_mapping_error(sc->dev, bf->bf_buf_addr))) { 170 dev_kfree_skb_any(skb); 171 bf->bf_mpdu = NULL; 172 ath_print(common, ATH_DBG_FATAL, 173 "dma_mapping_error on beaconing\n"); 174 return NULL; 175 } 176 177 skb = ieee80211_get_buffered_bc(hw, vif); 178 179 /* 180 * if the CABQ traffic from previous DTIM is pending and the current 181 * beacon is also a DTIM. 182 * 1) if there is only one vif let the cab traffic continue. 183 * 2) if there are more than one vif and we are using staggered 184 * beacons, then drain the cabq by dropping all the frames in 185 * the cabq so that the current vifs cab traffic can be scheduled. 186 */ 187 spin_lock_bh(&cabq->axq_lock); 188 cabq_depth = cabq->axq_depth; 189 spin_unlock_bh(&cabq->axq_lock); 190 191 if (skb && cabq_depth) { 192 if (sc->nvifs > 1) { 193 ath_print(common, ATH_DBG_BEACON, 194 "Flushing previous cabq traffic\n"); 195 ath_draintxq(sc, cabq, false); 196 } 197 } 198 199 ath_beacon_setup(sc, avp, bf, info->control.rates[0].idx); 200 201 while (skb) { 202 ath_tx_cabq(hw, skb); 203 skb = ieee80211_get_buffered_bc(hw, vif); 204 } 205 206 return bf; 207 } 208 209 int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif) 210 { 211 struct ath_softc *sc = aphy->sc; 212 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 213 struct ath_vif *avp; 214 struct ath_buf *bf; 215 struct sk_buff *skb; 216 __le64 tstamp; 217 218 avp = (void *)vif->drv_priv; 219 220 /* Allocate a beacon descriptor if we haven't done so. */ 221 if (!avp->av_bcbuf) { 222 /* Allocate beacon state for hostap/ibss. We know 223 * a buffer is available. */ 224 avp->av_bcbuf = list_first_entry(&sc->beacon.bbuf, 225 struct ath_buf, list); 226 list_del(&avp->av_bcbuf->list); 227 228 if (sc->sc_ah->opmode == NL80211_IFTYPE_AP || 229 sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC || 230 sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT) { 231 int slot; 232 /* 233 * Assign the vif to a beacon xmit slot. As 234 * above, this cannot fail to find one. 235 */ 236 avp->av_bslot = 0; 237 for (slot = 0; slot < ATH_BCBUF; slot++) 238 if (sc->beacon.bslot[slot] == NULL) { 239 avp->av_bslot = slot; 240 241 /* NB: keep looking for a double slot */ 242 if (slot == 0 || !sc->beacon.bslot[slot-1]) 243 break; 244 } 245 BUG_ON(sc->beacon.bslot[avp->av_bslot] != NULL); 246 sc->beacon.bslot[avp->av_bslot] = vif; 247 sc->beacon.bslot_aphy[avp->av_bslot] = aphy; 248 sc->nbcnvifs++; 249 } 250 } 251 252 /* release the previous beacon frame, if it already exists. */ 253 bf = avp->av_bcbuf; 254 if (bf->bf_mpdu != NULL) { 255 skb = bf->bf_mpdu; 256 dma_unmap_single(sc->dev, bf->bf_dmacontext, 257 skb->len, DMA_TO_DEVICE); 258 dev_kfree_skb_any(skb); 259 bf->bf_mpdu = NULL; 260 } 261 262 /* NB: the beacon data buffer must be 32-bit aligned. */ 263 skb = ieee80211_beacon_get(sc->hw, vif); 264 if (skb == NULL) { 265 ath_print(common, ATH_DBG_BEACON, "cannot get skb\n"); 266 return -ENOMEM; 267 } 268 269 tstamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; 270 sc->beacon.bc_tstamp = le64_to_cpu(tstamp); 271 /* Calculate a TSF adjustment factor required for staggered beacons. */ 272 if (avp->av_bslot > 0) { 273 u64 tsfadjust; 274 int intval; 275 276 intval = sc->beacon_interval ? : ATH_DEFAULT_BINTVAL; 277 278 /* 279 * Calculate the TSF offset for this beacon slot, i.e., the 280 * number of usecs that need to be added to the timestamp field 281 * in Beacon and Probe Response frames. Beacon slot 0 is 282 * processed at the correct offset, so it does not require TSF 283 * adjustment. Other slots are adjusted to get the timestamp 284 * close to the TBTT for the BSS. 285 */ 286 tsfadjust = intval * avp->av_bslot / ATH_BCBUF; 287 avp->tsf_adjust = cpu_to_le64(TU_TO_USEC(tsfadjust)); 288 289 ath_print(common, ATH_DBG_BEACON, 290 "stagger beacons, bslot %d intval " 291 "%u tsfadjust %llu\n", 292 avp->av_bslot, intval, (unsigned long long)tsfadjust); 293 294 ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp = 295 avp->tsf_adjust; 296 } else 297 avp->tsf_adjust = cpu_to_le64(0); 298 299 bf->bf_mpdu = skb; 300 bf->bf_buf_addr = bf->bf_dmacontext = 301 dma_map_single(sc->dev, skb->data, 302 skb->len, DMA_TO_DEVICE); 303 if (unlikely(dma_mapping_error(sc->dev, bf->bf_buf_addr))) { 304 dev_kfree_skb_any(skb); 305 bf->bf_mpdu = NULL; 306 ath_print(common, ATH_DBG_FATAL, 307 "dma_mapping_error on beacon alloc\n"); 308 return -ENOMEM; 309 } 310 311 return 0; 312 } 313 314 void ath_beacon_return(struct ath_softc *sc, struct ath_vif *avp) 315 { 316 if (avp->av_bcbuf != NULL) { 317 struct ath_buf *bf; 318 319 if (avp->av_bslot != -1) { 320 sc->beacon.bslot[avp->av_bslot] = NULL; 321 sc->beacon.bslot_aphy[avp->av_bslot] = NULL; 322 sc->nbcnvifs--; 323 } 324 325 bf = avp->av_bcbuf; 326 if (bf->bf_mpdu != NULL) { 327 struct sk_buff *skb = bf->bf_mpdu; 328 dma_unmap_single(sc->dev, bf->bf_dmacontext, 329 skb->len, DMA_TO_DEVICE); 330 dev_kfree_skb_any(skb); 331 bf->bf_mpdu = NULL; 332 } 333 list_add_tail(&bf->list, &sc->beacon.bbuf); 334 335 avp->av_bcbuf = NULL; 336 } 337 } 338 339 void ath_beacon_tasklet(unsigned long data) 340 { 341 struct ath_softc *sc = (struct ath_softc *)data; 342 struct ath_hw *ah = sc->sc_ah; 343 struct ath_common *common = ath9k_hw_common(ah); 344 struct ath_buf *bf = NULL; 345 struct ieee80211_vif *vif; 346 struct ath_wiphy *aphy; 347 int slot; 348 u32 bfaddr, bc = 0, tsftu; 349 u64 tsf; 350 u16 intval; 351 352 /* 353 * Check if the previous beacon has gone out. If 354 * not don't try to post another, skip this period 355 * and wait for the next. Missed beacons indicate 356 * a problem and should not occur. If we miss too 357 * many consecutive beacons reset the device. 358 */ 359 if (ath9k_hw_numtxpending(ah, sc->beacon.beaconq) != 0) { 360 sc->beacon.bmisscnt++; 361 362 if (sc->beacon.bmisscnt < BSTUCK_THRESH) { 363 ath_print(common, ATH_DBG_BEACON, 364 "missed %u consecutive beacons\n", 365 sc->beacon.bmisscnt); 366 } else if (sc->beacon.bmisscnt >= BSTUCK_THRESH) { 367 ath_print(common, ATH_DBG_BEACON, 368 "beacon is officially stuck\n"); 369 sc->sc_flags |= SC_OP_TSF_RESET; 370 ath_reset(sc, false); 371 } 372 373 return; 374 } 375 376 if (sc->beacon.bmisscnt != 0) { 377 ath_print(common, ATH_DBG_BEACON, 378 "resume beacon xmit after %u misses\n", 379 sc->beacon.bmisscnt); 380 sc->beacon.bmisscnt = 0; 381 } 382 383 /* 384 * Generate beacon frames. we are sending frames 385 * staggered so calculate the slot for this frame based 386 * on the tsf to safeguard against missing an swba. 387 */ 388 389 intval = sc->beacon_interval ? : ATH_DEFAULT_BINTVAL; 390 391 tsf = ath9k_hw_gettsf64(ah); 392 tsftu = TSF_TO_TU(tsf>>32, tsf); 393 slot = ((tsftu % intval) * ATH_BCBUF) / intval; 394 /* 395 * Reverse the slot order to get slot 0 on the TBTT offset that does 396 * not require TSF adjustment and other slots adding 397 * slot/ATH_BCBUF * beacon_int to timestamp. For example, with 398 * ATH_BCBUF = 4, we process beacon slots as follows: 3 2 1 0 3 2 1 .. 399 * and slot 0 is at correct offset to TBTT. 400 */ 401 slot = ATH_BCBUF - slot - 1; 402 vif = sc->beacon.bslot[slot]; 403 aphy = sc->beacon.bslot_aphy[slot]; 404 405 ath_print(common, ATH_DBG_BEACON, 406 "slot %d [tsf %llu tsftu %u intval %u] vif %p\n", 407 slot, tsf, tsftu, intval, vif); 408 409 bfaddr = 0; 410 if (vif) { 411 bf = ath_beacon_generate(aphy->hw, vif); 412 if (bf != NULL) { 413 bfaddr = bf->bf_daddr; 414 bc = 1; 415 } 416 } 417 418 /* 419 * Handle slot time change when a non-ERP station joins/leaves 420 * an 11g network. The 802.11 layer notifies us via callback, 421 * we mark updateslot, then wait one beacon before effecting 422 * the change. This gives associated stations at least one 423 * beacon interval to note the state change. 424 * 425 * NB: The slot time change state machine is clocked according 426 * to whether we are bursting or staggering beacons. We 427 * recognize the request to update and record the current 428 * slot then don't transition until that slot is reached 429 * again. If we miss a beacon for that slot then we'll be 430 * slow to transition but we'll be sure at least one beacon 431 * interval has passed. When bursting slot is always left 432 * set to ATH_BCBUF so this check is a noop. 433 */ 434 if (sc->beacon.updateslot == UPDATE) { 435 sc->beacon.updateslot = COMMIT; /* commit next beacon */ 436 sc->beacon.slotupdate = slot; 437 } else if (sc->beacon.updateslot == COMMIT && sc->beacon.slotupdate == slot) { 438 ah->slottime = sc->beacon.slottime; 439 ath9k_hw_init_global_settings(ah); 440 sc->beacon.updateslot = OK; 441 } 442 if (bfaddr != 0) { 443 /* 444 * Stop any current dma and put the new frame(s) on the queue. 445 * This should never fail since we check above that no frames 446 * are still pending on the queue. 447 */ 448 if (!ath9k_hw_stoptxdma(ah, sc->beacon.beaconq)) { 449 ath_print(common, ATH_DBG_FATAL, 450 "beacon queue %u did not stop?\n", sc->beacon.beaconq); 451 } 452 453 /* NB: cabq traffic should already be queued and primed */ 454 ath9k_hw_puttxbuf(ah, sc->beacon.beaconq, bfaddr); 455 ath9k_hw_txstart(ah, sc->beacon.beaconq); 456 457 sc->beacon.ast_be_xmit += bc; /* XXX per-vif? */ 458 } 459 } 460 461 static void ath9k_beacon_init(struct ath_softc *sc, 462 u32 next_beacon, 463 u32 beacon_period) 464 { 465 if (beacon_period & ATH9K_BEACON_RESET_TSF) 466 ath9k_ps_wakeup(sc); 467 468 ath9k_hw_beaconinit(sc->sc_ah, next_beacon, beacon_period); 469 470 if (beacon_period & ATH9K_BEACON_RESET_TSF) 471 ath9k_ps_restore(sc); 472 } 473 474 /* 475 * For multi-bss ap support beacons are either staggered evenly over N slots or 476 * burst together. For the former arrange for the SWBA to be delivered for each 477 * slot. Slots that are not occupied will generate nothing. 478 */ 479 static void ath_beacon_config_ap(struct ath_softc *sc, 480 struct ath_beacon_config *conf) 481 { 482 struct ath_hw *ah = sc->sc_ah; 483 u32 nexttbtt, intval; 484 485 /* NB: the beacon interval is kept internally in TU's */ 486 intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; 487 intval /= ATH_BCBUF; /* for staggered beacons */ 488 nexttbtt = intval; 489 490 if (sc->sc_flags & SC_OP_TSF_RESET) 491 intval |= ATH9K_BEACON_RESET_TSF; 492 493 /* 494 * In AP mode we enable the beacon timers and SWBA interrupts to 495 * prepare beacon frames. 496 */ 497 intval |= ATH9K_BEACON_ENA; 498 ah->imask |= ATH9K_INT_SWBA; 499 ath_beaconq_config(sc); 500 501 /* Set the computed AP beacon timers */ 502 503 ath9k_hw_set_interrupts(ah, 0); 504 ath9k_beacon_init(sc, nexttbtt, intval); 505 sc->beacon.bmisscnt = 0; 506 ath9k_hw_set_interrupts(ah, ah->imask); 507 508 /* Clear the reset TSF flag, so that subsequent beacon updation 509 will not reset the HW TSF. */ 510 511 sc->sc_flags &= ~SC_OP_TSF_RESET; 512 } 513 514 /* 515 * This sets up the beacon timers according to the timestamp of the last 516 * received beacon and the current TSF, configures PCF and DTIM 517 * handling, programs the sleep registers so the hardware will wakeup in 518 * time to receive beacons, and configures the beacon miss handling so 519 * we'll receive a BMISS interrupt when we stop seeing beacons from the AP 520 * we've associated with. 521 */ 522 static void ath_beacon_config_sta(struct ath_softc *sc, 523 struct ath_beacon_config *conf) 524 { 525 struct ath_hw *ah = sc->sc_ah; 526 struct ath_common *common = ath9k_hw_common(ah); 527 struct ath9k_beacon_state bs; 528 int dtimperiod, dtimcount, sleepduration; 529 int cfpperiod, cfpcount; 530 u32 nexttbtt = 0, intval, tsftu; 531 u64 tsf; 532 int num_beacons, offset, dtim_dec_count, cfp_dec_count; 533 534 /* No need to configure beacon if we are not associated */ 535 if (!common->curaid) { 536 ath_print(common, ATH_DBG_BEACON, 537 "STA is not yet associated..skipping beacon config\n"); 538 return; 539 } 540 541 memset(&bs, 0, sizeof(bs)); 542 intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; 543 544 /* 545 * Setup dtim and cfp parameters according to 546 * last beacon we received (which may be none). 547 */ 548 dtimperiod = conf->dtim_period; 549 if (dtimperiod <= 0) /* NB: 0 if not known */ 550 dtimperiod = 1; 551 dtimcount = conf->dtim_count; 552 if (dtimcount >= dtimperiod) /* NB: sanity check */ 553 dtimcount = 0; 554 cfpperiod = 1; /* NB: no PCF support yet */ 555 cfpcount = 0; 556 557 sleepduration = conf->listen_interval * intval; 558 if (sleepduration <= 0) 559 sleepduration = intval; 560 561 /* 562 * Pull nexttbtt forward to reflect the current 563 * TSF and calculate dtim+cfp state for the result. 564 */ 565 tsf = ath9k_hw_gettsf64(ah); 566 tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE; 567 568 num_beacons = tsftu / intval + 1; 569 offset = tsftu % intval; 570 nexttbtt = tsftu - offset; 571 if (offset) 572 nexttbtt += intval; 573 574 /* DTIM Beacon every dtimperiod Beacon */ 575 dtim_dec_count = num_beacons % dtimperiod; 576 /* CFP every cfpperiod DTIM Beacon */ 577 cfp_dec_count = (num_beacons / dtimperiod) % cfpperiod; 578 if (dtim_dec_count) 579 cfp_dec_count++; 580 581 dtimcount -= dtim_dec_count; 582 if (dtimcount < 0) 583 dtimcount += dtimperiod; 584 585 cfpcount -= cfp_dec_count; 586 if (cfpcount < 0) 587 cfpcount += cfpperiod; 588 589 bs.bs_intval = intval; 590 bs.bs_nexttbtt = nexttbtt; 591 bs.bs_dtimperiod = dtimperiod*intval; 592 bs.bs_nextdtim = bs.bs_nexttbtt + dtimcount*intval; 593 bs.bs_cfpperiod = cfpperiod*bs.bs_dtimperiod; 594 bs.bs_cfpnext = bs.bs_nextdtim + cfpcount*bs.bs_dtimperiod; 595 bs.bs_cfpmaxduration = 0; 596 597 /* 598 * Calculate the number of consecutive beacons to miss* before taking 599 * a BMISS interrupt. The configuration is specified in TU so we only 600 * need calculate based on the beacon interval. Note that we clamp the 601 * result to at most 15 beacons. 602 */ 603 if (sleepduration > intval) { 604 bs.bs_bmissthreshold = conf->listen_interval * 605 ATH_DEFAULT_BMISS_LIMIT / 2; 606 } else { 607 bs.bs_bmissthreshold = DIV_ROUND_UP(conf->bmiss_timeout, intval); 608 if (bs.bs_bmissthreshold > 15) 609 bs.bs_bmissthreshold = 15; 610 else if (bs.bs_bmissthreshold <= 0) 611 bs.bs_bmissthreshold = 1; 612 } 613 614 /* 615 * Calculate sleep duration. The configuration is given in ms. 616 * We ensure a multiple of the beacon period is used. Also, if the sleep 617 * duration is greater than the DTIM period then it makes senses 618 * to make it a multiple of that. 619 * 620 * XXX fixed at 100ms 621 */ 622 623 bs.bs_sleepduration = roundup(IEEE80211_MS_TO_TU(100), sleepduration); 624 if (bs.bs_sleepduration > bs.bs_dtimperiod) 625 bs.bs_sleepduration = bs.bs_dtimperiod; 626 627 /* TSF out of range threshold fixed at 1 second */ 628 bs.bs_tsfoor_threshold = ATH9K_TSFOOR_THRESHOLD; 629 630 ath_print(common, ATH_DBG_BEACON, "tsf: %llu tsftu: %u\n", tsf, tsftu); 631 ath_print(common, ATH_DBG_BEACON, 632 "bmiss: %u sleep: %u cfp-period: %u maxdur: %u next: %u\n", 633 bs.bs_bmissthreshold, bs.bs_sleepduration, 634 bs.bs_cfpperiod, bs.bs_cfpmaxduration, bs.bs_cfpnext); 635 636 /* Set the computed STA beacon timers */ 637 638 ath9k_hw_set_interrupts(ah, 0); 639 ath9k_hw_set_sta_beacon_timers(ah, &bs); 640 ah->imask |= ATH9K_INT_BMISS; 641 ath9k_hw_set_interrupts(ah, ah->imask); 642 } 643 644 static void ath_beacon_config_adhoc(struct ath_softc *sc, 645 struct ath_beacon_config *conf, 646 struct ieee80211_vif *vif) 647 { 648 struct ath_hw *ah = sc->sc_ah; 649 struct ath_common *common = ath9k_hw_common(ah); 650 u64 tsf; 651 u32 tsftu, intval, nexttbtt; 652 653 intval = conf->beacon_interval & ATH9K_BEACON_PERIOD; 654 655 656 /* Pull nexttbtt forward to reflect the current TSF */ 657 658 nexttbtt = TSF_TO_TU(sc->beacon.bc_tstamp >> 32, sc->beacon.bc_tstamp); 659 if (nexttbtt == 0) 660 nexttbtt = intval; 661 else if (intval) 662 nexttbtt = roundup(nexttbtt, intval); 663 664 tsf = ath9k_hw_gettsf64(ah); 665 tsftu = TSF_TO_TU((u32)(tsf>>32), (u32)tsf) + FUDGE; 666 do { 667 nexttbtt += intval; 668 } while (nexttbtt < tsftu); 669 670 ath_print(common, ATH_DBG_BEACON, 671 "IBSS nexttbtt %u intval %u (%u)\n", 672 nexttbtt, intval, conf->beacon_interval); 673 674 /* 675 * In IBSS mode enable the beacon timers but only enable SWBA interrupts 676 * if we need to manually prepare beacon frames. Otherwise we use a 677 * self-linked tx descriptor and let the hardware deal with things. 678 */ 679 intval |= ATH9K_BEACON_ENA; 680 ah->imask |= ATH9K_INT_SWBA; 681 682 ath_beaconq_config(sc); 683 684 /* Set the computed ADHOC beacon timers */ 685 686 ath9k_hw_set_interrupts(ah, 0); 687 ath9k_beacon_init(sc, nexttbtt, intval); 688 sc->beacon.bmisscnt = 0; 689 ath9k_hw_set_interrupts(ah, ah->imask); 690 } 691 692 void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif) 693 { 694 struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; 695 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 696 enum nl80211_iftype iftype; 697 698 /* Setup the beacon configuration parameters */ 699 if (vif) { 700 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 701 702 iftype = vif->type; 703 704 cur_conf->beacon_interval = bss_conf->beacon_int; 705 cur_conf->dtim_period = bss_conf->dtim_period; 706 cur_conf->listen_interval = 1; 707 cur_conf->dtim_count = 1; 708 cur_conf->bmiss_timeout = 709 ATH_DEFAULT_BMISS_LIMIT * cur_conf->beacon_interval; 710 } else { 711 iftype = sc->sc_ah->opmode; 712 } 713 714 /* 715 * It looks like mac80211 may end up using beacon interval of zero in 716 * some cases (at least for mesh point). Avoid getting into an 717 * infinite loop by using a bit safer value instead. To be safe, 718 * do sanity check on beacon interval for all operating modes. 719 */ 720 if (cur_conf->beacon_interval == 0) 721 cur_conf->beacon_interval = 100; 722 723 switch (iftype) { 724 case NL80211_IFTYPE_AP: 725 ath_beacon_config_ap(sc, cur_conf); 726 break; 727 case NL80211_IFTYPE_ADHOC: 728 case NL80211_IFTYPE_MESH_POINT: 729 ath_beacon_config_adhoc(sc, cur_conf, vif); 730 break; 731 case NL80211_IFTYPE_STATION: 732 ath_beacon_config_sta(sc, cur_conf); 733 break; 734 default: 735 ath_print(common, ATH_DBG_CONFIG, 736 "Unsupported beaconing mode\n"); 737 return; 738 } 739 740 sc->sc_flags |= SC_OP_BEACONS; 741 } 742