1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * 4 * Digianswer Bluetooth USB driver 5 * 6 * Copyright (C) 2004-2007 Marcel Holtmann <marcel@holtmann.org> 7 */ 8 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> 17 18 #include <linux/usb.h> 19 20 #include <net/bluetooth/bluetooth.h> 21 #include <net/bluetooth/hci_core.h> 22 23 #include "h4_recv.h" 24 25 #define VERSION "0.11" 26 27 static const struct usb_device_id bpa10x_table[] = { 28 /* Tektronix BPA 100/105 (Digianswer) */ 29 { USB_DEVICE(0x08fd, 0x0002) }, 30 31 { } /* Terminating entry */ 32 }; 33 34 MODULE_DEVICE_TABLE(usb, bpa10x_table); 35 36 struct bpa10x_data { 37 struct hci_dev *hdev; 38 struct usb_device *udev; 39 40 struct usb_anchor tx_anchor; 41 struct usb_anchor rx_anchor; 42 43 struct sk_buff *rx_skb[2]; 44 }; 45 46 static void bpa10x_tx_complete(struct urb *urb) 47 { 48 struct sk_buff *skb = urb->context; 49 struct hci_dev *hdev = (struct hci_dev *) skb->dev; 50 51 BT_DBG("%s urb %p status %d count %d", hdev->name, 52 urb, urb->status, urb->actual_length); 53 54 if (!test_bit(HCI_RUNNING, &hdev->flags)) 55 goto done; 56 57 if (!urb->status) 58 hdev->stat.byte_tx += urb->transfer_buffer_length; 59 else 60 hdev->stat.err_tx++; 61 62 done: 63 kfree(urb->setup_packet); 64 65 kfree_skb(skb); 66 } 67 68 #define HCI_VENDOR_HDR_SIZE 5 69 70 #define HCI_RECV_VENDOR \ 71 .type = HCI_VENDOR_PKT, \ 72 .hlen = HCI_VENDOR_HDR_SIZE, \ 73 .loff = 3, \ 74 .lsize = 2, \ 75 .maxlen = HCI_MAX_FRAME_SIZE 76 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 }, 82 }; 83 84 static void bpa10x_rx_complete(struct urb *urb) 85 { 86 struct hci_dev *hdev = urb->context; 87 struct bpa10x_data *data = hci_get_drvdata(hdev); 88 int err; 89 90 BT_DBG("%s urb %p status %d count %d", hdev->name, 91 urb, urb->status, urb->actual_length); 92 93 if (!test_bit(HCI_RUNNING, &hdev->flags)) 94 return; 95 96 if (urb->status == 0) { 97 bool idx = usb_pipebulk(urb->pipe); 98 99 data->rx_skb[idx] = h4_recv_buf(hdev, data->rx_skb[idx], 100 urb->transfer_buffer, 101 urb->actual_length, 102 bpa10x_recv_pkts, 103 ARRAY_SIZE(bpa10x_recv_pkts)); 104 if (IS_ERR(data->rx_skb[idx])) { 105 bt_dev_err(hdev, "corrupted event packet"); 106 hdev->stat.err_rx++; 107 data->rx_skb[idx] = NULL; 108 } 109 } 110 111 usb_anchor_urb(urb, &data->rx_anchor); 112 113 err = usb_submit_urb(urb, GFP_ATOMIC); 114 if (err < 0) { 115 bt_dev_err(hdev, "urb %p failed to resubmit (%d)", urb, -err); 116 usb_unanchor_urb(urb); 117 } 118 } 119 120 static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev) 121 { 122 struct bpa10x_data *data = hci_get_drvdata(hdev); 123 struct urb *urb; 124 unsigned char *buf; 125 unsigned int pipe; 126 int err, size = 16; 127 128 BT_DBG("%s", hdev->name); 129 130 urb = usb_alloc_urb(0, GFP_KERNEL); 131 if (!urb) 132 return -ENOMEM; 133 134 buf = kmalloc(size, GFP_KERNEL); 135 if (!buf) { 136 usb_free_urb(urb); 137 return -ENOMEM; 138 } 139 140 pipe = usb_rcvintpipe(data->udev, 0x81); 141 142 usb_fill_int_urb(urb, data->udev, pipe, buf, size, 143 bpa10x_rx_complete, hdev, 1); 144 145 urb->transfer_flags |= URB_FREE_BUFFER; 146 147 usb_anchor_urb(urb, &data->rx_anchor); 148 149 err = usb_submit_urb(urb, GFP_KERNEL); 150 if (err < 0) { 151 bt_dev_err(hdev, "urb %p submission failed (%d)", urb, -err); 152 usb_unanchor_urb(urb); 153 } 154 155 usb_free_urb(urb); 156 157 return err; 158 } 159 160 static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev) 161 { 162 struct bpa10x_data *data = hci_get_drvdata(hdev); 163 struct urb *urb; 164 unsigned char *buf; 165 unsigned int pipe; 166 int err, size = 64; 167 168 BT_DBG("%s", hdev->name); 169 170 urb = usb_alloc_urb(0, GFP_KERNEL); 171 if (!urb) 172 return -ENOMEM; 173 174 buf = kmalloc(size, GFP_KERNEL); 175 if (!buf) { 176 usb_free_urb(urb); 177 return -ENOMEM; 178 } 179 180 pipe = usb_rcvbulkpipe(data->udev, 0x82); 181 182 usb_fill_bulk_urb(urb, data->udev, pipe, 183 buf, size, bpa10x_rx_complete, hdev); 184 185 urb->transfer_flags |= URB_FREE_BUFFER; 186 187 usb_anchor_urb(urb, &data->rx_anchor); 188 189 err = usb_submit_urb(urb, GFP_KERNEL); 190 if (err < 0) { 191 bt_dev_err(hdev, "urb %p submission failed (%d)", urb, -err); 192 usb_unanchor_urb(urb); 193 } 194 195 usb_free_urb(urb); 196 197 return err; 198 } 199 200 static int bpa10x_open(struct hci_dev *hdev) 201 { 202 struct bpa10x_data *data = hci_get_drvdata(hdev); 203 int err; 204 205 BT_DBG("%s", hdev->name); 206 207 err = bpa10x_submit_intr_urb(hdev); 208 if (err < 0) 209 goto error; 210 211 err = bpa10x_submit_bulk_urb(hdev); 212 if (err < 0) 213 goto error; 214 215 return 0; 216 217 error: 218 usb_kill_anchored_urbs(&data->rx_anchor); 219 220 return err; 221 } 222 223 static int bpa10x_close(struct hci_dev *hdev) 224 { 225 struct bpa10x_data *data = hci_get_drvdata(hdev); 226 227 BT_DBG("%s", hdev->name); 228 229 usb_kill_anchored_urbs(&data->rx_anchor); 230 231 return 0; 232 } 233 234 static int bpa10x_flush(struct hci_dev *hdev) 235 { 236 struct bpa10x_data *data = hci_get_drvdata(hdev); 237 238 BT_DBG("%s", hdev->name); 239 240 usb_kill_anchored_urbs(&data->tx_anchor); 241 242 return 0; 243 } 244 245 static int bpa10x_setup(struct hci_dev *hdev) 246 { 247 static const u8 req[] = { 0x07 }; 248 struct sk_buff *skb; 249 250 BT_DBG("%s", hdev->name); 251 252 /* Read revision string */ 253 skb = __hci_cmd_sync(hdev, 0xfc0e, sizeof(req), req, HCI_INIT_TIMEOUT); 254 if (IS_ERR(skb)) 255 return PTR_ERR(skb); 256 257 bt_dev_info(hdev, "%s", (char *)(skb->data + 1)); 258 259 hci_set_fw_info(hdev, "%s", skb->data + 1); 260 261 kfree_skb(skb); 262 return 0; 263 } 264 265 static int bpa10x_send_frame(struct hci_dev *hdev, struct sk_buff *skb) 266 { 267 struct bpa10x_data *data = hci_get_drvdata(hdev); 268 struct usb_ctrlrequest *dr; 269 struct urb *urb; 270 unsigned int pipe; 271 int err; 272 273 BT_DBG("%s", hdev->name); 274 275 skb->dev = (void *) hdev; 276 277 urb = usb_alloc_urb(0, GFP_KERNEL); 278 if (!urb) 279 return -ENOMEM; 280 281 /* Prepend skb with frame type */ 282 *(u8 *)skb_push(skb, 1) = hci_skb_pkt_type(skb); 283 284 switch (hci_skb_pkt_type(skb)) { 285 case HCI_COMMAND_PKT: 286 dr = kmalloc(sizeof(*dr), GFP_KERNEL); 287 if (!dr) { 288 usb_free_urb(urb); 289 return -ENOMEM; 290 } 291 292 dr->bRequestType = USB_TYPE_VENDOR; 293 dr->bRequest = 0; 294 dr->wIndex = 0; 295 dr->wValue = 0; 296 dr->wLength = __cpu_to_le16(skb->len); 297 298 pipe = usb_sndctrlpipe(data->udev, 0x00); 299 300 usb_fill_control_urb(urb, data->udev, pipe, (void *) dr, 301 skb->data, skb->len, bpa10x_tx_complete, skb); 302 303 hdev->stat.cmd_tx++; 304 break; 305 306 case HCI_ACLDATA_PKT: 307 pipe = usb_sndbulkpipe(data->udev, 0x02); 308 309 usb_fill_bulk_urb(urb, data->udev, pipe, 310 skb->data, skb->len, bpa10x_tx_complete, skb); 311 312 hdev->stat.acl_tx++; 313 break; 314 315 case HCI_SCODATA_PKT: 316 pipe = usb_sndbulkpipe(data->udev, 0x02); 317 318 usb_fill_bulk_urb(urb, data->udev, pipe, 319 skb->data, skb->len, bpa10x_tx_complete, skb); 320 321 hdev->stat.sco_tx++; 322 break; 323 324 default: 325 usb_free_urb(urb); 326 return -EILSEQ; 327 } 328 329 usb_anchor_urb(urb, &data->tx_anchor); 330 331 err = usb_submit_urb(urb, GFP_KERNEL); 332 if (err < 0) { 333 bt_dev_err(hdev, "urb %p submission failed", urb); 334 kfree(urb->setup_packet); 335 usb_unanchor_urb(urb); 336 } 337 338 usb_free_urb(urb); 339 340 return 0; 341 } 342 343 static int bpa10x_set_diag(struct hci_dev *hdev, bool enable) 344 { 345 const u8 req[] = { 0x00, enable }; 346 struct sk_buff *skb; 347 348 BT_DBG("%s", hdev->name); 349 350 if (!test_bit(HCI_RUNNING, &hdev->flags)) 351 return -ENETDOWN; 352 353 /* Enable sniffer operation */ 354 skb = __hci_cmd_sync(hdev, 0xfc0e, sizeof(req), req, HCI_INIT_TIMEOUT); 355 if (IS_ERR(skb)) 356 return PTR_ERR(skb); 357 358 kfree_skb(skb); 359 return 0; 360 } 361 362 static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *id) 363 { 364 struct bpa10x_data *data; 365 struct hci_dev *hdev; 366 int err; 367 368 BT_DBG("intf %p id %p", intf, id); 369 370 if (intf->cur_altsetting->desc.bInterfaceNumber != 0) 371 return -ENODEV; 372 373 data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL); 374 if (!data) 375 return -ENOMEM; 376 377 data->udev = interface_to_usbdev(intf); 378 379 init_usb_anchor(&data->tx_anchor); 380 init_usb_anchor(&data->rx_anchor); 381 382 hdev = hci_alloc_dev(); 383 if (!hdev) 384 return -ENOMEM; 385 386 hdev->bus = HCI_USB; 387 hci_set_drvdata(hdev, data); 388 389 data->hdev = hdev; 390 391 SET_HCIDEV_DEV(hdev, &intf->dev); 392 393 hdev->open = bpa10x_open; 394 hdev->close = bpa10x_close; 395 hdev->flush = bpa10x_flush; 396 hdev->setup = bpa10x_setup; 397 hdev->send = bpa10x_send_frame; 398 hdev->set_diag = bpa10x_set_diag; 399 400 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); 401 402 err = hci_register_dev(hdev); 403 if (err < 0) { 404 hci_free_dev(hdev); 405 return err; 406 } 407 408 usb_set_intfdata(intf, data); 409 410 return 0; 411 } 412 413 static void bpa10x_disconnect(struct usb_interface *intf) 414 { 415 struct bpa10x_data *data = usb_get_intfdata(intf); 416 417 BT_DBG("intf %p", intf); 418 419 if (!data) 420 return; 421 422 usb_set_intfdata(intf, NULL); 423 424 hci_unregister_dev(data->hdev); 425 426 hci_free_dev(data->hdev); 427 kfree_skb(data->rx_skb[0]); 428 kfree_skb(data->rx_skb[1]); 429 } 430 431 static struct usb_driver bpa10x_driver = { 432 .name = "bpa10x", 433 .probe = bpa10x_probe, 434 .disconnect = bpa10x_disconnect, 435 .id_table = bpa10x_table, 436 .disable_hub_initiated_lpm = 1, 437 }; 438 439 module_usb_driver(bpa10x_driver); 440 441 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); 442 MODULE_DESCRIPTION("Digianswer Bluetooth USB driver ver " VERSION); 443 MODULE_VERSION(VERSION); 444 MODULE_LICENSE("GPL"); 445