1/*
2 * Copyright 2002-2005, Instant802 Networks, Inc.
3 * Copyright 2005-2006, Devicescape Software, Inc.
4 * Copyright 2006-2007	Jiri Benc <jbenc@suse.cz>
5 * Copyright 2007	Johannes Berg <johannes@sipsolutions.net>
6 * Copyright 2013-2014  Intel Mobile Communications GmbH
7 * Copyright (C) 2015	Intel Deutschland GmbH
8 *
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
12 *
13 * utilities for mac80211
14 */
15
16#include <net/mac80211.h>
17#include <linux/netdevice.h>
18#include <linux/export.h>
19#include <linux/types.h>
20#include <linux/slab.h>
21#include <linux/skbuff.h>
22#include <linux/etherdevice.h>
23#include <linux/if_arp.h>
24#include <linux/bitmap.h>
25#include <linux/crc32.h>
26#include <net/net_namespace.h>
27#include <net/cfg80211.h>
28#include <net/rtnetlink.h>
29
30#include "ieee80211_i.h"
31#include "driver-ops.h"
32#include "rate.h"
33#include "mesh.h"
34#include "wme.h"
35#include "led.h"
36#include "wep.h"
37
38/* privid for wiphys to determine whether they belong to us or not */
39const void *const mac80211_wiphy_privid = &mac80211_wiphy_privid;
40
41struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy)
42{
43	struct ieee80211_local *local;
44	BUG_ON(!wiphy);
45
46	local = wiphy_priv(wiphy);
47	return &local->hw;
48}
49EXPORT_SYMBOL(wiphy_to_ieee80211_hw);
50
51void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
52{
53	struct sk_buff *skb;
54	struct ieee80211_hdr *hdr;
55
56	skb_queue_walk(&tx->skbs, skb) {
57		hdr = (struct ieee80211_hdr *) skb->data;
58		hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
59	}
60}
61
62int ieee80211_frame_duration(enum ieee80211_band band, size_t len,
63			     int rate, int erp, int short_preamble,
64			     int shift)
65{
66	int dur;
67
68	/* calculate duration (in microseconds, rounded up to next higher
69	 * integer if it includes a fractional microsecond) to send frame of
70	 * len bytes (does not include FCS) at the given rate. Duration will
71	 * also include SIFS.
72	 *
73	 * rate is in 100 kbps, so divident is multiplied by 10 in the
74	 * DIV_ROUND_UP() operations.
75	 *
76	 * shift may be 2 for 5 MHz channels or 1 for 10 MHz channels, and
77	 * is assumed to be 0 otherwise.
78	 */
79
80	if (band == IEEE80211_BAND_5GHZ || erp) {
81		/*
82		 * OFDM:
83		 *
84		 * N_DBPS = DATARATE x 4
85		 * N_SYM = Ceiling((16+8xLENGTH+6) / N_DBPS)
86		 *	(16 = SIGNAL time, 6 = tail bits)
87		 * TXTIME = T_PREAMBLE + T_SIGNAL + T_SYM x N_SYM + Signal Ext
88		 *
89		 * T_SYM = 4 usec
90		 * 802.11a - 18.5.2: aSIFSTime = 16 usec
91		 * 802.11g - 19.8.4: aSIFSTime = 10 usec +
92		 *	signal ext = 6 usec
93		 */
94		dur = 16; /* SIFS + signal ext */
95		dur += 16; /* IEEE 802.11-2012 18.3.2.4: T_PREAMBLE = 16 usec */
96		dur += 4; /* IEEE 802.11-2012 18.3.2.4: T_SIGNAL = 4 usec */
97
98		/* IEEE 802.11-2012 18.3.2.4: all values above are:
99		 *  * times 4 for 5 MHz
100		 *  * times 2 for 10 MHz
101		 */
102		dur *= 1 << shift;
103
104		/* rates should already consider the channel bandwidth,
105		 * don't apply divisor again.
106		 */
107		dur += 4 * DIV_ROUND_UP((16 + 8 * (len + 4) + 6) * 10,
108					4 * rate); /* T_SYM x N_SYM */
109	} else {
110		/*
111		 * 802.11b or 802.11g with 802.11b compatibility:
112		 * 18.3.4: TXTIME = PreambleLength + PLCPHeaderTime +
113		 * Ceiling(((LENGTH+PBCC)x8)/DATARATE). PBCC=0.
114		 *
115		 * 802.11 (DS): 15.3.3, 802.11b: 18.3.4
116		 * aSIFSTime = 10 usec
117		 * aPreambleLength = 144 usec or 72 usec with short preamble
118		 * aPLCPHeaderLength = 48 usec or 24 usec with short preamble
119		 */
120		dur = 10; /* aSIFSTime = 10 usec */
121		dur += short_preamble ? (72 + 24) : (144 + 48);
122
123		dur += DIV_ROUND_UP(8 * (len + 4) * 10, rate);
124	}
125
126	return dur;
127}
128
129/* Exported duration function for driver use */
130__le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
131					struct ieee80211_vif *vif,
132					enum ieee80211_band band,
133					size_t frame_len,
134					struct ieee80211_rate *rate)
135{
136	struct ieee80211_sub_if_data *sdata;
137	u16 dur;
138	int erp, shift = 0;
139	bool short_preamble = false;
140
141	erp = 0;
142	if (vif) {
143		sdata = vif_to_sdata(vif);
144		short_preamble = sdata->vif.bss_conf.use_short_preamble;
145		if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
146			erp = rate->flags & IEEE80211_RATE_ERP_G;
147		shift = ieee80211_vif_get_shift(vif);
148	}
149
150	dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp,
151				       short_preamble, shift);
152
153	return cpu_to_le16(dur);
154}
155EXPORT_SYMBOL(ieee80211_generic_frame_duration);
156
157__le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
158			      struct ieee80211_vif *vif, size_t frame_len,
159			      const struct ieee80211_tx_info *frame_txctl)
160{
161	struct ieee80211_local *local = hw_to_local(hw);
162	struct ieee80211_rate *rate;
163	struct ieee80211_sub_if_data *sdata;
164	bool short_preamble;
165	int erp, shift = 0, bitrate;
166	u16 dur;
167	struct ieee80211_supported_band *sband;
168
169	sband = local->hw.wiphy->bands[frame_txctl->band];
170
171	short_preamble = false;
172
173	rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx];
174
175	erp = 0;
176	if (vif) {
177		sdata = vif_to_sdata(vif);
178		short_preamble = sdata->vif.bss_conf.use_short_preamble;
179		if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
180			erp = rate->flags & IEEE80211_RATE_ERP_G;
181		shift = ieee80211_vif_get_shift(vif);
182	}
183
184	bitrate = DIV_ROUND_UP(rate->bitrate, 1 << shift);
185
186	/* CTS duration */
187	dur = ieee80211_frame_duration(sband->band, 10, bitrate,
188				       erp, short_preamble, shift);
189	/* Data frame duration */
190	dur += ieee80211_frame_duration(sband->band, frame_len, bitrate,
191					erp, short_preamble, shift);
192	/* ACK duration */
193	dur += ieee80211_frame_duration(sband->band, 10, bitrate,
194					erp, short_preamble, shift);
195
196	return cpu_to_le16(dur);
197}
198EXPORT_SYMBOL(ieee80211_rts_duration);
199
200__le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
201				    struct ieee80211_vif *vif,
202				    size_t frame_len,
203				    const struct ieee80211_tx_info *frame_txctl)
204{
205	struct ieee80211_local *local = hw_to_local(hw);
206	struct ieee80211_rate *rate;
207	struct ieee80211_sub_if_data *sdata;
208	bool short_preamble;
209	int erp, shift = 0, bitrate;
210	u16 dur;
211	struct ieee80211_supported_band *sband;
212
213	sband = local->hw.wiphy->bands[frame_txctl->band];
214
215	short_preamble = false;
216
217	rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx];
218	erp = 0;
219	if (vif) {
220		sdata = vif_to_sdata(vif);
221		short_preamble = sdata->vif.bss_conf.use_short_preamble;
222		if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
223			erp = rate->flags & IEEE80211_RATE_ERP_G;
224		shift = ieee80211_vif_get_shift(vif);
225	}
226
227	bitrate = DIV_ROUND_UP(rate->bitrate, 1 << shift);
228
229	/* Data frame duration */
230	dur = ieee80211_frame_duration(sband->band, frame_len, bitrate,
231				       erp, short_preamble, shift);
232	if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
233		/* ACK duration */
234		dur += ieee80211_frame_duration(sband->band, 10, bitrate,
235						erp, short_preamble, shift);
236	}
237
238	return cpu_to_le16(dur);
239}
240EXPORT_SYMBOL(ieee80211_ctstoself_duration);
241
242void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
243{
244	struct ieee80211_sub_if_data *sdata;
245	int n_acs = IEEE80211_NUM_ACS;
246
247	if (local->hw.queues < IEEE80211_NUM_ACS)
248		n_acs = 1;
249
250	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
251		int ac;
252
253		if (!sdata->dev)
254			continue;
255
256		if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE &&
257		    local->queue_stop_reasons[sdata->vif.cab_queue] != 0)
258			continue;
259
260		for (ac = 0; ac < n_acs; ac++) {
261			int ac_queue = sdata->vif.hw_queue[ac];
262
263			if (local->ops->wake_tx_queue &&
264			    (atomic_read(&sdata->txqs_len[ac]) >
265			     local->hw.txq_ac_max_pending))
266				continue;
267
268			if (ac_queue == queue ||
269			    (sdata->vif.cab_queue == queue &&
270			     local->queue_stop_reasons[ac_queue] == 0 &&
271			     skb_queue_empty(&local->pending[ac_queue])))
272				netif_wake_subqueue(sdata->dev, ac);
273		}
274	}
275}
276
277static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
278				   enum queue_stop_reason reason,
279				   bool refcounted)
280{
281	struct ieee80211_local *local = hw_to_local(hw);
282
283	trace_wake_queue(local, queue, reason);
284
285	if (WARN_ON(queue >= hw->queues))
286		return;
287
288	if (!test_bit(reason, &local->queue_stop_reasons[queue]))
289		return;
290
291	if (!refcounted)
292		local->q_stop_reasons[queue][reason] = 0;
293	else
294		local->q_stop_reasons[queue][reason]--;
295
296	if (local->q_stop_reasons[queue][reason] == 0)
297		__clear_bit(reason, &local->queue_stop_reasons[queue]);
298
299	if (local->queue_stop_reasons[queue] != 0)
300		/* someone still has this queue stopped */
301		return;
302
303	if (skb_queue_empty(&local->pending[queue])) {
304		rcu_read_lock();
305		ieee80211_propagate_queue_wake(local, queue);
306		rcu_read_unlock();
307	} else
308		tasklet_schedule(&local->tx_pending_tasklet);
309}
310
311void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
312				    enum queue_stop_reason reason,
313				    bool refcounted)
314{
315	struct ieee80211_local *local = hw_to_local(hw);
316	unsigned long flags;
317
318	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
319	__ieee80211_wake_queue(hw, queue, reason, refcounted);
320	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
321}
322
323void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue)
324{
325	ieee80211_wake_queue_by_reason(hw, queue,
326				       IEEE80211_QUEUE_STOP_REASON_DRIVER,
327				       false);
328}
329EXPORT_SYMBOL(ieee80211_wake_queue);
330
331static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue,
332				   enum queue_stop_reason reason,
333				   bool refcounted)
334{
335	struct ieee80211_local *local = hw_to_local(hw);
336	struct ieee80211_sub_if_data *sdata;
337	int n_acs = IEEE80211_NUM_ACS;
338
339	trace_stop_queue(local, queue, reason);
340
341	if (WARN_ON(queue >= hw->queues))
342		return;
343
344	if (!refcounted)
345		local->q_stop_reasons[queue][reason] = 1;
346	else
347		local->q_stop_reasons[queue][reason]++;
348
349	if (__test_and_set_bit(reason, &local->queue_stop_reasons[queue]))
350		return;
351
352	if (local->hw.queues < IEEE80211_NUM_ACS)
353		n_acs = 1;
354
355	rcu_read_lock();
356	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
357		int ac;
358
359		if (!sdata->dev)
360			continue;
361
362		for (ac = 0; ac < n_acs; ac++) {
363			if (sdata->vif.hw_queue[ac] == queue ||
364			    sdata->vif.cab_queue == queue)
365				netif_stop_subqueue(sdata->dev, ac);
366		}
367	}
368	rcu_read_unlock();
369}
370
371void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
372				    enum queue_stop_reason reason,
373				    bool refcounted)
374{
375	struct ieee80211_local *local = hw_to_local(hw);
376	unsigned long flags;
377
378	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
379	__ieee80211_stop_queue(hw, queue, reason, refcounted);
380	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
381}
382
383void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue)
384{
385	ieee80211_stop_queue_by_reason(hw, queue,
386				       IEEE80211_QUEUE_STOP_REASON_DRIVER,
387				       false);
388}
389EXPORT_SYMBOL(ieee80211_stop_queue);
390
391void ieee80211_add_pending_skb(struct ieee80211_local *local,
392			       struct sk_buff *skb)
393{
394	struct ieee80211_hw *hw = &local->hw;
395	unsigned long flags;
396	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
397	int queue = info->hw_queue;
398
399	if (WARN_ON(!info->control.vif)) {
400		ieee80211_free_txskb(&local->hw, skb);
401		return;
402	}
403
404	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
405	__ieee80211_stop_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
406			       false);
407	__skb_queue_tail(&local->pending[queue], skb);
408	__ieee80211_wake_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
409			       false);
410	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
411}
412
413void ieee80211_add_pending_skbs(struct ieee80211_local *local,
414				struct sk_buff_head *skbs)
415{
416	struct ieee80211_hw *hw = &local->hw;
417	struct sk_buff *skb;
418	unsigned long flags;
419	int queue, i;
420
421	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
422	while ((skb = skb_dequeue(skbs))) {
423		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
424
425		if (WARN_ON(!info->control.vif)) {
426			ieee80211_free_txskb(&local->hw, skb);
427			continue;
428		}
429
430		queue = info->hw_queue;
431
432		__ieee80211_stop_queue(hw, queue,
433				IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
434				false);
435
436		__skb_queue_tail(&local->pending[queue], skb);
437	}
438
439	for (i = 0; i < hw->queues; i++)
440		__ieee80211_wake_queue(hw, i,
441			IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
442			false);
443	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
444}
445
446void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
447				     unsigned long queues,
448				     enum queue_stop_reason reason,
449				     bool refcounted)
450{
451	struct ieee80211_local *local = hw_to_local(hw);
452	unsigned long flags;
453	int i;
454
455	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
456
457	for_each_set_bit(i, &queues, hw->queues)
458		__ieee80211_stop_queue(hw, i, reason, refcounted);
459
460	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
461}
462
463void ieee80211_stop_queues(struct ieee80211_hw *hw)
464{
465	ieee80211_stop_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
466					IEEE80211_QUEUE_STOP_REASON_DRIVER,
467					false);
468}
469EXPORT_SYMBOL(ieee80211_stop_queues);
470
471int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue)
472{
473	struct ieee80211_local *local = hw_to_local(hw);
474	unsigned long flags;
475	int ret;
476
477	if (WARN_ON(queue >= hw->queues))
478		return true;
479
480	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
481	ret = test_bit(IEEE80211_QUEUE_STOP_REASON_DRIVER,
482		       &local->queue_stop_reasons[queue]);
483	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
484	return ret;
485}
486EXPORT_SYMBOL(ieee80211_queue_stopped);
487
488void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
489				     unsigned long queues,
490				     enum queue_stop_reason reason,
491				     bool refcounted)
492{
493	struct ieee80211_local *local = hw_to_local(hw);
494	unsigned long flags;
495	int i;
496
497	spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
498
499	for_each_set_bit(i, &queues, hw->queues)
500		__ieee80211_wake_queue(hw, i, reason, refcounted);
501
502	spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
503}
504
505void ieee80211_wake_queues(struct ieee80211_hw *hw)
506{
507	ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
508					IEEE80211_QUEUE_STOP_REASON_DRIVER,
509					false);
510}
511EXPORT_SYMBOL(ieee80211_wake_queues);
512
513static unsigned int
514ieee80211_get_vif_queues(struct ieee80211_local *local,
515			 struct ieee80211_sub_if_data *sdata)
516{
517	unsigned int queues;
518
519	if (sdata && ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) {
520		int ac;
521
522		queues = 0;
523
524		for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
525			queues |= BIT(sdata->vif.hw_queue[ac]);
526		if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE)
527			queues |= BIT(sdata->vif.cab_queue);
528	} else {
529		/* all queues */
530		queues = BIT(local->hw.queues) - 1;
531	}
532
533	return queues;
534}
535
536void __ieee80211_flush_queues(struct ieee80211_local *local,
537			      struct ieee80211_sub_if_data *sdata,
538			      unsigned int queues, bool drop)
539{
540	if (!local->ops->flush)
541		return;
542
543	/*
544	 * If no queue was set, or if the HW doesn't support
545	 * IEEE80211_HW_QUEUE_CONTROL - flush all queues
546	 */
547	if (!queues || !ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
548		queues = ieee80211_get_vif_queues(local, sdata);
549
550	ieee80211_stop_queues_by_reason(&local->hw, queues,
551					IEEE80211_QUEUE_STOP_REASON_FLUSH,
552					false);
553
554	drv_flush(local, sdata, queues, drop);
555
556	ieee80211_wake_queues_by_reason(&local->hw, queues,
557					IEEE80211_QUEUE_STOP_REASON_FLUSH,
558					false);
559}
560
561void ieee80211_flush_queues(struct ieee80211_local *local,
562			    struct ieee80211_sub_if_data *sdata, bool drop)
563{
564	__ieee80211_flush_queues(local, sdata, 0, drop);
565}
566
567void ieee80211_stop_vif_queues(struct ieee80211_local *local,
568			       struct ieee80211_sub_if_data *sdata,
569			       enum queue_stop_reason reason)
570{
571	ieee80211_stop_queues_by_reason(&local->hw,
572					ieee80211_get_vif_queues(local, sdata),
573					reason, true);
574}
575
576void ieee80211_wake_vif_queues(struct ieee80211_local *local,
577			       struct ieee80211_sub_if_data *sdata,
578			       enum queue_stop_reason reason)
579{
580	ieee80211_wake_queues_by_reason(&local->hw,
581					ieee80211_get_vif_queues(local, sdata),
582					reason, true);
583}
584
585static void __iterate_interfaces(struct ieee80211_local *local,
586				 u32 iter_flags,
587				 void (*iterator)(void *data, u8 *mac,
588						  struct ieee80211_vif *vif),
589				 void *data)
590{
591	struct ieee80211_sub_if_data *sdata;
592	bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE;
593
594	list_for_each_entry_rcu(sdata, &local->interfaces, list) {
595		switch (sdata->vif.type) {
596		case NL80211_IFTYPE_MONITOR:
597			if (!(sdata->u.mntr_flags & MONITOR_FLAG_ACTIVE))
598				continue;
599			break;
600		case NL80211_IFTYPE_AP_VLAN:
601			continue;
602		default:
603			break;
604		}
605		if (!(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL) &&
606		    active_only && !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
607			continue;
608		if (ieee80211_sdata_running(sdata) || !active_only)
609			iterator(data, sdata->vif.addr,
610				 &sdata->vif);
611	}
612
613	sdata = rcu_dereference_check(local->monitor_sdata,
614				      lockdep_is_held(&local->iflist_mtx) ||
615				      lockdep_rtnl_is_held());
616	if (sdata &&
617	    (iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || !active_only ||
618	     sdata->flags & IEEE80211_SDATA_IN_DRIVER))
619		iterator(data, sdata->vif.addr, &sdata->vif);
620}
621
622void ieee80211_iterate_interfaces(
623	struct ieee80211_hw *hw, u32 iter_flags,
624	void (*iterator)(void *data, u8 *mac,
625			 struct ieee80211_vif *vif),
626	void *data)
627{
628	struct ieee80211_local *local = hw_to_local(hw);
629
630	mutex_lock(&local->iflist_mtx);
631	__iterate_interfaces(local, iter_flags, iterator, data);
632	mutex_unlock(&local->iflist_mtx);
633}
634EXPORT_SYMBOL_GPL(ieee80211_iterate_interfaces);
635
636void ieee80211_iterate_active_interfaces_atomic(
637	struct ieee80211_hw *hw, u32 iter_flags,
638	void (*iterator)(void *data, u8 *mac,
639			 struct ieee80211_vif *vif),
640	void *data)
641{
642	struct ieee80211_local *local = hw_to_local(hw);
643
644	rcu_read_lock();
645	__iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
646			     iterator, data);
647	rcu_read_unlock();
648}
649EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
650
651void ieee80211_iterate_active_interfaces_rtnl(
652	struct ieee80211_hw *hw, u32 iter_flags,
653	void (*iterator)(void *data, u8 *mac,
654			 struct ieee80211_vif *vif),
655	void *data)
656{
657	struct ieee80211_local *local = hw_to_local(hw);
658
659	ASSERT_RTNL();
660
661	__iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
662			     iterator, data);
663}
664EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_rtnl);
665
666static void __iterate_stations(struct ieee80211_local *local,
667			       void (*iterator)(void *data,
668						struct ieee80211_sta *sta),
669			       void *data)
670{
671	struct sta_info *sta;
672
673	list_for_each_entry_rcu(sta, &local->sta_list, list) {
674		if (!sta->uploaded)
675			continue;
676
677		iterator(data, &sta->sta);
678	}
679}
680
681void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
682			void (*iterator)(void *data,
683					 struct ieee80211_sta *sta),
684			void *data)
685{
686	struct ieee80211_local *local = hw_to_local(hw);
687
688	rcu_read_lock();
689	__iterate_stations(local, iterator, data);
690	rcu_read_unlock();
691}
692EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_atomic);
693
694struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev)
695{
696	struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
697
698	if (!ieee80211_sdata_running(sdata) ||
699	    !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
700		return NULL;
701	return &sdata->vif;
702}
703EXPORT_SYMBOL_GPL(wdev_to_ieee80211_vif);
704
705struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
706{
707	struct ieee80211_sub_if_data *sdata;
708
709	if (!vif)
710		return NULL;
711
712	sdata = vif_to_sdata(vif);
713
714	if (!ieee80211_sdata_running(sdata) ||
715	    !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
716		return NULL;
717
718	return &sdata->wdev;
719}
720EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev);
721
722/*
723 * Nothing should have been stuffed into the workqueue during
724 * the suspend->resume cycle. Since we can't check each caller
725 * of this function if we are already quiescing / suspended,
726 * check here and don't WARN since this can actually happen when
727 * the rx path (for example) is racing against __ieee80211_suspend
728 * and suspending / quiescing was set after the rx path checked
729 * them.
730 */
731static bool ieee80211_can_queue_work(struct ieee80211_local *local)
732{
733	if (local->quiescing || (local->suspended && !local->resuming)) {
734		pr_warn("queueing ieee80211 work while going to suspend\n");
735		return false;
736	}
737
738	return true;
739}
740
741void ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *work)
742{
743	struct ieee80211_local *local = hw_to_local(hw);
744
745	if (!ieee80211_can_queue_work(local))
746		return;
747
748	queue_work(local->workqueue, work);
749}
750EXPORT_SYMBOL(ieee80211_queue_work);
751
752void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
753				  struct delayed_work *dwork,
754				  unsigned long delay)
755{
756	struct ieee80211_local *local = hw_to_local(hw);
757
758	if (!ieee80211_can_queue_work(local))
759		return;
760
761	queue_delayed_work(local->workqueue, dwork, delay);
762}
763EXPORT_SYMBOL(ieee80211_queue_delayed_work);
764
765u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
766			       struct ieee802_11_elems *elems,
767			       u64 filter, u32 crc)
768{
769	size_t left = len;
770	const u8 *pos = start;
771	bool calc_crc = filter != 0;
772	DECLARE_BITMAP(seen_elems, 256);
773	const u8 *ie;
774
775	bitmap_zero(seen_elems, 256);
776	memset(elems, 0, sizeof(*elems));
777	elems->ie_start = start;
778	elems->total_len = len;
779
780	while (left >= 2) {
781		u8 id, elen;
782		bool elem_parse_failed;
783
784		id = *pos++;
785		elen = *pos++;
786		left -= 2;
787
788		if (elen > left) {
789			elems->parse_error = true;
790			break;
791		}
792
793		switch (id) {
794		case WLAN_EID_SSID:
795		case WLAN_EID_SUPP_RATES:
796		case WLAN_EID_FH_PARAMS:
797		case WLAN_EID_DS_PARAMS:
798		case WLAN_EID_CF_PARAMS:
799		case WLAN_EID_TIM:
800		case WLAN_EID_IBSS_PARAMS:
801		case WLAN_EID_CHALLENGE:
802		case WLAN_EID_RSN:
803		case WLAN_EID_ERP_INFO:
804		case WLAN_EID_EXT_SUPP_RATES:
805		case WLAN_EID_HT_CAPABILITY:
806		case WLAN_EID_HT_OPERATION:
807		case WLAN_EID_VHT_CAPABILITY:
808		case WLAN_EID_VHT_OPERATION:
809		case WLAN_EID_MESH_ID:
810		case WLAN_EID_MESH_CONFIG:
811		case WLAN_EID_PEER_MGMT:
812		case WLAN_EID_PREQ:
813		case WLAN_EID_PREP:
814		case WLAN_EID_PERR:
815		case WLAN_EID_RANN:
816		case WLAN_EID_CHANNEL_SWITCH:
817		case WLAN_EID_EXT_CHANSWITCH_ANN:
818		case WLAN_EID_COUNTRY:
819		case WLAN_EID_PWR_CONSTRAINT:
820		case WLAN_EID_TIMEOUT_INTERVAL:
821		case WLAN_EID_SECONDARY_CHANNEL_OFFSET:
822		case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
823		case WLAN_EID_CHAN_SWITCH_PARAM:
824		case WLAN_EID_EXT_CAPABILITY:
825		case WLAN_EID_CHAN_SWITCH_TIMING:
826		case WLAN_EID_LINK_ID:
827		/*
828		 * not listing WLAN_EID_CHANNEL_SWITCH_WRAPPER -- it seems possible
829		 * that if the content gets bigger it might be needed more than once
830		 */
831			if (test_bit(id, seen_elems)) {
832				elems->parse_error = true;
833				left -= elen;
834				pos += elen;
835				continue;
836			}
837			break;
838		}
839
840		if (calc_crc && id < 64 && (filter & (1ULL << id)))
841			crc = crc32_be(crc, pos - 2, elen + 2);
842
843		elem_parse_failed = false;
844
845		switch (id) {
846		case WLAN_EID_LINK_ID:
847			if (elen + 2 != sizeof(struct ieee80211_tdls_lnkie)) {
848				elem_parse_failed = true;
849				break;
850			}
851			elems->lnk_id = (void *)(pos - 2);
852			break;
853		case WLAN_EID_CHAN_SWITCH_TIMING:
854			if (elen != sizeof(struct ieee80211_ch_switch_timing)) {
855				elem_parse_failed = true;
856				break;
857			}
858			elems->ch_sw_timing = (void *)pos;
859			break;
860		case WLAN_EID_EXT_CAPABILITY:
861			elems->ext_capab = pos;
862			elems->ext_capab_len = elen;
863			break;
864		case WLAN_EID_SSID:
865			elems->ssid = pos;
866			elems->ssid_len = elen;
867			break;
868		case WLAN_EID_SUPP_RATES:
869			elems->supp_rates = pos;
870			elems->supp_rates_len = elen;
871			break;
872		case WLAN_EID_DS_PARAMS:
873			if (elen >= 1)
874				elems->ds_params = pos;
875			else
876				elem_parse_failed = true;
877			break;
878		case WLAN_EID_TIM:
879			if (elen >= sizeof(struct ieee80211_tim_ie)) {
880				elems->tim = (void *)pos;
881				elems->tim_len = elen;
882			} else
883				elem_parse_failed = true;
884			break;
885		case WLAN_EID_CHALLENGE:
886			elems->challenge = pos;
887			elems->challenge_len = elen;
888			break;
889		case WLAN_EID_VENDOR_SPECIFIC:
890			if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
891			    pos[2] == 0xf2) {
892				/* Microsoft OUI (00:50:F2) */
893
894				if (calc_crc)
895					crc = crc32_be(crc, pos - 2, elen + 2);
896
897				if (elen >= 5 && pos[3] == 2) {
898					/* OUI Type 2 - WMM IE */
899					if (pos[4] == 0) {
900						elems->wmm_info = pos;
901						elems->wmm_info_len = elen;
902					} else if (pos[4] == 1) {
903						elems->wmm_param = pos;
904						elems->wmm_param_len = elen;
905					}
906				}
907			}
908			break;
909		case WLAN_EID_RSN:
910			elems->rsn = pos;
911			elems->rsn_len = elen;
912			break;
913		case WLAN_EID_ERP_INFO:
914			if (elen >= 1)
915				elems->erp_info = pos;
916			else
917				elem_parse_failed = true;
918			break;
919		case WLAN_EID_EXT_SUPP_RATES:
920			elems->ext_supp_rates = pos;
921			elems->ext_supp_rates_len = elen;
922			break;
923		case WLAN_EID_HT_CAPABILITY:
924			if (elen >= sizeof(struct ieee80211_ht_cap))
925				elems->ht_cap_elem = (void *)pos;
926			else
927				elem_parse_failed = true;
928			break;
929		case WLAN_EID_HT_OPERATION:
930			if (elen >= sizeof(struct ieee80211_ht_operation))
931				elems->ht_operation = (void *)pos;
932			else
933				elem_parse_failed = true;
934			break;
935		case WLAN_EID_VHT_CAPABILITY:
936			if (elen >= sizeof(struct ieee80211_vht_cap))
937				elems->vht_cap_elem = (void *)pos;
938			else
939				elem_parse_failed = true;
940			break;
941		case WLAN_EID_VHT_OPERATION:
942			if (elen >= sizeof(struct ieee80211_vht_operation))
943				elems->vht_operation = (void *)pos;
944			else
945				elem_parse_failed = true;
946			break;
947		case WLAN_EID_OPMODE_NOTIF:
948			if (elen > 0)
949				elems->opmode_notif = pos;
950			else
951				elem_parse_failed = true;
952			break;
953		case WLAN_EID_MESH_ID:
954			elems->mesh_id = pos;
955			elems->mesh_id_len = elen;
956			break;
957		case WLAN_EID_MESH_CONFIG:
958			if (elen >= sizeof(struct ieee80211_meshconf_ie))
959				elems->mesh_config = (void *)pos;
960			else
961				elem_parse_failed = true;
962			break;
963		case WLAN_EID_PEER_MGMT:
964			elems->peering = pos;
965			elems->peering_len = elen;
966			break;
967		case WLAN_EID_MESH_AWAKE_WINDOW:
968			if (elen >= 2)
969				elems->awake_window = (void *)pos;
970			break;
971		case WLAN_EID_PREQ:
972			elems->preq = pos;
973			elems->preq_len = elen;
974			break;
975		case WLAN_EID_PREP:
976			elems->prep = pos;
977			elems->prep_len = elen;
978			break;
979		case WLAN_EID_PERR:
980			elems->perr = pos;
981			elems->perr_len = elen;
982			break;
983		case WLAN_EID_RANN:
984			if (elen >= sizeof(struct ieee80211_rann_ie))
985				elems->rann = (void *)pos;
986			else
987				elem_parse_failed = true;
988			break;
989		case WLAN_EID_CHANNEL_SWITCH:
990			if (elen != sizeof(struct ieee80211_channel_sw_ie)) {
991				elem_parse_failed = true;
992				break;
993			}
994			elems->ch_switch_ie = (void *)pos;
995			break;
996		case WLAN_EID_EXT_CHANSWITCH_ANN:
997			if (elen != sizeof(struct ieee80211_ext_chansw_ie)) {
998				elem_parse_failed = true;
999				break;
1000			}
1001			elems->ext_chansw_ie = (void *)pos;
1002			break;
1003		case WLAN_EID_SECONDARY_CHANNEL_OFFSET:
1004			if (elen != sizeof(struct ieee80211_sec_chan_offs_ie)) {
1005				elem_parse_failed = true;
1006				break;
1007			}
1008			elems->sec_chan_offs = (void *)pos;
1009			break;
1010		case WLAN_EID_CHAN_SWITCH_PARAM:
1011			if (elen !=
1012			    sizeof(*elems->mesh_chansw_params_ie)) {
1013				elem_parse_failed = true;
1014				break;
1015			}
1016			elems->mesh_chansw_params_ie = (void *)pos;
1017			break;
1018		case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
1019			if (!action ||
1020			    elen != sizeof(*elems->wide_bw_chansw_ie)) {
1021				elem_parse_failed = true;
1022				break;
1023			}
1024			elems->wide_bw_chansw_ie = (void *)pos;
1025			break;
1026		case WLAN_EID_CHANNEL_SWITCH_WRAPPER:
1027			if (action) {
1028				elem_parse_failed = true;
1029				break;
1030			}
1031			/*
1032			 * This is a bit tricky, but as we only care about
1033			 * the wide bandwidth channel switch element, so
1034			 * just parse it out manually.
1035			 */
1036			ie = cfg80211_find_ie(WLAN_EID_WIDE_BW_CHANNEL_SWITCH,
1037					      pos, elen);
1038			if (ie) {
1039				if (ie[1] == sizeof(*elems->wide_bw_chansw_ie))
1040					elems->wide_bw_chansw_ie =
1041						(void *)(ie + 2);
1042				else
1043					elem_parse_failed = true;
1044			}
1045			break;
1046		case WLAN_EID_COUNTRY:
1047			elems->country_elem = pos;
1048			elems->country_elem_len = elen;
1049			break;
1050		case WLAN_EID_PWR_CONSTRAINT:
1051			if (elen != 1) {
1052				elem_parse_failed = true;
1053				break;
1054			}
1055			elems->pwr_constr_elem = pos;
1056			break;
1057		case WLAN_EID_CISCO_VENDOR_SPECIFIC:
1058			/* Lots of different options exist, but we only care
1059			 * about the Dynamic Transmit Power Control element.
1060			 * First check for the Cisco OUI, then for the DTPC
1061			 * tag (0x00).
1062			 */
1063			if (elen < 4) {
1064				elem_parse_failed = true;
1065				break;
1066			}
1067
1068			if (pos[0] != 0x00 || pos[1] != 0x40 ||
1069			    pos[2] != 0x96 || pos[3] != 0x00)
1070				break;
1071
1072			if (elen != 6) {
1073				elem_parse_failed = true;
1074				break;
1075			}
1076
1077			if (calc_crc)
1078				crc = crc32_be(crc, pos - 2, elen + 2);
1079
1080			elems->cisco_dtpc_elem = pos;
1081			break;
1082		case WLAN_EID_TIMEOUT_INTERVAL:
1083			if (elen >= sizeof(struct ieee80211_timeout_interval_ie))
1084				elems->timeout_int = (void *)pos;
1085			else
1086				elem_parse_failed = true;
1087			break;
1088		default:
1089			break;
1090		}
1091
1092		if (elem_parse_failed)
1093			elems->parse_error = true;
1094		else
1095			__set_bit(id, seen_elems);
1096
1097		left -= elen;
1098		pos += elen;
1099	}
1100
1101	if (left != 0)
1102		elems->parse_error = true;
1103
1104	return crc;
1105}
1106
1107void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
1108			       bool bss_notify, bool enable_qos)
1109{
1110	struct ieee80211_local *local = sdata->local;
1111	struct ieee80211_tx_queue_params qparam;
1112	struct ieee80211_chanctx_conf *chanctx_conf;
1113	int ac;
1114	bool use_11b;
1115	bool is_ocb; /* Use another EDCA parameters if dot11OCBActivated=true */
1116	int aCWmin, aCWmax;
1117
1118	if (!local->ops->conf_tx)
1119		return;
1120
1121	if (local->hw.queues < IEEE80211_NUM_ACS)
1122		return;
1123
1124	memset(&qparam, 0, sizeof(qparam));
1125
1126	rcu_read_lock();
1127	chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
1128	use_11b = (chanctx_conf &&
1129		   chanctx_conf->def.chan->band == IEEE80211_BAND_2GHZ) &&
1130		 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE);
1131	rcu_read_unlock();
1132
1133	is_ocb = (sdata->vif.type == NL80211_IFTYPE_OCB);
1134
1135	/* Set defaults according to 802.11-2007 Table 7-37 */
1136	aCWmax = 1023;
1137	if (use_11b)
1138		aCWmin = 31;
1139	else
1140		aCWmin = 15;
1141
1142	/* Confiure old 802.11b/g medium access rules. */
1143	qparam.cw_max = aCWmax;
1144	qparam.cw_min = aCWmin;
1145	qparam.txop = 0;
1146	qparam.aifs = 2;
1147
1148	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1149		/* Update if QoS is enabled. */
1150		if (enable_qos) {
1151			switch (ac) {
1152			case IEEE80211_AC_BK:
1153				qparam.cw_max = aCWmax;
1154				qparam.cw_min = aCWmin;
1155				qparam.txop = 0;
1156				if (is_ocb)
1157					qparam.aifs = 9;
1158				else
1159					qparam.aifs = 7;
1160				break;
1161			/* never happens but let's not leave undefined */
1162			default:
1163			case IEEE80211_AC_BE:
1164				qparam.cw_max = aCWmax;
1165				qparam.cw_min = aCWmin;
1166				qparam.txop = 0;
1167				if (is_ocb)
1168					qparam.aifs = 6;
1169				else
1170					qparam.aifs = 3;
1171				break;
1172			case IEEE80211_AC_VI:
1173				qparam.cw_max = aCWmin;
1174				qparam.cw_min = (aCWmin + 1) / 2 - 1;
1175				if (is_ocb)
1176					qparam.txop = 0;
1177				else if (use_11b)
1178					qparam.txop = 6016/32;
1179				else
1180					qparam.txop = 3008/32;
1181
1182				if (is_ocb)
1183					qparam.aifs = 3;
1184				else
1185					qparam.aifs = 2;
1186				break;
1187			case IEEE80211_AC_VO:
1188				qparam.cw_max = (aCWmin + 1) / 2 - 1;
1189				qparam.cw_min = (aCWmin + 1) / 4 - 1;
1190				if (is_ocb)
1191					qparam.txop = 0;
1192				else if (use_11b)
1193					qparam.txop = 3264/32;
1194				else
1195					qparam.txop = 1504/32;
1196				qparam.aifs = 2;
1197				break;
1198			}
1199		}
1200
1201		qparam.uapsd = false;
1202
1203		sdata->tx_conf[ac] = qparam;
1204		drv_conf_tx(local, sdata, ac, &qparam);
1205	}
1206
1207	if (sdata->vif.type != NL80211_IFTYPE_MONITOR &&
1208	    sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE) {
1209		sdata->vif.bss_conf.qos = enable_qos;
1210		if (bss_notify)
1211			ieee80211_bss_info_change_notify(sdata,
1212							 BSS_CHANGED_QOS);
1213	}
1214}
1215
1216void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
1217			 u16 transaction, u16 auth_alg, u16 status,
1218			 const u8 *extra, size_t extra_len, const u8 *da,
1219			 const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx,
1220			 u32 tx_flags)
1221{
1222	struct ieee80211_local *local = sdata->local;
1223	struct sk_buff *skb;
1224	struct ieee80211_mgmt *mgmt;
1225	int err;
1226
1227	/* 24 + 6 = header + auth_algo + auth_transaction + status_code */
1228	skb = dev_alloc_skb(local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN +
1229			    24 + 6 + extra_len + IEEE80211_WEP_ICV_LEN);
1230	if (!skb)
1231		return;
1232
1233	skb_reserve(skb, local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN);
1234
1235	mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24 + 6);
1236	memset(mgmt, 0, 24 + 6);
1237	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
1238					  IEEE80211_STYPE_AUTH);
1239	memcpy(mgmt->da, da, ETH_ALEN);
1240	memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1241	memcpy(mgmt->bssid, bssid, ETH_ALEN);
1242	mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg);
1243	mgmt->u.auth.auth_transaction = cpu_to_le16(transaction);
1244	mgmt->u.auth.status_code = cpu_to_le16(status);
1245	if (extra)
1246		memcpy(skb_put(skb, extra_len), extra, extra_len);
1247
1248	if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) {
1249		mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
1250		err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx);
1251		WARN_ON(err);
1252	}
1253
1254	IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
1255					tx_flags;
1256	ieee80211_tx_skb(sdata, skb);
1257}
1258
1259void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
1260				    const u8 *bssid, u16 stype, u16 reason,
1261				    bool send_frame, u8 *frame_buf)
1262{
1263	struct ieee80211_local *local = sdata->local;
1264	struct sk_buff *skb;
1265	struct ieee80211_mgmt *mgmt = (void *)frame_buf;
1266
1267	/* build frame */
1268	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
1269	mgmt->duration = 0; /* initialize only */
1270	mgmt->seq_ctrl = 0; /* initialize only */
1271	memcpy(mgmt->da, bssid, ETH_ALEN);
1272	memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1273	memcpy(mgmt->bssid, bssid, ETH_ALEN);
1274	/* u.deauth.reason_code == u.disassoc.reason_code */
1275	mgmt->u.deauth.reason_code = cpu_to_le16(reason);
1276
1277	if (send_frame) {
1278		skb = dev_alloc_skb(local->hw.extra_tx_headroom +
1279				    IEEE80211_DEAUTH_FRAME_LEN);
1280		if (!skb)
1281			return;
1282
1283		skb_reserve(skb, local->hw.extra_tx_headroom);
1284
1285		/* copy in frame */
1286		memcpy(skb_put(skb, IEEE80211_DEAUTH_FRAME_LEN),
1287		       mgmt, IEEE80211_DEAUTH_FRAME_LEN);
1288
1289		if (sdata->vif.type != NL80211_IFTYPE_STATION ||
1290		    !(sdata->u.mgd.flags & IEEE80211_STA_MFP_ENABLED))
1291			IEEE80211_SKB_CB(skb)->flags |=
1292				IEEE80211_TX_INTFL_DONT_ENCRYPT;
1293
1294		ieee80211_tx_skb(sdata, skb);
1295	}
1296}
1297
1298static int ieee80211_build_preq_ies_band(struct ieee80211_local *local,
1299					 u8 *buffer, size_t buffer_len,
1300					 const u8 *ie, size_t ie_len,
1301					 enum ieee80211_band band,
1302					 u32 rate_mask,
1303					 struct cfg80211_chan_def *chandef,
1304					 size_t *offset)
1305{
1306	struct ieee80211_supported_band *sband;
1307	u8 *pos = buffer, *end = buffer + buffer_len;
1308	size_t noffset;
1309	int supp_rates_len, i;
1310	u8 rates[32];
1311	int num_rates;
1312	int ext_rates_len;
1313	int shift;
1314	u32 rate_flags;
1315	bool have_80mhz = false;
1316
1317	*offset = 0;
1318
1319	sband = local->hw.wiphy->bands[band];
1320	if (WARN_ON_ONCE(!sband))
1321		return 0;
1322
1323	rate_flags = ieee80211_chandef_rate_flags(chandef);
1324	shift = ieee80211_chandef_get_shift(chandef);
1325
1326	num_rates = 0;
1327	for (i = 0; i < sband->n_bitrates; i++) {
1328		if ((BIT(i) & rate_mask) == 0)
1329			continue; /* skip rate */
1330		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
1331			continue;
1332
1333		rates[num_rates++] =
1334			(u8) DIV_ROUND_UP(sband->bitrates[i].bitrate,
1335					  (1 << shift) * 5);
1336	}
1337
1338	supp_rates_len = min_t(int, num_rates, 8);
1339
1340	if (end - pos < 2 + supp_rates_len)
1341		goto out_err;
1342	*pos++ = WLAN_EID_SUPP_RATES;
1343	*pos++ = supp_rates_len;
1344	memcpy(pos, rates, supp_rates_len);
1345	pos += supp_rates_len;
1346
1347	/* insert "request information" if in custom IEs */
1348	if (ie && ie_len) {
1349		static const u8 before_extrates[] = {
1350			WLAN_EID_SSID,
1351			WLAN_EID_SUPP_RATES,
1352			WLAN_EID_REQUEST,
1353		};
1354		noffset = ieee80211_ie_split(ie, ie_len,
1355					     before_extrates,
1356					     ARRAY_SIZE(before_extrates),
1357					     *offset);
1358		if (end - pos < noffset - *offset)
1359			goto out_err;
1360		memcpy(pos, ie + *offset, noffset - *offset);
1361		pos += noffset - *offset;
1362		*offset = noffset;
1363	}
1364
1365	ext_rates_len = num_rates - supp_rates_len;
1366	if (ext_rates_len > 0) {
1367		if (end - pos < 2 + ext_rates_len)
1368			goto out_err;
1369		*pos++ = WLAN_EID_EXT_SUPP_RATES;
1370		*pos++ = ext_rates_len;
1371		memcpy(pos, rates + supp_rates_len, ext_rates_len);
1372		pos += ext_rates_len;
1373	}
1374
1375	if (chandef->chan && sband->band == IEEE80211_BAND_2GHZ) {
1376		if (end - pos < 3)
1377			goto out_err;
1378		*pos++ = WLAN_EID_DS_PARAMS;
1379		*pos++ = 1;
1380		*pos++ = ieee80211_frequency_to_channel(
1381				chandef->chan->center_freq);
1382	}
1383
1384	/* insert custom IEs that go before HT */
1385	if (ie && ie_len) {
1386		static const u8 before_ht[] = {
1387			WLAN_EID_SSID,
1388			WLAN_EID_SUPP_RATES,
1389			WLAN_EID_REQUEST,
1390			WLAN_EID_EXT_SUPP_RATES,
1391			WLAN_EID_DS_PARAMS,
1392			WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
1393		};
1394		noffset = ieee80211_ie_split(ie, ie_len,
1395					     before_ht, ARRAY_SIZE(before_ht),
1396					     *offset);
1397		if (end - pos < noffset - *offset)
1398			goto out_err;
1399		memcpy(pos, ie + *offset, noffset - *offset);
1400		pos += noffset - *offset;
1401		*offset = noffset;
1402	}
1403
1404	if (sband->ht_cap.ht_supported) {
1405		if (end - pos < 2 + sizeof(struct ieee80211_ht_cap))
1406			goto out_err;
1407		pos = ieee80211_ie_build_ht_cap(pos, &sband->ht_cap,
1408						sband->ht_cap.cap);
1409	}
1410
1411	/*
1412	 * If adding more here, adjust code in main.c
1413	 * that calculates local->scan_ies_len.
1414	 */
1415
1416	/* insert custom IEs that go before VHT */
1417	if (ie && ie_len) {
1418		static const u8 before_vht[] = {
1419			WLAN_EID_SSID,
1420			WLAN_EID_SUPP_RATES,
1421			WLAN_EID_REQUEST,
1422			WLAN_EID_EXT_SUPP_RATES,
1423			WLAN_EID_DS_PARAMS,
1424			WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
1425			WLAN_EID_HT_CAPABILITY,
1426			WLAN_EID_BSS_COEX_2040,
1427			WLAN_EID_EXT_CAPABILITY,
1428			WLAN_EID_SSID_LIST,
1429			WLAN_EID_CHANNEL_USAGE,
1430			WLAN_EID_INTERWORKING,
1431			/* mesh ID can't happen here */
1432			/* 60 GHz can't happen here right now */
1433		};
1434		noffset = ieee80211_ie_split(ie, ie_len,
1435					     before_vht, ARRAY_SIZE(before_vht),
1436					     *offset);
1437		if (end - pos < noffset - *offset)
1438			goto out_err;
1439		memcpy(pos, ie + *offset, noffset - *offset);
1440		pos += noffset - *offset;
1441		*offset = noffset;
1442	}
1443
1444	/* Check if any channel in this sband supports at least 80 MHz */
1445	for (i = 0; i < sband->n_channels; i++) {
1446		if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED |
1447						IEEE80211_CHAN_NO_80MHZ))
1448			continue;
1449
1450		have_80mhz = true;
1451		break;
1452	}
1453
1454	if (sband->vht_cap.vht_supported && have_80mhz) {
1455		if (end - pos < 2 + sizeof(struct ieee80211_vht_cap))
1456			goto out_err;
1457		pos = ieee80211_ie_build_vht_cap(pos, &sband->vht_cap,
1458						 sband->vht_cap.cap);
1459	}
1460
1461	return pos - buffer;
1462 out_err:
1463	WARN_ONCE(1, "not enough space for preq IEs\n");
1464	return pos - buffer;
1465}
1466
1467int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
1468			     size_t buffer_len,
1469			     struct ieee80211_scan_ies *ie_desc,
1470			     const u8 *ie, size_t ie_len,
1471			     u8 bands_used, u32 *rate_masks,
1472			     struct cfg80211_chan_def *chandef)
1473{
1474	size_t pos = 0, old_pos = 0, custom_ie_offset = 0;
1475	int i;
1476
1477	memset(ie_desc, 0, sizeof(*ie_desc));
1478
1479	for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
1480		if (bands_used & BIT(i)) {
1481			pos += ieee80211_build_preq_ies_band(local,
1482							     buffer + pos,
1483							     buffer_len - pos,
1484							     ie, ie_len, i,
1485							     rate_masks[i],
1486							     chandef,
1487							     &custom_ie_offset);
1488			ie_desc->ies[i] = buffer + old_pos;
1489			ie_desc->len[i] = pos - old_pos;
1490			old_pos = pos;
1491		}
1492	}
1493
1494	/* add any remaining custom IEs */
1495	if (ie && ie_len) {
1496		if (WARN_ONCE(buffer_len - pos < ie_len - custom_ie_offset,
1497			      "not enough space for preq custom IEs\n"))
1498			return pos;
1499		memcpy(buffer + pos, ie + custom_ie_offset,
1500		       ie_len - custom_ie_offset);
1501		ie_desc->common_ies = buffer + pos;
1502		ie_desc->common_ie_len = ie_len - custom_ie_offset;
1503		pos += ie_len - custom_ie_offset;
1504	}
1505
1506	return pos;
1507};
1508
1509struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
1510					  const u8 *src, const u8 *dst,
1511					  u32 ratemask,
1512					  struct ieee80211_channel *chan,
1513					  const u8 *ssid, size_t ssid_len,
1514					  const u8 *ie, size_t ie_len,
1515					  bool directed)
1516{
1517	struct ieee80211_local *local = sdata->local;
1518	struct cfg80211_chan_def chandef;
1519	struct sk_buff *skb;
1520	struct ieee80211_mgmt *mgmt;
1521	int ies_len;
1522	u32 rate_masks[IEEE80211_NUM_BANDS] = {};
1523	struct ieee80211_scan_ies dummy_ie_desc;
1524
1525	/*
1526	 * Do not send DS Channel parameter for directed probe requests
1527	 * in order to maximize the chance that we get a response.  Some
1528	 * badly-behaved APs don't respond when this parameter is included.
1529	 */
1530	chandef.width = sdata->vif.bss_conf.chandef.width;
1531	if (directed)
1532		chandef.chan = NULL;
1533	else
1534		chandef.chan = chan;
1535
1536	skb = ieee80211_probereq_get(&local->hw, src, ssid, ssid_len,
1537				     100 + ie_len);
1538	if (!skb)
1539		return NULL;
1540
1541	rate_masks[chan->band] = ratemask;
1542	ies_len = ieee80211_build_preq_ies(local, skb_tail_pointer(skb),
1543					   skb_tailroom(skb), &dummy_ie_desc,
1544					   ie, ie_len, BIT(chan->band),
1545					   rate_masks, &chandef);
1546	skb_put(skb, ies_len);
1547
1548	if (dst) {
1549		mgmt = (struct ieee80211_mgmt *) skb->data;
1550		memcpy(mgmt->da, dst, ETH_ALEN);
1551		memcpy(mgmt->bssid, dst, ETH_ALEN);
1552	}
1553
1554	IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
1555
1556	return skb;
1557}
1558
1559void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata,
1560			      const u8 *src, const u8 *dst,
1561			      const u8 *ssid, size_t ssid_len,
1562			      const u8 *ie, size_t ie_len,
1563			      u32 ratemask, bool directed, u32 tx_flags,
1564			      struct ieee80211_channel *channel, bool scan)
1565{
1566	struct sk_buff *skb;
1567
1568	skb = ieee80211_build_probe_req(sdata, src, dst, ratemask, channel,
1569					ssid, ssid_len,
1570					ie, ie_len, directed);
1571	if (skb) {
1572		IEEE80211_SKB_CB(skb)->flags |= tx_flags;
1573		if (scan)
1574			ieee80211_tx_skb_tid_band(sdata, skb, 7, channel->band);
1575		else
1576			ieee80211_tx_skb(sdata, skb);
1577	}
1578}
1579
1580u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
1581			    struct ieee802_11_elems *elems,
1582			    enum ieee80211_band band, u32 *basic_rates)
1583{
1584	struct ieee80211_supported_band *sband;
1585	size_t num_rates;
1586	u32 supp_rates, rate_flags;
1587	int i, j, shift;
1588	sband = sdata->local->hw.wiphy->bands[band];
1589
1590	rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
1591	shift = ieee80211_vif_get_shift(&sdata->vif);
1592
1593	if (WARN_ON(!sband))
1594		return 1;
1595
1596	num_rates = sband->n_bitrates;
1597	supp_rates = 0;
1598	for (i = 0; i < elems->supp_rates_len +
1599		     elems->ext_supp_rates_len; i++) {
1600		u8 rate = 0;
1601		int own_rate;
1602		bool is_basic;
1603		if (i < elems->supp_rates_len)
1604			rate = elems->supp_rates[i];
1605		else if (elems->ext_supp_rates)
1606			rate = elems->ext_supp_rates
1607				[i - elems->supp_rates_len];
1608		own_rate = 5 * (rate & 0x7f);
1609		is_basic = !!(rate & 0x80);
1610
1611		if (is_basic && (rate & 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
1612			continue;
1613
1614		for (j = 0; j < num_rates; j++) {
1615			int brate;
1616			if ((rate_flags & sband->bitrates[j].flags)
1617			    != rate_flags)
1618				continue;
1619
1620			brate = DIV_ROUND_UP(sband->bitrates[j].bitrate,
1621					     1 << shift);
1622
1623			if (brate == own_rate) {
1624				supp_rates |= BIT(j);
1625				if (basic_rates && is_basic)
1626					*basic_rates |= BIT(j);
1627			}
1628		}
1629	}
1630	return supp_rates;
1631}
1632
1633void ieee80211_stop_device(struct ieee80211_local *local)
1634{
1635	ieee80211_led_radio(local, false);
1636	ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO);
1637
1638	cancel_work_sync(&local->reconfig_filter);
1639
1640	flush_workqueue(local->workqueue);
1641	drv_stop(local);
1642}
1643
1644static void ieee80211_flush_completed_scan(struct ieee80211_local *local,
1645					   bool aborted)
1646{
1647	/* It's possible that we don't handle the scan completion in
1648	 * time during suspend, so if it's still marked as completed
1649	 * here, queue the work and flush it to clean things up.
1650	 * Instead of calling the worker function directly here, we
1651	 * really queue it to avoid potential races with other flows
1652	 * scheduling the same work.
1653	 */
1654	if (test_bit(SCAN_COMPLETED, &local->scanning)) {
1655		/* If coming from reconfiguration failure, abort the scan so
1656		 * we don't attempt to continue a partial HW scan - which is
1657		 * possible otherwise if (e.g.) the 2.4 GHz portion was the
1658		 * completed scan, and a 5 GHz portion is still pending.
1659		 */
1660		if (aborted)
1661			set_bit(SCAN_ABORTED, &local->scanning);
1662		ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
1663		flush_delayed_work(&local->scan_work);
1664	}
1665}
1666
1667static void ieee80211_handle_reconfig_failure(struct ieee80211_local *local)
1668{
1669	struct ieee80211_sub_if_data *sdata;
1670	struct ieee80211_chanctx *ctx;
1671
1672	/*
1673	 * We get here if during resume the device can't be restarted properly.
1674	 * We might also get here if this happens during HW reset, which is a
1675	 * slightly different situation and we need to drop all connections in
1676	 * the latter case.
1677	 *
1678	 * Ask cfg80211 to turn off all interfaces, this will result in more
1679	 * warnings but at least we'll then get into a clean stopped state.
1680	 */
1681
1682	local->resuming = false;
1683	local->suspended = false;
1684	local->in_reconfig = false;
1685
1686	ieee80211_flush_completed_scan(local, true);
1687
1688	/* scheduled scan clearly can't be running any more, but tell
1689	 * cfg80211 and clear local state
1690	 */
1691	ieee80211_sched_scan_end(local);
1692
1693	list_for_each_entry(sdata, &local->interfaces, list)
1694		sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER;
1695
1696	/* Mark channel contexts as not being in the driver any more to avoid
1697	 * removing them from the driver during the shutdown process...
1698	 */
1699	mutex_lock(&local->chanctx_mtx);
1700	list_for_each_entry(ctx, &local->chanctx_list, list)
1701		ctx->driver_present = false;
1702	mutex_unlock(&local->chanctx_mtx);
1703
1704	cfg80211_shutdown_all_interfaces(local->hw.wiphy);
1705}
1706
1707static void ieee80211_assign_chanctx(struct ieee80211_local *local,
1708				     struct ieee80211_sub_if_data *sdata)
1709{
1710	struct ieee80211_chanctx_conf *conf;
1711	struct ieee80211_chanctx *ctx;
1712
1713	if (!local->use_chanctx)
1714		return;
1715
1716	mutex_lock(&local->chanctx_mtx);
1717	conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
1718					 lockdep_is_held(&local->chanctx_mtx));
1719	if (conf) {
1720		ctx = container_of(conf, struct ieee80211_chanctx, conf);
1721		drv_assign_vif_chanctx(local, sdata, ctx);
1722	}
1723	mutex_unlock(&local->chanctx_mtx);
1724}
1725
1726static void ieee80211_reconfig_stations(struct ieee80211_sub_if_data *sdata)
1727{
1728	struct ieee80211_local *local = sdata->local;
1729	struct sta_info *sta;
1730
1731	/* add STAs back */
1732	mutex_lock(&local->sta_mtx);
1733	list_for_each_entry(sta, &local->sta_list, list) {
1734		enum ieee80211_sta_state state;
1735
1736		if (!sta->uploaded || sta->sdata != sdata)
1737			continue;
1738
1739		for (state = IEEE80211_STA_NOTEXIST;
1740		     state < sta->sta_state; state++)
1741			WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
1742					      state + 1));
1743	}
1744	mutex_unlock(&local->sta_mtx);
1745}
1746
1747int ieee80211_reconfig(struct ieee80211_local *local)
1748{
1749	struct ieee80211_hw *hw = &local->hw;
1750	struct ieee80211_sub_if_data *sdata;
1751	struct ieee80211_chanctx *ctx;
1752	struct sta_info *sta;
1753	int res, i;
1754	bool reconfig_due_to_wowlan = false;
1755	struct ieee80211_sub_if_data *sched_scan_sdata;
1756	struct cfg80211_sched_scan_request *sched_scan_req;
1757	bool sched_scan_stopped = false;
1758	bool suspended = local->suspended;
1759
1760	/* nothing to do if HW shouldn't run */
1761	if (!local->open_count)
1762		goto wake_up;
1763
1764#ifdef CONFIG_PM
1765	if (suspended)
1766		local->resuming = true;
1767
1768	if (local->wowlan) {
1769		/*
1770		 * In the wowlan case, both mac80211 and the device
1771		 * are functional when the resume op is called, so
1772		 * clear local->suspended so the device could operate
1773		 * normally (e.g. pass rx frames).
1774		 */
1775		local->suspended = false;
1776		res = drv_resume(local);
1777		local->wowlan = false;
1778		if (res < 0) {
1779			local->resuming = false;
1780			return res;
1781		}
1782		if (res == 0)
1783			goto wake_up;
1784		WARN_ON(res > 1);
1785		/*
1786		 * res is 1, which means the driver requested
1787		 * to go through a regular reset on wakeup.
1788		 * restore local->suspended in this case.
1789		 */
1790		reconfig_due_to_wowlan = true;
1791		local->suspended = true;
1792	}
1793#endif
1794
1795	/*
1796	 * In case of hw_restart during suspend (without wowlan),
1797	 * cancel restart work, as we are reconfiguring the device
1798	 * anyway.
1799	 * Note that restart_work is scheduled on a frozen workqueue,
1800	 * so we can't deadlock in this case.
1801	 */
1802	if (suspended && local->in_reconfig && !reconfig_due_to_wowlan)
1803		cancel_work_sync(&local->restart_work);
1804
1805	local->started = false;
1806
1807	/*
1808	 * Upon resume hardware can sometimes be goofy due to
1809	 * various platform / driver / bus issues, so restarting
1810	 * the device may at times not work immediately. Propagate
1811	 * the error.
1812	 */
1813	res = drv_start(local);
1814	if (res) {
1815		if (suspended)
1816			WARN(1, "Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue.\n");
1817		else
1818			WARN(1, "Hardware became unavailable during restart.\n");
1819		ieee80211_handle_reconfig_failure(local);
1820		return res;
1821	}
1822
1823	/* setup fragmentation threshold */
1824	drv_set_frag_threshold(local, hw->wiphy->frag_threshold);
1825
1826	/* setup RTS threshold */
1827	drv_set_rts_threshold(local, hw->wiphy->rts_threshold);
1828
1829	/* reset coverage class */
1830	drv_set_coverage_class(local, hw->wiphy->coverage_class);
1831
1832	ieee80211_led_radio(local, true);
1833	ieee80211_mod_tpt_led_trig(local,
1834				   IEEE80211_TPT_LEDTRIG_FL_RADIO, 0);
1835
1836	/* add interfaces */
1837	sdata = rtnl_dereference(local->monitor_sdata);
1838	if (sdata) {
1839		/* in HW restart it exists already */
1840		WARN_ON(local->resuming);
1841		res = drv_add_interface(local, sdata);
1842		if (WARN_ON(res)) {
1843			RCU_INIT_POINTER(local->monitor_sdata, NULL);
1844			synchronize_net();
1845			kfree(sdata);
1846		}
1847	}
1848
1849	list_for_each_entry(sdata, &local->interfaces, list) {
1850		if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
1851		    sdata->vif.type != NL80211_IFTYPE_MONITOR &&
1852		    ieee80211_sdata_running(sdata)) {
1853			res = drv_add_interface(local, sdata);
1854			if (WARN_ON(res))
1855				break;
1856		}
1857	}
1858
1859	/* If adding any of the interfaces failed above, roll back and
1860	 * report failure.
1861	 */
1862	if (res) {
1863		list_for_each_entry_continue_reverse(sdata, &local->interfaces,
1864						     list)
1865			if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
1866			    sdata->vif.type != NL80211_IFTYPE_MONITOR &&
1867			    ieee80211_sdata_running(sdata))
1868				drv_remove_interface(local, sdata);
1869		ieee80211_handle_reconfig_failure(local);
1870		return res;
1871	}
1872
1873	/* add channel contexts */
1874	if (local->use_chanctx) {
1875		mutex_lock(&local->chanctx_mtx);
1876		list_for_each_entry(ctx, &local->chanctx_list, list)
1877			if (ctx->replace_state !=
1878			    IEEE80211_CHANCTX_REPLACES_OTHER)
1879				WARN_ON(drv_add_chanctx(local, ctx));
1880		mutex_unlock(&local->chanctx_mtx);
1881
1882		sdata = rtnl_dereference(local->monitor_sdata);
1883		if (sdata && ieee80211_sdata_running(sdata))
1884			ieee80211_assign_chanctx(local, sdata);
1885	}
1886
1887	/* reconfigure hardware */
1888	ieee80211_hw_config(local, ~0);
1889
1890	ieee80211_configure_filter(local);
1891
1892	/* Finally also reconfigure all the BSS information */
1893	list_for_each_entry(sdata, &local->interfaces, list) {
1894		u32 changed;
1895
1896		if (!ieee80211_sdata_running(sdata))
1897			continue;
1898
1899		ieee80211_assign_chanctx(local, sdata);
1900
1901		switch (sdata->vif.type) {
1902		case NL80211_IFTYPE_AP_VLAN:
1903		case NL80211_IFTYPE_MONITOR:
1904			break;
1905		default:
1906			ieee80211_reconfig_stations(sdata);
1907			/* fall through */
1908		case NL80211_IFTYPE_AP: /* AP stations are handled later */
1909			for (i = 0; i < IEEE80211_NUM_ACS; i++)
1910				drv_conf_tx(local, sdata, i,
1911					    &sdata->tx_conf[i]);
1912			break;
1913		}
1914
1915		/* common change flags for all interface types */
1916		changed = BSS_CHANGED_ERP_CTS_PROT |
1917			  BSS_CHANGED_ERP_PREAMBLE |
1918			  BSS_CHANGED_ERP_SLOT |
1919			  BSS_CHANGED_HT |
1920			  BSS_CHANGED_BASIC_RATES |
1921			  BSS_CHANGED_BEACON_INT |
1922			  BSS_CHANGED_BSSID |
1923			  BSS_CHANGED_CQM |
1924			  BSS_CHANGED_QOS |
1925			  BSS_CHANGED_IDLE |
1926			  BSS_CHANGED_TXPOWER;
1927
1928		switch (sdata->vif.type) {
1929		case NL80211_IFTYPE_STATION:
1930			changed |= BSS_CHANGED_ASSOC |
1931				   BSS_CHANGED_ARP_FILTER |
1932				   BSS_CHANGED_PS;
1933
1934			/* Re-send beacon info report to the driver */
1935			if (sdata->u.mgd.have_beacon)
1936				changed |= BSS_CHANGED_BEACON_INFO;
1937
1938			sdata_lock(sdata);
1939			ieee80211_bss_info_change_notify(sdata, changed);
1940			sdata_unlock(sdata);
1941			break;
1942		case NL80211_IFTYPE_OCB:
1943			changed |= BSS_CHANGED_OCB;
1944			ieee80211_bss_info_change_notify(sdata, changed);
1945			break;
1946		case NL80211_IFTYPE_ADHOC:
1947			changed |= BSS_CHANGED_IBSS;
1948			/* fall through */
1949		case NL80211_IFTYPE_AP:
1950			changed |= BSS_CHANGED_SSID | BSS_CHANGED_P2P_PS;
1951
1952			if (sdata->vif.type == NL80211_IFTYPE_AP) {
1953				changed |= BSS_CHANGED_AP_PROBE_RESP;
1954
1955				if (rcu_access_pointer(sdata->u.ap.beacon))
1956					drv_start_ap(local, sdata);
1957			}
1958
1959			/* fall through */
1960		case NL80211_IFTYPE_MESH_POINT:
1961			if (sdata->vif.bss_conf.enable_beacon) {
1962				changed |= BSS_CHANGED_BEACON |
1963					   BSS_CHANGED_BEACON_ENABLED;
1964				ieee80211_bss_info_change_notify(sdata, changed);
1965			}
1966			break;
1967		case NL80211_IFTYPE_WDS:
1968		case NL80211_IFTYPE_AP_VLAN:
1969		case NL80211_IFTYPE_MONITOR:
1970		case NL80211_IFTYPE_P2P_DEVICE:
1971			/* nothing to do */
1972			break;
1973		case NL80211_IFTYPE_UNSPECIFIED:
1974		case NUM_NL80211_IFTYPES:
1975		case NL80211_IFTYPE_P2P_CLIENT:
1976		case NL80211_IFTYPE_P2P_GO:
1977			WARN_ON(1);
1978			break;
1979		}
1980	}
1981
1982	ieee80211_recalc_ps(local);
1983
1984	/*
1985	 * The sta might be in psm against the ap (e.g. because
1986	 * this was the state before a hw restart), so we
1987	 * explicitly send a null packet in order to make sure
1988	 * it'll sync against the ap (and get out of psm).
1989	 */
1990	if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) {
1991		list_for_each_entry(sdata, &local->interfaces, list) {
1992			if (sdata->vif.type != NL80211_IFTYPE_STATION)
1993				continue;
1994			if (!sdata->u.mgd.associated)
1995				continue;
1996
1997			ieee80211_send_nullfunc(local, sdata, false);
1998		}
1999	}
2000
2001	/* APs are now beaconing, add back stations */
2002	mutex_lock(&local->sta_mtx);
2003	list_for_each_entry(sta, &local->sta_list, list) {
2004		enum ieee80211_sta_state state;
2005
2006		if (!sta->uploaded)
2007			continue;
2008
2009		if (sta->sdata->vif.type != NL80211_IFTYPE_AP)
2010			continue;
2011
2012		for (state = IEEE80211_STA_NOTEXIST;
2013		     state < sta->sta_state; state++)
2014			WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
2015					      state + 1));
2016	}
2017	mutex_unlock(&local->sta_mtx);
2018
2019	/* add back keys */
2020	list_for_each_entry(sdata, &local->interfaces, list)
2021		ieee80211_reset_crypto_tx_tailroom(sdata);
2022
2023	list_for_each_entry(sdata, &local->interfaces, list)
2024		if (ieee80211_sdata_running(sdata))
2025			ieee80211_enable_keys(sdata);
2026
2027	/* Reconfigure sched scan if it was interrupted by FW restart */
2028	mutex_lock(&local->mtx);
2029	sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata,
2030						lockdep_is_held(&local->mtx));
2031	sched_scan_req = rcu_dereference_protected(local->sched_scan_req,
2032						lockdep_is_held(&local->mtx));
2033	if (sched_scan_sdata && sched_scan_req)
2034		/*
2035		 * Sched scan stopped, but we don't want to report it. Instead,
2036		 * we're trying to reschedule. However, if more than one scan
2037		 * plan was set, we cannot reschedule since we don't know which
2038		 * scan plan was currently running (and some scan plans may have
2039		 * already finished).
2040		 */
2041		if (sched_scan_req->n_scan_plans > 1 ||
2042		    __ieee80211_request_sched_scan_start(sched_scan_sdata,
2043							 sched_scan_req))
2044			sched_scan_stopped = true;
2045	mutex_unlock(&local->mtx);
2046
2047	if (sched_scan_stopped)
2048		cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy);
2049
2050 wake_up:
2051	local->in_reconfig = false;
2052	barrier();
2053
2054	if (local->monitors == local->open_count && local->monitors > 0)
2055		ieee80211_add_virtual_monitor(local);
2056
2057	/*
2058	 * Clear the WLAN_STA_BLOCK_BA flag so new aggregation
2059	 * sessions can be established after a resume.
2060	 *
2061	 * Also tear down aggregation sessions since reconfiguring
2062	 * them in a hardware restart scenario is not easily done
2063	 * right now, and the hardware will have lost information
2064	 * about the sessions, but we and the AP still think they
2065	 * are active. This is really a workaround though.
2066	 */
2067	if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) {
2068		mutex_lock(&local->sta_mtx);
2069
2070		list_for_each_entry(sta, &local->sta_list, list) {
2071			if (!local->resuming)
2072				ieee80211_sta_tear_down_BA_sessions(
2073						sta, AGG_STOP_LOCAL_REQUEST);
2074			clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
2075		}
2076
2077		mutex_unlock(&local->sta_mtx);
2078	}
2079
2080	ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
2081					IEEE80211_QUEUE_STOP_REASON_SUSPEND,
2082					false);
2083
2084	/*
2085	 * If this is for hw restart things are still running.
2086	 * We may want to change that later, however.
2087	 */
2088	if (local->open_count && (!suspended || reconfig_due_to_wowlan))
2089		drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_RESTART);
2090
2091	if (!suspended)
2092		return 0;
2093
2094#ifdef CONFIG_PM
2095	/* first set suspended false, then resuming */
2096	local->suspended = false;
2097	mb();
2098	local->resuming = false;
2099
2100	ieee80211_flush_completed_scan(local, false);
2101
2102	if (local->open_count && !reconfig_due_to_wowlan)
2103		drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_SUSPEND);
2104
2105	list_for_each_entry(sdata, &local->interfaces, list) {
2106		if (!ieee80211_sdata_running(sdata))
2107			continue;
2108		if (sdata->vif.type == NL80211_IFTYPE_STATION)
2109			ieee80211_sta_restart(sdata);
2110	}
2111
2112	mod_timer(&local->sta_cleanup, jiffies + 1);
2113#else
2114	WARN_ON(1);
2115#endif
2116
2117	return 0;
2118}
2119
2120void ieee80211_resume_disconnect(struct ieee80211_vif *vif)
2121{
2122	struct ieee80211_sub_if_data *sdata;
2123	struct ieee80211_local *local;
2124	struct ieee80211_key *key;
2125
2126	if (WARN_ON(!vif))
2127		return;
2128
2129	sdata = vif_to_sdata(vif);
2130	local = sdata->local;
2131
2132	if (WARN_ON(!local->resuming))
2133		return;
2134
2135	if (WARN_ON(vif->type != NL80211_IFTYPE_STATION))
2136		return;
2137
2138	sdata->flags |= IEEE80211_SDATA_DISCONNECT_RESUME;
2139
2140	mutex_lock(&local->key_mtx);
2141	list_for_each_entry(key, &sdata->key_list, list)
2142		key->flags |= KEY_FLAG_TAINTED;
2143	mutex_unlock(&local->key_mtx);
2144}
2145EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect);
2146
2147void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata)
2148{
2149	struct ieee80211_local *local = sdata->local;
2150	struct ieee80211_chanctx_conf *chanctx_conf;
2151	struct ieee80211_chanctx *chanctx;
2152
2153	mutex_lock(&local->chanctx_mtx);
2154
2155	chanctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2156					lockdep_is_held(&local->chanctx_mtx));
2157
2158	/*
2159	 * This function can be called from a work, thus it may be possible
2160	 * that the chanctx_conf is removed (due to a disconnection, for
2161	 * example).
2162	 * So nothing should be done in such case.
2163	 */
2164	if (!chanctx_conf)
2165		goto unlock;
2166
2167	chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
2168	ieee80211_recalc_smps_chanctx(local, chanctx);
2169 unlock:
2170	mutex_unlock(&local->chanctx_mtx);
2171}
2172
2173void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata)
2174{
2175	struct ieee80211_local *local = sdata->local;
2176	struct ieee80211_chanctx_conf *chanctx_conf;
2177	struct ieee80211_chanctx *chanctx;
2178
2179	mutex_lock(&local->chanctx_mtx);
2180
2181	chanctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2182					lockdep_is_held(&local->chanctx_mtx));
2183
2184	if (WARN_ON_ONCE(!chanctx_conf))
2185		goto unlock;
2186
2187	chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
2188	ieee80211_recalc_chanctx_min_def(local, chanctx);
2189 unlock:
2190	mutex_unlock(&local->chanctx_mtx);
2191}
2192
2193size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset)
2194{
2195	size_t pos = offset;
2196
2197	while (pos < ielen && ies[pos] != WLAN_EID_VENDOR_SPECIFIC)
2198		pos += 2 + ies[pos + 1];
2199
2200	return pos;
2201}
2202
2203static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata,
2204					    int rssi_min_thold,
2205					    int rssi_max_thold)
2206{
2207	trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold);
2208
2209	if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
2210		return;
2211
2212	/*
2213	 * Scale up threshold values before storing it, as the RSSI averaging
2214	 * algorithm uses a scaled up value as well. Change this scaling
2215	 * factor if the RSSI averaging algorithm changes.
2216	 */
2217	sdata->u.mgd.rssi_min_thold = rssi_min_thold*16;
2218	sdata->u.mgd.rssi_max_thold = rssi_max_thold*16;
2219}
2220
2221void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif,
2222				    int rssi_min_thold,
2223				    int rssi_max_thold)
2224{
2225	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2226
2227	WARN_ON(rssi_min_thold == rssi_max_thold ||
2228		rssi_min_thold > rssi_max_thold);
2229
2230	_ieee80211_enable_rssi_reports(sdata, rssi_min_thold,
2231				       rssi_max_thold);
2232}
2233EXPORT_SYMBOL(ieee80211_enable_rssi_reports);
2234
2235void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif)
2236{
2237	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2238
2239	_ieee80211_enable_rssi_reports(sdata, 0, 0);
2240}
2241EXPORT_SYMBOL(ieee80211_disable_rssi_reports);
2242
2243u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
2244			      u16 cap)
2245{
2246	__le16 tmp;
2247
2248	*pos++ = WLAN_EID_HT_CAPABILITY;
2249	*pos++ = sizeof(struct ieee80211_ht_cap);
2250	memset(pos, 0, sizeof(struct ieee80211_ht_cap));
2251
2252	/* capability flags */
2253	tmp = cpu_to_le16(cap);
2254	memcpy(pos, &tmp, sizeof(u16));
2255	pos += sizeof(u16);
2256
2257	/* AMPDU parameters */
2258	*pos++ = ht_cap->ampdu_factor |
2259		 (ht_cap->ampdu_density <<
2260			IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
2261
2262	/* MCS set */
2263	memcpy(pos, &ht_cap->mcs, sizeof(ht_cap->mcs));
2264	pos += sizeof(ht_cap->mcs);
2265
2266	/* extended capabilities */
2267	pos += sizeof(__le16);
2268
2269	/* BF capabilities */
2270	pos += sizeof(__le32);
2271
2272	/* antenna selection */
2273	pos += sizeof(u8);
2274
2275	return pos;
2276}
2277
2278u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
2279			       u32 cap)
2280{
2281	__le32 tmp;
2282
2283	*pos++ = WLAN_EID_VHT_CAPABILITY;
2284	*pos++ = sizeof(struct ieee80211_vht_cap);
2285	memset(pos, 0, sizeof(struct ieee80211_vht_cap));
2286
2287	/* capability flags */
2288	tmp = cpu_to_le32(cap);
2289	memcpy(pos, &tmp, sizeof(u32));
2290	pos += sizeof(u32);
2291
2292	/* VHT MCS set */
2293	memcpy(pos, &vht_cap->vht_mcs, sizeof(vht_cap->vht_mcs));
2294	pos += sizeof(vht_cap->vht_mcs);
2295
2296	return pos;
2297}
2298
2299u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
2300			       const struct cfg80211_chan_def *chandef,
2301			       u16 prot_mode, bool rifs_mode)
2302{
2303	struct ieee80211_ht_operation *ht_oper;
2304	/* Build HT Information */
2305	*pos++ = WLAN_EID_HT_OPERATION;
2306	*pos++ = sizeof(struct ieee80211_ht_operation);
2307	ht_oper = (struct ieee80211_ht_operation *)pos;
2308	ht_oper->primary_chan = ieee80211_frequency_to_channel(
2309					chandef->chan->center_freq);
2310	switch (chandef->width) {
2311	case NL80211_CHAN_WIDTH_160:
2312	case NL80211_CHAN_WIDTH_80P80:
2313	case NL80211_CHAN_WIDTH_80:
2314	case NL80211_CHAN_WIDTH_40:
2315		if (chandef->center_freq1 > chandef->chan->center_freq)
2316			ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
2317		else
2318			ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
2319		break;
2320	default:
2321		ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
2322		break;
2323	}
2324	if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 &&
2325	    chandef->width != NL80211_CHAN_WIDTH_20_NOHT &&
2326	    chandef->width != NL80211_CHAN_WIDTH_20)
2327		ht_oper->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
2328
2329	if (rifs_mode)
2330		ht_oper->ht_param |= IEEE80211_HT_PARAM_RIFS_MODE;
2331
2332	ht_oper->operation_mode = cpu_to_le16(prot_mode);
2333	ht_oper->stbc_param = 0x0000;
2334
2335	/* It seems that Basic MCS set and Supported MCS set
2336	   are identical for the first 10 bytes */
2337	memset(&ht_oper->basic_set, 0, 16);
2338	memcpy(&ht_oper->basic_set, &ht_cap->mcs, 10);
2339
2340	return pos + sizeof(struct ieee80211_ht_operation);
2341}
2342
2343u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
2344				const struct cfg80211_chan_def *chandef)
2345{
2346	struct ieee80211_vht_operation *vht_oper;
2347
2348	*pos++ = WLAN_EID_VHT_OPERATION;
2349	*pos++ = sizeof(struct ieee80211_vht_operation);
2350	vht_oper = (struct ieee80211_vht_operation *)pos;
2351	vht_oper->center_freq_seg1_idx = ieee80211_frequency_to_channel(
2352							chandef->center_freq1);
2353	if (chandef->center_freq2)
2354		vht_oper->center_freq_seg2_idx =
2355			ieee80211_frequency_to_channel(chandef->center_freq2);
2356	else
2357		vht_oper->center_freq_seg2_idx = 0x00;
2358
2359	switch (chandef->width) {
2360	case NL80211_CHAN_WIDTH_160:
2361		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_160MHZ;
2362		break;
2363	case NL80211_CHAN_WIDTH_80P80:
2364		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80P80MHZ;
2365		break;
2366	case NL80211_CHAN_WIDTH_80:
2367		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
2368		break;
2369	default:
2370		vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_USE_HT;
2371		break;
2372	}
2373
2374	/* don't require special VHT peer rates */
2375	vht_oper->basic_mcs_set = cpu_to_le16(0xffff);
2376
2377	return pos + sizeof(struct ieee80211_vht_operation);
2378}
2379
2380void ieee80211_ht_oper_to_chandef(struct ieee80211_channel *control_chan,
2381				  const struct ieee80211_ht_operation *ht_oper,
2382				  struct cfg80211_chan_def *chandef)
2383{
2384	enum nl80211_channel_type channel_type;
2385
2386	if (!ht_oper) {
2387		cfg80211_chandef_create(chandef, control_chan,
2388					NL80211_CHAN_NO_HT);
2389		return;
2390	}
2391
2392	switch (ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
2393	case IEEE80211_HT_PARAM_CHA_SEC_NONE:
2394		channel_type = NL80211_CHAN_HT20;
2395		break;
2396	case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
2397		channel_type = NL80211_CHAN_HT40PLUS;
2398		break;
2399	case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
2400		channel_type = NL80211_CHAN_HT40MINUS;
2401		break;
2402	default:
2403		channel_type = NL80211_CHAN_NO_HT;
2404	}
2405
2406	cfg80211_chandef_create(chandef, control_chan, channel_type);
2407}
2408
2409void ieee80211_vht_oper_to_chandef(struct ieee80211_channel *control_chan,
2410				   const struct ieee80211_vht_operation *oper,
2411				   struct cfg80211_chan_def *chandef)
2412{
2413	if (!oper)
2414		return;
2415
2416	chandef->chan = control_chan;
2417
2418	switch (oper->chan_width) {
2419	case IEEE80211_VHT_CHANWIDTH_USE_HT:
2420		break;
2421	case IEEE80211_VHT_CHANWIDTH_80MHZ:
2422		chandef->width = NL80211_CHAN_WIDTH_80;
2423		break;
2424	case IEEE80211_VHT_CHANWIDTH_160MHZ:
2425		chandef->width = NL80211_CHAN_WIDTH_160;
2426		break;
2427	case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
2428		chandef->width = NL80211_CHAN_WIDTH_80P80;
2429		break;
2430	default:
2431		break;
2432	}
2433
2434	chandef->center_freq1 =
2435		ieee80211_channel_to_frequency(oper->center_freq_seg1_idx,
2436					       control_chan->band);
2437	chandef->center_freq2 =
2438		ieee80211_channel_to_frequency(oper->center_freq_seg2_idx,
2439					       control_chan->band);
2440}
2441
2442int ieee80211_parse_bitrates(struct cfg80211_chan_def *chandef,
2443			     const struct ieee80211_supported_band *sband,
2444			     const u8 *srates, int srates_len, u32 *rates)
2445{
2446	u32 rate_flags = ieee80211_chandef_rate_flags(chandef);
2447	int shift = ieee80211_chandef_get_shift(chandef);
2448	struct ieee80211_rate *br;
2449	int brate, rate, i, j, count = 0;
2450
2451	*rates = 0;
2452
2453	for (i = 0; i < srates_len; i++) {
2454		rate = srates[i] & 0x7f;
2455
2456		for (j = 0; j < sband->n_bitrates; j++) {
2457			br = &sband->bitrates[j];
2458			if ((rate_flags & br->flags) != rate_flags)
2459				continue;
2460
2461			brate = DIV_ROUND_UP(br->bitrate, (1 << shift) * 5);
2462			if (brate == rate) {
2463				*rates |= BIT(j);
2464				count++;
2465				break;
2466			}
2467		}
2468	}
2469	return count;
2470}
2471
2472int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
2473			    struct sk_buff *skb, bool need_basic,
2474			    enum ieee80211_band band)
2475{
2476	struct ieee80211_local *local = sdata->local;
2477	struct ieee80211_supported_band *sband;
2478	int rate, shift;
2479	u8 i, rates, *pos;
2480	u32 basic_rates = sdata->vif.bss_conf.basic_rates;
2481	u32 rate_flags;
2482
2483	shift = ieee80211_vif_get_shift(&sdata->vif);
2484	rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
2485	sband = local->hw.wiphy->bands[band];
2486	rates = 0;
2487	for (i = 0; i < sband->n_bitrates; i++) {
2488		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
2489			continue;
2490		rates++;
2491	}
2492	if (rates > 8)
2493		rates = 8;
2494
2495	if (skb_tailroom(skb) < rates + 2)
2496		return -ENOMEM;
2497
2498	pos = skb_put(skb, rates + 2);
2499	*pos++ = WLAN_EID_SUPP_RATES;
2500	*pos++ = rates;
2501	for (i = 0; i < rates; i++) {
2502		u8 basic = 0;
2503		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
2504			continue;
2505
2506		if (need_basic && basic_rates & BIT(i))
2507			basic = 0x80;
2508		rate = sband->bitrates[i].bitrate;
2509		rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
2510				    5 * (1 << shift));
2511		*pos++ = basic | (u8) rate;
2512	}
2513
2514	return 0;
2515}
2516
2517int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
2518				struct sk_buff *skb, bool need_basic,
2519				enum ieee80211_band band)
2520{
2521	struct ieee80211_local *local = sdata->local;
2522	struct ieee80211_supported_band *sband;
2523	int rate, shift;
2524	u8 i, exrates, *pos;
2525	u32 basic_rates = sdata->vif.bss_conf.basic_rates;
2526	u32 rate_flags;
2527
2528	rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
2529	shift = ieee80211_vif_get_shift(&sdata->vif);
2530
2531	sband = local->hw.wiphy->bands[band];
2532	exrates = 0;
2533	for (i = 0; i < sband->n_bitrates; i++) {
2534		if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
2535			continue;
2536		exrates++;
2537	}
2538
2539	if (exrates > 8)
2540		exrates -= 8;
2541	else
2542		exrates = 0;
2543
2544	if (skb_tailroom(skb) < exrates + 2)
2545		return -ENOMEM;
2546
2547	if (exrates) {
2548		pos = skb_put(skb, exrates + 2);
2549		*pos++ = WLAN_EID_EXT_SUPP_RATES;
2550		*pos++ = exrates;
2551		for (i = 8; i < sband->n_bitrates; i++) {
2552			u8 basic = 0;
2553			if ((rate_flags & sband->bitrates[i].flags)
2554			    != rate_flags)
2555				continue;
2556			if (need_basic && basic_rates & BIT(i))
2557				basic = 0x80;
2558			rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
2559					    5 * (1 << shift));
2560			*pos++ = basic | (u8) rate;
2561		}
2562	}
2563	return 0;
2564}
2565
2566int ieee80211_ave_rssi(struct ieee80211_vif *vif)
2567{
2568	struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2569	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2570
2571	if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) {
2572		/* non-managed type inferfaces */
2573		return 0;
2574	}
2575	return -ewma_beacon_signal_read(&ifmgd->ave_beacon_signal);
2576}
2577EXPORT_SYMBOL_GPL(ieee80211_ave_rssi);
2578
2579u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs)
2580{
2581	if (!mcs)
2582		return 1;
2583
2584	/* TODO: consider rx_highest */
2585
2586	if (mcs->rx_mask[3])
2587		return 4;
2588	if (mcs->rx_mask[2])
2589		return 3;
2590	if (mcs->rx_mask[1])
2591		return 2;
2592	return 1;
2593}
2594
2595/**
2596 * ieee80211_calculate_rx_timestamp - calculate timestamp in frame
2597 * @local: mac80211 hw info struct
2598 * @status: RX status
2599 * @mpdu_len: total MPDU length (including FCS)
2600 * @mpdu_offset: offset into MPDU to calculate timestamp at
2601 *
2602 * This function calculates the RX timestamp at the given MPDU offset, taking
2603 * into account what the RX timestamp was. An offset of 0 will just normalize
2604 * the timestamp to TSF at beginning of MPDU reception.
2605 */
2606u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
2607				     struct ieee80211_rx_status *status,
2608				     unsigned int mpdu_len,
2609				     unsigned int mpdu_offset)
2610{
2611	u64 ts = status->mactime;
2612	struct rate_info ri;
2613	u16 rate;
2614
2615	if (WARN_ON(!ieee80211_have_rx_timestamp(status)))
2616		return 0;
2617
2618	memset(&ri, 0, sizeof(ri));
2619
2620	/* Fill cfg80211 rate info */
2621	if (status->flag & RX_FLAG_HT) {
2622		ri.mcs = status->rate_idx;
2623		ri.flags |= RATE_INFO_FLAGS_MCS;
2624		if (status->flag & RX_FLAG_40MHZ)
2625			ri.bw = RATE_INFO_BW_40;
2626		else
2627			ri.bw = RATE_INFO_BW_20;
2628		if (status->flag & RX_FLAG_SHORT_GI)
2629			ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
2630	} else if (status->flag & RX_FLAG_VHT) {
2631		ri.flags |= RATE_INFO_FLAGS_VHT_MCS;
2632		ri.mcs = status->rate_idx;
2633		ri.nss = status->vht_nss;
2634		if (status->flag & RX_FLAG_40MHZ)
2635			ri.bw = RATE_INFO_BW_40;
2636		else if (status->vht_flag & RX_VHT_FLAG_80MHZ)
2637			ri.bw = RATE_INFO_BW_80;
2638		else if (status->vht_flag & RX_VHT_FLAG_160MHZ)
2639			ri.bw = RATE_INFO_BW_160;
2640		else
2641			ri.bw = RATE_INFO_BW_20;
2642		if (status->flag & RX_FLAG_SHORT_GI)
2643			ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
2644	} else {
2645		struct ieee80211_supported_band *sband;
2646		int shift = 0;
2647		int bitrate;
2648
2649		if (status->flag & RX_FLAG_10MHZ) {
2650			shift = 1;
2651			ri.bw = RATE_INFO_BW_10;
2652		} else if (status->flag & RX_FLAG_5MHZ) {
2653			shift = 2;
2654			ri.bw = RATE_INFO_BW_5;
2655		} else {
2656			ri.bw = RATE_INFO_BW_20;
2657		}
2658
2659		sband = local->hw.wiphy->bands[status->band];
2660		bitrate = sband->bitrates[status->rate_idx].bitrate;
2661		ri.legacy = DIV_ROUND_UP(bitrate, (1 << shift));
2662	}
2663
2664	rate = cfg80211_calculate_bitrate(&ri);
2665	if (WARN_ONCE(!rate,
2666		      "Invalid bitrate: flags=0x%x, idx=%d, vht_nss=%d\n",
2667		      status->flag, status->rate_idx, status->vht_nss))
2668		return 0;
2669
2670	/* rewind from end of MPDU */
2671	if (status->flag & RX_FLAG_MACTIME_END)
2672		ts -= mpdu_len * 8 * 10 / rate;
2673
2674	ts += mpdu_offset * 8 * 10 / rate;
2675
2676	return ts;
2677}
2678
2679void ieee80211_dfs_cac_cancel(struct ieee80211_local *local)
2680{
2681	struct ieee80211_sub_if_data *sdata;
2682	struct cfg80211_chan_def chandef;
2683
2684	mutex_lock(&local->mtx);
2685	mutex_lock(&local->iflist_mtx);
2686	list_for_each_entry(sdata, &local->interfaces, list) {
2687		/* it might be waiting for the local->mtx, but then
2688		 * by the time it gets it, sdata->wdev.cac_started
2689		 * will no longer be true
2690		 */
2691		cancel_delayed_work(&sdata->dfs_cac_timer_work);
2692
2693		if (sdata->wdev.cac_started) {
2694			chandef = sdata->vif.bss_conf.chandef;
2695			ieee80211_vif_release_channel(sdata);
2696			cfg80211_cac_event(sdata->dev,
2697					   &chandef,
2698					   NL80211_RADAR_CAC_ABORTED,
2699					   GFP_KERNEL);
2700		}
2701	}
2702	mutex_unlock(&local->iflist_mtx);
2703	mutex_unlock(&local->mtx);
2704}
2705
2706void ieee80211_dfs_radar_detected_work(struct work_struct *work)
2707{
2708	struct ieee80211_local *local =
2709		container_of(work, struct ieee80211_local, radar_detected_work);
2710	struct cfg80211_chan_def chandef = local->hw.conf.chandef;
2711	struct ieee80211_chanctx *ctx;
2712	int num_chanctx = 0;
2713
2714	mutex_lock(&local->chanctx_mtx);
2715	list_for_each_entry(ctx, &local->chanctx_list, list) {
2716		if (ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER)
2717			continue;
2718
2719		num_chanctx++;
2720		chandef = ctx->conf.def;
2721	}
2722	mutex_unlock(&local->chanctx_mtx);
2723
2724	ieee80211_dfs_cac_cancel(local);
2725
2726	if (num_chanctx > 1)
2727		/* XXX: multi-channel is not supported yet */
2728		WARN_ON(1);
2729	else
2730		cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL);
2731}
2732
2733void ieee80211_radar_detected(struct ieee80211_hw *hw)
2734{
2735	struct ieee80211_local *local = hw_to_local(hw);
2736
2737	trace_api_radar_detected(local);
2738
2739	ieee80211_queue_work(hw, &local->radar_detected_work);
2740}
2741EXPORT_SYMBOL(ieee80211_radar_detected);
2742
2743u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c)
2744{
2745	u32 ret;
2746	int tmp;
2747
2748	switch (c->width) {
2749	case NL80211_CHAN_WIDTH_20:
2750		c->width = NL80211_CHAN_WIDTH_20_NOHT;
2751		ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
2752		break;
2753	case NL80211_CHAN_WIDTH_40:
2754		c->width = NL80211_CHAN_WIDTH_20;
2755		c->center_freq1 = c->chan->center_freq;
2756		ret = IEEE80211_STA_DISABLE_40MHZ |
2757		      IEEE80211_STA_DISABLE_VHT;
2758		break;
2759	case NL80211_CHAN_WIDTH_80:
2760		tmp = (30 + c->chan->center_freq - c->center_freq1)/20;
2761		/* n_P40 */
2762		tmp /= 2;
2763		/* freq_P40 */
2764		c->center_freq1 = c->center_freq1 - 20 + 40 * tmp;
2765		c->width = NL80211_CHAN_WIDTH_40;
2766		ret = IEEE80211_STA_DISABLE_VHT;
2767		break;
2768	case NL80211_CHAN_WIDTH_80P80:
2769		c->center_freq2 = 0;
2770		c->width = NL80211_CHAN_WIDTH_80;
2771		ret = IEEE80211_STA_DISABLE_80P80MHZ |
2772		      IEEE80211_STA_DISABLE_160MHZ;
2773		break;
2774	case NL80211_CHAN_WIDTH_160:
2775		/* n_P20 */
2776		tmp = (70 + c->chan->center_freq - c->center_freq1)/20;
2777		/* n_P80 */
2778		tmp /= 4;
2779		c->center_freq1 = c->center_freq1 - 40 + 80 * tmp;
2780		c->width = NL80211_CHAN_WIDTH_80;
2781		ret = IEEE80211_STA_DISABLE_80P80MHZ |
2782		      IEEE80211_STA_DISABLE_160MHZ;
2783		break;
2784	default:
2785	case NL80211_CHAN_WIDTH_20_NOHT:
2786		WARN_ON_ONCE(1);
2787		c->width = NL80211_CHAN_WIDTH_20_NOHT;
2788		ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
2789		break;
2790	case NL80211_CHAN_WIDTH_5:
2791	case NL80211_CHAN_WIDTH_10:
2792		WARN_ON_ONCE(1);
2793		/* keep c->width */
2794		ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
2795		break;
2796	}
2797
2798	WARN_ON_ONCE(!cfg80211_chandef_valid(c));
2799
2800	return ret;
2801}
2802
2803/*
2804 * Returns true if smps_mode_new is strictly more restrictive than
2805 * smps_mode_old.
2806 */
2807bool ieee80211_smps_is_restrictive(enum ieee80211_smps_mode smps_mode_old,
2808				   enum ieee80211_smps_mode smps_mode_new)
2809{
2810	if (WARN_ON_ONCE(smps_mode_old == IEEE80211_SMPS_AUTOMATIC ||
2811			 smps_mode_new == IEEE80211_SMPS_AUTOMATIC))
2812		return false;
2813
2814	switch (smps_mode_old) {
2815	case IEEE80211_SMPS_STATIC:
2816		return false;
2817	case IEEE80211_SMPS_DYNAMIC:
2818		return smps_mode_new == IEEE80211_SMPS_STATIC;
2819	case IEEE80211_SMPS_OFF:
2820		return smps_mode_new != IEEE80211_SMPS_OFF;
2821	default:
2822		WARN_ON(1);
2823	}
2824
2825	return false;
2826}
2827
2828int ieee80211_send_action_csa(struct ieee80211_sub_if_data *sdata,
2829			      struct cfg80211_csa_settings *csa_settings)
2830{
2831	struct sk_buff *skb;
2832	struct ieee80211_mgmt *mgmt;
2833	struct ieee80211_local *local = sdata->local;
2834	int freq;
2835	int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.chan_switch) +
2836			       sizeof(mgmt->u.action.u.chan_switch);
2837	u8 *pos;
2838
2839	if (sdata->vif.type != NL80211_IFTYPE_ADHOC &&
2840	    sdata->vif.type != NL80211_IFTYPE_MESH_POINT)
2841		return -EOPNOTSUPP;
2842
2843	skb = dev_alloc_skb(local->tx_headroom + hdr_len +
2844			    5 + /* channel switch announcement element */
2845			    3 + /* secondary channel offset element */
2846			    8); /* mesh channel switch parameters element */
2847	if (!skb)
2848		return -ENOMEM;
2849
2850	skb_reserve(skb, local->tx_headroom);
2851	mgmt = (struct ieee80211_mgmt *)skb_put(skb, hdr_len);
2852	memset(mgmt, 0, hdr_len);
2853	mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
2854					  IEEE80211_STYPE_ACTION);
2855
2856	eth_broadcast_addr(mgmt->da);
2857	memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
2858	if (ieee80211_vif_is_mesh(&sdata->vif)) {
2859		memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
2860	} else {
2861		struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
2862		memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
2863	}
2864	mgmt->u.action.category = WLAN_CATEGORY_SPECTRUM_MGMT;
2865	mgmt->u.action.u.chan_switch.action_code = WLAN_ACTION_SPCT_CHL_SWITCH;
2866	pos = skb_put(skb, 5);
2867	*pos++ = WLAN_EID_CHANNEL_SWITCH;			/* EID */
2868	*pos++ = 3;						/* IE length */
2869	*pos++ = csa_settings->block_tx ? 1 : 0;		/* CSA mode */
2870	freq = csa_settings->chandef.chan->center_freq;
2871	*pos++ = ieee80211_frequency_to_channel(freq);		/* channel */
2872	*pos++ = csa_settings->count;				/* count */
2873
2874	if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_40) {
2875		enum nl80211_channel_type ch_type;
2876
2877		skb_put(skb, 3);
2878		*pos++ = WLAN_EID_SECONDARY_CHANNEL_OFFSET;	/* EID */
2879		*pos++ = 1;					/* IE length */
2880		ch_type = cfg80211_get_chandef_type(&csa_settings->chandef);
2881		if (ch_type == NL80211_CHAN_HT40PLUS)
2882			*pos++ = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
2883		else
2884			*pos++ = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
2885	}
2886
2887	if (ieee80211_vif_is_mesh(&sdata->vif)) {
2888		struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
2889
2890		skb_put(skb, 8);
2891		*pos++ = WLAN_EID_CHAN_SWITCH_PARAM;		/* EID */
2892		*pos++ = 6;					/* IE length */
2893		*pos++ = sdata->u.mesh.mshcfg.dot11MeshTTL;	/* Mesh TTL */
2894		*pos = 0x00;	/* Mesh Flag: Tx Restrict, Initiator, Reason */
2895		*pos |= WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
2896		*pos++ |= csa_settings->block_tx ?
2897			  WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT : 0x00;
2898		put_unaligned_le16(WLAN_REASON_MESH_CHAN, pos); /* Reason Cd */
2899		pos += 2;
2900		put_unaligned_le16(ifmsh->pre_value, pos);/* Precedence Value */
2901		pos += 2;
2902	}
2903
2904	ieee80211_tx_skb(sdata, skb);
2905	return 0;
2906}
2907
2908bool ieee80211_cs_valid(const struct ieee80211_cipher_scheme *cs)
2909{
2910	return !(cs == NULL || cs->cipher == 0 ||
2911		 cs->hdr_len < cs->pn_len + cs->pn_off ||
2912		 cs->hdr_len <= cs->key_idx_off ||
2913		 cs->key_idx_shift > 7 ||
2914		 cs->key_idx_mask == 0);
2915}
2916
2917bool ieee80211_cs_list_valid(const struct ieee80211_cipher_scheme *cs, int n)
2918{
2919	int i;
2920
2921	/* Ensure we have enough iftype bitmap space for all iftype values */
2922	WARN_ON((NUM_NL80211_IFTYPES / 8 + 1) > sizeof(cs[0].iftype));
2923
2924	for (i = 0; i < n; i++)
2925		if (!ieee80211_cs_valid(&cs[i]))
2926			return false;
2927
2928	return true;
2929}
2930
2931const struct ieee80211_cipher_scheme *
2932ieee80211_cs_get(struct ieee80211_local *local, u32 cipher,
2933		 enum nl80211_iftype iftype)
2934{
2935	const struct ieee80211_cipher_scheme *l = local->hw.cipher_schemes;
2936	int n = local->hw.n_cipher_schemes;
2937	int i;
2938	const struct ieee80211_cipher_scheme *cs = NULL;
2939
2940	for (i = 0; i < n; i++) {
2941		if (l[i].cipher == cipher) {
2942			cs = &l[i];
2943			break;
2944		}
2945	}
2946
2947	if (!cs || !(cs->iftype & BIT(iftype)))
2948		return NULL;
2949
2950	return cs;
2951}
2952
2953int ieee80211_cs_headroom(struct ieee80211_local *local,
2954			  struct cfg80211_crypto_settings *crypto,
2955			  enum nl80211_iftype iftype)
2956{
2957	const struct ieee80211_cipher_scheme *cs;
2958	int headroom = IEEE80211_ENCRYPT_HEADROOM;
2959	int i;
2960
2961	for (i = 0; i < crypto->n_ciphers_pairwise; i++) {
2962		cs = ieee80211_cs_get(local, crypto->ciphers_pairwise[i],
2963				      iftype);
2964
2965		if (cs && headroom < cs->hdr_len)
2966			headroom = cs->hdr_len;
2967	}
2968
2969	cs = ieee80211_cs_get(local, crypto->cipher_group, iftype);
2970	if (cs && headroom < cs->hdr_len)
2971		headroom = cs->hdr_len;
2972
2973	return headroom;
2974}
2975
2976static bool
2977ieee80211_extend_noa_desc(struct ieee80211_noa_data *data, u32 tsf, int i)
2978{
2979	s32 end = data->desc[i].start + data->desc[i].duration - (tsf + 1);
2980	int skip;
2981
2982	if (end > 0)
2983		return false;
2984
2985	/* One shot NOA  */
2986	if (data->count[i] == 1)
2987		return false;
2988
2989	if (data->desc[i].interval == 0)
2990		return false;
2991
2992	/* End time is in the past, check for repetitions */
2993	skip = DIV_ROUND_UP(-end, data->desc[i].interval);
2994	if (data->count[i] < 255) {
2995		if (data->count[i] <= skip) {
2996			data->count[i] = 0;
2997			return false;
2998		}
2999
3000		data->count[i] -= skip;
3001	}
3002
3003	data->desc[i].start += skip * data->desc[i].interval;
3004
3005	return true;
3006}
3007
3008static bool
3009ieee80211_extend_absent_time(struct ieee80211_noa_data *data, u32 tsf,
3010			     s32 *offset)
3011{
3012	bool ret = false;
3013	int i;
3014
3015	for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
3016		s32 cur;
3017
3018		if (!data->count[i])
3019			continue;
3020
3021		if (ieee80211_extend_noa_desc(data, tsf + *offset, i))
3022			ret = true;
3023
3024		cur = data->desc[i].start - tsf;
3025		if (cur > *offset)
3026			continue;
3027
3028		cur = data->desc[i].start + data->desc[i].duration - tsf;
3029		if (cur > *offset)
3030			*offset = cur;
3031	}
3032
3033	return ret;
3034}
3035
3036static u32
3037ieee80211_get_noa_absent_time(struct ieee80211_noa_data *data, u32 tsf)
3038{
3039	s32 offset = 0;
3040	int tries = 0;
3041	/*
3042	 * arbitrary limit, used to avoid infinite loops when combined NoA
3043	 * descriptors cover the full time period.
3044	 */
3045	int max_tries = 5;
3046
3047	ieee80211_extend_absent_time(data, tsf, &offset);
3048	do {
3049		if (!ieee80211_extend_absent_time(data, tsf, &offset))
3050			break;
3051
3052		tries++;
3053	} while (tries < max_tries);
3054
3055	return offset;
3056}
3057
3058void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf)
3059{
3060	u32 next_offset = BIT(31) - 1;
3061	int i;
3062
3063	data->absent = 0;
3064	data->has_next_tsf = false;
3065	for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
3066		s32 start;
3067
3068		if (!data->count[i])
3069			continue;
3070
3071		ieee80211_extend_noa_desc(data, tsf, i);
3072		start = data->desc[i].start - tsf;
3073		if (start <= 0)
3074			data->absent |= BIT(i);
3075
3076		if (next_offset > start)
3077			next_offset = start;
3078
3079		data->has_next_tsf = true;
3080	}
3081
3082	if (data->absent)
3083		next_offset = ieee80211_get_noa_absent_time(data, tsf);
3084
3085	data->next_tsf = tsf + next_offset;
3086}
3087EXPORT_SYMBOL(ieee80211_update_p2p_noa);
3088
3089int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr,
3090			    struct ieee80211_noa_data *data, u32 tsf)
3091{
3092	int ret = 0;
3093	int i;
3094
3095	memset(data, 0, sizeof(*data));
3096
3097	for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
3098		const struct ieee80211_p2p_noa_desc *desc = &attr->desc[i];
3099
3100		if (!desc->count || !desc->duration)
3101			continue;
3102
3103		data->count[i] = desc->count;
3104		data->desc[i].start = le32_to_cpu(desc->start_time);
3105		data->desc[i].duration = le32_to_cpu(desc->duration);
3106		data->desc[i].interval = le32_to_cpu(desc->interval);
3107
3108		if (data->count[i] > 1 &&
3109		    data->desc[i].interval < data->desc[i].duration)
3110			continue;
3111
3112		ieee80211_extend_noa_desc(data, tsf, i);
3113		ret++;
3114	}
3115
3116	if (ret)
3117		ieee80211_update_p2p_noa(data, tsf);
3118
3119	return ret;
3120}
3121EXPORT_SYMBOL(ieee80211_parse_p2p_noa);
3122
3123void ieee80211_recalc_dtim(struct ieee80211_local *local,
3124			   struct ieee80211_sub_if_data *sdata)
3125{
3126	u64 tsf = drv_get_tsf(local, sdata);
3127	u64 dtim_count = 0;
3128	u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024;
3129	u8 dtim_period = sdata->vif.bss_conf.dtim_period;
3130	struct ps_data *ps;
3131	u8 bcns_from_dtim;
3132
3133	if (tsf == -1ULL || !beacon_int || !dtim_period)
3134		return;
3135
3136	if (sdata->vif.type == NL80211_IFTYPE_AP ||
3137	    sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
3138		if (!sdata->bss)
3139			return;
3140
3141		ps = &sdata->bss->ps;
3142	} else if (ieee80211_vif_is_mesh(&sdata->vif)) {
3143		ps = &sdata->u.mesh.ps;
3144	} else {
3145		return;
3146	}
3147
3148	/*
3149	 * actually finds last dtim_count, mac80211 will update in
3150	 * __beacon_add_tim().
3151	 * dtim_count = dtim_period - (tsf / bcn_int) % dtim_period
3152	 */
3153	do_div(tsf, beacon_int);
3154	bcns_from_dtim = do_div(tsf, dtim_period);
3155	/* just had a DTIM */
3156	if (!bcns_from_dtim)
3157		dtim_count = 0;
3158	else
3159		dtim_count = dtim_period - bcns_from_dtim;
3160
3161	ps->dtim_count = dtim_count;
3162}
3163
3164static u8 ieee80211_chanctx_radar_detect(struct ieee80211_local *local,
3165					 struct ieee80211_chanctx *ctx)
3166{
3167	struct ieee80211_sub_if_data *sdata;
3168	u8 radar_detect = 0;
3169
3170	lockdep_assert_held(&local->chanctx_mtx);
3171
3172	if (WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED))
3173		return 0;
3174
3175	list_for_each_entry(sdata, &ctx->reserved_vifs, reserved_chanctx_list)
3176		if (sdata->reserved_radar_required)
3177			radar_detect |= BIT(sdata->reserved_chandef.width);
3178
3179	/*
3180	 * An in-place reservation context should not have any assigned vifs
3181	 * until it replaces the other context.
3182	 */
3183	WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER &&
3184		!list_empty(&ctx->assigned_vifs));
3185
3186	list_for_each_entry(sdata, &ctx->assigned_vifs, assigned_chanctx_list)
3187		if (sdata->radar_required)
3188			radar_detect |= BIT(sdata->vif.bss_conf.chandef.width);
3189
3190	return radar_detect;
3191}
3192
3193int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
3194				 const struct cfg80211_chan_def *chandef,
3195				 enum ieee80211_chanctx_mode chanmode,
3196				 u8 radar_detect)
3197{
3198	struct ieee80211_local *local = sdata->local;
3199	struct ieee80211_sub_if_data *sdata_iter;
3200	enum nl80211_iftype iftype = sdata->wdev.iftype;
3201	int num[NUM_NL80211_IFTYPES];
3202	struct ieee80211_chanctx *ctx;
3203	int num_different_channels = 0;
3204	int total = 1;
3205
3206	lockdep_assert_held(&local->chanctx_mtx);
3207
3208	if (WARN_ON(hweight32(radar_detect) > 1))
3209		return -EINVAL;
3210
3211	if (WARN_ON(chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
3212		    !chandef->chan))
3213		return -EINVAL;
3214
3215	if (chandef)
3216		num_different_channels = 1;
3217
3218	if (WARN_ON(iftype >= NUM_NL80211_IFTYPES))
3219		return -EINVAL;
3220
3221	/* Always allow software iftypes */
3222	if (local->hw.wiphy->software_iftypes & BIT(iftype)) {
3223		if (radar_detect)
3224			return -EINVAL;
3225		return 0;
3226	}
3227
3228	memset(num, 0, sizeof(num));
3229
3230	if (iftype != NL80211_IFTYPE_UNSPECIFIED)
3231		num[iftype] = 1;
3232
3233	list_for_each_entry(ctx, &local->chanctx_list, list) {
3234		if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
3235			continue;
3236		radar_detect |= ieee80211_chanctx_radar_detect(local, ctx);
3237		if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) {
3238			num_different_channels++;
3239			continue;
3240		}
3241		if (chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
3242		    cfg80211_chandef_compatible(chandef,
3243						&ctx->conf.def))
3244			continue;
3245		num_different_channels++;
3246	}
3247
3248	list_for_each_entry_rcu(sdata_iter, &local->interfaces, list) {
3249		struct wireless_dev *wdev_iter;
3250
3251		wdev_iter = &sdata_iter->wdev;
3252
3253		if (sdata_iter == sdata ||
3254		    !ieee80211_sdata_running(sdata_iter) ||
3255		    local->hw.wiphy->software_iftypes & BIT(wdev_iter->iftype))
3256			continue;
3257
3258		num[wdev_iter->iftype]++;
3259		total++;
3260	}
3261
3262	if (total == 1 && !radar_detect)
3263		return 0;
3264
3265	return cfg80211_check_combinations(local->hw.wiphy,
3266					   num_different_channels,
3267					   radar_detect, num);
3268}
3269
3270static void
3271ieee80211_iter_max_chans(const struct ieee80211_iface_combination *c,
3272			 void *data)
3273{
3274	u32 *max_num_different_channels = data;
3275
3276	*max_num_different_channels = max(*max_num_different_channels,
3277					  c->num_different_channels);
3278}
3279
3280int ieee80211_max_num_channels(struct ieee80211_local *local)
3281{
3282	struct ieee80211_sub_if_data *sdata;
3283	int num[NUM_NL80211_IFTYPES] = {};
3284	struct ieee80211_chanctx *ctx;
3285	int num_different_channels = 0;
3286	u8 radar_detect = 0;
3287	u32 max_num_different_channels = 1;
3288	int err;
3289
3290	lockdep_assert_held(&local->chanctx_mtx);
3291
3292	list_for_each_entry(ctx, &local->chanctx_list, list) {
3293		if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
3294			continue;
3295
3296		num_different_channels++;
3297
3298		radar_detect |= ieee80211_chanctx_radar_detect(local, ctx);
3299	}
3300
3301	list_for_each_entry_rcu(sdata, &local->interfaces, list)
3302		num[sdata->wdev.iftype]++;
3303
3304	err = cfg80211_iter_combinations(local->hw.wiphy,
3305					 num_different_channels, radar_detect,
3306					 num, ieee80211_iter_max_chans,
3307					 &max_num_different_channels);
3308	if (err < 0)
3309		return err;
3310
3311	return max_num_different_channels;
3312}
3313
3314u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo)
3315{
3316	*buf++ = WLAN_EID_VENDOR_SPECIFIC;
3317	*buf++ = 7; /* len */
3318	*buf++ = 0x00; /* Microsoft OUI 00:50:F2 */
3319	*buf++ = 0x50;
3320	*buf++ = 0xf2;
3321	*buf++ = 2; /* WME */
3322	*buf++ = 0; /* WME info */
3323	*buf++ = 1; /* WME ver */
3324	*buf++ = qosinfo; /* U-APSD no in use */
3325
3326	return buf;
3327}
3328
3329void ieee80211_init_tx_queue(struct ieee80211_sub_if_data *sdata,
3330			     struct sta_info *sta,
3331			     struct txq_info *txqi, int tid)
3332{
3333	skb_queue_head_init(&txqi->queue);
3334	txqi->txq.vif = &sdata->vif;
3335
3336	if (sta) {
3337		txqi->txq.sta = &sta->sta;
3338		sta->sta.txq[tid] = &txqi->txq;
3339		txqi->txq.tid = tid;
3340		txqi->txq.ac = ieee802_1d_to_ac[tid & 7];
3341	} else {
3342		sdata->vif.txq = &txqi->txq;
3343		txqi->txq.tid = 0;
3344		txqi->txq.ac = IEEE80211_AC_BE;
3345	}
3346}
3347