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