git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
This commit was manufactured by cvs2svn to create tag
[linux-2.6.git]
/
drivers
/
bluetooth
/
hci_usb.c
diff --git
a/drivers/bluetooth/hci_usb.c
b/drivers/bluetooth/hci_usb.c
index
9babb21
..
1874deb
100644
(file)
--- a/
drivers/bluetooth/hci_usb.c
+++ b/
drivers/bluetooth/hci_usb.c
@@
-65,7
+65,7
@@
#define URB_ZERO_PACKET 0
#endif
#define URB_ZERO_PACKET 0
#endif
-#define VERSION "2.
7
"
+#define VERSION "2.
6
"
static struct usb_driver hci_usb_driver;
static struct usb_driver hci_usb_driver;
@@
-76,15
+76,14
@@
static struct usb_device_id bluetooth_ids[] = {
/* AVM BlueFRITZ! USB v2.0 */
{ USB_DEVICE(0x057c, 0x3800) },
/* AVM BlueFRITZ! USB v2.0 */
{ USB_DEVICE(0x057c, 0x3800) },
- /*
Bluetooth Ultraport Module from IBM
*/
- { USB_DEVICE(0x0
4bf, 0x030a
) },
+ /*
Ericsson with non-standard id
*/
+ { USB_DEVICE(0x0
bdb, 0x1002
) },
- /* ALPS Modules with non-standard id */
- { USB_DEVICE(0x044e, 0x3001) },
+ /* ALPS Module with non-standard id */
{ USB_DEVICE(0x044e, 0x3002) },
{ USB_DEVICE(0x044e, 0x3002) },
- /*
Ericsson with non-standard id
*/
- { USB_DEVICE(0x0
bdb, 0x1002
) },
+ /*
Bluetooth Ultraport Module from IBM
*/
+ { USB_DEVICE(0x0
4bf, 0x030a
) },
{ } /* Terminating entry */
};
{ } /* Terminating entry */
};
@@
-98,9
+97,6
@@
static struct usb_device_id blacklist_ids[] = {
/* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = HCI_RESET },
/* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = HCI_RESET },
- /* ISSC Bluetooth Adapter v3.1 */
- { USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET },
-
/* Digianswer device */
{ USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER },
/* Digianswer device */
{ USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER },
@@
-342,18
+338,26
@@
static int hci_usb_flush(struct hci_dev *hdev)
BT_DBG("%s", hdev->name);
BT_DBG("%s", hdev->name);
- for (i
=
0; i < 4; i++)
+ for (i
=
0; i < 4; i++)
skb_queue_purge(&husb->transmit_q[i]);
return 0;
}
skb_queue_purge(&husb->transmit_q[i]);
return 0;
}
+static inline void hci_usb_wait_for_urb(struct urb *urb)
+{
+ while (atomic_read(&urb->kref.refcount) > 1) {
+ current->state = TASK_UNINTERRUPTIBLE;
+ schedule_timeout((5 * HZ + 999) / 1000);
+ }
+}
+
static void hci_usb_unlink_urbs(struct hci_usb *husb)
{
int i;
BT_DBG("%s", husb->hdev->name);
static void hci_usb_unlink_urbs(struct hci_usb *husb)
{
int i;
BT_DBG("%s", husb->hdev->name);
- for (i
=
0; i < 4; i++) {
+ for (i
=
0; i < 4; i++) {
struct _urb *_urb;
struct urb *urb;
struct _urb *_urb;
struct urb *urb;
@@
-362,7
+366,8
@@
static void hci_usb_unlink_urbs(struct hci_usb *husb)
urb = &_urb->urb;
BT_DBG("%s unlinking _urb %p type %d urb %p",
husb->hdev->name, _urb, _urb->type, urb);
urb = &_urb->urb;
BT_DBG("%s unlinking _urb %p type %d urb %p",
husb->hdev->name, _urb, _urb->type, urb);
- usb_kill_urb(urb);
+ usb_unlink_urb(urb);
+ hci_usb_wait_for_urb(urb);
_urb_queue_tail(__completed_q(husb, _urb->type), _urb);
}
_urb_queue_tail(__completed_q(husb, _urb->type), _urb);
}