Lines Matching +full:isoc +full:- +full:in
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Copyright (C) 2005-2008 Marcel Holtmann <[email protected]>
80 /* Apple-specific (Broadcom) devices */
117 /* ALPS Modules with non-standard id */
121 /* Ericsson with non-standard id */
124 /* Canyon CN-BTU1 with HID interfaces */
138 /* Foxconn - Hon Hai */
142 /* Lite-On Technology - Broadcom based */
150 /* ASUSTek Computer - Broadcom based */
154 /* Belkin F8065bf - Broadcom based */
158 /* IMC Networks - Broadcom based */
162 /* Dell Computer - Broadcom based */
166 /* Toshiba Corp - Broadcom based */
439 /* Asus WL-BTD202 device */
572 /* Realtek 8852BT/8852BE-VT Bluetooth devices */
866 struct usb_interface *isoc; member
925 int oob_wake_irq; /* irq for out-of-band wake-on-bt */
937 err = usb_autopm_get_interface(data->intf); in btusb_reset()
944 usb_queue_reset_device(data->intf); in btusb_reset()
950 struct gpio_desc *reset_gpio = data->reset_gpio; in btusb_intel_reset()
953 if (intel_data->acpi_reset_method) { in btusb_intel_reset()
954 if (test_and_set_bit(INTEL_ACPI_RESET_ACTIVE, intel_data->flags)) { in btusb_intel_reset()
963 if (!intel_data->acpi_reset_method(hdev)) { in btusb_intel_reset()
980 if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { in btusb_intel_reset()
1016 if (!hci_devcd_init(hdev, skb->len)) { in btusb_rtl_alloc_devcoredump()
1028 struct gpio_desc *reset_gpio = data->reset_gpio; in btusb_rtl_reset()
1046 if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { in btusb_rtl_reset()
1072 struct gpio_desc *reset_gpio = data->reset_gpio; in btusb_qca_reset()
1074 if (test_bit(BTUSB_HW_SSR_ACTIVE, &data->flags)) { in btusb_qca_reset()
1075 bt_dev_info(hdev, "Ramdump in progress, defer reset"); in btusb_qca_reset()
1088 if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { in btusb_qca_reset()
1107 spin_lock_irqsave(&data->rxlock, flags); in btusb_free_frags()
1109 dev_kfree_skb_irq(data->evt_skb); in btusb_free_frags()
1110 data->evt_skb = NULL; in btusb_free_frags()
1112 dev_kfree_skb_irq(data->acl_skb); in btusb_free_frags()
1113 data->acl_skb = NULL; in btusb_free_frags()
1115 dev_kfree_skb_irq(data->sco_skb); in btusb_free_frags()
1116 data->sco_skb = NULL; in btusb_free_frags()
1118 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_free_frags()
1123 struct hci_event_hdr *hdr = (void *) skb->data; in btusb_sco_connected()
1125 (void *) skb->data + sizeof(*hdr); in btusb_sco_connected()
1126 struct hci_dev *hdev = data->hdev; in btusb_sco_connected()
1132 if (skb->len < sizeof(*hdr) || hdr->evt != HCI_EV_SYNC_CONN_COMPLETE) in btusb_sco_connected()
1135 if (skb->len != sizeof(*hdr) + sizeof(*ev) || ev->status) in btusb_sco_connected()
1138 switch (ev->air_mode) { in btusb_sco_connected()
1151 bt_dev_info(hdev, "enabling SCO with air mode %u", ev->air_mode); in btusb_sco_connected()
1152 data->sco_num = 1; in btusb_sco_connected()
1153 data->air_mode = notify_air_mode; in btusb_sco_connected()
1154 schedule_work(&data->work); in btusb_sco_connected()
1159 if (data->intr_interval) { in btusb_recv_event()
1161 schedule_delayed_work(&data->rx_work, 0); in btusb_recv_event()
1165 if (auto_isoc_alt && hci_dev_test_flag(data->hdev, HCI_USER_CHANNEL)) in btusb_recv_event()
1168 return data->recv_event(data->hdev, skb); in btusb_recv_event()
1177 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_intr()
1178 skb = data->evt_skb; in btusb_recv_intr()
1186 err = -ENOMEM; in btusb_recv_intr()
1197 count -= len; in btusb_recv_intr()
1199 hci_skb_expect(skb) -= len; in btusb_recv_intr()
1201 if (skb->len == HCI_EVENT_HDR_SIZE) { in btusb_recv_intr()
1203 hci_skb_expect(skb) = hci_event_hdr(skb)->plen; in btusb_recv_intr()
1209 err = -EILSEQ; in btusb_recv_intr()
1221 data->evt_skb = skb; in btusb_recv_intr()
1222 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_intr()
1232 if (!data->intr_interval) in btusb_recv_acl()
1233 return data->recv_acl(data->hdev, skb); in btusb_recv_acl()
1235 skb_queue_tail(&data->acl_q, skb); in btusb_recv_acl()
1236 schedule_delayed_work(&data->rx_work, data->intr_interval); in btusb_recv_acl()
1247 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_bulk()
1248 skb = data->acl_skb; in btusb_recv_bulk()
1256 err = -ENOMEM; in btusb_recv_bulk()
1267 count -= len; in btusb_recv_bulk()
1269 hci_skb_expect(skb) -= len; in btusb_recv_bulk()
1271 if (skb->len == HCI_ACL_HDR_SIZE) { in btusb_recv_bulk()
1272 __le16 dlen = hci_acl_hdr(skb)->dlen; in btusb_recv_bulk()
1281 err = -EILSEQ; in btusb_recv_bulk()
1293 data->acl_skb = skb; in btusb_recv_bulk()
1294 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_bulk()
1316 handle = hci_handle(__le16_to_cpu(hdr->handle)); in btusb_validate_sco_handle()
1333 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_isoc()
1334 skb = data->sco_skb; in btusb_recv_isoc()
1342 err = -ENOMEM; in btusb_recv_isoc()
1353 count -= len; in btusb_recv_isoc()
1355 hci_skb_expect(skb) -= len; in btusb_recv_isoc()
1357 if (skb->len == HCI_SCO_HDR_SIZE) { in btusb_recv_isoc()
1361 hci_skb_expect(skb) = hdr->dlen; in btusb_recv_isoc()
1364 !btusb_validate_sco_handle(data->hdev, hdr)) { in btusb_recv_isoc()
1368 err = -EILSEQ; in btusb_recv_isoc()
1375 hci_recv_frame(data->hdev, skb); in btusb_recv_isoc()
1380 data->sco_skb = skb; in btusb_recv_isoc()
1381 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_isoc()
1388 struct hci_dev *hdev = urb->context; in btusb_intr_complete()
1392 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_intr_complete()
1393 urb->actual_length); in btusb_intr_complete()
1395 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_intr_complete()
1398 if (urb->status == 0) { in btusb_intr_complete()
1399 hdev->stat.byte_rx += urb->actual_length; in btusb_intr_complete()
1401 if (btusb_recv_intr(data, urb->transfer_buffer, in btusb_intr_complete()
1402 urb->actual_length) < 0) { in btusb_intr_complete()
1404 hdev->stat.err_rx++; in btusb_intr_complete()
1406 } else if (urb->status == -ENOENT) { in btusb_intr_complete()
1411 if (!test_bit(BTUSB_INTR_RUNNING, &data->flags)) in btusb_intr_complete()
1414 usb_mark_last_busy(data->udev); in btusb_intr_complete()
1415 usb_anchor_urb(urb, &data->intr_anchor); in btusb_intr_complete()
1419 /* -EPERM: urb is being killed; in btusb_intr_complete()
1420 * -ENODEV: device got disconnected in btusb_intr_complete()
1422 if (err != -EPERM && err != -ENODEV) in btusb_intr_complete()
1424 urb, -err); in btusb_intr_complete()
1425 if (err != -EPERM) in btusb_intr_complete()
1426 hci_cmd_sync_cancel(hdev, -err); in btusb_intr_complete()
1439 BT_DBG("%s", hdev->name); in btusb_submit_intr_urb()
1441 if (!data->intr_ep) in btusb_submit_intr_urb()
1442 return -ENODEV; in btusb_submit_intr_urb()
1446 return -ENOMEM; in btusb_submit_intr_urb()
1448 if (le16_to_cpu(data->udev->descriptor.idVendor) == 0x0a12 && in btusb_submit_intr_urb()
1449 le16_to_cpu(data->udev->descriptor.idProduct) == 0x0001) in btusb_submit_intr_urb()
1450 /* Fake CSR devices don't seem to support sort-transter */ in btusb_submit_intr_urb()
1451 size = le16_to_cpu(data->intr_ep->wMaxPacketSize); in btusb_submit_intr_urb()
1454 * ZPL/short-transfer automatically. in btusb_submit_intr_urb()
1461 return -ENOMEM; in btusb_submit_intr_urb()
1464 pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress); in btusb_submit_intr_urb()
1466 usb_fill_int_urb(urb, data->udev, pipe, buf, size, in btusb_submit_intr_urb()
1467 btusb_intr_complete, hdev, data->intr_ep->bInterval); in btusb_submit_intr_urb()
1469 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_intr_urb()
1471 usb_anchor_urb(urb, &data->intr_anchor); in btusb_submit_intr_urb()
1475 if (err != -EPERM && err != -ENODEV) in btusb_submit_intr_urb()
1477 urb, -err); in btusb_submit_intr_urb()
1478 if (err != -EPERM) in btusb_submit_intr_urb()
1479 hci_cmd_sync_cancel(hdev, -err); in btusb_submit_intr_urb()
1484 if (!data->poll_sync) in btusb_submit_intr_urb()
1494 switch (urb->dev->speed) { in btusb_submit_intr_urb()
1497 data->intr_interval = usecs_to_jiffies(urb->interval * 125); in btusb_submit_intr_urb()
1500 data->intr_interval = msecs_to_jiffies(urb->interval); in btusb_submit_intr_urb()
1512 struct hci_dev *hdev = urb->context; in btusb_bulk_complete()
1516 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_bulk_complete()
1517 urb->actual_length); in btusb_bulk_complete()
1519 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_bulk_complete()
1522 if (urb->status == 0) { in btusb_bulk_complete()
1523 hdev->stat.byte_rx += urb->actual_length; in btusb_bulk_complete()
1525 if (data->recv_bulk(data, urb->transfer_buffer, in btusb_bulk_complete()
1526 urb->actual_length) < 0) { in btusb_bulk_complete()
1528 hdev->stat.err_rx++; in btusb_bulk_complete()
1530 } else if (urb->status == -ENOENT) { in btusb_bulk_complete()
1535 if (!test_bit(BTUSB_BULK_RUNNING, &data->flags)) in btusb_bulk_complete()
1538 usb_anchor_urb(urb, &data->bulk_anchor); in btusb_bulk_complete()
1539 usb_mark_last_busy(data->udev); in btusb_bulk_complete()
1543 /* -EPERM: urb is being killed; in btusb_bulk_complete()
1544 * -ENODEV: device got disconnected in btusb_bulk_complete()
1546 if (err != -EPERM && err != -ENODEV) in btusb_bulk_complete()
1548 urb, -err); in btusb_bulk_complete()
1561 BT_DBG("%s", hdev->name); in btusb_submit_bulk_urb()
1563 if (!data->bulk_rx_ep) in btusb_submit_bulk_urb()
1564 return -ENODEV; in btusb_submit_bulk_urb()
1568 return -ENOMEM; in btusb_submit_bulk_urb()
1573 return -ENOMEM; in btusb_submit_bulk_urb()
1576 pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress); in btusb_submit_bulk_urb()
1578 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size, in btusb_submit_bulk_urb()
1581 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_bulk_urb()
1583 usb_mark_last_busy(data->udev); in btusb_submit_bulk_urb()
1584 usb_anchor_urb(urb, &data->bulk_anchor); in btusb_submit_bulk_urb()
1588 if (err != -EPERM && err != -ENODEV) in btusb_submit_bulk_urb()
1590 urb, -err); in btusb_submit_bulk_urb()
1601 struct hci_dev *hdev = urb->context; in btusb_isoc_complete()
1605 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_isoc_complete()
1606 urb->actual_length); in btusb_isoc_complete()
1608 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_isoc_complete()
1611 if (urb->status == 0) { in btusb_isoc_complete()
1612 for (i = 0; i < urb->number_of_packets; i++) { in btusb_isoc_complete()
1613 unsigned int offset = urb->iso_frame_desc[i].offset; in btusb_isoc_complete()
1614 unsigned int length = urb->iso_frame_desc[i].actual_length; in btusb_isoc_complete()
1616 if (urb->iso_frame_desc[i].status) in btusb_isoc_complete()
1619 hdev->stat.byte_rx += length; in btusb_isoc_complete()
1621 if (btusb_recv_isoc(data, urb->transfer_buffer + offset, in btusb_isoc_complete()
1624 hdev->stat.err_rx++; in btusb_isoc_complete()
1627 } else if (urb->status == -ENOENT) { in btusb_isoc_complete()
1632 if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags)) in btusb_isoc_complete()
1635 usb_anchor_urb(urb, &data->isoc_anchor); in btusb_isoc_complete()
1639 /* -EPERM: urb is being killed; in btusb_isoc_complete()
1640 * -ENODEV: device got disconnected in btusb_isoc_complete()
1642 if (err != -EPERM && err != -ENODEV) in btusb_isoc_complete()
1644 urb, -err); in btusb_isoc_complete()
1660 if (test_bit(BTUSB_ALT6_CONTINUOUS_TX, &data->flags)) in __fill_isoc_descriptor_msbc()
1669 if (data->usb_alt6_packet_flow) { in __fill_isoc_descriptor_msbc()
1671 data->usb_alt6_packet_flow = false; in __fill_isoc_descriptor_msbc()
1674 data->usb_alt6_packet_flow = true; in __fill_isoc_descriptor_msbc()
1678 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor_msbc()
1679 urb->iso_frame_desc[i].length = offset; in __fill_isoc_descriptor_msbc()
1684 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor_msbc()
1685 urb->iso_frame_desc[i].length = len; in __fill_isoc_descriptor_msbc()
1689 urb->number_of_packets = i; in __fill_isoc_descriptor_msbc()
1699 i++, offset += mtu, len -= mtu) { in __fill_isoc_descriptor()
1700 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor()
1701 urb->iso_frame_desc[i].length = mtu; in __fill_isoc_descriptor()
1705 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor()
1706 urb->iso_frame_desc[i].length = len; in __fill_isoc_descriptor()
1710 urb->number_of_packets = i; in __fill_isoc_descriptor()
1721 BT_DBG("%s", hdev->name); in btusb_submit_isoc_urb()
1723 if (!data->isoc_rx_ep) in btusb_submit_isoc_urb()
1724 return -ENODEV; in btusb_submit_isoc_urb()
1728 return -ENOMEM; in btusb_submit_isoc_urb()
1730 size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) * in btusb_submit_isoc_urb()
1736 return -ENOMEM; in btusb_submit_isoc_urb()
1739 pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); in btusb_submit_isoc_urb()
1741 usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete, in btusb_submit_isoc_urb()
1742 hdev, data->isoc_rx_ep->bInterval); in btusb_submit_isoc_urb()
1744 urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; in btusb_submit_isoc_urb()
1747 le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); in btusb_submit_isoc_urb()
1749 usb_anchor_urb(urb, &data->isoc_anchor); in btusb_submit_isoc_urb()
1753 if (err != -EPERM && err != -ENODEV) in btusb_submit_isoc_urb()
1755 urb, -err); in btusb_submit_isoc_urb()
1766 struct hci_dev *hdev = urb->context; in btusb_diag_complete()
1770 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_diag_complete()
1771 urb->actual_length); in btusb_diag_complete()
1773 if (urb->status == 0) { in btusb_diag_complete()
1776 skb = bt_skb_alloc(urb->actual_length, GFP_ATOMIC); in btusb_diag_complete()
1778 skb_put_data(skb, urb->transfer_buffer, in btusb_diag_complete()
1779 urb->actual_length); in btusb_diag_complete()
1782 } else if (urb->status == -ENOENT) { in btusb_diag_complete()
1787 if (!test_bit(BTUSB_DIAG_RUNNING, &data->flags)) in btusb_diag_complete()
1790 usb_anchor_urb(urb, &data->diag_anchor); in btusb_diag_complete()
1791 usb_mark_last_busy(data->udev); in btusb_diag_complete()
1795 /* -EPERM: urb is being killed; in btusb_diag_complete()
1796 * -ENODEV: device got disconnected in btusb_diag_complete()
1798 if (err != -EPERM && err != -ENODEV) in btusb_diag_complete()
1800 urb, -err); in btusb_diag_complete()
1813 BT_DBG("%s", hdev->name); in btusb_submit_diag_urb()
1815 if (!data->diag_rx_ep) in btusb_submit_diag_urb()
1816 return -ENODEV; in btusb_submit_diag_urb()
1820 return -ENOMEM; in btusb_submit_diag_urb()
1825 return -ENOMEM; in btusb_submit_diag_urb()
1828 pipe = usb_rcvbulkpipe(data->udev, data->diag_rx_ep->bEndpointAddress); in btusb_submit_diag_urb()
1830 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size, in btusb_submit_diag_urb()
1833 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_diag_urb()
1835 usb_mark_last_busy(data->udev); in btusb_submit_diag_urb()
1836 usb_anchor_urb(urb, &data->diag_anchor); in btusb_submit_diag_urb()
1840 if (err != -EPERM && err != -ENODEV) in btusb_submit_diag_urb()
1842 urb, -err); in btusb_submit_diag_urb()
1853 struct sk_buff *skb = urb->context; in btusb_tx_complete()
1854 struct hci_dev *hdev = (struct hci_dev *)skb->dev; in btusb_tx_complete()
1858 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_tx_complete()
1859 urb->actual_length); in btusb_tx_complete()
1861 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_tx_complete()
1864 if (!urb->status) { in btusb_tx_complete()
1865 hdev->stat.byte_tx += urb->transfer_buffer_length; in btusb_tx_complete()
1868 hci_cmd_sync_cancel(hdev, -urb->status); in btusb_tx_complete()
1869 hdev->stat.err_tx++; in btusb_tx_complete()
1873 spin_lock_irqsave(&data->txlock, flags); in btusb_tx_complete()
1874 data->tx_in_flight--; in btusb_tx_complete()
1875 spin_unlock_irqrestore(&data->txlock, flags); in btusb_tx_complete()
1877 kfree(urb->setup_packet); in btusb_tx_complete()
1884 struct sk_buff *skb = urb->context; in btusb_isoc_tx_complete()
1885 struct hci_dev *hdev = (struct hci_dev *)skb->dev; in btusb_isoc_tx_complete()
1887 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_isoc_tx_complete()
1888 urb->actual_length); in btusb_isoc_tx_complete()
1890 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_isoc_tx_complete()
1893 if (!urb->status) in btusb_isoc_tx_complete()
1894 hdev->stat.byte_tx += urb->transfer_buffer_length; in btusb_isoc_tx_complete()
1896 hdev->stat.err_tx++; in btusb_isoc_tx_complete()
1899 kfree(urb->setup_packet); in btusb_isoc_tx_complete()
1909 BT_DBG("%s", hdev->name); in btusb_open()
1911 err = usb_autopm_get_interface(data->intf); in btusb_open()
1918 if (data->setup_on_usb) { in btusb_open()
1919 err = data->setup_on_usb(hdev); in btusb_open()
1924 data->intf->needs_remote_wakeup = 1; in btusb_open()
1926 if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags)) in btusb_open()
1935 usb_kill_anchored_urbs(&data->intr_anchor); in btusb_open()
1939 set_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_open()
1942 if (data->diag) { in btusb_open()
1944 set_bit(BTUSB_DIAG_RUNNING, &data->flags); in btusb_open()
1948 usb_autopm_put_interface(data->intf); in btusb_open()
1952 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_open()
1954 usb_autopm_put_interface(data->intf); in btusb_open()
1960 usb_kill_anchored_urbs(&data->intr_anchor); in btusb_stop_traffic()
1961 usb_kill_anchored_urbs(&data->bulk_anchor); in btusb_stop_traffic()
1962 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_stop_traffic()
1963 usb_kill_anchored_urbs(&data->diag_anchor); in btusb_stop_traffic()
1964 usb_kill_anchored_urbs(&data->ctrl_anchor); in btusb_stop_traffic()
1972 BT_DBG("%s", hdev->name); in btusb_close()
1974 cancel_delayed_work(&data->rx_work); in btusb_close()
1975 cancel_work_sync(&data->work); in btusb_close()
1976 cancel_work_sync(&data->waker); in btusb_close()
1978 skb_queue_purge(&data->acl_q); in btusb_close()
1980 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_close()
1981 clear_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_close()
1982 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_close()
1983 clear_bit(BTUSB_DIAG_RUNNING, &data->flags); in btusb_close()
1988 err = usb_autopm_get_interface(data->intf); in btusb_close()
1992 data->intf->needs_remote_wakeup = 0; in btusb_close()
1994 /* Enable remote wake up for auto-suspend */ in btusb_close()
1995 if (test_bit(BTUSB_WAKEUP_AUTOSUSPEND, &data->flags)) in btusb_close()
1996 data->intf->needs_remote_wakeup = 1; in btusb_close()
1998 usb_autopm_put_interface(data->intf); in btusb_close()
2001 usb_scuttle_anchored_urbs(&data->deferred); in btusb_close()
2009 BT_DBG("%s", hdev->name); in btusb_flush()
2011 cancel_delayed_work(&data->rx_work); in btusb_flush()
2013 skb_queue_purge(&data->acl_q); in btusb_flush()
2015 usb_kill_anchored_urbs(&data->tx_anchor); in btusb_flush()
2030 return ERR_PTR(-ENOMEM); in alloc_ctrl_urb()
2035 return ERR_PTR(-ENOMEM); in alloc_ctrl_urb()
2038 dr->bRequestType = data->cmdreq_type; in alloc_ctrl_urb()
2039 dr->bRequest = data->cmdreq; in alloc_ctrl_urb()
2040 dr->wIndex = 0; in alloc_ctrl_urb()
2041 dr->wValue = 0; in alloc_ctrl_urb()
2042 dr->wLength = __cpu_to_le16(skb->len); in alloc_ctrl_urb()
2044 pipe = usb_sndctrlpipe(data->udev, 0x00); in alloc_ctrl_urb()
2046 usb_fill_control_urb(urb, data->udev, pipe, (void *)dr, in alloc_ctrl_urb()
2047 skb->data, skb->len, btusb_tx_complete, skb); in alloc_ctrl_urb()
2049 skb->dev = (void *)hdev; in alloc_ctrl_urb()
2060 if (!data->bulk_tx_ep) in alloc_bulk_urb()
2061 return ERR_PTR(-ENODEV); in alloc_bulk_urb()
2065 return ERR_PTR(-ENOMEM); in alloc_bulk_urb()
2067 pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress); in alloc_bulk_urb()
2069 usb_fill_bulk_urb(urb, data->udev, pipe, in alloc_bulk_urb()
2070 skb->data, skb->len, btusb_tx_complete, skb); in alloc_bulk_urb()
2072 skb->dev = (void *)hdev; in alloc_bulk_urb()
2083 if (!data->isoc_tx_ep) in alloc_isoc_urb()
2084 return ERR_PTR(-ENODEV); in alloc_isoc_urb()
2088 return ERR_PTR(-ENOMEM); in alloc_isoc_urb()
2090 pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress); in alloc_isoc_urb()
2092 usb_fill_int_urb(urb, data->udev, pipe, in alloc_isoc_urb()
2093 skb->data, skb->len, btusb_isoc_tx_complete, in alloc_isoc_urb()
2094 skb, data->isoc_tx_ep->bInterval); in alloc_isoc_urb()
2096 urb->transfer_flags = URB_ISO_ASAP; in alloc_isoc_urb()
2098 if (data->isoc_altsetting == 6) in alloc_isoc_urb()
2099 __fill_isoc_descriptor_msbc(urb, skb->len, in alloc_isoc_urb()
2100 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize), in alloc_isoc_urb()
2103 __fill_isoc_descriptor(urb, skb->len, in alloc_isoc_urb()
2104 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); in alloc_isoc_urb()
2105 skb->dev = (void *)hdev; in alloc_isoc_urb()
2115 usb_anchor_urb(urb, &data->tx_anchor); in submit_tx_urb()
2119 if (err != -EPERM && err != -ENODEV) in submit_tx_urb()
2121 urb, -err); in submit_tx_urb()
2122 kfree(urb->setup_packet); in submit_tx_urb()
2125 usb_mark_last_busy(data->udev); in submit_tx_urb()
2138 spin_lock_irqsave(&data->txlock, flags); in submit_or_queue_tx_urb()
2139 suspending = test_bit(BTUSB_SUSPENDING, &data->flags); in submit_or_queue_tx_urb()
2141 data->tx_in_flight++; in submit_or_queue_tx_urb()
2142 spin_unlock_irqrestore(&data->txlock, flags); in submit_or_queue_tx_urb()
2147 usb_anchor_urb(urb, &data->deferred); in submit_or_queue_tx_urb()
2148 schedule_work(&data->waker); in submit_or_queue_tx_urb()
2158 BT_DBG("%s", hdev->name); in btusb_send_frame()
2166 hdev->stat.cmd_tx++; in btusb_send_frame()
2174 hdev->stat.acl_tx++; in btusb_send_frame()
2180 return -ENODEV; in btusb_send_frame()
2186 hdev->stat.sco_tx++; in btusb_send_frame()
2197 return -EILSEQ; in btusb_send_frame()
2204 BT_DBG("%s evt %d", hdev->name, evt); in btusb_notify()
2206 if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) { in btusb_notify()
2207 data->sco_num = hci_conn_num(hdev, SCO_LINK); in btusb_notify()
2208 data->air_mode = evt; in btusb_notify()
2209 schedule_work(&data->work); in btusb_notify()
2216 struct usb_interface *intf = data->isoc; in __set_isoc_interface()
2220 if (!data->isoc) in __set_isoc_interface()
2221 return -ENODEV; in __set_isoc_interface()
2223 err = usb_set_interface(data->udev, data->isoc_ifnum, altsetting); in __set_isoc_interface()
2225 bt_dev_err(hdev, "setting interface failed (%d)", -err); in __set_isoc_interface()
2229 data->isoc_altsetting = altsetting; in __set_isoc_interface()
2231 data->isoc_tx_ep = NULL; in __set_isoc_interface()
2232 data->isoc_rx_ep = NULL; in __set_isoc_interface()
2234 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in __set_isoc_interface()
2235 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in __set_isoc_interface()
2237 if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) { in __set_isoc_interface()
2238 data->isoc_tx_ep = ep_desc; in __set_isoc_interface()
2242 if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) { in __set_isoc_interface()
2243 data->isoc_rx_ep = ep_desc; in __set_isoc_interface()
2248 if (!data->isoc_tx_ep || !data->isoc_rx_ep) { in __set_isoc_interface()
2250 return -ENODEV; in __set_isoc_interface()
2261 if (data->isoc_altsetting != new_alts) { in btusb_switch_alt_setting()
2264 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_switch_alt_setting()
2265 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_switch_alt_setting()
2269 * or removed, a packet fragment may be left in the in btusb_switch_alt_setting()
2276 spin_lock_irqsave(&data->rxlock, flags); in btusb_switch_alt_setting()
2277 dev_kfree_skb_irq(data->sco_skb); in btusb_switch_alt_setting()
2278 data->sco_skb = NULL; in btusb_switch_alt_setting()
2279 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_switch_alt_setting()
2286 if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) { in btusb_switch_alt_setting()
2288 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_switch_alt_setting()
2299 struct usb_interface *intf = data->isoc; in btusb_find_altsetting()
2307 for (i = 0; i < intf->num_altsetting; i++) { in btusb_find_altsetting()
2308 if (intf->altsetting[i].desc.bAlternateSetting == alt) in btusb_find_altsetting()
2309 return &intf->altsetting[i]; in btusb_find_altsetting()
2318 struct hci_dev *hdev = data->hdev; in btusb_work()
2322 if (data->sco_num > 0) { in btusb_work()
2323 if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) { in btusb_work()
2324 err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf); in btusb_work()
2326 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_work()
2327 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_work()
2331 set_bit(BTUSB_DID_ISO_RESUME, &data->flags); in btusb_work()
2334 if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_CVSD) { in btusb_work()
2335 if (hdev->voice_setting & 0x0020) { in btusb_work()
2338 new_alts = alts[data->sco_num - 1]; in btusb_work()
2340 new_alts = data->sco_num; in btusb_work()
2342 } else if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_TRANSP) { in btusb_work()
2349 * MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72 in btusb_work()
2355 hdev->sco_mtu >= 72 && in btusb_work()
2356 test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags)) in btusb_work()
2365 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_work()
2367 if (test_and_clear_bit(BTUSB_ISOC_RUNNING, &data->flags)) in btusb_work()
2370 if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags)) in btusb_work()
2371 usb_autopm_put_interface(data->isoc ? data->isoc : data->intf); in btusb_work()
2380 err = usb_autopm_get_interface(data->intf); in btusb_waker()
2384 usb_autopm_put_interface(data->intf); in btusb_waker()
2394 while ((skb = skb_dequeue(&data->acl_q))) in btusb_rx_work()
2395 data->recv_acl(data->hdev, skb); in btusb_rx_work()
2403 BT_DBG("%s", hdev->name); in btusb_setup_bcm92035()
2417 u16 bcdDevice = le16_to_cpu(data->udev->descriptor.bcdDevice); in btusb_setup_csr()
2423 BT_DBG("%s", hdev->name); in btusb_setup_csr()
2437 return -EIO; in btusb_setup_csr()
2441 rp->hci_ver, le16_to_cpu(rp->hci_rev)); in btusb_setup_csr()
2444 rp->lmp_ver, le16_to_cpu(rp->lmp_subver), in btusb_setup_csr()
2445 le16_to_cpu(rp->manufacturer)); in btusb_setup_csr()
2451 * The main thing they have in common is that these are really popular low-cost in btusb_setup_csr()
2456 * is Cambridge Silicon Radio (10) and ensuring that LMP sub-version and in btusb_setup_csr()
2459 if (le16_to_cpu(rp->manufacturer) != 10 || in btusb_setup_csr()
2460 le16_to_cpu(rp->hci_rev) != le16_to_cpu(rp->lmp_subver)) in btusb_setup_csr()
2464 * - 1.1 (0x1) -> 0x0073, 0x020d, 0x033c, 0x034e in btusb_setup_csr()
2465 * - 1.2 (0x2) -> 0x04d9, 0x0529 in btusb_setup_csr()
2466 * - 2.0 (0x3) -> 0x07a6, 0x07ad, 0x0c5c in btusb_setup_csr()
2467 * - 2.1 (0x4) -> 0x149c, 0x1735, 0x1899 (0x1899 is a BlueCore4-External) in btusb_setup_csr()
2468 * - 4.0 (0x6) -> 0x1d86, 0x2031, 0x22bb in btusb_setup_csr()
2472 * third-party BT 4.0 dongle reuses it. in btusb_setup_csr()
2474 else if (le16_to_cpu(rp->lmp_subver) <= 0x034e && in btusb_setup_csr()
2475 rp->hci_ver > BLUETOOTH_VER_1_1) in btusb_setup_csr()
2478 else if (le16_to_cpu(rp->lmp_subver) <= 0x0529 && in btusb_setup_csr()
2479 rp->hci_ver > BLUETOOTH_VER_1_2) in btusb_setup_csr()
2482 else if (le16_to_cpu(rp->lmp_subver) <= 0x0c5c && in btusb_setup_csr()
2483 rp->hci_ver > BLUETOOTH_VER_2_0) in btusb_setup_csr()
2486 else if (le16_to_cpu(rp->lmp_subver) <= 0x1899 && in btusb_setup_csr()
2487 rp->hci_ver > BLUETOOTH_VER_2_1) in btusb_setup_csr()
2490 else if (le16_to_cpu(rp->lmp_subver) <= 0x22bb && in btusb_setup_csr()
2491 rp->hci_ver > BLUETOOTH_VER_4_0) in btusb_setup_csr()
2496 le16_to_cpu(rp->lmp_subver) == 0x0c5c && in btusb_setup_csr()
2497 rp->hci_ver == BLUETOOTH_VER_2_0) in btusb_setup_csr()
2501 …bt_dev_warn(hdev, "CSR: Unbranded CSR clone detected; adding workarounds and force-suspending once… in btusb_setup_csr()
2505 * Probably will need to be expanded in the future; in btusb_setup_csr()
2508 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks); in btusb_setup_csr()
2509 set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks); in btusb_setup_csr()
2510 set_bit(HCI_QUIRK_BROKEN_FILTER_CLEAR_ALL, &hdev->quirks); in btusb_setup_csr()
2511 set_bit(HCI_QUIRK_NO_SUSPEND_NOTIFIER, &hdev->quirks); in btusb_setup_csr()
2512 set_bit(HCI_QUIRK_BROKEN_READ_VOICE_SETTING, &hdev->quirks); in btusb_setup_csr()
2513 set_bit(HCI_QUIRK_BROKEN_READ_PAGE_SCAN_TYPE, &hdev->quirks); in btusb_setup_csr()
2518 clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); in btusb_setup_csr()
2519 clear_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_setup_csr()
2524 * - 0x0134: a Barrot 8041a02 (HCI rev: 0x0810 sub: 0x1012) in btusb_setup_csr()
2525 * - 0x7558: IC markings FR3191AHAL 749H15143 (HCI rev/sub-version: 0x0709) in btusb_setup_csr()
2527 * These controllers are really messed-up. in btusb_setup_csr()
2533 * (IOW remote-wakeup support is broken for the bulk endpoint). in btusb_setup_csr()
2535 * To fix 1. enable runtime-suspend, force-suspend the in btusb_setup_csr()
2536 * HCI and then wake-it up by disabling runtime-suspend. in btusb_setup_csr()
2541 * -- in btusb_setup_csr()
2547 pm_runtime_allow(&data->udev->dev); in btusb_setup_csr()
2549 ret = pm_runtime_suspend(&data->udev->dev); in btusb_setup_csr()
2553 …bt_dev_warn(hdev, "CSR: Couldn't suspend the device for our Barrot 8041a02 receive-issue workaroun… in btusb_setup_csr()
2555 pm_runtime_forbid(&data->udev->dev); in btusb_setup_csr()
2557 device_set_wakeup_capable(&data->udev->dev, false); in btusb_setup_csr()
2559 /* Re-enable autosuspend if this was requested */ in btusb_setup_csr()
2561 usb_enable_autosuspend(data->udev); in btusb_setup_csr()
2577 return -ENOMEM; in inject_cmd_complete()
2580 hdr->evt = HCI_EV_CMD_COMPLETE; in inject_cmd_complete()
2581 hdr->plen = sizeof(*evt) + 1; in inject_cmd_complete()
2584 evt->ncmd = 0x01; in inject_cmd_complete()
2585 evt->opcode = cpu_to_le16(opcode); in inject_cmd_complete()
2597 struct hci_dev *hdev = data->hdev; in btusb_recv_bulk_intel()
2599 /* When the device is in bootloader mode, then it can send in btusb_recv_bulk_intel()
2613 BT_DBG("%s", hdev->name); in btusb_send_frame_intel()
2618 struct hci_command_hdr *cmd = (void *)skb->data; in btusb_send_frame_intel()
2619 __u16 opcode = le16_to_cpu(cmd->opcode); in btusb_send_frame_intel()
2621 /* When in bootloader mode and the command 0xfc09 in btusb_send_frame_intel()
2643 hdev->stat.cmd_tx++; in btusb_send_frame_intel()
2651 hdev->stat.acl_tx++; in btusb_send_frame_intel()
2657 return -ENODEV; in btusb_send_frame_intel()
2663 hdev->stat.sco_tx++; in btusb_send_frame_intel()
2674 return -EILSEQ; in btusb_send_frame_intel()
2684 if (btrealtek_test_flag(data->hdev, REALTEK_ALT6_CONTINUOUS_TX_CHIP)) in btusb_setup_realtek()
2685 set_bit(BTUSB_ALT6_CONTINUOUS_TX, &data->flags); in btusb_setup_realtek()
2692 if (skb->data[0] == HCI_VENDOR_PKT && skb->data[2] == RTK_SUB_EVENT_CODE_COREDUMP) { in btusb_recv_event_realtek()
2698 skb->len); in btusb_recv_event_realtek()
2700 btusb_rtl_alloc_devcoredump(hdev, &hdr, skb->data, skb->len); in btusb_recv_event_realtek()
2711 struct btmtk_data *btmtk_data = hci_get_priv(data->hdev); in btusb_mtk_claim_iso_intf()
2719 device_lock(&btmtk_data->isopkt_intf->dev); in btusb_mtk_claim_iso_intf()
2721 btmtk_data->isopkt_intf, data); in btusb_mtk_claim_iso_intf()
2722 device_unlock(&btmtk_data->isopkt_intf->dev); in btusb_mtk_claim_iso_intf()
2724 btmtk_data->isopkt_intf = NULL; in btusb_mtk_claim_iso_intf()
2725 bt_dev_err(data->hdev, "Failed to claim iso interface"); in btusb_mtk_claim_iso_intf()
2729 set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags); in btusb_mtk_claim_iso_intf()
2730 init_usb_anchor(&btmtk_data->isopkt_anchor); in btusb_mtk_claim_iso_intf()
2737 if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) { in btusb_mtk_release_iso_intf()
2738 usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor); in btusb_mtk_release_iso_intf()
2739 clear_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags); in btusb_mtk_release_iso_intf()
2741 dev_kfree_skb_irq(btmtk_data->isopkt_skb); in btusb_mtk_release_iso_intf()
2742 btmtk_data->isopkt_skb = NULL; in btusb_mtk_release_iso_intf()
2743 usb_set_intfdata(btmtk_data->isopkt_intf, NULL); in btusb_mtk_release_iso_intf()
2745 btmtk_data->isopkt_intf); in btusb_mtk_release_iso_intf()
2748 clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags); in btusb_mtk_release_iso_intf()
2768 if (test_and_set_bit(BTMTK_HW_RESET_ACTIVE, &btmtk_data->flags)) { in btusb_mtk_reset()
2770 return -EBUSY; in btusb_mtk_reset()
2773 err = usb_autopm_get_interface(data->intf); in btusb_mtk_reset()
2781 usb_kill_anchored_urbs(&data->tx_anchor); in btusb_mtk_reset()
2783 err = btmtk_usb_subsys_reset(hdev, btmtk_data->dev_id); in btusb_mtk_reset()
2785 usb_queue_reset_device(data->intf); in btusb_mtk_reset()
2786 clear_bit(BTMTK_HW_RESET_ACTIVE, &btmtk_data->flags); in btusb_mtk_reset()
2795 BT_DBG("%s", hdev->name); in btusb_send_frame_mtk()
2816 btmtk_data->drv_name = btusb_driver.name; in btusb_mtk_setup()
2817 btmtk_data->intf = data->intf; in btusb_mtk_setup()
2818 btmtk_data->udev = data->udev; in btusb_mtk_setup()
2819 btmtk_data->ctrl_anchor = &data->ctrl_anchor; in btusb_mtk_setup()
2820 btmtk_data->reset_sync = btusb_mtk_reset; in btusb_mtk_setup()
2823 if (!test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) { in btusb_mtk_setup()
2824 btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM); in btusb_mtk_setup()
2844 /* Configure an out-of-band gpio as wake-up pin, if specified in device tree */
2849 struct device *dev = &data->udev->dev; in marvell_config_oob_wake()
2855 if (of_property_read_u16(dev->of_node, "marvell,wakeup-pin", &pin) || in marvell_config_oob_wake()
2856 of_property_read_u16(dev->of_node, "marvell,wakeup-gap-ms", &gap)) in marvell_config_oob_wake()
2859 /* Vendor specific command to configure a GPIO as wake-up pin */ in marvell_config_oob_wake()
2865 cmd[4] = gap; /* time in ms, for which wakeup pin should be asserted */ in marvell_config_oob_wake()
2870 return -ENOMEM; in marvell_config_oob_wake()
2983 btdata->qca_dump.controller_id); in btusb_dump_hdr_qca()
2987 btdata->qca_dump.fw_version); in btusb_dump_hdr_qca()
2995 btdata->qca_dump.id_vendor, btdata->qca_dump.id_product); in btusb_dump_hdr_qca()
2999 hdev->lmp_subver); in btusb_dump_hdr_qca()
3031 struct usb_device *udev = btdata->udev; in handle_dump_pkt_qca()
3034 sk_ptr = skb->data; in handle_dump_pkt_qca()
3035 sk_len = skb->len; in handle_dump_pkt_qca()
3039 if (le16_to_cpu(acl_hdr->handle) != QCA_MEMDUMP_ACL_HANDLE) in handle_dump_pkt_qca()
3042 sk_len -= HCI_ACL_HDR_SIZE; in handle_dump_pkt_qca()
3048 if ((event_hdr->evt != HCI_VENDOR_PKT) in handle_dump_pkt_qca()
3049 || (event_hdr->plen != (sk_len - HCI_EVENT_HDR_SIZE))) in handle_dump_pkt_qca()
3053 sk_len -= HCI_EVENT_HDR_SIZE; in handle_dump_pkt_qca()
3057 || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) in handle_dump_pkt_qca()
3058 || (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) in handle_dump_pkt_qca()
3062 seqno = le16_to_cpu(dump_hdr->seqno); in handle_dump_pkt_qca()
3064 set_bit(BTUSB_HW_SSR_ACTIVE, &btdata->flags); in handle_dump_pkt_qca()
3065 dump_size = le32_to_cpu(dump_hdr->ram_dump_size); in handle_dump_pkt_qca()
3067 ret = -EILSEQ; in handle_dump_pkt_qca()
3079 btdata->qca_dump.ram_dump_size = dump_size; in handle_dump_pkt_qca()
3080 btdata->qca_dump.ram_dump_seqno = 0; in handle_dump_pkt_qca()
3082 sk_len -= offsetof(struct qca_dump_hdr, data0); in handle_dump_pkt_qca()
3090 sk_len -= offsetof(struct qca_dump_hdr, data); in handle_dump_pkt_qca()
3093 if (!btdata->qca_dump.ram_dump_size) { in handle_dump_pkt_qca()
3094 ret = -EINVAL; in handle_dump_pkt_qca()
3099 if ((seqno > btdata->qca_dump.ram_dump_seqno + 1) && (seqno != QCA_LAST_SEQUENCE_NUM)) { in handle_dump_pkt_qca()
3100 dump_size = QCA_MEMDUMP_PKT_SIZE * (seqno - btdata->qca_dump.ram_dump_seqno - 1); in handle_dump_pkt_qca()
3104 btdata->qca_dump.ram_dump_seqno, seqno); in handle_dump_pkt_qca()
3105 btdata->qca_dump.ram_dump_seqno = seqno; in handle_dump_pkt_qca()
3110 skb_pull(skb, skb->len - sk_len); in handle_dump_pkt_qca()
3112 btdata->qca_dump.ram_dump_seqno++; in handle_dump_pkt_qca()
3116 btdata->qca_dump.ram_dump_seqno, btdata->qca_dump.ram_dump_size); in handle_dump_pkt_qca()
3124 if (btdata->qca_dump.ram_dump_size) in handle_dump_pkt_qca()
3126 btdata->qca_dump.ram_dump_size = 0; in handle_dump_pkt_qca()
3127 btdata->qca_dump.ram_dump_seqno = 0; in handle_dump_pkt_qca()
3128 clear_bit(BTUSB_HW_SSR_ACTIVE, &btdata->flags); in handle_dump_pkt_qca()
3183 u8 rampatch_hdr; /* length of header in rampatch */
3184 u8 nvm_hdr; /* length of header in NVM */
3185 u8 ver_offset; /* offset of version structure in rampatch */
3209 return -ENOMEM; in btusb_qca_send_vendor_req()
3218 dev_err(&udev->dev, "Failed to access otp area (%d)", err); in btusb_qca_send_vendor_req()
3235 struct usb_device *udev = btdata->udev; in btusb_setup_qca_download_fw()
3242 return -ENOMEM; in btusb_setup_qca_download_fw()
3244 count = firmware->size; in btusb_setup_qca_download_fw()
3247 memcpy(buf, firmware->data, size); in btusb_setup_qca_download_fw()
3263 count -= size; in btusb_setup_qca_download_fw()
3273 memcpy(buf, firmware->data + sent, size); in btusb_setup_qca_download_fw()
3280 sent, firmware->size, err); in btusb_setup_qca_download_fw()
3286 err = -EILSEQ; in btusb_setup_qca_download_fw()
3291 count -= size; in btusb_setup_qca_download_fw()
3310 ver_rom = le32_to_cpu(ver->rom_version); in btusb_setup_qca_load_rampatch()
3311 ver_patch = le32_to_cpu(ver->patch_version); in btusb_setup_qca_load_rampatch()
3315 err = request_firmware(&fw, fwname, &hdev->dev); in btusb_setup_qca_load_rampatch()
3324 rver = (struct qca_rampatch_version *)(fw->data + info->ver_offset); in btusb_setup_qca_load_rampatch()
3325 rver_rom_low = le16_to_cpu(rver->rom_version_low); in btusb_setup_qca_load_rampatch()
3326 rver_patch = le16_to_cpu(rver->patch_version); in btusb_setup_qca_load_rampatch()
3329 rver_rom_high = le16_to_cpu(rver->rom_version_high); in btusb_setup_qca_load_rampatch()
3341 err = -EINVAL; in btusb_setup_qca_load_rampatch()
3345 err = btusb_setup_qca_download_fw(hdev, fw, info->rampatch_hdr); in btusb_setup_qca_load_rampatch()
3356 u32 rom_version = le32_to_cpu(ver->rom_version); in btusb_generate_qca_nvm_name()
3357 u16 flag = le16_to_cpu(ver->flag); in btusb_generate_qca_nvm_name()
3370 u16 board_id = (ver->chip_id << 8) + ver->platform_id; in btusb_generate_qca_nvm_name()
3373 switch (le32_to_cpu(ver->ram_version)) { in btusb_generate_qca_nvm_name()
3407 err = request_firmware(&fw, fwname, &hdev->dev); in btusb_setup_qca_load_nvm()
3416 err = btusb_setup_qca_download_fw(hdev, fw, info->nvm_hdr); in btusb_setup_qca_load_nvm()
3438 struct usb_device *udev = btdata->udev; in btusb_setup_qca()
3457 /* If the rom_version is not matched in the qca_devices_table in btusb_setup_qca()
3465 return -ENODEV; in btusb_setup_qca()
3484 btdata->qca_dump.fw_version = le32_to_cpu(ver.patch_version); in btusb_setup_qca()
3485 btdata->qca_dump.controller_id = le32_to_cpu(ver.rom_version); in btusb_setup_qca()
3496 if (info->rom_version >= 0x00130201) in btusb_setup_qca()
3503 set_bit(HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN, &hdev->quirks); in btusb_setup_qca()
3511 struct usb_interface *intf = data->diag; in __set_diag_interface()
3514 if (!data->diag) in __set_diag_interface()
3515 return -ENODEV; in __set_diag_interface()
3517 data->diag_tx_ep = NULL; in __set_diag_interface()
3518 data->diag_rx_ep = NULL; in __set_diag_interface()
3520 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in __set_diag_interface()
3523 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in __set_diag_interface()
3525 if (!data->diag_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) { in __set_diag_interface()
3526 data->diag_tx_ep = ep_desc; in __set_diag_interface()
3530 if (!data->diag_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) { in __set_diag_interface()
3531 data->diag_rx_ep = ep_desc; in __set_diag_interface()
3536 if (!data->diag_tx_ep || !data->diag_rx_ep) { in __set_diag_interface()
3538 return -ENODEV; in __set_diag_interface()
3551 if (!data->diag_tx_ep) in alloc_diag_urb()
3552 return ERR_PTR(-ENODEV); in alloc_diag_urb()
3556 return ERR_PTR(-ENOMEM); in alloc_diag_urb()
3561 return ERR_PTR(-ENOMEM); in alloc_diag_urb()
3567 pipe = usb_sndbulkpipe(data->udev, data->diag_tx_ep->bEndpointAddress); in alloc_diag_urb()
3569 usb_fill_bulk_urb(urb, data->udev, pipe, in alloc_diag_urb()
3570 skb->data, skb->len, btusb_tx_complete, skb); in alloc_diag_urb()
3572 skb->dev = (void *)hdev; in alloc_diag_urb()
3582 if (!data->diag) in btusb_bcm_set_diag()
3583 return -ENODEV; in btusb_bcm_set_diag()
3585 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_bcm_set_diag()
3586 return -ENETDOWN; in btusb_bcm_set_diag()
3600 pm_wakeup_event(&data->udev->dev, 0); in btusb_oob_wake_handler()
3604 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) { in btusb_oob_wake_handler()
3614 { .compatible = "usb4ca,301a" }, /* QCA6174A (Lite-On) */
3623 struct device *dev = &data->udev->dev; in btusb_config_oob_wake()
3626 clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags); in btusb_config_oob_wake()
3632 irq = of_irq_get_byname(dev->of_node, "wakeup"); in btusb_config_oob_wake()
3634 bt_dev_dbg(hdev, "%s: no OOB Wakeup IRQ in DT", __func__); in btusb_config_oob_wake()
3639 ret = devm_request_irq(&hdev->dev, irq, btusb_oob_wake_handler, in btusb_config_oob_wake()
3640 0, "OOB Wake-on-BT", data); in btusb_config_oob_wake()
3652 data->oob_wake_irq = irq; in btusb_config_oob_wake()
3653 bt_dev_info(hdev, "OOB Wake-on-BT configured at IRQ %u", irq); in btusb_config_oob_wake()
3661 interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME; in btusb_check_needs_reset_resume()
3668 return device_may_wakeup(&data->udev->dev); in btusb_wakeup()
3688 struct btusb_data *data = file->private_data; in force_poll_sync_read()
3691 buf[0] = data->poll_sync ? 'Y' : 'N'; in force_poll_sync_read()
3701 struct btusb_data *data = file->private_data; in force_poll_sync_write()
3710 if (test_bit(HCI_UP, &data->hdev->flags)) in force_poll_sync_write()
3711 return -EPERM; in force_poll_sync_write()
3713 if (data->poll_sync == enable) in force_poll_sync_write()
3714 return -EALREADY; in force_poll_sync_write()
3716 data->poll_sync = enable; in force_poll_sync_write()
3735 return sysfs_emit(buf, "%d\n", data->isoc_altsetting); in isoc_alt_show()
3747 return -EINVAL; in isoc_alt_store()
3749 ret = btusb_switch_alt_setting(data->hdev, alt); in isoc_alt_store()
3767 if ((id->driver_info & BTUSB_IFNUM_2) && in btusb_probe()
3768 (intf->cur_altsetting->desc.bInterfaceNumber != 0) && in btusb_probe()
3769 (intf->cur_altsetting->desc.bInterfaceNumber != 2)) in btusb_probe()
3770 return -ENODEV; in btusb_probe()
3772 ifnum_base = intf->cur_altsetting->desc.bInterfaceNumber; in btusb_probe()
3774 if (!id->driver_info) { in btusb_probe()
3782 if (id->driver_info == BTUSB_IGNORE) in btusb_probe()
3783 return -ENODEV; in btusb_probe()
3785 if (id->driver_info & BTUSB_ATH3012) { in btusb_probe()
3791 if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001 && in btusb_probe()
3793 return -ENODEV; in btusb_probe()
3796 data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL); in btusb_probe()
3798 return -ENOMEM; in btusb_probe()
3800 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in btusb_probe()
3801 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in btusb_probe()
3803 if (!data->intr_ep && usb_endpoint_is_int_in(ep_desc)) { in btusb_probe()
3804 data->intr_ep = ep_desc; in btusb_probe()
3808 if (!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) { in btusb_probe()
3809 data->bulk_tx_ep = ep_desc; in btusb_probe()
3813 if (!data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) { in btusb_probe()
3814 data->bulk_rx_ep = ep_desc; in btusb_probe()
3819 if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep) in btusb_probe()
3820 return -ENODEV; in btusb_probe()
3822 if (id->driver_info & BTUSB_AMP) { in btusb_probe()
3823 data->cmdreq_type = USB_TYPE_CLASS | 0x01; in btusb_probe()
3824 data->cmdreq = 0x2b; in btusb_probe()
3826 data->cmdreq_type = USB_TYPE_CLASS; in btusb_probe()
3827 data->cmdreq = 0x00; in btusb_probe()
3830 data->udev = interface_to_usbdev(intf); in btusb_probe()
3831 data->intf = intf; in btusb_probe()
3833 INIT_WORK(&data->work, btusb_work); in btusb_probe()
3834 INIT_WORK(&data->waker, btusb_waker); in btusb_probe()
3835 INIT_DELAYED_WORK(&data->rx_work, btusb_rx_work); in btusb_probe()
3837 skb_queue_head_init(&data->acl_q); in btusb_probe()
3839 init_usb_anchor(&data->deferred); in btusb_probe()
3840 init_usb_anchor(&data->tx_anchor); in btusb_probe()
3841 spin_lock_init(&data->txlock); in btusb_probe()
3843 init_usb_anchor(&data->intr_anchor); in btusb_probe()
3844 init_usb_anchor(&data->bulk_anchor); in btusb_probe()
3845 init_usb_anchor(&data->isoc_anchor); in btusb_probe()
3846 init_usb_anchor(&data->diag_anchor); in btusb_probe()
3847 init_usb_anchor(&data->ctrl_anchor); in btusb_probe()
3848 spin_lock_init(&data->rxlock); in btusb_probe()
3852 data->recv_event = hci_recv_frame; in btusb_probe()
3853 data->recv_bulk = btusb_recv_bulk; in btusb_probe()
3855 if (id->driver_info & BTUSB_INTEL_COMBINED) { in btusb_probe()
3860 data->recv_event = btintel_recv_event; in btusb_probe()
3861 data->recv_bulk = btusb_recv_bulk_intel; in btusb_probe()
3862 } else if (id->driver_info & BTUSB_REALTEK) { in btusb_probe()
3866 data->recv_event = btusb_recv_event_realtek; in btusb_probe()
3867 } else if (id->driver_info & BTUSB_MEDIATEK) { in btusb_probe()
3872 data->recv_acl = hci_recv_frame; in btusb_probe()
3876 return -ENOMEM; in btusb_probe()
3878 hdev->bus = HCI_USB; in btusb_probe()
3881 data->hdev = hdev; in btusb_probe()
3883 SET_HCIDEV_DEV(hdev, &intf->dev); in btusb_probe()
3885 reset_gpio = gpiod_get_optional(&data->udev->dev, "reset", in btusb_probe()
3891 data->reset_gpio = reset_gpio; in btusb_probe()
3894 hdev->open = btusb_open; in btusb_probe()
3895 hdev->close = btusb_close; in btusb_probe()
3896 hdev->flush = btusb_flush; in btusb_probe()
3897 hdev->send = btusb_send_frame; in btusb_probe()
3898 hdev->notify = btusb_notify; in btusb_probe()
3899 hdev->wakeup = btusb_wakeup; in btusb_probe()
3907 if (id->driver_info & BTUSB_MARVELL && data->oob_wake_irq) { in btusb_probe()
3913 if (id->driver_info & BTUSB_CW6622) in btusb_probe()
3914 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks); in btusb_probe()
3916 if (id->driver_info & BTUSB_BCM2045) in btusb_probe()
3917 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks); in btusb_probe()
3919 if (id->driver_info & BTUSB_BCM92035) in btusb_probe()
3920 hdev->setup = btusb_setup_bcm92035; in btusb_probe()
3923 (id->driver_info & BTUSB_BCM_PATCHRAM)) { in btusb_probe()
3924 hdev->manufacturer = 15; in btusb_probe()
3925 hdev->setup = btbcm_setup_patchram; in btusb_probe()
3926 hdev->set_diag = btusb_bcm_set_diag; in btusb_probe()
3927 hdev->set_bdaddr = btbcm_set_bdaddr; in btusb_probe()
3930 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2); in btusb_probe()
3934 (id->driver_info & BTUSB_BCM_APPLE)) { in btusb_probe()
3935 hdev->manufacturer = 15; in btusb_probe()
3936 hdev->setup = btbcm_setup_apple; in btusb_probe()
3937 hdev->set_diag = btusb_bcm_set_diag; in btusb_probe()
3940 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2); in btusb_probe()
3944 if (id->driver_info & BTUSB_INTEL_COMBINED) { in btusb_probe()
3950 hdev->send = btusb_send_frame_intel; in btusb_probe()
3951 hdev->reset = btusb_intel_reset; in btusb_probe()
3953 if (id->driver_info & BTUSB_INTEL_NO_WBS_SUPPORT) in btusb_probe()
3956 if (id->driver_info & BTUSB_INTEL_BROKEN_INITIAL_NCMD) in btusb_probe()
3959 if (id->driver_info & BTUSB_INTEL_BROKEN_SHUTDOWN_LED) in btusb_probe()
3963 if (id->driver_info & BTUSB_MARVELL) in btusb_probe()
3964 hdev->set_bdaddr = btusb_set_bdaddr_marvell; in btusb_probe()
3967 (id->driver_info & BTUSB_MEDIATEK)) { in btusb_probe()
3968 hdev->setup = btusb_mtk_setup; in btusb_probe()
3969 hdev->shutdown = btusb_mtk_shutdown; in btusb_probe()
3970 hdev->manufacturer = 70; in btusb_probe()
3971 hdev->reset = btmtk_reset_sync; in btusb_probe()
3972 hdev->set_bdaddr = btmtk_set_bdaddr; in btusb_probe()
3973 hdev->send = btusb_send_frame_mtk; in btusb_probe()
3974 set_bit(HCI_QUIRK_BROKEN_ENHANCED_SETUP_SYNC_CONN, &hdev->quirks); in btusb_probe()
3975 set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks); in btusb_probe()
3976 data->recv_acl = btmtk_usb_recv_acl; in btusb_probe()
3977 data->suspend = btmtk_usb_suspend; in btusb_probe()
3978 data->resume = btmtk_usb_resume; in btusb_probe()
3979 data->disconnect = btusb_mtk_disconnect; in btusb_probe()
3982 if (id->driver_info & BTUSB_SWAVE) { in btusb_probe()
3983 set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks); in btusb_probe()
3984 set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks); in btusb_probe()
3987 if (id->driver_info & BTUSB_INTEL_BOOT) { in btusb_probe()
3988 hdev->manufacturer = 2; in btusb_probe()
3989 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); in btusb_probe()
3992 if (id->driver_info & BTUSB_ATH3012) { in btusb_probe()
3993 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
3994 hdev->set_bdaddr = btusb_set_bdaddr_ath3012; in btusb_probe()
3995 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
3996 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); in btusb_probe()
3999 if (id->driver_info & BTUSB_QCA_ROME) { in btusb_probe()
4000 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
4001 hdev->shutdown = btusb_shutdown_qca; in btusb_probe()
4002 hdev->set_bdaddr = btusb_set_bdaddr_ath3012; in btusb_probe()
4003 hdev->reset = btusb_qca_reset; in btusb_probe()
4004 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4008 if (id->driver_info & BTUSB_QCA_WCN6855) { in btusb_probe()
4009 data->qca_dump.id_vendor = id->idVendor; in btusb_probe()
4010 data->qca_dump.id_product = id->idProduct; in btusb_probe()
4011 data->recv_event = btusb_recv_evt_qca; in btusb_probe()
4012 data->recv_acl = btusb_recv_acl_qca; in btusb_probe()
4014 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
4015 hdev->shutdown = btusb_shutdown_qca; in btusb_probe()
4016 hdev->set_bdaddr = btusb_set_bdaddr_wcn6855; in btusb_probe()
4017 hdev->reset = btusb_qca_reset; in btusb_probe()
4018 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4022 if (id->driver_info & BTUSB_AMP) { in btusb_probe()
4024 data->isoc = NULL; in btusb_probe()
4026 /* Interface orders are hardcoded in the specification */ in btusb_probe()
4027 data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1); in btusb_probe()
4028 data->isoc_ifnum = ifnum_base + 1; in btusb_probe()
4032 (id->driver_info & BTUSB_REALTEK)) { in btusb_probe()
4034 hdev->setup = btusb_setup_realtek; in btusb_probe()
4035 hdev->shutdown = btrtl_shutdown_realtek; in btusb_probe()
4036 hdev->reset = btusb_rtl_reset; in btusb_probe()
4037 hdev->hw_error = btusb_rtl_hw_error; in btusb_probe()
4039 /* Realtek devices need to set remote wakeup on auto-suspend */ in btusb_probe()
4040 set_bit(BTUSB_WAKEUP_AUTOSUSPEND, &data->flags); in btusb_probe()
4041 set_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags); in btusb_probe()
4044 if (id->driver_info & BTUSB_ACTIONS_SEMI) { in btusb_probe()
4046 set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks); in btusb_probe()
4047 set_bit(HCI_QUIRK_BROKEN_READ_TRANSMIT_POWER, &hdev->quirks); in btusb_probe()
4048 set_bit(HCI_QUIRK_BROKEN_SET_RPA_TIMEOUT, &hdev->quirks); in btusb_probe()
4049 set_bit(HCI_QUIRK_BROKEN_EXT_SCAN, &hdev->quirks); in btusb_probe()
4050 set_bit(HCI_QUIRK_BROKEN_READ_ENC_KEY_SIZE, &hdev->quirks); in btusb_probe()
4051 set_bit(HCI_QUIRK_BROKEN_EXT_CREATE_CONN, &hdev->quirks); in btusb_probe()
4052 set_bit(HCI_QUIRK_BROKEN_WRITE_AUTH_PAYLOAD_TIMEOUT, &hdev->quirks); in btusb_probe()
4056 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); in btusb_probe()
4058 if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) { in btusb_probe()
4060 set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks); in btusb_probe()
4063 if (id->driver_info & BTUSB_BROKEN_ISOC) in btusb_probe()
4064 data->isoc = NULL; in btusb_probe()
4066 if (id->driver_info & BTUSB_WIDEBAND_SPEECH) in btusb_probe()
4067 set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks); in btusb_probe()
4069 if (id->driver_info & BTUSB_INVALID_LE_STATES) in btusb_probe()
4070 set_bit(HCI_QUIRK_BROKEN_LE_STATES, &hdev->quirks); in btusb_probe()
4072 if (id->driver_info & BTUSB_DIGIANSWER) { in btusb_probe()
4073 data->cmdreq_type = USB_TYPE_VENDOR; in btusb_probe()
4074 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); in btusb_probe()
4077 if (id->driver_info & BTUSB_CSR) { in btusb_probe()
4078 struct usb_device *udev = data->udev; in btusb_probe()
4079 u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice); in btusb_probe()
4083 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks); in btusb_probe()
4085 /* This must be set first in case we disable it for fakes */ in btusb_probe()
4086 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks); in btusb_probe()
4089 if (le16_to_cpu(udev->descriptor.idVendor) == 0x0a12 && in btusb_probe()
4090 le16_to_cpu(udev->descriptor.idProduct) == 0x0001) in btusb_probe()
4091 hdev->setup = btusb_setup_csr; in btusb_probe()
4094 if (id->driver_info & BTUSB_SNIFFER) { in btusb_probe()
4095 struct usb_device *udev = data->udev; in btusb_probe()
4098 if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997) in btusb_probe()
4099 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); in btusb_probe()
4102 if (id->driver_info & BTUSB_INTEL_BOOT) { in btusb_probe()
4103 /* A bug in the bootloader causes that interrupt interface is in btusb_probe()
4106 err = usb_set_interface(data->udev, 0, 0); in btusb_probe()
4113 if (data->isoc) { in btusb_probe()
4115 data->isoc, data); in btusb_probe()
4119 err = device_create_file(&intf->dev, &dev_attr_isoc_alt); in btusb_probe()
4124 if (IS_ENABLED(CONFIG_BT_HCIBTUSB_BCM) && data->diag) { in btusb_probe()
4126 data->diag, data)) in btusb_probe()
4129 data->diag = NULL; in btusb_probe()
4133 usb_enable_autosuspend(data->udev); in btusb_probe()
4135 data->poll_sync = enable_poll_sync; in btusb_probe()
4143 debugfs_create_file("force_poll_sync", 0644, hdev->debugfs, data, in btusb_probe()
4149 if (data->reset_gpio) in btusb_probe()
4150 gpiod_put(data->reset_gpio); in btusb_probe()
4165 hdev = data->hdev; in btusb_disconnect()
4166 usb_set_intfdata(data->intf, NULL); in btusb_disconnect()
4168 if (data->isoc) { in btusb_disconnect()
4169 device_remove_file(&intf->dev, &dev_attr_isoc_alt); in btusb_disconnect()
4170 usb_set_intfdata(data->isoc, NULL); in btusb_disconnect()
4173 if (data->diag) in btusb_disconnect()
4174 usb_set_intfdata(data->diag, NULL); in btusb_disconnect()
4176 if (data->disconnect) in btusb_disconnect()
4177 data->disconnect(hdev); in btusb_disconnect()
4181 if (intf == data->intf) { in btusb_disconnect()
4182 if (data->isoc) in btusb_disconnect()
4183 usb_driver_release_interface(&btusb_driver, data->isoc); in btusb_disconnect()
4184 if (data->diag) in btusb_disconnect()
4185 usb_driver_release_interface(&btusb_driver, data->diag); in btusb_disconnect()
4186 } else if (intf == data->isoc) { in btusb_disconnect()
4187 if (data->diag) in btusb_disconnect()
4188 usb_driver_release_interface(&btusb_driver, data->diag); in btusb_disconnect()
4189 usb_driver_release_interface(&btusb_driver, data->intf); in btusb_disconnect()
4190 } else if (intf == data->diag) { in btusb_disconnect()
4191 usb_driver_release_interface(&btusb_driver, data->intf); in btusb_disconnect()
4192 if (data->isoc) in btusb_disconnect()
4193 usb_driver_release_interface(&btusb_driver, data->isoc); in btusb_disconnect()
4196 if (data->oob_wake_irq) in btusb_disconnect()
4197 device_init_wakeup(&data->udev->dev, false); in btusb_disconnect()
4199 if (data->reset_gpio) in btusb_disconnect()
4200 gpiod_put(data->reset_gpio); in btusb_disconnect()
4212 /* Don't auto-suspend if there are connections; external suspend calls in btusb_suspend()
4215 if (PMSG_IS_AUTO(message) && hci_conn_count(data->hdev)) in btusb_suspend()
4216 return -EBUSY; in btusb_suspend()
4218 if (data->suspend_count++) in btusb_suspend()
4221 spin_lock_irq(&data->txlock); in btusb_suspend()
4222 if (!(PMSG_IS_AUTO(message) && data->tx_in_flight)) { in btusb_suspend()
4223 set_bit(BTUSB_SUSPENDING, &data->flags); in btusb_suspend()
4224 spin_unlock_irq(&data->txlock); in btusb_suspend()
4226 spin_unlock_irq(&data->txlock); in btusb_suspend()
4227 data->suspend_count--; in btusb_suspend()
4228 return -EBUSY; in btusb_suspend()
4231 cancel_work_sync(&data->work); in btusb_suspend()
4233 if (data->suspend) in btusb_suspend()
4234 data->suspend(data->hdev); in btusb_suspend()
4237 usb_kill_anchored_urbs(&data->tx_anchor); in btusb_suspend()
4239 if (data->oob_wake_irq && device_may_wakeup(&data->udev->dev)) { in btusb_suspend()
4240 set_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags); in btusb_suspend()
4241 enable_irq_wake(data->oob_wake_irq); in btusb_suspend()
4242 enable_irq(data->oob_wake_irq); in btusb_suspend()
4246 * in them. But for autosuspend, firmware should remain. in btusb_suspend()
4250 if (test_bit(BTUSB_WAKEUP_AUTOSUSPEND, &data->flags)) { in btusb_suspend()
4252 device_can_wakeup(&data->udev->dev)) in btusb_suspend()
4253 data->udev->do_remote_wakeup = 1; in btusb_suspend()
4255 !device_may_wakeup(&data->udev->dev)) { in btusb_suspend()
4256 data->udev->do_remote_wakeup = 0; in btusb_suspend()
4257 data->udev->reset_resume = 1; in btusb_suspend()
4269 while ((urb = usb_get_from_anchor(&data->deferred))) { in play_deferred()
4270 usb_anchor_urb(urb, &data->tx_anchor); in play_deferred()
4274 if (err != -EPERM && err != -ENODEV) in play_deferred()
4276 data->hdev->name, urb, -err); in play_deferred()
4277 kfree(urb->setup_packet); in play_deferred()
4283 data->tx_in_flight++; in play_deferred()
4288 while ((urb = usb_get_from_anchor(&data->deferred))) { in play_deferred()
4289 kfree(urb->setup_packet); in play_deferred()
4297 struct hci_dev *hdev = data->hdev; in btusb_resume()
4302 if (--data->suspend_count) in btusb_resume()
4306 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) { in btusb_resume()
4307 disable_irq(data->oob_wake_irq); in btusb_resume()
4308 disable_irq_wake(data->oob_wake_irq); in btusb_resume()
4311 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_resume()
4314 if (test_bit(BTUSB_INTR_RUNNING, &data->flags)) { in btusb_resume()
4317 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_resume()
4322 if (test_bit(BTUSB_BULK_RUNNING, &data->flags)) { in btusb_resume()
4325 clear_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_resume()
4332 if (test_bit(BTUSB_ISOC_RUNNING, &data->flags)) { in btusb_resume()
4334 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_resume()
4339 if (data->resume) in btusb_resume()
4340 data->resume(hdev); in btusb_resume()
4342 spin_lock_irq(&data->txlock); in btusb_resume()
4344 clear_bit(BTUSB_SUSPENDING, &data->flags); in btusb_resume()
4345 spin_unlock_irq(&data->txlock); in btusb_resume()
4346 schedule_work(&data->work); in btusb_resume()
4351 usb_scuttle_anchored_urbs(&data->deferred); in btusb_resume()
4353 spin_lock_irq(&data->txlock); in btusb_resume()
4354 clear_bit(BTUSB_SUSPENDING, &data->flags); in btusb_resume()
4355 spin_unlock_irq(&data->txlock); in btusb_resume()
4365 struct hci_dev *hdev = data->hdev; in btusb_coredump()
4367 if (hdev->dump.coredump) in btusb_coredump()
4368 hdev->dump.coredump(hdev); in btusb_coredump()