bfusb.c 16.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4
/*
 *
 *  AVM BlueFRITZ! USB driver
 *
5
 *  Copyright (C) 2003-2006  Marcel Holtmann <marcel@holtmann.org>
L
Linus Torvalds 已提交
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
 *
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#include <linux/module.h>

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/errno.h>
#include <linux/skbuff.h>

#include <linux/device.h>
#include <linux/firmware.h>

#include <linux/usb.h>

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>

#ifndef CONFIG_BT_HCIBFUSB_DEBUG
#undef  BT_DBG
#define BT_DBG(D...)
#endif

#define VERSION "1.1"

static int ignore = 0;

static struct usb_driver bfusb_driver;

static struct usb_device_id bfusb_table[] = {
	/* AVM BlueFRITZ! USB */
	{ USB_DEVICE(0x057c, 0x2200) },

	{ }	/* Terminating entry */
};

MODULE_DEVICE_TABLE(usb, bfusb_table);

#define BFUSB_MAX_BLOCK_SIZE	256

#define BFUSB_BLOCK_TIMEOUT	3000

#define BFUSB_TX_PROCESS	1
#define BFUSB_TX_WAKEUP		2

#define BFUSB_MAX_BULK_TX	2
#define BFUSB_MAX_BULK_RX	2

72
struct bfusb_data {
L
Linus Torvalds 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
	struct hci_dev		*hdev;

	unsigned long		state;

	struct usb_device	*udev;

	unsigned int		bulk_in_ep;
	unsigned int		bulk_out_ep;
	unsigned int		bulk_pkt_size;

	rwlock_t		lock;

	struct sk_buff_head	transmit_q;

	struct sk_buff		*reassembly;

	atomic_t		pending_tx;
	struct sk_buff_head	pending_q;
	struct sk_buff_head	completed_q;
};

94
struct bfusb_data_scb {
L
Linus Torvalds 已提交
95 96 97 98 99 100
	struct urb *urb;
};

static void bfusb_tx_complete(struct urb *urb, struct pt_regs *regs);
static void bfusb_rx_complete(struct urb *urb, struct pt_regs *regs);

101
static struct urb *bfusb_get_completed(struct bfusb_data *data)
L
Linus Torvalds 已提交
102 103 104 105
{
	struct sk_buff *skb;
	struct urb *urb = NULL;

106
	BT_DBG("bfusb %p", data);
L
Linus Torvalds 已提交
107

108
	skb = skb_dequeue(&data->completed_q);
L
Linus Torvalds 已提交
109
	if (skb) {
110
		urb = ((struct bfusb_data_scb *) skb->cb)->urb;
L
Linus Torvalds 已提交
111 112 113 114 115 116
		kfree_skb(skb);
	}

	return urb;
}

117
static void bfusb_unlink_urbs(struct bfusb_data *data)
L
Linus Torvalds 已提交
118 119 120 121
{
	struct sk_buff *skb;
	struct urb *urb;

122
	BT_DBG("bfusb %p", data);
L
Linus Torvalds 已提交
123

124 125
	while ((skb = skb_dequeue(&data->pending_q))) {
		urb = ((struct bfusb_data_scb *) skb->cb)->urb;
L
Linus Torvalds 已提交
126
		usb_kill_urb(urb);
127
		skb_queue_tail(&data->completed_q, skb);
L
Linus Torvalds 已提交
128 129
	}

130
	while ((urb = bfusb_get_completed(data)))
L
Linus Torvalds 已提交
131 132 133
		usb_free_urb(urb);
}

134
static int bfusb_send_bulk(struct bfusb_data *data, struct sk_buff *skb)
L
Linus Torvalds 已提交
135
{
136 137
	struct bfusb_data_scb *scb = (void *) skb->cb;
	struct urb *urb = bfusb_get_completed(data);
L
Linus Torvalds 已提交
138 139
	int err, pipe;

140
	BT_DBG("bfusb %p skb %p len %d", data, skb, skb->len);
L
Linus Torvalds 已提交
141 142 143 144

	if (!urb && !(urb = usb_alloc_urb(0, GFP_ATOMIC)))
		return -ENOMEM;

145
	pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep);
L
Linus Torvalds 已提交
146

147
	usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, skb->len,
L
Linus Torvalds 已提交
148 149 150 151
			bfusb_tx_complete, skb);

	scb->urb = urb;

152
	skb_queue_tail(&data->pending_q, skb);
L
Linus Torvalds 已提交
153 154 155 156

	err = usb_submit_urb(urb, GFP_ATOMIC);
	if (err) {
		BT_ERR("%s bulk tx submit failed urb %p err %d", 
157 158
					data->hdev->name, urb, err);
		skb_unlink(skb, &data->pending_q);
L
Linus Torvalds 已提交
159 160
		usb_free_urb(urb);
	} else
161
		atomic_inc(&data->pending_tx);
L
Linus Torvalds 已提交
162 163 164 165

	return err;
}

166
static void bfusb_tx_wakeup(struct bfusb_data *data)
L
Linus Torvalds 已提交
167 168 169
{
	struct sk_buff *skb;

170
	BT_DBG("bfusb %p", data);
L
Linus Torvalds 已提交
171

172 173
	if (test_and_set_bit(BFUSB_TX_PROCESS, &data->state)) {
		set_bit(BFUSB_TX_WAKEUP, &data->state);
L
Linus Torvalds 已提交
174 175 176 177
		return;
	}

	do {
178
		clear_bit(BFUSB_TX_WAKEUP, &data->state);
L
Linus Torvalds 已提交
179

180 181 182 183
		while ((atomic_read(&data->pending_tx) < BFUSB_MAX_BULK_TX) &&
				(skb = skb_dequeue(&data->transmit_q))) {
			if (bfusb_send_bulk(data, skb) < 0) {
				skb_queue_head(&data->transmit_q, skb);
L
Linus Torvalds 已提交
184 185 186 187
				break;
			}
		}

188
	} while (test_bit(BFUSB_TX_WAKEUP, &data->state));
L
Linus Torvalds 已提交
189

190
	clear_bit(BFUSB_TX_PROCESS, &data->state);
L
Linus Torvalds 已提交
191 192 193 194 195
}

static void bfusb_tx_complete(struct urb *urb, struct pt_regs *regs)
{
	struct sk_buff *skb = (struct sk_buff *) urb->context;
196
	struct bfusb_data *data = (struct bfusb_data *) skb->dev;
L
Linus Torvalds 已提交
197

198
	BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len);
L
Linus Torvalds 已提交
199

200
	atomic_dec(&data->pending_tx);
L
Linus Torvalds 已提交
201

202
	if (!test_bit(HCI_RUNNING, &data->hdev->flags))
L
Linus Torvalds 已提交
203 204 205
		return;

	if (!urb->status)
206
		data->hdev->stat.byte_tx += skb->len;
L
Linus Torvalds 已提交
207
	else
208
		data->hdev->stat.err_tx++;
L
Linus Torvalds 已提交
209

210
	read_lock(&data->lock);
L
Linus Torvalds 已提交
211

212 213
	skb_unlink(skb, &data->pending_q);
	skb_queue_tail(&data->completed_q, skb);
L
Linus Torvalds 已提交
214

215
	bfusb_tx_wakeup(data);
L
Linus Torvalds 已提交
216

217
	read_unlock(&data->lock);
L
Linus Torvalds 已提交
218 219 220
}


221
static int bfusb_rx_submit(struct bfusb_data *data, struct urb *urb)
L
Linus Torvalds 已提交
222
{
223
	struct bfusb_data_scb *scb;
L
Linus Torvalds 已提交
224 225 226 227 228 229 230 231
	struct sk_buff *skb;
	int err, pipe, size = HCI_MAX_FRAME_SIZE + 32;

	BT_DBG("bfusb %p urb %p", bfusb, urb);

	if (!urb && !(urb = usb_alloc_urb(0, GFP_ATOMIC)))
		return -ENOMEM;

232 233
	skb = bt_skb_alloc(size, GFP_ATOMIC);
	if (!skb) {
L
Linus Torvalds 已提交
234 235 236 237
		usb_free_urb(urb);
		return -ENOMEM;
	}

238
	skb->dev = (void *) data;
L
Linus Torvalds 已提交
239

240
	scb = (struct bfusb_data_scb *) skb->cb;
L
Linus Torvalds 已提交
241 242
	scb->urb = urb;

243
	pipe = usb_rcvbulkpipe(data->udev, data->bulk_in_ep);
L
Linus Torvalds 已提交
244

245
	usb_fill_bulk_urb(urb, data->udev, pipe, skb->data, size,
L
Linus Torvalds 已提交
246 247
			bfusb_rx_complete, skb);

248
	skb_queue_tail(&data->pending_q, skb);
L
Linus Torvalds 已提交
249 250 251 252

	err = usb_submit_urb(urb, GFP_ATOMIC);
	if (err) {
		BT_ERR("%s bulk rx submit failed urb %p err %d",
253 254
					data->hdev->name, urb, err);
		skb_unlink(skb, &data->pending_q);
L
Linus Torvalds 已提交
255 256 257 258 259 260 261
		kfree_skb(skb);
		usb_free_urb(urb);
	}

	return err;
}

262
static inline int bfusb_recv_block(struct bfusb_data *data, int hdr, unsigned char *buf, int len)
L
Linus Torvalds 已提交
263
{
264
	BT_DBG("bfusb %p hdr 0x%02x data %p len %d", data, hdr, buf, len);
L
Linus Torvalds 已提交
265 266

	if (hdr & 0x10) {
267 268 269 270
		BT_ERR("%s error in block", data->hdev->name);
		if (data->reassembly)
			kfree_skb(data->reassembly);
		data->reassembly = NULL;
L
Linus Torvalds 已提交
271 272 273 274 275 276 277 278
		return -EIO;
	}

	if (hdr & 0x04) {
		struct sk_buff *skb;
		unsigned char pkt_type;
		int pkt_len = 0;

279 280 281 282
		if (data->reassembly) {
			BT_ERR("%s unexpected start block", data->hdev->name);
			kfree_skb(data->reassembly);
			data->reassembly = NULL;
L
Linus Torvalds 已提交
283 284 285
		}

		if (len < 1) {
286
			BT_ERR("%s no packet type found", data->hdev->name);
L
Linus Torvalds 已提交
287 288 289
			return -EPROTO;
		}

290
		pkt_type = *buf++; len--;
L
Linus Torvalds 已提交
291 292 293 294

		switch (pkt_type) {
		case HCI_EVENT_PKT:
			if (len >= HCI_EVENT_HDR_SIZE) {
295
				struct hci_event_hdr *hdr = (struct hci_event_hdr *) buf;
L
Linus Torvalds 已提交
296 297
				pkt_len = HCI_EVENT_HDR_SIZE + hdr->plen;
			} else {
298
				BT_ERR("%s event block is too short", data->hdev->name);
L
Linus Torvalds 已提交
299 300 301 302 303 304
				return -EILSEQ;
			}
			break;

		case HCI_ACLDATA_PKT:
			if (len >= HCI_ACL_HDR_SIZE) {
305
				struct hci_acl_hdr *hdr = (struct hci_acl_hdr *) buf;
L
Linus Torvalds 已提交
306 307
				pkt_len = HCI_ACL_HDR_SIZE + __le16_to_cpu(hdr->dlen);
			} else {
308
				BT_ERR("%s data block is too short", data->hdev->name);
L
Linus Torvalds 已提交
309 310 311 312 313 314
				return -EILSEQ;
			}
			break;

		case HCI_SCODATA_PKT:
			if (len >= HCI_SCO_HDR_SIZE) {
315
				struct hci_sco_hdr *hdr = (struct hci_sco_hdr *) buf;
L
Linus Torvalds 已提交
316 317
				pkt_len = HCI_SCO_HDR_SIZE + hdr->dlen;
			} else {
318
				BT_ERR("%s audio block is too short", data->hdev->name);
L
Linus Torvalds 已提交
319 320 321 322 323 324 325
				return -EILSEQ;
			}
			break;
		}

		skb = bt_skb_alloc(pkt_len, GFP_ATOMIC);
		if (!skb) {
326
			BT_ERR("%s no memory for the packet", data->hdev->name);
L
Linus Torvalds 已提交
327 328 329
			return -ENOMEM;
		}

330
		skb->dev = (void *) data->hdev;
331
		bt_cb(skb)->pkt_type = pkt_type;
L
Linus Torvalds 已提交
332

333
		data->reassembly = skb;
L
Linus Torvalds 已提交
334
	} else {
335 336
		if (!data->reassembly) {
			BT_ERR("%s unexpected continuation block", data->hdev->name);
L
Linus Torvalds 已提交
337 338 339 340 341
			return -EIO;
		}
	}

	if (len > 0)
342
		memcpy(skb_put(data->reassembly, len), buf, len);
L
Linus Torvalds 已提交
343 344

	if (hdr & 0x08) {
345 346
		hci_recv_frame(data->reassembly);
		data->reassembly = NULL;
L
Linus Torvalds 已提交
347 348 349 350 351 352 353 354
	}

	return 0;
}

static void bfusb_rx_complete(struct urb *urb, struct pt_regs *regs)
{
	struct sk_buff *skb = (struct sk_buff *) urb->context;
355
	struct bfusb_data *data = (struct bfusb_data *) skb->dev;
L
Linus Torvalds 已提交
356 357 358 359 360 361
	unsigned char *buf = urb->transfer_buffer;
	int count = urb->actual_length;
	int err, hdr, len;

	BT_DBG("bfusb %p urb %p skb %p len %d", bfusb, urb, skb, skb->len);

362
	read_lock(&data->lock);
L
Linus Torvalds 已提交
363

364
	if (!test_bit(HCI_RUNNING, &data->hdev->flags))
L
Linus Torvalds 已提交
365 366 367 368 369
		goto unlock;

	if (urb->status || !count)
		goto resubmit;

370
	data->hdev->stat.byte_rx += count;
L
Linus Torvalds 已提交
371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388

	skb_put(skb, count);

	while (count) {
		hdr = buf[0] | (buf[1] << 8);

		if (hdr & 0x4000) {
			len = 0;
			count -= 2;
			buf   += 2;
		} else {
			len = (buf[2] == 0) ? 256 : buf[2];
			count -= 3;
			buf   += 3;
		}

		if (count < len) {
			BT_ERR("%s block extends over URB buffer ranges",
389
					data->hdev->name);
L
Linus Torvalds 已提交
390 391 392
		}

		if ((hdr & 0xe1) == 0xc1)
393
			bfusb_recv_block(data, hdr, buf, len);
L
Linus Torvalds 已提交
394 395 396 397 398

		count -= len;
		buf   += len;
	}

399
	skb_unlink(skb, &data->pending_q);
L
Linus Torvalds 已提交
400 401
	kfree_skb(skb);

402
	bfusb_rx_submit(data, urb);
L
Linus Torvalds 已提交
403

404
	read_unlock(&data->lock);
L
Linus Torvalds 已提交
405 406 407 408

	return;

resubmit:
409
	urb->dev = data->udev;
L
Linus Torvalds 已提交
410 411 412 413

	err = usb_submit_urb(urb, GFP_ATOMIC);
	if (err) {
		BT_ERR("%s bulk resubmit failed urb %p err %d",
414
					data->hdev->name, urb, err);
L
Linus Torvalds 已提交
415 416 417
	}

unlock:
418
	read_unlock(&data->lock);
L
Linus Torvalds 已提交
419 420 421 422
}

static int bfusb_open(struct hci_dev *hdev)
{
423
	struct bfusb_data *data = hdev->driver_data;
L
Linus Torvalds 已提交
424 425 426
	unsigned long flags;
	int i, err;

427
	BT_DBG("hdev %p bfusb %p", hdev, data);
L
Linus Torvalds 已提交
428 429 430 431

	if (test_and_set_bit(HCI_RUNNING, &hdev->flags))
		return 0;

432
	write_lock_irqsave(&data->lock, flags);
L
Linus Torvalds 已提交
433

434
	err = bfusb_rx_submit(data, NULL);
L
Linus Torvalds 已提交
435 436
	if (!err) {
		for (i = 1; i < BFUSB_MAX_BULK_RX; i++)
437
			bfusb_rx_submit(data, NULL);
L
Linus Torvalds 已提交
438 439 440 441
	} else {
		clear_bit(HCI_RUNNING, &hdev->flags);
	}

442
	write_unlock_irqrestore(&data->lock, flags);
L
Linus Torvalds 已提交
443 444 445 446 447 448

	return err;
}

static int bfusb_flush(struct hci_dev *hdev)
{
449
	struct bfusb_data *data = hdev->driver_data;
L
Linus Torvalds 已提交
450

451
	BT_DBG("hdev %p bfusb %p", hdev, data);
L
Linus Torvalds 已提交
452

453
	skb_queue_purge(&data->transmit_q);
L
Linus Torvalds 已提交
454 455 456 457 458 459

	return 0;
}

static int bfusb_close(struct hci_dev *hdev)
{
460
	struct bfusb_data *data = hdev->driver_data;
L
Linus Torvalds 已提交
461 462
	unsigned long flags;

463
	BT_DBG("hdev %p bfusb %p", hdev, data);
L
Linus Torvalds 已提交
464 465 466 467

	if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
		return 0;

468 469
	write_lock_irqsave(&data->lock, flags);
	write_unlock_irqrestore(&data->lock, flags);
L
Linus Torvalds 已提交
470

471
	bfusb_unlink_urbs(data);
L
Linus Torvalds 已提交
472 473 474 475 476 477 478 479
	bfusb_flush(hdev);

	return 0;
}

static int bfusb_send_frame(struct sk_buff *skb)
{
	struct hci_dev *hdev = (struct hci_dev *) skb->dev;
480
	struct bfusb_data *data;
L
Linus Torvalds 已提交
481 482 483 484
	struct sk_buff *nskb;
	unsigned char buf[3];
	int sent = 0, size, count;

485
	BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, bt_cb(skb)->pkt_type, skb->len);
L
Linus Torvalds 已提交
486 487 488 489 490 491 492 493 494

	if (!hdev) {
		BT_ERR("Frame for unknown HCI device (hdev=NULL)");
		return -ENODEV;
	}

	if (!test_bit(HCI_RUNNING, &hdev->flags))
		return -EBUSY;

495
	data = hdev->driver_data;
L
Linus Torvalds 已提交
496

497
	switch (bt_cb(skb)->pkt_type) {
L
Linus Torvalds 已提交
498 499 500 501 502 503 504 505 506 507 508 509
	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;
	};

	/* Prepend skb with frame type */
510
	memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
L
Linus Torvalds 已提交
511 512 513 514

	count = skb->len;

	/* Max HCI frame size seems to be 1511 + 1 */
515 516
	nskb = bt_skb_alloc(count + 32, GFP_ATOMIC);
	if (!nskb) {
L
Linus Torvalds 已提交
517 518 519 520
		BT_ERR("Can't allocate memory for new packet");
		return -ENOMEM;
	}

521
	nskb->dev = (void *) data;
L
Linus Torvalds 已提交
522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537

	while (count) {
		size = min_t(uint, count, BFUSB_MAX_BLOCK_SIZE);

		buf[0] = 0xc1 | ((sent == 0) ? 0x04 : 0) | ((count == size) ? 0x08 : 0);
		buf[1] = 0x00;
		buf[2] = (size == BFUSB_MAX_BLOCK_SIZE) ? 0 : size;

		memcpy(skb_put(nskb, 3), buf, 3);
		memcpy(skb_put(nskb, size), skb->data + sent, size);

		sent  += size;
		count -= size;
	}

	/* Don't send frame with multiple size of bulk max packet */
538
	if ((nskb->len % data->bulk_pkt_size) == 0) {
L
Linus Torvalds 已提交
539 540 541 542 543
		buf[0] = 0xdd;
		buf[1] = 0x00;
		memcpy(skb_put(nskb, 2), buf, 2);
	}

544
	read_lock(&data->lock);
L
Linus Torvalds 已提交
545

546 547
	skb_queue_tail(&data->transmit_q, nskb);
	bfusb_tx_wakeup(data);
L
Linus Torvalds 已提交
548

549
	read_unlock(&data->lock);
L
Linus Torvalds 已提交
550 551 552 553 554 555 556 557

	kfree_skb(skb);

	return 0;
}

static void bfusb_destruct(struct hci_dev *hdev)
{
558
	struct bfusb_data *data = hdev->driver_data;
L
Linus Torvalds 已提交
559

560
	BT_DBG("hdev %p bfusb %p", hdev, data);
L
Linus Torvalds 已提交
561

562
	kfree(data);
L
Linus Torvalds 已提交
563 564 565 566 567 568 569
}

static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
{
	return -ENOIOCTLCMD;
}

570
static int bfusb_load_firmware(struct bfusb_data *data, unsigned char *firmware, int count)
L
Linus Torvalds 已提交
571 572 573 574
{
	unsigned char *buf;
	int err, pipe, len, size, sent = 0;

575
	BT_DBG("bfusb %p udev %p", data, data->udev);
L
Linus Torvalds 已提交
576 577 578

	BT_INFO("BlueFRITZ! USB loading firmware");

579
	pipe = usb_sndctrlpipe(data->udev, 0);
L
Linus Torvalds 已提交
580

581
	if (usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION,
L
Linus Torvalds 已提交
582 583 584 585 586
				0, 1, 0, NULL, 0, USB_CTRL_SET_TIMEOUT) < 0) {
		BT_ERR("Can't change to loading configuration");
		return -EBUSY;
	}

587
	data->udev->toggle[0] = data->udev->toggle[1] = 0;
L
Linus Torvalds 已提交
588 589 590 591 592 593 594

	buf = kmalloc(BFUSB_MAX_BLOCK_SIZE + 3, GFP_ATOMIC);
	if (!buf) {
		BT_ERR("Can't allocate memory chunk for firmware");
		return -ENOMEM;
	}

595
	pipe = usb_sndbulkpipe(data->udev, data->bulk_out_ep);
L
Linus Torvalds 已提交
596 597 598 599 600 601

	while (count) {
		size = min_t(uint, count, BFUSB_MAX_BLOCK_SIZE + 3);

		memcpy(buf, firmware + sent, size);

602
		err = usb_bulk_msg(data->udev, pipe, buf, size,
L
Linus Torvalds 已提交
603 604 605 606 607 608 609 610 611 612 613
					&len, BFUSB_BLOCK_TIMEOUT);

		if (err || (len != size)) {
			BT_ERR("Error in firmware loading");
			goto error;
		}

		sent  += size;
		count -= size;
	}

614 615 616
	err = usb_bulk_msg(data->udev, pipe, NULL, 0,
					&len, BFUSB_BLOCK_TIMEOUT);
	if (err < 0) {
L
Linus Torvalds 已提交
617 618 619 620
		BT_ERR("Error in null packet request");
		goto error;
	}

621
	pipe = usb_sndctrlpipe(data->udev, 0);
L
Linus Torvalds 已提交
622

623 624 625
	err = usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION,
				0, 2, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);
	if (err < 0) {
L
Linus Torvalds 已提交
626 627 628 629
		BT_ERR("Can't change to running configuration");
		goto error;
	}

630
	data->udev->toggle[0] = data->udev->toggle[1] = 0;
L
Linus Torvalds 已提交
631 632 633 634 635 636 637 638 639

	BT_INFO("BlueFRITZ! USB device ready");

	kfree(buf);
	return 0;

error:
	kfree(buf);

640
	pipe = usb_sndctrlpipe(data->udev, 0);
L
Linus Torvalds 已提交
641

642
	usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION,
L
Linus Torvalds 已提交
643 644 645 646 647 648 649 650 651 652 653 654
				0, 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT);

	return err;
}

static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
	const struct firmware *firmware;
	struct usb_device *udev = interface_to_usbdev(intf);
	struct usb_host_endpoint *bulk_out_ep;
	struct usb_host_endpoint *bulk_in_ep;
	struct hci_dev *hdev;
655
	struct bfusb_data *data;
L
Linus Torvalds 已提交
656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674

	BT_DBG("intf %p id %p", intf, id);

	if (ignore)
		return -ENODEV;

	/* Check number of endpoints */
	if (intf->cur_altsetting->desc.bNumEndpoints < 2)
		return -EIO;

	bulk_out_ep = &intf->cur_altsetting->endpoint[0];
	bulk_in_ep  = &intf->cur_altsetting->endpoint[1];

	if (!bulk_out_ep || !bulk_in_ep) {
		BT_ERR("Bulk endpoints not found");
		goto done;
	}

	/* Initialize control structure and load firmware */
675 676
	data = kzalloc(sizeof(struct bfusb_data), GFP_KERNEL);
	if (!data) {
L
Linus Torvalds 已提交
677 678 679 680
		BT_ERR("Can't allocate memory for control structure");
		goto done;
	}

681 682 683 684
	data->udev = udev;
	data->bulk_in_ep    = bulk_in_ep->desc.bEndpointAddress;
	data->bulk_out_ep   = bulk_out_ep->desc.bEndpointAddress;
	data->bulk_pkt_size = le16_to_cpu(bulk_out_ep->desc.wMaxPacketSize);
L
Linus Torvalds 已提交
685

686
	rwlock_init(&data->lock);
L
Linus Torvalds 已提交
687

688
	data->reassembly = NULL;
L
Linus Torvalds 已提交
689

690 691 692
	skb_queue_head_init(&data->transmit_q);
	skb_queue_head_init(&data->pending_q);
	skb_queue_head_init(&data->completed_q);
L
Linus Torvalds 已提交
693 694 695 696 697 698 699 700

	if (request_firmware(&firmware, "bfubase.frm", &udev->dev) < 0) {
		BT_ERR("Firmware request failed");
		goto error;
	}

	BT_DBG("firmware data %p size %d", firmware->data, firmware->size);

701
	if (bfusb_load_firmware(data, firmware->data, firmware->size) < 0) {
L
Linus Torvalds 已提交
702 703 704 705 706 707 708 709 710 711 712 713 714
		BT_ERR("Firmware loading failed");
		goto release;
	}

	release_firmware(firmware);

	/* Initialize and register HCI device */
	hdev = hci_alloc_dev();
	if (!hdev) {
		BT_ERR("Can't allocate HCI device");
		goto error;
	}

715
	data->hdev = hdev;
L
Linus Torvalds 已提交
716 717

	hdev->type = HCI_USB;
718
	hdev->driver_data = data;
L
Linus Torvalds 已提交
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735
	SET_HCIDEV_DEV(hdev, &intf->dev);

	hdev->open     = bfusb_open;
	hdev->close    = bfusb_close;
	hdev->flush    = bfusb_flush;
	hdev->send     = bfusb_send_frame;
	hdev->destruct = bfusb_destruct;
	hdev->ioctl    = bfusb_ioctl;

	hdev->owner = THIS_MODULE;

	if (hci_register_dev(hdev) < 0) {
		BT_ERR("Can't register HCI device");
		hci_free_dev(hdev);
		goto error;
	}

736
	usb_set_intfdata(intf, data);
L
Linus Torvalds 已提交
737 738 739 740 741 742 743

	return 0;

release:
	release_firmware(firmware);

error:
744
	kfree(data);
L
Linus Torvalds 已提交
745 746 747 748 749 750 751

done:
	return -EIO;
}

static void bfusb_disconnect(struct usb_interface *intf)
{
752 753
	struct bfusb_data *data = usb_get_intfdata(intf);
	struct hci_dev *hdev = data->hdev;
L
Linus Torvalds 已提交
754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782

	BT_DBG("intf %p", intf);

	if (!hdev)
		return;

	usb_set_intfdata(intf, NULL);

	bfusb_close(hdev);

	if (hci_unregister_dev(hdev) < 0)
		BT_ERR("Can't unregister HCI device %s", hdev->name);

	hci_free_dev(hdev);
}

static struct usb_driver bfusb_driver = {
	.name		= "bfusb",
	.probe		= bfusb_probe,
	.disconnect	= bfusb_disconnect,
	.id_table	= bfusb_table,
};

static int __init bfusb_init(void)
{
	int err;

	BT_INFO("BlueFRITZ! USB driver ver %s", VERSION);

783 784
	err = usb_register(&bfusb_driver);
	if (err < 0)
L
Linus Torvalds 已提交
785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804
		BT_ERR("Failed to register BlueFRITZ! USB driver");

	return err;
}

static void __exit bfusb_exit(void)
{
	usb_deregister(&bfusb_driver);
}

module_init(bfusb_init);
module_exit(bfusb_exit);

module_param(ignore, bool, 0644);
MODULE_PARM_DESC(ignore, "Ignore devices from the matching table");

MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("BlueFRITZ! USB driver ver " VERSION);
MODULE_VERSION(VERSION);
MODULE_LICENSE("GPL");