1 // SPDX-License-Identifier: GPL-2.0-or-later
4 * Digianswer Bluetooth USB driver
6 * Copyright (C) 2004-2007 Marcel Holtmann <marcel@holtmann.org>
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/init.h>
12 #include <linux/slab.h>
13 #include <linux/types.h>
14 #include <linux/sched.h>
15 #include <linux/errno.h>
16 #include <linux/skbuff.h>
18 #include <linux/usb.h>
20 #include <net/bluetooth/bluetooth.h>
21 #include <net/bluetooth/hci_core.h>
25 #define VERSION "0.11"
27 static const struct usb_device_id bpa10x_table
[] = {
28 /* Tektronix BPA 100/105 (Digianswer) */
29 { USB_DEVICE(0x08fd, 0x0002) },
31 { } /* Terminating entry */
34 MODULE_DEVICE_TABLE(usb
, bpa10x_table
);
38 struct usb_device
*udev
;
40 struct usb_anchor tx_anchor
;
41 struct usb_anchor rx_anchor
;
43 struct sk_buff
*rx_skb
[2];
46 static void bpa10x_tx_complete(struct urb
*urb
)
48 struct sk_buff
*skb
= urb
->context
;
49 struct hci_dev
*hdev
= (struct hci_dev
*) skb
->dev
;
51 BT_DBG("%s urb %p status %d count %d", hdev
->name
,
52 urb
, urb
->status
, urb
->actual_length
);
54 if (!test_bit(HCI_RUNNING
, &hdev
->flags
))
58 hdev
->stat
.byte_tx
+= urb
->transfer_buffer_length
;
63 kfree(urb
->setup_packet
);
68 #define HCI_VENDOR_HDR_SIZE 5
70 #define HCI_RECV_VENDOR \
71 .type = HCI_VENDOR_PKT, \
72 .hlen = HCI_VENDOR_HDR_SIZE, \
75 .maxlen = HCI_MAX_FRAME_SIZE
77 static const struct h4_recv_pkt bpa10x_recv_pkts
[] = {
78 { H4_RECV_ACL
, .recv
= hci_recv_frame
},
79 { H4_RECV_SCO
, .recv
= hci_recv_frame
},
80 { H4_RECV_EVENT
, .recv
= hci_recv_frame
},
81 { HCI_RECV_VENDOR
, .recv
= hci_recv_diag
},
84 static void bpa10x_rx_complete(struct urb
*urb
)
86 struct hci_dev
*hdev
= urb
->context
;
87 struct bpa10x_data
*data
= hci_get_drvdata(hdev
);
90 BT_DBG("%s urb %p status %d count %d", hdev
->name
,
91 urb
, urb
->status
, urb
->actual_length
);
93 if (!test_bit(HCI_RUNNING
, &hdev
->flags
))
96 if (urb
->status
== 0) {
97 bool idx
= usb_pipebulk(urb
->pipe
);
99 data
->rx_skb
[idx
] = h4_recv_buf(hdev
, data
->rx_skb
[idx
],
100 urb
->transfer_buffer
,
103 ARRAY_SIZE(bpa10x_recv_pkts
));
104 if (IS_ERR(data
->rx_skb
[idx
])) {
105 bt_dev_err(hdev
, "corrupted event packet");
107 data
->rx_skb
[idx
] = NULL
;
111 usb_anchor_urb(urb
, &data
->rx_anchor
);
113 err
= usb_submit_urb(urb
, GFP_ATOMIC
);
115 bt_dev_err(hdev
, "urb %p failed to resubmit (%d)", urb
, -err
);
116 usb_unanchor_urb(urb
);
120 static inline int bpa10x_submit_intr_urb(struct hci_dev
*hdev
)
122 struct bpa10x_data
*data
= hci_get_drvdata(hdev
);
128 BT_DBG("%s", hdev
->name
);
130 urb
= usb_alloc_urb(0, GFP_KERNEL
);
134 buf
= kmalloc(size
, GFP_KERNEL
);
140 pipe
= usb_rcvintpipe(data
->udev
, 0x81);
142 usb_fill_int_urb(urb
, data
->udev
, pipe
, buf
, size
,
143 bpa10x_rx_complete
, hdev
, 1);
145 urb
->transfer_flags
|= URB_FREE_BUFFER
;
147 usb_anchor_urb(urb
, &data
->rx_anchor
);
149 err
= usb_submit_urb(urb
, GFP_KERNEL
);
151 bt_dev_err(hdev
, "urb %p submission failed (%d)", urb
, -err
);
152 usb_unanchor_urb(urb
);
160 static inline int bpa10x_submit_bulk_urb(struct hci_dev
*hdev
)
162 struct bpa10x_data
*data
= hci_get_drvdata(hdev
);
168 BT_DBG("%s", hdev
->name
);
170 urb
= usb_alloc_urb(0, GFP_KERNEL
);
174 buf
= kmalloc(size
, GFP_KERNEL
);
180 pipe
= usb_rcvbulkpipe(data
->udev
, 0x82);
182 usb_fill_bulk_urb(urb
, data
->udev
, pipe
,
183 buf
, size
, bpa10x_rx_complete
, hdev
);
185 urb
->transfer_flags
|= URB_FREE_BUFFER
;
187 usb_anchor_urb(urb
, &data
->rx_anchor
);
189 err
= usb_submit_urb(urb
, GFP_KERNEL
);
191 bt_dev_err(hdev
, "urb %p submission failed (%d)", urb
, -err
);
192 usb_unanchor_urb(urb
);
200 static int bpa10x_open(struct hci_dev
*hdev
)
202 struct bpa10x_data
*data
= hci_get_drvdata(hdev
);
205 BT_DBG("%s", hdev
->name
);
207 err
= bpa10x_submit_intr_urb(hdev
);
211 err
= bpa10x_submit_bulk_urb(hdev
);
218 usb_kill_anchored_urbs(&data
->rx_anchor
);
223 static int bpa10x_close(struct hci_dev
*hdev
)
225 struct bpa10x_data
*data
= hci_get_drvdata(hdev
);
227 BT_DBG("%s", hdev
->name
);
229 usb_kill_anchored_urbs(&data
->rx_anchor
);
234 static int bpa10x_flush(struct hci_dev
*hdev
)
236 struct bpa10x_data
*data
= hci_get_drvdata(hdev
);
238 BT_DBG("%s", hdev
->name
);
240 usb_kill_anchored_urbs(&data
->tx_anchor
);
245 static int bpa10x_setup(struct hci_dev
*hdev
)
247 static const u8 req
[] = { 0x07 };
250 BT_DBG("%s", hdev
->name
);
252 /* Read revision string */
253 skb
= __hci_cmd_sync(hdev
, 0xfc0e, sizeof(req
), req
, HCI_INIT_TIMEOUT
);
257 bt_dev_info(hdev
, "%s", (char *)(skb
->data
+ 1));
259 hci_set_fw_info(hdev
, "%s", skb
->data
+ 1);
265 static int bpa10x_send_frame(struct hci_dev
*hdev
, struct sk_buff
*skb
)
267 struct bpa10x_data
*data
= hci_get_drvdata(hdev
);
268 struct usb_ctrlrequest
*dr
;
273 BT_DBG("%s", hdev
->name
);
275 skb
->dev
= (void *) hdev
;
277 urb
= usb_alloc_urb(0, GFP_KERNEL
);
281 /* Prepend skb with frame type */
282 *(u8
*)skb_push(skb
, 1) = hci_skb_pkt_type(skb
);
284 switch (hci_skb_pkt_type(skb
)) {
285 case HCI_COMMAND_PKT
:
286 dr
= kmalloc(sizeof(*dr
), GFP_KERNEL
);
292 dr
->bRequestType
= USB_TYPE_VENDOR
;
296 dr
->wLength
= __cpu_to_le16(skb
->len
);
298 pipe
= usb_sndctrlpipe(data
->udev
, 0x00);
300 usb_fill_control_urb(urb
, data
->udev
, pipe
, (void *) dr
,
301 skb
->data
, skb
->len
, bpa10x_tx_complete
, skb
);
306 case HCI_ACLDATA_PKT
:
307 pipe
= usb_sndbulkpipe(data
->udev
, 0x02);
309 usb_fill_bulk_urb(urb
, data
->udev
, pipe
,
310 skb
->data
, skb
->len
, bpa10x_tx_complete
, skb
);
315 case HCI_SCODATA_PKT
:
316 pipe
= usb_sndbulkpipe(data
->udev
, 0x02);
318 usb_fill_bulk_urb(urb
, data
->udev
, pipe
,
319 skb
->data
, skb
->len
, bpa10x_tx_complete
, skb
);
329 usb_anchor_urb(urb
, &data
->tx_anchor
);
331 err
= usb_submit_urb(urb
, GFP_KERNEL
);
333 bt_dev_err(hdev
, "urb %p submission failed", urb
);
334 kfree(urb
->setup_packet
);
335 usb_unanchor_urb(urb
);
343 static int bpa10x_set_diag(struct hci_dev
*hdev
, bool enable
)
345 const u8 req
[] = { 0x00, enable
};
348 BT_DBG("%s", hdev
->name
);
350 if (!test_bit(HCI_RUNNING
, &hdev
->flags
))
353 /* Enable sniffer operation */
354 skb
= __hci_cmd_sync(hdev
, 0xfc0e, sizeof(req
), req
, HCI_INIT_TIMEOUT
);
362 static int bpa10x_probe(struct usb_interface
*intf
,
363 const struct usb_device_id
*id
)
365 struct bpa10x_data
*data
;
366 struct hci_dev
*hdev
;
369 BT_DBG("intf %p id %p", intf
, id
);
371 if (intf
->cur_altsetting
->desc
.bInterfaceNumber
!= 0)
374 data
= devm_kzalloc(&intf
->dev
, sizeof(*data
), GFP_KERNEL
);
378 data
->udev
= interface_to_usbdev(intf
);
380 init_usb_anchor(&data
->tx_anchor
);
381 init_usb_anchor(&data
->rx_anchor
);
383 hdev
= hci_alloc_dev();
388 hci_set_drvdata(hdev
, data
);
392 SET_HCIDEV_DEV(hdev
, &intf
->dev
);
394 hdev
->open
= bpa10x_open
;
395 hdev
->close
= bpa10x_close
;
396 hdev
->flush
= bpa10x_flush
;
397 hdev
->setup
= bpa10x_setup
;
398 hdev
->send
= bpa10x_send_frame
;
399 hdev
->set_diag
= bpa10x_set_diag
;
401 set_bit(HCI_QUIRK_RESET_ON_CLOSE
, &hdev
->quirks
);
403 err
= hci_register_dev(hdev
);
409 usb_set_intfdata(intf
, data
);
414 static void bpa10x_disconnect(struct usb_interface
*intf
)
416 struct bpa10x_data
*data
= usb_get_intfdata(intf
);
418 BT_DBG("intf %p", intf
);
423 usb_set_intfdata(intf
, NULL
);
425 hci_unregister_dev(data
->hdev
);
427 hci_free_dev(data
->hdev
);
428 kfree_skb(data
->rx_skb
[0]);
429 kfree_skb(data
->rx_skb
[1]);
432 static struct usb_driver bpa10x_driver
= {
434 .probe
= bpa10x_probe
,
435 .disconnect
= bpa10x_disconnect
,
436 .id_table
= bpa10x_table
,
437 .disable_hub_initiated_lpm
= 1,
440 module_usb_driver(bpa10x_driver
);
442 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
443 MODULE_DESCRIPTION("Digianswer Bluetooth USB driver ver " VERSION
);
444 MODULE_VERSION(VERSION
);
445 MODULE_LICENSE("GPL");