btmrvl_main.c 17.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
/**
 * Marvell Bluetooth driver
 *
 * Copyright (C) 2009, Marvell International Ltd.
 *
 * This software file (the "File") is distributed by Marvell International
 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
 * (the "License").  You may use, redistribute and/or modify this File in
 * accordance with the terms and conditions of the License, a copy of which
 * is available by writing to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA or on the
 * worldwide web at http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
 *
 *
 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
 * ARE EXPRESSLY DISCLAIMED.  The License provides additional details about
 * this warranty disclaimer.
 **/

21
#include <linux/module.h>
22
#include <linux/of.h>
23 24
#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
25
#include <linux/mmc/sdio_func.h>
26 27

#include "btmrvl_drv.h"
28
#include "btmrvl_sdio.h"
29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44

#define VERSION "1.0"

/*
 * This function is called by interface specific interrupt handler.
 * It updates Power Save & Host Sleep states, and wakes up the main
 * thread.
 */
void btmrvl_interrupt(struct btmrvl_private *priv)
{
	priv->adapter->ps_state = PS_AWAKE;

	priv->adapter->wakeup_tries = 0;

	priv->adapter->int_count++;

45
	if (priv->adapter->hs_state == HS_ACTIVATED) {
46
		BT_DBG("BT: HS DEACTIVATED in ISR!");
47 48 49
		priv->adapter->hs_state = HS_DEACTIVATED;
	}

50 51 52 53
	wake_up_interruptible(&priv->main_thread.wait_q);
}
EXPORT_SYMBOL_GPL(btmrvl_interrupt);

54
bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
55
{
56
	struct hci_event_hdr *hdr = (void *) skb->data;
57 58

	if (hdr->evt == HCI_EV_CMD_COMPLETE) {
59
		struct hci_ev_cmd_complete *ec;
60
		u16 opcode;
61

62
		ec = (void *) (skb->data + HCI_EVENT_HDR_SIZE);
63
		opcode = __le16_to_cpu(ec->opcode);
64

65
		if (priv->btmrvl_dev.sendcmdflag) {
66 67 68
			priv->btmrvl_dev.sendcmdflag = false;
			priv->adapter->cmd_complete = true;
			wake_up_interruptible(&priv->adapter->cmd_wait_q);
69

70 71 72 73 74 75
			if (hci_opcode_ogf(opcode) == 0x3F) {
				BT_DBG("vendor event skipped: opcode=%#4.4x",
				       opcode);
				kfree_skb(skb);
				return false;
			}
76
		}
77
	}
78 79

	return true;
80 81 82 83 84 85 86
}
EXPORT_SYMBOL_GPL(btmrvl_check_evtpkt);

int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb)
{
	struct btmrvl_adapter *adapter = priv->adapter;
	struct btmrvl_event *event;
87
	int ret = 0;
88 89 90 91 92 93 94 95 96

	event = (struct btmrvl_event *) skb->data;
	if (event->ec != 0xff) {
		BT_DBG("Not Marvell Event=%x", event->ec);
		ret = -EINVAL;
		goto exit;
	}

	switch (event->data[0]) {
97
	case BT_EVENT_AUTO_SLEEP_MODE:
98 99 100 101 102 103 104 105 106 107 108 109
		if (!event->data[2]) {
			if (event->data[1] == BT_PS_ENABLE)
				adapter->psmode = 1;
			else
				adapter->psmode = 0;
			BT_DBG("PS Mode:%s",
				(adapter->psmode) ? "Enable" : "Disable");
		} else {
			BT_DBG("PS Mode command failed");
		}
		break;

110
	case BT_EVENT_HOST_SLEEP_CONFIG:
111 112
		if (!event->data[3])
			BT_DBG("gpio=%x, gap=%x", event->data[1],
113
							event->data[2]);
114 115 116 117
		else
			BT_DBG("HSCFG command failed");
		break;

118
	case BT_EVENT_HOST_SLEEP_ENABLE:
119 120 121 122
		if (!event->data[1]) {
			adapter->hs_state = HS_ACTIVATED;
			if (adapter->psmode)
				adapter->ps_state = PS_SLEEP;
123
			wake_up_interruptible(&adapter->event_hs_wait_q);
124 125 126 127 128 129
			BT_DBG("HS ACTIVATED!");
		} else {
			BT_DBG("HS Enable failed");
		}
		break;

130
	case BT_EVENT_MODULE_CFG_REQ:
131 132
		if (priv->btmrvl_dev.sendcmdflag &&
				event->data[1] == MODULE_BRINGUP_REQ) {
133 134 135 136
			BT_DBG("EVENT:%s",
				((event->data[2] == MODULE_BROUGHT_UP) ||
				(event->data[2] == MODULE_ALREADY_UP)) ?
				"Bring-up succeed" : "Bring-up failed");
137

138 139
			if (event->length > 3 && event->data[3])
				priv->btmrvl_dev.dev_type = HCI_AMP;
140 141 142 143
			else
				priv->btmrvl_dev.dev_type = HCI_BREDR;

			BT_DBG("dev_type: %d", priv->btmrvl_dev.dev_type);
144 145
		} else if (priv->btmrvl_dev.sendcmdflag &&
				event->data[1] == MODULE_SHUTDOWN_REQ) {
146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
			BT_DBG("EVENT:%s", (event->data[2]) ?
				"Shutdown failed" : "Shutdown succeed");
		} else {
			BT_DBG("BT_CMD_MODULE_CFG_REQ resp for APP");
			ret = -EINVAL;
		}
		break;

	case BT_EVENT_POWER_STATE:
		if (event->data[1] == BT_PS_SLEEP)
			adapter->ps_state = PS_SLEEP;
		BT_DBG("EVENT:%s",
			(adapter->ps_state) ? "PS_SLEEP" : "PS_AWAKE");
		break;

	default:
		BT_DBG("Unknown Event=%d", event->data[0]);
		ret = -EINVAL;
		break;
	}

exit:
	if (!ret)
		kfree_skb(skb);

	return ret;
}
EXPORT_SYMBOL_GPL(btmrvl_process_event);

175
static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 opcode,
176
				const void *param, u8 len)
177
{
178
	struct sk_buff *skb;
179
	struct hci_command_hdr *hdr;
180

181 182 183 184 185
	if (priv->surprise_removed) {
		BT_ERR("Card is removed");
		return -EFAULT;
	}

186
	skb = bt_skb_alloc(HCI_COMMAND_HDR_SIZE + len, GFP_ATOMIC);
187
	if (!skb) {
188
		BT_ERR("No free skb");
189
		return -ENOMEM;
190 191
	}

192
	hdr = (struct hci_command_hdr *)skb_put(skb, HCI_COMMAND_HDR_SIZE);
193
	hdr->opcode = cpu_to_le16(opcode);
194
	hdr->plen = len;
195 196

	if (len)
197
		memcpy(skb_put(skb, len), param, len);
198 199 200 201 202 203 204 205 206 207 208

	bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT;

	skb_queue_head(&priv->adapter->tx_queue, skb);

	priv->btmrvl_dev.sendcmdflag = true;

	priv->adapter->cmd_complete = false;

	wake_up_interruptible(&priv->main_thread.wait_q);

209
	if (!wait_event_interruptible_timeout(priv->adapter->cmd_wait_q,
210 211
					      priv->adapter->cmd_complete ||
					      priv->surprise_removed,
212
					      WAIT_UNTIL_CMD_RESP))
213 214
		return -ETIMEDOUT;

215 216 217
	if (priv->surprise_removed)
		return -EFAULT;

218 219
	return 0;
}
220

221
int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, u8 subcmd)
222 223 224 225 226
{
	int ret;

	ret = btmrvl_send_sync_cmd(priv, BT_CMD_MODULE_CFG_REQ, &subcmd, 1);
	if (ret)
227
		BT_ERR("module_cfg_cmd(%x) failed", subcmd);
228 229 230 231 232

	return ret;
}
EXPORT_SYMBOL_GPL(btmrvl_send_module_cfg_cmd);

233 234 235 236 237 238 239 240 241 242 243 244
static int btmrvl_enable_sco_routing_to_host(struct btmrvl_private *priv)
{
	int ret;
	u8 subcmd = 0;

	ret = btmrvl_send_sync_cmd(priv, BT_CMD_ROUTE_SCO_TO_HOST, &subcmd, 1);
	if (ret)
		BT_ERR("BT_CMD_ROUTE_SCO_TO_HOST command failed: %#x", ret);

	return ret;
}

245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
int btmrvl_pscan_window_reporting(struct btmrvl_private *priv, u8 subcmd)
{
	struct btmrvl_sdio_card *card = priv->btmrvl_dev.card;
	int ret;

	if (!card->support_pscan_win_report)
		return 0;

	ret = btmrvl_send_sync_cmd(priv, BT_CMD_PSCAN_WIN_REPORT_ENABLE,
				   &subcmd, 1);
	if (ret)
		BT_ERR("PSCAN_WIN_REPORT_ENABLE command failed: %#x", ret);

	return ret;
}
EXPORT_SYMBOL_GPL(btmrvl_pscan_window_reporting);

262 263
int btmrvl_send_hscfg_cmd(struct btmrvl_private *priv)
{
264 265
	int ret;
	u8 param[2];
266

267 268
	param[0] = (priv->btmrvl_dev.gpio_gap & 0xff00) >> 8;
	param[1] = (u8) (priv->btmrvl_dev.gpio_gap & 0x00ff);
269

270 271
	BT_DBG("Sending HSCFG Command, gpio=0x%x, gap=0x%x",
	       param[0], param[1]);
272

273 274
	ret = btmrvl_send_sync_cmd(priv, BT_CMD_HOST_SLEEP_CONFIG, param, 2);
	if (ret)
275
		BT_ERR("HSCFG command failed");
276

277
	return ret;
278 279 280
}
EXPORT_SYMBOL_GPL(btmrvl_send_hscfg_cmd);

281 282
int btmrvl_enable_ps(struct btmrvl_private *priv)
{
283 284
	int ret;
	u8 param;
285 286

	if (priv->btmrvl_dev.psmode)
287
		param = BT_PS_ENABLE;
288
	else
289
		param = BT_PS_DISABLE;
290

291 292
	ret = btmrvl_send_sync_cmd(priv, BT_CMD_AUTO_SLEEP_MODE, &param, 1);
	if (ret)
293
		BT_ERR("PSMODE command failed");
294 295 296 297 298

	return 0;
}
EXPORT_SYMBOL_GPL(btmrvl_enable_ps);

299
int btmrvl_enable_hs(struct btmrvl_private *priv)
300
{
301
	struct btmrvl_adapter *adapter = priv->adapter;
302
	int ret;
303

304
	ret = btmrvl_send_sync_cmd(priv, BT_CMD_HOST_SLEEP_ENABLE, NULL, 0);
305
	if (ret) {
306
		BT_ERR("Host sleep enable command failed");
307 308 309 310
		return ret;
	}

	ret = wait_event_interruptible_timeout(adapter->event_hs_wait_q,
311 312
					       adapter->hs_state ||
					       priv->surprise_removed,
313
					       WAIT_UNTIL_HS_STATE_CHANGED);
314
	if (ret < 0 || priv->surprise_removed) {
315 316 317 318 319 320 321 322 323 324 325 326
		BT_ERR("event_hs_wait_q terminated (%d): %d,%d,%d",
		       ret, adapter->hs_state, adapter->ps_state,
		       adapter->wakeup_tries);
	} else if (!ret) {
		BT_ERR("hs_enable timeout: %d,%d,%d", adapter->hs_state,
		       adapter->ps_state, adapter->wakeup_tries);
		ret = -ETIMEDOUT;
	} else {
		BT_DBG("host sleep enabled: %d,%d,%d", adapter->hs_state,
		       adapter->ps_state, adapter->wakeup_tries);
		ret = 0;
	}
327 328 329

	return ret;
}
330
EXPORT_SYMBOL_GPL(btmrvl_enable_hs);
331 332 333

int btmrvl_prepare_command(struct btmrvl_private *priv)
{
334
	int ret = 0;
335 336 337

	if (priv->btmrvl_dev.hscfgcmd) {
		priv->btmrvl_dev.hscfgcmd = 0;
338
		btmrvl_send_hscfg_cmd(priv);
339 340 341 342
	}

	if (priv->btmrvl_dev.pscmd) {
		priv->btmrvl_dev.pscmd = 0;
343
		btmrvl_enable_ps(priv);
344 345 346 347 348 349 350 351 352 353
	}

	if (priv->btmrvl_dev.hscmd) {
		priv->btmrvl_dev.hscmd = 0;

		if (priv->btmrvl_dev.hsmode) {
			ret = btmrvl_enable_hs(priv);
		} else {
			ret = priv->hw_wakeup_firmware(priv);
			priv->adapter->hs_state = HS_DEACTIVATED;
354
			BT_DBG("BT: HS DEACTIVATED due to host activity!");
355 356 357 358 359 360
		}
	}

	return ret;
}

361 362 363 364 365 366
void btmrvl_firmware_dump(struct btmrvl_private *priv)
{
	if (priv->firmware_dump)
		priv->firmware_dump(priv);
}

367 368
static int btmrvl_tx_pkt(struct btmrvl_private *priv, struct sk_buff *skb)
{
369
	int ret = 0;
370

371
	if (!skb || !skb->data)
372 373 374 375
		return -EINVAL;

	if (!skb->len || ((skb->len + BTM_HEADER_LEN) > BTM_UPLD_SIZE)) {
		BT_ERR("Tx Error: Bad skb length %d : %d",
376
						skb->len, BTM_UPLD_SIZE);
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
		return -EINVAL;
	}

	skb_push(skb, BTM_HEADER_LEN);

	/* header type: byte[3]
	 * HCI_COMMAND = 1, ACL_DATA = 2, SCO_DATA = 3, 0xFE = Vendor
	 * header length: byte[2][1][0]
	 */

	skb->data[0] = (skb->len & 0x0000ff);
	skb->data[1] = (skb->len & 0x00ff00) >> 8;
	skb->data[2] = (skb->len & 0xff0000) >> 16;
	skb->data[3] = bt_cb(skb)->pkt_type;

	if (priv->hw_host_to_card)
		ret = priv->hw_host_to_card(priv, skb->data, skb->len);

	return ret;
}

static void btmrvl_init_adapter(struct btmrvl_private *priv)
{
400 401
	int buf_size;

402 403 404 405
	skb_queue_head_init(&priv->adapter->tx_queue);

	priv->adapter->ps_state = PS_AWAKE;

406 407 408 409 410 411 412 413 414 415 416 417 418
	buf_size = ALIGN_SZ(SDIO_BLOCK_SIZE, BTSDIO_DMA_ALIGN);
	priv->adapter->hw_regs_buf = kzalloc(buf_size, GFP_KERNEL);
	if (!priv->adapter->hw_regs_buf) {
		priv->adapter->hw_regs = NULL;
		BT_ERR("Unable to allocate buffer for hw_regs.");
	} else {
		priv->adapter->hw_regs =
			(u8 *)ALIGN_ADDR(priv->adapter->hw_regs_buf,
					 BTSDIO_DMA_ALIGN);
		BT_DBG("hw_regs_buf=%p hw_regs=%p",
		       priv->adapter->hw_regs_buf, priv->adapter->hw_regs);
	}

419
	init_waitqueue_head(&priv->adapter->cmd_wait_q);
420
	init_waitqueue_head(&priv->adapter->event_hs_wait_q);
421 422 423 424 425 426
}

static void btmrvl_free_adapter(struct btmrvl_private *priv)
{
	skb_queue_purge(&priv->adapter->tx_queue);

427
	kfree(priv->adapter->hw_regs_buf);
428 429 430 431 432
	kfree(priv->adapter);

	priv->adapter = NULL;
}

433
static int btmrvl_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
434
{
435
	struct btmrvl_private *priv = hci_get_drvdata(hdev);
436

437
	BT_DBG("type=%d, len=%d", skb->pkt_type, skb->len);
438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461

	switch (bt_cb(skb)->pkt_type) {
	case HCI_COMMAND_PKT:
		hdev->stat.cmd_tx++;
		break;

	case HCI_ACLDATA_PKT:
		hdev->stat.acl_tx++;
		break;

	case HCI_SCODATA_PKT:
		hdev->stat.sco_tx++;
		break;
	}

	skb_queue_tail(&priv->adapter->tx_queue, skb);

	wake_up_interruptible(&priv->main_thread.wait_q);

	return 0;
}

static int btmrvl_flush(struct hci_dev *hdev)
{
462
	struct btmrvl_private *priv = hci_get_drvdata(hdev);
463 464 465 466 467 468 469 470

	skb_queue_purge(&priv->adapter->tx_queue);

	return 0;
}

static int btmrvl_close(struct hci_dev *hdev)
{
471
	struct btmrvl_private *priv = hci_get_drvdata(hdev);
472 473 474 475 476 477 478 479 480 481 482

	skb_queue_purge(&priv->adapter->tx_queue);

	return 0;
}

static int btmrvl_open(struct hci_dev *hdev)
{
	return 0;
}

483
static int btmrvl_download_cal_data(struct btmrvl_private *priv,
484
				    u8 *data, int len)
485
{
486
	int ret;
487 488 489 490

	data[0] = 0x00;
	data[1] = 0x00;
	data[2] = 0x00;
491
	data[3] = len;
492 493

	print_hex_dump_bytes("Calibration data: ",
494
			     DUMP_PREFIX_OFFSET, data, BT_CAL_HDR_LEN + len);
495 496

	ret = btmrvl_send_sync_cmd(priv, BT_CMD_LOAD_CONFIG_DATA, data,
497
				   BT_CAL_HDR_LEN + len);
498
	if (ret)
499
		BT_ERR("Failed to download caibration data");
500 501 502 503

	return 0;
}

504
static int btmrvl_check_device_tree(struct btmrvl_private *priv)
505
{
506
	struct device_node *dt_node;
507
	u8 cal_data[BT_CAL_HDR_LEN + BT_CAL_DATA_SIZE];
508
	int ret;
509
	u32 val;
510

511
	for_each_compatible_node(dt_node, NULL, "btmrvl,cfgdata") {
512 513 514 515
		ret = of_property_read_u32(dt_node, "btmrvl,gpio-gap", &val);
		if (!ret)
			priv->btmrvl_dev.gpio_gap = val;

516 517 518
		ret = of_property_read_u8_array(dt_node, "btmrvl,cal-data",
						cal_data + BT_CAL_HDR_LEN,
						BT_CAL_DATA_SIZE);
519 520
		if (ret) {
			of_node_put(dt_node);
521
			return ret;
522
		}
523 524 525 526 527 528

		BT_DBG("Use cal data from device tree");
		ret = btmrvl_download_cal_data(priv, cal_data,
					       BT_CAL_DATA_SIZE);
		if (ret) {
			BT_ERR("Fail to download calibrate data");
529
			of_node_put(dt_node);
530 531
			return ret;
		}
532 533 534 535 536
	}

	return 0;
}

537 538 539
static int btmrvl_setup(struct hci_dev *hdev)
{
	struct btmrvl_private *priv = hci_get_drvdata(hdev);
540
	int ret;
541

542 543 544
	ret = btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ);
	if (ret)
		return ret;
545

546 547 548
	priv->btmrvl_dev.gpio_gap = 0xffff;

	btmrvl_check_device_tree(priv);
549

550 551
	btmrvl_enable_sco_routing_to_host(priv);

552 553
	btmrvl_pscan_window_reporting(priv, 0x01);

554 555 556 557 558 559 560 561
	priv->btmrvl_dev.psmode = 1;
	btmrvl_enable_ps(priv);

	btmrvl_send_hscfg_cmd(priv);

	return 0;
}

562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
static int btmrvl_set_bdaddr(struct hci_dev *hdev, const bdaddr_t *bdaddr)
{
	struct sk_buff *skb;
	long ret;
	u8 buf[8];

	buf[0] = MRVL_VENDOR_PKT;
	buf[1] = sizeof(bdaddr_t);
	memcpy(buf + 2, bdaddr, sizeof(bdaddr_t));

	skb = __hci_cmd_sync(hdev, BT_CMD_SET_BDADDR, sizeof(buf), buf,
			     HCI_INIT_TIMEOUT);
	if (IS_ERR(skb)) {
		ret = PTR_ERR(skb);
		BT_ERR("%s: changing btmrvl device address failed (%ld)",
		       hdev->name, ret);
		return ret;
	}
	kfree_skb(skb);

	return 0;
}

585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603
/*
 * This function handles the event generated by firmware, rx data
 * received from firmware, and tx data sent from kernel.
 */
static int btmrvl_service_main_thread(void *data)
{
	struct btmrvl_thread *thread = data;
	struct btmrvl_private *priv = thread->priv;
	struct btmrvl_adapter *adapter = priv->adapter;
	wait_queue_t wait;
	struct sk_buff *skb;
	ulong flags;

	init_waitqueue_entry(&wait, current);

	for (;;) {
		add_wait_queue(&thread->wait_q, &wait);

		set_current_state(TASK_INTERRUPTIBLE);
604
		if (kthread_should_stop() || priv->surprise_removed) {
605 606 607
			BT_DBG("main_thread: break from main thread");
			break;
		}
608 609

		if (adapter->wakeup_tries ||
610 611 612
				((!adapter->int_count) &&
				(!priv->btmrvl_dev.tx_dnld_rdy ||
				skb_queue_empty(&adapter->tx_queue)))) {
613 614 615 616 617 618 619 620 621 622
			BT_DBG("main_thread is sleeping...");
			schedule();
		}

		set_current_state(TASK_RUNNING);

		remove_wait_queue(&thread->wait_q, &wait);

		BT_DBG("main_thread woke up");

623
		if (kthread_should_stop() || priv->surprise_removed) {
624 625 626 627
			BT_DBG("main_thread: break from main thread");
			break;
		}

628 629 630
		spin_lock_irqsave(&priv->driver_lock, flags);
		if (adapter->int_count) {
			adapter->int_count = 0;
631 632
			spin_unlock_irqrestore(&priv->driver_lock, flags);
			priv->hw_process_int_status(priv);
633 634
		} else if (adapter->ps_state == PS_SLEEP &&
					!skb_queue_empty(&adapter->tx_queue)) {
635 636 637 638
			spin_unlock_irqrestore(&priv->driver_lock, flags);
			adapter->wakeup_tries++;
			priv->hw_wakeup_firmware(priv);
			continue;
639 640
		} else {
			spin_unlock_irqrestore(&priv->driver_lock, flags);
641 642 643 644 645 646 647 648 649 650 651 652 653
		}

		if (adapter->ps_state == PS_SLEEP)
			continue;

		if (!priv->btmrvl_dev.tx_dnld_rdy)
			continue;

		skb = skb_dequeue(&adapter->tx_queue);
		if (skb) {
			if (btmrvl_tx_pkt(priv, skb))
				priv->btmrvl_dev.hcidev->stat.err_tx++;
			else
654
				priv->btmrvl_dev.hcidev->stat.byte_tx += skb->len;
655 656 657 658 659 660 661 662

			kfree_skb(skb);
		}
	}

	return 0;
}

663
int btmrvl_register_hdev(struct btmrvl_private *priv)
664 665 666 667 668 669 670 671 672 673 674
{
	struct hci_dev *hdev = NULL;
	int ret;

	hdev = hci_alloc_dev();
	if (!hdev) {
		BT_ERR("Can not allocate HCI device");
		goto err_hdev;
	}

	priv->btmrvl_dev.hcidev = hdev;
675
	hci_set_drvdata(hdev, priv);
676

677 678
	hdev->bus   = HCI_SDIO;
	hdev->open  = btmrvl_open;
679 680
	hdev->close = btmrvl_close;
	hdev->flush = btmrvl_flush;
681
	hdev->send  = btmrvl_send_frame;
682
	hdev->setup = btmrvl_setup;
683
	hdev->set_bdaddr = btmrvl_set_bdaddr;
684

685 686
	hdev->dev_type = priv->btmrvl_dev.dev_type;

687 688 689 690 691 692
	ret = hci_register_dev(hdev);
	if (ret < 0) {
		BT_ERR("Can not register HCI device");
		goto err_hci_register_dev;
	}

693 694 695 696
#ifdef CONFIG_DEBUG_FS
	btmrvl_debugfs_init(hdev);
#endif

697
	return 0;
698 699 700 701 702

err_hci_register_dev:
	hci_free_dev(hdev);

err_hdev:
703 704 705
	/* Stop the thread servicing the interrupts */
	kthread_stop(priv->main_thread.task);

706
	btmrvl_free_adapter(priv);
707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737
	kfree(priv);

	return -ENOMEM;
}
EXPORT_SYMBOL_GPL(btmrvl_register_hdev);

struct btmrvl_private *btmrvl_add_card(void *card)
{
	struct btmrvl_private *priv;

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (!priv) {
		BT_ERR("Can not allocate priv");
		goto err_priv;
	}

	priv->adapter = kzalloc(sizeof(*priv->adapter), GFP_KERNEL);
	if (!priv->adapter) {
		BT_ERR("Allocate buffer for btmrvl_adapter failed!");
		goto err_adapter;
	}

	btmrvl_init_adapter(priv);

	BT_DBG("Starting kthread...");
	priv->main_thread.priv = priv;
	spin_lock_init(&priv->driver_lock);

	init_waitqueue_head(&priv->main_thread.wait_q);
	priv->main_thread.task = kthread_run(btmrvl_service_main_thread,
				&priv->main_thread, "btmrvl_main_service");
738 739
	if (IS_ERR(priv->main_thread.task))
		goto err_thread;
740 741 742 743 744

	priv->btmrvl_dev.card = card;
	priv->btmrvl_dev.tx_dnld_rdy = true;

	return priv;
745

746 747 748
err_thread:
	btmrvl_free_adapter(priv);

749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
err_adapter:
	kfree(priv);

err_priv:
	return NULL;
}
EXPORT_SYMBOL_GPL(btmrvl_add_card);

int btmrvl_remove_card(struct btmrvl_private *priv)
{
	struct hci_dev *hdev;

	hdev = priv->btmrvl_dev.hcidev;

	wake_up_interruptible(&priv->adapter->cmd_wait_q);
764
	wake_up_interruptible(&priv->adapter->event_hs_wait_q);
765 766 767

	kthread_stop(priv->main_thread.task);

768 769 770 771
#ifdef CONFIG_DEBUG_FS
	btmrvl_debugfs_remove(hdev);
#endif

772 773 774 775 776 777 778 779 780 781 782 783 784 785 786
	hci_unregister_dev(hdev);

	hci_free_dev(hdev);

	priv->btmrvl_dev.hcidev = NULL;

	btmrvl_free_adapter(priv);

	kfree(priv);

	return 0;
}
EXPORT_SYMBOL_GPL(btmrvl_remove_card);

MODULE_AUTHOR("Marvell International Ltd.");
787
MODULE_DESCRIPTION("Marvell Bluetooth driver ver " VERSION);
788 789
MODULE_VERSION(VERSION);
MODULE_LICENSE("GPL v2");