• Home
  • Raw
  • Download

Lines Matching +full:non +full:- +full:secure +full:- +full:otp

1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Copyright (C) 2005-2008 Marcel Holtmann <marcel@holtmann.org>
74 /* Apple-specific (Broadcom) devices */
111 /* ALPS Modules with non-standard id */
115 /* Ericsson with non-standard id */
118 /* Canyon CN-BTU1 with HID interfaces */
135 /* Foxconn - Hon Hai */
139 /* Lite-On Technology - Broadcom based */
147 /* ASUSTek Computer - Broadcom based */
151 /* Belkin F8065bf - Broadcom based */
155 /* IMC Networks - Broadcom based */
159 /* Dell Computer - Broadcom based */
163 /* Toshiba Corp - Broadcom based */
328 /* Asus WL-BTD202 device */
595 int oob_wake_irq; /* irq for out-of-band wake-on-bt */
602 struct gpio_desc *reset_gpio = data->reset_gpio; in btusb_intel_cmd_timeout()
604 if (++data->cmd_timeout_cnt < 5) in btusb_intel_cmd_timeout()
619 if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { in btusb_intel_cmd_timeout()
633 struct gpio_desc *reset_gpio = data->reset_gpio; in btusb_rtl_cmd_timeout()
635 if (++data->cmd_timeout_cnt < 5) in btusb_rtl_cmd_timeout()
649 if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { in btusb_rtl_cmd_timeout()
665 if (++data->cmd_timeout_cnt < 5) in btusb_qca_cmd_timeout()
670 err = usb_autopm_get_interface(data->intf); in btusb_qca_cmd_timeout()
672 usb_queue_reset_device(data->intf); in btusb_qca_cmd_timeout()
681 spin_lock_irqsave(&data->rxlock, flags); in btusb_free_frags()
683 dev_kfree_skb_irq(data->evt_skb); in btusb_free_frags()
684 data->evt_skb = NULL; in btusb_free_frags()
686 dev_kfree_skb_irq(data->acl_skb); in btusb_free_frags()
687 data->acl_skb = NULL; in btusb_free_frags()
689 dev_kfree_skb_irq(data->sco_skb); in btusb_free_frags()
690 data->sco_skb = NULL; in btusb_free_frags()
692 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_free_frags()
701 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_intr()
702 skb = data->evt_skb; in btusb_recv_intr()
710 err = -ENOMEM; in btusb_recv_intr()
721 count -= len; in btusb_recv_intr()
723 hci_skb_expect(skb) -= len; in btusb_recv_intr()
725 if (skb->len == HCI_EVENT_HDR_SIZE) { in btusb_recv_intr()
727 hci_skb_expect(skb) = hci_event_hdr(skb)->plen; in btusb_recv_intr()
733 err = -EILSEQ; in btusb_recv_intr()
740 data->recv_event(data->hdev, skb); in btusb_recv_intr()
745 data->evt_skb = skb; in btusb_recv_intr()
746 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_intr()
757 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_bulk()
758 skb = data->acl_skb; in btusb_recv_bulk()
766 err = -ENOMEM; in btusb_recv_bulk()
777 count -= len; in btusb_recv_bulk()
779 hci_skb_expect(skb) -= len; in btusb_recv_bulk()
781 if (skb->len == HCI_ACL_HDR_SIZE) { in btusb_recv_bulk()
782 __le16 dlen = hci_acl_hdr(skb)->dlen; in btusb_recv_bulk()
791 err = -EILSEQ; in btusb_recv_bulk()
798 hci_recv_frame(data->hdev, skb); in btusb_recv_bulk()
803 data->acl_skb = skb; in btusb_recv_bulk()
804 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_bulk()
815 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_isoc()
816 skb = data->sco_skb; in btusb_recv_isoc()
824 err = -ENOMEM; in btusb_recv_isoc()
835 count -= len; in btusb_recv_isoc()
837 hci_skb_expect(skb) -= len; in btusb_recv_isoc()
839 if (skb->len == HCI_SCO_HDR_SIZE) { in btusb_recv_isoc()
841 hci_skb_expect(skb) = hci_sco_hdr(skb)->dlen; in btusb_recv_isoc()
847 err = -EILSEQ; in btusb_recv_isoc()
854 hci_recv_frame(data->hdev, skb); in btusb_recv_isoc()
859 data->sco_skb = skb; in btusb_recv_isoc()
860 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_isoc()
867 struct hci_dev *hdev = urb->context; in btusb_intr_complete()
871 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_intr_complete()
872 urb->actual_length); in btusb_intr_complete()
874 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_intr_complete()
877 if (urb->status == 0) { in btusb_intr_complete()
878 hdev->stat.byte_rx += urb->actual_length; in btusb_intr_complete()
880 if (btusb_recv_intr(data, urb->transfer_buffer, in btusb_intr_complete()
881 urb->actual_length) < 0) { in btusb_intr_complete()
883 hdev->stat.err_rx++; in btusb_intr_complete()
885 } else if (urb->status == -ENOENT) { in btusb_intr_complete()
890 if (!test_bit(BTUSB_INTR_RUNNING, &data->flags)) in btusb_intr_complete()
893 usb_mark_last_busy(data->udev); in btusb_intr_complete()
894 usb_anchor_urb(urb, &data->intr_anchor); in btusb_intr_complete()
898 /* -EPERM: urb is being killed; in btusb_intr_complete()
899 * -ENODEV: device got disconnected in btusb_intr_complete()
901 if (err != -EPERM && err != -ENODEV) in btusb_intr_complete()
903 urb, -err); in btusb_intr_complete()
916 BT_DBG("%s", hdev->name); in btusb_submit_intr_urb()
918 if (!data->intr_ep) in btusb_submit_intr_urb()
919 return -ENODEV; in btusb_submit_intr_urb()
923 return -ENOMEM; in btusb_submit_intr_urb()
925 size = le16_to_cpu(data->intr_ep->wMaxPacketSize); in btusb_submit_intr_urb()
930 return -ENOMEM; in btusb_submit_intr_urb()
933 pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress); in btusb_submit_intr_urb()
935 usb_fill_int_urb(urb, data->udev, pipe, buf, size, in btusb_submit_intr_urb()
936 btusb_intr_complete, hdev, data->intr_ep->bInterval); in btusb_submit_intr_urb()
938 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_intr_urb()
940 usb_anchor_urb(urb, &data->intr_anchor); in btusb_submit_intr_urb()
944 if (err != -EPERM && err != -ENODEV) in btusb_submit_intr_urb()
946 urb, -err); in btusb_submit_intr_urb()
957 struct hci_dev *hdev = urb->context; in btusb_bulk_complete()
961 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_bulk_complete()
962 urb->actual_length); in btusb_bulk_complete()
964 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_bulk_complete()
967 if (urb->status == 0) { in btusb_bulk_complete()
968 hdev->stat.byte_rx += urb->actual_length; in btusb_bulk_complete()
970 if (data->recv_bulk(data, urb->transfer_buffer, in btusb_bulk_complete()
971 urb->actual_length) < 0) { in btusb_bulk_complete()
973 hdev->stat.err_rx++; in btusb_bulk_complete()
975 } else if (urb->status == -ENOENT) { in btusb_bulk_complete()
980 if (!test_bit(BTUSB_BULK_RUNNING, &data->flags)) in btusb_bulk_complete()
983 usb_anchor_urb(urb, &data->bulk_anchor); in btusb_bulk_complete()
984 usb_mark_last_busy(data->udev); in btusb_bulk_complete()
988 /* -EPERM: urb is being killed; in btusb_bulk_complete()
989 * -ENODEV: device got disconnected in btusb_bulk_complete()
991 if (err != -EPERM && err != -ENODEV) in btusb_bulk_complete()
993 urb, -err); in btusb_bulk_complete()
1006 BT_DBG("%s", hdev->name); in btusb_submit_bulk_urb()
1008 if (!data->bulk_rx_ep) in btusb_submit_bulk_urb()
1009 return -ENODEV; in btusb_submit_bulk_urb()
1013 return -ENOMEM; in btusb_submit_bulk_urb()
1018 return -ENOMEM; in btusb_submit_bulk_urb()
1021 pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress); in btusb_submit_bulk_urb()
1023 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size, in btusb_submit_bulk_urb()
1026 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_bulk_urb()
1028 usb_mark_last_busy(data->udev); in btusb_submit_bulk_urb()
1029 usb_anchor_urb(urb, &data->bulk_anchor); in btusb_submit_bulk_urb()
1033 if (err != -EPERM && err != -ENODEV) in btusb_submit_bulk_urb()
1035 urb, -err); in btusb_submit_bulk_urb()
1046 struct hci_dev *hdev = urb->context; in btusb_isoc_complete()
1050 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_isoc_complete()
1051 urb->actual_length); in btusb_isoc_complete()
1053 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_isoc_complete()
1056 if (urb->status == 0) { in btusb_isoc_complete()
1057 for (i = 0; i < urb->number_of_packets; i++) { in btusb_isoc_complete()
1058 unsigned int offset = urb->iso_frame_desc[i].offset; in btusb_isoc_complete()
1059 unsigned int length = urb->iso_frame_desc[i].actual_length; in btusb_isoc_complete()
1061 if (urb->iso_frame_desc[i].status) in btusb_isoc_complete()
1064 hdev->stat.byte_rx += length; in btusb_isoc_complete()
1066 if (btusb_recv_isoc(data, urb->transfer_buffer + offset, in btusb_isoc_complete()
1069 hdev->stat.err_rx++; in btusb_isoc_complete()
1072 } else if (urb->status == -ENOENT) { in btusb_isoc_complete()
1077 if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags)) in btusb_isoc_complete()
1080 usb_anchor_urb(urb, &data->isoc_anchor); in btusb_isoc_complete()
1084 /* -EPERM: urb is being killed; in btusb_isoc_complete()
1085 * -ENODEV: device got disconnected in btusb_isoc_complete()
1087 if (err != -EPERM && err != -ENODEV) in btusb_isoc_complete()
1089 urb, -err); in btusb_isoc_complete()
1108 if (data->usb_alt6_packet_flow) { in __fill_isoc_descriptor_msbc()
1110 data->usb_alt6_packet_flow = false; in __fill_isoc_descriptor_msbc()
1113 data->usb_alt6_packet_flow = true; in __fill_isoc_descriptor_msbc()
1117 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor_msbc()
1118 urb->iso_frame_desc[i].length = offset; in __fill_isoc_descriptor_msbc()
1122 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor_msbc()
1123 urb->iso_frame_desc[i].length = len; in __fill_isoc_descriptor_msbc()
1127 urb->number_of_packets = i; in __fill_isoc_descriptor_msbc()
1137 i++, offset += mtu, len -= mtu) { in __fill_isoc_descriptor()
1138 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor()
1139 urb->iso_frame_desc[i].length = mtu; in __fill_isoc_descriptor()
1143 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor()
1144 urb->iso_frame_desc[i].length = len; in __fill_isoc_descriptor()
1148 urb->number_of_packets = i; in __fill_isoc_descriptor()
1159 BT_DBG("%s", hdev->name); in btusb_submit_isoc_urb()
1161 if (!data->isoc_rx_ep) in btusb_submit_isoc_urb()
1162 return -ENODEV; in btusb_submit_isoc_urb()
1166 return -ENOMEM; in btusb_submit_isoc_urb()
1168 size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) * in btusb_submit_isoc_urb()
1174 return -ENOMEM; in btusb_submit_isoc_urb()
1177 pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); in btusb_submit_isoc_urb()
1179 usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete, in btusb_submit_isoc_urb()
1180 hdev, data->isoc_rx_ep->bInterval); in btusb_submit_isoc_urb()
1182 urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; in btusb_submit_isoc_urb()
1185 le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); in btusb_submit_isoc_urb()
1187 usb_anchor_urb(urb, &data->isoc_anchor); in btusb_submit_isoc_urb()
1191 if (err != -EPERM && err != -ENODEV) in btusb_submit_isoc_urb()
1193 urb, -err); in btusb_submit_isoc_urb()
1204 struct hci_dev *hdev = urb->context; in btusb_diag_complete()
1208 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_diag_complete()
1209 urb->actual_length); in btusb_diag_complete()
1211 if (urb->status == 0) { in btusb_diag_complete()
1214 skb = bt_skb_alloc(urb->actual_length, GFP_ATOMIC); in btusb_diag_complete()
1216 skb_put_data(skb, urb->transfer_buffer, in btusb_diag_complete()
1217 urb->actual_length); in btusb_diag_complete()
1220 } else if (urb->status == -ENOENT) { in btusb_diag_complete()
1225 if (!test_bit(BTUSB_DIAG_RUNNING, &data->flags)) in btusb_diag_complete()
1228 usb_anchor_urb(urb, &data->diag_anchor); in btusb_diag_complete()
1229 usb_mark_last_busy(data->udev); in btusb_diag_complete()
1233 /* -EPERM: urb is being killed; in btusb_diag_complete()
1234 * -ENODEV: device got disconnected in btusb_diag_complete()
1236 if (err != -EPERM && err != -ENODEV) in btusb_diag_complete()
1238 urb, -err); in btusb_diag_complete()
1251 BT_DBG("%s", hdev->name); in btusb_submit_diag_urb()
1253 if (!data->diag_rx_ep) in btusb_submit_diag_urb()
1254 return -ENODEV; in btusb_submit_diag_urb()
1258 return -ENOMEM; in btusb_submit_diag_urb()
1263 return -ENOMEM; in btusb_submit_diag_urb()
1266 pipe = usb_rcvbulkpipe(data->udev, data->diag_rx_ep->bEndpointAddress); in btusb_submit_diag_urb()
1268 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size, in btusb_submit_diag_urb()
1271 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_diag_urb()
1273 usb_mark_last_busy(data->udev); in btusb_submit_diag_urb()
1274 usb_anchor_urb(urb, &data->diag_anchor); in btusb_submit_diag_urb()
1278 if (err != -EPERM && err != -ENODEV) in btusb_submit_diag_urb()
1280 urb, -err); in btusb_submit_diag_urb()
1291 struct sk_buff *skb = urb->context; in btusb_tx_complete()
1292 struct hci_dev *hdev = (struct hci_dev *)skb->dev; in btusb_tx_complete()
1296 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_tx_complete()
1297 urb->actual_length); in btusb_tx_complete()
1299 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_tx_complete()
1302 if (!urb->status) in btusb_tx_complete()
1303 hdev->stat.byte_tx += urb->transfer_buffer_length; in btusb_tx_complete()
1305 hdev->stat.err_tx++; in btusb_tx_complete()
1308 spin_lock_irqsave(&data->txlock, flags); in btusb_tx_complete()
1309 data->tx_in_flight--; in btusb_tx_complete()
1310 spin_unlock_irqrestore(&data->txlock, flags); in btusb_tx_complete()
1312 kfree(urb->setup_packet); in btusb_tx_complete()
1319 struct sk_buff *skb = urb->context; in btusb_isoc_tx_complete()
1320 struct hci_dev *hdev = (struct hci_dev *)skb->dev; in btusb_isoc_tx_complete()
1322 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_isoc_tx_complete()
1323 urb->actual_length); in btusb_isoc_tx_complete()
1325 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_isoc_tx_complete()
1328 if (!urb->status) in btusb_isoc_tx_complete()
1329 hdev->stat.byte_tx += urb->transfer_buffer_length; in btusb_isoc_tx_complete()
1331 hdev->stat.err_tx++; in btusb_isoc_tx_complete()
1334 kfree(urb->setup_packet); in btusb_isoc_tx_complete()
1344 BT_DBG("%s", hdev->name); in btusb_open()
1346 err = usb_autopm_get_interface(data->intf); in btusb_open()
1353 if (data->setup_on_usb) { in btusb_open()
1354 err = data->setup_on_usb(hdev); in btusb_open()
1359 data->intf->needs_remote_wakeup = 1; in btusb_open()
1365 if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags)) in btusb_open()
1366 device_wakeup_disable(&data->udev->dev); in btusb_open()
1368 if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags)) in btusb_open()
1377 usb_kill_anchored_urbs(&data->intr_anchor); in btusb_open()
1381 set_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_open()
1384 if (data->diag) { in btusb_open()
1386 set_bit(BTUSB_DIAG_RUNNING, &data->flags); in btusb_open()
1390 usb_autopm_put_interface(data->intf); in btusb_open()
1394 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_open()
1396 usb_autopm_put_interface(data->intf); in btusb_open()
1402 usb_kill_anchored_urbs(&data->intr_anchor); in btusb_stop_traffic()
1403 usb_kill_anchored_urbs(&data->bulk_anchor); in btusb_stop_traffic()
1404 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_stop_traffic()
1405 usb_kill_anchored_urbs(&data->diag_anchor); in btusb_stop_traffic()
1406 usb_kill_anchored_urbs(&data->ctrl_anchor); in btusb_stop_traffic()
1414 BT_DBG("%s", hdev->name); in btusb_close()
1416 cancel_work_sync(&data->work); in btusb_close()
1417 cancel_work_sync(&data->waker); in btusb_close()
1419 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_close()
1420 clear_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_close()
1421 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_close()
1422 clear_bit(BTUSB_DIAG_RUNNING, &data->flags); in btusb_close()
1427 err = usb_autopm_get_interface(data->intf); in btusb_close()
1431 data->intf->needs_remote_wakeup = 0; in btusb_close()
1433 /* Enable remote wake up for auto-suspend */ in btusb_close()
1434 if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags)) in btusb_close()
1435 data->intf->needs_remote_wakeup = 1; in btusb_close()
1437 usb_autopm_put_interface(data->intf); in btusb_close()
1440 usb_scuttle_anchored_urbs(&data->deferred); in btusb_close()
1448 BT_DBG("%s", hdev->name); in btusb_flush()
1450 usb_kill_anchored_urbs(&data->tx_anchor); in btusb_flush()
1465 return ERR_PTR(-ENOMEM); in alloc_ctrl_urb()
1470 return ERR_PTR(-ENOMEM); in alloc_ctrl_urb()
1473 dr->bRequestType = data->cmdreq_type; in alloc_ctrl_urb()
1474 dr->bRequest = data->cmdreq; in alloc_ctrl_urb()
1475 dr->wIndex = 0; in alloc_ctrl_urb()
1476 dr->wValue = 0; in alloc_ctrl_urb()
1477 dr->wLength = __cpu_to_le16(skb->len); in alloc_ctrl_urb()
1479 pipe = usb_sndctrlpipe(data->udev, 0x00); in alloc_ctrl_urb()
1481 usb_fill_control_urb(urb, data->udev, pipe, (void *)dr, in alloc_ctrl_urb()
1482 skb->data, skb->len, btusb_tx_complete, skb); in alloc_ctrl_urb()
1484 skb->dev = (void *)hdev; in alloc_ctrl_urb()
1495 if (!data->bulk_tx_ep) in alloc_bulk_urb()
1496 return ERR_PTR(-ENODEV); in alloc_bulk_urb()
1500 return ERR_PTR(-ENOMEM); in alloc_bulk_urb()
1502 pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress); in alloc_bulk_urb()
1504 usb_fill_bulk_urb(urb, data->udev, pipe, in alloc_bulk_urb()
1505 skb->data, skb->len, btusb_tx_complete, skb); in alloc_bulk_urb()
1507 skb->dev = (void *)hdev; in alloc_bulk_urb()
1518 if (!data->isoc_tx_ep) in alloc_isoc_urb()
1519 return ERR_PTR(-ENODEV); in alloc_isoc_urb()
1523 return ERR_PTR(-ENOMEM); in alloc_isoc_urb()
1525 pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress); in alloc_isoc_urb()
1527 usb_fill_int_urb(urb, data->udev, pipe, in alloc_isoc_urb()
1528 skb->data, skb->len, btusb_isoc_tx_complete, in alloc_isoc_urb()
1529 skb, data->isoc_tx_ep->bInterval); in alloc_isoc_urb()
1531 urb->transfer_flags = URB_ISO_ASAP; in alloc_isoc_urb()
1533 if (data->isoc_altsetting == 6) in alloc_isoc_urb()
1534 __fill_isoc_descriptor_msbc(urb, skb->len, in alloc_isoc_urb()
1535 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize), in alloc_isoc_urb()
1538 __fill_isoc_descriptor(urb, skb->len, in alloc_isoc_urb()
1539 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); in alloc_isoc_urb()
1540 skb->dev = (void *)hdev; in alloc_isoc_urb()
1550 usb_anchor_urb(urb, &data->tx_anchor); in submit_tx_urb()
1554 if (err != -EPERM && err != -ENODEV) in submit_tx_urb()
1556 urb, -err); in submit_tx_urb()
1557 kfree(urb->setup_packet); in submit_tx_urb()
1560 usb_mark_last_busy(data->udev); in submit_tx_urb()
1573 spin_lock_irqsave(&data->txlock, flags); in submit_or_queue_tx_urb()
1574 suspending = test_bit(BTUSB_SUSPENDING, &data->flags); in submit_or_queue_tx_urb()
1576 data->tx_in_flight++; in submit_or_queue_tx_urb()
1577 spin_unlock_irqrestore(&data->txlock, flags); in submit_or_queue_tx_urb()
1582 usb_anchor_urb(urb, &data->deferred); in submit_or_queue_tx_urb()
1583 schedule_work(&data->waker); in submit_or_queue_tx_urb()
1593 BT_DBG("%s", hdev->name); in btusb_send_frame()
1601 hdev->stat.cmd_tx++; in btusb_send_frame()
1609 hdev->stat.acl_tx++; in btusb_send_frame()
1614 return -ENODEV; in btusb_send_frame()
1620 hdev->stat.sco_tx++; in btusb_send_frame()
1624 return -EILSEQ; in btusb_send_frame()
1631 BT_DBG("%s evt %d", hdev->name, evt); in btusb_notify()
1633 if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) { in btusb_notify()
1634 data->sco_num = hci_conn_num(hdev, SCO_LINK); in btusb_notify()
1635 data->air_mode = evt; in btusb_notify()
1636 schedule_work(&data->work); in btusb_notify()
1643 struct usb_interface *intf = data->isoc; in __set_isoc_interface()
1647 if (!data->isoc) in __set_isoc_interface()
1648 return -ENODEV; in __set_isoc_interface()
1650 err = usb_set_interface(data->udev, data->isoc_ifnum, altsetting); in __set_isoc_interface()
1652 bt_dev_err(hdev, "setting interface failed (%d)", -err); in __set_isoc_interface()
1656 data->isoc_altsetting = altsetting; in __set_isoc_interface()
1658 data->isoc_tx_ep = NULL; in __set_isoc_interface()
1659 data->isoc_rx_ep = NULL; in __set_isoc_interface()
1661 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in __set_isoc_interface()
1662 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in __set_isoc_interface()
1664 if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) { in __set_isoc_interface()
1665 data->isoc_tx_ep = ep_desc; in __set_isoc_interface()
1669 if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) { in __set_isoc_interface()
1670 data->isoc_rx_ep = ep_desc; in __set_isoc_interface()
1675 if (!data->isoc_tx_ep || !data->isoc_rx_ep) { in __set_isoc_interface()
1677 return -ENODEV; in __set_isoc_interface()
1688 if (data->isoc_altsetting != new_alts) { in btusb_switch_alt_setting()
1691 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_switch_alt_setting()
1692 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_switch_alt_setting()
1703 spin_lock_irqsave(&data->rxlock, flags); in btusb_switch_alt_setting()
1704 dev_kfree_skb_irq(data->sco_skb); in btusb_switch_alt_setting()
1705 data->sco_skb = NULL; in btusb_switch_alt_setting()
1706 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_switch_alt_setting()
1713 if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) { in btusb_switch_alt_setting()
1715 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_switch_alt_setting()
1726 struct usb_interface *intf = data->isoc; in btusb_find_altsetting()
1734 for (i = 0; i < intf->num_altsetting; i++) { in btusb_find_altsetting()
1735 if (intf->altsetting[i].desc.bAlternateSetting == alt) in btusb_find_altsetting()
1736 return &intf->altsetting[i]; in btusb_find_altsetting()
1745 struct hci_dev *hdev = data->hdev; in btusb_work()
1749 if (data->sco_num > 0) { in btusb_work()
1750 if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) { in btusb_work()
1751 err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf); in btusb_work()
1753 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_work()
1754 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_work()
1758 set_bit(BTUSB_DID_ISO_RESUME, &data->flags); in btusb_work()
1761 if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_CVSD) { in btusb_work()
1762 if (hdev->voice_setting & 0x0020) { in btusb_work()
1765 new_alts = alts[data->sco_num - 1]; in btusb_work()
1767 new_alts = data->sco_num; in btusb_work()
1769 } else if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_TRANSP) { in btusb_work()
1776 * MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72 in btusb_work()
1782 hdev->sco_mtu >= 72 && in btusb_work()
1783 test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags)) in btusb_work()
1792 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_work()
1793 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_work()
1796 if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags)) in btusb_work()
1797 usb_autopm_put_interface(data->isoc ? data->isoc : data->intf); in btusb_work()
1806 err = usb_autopm_get_interface(data->intf); in btusb_waker()
1810 usb_autopm_put_interface(data->intf); in btusb_waker()
1818 BT_DBG("%s", hdev->name); in btusb_setup_bcm92035()
1832 u16 bcdDevice = le16_to_cpu(data->udev->descriptor.bcdDevice); in btusb_setup_csr()
1837 BT_DBG("%s", hdev->name); in btusb_setup_csr()
1847 if (skb->len != sizeof(struct hci_rp_read_local_version)) { in btusb_setup_csr()
1850 return -EIO; in btusb_setup_csr()
1853 rp = (struct hci_rp_read_local_version *)skb->data; in btusb_setup_csr()
1856 le16_to_cpu(rp->hci_ver), le16_to_cpu(rp->hci_rev), in btusb_setup_csr()
1857 le16_to_cpu(rp->lmp_ver), le16_to_cpu(rp->lmp_subver), in btusb_setup_csr()
1858 le16_to_cpu(rp->manufacturer)); in btusb_setup_csr()
1864 * The main thing they have in common is that these are really popular low-cost in btusb_setup_csr()
1869 * is Cambridge Silicon Radio (10) and ensuring that LMP sub-version and in btusb_setup_csr()
1872 if (le16_to_cpu(rp->manufacturer) != 10 || in btusb_setup_csr()
1873 le16_to_cpu(rp->hci_rev) != le16_to_cpu(rp->lmp_subver)) in btusb_setup_csr()
1877 * - 1.1 (0x1) -> 0x0073, 0x020d, 0x033c, 0x034e in btusb_setup_csr()
1878 * - 1.2 (0x2) -> 0x04d9, 0x0529 in btusb_setup_csr()
1879 * - 2.0 (0x3) -> 0x07a6, 0x07ad, 0x0c5c in btusb_setup_csr()
1880 * - 2.1 (0x4) -> 0x149c, 0x1735, 0x1899 (0x1899 is a BlueCore4-External) in btusb_setup_csr()
1881 * - 4.0 (0x6) -> 0x1d86, 0x2031, 0x22bb in btusb_setup_csr()
1885 * third-party BT 4.0 dongle reuses it. in btusb_setup_csr()
1887 else if (le16_to_cpu(rp->lmp_subver) <= 0x034e && in btusb_setup_csr()
1888 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_1_1) in btusb_setup_csr()
1891 else if (le16_to_cpu(rp->lmp_subver) <= 0x0529 && in btusb_setup_csr()
1892 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_1_2) in btusb_setup_csr()
1895 else if (le16_to_cpu(rp->lmp_subver) <= 0x0c5c && in btusb_setup_csr()
1896 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_2_0) in btusb_setup_csr()
1899 else if (le16_to_cpu(rp->lmp_subver) <= 0x1899 && in btusb_setup_csr()
1900 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_2_1) in btusb_setup_csr()
1903 else if (le16_to_cpu(rp->lmp_subver) <= 0x22bb && in btusb_setup_csr()
1904 le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_4_0) in btusb_setup_csr()
1909 le16_to_cpu(rp->lmp_subver) == 0x0c5c && in btusb_setup_csr()
1910 le16_to_cpu(rp->hci_ver) == BLUETOOTH_VER_2_0) in btusb_setup_csr()
1921 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks); in btusb_setup_csr()
1922 set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks); in btusb_setup_csr()
1927 clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); in btusb_setup_csr()
1928 clear_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_setup_csr()
1944 "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq", in btusb_setup_intel_get_fw()
1945 ver->hw_platform, ver->hw_variant, ver->hw_revision, in btusb_setup_intel_get_fw()
1946 ver->fw_variant, ver->fw_revision, ver->fw_build_num, in btusb_setup_intel_get_fw()
1947 ver->fw_build_ww, ver->fw_build_yy); in btusb_setup_intel_get_fw()
1949 ret = request_firmware(&fw, fwname, &hdev->dev); in btusb_setup_intel_get_fw()
1951 if (ret == -EINVAL) { in btusb_setup_intel_get_fw()
1963 snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq", in btusb_setup_intel_get_fw()
1964 ver->hw_platform, ver->hw_variant); in btusb_setup_intel_get_fw()
1965 if (request_firmware(&fw, fwname, &hdev->dev) < 0) { in btusb_setup_intel_get_fw()
1986 int remain = fw->size - (*fw_ptr - fw->data); in btusb_setup_intel_patching()
1997 return -EINVAL; in btusb_setup_intel_patching()
2000 remain--; in btusb_setup_intel_patching()
2004 remain -= sizeof(*cmd); in btusb_setup_intel_patching()
2009 if (remain < cmd->plen) { in btusb_setup_intel_patching()
2011 return -EFAULT; in btusb_setup_intel_patching()
2020 if (*disable_patch && le16_to_cpu(cmd->opcode) == 0xfc8e) in btusb_setup_intel_patching()
2024 *fw_ptr += cmd->plen; in btusb_setup_intel_patching()
2025 remain -= cmd->plen; in btusb_setup_intel_patching()
2036 remain--; in btusb_setup_intel_patching()
2040 remain -= sizeof(*evt); in btusb_setup_intel_patching()
2042 if (remain < evt->plen) { in btusb_setup_intel_patching()
2044 return -EFAULT; in btusb_setup_intel_patching()
2048 *fw_ptr += evt->plen; in btusb_setup_intel_patching()
2049 remain -= evt->plen; in btusb_setup_intel_patching()
2058 return -EFAULT; in btusb_setup_intel_patching()
2061 skb = __hci_cmd_sync_ev(hdev, le16_to_cpu(cmd->opcode), cmd->plen, in btusb_setup_intel_patching()
2062 cmd_param, evt->evt, HCI_INIT_TIMEOUT); in btusb_setup_intel_patching()
2065 cmd->opcode, PTR_ERR(skb)); in btusb_setup_intel_patching()
2073 if (skb->len != evt->plen) { in btusb_setup_intel_patching()
2075 le16_to_cpu(cmd->opcode)); in btusb_setup_intel_patching()
2077 return -EFAULT; in btusb_setup_intel_patching()
2080 if (memcmp(skb->data, evt_param, evt->plen)) { in btusb_setup_intel_patching()
2082 le16_to_cpu(cmd->opcode)); in btusb_setup_intel_patching()
2084 return -EFAULT; in btusb_setup_intel_patching()
2099 BT_DBG("%s", hdev->name); in btusb_setup_intel()
2151 fw_ptr = fw->data; in btusb_setup_intel()
2185 while (fw->size > fw_ptr - fw->data) { in btusb_setup_intel()
2207 * every power-on boot in btusb_setup_intel()
2257 return -ENOMEM; in inject_cmd_complete()
2260 hdr->evt = HCI_EV_CMD_COMPLETE; in inject_cmd_complete()
2261 hdr->plen = sizeof(*evt) + 1; in inject_cmd_complete()
2264 evt->ncmd = 0x01; in inject_cmd_complete()
2265 evt->opcode = cpu_to_le16(opcode); in inject_cmd_complete()
2281 if (test_bit(BTUSB_BOOTLOADER, &data->flags)) in btusb_recv_bulk_intel()
2295 if (test_and_clear_bit(BTUSB_BOOTING, &data->flags)) in btusb_intel_bootup()
2296 wake_up_bit(&data->flags, BTUSB_BOOTING); in btusb_intel_bootup()
2307 if (evt->result) in btusb_intel_secure_send_result()
2308 set_bit(BTUSB_FIRMWARE_FAILED, &data->flags); in btusb_intel_secure_send_result()
2310 if (test_and_clear_bit(BTUSB_DOWNLOADING, &data->flags) && in btusb_intel_secure_send_result()
2311 test_bit(BTUSB_FIRMWARE_LOADED, &data->flags)) in btusb_intel_secure_send_result()
2312 wake_up_bit(&data->flags, BTUSB_DOWNLOADING); in btusb_intel_secure_send_result()
2319 if (test_bit(BTUSB_BOOTLOADER, &data->flags)) { in btusb_recv_event_intel()
2320 struct hci_event_hdr *hdr = (void *)skb->data; in btusb_recv_event_intel()
2322 if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff && in btusb_recv_event_intel()
2323 hdr->plen > 0) { in btusb_recv_event_intel()
2324 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1; in btusb_recv_event_intel()
2325 unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1; in btusb_recv_event_intel()
2327 switch (skb->data[2]) { in btusb_recv_event_intel()
2355 BT_DBG("%s", hdev->name); in btusb_send_frame_intel()
2359 if (test_bit(BTUSB_BOOTLOADER, &data->flags)) { in btusb_send_frame_intel()
2360 struct hci_command_hdr *cmd = (void *)skb->data; in btusb_send_frame_intel()
2361 __u16 opcode = le16_to_cpu(cmd->opcode); in btusb_send_frame_intel()
2385 hdev->stat.cmd_tx++; in btusb_send_frame_intel()
2393 hdev->stat.acl_tx++; in btusb_send_frame_intel()
2398 return -ENODEV; in btusb_send_frame_intel()
2404 hdev->stat.sco_tx++; in btusb_send_frame_intel()
2408 return -EILSEQ; in btusb_send_frame_intel()
2416 switch (ver->hw_variant) { in btusb_setup_intel_new_get_fw_name()
2419 snprintf(fw_name, len, "intel/ibt-%u-%u.%s", in btusb_setup_intel_new_get_fw_name()
2420 le16_to_cpu(ver->hw_variant), in btusb_setup_intel_new_get_fw_name()
2421 le16_to_cpu(params->dev_revid), in btusb_setup_intel_new_get_fw_name()
2428 snprintf(fw_name, len, "intel/ibt-%u-%u-%u.%s", in btusb_setup_intel_new_get_fw_name()
2429 le16_to_cpu(ver->hw_variant), in btusb_setup_intel_new_get_fw_name()
2430 le16_to_cpu(ver->hw_revision), in btusb_setup_intel_new_get_fw_name()
2431 le16_to_cpu(ver->fw_revision), in btusb_setup_intel_new_get_fw_name()
2451 return -EINVAL; in btusb_intel_download_firmware()
2456 if (ver->hw_platform != 0x37) { in btusb_intel_download_firmware()
2458 ver->hw_platform); in btusb_intel_download_firmware()
2459 return -EINVAL; in btusb_intel_download_firmware()
2468 switch (ver->hw_variant) { in btusb_intel_download_firmware()
2478 ver->hw_variant); in btusb_intel_download_firmware()
2479 return -EINVAL; in btusb_intel_download_firmware()
2494 * It is not possible to use the Secure Boot Parameters in this in btusb_intel_download_firmware()
2497 if (ver->fw_variant == 0x23) { in btusb_intel_download_firmware()
2498 clear_bit(BTUSB_BOOTLOADER, &data->flags); in btusb_intel_download_firmware()
2506 if (ver->fw_variant != 0x06) { in btusb_intel_download_firmware()
2508 ver->fw_variant); in btusb_intel_download_firmware()
2509 return -ENODEV; in btusb_intel_download_firmware()
2512 /* Read the secure boot parameters to identify the operating in btusb_intel_download_firmware()
2523 if (params->limited_cce != 0x00) { in btusb_intel_download_firmware()
2525 params->limited_cce); in btusb_intel_download_firmware()
2526 return -EINVAL; in btusb_intel_download_firmware()
2529 /* If the OTP has no valid Bluetooth device address, then there will in btusb_intel_download_firmware()
2532 if (!bacmp(&params->otp_bdaddr, BDADDR_ANY)) { in btusb_intel_download_firmware()
2534 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); in btusb_intel_download_firmware()
2541 * The firmware filename is ibt-<hw_variant>-<dev_revid>.sfi. in btusb_intel_download_firmware()
2555 * ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi. in btusb_intel_download_firmware()
2562 return -EINVAL; in btusb_intel_download_firmware()
2565 err = request_firmware(&fw, fwname, &hdev->dev); in btusb_intel_download_firmware()
2573 if (fw->size < 644) { in btusb_intel_download_firmware()
2575 fw->size); in btusb_intel_download_firmware()
2576 err = -EBADF; in btusb_intel_download_firmware()
2580 set_bit(BTUSB_DOWNLOADING, &data->flags); in btusb_intel_download_firmware()
2591 set_bit(BTUSB_FIRMWARE_LOADED, &data->flags); in btusb_intel_download_firmware()
2606 err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING, in btusb_intel_download_firmware()
2609 if (err == -EINTR) { in btusb_intel_download_firmware()
2616 err = -ETIMEDOUT; in btusb_intel_download_firmware()
2621 if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) { in btusb_intel_download_firmware()
2623 err = -ENOEXEC; in btusb_intel_download_firmware()
2644 BT_DBG("%s", hdev->name); in btusb_setup_intel_new()
2681 set_bit(BTUSB_BOOTING, &data->flags); in btusb_setup_intel_new()
2699 err = wait_on_bit_timeout(&data->flags, BTUSB_BOOTING, in btusb_setup_intel_new()
2703 if (err == -EINTR) { in btusb_setup_intel_new()
2705 return -EINTR; in btusb_setup_intel_new()
2711 return -ETIMEDOUT; in btusb_setup_intel_new()
2720 clear_bit(BTUSB_BOOTLOADER, &data->flags); in btusb_setup_intel_new()
2890 struct hci_dev *hdev = urb->context; in btusb_mtk_wmt_recv()
2896 if (urb->status == 0 && urb->actual_length > 0) { in btusb_mtk_wmt_recv()
2897 hdev->stat.byte_rx += urb->actual_length; in btusb_mtk_wmt_recv()
2904 hdev->stat.err_rx++; in btusb_mtk_wmt_recv()
2905 kfree(urb->setup_packet); in btusb_mtk_wmt_recv()
2910 skb_put_data(skb, urb->transfer_buffer, urb->actual_length); in btusb_mtk_wmt_recv()
2912 hdr = (void *)skb->data; in btusb_mtk_wmt_recv()
2917 hdr->evt = 0xff; in btusb_mtk_wmt_recv()
2922 if (test_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags)) { in btusb_mtk_wmt_recv()
2923 data->evt_skb = skb_clone(skb, GFP_ATOMIC); in btusb_mtk_wmt_recv()
2924 if (!data->evt_skb) { in btusb_mtk_wmt_recv()
2926 kfree(urb->setup_packet); in btusb_mtk_wmt_recv()
2933 kfree_skb(data->evt_skb); in btusb_mtk_wmt_recv()
2934 data->evt_skb = NULL; in btusb_mtk_wmt_recv()
2935 kfree(urb->setup_packet); in btusb_mtk_wmt_recv()
2940 &data->flags)) { in btusb_mtk_wmt_recv()
2943 wake_up_bit(&data->flags, in btusb_mtk_wmt_recv()
2946 kfree(urb->setup_packet); in btusb_mtk_wmt_recv()
2948 } else if (urb->status == -ENOENT) { in btusb_mtk_wmt_recv()
2953 usb_mark_last_busy(data->udev); in btusb_mtk_wmt_recv()
2955 /* The URB complete handler is still called with urb->actual_length = 0 in btusb_mtk_wmt_recv()
2956 * when the event is not available, so we should keep re-submitting in btusb_mtk_wmt_recv()
2964 usb_anchor_urb(urb, &data->ctrl_anchor); in btusb_mtk_wmt_recv()
2967 kfree(urb->setup_packet); in btusb_mtk_wmt_recv()
2968 /* -EPERM: urb is being killed; in btusb_mtk_wmt_recv()
2969 * -ENODEV: device got disconnected in btusb_mtk_wmt_recv()
2971 if (err != -EPERM && err != -ENODEV) in btusb_mtk_wmt_recv()
2973 urb, -err); in btusb_mtk_wmt_recv()
2989 return -ENOMEM; in btusb_mtk_submit_wmt_recv_urb()
2994 return -ENOMEM; in btusb_mtk_submit_wmt_recv_urb()
2997 dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_IN; in btusb_mtk_submit_wmt_recv_urb()
2998 dr->bRequest = 1; in btusb_mtk_submit_wmt_recv_urb()
2999 dr->wIndex = cpu_to_le16(0); in btusb_mtk_submit_wmt_recv_urb()
3000 dr->wValue = cpu_to_le16(48); in btusb_mtk_submit_wmt_recv_urb()
3001 dr->wLength = cpu_to_le16(size); in btusb_mtk_submit_wmt_recv_urb()
3007 return -ENOMEM; in btusb_mtk_submit_wmt_recv_urb()
3010 pipe = usb_rcvctrlpipe(data->udev, 0); in btusb_mtk_submit_wmt_recv_urb()
3012 usb_fill_control_urb(urb, data->udev, pipe, (void *)dr, in btusb_mtk_submit_wmt_recv_urb()
3015 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_mtk_submit_wmt_recv_urb()
3017 usb_anchor_urb(urb, &data->ctrl_anchor); in btusb_mtk_submit_wmt_recv_urb()
3020 if (err != -EPERM && err != -ENODEV) in btusb_mtk_submit_wmt_recv_urb()
3022 urb, -err); in btusb_mtk_submit_wmt_recv_urb()
3043 hlen = sizeof(*hdr) + wmt_params->dlen; in btusb_mtk_hci_wmt_sync()
3045 return -EINVAL; in btusb_mtk_hci_wmt_sync()
3049 return -ENOMEM; in btusb_mtk_hci_wmt_sync()
3051 hdr = &wc->hdr; in btusb_mtk_hci_wmt_sync()
3052 hdr->dir = 1; in btusb_mtk_hci_wmt_sync()
3053 hdr->op = wmt_params->op; in btusb_mtk_hci_wmt_sync()
3054 hdr->dlen = cpu_to_le16(wmt_params->dlen + 1); in btusb_mtk_hci_wmt_sync()
3055 hdr->flag = wmt_params->flag; in btusb_mtk_hci_wmt_sync()
3056 memcpy(wc->data, wmt_params->data, wmt_params->dlen); in btusb_mtk_hci_wmt_sync()
3058 set_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags); in btusb_mtk_hci_wmt_sync()
3066 err = usb_autopm_get_interface(data->intf); in btusb_mtk_hci_wmt_sync()
3073 clear_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags); in btusb_mtk_hci_wmt_sync()
3074 usb_autopm_put_interface(data->intf); in btusb_mtk_hci_wmt_sync()
3081 usb_autopm_put_interface(data->intf); in btusb_mtk_hci_wmt_sync()
3095 err = wait_on_bit_timeout(&data->flags, BTUSB_TX_WAIT_VND_EVT, in btusb_mtk_hci_wmt_sync()
3097 if (err == -EINTR) { in btusb_mtk_hci_wmt_sync()
3099 clear_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags); in btusb_mtk_hci_wmt_sync()
3105 clear_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags); in btusb_mtk_hci_wmt_sync()
3106 err = -ETIMEDOUT; in btusb_mtk_hci_wmt_sync()
3110 if (data->evt_skb == NULL) in btusb_mtk_hci_wmt_sync()
3114 wmt_evt = (struct btmtk_hci_wmt_evt *)data->evt_skb->data; in btusb_mtk_hci_wmt_sync()
3115 if (wmt_evt->whdr.op != hdr->op) { in btusb_mtk_hci_wmt_sync()
3117 wmt_evt->whdr.op, hdr->op); in btusb_mtk_hci_wmt_sync()
3118 err = -EIO; in btusb_mtk_hci_wmt_sync()
3122 switch (wmt_evt->whdr.op) { in btusb_mtk_hci_wmt_sync()
3124 if (wmt_evt->whdr.flag == 2) in btusb_mtk_hci_wmt_sync()
3131 if (be16_to_cpu(wmt_evt_funcc->status) == 0x404) in btusb_mtk_hci_wmt_sync()
3133 else if (be16_to_cpu(wmt_evt_funcc->status) == 0x420) in btusb_mtk_hci_wmt_sync()
3140 if (wmt_params->status) in btusb_mtk_hci_wmt_sync()
3141 *wmt_params->status = status; in btusb_mtk_hci_wmt_sync()
3144 kfree_skb(data->evt_skb); in btusb_mtk_hci_wmt_sync()
3145 data->evt_skb = NULL; in btusb_mtk_hci_wmt_sync()
3160 err = request_firmware(&fw, fwname, &hdev->dev); in btusb_mtk_setup_firmware()
3180 fw_ptr = fw->data; in btusb_mtk_setup_firmware()
3181 fw_size = fw->size; in btusb_mtk_setup_firmware()
3185 err = -EINVAL; in btusb_mtk_setup_firmware()
3189 fw_size -= 30; in btusb_mtk_setup_firmware()
3200 if (fw_size - dlen <= 0) in btusb_mtk_setup_firmware()
3202 else if (fw_size < fw->size - 30) in btusb_mtk_setup_firmware()
3216 fw_size -= dlen; in btusb_mtk_setup_firmware()
3271 return -ENOMEM; in btusb_mtk_reg_read()
3273 pipe = usb_rcvctrlpipe(data->udev, 0); in btusb_mtk_reg_read()
3274 err = usb_control_msg(data->udev, pipe, 0x63, in btusb_mtk_reg_read()
3325 return -ENODEV; in btusb_mtk_setup()
3355 /* -ETIMEDOUT happens */ in btusb_mtk_setup()
3434 /* Configure an out-of-band gpio as wake-up pin, if specified in device tree */
3439 struct device *dev = &data->udev->dev; in marvell_config_oob_wake()
3445 if (of_property_read_u16(dev->of_node, "marvell,wakeup-pin", &pin) || in marvell_config_oob_wake()
3446 of_property_read_u16(dev->of_node, "marvell,wakeup-gap-ms", &gap)) in marvell_config_oob_wake()
3449 /* Vendor specific command to configure a GPIO as wake-up pin */ in marvell_config_oob_wake()
3460 return -ENOMEM; in marvell_config_oob_wake()
3595 return -ENOMEM; in btusb_qca_send_vendor_req()
3604 dev_err(&udev->dev, "Failed to access otp area (%d)", err); in btusb_qca_send_vendor_req()
3621 struct usb_device *udev = btdata->udev; in btusb_setup_qca_download_fw()
3628 return -ENOMEM; in btusb_setup_qca_download_fw()
3630 count = firmware->size; in btusb_setup_qca_download_fw()
3633 memcpy(buf, firmware->data, size); in btusb_setup_qca_download_fw()
3649 count -= size; in btusb_setup_qca_download_fw()
3659 memcpy(buf, firmware->data + sent, size); in btusb_setup_qca_download_fw()
3666 sent, firmware->size, err); in btusb_setup_qca_download_fw()
3672 err = -EILSEQ; in btusb_setup_qca_download_fw()
3677 count -= size; in btusb_setup_qca_download_fw()
3696 ver_rom = le32_to_cpu(ver->rom_version); in btusb_setup_qca_load_rampatch()
3697 ver_patch = le32_to_cpu(ver->patch_version); in btusb_setup_qca_load_rampatch()
3701 err = request_firmware(&fw, fwname, &hdev->dev); in btusb_setup_qca_load_rampatch()
3710 rver = (struct qca_rampatch_version *)(fw->data + info->ver_offset); in btusb_setup_qca_load_rampatch()
3711 rver_rom_low = le16_to_cpu(rver->rom_version_low); in btusb_setup_qca_load_rampatch()
3712 rver_patch = le16_to_cpu(rver->patch_version); in btusb_setup_qca_load_rampatch()
3715 rver_rom_high = le16_to_cpu(rver->rom_version_high); in btusb_setup_qca_load_rampatch()
3727 err = -EINVAL; in btusb_setup_qca_load_rampatch()
3731 err = btusb_setup_qca_download_fw(hdev, fw, info->rampatch_hdr); in btusb_setup_qca_load_rampatch()
3748 le32_to_cpu(ver->rom_version)); in btusb_setup_qca_load_nvm()
3750 err = request_firmware(&fw, fwname, &hdev->dev); in btusb_setup_qca_load_nvm()
3759 err = btusb_setup_qca_download_fw(hdev, fw, info->nvm_hdr); in btusb_setup_qca_load_nvm()
3781 struct usb_device *udev = btdata->udev; in btusb_setup_qca()
3808 return -ENODEV; in btusb_setup_qca()
3834 struct usb_interface *intf = data->diag; in __set_diag_interface()
3837 if (!data->diag) in __set_diag_interface()
3838 return -ENODEV; in __set_diag_interface()
3840 data->diag_tx_ep = NULL; in __set_diag_interface()
3841 data->diag_rx_ep = NULL; in __set_diag_interface()
3843 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in __set_diag_interface()
3846 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in __set_diag_interface()
3848 if (!data->diag_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) { in __set_diag_interface()
3849 data->diag_tx_ep = ep_desc; in __set_diag_interface()
3853 if (!data->diag_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) { in __set_diag_interface()
3854 data->diag_rx_ep = ep_desc; in __set_diag_interface()
3859 if (!data->diag_tx_ep || !data->diag_rx_ep) { in __set_diag_interface()
3861 return -ENODEV; in __set_diag_interface()
3874 if (!data->diag_tx_ep) in alloc_diag_urb()
3875 return ERR_PTR(-ENODEV); in alloc_diag_urb()
3879 return ERR_PTR(-ENOMEM); in alloc_diag_urb()
3884 return ERR_PTR(-ENOMEM); in alloc_diag_urb()
3890 pipe = usb_sndbulkpipe(data->udev, data->diag_tx_ep->bEndpointAddress); in alloc_diag_urb()
3892 usb_fill_bulk_urb(urb, data->udev, pipe, in alloc_diag_urb()
3893 skb->data, skb->len, btusb_tx_complete, skb); in alloc_diag_urb()
3895 skb->dev = (void *)hdev; in alloc_diag_urb()
3905 if (!data->diag) in btusb_bcm_set_diag()
3906 return -ENODEV; in btusb_bcm_set_diag()
3908 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_bcm_set_diag()
3909 return -ENETDOWN; in btusb_bcm_set_diag()
3923 pm_wakeup_event(&data->udev->dev, 0); in btusb_oob_wake_handler()
3927 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) { in btusb_oob_wake_handler()
3937 { .compatible = "usb4ca,301a" }, /* QCA6174A (Lite-On) */
3946 struct device *dev = &data->udev->dev; in btusb_config_oob_wake()
3949 clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags); in btusb_config_oob_wake()
3955 irq = of_irq_get_byname(dev->of_node, "wakeup"); in btusb_config_oob_wake()
3962 ret = devm_request_irq(&hdev->dev, irq, btusb_oob_wake_handler, in btusb_config_oob_wake()
3963 0, "OOB Wake-on-BT", data); in btusb_config_oob_wake()
3975 data->oob_wake_irq = irq; in btusb_config_oob_wake()
3976 bt_dev_info(hdev, "OOB Wake-on-BT configured at IRQ %u", irq); in btusb_config_oob_wake()
3984 interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME; in btusb_check_needs_reset_resume()
3991 if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags)) in btusb_prevent_wake()
3994 return !device_may_wakeup(&data->udev->dev); in btusb_prevent_wake()
4010 if (intf->cur_altsetting->desc.bInterfaceNumber != 0) { in btusb_probe()
4011 if (!(id->driver_info & BTUSB_IFNUM_2)) in btusb_probe()
4012 return -ENODEV; in btusb_probe()
4013 if (intf->cur_altsetting->desc.bInterfaceNumber != 2) in btusb_probe()
4014 return -ENODEV; in btusb_probe()
4017 ifnum_base = intf->cur_altsetting->desc.bInterfaceNumber; in btusb_probe()
4019 if (!id->driver_info) { in btusb_probe()
4027 if (id->driver_info == BTUSB_IGNORE) in btusb_probe()
4028 return -ENODEV; in btusb_probe()
4030 if (id->driver_info & BTUSB_ATH3012) { in btusb_probe()
4036 if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001 && in btusb_probe()
4038 return -ENODEV; in btusb_probe()
4041 data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL); in btusb_probe()
4043 return -ENOMEM; in btusb_probe()
4045 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in btusb_probe()
4046 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in btusb_probe()
4048 if (!data->intr_ep && usb_endpoint_is_int_in(ep_desc)) { in btusb_probe()
4049 data->intr_ep = ep_desc; in btusb_probe()
4053 if (!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) { in btusb_probe()
4054 data->bulk_tx_ep = ep_desc; in btusb_probe()
4058 if (!data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) { in btusb_probe()
4059 data->bulk_rx_ep = ep_desc; in btusb_probe()
4064 if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep) in btusb_probe()
4065 return -ENODEV; in btusb_probe()
4067 if (id->driver_info & BTUSB_AMP) { in btusb_probe()
4068 data->cmdreq_type = USB_TYPE_CLASS | 0x01; in btusb_probe()
4069 data->cmdreq = 0x2b; in btusb_probe()
4071 data->cmdreq_type = USB_TYPE_CLASS; in btusb_probe()
4072 data->cmdreq = 0x00; in btusb_probe()
4075 data->udev = interface_to_usbdev(intf); in btusb_probe()
4076 data->intf = intf; in btusb_probe()
4078 INIT_WORK(&data->work, btusb_work); in btusb_probe()
4079 INIT_WORK(&data->waker, btusb_waker); in btusb_probe()
4080 init_usb_anchor(&data->deferred); in btusb_probe()
4081 init_usb_anchor(&data->tx_anchor); in btusb_probe()
4082 spin_lock_init(&data->txlock); in btusb_probe()
4084 init_usb_anchor(&data->intr_anchor); in btusb_probe()
4085 init_usb_anchor(&data->bulk_anchor); in btusb_probe()
4086 init_usb_anchor(&data->isoc_anchor); in btusb_probe()
4087 init_usb_anchor(&data->diag_anchor); in btusb_probe()
4088 init_usb_anchor(&data->ctrl_anchor); in btusb_probe()
4089 spin_lock_init(&data->rxlock); in btusb_probe()
4091 if (id->driver_info & BTUSB_INTEL_NEW) { in btusb_probe()
4092 data->recv_event = btusb_recv_event_intel; in btusb_probe()
4093 data->recv_bulk = btusb_recv_bulk_intel; in btusb_probe()
4094 set_bit(BTUSB_BOOTLOADER, &data->flags); in btusb_probe()
4096 data->recv_event = hci_recv_frame; in btusb_probe()
4097 data->recv_bulk = btusb_recv_bulk; in btusb_probe()
4102 return -ENOMEM; in btusb_probe()
4104 hdev->bus = HCI_USB; in btusb_probe()
4107 if (id->driver_info & BTUSB_AMP) in btusb_probe()
4108 hdev->dev_type = HCI_AMP; in btusb_probe()
4110 hdev->dev_type = HCI_PRIMARY; in btusb_probe()
4112 data->hdev = hdev; in btusb_probe()
4114 SET_HCIDEV_DEV(hdev, &intf->dev); in btusb_probe()
4116 reset_gpio = gpiod_get_optional(&data->udev->dev, "reset", in btusb_probe()
4122 data->reset_gpio = reset_gpio; in btusb_probe()
4125 hdev->open = btusb_open; in btusb_probe()
4126 hdev->close = btusb_close; in btusb_probe()
4127 hdev->flush = btusb_flush; in btusb_probe()
4128 hdev->send = btusb_send_frame; in btusb_probe()
4129 hdev->notify = btusb_notify; in btusb_probe()
4130 hdev->prevent_wake = btusb_prevent_wake; in btusb_probe()
4138 if (id->driver_info & BTUSB_MARVELL && data->oob_wake_irq) { in btusb_probe()
4144 if (id->driver_info & BTUSB_CW6622) in btusb_probe()
4145 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks); in btusb_probe()
4147 if (id->driver_info & BTUSB_BCM2045) in btusb_probe()
4148 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks); in btusb_probe()
4150 if (id->driver_info & BTUSB_BCM92035) in btusb_probe()
4151 hdev->setup = btusb_setup_bcm92035; in btusb_probe()
4154 (id->driver_info & BTUSB_BCM_PATCHRAM)) { in btusb_probe()
4155 hdev->manufacturer = 15; in btusb_probe()
4156 hdev->setup = btbcm_setup_patchram; in btusb_probe()
4157 hdev->set_diag = btusb_bcm_set_diag; in btusb_probe()
4158 hdev->set_bdaddr = btbcm_set_bdaddr; in btusb_probe()
4161 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2); in btusb_probe()
4165 (id->driver_info & BTUSB_BCM_APPLE)) { in btusb_probe()
4166 hdev->manufacturer = 15; in btusb_probe()
4167 hdev->setup = btbcm_setup_apple; in btusb_probe()
4168 hdev->set_diag = btusb_bcm_set_diag; in btusb_probe()
4171 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2); in btusb_probe()
4174 if (id->driver_info & BTUSB_INTEL) { in btusb_probe()
4175 hdev->manufacturer = 2; in btusb_probe()
4176 hdev->setup = btusb_setup_intel; in btusb_probe()
4177 hdev->shutdown = btusb_shutdown_intel; in btusb_probe()
4178 hdev->set_diag = btintel_set_diag_mfg; in btusb_probe()
4179 hdev->set_bdaddr = btintel_set_bdaddr; in btusb_probe()
4180 hdev->cmd_timeout = btusb_intel_cmd_timeout; in btusb_probe()
4181 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); in btusb_probe()
4182 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4183 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks); in btusb_probe()
4186 if (id->driver_info & BTUSB_INTEL_NEW) { in btusb_probe()
4187 hdev->manufacturer = 2; in btusb_probe()
4188 hdev->send = btusb_send_frame_intel; in btusb_probe()
4189 hdev->setup = btusb_setup_intel_new; in btusb_probe()
4190 hdev->shutdown = btusb_shutdown_intel_new; in btusb_probe()
4191 hdev->hw_error = btintel_hw_error; in btusb_probe()
4192 hdev->set_diag = btintel_set_diag; in btusb_probe()
4193 hdev->set_bdaddr = btintel_set_bdaddr; in btusb_probe()
4194 hdev->cmd_timeout = btusb_intel_cmd_timeout; in btusb_probe()
4195 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); in btusb_probe()
4196 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4197 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks); in btusb_probe()
4200 if (id->driver_info & BTUSB_MARVELL) in btusb_probe()
4201 hdev->set_bdaddr = btusb_set_bdaddr_marvell; in btusb_probe()
4204 (id->driver_info & BTUSB_MEDIATEK)) { in btusb_probe()
4205 hdev->setup = btusb_mtk_setup; in btusb_probe()
4206 hdev->shutdown = btusb_mtk_shutdown; in btusb_probe()
4207 hdev->manufacturer = 70; in btusb_probe()
4208 set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); in btusb_probe()
4211 if (id->driver_info & BTUSB_SWAVE) { in btusb_probe()
4212 set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks); in btusb_probe()
4213 set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks); in btusb_probe()
4216 if (id->driver_info & BTUSB_INTEL_BOOT) { in btusb_probe()
4217 hdev->manufacturer = 2; in btusb_probe()
4218 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); in btusb_probe()
4221 if (id->driver_info & BTUSB_ATH3012) { in btusb_probe()
4222 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
4223 hdev->set_bdaddr = btusb_set_bdaddr_ath3012; in btusb_probe()
4224 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4225 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); in btusb_probe()
4228 if (id->driver_info & BTUSB_QCA_ROME) { in btusb_probe()
4229 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
4230 hdev->set_bdaddr = btusb_set_bdaddr_ath3012; in btusb_probe()
4231 hdev->cmd_timeout = btusb_qca_cmd_timeout; in btusb_probe()
4232 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4236 if (id->driver_info & BTUSB_QCA_WCN6855) { in btusb_probe()
4237 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
4238 hdev->set_bdaddr = btusb_set_bdaddr_wcn6855; in btusb_probe()
4239 hdev->cmd_timeout = btusb_qca_cmd_timeout; in btusb_probe()
4240 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4243 if (id->driver_info & BTUSB_AMP) { in btusb_probe()
4245 data->isoc = NULL; in btusb_probe()
4248 data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1); in btusb_probe()
4249 data->isoc_ifnum = ifnum_base + 1; in btusb_probe()
4253 (id->driver_info & BTUSB_REALTEK)) { in btusb_probe()
4254 hdev->setup = btrtl_setup_realtek; in btusb_probe()
4255 hdev->shutdown = btrtl_shutdown_realtek; in btusb_probe()
4256 hdev->cmd_timeout = btusb_rtl_cmd_timeout; in btusb_probe()
4262 set_bit(BTUSB_WAKEUP_DISABLE, &data->flags); in btusb_probe()
4263 set_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags); in btusb_probe()
4267 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); in btusb_probe()
4269 if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) { in btusb_probe()
4271 set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks); in btusb_probe()
4274 if (id->driver_info & BTUSB_BROKEN_ISOC) in btusb_probe()
4275 data->isoc = NULL; in btusb_probe()
4277 if (id->driver_info & BTUSB_WIDEBAND_SPEECH) in btusb_probe()
4278 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); in btusb_probe()
4280 if (id->driver_info & BTUSB_VALID_LE_STATES) in btusb_probe()
4281 set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks); in btusb_probe()
4283 if (id->driver_info & BTUSB_DIGIANSWER) { in btusb_probe()
4284 data->cmdreq_type = USB_TYPE_VENDOR; in btusb_probe()
4285 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); in btusb_probe()
4288 if (id->driver_info & BTUSB_CSR) { in btusb_probe()
4289 struct usb_device *udev = data->udev; in btusb_probe()
4290 u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice); in btusb_probe()
4294 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); in btusb_probe()
4297 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4300 if (le16_to_cpu(udev->descriptor.idVendor) == 0x0a12 && in btusb_probe()
4301 le16_to_cpu(udev->descriptor.idProduct) == 0x0001) in btusb_probe()
4302 hdev->setup = btusb_setup_csr; in btusb_probe()
4305 if (id->driver_info & BTUSB_SNIFFER) { in btusb_probe()
4306 struct usb_device *udev = data->udev; in btusb_probe()
4309 if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997) in btusb_probe()
4310 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); in btusb_probe()
4313 if (id->driver_info & BTUSB_INTEL_BOOT) { in btusb_probe()
4317 err = usb_set_interface(data->udev, 0, 0); in btusb_probe()
4324 if (data->isoc) { in btusb_probe()
4326 data->isoc, data); in btusb_probe()
4331 if (IS_ENABLED(CONFIG_BT_HCIBTUSB_BCM) && data->diag) { in btusb_probe()
4333 data->diag, data)) in btusb_probe()
4336 data->diag = NULL; in btusb_probe()
4340 usb_enable_autosuspend(data->udev); in btusb_probe()
4351 if (data->reset_gpio) in btusb_probe()
4352 gpiod_put(data->reset_gpio); in btusb_probe()
4367 hdev = data->hdev; in btusb_disconnect()
4368 usb_set_intfdata(data->intf, NULL); in btusb_disconnect()
4370 if (data->isoc) in btusb_disconnect()
4371 usb_set_intfdata(data->isoc, NULL); in btusb_disconnect()
4373 if (data->diag) in btusb_disconnect()
4374 usb_set_intfdata(data->diag, NULL); in btusb_disconnect()
4378 if (intf == data->intf) { in btusb_disconnect()
4379 if (data->isoc) in btusb_disconnect()
4380 usb_driver_release_interface(&btusb_driver, data->isoc); in btusb_disconnect()
4381 if (data->diag) in btusb_disconnect()
4382 usb_driver_release_interface(&btusb_driver, data->diag); in btusb_disconnect()
4383 } else if (intf == data->isoc) { in btusb_disconnect()
4384 if (data->diag) in btusb_disconnect()
4385 usb_driver_release_interface(&btusb_driver, data->diag); in btusb_disconnect()
4386 usb_driver_release_interface(&btusb_driver, data->intf); in btusb_disconnect()
4387 } else if (intf == data->diag) { in btusb_disconnect()
4388 usb_driver_release_interface(&btusb_driver, data->intf); in btusb_disconnect()
4389 if (data->isoc) in btusb_disconnect()
4390 usb_driver_release_interface(&btusb_driver, data->isoc); in btusb_disconnect()
4393 if (data->oob_wake_irq) in btusb_disconnect()
4394 device_init_wakeup(&data->udev->dev, false); in btusb_disconnect()
4396 if (data->reset_gpio) in btusb_disconnect()
4397 gpiod_put(data->reset_gpio); in btusb_disconnect()
4409 if (data->suspend_count++) in btusb_suspend()
4412 spin_lock_irq(&data->txlock); in btusb_suspend()
4413 if (!(PMSG_IS_AUTO(message) && data->tx_in_flight)) { in btusb_suspend()
4414 set_bit(BTUSB_SUSPENDING, &data->flags); in btusb_suspend()
4415 spin_unlock_irq(&data->txlock); in btusb_suspend()
4417 spin_unlock_irq(&data->txlock); in btusb_suspend()
4418 data->suspend_count--; in btusb_suspend()
4419 return -EBUSY; in btusb_suspend()
4422 cancel_work_sync(&data->work); in btusb_suspend()
4425 usb_kill_anchored_urbs(&data->tx_anchor); in btusb_suspend()
4427 if (data->oob_wake_irq && device_may_wakeup(&data->udev->dev)) { in btusb_suspend()
4428 set_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags); in btusb_suspend()
4429 enable_irq_wake(data->oob_wake_irq); in btusb_suspend()
4430 enable_irq(data->oob_wake_irq); in btusb_suspend()
4438 if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags)) { in btusb_suspend()
4440 device_can_wakeup(&data->udev->dev)) in btusb_suspend()
4441 data->udev->do_remote_wakeup = 1; in btusb_suspend()
4443 data->udev->reset_resume = 1; in btusb_suspend()
4454 while ((urb = usb_get_from_anchor(&data->deferred))) { in play_deferred()
4455 usb_anchor_urb(urb, &data->tx_anchor); in play_deferred()
4459 if (err != -EPERM && err != -ENODEV) in play_deferred()
4461 data->hdev->name, urb, -err); in play_deferred()
4462 kfree(urb->setup_packet); in play_deferred()
4468 data->tx_in_flight++; in play_deferred()
4473 while ((urb = usb_get_from_anchor(&data->deferred))) { in play_deferred()
4474 kfree(urb->setup_packet); in play_deferred()
4482 struct hci_dev *hdev = data->hdev; in btusb_resume()
4487 if (--data->suspend_count) in btusb_resume()
4491 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) { in btusb_resume()
4492 disable_irq(data->oob_wake_irq); in btusb_resume()
4493 disable_irq_wake(data->oob_wake_irq); in btusb_resume()
4496 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_resume()
4499 if (test_bit(BTUSB_INTR_RUNNING, &data->flags)) { in btusb_resume()
4502 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_resume()
4507 if (test_bit(BTUSB_BULK_RUNNING, &data->flags)) { in btusb_resume()
4510 clear_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_resume()
4517 if (test_bit(BTUSB_ISOC_RUNNING, &data->flags)) { in btusb_resume()
4519 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_resume()
4524 spin_lock_irq(&data->txlock); in btusb_resume()
4526 clear_bit(BTUSB_SUSPENDING, &data->flags); in btusb_resume()
4527 spin_unlock_irq(&data->txlock); in btusb_resume()
4528 schedule_work(&data->work); in btusb_resume()
4533 usb_scuttle_anchored_urbs(&data->deferred); in btusb_resume()
4535 spin_lock_irq(&data->txlock); in btusb_resume()
4536 clear_bit(BTUSB_SUSPENDING, &data->flags); in btusb_resume()
4537 spin_unlock_irq(&data->txlock); in btusb_resume()