core.c 30.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * Copyright (c) 2005-2011 Atheros Communications Inc.
 * Copyright (c) 2011-2013 Qualcomm Atheros, Inc.
 *
 * 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.
 */

#include <linux/module.h>
#include <linux/firmware.h>
20
#include <linux/of.h>
21 22 23 24 25 26 27 28 29

#include "core.h"
#include "mac.h"
#include "htc.h"
#include "hif.h"
#include "wmi.h"
#include "bmi.h"
#include "debug.h"
#include "htt.h"
K
Kalle Valo 已提交
30
#include "testmode.h"
31 32 33 34

unsigned int ath10k_debug_mask;
static bool uart_print;
static unsigned int ath10k_p2p;
35 36
static bool skip_otp;

37 38 39
module_param_named(debug_mask, ath10k_debug_mask, uint, 0644);
module_param(uart_print, bool, 0644);
module_param_named(p2p, ath10k_p2p, uint, 0644);
40 41
module_param(skip_otp, bool, 0644);

42 43 44
MODULE_PARM_DESC(debug_mask, "Debugging mask");
MODULE_PARM_DESC(uart_print, "Uart target debugging");
MODULE_PARM_DESC(p2p, "Enable ath10k P2P support");
45
MODULE_PARM_DESC(skip_otp, "Skip otp failure for calibration in testmode");
46 47 48 49 50 51 52 53 54 55 56

static const struct ath10k_hw_params ath10k_hw_params_list[] = {
	{
		.id = QCA988X_HW_2_0_VERSION,
		.name = "qca988x hw2.0",
		.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
		.fw = {
			.dir = QCA988X_HW_2_0_FW_DIR,
			.fw = QCA988X_HW_2_0_FW_FILE,
			.otp = QCA988X_HW_2_0_OTP_FILE,
			.board = QCA988X_HW_2_0_BOARD_DATA_FILE,
57 58
			.board_size = QCA988X_BOARD_DATA_SZ,
			.board_ext_size = QCA988X_BOARD_EXT_DATA_SZ,
59 60 61 62 63 64
		},
	},
};

static void ath10k_send_suspend_complete(struct ath10k *ar)
{
65
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot suspend complete\n");
66

67
	complete(&ar->target_suspend);
68 69 70 71 72 73 74 75 76 77 78
}

static int ath10k_init_configure_target(struct ath10k *ar)
{
	u32 param_host;
	int ret;

	/* tell target which HTC version it is used*/
	ret = ath10k_bmi_write32(ar, hi_app_host_interest,
				 HTC_PROTOCOL_VERSION);
	if (ret) {
79
		ath10k_err(ar, "settings HTC version failed\n");
80 81 82 83 84 85
		return ret;
	}

	/* set the firmware mode to STA/IBSS/AP */
	ret = ath10k_bmi_read32(ar, hi_option_flag, &param_host);
	if (ret) {
86
		ath10k_err(ar, "setting firmware mode (1/2) failed\n");
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
		return ret;
	}

	/* TODO following parameters need to be re-visited. */
	/* num_device */
	param_host |= (1 << HI_OPTION_NUM_DEV_SHIFT);
	/* Firmware mode */
	/* FIXME: Why FW_MODE_AP ??.*/
	param_host |= (HI_OPTION_FW_MODE_AP << HI_OPTION_FW_MODE_SHIFT);
	/* mac_addr_method */
	param_host |= (1 << HI_OPTION_MAC_ADDR_METHOD_SHIFT);
	/* firmware_bridge */
	param_host |= (0 << HI_OPTION_FW_BRIDGE_SHIFT);
	/* fwsubmode */
	param_host |= (0 << HI_OPTION_FW_SUBMODE_SHIFT);

	ret = ath10k_bmi_write32(ar, hi_option_flag, param_host);
	if (ret) {
105
		ath10k_err(ar, "setting firmware mode (2/2) failed\n");
106 107 108 109 110 111
		return ret;
	}

	/* We do all byte-swapping on the host */
	ret = ath10k_bmi_write32(ar, hi_be, 0);
	if (ret) {
112
		ath10k_err(ar, "setting host CPU BE mode failed\n");
113 114 115 116 117 118 119
		return ret;
	}

	/* FW descriptor/Data swap flags */
	ret = ath10k_bmi_write32(ar, hi_fw_swap, 0);

	if (ret) {
120
		ath10k_err(ar, "setting FW data/desc swap flags failed\n");
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
		return ret;
	}

	return 0;
}

static const struct firmware *ath10k_fetch_fw_file(struct ath10k *ar,
						   const char *dir,
						   const char *file)
{
	char filename[100];
	const struct firmware *fw;
	int ret;

	if (file == NULL)
		return ERR_PTR(-ENOENT);

	if (dir == NULL)
		dir = ".";

	snprintf(filename, sizeof(filename), "%s/%s", dir, file);
	ret = request_firmware(&fw, filename, ar->dev);
	if (ret)
		return ERR_PTR(ret);

	return fw;
}

149 150
static int ath10k_push_board_ext_data(struct ath10k *ar, const void *data,
				      size_t data_len)
151
{
152 153
	u32 board_data_size = ar->hw_params.fw.board_size;
	u32 board_ext_data_size = ar->hw_params.fw.board_ext_size;
154 155 156 157 158
	u32 board_ext_data_addr;
	int ret;

	ret = ath10k_bmi_read32(ar, hi_board_ext_data, &board_ext_data_addr);
	if (ret) {
159 160
		ath10k_err(ar, "could not read board ext data addr (%d)\n",
			   ret);
161 162 163
		return ret;
	}

164
	ath10k_dbg(ar, ATH10K_DBG_BOOT,
165
		   "boot push board extended data addr 0x%x\n",
166 167 168 169 170
		   board_ext_data_addr);

	if (board_ext_data_addr == 0)
		return 0;

171
	if (data_len != (board_data_size + board_ext_data_size)) {
172
		ath10k_err(ar, "invalid board (ext) data sizes %zu != %d+%d\n",
173
			   data_len, board_data_size, board_ext_data_size);
174 175 176 177
		return -EINVAL;
	}

	ret = ath10k_bmi_write_memory(ar, board_ext_data_addr,
178
				      data + board_data_size,
179 180
				      board_ext_data_size);
	if (ret) {
181
		ath10k_err(ar, "could not write board ext data (%d)\n", ret);
182 183 184 185 186 187
		return ret;
	}

	ret = ath10k_bmi_write32(ar, hi_board_ext_data_config,
				 (board_ext_data_size << 16) | 1);
	if (ret) {
188 189
		ath10k_err(ar, "could not write board ext data bit (%d)\n",
			   ret);
190 191 192 193 194 195
		return ret;
	}

	return 0;
}

196 197
static int ath10k_download_board_data(struct ath10k *ar, const void *data,
				      size_t data_len)
198
{
199
	u32 board_data_size = ar->hw_params.fw.board_size;
200 201 202
	u32 address;
	int ret;

203
	ret = ath10k_push_board_ext_data(ar, data, data_len);
204
	if (ret) {
205
		ath10k_err(ar, "could not push board ext data (%d)\n", ret);
206 207 208 209 210
		goto exit;
	}

	ret = ath10k_bmi_read32(ar, hi_board_data, &address);
	if (ret) {
211
		ath10k_err(ar, "could not read board data addr (%d)\n", ret);
212 213 214
		goto exit;
	}

215
	ret = ath10k_bmi_write_memory(ar, address, data,
216
				      min_t(u32, board_data_size,
217
					    data_len));
218
	if (ret) {
219
		ath10k_err(ar, "could not write board data (%d)\n", ret);
220 221 222 223 224
		goto exit;
	}

	ret = ath10k_bmi_write32(ar, hi_board_data_initialized, 1);
	if (ret) {
225
		ath10k_err(ar, "could not write board data bit (%d)\n", ret);
226 227 228 229 230 231 232
		goto exit;
	}

exit:
	return ret;
}

233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254
static int ath10k_download_cal_file(struct ath10k *ar)
{
	int ret;

	if (!ar->cal_file)
		return -ENOENT;

	if (IS_ERR(ar->cal_file))
		return PTR_ERR(ar->cal_file);

	ret = ath10k_download_board_data(ar, ar->cal_file->data,
					 ar->cal_file->size);
	if (ret) {
		ath10k_err(ar, "failed to download cal_file data: %d\n", ret);
		return ret;
	}

	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cal file downloaded\n");

	return 0;
}

255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 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 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311
static int ath10k_download_cal_dt(struct ath10k *ar)
{
	struct device_node *node;
	int data_len;
	void *data;
	int ret;

	node = ar->dev->of_node;
	if (!node)
		/* Device Tree is optional, don't print any warnings if
		 * there's no node for ath10k.
		 */
		return -ENOENT;

	if (!of_get_property(node, "qcom,ath10k-calibration-data",
			     &data_len)) {
		/* The calibration data node is optional */
		return -ENOENT;
	}

	if (data_len != QCA988X_CAL_DATA_LEN) {
		ath10k_warn(ar, "invalid calibration data length in DT: %d\n",
			    data_len);
		ret = -EMSGSIZE;
		goto out;
	}

	data = kmalloc(data_len, GFP_KERNEL);
	if (!data) {
		ret = -ENOMEM;
		goto out;
	}

	ret = of_property_read_u8_array(node, "qcom,ath10k-calibration-data",
					data, data_len);
	if (ret) {
		ath10k_warn(ar, "failed to read calibration data from DT: %d\n",
			    ret);
		goto out_free;
	}

	ret = ath10k_download_board_data(ar, data, data_len);
	if (ret) {
		ath10k_warn(ar, "failed to download calibration data from Device Tree: %d\n",
			    ret);
		goto out_free;
	}

	ret = 0;

out_free:
	kfree(data);

out:
	return ret;
}

312 313
static int ath10k_download_and_run_otp(struct ath10k *ar)
{
314
	u32 result, address = ar->hw_params.patch_load_addr;
315 316
	int ret;

317
	ret = ath10k_download_board_data(ar, ar->board_data, ar->board_len);
318 319 320 321 322
	if (ret) {
		ath10k_err(ar, "failed to download board data: %d\n", ret);
		return ret;
	}

323 324
	/* OTP is optional */

K
Kalle Valo 已提交
325
	if (!ar->otp_data || !ar->otp_len) {
326
		ath10k_warn(ar, "Not running otp, calibration will be incorrect (otp-data %p otp_len %zd)!\n",
327
			    ar->otp_data, ar->otp_len);
328
		return 0;
K
Kalle Valo 已提交
329 330
	}

331
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot upload otp to 0x%x len %zd\n",
K
Kalle Valo 已提交
332
		   address, ar->otp_len);
333

334
	ret = ath10k_bmi_fast_download(ar, address, ar->otp_data, ar->otp_len);
335
	if (ret) {
336
		ath10k_err(ar, "could not write otp (%d)\n", ret);
K
Kalle Valo 已提交
337
		return ret;
338 339
	}

340
	ret = ath10k_bmi_execute(ar, address, 0, &result);
341
	if (ret) {
342
		ath10k_err(ar, "could not execute otp (%d)\n", ret);
K
Kalle Valo 已提交
343
		return ret;
344 345
	}

346
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot otp execute result %d\n", result);
K
Kalle Valo 已提交
347

348
	if (!skip_otp && result != 0) {
349
		ath10k_err(ar, "otp calibration failed: %d", result);
K
Kalle Valo 已提交
350 351 352 353
		return -EINVAL;
	}

	return 0;
354 355
}

K
Kalle Valo 已提交
356
static int ath10k_download_fw(struct ath10k *ar, enum ath10k_firmware_mode mode)
357
{
K
Kalle Valo 已提交
358 359 360
	u32 address, data_len;
	const char *mode_name;
	const void *data;
361 362 363 364
	int ret;

	address = ar->hw_params.patch_load_addr;

K
Kalle Valo 已提交
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385
	switch (mode) {
	case ATH10K_FIRMWARE_MODE_NORMAL:
		data = ar->firmware_data;
		data_len = ar->firmware_len;
		mode_name = "normal";
		break;
	case ATH10K_FIRMWARE_MODE_UTF:
		data = ar->testmode.utf->data;
		data_len = ar->testmode.utf->size;
		mode_name = "utf";
		break;
	default:
		ath10k_err(ar, "unknown firmware mode: %d\n", mode);
		return -EINVAL;
	}

	ath10k_dbg(ar, ATH10K_DBG_BOOT,
		   "boot uploading firmware image %p len %d mode %s\n",
		   data, data_len, mode_name);

	ret = ath10k_bmi_fast_download(ar, address, data, data_len);
386
	if (ret) {
K
Kalle Valo 已提交
387 388 389
		ath10k_err(ar, "failed to download %s firmware: %d\n",
			   mode_name, ret);
		return ret;
390 391
	}

392 393 394 395 396
	return ret;
}

static void ath10k_core_free_firmware_files(struct ath10k *ar)
{
397 398
	if (ar->board && !IS_ERR(ar->board))
		release_firmware(ar->board);
399 400 401 402 403 404 405

	if (ar->otp && !IS_ERR(ar->otp))
		release_firmware(ar->otp);

	if (ar->firmware && !IS_ERR(ar->firmware))
		release_firmware(ar->firmware);

406 407 408
	if (ar->cal_file && !IS_ERR(ar->cal_file))
		release_firmware(ar->cal_file);

409
	ar->board = NULL;
410 411 412
	ar->board_data = NULL;
	ar->board_len = 0;

413
	ar->otp = NULL;
414 415 416
	ar->otp_data = NULL;
	ar->otp_len = 0;

417
	ar->firmware = NULL;
418 419
	ar->firmware_data = NULL;
	ar->firmware_len = 0;
420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440

	ar->cal_file = NULL;
}

static int ath10k_fetch_cal_file(struct ath10k *ar)
{
	char filename[100];

	/* cal-<bus>-<id>.bin */
	scnprintf(filename, sizeof(filename), "cal-%s-%s.bin",
		  ath10k_bus_str(ar->hif.bus), dev_name(ar->dev));

	ar->cal_file = ath10k_fetch_fw_file(ar, ATH10K_FW_DIR, filename);
	if (IS_ERR(ar->cal_file))
		/* calibration file is optional, don't print any warnings */
		return PTR_ERR(ar->cal_file);

	ath10k_dbg(ar, ATH10K_DBG_BOOT, "found calibration file %s/%s\n",
		   ATH10K_FW_DIR, filename);

	return 0;
441 442
}

443
static int ath10k_core_fetch_firmware_api_1(struct ath10k *ar)
444 445 446 447
{
	int ret = 0;

	if (ar->hw_params.fw.fw == NULL) {
448
		ath10k_err(ar, "firmware file not defined\n");
449 450 451 452
		return -EINVAL;
	}

	if (ar->hw_params.fw.board == NULL) {
453
		ath10k_err(ar, "board data file not defined");
454 455 456
		return -EINVAL;
	}

457 458 459 460 461
	ar->board = ath10k_fetch_fw_file(ar,
					 ar->hw_params.fw.dir,
					 ar->hw_params.fw.board);
	if (IS_ERR(ar->board)) {
		ret = PTR_ERR(ar->board);
462
		ath10k_err(ar, "could not fetch board data (%d)\n", ret);
463 464 465
		goto err;
	}

466 467 468
	ar->board_data = ar->board->data;
	ar->board_len = ar->board->size;

469 470 471 472 473
	ar->firmware = ath10k_fetch_fw_file(ar,
					    ar->hw_params.fw.dir,
					    ar->hw_params.fw.fw);
	if (IS_ERR(ar->firmware)) {
		ret = PTR_ERR(ar->firmware);
474
		ath10k_err(ar, "could not fetch firmware (%d)\n", ret);
475 476 477
		goto err;
	}

478 479 480
	ar->firmware_data = ar->firmware->data;
	ar->firmware_len = ar->firmware->size;

481 482 483 484 485 486 487 488 489
	/* OTP may be undefined. If so, don't fetch it at all */
	if (ar->hw_params.fw.otp == NULL)
		return 0;

	ar->otp = ath10k_fetch_fw_file(ar,
				       ar->hw_params.fw.dir,
				       ar->hw_params.fw.otp);
	if (IS_ERR(ar->otp)) {
		ret = PTR_ERR(ar->otp);
490
		ath10k_err(ar, "could not fetch otp (%d)\n", ret);
491 492 493
		goto err;
	}

494 495 496
	ar->otp_data = ar->otp->data;
	ar->otp_len = ar->otp->size;

497 498 499 500
	return 0;

err:
	ath10k_core_free_firmware_files(ar);
501 502 503
	return ret;
}

504 505 506 507 508 509 510 511 512 513 514
static int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name)
{
	size_t magic_len, len, ie_len;
	int ie_id, i, index, bit, ret;
	struct ath10k_fw_ie *hdr;
	const u8 *data;
	__le32 *timestamp;

	/* first fetch the firmware file (firmware-*.bin) */
	ar->firmware = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir, name);
	if (IS_ERR(ar->firmware)) {
515
		ath10k_err(ar, "could not fetch firmware file '%s/%s': %ld\n",
516
			   ar->hw_params.fw.dir, name, PTR_ERR(ar->firmware));
517 518 519 520 521 522 523 524 525 526
		return PTR_ERR(ar->firmware);
	}

	data = ar->firmware->data;
	len = ar->firmware->size;

	/* magic also includes the null byte, check that as well */
	magic_len = strlen(ATH10K_FIRMWARE_MAGIC) + 1;

	if (len < magic_len) {
527
		ath10k_err(ar, "firmware file '%s/%s' too small to contain magic: %zu\n",
528
			   ar->hw_params.fw.dir, name, len);
529 530
		ret = -EINVAL;
		goto err;
531 532 533
	}

	if (memcmp(data, ATH10K_FIRMWARE_MAGIC, magic_len) != 0) {
534
		ath10k_err(ar, "invalid firmware magic\n");
535 536
		ret = -EINVAL;
		goto err;
537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555
	}

	/* jump over the padding */
	magic_len = ALIGN(magic_len, 4);

	len -= magic_len;
	data += magic_len;

	/* loop elements */
	while (len > sizeof(struct ath10k_fw_ie)) {
		hdr = (struct ath10k_fw_ie *)data;

		ie_id = le32_to_cpu(hdr->id);
		ie_len = le32_to_cpu(hdr->len);

		len -= sizeof(*hdr);
		data += sizeof(*hdr);

		if (len < ie_len) {
556
			ath10k_err(ar, "invalid length for FW IE %d (%zu < %zu)\n",
557
				   ie_id, len, ie_len);
558 559
			ret = -EINVAL;
			goto err;
560 561 562 563 564 565 566 567 568 569
		}

		switch (ie_id) {
		case ATH10K_FW_IE_FW_VERSION:
			if (ie_len > sizeof(ar->hw->wiphy->fw_version) - 1)
				break;

			memcpy(ar->hw->wiphy->fw_version, data, ie_len);
			ar->hw->wiphy->fw_version[ie_len] = '\0';

570
			ath10k_dbg(ar, ATH10K_DBG_BOOT,
571 572 573 574 575 576 577 578 579
				   "found fw version %s\n",
				    ar->hw->wiphy->fw_version);
			break;
		case ATH10K_FW_IE_TIMESTAMP:
			if (ie_len != sizeof(u32))
				break;

			timestamp = (__le32 *)data;

580
			ath10k_dbg(ar, ATH10K_DBG_BOOT, "found fw timestamp %d\n",
581 582 583
				   le32_to_cpup(timestamp));
			break;
		case ATH10K_FW_IE_FEATURES:
584
			ath10k_dbg(ar, ATH10K_DBG_BOOT,
585 586 587 588 589 590 591 592 593 594
				   "found firmware features ie (%zd B)\n",
				   ie_len);

			for (i = 0; i < ATH10K_FW_FEATURE_COUNT; i++) {
				index = i / 8;
				bit = i % 8;

				if (index == ie_len)
					break;

595
				if (data[index] & (1 << bit)) {
596
					ath10k_dbg(ar, ATH10K_DBG_BOOT,
597 598
						   "Enabling feature bit: %i\n",
						   i);
599
					__set_bit(i, ar->fw_features);
600
				}
601 602
			}

603
			ath10k_dbg_dump(ar, ATH10K_DBG_BOOT, "features", "",
604 605 606 607
					ar->fw_features,
					sizeof(ar->fw_features));
			break;
		case ATH10K_FW_IE_FW_IMAGE:
608
			ath10k_dbg(ar, ATH10K_DBG_BOOT,
609 610 611 612 613 614 615 616
				   "found fw image ie (%zd B)\n",
				   ie_len);

			ar->firmware_data = data;
			ar->firmware_len = ie_len;

			break;
		case ATH10K_FW_IE_OTP_IMAGE:
617
			ath10k_dbg(ar, ATH10K_DBG_BOOT,
618 619 620 621 622 623 624 625
				   "found otp image ie (%zd B)\n",
				   ie_len);

			ar->otp_data = data;
			ar->otp_len = ie_len;

			break;
		default:
626
			ath10k_warn(ar, "Unknown FW IE: %u\n",
627 628 629 630 631 632 633 634 635
				    le32_to_cpu(hdr->id));
			break;
		}

		/* jump over the padding */
		ie_len = ALIGN(ie_len, 4);

		len -= ie_len;
		data += ie_len;
636
	}
637 638

	if (!ar->firmware_data || !ar->firmware_len) {
639
		ath10k_warn(ar, "No ATH10K_FW_IE_FW_IMAGE found from '%s/%s', skipping\n",
640
			    ar->hw_params.fw.dir, name);
641 642 643 644
		ret = -ENOMEDIUM;
		goto err;
	}

645 646
	if (test_bit(ATH10K_FW_FEATURE_WMI_10_2, ar->fw_features) &&
	    !test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
647
		ath10k_err(ar, "feature bits corrupted: 10.2 feature requires 10.x feature to be set as well");
648 649 650 651
		ret = -EINVAL;
		goto err;
	}

652 653
	/* now fetch the board file */
	if (ar->hw_params.fw.board == NULL) {
654
		ath10k_err(ar, "board data file not defined");
655 656 657 658 659 660 661 662 663
		ret = -EINVAL;
		goto err;
	}

	ar->board = ath10k_fetch_fw_file(ar,
					 ar->hw_params.fw.dir,
					 ar->hw_params.fw.board);
	if (IS_ERR(ar->board)) {
		ret = PTR_ERR(ar->board);
664
		ath10k_err(ar, "could not fetch board data '%s/%s' (%d)\n",
665 666
			   ar->hw_params.fw.dir, ar->hw_params.fw.board,
			   ret);
667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683
		goto err;
	}

	ar->board_data = ar->board->data;
	ar->board_len = ar->board->size;

	return 0;

err:
	ath10k_core_free_firmware_files(ar);
	return ret;
}

static int ath10k_core_fetch_firmware_files(struct ath10k *ar)
{
	int ret;

684 685 686
	/* calibration file is optional, don't check for any errors */
	ath10k_fetch_cal_file(ar);

687
	ar->fw_api = 3;
688
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
689 690 691 692 693

	ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_API3_FILE);
	if (ret == 0)
		goto success;

694
	ar->fw_api = 2;
695
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
696

697
	ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_API2_FILE);
698 699 700 701
	if (ret == 0)
		goto success;

	ar->fw_api = 1;
702
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
703 704 705 706 707

	ret = ath10k_core_fetch_firmware_api_1(ar);
	if (ret)
		return ret;

708
success:
709
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "using fw api %d\n", ar->fw_api);
710 711 712 713

	return 0;
}

714
static int ath10k_download_cal_data(struct ath10k *ar)
715 716 717
{
	int ret;

718 719 720 721 722 723 724
	ret = ath10k_download_cal_file(ar);
	if (ret == 0) {
		ar->cal_mode = ATH10K_CAL_MODE_FILE;
		goto done;
	}

	ath10k_dbg(ar, ATH10K_DBG_BOOT,
725 726 727 728 729 730 731 732 733 734 735
		   "boot did not find a calibration file, try DT next: %d\n",
		   ret);

	ret = ath10k_download_cal_dt(ar);
	if (ret == 0) {
		ar->cal_mode = ATH10K_CAL_MODE_DT;
		goto done;
	}

	ath10k_dbg(ar, ATH10K_DBG_BOOT,
		   "boot did not find DT entry, try OTP next: %d\n",
736 737
		   ret);

738
	ret = ath10k_download_and_run_otp(ar);
739
	if (ret) {
740
		ath10k_err(ar, "failed to run otp: %d\n", ret);
741
		return ret;
742
	}
743

744 745 746 747 748 749
	ar->cal_mode = ATH10K_CAL_MODE_OTP;

done:
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot using calibration mode %s\n",
		   ath10k_cal_mode_str(ar->cal_mode));
	return 0;
750 751 752 753 754 755 756 757 758 759 760 761
}

static int ath10k_init_uart(struct ath10k *ar)
{
	int ret;

	/*
	 * Explicitly setting UART prints to zero as target turns it on
	 * based on scratch registers.
	 */
	ret = ath10k_bmi_write32(ar, hi_serial_enable, 0);
	if (ret) {
762
		ath10k_warn(ar, "could not disable UART prints (%d)\n", ret);
763 764 765
		return ret;
	}

766
	if (!uart_print)
767 768 769 770
		return 0;

	ret = ath10k_bmi_write32(ar, hi_dbg_uart_txpin, 7);
	if (ret) {
771
		ath10k_warn(ar, "could not enable UART prints (%d)\n", ret);
772 773 774 775 776
		return ret;
	}

	ret = ath10k_bmi_write32(ar, hi_serial_enable, 1);
	if (ret) {
777
		ath10k_warn(ar, "could not enable UART prints (%d)\n", ret);
778 779 780
		return ret;
	}

781 782 783
	/* Set the UART baud rate to 19200. */
	ret = ath10k_bmi_write32(ar, hi_desired_baud_rate, 19200);
	if (ret) {
784
		ath10k_warn(ar, "could not set the baud rate (%d)\n", ret);
785 786 787
		return ret;
	}

788
	ath10k_info(ar, "UART prints enabled\n");
789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
	return 0;
}

static int ath10k_init_hw_params(struct ath10k *ar)
{
	const struct ath10k_hw_params *uninitialized_var(hw_params);
	int i;

	for (i = 0; i < ARRAY_SIZE(ath10k_hw_params_list); i++) {
		hw_params = &ath10k_hw_params_list[i];

		if (hw_params->id == ar->target_version)
			break;
	}

	if (i == ARRAY_SIZE(ath10k_hw_params_list)) {
805
		ath10k_err(ar, "Unsupported hardware version: 0x%x\n",
806 807 808 809 810 811
			   ar->target_version);
		return -EINVAL;
	}

	ar->hw_params = *hw_params;

812
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "Hardware name %s version 0x%x\n",
813
		   ar->hw_params.name, ar->target_version);
814 815 816 817

	return 0;
}

818 819 820 821
static void ath10k_core_restart(struct work_struct *work)
{
	struct ath10k *ar = container_of(work, struct ath10k, restart_work);

M
Michal Kazior 已提交
822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840
	set_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);

	/* Place a barrier to make sure the compiler doesn't reorder
	 * CRASH_FLUSH and calling other functions.
	 */
	barrier();

	ieee80211_stop_queues(ar->hw);
	ath10k_drain_tx(ar);
	complete_all(&ar->scan.started);
	complete_all(&ar->scan.completed);
	complete_all(&ar->scan.on_channel);
	complete_all(&ar->offchan_tx_completed);
	complete_all(&ar->install_key_done);
	complete_all(&ar->vdev_setup_done);
	wake_up(&ar->htt.empty_tx_wq);
	wake_up(&ar->wmi.tx_credits_wq);
	wake_up(&ar->peer_mapping_wq);

841 842 843 844 845
	mutex_lock(&ar->conf_mutex);

	switch (ar->state) {
	case ATH10K_STATE_ON:
		ar->state = ATH10K_STATE_RESTARTING;
846
		ath10k_hif_stop(ar);
847
		ath10k_scan_finish(ar);
848 849 850
		ieee80211_restart_hw(ar->hw);
		break;
	case ATH10K_STATE_OFF:
851 852
		/* this can happen if driver is being unloaded
		 * or if the crash happens during FW probing */
853
		ath10k_warn(ar, "cannot restart a device that hasn't been started\n");
854 855
		break;
	case ATH10K_STATE_RESTARTING:
856 857
		/* hw restart might be requested from multiple places */
		break;
858 859 860 861
	case ATH10K_STATE_RESTARTED:
		ar->state = ATH10K_STATE_WEDGED;
		/* fall through */
	case ATH10K_STATE_WEDGED:
862
		ath10k_warn(ar, "device is wedged, will not restart\n");
863
		break;
K
Kalle Valo 已提交
864 865 866
	case ATH10K_STATE_UTF:
		ath10k_warn(ar, "firmware restart in UTF mode not supported\n");
		break;
867 868 869 870 871
	}

	mutex_unlock(&ar->conf_mutex);
}

872 873 874 875 876 877 878 879 880 881 882
static void ath10k_core_init_max_sta_count(struct ath10k *ar)
{
	if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
		ar->max_num_peers = TARGET_10X_NUM_PEERS;
		ar->max_num_stations = TARGET_10X_NUM_STATIONS;
	} else {
		ar->max_num_peers = TARGET_NUM_PEERS;
		ar->max_num_stations = TARGET_NUM_STATIONS;
	}
}

K
Kalle Valo 已提交
883
int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode)
884 885 886
{
	int status;

887 888
	lockdep_assert_held(&ar->conf_mutex);

M
Michal Kazior 已提交
889 890
	clear_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);

891 892
	ath10k_bmi_start(ar);

893 894 895 896 897
	if (ath10k_init_configure_target(ar)) {
		status = -EINVAL;
		goto err;
	}

898 899 900 901 902
	status = ath10k_download_cal_data(ar);
	if (status)
		goto err;

	status = ath10k_download_fw(ar, mode);
903 904 905 906 907 908 909
	if (status)
		goto err;

	status = ath10k_init_uart(ar);
	if (status)
		goto err;

910 911
	ar->htc.htc_ops.target_send_suspend_complete =
		ath10k_send_suspend_complete;
912

913 914
	status = ath10k_htc_init(ar);
	if (status) {
915
		ath10k_err(ar, "could not init HTC (%d)\n", status);
916 917 918 919 920
		goto err;
	}

	status = ath10k_bmi_done(ar);
	if (status)
921
		goto err;
922 923 924

	status = ath10k_wmi_attach(ar);
	if (status) {
925
		ath10k_err(ar, "WMI attach failed: %d\n", status);
926
		goto err;
927 928
	}

M
Michal Kazior 已提交
929 930
	status = ath10k_htt_init(ar);
	if (status) {
931
		ath10k_err(ar, "failed to init htt: %d\n", status);
M
Michal Kazior 已提交
932 933 934 935 936
		goto err_wmi_detach;
	}

	status = ath10k_htt_tx_alloc(&ar->htt);
	if (status) {
937
		ath10k_err(ar, "failed to alloc htt tx: %d\n", status);
M
Michal Kazior 已提交
938 939 940 941 942
		goto err_wmi_detach;
	}

	status = ath10k_htt_rx_alloc(&ar->htt);
	if (status) {
943
		ath10k_err(ar, "failed to alloc htt rx: %d\n", status);
M
Michal Kazior 已提交
944 945 946
		goto err_htt_tx_detach;
	}

M
Michal Kazior 已提交
947 948
	status = ath10k_hif_start(ar);
	if (status) {
949
		ath10k_err(ar, "could not start HIF: %d\n", status);
M
Michal Kazior 已提交
950
		goto err_htt_rx_detach;
M
Michal Kazior 已提交
951 952 953 954
	}

	status = ath10k_htc_wait_target(&ar->htc);
	if (status) {
955
		ath10k_err(ar, "failed to connect to HTC: %d\n", status);
M
Michal Kazior 已提交
956 957
		goto err_hif_stop;
	}
958

K
Kalle Valo 已提交
959 960 961 962 963 964
	if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
		status = ath10k_htt_connect(&ar->htt);
		if (status) {
			ath10k_err(ar, "failed to connect htt (%d)\n", status);
			goto err_hif_stop;
		}
965 966
	}

M
Michal Kazior 已提交
967 968
	status = ath10k_wmi_connect(ar);
	if (status) {
969
		ath10k_err(ar, "could not connect wmi: %d\n", status);
M
Michal Kazior 已提交
970 971 972 973 974
		goto err_hif_stop;
	}

	status = ath10k_htc_start(&ar->htc);
	if (status) {
975
		ath10k_err(ar, "failed to start htc: %d\n", status);
M
Michal Kazior 已提交
976 977 978
		goto err_hif_stop;
	}

K
Kalle Valo 已提交
979 980 981 982 983 984 985
	if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
		status = ath10k_wmi_wait_for_service_ready(ar);
		if (status <= 0) {
			ath10k_warn(ar, "wmi service ready event not received");
			status = -ETIMEDOUT;
			goto err_hif_stop;
		}
M
Michal Kazior 已提交
986
	}
987

988
	ath10k_dbg(ar, ATH10K_DBG_BOOT, "firmware %s booted\n",
989
		   ar->hw->wiphy->fw_version);
990 991 992

	status = ath10k_wmi_cmd_init(ar);
	if (status) {
993 994
		ath10k_err(ar, "could not send WMI init command (%d)\n",
			   status);
M
Michal Kazior 已提交
995
		goto err_hif_stop;
996 997 998 999
	}

	status = ath10k_wmi_wait_for_unified_ready(ar);
	if (status <= 0) {
1000
		ath10k_err(ar, "wmi unified ready event not received\n");
1001
		status = -ETIMEDOUT;
M
Michal Kazior 已提交
1002
		goto err_hif_stop;
1003 1004
	}

K
Kalle Valo 已提交
1005 1006 1007 1008 1009 1010 1011
	/* we don't care about HTT in UTF mode */
	if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
		status = ath10k_htt_setup(&ar->htt);
		if (status) {
			ath10k_err(ar, "failed to setup htt: %d\n", status);
			goto err_hif_stop;
		}
M
Michal Kazior 已提交
1012
	}
1013

1014 1015
	status = ath10k_debug_start(ar);
	if (status)
M
Michal Kazior 已提交
1016
		goto err_hif_stop;
1017

1018
	if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
B
Ben Greear 已提交
1019
		ar->free_vdev_map = (1LL << TARGET_10X_NUM_VDEVS) - 1;
1020
	else
B
Ben Greear 已提交
1021
		ar->free_vdev_map = (1LL << TARGET_NUM_VDEVS) - 1;
1022

M
Michal Kazior 已提交
1023
	INIT_LIST_HEAD(&ar->arvifs);
1024

1025 1026
	return 0;

M
Michal Kazior 已提交
1027 1028
err_hif_stop:
	ath10k_hif_stop(ar);
M
Michal Kazior 已提交
1029 1030 1031 1032
err_htt_rx_detach:
	ath10k_htt_rx_free(&ar->htt);
err_htt_tx_detach:
	ath10k_htt_tx_free(&ar->htt);
1033 1034 1035 1036 1037
err_wmi_detach:
	ath10k_wmi_detach(ar);
err:
	return status;
}
1038
EXPORT_SYMBOL(ath10k_core_start);
1039

1040 1041 1042 1043 1044 1045 1046 1047
int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt)
{
	int ret;

	reinit_completion(&ar->target_suspend);

	ret = ath10k_wmi_pdev_suspend_target(ar, suspend_opt);
	if (ret) {
1048
		ath10k_warn(ar, "could not suspend target (%d)\n", ret);
1049 1050 1051 1052 1053 1054
		return ret;
	}

	ret = wait_for_completion_timeout(&ar->target_suspend, 1 * HZ);

	if (ret == 0) {
1055
		ath10k_warn(ar, "suspend timed out - target pause event never came\n");
1056 1057 1058 1059 1060 1061
		return -ETIMEDOUT;
	}

	return 0;
}

1062 1063
void ath10k_core_stop(struct ath10k *ar)
{
1064 1065
	lockdep_assert_held(&ar->conf_mutex);

1066
	/* try to suspend target */
K
Kalle Valo 已提交
1067 1068
	if (ar->state != ATH10K_STATE_RESTARTING &&
	    ar->state != ATH10K_STATE_UTF)
1069 1070
		ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND_AND_DISABLE_INTR);

1071
	ath10k_debug_stop(ar);
M
Michal Kazior 已提交
1072 1073 1074
	ath10k_hif_stop(ar);
	ath10k_htt_tx_free(&ar->htt);
	ath10k_htt_rx_free(&ar->htt);
1075 1076
	ath10k_wmi_detach(ar);
}
1077 1078 1079 1080 1081 1082 1083 1084
EXPORT_SYMBOL(ath10k_core_stop);

/* mac80211 manages fw/hw initialization through start/stop hooks. However in
 * order to know what hw capabilities should be advertised to mac80211 it is
 * necessary to load the firmware (and tear it down immediately since start
 * hook will try to init it again) before registering */
static int ath10k_core_probe_fw(struct ath10k *ar)
{
1085 1086
	struct bmi_target_info target_info;
	int ret = 0;
1087 1088 1089

	ret = ath10k_hif_power_up(ar);
	if (ret) {
1090
		ath10k_err(ar, "could not start pci hif (%d)\n", ret);
1091 1092 1093
		return ret;
	}

1094 1095 1096
	memset(&target_info, 0, sizeof(target_info));
	ret = ath10k_bmi_get_target_info(ar, &target_info);
	if (ret) {
1097
		ath10k_err(ar, "could not get target info (%d)\n", ret);
1098 1099 1100 1101 1102 1103 1104 1105 1106
		ath10k_hif_power_down(ar);
		return ret;
	}

	ar->target_version = target_info.version;
	ar->hw->wiphy->hw_version = target_info.version;

	ret = ath10k_init_hw_params(ar);
	if (ret) {
1107
		ath10k_err(ar, "could not get hw params (%d)\n", ret);
1108 1109 1110 1111 1112 1113
		ath10k_hif_power_down(ar);
		return ret;
	}

	ret = ath10k_core_fetch_firmware_files(ar);
	if (ret) {
1114
		ath10k_err(ar, "could not fetch firmware files (%d)\n", ret);
1115 1116 1117 1118
		ath10k_hif_power_down(ar);
		return ret;
	}

1119 1120
	ath10k_core_init_max_sta_count(ar);

1121 1122
	mutex_lock(&ar->conf_mutex);

K
Kalle Valo 已提交
1123
	ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
1124
	if (ret) {
1125
		ath10k_err(ar, "could not init core (%d)\n", ret);
1126
		ath10k_core_free_firmware_files(ar);
1127
		ath10k_hif_power_down(ar);
1128
		mutex_unlock(&ar->conf_mutex);
1129 1130 1131
		return ret;
	}

M
Michal Kazior 已提交
1132
	ath10k_print_driver_info(ar);
1133
	ath10k_core_stop(ar);
1134 1135 1136

	mutex_unlock(&ar->conf_mutex);

1137 1138 1139
	ath10k_hif_power_down(ar);
	return 0;
}
1140

1141
static void ath10k_core_register_work(struct work_struct *work)
1142
{
1143
	struct ath10k *ar = container_of(work, struct ath10k, register_work);
1144 1145
	int status;

1146 1147
	status = ath10k_core_probe_fw(ar);
	if (status) {
1148
		ath10k_err(ar, "could not probe fw (%d)\n", status);
1149
		goto err;
1150
	}
1151

1152
	status = ath10k_mac_register(ar);
1153
	if (status) {
1154
		ath10k_err(ar, "could not register to mac80211 (%d)\n", status);
1155
		goto err_release_fw;
1156
	}
1157

1158
	status = ath10k_debug_register(ar);
1159
	if (status) {
1160
		ath10k_err(ar, "unable to initialize debugfs\n");
1161 1162 1163
		goto err_unregister_mac;
	}

1164 1165
	status = ath10k_spectral_create(ar);
	if (status) {
1166
		ath10k_err(ar, "failed to initialize spectral\n");
1167 1168 1169
		goto err_debug_destroy;
	}

1170 1171
	set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags);
	return;
1172

1173 1174
err_debug_destroy:
	ath10k_debug_destroy(ar);
1175 1176
err_unregister_mac:
	ath10k_mac_unregister(ar);
1177 1178
err_release_fw:
	ath10k_core_free_firmware_files(ar);
1179
err:
1180 1181 1182
	/* TODO: It's probably a good idea to release device from the driver
	 * but calling device_release_driver() here will cause a deadlock.
	 */
1183 1184 1185 1186 1187 1188 1189 1190 1191
	return;
}

int ath10k_core_register(struct ath10k *ar, u32 chip_id)
{
	ar->chip_id = chip_id;
	queue_work(ar->workqueue, &ar->register_work);

	return 0;
1192 1193 1194 1195 1196
}
EXPORT_SYMBOL(ath10k_core_register);

void ath10k_core_unregister(struct ath10k *ar)
{
1197 1198 1199 1200 1201
	cancel_work_sync(&ar->register_work);

	if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
		return;

1202 1203 1204 1205 1206 1207
	/* Stop spectral before unregistering from mac80211 to remove the
	 * relayfs debugfs file cleanly. Otherwise the parent debugfs tree
	 * would be already be free'd recursively, leading to a double free.
	 */
	ath10k_spectral_destroy(ar);

1208 1209 1210 1211
	/* We must unregister from mac80211 before we stop HTC and HIF.
	 * Otherwise we will fail to submit commands to FW and mac80211 will be
	 * unhappy about callback failures. */
	ath10k_mac_unregister(ar);
1212

K
Kalle Valo 已提交
1213 1214
	ath10k_testmode_destroy(ar);

1215
	ath10k_core_free_firmware_files(ar);
1216

1217
	ath10k_debug_unregister(ar);
1218 1219 1220
}
EXPORT_SYMBOL(ath10k_core_unregister);

M
Michal Kazior 已提交
1221
struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
K
Kalle Valo 已提交
1222
				  enum ath10k_bus bus,
1223 1224 1225
				  const struct ath10k_hif_ops *hif_ops)
{
	struct ath10k *ar;
1226
	int ret;
1227

M
Michal Kazior 已提交
1228
	ar = ath10k_mac_create(priv_size);
1229 1230 1231 1232 1233 1234 1235 1236 1237 1238
	if (!ar)
		return NULL;

	ar->ath_common.priv = ar;
	ar->ath_common.hw = ar->hw;

	ar->p2p = !!ath10k_p2p;
	ar->dev = dev;

	ar->hif.ops = hif_ops;
K
Kalle Valo 已提交
1239
	ar->hif.bus = bus;
1240 1241 1242 1243 1244 1245 1246 1247 1248

	init_completion(&ar->scan.started);
	init_completion(&ar->scan.completed);
	init_completion(&ar->scan.on_channel);
	init_completion(&ar->target_suspend);

	init_completion(&ar->install_key_done);
	init_completion(&ar->vdev_setup_done);

1249
	INIT_DELAYED_WORK(&ar->scan.timeout, ath10k_scan_timeout_work);
1250 1251 1252

	ar->workqueue = create_singlethread_workqueue("ath10k_wq");
	if (!ar->workqueue)
1253
		goto err_free_mac;
1254 1255 1256 1257 1258 1259

	mutex_init(&ar->conf_mutex);
	spin_lock_init(&ar->data_lock);

	INIT_LIST_HEAD(&ar->peers);
	init_waitqueue_head(&ar->peer_mapping_wq);
M
Michal Kazior 已提交
1260 1261
	init_waitqueue_head(&ar->htt.empty_tx_wq);
	init_waitqueue_head(&ar->wmi.tx_credits_wq);
1262 1263 1264 1265 1266 1267 1268 1269

	init_completion(&ar->offchan_tx_completed);
	INIT_WORK(&ar->offchan_tx_work, ath10k_offchan_tx_work);
	skb_queue_head_init(&ar->offchan_tx_queue);

	INIT_WORK(&ar->wmi_mgmt_tx_work, ath10k_mgmt_over_wmi_tx_work);
	skb_queue_head_init(&ar->wmi_mgmt_tx_queue);

1270
	INIT_WORK(&ar->register_work, ath10k_core_register_work);
1271 1272
	INIT_WORK(&ar->restart_work, ath10k_core_restart);

1273 1274 1275 1276
	ret = ath10k_debug_create(ar);
	if (ret)
		goto err_free_wq;

1277 1278
	return ar;

1279 1280 1281 1282
err_free_wq:
	destroy_workqueue(ar->workqueue);

err_free_mac:
1283
	ath10k_mac_destroy(ar);
1284

1285 1286 1287 1288 1289 1290 1291 1292 1293
	return NULL;
}
EXPORT_SYMBOL(ath10k_core_create);

void ath10k_core_destroy(struct ath10k *ar)
{
	flush_workqueue(ar->workqueue);
	destroy_workqueue(ar->workqueue);

1294
	ath10k_debug_destroy(ar);
1295 1296 1297 1298
	ath10k_mac_destroy(ar);
}
EXPORT_SYMBOL(ath10k_core_destroy);

1299 1300 1301
MODULE_AUTHOR("Qualcomm Atheros");
MODULE_DESCRIPTION("Core module for QCA988X PCIe devices.");
MODULE_LICENSE("Dual BSD/GPL");