1bdcd8170SKalle Valo /*
2bdcd8170SKalle Valo  * Copyright (c) 2010-2011 Atheros Communications Inc.
3bdcd8170SKalle Valo  *
4bdcd8170SKalle Valo  * Permission to use, copy, modify, and/or distribute this software for any
5bdcd8170SKalle Valo  * purpose with or without fee is hereby granted, provided that the above
6bdcd8170SKalle Valo  * copyright notice and this permission notice appear in all copies.
7bdcd8170SKalle Valo  *
8bdcd8170SKalle Valo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9bdcd8170SKalle Valo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10bdcd8170SKalle Valo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11bdcd8170SKalle Valo  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12bdcd8170SKalle Valo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13bdcd8170SKalle Valo  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14bdcd8170SKalle Valo  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15bdcd8170SKalle Valo  */
16bdcd8170SKalle Valo 
17bdcd8170SKalle Valo #ifndef COMMON_H
18bdcd8170SKalle Valo #define COMMON_H
19bdcd8170SKalle Valo 
20bdcd8170SKalle Valo #include <linux/netdevice.h>
21bdcd8170SKalle Valo 
22bdcd8170SKalle Valo #define ATH6KL_MAX_IE			256
23bdcd8170SKalle Valo 
24bdcd8170SKalle Valo extern int ath6kl_printk(const char *level, const char *fmt, ...);
25bdcd8170SKalle Valo 
26bdcd8170SKalle Valo #define A_CACHE_LINE_PAD            128
27bdcd8170SKalle Valo 
28bdcd8170SKalle Valo /*
29bdcd8170SKalle Valo  * Reflects the version of binary interface exposed by ATH6KL target
30bdcd8170SKalle Valo  * firmware. Needs to be incremented by 1 for any change in the firmware
31bdcd8170SKalle Valo  * that requires upgrade of the driver on the host side for the change to
32bdcd8170SKalle Valo  * work correctly
33bdcd8170SKalle Valo  */
34bdcd8170SKalle Valo #define ATH6KL_ABI_VERSION        1
35bdcd8170SKalle Valo 
36bdcd8170SKalle Valo #define SIGNAL_QUALITY_METRICS_NUM_MAX    2
37bdcd8170SKalle Valo 
38bdcd8170SKalle Valo enum {
39bdcd8170SKalle Valo 	SIGNAL_QUALITY_METRICS_SNR = 0,
40bdcd8170SKalle Valo 	SIGNAL_QUALITY_METRICS_RSSI,
41bdcd8170SKalle Valo 	SIGNAL_QUALITY_METRICS_ALL,
42bdcd8170SKalle Valo };
43bdcd8170SKalle Valo 
44bdcd8170SKalle Valo /*
45bdcd8170SKalle Valo  * Data Path
46bdcd8170SKalle Valo  */
47bdcd8170SKalle Valo 
48bdcd8170SKalle Valo #define WMI_MAX_TX_DATA_FRAME_LENGTH	      \
49bdcd8170SKalle Valo 	(1500 + sizeof(struct wmi_data_hdr) + \
50bdcd8170SKalle Valo 	 sizeof(struct ethhdr) +      \
51bdcd8170SKalle Valo 	 sizeof(struct ath6kl_llc_snap_hdr))
52bdcd8170SKalle Valo 
53bdcd8170SKalle Valo /* An AMSDU frame */ /* The MAX AMSDU length of AR6003 is 3839 */
54bdcd8170SKalle Valo #define WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH    \
55bdcd8170SKalle Valo 	(3840 + sizeof(struct wmi_data_hdr) + \
56bdcd8170SKalle Valo 	 sizeof(struct ethhdr) +      \
57bdcd8170SKalle Valo 	 sizeof(struct ath6kl_llc_snap_hdr))
58bdcd8170SKalle Valo 
59bdcd8170SKalle Valo #define EPPING_ALIGNMENT_PAD			       \
60bdcd8170SKalle Valo 	(((sizeof(struct htc_frame_hdr) + 3) & (~0x3)) \
61bdcd8170SKalle Valo 	 - sizeof(struct htc_frame_hdr))
62bdcd8170SKalle Valo 
63bdcd8170SKalle Valo struct ath6kl_llc_snap_hdr {
64bdcd8170SKalle Valo 	u8 dsap;
65bdcd8170SKalle Valo 	u8 ssap;
66bdcd8170SKalle Valo 	u8 cntl;
67bdcd8170SKalle Valo 	u8 org_code[3];
68bdcd8170SKalle Valo 	__be16 eth_type;
69bdcd8170SKalle Valo } __packed;
70bdcd8170SKalle Valo 
71bdcd8170SKalle Valo enum crypto_type {
72bdcd8170SKalle Valo 	NONE_CRYPT          = 0x01,
73bdcd8170SKalle Valo 	WEP_CRYPT           = 0x02,
74bdcd8170SKalle Valo 	TKIP_CRYPT          = 0x04,
75bdcd8170SKalle Valo 	AES_CRYPT           = 0x08,
76bdcd8170SKalle Valo };
77bdcd8170SKalle Valo 
78bdcd8170SKalle Valo #define ATH6KL_NODE_HASHSIZE 32
79bdcd8170SKalle Valo /* simple hash is enough for variation of macaddr */
80bdcd8170SKalle Valo #define ATH6KL_NODE_HASH(addr)   \
81bdcd8170SKalle Valo 	(((const u8 *)(addr))[ETH_ALEN - 1] % \
82bdcd8170SKalle Valo 	 ATH6KL_NODE_HASHSIZE)
83bdcd8170SKalle Valo 
84bdcd8170SKalle Valo /*
85bdcd8170SKalle Valo  * Table of ath6kl_node instances.  Each ieee80211com
86bdcd8170SKalle Valo  * has at least one for holding the scan candidates.
87bdcd8170SKalle Valo  * When operating as an access point or in ibss mode there
88bdcd8170SKalle Valo  * is a second table for associated stations or neighbors.
89bdcd8170SKalle Valo  */
90bdcd8170SKalle Valo struct ath6kl_node_table {
91bdcd8170SKalle Valo 	void *nt_wmi;		/* back reference */
92bdcd8170SKalle Valo 	spinlock_t nt_nodelock;	/* on node table */
93bdcd8170SKalle Valo 	struct bss *nt_node_first;	/* information of all nodes */
94bdcd8170SKalle Valo 	struct bss *nt_node_last;	/* information of all nodes */
95bdcd8170SKalle Valo 	struct bss *nt_hash[ATH6KL_NODE_HASHSIZE];
96bdcd8170SKalle Valo 	const char *nt_name;	/* for debugging */
97bdcd8170SKalle Valo 	u32 nt_node_age;		/* node aging time */
98bdcd8170SKalle Valo };
99bdcd8170SKalle Valo 
100bdcd8170SKalle Valo #define WLAN_NODE_INACT_TIMEOUT_MSEC    120000
101bdcd8170SKalle Valo #define WLAN_NODE_INACT_CNT		4
102bdcd8170SKalle Valo 
103bdcd8170SKalle Valo struct ath6kl_common_ie {
104bdcd8170SKalle Valo 	u16 ie_chan;
105bdcd8170SKalle Valo 	u8 *ie_tstamp;
106bdcd8170SKalle Valo 	u8 *ie_ssid;
107bdcd8170SKalle Valo 	u8 *ie_rates;
108bdcd8170SKalle Valo 	u8 *ie_xrates;
109bdcd8170SKalle Valo 	u8 *ie_country;
110bdcd8170SKalle Valo 	u8 *ie_wpa;
111bdcd8170SKalle Valo 	u8 *ie_rsn;
112bdcd8170SKalle Valo 	u8 *ie_wmm;
113bdcd8170SKalle Valo 	u8 *ie_ath;
114bdcd8170SKalle Valo 	u16 ie_capInfo;
115bdcd8170SKalle Valo 	u16 ie_beaconInt;
116bdcd8170SKalle Valo 	u8 *ie_tim;
117bdcd8170SKalle Valo 	u8 *ie_chswitch;
118bdcd8170SKalle Valo 	u8 ie_erp;
119bdcd8170SKalle Valo 	u8 *ie_wsc;
120bdcd8170SKalle Valo 	u8 *ie_htcap;
121bdcd8170SKalle Valo 	u8 *ie_htop;
122bdcd8170SKalle Valo };
123bdcd8170SKalle Valo 
124bdcd8170SKalle Valo struct bss {
125bdcd8170SKalle Valo 	u8 ni_macaddr[ETH_ALEN];
126bdcd8170SKalle Valo 	u8 ni_snr;
127bdcd8170SKalle Valo 	s16 ni_rssi;
128bdcd8170SKalle Valo 	struct bss *ni_list_next;
129bdcd8170SKalle Valo 	struct bss *ni_list_prev;
130bdcd8170SKalle Valo 	struct bss *ni_hash_next;
131bdcd8170SKalle Valo 	struct bss *ni_hash_prev;
132bdcd8170SKalle Valo 	struct ath6kl_common_ie ni_cie;
133bdcd8170SKalle Valo 	u8 *ni_buf;
134bdcd8170SKalle Valo 	u16 ni_framelen;
135bdcd8170SKalle Valo 	struct ath6kl_node_table *ni_table;
136bdcd8170SKalle Valo 	u32 ni_refcnt;
137bdcd8170SKalle Valo 
138bdcd8170SKalle Valo 	u32 ni_tstamp;
139bdcd8170SKalle Valo 	u32 ni_actcnt;
140bdcd8170SKalle Valo };
141bdcd8170SKalle Valo 
142bdcd8170SKalle Valo struct htc_endpoint_credit_dist;
143bdcd8170SKalle Valo struct ath6kl;
144bdcd8170SKalle Valo enum htc_credit_dist_reason;
145bdcd8170SKalle Valo struct htc_credit_state_info;
146bdcd8170SKalle Valo 
147bdcd8170SKalle Valo struct bss *wlan_node_alloc(int wh_size);
148bdcd8170SKalle Valo void wlan_node_free(struct bss *ni);
149bdcd8170SKalle Valo void wlan_setup_node(struct ath6kl_node_table *nt, struct bss *ni,
150bdcd8170SKalle Valo 		     const u8 *mac_addr);
151bdcd8170SKalle Valo struct bss *wlan_find_node(struct ath6kl_node_table *nt,
152bdcd8170SKalle Valo 			   const u8 *mac_addr);
153bdcd8170SKalle Valo void wlan_node_reclaim(struct ath6kl_node_table *nt, struct bss *ni);
154bdcd8170SKalle Valo void wlan_free_allnodes(struct ath6kl_node_table *nt);
155bdcd8170SKalle Valo void wlan_iterate_nodes(struct ath6kl_node_table *nt,
156bdcd8170SKalle Valo 			void (*f) (void *arg, struct bss *),
157bdcd8170SKalle Valo 			void *arg);
158bdcd8170SKalle Valo 
159bdcd8170SKalle Valo void wlan_node_table_init(void *wmip, struct ath6kl_node_table *nt);
160bdcd8170SKalle Valo void wlan_node_table_cleanup(struct ath6kl_node_table *nt);
161bdcd8170SKalle Valo 
162bdcd8170SKalle Valo void wlan_refresh_inactive_nodes(struct ath6kl_node_table *nt);
163bdcd8170SKalle Valo 
164bdcd8170SKalle Valo struct bss *wlan_find_ssid_node(struct ath6kl_node_table *nt, u8 *ssid,
165bdcd8170SKalle Valo 				  u32 ssid_len, bool is_wpa2, bool match_ssid);
166bdcd8170SKalle Valo 
167bdcd8170SKalle Valo void wlan_node_return(struct ath6kl_node_table *nt, struct bss *ni);
168bdcd8170SKalle Valo 
169bdcd8170SKalle Valo int ath6k_setup_credit_dist(void *htc_handle,
170bdcd8170SKalle Valo 			    struct htc_credit_state_info *cred_info);
171bdcd8170SKalle Valo void ath6k_credit_distribute(struct htc_credit_state_info *cred_inf,
172bdcd8170SKalle Valo 			     struct list_head *epdist_list,
173bdcd8170SKalle Valo 			     enum htc_credit_dist_reason reason);
174bdcd8170SKalle Valo void ath6k_credit_init(struct htc_credit_state_info *cred_inf,
175bdcd8170SKalle Valo 		       struct list_head *ep_list,
176bdcd8170SKalle Valo 		       int tot_credits);
177bdcd8170SKalle Valo void ath6k_seek_credits(struct htc_credit_state_info *cred_inf,
178bdcd8170SKalle Valo 			struct htc_endpoint_credit_dist *ep_dist);
179bdcd8170SKalle Valo struct ath6kl *ath6kl_core_alloc(struct device *sdev);
180bdcd8170SKalle Valo int ath6kl_core_init(struct ath6kl *ar);
181bdcd8170SKalle Valo int ath6kl_unavail_ev(struct ath6kl *ar);
182bdcd8170SKalle Valo struct sk_buff *ath6kl_buf_alloc(int size);
183bdcd8170SKalle Valo #endif /* COMMON_H */
184