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
 *
 *
 *  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/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

71
struct bfusb_data {
L
Linus Torvalds 已提交
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
	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;
};

93
struct bfusb_data_scb {
L
Linus Torvalds 已提交
94 95 96
	struct urb *urb;
};

97 98
static void bfusb_tx_complete(struct urb *urb);
static void bfusb_rx_complete(struct urb *urb);
L
Linus Torvalds 已提交
99

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

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

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

	return urb;
}

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

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

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

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

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

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

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

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

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

	scb->urb = urb;

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

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

	return err;
}

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

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

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

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

179 180 181 182
		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 已提交
183 184 185 186
				break;
			}
		}

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

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

192
static void bfusb_tx_complete(struct urb *urb)
L
Linus Torvalds 已提交
193 194
{
	struct sk_buff *skb = (struct sk_buff *) urb->context;
195
	struct bfusb_data *data = (struct bfusb_data *) skb->dev;
L
Linus Torvalds 已提交
196

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

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

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

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

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

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

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

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


220
static int bfusb_rx_submit(struct bfusb_data *data, struct urb *urb)
L
Linus Torvalds 已提交
221
{
222
	struct bfusb_data_scb *scb;
L
Linus Torvalds 已提交
223 224 225 226 227 228 229 230
	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;

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

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

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

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

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

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

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

	return err;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	return 0;
}

351
static void bfusb_rx_complete(struct urb *urb)
L
Linus Torvalds 已提交
352 353
{
	struct sk_buff *skb = (struct sk_buff *) urb->context;
354
	struct bfusb_data *data = (struct bfusb_data *) skb->dev;
L
Linus Torvalds 已提交
355 356 357 358 359 360
	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);

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

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

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

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

	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",
388
					data->hdev->name);
L
Linus Torvalds 已提交
389 390 391
		}

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

		count -= len;
		buf   += len;
	}

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

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

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

	return;

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

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

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

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

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

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

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

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

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

	return err;
}

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

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

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

	return 0;
}

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

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

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

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

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

	return 0;
}

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

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

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

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

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

496
	switch (bt_cb(skb)->pkt_type) {
L
Linus Torvalds 已提交
497 498 499 500 501 502 503 504 505 506 507 508
	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 */
509
	memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
L
Linus Torvalds 已提交
510 511 512 513

	count = skb->len;

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

520
	nskb->dev = (void *) data;
L
Linus Torvalds 已提交
521 522 523 524 525 526 527 528 529

	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);
530
		skb_copy_from_linear_data_offset(skb, sent, skb_put(nskb, size), size);
L
Linus Torvalds 已提交
531 532 533 534 535 536

		sent  += size;
		count -= size;
	}

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

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

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

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

	kfree_skb(skb);

	return 0;
}

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

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

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

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

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

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

	BT_INFO("BlueFRITZ! USB loading firmware");

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

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

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

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

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

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

		memcpy(buf, firmware + sent, size);

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

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

		sent  += size;
		count -= size;
	}

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

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

622 623 624
	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 已提交
625 626 627 628
		BT_ERR("Can't change to running configuration");
		goto error;
	}

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

	BT_INFO("BlueFRITZ! USB device ready");

	kfree(buf);
	return 0;

error:
	kfree(buf);

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

641
	usb_control_msg(data->udev, pipe, USB_REQ_SET_CONFIGURATION,
L
Linus Torvalds 已提交
642 643 644 645 646 647 648 649 650 651 652 653
				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;
654
	struct bfusb_data *data;
L
Linus Torvalds 已提交
655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673

	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 */
674 675
	data = kzalloc(sizeof(struct bfusb_data), GFP_KERNEL);
	if (!data) {
L
Linus Torvalds 已提交
676 677 678 679
		BT_ERR("Can't allocate memory for control structure");
		goto done;
	}

680 681 682 683
	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 已提交
684

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

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

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

	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);

700
	if (bfusb_load_firmware(data, firmware->data, firmware->size) < 0) {
L
Linus Torvalds 已提交
701 702 703 704 705 706 707 708 709 710 711 712 713
		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;
	}

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

	hdev->type = HCI_USB;
717
	hdev->driver_data = data;
L
Linus Torvalds 已提交
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734
	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;
	}

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

	return 0;

release:
	release_firmware(firmware);

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

done:
	return -EIO;
}

static void bfusb_disconnect(struct usb_interface *intf)
{
751 752
	struct bfusb_data *data = usb_get_intfdata(intf);
	struct hci_dev *hdev = data->hdev;
L
Linus Torvalds 已提交
753 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

	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);

782 783
	err = usb_register(&bfusb_driver);
	if (err < 0)
L
Linus Torvalds 已提交
784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803
		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");
804
MODULE_FIRMWARE("bfubase.frm");