1fb9987d0SSujith /*
2fb9987d0SSujith  * Copyright (c) 2010 Atheros Communications Inc.
3fb9987d0SSujith  *
4fb9987d0SSujith  * Permission to use, copy, modify, and/or distribute this software for any
5fb9987d0SSujith  * purpose with or without fee is hereby granted, provided that the above
6fb9987d0SSujith  * copyright notice and this permission notice appear in all copies.
7fb9987d0SSujith  *
8fb9987d0SSujith  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9fb9987d0SSujith  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10fb9987d0SSujith  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11fb9987d0SSujith  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12fb9987d0SSujith  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13fb9987d0SSujith  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14fb9987d0SSujith  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15fb9987d0SSujith  */
16fb9987d0SSujith 
17fb9987d0SSujith #include "htc.h"
18fb9987d0SSujith 
19fb9987d0SSujith MODULE_AUTHOR("Atheros Communications");
20fb9987d0SSujith MODULE_LICENSE("Dual BSD/GPL");
21fb9987d0SSujith MODULE_DESCRIPTION("Atheros driver 802.11n HTC based wireless devices");
22fb9987d0SSujith 
23fb9987d0SSujith static unsigned int ath9k_debug = ATH_DBG_DEFAULT;
24fb9987d0SSujith module_param_named(debug, ath9k_debug, uint, 0);
25fb9987d0SSujith MODULE_PARM_DESC(debug, "Debugging mask");
26fb9987d0SSujith 
27e1572c5eSSujith int htc_modparam_nohwcrypt;
28e1572c5eSSujith module_param_named(nohwcrypt, htc_modparam_nohwcrypt, int, 0444);
29fb9987d0SSujith MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
30fb9987d0SSujith 
31fb9987d0SSujith #define CHAN2G(_freq, _idx)  { \
32fb9987d0SSujith 	.center_freq = (_freq), \
33fb9987d0SSujith 	.hw_value = (_idx), \
34fb9987d0SSujith 	.max_power = 20, \
35fb9987d0SSujith }
36fb9987d0SSujith 
37fb9987d0SSujith static struct ieee80211_channel ath9k_2ghz_channels[] = {
38fb9987d0SSujith 	CHAN2G(2412, 0), /* Channel 1 */
39fb9987d0SSujith 	CHAN2G(2417, 1), /* Channel 2 */
40fb9987d0SSujith 	CHAN2G(2422, 2), /* Channel 3 */
41fb9987d0SSujith 	CHAN2G(2427, 3), /* Channel 4 */
42fb9987d0SSujith 	CHAN2G(2432, 4), /* Channel 5 */
43fb9987d0SSujith 	CHAN2G(2437, 5), /* Channel 6 */
44fb9987d0SSujith 	CHAN2G(2442, 6), /* Channel 7 */
45fb9987d0SSujith 	CHAN2G(2447, 7), /* Channel 8 */
46fb9987d0SSujith 	CHAN2G(2452, 8), /* Channel 9 */
47fb9987d0SSujith 	CHAN2G(2457, 9), /* Channel 10 */
48fb9987d0SSujith 	CHAN2G(2462, 10), /* Channel 11 */
49fb9987d0SSujith 	CHAN2G(2467, 11), /* Channel 12 */
50fb9987d0SSujith 	CHAN2G(2472, 12), /* Channel 13 */
51fb9987d0SSujith 	CHAN2G(2484, 13), /* Channel 14 */
52fb9987d0SSujith };
53fb9987d0SSujith 
54fb9987d0SSujith /* Atheros hardware rate code addition for short premble */
55fb9987d0SSujith #define SHPCHECK(__hw_rate, __flags) \
56fb9987d0SSujith 	((__flags & IEEE80211_RATE_SHORT_PREAMBLE) ? (__hw_rate | 0x04) : 0)
57fb9987d0SSujith 
58fb9987d0SSujith #define RATE(_bitrate, _hw_rate, _flags) {		\
59fb9987d0SSujith 	.bitrate	= (_bitrate),			\
60fb9987d0SSujith 	.flags		= (_flags),			\
61fb9987d0SSujith 	.hw_value	= (_hw_rate),			\
62fb9987d0SSujith 	.hw_value_short = (SHPCHECK(_hw_rate, _flags))	\
63fb9987d0SSujith }
64fb9987d0SSujith 
65fb9987d0SSujith static struct ieee80211_rate ath9k_legacy_rates[] = {
66fb9987d0SSujith 	RATE(10, 0x1b, 0),
67fb9987d0SSujith 	RATE(20, 0x1a, IEEE80211_RATE_SHORT_PREAMBLE), /* shortp : 0x1e */
68fb9987d0SSujith 	RATE(55, 0x19, IEEE80211_RATE_SHORT_PREAMBLE), /* shortp: 0x1d */
69fb9987d0SSujith 	RATE(110, 0x18, IEEE80211_RATE_SHORT_PREAMBLE), /* short: 0x1c */
70fb9987d0SSujith 	RATE(60, 0x0b, 0),
71fb9987d0SSujith 	RATE(90, 0x0f, 0),
72fb9987d0SSujith 	RATE(120, 0x0a, 0),
73fb9987d0SSujith 	RATE(180, 0x0e, 0),
74fb9987d0SSujith 	RATE(240, 0x09, 0),
75fb9987d0SSujith 	RATE(360, 0x0d, 0),
76fb9987d0SSujith 	RATE(480, 0x08, 0),
77fb9987d0SSujith 	RATE(540, 0x0c, 0),
78fb9987d0SSujith };
79fb9987d0SSujith 
80fb9987d0SSujith static int ath9k_htc_wait_for_target(struct ath9k_htc_priv *priv)
81fb9987d0SSujith {
82fb9987d0SSujith 	int time_left;
83fb9987d0SSujith 
84fb9987d0SSujith 	/* Firmware can take up to 50ms to get ready, to be safe use 1 second */
85fb9987d0SSujith 	time_left = wait_for_completion_timeout(&priv->htc->target_wait, HZ);
86fb9987d0SSujith 	if (!time_left) {
87fb9987d0SSujith 		dev_err(priv->dev, "ath9k_htc: Target is unresponsive\n");
88fb9987d0SSujith 		return -ETIMEDOUT;
89fb9987d0SSujith 	}
90fb9987d0SSujith 
91fb9987d0SSujith 	return 0;
92fb9987d0SSujith }
93fb9987d0SSujith 
94fb9987d0SSujith static void ath9k_deinit_priv(struct ath9k_htc_priv *priv)
95fb9987d0SSujith {
96e1572c5eSSujith 	ath9k_htc_exit_debug(priv->ah);
97fb9987d0SSujith 	ath9k_hw_deinit(priv->ah);
98fb9987d0SSujith 	tasklet_kill(&priv->wmi_tasklet);
99fb9987d0SSujith 	tasklet_kill(&priv->rx_tasklet);
100fb9987d0SSujith 	tasklet_kill(&priv->tx_tasklet);
101fb9987d0SSujith 	kfree(priv->ah);
102fb9987d0SSujith 	priv->ah = NULL;
103fb9987d0SSujith }
104fb9987d0SSujith 
105fb9987d0SSujith static void ath9k_deinit_device(struct ath9k_htc_priv *priv)
106fb9987d0SSujith {
107fb9987d0SSujith 	struct ieee80211_hw *hw = priv->hw;
108fb9987d0SSujith 
109fb9987d0SSujith 	wiphy_rfkill_stop_polling(hw->wiphy);
110fb9987d0SSujith 	ath9k_deinit_leds(priv);
111fb9987d0SSujith 	ieee80211_unregister_hw(hw);
112fb9987d0SSujith 	ath9k_rx_cleanup(priv);
113fb9987d0SSujith 	ath9k_tx_cleanup(priv);
114fb9987d0SSujith 	ath9k_deinit_priv(priv);
115fb9987d0SSujith }
116fb9987d0SSujith 
117fb9987d0SSujith static inline int ath9k_htc_connect_svc(struct ath9k_htc_priv *priv,
118fb9987d0SSujith 					u16 service_id,
119fb9987d0SSujith 					void (*tx) (void *,
120fb9987d0SSujith 						    struct sk_buff *,
121fb9987d0SSujith 						    enum htc_endpoint_id,
122fb9987d0SSujith 						    bool txok),
123fb9987d0SSujith 					enum htc_endpoint_id *ep_id)
124fb9987d0SSujith {
125fb9987d0SSujith 	struct htc_service_connreq req;
126fb9987d0SSujith 
127fb9987d0SSujith 	memset(&req, 0, sizeof(struct htc_service_connreq));
128fb9987d0SSujith 
129fb9987d0SSujith 	req.service_id = service_id;
130fb9987d0SSujith 	req.ep_callbacks.priv = priv;
131fb9987d0SSujith 	req.ep_callbacks.rx = ath9k_htc_rxep;
132fb9987d0SSujith 	req.ep_callbacks.tx = tx;
133fb9987d0SSujith 
134fb9987d0SSujith 	return htc_connect_service(priv->htc, &req, ep_id);
135fb9987d0SSujith }
136fb9987d0SSujith 
137fb9987d0SSujith static int ath9k_init_htc_services(struct ath9k_htc_priv *priv)
138fb9987d0SSujith {
139fb9987d0SSujith 	int ret;
140fb9987d0SSujith 
141fb9987d0SSujith 	/* WMI CMD*/
142fb9987d0SSujith 	ret = ath9k_wmi_connect(priv->htc, priv->wmi, &priv->wmi_cmd_ep);
143fb9987d0SSujith 	if (ret)
144fb9987d0SSujith 		goto err;
145fb9987d0SSujith 
146fb9987d0SSujith 	/* Beacon */
147fb9987d0SSujith 	ret = ath9k_htc_connect_svc(priv, WMI_BEACON_SVC, NULL,
148fb9987d0SSujith 				    &priv->beacon_ep);
149fb9987d0SSujith 	if (ret)
150fb9987d0SSujith 		goto err;
151fb9987d0SSujith 
152fb9987d0SSujith 	/* CAB */
153fb9987d0SSujith 	ret = ath9k_htc_connect_svc(priv, WMI_CAB_SVC, ath9k_htc_txep,
154fb9987d0SSujith 				    &priv->cab_ep);
155fb9987d0SSujith 	if (ret)
156fb9987d0SSujith 		goto err;
157fb9987d0SSujith 
158fb9987d0SSujith 
159fb9987d0SSujith 	/* UAPSD */
160fb9987d0SSujith 	ret = ath9k_htc_connect_svc(priv, WMI_UAPSD_SVC, ath9k_htc_txep,
161fb9987d0SSujith 				    &priv->uapsd_ep);
162fb9987d0SSujith 	if (ret)
163fb9987d0SSujith 		goto err;
164fb9987d0SSujith 
165fb9987d0SSujith 	/* MGMT */
166fb9987d0SSujith 	ret = ath9k_htc_connect_svc(priv, WMI_MGMT_SVC, ath9k_htc_txep,
167fb9987d0SSujith 				    &priv->mgmt_ep);
168fb9987d0SSujith 	if (ret)
169fb9987d0SSujith 		goto err;
170fb9987d0SSujith 
171fb9987d0SSujith 	/* DATA BE */
172fb9987d0SSujith 	ret = ath9k_htc_connect_svc(priv, WMI_DATA_BE_SVC, ath9k_htc_txep,
173fb9987d0SSujith 				    &priv->data_be_ep);
174fb9987d0SSujith 	if (ret)
175fb9987d0SSujith 		goto err;
176fb9987d0SSujith 
177fb9987d0SSujith 	/* DATA BK */
178fb9987d0SSujith 	ret = ath9k_htc_connect_svc(priv, WMI_DATA_BK_SVC, ath9k_htc_txep,
179fb9987d0SSujith 				    &priv->data_bk_ep);
180fb9987d0SSujith 	if (ret)
181fb9987d0SSujith 		goto err;
182fb9987d0SSujith 
183fb9987d0SSujith 	/* DATA VI */
184fb9987d0SSujith 	ret = ath9k_htc_connect_svc(priv, WMI_DATA_VI_SVC, ath9k_htc_txep,
185fb9987d0SSujith 				    &priv->data_vi_ep);
186fb9987d0SSujith 	if (ret)
187fb9987d0SSujith 		goto err;
188fb9987d0SSujith 
189fb9987d0SSujith 	/* DATA VO */
190fb9987d0SSujith 	ret = ath9k_htc_connect_svc(priv, WMI_DATA_VO_SVC, ath9k_htc_txep,
191fb9987d0SSujith 				    &priv->data_vo_ep);
192fb9987d0SSujith 	if (ret)
193fb9987d0SSujith 		goto err;
194fb9987d0SSujith 
195fb9987d0SSujith 	ret = htc_init(priv->htc);
196fb9987d0SSujith 	if (ret)
197fb9987d0SSujith 		goto err;
198fb9987d0SSujith 
199fb9987d0SSujith 	return 0;
200fb9987d0SSujith 
201fb9987d0SSujith err:
202fb9987d0SSujith 	dev_err(priv->dev, "ath9k_htc: Unable to initialize HTC services\n");
203fb9987d0SSujith 	return ret;
204fb9987d0SSujith }
205fb9987d0SSujith 
206fb9987d0SSujith static int ath9k_reg_notifier(struct wiphy *wiphy,
207fb9987d0SSujith 			      struct regulatory_request *request)
208fb9987d0SSujith {
209fb9987d0SSujith 	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
210fb9987d0SSujith 	struct ath9k_htc_priv *priv = hw->priv;
211fb9987d0SSujith 
212fb9987d0SSujith 	return ath_reg_notifier_apply(wiphy, request,
213fb9987d0SSujith 				      ath9k_hw_regulatory(priv->ah));
214fb9987d0SSujith }
215fb9987d0SSujith 
216fb9987d0SSujith static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
217fb9987d0SSujith {
218fb9987d0SSujith 	struct ath_hw *ah = (struct ath_hw *) hw_priv;
219fb9987d0SSujith 	struct ath_common *common = ath9k_hw_common(ah);
220fb9987d0SSujith 	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
221fb9987d0SSujith 	__be32 val, reg = cpu_to_be32(reg_offset);
222fb9987d0SSujith 	int r;
223fb9987d0SSujith 
224fb9987d0SSujith 	r = ath9k_wmi_cmd(priv->wmi, WMI_REG_READ_CMDID,
225fb9987d0SSujith 			  (u8 *) &reg, sizeof(reg),
226fb9987d0SSujith 			  (u8 *) &val, sizeof(val),
227fb9987d0SSujith 			  100);
228fb9987d0SSujith 	if (unlikely(r)) {
229fb9987d0SSujith 		ath_print(common, ATH_DBG_WMI,
230fb9987d0SSujith 			  "REGISTER READ FAILED: (0x%04x, %d)\n",
231fb9987d0SSujith 			   reg_offset, r);
232fb9987d0SSujith 		return -EIO;
233fb9987d0SSujith 	}
234fb9987d0SSujith 
235fb9987d0SSujith 	return be32_to_cpu(val);
236fb9987d0SSujith }
237fb9987d0SSujith 
238fb9987d0SSujith static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset)
239fb9987d0SSujith {
240fb9987d0SSujith 	struct ath_hw *ah = (struct ath_hw *) hw_priv;
241fb9987d0SSujith 	struct ath_common *common = ath9k_hw_common(ah);
242fb9987d0SSujith 	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
243fb9987d0SSujith 	__be32 buf[2] = {
244fb9987d0SSujith 		cpu_to_be32(reg_offset),
245fb9987d0SSujith 		cpu_to_be32(val),
246fb9987d0SSujith 	};
247fb9987d0SSujith 	int r;
248fb9987d0SSujith 
249fb9987d0SSujith 	r = ath9k_wmi_cmd(priv->wmi, WMI_REG_WRITE_CMDID,
250fb9987d0SSujith 			  (u8 *) &buf, sizeof(buf),
251fb9987d0SSujith 			  (u8 *) &val, sizeof(val),
252fb9987d0SSujith 			  100);
253fb9987d0SSujith 	if (unlikely(r)) {
254fb9987d0SSujith 		ath_print(common, ATH_DBG_WMI,
255fb9987d0SSujith 			  "REGISTER WRITE FAILED:(0x%04x, %d)\n",
256fb9987d0SSujith 			  reg_offset, r);
257fb9987d0SSujith 	}
258fb9987d0SSujith }
259fb9987d0SSujith 
260fb9987d0SSujith static const struct ath_ops ath9k_common_ops = {
261fb9987d0SSujith 	.read = ath9k_ioread32,
262fb9987d0SSujith 	.write = ath9k_iowrite32,
263fb9987d0SSujith };
264fb9987d0SSujith 
265fb9987d0SSujith static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
266fb9987d0SSujith {
267fb9987d0SSujith 	*csz = L1_CACHE_BYTES >> 2;
268fb9987d0SSujith }
269fb9987d0SSujith 
270fb9987d0SSujith static bool ath_usb_eeprom_read(struct ath_common *common, u32 off, u16 *data)
271fb9987d0SSujith {
272fb9987d0SSujith 	struct ath_hw *ah = (struct ath_hw *) common->ah;
273fb9987d0SSujith 
274fb9987d0SSujith 	(void)REG_READ(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
275fb9987d0SSujith 
276fb9987d0SSujith 	if (!ath9k_hw_wait(ah,
277fb9987d0SSujith 			   AR_EEPROM_STATUS_DATA,
278fb9987d0SSujith 			   AR_EEPROM_STATUS_DATA_BUSY |
279fb9987d0SSujith 			   AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0,
280fb9987d0SSujith 			   AH_WAIT_TIMEOUT))
281fb9987d0SSujith 		return false;
282fb9987d0SSujith 
283fb9987d0SSujith 	*data = MS(REG_READ(ah, AR_EEPROM_STATUS_DATA),
284fb9987d0SSujith 		   AR_EEPROM_STATUS_DATA_VAL);
285fb9987d0SSujith 
286fb9987d0SSujith 	return true;
287fb9987d0SSujith }
288fb9987d0SSujith 
289fb9987d0SSujith static const struct ath_bus_ops ath9k_usb_bus_ops = {
290fb9987d0SSujith 	.read_cachesize = ath_usb_read_cachesize,
291fb9987d0SSujith 	.eeprom_read = ath_usb_eeprom_read,
292fb9987d0SSujith };
293fb9987d0SSujith 
294fb9987d0SSujith static void setup_ht_cap(struct ath9k_htc_priv *priv,
295fb9987d0SSujith 			 struct ieee80211_sta_ht_cap *ht_info)
296fb9987d0SSujith {
297fb9987d0SSujith 	ht_info->ht_supported = true;
298fb9987d0SSujith 	ht_info->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
299fb9987d0SSujith 		       IEEE80211_HT_CAP_SM_PS |
300fb9987d0SSujith 		       IEEE80211_HT_CAP_SGI_40 |
301fb9987d0SSujith 		       IEEE80211_HT_CAP_DSSSCCK40;
302fb9987d0SSujith 
303fb9987d0SSujith 	ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
304fb9987d0SSujith 	ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
305fb9987d0SSujith 
306fb9987d0SSujith 	memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
307fb9987d0SSujith 	ht_info->mcs.rx_mask[0] = 0xff;
308fb9987d0SSujith 	ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
309fb9987d0SSujith }
310fb9987d0SSujith 
311fb9987d0SSujith static int ath9k_init_queues(struct ath9k_htc_priv *priv)
312fb9987d0SSujith {
313fb9987d0SSujith 	struct ath_common *common = ath9k_hw_common(priv->ah);
314fb9987d0SSujith 	int i;
315fb9987d0SSujith 
316fb9987d0SSujith 	for (i = 0; i < ARRAY_SIZE(priv->hwq_map); i++)
317fb9987d0SSujith 		priv->hwq_map[i] = -1;
318fb9987d0SSujith 
319fb9987d0SSujith 	if (!ath9k_htc_txq_setup(priv, ATH9K_WME_AC_BE)) {
320fb9987d0SSujith 		ath_print(common, ATH_DBG_FATAL,
321fb9987d0SSujith 			  "Unable to setup xmit queue for BE traffic\n");
322fb9987d0SSujith 		goto err;
323fb9987d0SSujith 	}
324fb9987d0SSujith 
325fb9987d0SSujith 	if (!ath9k_htc_txq_setup(priv, ATH9K_WME_AC_BK)) {
326fb9987d0SSujith 		ath_print(common, ATH_DBG_FATAL,
327fb9987d0SSujith 			  "Unable to setup xmit queue for BK traffic\n");
328fb9987d0SSujith 		goto err;
329fb9987d0SSujith 	}
330fb9987d0SSujith 	if (!ath9k_htc_txq_setup(priv, ATH9K_WME_AC_VI)) {
331fb9987d0SSujith 		ath_print(common, ATH_DBG_FATAL,
332fb9987d0SSujith 			  "Unable to setup xmit queue for VI traffic\n");
333fb9987d0SSujith 		goto err;
334fb9987d0SSujith 	}
335fb9987d0SSujith 	if (!ath9k_htc_txq_setup(priv, ATH9K_WME_AC_VO)) {
336fb9987d0SSujith 		ath_print(common, ATH_DBG_FATAL,
337fb9987d0SSujith 			  "Unable to setup xmit queue for VO traffic\n");
338fb9987d0SSujith 		goto err;
339fb9987d0SSujith 	}
340fb9987d0SSujith 
341fb9987d0SSujith 	return 0;
342fb9987d0SSujith 
343fb9987d0SSujith err:
344fb9987d0SSujith 	return -EINVAL;
345fb9987d0SSujith }
346fb9987d0SSujith 
347fb9987d0SSujith static void ath9k_init_crypto(struct ath9k_htc_priv *priv)
348fb9987d0SSujith {
349fb9987d0SSujith 	struct ath_common *common = ath9k_hw_common(priv->ah);
350fb9987d0SSujith 	int i = 0;
351fb9987d0SSujith 
352fb9987d0SSujith 	/* Get the hardware key cache size. */
353fb9987d0SSujith 	common->keymax = priv->ah->caps.keycache_size;
354fb9987d0SSujith 	if (common->keymax > ATH_KEYMAX) {
355fb9987d0SSujith 		ath_print(common, ATH_DBG_ANY,
356fb9987d0SSujith 			  "Warning, using only %u entries in %u key cache\n",
357fb9987d0SSujith 			  ATH_KEYMAX, common->keymax);
358fb9987d0SSujith 		common->keymax = ATH_KEYMAX;
359fb9987d0SSujith 	}
360fb9987d0SSujith 
361fb9987d0SSujith 	/*
362fb9987d0SSujith 	 * Reset the key cache since some parts do not
363fb9987d0SSujith 	 * reset the contents on initial power up.
364fb9987d0SSujith 	 */
365fb9987d0SSujith 	for (i = 0; i < common->keymax; i++)
366fb9987d0SSujith 		ath9k_hw_keyreset(priv->ah, (u16) i);
367fb9987d0SSujith 
368fb9987d0SSujith 	if (ath9k_hw_getcapability(priv->ah, ATH9K_CAP_CIPHER,
369fb9987d0SSujith 				   ATH9K_CIPHER_TKIP, NULL)) {
370fb9987d0SSujith 		/*
371fb9987d0SSujith 		 * Whether we should enable h/w TKIP MIC.
372fb9987d0SSujith 		 * XXX: if we don't support WME TKIP MIC, then we wouldn't
373fb9987d0SSujith 		 * report WMM capable, so it's always safe to turn on
374fb9987d0SSujith 		 * TKIP MIC in this case.
375fb9987d0SSujith 		 */
376fb9987d0SSujith 		ath9k_hw_setcapability(priv->ah, ATH9K_CAP_TKIP_MIC, 0, 1, NULL);
377fb9987d0SSujith 	}
378fb9987d0SSujith 
379fb9987d0SSujith 	/*
380fb9987d0SSujith 	 * Check whether the separate key cache entries
381fb9987d0SSujith 	 * are required to handle both tx+rx MIC keys.
382fb9987d0SSujith 	 * With split mic keys the number of stations is limited
383fb9987d0SSujith 	 * to 27 otherwise 59.
384fb9987d0SSujith 	 */
385fb9987d0SSujith 	if (ath9k_hw_getcapability(priv->ah, ATH9K_CAP_CIPHER,
386fb9987d0SSujith 				   ATH9K_CIPHER_TKIP, NULL)
387fb9987d0SSujith 	    && ath9k_hw_getcapability(priv->ah, ATH9K_CAP_CIPHER,
388fb9987d0SSujith 				      ATH9K_CIPHER_MIC, NULL)
389fb9987d0SSujith 	    && ath9k_hw_getcapability(priv->ah, ATH9K_CAP_TKIP_SPLIT,
390fb9987d0SSujith 				      0, NULL))
391fb9987d0SSujith 		common->splitmic = 1;
392fb9987d0SSujith 
393fb9987d0SSujith 	/* turn on mcast key search if possible */
394fb9987d0SSujith 	if (!ath9k_hw_getcapability(priv->ah, ATH9K_CAP_MCAST_KEYSRCH, 0, NULL))
395fb9987d0SSujith 		(void)ath9k_hw_setcapability(priv->ah, ATH9K_CAP_MCAST_KEYSRCH,
396fb9987d0SSujith 					     1, 1, NULL);
397fb9987d0SSujith }
398fb9987d0SSujith 
399fb9987d0SSujith static void ath9k_init_channels_rates(struct ath9k_htc_priv *priv)
400fb9987d0SSujith {
401fb9987d0SSujith 	if (test_bit(ATH9K_MODE_11G, priv->ah->caps.wireless_modes)) {
402fb9987d0SSujith 		priv->sbands[IEEE80211_BAND_2GHZ].channels =
403fb9987d0SSujith 			ath9k_2ghz_channels;
404fb9987d0SSujith 		priv->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ;
405fb9987d0SSujith 		priv->sbands[IEEE80211_BAND_2GHZ].n_channels =
406fb9987d0SSujith 			ARRAY_SIZE(ath9k_2ghz_channels);
407fb9987d0SSujith 		priv->sbands[IEEE80211_BAND_2GHZ].bitrates = ath9k_legacy_rates;
408fb9987d0SSujith 		priv->sbands[IEEE80211_BAND_2GHZ].n_bitrates =
409fb9987d0SSujith 			ARRAY_SIZE(ath9k_legacy_rates);
410fb9987d0SSujith 	}
411fb9987d0SSujith }
412fb9987d0SSujith 
413fb9987d0SSujith static void ath9k_init_misc(struct ath9k_htc_priv *priv)
414fb9987d0SSujith {
415fb9987d0SSujith 	struct ath_common *common = ath9k_hw_common(priv->ah);
416fb9987d0SSujith 
417fb9987d0SSujith 	common->tx_chainmask = priv->ah->caps.tx_chainmask;
418fb9987d0SSujith 	common->rx_chainmask = priv->ah->caps.rx_chainmask;
419fb9987d0SSujith 
420fb9987d0SSujith 	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK)
421fb9987d0SSujith 		memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
422fb9987d0SSujith 
423fb9987d0SSujith 	priv->op_flags |= OP_TXAGGR;
424fb9987d0SSujith }
425fb9987d0SSujith 
426fb9987d0SSujith static int ath9k_init_priv(struct ath9k_htc_priv *priv, u16 devid)
427fb9987d0SSujith {
428fb9987d0SSujith 	struct ath_hw *ah = NULL;
429fb9987d0SSujith 	struct ath_common *common;
430fb9987d0SSujith 	int ret = 0, csz = 0;
431fb9987d0SSujith 
432fb9987d0SSujith 	priv->op_flags |= OP_INVALID;
433fb9987d0SSujith 
434fb9987d0SSujith 	ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
435fb9987d0SSujith 	if (!ah)
436fb9987d0SSujith 		return -ENOMEM;
437fb9987d0SSujith 
438fb9987d0SSujith 	ah->hw_version.devid = devid;
439fb9987d0SSujith 	ah->hw_version.subsysid = 0; /* FIXME */
440fb9987d0SSujith 	priv->ah = ah;
441fb9987d0SSujith 
442fb9987d0SSujith 	common = ath9k_hw_common(ah);
443fb9987d0SSujith 	common->ops = &ath9k_common_ops;
444fb9987d0SSujith 	common->bus_ops = &ath9k_usb_bus_ops;
445fb9987d0SSujith 	common->ah = ah;
446fb9987d0SSujith 	common->hw = priv->hw;
447fb9987d0SSujith 	common->priv = priv;
448fb9987d0SSujith 	common->debug_mask = ath9k_debug;
449fb9987d0SSujith 
450fb9987d0SSujith 	spin_lock_init(&priv->wmi->wmi_lock);
451fb9987d0SSujith 	spin_lock_init(&priv->beacon_lock);
452fb9987d0SSujith 	mutex_init(&priv->mutex);
453fb9987d0SSujith 	mutex_init(&priv->aggr_work.mutex);
454fb9987d0SSujith 	tasklet_init(&priv->wmi_tasklet, ath9k_wmi_tasklet,
455fb9987d0SSujith 		     (unsigned long)priv);
456fb9987d0SSujith 	tasklet_init(&priv->rx_tasklet, ath9k_rx_tasklet,
457fb9987d0SSujith 		     (unsigned long)priv);
458fb9987d0SSujith 	tasklet_init(&priv->tx_tasklet, ath9k_tx_tasklet, (unsigned long)priv);
459fb9987d0SSujith 	INIT_DELAYED_WORK(&priv->ath9k_aggr_work, ath9k_htc_aggr_work);
460fb9987d0SSujith 	INIT_DELAYED_WORK(&priv->ath9k_ani_work, ath9k_ani_work);
461fb9987d0SSujith 
462fb9987d0SSujith 	/*
463fb9987d0SSujith 	 * Cache line size is used to size and align various
464fb9987d0SSujith 	 * structures used to communicate with the hardware.
465fb9987d0SSujith 	 */
466fb9987d0SSujith 	ath_read_cachesize(common, &csz);
467fb9987d0SSujith 	common->cachelsz = csz << 2; /* convert to bytes */
468fb9987d0SSujith 
469fb9987d0SSujith 	ret = ath9k_hw_init(ah);
470fb9987d0SSujith 	if (ret) {
471fb9987d0SSujith 		ath_print(common, ATH_DBG_FATAL,
472fb9987d0SSujith 			  "Unable to initialize hardware; "
473fb9987d0SSujith 			  "initialization status: %d\n", ret);
474fb9987d0SSujith 		goto err_hw;
475fb9987d0SSujith 	}
476fb9987d0SSujith 
477e1572c5eSSujith 	ret = ath9k_htc_init_debug(ah);
478fb9987d0SSujith 	if (ret) {
479fb9987d0SSujith 		ath_print(common, ATH_DBG_FATAL,
480fb9987d0SSujith 			  "Unable to create debugfs files\n");
481fb9987d0SSujith 		goto err_debug;
482fb9987d0SSujith 	}
483fb9987d0SSujith 
484fb9987d0SSujith 	ret = ath9k_init_queues(priv);
485fb9987d0SSujith 	if (ret)
486fb9987d0SSujith 		goto err_queues;
487fb9987d0SSujith 
488fb9987d0SSujith 	ath9k_init_crypto(priv);
489fb9987d0SSujith 	ath9k_init_channels_rates(priv);
490fb9987d0SSujith 	ath9k_init_misc(priv);
491fb9987d0SSujith 
492fb9987d0SSujith 	return 0;
493fb9987d0SSujith 
494fb9987d0SSujith err_queues:
495e1572c5eSSujith 	ath9k_htc_exit_debug(ah);
496fb9987d0SSujith err_debug:
497fb9987d0SSujith 	ath9k_hw_deinit(ah);
498fb9987d0SSujith err_hw:
499fb9987d0SSujith 
500fb9987d0SSujith 	kfree(ah);
501fb9987d0SSujith 	priv->ah = NULL;
502fb9987d0SSujith 
503fb9987d0SSujith 	return ret;
504fb9987d0SSujith }
505fb9987d0SSujith 
506fb9987d0SSujith static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
507fb9987d0SSujith 			       struct ieee80211_hw *hw)
508fb9987d0SSujith {
509fb9987d0SSujith 	struct ath_common *common = ath9k_hw_common(priv->ah);
510fb9987d0SSujith 
511fb9987d0SSujith 	hw->flags = IEEE80211_HW_SIGNAL_DBM |
512fb9987d0SSujith 		IEEE80211_HW_AMPDU_AGGREGATION |
513fb9987d0SSujith 		IEEE80211_HW_SPECTRUM_MGMT |
514fb9987d0SSujith 		IEEE80211_HW_HAS_RATE_CONTROL;
515fb9987d0SSujith 
516fb9987d0SSujith 	hw->wiphy->interface_modes =
517fb9987d0SSujith 		BIT(NL80211_IFTYPE_STATION) |
518fb9987d0SSujith 		BIT(NL80211_IFTYPE_ADHOC);
519fb9987d0SSujith 
520fb9987d0SSujith 	hw->queues = 4;
521fb9987d0SSujith 	hw->channel_change_time = 5000;
522fb9987d0SSujith 	hw->max_listen_interval = 10;
523fb9987d0SSujith 	hw->vif_data_size = sizeof(struct ath9k_htc_vif);
524fb9987d0SSujith 	hw->sta_data_size = sizeof(struct ath9k_htc_sta);
525fb9987d0SSujith 
526fb9987d0SSujith 	/* tx_frame_hdr is larger than tx_mgmt_hdr anyway */
527fb9987d0SSujith 	hw->extra_tx_headroom = sizeof(struct tx_frame_hdr) +
528fb9987d0SSujith 		sizeof(struct htc_frame_hdr) + 4;
529fb9987d0SSujith 
530fb9987d0SSujith 	if (test_bit(ATH9K_MODE_11G, priv->ah->caps.wireless_modes))
531fb9987d0SSujith 		hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
532fb9987d0SSujith 			&priv->sbands[IEEE80211_BAND_2GHZ];
533fb9987d0SSujith 
534fb9987d0SSujith 	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
535fb9987d0SSujith 		if (test_bit(ATH9K_MODE_11G, priv->ah->caps.wireless_modes))
536fb9987d0SSujith 			setup_ht_cap(priv,
537fb9987d0SSujith 				     &priv->sbands[IEEE80211_BAND_2GHZ].ht_cap);
538fb9987d0SSujith 	}
539fb9987d0SSujith 
540fb9987d0SSujith 	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
541fb9987d0SSujith }
542fb9987d0SSujith 
543fb9987d0SSujith static int ath9k_init_device(struct ath9k_htc_priv *priv, u16 devid)
544fb9987d0SSujith {
545fb9987d0SSujith 	struct ieee80211_hw *hw = priv->hw;
546fb9987d0SSujith 	struct ath_common *common;
547fb9987d0SSujith 	struct ath_hw *ah;
548fb9987d0SSujith 	int error = 0;
549fb9987d0SSujith 	struct ath_regulatory *reg;
550fb9987d0SSujith 
551fb9987d0SSujith 	/* Bring up device */
552fb9987d0SSujith 	error = ath9k_init_priv(priv, devid);
553fb9987d0SSujith 	if (error != 0)
554fb9987d0SSujith 		goto err_init;
555fb9987d0SSujith 
556fb9987d0SSujith 	ah = priv->ah;
557fb9987d0SSujith 	common = ath9k_hw_common(ah);
558fb9987d0SSujith 	ath9k_set_hw_capab(priv, hw);
559fb9987d0SSujith 
560fb9987d0SSujith 	/* Initialize regulatory */
561fb9987d0SSujith 	error = ath_regd_init(&common->regulatory, priv->hw->wiphy,
562fb9987d0SSujith 			      ath9k_reg_notifier);
563fb9987d0SSujith 	if (error)
564fb9987d0SSujith 		goto err_regd;
565fb9987d0SSujith 
566fb9987d0SSujith 	reg = &common->regulatory;
567fb9987d0SSujith 
568fb9987d0SSujith 	/* Setup TX */
569fb9987d0SSujith 	error = ath9k_tx_init(priv);
570fb9987d0SSujith 	if (error != 0)
571fb9987d0SSujith 		goto err_tx;
572fb9987d0SSujith 
573fb9987d0SSujith 	/* Setup RX */
574fb9987d0SSujith 	error = ath9k_rx_init(priv);
575fb9987d0SSujith 	if (error != 0)
576fb9987d0SSujith 		goto err_rx;
577fb9987d0SSujith 
578fb9987d0SSujith 	/* Register with mac80211 */
579fb9987d0SSujith 	error = ieee80211_register_hw(hw);
580fb9987d0SSujith 	if (error)
581fb9987d0SSujith 		goto err_register;
582fb9987d0SSujith 
583fb9987d0SSujith 	/* Handle world regulatory */
584fb9987d0SSujith 	if (!ath_is_world_regd(reg)) {
585fb9987d0SSujith 		error = regulatory_hint(hw->wiphy, reg->alpha2);
586fb9987d0SSujith 		if (error)
587fb9987d0SSujith 			goto err_world;
588fb9987d0SSujith 	}
589fb9987d0SSujith 
590fb9987d0SSujith 	ath9k_init_leds(priv);
591fb9987d0SSujith 	ath9k_start_rfkill_poll(priv);
592fb9987d0SSujith 
593fb9987d0SSujith 	return 0;
594fb9987d0SSujith 
595fb9987d0SSujith err_world:
596fb9987d0SSujith 	ieee80211_unregister_hw(hw);
597fb9987d0SSujith err_register:
598fb9987d0SSujith 	ath9k_rx_cleanup(priv);
599fb9987d0SSujith err_rx:
600fb9987d0SSujith 	ath9k_tx_cleanup(priv);
601fb9987d0SSujith err_tx:
602fb9987d0SSujith 	/* Nothing */
603fb9987d0SSujith err_regd:
604fb9987d0SSujith 	ath9k_deinit_priv(priv);
605fb9987d0SSujith err_init:
606fb9987d0SSujith 	return error;
607fb9987d0SSujith }
608fb9987d0SSujith 
609fb9987d0SSujith int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
610fb9987d0SSujith 			   u16 devid)
611fb9987d0SSujith {
612fb9987d0SSujith 	struct ieee80211_hw *hw;
613fb9987d0SSujith 	struct ath9k_htc_priv *priv;
614fb9987d0SSujith 	int ret;
615fb9987d0SSujith 
616fb9987d0SSujith 	hw = ieee80211_alloc_hw(sizeof(struct ath9k_htc_priv), &ath9k_htc_ops);
617fb9987d0SSujith 	if (!hw)
618fb9987d0SSujith 		return -ENOMEM;
619fb9987d0SSujith 
620fb9987d0SSujith 	priv = hw->priv;
621fb9987d0SSujith 	priv->hw = hw;
622fb9987d0SSujith 	priv->htc = htc_handle;
623fb9987d0SSujith 	priv->dev = dev;
624fb9987d0SSujith 	htc_handle->drv_priv = priv;
625fb9987d0SSujith 	SET_IEEE80211_DEV(hw, priv->dev);
626fb9987d0SSujith 
627fb9987d0SSujith 	ret = ath9k_htc_wait_for_target(priv);
628fb9987d0SSujith 	if (ret)
629fb9987d0SSujith 		goto err_free;
630fb9987d0SSujith 
631fb9987d0SSujith 	priv->wmi = ath9k_init_wmi(priv);
632fb9987d0SSujith 	if (!priv->wmi) {
633fb9987d0SSujith 		ret = -EINVAL;
634fb9987d0SSujith 		goto err_free;
635fb9987d0SSujith 	}
636fb9987d0SSujith 
637fb9987d0SSujith 	ret = ath9k_init_htc_services(priv);
638fb9987d0SSujith 	if (ret)
639fb9987d0SSujith 		goto err_init;
640fb9987d0SSujith 
641fb9987d0SSujith 	ret = ath9k_init_device(priv, devid);
642fb9987d0SSujith 	if (ret)
643fb9987d0SSujith 		goto err_init;
644fb9987d0SSujith 
645fb9987d0SSujith 	return 0;
646fb9987d0SSujith 
647fb9987d0SSujith err_init:
648fb9987d0SSujith 	ath9k_deinit_wmi(priv);
649fb9987d0SSujith err_free:
650fb9987d0SSujith 	ieee80211_free_hw(hw);
651fb9987d0SSujith 	return ret;
652fb9987d0SSujith }
653fb9987d0SSujith 
654fb9987d0SSujith void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
655fb9987d0SSujith {
656fb9987d0SSujith 	if (htc_handle->drv_priv) {
657fb9987d0SSujith 		ath9k_deinit_device(htc_handle->drv_priv);
658fb9987d0SSujith 		ath9k_deinit_wmi(htc_handle->drv_priv);
659fb9987d0SSujith 		ieee80211_free_hw(htc_handle->drv_priv->hw);
660fb9987d0SSujith 	}
661fb9987d0SSujith }
662fb9987d0SSujith 
663fb9987d0SSujith #ifdef CONFIG_PM
664fb9987d0SSujith int ath9k_htc_resume(struct htc_target *htc_handle)
665fb9987d0SSujith {
666fb9987d0SSujith 	int ret;
667fb9987d0SSujith 
668fb9987d0SSujith 	ret = ath9k_htc_wait_for_target(htc_handle->drv_priv);
669fb9987d0SSujith 	if (ret)
670fb9987d0SSujith 		return ret;
671fb9987d0SSujith 
672fb9987d0SSujith 	ret = ath9k_init_htc_services(htc_handle->drv_priv);
673fb9987d0SSujith 	return ret;
674fb9987d0SSujith }
675fb9987d0SSujith #endif
676fb9987d0SSujith 
677fb9987d0SSujith static int __init ath9k_htc_init(void)
678fb9987d0SSujith {
679fb9987d0SSujith 	int error;
680fb9987d0SSujith 
681e1572c5eSSujith 	error = ath9k_htc_debug_create_root();
682fb9987d0SSujith 	if (error < 0) {
683fb9987d0SSujith 		printk(KERN_ERR
684fb9987d0SSujith 			"ath9k_htc: Unable to create debugfs root: %d\n",
685fb9987d0SSujith 			error);
686fb9987d0SSujith 		goto err_dbg;
687fb9987d0SSujith 	}
688fb9987d0SSujith 
689fb9987d0SSujith 	error = ath9k_hif_usb_init();
690fb9987d0SSujith 	if (error < 0) {
691fb9987d0SSujith 		printk(KERN_ERR
692fb9987d0SSujith 			"ath9k_htc: No USB devices found,"
693fb9987d0SSujith 			" driver not installed.\n");
694fb9987d0SSujith 		error = -ENODEV;
695fb9987d0SSujith 		goto err_usb;
696fb9987d0SSujith 	}
697fb9987d0SSujith 
698fb9987d0SSujith 	return 0;
699fb9987d0SSujith 
700fb9987d0SSujith err_usb:
701e1572c5eSSujith 	ath9k_htc_debug_remove_root();
702fb9987d0SSujith err_dbg:
703fb9987d0SSujith 	return error;
704fb9987d0SSujith }
705fb9987d0SSujith module_init(ath9k_htc_init);
706fb9987d0SSujith 
707fb9987d0SSujith static void __exit ath9k_htc_exit(void)
708fb9987d0SSujith {
709fb9987d0SSujith 	ath9k_hif_usb_exit();
710e1572c5eSSujith 	ath9k_htc_debug_remove_root();
711fb9987d0SSujith 	printk(KERN_INFO "ath9k_htc: Driver unloaded\n");
712fb9987d0SSujith }
713fb9987d0SSujith module_exit(ath9k_htc_exit);
714