diff options
Diffstat (limited to 'drivers/bluetooth/btusb.c')
-rw-r--r-- | drivers/bluetooth/btusb.c | 515 |
1 files changed, 375 insertions, 140 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index a79d657c0845..edfc17bfcd44 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
@@ -268,20 +268,24 @@ struct btusb_data { | |||
268 | struct usb_interface *intf; | 268 | struct usb_interface *intf; |
269 | struct usb_interface *isoc; | 269 | struct usb_interface *isoc; |
270 | 270 | ||
271 | spinlock_t lock; | ||
272 | |||
273 | unsigned long flags; | 271 | unsigned long flags; |
274 | 272 | ||
275 | struct work_struct work; | 273 | struct work_struct work; |
276 | struct work_struct waker; | 274 | struct work_struct waker; |
277 | 275 | ||
276 | struct usb_anchor deferred; | ||
278 | struct usb_anchor tx_anchor; | 277 | struct usb_anchor tx_anchor; |
278 | int tx_in_flight; | ||
279 | spinlock_t txlock; | ||
280 | |||
279 | struct usb_anchor intr_anchor; | 281 | struct usb_anchor intr_anchor; |
280 | struct usb_anchor bulk_anchor; | 282 | struct usb_anchor bulk_anchor; |
281 | struct usb_anchor isoc_anchor; | 283 | struct usb_anchor isoc_anchor; |
282 | struct usb_anchor deferred; | 284 | spinlock_t rxlock; |
283 | int tx_in_flight; | 285 | |
284 | spinlock_t txlock; | 286 | struct sk_buff *evt_skb; |
287 | struct sk_buff *acl_skb; | ||
288 | struct sk_buff *sco_skb; | ||
285 | 289 | ||
286 | struct usb_endpoint_descriptor *intr_ep; | 290 | struct usb_endpoint_descriptor *intr_ep; |
287 | struct usb_endpoint_descriptor *bulk_tx_ep; | 291 | struct usb_endpoint_descriptor *bulk_tx_ep; |
@@ -296,18 +300,189 @@ struct btusb_data { | |||
296 | int suspend_count; | 300 | int suspend_count; |
297 | }; | 301 | }; |
298 | 302 | ||
299 | static int inc_tx(struct btusb_data *data) | 303 | static inline void btusb_free_frags(struct btusb_data *data) |
300 | { | 304 | { |
301 | unsigned long flags; | 305 | unsigned long flags; |
302 | int rv; | ||
303 | 306 | ||
304 | spin_lock_irqsave(&data->txlock, flags); | 307 | spin_lock_irqsave(&data->rxlock, flags); |
305 | rv = test_bit(BTUSB_SUSPENDING, &data->flags); | 308 | |
306 | if (!rv) | 309 | kfree_skb(data->evt_skb); |
307 | data->tx_in_flight++; | 310 | data->evt_skb = NULL; |
308 | spin_unlock_irqrestore(&data->txlock, flags); | 311 | |
312 | kfree_skb(data->acl_skb); | ||
313 | data->acl_skb = NULL; | ||
314 | |||
315 | kfree_skb(data->sco_skb); | ||
316 | data->sco_skb = NULL; | ||
317 | |||
318 | spin_unlock_irqrestore(&data->rxlock, flags); | ||
319 | } | ||
320 | |||
321 | static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count) | ||
322 | { | ||
323 | struct sk_buff *skb; | ||
324 | int err = 0; | ||
325 | |||
326 | spin_lock(&data->rxlock); | ||
327 | skb = data->evt_skb; | ||
328 | |||
329 | while (count) { | ||
330 | int len; | ||
331 | |||
332 | if (!skb) { | ||
333 | skb = bt_skb_alloc(HCI_MAX_EVENT_SIZE, GFP_ATOMIC); | ||
334 | if (!skb) { | ||
335 | err = -ENOMEM; | ||
336 | break; | ||
337 | } | ||
338 | |||
339 | bt_cb(skb)->pkt_type = HCI_EVENT_PKT; | ||
340 | bt_cb(skb)->expect = HCI_EVENT_HDR_SIZE; | ||
341 | } | ||
342 | |||
343 | len = min_t(uint, bt_cb(skb)->expect, count); | ||
344 | memcpy(skb_put(skb, len), buffer, len); | ||
345 | |||
346 | count -= len; | ||
347 | buffer += len; | ||
348 | bt_cb(skb)->expect -= len; | ||
349 | |||
350 | if (skb->len == HCI_EVENT_HDR_SIZE) { | ||
351 | /* Complete event header */ | ||
352 | bt_cb(skb)->expect = hci_event_hdr(skb)->plen; | ||
353 | |||
354 | if (skb_tailroom(skb) < bt_cb(skb)->expect) { | ||
355 | kfree_skb(skb); | ||
356 | skb = NULL; | ||
357 | |||
358 | err = -EILSEQ; | ||
359 | break; | ||
360 | } | ||
361 | } | ||
362 | |||
363 | if (bt_cb(skb)->expect == 0) { | ||
364 | /* Complete frame */ | ||
365 | hci_recv_frame(data->hdev, skb); | ||
366 | skb = NULL; | ||
367 | } | ||
368 | } | ||
369 | |||
370 | data->evt_skb = skb; | ||
371 | spin_unlock(&data->rxlock); | ||
372 | |||
373 | return err; | ||
374 | } | ||
375 | |||
376 | static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count) | ||
377 | { | ||
378 | struct sk_buff *skb; | ||
379 | int err = 0; | ||
380 | |||
381 | spin_lock(&data->rxlock); | ||
382 | skb = data->acl_skb; | ||
383 | |||
384 | while (count) { | ||
385 | int len; | ||
309 | 386 | ||
310 | return rv; | 387 | if (!skb) { |
388 | skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC); | ||
389 | if (!skb) { | ||
390 | err = -ENOMEM; | ||
391 | break; | ||
392 | } | ||
393 | |||
394 | bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; | ||
395 | bt_cb(skb)->expect = HCI_ACL_HDR_SIZE; | ||
396 | } | ||
397 | |||
398 | len = min_t(uint, bt_cb(skb)->expect, count); | ||
399 | memcpy(skb_put(skb, len), buffer, len); | ||
400 | |||
401 | count -= len; | ||
402 | buffer += len; | ||
403 | bt_cb(skb)->expect -= len; | ||
404 | |||
405 | if (skb->len == HCI_ACL_HDR_SIZE) { | ||
406 | __le16 dlen = hci_acl_hdr(skb)->dlen; | ||
407 | |||
408 | /* Complete ACL header */ | ||
409 | bt_cb(skb)->expect = __le16_to_cpu(dlen); | ||
410 | |||
411 | if (skb_tailroom(skb) < bt_cb(skb)->expect) { | ||
412 | kfree_skb(skb); | ||
413 | skb = NULL; | ||
414 | |||
415 | err = -EILSEQ; | ||
416 | break; | ||
417 | } | ||
418 | } | ||
419 | |||
420 | if (bt_cb(skb)->expect == 0) { | ||
421 | /* Complete frame */ | ||
422 | hci_recv_frame(data->hdev, skb); | ||
423 | skb = NULL; | ||
424 | } | ||
425 | } | ||
426 | |||
427 | data->acl_skb = skb; | ||
428 | spin_unlock(&data->rxlock); | ||
429 | |||
430 | return err; | ||
431 | } | ||
432 | |||
433 | static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count) | ||
434 | { | ||
435 | struct sk_buff *skb; | ||
436 | int err = 0; | ||
437 | |||
438 | spin_lock(&data->rxlock); | ||
439 | skb = data->sco_skb; | ||
440 | |||
441 | while (count) { | ||
442 | int len; | ||
443 | |||
444 | if (!skb) { | ||
445 | skb = bt_skb_alloc(HCI_MAX_SCO_SIZE, GFP_ATOMIC); | ||
446 | if (!skb) { | ||
447 | err = -ENOMEM; | ||
448 | break; | ||
449 | } | ||
450 | |||
451 | bt_cb(skb)->pkt_type = HCI_SCODATA_PKT; | ||
452 | bt_cb(skb)->expect = HCI_SCO_HDR_SIZE; | ||
453 | } | ||
454 | |||
455 | len = min_t(uint, bt_cb(skb)->expect, count); | ||
456 | memcpy(skb_put(skb, len), buffer, len); | ||
457 | |||
458 | count -= len; | ||
459 | buffer += len; | ||
460 | bt_cb(skb)->expect -= len; | ||
461 | |||
462 | if (skb->len == HCI_SCO_HDR_SIZE) { | ||
463 | /* Complete SCO header */ | ||
464 | bt_cb(skb)->expect = hci_sco_hdr(skb)->dlen; | ||
465 | |||
466 | if (skb_tailroom(skb) < bt_cb(skb)->expect) { | ||
467 | kfree_skb(skb); | ||
468 | skb = NULL; | ||
469 | |||
470 | err = -EILSEQ; | ||
471 | break; | ||
472 | } | ||
473 | } | ||
474 | |||
475 | if (bt_cb(skb)->expect == 0) { | ||
476 | /* Complete frame */ | ||
477 | hci_recv_frame(data->hdev, skb); | ||
478 | skb = NULL; | ||
479 | } | ||
480 | } | ||
481 | |||
482 | data->sco_skb = skb; | ||
483 | spin_unlock(&data->rxlock); | ||
484 | |||
485 | return err; | ||
311 | } | 486 | } |
312 | 487 | ||
313 | static void btusb_intr_complete(struct urb *urb) | 488 | static void btusb_intr_complete(struct urb *urb) |
@@ -316,8 +491,8 @@ static void btusb_intr_complete(struct urb *urb) | |||
316 | struct btusb_data *data = hci_get_drvdata(hdev); | 491 | struct btusb_data *data = hci_get_drvdata(hdev); |
317 | int err; | 492 | int err; |
318 | 493 | ||
319 | BT_DBG("%s urb %p status %d count %d", hdev->name, | 494 | BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, |
320 | urb, urb->status, urb->actual_length); | 495 | urb->actual_length); |
321 | 496 | ||
322 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | 497 | if (!test_bit(HCI_RUNNING, &hdev->flags)) |
323 | return; | 498 | return; |
@@ -325,9 +500,8 @@ static void btusb_intr_complete(struct urb *urb) | |||
325 | if (urb->status == 0) { | 500 | if (urb->status == 0) { |
326 | hdev->stat.byte_rx += urb->actual_length; | 501 | hdev->stat.byte_rx += urb->actual_length; |
327 | 502 | ||
328 | if (hci_recv_fragment(hdev, HCI_EVENT_PKT, | 503 | if (btusb_recv_intr(data, urb->transfer_buffer, |
329 | urb->transfer_buffer, | 504 | urb->actual_length) < 0) { |
330 | urb->actual_length) < 0) { | ||
331 | BT_ERR("%s corrupted event packet", hdev->name); | 505 | BT_ERR("%s corrupted event packet", hdev->name); |
332 | hdev->stat.err_rx++; | 506 | hdev->stat.err_rx++; |
333 | } | 507 | } |
@@ -348,7 +522,7 @@ static void btusb_intr_complete(struct urb *urb) | |||
348 | * -ENODEV: device got disconnected */ | 522 | * -ENODEV: device got disconnected */ |
349 | if (err != -EPERM && err != -ENODEV) | 523 | if (err != -EPERM && err != -ENODEV) |
350 | BT_ERR("%s urb %p failed to resubmit (%d)", | 524 | BT_ERR("%s urb %p failed to resubmit (%d)", |
351 | hdev->name, urb, -err); | 525 | hdev->name, urb, -err); |
352 | usb_unanchor_urb(urb); | 526 | usb_unanchor_urb(urb); |
353 | } | 527 | } |
354 | } | 528 | } |
@@ -381,8 +555,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags) | |||
381 | pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress); | 555 | pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress); |
382 | 556 | ||
383 | usb_fill_int_urb(urb, data->udev, pipe, buf, size, | 557 | usb_fill_int_urb(urb, data->udev, pipe, buf, size, |
384 | btusb_intr_complete, hdev, | 558 | btusb_intr_complete, hdev, data->intr_ep->bInterval); |
385 | data->intr_ep->bInterval); | ||
386 | 559 | ||
387 | urb->transfer_flags |= URB_FREE_BUFFER; | 560 | urb->transfer_flags |= URB_FREE_BUFFER; |
388 | 561 | ||
@@ -392,7 +565,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags) | |||
392 | if (err < 0) { | 565 | if (err < 0) { |
393 | if (err != -EPERM && err != -ENODEV) | 566 | if (err != -EPERM && err != -ENODEV) |
394 | BT_ERR("%s urb %p submission failed (%d)", | 567 | BT_ERR("%s urb %p submission failed (%d)", |
395 | hdev->name, urb, -err); | 568 | hdev->name, urb, -err); |
396 | usb_unanchor_urb(urb); | 569 | usb_unanchor_urb(urb); |
397 | } | 570 | } |
398 | 571 | ||
@@ -407,8 +580,8 @@ static void btusb_bulk_complete(struct urb *urb) | |||
407 | struct btusb_data *data = hci_get_drvdata(hdev); | 580 | struct btusb_data *data = hci_get_drvdata(hdev); |
408 | int err; | 581 | int err; |
409 | 582 | ||
410 | BT_DBG("%s urb %p status %d count %d", hdev->name, | 583 | BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, |
411 | urb, urb->status, urb->actual_length); | 584 | urb->actual_length); |
412 | 585 | ||
413 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | 586 | if (!test_bit(HCI_RUNNING, &hdev->flags)) |
414 | return; | 587 | return; |
@@ -416,9 +589,8 @@ static void btusb_bulk_complete(struct urb *urb) | |||
416 | if (urb->status == 0) { | 589 | if (urb->status == 0) { |
417 | hdev->stat.byte_rx += urb->actual_length; | 590 | hdev->stat.byte_rx += urb->actual_length; |
418 | 591 | ||
419 | if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT, | 592 | if (btusb_recv_bulk(data, urb->transfer_buffer, |
420 | urb->transfer_buffer, | 593 | urb->actual_length) < 0) { |
421 | urb->actual_length) < 0) { | ||
422 | BT_ERR("%s corrupted ACL packet", hdev->name); | 594 | BT_ERR("%s corrupted ACL packet", hdev->name); |
423 | hdev->stat.err_rx++; | 595 | hdev->stat.err_rx++; |
424 | } | 596 | } |
@@ -439,7 +611,7 @@ static void btusb_bulk_complete(struct urb *urb) | |||
439 | * -ENODEV: device got disconnected */ | 611 | * -ENODEV: device got disconnected */ |
440 | if (err != -EPERM && err != -ENODEV) | 612 | if (err != -EPERM && err != -ENODEV) |
441 | BT_ERR("%s urb %p failed to resubmit (%d)", | 613 | BT_ERR("%s urb %p failed to resubmit (%d)", |
442 | hdev->name, urb, -err); | 614 | hdev->name, urb, -err); |
443 | usb_unanchor_urb(urb); | 615 | usb_unanchor_urb(urb); |
444 | } | 616 | } |
445 | } | 617 | } |
@@ -469,8 +641,8 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags) | |||
469 | 641 | ||
470 | pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress); | 642 | pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress); |
471 | 643 | ||
472 | usb_fill_bulk_urb(urb, data->udev, pipe, | 644 | usb_fill_bulk_urb(urb, data->udev, pipe, buf, size, |
473 | buf, size, btusb_bulk_complete, hdev); | 645 | btusb_bulk_complete, hdev); |
474 | 646 | ||
475 | urb->transfer_flags |= URB_FREE_BUFFER; | 647 | urb->transfer_flags |= URB_FREE_BUFFER; |
476 | 648 | ||
@@ -481,7 +653,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags) | |||
481 | if (err < 0) { | 653 | if (err < 0) { |
482 | if (err != -EPERM && err != -ENODEV) | 654 | if (err != -EPERM && err != -ENODEV) |
483 | BT_ERR("%s urb %p submission failed (%d)", | 655 | BT_ERR("%s urb %p submission failed (%d)", |
484 | hdev->name, urb, -err); | 656 | hdev->name, urb, -err); |
485 | usb_unanchor_urb(urb); | 657 | usb_unanchor_urb(urb); |
486 | } | 658 | } |
487 | 659 | ||
@@ -496,8 +668,8 @@ static void btusb_isoc_complete(struct urb *urb) | |||
496 | struct btusb_data *data = hci_get_drvdata(hdev); | 668 | struct btusb_data *data = hci_get_drvdata(hdev); |
497 | int i, err; | 669 | int i, err; |
498 | 670 | ||
499 | BT_DBG("%s urb %p status %d count %d", hdev->name, | 671 | BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, |
500 | urb, urb->status, urb->actual_length); | 672 | urb->actual_length); |
501 | 673 | ||
502 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | 674 | if (!test_bit(HCI_RUNNING, &hdev->flags)) |
503 | return; | 675 | return; |
@@ -512,9 +684,8 @@ static void btusb_isoc_complete(struct urb *urb) | |||
512 | 684 | ||
513 | hdev->stat.byte_rx += length; | 685 | hdev->stat.byte_rx += length; |
514 | 686 | ||
515 | if (hci_recv_fragment(hdev, HCI_SCODATA_PKT, | 687 | if (btusb_recv_isoc(data, urb->transfer_buffer + offset, |
516 | urb->transfer_buffer + offset, | 688 | length) < 0) { |
517 | length) < 0) { | ||
518 | BT_ERR("%s corrupted SCO packet", hdev->name); | 689 | BT_ERR("%s corrupted SCO packet", hdev->name); |
519 | hdev->stat.err_rx++; | 690 | hdev->stat.err_rx++; |
520 | } | 691 | } |
@@ -535,7 +706,7 @@ static void btusb_isoc_complete(struct urb *urb) | |||
535 | * -ENODEV: device got disconnected */ | 706 | * -ENODEV: device got disconnected */ |
536 | if (err != -EPERM && err != -ENODEV) | 707 | if (err != -EPERM && err != -ENODEV) |
537 | BT_ERR("%s urb %p failed to resubmit (%d)", | 708 | BT_ERR("%s urb %p failed to resubmit (%d)", |
538 | hdev->name, urb, -err); | 709 | hdev->name, urb, -err); |
539 | usb_unanchor_urb(urb); | 710 | usb_unanchor_urb(urb); |
540 | } | 711 | } |
541 | } | 712 | } |
@@ -590,12 +761,12 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags) | |||
590 | pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); | 761 | pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); |
591 | 762 | ||
592 | usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete, | 763 | usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete, |
593 | hdev, data->isoc_rx_ep->bInterval); | 764 | hdev, data->isoc_rx_ep->bInterval); |
594 | 765 | ||
595 | urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; | 766 | urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; |
596 | 767 | ||
597 | __fill_isoc_descriptor(urb, size, | 768 | __fill_isoc_descriptor(urb, size, |
598 | le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); | 769 | le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); |
599 | 770 | ||
600 | usb_anchor_urb(urb, &data->isoc_anchor); | 771 | usb_anchor_urb(urb, &data->isoc_anchor); |
601 | 772 | ||
@@ -603,7 +774,7 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags) | |||
603 | if (err < 0) { | 774 | if (err < 0) { |
604 | if (err != -EPERM && err != -ENODEV) | 775 | if (err != -EPERM && err != -ENODEV) |
605 | BT_ERR("%s urb %p submission failed (%d)", | 776 | BT_ERR("%s urb %p submission failed (%d)", |
606 | hdev->name, urb, -err); | 777 | hdev->name, urb, -err); |
607 | usb_unanchor_urb(urb); | 778 | usb_unanchor_urb(urb); |
608 | } | 779 | } |
609 | 780 | ||
@@ -615,11 +786,11 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags) | |||
615 | static void btusb_tx_complete(struct urb *urb) | 786 | static void btusb_tx_complete(struct urb *urb) |
616 | { | 787 | { |
617 | struct sk_buff *skb = urb->context; | 788 | struct sk_buff *skb = urb->context; |
618 | struct hci_dev *hdev = (struct hci_dev *) skb->dev; | 789 | struct hci_dev *hdev = (struct hci_dev *)skb->dev; |
619 | struct btusb_data *data = hci_get_drvdata(hdev); | 790 | struct btusb_data *data = hci_get_drvdata(hdev); |
620 | 791 | ||
621 | BT_DBG("%s urb %p status %d count %d", hdev->name, | 792 | BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, |
622 | urb, urb->status, urb->actual_length); | 793 | urb->actual_length); |
623 | 794 | ||
624 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | 795 | if (!test_bit(HCI_RUNNING, &hdev->flags)) |
625 | goto done; | 796 | goto done; |
@@ -642,10 +813,10 @@ done: | |||
642 | static void btusb_isoc_tx_complete(struct urb *urb) | 813 | static void btusb_isoc_tx_complete(struct urb *urb) |
643 | { | 814 | { |
644 | struct sk_buff *skb = urb->context; | 815 | struct sk_buff *skb = urb->context; |
645 | struct hci_dev *hdev = (struct hci_dev *) skb->dev; | 816 | struct hci_dev *hdev = (struct hci_dev *)skb->dev; |
646 | 817 | ||
647 | BT_DBG("%s urb %p status %d count %d", hdev->name, | 818 | BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, |
648 | urb, urb->status, urb->actual_length); | 819 | urb->actual_length); |
649 | 820 | ||
650 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | 821 | if (!test_bit(HCI_RUNNING, &hdev->flags)) |
651 | goto done; | 822 | goto done; |
@@ -729,6 +900,8 @@ static int btusb_close(struct hci_dev *hdev) | |||
729 | clear_bit(BTUSB_INTR_RUNNING, &data->flags); | 900 | clear_bit(BTUSB_INTR_RUNNING, &data->flags); |
730 | 901 | ||
731 | btusb_stop_traffic(data); | 902 | btusb_stop_traffic(data); |
903 | btusb_free_frags(data); | ||
904 | |||
732 | err = usb_autopm_get_interface(data->intf); | 905 | err = usb_autopm_get_interface(data->intf); |
733 | if (err < 0) | 906 | if (err < 0) |
734 | goto failed; | 907 | goto failed; |
@@ -748,122 +921,181 @@ static int btusb_flush(struct hci_dev *hdev) | |||
748 | BT_DBG("%s", hdev->name); | 921 | BT_DBG("%s", hdev->name); |
749 | 922 | ||
750 | usb_kill_anchored_urbs(&data->tx_anchor); | 923 | usb_kill_anchored_urbs(&data->tx_anchor); |
924 | btusb_free_frags(data); | ||
751 | 925 | ||
752 | return 0; | 926 | return 0; |
753 | } | 927 | } |
754 | 928 | ||
755 | static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb) | 929 | static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb) |
756 | { | 930 | { |
757 | struct btusb_data *data = hci_get_drvdata(hdev); | 931 | struct btusb_data *data = hci_get_drvdata(hdev); |
758 | struct usb_ctrlrequest *dr; | 932 | struct usb_ctrlrequest *dr; |
759 | struct urb *urb; | 933 | struct urb *urb; |
760 | unsigned int pipe; | 934 | unsigned int pipe; |
761 | int err; | ||
762 | 935 | ||
763 | BT_DBG("%s", hdev->name); | 936 | urb = usb_alloc_urb(0, GFP_KERNEL); |
937 | if (!urb) | ||
938 | return ERR_PTR(-ENOMEM); | ||
764 | 939 | ||
765 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | 940 | dr = kmalloc(sizeof(*dr), GFP_KERNEL); |
766 | return -EBUSY; | 941 | if (!dr) { |
942 | usb_free_urb(urb); | ||
943 | return ERR_PTR(-ENOMEM); | ||
944 | } | ||
767 | 945 | ||
768 | skb->dev = (void *) hdev; | 946 | dr->bRequestType = data->cmdreq_type; |
947 | dr->bRequest = 0; | ||
948 | dr->wIndex = 0; | ||
949 | dr->wValue = 0; | ||
950 | dr->wLength = __cpu_to_le16(skb->len); | ||
769 | 951 | ||
770 | switch (bt_cb(skb)->pkt_type) { | 952 | pipe = usb_sndctrlpipe(data->udev, 0x00); |
771 | case HCI_COMMAND_PKT: | ||
772 | urb = usb_alloc_urb(0, GFP_ATOMIC); | ||
773 | if (!urb) | ||
774 | return -ENOMEM; | ||
775 | |||
776 | dr = kmalloc(sizeof(*dr), GFP_ATOMIC); | ||
777 | if (!dr) { | ||
778 | usb_free_urb(urb); | ||
779 | return -ENOMEM; | ||
780 | } | ||
781 | 953 | ||
782 | dr->bRequestType = data->cmdreq_type; | 954 | usb_fill_control_urb(urb, data->udev, pipe, (void *)dr, |
783 | dr->bRequest = 0; | 955 | skb->data, skb->len, btusb_tx_complete, skb); |
784 | dr->wIndex = 0; | ||
785 | dr->wValue = 0; | ||
786 | dr->wLength = __cpu_to_le16(skb->len); | ||
787 | 956 | ||
788 | pipe = usb_sndctrlpipe(data->udev, 0x00); | 957 | skb->dev = (void *)hdev; |
789 | 958 | ||
790 | usb_fill_control_urb(urb, data->udev, pipe, (void *) dr, | 959 | return urb; |
791 | skb->data, skb->len, btusb_tx_complete, skb); | 960 | } |
792 | 961 | ||
793 | hdev->stat.cmd_tx++; | 962 | static struct urb *alloc_bulk_urb(struct hci_dev *hdev, struct sk_buff *skb) |
794 | break; | 963 | { |
964 | struct btusb_data *data = hci_get_drvdata(hdev); | ||
965 | struct urb *urb; | ||
966 | unsigned int pipe; | ||
795 | 967 | ||
796 | case HCI_ACLDATA_PKT: | 968 | if (!data->bulk_tx_ep) |
797 | if (!data->bulk_tx_ep) | 969 | return ERR_PTR(-ENODEV); |
798 | return -ENODEV; | ||
799 | 970 | ||
800 | urb = usb_alloc_urb(0, GFP_ATOMIC); | 971 | urb = usb_alloc_urb(0, GFP_KERNEL); |
801 | if (!urb) | 972 | if (!urb) |
802 | return -ENOMEM; | 973 | return ERR_PTR(-ENOMEM); |
803 | 974 | ||
804 | pipe = usb_sndbulkpipe(data->udev, | 975 | pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress); |
805 | data->bulk_tx_ep->bEndpointAddress); | ||
806 | 976 | ||
807 | usb_fill_bulk_urb(urb, data->udev, pipe, | 977 | usb_fill_bulk_urb(urb, data->udev, pipe, |
808 | skb->data, skb->len, btusb_tx_complete, skb); | 978 | skb->data, skb->len, btusb_tx_complete, skb); |
809 | 979 | ||
810 | hdev->stat.acl_tx++; | 980 | skb->dev = (void *)hdev; |
811 | break; | ||
812 | 981 | ||
813 | case HCI_SCODATA_PKT: | 982 | return urb; |
814 | if (!data->isoc_tx_ep || hci_conn_num(hdev, SCO_LINK) < 1) | 983 | } |
815 | return -ENODEV; | ||
816 | 984 | ||
817 | urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_ATOMIC); | 985 | static struct urb *alloc_isoc_urb(struct hci_dev *hdev, struct sk_buff *skb) |
818 | if (!urb) | 986 | { |
819 | return -ENOMEM; | 987 | struct btusb_data *data = hci_get_drvdata(hdev); |
988 | struct urb *urb; | ||
989 | unsigned int pipe; | ||
820 | 990 | ||
821 | pipe = usb_sndisocpipe(data->udev, | 991 | if (!data->isoc_tx_ep) |
822 | data->isoc_tx_ep->bEndpointAddress); | 992 | return ERR_PTR(-ENODEV); |
823 | 993 | ||
824 | usb_fill_int_urb(urb, data->udev, pipe, | 994 | urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL); |
825 | skb->data, skb->len, btusb_isoc_tx_complete, | 995 | if (!urb) |
826 | skb, data->isoc_tx_ep->bInterval); | 996 | return ERR_PTR(-ENOMEM); |
827 | 997 | ||
828 | urb->transfer_flags = URB_ISO_ASAP; | 998 | pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress); |
829 | 999 | ||
830 | __fill_isoc_descriptor(urb, skb->len, | 1000 | usb_fill_int_urb(urb, data->udev, pipe, |
831 | le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); | 1001 | skb->data, skb->len, btusb_isoc_tx_complete, |
1002 | skb, data->isoc_tx_ep->bInterval); | ||
832 | 1003 | ||
833 | hdev->stat.sco_tx++; | 1004 | urb->transfer_flags = URB_ISO_ASAP; |
834 | goto skip_waking; | ||
835 | 1005 | ||
836 | default: | 1006 | __fill_isoc_descriptor(urb, skb->len, |
837 | return -EILSEQ; | 1007 | le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); |
838 | } | ||
839 | 1008 | ||
840 | err = inc_tx(data); | 1009 | skb->dev = (void *)hdev; |
841 | if (err) { | 1010 | |
842 | usb_anchor_urb(urb, &data->deferred); | 1011 | return urb; |
843 | schedule_work(&data->waker); | 1012 | } |
844 | err = 0; | 1013 | |
845 | goto done; | 1014 | static int submit_tx_urb(struct hci_dev *hdev, struct urb *urb) |
846 | } | 1015 | { |
1016 | struct btusb_data *data = hci_get_drvdata(hdev); | ||
1017 | int err; | ||
847 | 1018 | ||
848 | skip_waking: | ||
849 | usb_anchor_urb(urb, &data->tx_anchor); | 1019 | usb_anchor_urb(urb, &data->tx_anchor); |
850 | 1020 | ||
851 | err = usb_submit_urb(urb, GFP_ATOMIC); | 1021 | err = usb_submit_urb(urb, GFP_KERNEL); |
852 | if (err < 0) { | 1022 | if (err < 0) { |
853 | if (err != -EPERM && err != -ENODEV) | 1023 | if (err != -EPERM && err != -ENODEV) |
854 | BT_ERR("%s urb %p submission failed (%d)", | 1024 | BT_ERR("%s urb %p submission failed (%d)", |
855 | hdev->name, urb, -err); | 1025 | hdev->name, urb, -err); |
856 | kfree(urb->setup_packet); | 1026 | kfree(urb->setup_packet); |
857 | usb_unanchor_urb(urb); | 1027 | usb_unanchor_urb(urb); |
858 | } else { | 1028 | } else { |
859 | usb_mark_last_busy(data->udev); | 1029 | usb_mark_last_busy(data->udev); |
860 | } | 1030 | } |
861 | 1031 | ||
862 | done: | ||
863 | usb_free_urb(urb); | 1032 | usb_free_urb(urb); |
864 | return err; | 1033 | return err; |
865 | } | 1034 | } |
866 | 1035 | ||
1036 | static int submit_or_queue_tx_urb(struct hci_dev *hdev, struct urb *urb) | ||
1037 | { | ||
1038 | struct btusb_data *data = hci_get_drvdata(hdev); | ||
1039 | unsigned long flags; | ||
1040 | bool suspending; | ||
1041 | |||
1042 | spin_lock_irqsave(&data->txlock, flags); | ||
1043 | suspending = test_bit(BTUSB_SUSPENDING, &data->flags); | ||
1044 | if (!suspending) | ||
1045 | data->tx_in_flight++; | ||
1046 | spin_unlock_irqrestore(&data->txlock, flags); | ||
1047 | |||
1048 | if (!suspending) | ||
1049 | return submit_tx_urb(hdev, urb); | ||
1050 | |||
1051 | usb_anchor_urb(urb, &data->deferred); | ||
1052 | schedule_work(&data->waker); | ||
1053 | |||
1054 | usb_free_urb(urb); | ||
1055 | return 0; | ||
1056 | } | ||
1057 | |||
1058 | static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb) | ||
1059 | { | ||
1060 | struct urb *urb; | ||
1061 | |||
1062 | BT_DBG("%s", hdev->name); | ||
1063 | |||
1064 | if (!test_bit(HCI_RUNNING, &hdev->flags)) | ||
1065 | return -EBUSY; | ||
1066 | |||
1067 | switch (bt_cb(skb)->pkt_type) { | ||
1068 | case HCI_COMMAND_PKT: | ||
1069 | urb = alloc_ctrl_urb(hdev, skb); | ||
1070 | if (IS_ERR(urb)) | ||
1071 | return PTR_ERR(urb); | ||
1072 | |||
1073 | hdev->stat.cmd_tx++; | ||
1074 | return submit_or_queue_tx_urb(hdev, urb); | ||
1075 | |||
1076 | case HCI_ACLDATA_PKT: | ||
1077 | urb = alloc_bulk_urb(hdev, skb); | ||
1078 | if (IS_ERR(urb)) | ||
1079 | return PTR_ERR(urb); | ||
1080 | |||
1081 | hdev->stat.acl_tx++; | ||
1082 | return submit_or_queue_tx_urb(hdev, urb); | ||
1083 | |||
1084 | case HCI_SCODATA_PKT: | ||
1085 | if (hci_conn_num(hdev, SCO_LINK) < 1) | ||
1086 | return -ENODEV; | ||
1087 | |||
1088 | urb = alloc_isoc_urb(hdev, skb); | ||
1089 | if (IS_ERR(urb)) | ||
1090 | return PTR_ERR(urb); | ||
1091 | |||
1092 | hdev->stat.sco_tx++; | ||
1093 | return submit_tx_urb(hdev, urb); | ||
1094 | } | ||
1095 | |||
1096 | return -EILSEQ; | ||
1097 | } | ||
1098 | |||
867 | static void btusb_notify(struct hci_dev *hdev, unsigned int evt) | 1099 | static void btusb_notify(struct hci_dev *hdev, unsigned int evt) |
868 | { | 1100 | { |
869 | struct btusb_data *data = hci_get_drvdata(hdev); | 1101 | struct btusb_data *data = hci_get_drvdata(hdev); |
@@ -940,6 +1172,7 @@ static void btusb_work(struct work_struct *work) | |||
940 | 1172 | ||
941 | if (hdev->voice_setting & 0x0020) { | 1173 | if (hdev->voice_setting & 0x0020) { |
942 | static const int alts[3] = { 2, 4, 5 }; | 1174 | static const int alts[3] = { 2, 4, 5 }; |
1175 | |||
943 | new_alts = alts[data->sco_num - 1]; | 1176 | new_alts = alts[data->sco_num - 1]; |
944 | } else { | 1177 | } else { |
945 | new_alts = data->sco_num; | 1178 | new_alts = data->sco_num; |
@@ -1012,7 +1245,7 @@ static int btusb_setup_csr(struct hci_dev *hdev) | |||
1012 | return -PTR_ERR(skb); | 1245 | return -PTR_ERR(skb); |
1013 | } | 1246 | } |
1014 | 1247 | ||
1015 | rp = (struct hci_rp_read_local_version *) skb->data; | 1248 | rp = (struct hci_rp_read_local_version *)skb->data; |
1016 | 1249 | ||
1017 | if (!rp->status) { | 1250 | if (!rp->status) { |
1018 | if (le16_to_cpu(rp->manufacturer) != 10) { | 1251 | if (le16_to_cpu(rp->manufacturer) != 10) { |
@@ -1050,7 +1283,7 @@ struct intel_version { | |||
1050 | } __packed; | 1283 | } __packed; |
1051 | 1284 | ||
1052 | static const struct firmware *btusb_setup_intel_get_fw(struct hci_dev *hdev, | 1285 | static const struct firmware *btusb_setup_intel_get_fw(struct hci_dev *hdev, |
1053 | struct intel_version *ver) | 1286 | struct intel_version *ver) |
1054 | { | 1287 | { |
1055 | const struct firmware *fw; | 1288 | const struct firmware *fw; |
1056 | char fwname[64]; | 1289 | char fwname[64]; |
@@ -1226,7 +1459,7 @@ static int btusb_check_bdaddr_intel(struct hci_dev *hdev) | |||
1226 | return -EIO; | 1459 | return -EIO; |
1227 | } | 1460 | } |
1228 | 1461 | ||
1229 | rp = (struct hci_rp_read_bd_addr *) skb->data; | 1462 | rp = (struct hci_rp_read_bd_addr *)skb->data; |
1230 | if (rp->status) { | 1463 | if (rp->status) { |
1231 | BT_ERR("%s Intel device address result failed (%02x)", | 1464 | BT_ERR("%s Intel device address result failed (%02x)", |
1232 | hdev->name, rp->status); | 1465 | hdev->name, rp->status); |
@@ -1356,6 +1589,7 @@ static int btusb_setup_intel(struct hci_dev *hdev) | |||
1356 | 1589 | ||
1357 | if (skb->data[0]) { | 1590 | if (skb->data[0]) { |
1358 | u8 evt_status = skb->data[0]; | 1591 | u8 evt_status = skb->data[0]; |
1592 | |||
1359 | BT_ERR("%s enable Intel manufacturer mode event failed (%02x)", | 1593 | BT_ERR("%s enable Intel manufacturer mode event failed (%02x)", |
1360 | hdev->name, evt_status); | 1594 | hdev->name, evt_status); |
1361 | kfree_skb(skb); | 1595 | kfree_skb(skb); |
@@ -1465,7 +1699,7 @@ static int btusb_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr) | |||
1465 | if (IS_ERR(skb)) { | 1699 | if (IS_ERR(skb)) { |
1466 | ret = PTR_ERR(skb); | 1700 | ret = PTR_ERR(skb); |
1467 | BT_ERR("%s: changing Intel device address failed (%ld)", | 1701 | BT_ERR("%s: changing Intel device address failed (%ld)", |
1468 | hdev->name, ret); | 1702 | hdev->name, ret); |
1469 | return ret; | 1703 | return ret; |
1470 | } | 1704 | } |
1471 | kfree_skb(skb); | 1705 | kfree_skb(skb); |
@@ -1540,19 +1774,19 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev) | |||
1540 | if (IS_ERR(skb)) { | 1774 | if (IS_ERR(skb)) { |
1541 | ret = PTR_ERR(skb); | 1775 | ret = PTR_ERR(skb); |
1542 | BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION failed (%ld)", | 1776 | BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION failed (%ld)", |
1543 | hdev->name, ret); | 1777 | hdev->name, ret); |
1544 | goto done; | 1778 | goto done; |
1545 | } | 1779 | } |
1546 | 1780 | ||
1547 | if (skb->len != sizeof(*ver)) { | 1781 | if (skb->len != sizeof(*ver)) { |
1548 | BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION event length mismatch", | 1782 | BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION event length mismatch", |
1549 | hdev->name); | 1783 | hdev->name); |
1550 | kfree_skb(skb); | 1784 | kfree_skb(skb); |
1551 | ret = -EIO; | 1785 | ret = -EIO; |
1552 | goto done; | 1786 | goto done; |
1553 | } | 1787 | } |
1554 | 1788 | ||
1555 | ver = (struct hci_rp_read_local_version *) skb->data; | 1789 | ver = (struct hci_rp_read_local_version *)skb->data; |
1556 | BT_INFO("%s: BCM: patching hci_ver=%02x hci_rev=%04x lmp_ver=%02x " | 1790 | BT_INFO("%s: BCM: patching hci_ver=%02x hci_rev=%04x lmp_ver=%02x " |
1557 | "lmp_subver=%04x", hdev->name, ver->hci_ver, ver->hci_rev, | 1791 | "lmp_subver=%04x", hdev->name, ver->hci_ver, ver->hci_rev, |
1558 | ver->lmp_ver, ver->lmp_subver); | 1792 | ver->lmp_ver, ver->lmp_subver); |
@@ -1563,7 +1797,7 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev) | |||
1563 | if (IS_ERR(skb)) { | 1797 | if (IS_ERR(skb)) { |
1564 | ret = PTR_ERR(skb); | 1798 | ret = PTR_ERR(skb); |
1565 | BT_ERR("%s: BCM: Download Minidrv command failed (%ld)", | 1799 | BT_ERR("%s: BCM: Download Minidrv command failed (%ld)", |
1566 | hdev->name, ret); | 1800 | hdev->name, ret); |
1567 | goto reset_fw; | 1801 | goto reset_fw; |
1568 | } | 1802 | } |
1569 | kfree_skb(skb); | 1803 | kfree_skb(skb); |
@@ -1575,13 +1809,13 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev) | |||
1575 | fw_size = fw->size; | 1809 | fw_size = fw->size; |
1576 | 1810 | ||
1577 | while (fw_size >= sizeof(*cmd)) { | 1811 | while (fw_size >= sizeof(*cmd)) { |
1578 | cmd = (struct hci_command_hdr *) fw_ptr; | 1812 | cmd = (struct hci_command_hdr *)fw_ptr; |
1579 | fw_ptr += sizeof(*cmd); | 1813 | fw_ptr += sizeof(*cmd); |
1580 | fw_size -= sizeof(*cmd); | 1814 | fw_size -= sizeof(*cmd); |
1581 | 1815 | ||
1582 | if (fw_size < cmd->plen) { | 1816 | if (fw_size < cmd->plen) { |
1583 | BT_ERR("%s: BCM: patch %s is corrupted", | 1817 | BT_ERR("%s: BCM: patch %s is corrupted", |
1584 | hdev->name, fw_name); | 1818 | hdev->name, fw_name); |
1585 | ret = -EINVAL; | 1819 | ret = -EINVAL; |
1586 | goto reset_fw; | 1820 | goto reset_fw; |
1587 | } | 1821 | } |
@@ -1597,7 +1831,7 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev) | |||
1597 | if (IS_ERR(skb)) { | 1831 | if (IS_ERR(skb)) { |
1598 | ret = PTR_ERR(skb); | 1832 | ret = PTR_ERR(skb); |
1599 | BT_ERR("%s: BCM: patch command %04x failed (%ld)", | 1833 | BT_ERR("%s: BCM: patch command %04x failed (%ld)", |
1600 | hdev->name, opcode, ret); | 1834 | hdev->name, opcode, ret); |
1601 | goto reset_fw; | 1835 | goto reset_fw; |
1602 | } | 1836 | } |
1603 | kfree_skb(skb); | 1837 | kfree_skb(skb); |
@@ -1622,19 +1856,19 @@ reset_fw: | |||
1622 | if (IS_ERR(skb)) { | 1856 | if (IS_ERR(skb)) { |
1623 | ret = PTR_ERR(skb); | 1857 | ret = PTR_ERR(skb); |
1624 | BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION failed (%ld)", | 1858 | BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION failed (%ld)", |
1625 | hdev->name, ret); | 1859 | hdev->name, ret); |
1626 | goto done; | 1860 | goto done; |
1627 | } | 1861 | } |
1628 | 1862 | ||
1629 | if (skb->len != sizeof(*ver)) { | 1863 | if (skb->len != sizeof(*ver)) { |
1630 | BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION event length mismatch", | 1864 | BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION event length mismatch", |
1631 | hdev->name); | 1865 | hdev->name); |
1632 | kfree_skb(skb); | 1866 | kfree_skb(skb); |
1633 | ret = -EIO; | 1867 | ret = -EIO; |
1634 | goto done; | 1868 | goto done; |
1635 | } | 1869 | } |
1636 | 1870 | ||
1637 | ver = (struct hci_rp_read_local_version *) skb->data; | 1871 | ver = (struct hci_rp_read_local_version *)skb->data; |
1638 | BT_INFO("%s: BCM: firmware hci_ver=%02x hci_rev=%04x lmp_ver=%02x " | 1872 | BT_INFO("%s: BCM: firmware hci_ver=%02x hci_rev=%04x lmp_ver=%02x " |
1639 | "lmp_subver=%04x", hdev->name, ver->hci_ver, ver->hci_rev, | 1873 | "lmp_subver=%04x", hdev->name, ver->hci_ver, ver->hci_rev, |
1640 | ver->lmp_ver, ver->lmp_subver); | 1874 | ver->lmp_ver, ver->lmp_subver); |
@@ -1646,19 +1880,19 @@ reset_fw: | |||
1646 | if (IS_ERR(skb)) { | 1880 | if (IS_ERR(skb)) { |
1647 | ret = PTR_ERR(skb); | 1881 | ret = PTR_ERR(skb); |
1648 | BT_ERR("%s: HCI_OP_READ_BD_ADDR failed (%ld)", | 1882 | BT_ERR("%s: HCI_OP_READ_BD_ADDR failed (%ld)", |
1649 | hdev->name, ret); | 1883 | hdev->name, ret); |
1650 | goto done; | 1884 | goto done; |
1651 | } | 1885 | } |
1652 | 1886 | ||
1653 | if (skb->len != sizeof(*bda)) { | 1887 | if (skb->len != sizeof(*bda)) { |
1654 | BT_ERR("%s: HCI_OP_READ_BD_ADDR event length mismatch", | 1888 | BT_ERR("%s: HCI_OP_READ_BD_ADDR event length mismatch", |
1655 | hdev->name); | 1889 | hdev->name); |
1656 | kfree_skb(skb); | 1890 | kfree_skb(skb); |
1657 | ret = -EIO; | 1891 | ret = -EIO; |
1658 | goto done; | 1892 | goto done; |
1659 | } | 1893 | } |
1660 | 1894 | ||
1661 | bda = (struct hci_rp_read_bd_addr *) skb->data; | 1895 | bda = (struct hci_rp_read_bd_addr *)skb->data; |
1662 | if (bda->status) { | 1896 | if (bda->status) { |
1663 | BT_ERR("%s: HCI_OP_READ_BD_ADDR error status (%02x)", | 1897 | BT_ERR("%s: HCI_OP_READ_BD_ADDR error status (%02x)", |
1664 | hdev->name, bda->status); | 1898 | hdev->name, bda->status); |
@@ -1693,7 +1927,7 @@ static int btusb_set_bdaddr_bcm(struct hci_dev *hdev, const bdaddr_t *bdaddr) | |||
1693 | if (IS_ERR(skb)) { | 1927 | if (IS_ERR(skb)) { |
1694 | ret = PTR_ERR(skb); | 1928 | ret = PTR_ERR(skb); |
1695 | BT_ERR("%s: BCM: Change address command failed (%ld)", | 1929 | BT_ERR("%s: BCM: Change address command failed (%ld)", |
1696 | hdev->name, ret); | 1930 | hdev->name, ret); |
1697 | return ret; | 1931 | return ret; |
1698 | } | 1932 | } |
1699 | kfree_skb(skb); | 1933 | kfree_skb(skb); |
@@ -1702,7 +1936,7 @@ static int btusb_set_bdaddr_bcm(struct hci_dev *hdev, const bdaddr_t *bdaddr) | |||
1702 | } | 1936 | } |
1703 | 1937 | ||
1704 | static int btusb_probe(struct usb_interface *intf, | 1938 | static int btusb_probe(struct usb_interface *intf, |
1705 | const struct usb_device_id *id) | 1939 | const struct usb_device_id *id) |
1706 | { | 1940 | { |
1707 | struct usb_endpoint_descriptor *ep_desc; | 1941 | struct usb_endpoint_descriptor *ep_desc; |
1708 | struct btusb_data *data; | 1942 | struct btusb_data *data; |
@@ -1717,6 +1951,7 @@ static int btusb_probe(struct usb_interface *intf, | |||
1717 | 1951 | ||
1718 | if (!id->driver_info) { | 1952 | if (!id->driver_info) { |
1719 | const struct usb_device_id *match; | 1953 | const struct usb_device_id *match; |
1954 | |||
1720 | match = usb_match_id(intf, blacklist_table); | 1955 | match = usb_match_id(intf, blacklist_table); |
1721 | if (match) | 1956 | if (match) |
1722 | id = match; | 1957 | id = match; |
@@ -1765,17 +2000,16 @@ static int btusb_probe(struct usb_interface *intf, | |||
1765 | data->udev = interface_to_usbdev(intf); | 2000 | data->udev = interface_to_usbdev(intf); |
1766 | data->intf = intf; | 2001 | data->intf = intf; |
1767 | 2002 | ||
1768 | spin_lock_init(&data->lock); | ||
1769 | |||
1770 | INIT_WORK(&data->work, btusb_work); | 2003 | INIT_WORK(&data->work, btusb_work); |
1771 | INIT_WORK(&data->waker, btusb_waker); | 2004 | INIT_WORK(&data->waker, btusb_waker); |
2005 | init_usb_anchor(&data->deferred); | ||
2006 | init_usb_anchor(&data->tx_anchor); | ||
1772 | spin_lock_init(&data->txlock); | 2007 | spin_lock_init(&data->txlock); |
1773 | 2008 | ||
1774 | init_usb_anchor(&data->tx_anchor); | ||
1775 | init_usb_anchor(&data->intr_anchor); | 2009 | init_usb_anchor(&data->intr_anchor); |
1776 | init_usb_anchor(&data->bulk_anchor); | 2010 | init_usb_anchor(&data->bulk_anchor); |
1777 | init_usb_anchor(&data->isoc_anchor); | 2011 | init_usb_anchor(&data->isoc_anchor); |
1778 | init_usb_anchor(&data->deferred); | 2012 | spin_lock_init(&data->rxlock); |
1779 | 2013 | ||
1780 | hdev = hci_alloc_dev(); | 2014 | hdev = hci_alloc_dev(); |
1781 | if (!hdev) | 2015 | if (!hdev) |
@@ -1867,7 +2101,7 @@ static int btusb_probe(struct usb_interface *intf, | |||
1867 | 2101 | ||
1868 | if (data->isoc) { | 2102 | if (data->isoc) { |
1869 | err = usb_driver_claim_interface(&btusb_driver, | 2103 | err = usb_driver_claim_interface(&btusb_driver, |
1870 | data->isoc, data); | 2104 | data->isoc, data); |
1871 | if (err < 0) { | 2105 | if (err < 0) { |
1872 | hci_free_dev(hdev); | 2106 | hci_free_dev(hdev); |
1873 | return err; | 2107 | return err; |
@@ -1908,6 +2142,7 @@ static void btusb_disconnect(struct usb_interface *intf) | |||
1908 | else if (data->isoc) | 2142 | else if (data->isoc) |
1909 | usb_driver_release_interface(&btusb_driver, data->isoc); | 2143 | usb_driver_release_interface(&btusb_driver, data->isoc); |
1910 | 2144 | ||
2145 | btusb_free_frags(data); | ||
1911 | hci_free_dev(hdev); | 2146 | hci_free_dev(hdev); |
1912 | } | 2147 | } |
1913 | 2148 | ||