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