Linux Audio

Check our new training course

Open-source upstreaming

Need help get the support for your hardware in upstream Linux?
Loading...
v3.1
  1/*
  2 * Atheros CARL9170 driver
  3 *
  4 * Driver specific definitions
  5 *
  6 * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
  7 * Copyright 2009, 2010, Christian Lamparter <chunkeey@googlemail.com>
  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 as published by
 11 * the Free Software Foundation; either version 2 of the License, or
 12 * (at your option) any later version.
 13 *
 14 * This program is distributed in the hope that it will be useful,
 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 17 * GNU General Public License for more details.
 18 *
 19 * You should have received a copy of the GNU General Public License
 20 * along with this program; see the file COPYING.  If not, see
 21 * http://www.gnu.org/licenses/.
 22 *
 23 * This file incorporates work covered by the following copyright and
 24 * permission notice:
 25 *    Copyright (c) 2007-2008 Atheros Communications, Inc.
 26 *
 27 *    Permission to use, copy, modify, and/or distribute this software for any
 28 *    purpose with or without fee is hereby granted, provided that the above
 29 *    copyright notice and this permission notice appear in all copies.
 30 *
 31 *    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 32 *    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 33 *    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 34 *    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 35 *    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 36 *    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 37 *    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 38 */
 39#ifndef __CARL9170_H
 40#define __CARL9170_H
 41
 42#include <linux/kernel.h>
 43#include <linux/firmware.h>
 44#include <linux/completion.h>
 45#include <linux/spinlock.h>
 
 46#include <net/cfg80211.h>
 47#include <net/mac80211.h>
 48#include <linux/usb.h>
 49#ifdef CONFIG_CARL9170_LEDS
 50#include <linux/leds.h>
 51#endif /* CONFIG_CARL9170_LEDS */
 52#ifdef CONFIG_CARL9170_WPC
 53#include <linux/input.h>
 54#endif /* CONFIG_CARL9170_WPC */
 55#include "eeprom.h"
 56#include "wlan.h"
 57#include "hw.h"
 58#include "fwdesc.h"
 59#include "fwcmd.h"
 60#include "../regd.h"
 61
 62#ifdef CONFIG_CARL9170_DEBUGFS
 63#include "debug.h"
 64#endif /* CONFIG_CARL9170_DEBUGFS */
 65
 66#define CARL9170FW_NAME	"carl9170-1.fw"
 67
 68#define PAYLOAD_MAX	(CARL9170_MAX_CMD_LEN / 4 - 1)
 69
 70static const u8 ar9170_qmap[__AR9170_NUM_TXQ] = { 3, 2, 1, 0 };
 71
 72enum carl9170_rf_init_mode {
 73	CARL9170_RFI_NONE,
 74	CARL9170_RFI_WARM,
 75	CARL9170_RFI_COLD,
 76};
 77
 78#define CARL9170_MAX_RX_BUFFER_SIZE		8192
 79
 80enum carl9170_device_state {
 81	CARL9170_UNKNOWN_STATE,
 82	CARL9170_STOPPED,
 83	CARL9170_IDLE,
 84	CARL9170_STARTED,
 85};
 86
 87#define CARL9170_NUM_TID		16
 88#define WME_BA_BMP_SIZE			64
 89#define CARL9170_TX_USER_RATE_TRIES	3
 90
 91#define WME_AC_BE   2
 92#define WME_AC_BK   3
 93#define WME_AC_VI   1
 94#define WME_AC_VO   0
 95
 96#define TID_TO_WME_AC(_tid)				\
 97	((((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE :	\
 98	 (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK :	\
 99	 (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI :	\
100	 WME_AC_VO)
101
102#define SEQ_DIFF(_start, _seq) \
103	(((_start) - (_seq)) & 0x0fff)
104#define SEQ_PREV(_seq) \
105	(((_seq) - 1) & 0x0fff)
106#define SEQ_NEXT(_seq) \
107	(((_seq) + 1) & 0x0fff)
108#define BAW_WITHIN(_start, _bawsz, _seqno) \
109	((((_seqno) - (_start)) & 0xfff) < (_bawsz))
110
111enum carl9170_tid_state {
112	CARL9170_TID_STATE_INVALID,
113	CARL9170_TID_STATE_KILLED,
114	CARL9170_TID_STATE_SHUTDOWN,
115	CARL9170_TID_STATE_SUSPEND,
116	CARL9170_TID_STATE_PROGRESS,
117	CARL9170_TID_STATE_IDLE,
118	CARL9170_TID_STATE_XMIT,
119};
120
121#define CARL9170_BAW_BITS (2 * WME_BA_BMP_SIZE)
122#define CARL9170_BAW_SIZE (BITS_TO_LONGS(CARL9170_BAW_BITS))
123#define CARL9170_BAW_LEN (DIV_ROUND_UP(CARL9170_BAW_BITS, BITS_PER_BYTE))
124
125struct carl9170_sta_tid {
126	/* must be the first entry! */
127	struct list_head list;
128
129	/* temporary list for RCU unlink procedure */
130	struct list_head tmp_list;
131
132	/* lock for the following data structures */
133	spinlock_t lock;
134
135	unsigned int counter;
136	enum carl9170_tid_state state;
137	u8 tid;		/* TID number ( 0 - 15 ) */
138	u16 max;	/* max. AMPDU size */
139
140	u16 snx;	/* awaiting _next_ frame */
141	u16 hsn;	/* highest _queued_ sequence */
142	u16 bsn;	/* base of the tx/agg bitmap */
143	unsigned long bitmap[CARL9170_BAW_SIZE];
144
145	/* Preaggregation reorder queue */
146	struct sk_buff_head queue;
147};
148
149#define CARL9170_QUEUE_TIMEOUT		256
150#define CARL9170_BUMP_QUEUE		1000
151#define CARL9170_TX_TIMEOUT		2500
152#define CARL9170_JANITOR_DELAY		128
153#define CARL9170_QUEUE_STUCK_TIMEOUT	5500
 
154
155#define CARL9170_NUM_TX_AGG_MAX		30
156
157/*
158 * Tradeoff between stability/latency and speed.
159 *
160 * AR9170_TXQ_DEPTH is devised by dividing the amount of available
161 * tx buffers with the size of a full ethernet frame + overhead.
162 *
163 * Naturally: The higher the limit, the faster the device CAN send.
164 * However, even a slight over-commitment at the wrong time and the
165 * hardware is doomed to send all already-queued frames at suboptimal
166 * rates. This in turn leads to an enormous amount of unsuccessful
167 * retries => Latency goes up, whereas the throughput goes down. CRASH!
168 */
169#define CARL9170_NUM_TX_LIMIT_HARD	((AR9170_TXQ_DEPTH * 3) / 2)
170#define CARL9170_NUM_TX_LIMIT_SOFT	(AR9170_TXQ_DEPTH)
171
172struct carl9170_tx_queue_stats {
173	unsigned int count;
174	unsigned int limit;
175	unsigned int len;
176};
177
178struct carl9170_vif {
179	unsigned int id;
180	struct ieee80211_vif __rcu *vif;
181};
182
183struct carl9170_vif_info {
184	struct list_head list;
185	bool active;
186	unsigned int id;
187	struct sk_buff *beacon;
188	bool enable_beacon;
189};
190
191#define AR9170_NUM_RX_URBS	16
192#define AR9170_NUM_RX_URBS_MUL	2
193#define AR9170_NUM_TX_URBS	8
194#define AR9170_NUM_RX_URBS_POOL (AR9170_NUM_RX_URBS_MUL * AR9170_NUM_RX_URBS)
195
196enum carl9170_device_features {
197	CARL9170_WPS_BUTTON		= BIT(0),
198	CARL9170_ONE_LED		= BIT(1),
199};
200
201#ifdef CONFIG_CARL9170_LEDS
202struct ar9170;
203
204struct carl9170_led {
205	struct ar9170 *ar;
206	struct led_classdev l;
207	char name[32];
208	unsigned int toggled;
209	bool last_state;
210	bool registered;
211};
212#endif /* CONFIG_CARL9170_LEDS */
213
214enum carl9170_restart_reasons {
215	CARL9170_RR_NO_REASON = 0,
216	CARL9170_RR_FATAL_FIRMWARE_ERROR,
217	CARL9170_RR_TOO_MANY_FIRMWARE_ERRORS,
218	CARL9170_RR_WATCHDOG,
219	CARL9170_RR_STUCK_TX,
220	CARL9170_RR_UNRESPONSIVE_DEVICE,
221	CARL9170_RR_COMMAND_TIMEOUT,
222	CARL9170_RR_TOO_MANY_PHY_ERRORS,
223	CARL9170_RR_LOST_RSP,
224	CARL9170_RR_INVALID_RSP,
225	CARL9170_RR_USER_REQUEST,
226
227	__CARL9170_RR_LAST,
228};
229
230enum carl9170_erp_modes {
231	CARL9170_ERP_INVALID,
232	CARL9170_ERP_AUTO,
233	CARL9170_ERP_MAC80211,
234	CARL9170_ERP_OFF,
235	CARL9170_ERP_CTS,
236	CARL9170_ERP_RTS,
237	__CARL9170_ERP_NUM,
238};
239
240struct ar9170 {
241	struct ath_common common;
242	struct ieee80211_hw *hw;
243	struct mutex mutex;
244	enum carl9170_device_state state;
245	spinlock_t state_lock;
246	enum carl9170_restart_reasons last_reason;
247	bool registered;
248
249	/* USB */
250	struct usb_device *udev;
251	struct usb_interface *intf;
252	struct usb_anchor rx_anch;
253	struct usb_anchor rx_work;
254	struct usb_anchor rx_pool;
255	struct usb_anchor tx_wait;
256	struct usb_anchor tx_anch;
257	struct usb_anchor tx_cmd;
258	struct usb_anchor tx_err;
259	struct tasklet_struct usb_tasklet;
260	atomic_t tx_cmd_urbs;
261	atomic_t tx_anch_urbs;
262	atomic_t rx_anch_urbs;
263	atomic_t rx_work_urbs;
264	atomic_t rx_pool_urbs;
265	kernel_ulong_t features;
266
267	/* firmware settings */
268	struct completion fw_load_wait;
269	struct completion fw_boot_wait;
270	struct {
271		const struct carl9170fw_desc_head *desc;
272		const struct firmware *fw;
273		unsigned int offset;
274		unsigned int address;
275		unsigned int cmd_bufs;
276		unsigned int api_version;
277		unsigned int vif_num;
278		unsigned int err_counter;
279		unsigned int bug_counter;
280		u32 beacon_addr;
281		unsigned int beacon_max_len;
282		bool rx_stream;
283		bool tx_stream;
284		bool rx_filter;
 
285		unsigned int mem_blocks;
286		unsigned int mem_block_size;
287		unsigned int rx_size;
288		unsigned int tx_seq_table;
289	} fw;
290
291	/* interface configuration combinations */
292	struct ieee80211_iface_limit if_comb_limits[1];
293	struct ieee80211_iface_combination if_combs[1];
294
295	/* reset / stuck frames/queue detection */
296	struct work_struct restart_work;
297	struct work_struct ping_work;
298	unsigned int restart_counter;
299	unsigned long queue_stop_timeout[__AR9170_NUM_TXQ];
300	unsigned long max_queue_stop_timeout[__AR9170_NUM_TXQ];
301	bool needs_full_reset;
302	atomic_t pending_restarts;
303
304	/* interface mode settings */
305	struct list_head vif_list;
306	unsigned long vif_bitmap;
307	unsigned int vifs;
308	struct carl9170_vif vif_priv[AR9170_MAX_VIRTUAL_MAC];
309
310	/* beaconing */
311	spinlock_t beacon_lock;
312	unsigned int global_pretbtt;
313	unsigned int global_beacon_int;
314	struct carl9170_vif_info __rcu *beacon_iter;
315	unsigned int beacon_enabled;
316
317	/* cryptographic engine */
318	u64 usedkeys;
319	bool rx_software_decryption;
320	bool disable_offload;
321
322	/* filter settings */
323	u64 cur_mc_hash;
324	u32 cur_filter;
325	unsigned int filter_state;
326	unsigned int rx_filter_caps;
327	bool sniffer_enabled;
328
329	/* MAC */
330	enum carl9170_erp_modes erp_mode;
331
332	/* PHY */
333	struct ieee80211_channel *channel;
 
334	int noise[4];
335	unsigned int chan_fail;
336	unsigned int total_chan_fail;
337	u8 heavy_clip;
338	u8 ht_settings;
 
 
 
 
 
 
 
 
 
339
340	/* power calibration data */
341	u8 power_5G_leg[4];
342	u8 power_2G_cck[4];
343	u8 power_2G_ofdm[4];
344	u8 power_5G_ht20[8];
345	u8 power_5G_ht40[8];
346	u8 power_2G_ht20[8];
347	u8 power_2G_ht40[8];
348
349#ifdef CONFIG_CARL9170_LEDS
350	/* LED */
351	struct delayed_work led_work;
352	struct carl9170_led leds[AR9170_NUM_LEDS];
353#endif /* CONFIG_CARL9170_LEDS */
354
355	/* qos queue settings */
356	spinlock_t tx_stats_lock;
357	struct carl9170_tx_queue_stats tx_stats[__AR9170_NUM_TXQ];
358	struct ieee80211_tx_queue_params edcf[5];
359	struct completion tx_flush;
360
361	/* CMD */
362	int cmd_seq;
363	int readlen;
364	u8 *readbuf;
365	spinlock_t cmd_lock;
366	struct completion cmd_wait;
367	union {
368		__le32 cmd_buf[PAYLOAD_MAX + 1];
369		struct carl9170_cmd cmd;
370		struct carl9170_rsp rsp;
371	};
372
373	/* statistics */
374	unsigned int tx_dropped;
375	unsigned int tx_ack_failures;
376	unsigned int tx_fcs_errors;
377	unsigned int rx_dropped;
378
379	/* EEPROM */
380	struct ar9170_eeprom eeprom;
381
382	/* tx queuing */
383	struct sk_buff_head tx_pending[__AR9170_NUM_TXQ];
384	struct sk_buff_head tx_status[__AR9170_NUM_TXQ];
385	struct delayed_work tx_janitor;
386	unsigned long tx_janitor_last_run;
387	bool tx_schedule;
388
389	/* tx ampdu */
390	struct work_struct ampdu_work;
391	spinlock_t tx_ampdu_list_lock;
392	struct carl9170_sta_tid __rcu *tx_ampdu_iter;
393	struct list_head tx_ampdu_list;
394	atomic_t tx_ampdu_upload;
395	atomic_t tx_ampdu_scheduler;
396	atomic_t tx_total_pending;
397	atomic_t tx_total_queued;
398	unsigned int tx_ampdu_list_len;
399	int current_density;
400	int current_factor;
401	bool tx_ampdu_schedule;
402
403	/* internal memory management */
404	spinlock_t mem_lock;
405	unsigned long *mem_bitmap;
406	atomic_t mem_free_blocks;
407	atomic_t mem_allocs;
408
409	/* rxstream mpdu merge */
410	struct ar9170_rx_head rx_plcp;
411	bool rx_has_plcp;
412	struct sk_buff *rx_failover;
413	int rx_failover_missing;
414
415#ifdef CONFIG_CARL9170_WPC
416	struct {
417		bool pbc_state;
418		struct input_dev *pbc;
419		char name[32];
420		char phys[32];
421	} wps;
422#endif /* CONFIG_CARL9170_WPC */
423
424#ifdef CONFIG_CARL9170_DEBUGFS
425	struct carl9170_debug debug;
426	struct dentry *debug_dir;
427#endif /* CONFIG_CARL9170_DEBUGFS */
428
429	/* PSM */
430	struct work_struct ps_work;
431	struct {
432		unsigned int dtim_counter;
433		unsigned long last_beacon;
434		unsigned long last_action;
435		unsigned long last_slept;
436		unsigned int sleep_ms;
437		unsigned int off_override;
438		bool state;
439	} ps;
 
 
 
 
 
 
 
 
 
 
 
440};
441
442enum carl9170_ps_off_override_reasons {
443	PS_OFF_VIF	= BIT(0),
444	PS_OFF_BCN	= BIT(1),
445};
446
447struct carl9170_ba_stats {
448	u8 ampdu_len;
449	u8 ampdu_ack_len;
450	bool clear;
451	bool req;
452};
453
454struct carl9170_sta_info {
455	bool ht_sta;
456	bool sleeping;
457	atomic_t pending_frames;
458	unsigned int ampdu_max_len;
459	struct carl9170_sta_tid __rcu *agg[CARL9170_NUM_TID];
460	struct carl9170_ba_stats stats[CARL9170_NUM_TID];
461};
462
463struct carl9170_tx_info {
464	unsigned long timeout;
465	struct ar9170 *ar;
466	struct kref ref;
467};
468
469#define CHK_DEV_STATE(a, s)	(((struct ar9170 *)a)->state >= (s))
470#define IS_INITIALIZED(a)	(CHK_DEV_STATE(a, CARL9170_STOPPED))
471#define IS_ACCEPTING_CMD(a)	(CHK_DEV_STATE(a, CARL9170_IDLE))
472#define IS_STARTED(a)		(CHK_DEV_STATE(a, CARL9170_STARTED))
473
474static inline void __carl9170_set_state(struct ar9170 *ar,
475	enum carl9170_device_state newstate)
476{
477	ar->state = newstate;
478}
479
480static inline void carl9170_set_state(struct ar9170 *ar,
481	enum carl9170_device_state newstate)
482{
483	unsigned long flags;
484
485	spin_lock_irqsave(&ar->state_lock, flags);
486	__carl9170_set_state(ar, newstate);
487	spin_unlock_irqrestore(&ar->state_lock, flags);
488}
489
490static inline void carl9170_set_state_when(struct ar9170 *ar,
491	enum carl9170_device_state min, enum carl9170_device_state newstate)
492{
493	unsigned long flags;
494
495	spin_lock_irqsave(&ar->state_lock, flags);
496	if (CHK_DEV_STATE(ar, min))
497		__carl9170_set_state(ar, newstate);
498	spin_unlock_irqrestore(&ar->state_lock, flags);
499}
500
501/* exported interface */
502void *carl9170_alloc(size_t priv_size);
503int carl9170_register(struct ar9170 *ar);
504void carl9170_unregister(struct ar9170 *ar);
505void carl9170_free(struct ar9170 *ar);
506void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r);
507void carl9170_ps_check(struct ar9170 *ar);
508
509/* USB back-end */
510int carl9170_usb_open(struct ar9170 *ar);
511void carl9170_usb_stop(struct ar9170 *ar);
512void carl9170_usb_tx(struct ar9170 *ar, struct sk_buff *skb);
513void carl9170_usb_handle_tx_err(struct ar9170 *ar);
514int carl9170_exec_cmd(struct ar9170 *ar, const enum carl9170_cmd_oids,
515		      u32 plen, void *payload, u32 rlen, void *resp);
516int __carl9170_exec_cmd(struct ar9170 *ar, struct carl9170_cmd *cmd,
517			const bool free_buf);
518int carl9170_usb_restart(struct ar9170 *ar);
519void carl9170_usb_reset(struct ar9170 *ar);
520
521/* MAC */
522int carl9170_init_mac(struct ar9170 *ar);
523int carl9170_set_qos(struct ar9170 *ar);
524int carl9170_update_multicast(struct ar9170 *ar, const u64 mc_hast);
525int carl9170_mod_virtual_mac(struct ar9170 *ar, const unsigned int id,
526			     const u8 *mac);
527int carl9170_set_operating_mode(struct ar9170 *ar);
528int carl9170_set_beacon_timers(struct ar9170 *ar);
529int carl9170_set_dyn_sifs_ack(struct ar9170 *ar);
530int carl9170_set_rts_cts_rate(struct ar9170 *ar);
531int carl9170_set_ampdu_settings(struct ar9170 *ar);
532int carl9170_set_slot_time(struct ar9170 *ar);
533int carl9170_set_mac_rates(struct ar9170 *ar);
534int carl9170_set_hwretry_limit(struct ar9170 *ar, const u32 max_retry);
535int carl9170_upload_key(struct ar9170 *ar, const u8 id, const u8 *mac,
536	const u8 ktype, const u8 keyidx, const u8 *keydata, const int keylen);
537int carl9170_disable_key(struct ar9170 *ar, const u8 id);
 
538
539/* RX */
540void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len);
541void carl9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len);
542
543/* TX */
544void carl9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb);
545void carl9170_tx_janitor(struct work_struct *work);
546void carl9170_tx_process_status(struct ar9170 *ar,
547				const struct carl9170_rsp *cmd);
548void carl9170_tx_status(struct ar9170 *ar, struct sk_buff *skb,
549			const bool success);
550void carl9170_tx_callback(struct ar9170 *ar, struct sk_buff *skb);
551void carl9170_tx_drop(struct ar9170 *ar, struct sk_buff *skb);
552void carl9170_tx_scheduler(struct ar9170 *ar);
553void carl9170_tx_get_skb(struct sk_buff *skb);
554int carl9170_tx_put_skb(struct sk_buff *skb);
555int carl9170_update_beacon(struct ar9170 *ar, const bool submit);
556
557/* LEDs */
558#ifdef CONFIG_CARL9170_LEDS
559int carl9170_led_register(struct ar9170 *ar);
560void carl9170_led_unregister(struct ar9170 *ar);
561#endif /* CONFIG_CARL9170_LEDS */
562int carl9170_led_init(struct ar9170 *ar);
563int carl9170_led_set_state(struct ar9170 *ar, const u32 led_state);
564
565/* PHY / RF */
566int carl9170_set_channel(struct ar9170 *ar, struct ieee80211_channel *channel,
567	enum nl80211_channel_type bw, enum carl9170_rf_init_mode rfi);
568int carl9170_get_noisefloor(struct ar9170 *ar);
569
570/* FW */
571int carl9170_parse_firmware(struct ar9170 *ar);
572int carl9170_fw_fix_eeprom(struct ar9170 *ar);
573
574extern struct ieee80211_rate __carl9170_ratetable[];
575extern int modparam_noht;
576
577static inline struct ar9170 *carl9170_get_priv(struct carl9170_vif *carl_vif)
578{
579	return container_of(carl_vif, struct ar9170,
580			    vif_priv[carl_vif->id]);
581}
582
583static inline struct ieee80211_hdr *carl9170_get_hdr(struct sk_buff *skb)
584{
585	return (void *)((struct _carl9170_tx_superframe *)
586		skb->data)->frame_data;
587}
588
589static inline u16 get_seq_h(struct ieee80211_hdr *hdr)
590{
591	return le16_to_cpu(hdr->seq_ctrl) >> 4;
592}
593
594static inline u16 carl9170_get_seq(struct sk_buff *skb)
595{
596	return get_seq_h(carl9170_get_hdr(skb));
597}
598
599static inline u16 get_tid_h(struct ieee80211_hdr *hdr)
600{
601	return (ieee80211_get_qos_ctl(hdr))[0] & IEEE80211_QOS_CTL_TID_MASK;
602}
603
604static inline u16 carl9170_get_tid(struct sk_buff *skb)
605{
606	return get_tid_h(carl9170_get_hdr(skb));
607}
608
609static inline struct ieee80211_vif *
610carl9170_get_vif(struct carl9170_vif_info *priv)
611{
612	return container_of((void *)priv, struct ieee80211_vif, drv_priv);
613}
614
615/* Protected by ar->mutex or RCU */
616static inline struct ieee80211_vif *carl9170_get_main_vif(struct ar9170 *ar)
617{
618	struct carl9170_vif_info *cvif;
619
620	list_for_each_entry_rcu(cvif, &ar->vif_list, list) {
621		if (cvif->active)
622			return carl9170_get_vif(cvif);
623	}
624
625	return NULL;
626}
627
628static inline bool is_main_vif(struct ar9170 *ar, struct ieee80211_vif *vif)
629{
630	bool ret;
631
632	rcu_read_lock();
633	ret = (carl9170_get_main_vif(ar) == vif);
634	rcu_read_unlock();
635	return ret;
636}
637
638#endif /* __CARL9170_H */
v3.5.6
  1/*
  2 * Atheros CARL9170 driver
  3 *
  4 * Driver specific definitions
  5 *
  6 * Copyright 2008, Johannes Berg <johannes@sipsolutions.net>
  7 * Copyright 2009, 2010, Christian Lamparter <chunkeey@googlemail.com>
  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 as published by
 11 * the Free Software Foundation; either version 2 of the License, or
 12 * (at your option) any later version.
 13 *
 14 * This program is distributed in the hope that it will be useful,
 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 17 * GNU General Public License for more details.
 18 *
 19 * You should have received a copy of the GNU General Public License
 20 * along with this program; see the file COPYING.  If not, see
 21 * http://www.gnu.org/licenses/.
 22 *
 23 * This file incorporates work covered by the following copyright and
 24 * permission notice:
 25 *    Copyright (c) 2007-2008 Atheros Communications, Inc.
 26 *
 27 *    Permission to use, copy, modify, and/or distribute this software for any
 28 *    purpose with or without fee is hereby granted, provided that the above
 29 *    copyright notice and this permission notice appear in all copies.
 30 *
 31 *    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 32 *    WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 33 *    MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 34 *    ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 35 *    WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 36 *    ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 37 *    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 38 */
 39#ifndef __CARL9170_H
 40#define __CARL9170_H
 41
 42#include <linux/kernel.h>
 43#include <linux/firmware.h>
 44#include <linux/completion.h>
 45#include <linux/spinlock.h>
 46#include <linux/hw_random.h>
 47#include <net/cfg80211.h>
 48#include <net/mac80211.h>
 49#include <linux/usb.h>
 50#ifdef CONFIG_CARL9170_LEDS
 51#include <linux/leds.h>
 52#endif /* CONFIG_CARL9170_LEDS */
 53#ifdef CONFIG_CARL9170_WPC
 54#include <linux/input.h>
 55#endif /* CONFIG_CARL9170_WPC */
 56#include "eeprom.h"
 57#include "wlan.h"
 58#include "hw.h"
 59#include "fwdesc.h"
 60#include "fwcmd.h"
 61#include "../regd.h"
 62
 63#ifdef CONFIG_CARL9170_DEBUGFS
 64#include "debug.h"
 65#endif /* CONFIG_CARL9170_DEBUGFS */
 66
 67#define CARL9170FW_NAME	"carl9170-1.fw"
 68
 69#define PAYLOAD_MAX	(CARL9170_MAX_CMD_LEN / 4 - 1)
 70
 71static const u8 ar9170_qmap[__AR9170_NUM_TXQ] = { 3, 2, 1, 0 };
 72
 73enum carl9170_rf_init_mode {
 74	CARL9170_RFI_NONE,
 75	CARL9170_RFI_WARM,
 76	CARL9170_RFI_COLD,
 77};
 78
 79#define CARL9170_MAX_RX_BUFFER_SIZE		8192
 80
 81enum carl9170_device_state {
 82	CARL9170_UNKNOWN_STATE,
 83	CARL9170_STOPPED,
 84	CARL9170_IDLE,
 85	CARL9170_STARTED,
 86};
 87
 88#define CARL9170_NUM_TID		16
 89#define WME_BA_BMP_SIZE			64
 90#define CARL9170_TX_USER_RATE_TRIES	3
 91
 92#define WME_AC_BE   2
 93#define WME_AC_BK   3
 94#define WME_AC_VI   1
 95#define WME_AC_VO   0
 96
 97#define TID_TO_WME_AC(_tid)				\
 98	((((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE :	\
 99	 (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK :	\
100	 (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI :	\
101	 WME_AC_VO)
102
103#define SEQ_DIFF(_start, _seq) \
104	(((_start) - (_seq)) & 0x0fff)
105#define SEQ_PREV(_seq) \
106	(((_seq) - 1) & 0x0fff)
107#define SEQ_NEXT(_seq) \
108	(((_seq) + 1) & 0x0fff)
109#define BAW_WITHIN(_start, _bawsz, _seqno) \
110	((((_seqno) - (_start)) & 0xfff) < (_bawsz))
111
112enum carl9170_tid_state {
113	CARL9170_TID_STATE_INVALID,
114	CARL9170_TID_STATE_KILLED,
115	CARL9170_TID_STATE_SHUTDOWN,
116	CARL9170_TID_STATE_SUSPEND,
117	CARL9170_TID_STATE_PROGRESS,
118	CARL9170_TID_STATE_IDLE,
119	CARL9170_TID_STATE_XMIT,
120};
121
122#define CARL9170_BAW_BITS (2 * WME_BA_BMP_SIZE)
123#define CARL9170_BAW_SIZE (BITS_TO_LONGS(CARL9170_BAW_BITS))
124#define CARL9170_BAW_LEN (DIV_ROUND_UP(CARL9170_BAW_BITS, BITS_PER_BYTE))
125
126struct carl9170_sta_tid {
127	/* must be the first entry! */
128	struct list_head list;
129
130	/* temporary list for RCU unlink procedure */
131	struct list_head tmp_list;
132
133	/* lock for the following data structures */
134	spinlock_t lock;
135
136	unsigned int counter;
137	enum carl9170_tid_state state;
138	u8 tid;		/* TID number ( 0 - 15 ) */
139	u16 max;	/* max. AMPDU size */
140
141	u16 snx;	/* awaiting _next_ frame */
142	u16 hsn;	/* highest _queued_ sequence */
143	u16 bsn;	/* base of the tx/agg bitmap */
144	unsigned long bitmap[CARL9170_BAW_SIZE];
145
146	/* Preaggregation reorder queue */
147	struct sk_buff_head queue;
148};
149
150#define CARL9170_QUEUE_TIMEOUT		256
151#define CARL9170_BUMP_QUEUE		1000
152#define CARL9170_TX_TIMEOUT		2500
153#define CARL9170_JANITOR_DELAY		128
154#define CARL9170_QUEUE_STUCK_TIMEOUT	5500
155#define CARL9170_STAT_WORK		30000
156
157#define CARL9170_NUM_TX_AGG_MAX		30
158
159/*
160 * Tradeoff between stability/latency and speed.
161 *
162 * AR9170_TXQ_DEPTH is devised by dividing the amount of available
163 * tx buffers with the size of a full ethernet frame + overhead.
164 *
165 * Naturally: The higher the limit, the faster the device CAN send.
166 * However, even a slight over-commitment at the wrong time and the
167 * hardware is doomed to send all already-queued frames at suboptimal
168 * rates. This in turn leads to an enormous amount of unsuccessful
169 * retries => Latency goes up, whereas the throughput goes down. CRASH!
170 */
171#define CARL9170_NUM_TX_LIMIT_HARD	((AR9170_TXQ_DEPTH * 3) / 2)
172#define CARL9170_NUM_TX_LIMIT_SOFT	(AR9170_TXQ_DEPTH)
173
174struct carl9170_tx_queue_stats {
175	unsigned int count;
176	unsigned int limit;
177	unsigned int len;
178};
179
180struct carl9170_vif {
181	unsigned int id;
182	struct ieee80211_vif __rcu *vif;
183};
184
185struct carl9170_vif_info {
186	struct list_head list;
187	bool active;
188	unsigned int id;
189	struct sk_buff *beacon;
190	bool enable_beacon;
191};
192
193#define AR9170_NUM_RX_URBS	16
194#define AR9170_NUM_RX_URBS_MUL	2
195#define AR9170_NUM_TX_URBS	8
196#define AR9170_NUM_RX_URBS_POOL (AR9170_NUM_RX_URBS_MUL * AR9170_NUM_RX_URBS)
197
198enum carl9170_device_features {
199	CARL9170_WPS_BUTTON		= BIT(0),
200	CARL9170_ONE_LED		= BIT(1),
201};
202
203#ifdef CONFIG_CARL9170_LEDS
204struct ar9170;
205
206struct carl9170_led {
207	struct ar9170 *ar;
208	struct led_classdev l;
209	char name[32];
210	unsigned int toggled;
211	bool last_state;
212	bool registered;
213};
214#endif /* CONFIG_CARL9170_LEDS */
215
216enum carl9170_restart_reasons {
217	CARL9170_RR_NO_REASON = 0,
218	CARL9170_RR_FATAL_FIRMWARE_ERROR,
219	CARL9170_RR_TOO_MANY_FIRMWARE_ERRORS,
220	CARL9170_RR_WATCHDOG,
221	CARL9170_RR_STUCK_TX,
222	CARL9170_RR_UNRESPONSIVE_DEVICE,
223	CARL9170_RR_COMMAND_TIMEOUT,
224	CARL9170_RR_TOO_MANY_PHY_ERRORS,
225	CARL9170_RR_LOST_RSP,
226	CARL9170_RR_INVALID_RSP,
227	CARL9170_RR_USER_REQUEST,
228
229	__CARL9170_RR_LAST,
230};
231
232enum carl9170_erp_modes {
233	CARL9170_ERP_INVALID,
234	CARL9170_ERP_AUTO,
235	CARL9170_ERP_MAC80211,
236	CARL9170_ERP_OFF,
237	CARL9170_ERP_CTS,
238	CARL9170_ERP_RTS,
239	__CARL9170_ERP_NUM,
240};
241
242struct ar9170 {
243	struct ath_common common;
244	struct ieee80211_hw *hw;
245	struct mutex mutex;
246	enum carl9170_device_state state;
247	spinlock_t state_lock;
248	enum carl9170_restart_reasons last_reason;
249	bool registered;
250
251	/* USB */
252	struct usb_device *udev;
253	struct usb_interface *intf;
254	struct usb_anchor rx_anch;
255	struct usb_anchor rx_work;
256	struct usb_anchor rx_pool;
257	struct usb_anchor tx_wait;
258	struct usb_anchor tx_anch;
259	struct usb_anchor tx_cmd;
260	struct usb_anchor tx_err;
261	struct tasklet_struct usb_tasklet;
262	atomic_t tx_cmd_urbs;
263	atomic_t tx_anch_urbs;
264	atomic_t rx_anch_urbs;
265	atomic_t rx_work_urbs;
266	atomic_t rx_pool_urbs;
267	kernel_ulong_t features;
268
269	/* firmware settings */
270	struct completion fw_load_wait;
271	struct completion fw_boot_wait;
272	struct {
273		const struct carl9170fw_desc_head *desc;
274		const struct firmware *fw;
275		unsigned int offset;
276		unsigned int address;
277		unsigned int cmd_bufs;
278		unsigned int api_version;
279		unsigned int vif_num;
280		unsigned int err_counter;
281		unsigned int bug_counter;
282		u32 beacon_addr;
283		unsigned int beacon_max_len;
284		bool rx_stream;
285		bool tx_stream;
286		bool rx_filter;
287		bool hw_counters;
288		unsigned int mem_blocks;
289		unsigned int mem_block_size;
290		unsigned int rx_size;
291		unsigned int tx_seq_table;
292	} fw;
293
294	/* interface configuration combinations */
295	struct ieee80211_iface_limit if_comb_limits[1];
296	struct ieee80211_iface_combination if_combs[1];
297
298	/* reset / stuck frames/queue detection */
299	struct work_struct restart_work;
300	struct work_struct ping_work;
301	unsigned int restart_counter;
302	unsigned long queue_stop_timeout[__AR9170_NUM_TXQ];
303	unsigned long max_queue_stop_timeout[__AR9170_NUM_TXQ];
304	bool needs_full_reset;
305	atomic_t pending_restarts;
306
307	/* interface mode settings */
308	struct list_head vif_list;
309	unsigned long vif_bitmap;
310	unsigned int vifs;
311	struct carl9170_vif vif_priv[AR9170_MAX_VIRTUAL_MAC];
312
313	/* beaconing */
314	spinlock_t beacon_lock;
315	unsigned int global_pretbtt;
316	unsigned int global_beacon_int;
317	struct carl9170_vif_info __rcu *beacon_iter;
318	unsigned int beacon_enabled;
319
320	/* cryptographic engine */
321	u64 usedkeys;
322	bool rx_software_decryption;
323	bool disable_offload;
324
325	/* filter settings */
326	u64 cur_mc_hash;
327	u32 cur_filter;
328	unsigned int filter_state;
329	unsigned int rx_filter_caps;
330	bool sniffer_enabled;
331
332	/* MAC */
333	enum carl9170_erp_modes erp_mode;
334
335	/* PHY */
336	struct ieee80211_channel *channel;
337	unsigned int num_channels;
338	int noise[4];
339	unsigned int chan_fail;
340	unsigned int total_chan_fail;
341	u8 heavy_clip;
342	u8 ht_settings;
343	struct {
344		u64 active;	/* usec */
345		u64 cca;	/* usec */
346		u64 tx_time;	/* usec */
347		u64 rx_total;
348		u64 rx_overrun;
349	} tally;
350	struct delayed_work stat_work;
351	struct survey_info *survey;
352
353	/* power calibration data */
354	u8 power_5G_leg[4];
355	u8 power_2G_cck[4];
356	u8 power_2G_ofdm[4];
357	u8 power_5G_ht20[8];
358	u8 power_5G_ht40[8];
359	u8 power_2G_ht20[8];
360	u8 power_2G_ht40[8];
361
362#ifdef CONFIG_CARL9170_LEDS
363	/* LED */
364	struct delayed_work led_work;
365	struct carl9170_led leds[AR9170_NUM_LEDS];
366#endif /* CONFIG_CARL9170_LEDS */
367
368	/* qos queue settings */
369	spinlock_t tx_stats_lock;
370	struct carl9170_tx_queue_stats tx_stats[__AR9170_NUM_TXQ];
371	struct ieee80211_tx_queue_params edcf[5];
372	struct completion tx_flush;
373
374	/* CMD */
375	int cmd_seq;
376	int readlen;
377	u8 *readbuf;
378	spinlock_t cmd_lock;
379	struct completion cmd_wait;
380	union {
381		__le32 cmd_buf[PAYLOAD_MAX + 1];
382		struct carl9170_cmd cmd;
383		struct carl9170_rsp rsp;
384	};
385
386	/* statistics */
387	unsigned int tx_dropped;
388	unsigned int tx_ack_failures;
389	unsigned int tx_fcs_errors;
390	unsigned int rx_dropped;
391
392	/* EEPROM */
393	struct ar9170_eeprom eeprom;
394
395	/* tx queuing */
396	struct sk_buff_head tx_pending[__AR9170_NUM_TXQ];
397	struct sk_buff_head tx_status[__AR9170_NUM_TXQ];
398	struct delayed_work tx_janitor;
399	unsigned long tx_janitor_last_run;
400	bool tx_schedule;
401
402	/* tx ampdu */
403	struct work_struct ampdu_work;
404	spinlock_t tx_ampdu_list_lock;
405	struct carl9170_sta_tid __rcu *tx_ampdu_iter;
406	struct list_head tx_ampdu_list;
407	atomic_t tx_ampdu_upload;
408	atomic_t tx_ampdu_scheduler;
409	atomic_t tx_total_pending;
410	atomic_t tx_total_queued;
411	unsigned int tx_ampdu_list_len;
412	int current_density;
413	int current_factor;
414	bool tx_ampdu_schedule;
415
416	/* internal memory management */
417	spinlock_t mem_lock;
418	unsigned long *mem_bitmap;
419	atomic_t mem_free_blocks;
420	atomic_t mem_allocs;
421
422	/* rxstream mpdu merge */
423	struct ar9170_rx_head rx_plcp;
424	bool rx_has_plcp;
425	struct sk_buff *rx_failover;
426	int rx_failover_missing;
427
428#ifdef CONFIG_CARL9170_WPC
429	struct {
430		bool pbc_state;
431		struct input_dev *pbc;
432		char name[32];
433		char phys[32];
434	} wps;
435#endif /* CONFIG_CARL9170_WPC */
436
437#ifdef CONFIG_CARL9170_DEBUGFS
438	struct carl9170_debug debug;
439	struct dentry *debug_dir;
440#endif /* CONFIG_CARL9170_DEBUGFS */
441
442	/* PSM */
443	struct work_struct ps_work;
444	struct {
445		unsigned int dtim_counter;
446		unsigned long last_beacon;
447		unsigned long last_action;
448		unsigned long last_slept;
449		unsigned int sleep_ms;
450		unsigned int off_override;
451		bool state;
452	} ps;
453
454#ifdef CONFIG_CARL9170_HWRNG
455# define CARL9170_HWRNG_CACHE_SIZE	CARL9170_MAX_CMD_PAYLOAD_LEN
456	struct {
457		struct hwrng rng;
458		bool initialized;
459		char name[30 + 1];
460		u16 cache[CARL9170_HWRNG_CACHE_SIZE / sizeof(u16)];
461		unsigned int cache_idx;
462	} rng;
463#endif /* CONFIG_CARL9170_HWRNG */
464};
465
466enum carl9170_ps_off_override_reasons {
467	PS_OFF_VIF	= BIT(0),
468	PS_OFF_BCN	= BIT(1),
469};
470
471struct carl9170_ba_stats {
472	u8 ampdu_len;
473	u8 ampdu_ack_len;
474	bool clear;
475	bool req;
476};
477
478struct carl9170_sta_info {
479	bool ht_sta;
480	bool sleeping;
481	atomic_t pending_frames;
482	unsigned int ampdu_max_len;
483	struct carl9170_sta_tid __rcu *agg[CARL9170_NUM_TID];
484	struct carl9170_ba_stats stats[CARL9170_NUM_TID];
485};
486
487struct carl9170_tx_info {
488	unsigned long timeout;
489	struct ar9170 *ar;
490	struct kref ref;
491};
492
493#define CHK_DEV_STATE(a, s)	(((struct ar9170 *)a)->state >= (s))
494#define IS_INITIALIZED(a)	(CHK_DEV_STATE(a, CARL9170_STOPPED))
495#define IS_ACCEPTING_CMD(a)	(CHK_DEV_STATE(a, CARL9170_IDLE))
496#define IS_STARTED(a)		(CHK_DEV_STATE(a, CARL9170_STARTED))
497
498static inline void __carl9170_set_state(struct ar9170 *ar,
499	enum carl9170_device_state newstate)
500{
501	ar->state = newstate;
502}
503
504static inline void carl9170_set_state(struct ar9170 *ar,
505	enum carl9170_device_state newstate)
506{
507	unsigned long flags;
508
509	spin_lock_irqsave(&ar->state_lock, flags);
510	__carl9170_set_state(ar, newstate);
511	spin_unlock_irqrestore(&ar->state_lock, flags);
512}
513
514static inline void carl9170_set_state_when(struct ar9170 *ar,
515	enum carl9170_device_state min, enum carl9170_device_state newstate)
516{
517	unsigned long flags;
518
519	spin_lock_irqsave(&ar->state_lock, flags);
520	if (CHK_DEV_STATE(ar, min))
521		__carl9170_set_state(ar, newstate);
522	spin_unlock_irqrestore(&ar->state_lock, flags);
523}
524
525/* exported interface */
526void *carl9170_alloc(size_t priv_size);
527int carl9170_register(struct ar9170 *ar);
528void carl9170_unregister(struct ar9170 *ar);
529void carl9170_free(struct ar9170 *ar);
530void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r);
531void carl9170_ps_check(struct ar9170 *ar);
532
533/* USB back-end */
534int carl9170_usb_open(struct ar9170 *ar);
535void carl9170_usb_stop(struct ar9170 *ar);
536void carl9170_usb_tx(struct ar9170 *ar, struct sk_buff *skb);
537void carl9170_usb_handle_tx_err(struct ar9170 *ar);
538int carl9170_exec_cmd(struct ar9170 *ar, const enum carl9170_cmd_oids,
539		      u32 plen, void *payload, u32 rlen, void *resp);
540int __carl9170_exec_cmd(struct ar9170 *ar, struct carl9170_cmd *cmd,
541			const bool free_buf);
542int carl9170_usb_restart(struct ar9170 *ar);
543void carl9170_usb_reset(struct ar9170 *ar);
544
545/* MAC */
546int carl9170_init_mac(struct ar9170 *ar);
547int carl9170_set_qos(struct ar9170 *ar);
548int carl9170_update_multicast(struct ar9170 *ar, const u64 mc_hast);
549int carl9170_mod_virtual_mac(struct ar9170 *ar, const unsigned int id,
550			     const u8 *mac);
551int carl9170_set_operating_mode(struct ar9170 *ar);
552int carl9170_set_beacon_timers(struct ar9170 *ar);
553int carl9170_set_dyn_sifs_ack(struct ar9170 *ar);
554int carl9170_set_rts_cts_rate(struct ar9170 *ar);
555int carl9170_set_ampdu_settings(struct ar9170 *ar);
556int carl9170_set_slot_time(struct ar9170 *ar);
557int carl9170_set_mac_rates(struct ar9170 *ar);
558int carl9170_set_hwretry_limit(struct ar9170 *ar, const u32 max_retry);
559int carl9170_upload_key(struct ar9170 *ar, const u8 id, const u8 *mac,
560	const u8 ktype, const u8 keyidx, const u8 *keydata, const int keylen);
561int carl9170_disable_key(struct ar9170 *ar, const u8 id);
562int carl9170_set_mac_tpc(struct ar9170 *ar, struct ieee80211_channel *channel);
563
564/* RX */
565void carl9170_rx(struct ar9170 *ar, void *buf, unsigned int len);
566void carl9170_handle_command_response(struct ar9170 *ar, void *buf, u32 len);
567
568/* TX */
569void carl9170_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb);
570void carl9170_tx_janitor(struct work_struct *work);
571void carl9170_tx_process_status(struct ar9170 *ar,
572				const struct carl9170_rsp *cmd);
573void carl9170_tx_status(struct ar9170 *ar, struct sk_buff *skb,
574			const bool success);
575void carl9170_tx_callback(struct ar9170 *ar, struct sk_buff *skb);
576void carl9170_tx_drop(struct ar9170 *ar, struct sk_buff *skb);
577void carl9170_tx_scheduler(struct ar9170 *ar);
578void carl9170_tx_get_skb(struct sk_buff *skb);
579int carl9170_tx_put_skb(struct sk_buff *skb);
580int carl9170_update_beacon(struct ar9170 *ar, const bool submit);
581
582/* LEDs */
583#ifdef CONFIG_CARL9170_LEDS
584int carl9170_led_register(struct ar9170 *ar);
585void carl9170_led_unregister(struct ar9170 *ar);
586#endif /* CONFIG_CARL9170_LEDS */
587int carl9170_led_init(struct ar9170 *ar);
588int carl9170_led_set_state(struct ar9170 *ar, const u32 led_state);
589
590/* PHY / RF */
591int carl9170_set_channel(struct ar9170 *ar, struct ieee80211_channel *channel,
592	enum nl80211_channel_type bw, enum carl9170_rf_init_mode rfi);
593int carl9170_get_noisefloor(struct ar9170 *ar);
594
595/* FW */
596int carl9170_parse_firmware(struct ar9170 *ar);
 
597
598extern struct ieee80211_rate __carl9170_ratetable[];
599extern int modparam_noht;
600
601static inline struct ar9170 *carl9170_get_priv(struct carl9170_vif *carl_vif)
602{
603	return container_of(carl_vif, struct ar9170,
604			    vif_priv[carl_vif->id]);
605}
606
607static inline struct ieee80211_hdr *carl9170_get_hdr(struct sk_buff *skb)
608{
609	return (void *)((struct _carl9170_tx_superframe *)
610		skb->data)->frame_data;
611}
612
613static inline u16 get_seq_h(struct ieee80211_hdr *hdr)
614{
615	return le16_to_cpu(hdr->seq_ctrl) >> 4;
616}
617
618static inline u16 carl9170_get_seq(struct sk_buff *skb)
619{
620	return get_seq_h(carl9170_get_hdr(skb));
621}
622
623static inline u16 get_tid_h(struct ieee80211_hdr *hdr)
624{
625	return (ieee80211_get_qos_ctl(hdr))[0] & IEEE80211_QOS_CTL_TID_MASK;
626}
627
628static inline u16 carl9170_get_tid(struct sk_buff *skb)
629{
630	return get_tid_h(carl9170_get_hdr(skb));
631}
632
633static inline struct ieee80211_vif *
634carl9170_get_vif(struct carl9170_vif_info *priv)
635{
636	return container_of((void *)priv, struct ieee80211_vif, drv_priv);
637}
638
639/* Protected by ar->mutex or RCU */
640static inline struct ieee80211_vif *carl9170_get_main_vif(struct ar9170 *ar)
641{
642	struct carl9170_vif_info *cvif;
643
644	list_for_each_entry_rcu(cvif, &ar->vif_list, list) {
645		if (cvif->active)
646			return carl9170_get_vif(cvif);
647	}
648
649	return NULL;
650}
651
652static inline bool is_main_vif(struct ar9170 *ar, struct ieee80211_vif *vif)
653{
654	bool ret;
655
656	rcu_read_lock();
657	ret = (carl9170_get_main_vif(ar) == vif);
658	rcu_read_unlock();
659	return ret;
660}
661
662#endif /* __CARL9170_H */