init.c 31.4 KB
Newer Older
S
Sujith 已提交
1
/*
2
 * Copyright (c) 2008-2011 Atheros Communications Inc.
S
Sujith 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

17 18
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

19
#include <linux/dma-mapping.h>
20
#include <linux/slab.h>
21
#include <linux/ath9k_platform.h>
22
#include <linux/module.h>
23 24
#include <linux/of.h>
#include <linux/of_net.h>
25
#include <linux/nvmem-consumer.h>
26
#include <linux/relay.h>
27
#include <linux/dmi.h>
28
#include <net/ieee80211_radiotap.h>
29

S
Sujith 已提交
30 31
#include "ath9k.h"

32 33 34 35 36
struct ath9k_eeprom_ctx {
	struct completion complete;
	struct ath_hw *ah;
};

S
Sujith 已提交
37 38 39 40 41 42 43 44 45 46
static char *dev_info = "ath9k";

MODULE_AUTHOR("Atheros Communications");
MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards.");
MODULE_LICENSE("Dual BSD/GPL");

static unsigned int ath9k_debug = ATH_DBG_DEFAULT;
module_param_named(debug, ath9k_debug, uint, 0);
MODULE_PARM_DESC(debug, "Debugging mask");

47 48
int ath9k_modparam_nohwcrypt;
module_param_named(nohwcrypt, ath9k_modparam_nohwcrypt, int, 0444);
S
Sujith 已提交
49 50
MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");

51 52
int ath9k_led_blink;
module_param_named(blink, ath9k_led_blink, int, 0444);
53 54
MODULE_PARM_DESC(blink, "Enable LED blink on activity");

55 56 57 58
static int ath9k_led_active_high = -1;
module_param_named(led_active_high, ath9k_led_active_high, int, 0444);
MODULE_PARM_DESC(led_active_high, "Invert LED polarity");

59 60 61 62
static int ath9k_btcoex_enable;
module_param_named(btcoex_enable, ath9k_btcoex_enable, int, 0444);
MODULE_PARM_DESC(btcoex_enable, "Enable wifi-BT coexistence");

63 64 65
static int ath9k_bt_ant_diversity;
module_param_named(bt_ant_diversity, ath9k_bt_ant_diversity, int, 0444);
MODULE_PARM_DESC(bt_ant_diversity, "Enable WLAN/BT RX antenna diversity");
66

67 68 69 70
static int ath9k_ps_enable;
module_param_named(ps_enable, ath9k_ps_enable, int, 0444);
MODULE_PARM_DESC(ps_enable, "Enable WLAN PowerSave");

71 72
#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT

F
Felix Fietkau 已提交
73
int ath9k_use_chanctx;
74 75 76
module_param_named(use_chanctx, ath9k_use_chanctx, int, 0444);
MODULE_PARM_DESC(use_chanctx, "Enable channel context for concurrency");

77 78
#endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */

R
Russell Hu 已提交
79 80 81 82
int ath9k_use_msi;
module_param_named(use_msi, ath9k_use_msi, int, 0444);
MODULE_PARM_DESC(use_msi, "Use MSI instead of INTx if possible");

83
bool is_ath9k_unloaded;
S
Sujith 已提交
84

85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
#ifdef CONFIG_MAC80211_LEDS
static const struct ieee80211_tpt_blink ath9k_tpt_blink[] = {
	{ .throughput = 0 * 1024, .blink_time = 334 },
	{ .throughput = 1 * 1024, .blink_time = 260 },
	{ .throughput = 5 * 1024, .blink_time = 220 },
	{ .throughput = 10 * 1024, .blink_time = 190 },
	{ .throughput = 20 * 1024, .blink_time = 170 },
	{ .throughput = 50 * 1024, .blink_time = 150 },
	{ .throughput = 70 * 1024, .blink_time = 130 },
	{ .throughput = 100 * 1024, .blink_time = 110 },
	{ .throughput = 200 * 1024, .blink_time = 80 },
	{ .throughput = 300 * 1024, .blink_time = 50 },
};
#endif

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
static int __init set_use_msi(const struct dmi_system_id *dmi)
{
	ath9k_use_msi = 1;
	return 1;
}

static const struct dmi_system_id ath9k_quirks[] __initconst = {
	{
		.callback = set_use_msi,
		.ident = "Dell Inspiron 24-3460",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
			DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 24-3460"),
		},
	},
	{
		.callback = set_use_msi,
		.ident = "Dell Vostro 3262",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 3262"),
		},
	},
	{
		.callback = set_use_msi,
		.ident = "Dell Inspiron 3472",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
			DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 3472"),
		},
	},
	{
		.callback = set_use_msi,
		.ident = "Dell Vostro 15-3572",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
			DMI_MATCH(DMI_PRODUCT_NAME, "Vostro 15-3572"),
		},
	},
	{
		.callback = set_use_msi,
		.ident = "Dell Inspiron 14-3473",
		.matches = {
			DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
			DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 14-3473"),
		},
	},
	{}
};

S
Sujith 已提交
150
static void ath9k_deinit_softc(struct ath_softc *sc);
S
Sujith 已提交
151

152
static void ath9k_op_ps_wakeup(struct ath_common *common)
O
Oleksij Rempel 已提交
153 154 155 156
{
	ath9k_ps_wakeup((struct ath_softc *) common->priv);
}

157
static void ath9k_op_ps_restore(struct ath_common *common)
O
Oleksij Rempel 已提交
158 159 160 161
{
	ath9k_ps_restore((struct ath_softc *) common->priv);
}

162
static const struct ath_ps_ops ath9k_ps_ops = {
O
Oleksij Rempel 已提交
163 164 165 166
	.wakeup = ath9k_op_ps_wakeup,
	.restore = ath9k_op_ps_restore,
};

S
Sujith 已提交
167 168 169 170 171 172 173 174
/*
 * Read and write, they both share the same lock. We do this to serialize
 * reads and writes on Atheros 802.11n PCI devices only. This is required
 * as the FIFO on these devices can only accept sanely 2 requests.
 */

static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset)
{
175
	struct ath_hw *ah = hw_priv;
S
Sujith 已提交
176 177 178
	struct ath_common *common = ath9k_hw_common(ah);
	struct ath_softc *sc = (struct ath_softc *) common->priv;

179
	if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_ON) {
S
Sujith 已提交
180 181 182 183 184 185 186 187 188 189
		unsigned long flags;
		spin_lock_irqsave(&sc->sc_serial_rw, flags);
		iowrite32(val, sc->mem + reg_offset);
		spin_unlock_irqrestore(&sc->sc_serial_rw, flags);
	} else
		iowrite32(val, sc->mem + reg_offset);
}

static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
{
190
	struct ath_hw *ah = hw_priv;
S
Sujith 已提交
191 192 193 194
	struct ath_common *common = ath9k_hw_common(ah);
	struct ath_softc *sc = (struct ath_softc *) common->priv;
	u32 val;

195
	if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_ON) {
S
Sujith 已提交
196 197 198 199 200 201 202 203 204
		unsigned long flags;
		spin_lock_irqsave(&sc->sc_serial_rw, flags);
		val = ioread32(sc->mem + reg_offset);
		spin_unlock_irqrestore(&sc->sc_serial_rw, flags);
	} else
		val = ioread32(sc->mem + reg_offset);
	return val;
}

205 206 207 208 209 210 211 212 213 214
static void ath9k_multi_ioread32(void *hw_priv, u32 *addr,
                                u32 *val, u16 count)
{
	int i;

	for (i = 0; i < count; i++)
		val[i] = ath9k_ioread32(hw_priv, addr[i]);
}


R
Rajkumar Manoharan 已提交
215 216 217 218 219 220 221 222 223 224 225 226 227
static unsigned int __ath9k_reg_rmw(struct ath_softc *sc, u32 reg_offset,
				    u32 set, u32 clr)
{
	u32 val;

	val = ioread32(sc->mem + reg_offset);
	val &= ~clr;
	val |= set;
	iowrite32(val, sc->mem + reg_offset);

	return val;
}

228 229
static unsigned int ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
{
230
	struct ath_hw *ah = hw_priv;
231 232
	struct ath_common *common = ath9k_hw_common(ah);
	struct ath_softc *sc = (struct ath_softc *) common->priv;
233
	unsigned long flags;
234 235
	u32 val;

236
	if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_ON) {
237
		spin_lock_irqsave(&sc->sc_serial_rw, flags);
R
Rajkumar Manoharan 已提交
238
		val = __ath9k_reg_rmw(sc, reg_offset, set, clr);
239
		spin_unlock_irqrestore(&sc->sc_serial_rw, flags);
R
Rajkumar Manoharan 已提交
240 241
	} else
		val = __ath9k_reg_rmw(sc, reg_offset, set, clr);
242 243 244 245

	return val;
}

S
Sujith 已提交
246 247 248 249
/**************************/
/*     Initialization     */
/**************************/

250 251
static void ath9k_reg_notifier(struct wiphy *wiphy,
			       struct regulatory_request *request)
S
Sujith 已提交
252 253
{
	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
254
	struct ath_softc *sc = hw->priv;
255 256 257
	struct ath_hw *ah = sc->sc_ah;
	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);

258
	ath_reg_notifier_apply(wiphy, request, reg);
259

260 261 262 263 264
	/* synchronize DFS detector if regulatory domain changed */
	if (sc->dfs_detector != NULL)
		sc->dfs_detector->set_dfs_domain(sc->dfs_detector,
						 request->dfs_region);

265
	/* Set tx power */
266 267 268 269 270 271 272 273 274 275
	if (!ah->curchan)
		return;

	sc->cur_chan->txpower = 2 * ah->curchan->chan->max_power;
	ath9k_ps_wakeup(sc);
	ath9k_hw_set_txpowerlimit(ah, sc->cur_chan->txpower, false);
	ath9k_cmn_update_txpow(ah, sc->cur_chan->cur_txpower,
			       sc->cur_chan->txpower,
			       &sc->cur_chan->cur_txpower);
	ath9k_ps_restore(sc);
S
Sujith 已提交
276 277 278 279 280 281 282 283 284
}

/*
 *  This function will allocate both the DMA descriptor structure, and the
 *  buffers it contains.  These are used to contain the descriptors used
 *  by the system.
*/
int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
		      struct list_head *head, const char *name,
285
		      int nbuf, int ndesc, bool is_tx)
S
Sujith 已提交
286 287
{
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
288
	u8 *ds;
289
	int i, bsize, desc_len;
S
Sujith 已提交
290

291
	ath_dbg(common, CONFIG, "%s DMA: %u buffers %u desc/buf\n",
J
Joe Perches 已提交
292
		name, nbuf, ndesc);
S
Sujith 已提交
293 294

	INIT_LIST_HEAD(head);
295 296 297 298 299 300

	if (is_tx)
		desc_len = sc->sc_ah->caps.tx_desc_len;
	else
		desc_len = sizeof(struct ath_desc);

S
Sujith 已提交
301
	/* ath_desc must be a multiple of DWORDs */
302
	if ((desc_len % 4) != 0) {
303
		ath_err(common, "ath_desc not DWORD aligned\n");
304
		BUG_ON((desc_len % 4) != 0);
305
		return -ENOMEM;
S
Sujith 已提交
306 307
	}

308
	dd->dd_desc_len = desc_len * nbuf * ndesc;
S
Sujith 已提交
309 310 311 312 313 314 315 316 317 318 319 320

	/*
	 * Need additional DMA memory because we can't use
	 * descriptors that cross the 4K page boundary. Assume
	 * one skipped descriptor per 4K page.
	 */
	if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_4KB_SPLITTRANS)) {
		u32 ndesc_skipped =
			ATH_DESC_4KB_BOUND_NUM_SKIPPED(dd->dd_desc_len);
		u32 dma_len;

		while (ndesc_skipped) {
321
			dma_len = ndesc_skipped * desc_len;
S
Sujith 已提交
322 323 324
			dd->dd_desc_len += dma_len;

			ndesc_skipped = ATH_DESC_4KB_BOUND_NUM_SKIPPED(dma_len);
325
		}
S
Sujith 已提交
326 327 328
	}

	/* allocate descriptors */
329 330 331 332 333
	dd->dd_desc = dmam_alloc_coherent(sc->dev, dd->dd_desc_len,
					  &dd->dd_desc_paddr, GFP_KERNEL);
	if (!dd->dd_desc)
		return -ENOMEM;

334
	ds = dd->dd_desc;
335
	ath_dbg(common, CONFIG, "%s DMA map: %p (%u) -> %llx (%u)\n",
J
Joe Perches 已提交
336 337
		name, ds, (u32) dd->dd_desc_len,
		ito64(dd->dd_desc_paddr), /*XXX*/(u32) dd->dd_desc_len);
S
Sujith 已提交
338 339

	/* allocate buffers */
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
	if (is_tx) {
		struct ath_buf *bf;

		bsize = sizeof(struct ath_buf) * nbuf;
		bf = devm_kzalloc(sc->dev, bsize, GFP_KERNEL);
		if (!bf)
			return -ENOMEM;

		for (i = 0; i < nbuf; i++, bf++, ds += (desc_len * ndesc)) {
			bf->bf_desc = ds;
			bf->bf_daddr = DS2PHYS(dd, ds);

			if (!(sc->sc_ah->caps.hw_caps &
				  ATH9K_HW_CAP_4KB_SPLITTRANS)) {
				/*
				 * Skip descriptor addresses which can cause 4KB
				 * boundary crossing (addr + length) with a 32 dword
				 * descriptor fetch.
				 */
				while (ATH_DESC_4KB_BOUND_CHECK(bf->bf_daddr)) {
					BUG_ON((caddr_t) bf->bf_desc >=
						   ((caddr_t) dd->dd_desc +
						dd->dd_desc_len));

					ds += (desc_len * ndesc);
					bf->bf_desc = ds;
					bf->bf_daddr = DS2PHYS(dd, ds);
				}
			}
			list_add_tail(&bf->list, head);
		}
	} else {
		struct ath_rxbuf *bf;

		bsize = sizeof(struct ath_rxbuf) * nbuf;
		bf = devm_kzalloc(sc->dev, bsize, GFP_KERNEL);
		if (!bf)
			return -ENOMEM;

		for (i = 0; i < nbuf; i++, bf++, ds += (desc_len * ndesc)) {
			bf->bf_desc = ds;
			bf->bf_daddr = DS2PHYS(dd, ds);

			if (!(sc->sc_ah->caps.hw_caps &
				  ATH9K_HW_CAP_4KB_SPLITTRANS)) {
				/*
				 * Skip descriptor addresses which can cause 4KB
				 * boundary crossing (addr + length) with a 32 dword
				 * descriptor fetch.
				 */
				while (ATH_DESC_4KB_BOUND_CHECK(bf->bf_daddr)) {
					BUG_ON((caddr_t) bf->bf_desc >=
						   ((caddr_t) dd->dd_desc +
						dd->dd_desc_len));

					ds += (desc_len * ndesc);
					bf->bf_desc = ds;
					bf->bf_daddr = DS2PHYS(dd, ds);
				}
S
Sujith 已提交
399
			}
400
			list_add_tail(&bf->list, head);
S
Sujith 已提交
401 402 403 404 405
		}
	}
	return 0;
}

S
Sujith 已提交
406 407 408 409 410
static int ath9k_init_queues(struct ath_softc *sc)
{
	int i = 0;

	sc->beacon.beaconq = ath9k_hw_beaconq_setup(sc->sc_ah);
S
Sujith 已提交
411 412 413
	sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0);
	ath_cabq_update(sc);

414 415
	sc->tx.uapsdq = ath_txq_setup(sc, ATH9K_TX_QUEUE_UAPSD, 0);

416
	for (i = 0; i < IEEE80211_NUM_ACS; i++) {
417
		sc->tx.txq_map[i] = ath_txq_setup(sc, ATH9K_TX_QUEUE_DATA, i);
418 419
		sc->tx.txq_map[i]->mac80211_qnum = i;
	}
S
Sujith 已提交
420 421 422 423 424 425 426
	return 0;
}

static void ath9k_init_misc(struct ath_softc *sc)
{
	struct ath_common *common = ath9k_hw_common(sc->sc_ah);
	int i = 0;
427

428
	timer_setup(&common->ani.timer, ath_ani_calibrate, 0);
S
Sujith 已提交
429

430
	common->last_rssi = ATH_RSSI_DUMMY_MARKER;
431
	eth_broadcast_addr(common->bssidmask);
432
	sc->beacon.slottime = 9;
S
Sujith 已提交
433

434
	for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++)
S
Sujith 已提交
435
		sc->beacon.bslot[i] = NULL;
436 437 438

	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB)
		sc->ant_comb.count = ATH_ANT_DIV_COMB_INIT_COUNT;
439

440
	sc->spec_priv.ah = sc->sc_ah;
441 442 443 444 445 446
	sc->spec_priv.spec_config.enabled = 0;
	sc->spec_priv.spec_config.short_repeat = true;
	sc->spec_priv.spec_config.count = 8;
	sc->spec_priv.spec_config.endless = false;
	sc->spec_priv.spec_config.period = 0xFF;
	sc->spec_priv.spec_config.fft_period = 0xF;
S
Sujith 已提交
447
}
S
Sujith 已提交
448

449
static void ath9k_init_pcoem_platform(struct ath_softc *sc)
450 451
{
	struct ath_hw *ah = sc->sc_ah;
452
	struct ath9k_hw_capabilities *pCap = &ah->caps;
453 454
	struct ath_common *common = ath9k_hw_common(ah);

455 456 457
	if (!IS_ENABLED(CONFIG_ATH9K_PCOEM))
		return;

458 459 460
	if (common->bus_ops->ath_bus_type != ATH_PCI)
		return;

461 462
	if (sc->driver_data & (ATH9K_PCI_CUS198 |
			       ATH9K_PCI_CUS230)) {
463 464
		ah->config.xlna_gpio = 9;
		ah->config.xatten_margin_cfg = true;
465
		ah->config.alt_mingainidx = true;
466
		ah->config.ant_ctrl_comm2g_switch_enable = 0x000BBB88;
467 468
		sc->ant_comb.low_rssi_thresh = 20;
		sc->ant_comb.fast_div_bias = 3;
469

470 471 472
		ath_info(common, "Set parameters for %s\n",
			 (sc->driver_data & ATH9K_PCI_CUS198) ?
			 "CUS198" : "CUS230");
473 474 475
	}

	if (sc->driver_data & ATH9K_PCI_CUS217)
S
Sujith Manoharan 已提交
476
		ath_info(common, "CUS217 card detected\n");
477

S
Sujith Manoharan 已提交
478 479 480
	if (sc->driver_data & ATH9K_PCI_CUS252)
		ath_info(common, "CUS252 card detected\n");

481 482 483 484 485 486
	if (sc->driver_data & ATH9K_PCI_AR9565_1ANT)
		ath_info(common, "WB335 1-ANT card detected\n");

	if (sc->driver_data & ATH9K_PCI_AR9565_2ANT)
		ath_info(common, "WB335 2-ANT card detected\n");

487 488 489
	if (sc->driver_data & ATH9K_PCI_KILLER)
		ath_info(common, "Killer Wireless card detected\n");

490 491 492 493 494 495 496 497 498 499 500
	/*
	 * Some WB335 cards do not support antenna diversity. Since
	 * we use a hardcoded value for AR9565 instead of using the
	 * EEPROM/OTP data, remove the combining feature from
	 * the HW capabilities bitmap.
	 */
	if (sc->driver_data & (ATH9K_PCI_AR9565_1ANT | ATH9K_PCI_AR9565_2ANT)) {
		if (!(sc->driver_data & ATH9K_PCI_BT_ANT_DIV))
			pCap->hw_caps &= ~ATH9K_HW_CAP_ANT_DIV_COMB;
	}

501 502 503
	if (sc->driver_data & ATH9K_PCI_BT_ANT_DIV) {
		pCap->hw_caps |= ATH9K_HW_CAP_BT_ANT_DIV;
		ath_info(common, "Set BT/WLAN RX diversity capability\n");
504
	}
505 506 507 508 509

	if (sc->driver_data & ATH9K_PCI_D3_L1_WAR) {
		ah->config.pcie_waen = 0x0040473b;
		ath_info(common, "Enable WAR for ASPM D3/L1\n");
	}
510

511 512 513
	/*
	 * The default value of pll_pwrsave is 1.
	 * For certain AR9485 cards, it is set to 0.
514
	 * For AR9462, AR9565 it's set to 7.
515 516 517
	 */
	ah->config.pll_pwrsave = 1;

518
	if (sc->driver_data & ATH9K_PCI_NO_PLL_PWRSAVE) {
519
		ah->config.pll_pwrsave = 0;
520 521
		ath_info(common, "Disable PLL PowerSave\n");
	}
S
Sujith Manoharan 已提交
522 523 524

	if (sc->driver_data & ATH9K_PCI_LED_ACT_HI)
		ah->config.led_active_high = true;
525 526
}

527 528 529 530 531 532 533 534 535 536 537 538 539 540
static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob,
				    void *ctx)
{
	struct ath9k_eeprom_ctx *ec = ctx;

	if (eeprom_blob)
		ec->ah->eeprom_blob = eeprom_blob;

	complete(&ec->complete);
}

static int ath9k_eeprom_request(struct ath_softc *sc, const char *name)
{
	struct ath9k_eeprom_ctx ec;
541
	struct ath_hw *ah = sc->sc_ah;
542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571
	int err;

	/* try to load the EEPROM content asynchronously */
	init_completion(&ec.complete);
	ec.ah = sc->sc_ah;

	err = request_firmware_nowait(THIS_MODULE, 1, name, sc->dev, GFP_KERNEL,
				      &ec, ath9k_eeprom_request_cb);
	if (err < 0) {
		ath_err(ath9k_hw_common(ah),
			"EEPROM request failed\n");
		return err;
	}

	wait_for_completion(&ec.complete);

	if (!ah->eeprom_blob) {
		ath_err(ath9k_hw_common(ah),
			"Unable to load EEPROM file %s\n", name);
		return -EINVAL;
	}

	return 0;
}

static void ath9k_eeprom_release(struct ath_softc *sc)
{
	release_firmware(sc->sc_ah->eeprom_blob);
}

572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
static int ath9k_nvmem_request_eeprom(struct ath_softc *sc)
{
	struct ath_hw *ah = sc->sc_ah;
	struct nvmem_cell *cell;
	void *buf;
	size_t len;
	int err;

	cell = devm_nvmem_cell_get(sc->dev, "calibration");
	if (IS_ERR(cell)) {
		err = PTR_ERR(cell);

		/* nvmem cell might not be defined, or the nvmem
		 * subsystem isn't included. In this case, follow
		 * the established "just return 0;" convention of
		 * ath9k_init_platform to say:
		 * "All good. Nothing to see here. Please go on."
		 */
		if (err == -ENOENT || err == -EOPNOTSUPP)
			return 0;

		return err;
	}

	buf = nvmem_cell_read(cell, &len);
	if (IS_ERR(buf))
		return PTR_ERR(buf);

	/* run basic sanity checks on the returned nvram cell length.
	 * That length has to be a multiple of a "u16" (i.e.: & 1).
	 * Furthermore, it has to be more than "let's say" 512 bytes
	 * but less than the maximum of AR9300_EEPROM_SIZE (16kb).
	 */
	if ((len & 1) == 1 || len < 512 || len >= AR9300_EEPROM_SIZE) {
		kfree(buf);
		return -EINVAL;
	}

	/* devres manages the calibration values release on shutdown */
	ah->nvmem_blob = (u16 *)devm_kmemdup(sc->dev, buf, len, GFP_KERNEL);
	kfree(buf);
	if (IS_ERR(ah->nvmem_blob))
		return PTR_ERR(ah->nvmem_blob);

	ah->nvmem_blob_len = len;
	ah->ah_flags &= ~AH_USE_EEPROM;
	ah->ah_flags |= AH_NO_EEP_SWAP;

	return 0;
}

623
static int ath9k_init_platform(struct ath_softc *sc)
624 625 626
{
	struct ath9k_platform_data *pdata = sc->dev->platform_data;
	struct ath_hw *ah = sc->sc_ah;
627 628
	struct ath_common *common = ath9k_hw_common(ah);
	int ret;
629 630 631 632

	if (!pdata)
		return 0;

633 634 635 636 637 638 639 640 641 642 643 644 645 646 647
	if (!pdata->use_eeprom) {
		ah->ah_flags &= ~AH_USE_EEPROM;
		ah->gpio_mask = pdata->gpio_mask;
		ah->gpio_val = pdata->gpio_val;
		ah->led_pin = pdata->led_pin;
		ah->is_clk_25mhz = pdata->is_clk_25mhz;
		ah->get_mac_revision = pdata->get_mac_revision;
		ah->external_reset = pdata->external_reset;
		ah->disable_2ghz = pdata->disable_2ghz;
		ah->disable_5ghz = pdata->disable_5ghz;

		if (!pdata->endian_check)
			ah->ah_flags |= AH_NO_EEP_SWAP;
	}

648 649 650 651 652 653
	if (pdata->eeprom_name) {
		ret = ath9k_eeprom_request(sc, pdata->eeprom_name);
		if (ret)
			return ret;
	}

654 655 656
	if (pdata->led_active_high)
		ah->config.led_active_high = true;

657 658 659
	if (pdata->tx_gain_buffalo)
		ah->config.tx_gain_buffalo = true;

660 661 662 663
	if (pdata->macaddr)
		ether_addr_copy(common->macaddr, pdata->macaddr);

	return 0;
664 665
}

666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688
static int ath9k_of_init(struct ath_softc *sc)
{
	struct device_node *np = sc->dev->of_node;
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
	enum ath_bus_type bus_type = common->bus_ops->ath_bus_type;
	char eeprom_name[100];
	int ret;

	if (!of_device_is_available(np))
		return 0;

	ath_dbg(common, CONFIG, "parsing configuration from OF node\n");

	if (of_property_read_bool(np, "qca,no-eeprom")) {
		/* ath9k-eeprom-<bus>-<id>.bin */
		scnprintf(eeprom_name, sizeof(eeprom_name),
			  "ath9k-eeprom-%s-%s.bin",
			  ath_bus_type_to_string(bus_type), dev_name(ah->dev));

		ret = ath9k_eeprom_request(sc, eeprom_name);
		if (ret)
			return ret;
689 690 691

		ah->ah_flags &= ~AH_USE_EEPROM;
		ah->ah_flags |= AH_NO_EEP_SWAP;
692 693
	}

694
	of_get_mac_address(np, common->macaddr);
695 696 697 698

	return 0;
}

699
static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
S
Sujith 已提交
700 701 702
			    const struct ath_bus_ops *bus_ops)
{
	struct ath_hw *ah = NULL;
703
	struct ath9k_hw_capabilities *pCap;
S
Sujith 已提交
704 705 706
	struct ath_common *common;
	int ret = 0, i;
	int csz = 0;
S
Sujith 已提交
707

708
	ah = devm_kzalloc(sc->dev, sizeof(struct ath_hw), GFP_KERNEL);
S
Sujith 已提交
709 710 711
	if (!ah)
		return -ENOMEM;

712
	ah->dev = sc->dev;
B
Ben Greear 已提交
713
	ah->hw = sc->hw;
S
Sujith 已提交
714
	ah->hw_version.devid = devid;
715 716
	ah->ah_flags |= AH_USE_EEPROM;
	ah->led_pin = -1;
717
	ah->reg_ops.read = ath9k_ioread32;
718
	ah->reg_ops.multi_read = ath9k_multi_ioread32;
719
	ah->reg_ops.write = ath9k_iowrite32;
720
	ah->reg_ops.rmw = ath9k_reg_rmw;
721
	pCap = &ah->caps;
S
Sujith 已提交
722

723
	common = ath9k_hw_common(ah);
724 725 726 727 728

	/* Will be cleared in ath9k_start() */
	set_bit(ATH_OP_INVALID, &common->op_flags);

	sc->sc_ah = ah;
729
	sc->dfs_detector = dfs_pattern_detector_init(common, NL80211_DFS_UNSET);
L
Luis R. Rodriguez 已提交
730
	sc->tx99_power = MAX_RATE_POWER + 1;
F
Felix Fietkau 已提交
731
	init_waitqueue_head(&sc->tx_wait);
732
	sc->cur_chan = &sc->chanctx[0];
733
	if (!ath9k_is_chanctx_enabled())
734
		sc->cur_chan->hw_queue_base = 0;
735

736
	common->ops = &ah->reg_ops;
S
Sujith 已提交
737
	common->bus_ops = bus_ops;
O
Oleksij Rempel 已提交
738
	common->ps_ops = &ath9k_ps_ops;
S
Sujith 已提交
739 740 741 742
	common->ah = ah;
	common->hw = sc->hw;
	common->priv = sc;
	common->debug_mask = ath9k_debug;
743
	common->btcoex_enabled = ath9k_btcoex_enable == 1;
744
	common->disable_ani = false;
745

746 747 748
	/*
	 * Platform quirks.
	 */
749 750
	ath9k_init_pcoem_platform(sc);

751
	ret = ath9k_init_platform(sc);
752 753
	if (ret)
		return ret;
754

755 756 757 758
	ret = ath9k_of_init(sc);
	if (ret)
		return ret;

759 760 761 762
	ret = ath9k_nvmem_request_eeprom(sc);
	if (ret)
		return ret;

763 764 765
	if (ath9k_led_active_high != -1)
		ah->config.led_active_high = ath9k_led_active_high == 1;

766
	/*
767 768
	 * Enable WLAN/BT RX Antenna diversity only when:
	 *
769
	 * - BTCOEX is disabled.
770 771
	 * - the user manually requests the feature.
	 * - the HW cap is set using the platform data.
772
	 */
773
	if (!common->btcoex_enabled && ath9k_bt_ant_diversity &&
774
	    (pCap->hw_caps & ATH9K_HW_CAP_BT_ANT_DIV))
775
		common->bt_ant_diversity = 1;
776

777
	spin_lock_init(&common->cc_lock);
778
	spin_lock_init(&sc->intr_lock);
S
Sujith 已提交
779 780
	spin_lock_init(&sc->sc_serial_rw);
	spin_lock_init(&sc->sc_pm_lock);
781
	spin_lock_init(&sc->chan_lock);
S
Sujith 已提交
782
	mutex_init(&sc->mutex);
783 784
	tasklet_setup(&sc->intr_tq, ath9k_tasklet);
	tasklet_setup(&sc->bcon_tasklet, ath9k_beacon_tasklet);
S
Sujith 已提交
785

786
	timer_setup(&sc->sleep_timer, ath_ps_full_sleep, 0);
787 788 789
	INIT_WORK(&sc->hw_reset_work, ath_reset_work);
	INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
	INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
790
	INIT_DELAYED_WORK(&sc->hw_check_work, ath_hw_check_work);
791 792

	ath9k_init_channel_context(sc);
793

S
Sujith 已提交
794 795 796 797 798 799 800
	/*
	 * Cache line size is used to size and align various
	 * structures used to communicate with the hardware.
	 */
	ath_read_cachesize(common, &csz);
	common->cachelsz = csz << 2; /* convert to bytes */

801
	/* Initializes the hardware for all supported chipsets */
S
Sujith 已提交
802
	ret = ath9k_hw_init(ah);
803
	if (ret)
S
Sujith 已提交
804
		goto err_hw;
S
Sujith 已提交
805

S
Sujith 已提交
806 807 808 809 810 811 812 813
	ret = ath9k_init_queues(sc);
	if (ret)
		goto err_queues;

	ret =  ath9k_init_btcoex(sc);
	if (ret)
		goto err_btcoex;

814
	ret = ath9k_cmn_init_channels_rates(common);
815 816 817
	if (ret)
		goto err_btcoex;

818 819
	ret = ath9k_init_p2p(sc);
	if (ret)
820
		goto err_btcoex;
821

822
	ath9k_cmn_init_crypto(sc->sc_ah);
S
Sujith 已提交
823
	ath9k_init_misc(sc);
824
	ath_chanctx_init(sc);
825
	ath9k_offchannel_init(sc);
S
Sujith 已提交
826

S
Sujith Manoharan 已提交
827 828 829
	if (common->bus_ops->aspm_init)
		common->bus_ops->aspm_init(common);

S
Sujith 已提交
830
	return 0;
S
Sujith 已提交
831 832

err_btcoex:
S
Sujith 已提交
833 834 835
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
		if (ATH_TXQ_SETUP(sc, i))
			ath_tx_cleanupq(sc, &sc->tx.txq[i]);
S
Sujith 已提交
836 837 838
err_queues:
	ath9k_hw_deinit(ah);
err_hw:
839
	ath9k_eeprom_release(sc);
L
Luis R. Rodriguez 已提交
840
	dev_kfree_skb_any(sc->tx99_skb);
S
Sujith 已提交
841
	return ret;
S
Sujith 已提交
842 843
}

844 845 846 847 848
static void ath9k_init_band_txpower(struct ath_softc *sc, int band)
{
	struct ieee80211_supported_band *sband;
	struct ieee80211_channel *chan;
	struct ath_hw *ah = sc->sc_ah;
849
	struct ath_common *common = ath9k_hw_common(ah);
850
	struct cfg80211_chan_def chandef;
851 852
	int i;

853
	sband = &common->sbands[band];
854 855 856
	for (i = 0; i < sband->n_channels; i++) {
		chan = &sband->channels[i];
		ah->curchan = &ah->channels[chan->hw_value];
857
		cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_HT20);
858
		ath9k_cmn_get_channel(sc->hw, ah, &chandef);
859
		ath9k_hw_set_txpowerlimit(ah, MAX_COMBINED_POWER, true);
860 861 862 863 864 865 866 867 868
	}
}

static void ath9k_init_txpower_limits(struct ath_softc *sc)
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath9k_channel *curchan = ah->curchan;

	if (ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
869
		ath9k_init_band_txpower(sc, NL80211_BAND_2GHZ);
870
	if (ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
871
		ath9k_init_band_txpower(sc, NL80211_BAND_5GHZ);
872 873 874 875

	ah->curchan = curchan;
}

876
static const struct ieee80211_iface_limit if_limits[] = {
877
	{ .max = 2048,	.types = BIT(NL80211_IFTYPE_STATION) },
878 879 880 881
	{ .max = 8,	.types =
#ifdef CONFIG_MAC80211_MESH
				 BIT(NL80211_IFTYPE_MESH_POINT) |
#endif
882 883
				 BIT(NL80211_IFTYPE_AP) },
	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_CLIENT) |
884 885 886
				 BIT(NL80211_IFTYPE_P2P_GO) },
};

887 888
#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT

889
static const struct ieee80211_iface_limit if_limits_multi[] = {
S
Sujith Manoharan 已提交
890 891 892
	{ .max = 2,	.types = BIT(NL80211_IFTYPE_STATION) |
				 BIT(NL80211_IFTYPE_AP) |
				 BIT(NL80211_IFTYPE_P2P_CLIENT) |
893
				 BIT(NL80211_IFTYPE_P2P_GO) },
S
Sujith Manoharan 已提交
894
	{ .max = 1,	.types = BIT(NL80211_IFTYPE_ADHOC) },
895
	{ .max = 1,	.types = BIT(NL80211_IFTYPE_P2P_DEVICE) },
896 897 898 899 900 901
};

static const struct ieee80211_iface_combination if_comb_multi[] = {
	{
		.limits = if_limits_multi,
		.n_limits = ARRAY_SIZE(if_limits_multi),
902
		.max_interfaces = 3,
903 904 905 906 907
		.num_different_channels = 2,
		.beacon_int_infra_match = true,
	},
};

908 909
#endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */

910 911 912 913 914 915 916
static const struct ieee80211_iface_combination if_comb[] = {
	{
		.limits = if_limits,
		.n_limits = ARRAY_SIZE(if_limits),
		.max_interfaces = 2048,
		.num_different_channels = 1,
		.beacon_int_infra_match = true,
917 918 919 920 921
#ifdef CONFIG_ATH9K_DFS_CERTIFIED
		.radar_detect_widths =	BIT(NL80211_CHAN_WIDTH_20_NOHT) |
					BIT(NL80211_CHAN_WIDTH_20) |
					BIT(NL80211_CHAN_WIDTH_40),
#endif
922
	},
923
};
924

925 926 927 928 929 930 931 932 933
#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT
static void ath9k_set_mcc_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
{
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);

	if (!ath9k_is_chanctx_enabled())
		return;

934
	ieee80211_hw_set(hw, QUEUE_CONTROL);
935 936 937 938 939 940 941 942 943 944 945 946 947 948 949
	hw->queues = ATH9K_NUM_TX_QUEUES;
	hw->offchannel_tx_hw_queue = hw->queues - 1;
	hw->wiphy->iface_combinations = if_comb_multi;
	hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb_multi);
	hw->wiphy->max_scan_ssids = 255;
	hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
	hw->wiphy->max_remain_on_channel_duration = 10000;
	hw->chanctx_data_size = sizeof(void *);
	hw->extra_beacon_tailroom =
		sizeof(struct ieee80211_p2p_noa_attr) + 9;

	ath_dbg(common, CHAN_CTX, "Use channel contexts\n");
}
#endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */

S
Sujith Manoharan 已提交
950
static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
S
Sujith 已提交
951
{
952 953
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
954

955 956 957 958 959 960 961 962
	ieee80211_hw_set(hw, SUPPORTS_HT_CCK_RATES);
	ieee80211_hw_set(hw, SUPPORTS_RC_TABLE);
	ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
	ieee80211_hw_set(hw, SPECTRUM_MGMT);
	ieee80211_hw_set(hw, PS_NULLFUNC_STACK);
	ieee80211_hw_set(hw, SIGNAL_DBM);
	ieee80211_hw_set(hw, RX_INCLUDES_FCS);
	ieee80211_hw_set(hw, HOST_BROADCAST_PS_BUFFERING);
F
Felix Fietkau 已提交
963
	ieee80211_hw_set(hw, SUPPORT_FAST_XMIT);
964
	ieee80211_hw_set(hw, SUPPORTS_CLONED_SKBS);
S
Sujith 已提交
965

966
	if (ath9k_ps_enable)
967
		ieee80211_hw_set(hw, SUPPORTS_PS);
968

969
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
970
		ieee80211_hw_set(hw, AMPDU_AGGREGATION);
971 972 973 974 975

		if (AR_SREV_9280_20_OR_LATER(ah))
			hw->radiotap_mcs_details |=
				IEEE80211_RADIOTAP_MCS_HAVE_STBC;
	}
976

977
	if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || ath9k_modparam_nohwcrypt)
978
		ieee80211_hw_set(hw, MFP_CAPABLE);
S
Sujith 已提交
979

S
Sujith Manoharan 已提交
980 981 982
	hw->wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR |
			       NL80211_FEATURE_AP_MODE_CHAN_WIDTH_CHANGE |
			       NL80211_FEATURE_P2P_GO_CTWIN;
983

984
	if (!IS_ENABLED(CONFIG_ATH9K_TX99)) {
L
Luis R. Rodriguez 已提交
985 986 987 988 989 990
		hw->wiphy->interface_modes =
			BIT(NL80211_IFTYPE_P2P_GO) |
			BIT(NL80211_IFTYPE_P2P_CLIENT) |
			BIT(NL80211_IFTYPE_AP) |
			BIT(NL80211_IFTYPE_STATION) |
			BIT(NL80211_IFTYPE_ADHOC) |
991
			BIT(NL80211_IFTYPE_MESH_POINT) |
J
Jan Kaisrlik 已提交
992
			BIT(NL80211_IFTYPE_OCB);
993

994 995 996 997
		if (ath9k_is_chanctx_enabled())
			hw->wiphy->interface_modes |=
					BIT(NL80211_IFTYPE_P2P_DEVICE);

998 999
		hw->wiphy->iface_combinations = if_comb;
		hw->wiphy->n_iface_combinations = ARRAY_SIZE(if_comb);
L
Luis R. Rodriguez 已提交
1000
	}
1001

1002
	hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
S
Sujith 已提交
1003

J
Jouni Malinen 已提交
1004
	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
J
Jouni Malinen 已提交
1005
	hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
1006
	hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
1007
	hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_5_10_MHZ;
1008
	hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
1009
	hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
J
Jouni Malinen 已提交
1010

1011
	hw->queues = 4;
S
Sujith 已提交
1012
	hw->max_rates = 4;
1013
	hw->max_listen_interval = 10;
1014
	hw->max_rate_tries = 10;
S
Sujith 已提交
1015 1016
	hw->sta_data_size = sizeof(struct ath_node);
	hw->vif_data_size = sizeof(struct ath_vif);
1017
	hw->txq_data_size = sizeof(struct ath_atx_tid);
1018
	hw->extra_tx_headroom = 4;
S
Sujith 已提交
1019

1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
	hw->wiphy->available_antennas_rx = BIT(ah->caps.max_rxchains) - 1;
	hw->wiphy->available_antennas_tx = BIT(ah->caps.max_txchains) - 1;

	/* single chain devices with rx diversity */
	if (ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB)
		hw->wiphy->available_antennas_rx = BIT(0) | BIT(1);

	sc->ant_rx = hw->wiphy->available_antennas_rx;
	sc->ant_tx = hw->wiphy->available_antennas_tx;

1030
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_2GHZ)
1031 1032
		hw->wiphy->bands[NL80211_BAND_2GHZ] =
			&common->sbands[NL80211_BAND_2GHZ];
1033
	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_5GHZ)
1034 1035
		hw->wiphy->bands[NL80211_BAND_5GHZ] =
			&common->sbands[NL80211_BAND_5GHZ];
S
Sujith 已提交
1036

1037 1038 1039
#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT
	ath9k_set_mcc_capab(sc, hw);
#endif
1040
	ath9k_init_wow(hw);
1041
	ath9k_cmn_reload_chainmask(ah);
S
Sujith 已提交
1042 1043

	SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
1044 1045

	wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
1046
	wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
1047 1048
	wiphy_ext_feature_set(hw->wiphy,
			      NL80211_EXT_FEATURE_MULTICAST_REGISTRATIONS);
1049
	wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0);
S
Sujith 已提交
1050 1051
}

1052
int ath9k_init_device(u16 devid, struct ath_softc *sc,
S
Sujith 已提交
1053 1054 1055 1056 1057
		    const struct ath_bus_ops *bus_ops)
{
	struct ieee80211_hw *hw = sc->hw;
	struct ath_common *common;
	struct ath_hw *ah;
S
Sujith 已提交
1058
	int error = 0;
S
Sujith 已提交
1059 1060
	struct ath_regulatory *reg;

S
Sujith 已提交
1061
	/* Bring up device */
1062
	error = ath9k_init_softc(devid, sc, bus_ops);
1063 1064
	if (error)
		return error;
S
Sujith 已提交
1065 1066 1067

	ah = sc->sc_ah;
	common = ath9k_hw_common(ah);
S
Sujith 已提交
1068
	ath9k_set_hw_capab(sc, hw);
S
Sujith 已提交
1069

S
Sujith 已提交
1070
	/* Initialize regulatory */
S
Sujith 已提交
1071 1072 1073
	error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
			      ath9k_reg_notifier);
	if (error)
1074
		goto deinit;
S
Sujith 已提交
1075 1076 1077

	reg = &common->regulatory;

S
Sujith 已提交
1078
	/* Setup TX DMA */
S
Sujith 已提交
1079 1080
	error = ath_tx_init(sc, ATH_TXBUF);
	if (error != 0)
1081
		goto deinit;
S
Sujith 已提交
1082

S
Sujith 已提交
1083
	/* Setup RX DMA */
S
Sujith 已提交
1084 1085
	error = ath_rx_init(sc, ATH_RXBUF);
	if (error != 0)
1086
		goto deinit;
S
Sujith 已提交
1087

1088 1089
	ath9k_init_txpower_limits(sc);

1090 1091 1092 1093 1094 1095 1096
#ifdef CONFIG_MAC80211_LEDS
	/* must be initialized before ieee80211_register_hw */
	sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw,
		IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink,
		ARRAY_SIZE(ath9k_tpt_blink));
#endif

S
Sujith 已提交
1097
	/* Register with mac80211 */
S
Sujith 已提交
1098
	error = ieee80211_register_hw(hw);
S
Sujith 已提交
1099
	if (error)
1100
		goto rx_cleanup;
S
Sujith 已提交
1101

1102 1103
	error = ath9k_init_debug(ah);
	if (error) {
1104
		ath_err(common, "Unable to create debugfs files\n");
1105
		goto unregister;
1106 1107
	}

S
Sujith 已提交
1108
	/* Handle world regulatory */
S
Sujith 已提交
1109 1110 1111
	if (!ath_is_world_regd(reg)) {
		error = regulatory_hint(hw->wiphy, reg->alpha2);
		if (error)
1112
			goto debug_cleanup;
S
Sujith 已提交
1113 1114
	}

S
Sujith 已提交
1115
	ath_init_leds(sc);
S
Sujith 已提交
1116 1117 1118 1119
	ath_start_rfkill_poll(sc);

	return 0;

1120 1121
debug_cleanup:
	ath9k_deinit_debug(sc);
1122
unregister:
S
Sujith 已提交
1123
	ieee80211_unregister_hw(hw);
1124
rx_cleanup:
S
Sujith 已提交
1125
	ath_rx_cleanup(sc);
1126
deinit:
S
Sujith 已提交
1127
	ath9k_deinit_softc(sc);
S
Sujith 已提交
1128 1129 1130 1131 1132 1133 1134
	return error;
}

/*****************************/
/*     De-Initialization     */
/*****************************/

S
Sujith 已提交
1135
static void ath9k_deinit_softc(struct ath_softc *sc)
S
Sujith 已提交
1136
{
S
Sujith 已提交
1137
	int i = 0;
S
Sujith 已提交
1138

1139
	ath9k_deinit_p2p(sc);
1140
	ath9k_deinit_btcoex(sc);
1141

S
Sujith 已提交
1142 1143 1144 1145
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
		if (ATH_TXQ_SETUP(sc, i))
			ath_tx_cleanupq(sc, &sc->tx.txq[i]);

1146
	del_timer_sync(&sc->sleep_timer);
S
Sujith 已提交
1147
	ath9k_hw_deinit(sc->sc_ah);
1148 1149
	if (sc->dfs_detector != NULL)
		sc->dfs_detector->exit(sc->dfs_detector);
S
Sujith 已提交
1150

1151
	ath9k_eeprom_release(sc);
S
Sujith 已提交
1152 1153
}

S
Sujith 已提交
1154
void ath9k_deinit_device(struct ath_softc *sc)
S
Sujith 已提交
1155 1156 1157 1158 1159 1160
{
	struct ieee80211_hw *hw = sc->hw;

	ath9k_ps_wakeup(sc);

	wiphy_rfkill_stop_polling(sc->hw->wiphy);
S
Sujith 已提交
1161
	ath_deinit_leds(sc);
S
Sujith 已提交
1162

1163 1164
	ath9k_ps_restore(sc);

1165
	ath9k_deinit_debug(sc);
S
Sujith Manoharan 已提交
1166
	ath9k_deinit_wow(hw);
S
Sujith 已提交
1167 1168
	ieee80211_unregister_hw(hw);
	ath_rx_cleanup(sc);
S
Sujith 已提交
1169
	ath9k_deinit_softc(sc);
S
Sujith 已提交
1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181
}

/************************/
/*     Module Hooks     */
/************************/

static int __init ath9k_init(void)
{
	int error;

	error = ath_pci_init();
	if (error < 0) {
1182
		pr_err("No PCI devices found, driver not installed\n");
S
Sujith 已提交
1183
		error = -ENODEV;
1184
		goto err_out;
S
Sujith 已提交
1185 1186 1187 1188 1189 1190 1191 1192
	}

	error = ath_ahb_init();
	if (error < 0) {
		error = -ENODEV;
		goto err_pci_exit;
	}

1193 1194
	dmi_check_system(ath9k_quirks);

S
Sujith 已提交
1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205
	return 0;

 err_pci_exit:
	ath_pci_exit();
 err_out:
	return error;
}
module_init(ath9k_init);

static void __exit ath9k_exit(void)
{
1206
	is_ath9k_unloaded = true;
S
Sujith 已提交
1207 1208
	ath_ahb_exit();
	ath_pci_exit();
1209
	pr_info("%s: Driver unloaded\n", dev_info);
S
Sujith 已提交
1210 1211
}
module_exit(ath9k_exit);