pci.c 11.5 KB
Newer Older
1
/*
2
 * Copyright (c) 2008-2011 Atheros Communications Inc.
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 20
#include <linux/nl80211.h>
#include <linux/pci.h>
21
#include <linux/pci-aspm.h>
22
#include <linux/ath9k_platform.h>
23
#include <linux/module.h>
S
Sujith 已提交
24
#include "ath9k.h"
25

26
static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = {
27 28 29 30 31 32
	{ PCI_VDEVICE(ATHEROS, 0x0023) }, /* PCI   */
	{ PCI_VDEVICE(ATHEROS, 0x0024) }, /* PCI-E */
	{ PCI_VDEVICE(ATHEROS, 0x0027) }, /* PCI   */
	{ PCI_VDEVICE(ATHEROS, 0x0029) }, /* PCI   */
	{ PCI_VDEVICE(ATHEROS, 0x002A) }, /* PCI-E */
	{ PCI_VDEVICE(ATHEROS, 0x002B) }, /* PCI-E */
33
	{ PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */
34 35
	{ PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI   */
	{ PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */
L
Luis R. Rodriguez 已提交
36
	{ PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E  AR9300 */
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

	/* PCI-E CUS198 */
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0032,
			 PCI_VENDOR_ID_AZWAVE,
			 0x2086),
	  .driver_data = ATH9K_PCI_CUS198 },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0032,
			 PCI_VENDOR_ID_AZWAVE,
			 0x1237),
	  .driver_data = ATH9K_PCI_CUS198 },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0032,
			 PCI_VENDOR_ID_AZWAVE,
			 0x2126),
	  .driver_data = ATH9K_PCI_CUS198 },
54 55

	/* PCI-E CUS230 */
56 57 58 59
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0032,
			 PCI_VENDOR_ID_AZWAVE,
			 0x2152),
60
	  .driver_data = ATH9K_PCI_CUS230 },
61 62 63 64
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0032,
			 PCI_VENDOR_ID_FOXCONN,
			 0xE075),
65
	  .driver_data = ATH9K_PCI_CUS230 },
66

67
	{ PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E  AR9485 */
L
Luis R. Rodriguez 已提交
68
	{ PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E  AR9580 */
S
Sujith Manoharan 已提交
69 70 71 72 73 74 75 76 77 78 79 80 81

	/* PCI-E CUS217 */
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 PCI_VENDOR_ID_AZWAVE,
			 0x2116),
	  .driver_data = ATH9K_PCI_CUS217 },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 0x11AD, /* LITEON */
			 0x6661),
	  .driver_data = ATH9K_PCI_CUS217 },

82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 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
	/* AR9462 with WoW support */
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 PCI_VENDOR_ID_ATHEROS,
			 0x3117),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 PCI_VENDOR_ID_LENOVO,
			 0x3214),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 PCI_VENDOR_ID_ATTANSIC,
			 0x0091),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 PCI_VENDOR_ID_AZWAVE,
			 0x2110),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 PCI_VENDOR_ID_ASUSTEK,
			 0x850E),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 0x11AD, /* LITEON */
			 0x6631),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 0x11AD, /* LITEON */
			 0x6641),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 PCI_VENDOR_ID_HP,
			 0x1864),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 0x14CD, /* USI */
			 0x0063),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 0x14CD, /* USI */
			 0x0064),
	  .driver_data = ATH9K_PCI_WOW },
	{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
			 0x0034,
			 0x10CF, /* Fujitsu */
			 0x1783),
	  .driver_data = ATH9K_PCI_WOW },

139
	{ PCI_VDEVICE(ATHEROS, 0x0034) }, /* PCI-E  AR9462 */
140
	{ PCI_VDEVICE(ATHEROS, 0x0037) }, /* PCI-E  AR1111/AR9485 */
S
Sujith Manoharan 已提交
141
	{ PCI_VDEVICE(ATHEROS, 0x0036) }, /* PCI-E  AR9565 */
142 143 144
	{ 0 }
};

145

146
/* return bus cachesize in 4B word units */
147
static void ath_pci_read_cachesize(struct ath_common *common, int *csz)
148
{
149
	struct ath_softc *sc = (struct ath_softc *) common->priv;
150 151
	u8 u8tmp;

152
	pci_read_config_byte(to_pci_dev(sc->dev), PCI_CACHE_LINE_SIZE, &u8tmp);
153 154 155
	*csz = (int)u8tmp;

	/*
L
Lucas De Marchi 已提交
156
	 * This check was put in to avoid "unpleasant" consequences if
157 158 159 160 161 162 163 164
	 * the bootrom has not fully initialized all PCI devices.
	 * Sometimes the cache line size register is not set
	 */

	if (*csz == 0)
		*csz = DEFAULT_CACHELINE >> 2;   /* Use the default size */
}

165
static bool ath_pci_eeprom_read(struct ath_common *common, u32 off, u16 *data)
166
{
167 168 169 170 171
	struct ath_softc *sc = (struct ath_softc *) common->priv;
	struct ath9k_platform_data *pdata = sc->dev->platform_data;

	if (pdata) {
		if (off >= (ARRAY_SIZE(pdata->eeprom_data))) {
172 173 174
			ath_err(common,
				"%s: eeprom read failed, offset %08x is out of range\n",
				__func__, off);
175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
		}

		*data = pdata->eeprom_data[off];
	} else {
		struct ath_hw *ah = (struct ath_hw *) common->ah;

		common->ops->read(ah, AR5416_EEPROM_OFFSET +
				      (off << AR5416_EEPROM_S));

		if (!ath9k_hw_wait(ah,
				   AR_EEPROM_STATUS_DATA,
				   AR_EEPROM_STATUS_DATA_BUSY |
				   AR_EEPROM_STATUS_DATA_PROT_ACCESS, 0,
				   AH_WAIT_TIMEOUT)) {
			return false;
		}

		*data = MS(common->ops->read(ah, AR_EEPROM_STATUS_DATA),
			   AR_EEPROM_STATUS_DATA_VAL);
194 195 196 197 198
	}

	return true;
}

199
/* Need to be called after we discover btcoex capabilities */
200 201 202 203 204 205
static void ath_pci_aspm_init(struct ath_common *common)
{
	struct ath_softc *sc = (struct ath_softc *) common->priv;
	struct ath_hw *ah = sc->sc_ah;
	struct pci_dev *pdev = to_pci_dev(sc->dev);
	struct pci_dev *parent;
206
	u16 aspm;
207

S
Sujith Manoharan 已提交
208 209 210
	if (!ah->is_pciexpress)
		return;

211
	parent = pdev->bus->self;
212 213
	if (!parent)
		return;
214

215 216
	if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) &&
	    (AR_SREV_9285(ah))) {
217
		/* Bluetooth coexistence requires disabling ASPM. */
218
		pcie_capability_clear_word(pdev, PCI_EXP_LNKCTL,
219
			PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
220 221 222 223 224

		/*
		 * Both upstream and downstream PCIe components should
		 * have the same ASPM settings.
		 */
225
		pcie_capability_clear_word(parent, PCI_EXP_LNKCTL,
226
			PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1);
227

S
Sujith Manoharan 已提交
228
		ath_info(common, "Disabling ASPM since BTCOEX is enabled\n");
229 230 231
		return;
	}

232
	pcie_capability_read_word(parent, PCI_EXP_LNKCTL, &aspm);
233
	if (aspm & (PCI_EXP_LNKCTL_ASPM_L0S | PCI_EXP_LNKCTL_ASPM_L1)) {
234 235
		ah->aspm_enabled = true;
		/* Initialize PCIe PM and SERDES registers. */
236
		ath9k_hw_configpcipowersave(ah, false);
S
Sujith Manoharan 已提交
237
		ath_info(common, "ASPM enabled: 0x%x\n", aspm);
238 239 240
	}
}

241
static const struct ath_bus_ops ath_pci_bus_ops = {
S
Sujith 已提交
242
	.ath_bus_type = ATH_PCI,
243
	.read_cachesize = ath_pci_read_cachesize,
244
	.eeprom_read = ath_pci_eeprom_read,
245
	.aspm_init = ath_pci_aspm_init,
246 247 248 249 250 251 252
};

static int ath_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
{
	struct ath_softc *sc;
	struct ieee80211_hw *hw;
	u8 csz;
253
	u32 val;
254
	int ret = 0;
255
	char hw_name[64];
256

257
	if (pcim_enable_device(pdev))
258 259
		return -EIO;

260
	ret =  pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
261
	if (ret) {
262
		pr_err("32-bit DMA not available\n");
263
		return ret;
264 265
	}

266
	ret = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
267
	if (ret) {
268
		pr_err("32-bit DMA consistent DMA enable failed\n");
269
		return ret;
270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296
	}

	/*
	 * Cache line size is used to size and align various
	 * structures used to communicate with the hardware.
	 */
	pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &csz);
	if (csz == 0) {
		/*
		 * Linux 2.4.18 (at least) writes the cache line size
		 * register as a 16-bit wide register which is wrong.
		 * We must have this setup properly for rx buffer
		 * DMA to work so force a reasonable value here if it
		 * comes up zero.
		 */
		csz = L1_CACHE_BYTES / sizeof(u32);
		pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, csz);
	}
	/*
	 * The default setting of latency timer yields poor results,
	 * set it to the value used by other systems. It may be worth
	 * tweaking this setting more.
	 */
	pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xa8);

	pci_set_master(pdev);

297 298 299 300 301 302 303 304
	/*
	 * Disable the RETRY_TIMEOUT register (0x41) to keep
	 * PCI Tx retries from interfering with C3 CPU state.
	 */
	pci_read_config_dword(pdev, 0x40, &val);
	if ((val & 0x0000ff00) != 0)
		pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);

305
	ret = pcim_iomap_regions(pdev, BIT(0), "ath9k");
306 307
	if (ret) {
		dev_err(&pdev->dev, "PCI memory region reserve error\n");
308
		return -ENODEV;
309 310
	}

311
	hw = ieee80211_alloc_hw(sizeof(struct ath_softc), &ath9k_ops);
312
	if (!hw) {
S
Sujith 已提交
313
		dev_err(&pdev->dev, "No memory for ieee80211_hw\n");
314
		return -ENOMEM;
315 316 317 318 319
	}

	SET_IEEE80211_DEV(hw, &pdev->dev);
	pci_set_drvdata(pdev, hw);

320
	sc = hw->priv;
321 322
	sc->hw = hw;
	sc->dev = &pdev->dev;
323
	sc->mem = pcim_iomap_table(pdev)[0];
324
	sc->driver_data = id->driver_data;
325

S
Sujith 已提交
326
	/* Will be cleared in ath9k_start() */
S
Sujith Manoharan 已提交
327
	set_bit(SC_OP_INVALID, &sc->sc_flags);
328

329
	ret = request_irq(pdev->irq, ath_isr, IRQF_SHARED, "ath9k", sc);
330 331
	if (ret) {
		dev_err(&pdev->dev, "request_irq failed\n");
S
Sujith 已提交
332
		goto err_irq;
333 334 335 336
	}

	sc->irq = pdev->irq;

337
	ret = ath9k_init_device(id->device, sc, &ath_pci_bus_ops);
S
Sujith 已提交
338 339 340 341 342 343
	if (ret) {
		dev_err(&pdev->dev, "Failed to initialize device\n");
		goto err_init;
	}

	ath9k_hw_name(sc->sc_ah, hw_name, sizeof(hw_name));
344
	wiphy_info(hw->wiphy, "%s mem=0x%lx, irq=%d\n",
345
		   hw_name, (unsigned long)sc->mem, pdev->irq);
346 347

	return 0;
S
Sujith 已提交
348 349 350 351

err_init:
	free_irq(sc->irq, sc);
err_irq:
352 353 354 355 356 357 358
	ieee80211_free_hw(hw);
	return ret;
}

static void ath_pci_remove(struct pci_dev *pdev)
{
	struct ieee80211_hw *hw = pci_get_drvdata(pdev);
359
	struct ath_softc *sc = hw->priv;
360

361 362
	if (!is_ath9k_unloaded)
		sc->sc_ah->ah_flags |= AH_UNPLUGGED;
S
Sujith 已提交
363 364 365
	ath9k_deinit_device(sc);
	free_irq(sc->irq, sc);
	ieee80211_free_hw(sc->hw);
366 367
}

H
Hauke Mehrtens 已提交
368
#ifdef CONFIG_PM_SLEEP
369

370
static int ath_pci_suspend(struct device *device)
371
{
372
	struct pci_dev *pdev = to_pci_dev(device);
373
	struct ieee80211_hw *hw = pci_get_drvdata(pdev);
374
	struct ath_softc *sc = hw->priv;
375

376 377 378
	if (sc->wow_enabled)
		return 0;

379 380 381 382
	/* The device has to be moved to FULLSLEEP forcibly.
	 * Otherwise the chip never moved to full sleep,
	 * when no interface is up.
	 */
383
	ath9k_stop_btcoex(sc);
F
Felix Fietkau 已提交
384
	ath9k_hw_disable(sc->sc_ah);
385 386
	ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);

387 388 389
	return 0;
}

390
static int ath_pci_resume(struct device *device)
391
{
392
	struct pci_dev *pdev = to_pci_dev(device);
393 394
	struct ieee80211_hw *hw = pci_get_drvdata(pdev);
	struct ath_softc *sc = hw->priv;
395 396
	struct ath_hw *ah = sc->sc_ah;
	struct ath_common *common = ath9k_hw_common(ah);
397
	u32 val;
S
Sujith 已提交
398

399 400 401 402 403 404 405 406
	/*
	 * Suspend/Resume resets the PCI configuration space, so we have to
	 * re-disable the RETRY_TIMEOUT register (0x41) to keep
	 * PCI Tx retries from interfering with C3 CPU state
	 */
	pci_read_config_dword(pdev, 0x40, &val);
	if ((val & 0x0000ff00) != 0)
		pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
407

408
	ath_pci_aspm_init(common);
409
	ah->reset_power_on = false;
410

411 412 413
	return 0;
}

H
Hauke Mehrtens 已提交
414
static SIMPLE_DEV_PM_OPS(ath9k_pm_ops, ath_pci_suspend, ath_pci_resume);
415 416 417

#define ATH9K_PM_OPS	(&ath9k_pm_ops)

H
Hauke Mehrtens 已提交
418
#else /* !CONFIG_PM_SLEEP */
419 420 421

#define ATH9K_PM_OPS	NULL

H
Hauke Mehrtens 已提交
422
#endif /* !CONFIG_PM_SLEEP */
423

424 425 426 427 428 429 430 431

MODULE_DEVICE_TABLE(pci, ath_pci_id_table);

static struct pci_driver ath_pci_driver = {
	.name       = "ath9k",
	.id_table   = ath_pci_id_table,
	.probe      = ath_pci_probe,
	.remove     = ath_pci_remove,
432
	.driver.pm  = ATH9K_PM_OPS,
433 434
};

S
Sujith 已提交
435
int ath_pci_init(void)
436 437 438 439 440 441 442 443
{
	return pci_register_driver(&ath_pci_driver);
}

void ath_pci_exit(void)
{
	pci_unregister_driver(&ath_pci_driver);
}