Linux Audio

Check our new training course

Loading...
v3.1
   1/*
   2 * Copyright (c) 2010-2011 Atheros Communications Inc.
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16
 
 
  17#include "htc.h"
  18
  19MODULE_AUTHOR("Atheros Communications");
  20MODULE_LICENSE("Dual BSD/GPL");
  21MODULE_DESCRIPTION("Atheros driver 802.11n HTC based wireless devices");
  22
  23static unsigned int ath9k_debug = ATH_DBG_DEFAULT;
  24module_param_named(debug, ath9k_debug, uint, 0);
  25MODULE_PARM_DESC(debug, "Debugging mask");
  26
  27int htc_modparam_nohwcrypt;
  28module_param_named(nohwcrypt, htc_modparam_nohwcrypt, int, 0444);
  29MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
  30
  31#define CHAN2G(_freq, _idx)  { \
  32	.center_freq = (_freq), \
  33	.hw_value = (_idx), \
  34	.max_power = 20, \
  35}
  36
  37#define CHAN5G(_freq, _idx) { \
  38	.band = IEEE80211_BAND_5GHZ, \
  39	.center_freq = (_freq), \
  40	.hw_value = (_idx), \
  41	.max_power = 20, \
  42}
  43
  44#define ATH_HTC_BTCOEX_PRODUCT_ID "wb193"
  45
  46static struct ieee80211_channel ath9k_2ghz_channels[] = {
  47	CHAN2G(2412, 0), /* Channel 1 */
  48	CHAN2G(2417, 1), /* Channel 2 */
  49	CHAN2G(2422, 2), /* Channel 3 */
  50	CHAN2G(2427, 3), /* Channel 4 */
  51	CHAN2G(2432, 4), /* Channel 5 */
  52	CHAN2G(2437, 5), /* Channel 6 */
  53	CHAN2G(2442, 6), /* Channel 7 */
  54	CHAN2G(2447, 7), /* Channel 8 */
  55	CHAN2G(2452, 8), /* Channel 9 */
  56	CHAN2G(2457, 9), /* Channel 10 */
  57	CHAN2G(2462, 10), /* Channel 11 */
  58	CHAN2G(2467, 11), /* Channel 12 */
  59	CHAN2G(2472, 12), /* Channel 13 */
  60	CHAN2G(2484, 13), /* Channel 14 */
  61};
  62
  63static struct ieee80211_channel ath9k_5ghz_channels[] = {
  64	/* _We_ call this UNII 1 */
  65	CHAN5G(5180, 14), /* Channel 36 */
  66	CHAN5G(5200, 15), /* Channel 40 */
  67	CHAN5G(5220, 16), /* Channel 44 */
  68	CHAN5G(5240, 17), /* Channel 48 */
  69	/* _We_ call this UNII 2 */
  70	CHAN5G(5260, 18), /* Channel 52 */
  71	CHAN5G(5280, 19), /* Channel 56 */
  72	CHAN5G(5300, 20), /* Channel 60 */
  73	CHAN5G(5320, 21), /* Channel 64 */
  74	/* _We_ call this "Middle band" */
  75	CHAN5G(5500, 22), /* Channel 100 */
  76	CHAN5G(5520, 23), /* Channel 104 */
  77	CHAN5G(5540, 24), /* Channel 108 */
  78	CHAN5G(5560, 25), /* Channel 112 */
  79	CHAN5G(5580, 26), /* Channel 116 */
  80	CHAN5G(5600, 27), /* Channel 120 */
  81	CHAN5G(5620, 28), /* Channel 124 */
  82	CHAN5G(5640, 29), /* Channel 128 */
  83	CHAN5G(5660, 30), /* Channel 132 */
  84	CHAN5G(5680, 31), /* Channel 136 */
  85	CHAN5G(5700, 32), /* Channel 140 */
  86	/* _We_ call this UNII 3 */
  87	CHAN5G(5745, 33), /* Channel 149 */
  88	CHAN5G(5765, 34), /* Channel 153 */
  89	CHAN5G(5785, 35), /* Channel 157 */
  90	CHAN5G(5805, 36), /* Channel 161 */
  91	CHAN5G(5825, 37), /* Channel 165 */
  92};
  93
  94/* Atheros hardware rate code addition for short premble */
  95#define SHPCHECK(__hw_rate, __flags) \
  96	((__flags & IEEE80211_RATE_SHORT_PREAMBLE) ? (__hw_rate | 0x04) : 0)
  97
  98#define RATE(_bitrate, _hw_rate, _flags) {		\
  99	.bitrate	= (_bitrate),			\
 100	.flags		= (_flags),			\
 101	.hw_value	= (_hw_rate),			\
 102	.hw_value_short = (SHPCHECK(_hw_rate, _flags))	\
 103}
 104
 105static struct ieee80211_rate ath9k_legacy_rates[] = {
 106	RATE(10, 0x1b, 0),
 107	RATE(20, 0x1a, IEEE80211_RATE_SHORT_PREAMBLE), /* shortp : 0x1e */
 108	RATE(55, 0x19, IEEE80211_RATE_SHORT_PREAMBLE), /* shortp: 0x1d */
 109	RATE(110, 0x18, IEEE80211_RATE_SHORT_PREAMBLE), /* short: 0x1c */
 110	RATE(60, 0x0b, 0),
 111	RATE(90, 0x0f, 0),
 112	RATE(120, 0x0a, 0),
 113	RATE(180, 0x0e, 0),
 114	RATE(240, 0x09, 0),
 115	RATE(360, 0x0d, 0),
 116	RATE(480, 0x08, 0),
 117	RATE(540, 0x0c, 0),
 118};
 119
 120#ifdef CONFIG_MAC80211_LEDS
 121static const struct ieee80211_tpt_blink ath9k_htc_tpt_blink[] = {
 122	{ .throughput = 0 * 1024, .blink_time = 334 },
 123	{ .throughput = 1 * 1024, .blink_time = 260 },
 124	{ .throughput = 5 * 1024, .blink_time = 220 },
 125	{ .throughput = 10 * 1024, .blink_time = 190 },
 126	{ .throughput = 20 * 1024, .blink_time = 170 },
 127	{ .throughput = 50 * 1024, .blink_time = 150 },
 128	{ .throughput = 70 * 1024, .blink_time = 130 },
 129	{ .throughput = 100 * 1024, .blink_time = 110 },
 130	{ .throughput = 200 * 1024, .blink_time = 80 },
 131	{ .throughput = 300 * 1024, .blink_time = 50 },
 132};
 133#endif
 134
 135static int ath9k_htc_wait_for_target(struct ath9k_htc_priv *priv)
 136{
 137	int time_left;
 138
 139	if (atomic_read(&priv->htc->tgt_ready) > 0) {
 140		atomic_dec(&priv->htc->tgt_ready);
 141		return 0;
 142	}
 143
 144	/* Firmware can take up to 50ms to get ready, to be safe use 1 second */
 145	time_left = wait_for_completion_timeout(&priv->htc->target_wait, HZ);
 146	if (!time_left) {
 147		dev_err(priv->dev, "ath9k_htc: Target is unresponsive\n");
 148		return -ETIMEDOUT;
 149	}
 150
 151	atomic_dec(&priv->htc->tgt_ready);
 152
 153	return 0;
 154}
 155
 156static void ath9k_deinit_priv(struct ath9k_htc_priv *priv)
 157{
 158	ath9k_hw_deinit(priv->ah);
 159	kfree(priv->ah);
 160	priv->ah = NULL;
 161}
 162
 163static void ath9k_deinit_device(struct ath9k_htc_priv *priv)
 164{
 165	struct ieee80211_hw *hw = priv->hw;
 166
 167	wiphy_rfkill_stop_polling(hw->wiphy);
 168	ath9k_deinit_leds(priv);
 169	ieee80211_unregister_hw(hw);
 170	ath9k_rx_cleanup(priv);
 171	ath9k_tx_cleanup(priv);
 172	ath9k_deinit_priv(priv);
 173}
 174
 175static inline int ath9k_htc_connect_svc(struct ath9k_htc_priv *priv,
 176					u16 service_id,
 177					void (*tx) (void *,
 178						    struct sk_buff *,
 179						    enum htc_endpoint_id,
 180						    bool txok),
 181					enum htc_endpoint_id *ep_id)
 182{
 183	struct htc_service_connreq req;
 184
 185	memset(&req, 0, sizeof(struct htc_service_connreq));
 186
 187	req.service_id = service_id;
 188	req.ep_callbacks.priv = priv;
 189	req.ep_callbacks.rx = ath9k_htc_rxep;
 190	req.ep_callbacks.tx = tx;
 191
 192	return htc_connect_service(priv->htc, &req, ep_id);
 193}
 194
 195static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid,
 196				   u32 drv_info)
 197{
 198	int ret;
 199
 200	/* WMI CMD*/
 201	ret = ath9k_wmi_connect(priv->htc, priv->wmi, &priv->wmi_cmd_ep);
 202	if (ret)
 203		goto err;
 204
 205	/* Beacon */
 206	ret = ath9k_htc_connect_svc(priv, WMI_BEACON_SVC, ath9k_htc_beaconep,
 207				    &priv->beacon_ep);
 208	if (ret)
 209		goto err;
 210
 211	/* CAB */
 212	ret = ath9k_htc_connect_svc(priv, WMI_CAB_SVC, ath9k_htc_txep,
 213				    &priv->cab_ep);
 214	if (ret)
 215		goto err;
 216
 217
 218	/* UAPSD */
 219	ret = ath9k_htc_connect_svc(priv, WMI_UAPSD_SVC, ath9k_htc_txep,
 220				    &priv->uapsd_ep);
 221	if (ret)
 222		goto err;
 223
 224	/* MGMT */
 225	ret = ath9k_htc_connect_svc(priv, WMI_MGMT_SVC, ath9k_htc_txep,
 226				    &priv->mgmt_ep);
 227	if (ret)
 228		goto err;
 229
 230	/* DATA BE */
 231	ret = ath9k_htc_connect_svc(priv, WMI_DATA_BE_SVC, ath9k_htc_txep,
 232				    &priv->data_be_ep);
 233	if (ret)
 234		goto err;
 235
 236	/* DATA BK */
 237	ret = ath9k_htc_connect_svc(priv, WMI_DATA_BK_SVC, ath9k_htc_txep,
 238				    &priv->data_bk_ep);
 239	if (ret)
 240		goto err;
 241
 242	/* DATA VI */
 243	ret = ath9k_htc_connect_svc(priv, WMI_DATA_VI_SVC, ath9k_htc_txep,
 244				    &priv->data_vi_ep);
 245	if (ret)
 246		goto err;
 247
 248	/* DATA VO */
 249	ret = ath9k_htc_connect_svc(priv, WMI_DATA_VO_SVC, ath9k_htc_txep,
 250				    &priv->data_vo_ep);
 251	if (ret)
 252		goto err;
 253
 254	/*
 255	 * Setup required credits before initializing HTC.
 256	 * This is a bit hacky, but, since queuing is done in
 257	 * the HIF layer, shouldn't matter much.
 258	 */
 259
 260	if (IS_AR7010_DEVICE(drv_info))
 261		priv->htc->credits = 45;
 262	else
 263		priv->htc->credits = 33;
 264
 265	ret = htc_init(priv->htc);
 266	if (ret)
 267		goto err;
 268
 269	dev_info(priv->dev, "ath9k_htc: HTC initialized with %d credits\n",
 270		 priv->htc->credits);
 271
 272	return 0;
 273
 274err:
 275	dev_err(priv->dev, "ath9k_htc: Unable to initialize HTC services\n");
 276	return ret;
 277}
 278
 279static int ath9k_reg_notifier(struct wiphy *wiphy,
 280			      struct regulatory_request *request)
 281{
 282	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
 283	struct ath9k_htc_priv *priv = hw->priv;
 284
 285	return ath_reg_notifier_apply(wiphy, request,
 286				      ath9k_hw_regulatory(priv->ah));
 287}
 288
 289static unsigned int ath9k_regread(void *hw_priv, u32 reg_offset)
 290{
 291	struct ath_hw *ah = (struct ath_hw *) hw_priv;
 292	struct ath_common *common = ath9k_hw_common(ah);
 293	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 294	__be32 val, reg = cpu_to_be32(reg_offset);
 295	int r;
 296
 297	r = ath9k_wmi_cmd(priv->wmi, WMI_REG_READ_CMDID,
 298			  (u8 *) &reg, sizeof(reg),
 299			  (u8 *) &val, sizeof(val),
 300			  100);
 301	if (unlikely(r)) {
 302		ath_dbg(common, ATH_DBG_WMI,
 303			"REGISTER READ FAILED: (0x%04x, %d)\n",
 304			reg_offset, r);
 305		return -EIO;
 306	}
 307
 308	return be32_to_cpu(val);
 309}
 310
 311static void ath9k_multi_regread(void *hw_priv, u32 *addr,
 312				u32 *val, u16 count)
 313{
 314	struct ath_hw *ah = (struct ath_hw *) hw_priv;
 315	struct ath_common *common = ath9k_hw_common(ah);
 316	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 317	__be32 tmpaddr[8];
 318	__be32 tmpval[8];
 319	int i, ret;
 320
 321       for (i = 0; i < count; i++) {
 322	       tmpaddr[i] = cpu_to_be32(addr[i]);
 323       }
 324
 325       ret = ath9k_wmi_cmd(priv->wmi, WMI_REG_READ_CMDID,
 326			   (u8 *)tmpaddr , sizeof(u32) * count,
 327			   (u8 *)tmpval, sizeof(u32) * count,
 328			   100);
 329	if (unlikely(ret)) {
 330		ath_dbg(common, ATH_DBG_WMI,
 331			"Multiple REGISTER READ FAILED (count: %d)\n", count);
 332	}
 333
 334       for (i = 0; i < count; i++) {
 335	       val[i] = be32_to_cpu(tmpval[i]);
 336       }
 337}
 338
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 339static void ath9k_regwrite_single(void *hw_priv, u32 val, u32 reg_offset)
 340{
 341	struct ath_hw *ah = (struct ath_hw *) hw_priv;
 342	struct ath_common *common = ath9k_hw_common(ah);
 343	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 344	const __be32 buf[2] = {
 345		cpu_to_be32(reg_offset),
 346		cpu_to_be32(val),
 347	};
 348	int r;
 349
 350	r = ath9k_wmi_cmd(priv->wmi, WMI_REG_WRITE_CMDID,
 351			  (u8 *) &buf, sizeof(buf),
 352			  (u8 *) &val, sizeof(val),
 353			  100);
 354	if (unlikely(r)) {
 355		ath_dbg(common, ATH_DBG_WMI,
 356			"REGISTER WRITE FAILED:(0x%04x, %d)\n",
 357			reg_offset, r);
 358	}
 359}
 360
 361static void ath9k_regwrite_buffer(void *hw_priv, u32 val, u32 reg_offset)
 362{
 363	struct ath_hw *ah = (struct ath_hw *) hw_priv;
 364	struct ath_common *common = ath9k_hw_common(ah);
 365	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 366	u32 rsp_status;
 367	int r;
 368
 369	mutex_lock(&priv->wmi->multi_write_mutex);
 370
 371	/* Store the register/value */
 372	priv->wmi->multi_write[priv->wmi->multi_write_idx].reg =
 373		cpu_to_be32(reg_offset);
 374	priv->wmi->multi_write[priv->wmi->multi_write_idx].val =
 375		cpu_to_be32(val);
 376
 377	priv->wmi->multi_write_idx++;
 378
 379	/* If the buffer is full, send it out. */
 380	if (priv->wmi->multi_write_idx == MAX_CMD_NUMBER) {
 381		r = ath9k_wmi_cmd(priv->wmi, WMI_REG_WRITE_CMDID,
 382			  (u8 *) &priv->wmi->multi_write,
 383			  sizeof(struct register_write) * priv->wmi->multi_write_idx,
 384			  (u8 *) &rsp_status, sizeof(rsp_status),
 385			  100);
 386		if (unlikely(r)) {
 387			ath_dbg(common, ATH_DBG_WMI,
 388				"REGISTER WRITE FAILED, multi len: %d\n",
 389				priv->wmi->multi_write_idx);
 390		}
 391		priv->wmi->multi_write_idx = 0;
 392	}
 393
 394	mutex_unlock(&priv->wmi->multi_write_mutex);
 395}
 396
 397static void ath9k_regwrite(void *hw_priv, u32 val, u32 reg_offset)
 398{
 399	struct ath_hw *ah = (struct ath_hw *) hw_priv;
 400	struct ath_common *common = ath9k_hw_common(ah);
 401	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 402
 403	if (atomic_read(&priv->wmi->mwrite_cnt))
 404		ath9k_regwrite_buffer(hw_priv, val, reg_offset);
 405	else
 406		ath9k_regwrite_single(hw_priv, val, reg_offset);
 407}
 408
 409static void ath9k_enable_regwrite_buffer(void *hw_priv)
 410{
 411	struct ath_hw *ah = (struct ath_hw *) hw_priv;
 412	struct ath_common *common = ath9k_hw_common(ah);
 413	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 414
 415	atomic_inc(&priv->wmi->mwrite_cnt);
 416}
 417
 418static void ath9k_regwrite_flush(void *hw_priv)
 419{
 420	struct ath_hw *ah = (struct ath_hw *) hw_priv;
 421	struct ath_common *common = ath9k_hw_common(ah);
 422	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 423	u32 rsp_status;
 424	int r;
 425
 426	atomic_dec(&priv->wmi->mwrite_cnt);
 427
 428	mutex_lock(&priv->wmi->multi_write_mutex);
 429
 430	if (priv->wmi->multi_write_idx) {
 431		r = ath9k_wmi_cmd(priv->wmi, WMI_REG_WRITE_CMDID,
 432			  (u8 *) &priv->wmi->multi_write,
 433			  sizeof(struct register_write) * priv->wmi->multi_write_idx,
 434			  (u8 *) &rsp_status, sizeof(rsp_status),
 435			  100);
 436		if (unlikely(r)) {
 437			ath_dbg(common, ATH_DBG_WMI,
 438				"REGISTER WRITE FAILED, multi len: %d\n",
 439				priv->wmi->multi_write_idx);
 440		}
 441		priv->wmi->multi_write_idx = 0;
 442	}
 443
 444	mutex_unlock(&priv->wmi->multi_write_mutex);
 445}
 446
 447static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
 448{
 449	u32 val;
 450
 451	val = ath9k_regread(hw_priv, reg_offset);
 452	val &= ~clr;
 453	val |= set;
 454	ath9k_regwrite(hw_priv, val, reg_offset);
 455	return val;
 456}
 457
 458static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
 459{
 460	*csz = L1_CACHE_BYTES >> 2;
 461}
 462
 463static bool ath_usb_eeprom_read(struct ath_common *common, u32 off, u16 *data)
 464{
 465	struct ath_hw *ah = (struct ath_hw *) common->ah;
 466
 467	(void)REG_READ(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
 468
 469	if (!ath9k_hw_wait(ah,
 470			   AR_EEPROM_STATUS_DATA,
 471			   AR_EEPROM_STATUS_DATA_BUSY |
 472			   AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0,
 473			   AH_WAIT_TIMEOUT))
 474		return false;
 475
 476	*data = MS(REG_READ(ah, AR_EEPROM_STATUS_DATA),
 477		   AR_EEPROM_STATUS_DATA_VAL);
 478
 479	return true;
 480}
 481
 482static const struct ath_bus_ops ath9k_usb_bus_ops = {
 483	.ath_bus_type = ATH_USB,
 484	.read_cachesize = ath_usb_read_cachesize,
 485	.eeprom_read = ath_usb_eeprom_read,
 486};
 487
 488static void setup_ht_cap(struct ath9k_htc_priv *priv,
 489			 struct ieee80211_sta_ht_cap *ht_info)
 490{
 491	struct ath_common *common = ath9k_hw_common(priv->ah);
 492	u8 tx_streams, rx_streams;
 493	int i;
 494
 495	ht_info->ht_supported = true;
 496	ht_info->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
 497		       IEEE80211_HT_CAP_SM_PS |
 498		       IEEE80211_HT_CAP_SGI_40 |
 499		       IEEE80211_HT_CAP_DSSSCCK40;
 500
 501	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_SGI_20)
 502		ht_info->cap |= IEEE80211_HT_CAP_SGI_20;
 503
 504	ht_info->cap |= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT);
 505
 506	ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
 507	ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
 508
 509	memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
 510
 511	/* ath9k_htc supports only 1 or 2 stream devices */
 512	tx_streams = ath9k_cmn_count_streams(common->tx_chainmask, 2);
 513	rx_streams = ath9k_cmn_count_streams(common->rx_chainmask, 2);
 514
 515	ath_dbg(common, ATH_DBG_CONFIG,
 516		"TX streams %d, RX streams: %d\n",
 517		tx_streams, rx_streams);
 518
 519	if (tx_streams != rx_streams) {
 520		ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
 521		ht_info->mcs.tx_params |= ((tx_streams - 1) <<
 522					   IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
 523	}
 524
 525	for (i = 0; i < rx_streams; i++)
 526		ht_info->mcs.rx_mask[i] = 0xff;
 527
 528	ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
 529}
 530
 531static int ath9k_init_queues(struct ath9k_htc_priv *priv)
 532{
 533	struct ath_common *common = ath9k_hw_common(priv->ah);
 534	int i;
 535
 536	for (i = 0; i < ARRAY_SIZE(priv->hwq_map); i++)
 537		priv->hwq_map[i] = -1;
 538
 539	priv->beaconq = ath9k_hw_beaconq_setup(priv->ah);
 540	if (priv->beaconq == -1) {
 541		ath_err(common, "Unable to setup BEACON xmit queue\n");
 542		goto err;
 543	}
 544
 545	priv->cabq = ath9k_htc_cabq_setup(priv);
 546	if (priv->cabq == -1) {
 547		ath_err(common, "Unable to setup CAB xmit queue\n");
 548		goto err;
 549	}
 550
 551	if (!ath9k_htc_txq_setup(priv, WME_AC_BE)) {
 552		ath_err(common, "Unable to setup xmit queue for BE traffic\n");
 553		goto err;
 554	}
 555
 556	if (!ath9k_htc_txq_setup(priv, WME_AC_BK)) {
 557		ath_err(common, "Unable to setup xmit queue for BK traffic\n");
 558		goto err;
 559	}
 560	if (!ath9k_htc_txq_setup(priv, WME_AC_VI)) {
 561		ath_err(common, "Unable to setup xmit queue for VI traffic\n");
 562		goto err;
 563	}
 564	if (!ath9k_htc_txq_setup(priv, WME_AC_VO)) {
 565		ath_err(common, "Unable to setup xmit queue for VO traffic\n");
 566		goto err;
 567	}
 568
 569	return 0;
 570
 571err:
 572	return -EINVAL;
 573}
 574
 575static void ath9k_init_crypto(struct ath9k_htc_priv *priv)
 576{
 577	struct ath_common *common = ath9k_hw_common(priv->ah);
 578	int i = 0;
 579
 580	/* Get the hardware key cache size. */
 581	common->keymax = AR_KEYTABLE_SIZE;
 582
 583	if (priv->ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA)
 584		common->crypt_caps |= ATH_CRYPT_CAP_MIC_COMBINED;
 585
 586	/*
 587	 * Reset the key cache since some parts do not
 588	 * reset the contents on initial power up.
 589	 */
 590	for (i = 0; i < common->keymax; i++)
 591		ath_hw_keyreset(common, (u16) i);
 592}
 593
 594static void ath9k_init_channels_rates(struct ath9k_htc_priv *priv)
 595{
 596	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ) {
 597		priv->sbands[IEEE80211_BAND_2GHZ].channels =
 598			ath9k_2ghz_channels;
 599		priv->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ;
 600		priv->sbands[IEEE80211_BAND_2GHZ].n_channels =
 601			ARRAY_SIZE(ath9k_2ghz_channels);
 602		priv->sbands[IEEE80211_BAND_2GHZ].bitrates = ath9k_legacy_rates;
 603		priv->sbands[IEEE80211_BAND_2GHZ].n_bitrates =
 604			ARRAY_SIZE(ath9k_legacy_rates);
 605	}
 606
 607	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ) {
 608		priv->sbands[IEEE80211_BAND_5GHZ].channels = ath9k_5ghz_channels;
 609		priv->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ;
 610		priv->sbands[IEEE80211_BAND_5GHZ].n_channels =
 611			ARRAY_SIZE(ath9k_5ghz_channels);
 612		priv->sbands[IEEE80211_BAND_5GHZ].bitrates =
 613			ath9k_legacy_rates + 4;
 614		priv->sbands[IEEE80211_BAND_5GHZ].n_bitrates =
 615			ARRAY_SIZE(ath9k_legacy_rates) - 4;
 616	}
 617}
 618
 619static void ath9k_init_misc(struct ath9k_htc_priv *priv)
 620{
 621	struct ath_common *common = ath9k_hw_common(priv->ah);
 622
 623	common->tx_chainmask = priv->ah->caps.tx_chainmask;
 624	common->rx_chainmask = priv->ah->caps.rx_chainmask;
 625
 626	memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
 627
 
 628	priv->ah->opmode = NL80211_IFTYPE_STATION;
 629}
 630
 631static void ath9k_init_btcoex(struct ath9k_htc_priv *priv)
 632{
 633	int qnum;
 634
 635	switch (priv->ah->btcoex_hw.scheme) {
 636	case ATH_BTCOEX_CFG_NONE:
 637		break;
 638	case ATH_BTCOEX_CFG_3WIRE:
 639		priv->ah->btcoex_hw.btactive_gpio = 7;
 640		priv->ah->btcoex_hw.btpriority_gpio = 6;
 641		priv->ah->btcoex_hw.wlanactive_gpio = 8;
 642		priv->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
 643		ath9k_hw_btcoex_init_3wire(priv->ah);
 644		ath_htc_init_btcoex_work(priv);
 645		qnum = priv->hwq_map[WME_AC_BE];
 646		ath9k_hw_init_btcoex_hw(priv->ah, qnum);
 647		break;
 648	default:
 649		WARN_ON(1);
 650		break;
 651	}
 652}
 653
 654static int ath9k_init_priv(struct ath9k_htc_priv *priv,
 655			   u16 devid, char *product,
 656			   u32 drv_info)
 657{
 658	struct ath_hw *ah = NULL;
 659	struct ath_common *common;
 660	int i, ret = 0, csz = 0;
 661
 662	priv->op_flags |= OP_INVALID;
 663
 664	ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
 665	if (!ah)
 666		return -ENOMEM;
 667
 
 668	ah->hw_version.devid = devid;
 669	ah->hw_version.subsysid = 0; /* FIXME */
 670	ah->hw_version.usbdev = drv_info;
 671	ah->ah_flags |= AH_USE_EEPROM;
 672	ah->reg_ops.read = ath9k_regread;
 673	ah->reg_ops.multi_read = ath9k_multi_regread;
 674	ah->reg_ops.write = ath9k_regwrite;
 675	ah->reg_ops.enable_write_buffer = ath9k_enable_regwrite_buffer;
 676	ah->reg_ops.write_flush = ath9k_regwrite_flush;
 677	ah->reg_ops.rmw = ath9k_reg_rmw;
 678	priv->ah = ah;
 679
 680	common = ath9k_hw_common(ah);
 681	common->ops = &ah->reg_ops;
 682	common->bus_ops = &ath9k_usb_bus_ops;
 683	common->ah = ah;
 684	common->hw = priv->hw;
 685	common->priv = priv;
 686	common->debug_mask = ath9k_debug;
 
 
 687
 688	spin_lock_init(&priv->beacon_lock);
 689	spin_lock_init(&priv->tx.tx_lock);
 690	mutex_init(&priv->mutex);
 691	mutex_init(&priv->htc_pm_lock);
 692	tasklet_init(&priv->rx_tasklet, ath9k_rx_tasklet,
 693		     (unsigned long)priv);
 694	tasklet_init(&priv->tx_failed_tasklet, ath9k_tx_failed_tasklet,
 695		     (unsigned long)priv);
 696	INIT_DELAYED_WORK(&priv->ani_work, ath9k_htc_ani_work);
 697	INIT_WORK(&priv->ps_work, ath9k_ps_work);
 698	INIT_WORK(&priv->fatal_work, ath9k_fatal_work);
 699	setup_timer(&priv->tx.cleanup_timer, ath9k_htc_tx_cleanup_timer,
 700		    (unsigned long)priv);
 701
 702	/*
 703	 * Cache line size is used to size and align various
 704	 * structures used to communicate with the hardware.
 705	 */
 706	ath_read_cachesize(common, &csz);
 707	common->cachelsz = csz << 2; /* convert to bytes */
 708
 709	ret = ath9k_hw_init(ah);
 710	if (ret) {
 711		ath_err(common,
 712			"Unable to initialize hardware; initialization status: %d\n",
 713			ret);
 714		goto err_hw;
 715	}
 716
 717	ret = ath9k_init_queues(priv);
 718	if (ret)
 719		goto err_queues;
 720
 721	for (i = 0; i < ATH9K_HTC_MAX_BCN_VIF; i++)
 722		priv->cur_beacon_conf.bslot[i] = NULL;
 
 723
 724	ath9k_init_crypto(priv);
 725	ath9k_init_channels_rates(priv);
 726	ath9k_init_misc(priv);
 727
 728	if (product && strncmp(product, ATH_HTC_BTCOEX_PRODUCT_ID, 5) == 0) {
 729		ah->btcoex_hw.scheme = ATH_BTCOEX_CFG_3WIRE;
 730		ath9k_init_btcoex(priv);
 731	}
 732
 733	return 0;
 734
 735err_queues:
 736	ath9k_hw_deinit(ah);
 737err_hw:
 738
 739	kfree(ah);
 740	priv->ah = NULL;
 741
 742	return ret;
 743}
 744
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 745static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
 746			       struct ieee80211_hw *hw)
 747{
 
 748	struct ath_common *common = ath9k_hw_common(priv->ah);
 
 749
 750	hw->flags = IEEE80211_HW_SIGNAL_DBM |
 751		IEEE80211_HW_AMPDU_AGGREGATION |
 752		IEEE80211_HW_SPECTRUM_MGMT |
 753		IEEE80211_HW_HAS_RATE_CONTROL |
 754		IEEE80211_HW_RX_INCLUDES_FCS |
 755		IEEE80211_HW_SUPPORTS_PS |
 756		IEEE80211_HW_PS_NULLFUNC_STACK |
 757		IEEE80211_HW_REPORTS_TX_ACK_STATUS |
 
 758		IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
 759
 
 
 
 760	hw->wiphy->interface_modes =
 761		BIT(NL80211_IFTYPE_STATION) |
 762		BIT(NL80211_IFTYPE_ADHOC) |
 763		BIT(NL80211_IFTYPE_AP) |
 764		BIT(NL80211_IFTYPE_P2P_GO) |
 765		BIT(NL80211_IFTYPE_P2P_CLIENT);
 
 
 
 
 766
 767	hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
 768
 
 
 
 769	hw->queues = 4;
 770	hw->channel_change_time = 5000;
 771	hw->max_listen_interval = 10;
 772
 773	hw->vif_data_size = sizeof(struct ath9k_htc_vif);
 774	hw->sta_data_size = sizeof(struct ath9k_htc_sta);
 775
 776	/* tx_frame_hdr is larger than tx_mgmt_hdr anyway */
 777	hw->extra_tx_headroom = sizeof(struct tx_frame_hdr) +
 778		sizeof(struct htc_frame_hdr) + 4;
 779
 780	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
 781		hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
 782			&priv->sbands[IEEE80211_BAND_2GHZ];
 783	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
 784		hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
 785			&priv->sbands[IEEE80211_BAND_5GHZ];
 786
 787	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
 788		if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
 789			setup_ht_cap(priv,
 790				     &priv->sbands[IEEE80211_BAND_2GHZ].ht_cap);
 791		if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
 792			setup_ht_cap(priv,
 793				     &priv->sbands[IEEE80211_BAND_5GHZ].ht_cap);
 794	}
 795
 796	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
 797}
 798
 799static int ath9k_init_firmware_version(struct ath9k_htc_priv *priv)
 800{
 801	struct ieee80211_hw *hw = priv->hw;
 802	struct wmi_fw_version cmd_rsp;
 803	int ret;
 804
 805	memset(&cmd_rsp, 0, sizeof(cmd_rsp));
 806
 807	WMI_CMD(WMI_GET_FW_VERSION);
 808	if (ret)
 809		return -EINVAL;
 810
 811	priv->fw_version_major = be16_to_cpu(cmd_rsp.major);
 812	priv->fw_version_minor = be16_to_cpu(cmd_rsp.minor);
 813
 814	snprintf(hw->wiphy->fw_version, ETHTOOL_BUSINFO_LEN, "%d.%d",
 815		 priv->fw_version_major,
 816		 priv->fw_version_minor);
 817
 818	dev_info(priv->dev, "ath9k_htc: FW Version: %d.%d\n",
 819		 priv->fw_version_major,
 820		 priv->fw_version_minor);
 821
 822	/*
 823	 * Check if the available FW matches the driver's
 824	 * required version.
 825	 */
 826	if (priv->fw_version_major != MAJOR_VERSION_REQ ||
 827	    priv->fw_version_minor != MINOR_VERSION_REQ) {
 828		dev_err(priv->dev, "ath9k_htc: Please upgrade to FW version %d.%d\n",
 829			MAJOR_VERSION_REQ, MINOR_VERSION_REQ);
 830		return -EINVAL;
 831	}
 832
 833	return 0;
 834}
 835
 836static int ath9k_init_device(struct ath9k_htc_priv *priv,
 837			     u16 devid, char *product, u32 drv_info)
 838{
 839	struct ieee80211_hw *hw = priv->hw;
 840	struct ath_common *common;
 841	struct ath_hw *ah;
 842	int error = 0;
 843	struct ath_regulatory *reg;
 844	char hw_name[64];
 845
 846	/* Bring up device */
 847	error = ath9k_init_priv(priv, devid, product, drv_info);
 848	if (error != 0)
 849		goto err_init;
 850
 851	ah = priv->ah;
 852	common = ath9k_hw_common(ah);
 853	ath9k_set_hw_capab(priv, hw);
 854
 855	error = ath9k_init_firmware_version(priv);
 856	if (error != 0)
 857		goto err_fw;
 858
 859	/* Initialize regulatory */
 860	error = ath_regd_init(&common->regulatory, priv->hw->wiphy,
 861			      ath9k_reg_notifier);
 862	if (error)
 863		goto err_regd;
 864
 865	reg = &common->regulatory;
 866
 867	/* Setup TX */
 868	error = ath9k_tx_init(priv);
 869	if (error != 0)
 870		goto err_tx;
 871
 872	/* Setup RX */
 873	error = ath9k_rx_init(priv);
 874	if (error != 0)
 875		goto err_rx;
 876
 
 877#ifdef CONFIG_MAC80211_LEDS
 878	/* must be initialized before ieee80211_register_hw */
 879	priv->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(priv->hw,
 880		IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_htc_tpt_blink,
 881		ARRAY_SIZE(ath9k_htc_tpt_blink));
 882#endif
 883
 884	/* Register with mac80211 */
 885	error = ieee80211_register_hw(hw);
 886	if (error)
 887		goto err_register;
 888
 889	/* Handle world regulatory */
 890	if (!ath_is_world_regd(reg)) {
 891		error = regulatory_hint(hw->wiphy, reg->alpha2);
 892		if (error)
 893			goto err_world;
 894	}
 895
 896	error = ath9k_htc_init_debug(priv->ah);
 897	if (error) {
 898		ath_err(common, "Unable to create debugfs files\n");
 899		goto err_world;
 900	}
 901
 902	ath_dbg(common, ATH_DBG_CONFIG,
 903		"WMI:%d, BCN:%d, CAB:%d, UAPSD:%d, MGMT:%d, "
 904		"BE:%d, BK:%d, VI:%d, VO:%d\n",
 905		priv->wmi_cmd_ep,
 906		priv->beacon_ep,
 907		priv->cab_ep,
 908		priv->uapsd_ep,
 909		priv->mgmt_ep,
 910		priv->data_be_ep,
 911		priv->data_bk_ep,
 912		priv->data_vi_ep,
 913		priv->data_vo_ep);
 914
 915	ath9k_hw_name(priv->ah, hw_name, sizeof(hw_name));
 916	wiphy_info(hw->wiphy, "%s\n", hw_name);
 917
 918	ath9k_init_leds(priv);
 919	ath9k_start_rfkill_poll(priv);
 920
 921	return 0;
 922
 923err_world:
 924	ieee80211_unregister_hw(hw);
 925err_register:
 926	ath9k_rx_cleanup(priv);
 927err_rx:
 928	ath9k_tx_cleanup(priv);
 929err_tx:
 930	/* Nothing */
 931err_regd:
 932	/* Nothing */
 933err_fw:
 934	ath9k_deinit_priv(priv);
 935err_init:
 936	return error;
 937}
 938
 939int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
 940			   u16 devid, char *product, u32 drv_info)
 941{
 942	struct ieee80211_hw *hw;
 943	struct ath9k_htc_priv *priv;
 944	int ret;
 945
 946	hw = ieee80211_alloc_hw(sizeof(struct ath9k_htc_priv), &ath9k_htc_ops);
 947	if (!hw)
 948		return -ENOMEM;
 949
 950	priv = hw->priv;
 951	priv->hw = hw;
 952	priv->htc = htc_handle;
 953	priv->dev = dev;
 954	htc_handle->drv_priv = priv;
 955	SET_IEEE80211_DEV(hw, priv->dev);
 956
 957	ret = ath9k_htc_wait_for_target(priv);
 958	if (ret)
 959		goto err_free;
 960
 961	priv->wmi = ath9k_init_wmi(priv);
 962	if (!priv->wmi) {
 963		ret = -EINVAL;
 964		goto err_free;
 965	}
 966
 967	ret = ath9k_init_htc_services(priv, devid, drv_info);
 968	if (ret)
 969		goto err_init;
 970
 971	ret = ath9k_init_device(priv, devid, product, drv_info);
 972	if (ret)
 973		goto err_init;
 974
 975	return 0;
 976
 977err_init:
 978	ath9k_deinit_wmi(priv);
 979err_free:
 980	ieee80211_free_hw(hw);
 981	return ret;
 982}
 983
 984void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
 985{
 986	if (htc_handle->drv_priv) {
 987
 988		/* Check if the device has been yanked out. */
 989		if (hotunplug)
 990			htc_handle->drv_priv->ah->ah_flags |= AH_UNPLUGGED;
 991
 992		ath9k_deinit_device(htc_handle->drv_priv);
 993		ath9k_deinit_wmi(htc_handle->drv_priv);
 994		ieee80211_free_hw(htc_handle->drv_priv->hw);
 995	}
 996}
 997
 998#ifdef CONFIG_PM
 999
1000void ath9k_htc_suspend(struct htc_target *htc_handle)
1001{
1002	ath9k_htc_setpower(htc_handle->drv_priv, ATH9K_PM_FULL_SLEEP);
1003}
1004
1005int ath9k_htc_resume(struct htc_target *htc_handle)
1006{
1007	struct ath9k_htc_priv *priv = htc_handle->drv_priv;
1008	int ret;
1009
1010	ret = ath9k_htc_wait_for_target(priv);
1011	if (ret)
1012		return ret;
1013
1014	ret = ath9k_init_htc_services(priv, priv->ah->hw_version.devid,
1015				      priv->ah->hw_version.usbdev);
 
 
1016	return ret;
1017}
1018#endif
1019
1020static int __init ath9k_htc_init(void)
1021{
1022	if (ath9k_hif_usb_init() < 0) {
1023		printk(KERN_ERR
1024			"ath9k_htc: No USB devices found,"
1025			" driver not installed.\n");
1026		return -ENODEV;
1027	}
1028
1029	return 0;
1030}
1031module_init(ath9k_htc_init);
1032
1033static void __exit ath9k_htc_exit(void)
1034{
1035	ath9k_hif_usb_exit();
1036	printk(KERN_INFO "ath9k_htc: Driver unloaded\n");
1037}
1038module_exit(ath9k_htc_exit);
v3.15
  1/*
  2 * Copyright (c) 2010-2011 Atheros Communications Inc.
  3 *
  4 * Permission to use, copy, modify, and/or distribute this software for any
  5 * purpose with or without fee is hereby granted, provided that the above
  6 * copyright notice and this permission notice appear in all copies.
  7 *
  8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 15 */
 16
 17#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 18
 19#include "htc.h"
 20
 21MODULE_AUTHOR("Atheros Communications");
 22MODULE_LICENSE("Dual BSD/GPL");
 23MODULE_DESCRIPTION("Atheros driver 802.11n HTC based wireless devices");
 24
 25static unsigned int ath9k_debug = ATH_DBG_DEFAULT;
 26module_param_named(debug, ath9k_debug, uint, 0);
 27MODULE_PARM_DESC(debug, "Debugging mask");
 28
 29int htc_modparam_nohwcrypt;
 30module_param_named(nohwcrypt, htc_modparam_nohwcrypt, int, 0444);
 31MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
 32
 33static int ath9k_htc_btcoex_enable;
 34module_param_named(btcoex_enable, ath9k_htc_btcoex_enable, int, 0444);
 35MODULE_PARM_DESC(btcoex_enable, "Enable wifi-BT coexistence");
 36
 37static int ath9k_ps_enable;
 38module_param_named(ps_enable, ath9k_ps_enable, int, 0444);
 39MODULE_PARM_DESC(ps_enable, "Enable WLAN PowerSave");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 40
 41#ifdef CONFIG_MAC80211_LEDS
 42static const struct ieee80211_tpt_blink ath9k_htc_tpt_blink[] = {
 43	{ .throughput = 0 * 1024, .blink_time = 334 },
 44	{ .throughput = 1 * 1024, .blink_time = 260 },
 45	{ .throughput = 5 * 1024, .blink_time = 220 },
 46	{ .throughput = 10 * 1024, .blink_time = 190 },
 47	{ .throughput = 20 * 1024, .blink_time = 170 },
 48	{ .throughput = 50 * 1024, .blink_time = 150 },
 49	{ .throughput = 70 * 1024, .blink_time = 130 },
 50	{ .throughput = 100 * 1024, .blink_time = 110 },
 51	{ .throughput = 200 * 1024, .blink_time = 80 },
 52	{ .throughput = 300 * 1024, .blink_time = 50 },
 53};
 54#endif
 55
 56static int ath9k_htc_wait_for_target(struct ath9k_htc_priv *priv)
 57{
 58	int time_left;
 59
 60	if (atomic_read(&priv->htc->tgt_ready) > 0) {
 61		atomic_dec(&priv->htc->tgt_ready);
 62		return 0;
 63	}
 64
 65	/* Firmware can take up to 50ms to get ready, to be safe use 1 second */
 66	time_left = wait_for_completion_timeout(&priv->htc->target_wait, HZ);
 67	if (!time_left) {
 68		dev_err(priv->dev, "ath9k_htc: Target is unresponsive\n");
 69		return -ETIMEDOUT;
 70	}
 71
 72	atomic_dec(&priv->htc->tgt_ready);
 73
 74	return 0;
 75}
 76
 77static void ath9k_deinit_priv(struct ath9k_htc_priv *priv)
 78{
 79	ath9k_hw_deinit(priv->ah);
 80	kfree(priv->ah);
 81	priv->ah = NULL;
 82}
 83
 84static void ath9k_deinit_device(struct ath9k_htc_priv *priv)
 85{
 86	struct ieee80211_hw *hw = priv->hw;
 87
 88	wiphy_rfkill_stop_polling(hw->wiphy);
 89	ath9k_deinit_leds(priv);
 90	ieee80211_unregister_hw(hw);
 91	ath9k_rx_cleanup(priv);
 92	ath9k_tx_cleanup(priv);
 93	ath9k_deinit_priv(priv);
 94}
 95
 96static inline int ath9k_htc_connect_svc(struct ath9k_htc_priv *priv,
 97					u16 service_id,
 98					void (*tx) (void *,
 99						    struct sk_buff *,
100						    enum htc_endpoint_id,
101						    bool txok),
102					enum htc_endpoint_id *ep_id)
103{
104	struct htc_service_connreq req;
105
106	memset(&req, 0, sizeof(struct htc_service_connreq));
107
108	req.service_id = service_id;
109	req.ep_callbacks.priv = priv;
110	req.ep_callbacks.rx = ath9k_htc_rxep;
111	req.ep_callbacks.tx = tx;
112
113	return htc_connect_service(priv->htc, &req, ep_id);
114}
115
116static int ath9k_init_htc_services(struct ath9k_htc_priv *priv, u16 devid,
117				   u32 drv_info)
118{
119	int ret;
120
121	/* WMI CMD*/
122	ret = ath9k_wmi_connect(priv->htc, priv->wmi, &priv->wmi_cmd_ep);
123	if (ret)
124		goto err;
125
126	/* Beacon */
127	ret = ath9k_htc_connect_svc(priv, WMI_BEACON_SVC, ath9k_htc_beaconep,
128				    &priv->beacon_ep);
129	if (ret)
130		goto err;
131
132	/* CAB */
133	ret = ath9k_htc_connect_svc(priv, WMI_CAB_SVC, ath9k_htc_txep,
134				    &priv->cab_ep);
135	if (ret)
136		goto err;
137
138
139	/* UAPSD */
140	ret = ath9k_htc_connect_svc(priv, WMI_UAPSD_SVC, ath9k_htc_txep,
141				    &priv->uapsd_ep);
142	if (ret)
143		goto err;
144
145	/* MGMT */
146	ret = ath9k_htc_connect_svc(priv, WMI_MGMT_SVC, ath9k_htc_txep,
147				    &priv->mgmt_ep);
148	if (ret)
149		goto err;
150
151	/* DATA BE */
152	ret = ath9k_htc_connect_svc(priv, WMI_DATA_BE_SVC, ath9k_htc_txep,
153				    &priv->data_be_ep);
154	if (ret)
155		goto err;
156
157	/* DATA BK */
158	ret = ath9k_htc_connect_svc(priv, WMI_DATA_BK_SVC, ath9k_htc_txep,
159				    &priv->data_bk_ep);
160	if (ret)
161		goto err;
162
163	/* DATA VI */
164	ret = ath9k_htc_connect_svc(priv, WMI_DATA_VI_SVC, ath9k_htc_txep,
165				    &priv->data_vi_ep);
166	if (ret)
167		goto err;
168
169	/* DATA VO */
170	ret = ath9k_htc_connect_svc(priv, WMI_DATA_VO_SVC, ath9k_htc_txep,
171				    &priv->data_vo_ep);
172	if (ret)
173		goto err;
174
175	/*
176	 * Setup required credits before initializing HTC.
177	 * This is a bit hacky, but, since queuing is done in
178	 * the HIF layer, shouldn't matter much.
179	 */
180
181	if (IS_AR7010_DEVICE(drv_info))
182		priv->htc->credits = 45;
183	else
184		priv->htc->credits = 33;
185
186	ret = htc_init(priv->htc);
187	if (ret)
188		goto err;
189
190	dev_info(priv->dev, "ath9k_htc: HTC initialized with %d credits\n",
191		 priv->htc->credits);
192
193	return 0;
194
195err:
196	dev_err(priv->dev, "ath9k_htc: Unable to initialize HTC services\n");
197	return ret;
198}
199
200static void ath9k_reg_notifier(struct wiphy *wiphy,
201			       struct regulatory_request *request)
202{
203	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
204	struct ath9k_htc_priv *priv = hw->priv;
205
206	ath_reg_notifier_apply(wiphy, request,
207			       ath9k_hw_regulatory(priv->ah));
208}
209
210static unsigned int ath9k_regread(void *hw_priv, u32 reg_offset)
211{
212	struct ath_hw *ah = (struct ath_hw *) hw_priv;
213	struct ath_common *common = ath9k_hw_common(ah);
214	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
215	__be32 val, reg = cpu_to_be32(reg_offset);
216	int r;
217
218	r = ath9k_wmi_cmd(priv->wmi, WMI_REG_READ_CMDID,
219			  (u8 *) &reg, sizeof(reg),
220			  (u8 *) &val, sizeof(val),
221			  100);
222	if (unlikely(r)) {
223		ath_dbg(common, WMI, "REGISTER READ FAILED: (0x%04x, %d)\n",
 
224			reg_offset, r);
225		return -EIO;
226	}
227
228	return be32_to_cpu(val);
229}
230
231static void ath9k_multi_regread(void *hw_priv, u32 *addr,
232				u32 *val, u16 count)
233{
234	struct ath_hw *ah = (struct ath_hw *) hw_priv;
235	struct ath_common *common = ath9k_hw_common(ah);
236	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
237	__be32 tmpaddr[8];
238	__be32 tmpval[8];
239	int i, ret;
240
241       for (i = 0; i < count; i++) {
242	       tmpaddr[i] = cpu_to_be32(addr[i]);
243       }
244
245       ret = ath9k_wmi_cmd(priv->wmi, WMI_REG_READ_CMDID,
246			   (u8 *)tmpaddr , sizeof(u32) * count,
247			   (u8 *)tmpval, sizeof(u32) * count,
248			   100);
249	if (unlikely(ret)) {
250		ath_dbg(common, WMI,
251			"Multiple REGISTER READ FAILED (count: %d)\n", count);
252	}
253
254       for (i = 0; i < count; i++) {
255	       val[i] = be32_to_cpu(tmpval[i]);
256       }
257}
258
259static void ath9k_regwrite_multi(struct ath_common *common)
260{
261	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
262	u32 rsp_status;
263	int r;
264
265	r = ath9k_wmi_cmd(priv->wmi, WMI_REG_WRITE_CMDID,
266			  (u8 *) &priv->wmi->multi_write,
267			  sizeof(struct register_write) * priv->wmi->multi_write_idx,
268			  (u8 *) &rsp_status, sizeof(rsp_status),
269			  100);
270	if (unlikely(r)) {
271		ath_dbg(common, WMI,
272			"REGISTER WRITE FAILED, multi len: %d\n",
273			priv->wmi->multi_write_idx);
274	}
275	priv->wmi->multi_write_idx = 0;
276}
277
278static void ath9k_regwrite_single(void *hw_priv, u32 val, u32 reg_offset)
279{
280	struct ath_hw *ah = (struct ath_hw *) hw_priv;
281	struct ath_common *common = ath9k_hw_common(ah);
282	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
283	const __be32 buf[2] = {
284		cpu_to_be32(reg_offset),
285		cpu_to_be32(val),
286	};
287	int r;
288
289	r = ath9k_wmi_cmd(priv->wmi, WMI_REG_WRITE_CMDID,
290			  (u8 *) &buf, sizeof(buf),
291			  (u8 *) &val, sizeof(val),
292			  100);
293	if (unlikely(r)) {
294		ath_dbg(common, WMI, "REGISTER WRITE FAILED:(0x%04x, %d)\n",
 
295			reg_offset, r);
296	}
297}
298
299static void ath9k_regwrite_buffer(void *hw_priv, u32 val, u32 reg_offset)
300{
301	struct ath_hw *ah = (struct ath_hw *) hw_priv;
302	struct ath_common *common = ath9k_hw_common(ah);
303	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 
 
304
305	mutex_lock(&priv->wmi->multi_write_mutex);
306
307	/* Store the register/value */
308	priv->wmi->multi_write[priv->wmi->multi_write_idx].reg =
309		cpu_to_be32(reg_offset);
310	priv->wmi->multi_write[priv->wmi->multi_write_idx].val =
311		cpu_to_be32(val);
312
313	priv->wmi->multi_write_idx++;
314
315	/* If the buffer is full, send it out. */
316	if (priv->wmi->multi_write_idx == MAX_CMD_NUMBER)
317		ath9k_regwrite_multi(common);
 
 
 
 
 
 
 
 
 
 
 
318
319	mutex_unlock(&priv->wmi->multi_write_mutex);
320}
321
322static void ath9k_regwrite(void *hw_priv, u32 val, u32 reg_offset)
323{
324	struct ath_hw *ah = (struct ath_hw *) hw_priv;
325	struct ath_common *common = ath9k_hw_common(ah);
326	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
327
328	if (atomic_read(&priv->wmi->mwrite_cnt))
329		ath9k_regwrite_buffer(hw_priv, val, reg_offset);
330	else
331		ath9k_regwrite_single(hw_priv, val, reg_offset);
332}
333
334static void ath9k_enable_regwrite_buffer(void *hw_priv)
335{
336	struct ath_hw *ah = (struct ath_hw *) hw_priv;
337	struct ath_common *common = ath9k_hw_common(ah);
338	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
339
340	atomic_inc(&priv->wmi->mwrite_cnt);
341}
342
343static void ath9k_regwrite_flush(void *hw_priv)
344{
345	struct ath_hw *ah = (struct ath_hw *) hw_priv;
346	struct ath_common *common = ath9k_hw_common(ah);
347	struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
 
 
348
349	atomic_dec(&priv->wmi->mwrite_cnt);
350
351	mutex_lock(&priv->wmi->multi_write_mutex);
352
353	if (priv->wmi->multi_write_idx)
354		ath9k_regwrite_multi(common);
 
 
 
 
 
 
 
 
 
 
 
355
356	mutex_unlock(&priv->wmi->multi_write_mutex);
357}
358
359static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
360{
361	u32 val;
362
363	val = ath9k_regread(hw_priv, reg_offset);
364	val &= ~clr;
365	val |= set;
366	ath9k_regwrite(hw_priv, val, reg_offset);
367	return val;
368}
369
370static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
371{
372	*csz = L1_CACHE_BYTES >> 2;
373}
374
375static bool ath_usb_eeprom_read(struct ath_common *common, u32 off, u16 *data)
376{
377	struct ath_hw *ah = (struct ath_hw *) common->ah;
378
379	(void)REG_READ(ah, AR5416_EEPROM_OFFSET + (off << AR5416_EEPROM_S));
380
381	if (!ath9k_hw_wait(ah,
382			   AR_EEPROM_STATUS_DATA,
383			   AR_EEPROM_STATUS_DATA_BUSY |
384			   AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0,
385			   AH_WAIT_TIMEOUT))
386		return false;
387
388	*data = MS(REG_READ(ah, AR_EEPROM_STATUS_DATA),
389		   AR_EEPROM_STATUS_DATA_VAL);
390
391	return true;
392}
393
394static const struct ath_bus_ops ath9k_usb_bus_ops = {
395	.ath_bus_type = ATH_USB,
396	.read_cachesize = ath_usb_read_cachesize,
397	.eeprom_read = ath_usb_eeprom_read,
398};
399
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
400static int ath9k_init_queues(struct ath9k_htc_priv *priv)
401{
402	struct ath_common *common = ath9k_hw_common(priv->ah);
403	int i;
404
405	for (i = 0; i < ARRAY_SIZE(priv->hwq_map); i++)
406		priv->hwq_map[i] = -1;
407
408	priv->beacon.beaconq = ath9k_hw_beaconq_setup(priv->ah);
409	if (priv->beacon.beaconq == -1) {
410		ath_err(common, "Unable to setup BEACON xmit queue\n");
411		goto err;
412	}
413
414	priv->cabq = ath9k_htc_cabq_setup(priv);
415	if (priv->cabq == -1) {
416		ath_err(common, "Unable to setup CAB xmit queue\n");
417		goto err;
418	}
419
420	if (!ath9k_htc_txq_setup(priv, IEEE80211_AC_BE)) {
421		ath_err(common, "Unable to setup xmit queue for BE traffic\n");
422		goto err;
423	}
424
425	if (!ath9k_htc_txq_setup(priv, IEEE80211_AC_BK)) {
426		ath_err(common, "Unable to setup xmit queue for BK traffic\n");
427		goto err;
428	}
429	if (!ath9k_htc_txq_setup(priv, IEEE80211_AC_VI)) {
430		ath_err(common, "Unable to setup xmit queue for VI traffic\n");
431		goto err;
432	}
433	if (!ath9k_htc_txq_setup(priv, IEEE80211_AC_VO)) {
434		ath_err(common, "Unable to setup xmit queue for VO traffic\n");
435		goto err;
436	}
437
438	return 0;
439
440err:
441	return -EINVAL;
442}
443
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
444static void ath9k_init_misc(struct ath9k_htc_priv *priv)
445{
446	struct ath_common *common = ath9k_hw_common(priv->ah);
447
 
 
 
448	memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
449
450	common->last_rssi = ATH_RSSI_DUMMY_MARKER;
451	priv->ah->opmode = NL80211_IFTYPE_STATION;
452}
453
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
454static int ath9k_init_priv(struct ath9k_htc_priv *priv,
455			   u16 devid, char *product,
456			   u32 drv_info)
457{
458	struct ath_hw *ah = NULL;
459	struct ath_common *common;
460	int i, ret = 0, csz = 0;
461
 
 
462	ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
463	if (!ah)
464		return -ENOMEM;
465
466	ah->dev = priv->dev;
467	ah->hw_version.devid = devid;
 
468	ah->hw_version.usbdev = drv_info;
469	ah->ah_flags |= AH_USE_EEPROM;
470	ah->reg_ops.read = ath9k_regread;
471	ah->reg_ops.multi_read = ath9k_multi_regread;
472	ah->reg_ops.write = ath9k_regwrite;
473	ah->reg_ops.enable_write_buffer = ath9k_enable_regwrite_buffer;
474	ah->reg_ops.write_flush = ath9k_regwrite_flush;
475	ah->reg_ops.rmw = ath9k_reg_rmw;
476	priv->ah = ah;
477
478	common = ath9k_hw_common(ah);
479	common->ops = &ah->reg_ops;
480	common->bus_ops = &ath9k_usb_bus_ops;
481	common->ah = ah;
482	common->hw = priv->hw;
483	common->priv = priv;
484	common->debug_mask = ath9k_debug;
485	common->btcoex_enabled = ath9k_htc_btcoex_enable == 1;
486	set_bit(ATH_OP_INVALID, &common->op_flags);
487
488	spin_lock_init(&priv->beacon_lock);
489	spin_lock_init(&priv->tx.tx_lock);
490	mutex_init(&priv->mutex);
491	mutex_init(&priv->htc_pm_lock);
492	tasklet_init(&priv->rx_tasklet, ath9k_rx_tasklet,
493		     (unsigned long)priv);
494	tasklet_init(&priv->tx_failed_tasklet, ath9k_tx_failed_tasklet,
495		     (unsigned long)priv);
496	INIT_DELAYED_WORK(&priv->ani_work, ath9k_htc_ani_work);
497	INIT_WORK(&priv->ps_work, ath9k_ps_work);
498	INIT_WORK(&priv->fatal_work, ath9k_fatal_work);
499	setup_timer(&priv->tx.cleanup_timer, ath9k_htc_tx_cleanup_timer,
500		    (unsigned long)priv);
501
502	/*
503	 * Cache line size is used to size and align various
504	 * structures used to communicate with the hardware.
505	 */
506	ath_read_cachesize(common, &csz);
507	common->cachelsz = csz << 2; /* convert to bytes */
508
509	ret = ath9k_hw_init(ah);
510	if (ret) {
511		ath_err(common,
512			"Unable to initialize hardware; initialization status: %d\n",
513			ret);
514		goto err_hw;
515	}
516
517	ret = ath9k_init_queues(priv);
518	if (ret)
519		goto err_queues;
520
521	for (i = 0; i < ATH9K_HTC_MAX_BCN_VIF; i++)
522		priv->beacon.bslot[i] = NULL;
523	priv->beacon.slottime = ATH9K_SLOT_TIME_9;
524
525	ath9k_cmn_init_channels_rates(common);
526	ath9k_cmn_init_crypto(ah);
527	ath9k_init_misc(priv);
528	ath9k_htc_init_btcoex(priv, product);
 
 
 
 
529
530	return 0;
531
532err_queues:
533	ath9k_hw_deinit(ah);
534err_hw:
535
536	kfree(ah);
537	priv->ah = NULL;
538
539	return ret;
540}
541
542static const struct ieee80211_iface_limit if_limits[] = {
543	{ .max = 2,	.types = BIT(NL80211_IFTYPE_STATION) |
544				 BIT(NL80211_IFTYPE_P2P_CLIENT) },
545	{ .max = 2,	.types = BIT(NL80211_IFTYPE_AP) |
546#ifdef CONFIG_MAC80211_MESH
547				 BIT(NL80211_IFTYPE_MESH_POINT) |
548#endif
549				 BIT(NL80211_IFTYPE_P2P_GO) },
550};
551
552static const struct ieee80211_iface_combination if_comb = {
553	.limits = if_limits,
554	.n_limits = ARRAY_SIZE(if_limits),
555	.max_interfaces = 2,
556	.num_different_channels = 1,
557};
558
559static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
560			       struct ieee80211_hw *hw)
561{
562	struct ath_hw *ah = priv->ah;
563	struct ath_common *common = ath9k_hw_common(priv->ah);
564	struct base_eep_header *pBase;
565
566	hw->flags = IEEE80211_HW_SIGNAL_DBM |
567		IEEE80211_HW_AMPDU_AGGREGATION |
568		IEEE80211_HW_SPECTRUM_MGMT |
569		IEEE80211_HW_HAS_RATE_CONTROL |
570		IEEE80211_HW_RX_INCLUDES_FCS |
 
571		IEEE80211_HW_PS_NULLFUNC_STACK |
572		IEEE80211_HW_REPORTS_TX_ACK_STATUS |
573		IEEE80211_HW_MFP_CAPABLE |
574		IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING;
575
576	if (ath9k_ps_enable)
577		hw->flags |= IEEE80211_HW_SUPPORTS_PS;
578
579	hw->wiphy->interface_modes =
580		BIT(NL80211_IFTYPE_STATION) |
581		BIT(NL80211_IFTYPE_ADHOC) |
582		BIT(NL80211_IFTYPE_AP) |
583		BIT(NL80211_IFTYPE_P2P_GO) |
584		BIT(NL80211_IFTYPE_P2P_CLIENT) |
585		BIT(NL80211_IFTYPE_MESH_POINT);
586
587	hw->wiphy->iface_combinations = &if_comb;
588	hw->wiphy->n_iface_combinations = 1;
589
590	hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
591
592	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN |
593			    WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
594
595	hw->queues = 4;
596	hw->max_listen_interval = 1;
 
597
598	hw->vif_data_size = sizeof(struct ath9k_htc_vif);
599	hw->sta_data_size = sizeof(struct ath9k_htc_sta);
600
601	/* tx_frame_hdr is larger than tx_mgmt_hdr anyway */
602	hw->extra_tx_headroom = sizeof(struct tx_frame_hdr) +
603		sizeof(struct htc_frame_hdr) + 4;
604
605	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
606		hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
607			&common->sbands[IEEE80211_BAND_2GHZ];
608	if (priv->ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
609		hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
610			&common->sbands[IEEE80211_BAND_5GHZ];
611
612	ath9k_cmn_reload_chainmask(ah);
613
614	pBase = ath9k_htc_get_eeprom_base(priv);
615	if (pBase) {
616		hw->wiphy->available_antennas_rx = pBase->rxMask;
617		hw->wiphy->available_antennas_tx = pBase->txMask;
 
618	}
619
620	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
621}
622
623static int ath9k_init_firmware_version(struct ath9k_htc_priv *priv)
624{
625	struct ieee80211_hw *hw = priv->hw;
626	struct wmi_fw_version cmd_rsp;
627	int ret;
628
629	memset(&cmd_rsp, 0, sizeof(cmd_rsp));
630
631	WMI_CMD(WMI_GET_FW_VERSION);
632	if (ret)
633		return -EINVAL;
634
635	priv->fw_version_major = be16_to_cpu(cmd_rsp.major);
636	priv->fw_version_minor = be16_to_cpu(cmd_rsp.minor);
637
638	snprintf(hw->wiphy->fw_version, sizeof(hw->wiphy->fw_version), "%d.%d",
639		 priv->fw_version_major,
640		 priv->fw_version_minor);
641
642	dev_info(priv->dev, "ath9k_htc: FW Version: %d.%d\n",
643		 priv->fw_version_major,
644		 priv->fw_version_minor);
645
646	/*
647	 * Check if the available FW matches the driver's
648	 * required version.
649	 */
650	if (priv->fw_version_major != MAJOR_VERSION_REQ ||
651	    priv->fw_version_minor < MINOR_VERSION_REQ) {
652		dev_err(priv->dev, "ath9k_htc: Please upgrade to FW version %d.%d\n",
653			MAJOR_VERSION_REQ, MINOR_VERSION_REQ);
654		return -EINVAL;
655	}
656
657	return 0;
658}
659
660static int ath9k_init_device(struct ath9k_htc_priv *priv,
661			     u16 devid, char *product, u32 drv_info)
662{
663	struct ieee80211_hw *hw = priv->hw;
664	struct ath_common *common;
665	struct ath_hw *ah;
666	int error = 0;
667	struct ath_regulatory *reg;
668	char hw_name[64];
669
670	/* Bring up device */
671	error = ath9k_init_priv(priv, devid, product, drv_info);
672	if (error != 0)
673		goto err_init;
674
675	ah = priv->ah;
676	common = ath9k_hw_common(ah);
677	ath9k_set_hw_capab(priv, hw);
678
679	error = ath9k_init_firmware_version(priv);
680	if (error != 0)
681		goto err_fw;
682
683	/* Initialize regulatory */
684	error = ath_regd_init(&common->regulatory, priv->hw->wiphy,
685			      ath9k_reg_notifier);
686	if (error)
687		goto err_regd;
688
689	reg = &common->regulatory;
690
691	/* Setup TX */
692	error = ath9k_tx_init(priv);
693	if (error != 0)
694		goto err_tx;
695
696	/* Setup RX */
697	error = ath9k_rx_init(priv);
698	if (error != 0)
699		goto err_rx;
700
701	ath9k_hw_disable(priv->ah);
702#ifdef CONFIG_MAC80211_LEDS
703	/* must be initialized before ieee80211_register_hw */
704	priv->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(priv->hw,
705		IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_htc_tpt_blink,
706		ARRAY_SIZE(ath9k_htc_tpt_blink));
707#endif
708
709	/* Register with mac80211 */
710	error = ieee80211_register_hw(hw);
711	if (error)
712		goto err_register;
713
714	/* Handle world regulatory */
715	if (!ath_is_world_regd(reg)) {
716		error = regulatory_hint(hw->wiphy, reg->alpha2);
717		if (error)
718			goto err_world;
719	}
720
721	error = ath9k_htc_init_debug(priv->ah);
722	if (error) {
723		ath_err(common, "Unable to create debugfs files\n");
724		goto err_world;
725	}
726
727	ath_dbg(common, CONFIG,
728		"WMI:%d, BCN:%d, CAB:%d, UAPSD:%d, MGMT:%d, BE:%d, BK:%d, VI:%d, VO:%d\n",
 
729		priv->wmi_cmd_ep,
730		priv->beacon_ep,
731		priv->cab_ep,
732		priv->uapsd_ep,
733		priv->mgmt_ep,
734		priv->data_be_ep,
735		priv->data_bk_ep,
736		priv->data_vi_ep,
737		priv->data_vo_ep);
738
739	ath9k_hw_name(priv->ah, hw_name, sizeof(hw_name));
740	wiphy_info(hw->wiphy, "%s\n", hw_name);
741
742	ath9k_init_leds(priv);
743	ath9k_start_rfkill_poll(priv);
744
745	return 0;
746
747err_world:
748	ieee80211_unregister_hw(hw);
749err_register:
750	ath9k_rx_cleanup(priv);
751err_rx:
752	ath9k_tx_cleanup(priv);
753err_tx:
754	/* Nothing */
755err_regd:
756	/* Nothing */
757err_fw:
758	ath9k_deinit_priv(priv);
759err_init:
760	return error;
761}
762
763int ath9k_htc_probe_device(struct htc_target *htc_handle, struct device *dev,
764			   u16 devid, char *product, u32 drv_info)
765{
766	struct ieee80211_hw *hw;
767	struct ath9k_htc_priv *priv;
768	int ret;
769
770	hw = ieee80211_alloc_hw(sizeof(struct ath9k_htc_priv), &ath9k_htc_ops);
771	if (!hw)
772		return -ENOMEM;
773
774	priv = hw->priv;
775	priv->hw = hw;
776	priv->htc = htc_handle;
777	priv->dev = dev;
778	htc_handle->drv_priv = priv;
779	SET_IEEE80211_DEV(hw, priv->dev);
780
781	ret = ath9k_htc_wait_for_target(priv);
782	if (ret)
783		goto err_free;
784
785	priv->wmi = ath9k_init_wmi(priv);
786	if (!priv->wmi) {
787		ret = -EINVAL;
788		goto err_free;
789	}
790
791	ret = ath9k_init_htc_services(priv, devid, drv_info);
792	if (ret)
793		goto err_init;
794
795	ret = ath9k_init_device(priv, devid, product, drv_info);
796	if (ret)
797		goto err_init;
798
799	return 0;
800
801err_init:
802	ath9k_deinit_wmi(priv);
803err_free:
804	ieee80211_free_hw(hw);
805	return ret;
806}
807
808void ath9k_htc_disconnect_device(struct htc_target *htc_handle, bool hotunplug)
809{
810	if (htc_handle->drv_priv) {
811
812		/* Check if the device has been yanked out. */
813		if (hotunplug)
814			htc_handle->drv_priv->ah->ah_flags |= AH_UNPLUGGED;
815
816		ath9k_deinit_device(htc_handle->drv_priv);
817		ath9k_deinit_wmi(htc_handle->drv_priv);
818		ieee80211_free_hw(htc_handle->drv_priv->hw);
819	}
820}
821
822#ifdef CONFIG_PM
823
824void ath9k_htc_suspend(struct htc_target *htc_handle)
825{
826	ath9k_htc_setpower(htc_handle->drv_priv, ATH9K_PM_FULL_SLEEP);
827}
828
829int ath9k_htc_resume(struct htc_target *htc_handle)
830{
831	struct ath9k_htc_priv *priv = htc_handle->drv_priv;
832	int ret;
833
834	ret = ath9k_htc_wait_for_target(priv);
835	if (ret)
836		return ret;
837
838	ret = ath9k_init_htc_services(priv, priv->ah->hw_version.devid,
839				      priv->ah->hw_version.usbdev);
840	ath9k_configure_leds(priv);
841
842	return ret;
843}
844#endif
845
846static int __init ath9k_htc_init(void)
847{
848	if (ath9k_hif_usb_init() < 0) {
849		pr_err("No USB devices found, driver not installed\n");
 
 
850		return -ENODEV;
851	}
852
853	return 0;
854}
855module_init(ath9k_htc_init);
856
857static void __exit ath9k_htc_exit(void)
858{
859	ath9k_hif_usb_exit();
860	pr_info("Driver unloaded\n");
861}
862module_exit(ath9k_htc_exit);