162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci	Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
462306a36Sopenharmony_ci	Copyright (C) 2004 - 2010 Ivo van Doorn <IvDoorn@gmail.com>
562306a36Sopenharmony_ci	Copyright (C) 2004 - 2009 Gertjan van Wingerde <gwingerde@gmail.com>
662306a36Sopenharmony_ci	<http://rt2x00.serialmonkey.com>
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci/*
1162306a36Sopenharmony_ci	Module: rt2x00
1262306a36Sopenharmony_ci	Abstract: rt2x00 global information.
1362306a36Sopenharmony_ci */
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#ifndef RT2X00_H
1662306a36Sopenharmony_ci#define RT2X00_H
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#include <linux/bitops.h>
1962306a36Sopenharmony_ci#include <linux/interrupt.h>
2062306a36Sopenharmony_ci#include <linux/skbuff.h>
2162306a36Sopenharmony_ci#include <linux/workqueue.h>
2262306a36Sopenharmony_ci#include <linux/firmware.h>
2362306a36Sopenharmony_ci#include <linux/leds.h>
2462306a36Sopenharmony_ci#include <linux/mutex.h>
2562306a36Sopenharmony_ci#include <linux/etherdevice.h>
2662306a36Sopenharmony_ci#include <linux/kfifo.h>
2762306a36Sopenharmony_ci#include <linux/hrtimer.h>
2862306a36Sopenharmony_ci#include <linux/average.h>
2962306a36Sopenharmony_ci#include <linux/usb.h>
3062306a36Sopenharmony_ci#include <linux/clk.h>
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci#include <net/mac80211.h>
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#include "rt2x00debug.h"
3562306a36Sopenharmony_ci#include "rt2x00dump.h"
3662306a36Sopenharmony_ci#include "rt2x00leds.h"
3762306a36Sopenharmony_ci#include "rt2x00reg.h"
3862306a36Sopenharmony_ci#include "rt2x00queue.h"
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci/*
4162306a36Sopenharmony_ci * Module information.
4262306a36Sopenharmony_ci */
4362306a36Sopenharmony_ci#define DRV_VERSION	"2.3.0"
4462306a36Sopenharmony_ci#define DRV_PROJECT	"http://rt2x00.serialmonkey.com"
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* Debug definitions.
4762306a36Sopenharmony_ci * Debug output has to be enabled during compile time.
4862306a36Sopenharmony_ci */
4962306a36Sopenharmony_ci#ifdef CONFIG_RT2X00_DEBUG
5062306a36Sopenharmony_ci#define DEBUG
5162306a36Sopenharmony_ci#endif /* CONFIG_RT2X00_DEBUG */
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/* Utility printing macros
5462306a36Sopenharmony_ci * rt2x00_probe_err is for messages when rt2x00_dev is uninitialized
5562306a36Sopenharmony_ci */
5662306a36Sopenharmony_ci#define rt2x00_probe_err(fmt, ...)					\
5762306a36Sopenharmony_ci	printk(KERN_ERR KBUILD_MODNAME ": %s: Error - " fmt,		\
5862306a36Sopenharmony_ci	       __func__, ##__VA_ARGS__)
5962306a36Sopenharmony_ci#define rt2x00_err(dev, fmt, ...)					\
6062306a36Sopenharmony_ci	wiphy_err_ratelimited((dev)->hw->wiphy, "%s: Error - " fmt,	\
6162306a36Sopenharmony_ci		  __func__, ##__VA_ARGS__)
6262306a36Sopenharmony_ci#define rt2x00_warn(dev, fmt, ...)					\
6362306a36Sopenharmony_ci	wiphy_warn_ratelimited((dev)->hw->wiphy, "%s: Warning - " fmt,	\
6462306a36Sopenharmony_ci		   __func__, ##__VA_ARGS__)
6562306a36Sopenharmony_ci#define rt2x00_info(dev, fmt, ...)					\
6662306a36Sopenharmony_ci	wiphy_info((dev)->hw->wiphy, "%s: Info - " fmt,			\
6762306a36Sopenharmony_ci		   __func__, ##__VA_ARGS__)
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/* Various debug levels */
7062306a36Sopenharmony_ci#define rt2x00_dbg(dev, fmt, ...)					\
7162306a36Sopenharmony_ci	wiphy_dbg((dev)->hw->wiphy, "%s: Debug - " fmt,			\
7262306a36Sopenharmony_ci		  __func__, ##__VA_ARGS__)
7362306a36Sopenharmony_ci#define rt2x00_eeprom_dbg(dev, fmt, ...)				\
7462306a36Sopenharmony_ci	wiphy_dbg((dev)->hw->wiphy, "%s: EEPROM recovery - " fmt,	\
7562306a36Sopenharmony_ci		  __func__, ##__VA_ARGS__)
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci/*
7862306a36Sopenharmony_ci * Duration calculations
7962306a36Sopenharmony_ci * The rate variable passed is: 100kbs.
8062306a36Sopenharmony_ci * To convert from bytes to bits we multiply size with 8,
8162306a36Sopenharmony_ci * then the size is multiplied with 10 to make the
8262306a36Sopenharmony_ci * real rate -> rate argument correction.
8362306a36Sopenharmony_ci */
8462306a36Sopenharmony_ci#define GET_DURATION(__size, __rate)	(((__size) * 8 * 10) / (__rate))
8562306a36Sopenharmony_ci#define GET_DURATION_RES(__size, __rate)(((__size) * 8 * 10) % (__rate))
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci/*
8862306a36Sopenharmony_ci * Determine the number of L2 padding bytes required between the header and
8962306a36Sopenharmony_ci * the payload.
9062306a36Sopenharmony_ci */
9162306a36Sopenharmony_ci#define L2PAD_SIZE(__hdrlen)	(-(__hdrlen) & 3)
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci/*
9462306a36Sopenharmony_ci * Determine the alignment requirement,
9562306a36Sopenharmony_ci * to make sure the 802.11 payload is padded to a 4-byte boundrary
9662306a36Sopenharmony_ci * we must determine the address of the payload and calculate the
9762306a36Sopenharmony_ci * amount of bytes needed to move the data.
9862306a36Sopenharmony_ci */
9962306a36Sopenharmony_ci#define ALIGN_SIZE(__skb, __header) \
10062306a36Sopenharmony_ci	(((unsigned long)((__skb)->data + (__header))) & 3)
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci/*
10362306a36Sopenharmony_ci * Constants for extra TX headroom for alignment purposes.
10462306a36Sopenharmony_ci */
10562306a36Sopenharmony_ci#define RT2X00_ALIGN_SIZE	4 /* Only whole frame needs alignment */
10662306a36Sopenharmony_ci#define RT2X00_L2PAD_SIZE	8 /* Both header & payload need alignment */
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci/*
10962306a36Sopenharmony_ci * Standard timing and size defines.
11062306a36Sopenharmony_ci * These values should follow the ieee80211 specifications.
11162306a36Sopenharmony_ci */
11262306a36Sopenharmony_ci#define ACK_SIZE		14
11362306a36Sopenharmony_ci#define IEEE80211_HEADER	24
11462306a36Sopenharmony_ci#define PLCP			48
11562306a36Sopenharmony_ci#define BEACON			100
11662306a36Sopenharmony_ci#define PREAMBLE		144
11762306a36Sopenharmony_ci#define SHORT_PREAMBLE		72
11862306a36Sopenharmony_ci#define SLOT_TIME		20
11962306a36Sopenharmony_ci#define SHORT_SLOT_TIME		9
12062306a36Sopenharmony_ci#define SIFS			10
12162306a36Sopenharmony_ci#define PIFS			(SIFS + SLOT_TIME)
12262306a36Sopenharmony_ci#define SHORT_PIFS		(SIFS + SHORT_SLOT_TIME)
12362306a36Sopenharmony_ci#define DIFS			(PIFS + SLOT_TIME)
12462306a36Sopenharmony_ci#define SHORT_DIFS		(SHORT_PIFS + SHORT_SLOT_TIME)
12562306a36Sopenharmony_ci#define EIFS			(SIFS + DIFS + \
12662306a36Sopenharmony_ci				  GET_DURATION(IEEE80211_HEADER + ACK_SIZE, 10))
12762306a36Sopenharmony_ci#define SHORT_EIFS		(SIFS + SHORT_DIFS + \
12862306a36Sopenharmony_ci				  GET_DURATION(IEEE80211_HEADER + ACK_SIZE, 10))
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_cienum rt2x00_chip_intf {
13162306a36Sopenharmony_ci	RT2X00_CHIP_INTF_PCI,
13262306a36Sopenharmony_ci	RT2X00_CHIP_INTF_PCIE,
13362306a36Sopenharmony_ci	RT2X00_CHIP_INTF_USB,
13462306a36Sopenharmony_ci	RT2X00_CHIP_INTF_SOC,
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/*
13862306a36Sopenharmony_ci * Chipset identification
13962306a36Sopenharmony_ci * The chipset on the device is composed of a RT and RF chip.
14062306a36Sopenharmony_ci * The chipset combination is important for determining device capabilities.
14162306a36Sopenharmony_ci */
14262306a36Sopenharmony_cistruct rt2x00_chip {
14362306a36Sopenharmony_ci	u16 rt;
14462306a36Sopenharmony_ci#define RT2460		0x2460
14562306a36Sopenharmony_ci#define RT2560		0x2560
14662306a36Sopenharmony_ci#define RT2570		0x2570
14762306a36Sopenharmony_ci#define RT2661		0x2661
14862306a36Sopenharmony_ci#define RT2573		0x2573
14962306a36Sopenharmony_ci#define RT2860		0x2860	/* 2.4GHz */
15062306a36Sopenharmony_ci#define RT2872		0x2872	/* WSOC */
15162306a36Sopenharmony_ci#define RT2883		0x2883	/* WSOC */
15262306a36Sopenharmony_ci#define RT3070		0x3070
15362306a36Sopenharmony_ci#define RT3071		0x3071
15462306a36Sopenharmony_ci#define RT3090		0x3090	/* 2.4GHz PCIe */
15562306a36Sopenharmony_ci#define RT3290		0x3290
15662306a36Sopenharmony_ci#define RT3352		0x3352  /* WSOC */
15762306a36Sopenharmony_ci#define RT3390		0x3390
15862306a36Sopenharmony_ci#define RT3572		0x3572
15962306a36Sopenharmony_ci#define RT3593		0x3593
16062306a36Sopenharmony_ci#define RT3883		0x3883	/* WSOC */
16162306a36Sopenharmony_ci#define RT5350		0x5350  /* WSOC 2.4GHz */
16262306a36Sopenharmony_ci#define RT5390		0x5390  /* 2.4GHz */
16362306a36Sopenharmony_ci#define RT5392		0x5392  /* 2.4GHz */
16462306a36Sopenharmony_ci#define RT5592		0x5592
16562306a36Sopenharmony_ci#define RT6352		0x6352  /* WSOC 2.4GHz */
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	u16 rf;
16862306a36Sopenharmony_ci	u16 rev;
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci	enum rt2x00_chip_intf intf;
17162306a36Sopenharmony_ci};
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci/*
17462306a36Sopenharmony_ci * RF register values that belong to a particular channel.
17562306a36Sopenharmony_ci */
17662306a36Sopenharmony_cistruct rf_channel {
17762306a36Sopenharmony_ci	int channel;
17862306a36Sopenharmony_ci	u32 rf1;
17962306a36Sopenharmony_ci	u32 rf2;
18062306a36Sopenharmony_ci	u32 rf3;
18162306a36Sopenharmony_ci	u32 rf4;
18262306a36Sopenharmony_ci};
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_ci/*
18562306a36Sopenharmony_ci * Information structure for channel survey.
18662306a36Sopenharmony_ci */
18762306a36Sopenharmony_cistruct rt2x00_chan_survey {
18862306a36Sopenharmony_ci	u64 time_idle;
18962306a36Sopenharmony_ci	u64 time_busy;
19062306a36Sopenharmony_ci	u64 time_ext_busy;
19162306a36Sopenharmony_ci};
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci/*
19462306a36Sopenharmony_ci * Channel information structure
19562306a36Sopenharmony_ci */
19662306a36Sopenharmony_cistruct channel_info {
19762306a36Sopenharmony_ci	unsigned int flags;
19862306a36Sopenharmony_ci#define GEOGRAPHY_ALLOWED	0x00000001
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	short max_power;
20162306a36Sopenharmony_ci	short default_power1;
20262306a36Sopenharmony_ci	short default_power2;
20362306a36Sopenharmony_ci	short default_power3;
20462306a36Sopenharmony_ci};
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci/*
20762306a36Sopenharmony_ci * Antenna setup values.
20862306a36Sopenharmony_ci */
20962306a36Sopenharmony_cistruct antenna_setup {
21062306a36Sopenharmony_ci	enum antenna rx;
21162306a36Sopenharmony_ci	enum antenna tx;
21262306a36Sopenharmony_ci	u8 rx_chain_num;
21362306a36Sopenharmony_ci	u8 tx_chain_num;
21462306a36Sopenharmony_ci};
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci/*
21762306a36Sopenharmony_ci * Quality statistics about the currently active link.
21862306a36Sopenharmony_ci */
21962306a36Sopenharmony_cistruct link_qual {
22062306a36Sopenharmony_ci	/*
22162306a36Sopenharmony_ci	 * Statistics required for Link tuning by driver
22262306a36Sopenharmony_ci	 * The rssi value is provided by rt2x00lib during the
22362306a36Sopenharmony_ci	 * link_tuner() callback function.
22462306a36Sopenharmony_ci	 * The false_cca field is filled during the link_stats()
22562306a36Sopenharmony_ci	 * callback function and could be used during the
22662306a36Sopenharmony_ci	 * link_tuner() callback function.
22762306a36Sopenharmony_ci	 */
22862306a36Sopenharmony_ci	int rssi;
22962306a36Sopenharmony_ci	int false_cca;
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	/*
23262306a36Sopenharmony_ci	 * VGC levels
23362306a36Sopenharmony_ci	 * Hardware driver will tune the VGC level during each call
23462306a36Sopenharmony_ci	 * to the link_tuner() callback function. This vgc_level is
23562306a36Sopenharmony_ci	 * determined based on the link quality statistics like
23662306a36Sopenharmony_ci	 * average RSSI and the false CCA count.
23762306a36Sopenharmony_ci	 *
23862306a36Sopenharmony_ci	 * In some cases the drivers need to differentiate between
23962306a36Sopenharmony_ci	 * the currently "desired" VGC level and the level configured
24062306a36Sopenharmony_ci	 * in the hardware. The latter is important to reduce the
24162306a36Sopenharmony_ci	 * number of BBP register reads to reduce register access
24262306a36Sopenharmony_ci	 * overhead. For this reason we store both values here.
24362306a36Sopenharmony_ci	 */
24462306a36Sopenharmony_ci	u8 vgc_level;
24562306a36Sopenharmony_ci	u8 vgc_level_reg;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	/*
24862306a36Sopenharmony_ci	 * Statistics required for Signal quality calculation.
24962306a36Sopenharmony_ci	 * These fields might be changed during the link_stats()
25062306a36Sopenharmony_ci	 * callback function.
25162306a36Sopenharmony_ci	 */
25262306a36Sopenharmony_ci	int rx_success;
25362306a36Sopenharmony_ci	int rx_failed;
25462306a36Sopenharmony_ci	int tx_success;
25562306a36Sopenharmony_ci	int tx_failed;
25662306a36Sopenharmony_ci};
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ciDECLARE_EWMA(rssi, 10, 8)
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci/*
26162306a36Sopenharmony_ci * Antenna settings about the currently active link.
26262306a36Sopenharmony_ci */
26362306a36Sopenharmony_cistruct link_ant {
26462306a36Sopenharmony_ci	/*
26562306a36Sopenharmony_ci	 * Antenna flags
26662306a36Sopenharmony_ci	 */
26762306a36Sopenharmony_ci	unsigned int flags;
26862306a36Sopenharmony_ci#define ANTENNA_RX_DIVERSITY	0x00000001
26962306a36Sopenharmony_ci#define ANTENNA_TX_DIVERSITY	0x00000002
27062306a36Sopenharmony_ci#define ANTENNA_MODE_SAMPLE	0x00000004
27162306a36Sopenharmony_ci
27262306a36Sopenharmony_ci	/*
27362306a36Sopenharmony_ci	 * Currently active TX/RX antenna setup.
27462306a36Sopenharmony_ci	 * When software diversity is used, this will indicate
27562306a36Sopenharmony_ci	 * which antenna is actually used at this time.
27662306a36Sopenharmony_ci	 */
27762306a36Sopenharmony_ci	struct antenna_setup active;
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	/*
28062306a36Sopenharmony_ci	 * RSSI history information for the antenna.
28162306a36Sopenharmony_ci	 * Used to determine when to switch antenna
28262306a36Sopenharmony_ci	 * when using software diversity.
28362306a36Sopenharmony_ci	 */
28462306a36Sopenharmony_ci	int rssi_history;
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	/*
28762306a36Sopenharmony_ci	 * Current RSSI average of the currently active antenna.
28862306a36Sopenharmony_ci	 * Similar to the avg_rssi in the link_qual structure
28962306a36Sopenharmony_ci	 * this value is updated by using the walking average.
29062306a36Sopenharmony_ci	 */
29162306a36Sopenharmony_ci	struct ewma_rssi rssi_ant;
29262306a36Sopenharmony_ci};
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci/*
29562306a36Sopenharmony_ci * To optimize the quality of the link we need to store
29662306a36Sopenharmony_ci * the quality of received frames and periodically
29762306a36Sopenharmony_ci * optimize the link.
29862306a36Sopenharmony_ci */
29962306a36Sopenharmony_cistruct link {
30062306a36Sopenharmony_ci	/*
30162306a36Sopenharmony_ci	 * Link tuner counter
30262306a36Sopenharmony_ci	 * The number of times the link has been tuned
30362306a36Sopenharmony_ci	 * since the radio has been switched on.
30462306a36Sopenharmony_ci	 */
30562306a36Sopenharmony_ci	u32 count;
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_ci	/*
30862306a36Sopenharmony_ci	 * Quality measurement values.
30962306a36Sopenharmony_ci	 */
31062306a36Sopenharmony_ci	struct link_qual qual;
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	/*
31362306a36Sopenharmony_ci	 * TX/RX antenna setup.
31462306a36Sopenharmony_ci	 */
31562306a36Sopenharmony_ci	struct link_ant ant;
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	/*
31862306a36Sopenharmony_ci	 * Currently active average RSSI value
31962306a36Sopenharmony_ci	 */
32062306a36Sopenharmony_ci	struct ewma_rssi avg_rssi;
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci	/*
32362306a36Sopenharmony_ci	 * Work structure for scheduling periodic link tuning.
32462306a36Sopenharmony_ci	 */
32562306a36Sopenharmony_ci	struct delayed_work work;
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci	/*
32862306a36Sopenharmony_ci	 * Work structure for scheduling periodic watchdog monitoring.
32962306a36Sopenharmony_ci	 * This work must be scheduled on the kernel workqueue, while
33062306a36Sopenharmony_ci	 * all other work structures must be queued on the mac80211
33162306a36Sopenharmony_ci	 * workqueue. This guarantees that the watchdog can schedule
33262306a36Sopenharmony_ci	 * other work structures and wait for their completion in order
33362306a36Sopenharmony_ci	 * to bring the device/driver back into the desired state.
33462306a36Sopenharmony_ci	 */
33562306a36Sopenharmony_ci	struct delayed_work watchdog_work;
33662306a36Sopenharmony_ci	unsigned int watchdog_interval;
33762306a36Sopenharmony_ci	bool watchdog_disabled;
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci	/*
34062306a36Sopenharmony_ci	 * Work structure for scheduling periodic AGC adjustments.
34162306a36Sopenharmony_ci	 */
34262306a36Sopenharmony_ci	struct delayed_work agc_work;
34362306a36Sopenharmony_ci
34462306a36Sopenharmony_ci	/*
34562306a36Sopenharmony_ci	 * Work structure for scheduling periodic VCO calibration.
34662306a36Sopenharmony_ci	 */
34762306a36Sopenharmony_ci	struct delayed_work vco_work;
34862306a36Sopenharmony_ci};
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_cienum rt2x00_delayed_flags {
35162306a36Sopenharmony_ci	DELAYED_UPDATE_BEACON,
35262306a36Sopenharmony_ci};
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci/*
35562306a36Sopenharmony_ci * Interface structure
35662306a36Sopenharmony_ci * Per interface configuration details, this structure
35762306a36Sopenharmony_ci * is allocated as the private data for ieee80211_vif.
35862306a36Sopenharmony_ci */
35962306a36Sopenharmony_cistruct rt2x00_intf {
36062306a36Sopenharmony_ci	/*
36162306a36Sopenharmony_ci	 * beacon->skb must be protected with the mutex.
36262306a36Sopenharmony_ci	 */
36362306a36Sopenharmony_ci	struct mutex beacon_skb_mutex;
36462306a36Sopenharmony_ci
36562306a36Sopenharmony_ci	/*
36662306a36Sopenharmony_ci	 * Entry in the beacon queue which belongs to
36762306a36Sopenharmony_ci	 * this interface. Each interface has its own
36862306a36Sopenharmony_ci	 * dedicated beacon entry.
36962306a36Sopenharmony_ci	 */
37062306a36Sopenharmony_ci	struct queue_entry *beacon;
37162306a36Sopenharmony_ci	bool enable_beacon;
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	/*
37462306a36Sopenharmony_ci	 * Actions that needed rescheduling.
37562306a36Sopenharmony_ci	 */
37662306a36Sopenharmony_ci	unsigned long delayed_flags;
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci	/*
37962306a36Sopenharmony_ci	 * Software sequence counter, this is only required
38062306a36Sopenharmony_ci	 * for hardware which doesn't support hardware
38162306a36Sopenharmony_ci	 * sequence counting.
38262306a36Sopenharmony_ci	 */
38362306a36Sopenharmony_ci	atomic_t seqno;
38462306a36Sopenharmony_ci};
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_cistatic inline struct rt2x00_intf* vif_to_intf(struct ieee80211_vif *vif)
38762306a36Sopenharmony_ci{
38862306a36Sopenharmony_ci	return (struct rt2x00_intf *)vif->drv_priv;
38962306a36Sopenharmony_ci}
39062306a36Sopenharmony_ci
39162306a36Sopenharmony_ci/**
39262306a36Sopenharmony_ci * struct hw_mode_spec: Hardware specifications structure
39362306a36Sopenharmony_ci *
39462306a36Sopenharmony_ci * Details about the supported modes, rates and channels
39562306a36Sopenharmony_ci * of a particular chipset. This is used by rt2x00lib
39662306a36Sopenharmony_ci * to build the ieee80211_hw_mode array for mac80211.
39762306a36Sopenharmony_ci *
39862306a36Sopenharmony_ci * @supported_bands: Bitmask contained the supported bands (2.4GHz, 5.2GHz).
39962306a36Sopenharmony_ci * @supported_rates: Rate types which are supported (CCK, OFDM).
40062306a36Sopenharmony_ci * @num_channels: Number of supported channels. This is used as array size
40162306a36Sopenharmony_ci *	for @tx_power_a, @tx_power_bg and @channels.
40262306a36Sopenharmony_ci * @channels: Device/chipset specific channel values (See &struct rf_channel).
40362306a36Sopenharmony_ci * @channels_info: Additional information for channels (See &struct channel_info).
40462306a36Sopenharmony_ci * @ht: Driver HT Capabilities (See &ieee80211_sta_ht_cap).
40562306a36Sopenharmony_ci */
40662306a36Sopenharmony_cistruct hw_mode_spec {
40762306a36Sopenharmony_ci	unsigned int supported_bands;
40862306a36Sopenharmony_ci#define SUPPORT_BAND_2GHZ	0x00000001
40962306a36Sopenharmony_ci#define SUPPORT_BAND_5GHZ	0x00000002
41062306a36Sopenharmony_ci
41162306a36Sopenharmony_ci	unsigned int supported_rates;
41262306a36Sopenharmony_ci#define SUPPORT_RATE_CCK	0x00000001
41362306a36Sopenharmony_ci#define SUPPORT_RATE_OFDM	0x00000002
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_ci	unsigned int num_channels;
41662306a36Sopenharmony_ci	const struct rf_channel *channels;
41762306a36Sopenharmony_ci	const struct channel_info *channels_info;
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_ci	struct ieee80211_sta_ht_cap ht;
42062306a36Sopenharmony_ci};
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_ci/*
42362306a36Sopenharmony_ci * Configuration structure wrapper around the
42462306a36Sopenharmony_ci * mac80211 configuration structure.
42562306a36Sopenharmony_ci * When mac80211 configures the driver, rt2x00lib
42662306a36Sopenharmony_ci * can precalculate values which are equal for all
42762306a36Sopenharmony_ci * rt2x00 drivers. Those values can be stored in here.
42862306a36Sopenharmony_ci */
42962306a36Sopenharmony_cistruct rt2x00lib_conf {
43062306a36Sopenharmony_ci	struct ieee80211_conf *conf;
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_ci	struct rf_channel rf;
43362306a36Sopenharmony_ci	struct channel_info channel;
43462306a36Sopenharmony_ci};
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_ci/*
43762306a36Sopenharmony_ci * Configuration structure for erp settings.
43862306a36Sopenharmony_ci */
43962306a36Sopenharmony_cistruct rt2x00lib_erp {
44062306a36Sopenharmony_ci	int short_preamble;
44162306a36Sopenharmony_ci	int cts_protection;
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	u32 basic_rates;
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_ci	int slot_time;
44662306a36Sopenharmony_ci
44762306a36Sopenharmony_ci	short sifs;
44862306a36Sopenharmony_ci	short pifs;
44962306a36Sopenharmony_ci	short difs;
45062306a36Sopenharmony_ci	short eifs;
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	u16 beacon_int;
45362306a36Sopenharmony_ci	u16 ht_opmode;
45462306a36Sopenharmony_ci};
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci/*
45762306a36Sopenharmony_ci * Configuration structure for hardware encryption.
45862306a36Sopenharmony_ci */
45962306a36Sopenharmony_cistruct rt2x00lib_crypto {
46062306a36Sopenharmony_ci	enum cipher cipher;
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci	enum set_key_cmd cmd;
46362306a36Sopenharmony_ci	const u8 *address;
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_ci	u32 bssidx;
46662306a36Sopenharmony_ci
46762306a36Sopenharmony_ci	u8 key[16];
46862306a36Sopenharmony_ci	u8 tx_mic[8];
46962306a36Sopenharmony_ci	u8 rx_mic[8];
47062306a36Sopenharmony_ci
47162306a36Sopenharmony_ci	int wcid;
47262306a36Sopenharmony_ci};
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci/*
47562306a36Sopenharmony_ci * Configuration structure wrapper around the
47662306a36Sopenharmony_ci * rt2x00 interface configuration handler.
47762306a36Sopenharmony_ci */
47862306a36Sopenharmony_cistruct rt2x00intf_conf {
47962306a36Sopenharmony_ci	/*
48062306a36Sopenharmony_ci	 * Interface type
48162306a36Sopenharmony_ci	 */
48262306a36Sopenharmony_ci	enum nl80211_iftype type;
48362306a36Sopenharmony_ci
48462306a36Sopenharmony_ci	/*
48562306a36Sopenharmony_ci	 * TSF sync value, this is dependent on the operation type.
48662306a36Sopenharmony_ci	 */
48762306a36Sopenharmony_ci	enum tsf_sync sync;
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci	/*
49062306a36Sopenharmony_ci	 * The MAC and BSSID addresses are simple array of bytes,
49162306a36Sopenharmony_ci	 * these arrays are little endian, so when sending the addresses
49262306a36Sopenharmony_ci	 * to the drivers, copy the it into a endian-signed variable.
49362306a36Sopenharmony_ci	 *
49462306a36Sopenharmony_ci	 * Note that all devices (except rt2500usb) have 32 bits
49562306a36Sopenharmony_ci	 * register word sizes. This means that whatever variable we
49662306a36Sopenharmony_ci	 * pass _must_ be a multiple of 32 bits. Otherwise the device
49762306a36Sopenharmony_ci	 * might not accept what we are sending to it.
49862306a36Sopenharmony_ci	 * This will also make it easier for the driver to write
49962306a36Sopenharmony_ci	 * the data to the device.
50062306a36Sopenharmony_ci	 */
50162306a36Sopenharmony_ci	__le32 mac[2];
50262306a36Sopenharmony_ci	__le32 bssid[2];
50362306a36Sopenharmony_ci};
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_ci/*
50662306a36Sopenharmony_ci * Private structure for storing STA details
50762306a36Sopenharmony_ci * wcid: Wireless Client ID
50862306a36Sopenharmony_ci */
50962306a36Sopenharmony_cistruct rt2x00_sta {
51062306a36Sopenharmony_ci	int wcid;
51162306a36Sopenharmony_ci};
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_cistatic inline struct rt2x00_sta* sta_to_rt2x00_sta(struct ieee80211_sta *sta)
51462306a36Sopenharmony_ci{
51562306a36Sopenharmony_ci	return (struct rt2x00_sta *)sta->drv_priv;
51662306a36Sopenharmony_ci}
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci/*
51962306a36Sopenharmony_ci * rt2x00lib callback functions.
52062306a36Sopenharmony_ci */
52162306a36Sopenharmony_cistruct rt2x00lib_ops {
52262306a36Sopenharmony_ci	/*
52362306a36Sopenharmony_ci	 * Interrupt handlers.
52462306a36Sopenharmony_ci	 */
52562306a36Sopenharmony_ci	irq_handler_t irq_handler;
52662306a36Sopenharmony_ci
52762306a36Sopenharmony_ci	/*
52862306a36Sopenharmony_ci	 * TX status tasklet handler.
52962306a36Sopenharmony_ci	 */
53062306a36Sopenharmony_ci	void (*txstatus_tasklet) (struct tasklet_struct *t);
53162306a36Sopenharmony_ci	void (*pretbtt_tasklet) (struct tasklet_struct *t);
53262306a36Sopenharmony_ci	void (*tbtt_tasklet) (struct tasklet_struct *t);
53362306a36Sopenharmony_ci	void (*rxdone_tasklet) (struct tasklet_struct *t);
53462306a36Sopenharmony_ci	void (*autowake_tasklet) (struct tasklet_struct *t);
53562306a36Sopenharmony_ci
53662306a36Sopenharmony_ci	/*
53762306a36Sopenharmony_ci	 * Device init handlers.
53862306a36Sopenharmony_ci	 */
53962306a36Sopenharmony_ci	int (*probe_hw) (struct rt2x00_dev *rt2x00dev);
54062306a36Sopenharmony_ci	char *(*get_firmware_name) (struct rt2x00_dev *rt2x00dev);
54162306a36Sopenharmony_ci	int (*check_firmware) (struct rt2x00_dev *rt2x00dev,
54262306a36Sopenharmony_ci			       const u8 *data, const size_t len);
54362306a36Sopenharmony_ci	int (*load_firmware) (struct rt2x00_dev *rt2x00dev,
54462306a36Sopenharmony_ci			      const u8 *data, const size_t len);
54562306a36Sopenharmony_ci
54662306a36Sopenharmony_ci	/*
54762306a36Sopenharmony_ci	 * Device initialization/deinitialization handlers.
54862306a36Sopenharmony_ci	 */
54962306a36Sopenharmony_ci	int (*initialize) (struct rt2x00_dev *rt2x00dev);
55062306a36Sopenharmony_ci	void (*uninitialize) (struct rt2x00_dev *rt2x00dev);
55162306a36Sopenharmony_ci
55262306a36Sopenharmony_ci	/*
55362306a36Sopenharmony_ci	 * queue initialization handlers
55462306a36Sopenharmony_ci	 */
55562306a36Sopenharmony_ci	bool (*get_entry_state) (struct queue_entry *entry);
55662306a36Sopenharmony_ci	void (*clear_entry) (struct queue_entry *entry);
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci	/*
55962306a36Sopenharmony_ci	 * Radio control handlers.
56062306a36Sopenharmony_ci	 */
56162306a36Sopenharmony_ci	int (*set_device_state) (struct rt2x00_dev *rt2x00dev,
56262306a36Sopenharmony_ci				 enum dev_state state);
56362306a36Sopenharmony_ci	int (*rfkill_poll) (struct rt2x00_dev *rt2x00dev);
56462306a36Sopenharmony_ci	void (*link_stats) (struct rt2x00_dev *rt2x00dev,
56562306a36Sopenharmony_ci			    struct link_qual *qual);
56662306a36Sopenharmony_ci	void (*reset_tuner) (struct rt2x00_dev *rt2x00dev,
56762306a36Sopenharmony_ci			     struct link_qual *qual);
56862306a36Sopenharmony_ci	void (*link_tuner) (struct rt2x00_dev *rt2x00dev,
56962306a36Sopenharmony_ci			    struct link_qual *qual, const u32 count);
57062306a36Sopenharmony_ci	void (*gain_calibration) (struct rt2x00_dev *rt2x00dev);
57162306a36Sopenharmony_ci	void (*vco_calibration) (struct rt2x00_dev *rt2x00dev);
57262306a36Sopenharmony_ci
57362306a36Sopenharmony_ci	/*
57462306a36Sopenharmony_ci	 * Data queue handlers.
57562306a36Sopenharmony_ci	 */
57662306a36Sopenharmony_ci	void (*watchdog) (struct rt2x00_dev *rt2x00dev);
57762306a36Sopenharmony_ci	void (*start_queue) (struct data_queue *queue);
57862306a36Sopenharmony_ci	void (*kick_queue) (struct data_queue *queue);
57962306a36Sopenharmony_ci	void (*stop_queue) (struct data_queue *queue);
58062306a36Sopenharmony_ci	void (*flush_queue) (struct data_queue *queue, bool drop);
58162306a36Sopenharmony_ci	void (*tx_dma_done) (struct queue_entry *entry);
58262306a36Sopenharmony_ci
58362306a36Sopenharmony_ci	/*
58462306a36Sopenharmony_ci	 * TX control handlers
58562306a36Sopenharmony_ci	 */
58662306a36Sopenharmony_ci	void (*write_tx_desc) (struct queue_entry *entry,
58762306a36Sopenharmony_ci			       struct txentry_desc *txdesc);
58862306a36Sopenharmony_ci	void (*write_tx_data) (struct queue_entry *entry,
58962306a36Sopenharmony_ci			       struct txentry_desc *txdesc);
59062306a36Sopenharmony_ci	void (*write_beacon) (struct queue_entry *entry,
59162306a36Sopenharmony_ci			      struct txentry_desc *txdesc);
59262306a36Sopenharmony_ci	void (*clear_beacon) (struct queue_entry *entry);
59362306a36Sopenharmony_ci	int (*get_tx_data_len) (struct queue_entry *entry);
59462306a36Sopenharmony_ci
59562306a36Sopenharmony_ci	/*
59662306a36Sopenharmony_ci	 * RX control handlers
59762306a36Sopenharmony_ci	 */
59862306a36Sopenharmony_ci	void (*fill_rxdone) (struct queue_entry *entry,
59962306a36Sopenharmony_ci			     struct rxdone_entry_desc *rxdesc);
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ci	/*
60262306a36Sopenharmony_ci	 * Configuration handlers.
60362306a36Sopenharmony_ci	 */
60462306a36Sopenharmony_ci	int (*config_shared_key) (struct rt2x00_dev *rt2x00dev,
60562306a36Sopenharmony_ci				  struct rt2x00lib_crypto *crypto,
60662306a36Sopenharmony_ci				  struct ieee80211_key_conf *key);
60762306a36Sopenharmony_ci	int (*config_pairwise_key) (struct rt2x00_dev *rt2x00dev,
60862306a36Sopenharmony_ci				    struct rt2x00lib_crypto *crypto,
60962306a36Sopenharmony_ci				    struct ieee80211_key_conf *key);
61062306a36Sopenharmony_ci	void (*config_filter) (struct rt2x00_dev *rt2x00dev,
61162306a36Sopenharmony_ci			       const unsigned int filter_flags);
61262306a36Sopenharmony_ci	void (*config_intf) (struct rt2x00_dev *rt2x00dev,
61362306a36Sopenharmony_ci			     struct rt2x00_intf *intf,
61462306a36Sopenharmony_ci			     struct rt2x00intf_conf *conf,
61562306a36Sopenharmony_ci			     const unsigned int flags);
61662306a36Sopenharmony_ci#define CONFIG_UPDATE_TYPE		( 1 << 1 )
61762306a36Sopenharmony_ci#define CONFIG_UPDATE_MAC		( 1 << 2 )
61862306a36Sopenharmony_ci#define CONFIG_UPDATE_BSSID		( 1 << 3 )
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_ci	void (*config_erp) (struct rt2x00_dev *rt2x00dev,
62162306a36Sopenharmony_ci			    struct rt2x00lib_erp *erp,
62262306a36Sopenharmony_ci			    u32 changed);
62362306a36Sopenharmony_ci	void (*config_ant) (struct rt2x00_dev *rt2x00dev,
62462306a36Sopenharmony_ci			    struct antenna_setup *ant);
62562306a36Sopenharmony_ci	void (*config) (struct rt2x00_dev *rt2x00dev,
62662306a36Sopenharmony_ci			struct rt2x00lib_conf *libconf,
62762306a36Sopenharmony_ci			const unsigned int changed_flags);
62862306a36Sopenharmony_ci	void (*pre_reset_hw) (struct rt2x00_dev *rt2x00dev);
62962306a36Sopenharmony_ci	int (*sta_add) (struct rt2x00_dev *rt2x00dev,
63062306a36Sopenharmony_ci			struct ieee80211_vif *vif,
63162306a36Sopenharmony_ci			struct ieee80211_sta *sta);
63262306a36Sopenharmony_ci	int (*sta_remove) (struct rt2x00_dev *rt2x00dev,
63362306a36Sopenharmony_ci			   struct ieee80211_sta *sta);
63462306a36Sopenharmony_ci};
63562306a36Sopenharmony_ci
63662306a36Sopenharmony_ci/*
63762306a36Sopenharmony_ci * rt2x00 driver callback operation structure.
63862306a36Sopenharmony_ci */
63962306a36Sopenharmony_cistruct rt2x00_ops {
64062306a36Sopenharmony_ci	const char *name;
64162306a36Sopenharmony_ci	const unsigned int drv_data_size;
64262306a36Sopenharmony_ci	const unsigned int max_ap_intf;
64362306a36Sopenharmony_ci	const unsigned int eeprom_size;
64462306a36Sopenharmony_ci	const unsigned int rf_size;
64562306a36Sopenharmony_ci	const unsigned int tx_queues;
64662306a36Sopenharmony_ci	void (*queue_init)(struct data_queue *queue);
64762306a36Sopenharmony_ci	const struct rt2x00lib_ops *lib;
64862306a36Sopenharmony_ci	const void *drv;
64962306a36Sopenharmony_ci	const struct ieee80211_ops *hw;
65062306a36Sopenharmony_ci#ifdef CONFIG_RT2X00_LIB_DEBUGFS
65162306a36Sopenharmony_ci	const struct rt2x00debug *debugfs;
65262306a36Sopenharmony_ci#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
65362306a36Sopenharmony_ci};
65462306a36Sopenharmony_ci
65562306a36Sopenharmony_ci/*
65662306a36Sopenharmony_ci * rt2x00 state flags
65762306a36Sopenharmony_ci */
65862306a36Sopenharmony_cienum rt2x00_state_flags {
65962306a36Sopenharmony_ci	/*
66062306a36Sopenharmony_ci	 * Device flags
66162306a36Sopenharmony_ci	 */
66262306a36Sopenharmony_ci	DEVICE_STATE_PRESENT,
66362306a36Sopenharmony_ci	DEVICE_STATE_REGISTERED_HW,
66462306a36Sopenharmony_ci	DEVICE_STATE_INITIALIZED,
66562306a36Sopenharmony_ci	DEVICE_STATE_STARTED,
66662306a36Sopenharmony_ci	DEVICE_STATE_ENABLED_RADIO,
66762306a36Sopenharmony_ci	DEVICE_STATE_SCANNING,
66862306a36Sopenharmony_ci	DEVICE_STATE_FLUSHING,
66962306a36Sopenharmony_ci	DEVICE_STATE_RESET,
67062306a36Sopenharmony_ci
67162306a36Sopenharmony_ci	/*
67262306a36Sopenharmony_ci	 * Driver configuration
67362306a36Sopenharmony_ci	 */
67462306a36Sopenharmony_ci	CONFIG_CHANNEL_HT40,
67562306a36Sopenharmony_ci	CONFIG_POWERSAVING,
67662306a36Sopenharmony_ci	CONFIG_HT_DISABLED,
67762306a36Sopenharmony_ci	CONFIG_MONITORING,
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci	/*
68062306a36Sopenharmony_ci	 * Mark we currently are sequentially reading TX_STA_FIFO register
68162306a36Sopenharmony_ci	 * FIXME: this is for only rt2800usb, should go to private data
68262306a36Sopenharmony_ci	 */
68362306a36Sopenharmony_ci	TX_STATUS_READING,
68462306a36Sopenharmony_ci};
68562306a36Sopenharmony_ci
68662306a36Sopenharmony_ci/*
68762306a36Sopenharmony_ci * rt2x00 capability flags
68862306a36Sopenharmony_ci */
68962306a36Sopenharmony_cienum rt2x00_capability_flags {
69062306a36Sopenharmony_ci	/*
69162306a36Sopenharmony_ci	 * Requirements
69262306a36Sopenharmony_ci	 */
69362306a36Sopenharmony_ci	REQUIRE_FIRMWARE,
69462306a36Sopenharmony_ci	REQUIRE_BEACON_GUARD,
69562306a36Sopenharmony_ci	REQUIRE_ATIM_QUEUE,
69662306a36Sopenharmony_ci	REQUIRE_DMA,
69762306a36Sopenharmony_ci	REQUIRE_COPY_IV,
69862306a36Sopenharmony_ci	REQUIRE_L2PAD,
69962306a36Sopenharmony_ci	REQUIRE_TXSTATUS_FIFO,
70062306a36Sopenharmony_ci	REQUIRE_TASKLET_CONTEXT,
70162306a36Sopenharmony_ci	REQUIRE_SW_SEQNO,
70262306a36Sopenharmony_ci	REQUIRE_HT_TX_DESC,
70362306a36Sopenharmony_ci	REQUIRE_PS_AUTOWAKE,
70462306a36Sopenharmony_ci	REQUIRE_DELAYED_RFKILL,
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	/*
70762306a36Sopenharmony_ci	 * Capabilities
70862306a36Sopenharmony_ci	 */
70962306a36Sopenharmony_ci	CAPABILITY_HW_BUTTON,
71062306a36Sopenharmony_ci	CAPABILITY_HW_CRYPTO,
71162306a36Sopenharmony_ci	CAPABILITY_POWER_LIMIT,
71262306a36Sopenharmony_ci	CAPABILITY_CONTROL_FILTERS,
71362306a36Sopenharmony_ci	CAPABILITY_CONTROL_FILTER_PSPOLL,
71462306a36Sopenharmony_ci	CAPABILITY_PRE_TBTT_INTERRUPT,
71562306a36Sopenharmony_ci	CAPABILITY_LINK_TUNING,
71662306a36Sopenharmony_ci	CAPABILITY_FRAME_TYPE,
71762306a36Sopenharmony_ci	CAPABILITY_RF_SEQUENCE,
71862306a36Sopenharmony_ci	CAPABILITY_EXTERNAL_LNA_A,
71962306a36Sopenharmony_ci	CAPABILITY_EXTERNAL_LNA_BG,
72062306a36Sopenharmony_ci	CAPABILITY_DOUBLE_ANTENNA,
72162306a36Sopenharmony_ci	CAPABILITY_BT_COEXIST,
72262306a36Sopenharmony_ci	CAPABILITY_VCO_RECALIBRATION,
72362306a36Sopenharmony_ci	CAPABILITY_EXTERNAL_PA_TX0,
72462306a36Sopenharmony_ci	CAPABILITY_EXTERNAL_PA_TX1,
72562306a36Sopenharmony_ci	CAPABILITY_RESTART_HW,
72662306a36Sopenharmony_ci};
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci/*
72962306a36Sopenharmony_ci * Interface combinations
73062306a36Sopenharmony_ci */
73162306a36Sopenharmony_cienum {
73262306a36Sopenharmony_ci	IF_COMB_AP = 0,
73362306a36Sopenharmony_ci	NUM_IF_COMB,
73462306a36Sopenharmony_ci};
73562306a36Sopenharmony_ci
73662306a36Sopenharmony_ci/*
73762306a36Sopenharmony_ci * rt2x00 device structure.
73862306a36Sopenharmony_ci */
73962306a36Sopenharmony_cistruct rt2x00_dev {
74062306a36Sopenharmony_ci	/*
74162306a36Sopenharmony_ci	 * Device structure.
74262306a36Sopenharmony_ci	 * The structure stored in here depends on the
74362306a36Sopenharmony_ci	 * system bus (PCI or USB).
74462306a36Sopenharmony_ci	 * When accessing this variable, the rt2x00dev_{pci,usb}
74562306a36Sopenharmony_ci	 * macros should be used for correct typecasting.
74662306a36Sopenharmony_ci	 */
74762306a36Sopenharmony_ci	struct device *dev;
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci	/*
75062306a36Sopenharmony_ci	 * Callback functions.
75162306a36Sopenharmony_ci	 */
75262306a36Sopenharmony_ci	const struct rt2x00_ops *ops;
75362306a36Sopenharmony_ci
75462306a36Sopenharmony_ci	/*
75562306a36Sopenharmony_ci	 * Driver data.
75662306a36Sopenharmony_ci	 */
75762306a36Sopenharmony_ci	void *drv_data;
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_ci	/*
76062306a36Sopenharmony_ci	 * IEEE80211 control structure.
76162306a36Sopenharmony_ci	 */
76262306a36Sopenharmony_ci	struct ieee80211_hw *hw;
76362306a36Sopenharmony_ci	struct ieee80211_supported_band bands[NUM_NL80211_BANDS];
76462306a36Sopenharmony_ci	struct rt2x00_chan_survey *chan_survey;
76562306a36Sopenharmony_ci	enum nl80211_band curr_band;
76662306a36Sopenharmony_ci	int curr_freq;
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_ci	/*
76962306a36Sopenharmony_ci	 * If enabled, the debugfs interface structures
77062306a36Sopenharmony_ci	 * required for deregistration of debugfs.
77162306a36Sopenharmony_ci	 */
77262306a36Sopenharmony_ci#ifdef CONFIG_RT2X00_LIB_DEBUGFS
77362306a36Sopenharmony_ci	struct rt2x00debug_intf *debugfs_intf;
77462306a36Sopenharmony_ci#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci	/*
77762306a36Sopenharmony_ci	 * LED structure for changing the LED status
77862306a36Sopenharmony_ci	 * by mac8011 or the kernel.
77962306a36Sopenharmony_ci	 */
78062306a36Sopenharmony_ci#ifdef CONFIG_RT2X00_LIB_LEDS
78162306a36Sopenharmony_ci	struct rt2x00_led led_radio;
78262306a36Sopenharmony_ci	struct rt2x00_led led_assoc;
78362306a36Sopenharmony_ci	struct rt2x00_led led_qual;
78462306a36Sopenharmony_ci	u16 led_mcu_reg;
78562306a36Sopenharmony_ci#endif /* CONFIG_RT2X00_LIB_LEDS */
78662306a36Sopenharmony_ci
78762306a36Sopenharmony_ci	/*
78862306a36Sopenharmony_ci	 * Device state flags.
78962306a36Sopenharmony_ci	 * In these flags the current status is stored.
79062306a36Sopenharmony_ci	 * Access to these flags should occur atomically.
79162306a36Sopenharmony_ci	 */
79262306a36Sopenharmony_ci	unsigned long flags;
79362306a36Sopenharmony_ci
79462306a36Sopenharmony_ci	/*
79562306a36Sopenharmony_ci	 * Device capabiltiy flags.
79662306a36Sopenharmony_ci	 * In these flags the device/driver capabilities are stored.
79762306a36Sopenharmony_ci	 * Access to these flags should occur non-atomically.
79862306a36Sopenharmony_ci	 */
79962306a36Sopenharmony_ci	unsigned long cap_flags;
80062306a36Sopenharmony_ci
80162306a36Sopenharmony_ci	/*
80262306a36Sopenharmony_ci	 * Device information, Bus IRQ and name (PCI, SoC)
80362306a36Sopenharmony_ci	 */
80462306a36Sopenharmony_ci	int irq;
80562306a36Sopenharmony_ci	const char *name;
80662306a36Sopenharmony_ci
80762306a36Sopenharmony_ci	/*
80862306a36Sopenharmony_ci	 * Chipset identification.
80962306a36Sopenharmony_ci	 */
81062306a36Sopenharmony_ci	struct rt2x00_chip chip;
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	/*
81362306a36Sopenharmony_ci	 * hw capability specifications.
81462306a36Sopenharmony_ci	 */
81562306a36Sopenharmony_ci	struct hw_mode_spec spec;
81662306a36Sopenharmony_ci
81762306a36Sopenharmony_ci	/*
81862306a36Sopenharmony_ci	 * This is the default TX/RX antenna setup as indicated
81962306a36Sopenharmony_ci	 * by the device's EEPROM.
82062306a36Sopenharmony_ci	 */
82162306a36Sopenharmony_ci	struct antenna_setup default_ant;
82262306a36Sopenharmony_ci
82362306a36Sopenharmony_ci	/*
82462306a36Sopenharmony_ci	 * Register pointers
82562306a36Sopenharmony_ci	 * csr.base: CSR base register address. (PCI)
82662306a36Sopenharmony_ci	 * csr.cache: CSR cache for usb_control_msg. (USB)
82762306a36Sopenharmony_ci	 */
82862306a36Sopenharmony_ci	union csr {
82962306a36Sopenharmony_ci		void __iomem *base;
83062306a36Sopenharmony_ci		void *cache;
83162306a36Sopenharmony_ci	} csr;
83262306a36Sopenharmony_ci
83362306a36Sopenharmony_ci	/*
83462306a36Sopenharmony_ci	 * Mutex to protect register accesses.
83562306a36Sopenharmony_ci	 * For PCI and USB devices it protects against concurrent indirect
83662306a36Sopenharmony_ci	 * register access (BBP, RF, MCU) since accessing those
83762306a36Sopenharmony_ci	 * registers require multiple calls to the CSR registers.
83862306a36Sopenharmony_ci	 * For USB devices it also protects the csr_cache since that
83962306a36Sopenharmony_ci	 * field is used for normal CSR access and it cannot support
84062306a36Sopenharmony_ci	 * multiple callers simultaneously.
84162306a36Sopenharmony_ci	 */
84262306a36Sopenharmony_ci	struct mutex csr_mutex;
84362306a36Sopenharmony_ci
84462306a36Sopenharmony_ci	/*
84562306a36Sopenharmony_ci	 * Mutex to synchronize config and link tuner.
84662306a36Sopenharmony_ci	 */
84762306a36Sopenharmony_ci	struct mutex conf_mutex;
84862306a36Sopenharmony_ci	/*
84962306a36Sopenharmony_ci	 * Current packet filter configuration for the device.
85062306a36Sopenharmony_ci	 * This contains all currently active FIF_* flags send
85162306a36Sopenharmony_ci	 * to us by mac80211 during configure_filter().
85262306a36Sopenharmony_ci	 */
85362306a36Sopenharmony_ci	unsigned int packet_filter;
85462306a36Sopenharmony_ci
85562306a36Sopenharmony_ci	/*
85662306a36Sopenharmony_ci	 * Interface details:
85762306a36Sopenharmony_ci	 *  - Open ap interface count.
85862306a36Sopenharmony_ci	 *  - Open sta interface count.
85962306a36Sopenharmony_ci	 *  - Association count.
86062306a36Sopenharmony_ci	 *  - Beaconing enabled count.
86162306a36Sopenharmony_ci	 */
86262306a36Sopenharmony_ci	unsigned int intf_ap_count;
86362306a36Sopenharmony_ci	unsigned int intf_sta_count;
86462306a36Sopenharmony_ci	unsigned int intf_associated;
86562306a36Sopenharmony_ci	unsigned int intf_beaconing;
86662306a36Sopenharmony_ci
86762306a36Sopenharmony_ci	/*
86862306a36Sopenharmony_ci	 * Interface combinations
86962306a36Sopenharmony_ci	 */
87062306a36Sopenharmony_ci	struct ieee80211_iface_limit if_limits_ap;
87162306a36Sopenharmony_ci	struct ieee80211_iface_combination if_combinations[NUM_IF_COMB];
87262306a36Sopenharmony_ci
87362306a36Sopenharmony_ci	/*
87462306a36Sopenharmony_ci	 * Link quality
87562306a36Sopenharmony_ci	 */
87662306a36Sopenharmony_ci	struct link link;
87762306a36Sopenharmony_ci
87862306a36Sopenharmony_ci	/*
87962306a36Sopenharmony_ci	 * EEPROM data.
88062306a36Sopenharmony_ci	 */
88162306a36Sopenharmony_ci	__le16 *eeprom;
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	/*
88462306a36Sopenharmony_ci	 * Active RF register values.
88562306a36Sopenharmony_ci	 * These are stored here so we don't need
88662306a36Sopenharmony_ci	 * to read the rf registers and can directly
88762306a36Sopenharmony_ci	 * use this value instead.
88862306a36Sopenharmony_ci	 * This field should be accessed by using
88962306a36Sopenharmony_ci	 * rt2x00_rf_read() and rt2x00_rf_write().
89062306a36Sopenharmony_ci	 */
89162306a36Sopenharmony_ci	u32 *rf;
89262306a36Sopenharmony_ci
89362306a36Sopenharmony_ci	/*
89462306a36Sopenharmony_ci	 * LNA gain
89562306a36Sopenharmony_ci	 */
89662306a36Sopenharmony_ci	short lna_gain;
89762306a36Sopenharmony_ci
89862306a36Sopenharmony_ci	/*
89962306a36Sopenharmony_ci	 * Current TX power value.
90062306a36Sopenharmony_ci	 */
90162306a36Sopenharmony_ci	u16 tx_power;
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_ci	/*
90462306a36Sopenharmony_ci	 * Current retry values.
90562306a36Sopenharmony_ci	 */
90662306a36Sopenharmony_ci	u8 short_retry;
90762306a36Sopenharmony_ci	u8 long_retry;
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci	/*
91062306a36Sopenharmony_ci	 * Rssi <-> Dbm offset
91162306a36Sopenharmony_ci	 */
91262306a36Sopenharmony_ci	u8 rssi_offset;
91362306a36Sopenharmony_ci
91462306a36Sopenharmony_ci	/*
91562306a36Sopenharmony_ci	 * Frequency offset.
91662306a36Sopenharmony_ci	 */
91762306a36Sopenharmony_ci	u8 freq_offset;
91862306a36Sopenharmony_ci
91962306a36Sopenharmony_ci	/*
92062306a36Sopenharmony_ci	 * Association id.
92162306a36Sopenharmony_ci	 */
92262306a36Sopenharmony_ci	u16 aid;
92362306a36Sopenharmony_ci
92462306a36Sopenharmony_ci	/*
92562306a36Sopenharmony_ci	 * Beacon interval.
92662306a36Sopenharmony_ci	 */
92762306a36Sopenharmony_ci	u16 beacon_int;
92862306a36Sopenharmony_ci
92962306a36Sopenharmony_ci	/**
93062306a36Sopenharmony_ci	 * Timestamp of last received beacon
93162306a36Sopenharmony_ci	 */
93262306a36Sopenharmony_ci	unsigned long last_beacon;
93362306a36Sopenharmony_ci
93462306a36Sopenharmony_ci	/*
93562306a36Sopenharmony_ci	 * Low level statistics which will have
93662306a36Sopenharmony_ci	 * to be kept up to date while device is running.
93762306a36Sopenharmony_ci	 */
93862306a36Sopenharmony_ci	struct ieee80211_low_level_stats low_level_stats;
93962306a36Sopenharmony_ci
94062306a36Sopenharmony_ci	/**
94162306a36Sopenharmony_ci	 * Work queue for all work which should not be placed
94262306a36Sopenharmony_ci	 * on the mac80211 workqueue (because of dependencies
94362306a36Sopenharmony_ci	 * between various work structures).
94462306a36Sopenharmony_ci	 */
94562306a36Sopenharmony_ci	struct workqueue_struct *workqueue;
94662306a36Sopenharmony_ci
94762306a36Sopenharmony_ci	/*
94862306a36Sopenharmony_ci	 * Scheduled work.
94962306a36Sopenharmony_ci	 * NOTE: intf_work will use ieee80211_iterate_active_interfaces()
95062306a36Sopenharmony_ci	 * which means it cannot be placed on the hw->workqueue
95162306a36Sopenharmony_ci	 * due to RTNL locking requirements.
95262306a36Sopenharmony_ci	 */
95362306a36Sopenharmony_ci	struct work_struct intf_work;
95462306a36Sopenharmony_ci
95562306a36Sopenharmony_ci	/**
95662306a36Sopenharmony_ci	 * Scheduled work for TX/RX done handling (USB devices)
95762306a36Sopenharmony_ci	 */
95862306a36Sopenharmony_ci	struct work_struct rxdone_work;
95962306a36Sopenharmony_ci	struct work_struct txdone_work;
96062306a36Sopenharmony_ci
96162306a36Sopenharmony_ci	/*
96262306a36Sopenharmony_ci	 * Powersaving work
96362306a36Sopenharmony_ci	 */
96462306a36Sopenharmony_ci	struct delayed_work autowakeup_work;
96562306a36Sopenharmony_ci	struct work_struct sleep_work;
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_ci	/*
96862306a36Sopenharmony_ci	 * Data queue arrays for RX, TX, Beacon and ATIM.
96962306a36Sopenharmony_ci	 */
97062306a36Sopenharmony_ci	unsigned int data_queues;
97162306a36Sopenharmony_ci	struct data_queue *rx;
97262306a36Sopenharmony_ci	struct data_queue *tx;
97362306a36Sopenharmony_ci	struct data_queue *bcn;
97462306a36Sopenharmony_ci	struct data_queue *atim;
97562306a36Sopenharmony_ci
97662306a36Sopenharmony_ci	/*
97762306a36Sopenharmony_ci	 * Firmware image.
97862306a36Sopenharmony_ci	 */
97962306a36Sopenharmony_ci	const struct firmware *fw;
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_ci	/*
98262306a36Sopenharmony_ci	 * FIFO for storing tx status reports between isr and tasklet.
98362306a36Sopenharmony_ci	 */
98462306a36Sopenharmony_ci	DECLARE_KFIFO_PTR(txstatus_fifo, u32);
98562306a36Sopenharmony_ci
98662306a36Sopenharmony_ci	/*
98762306a36Sopenharmony_ci	 * Timer to ensure tx status reports are read (rt2800usb).
98862306a36Sopenharmony_ci	 */
98962306a36Sopenharmony_ci	struct hrtimer txstatus_timer;
99062306a36Sopenharmony_ci
99162306a36Sopenharmony_ci	/*
99262306a36Sopenharmony_ci	 * Tasklet for processing tx status reports (rt2800pci).
99362306a36Sopenharmony_ci	 */
99462306a36Sopenharmony_ci	struct tasklet_struct txstatus_tasklet;
99562306a36Sopenharmony_ci	struct tasklet_struct pretbtt_tasklet;
99662306a36Sopenharmony_ci	struct tasklet_struct tbtt_tasklet;
99762306a36Sopenharmony_ci	struct tasklet_struct rxdone_tasklet;
99862306a36Sopenharmony_ci	struct tasklet_struct autowake_tasklet;
99962306a36Sopenharmony_ci
100062306a36Sopenharmony_ci	/*
100162306a36Sopenharmony_ci	 * Used for VCO periodic calibration.
100262306a36Sopenharmony_ci	 */
100362306a36Sopenharmony_ci	int rf_channel;
100462306a36Sopenharmony_ci
100562306a36Sopenharmony_ci	/*
100662306a36Sopenharmony_ci	 * Protect the interrupt mask register.
100762306a36Sopenharmony_ci	 */
100862306a36Sopenharmony_ci	spinlock_t irqmask_lock;
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_ci	/*
101162306a36Sopenharmony_ci	 * List of BlockAckReq TX entries that need driver BlockAck processing.
101262306a36Sopenharmony_ci	 */
101362306a36Sopenharmony_ci	struct list_head bar_list;
101462306a36Sopenharmony_ci	spinlock_t bar_list_lock;
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_ci	/* Extra TX headroom required for alignment purposes. */
101762306a36Sopenharmony_ci	unsigned int extra_tx_headroom;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	struct usb_anchor *anchor;
102062306a36Sopenharmony_ci	unsigned int num_proto_errs;
102162306a36Sopenharmony_ci
102262306a36Sopenharmony_ci	/* Clock for System On Chip devices. */
102362306a36Sopenharmony_ci	struct clk *clk;
102462306a36Sopenharmony_ci};
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_cistruct rt2x00_bar_list_entry {
102762306a36Sopenharmony_ci	struct list_head list;
102862306a36Sopenharmony_ci	struct rcu_head head;
102962306a36Sopenharmony_ci
103062306a36Sopenharmony_ci	struct queue_entry *entry;
103162306a36Sopenharmony_ci	int block_acked;
103262306a36Sopenharmony_ci
103362306a36Sopenharmony_ci	/* Relevant parts of the IEEE80211 BAR header */
103462306a36Sopenharmony_ci	__u8 ra[6];
103562306a36Sopenharmony_ci	__u8 ta[6];
103662306a36Sopenharmony_ci	__le16 control;
103762306a36Sopenharmony_ci	__le16 start_seq_num;
103862306a36Sopenharmony_ci};
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_ci/*
104162306a36Sopenharmony_ci * Register defines.
104262306a36Sopenharmony_ci * Some registers require multiple attempts before success,
104362306a36Sopenharmony_ci * in those cases REGISTER_BUSY_COUNT attempts should be
104462306a36Sopenharmony_ci * taken with a REGISTER_BUSY_DELAY interval. Due to USB
104562306a36Sopenharmony_ci * bus delays, we do not have to loop so many times to wait
104662306a36Sopenharmony_ci * for valid register value on that bus.
104762306a36Sopenharmony_ci */
104862306a36Sopenharmony_ci#define REGISTER_BUSY_COUNT	100
104962306a36Sopenharmony_ci#define REGISTER_USB_BUSY_COUNT 20
105062306a36Sopenharmony_ci#define REGISTER_BUSY_DELAY	100
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_ci/*
105362306a36Sopenharmony_ci * Generic RF access.
105462306a36Sopenharmony_ci * The RF is being accessed by word index.
105562306a36Sopenharmony_ci */
105662306a36Sopenharmony_cistatic inline u32 rt2x00_rf_read(struct rt2x00_dev *rt2x00dev,
105762306a36Sopenharmony_ci				 const unsigned int word)
105862306a36Sopenharmony_ci{
105962306a36Sopenharmony_ci	BUG_ON(word < 1 || word > rt2x00dev->ops->rf_size / sizeof(u32));
106062306a36Sopenharmony_ci	return rt2x00dev->rf[word - 1];
106162306a36Sopenharmony_ci}
106262306a36Sopenharmony_ci
106362306a36Sopenharmony_cistatic inline void rt2x00_rf_write(struct rt2x00_dev *rt2x00dev,
106462306a36Sopenharmony_ci				   const unsigned int word, u32 data)
106562306a36Sopenharmony_ci{
106662306a36Sopenharmony_ci	BUG_ON(word < 1 || word > rt2x00dev->ops->rf_size / sizeof(u32));
106762306a36Sopenharmony_ci	rt2x00dev->rf[word - 1] = data;
106862306a36Sopenharmony_ci}
106962306a36Sopenharmony_ci
107062306a36Sopenharmony_ci/*
107162306a36Sopenharmony_ci * Generic EEPROM access. The EEPROM is being accessed by word or byte index.
107262306a36Sopenharmony_ci */
107362306a36Sopenharmony_cistatic inline void *rt2x00_eeprom_addr(struct rt2x00_dev *rt2x00dev,
107462306a36Sopenharmony_ci				       const unsigned int word)
107562306a36Sopenharmony_ci{
107662306a36Sopenharmony_ci	return (void *)&rt2x00dev->eeprom[word];
107762306a36Sopenharmony_ci}
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_cistatic inline u16 rt2x00_eeprom_read(struct rt2x00_dev *rt2x00dev,
108062306a36Sopenharmony_ci				     const unsigned int word)
108162306a36Sopenharmony_ci{
108262306a36Sopenharmony_ci	return le16_to_cpu(rt2x00dev->eeprom[word]);
108362306a36Sopenharmony_ci}
108462306a36Sopenharmony_ci
108562306a36Sopenharmony_cistatic inline void rt2x00_eeprom_write(struct rt2x00_dev *rt2x00dev,
108662306a36Sopenharmony_ci				       const unsigned int word, u16 data)
108762306a36Sopenharmony_ci{
108862306a36Sopenharmony_ci	rt2x00dev->eeprom[word] = cpu_to_le16(data);
108962306a36Sopenharmony_ci}
109062306a36Sopenharmony_ci
109162306a36Sopenharmony_cistatic inline u8 rt2x00_eeprom_byte(struct rt2x00_dev *rt2x00dev,
109262306a36Sopenharmony_ci				    const unsigned int byte)
109362306a36Sopenharmony_ci{
109462306a36Sopenharmony_ci	return *(((u8 *)rt2x00dev->eeprom) + byte);
109562306a36Sopenharmony_ci}
109662306a36Sopenharmony_ci
109762306a36Sopenharmony_ci/*
109862306a36Sopenharmony_ci * Chipset handlers
109962306a36Sopenharmony_ci */
110062306a36Sopenharmony_cistatic inline void rt2x00_set_chip(struct rt2x00_dev *rt2x00dev,
110162306a36Sopenharmony_ci				   const u16 rt, const u16 rf, const u16 rev)
110262306a36Sopenharmony_ci{
110362306a36Sopenharmony_ci	rt2x00dev->chip.rt = rt;
110462306a36Sopenharmony_ci	rt2x00dev->chip.rf = rf;
110562306a36Sopenharmony_ci	rt2x00dev->chip.rev = rev;
110662306a36Sopenharmony_ci
110762306a36Sopenharmony_ci	rt2x00_info(rt2x00dev, "Chipset detected - rt: %04x, rf: %04x, rev: %04x\n",
110862306a36Sopenharmony_ci		    rt2x00dev->chip.rt, rt2x00dev->chip.rf,
110962306a36Sopenharmony_ci		    rt2x00dev->chip.rev);
111062306a36Sopenharmony_ci}
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_cistatic inline void rt2x00_set_rt(struct rt2x00_dev *rt2x00dev,
111362306a36Sopenharmony_ci				 const u16 rt, const u16 rev)
111462306a36Sopenharmony_ci{
111562306a36Sopenharmony_ci	rt2x00dev->chip.rt = rt;
111662306a36Sopenharmony_ci	rt2x00dev->chip.rev = rev;
111762306a36Sopenharmony_ci
111862306a36Sopenharmony_ci	rt2x00_info(rt2x00dev, "RT chipset %04x, rev %04x detected\n",
111962306a36Sopenharmony_ci		    rt2x00dev->chip.rt, rt2x00dev->chip.rev);
112062306a36Sopenharmony_ci}
112162306a36Sopenharmony_ci
112262306a36Sopenharmony_cistatic inline void rt2x00_set_rf(struct rt2x00_dev *rt2x00dev, const u16 rf)
112362306a36Sopenharmony_ci{
112462306a36Sopenharmony_ci	rt2x00dev->chip.rf = rf;
112562306a36Sopenharmony_ci
112662306a36Sopenharmony_ci	rt2x00_info(rt2x00dev, "RF chipset %04x detected\n",
112762306a36Sopenharmony_ci		    rt2x00dev->chip.rf);
112862306a36Sopenharmony_ci}
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_cistatic inline bool rt2x00_rt(struct rt2x00_dev *rt2x00dev, const u16 rt)
113162306a36Sopenharmony_ci{
113262306a36Sopenharmony_ci	return (rt2x00dev->chip.rt == rt);
113362306a36Sopenharmony_ci}
113462306a36Sopenharmony_ci
113562306a36Sopenharmony_cistatic inline bool rt2x00_rf(struct rt2x00_dev *rt2x00dev, const u16 rf)
113662306a36Sopenharmony_ci{
113762306a36Sopenharmony_ci	return (rt2x00dev->chip.rf == rf);
113862306a36Sopenharmony_ci}
113962306a36Sopenharmony_ci
114062306a36Sopenharmony_cistatic inline u16 rt2x00_rev(struct rt2x00_dev *rt2x00dev)
114162306a36Sopenharmony_ci{
114262306a36Sopenharmony_ci	return rt2x00dev->chip.rev;
114362306a36Sopenharmony_ci}
114462306a36Sopenharmony_ci
114562306a36Sopenharmony_cistatic inline bool rt2x00_rt_rev(struct rt2x00_dev *rt2x00dev,
114662306a36Sopenharmony_ci				 const u16 rt, const u16 rev)
114762306a36Sopenharmony_ci{
114862306a36Sopenharmony_ci	return (rt2x00_rt(rt2x00dev, rt) && rt2x00_rev(rt2x00dev) == rev);
114962306a36Sopenharmony_ci}
115062306a36Sopenharmony_ci
115162306a36Sopenharmony_cistatic inline bool rt2x00_rt_rev_lt(struct rt2x00_dev *rt2x00dev,
115262306a36Sopenharmony_ci				    const u16 rt, const u16 rev)
115362306a36Sopenharmony_ci{
115462306a36Sopenharmony_ci	return (rt2x00_rt(rt2x00dev, rt) && rt2x00_rev(rt2x00dev) < rev);
115562306a36Sopenharmony_ci}
115662306a36Sopenharmony_ci
115762306a36Sopenharmony_cistatic inline bool rt2x00_rt_rev_gte(struct rt2x00_dev *rt2x00dev,
115862306a36Sopenharmony_ci				     const u16 rt, const u16 rev)
115962306a36Sopenharmony_ci{
116062306a36Sopenharmony_ci	return (rt2x00_rt(rt2x00dev, rt) && rt2x00_rev(rt2x00dev) >= rev);
116162306a36Sopenharmony_ci}
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_cistatic inline void rt2x00_set_chip_intf(struct rt2x00_dev *rt2x00dev,
116462306a36Sopenharmony_ci					enum rt2x00_chip_intf intf)
116562306a36Sopenharmony_ci{
116662306a36Sopenharmony_ci	rt2x00dev->chip.intf = intf;
116762306a36Sopenharmony_ci}
116862306a36Sopenharmony_ci
116962306a36Sopenharmony_cistatic inline bool rt2x00_intf(struct rt2x00_dev *rt2x00dev,
117062306a36Sopenharmony_ci			       enum rt2x00_chip_intf intf)
117162306a36Sopenharmony_ci{
117262306a36Sopenharmony_ci	return (rt2x00dev->chip.intf == intf);
117362306a36Sopenharmony_ci}
117462306a36Sopenharmony_ci
117562306a36Sopenharmony_cistatic inline bool rt2x00_is_pci(struct rt2x00_dev *rt2x00dev)
117662306a36Sopenharmony_ci{
117762306a36Sopenharmony_ci	return rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_PCI) ||
117862306a36Sopenharmony_ci	       rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_PCIE);
117962306a36Sopenharmony_ci}
118062306a36Sopenharmony_ci
118162306a36Sopenharmony_cistatic inline bool rt2x00_is_pcie(struct rt2x00_dev *rt2x00dev)
118262306a36Sopenharmony_ci{
118362306a36Sopenharmony_ci	return rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_PCIE);
118462306a36Sopenharmony_ci}
118562306a36Sopenharmony_ci
118662306a36Sopenharmony_cistatic inline bool rt2x00_is_usb(struct rt2x00_dev *rt2x00dev)
118762306a36Sopenharmony_ci{
118862306a36Sopenharmony_ci	return rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_USB);
118962306a36Sopenharmony_ci}
119062306a36Sopenharmony_ci
119162306a36Sopenharmony_cistatic inline bool rt2x00_is_soc(struct rt2x00_dev *rt2x00dev)
119262306a36Sopenharmony_ci{
119362306a36Sopenharmony_ci	return rt2x00_intf(rt2x00dev, RT2X00_CHIP_INTF_SOC);
119462306a36Sopenharmony_ci}
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_ci/* Helpers for capability flags */
119762306a36Sopenharmony_ci
119862306a36Sopenharmony_cistatic inline bool
119962306a36Sopenharmony_cirt2x00_has_cap_flag(struct rt2x00_dev *rt2x00dev,
120062306a36Sopenharmony_ci		    enum rt2x00_capability_flags cap_flag)
120162306a36Sopenharmony_ci{
120262306a36Sopenharmony_ci	return test_bit(cap_flag, &rt2x00dev->cap_flags);
120362306a36Sopenharmony_ci}
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_cistatic inline bool
120662306a36Sopenharmony_cirt2x00_has_cap_hw_crypto(struct rt2x00_dev *rt2x00dev)
120762306a36Sopenharmony_ci{
120862306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_HW_CRYPTO);
120962306a36Sopenharmony_ci}
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_cistatic inline bool
121262306a36Sopenharmony_cirt2x00_has_cap_power_limit(struct rt2x00_dev *rt2x00dev)
121362306a36Sopenharmony_ci{
121462306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_POWER_LIMIT);
121562306a36Sopenharmony_ci}
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_cistatic inline bool
121862306a36Sopenharmony_cirt2x00_has_cap_control_filters(struct rt2x00_dev *rt2x00dev)
121962306a36Sopenharmony_ci{
122062306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_CONTROL_FILTERS);
122162306a36Sopenharmony_ci}
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_cistatic inline bool
122462306a36Sopenharmony_cirt2x00_has_cap_control_filter_pspoll(struct rt2x00_dev *rt2x00dev)
122562306a36Sopenharmony_ci{
122662306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_CONTROL_FILTER_PSPOLL);
122762306a36Sopenharmony_ci}
122862306a36Sopenharmony_ci
122962306a36Sopenharmony_cistatic inline bool
123062306a36Sopenharmony_cirt2x00_has_cap_pre_tbtt_interrupt(struct rt2x00_dev *rt2x00dev)
123162306a36Sopenharmony_ci{
123262306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_PRE_TBTT_INTERRUPT);
123362306a36Sopenharmony_ci}
123462306a36Sopenharmony_ci
123562306a36Sopenharmony_cistatic inline bool
123662306a36Sopenharmony_cirt2x00_has_cap_link_tuning(struct rt2x00_dev *rt2x00dev)
123762306a36Sopenharmony_ci{
123862306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_LINK_TUNING);
123962306a36Sopenharmony_ci}
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_cistatic inline bool
124262306a36Sopenharmony_cirt2x00_has_cap_frame_type(struct rt2x00_dev *rt2x00dev)
124362306a36Sopenharmony_ci{
124462306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_FRAME_TYPE);
124562306a36Sopenharmony_ci}
124662306a36Sopenharmony_ci
124762306a36Sopenharmony_cistatic inline bool
124862306a36Sopenharmony_cirt2x00_has_cap_rf_sequence(struct rt2x00_dev *rt2x00dev)
124962306a36Sopenharmony_ci{
125062306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_RF_SEQUENCE);
125162306a36Sopenharmony_ci}
125262306a36Sopenharmony_ci
125362306a36Sopenharmony_cistatic inline bool
125462306a36Sopenharmony_cirt2x00_has_cap_external_lna_a(struct rt2x00_dev *rt2x00dev)
125562306a36Sopenharmony_ci{
125662306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_EXTERNAL_LNA_A);
125762306a36Sopenharmony_ci}
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_cistatic inline bool
126062306a36Sopenharmony_cirt2x00_has_cap_external_lna_bg(struct rt2x00_dev *rt2x00dev)
126162306a36Sopenharmony_ci{
126262306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_EXTERNAL_LNA_BG);
126362306a36Sopenharmony_ci}
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_cistatic inline bool
126662306a36Sopenharmony_cirt2x00_has_cap_double_antenna(struct rt2x00_dev *rt2x00dev)
126762306a36Sopenharmony_ci{
126862306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_DOUBLE_ANTENNA);
126962306a36Sopenharmony_ci}
127062306a36Sopenharmony_ci
127162306a36Sopenharmony_cistatic inline bool
127262306a36Sopenharmony_cirt2x00_has_cap_bt_coexist(struct rt2x00_dev *rt2x00dev)
127362306a36Sopenharmony_ci{
127462306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_BT_COEXIST);
127562306a36Sopenharmony_ci}
127662306a36Sopenharmony_ci
127762306a36Sopenharmony_cistatic inline bool
127862306a36Sopenharmony_cirt2x00_has_cap_vco_recalibration(struct rt2x00_dev *rt2x00dev)
127962306a36Sopenharmony_ci{
128062306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_VCO_RECALIBRATION);
128162306a36Sopenharmony_ci}
128262306a36Sopenharmony_ci
128362306a36Sopenharmony_cistatic inline bool
128462306a36Sopenharmony_cirt2x00_has_cap_restart_hw(struct rt2x00_dev *rt2x00dev)
128562306a36Sopenharmony_ci{
128662306a36Sopenharmony_ci	return rt2x00_has_cap_flag(rt2x00dev, CAPABILITY_RESTART_HW);
128762306a36Sopenharmony_ci}
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_ci/**
129062306a36Sopenharmony_ci * rt2x00queue_map_txskb - Map a skb into DMA for TX purposes.
129162306a36Sopenharmony_ci * @entry: Pointer to &struct queue_entry
129262306a36Sopenharmony_ci *
129362306a36Sopenharmony_ci * Returns -ENOMEM if mapping fail, 0 otherwise.
129462306a36Sopenharmony_ci */
129562306a36Sopenharmony_ciint rt2x00queue_map_txskb(struct queue_entry *entry);
129662306a36Sopenharmony_ci
129762306a36Sopenharmony_ci/**
129862306a36Sopenharmony_ci * rt2x00queue_unmap_skb - Unmap a skb from DMA.
129962306a36Sopenharmony_ci * @entry: Pointer to &struct queue_entry
130062306a36Sopenharmony_ci */
130162306a36Sopenharmony_civoid rt2x00queue_unmap_skb(struct queue_entry *entry);
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_ci/**
130462306a36Sopenharmony_ci * rt2x00queue_get_tx_queue - Convert tx queue index to queue pointer
130562306a36Sopenharmony_ci * @rt2x00dev: Pointer to &struct rt2x00_dev.
130662306a36Sopenharmony_ci * @queue: rt2x00 queue index (see &enum data_queue_qid).
130762306a36Sopenharmony_ci *
130862306a36Sopenharmony_ci * Returns NULL for non tx queues.
130962306a36Sopenharmony_ci */
131062306a36Sopenharmony_cistatic inline struct data_queue *
131162306a36Sopenharmony_cirt2x00queue_get_tx_queue(struct rt2x00_dev *rt2x00dev,
131262306a36Sopenharmony_ci			 enum data_queue_qid queue)
131362306a36Sopenharmony_ci{
131462306a36Sopenharmony_ci	if (queue >= rt2x00dev->ops->tx_queues && queue < IEEE80211_NUM_ACS)
131562306a36Sopenharmony_ci		queue = rt2x00dev->ops->tx_queues - 1;
131662306a36Sopenharmony_ci
131762306a36Sopenharmony_ci	if (queue < rt2x00dev->ops->tx_queues && rt2x00dev->tx)
131862306a36Sopenharmony_ci		return &rt2x00dev->tx[queue];
131962306a36Sopenharmony_ci
132062306a36Sopenharmony_ci	if (queue == QID_ATIM)
132162306a36Sopenharmony_ci		return rt2x00dev->atim;
132262306a36Sopenharmony_ci
132362306a36Sopenharmony_ci	return NULL;
132462306a36Sopenharmony_ci}
132562306a36Sopenharmony_ci
132662306a36Sopenharmony_ci/**
132762306a36Sopenharmony_ci * rt2x00queue_get_entry - Get queue entry where the given index points to.
132862306a36Sopenharmony_ci * @queue: Pointer to &struct data_queue from where we obtain the entry.
132962306a36Sopenharmony_ci * @index: Index identifier for obtaining the correct index.
133062306a36Sopenharmony_ci */
133162306a36Sopenharmony_cistruct queue_entry *rt2x00queue_get_entry(struct data_queue *queue,
133262306a36Sopenharmony_ci					  enum queue_index index);
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci/**
133562306a36Sopenharmony_ci * rt2x00queue_pause_queue - Pause a data queue
133662306a36Sopenharmony_ci * @queue: Pointer to &struct data_queue.
133762306a36Sopenharmony_ci *
133862306a36Sopenharmony_ci * This function will pause the data queue locally, preventing
133962306a36Sopenharmony_ci * new frames to be added to the queue (while the hardware is
134062306a36Sopenharmony_ci * still allowed to run).
134162306a36Sopenharmony_ci */
134262306a36Sopenharmony_civoid rt2x00queue_pause_queue(struct data_queue *queue);
134362306a36Sopenharmony_ci
134462306a36Sopenharmony_ci/**
134562306a36Sopenharmony_ci * rt2x00queue_unpause_queue - unpause a data queue
134662306a36Sopenharmony_ci * @queue: Pointer to &struct data_queue.
134762306a36Sopenharmony_ci *
134862306a36Sopenharmony_ci * This function will unpause the data queue locally, allowing
134962306a36Sopenharmony_ci * new frames to be added to the queue again.
135062306a36Sopenharmony_ci */
135162306a36Sopenharmony_civoid rt2x00queue_unpause_queue(struct data_queue *queue);
135262306a36Sopenharmony_ci
135362306a36Sopenharmony_ci/**
135462306a36Sopenharmony_ci * rt2x00queue_start_queue - Start a data queue
135562306a36Sopenharmony_ci * @queue: Pointer to &struct data_queue.
135662306a36Sopenharmony_ci *
135762306a36Sopenharmony_ci * This function will start handling all pending frames in the queue.
135862306a36Sopenharmony_ci */
135962306a36Sopenharmony_civoid rt2x00queue_start_queue(struct data_queue *queue);
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_ci/**
136262306a36Sopenharmony_ci * rt2x00queue_stop_queue - Halt a data queue
136362306a36Sopenharmony_ci * @queue: Pointer to &struct data_queue.
136462306a36Sopenharmony_ci *
136562306a36Sopenharmony_ci * This function will stop all pending frames in the queue.
136662306a36Sopenharmony_ci */
136762306a36Sopenharmony_civoid rt2x00queue_stop_queue(struct data_queue *queue);
136862306a36Sopenharmony_ci
136962306a36Sopenharmony_ci/**
137062306a36Sopenharmony_ci * rt2x00queue_flush_queue - Flush a data queue
137162306a36Sopenharmony_ci * @queue: Pointer to &struct data_queue.
137262306a36Sopenharmony_ci * @drop: True to drop all pending frames.
137362306a36Sopenharmony_ci *
137462306a36Sopenharmony_ci * This function will flush the queue. After this call
137562306a36Sopenharmony_ci * the queue is guaranteed to be empty.
137662306a36Sopenharmony_ci */
137762306a36Sopenharmony_civoid rt2x00queue_flush_queue(struct data_queue *queue, bool drop);
137862306a36Sopenharmony_ci
137962306a36Sopenharmony_ci/**
138062306a36Sopenharmony_ci * rt2x00queue_start_queues - Start all data queues
138162306a36Sopenharmony_ci * @rt2x00dev: Pointer to &struct rt2x00_dev.
138262306a36Sopenharmony_ci *
138362306a36Sopenharmony_ci * This function will loop through all available queues to start them
138462306a36Sopenharmony_ci */
138562306a36Sopenharmony_civoid rt2x00queue_start_queues(struct rt2x00_dev *rt2x00dev);
138662306a36Sopenharmony_ci
138762306a36Sopenharmony_ci/**
138862306a36Sopenharmony_ci * rt2x00queue_stop_queues - Halt all data queues
138962306a36Sopenharmony_ci * @rt2x00dev: Pointer to &struct rt2x00_dev.
139062306a36Sopenharmony_ci *
139162306a36Sopenharmony_ci * This function will loop through all available queues to stop
139262306a36Sopenharmony_ci * any pending frames.
139362306a36Sopenharmony_ci */
139462306a36Sopenharmony_civoid rt2x00queue_stop_queues(struct rt2x00_dev *rt2x00dev);
139562306a36Sopenharmony_ci
139662306a36Sopenharmony_ci/**
139762306a36Sopenharmony_ci * rt2x00queue_flush_queues - Flush all data queues
139862306a36Sopenharmony_ci * @rt2x00dev: Pointer to &struct rt2x00_dev.
139962306a36Sopenharmony_ci * @drop: True to drop all pending frames.
140062306a36Sopenharmony_ci *
140162306a36Sopenharmony_ci * This function will loop through all available queues to flush
140262306a36Sopenharmony_ci * any pending frames.
140362306a36Sopenharmony_ci */
140462306a36Sopenharmony_civoid rt2x00queue_flush_queues(struct rt2x00_dev *rt2x00dev, bool drop);
140562306a36Sopenharmony_ci
140662306a36Sopenharmony_ci/*
140762306a36Sopenharmony_ci * Debugfs handlers.
140862306a36Sopenharmony_ci */
140962306a36Sopenharmony_ci/**
141062306a36Sopenharmony_ci * rt2x00debug_dump_frame - Dump a frame to userspace through debugfs.
141162306a36Sopenharmony_ci * @rt2x00dev: Pointer to &struct rt2x00_dev.
141262306a36Sopenharmony_ci * @type: The type of frame that is being dumped.
141362306a36Sopenharmony_ci * @entry: The queue entry containing the frame to be dumped.
141462306a36Sopenharmony_ci */
141562306a36Sopenharmony_ci#ifdef CONFIG_RT2X00_LIB_DEBUGFS
141662306a36Sopenharmony_civoid rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
141762306a36Sopenharmony_ci			    enum rt2x00_dump_type type, struct queue_entry *entry);
141862306a36Sopenharmony_ci#else
141962306a36Sopenharmony_cistatic inline void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev,
142062306a36Sopenharmony_ci					  enum rt2x00_dump_type type,
142162306a36Sopenharmony_ci					  struct queue_entry *entry)
142262306a36Sopenharmony_ci{
142362306a36Sopenharmony_ci}
142462306a36Sopenharmony_ci#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci/*
142762306a36Sopenharmony_ci * Utility functions.
142862306a36Sopenharmony_ci */
142962306a36Sopenharmony_ciu32 rt2x00lib_get_bssidx(struct rt2x00_dev *rt2x00dev,
143062306a36Sopenharmony_ci			 struct ieee80211_vif *vif);
143162306a36Sopenharmony_civoid rt2x00lib_set_mac_address(struct rt2x00_dev *rt2x00dev, u8 *eeprom_mac_addr);
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci/*
143462306a36Sopenharmony_ci * Interrupt context handlers.
143562306a36Sopenharmony_ci */
143662306a36Sopenharmony_civoid rt2x00lib_beacondone(struct rt2x00_dev *rt2x00dev);
143762306a36Sopenharmony_civoid rt2x00lib_pretbtt(struct rt2x00_dev *rt2x00dev);
143862306a36Sopenharmony_civoid rt2x00lib_dmastart(struct queue_entry *entry);
143962306a36Sopenharmony_civoid rt2x00lib_dmadone(struct queue_entry *entry);
144062306a36Sopenharmony_civoid rt2x00lib_txdone(struct queue_entry *entry,
144162306a36Sopenharmony_ci		      struct txdone_entry_desc *txdesc);
144262306a36Sopenharmony_civoid rt2x00lib_txdone_nomatch(struct queue_entry *entry,
144362306a36Sopenharmony_ci			      struct txdone_entry_desc *txdesc);
144462306a36Sopenharmony_civoid rt2x00lib_txdone_noinfo(struct queue_entry *entry, u32 status);
144562306a36Sopenharmony_civoid rt2x00lib_rxdone(struct queue_entry *entry, gfp_t gfp);
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_ci/*
144862306a36Sopenharmony_ci * mac80211 handlers.
144962306a36Sopenharmony_ci */
145062306a36Sopenharmony_civoid rt2x00mac_tx(struct ieee80211_hw *hw,
145162306a36Sopenharmony_ci		  struct ieee80211_tx_control *control,
145262306a36Sopenharmony_ci		  struct sk_buff *skb);
145362306a36Sopenharmony_ciint rt2x00mac_start(struct ieee80211_hw *hw);
145462306a36Sopenharmony_civoid rt2x00mac_stop(struct ieee80211_hw *hw);
145562306a36Sopenharmony_civoid rt2x00mac_reconfig_complete(struct ieee80211_hw *hw,
145662306a36Sopenharmony_ci				 enum ieee80211_reconfig_type reconfig_type);
145762306a36Sopenharmony_ciint rt2x00mac_add_interface(struct ieee80211_hw *hw,
145862306a36Sopenharmony_ci			    struct ieee80211_vif *vif);
145962306a36Sopenharmony_civoid rt2x00mac_remove_interface(struct ieee80211_hw *hw,
146062306a36Sopenharmony_ci				struct ieee80211_vif *vif);
146162306a36Sopenharmony_ciint rt2x00mac_config(struct ieee80211_hw *hw, u32 changed);
146262306a36Sopenharmony_civoid rt2x00mac_configure_filter(struct ieee80211_hw *hw,
146362306a36Sopenharmony_ci				unsigned int changed_flags,
146462306a36Sopenharmony_ci				unsigned int *total_flags,
146562306a36Sopenharmony_ci				u64 multicast);
146662306a36Sopenharmony_ciint rt2x00mac_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
146762306a36Sopenharmony_ci		      bool set);
146862306a36Sopenharmony_ci#ifdef CONFIG_RT2X00_LIB_CRYPTO
146962306a36Sopenharmony_ciint rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
147062306a36Sopenharmony_ci		      struct ieee80211_vif *vif, struct ieee80211_sta *sta,
147162306a36Sopenharmony_ci		      struct ieee80211_key_conf *key);
147262306a36Sopenharmony_ci#else
147362306a36Sopenharmony_ci#define rt2x00mac_set_key	NULL
147462306a36Sopenharmony_ci#endif /* CONFIG_RT2X00_LIB_CRYPTO */
147562306a36Sopenharmony_civoid rt2x00mac_sw_scan_start(struct ieee80211_hw *hw,
147662306a36Sopenharmony_ci			     struct ieee80211_vif *vif,
147762306a36Sopenharmony_ci			     const u8 *mac_addr);
147862306a36Sopenharmony_civoid rt2x00mac_sw_scan_complete(struct ieee80211_hw *hw,
147962306a36Sopenharmony_ci				struct ieee80211_vif *vif);
148062306a36Sopenharmony_ciint rt2x00mac_get_stats(struct ieee80211_hw *hw,
148162306a36Sopenharmony_ci			struct ieee80211_low_level_stats *stats);
148262306a36Sopenharmony_civoid rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,
148362306a36Sopenharmony_ci				struct ieee80211_vif *vif,
148462306a36Sopenharmony_ci				struct ieee80211_bss_conf *bss_conf,
148562306a36Sopenharmony_ci				u64 changes);
148662306a36Sopenharmony_ciint rt2x00mac_conf_tx(struct ieee80211_hw *hw,
148762306a36Sopenharmony_ci		      struct ieee80211_vif *vif,
148862306a36Sopenharmony_ci		      unsigned int link_id, u16 queue,
148962306a36Sopenharmony_ci		      const struct ieee80211_tx_queue_params *params);
149062306a36Sopenharmony_civoid rt2x00mac_rfkill_poll(struct ieee80211_hw *hw);
149162306a36Sopenharmony_civoid rt2x00mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
149262306a36Sopenharmony_ci		     u32 queues, bool drop);
149362306a36Sopenharmony_ciint rt2x00mac_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant);
149462306a36Sopenharmony_ciint rt2x00mac_get_antenna(struct ieee80211_hw *hw, u32 *tx_ant, u32 *rx_ant);
149562306a36Sopenharmony_civoid rt2x00mac_get_ringparam(struct ieee80211_hw *hw,
149662306a36Sopenharmony_ci			     u32 *tx, u32 *tx_max, u32 *rx, u32 *rx_max);
149762306a36Sopenharmony_cibool rt2x00mac_tx_frames_pending(struct ieee80211_hw *hw);
149862306a36Sopenharmony_ci
149962306a36Sopenharmony_ci/*
150062306a36Sopenharmony_ci * Driver allocation handlers.
150162306a36Sopenharmony_ci */
150262306a36Sopenharmony_ciint rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev);
150362306a36Sopenharmony_civoid rt2x00lib_remove_dev(struct rt2x00_dev *rt2x00dev);
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_ciint rt2x00lib_suspend(struct rt2x00_dev *rt2x00dev);
150662306a36Sopenharmony_ciint rt2x00lib_resume(struct rt2x00_dev *rt2x00dev);
150762306a36Sopenharmony_ci
150862306a36Sopenharmony_ci#endif /* RT2X00_H */
1509