Lines Matching +full:xps +full:- +full:gpio +full:- +full:1
1 // SPDX-License-Identifier: GPL-2.0-or-later
6 * Copyright (C) 2005-2008 Marcel Holtmann <marcel@holtmann.org>
18 #include <linux/gpio/consumer.h>
42 #define BTUSB_DIGIANSWER BIT(1)
81 /* Apple-specific (Broadcom) devices */
91 /* Apple MacBookPro 7,1 */
94 /* Apple iMac11,1 */
100 /* Apple MacBookAir3,1, MacBookAir3,2 */
103 /* Apple MacBookAir4,1 */
109 /* Apple MacMini5,1 */
118 /* ALPS Modules with non-standard id */
122 /* Ericsson with non-standard id */
125 /* Canyon CN-BTU1 with HID interfaces */
139 /* Foxconn - Hon Hai */
143 /* Lite-On Technology - Broadcom based */
151 /* ASUSTek Computer - Broadcom based */
155 /* Belkin F8065bf - Broadcom based */
159 /* IMC Networks - Broadcom based */
163 /* Dell Computer - Broadcom based */
167 /* Toshiba Corp - Broadcom based */
442 /* Asus WL-BTD202 device */
456 /* Roper Class 1 Bluetooth Dongle (Silicon Wave based) */
585 /* Realtek 8852BT/8852BE-VT Bluetooth devices */
846 /* Dell XPS 9360 (QCA ROME device 0cf3:e300) */
849 DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9360"),
875 #define BTUSB_BULK_RUNNING 1
956 int oob_wake_irq; /* irq for out-of-band wake-on-bt */
968 err = usb_autopm_get_interface(data->intf); in btusb_reset()
975 usb_queue_reset_device(data->intf); in btusb_reset()
981 struct gpio_desc *reset_gpio = data->reset_gpio; in btusb_intel_reset()
984 if (intel_data->acpi_reset_method) { in btusb_intel_reset()
985 if (test_and_set_bit(INTEL_ACPI_RESET_ACTIVE, intel_data->flags)) { in btusb_intel_reset()
991 /* If ACPI reset method fails, lets try with legacy GPIO in btusb_intel_reset()
994 if (!intel_data->acpi_reset_method(hdev)) { in btusb_intel_reset()
1011 if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { in btusb_intel_reset()
1016 bt_dev_err(hdev, "Initiating HW reset via gpio"); in btusb_intel_reset()
1017 gpiod_set_value_cansleep(reset_gpio, 1); in btusb_intel_reset()
1047 if (!hci_devcd_init(hdev, skb->len)) { in btusb_rtl_alloc_devcoredump()
1059 struct gpio_desc *reset_gpio = data->reset_gpio; in btusb_rtl_reset()
1077 if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { in btusb_rtl_reset()
1082 bt_dev_err(hdev, "Reset Realtek device via gpio"); in btusb_rtl_reset()
1083 gpiod_set_value_cansleep(reset_gpio, 1); in btusb_rtl_reset()
1103 struct gpio_desc *reset_gpio = data->reset_gpio; in btusb_qca_reset()
1105 if (test_bit(BTUSB_HW_SSR_ACTIVE, &data->flags)) { in btusb_qca_reset()
1111 bt_dev_err(hdev, "Reset qca device via bt_en gpio"); in btusb_qca_reset()
1119 if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) { in btusb_qca_reset()
1126 gpiod_set_value_cansleep(reset_gpio, 1); in btusb_qca_reset()
1138 spin_lock_irqsave(&data->rxlock, flags); in btusb_free_frags()
1140 dev_kfree_skb_irq(data->evt_skb); in btusb_free_frags()
1141 data->evt_skb = NULL; in btusb_free_frags()
1143 dev_kfree_skb_irq(data->acl_skb); in btusb_free_frags()
1144 data->acl_skb = NULL; in btusb_free_frags()
1146 dev_kfree_skb_irq(data->sco_skb); in btusb_free_frags()
1147 data->sco_skb = NULL; in btusb_free_frags()
1149 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_free_frags()
1154 if (data->intr_interval) { in btusb_recv_event()
1156 schedule_delayed_work(&data->rx_work, 0); in btusb_recv_event()
1159 return data->recv_event(data->hdev, skb); in btusb_recv_event()
1168 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_intr()
1169 skb = data->evt_skb; in btusb_recv_intr()
1177 err = -ENOMEM; in btusb_recv_intr()
1188 count -= len; in btusb_recv_intr()
1190 hci_skb_expect(skb) -= len; in btusb_recv_intr()
1192 if (skb->len == HCI_EVENT_HDR_SIZE) { in btusb_recv_intr()
1194 hci_skb_expect(skb) = hci_event_hdr(skb)->plen; in btusb_recv_intr()
1200 err = -EILSEQ; in btusb_recv_intr()
1206 /* Each chunk should correspond to at least 1 or more in btusb_recv_intr()
1212 bt_dev_warn(data->hdev, in btusb_recv_intr()
1224 data->evt_skb = skb; in btusb_recv_intr()
1225 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_intr()
1235 if (!data->intr_interval) in btusb_recv_acl()
1236 return data->recv_acl(data->hdev, skb); in btusb_recv_acl()
1238 skb_queue_tail(&data->acl_q, skb); in btusb_recv_acl()
1239 schedule_delayed_work(&data->rx_work, data->intr_interval); in btusb_recv_acl()
1250 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_bulk()
1251 skb = data->acl_skb; in btusb_recv_bulk()
1259 err = -ENOMEM; in btusb_recv_bulk()
1270 count -= len; in btusb_recv_bulk()
1272 hci_skb_expect(skb) -= len; in btusb_recv_bulk()
1274 if (skb->len == HCI_ACL_HDR_SIZE) { in btusb_recv_bulk()
1275 __le16 dlen = hci_acl_hdr(skb)->dlen; in btusb_recv_bulk()
1284 err = -EILSEQ; in btusb_recv_bulk()
1296 data->acl_skb = skb; in btusb_recv_bulk()
1297 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_bulk()
1319 handle = hci_handle(__le16_to_cpu(hdr->handle)); in btusb_validate_sco_handle()
1336 spin_lock_irqsave(&data->rxlock, flags); in btusb_recv_isoc()
1337 skb = data->sco_skb; in btusb_recv_isoc()
1345 err = -ENOMEM; in btusb_recv_isoc()
1356 count -= len; in btusb_recv_isoc()
1358 hci_skb_expect(skb) -= len; in btusb_recv_isoc()
1360 if (skb->len == HCI_SCO_HDR_SIZE) { in btusb_recv_isoc()
1364 hci_skb_expect(skb) = hdr->dlen; in btusb_recv_isoc()
1367 !btusb_validate_sco_handle(data->hdev, hdr)) { in btusb_recv_isoc()
1371 err = -EILSEQ; in btusb_recv_isoc()
1378 hci_recv_frame(data->hdev, skb); in btusb_recv_isoc()
1383 data->sco_skb = skb; in btusb_recv_isoc()
1384 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_recv_isoc()
1391 struct hci_dev *hdev = urb->context; in btusb_intr_complete()
1395 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_intr_complete()
1396 urb->actual_length); in btusb_intr_complete()
1398 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_intr_complete()
1401 if (urb->status == 0) { in btusb_intr_complete()
1402 hdev->stat.byte_rx += urb->actual_length; in btusb_intr_complete()
1404 if (btusb_recv_intr(data, urb->transfer_buffer, in btusb_intr_complete()
1405 urb->actual_length) < 0) { in btusb_intr_complete()
1407 hdev->stat.err_rx++; in btusb_intr_complete()
1409 } else if (urb->status == -ENOENT) { in btusb_intr_complete()
1414 if (!test_bit(BTUSB_INTR_RUNNING, &data->flags)) in btusb_intr_complete()
1417 usb_mark_last_busy(data->udev); in btusb_intr_complete()
1418 usb_anchor_urb(urb, &data->intr_anchor); in btusb_intr_complete()
1422 /* -EPERM: urb is being killed; in btusb_intr_complete()
1423 * -ENODEV: device got disconnected in btusb_intr_complete()
1425 if (err != -EPERM && err != -ENODEV) in btusb_intr_complete()
1427 urb, -err); in btusb_intr_complete()
1428 if (err != -EPERM) in btusb_intr_complete()
1429 hci_cmd_sync_cancel(hdev, -err); in btusb_intr_complete()
1442 BT_DBG("%s", hdev->name); in btusb_submit_intr_urb()
1444 if (!data->intr_ep) in btusb_submit_intr_urb()
1445 return -ENODEV; in btusb_submit_intr_urb()
1449 return -ENOMEM; in btusb_submit_intr_urb()
1451 if (le16_to_cpu(data->udev->descriptor.idVendor) == 0x0a12 && in btusb_submit_intr_urb()
1452 le16_to_cpu(data->udev->descriptor.idProduct) == 0x0001) in btusb_submit_intr_urb()
1453 /* Fake CSR devices don't seem to support sort-transter */ in btusb_submit_intr_urb()
1454 size = le16_to_cpu(data->intr_ep->wMaxPacketSize); in btusb_submit_intr_urb()
1457 * ZPL/short-transfer automatically. in btusb_submit_intr_urb()
1464 return -ENOMEM; in btusb_submit_intr_urb()
1467 pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress); in btusb_submit_intr_urb()
1469 usb_fill_int_urb(urb, data->udev, pipe, buf, size, in btusb_submit_intr_urb()
1470 btusb_intr_complete, hdev, data->intr_ep->bInterval); in btusb_submit_intr_urb()
1472 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_intr_urb()
1474 usb_anchor_urb(urb, &data->intr_anchor); in btusb_submit_intr_urb()
1478 if (err != -EPERM && err != -ENODEV) in btusb_submit_intr_urb()
1480 urb, -err); in btusb_submit_intr_urb()
1481 if (err != -EPERM) in btusb_submit_intr_urb()
1482 hci_cmd_sync_cancel(hdev, -err); in btusb_submit_intr_urb()
1487 if (!data->poll_sync) in btusb_submit_intr_urb()
1491 * and microframes (1/8 millisecond) for highspeed and SuperSpeed in btusb_submit_intr_urb()
1497 switch (urb->dev->speed) { in btusb_submit_intr_urb()
1500 data->intr_interval = usecs_to_jiffies(urb->interval * 125); in btusb_submit_intr_urb()
1503 data->intr_interval = msecs_to_jiffies(urb->interval); in btusb_submit_intr_urb()
1515 struct hci_dev *hdev = urb->context; in btusb_bulk_complete()
1519 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_bulk_complete()
1520 urb->actual_length); in btusb_bulk_complete()
1522 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_bulk_complete()
1525 if (urb->status == 0) { in btusb_bulk_complete()
1526 hdev->stat.byte_rx += urb->actual_length; in btusb_bulk_complete()
1528 if (data->recv_bulk(data, urb->transfer_buffer, in btusb_bulk_complete()
1529 urb->actual_length) < 0) { in btusb_bulk_complete()
1531 hdev->stat.err_rx++; in btusb_bulk_complete()
1533 } else if (urb->status == -ENOENT) { in btusb_bulk_complete()
1538 if (!test_bit(BTUSB_BULK_RUNNING, &data->flags)) in btusb_bulk_complete()
1541 usb_anchor_urb(urb, &data->bulk_anchor); in btusb_bulk_complete()
1542 usb_mark_last_busy(data->udev); in btusb_bulk_complete()
1546 /* -EPERM: urb is being killed; in btusb_bulk_complete()
1547 * -ENODEV: device got disconnected in btusb_bulk_complete()
1549 if (err != -EPERM && err != -ENODEV) in btusb_bulk_complete()
1551 urb, -err); in btusb_bulk_complete()
1564 BT_DBG("%s", hdev->name); in btusb_submit_bulk_urb()
1566 if (!data->bulk_rx_ep) in btusb_submit_bulk_urb()
1567 return -ENODEV; in btusb_submit_bulk_urb()
1571 return -ENOMEM; in btusb_submit_bulk_urb()
1576 return -ENOMEM; in btusb_submit_bulk_urb()
1579 pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress); in btusb_submit_bulk_urb()
1581 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size, in btusb_submit_bulk_urb()
1584 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_bulk_urb()
1586 usb_mark_last_busy(data->udev); in btusb_submit_bulk_urb()
1587 usb_anchor_urb(urb, &data->bulk_anchor); in btusb_submit_bulk_urb()
1591 if (err != -EPERM && err != -ENODEV) in btusb_submit_bulk_urb()
1593 urb, -err); in btusb_submit_bulk_urb()
1604 struct hci_dev *hdev = urb->context; in btusb_isoc_complete()
1608 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_isoc_complete()
1609 urb->actual_length); in btusb_isoc_complete()
1611 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_isoc_complete()
1614 if (urb->status == 0) { in btusb_isoc_complete()
1615 for (i = 0; i < urb->number_of_packets; i++) { in btusb_isoc_complete()
1616 unsigned int offset = urb->iso_frame_desc[i].offset; in btusb_isoc_complete()
1617 unsigned int length = urb->iso_frame_desc[i].actual_length; in btusb_isoc_complete()
1619 if (urb->iso_frame_desc[i].status) in btusb_isoc_complete()
1622 hdev->stat.byte_rx += length; in btusb_isoc_complete()
1624 if (btusb_recv_isoc(data, urb->transfer_buffer + offset, in btusb_isoc_complete()
1627 hdev->stat.err_rx++; in btusb_isoc_complete()
1630 } else if (urb->status == -ENOENT) { in btusb_isoc_complete()
1635 if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags)) in btusb_isoc_complete()
1638 usb_anchor_urb(urb, &data->isoc_anchor); in btusb_isoc_complete()
1642 /* -EPERM: urb is being killed; in btusb_isoc_complete()
1643 * -ENODEV: device got disconnected in btusb_isoc_complete()
1645 if (err != -EPERM && err != -ENODEV) in btusb_isoc_complete()
1647 urb, -err); in btusb_isoc_complete()
1663 if (test_bit(BTUSB_ALT6_CONTINUOUS_TX, &data->flags)) in __fill_isoc_descriptor_msbc()
1672 if (data->usb_alt6_packet_flow) { in __fill_isoc_descriptor_msbc()
1674 data->usb_alt6_packet_flow = false; in __fill_isoc_descriptor_msbc()
1677 data->usb_alt6_packet_flow = true; in __fill_isoc_descriptor_msbc()
1681 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor_msbc()
1682 urb->iso_frame_desc[i].length = offset; in __fill_isoc_descriptor_msbc()
1687 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor_msbc()
1688 urb->iso_frame_desc[i].length = len; in __fill_isoc_descriptor_msbc()
1692 urb->number_of_packets = i; in __fill_isoc_descriptor_msbc()
1702 i++, offset += mtu, len -= mtu) { in __fill_isoc_descriptor()
1703 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor()
1704 urb->iso_frame_desc[i].length = mtu; in __fill_isoc_descriptor()
1708 urb->iso_frame_desc[i].offset = offset; in __fill_isoc_descriptor()
1709 urb->iso_frame_desc[i].length = len; in __fill_isoc_descriptor()
1713 urb->number_of_packets = i; in __fill_isoc_descriptor()
1724 BT_DBG("%s", hdev->name); in btusb_submit_isoc_urb()
1726 if (!data->isoc_rx_ep) in btusb_submit_isoc_urb()
1727 return -ENODEV; in btusb_submit_isoc_urb()
1731 return -ENOMEM; in btusb_submit_isoc_urb()
1733 size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) * in btusb_submit_isoc_urb()
1739 return -ENOMEM; in btusb_submit_isoc_urb()
1742 pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); in btusb_submit_isoc_urb()
1744 usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete, in btusb_submit_isoc_urb()
1745 hdev, data->isoc_rx_ep->bInterval); in btusb_submit_isoc_urb()
1747 urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; in btusb_submit_isoc_urb()
1750 le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); in btusb_submit_isoc_urb()
1752 usb_anchor_urb(urb, &data->isoc_anchor); in btusb_submit_isoc_urb()
1756 if (err != -EPERM && err != -ENODEV) in btusb_submit_isoc_urb()
1758 urb, -err); in btusb_submit_isoc_urb()
1769 struct hci_dev *hdev = urb->context; in btusb_diag_complete()
1773 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_diag_complete()
1774 urb->actual_length); in btusb_diag_complete()
1776 if (urb->status == 0) { in btusb_diag_complete()
1779 skb = bt_skb_alloc(urb->actual_length, GFP_ATOMIC); in btusb_diag_complete()
1781 skb_put_data(skb, urb->transfer_buffer, in btusb_diag_complete()
1782 urb->actual_length); in btusb_diag_complete()
1785 } else if (urb->status == -ENOENT) { in btusb_diag_complete()
1790 if (!test_bit(BTUSB_DIAG_RUNNING, &data->flags)) in btusb_diag_complete()
1793 usb_anchor_urb(urb, &data->diag_anchor); in btusb_diag_complete()
1794 usb_mark_last_busy(data->udev); in btusb_diag_complete()
1798 /* -EPERM: urb is being killed; in btusb_diag_complete()
1799 * -ENODEV: device got disconnected in btusb_diag_complete()
1801 if (err != -EPERM && err != -ENODEV) in btusb_diag_complete()
1803 urb, -err); in btusb_diag_complete()
1816 BT_DBG("%s", hdev->name); in btusb_submit_diag_urb()
1818 if (!data->diag_rx_ep) in btusb_submit_diag_urb()
1819 return -ENODEV; in btusb_submit_diag_urb()
1823 return -ENOMEM; in btusb_submit_diag_urb()
1828 return -ENOMEM; in btusb_submit_diag_urb()
1831 pipe = usb_rcvbulkpipe(data->udev, data->diag_rx_ep->bEndpointAddress); in btusb_submit_diag_urb()
1833 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size, in btusb_submit_diag_urb()
1836 urb->transfer_flags |= URB_FREE_BUFFER; in btusb_submit_diag_urb()
1838 usb_mark_last_busy(data->udev); in btusb_submit_diag_urb()
1839 usb_anchor_urb(urb, &data->diag_anchor); in btusb_submit_diag_urb()
1843 if (err != -EPERM && err != -ENODEV) in btusb_submit_diag_urb()
1845 urb, -err); in btusb_submit_diag_urb()
1856 struct sk_buff *skb = urb->context; in btusb_tx_complete()
1857 struct hci_dev *hdev = (struct hci_dev *)skb->dev; in btusb_tx_complete()
1861 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_tx_complete()
1862 urb->actual_length); in btusb_tx_complete()
1864 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_tx_complete()
1867 if (!urb->status) { in btusb_tx_complete()
1868 hdev->stat.byte_tx += urb->transfer_buffer_length; in btusb_tx_complete()
1871 hci_cmd_sync_cancel(hdev, -urb->status); in btusb_tx_complete()
1872 hdev->stat.err_tx++; in btusb_tx_complete()
1876 spin_lock_irqsave(&data->txlock, flags); in btusb_tx_complete()
1877 data->tx_in_flight--; in btusb_tx_complete()
1878 spin_unlock_irqrestore(&data->txlock, flags); in btusb_tx_complete()
1880 kfree(urb->setup_packet); in btusb_tx_complete()
1887 struct sk_buff *skb = urb->context; in btusb_isoc_tx_complete()
1888 struct hci_dev *hdev = (struct hci_dev *)skb->dev; in btusb_isoc_tx_complete()
1890 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status, in btusb_isoc_tx_complete()
1891 urb->actual_length); in btusb_isoc_tx_complete()
1893 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_isoc_tx_complete()
1896 if (!urb->status) in btusb_isoc_tx_complete()
1897 hdev->stat.byte_tx += urb->transfer_buffer_length; in btusb_isoc_tx_complete()
1899 hdev->stat.err_tx++; in btusb_isoc_tx_complete()
1902 kfree(urb->setup_packet); in btusb_isoc_tx_complete()
1912 BT_DBG("%s", hdev->name); in btusb_open()
1914 err = usb_autopm_get_interface(data->intf); in btusb_open()
1921 if (data->setup_on_usb) { in btusb_open()
1922 err = data->setup_on_usb(hdev); in btusb_open()
1927 data->intf->needs_remote_wakeup = 1; in btusb_open()
1929 if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags)) in btusb_open()
1938 usb_kill_anchored_urbs(&data->intr_anchor); in btusb_open()
1942 set_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_open()
1945 if (data->diag) { in btusb_open()
1947 set_bit(BTUSB_DIAG_RUNNING, &data->flags); in btusb_open()
1951 usb_autopm_put_interface(data->intf); in btusb_open()
1955 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_open()
1957 usb_autopm_put_interface(data->intf); in btusb_open()
1963 usb_kill_anchored_urbs(&data->intr_anchor); in btusb_stop_traffic()
1964 usb_kill_anchored_urbs(&data->bulk_anchor); in btusb_stop_traffic()
1965 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_stop_traffic()
1966 usb_kill_anchored_urbs(&data->diag_anchor); in btusb_stop_traffic()
1967 usb_kill_anchored_urbs(&data->ctrl_anchor); in btusb_stop_traffic()
1975 BT_DBG("%s", hdev->name); in btusb_close()
1977 cancel_delayed_work(&data->rx_work); in btusb_close()
1978 cancel_work_sync(&data->work); in btusb_close()
1979 cancel_work_sync(&data->waker); in btusb_close()
1981 skb_queue_purge(&data->acl_q); in btusb_close()
1983 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_close()
1984 clear_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_close()
1985 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_close()
1986 clear_bit(BTUSB_DIAG_RUNNING, &data->flags); in btusb_close()
1991 err = usb_autopm_get_interface(data->intf); in btusb_close()
1995 data->intf->needs_remote_wakeup = 0; in btusb_close()
1997 /* Enable remote wake up for auto-suspend */ in btusb_close()
1998 if (test_bit(BTUSB_WAKEUP_AUTOSUSPEND, &data->flags)) in btusb_close()
1999 data->intf->needs_remote_wakeup = 1; in btusb_close()
2001 usb_autopm_put_interface(data->intf); in btusb_close()
2004 usb_scuttle_anchored_urbs(&data->deferred); in btusb_close()
2012 BT_DBG("%s", hdev->name); in btusb_flush()
2014 cancel_delayed_work(&data->rx_work); in btusb_flush()
2016 skb_queue_purge(&data->acl_q); in btusb_flush()
2018 usb_kill_anchored_urbs(&data->tx_anchor); in btusb_flush()
2033 return ERR_PTR(-ENOMEM); in alloc_ctrl_urb()
2038 return ERR_PTR(-ENOMEM); in alloc_ctrl_urb()
2041 dr->bRequestType = data->cmdreq_type; in alloc_ctrl_urb()
2042 dr->bRequest = data->cmdreq; in alloc_ctrl_urb()
2043 dr->wIndex = 0; in alloc_ctrl_urb()
2044 dr->wValue = 0; in alloc_ctrl_urb()
2045 dr->wLength = __cpu_to_le16(skb->len); in alloc_ctrl_urb()
2047 pipe = usb_sndctrlpipe(data->udev, 0x00); in alloc_ctrl_urb()
2049 usb_fill_control_urb(urb, data->udev, pipe, (void *)dr, in alloc_ctrl_urb()
2050 skb->data, skb->len, btusb_tx_complete, skb); in alloc_ctrl_urb()
2052 skb->dev = (void *)hdev; in alloc_ctrl_urb()
2063 if (!data->bulk_tx_ep) in alloc_bulk_urb()
2064 return ERR_PTR(-ENODEV); in alloc_bulk_urb()
2068 return ERR_PTR(-ENOMEM); in alloc_bulk_urb()
2070 pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress); in alloc_bulk_urb()
2072 usb_fill_bulk_urb(urb, data->udev, pipe, in alloc_bulk_urb()
2073 skb->data, skb->len, btusb_tx_complete, skb); in alloc_bulk_urb()
2075 skb->dev = (void *)hdev; in alloc_bulk_urb()
2086 if (!data->isoc_tx_ep) in alloc_isoc_urb()
2087 return ERR_PTR(-ENODEV); in alloc_isoc_urb()
2091 return ERR_PTR(-ENOMEM); in alloc_isoc_urb()
2093 pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress); in alloc_isoc_urb()
2095 usb_fill_int_urb(urb, data->udev, pipe, in alloc_isoc_urb()
2096 skb->data, skb->len, btusb_isoc_tx_complete, in alloc_isoc_urb()
2097 skb, data->isoc_tx_ep->bInterval); in alloc_isoc_urb()
2099 urb->transfer_flags = URB_ISO_ASAP; in alloc_isoc_urb()
2101 if (data->isoc_altsetting == 6) in alloc_isoc_urb()
2102 __fill_isoc_descriptor_msbc(urb, skb->len, in alloc_isoc_urb()
2103 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize), in alloc_isoc_urb()
2106 __fill_isoc_descriptor(urb, skb->len, in alloc_isoc_urb()
2107 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); in alloc_isoc_urb()
2108 skb->dev = (void *)hdev; in alloc_isoc_urb()
2118 usb_anchor_urb(urb, &data->tx_anchor); in submit_tx_urb()
2122 if (err != -EPERM && err != -ENODEV) in submit_tx_urb()
2124 urb, -err); in submit_tx_urb()
2125 kfree(urb->setup_packet); in submit_tx_urb()
2128 usb_mark_last_busy(data->udev); in submit_tx_urb()
2141 spin_lock_irqsave(&data->txlock, flags); in submit_or_queue_tx_urb()
2142 suspending = test_bit(BTUSB_SUSPENDING, &data->flags); in submit_or_queue_tx_urb()
2144 data->tx_in_flight++; in submit_or_queue_tx_urb()
2145 spin_unlock_irqrestore(&data->txlock, flags); in submit_or_queue_tx_urb()
2150 usb_anchor_urb(urb, &data->deferred); in submit_or_queue_tx_urb()
2151 schedule_work(&data->waker); in submit_or_queue_tx_urb()
2161 BT_DBG("%s", hdev->name); in btusb_send_frame()
2169 hdev->stat.cmd_tx++; in btusb_send_frame()
2177 hdev->stat.acl_tx++; in btusb_send_frame()
2182 hci_conn_num(hdev, SCO_LINK) < 1) in btusb_send_frame()
2183 return -ENODEV; in btusb_send_frame()
2189 hdev->stat.sco_tx++; in btusb_send_frame()
2200 return -EILSEQ; in btusb_send_frame()
2207 BT_DBG("%s evt %d", hdev->name, evt); in btusb_notify()
2209 if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) { in btusb_notify()
2210 data->sco_num = hci_conn_num(hdev, SCO_LINK); in btusb_notify()
2211 data->air_mode = evt; in btusb_notify()
2212 schedule_work(&data->work); in btusb_notify()
2219 struct usb_interface *intf = data->isoc; in __set_isoc_interface()
2223 if (!data->isoc) in __set_isoc_interface()
2224 return -ENODEV; in __set_isoc_interface()
2226 err = usb_set_interface(data->udev, data->isoc_ifnum, altsetting); in __set_isoc_interface()
2228 bt_dev_err(hdev, "setting interface failed (%d)", -err); in __set_isoc_interface()
2232 data->isoc_altsetting = altsetting; in __set_isoc_interface()
2234 data->isoc_tx_ep = NULL; in __set_isoc_interface()
2235 data->isoc_rx_ep = NULL; in __set_isoc_interface()
2237 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in __set_isoc_interface()
2238 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in __set_isoc_interface()
2240 if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) { in __set_isoc_interface()
2241 data->isoc_tx_ep = ep_desc; in __set_isoc_interface()
2245 if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) { in __set_isoc_interface()
2246 data->isoc_rx_ep = ep_desc; in __set_isoc_interface()
2251 if (!data->isoc_tx_ep || !data->isoc_rx_ep) { in __set_isoc_interface()
2253 return -ENODEV; in __set_isoc_interface()
2264 if (data->isoc_altsetting != new_alts) { in btusb_switch_alt_setting()
2267 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_switch_alt_setting()
2268 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_switch_alt_setting()
2279 spin_lock_irqsave(&data->rxlock, flags); in btusb_switch_alt_setting()
2280 dev_kfree_skb_irq(data->sco_skb); in btusb_switch_alt_setting()
2281 data->sco_skb = NULL; in btusb_switch_alt_setting()
2282 spin_unlock_irqrestore(&data->rxlock, flags); in btusb_switch_alt_setting()
2289 if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) { in btusb_switch_alt_setting()
2291 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_switch_alt_setting()
2302 struct usb_interface *intf = data->isoc; in btusb_find_altsetting()
2310 for (i = 0; i < intf->num_altsetting; i++) { in btusb_find_altsetting()
2311 if (intf->altsetting[i].desc.bAlternateSetting == alt) in btusb_find_altsetting()
2312 return &intf->altsetting[i]; in btusb_find_altsetting()
2321 struct hci_dev *hdev = data->hdev; in btusb_work()
2325 if (data->sco_num > 0) { in btusb_work()
2326 if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) { in btusb_work()
2327 err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf); in btusb_work()
2329 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_work()
2330 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_work()
2334 set_bit(BTUSB_DID_ISO_RESUME, &data->flags); in btusb_work()
2337 if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_CVSD) { in btusb_work()
2338 if (hdev->voice_setting & 0x0020) { in btusb_work()
2341 new_alts = alts[data->sco_num - 1]; in btusb_work()
2343 new_alts = data->sco_num; in btusb_work()
2345 } else if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_TRANSP) { in btusb_work()
2347 * many adapters do not support it. Alt 1 appears to in btusb_work()
2352 * MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72 in btusb_work()
2353 * see also Core spec 5, vol 4, B 2.1.1 & Table 2.1. in btusb_work()
2358 hdev->sco_mtu >= 72 && in btusb_work()
2359 test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags)) in btusb_work()
2362 new_alts = 1; in btusb_work()
2368 usb_kill_anchored_urbs(&data->isoc_anchor); in btusb_work()
2370 if (test_and_clear_bit(BTUSB_ISOC_RUNNING, &data->flags)) in btusb_work()
2373 if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags)) in btusb_work()
2374 usb_autopm_put_interface(data->isoc ? data->isoc : data->intf); in btusb_work()
2383 err = usb_autopm_get_interface(data->intf); in btusb_waker()
2387 usb_autopm_put_interface(data->intf); in btusb_waker()
2397 while ((skb = skb_dequeue(&data->acl_q))) in btusb_rx_work()
2398 data->recv_acl(data->hdev, skb); in btusb_rx_work()
2406 BT_DBG("%s", hdev->name); in btusb_setup_bcm92035()
2408 skb = __hci_cmd_sync(hdev, 0xfc3b, 1, &val, HCI_INIT_TIMEOUT); in btusb_setup_bcm92035()
2420 u16 bcdDevice = le16_to_cpu(data->udev->descriptor.bcdDevice); in btusb_setup_csr()
2426 BT_DBG("%s", hdev->name); in btusb_setup_csr()
2440 return -EIO; in btusb_setup_csr()
2444 rp->hci_ver, le16_to_cpu(rp->hci_rev)); in btusb_setup_csr()
2447 rp->lmp_ver, le16_to_cpu(rp->lmp_subver), in btusb_setup_csr()
2448 le16_to_cpu(rp->manufacturer)); in btusb_setup_csr()
2454 * The main thing they have in common is that these are really popular low-cost in btusb_setup_csr()
2459 * is Cambridge Silicon Radio (10) and ensuring that LMP sub-version and in btusb_setup_csr()
2462 if (le16_to_cpu(rp->manufacturer) != 10 || in btusb_setup_csr()
2463 le16_to_cpu(rp->hci_rev) != le16_to_cpu(rp->lmp_subver)) in btusb_setup_csr()
2467 * - 1.1 (0x1) -> 0x0073, 0x020d, 0x033c, 0x034e in btusb_setup_csr()
2468 * - 1.2 (0x2) -> 0x04d9, 0x0529 in btusb_setup_csr()
2469 * - 2.0 (0x3) -> 0x07a6, 0x07ad, 0x0c5c in btusb_setup_csr()
2470 * - 2.1 (0x4) -> 0x149c, 0x1735, 0x1899 (0x1899 is a BlueCore4-External) in btusb_setup_csr()
2471 * - 4.0 (0x6) -> 0x1d86, 0x2031, 0x22bb in btusb_setup_csr()
2475 * third-party BT 4.0 dongle reuses it. in btusb_setup_csr()
2477 else if (le16_to_cpu(rp->lmp_subver) <= 0x034e && in btusb_setup_csr()
2478 rp->hci_ver > BLUETOOTH_VER_1_1) in btusb_setup_csr()
2481 else if (le16_to_cpu(rp->lmp_subver) <= 0x0529 && in btusb_setup_csr()
2482 rp->hci_ver > BLUETOOTH_VER_1_2) in btusb_setup_csr()
2485 else if (le16_to_cpu(rp->lmp_subver) <= 0x0c5c && in btusb_setup_csr()
2486 rp->hci_ver > BLUETOOTH_VER_2_0) in btusb_setup_csr()
2489 else if (le16_to_cpu(rp->lmp_subver) <= 0x1899 && in btusb_setup_csr()
2490 rp->hci_ver > BLUETOOTH_VER_2_1) in btusb_setup_csr()
2493 else if (le16_to_cpu(rp->lmp_subver) <= 0x22bb && in btusb_setup_csr()
2494 rp->hci_ver > BLUETOOTH_VER_4_0) in btusb_setup_csr()
2499 le16_to_cpu(rp->lmp_subver) == 0x0c5c && in btusb_setup_csr()
2500 rp->hci_ver == BLUETOOTH_VER_2_0) in btusb_setup_csr()
2504 …bt_dev_warn(hdev, "CSR: Unbranded CSR clone detected; adding workarounds and force-suspending once… in btusb_setup_csr()
2527 * - 0x0134: a Barrot 8041a02 (HCI rev: 0x0810 sub: 0x1012) in btusb_setup_csr()
2528 * - 0x7558: IC markings FR3191AHAL 749H15143 (HCI rev/sub-version: 0x0709) in btusb_setup_csr()
2530 * These controllers are really messed-up. in btusb_setup_csr()
2532 * 1. Their bulk RX endpoint will never report any data unless in btusb_setup_csr()
2536 * (IOW remote-wakeup support is broken for the bulk endpoint). in btusb_setup_csr()
2538 * To fix 1. enable runtime-suspend, force-suspend the in btusb_setup_csr()
2539 * HCI and then wake-it up by disabling runtime-suspend. in btusb_setup_csr()
2544 * -- in btusb_setup_csr()
2550 pm_runtime_allow(&data->udev->dev); in btusb_setup_csr()
2552 ret = pm_runtime_suspend(&data->udev->dev); in btusb_setup_csr()
2556 …bt_dev_warn(hdev, "CSR: Couldn't suspend the device for our Barrot 8041a02 receive-issue workaroun… in btusb_setup_csr()
2558 pm_runtime_forbid(&data->udev->dev); in btusb_setup_csr()
2560 device_set_wakeup_capable(&data->udev->dev, false); in btusb_setup_csr()
2562 /* Re-enable autosuspend if this was requested */ in btusb_setup_csr()
2564 usb_enable_autosuspend(data->udev); in btusb_setup_csr()
2578 skb = bt_skb_alloc(sizeof(*hdr) + sizeof(*evt) + 1, GFP_KERNEL); in inject_cmd_complete()
2580 return -ENOMEM; in inject_cmd_complete()
2583 hdr->evt = HCI_EV_CMD_COMPLETE; in inject_cmd_complete()
2584 hdr->plen = sizeof(*evt) + 1; in inject_cmd_complete()
2587 evt->ncmd = 0x01; in inject_cmd_complete()
2588 evt->opcode = cpu_to_le16(opcode); in inject_cmd_complete()
2600 struct hci_dev *hdev = data->hdev; in btusb_recv_bulk_intel()
2616 BT_DBG("%s", hdev->name); in btusb_send_frame_intel()
2621 struct hci_command_hdr *cmd = (void *)skb->data; in btusb_send_frame_intel()
2622 __u16 opcode = le16_to_cpu(cmd->opcode); in btusb_send_frame_intel()
2646 hdev->stat.cmd_tx++; in btusb_send_frame_intel()
2654 hdev->stat.acl_tx++; in btusb_send_frame_intel()
2659 hci_conn_num(hdev, SCO_LINK) < 1) in btusb_send_frame_intel()
2660 return -ENODEV; in btusb_send_frame_intel()
2666 hdev->stat.sco_tx++; in btusb_send_frame_intel()
2677 return -EILSEQ; in btusb_send_frame_intel()
2687 if (btrealtek_test_flag(data->hdev, REALTEK_ALT6_CONTINUOUS_TX_CHIP)) in btusb_setup_realtek()
2688 set_bit(BTUSB_ALT6_CONTINUOUS_TX, &data->flags); in btusb_setup_realtek()
2695 if (skb->data[0] == HCI_VENDOR_PKT && skb->data[2] == RTK_SUB_EVENT_CODE_COREDUMP) { in btusb_recv_event_realtek()
2701 skb->len); in btusb_recv_event_realtek()
2703 btusb_rtl_alloc_devcoredump(hdev, &hdr, skb->data, skb->len); in btusb_recv_event_realtek()
2714 struct btmtk_data *btmtk_data = hci_get_priv(data->hdev); in btusb_mtk_claim_iso_intf()
2722 device_lock(&btmtk_data->isopkt_intf->dev); in btusb_mtk_claim_iso_intf()
2724 btmtk_data->isopkt_intf, data); in btusb_mtk_claim_iso_intf()
2725 device_unlock(&btmtk_data->isopkt_intf->dev); in btusb_mtk_claim_iso_intf()
2727 btmtk_data->isopkt_intf = NULL; in btusb_mtk_claim_iso_intf()
2728 bt_dev_err(data->hdev, "Failed to claim iso interface: %d", err); in btusb_mtk_claim_iso_intf()
2732 set_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags); in btusb_mtk_claim_iso_intf()
2733 init_usb_anchor(&btmtk_data->isopkt_anchor); in btusb_mtk_claim_iso_intf()
2740 if (test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) { in btusb_mtk_release_iso_intf()
2741 usb_kill_anchored_urbs(&btmtk_data->isopkt_anchor); in btusb_mtk_release_iso_intf()
2742 clear_bit(BTMTK_ISOPKT_RUNNING, &btmtk_data->flags); in btusb_mtk_release_iso_intf()
2744 dev_kfree_skb_irq(btmtk_data->isopkt_skb); in btusb_mtk_release_iso_intf()
2745 btmtk_data->isopkt_skb = NULL; in btusb_mtk_release_iso_intf()
2746 usb_set_intfdata(btmtk_data->isopkt_intf, NULL); in btusb_mtk_release_iso_intf()
2748 btmtk_data->isopkt_intf); in btusb_mtk_release_iso_intf()
2751 clear_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags); in btusb_mtk_release_iso_intf()
2771 if (test_and_set_bit(BTMTK_HW_RESET_ACTIVE, &btmtk_data->flags)) { in btusb_mtk_reset()
2773 return -EBUSY; in btusb_mtk_reset()
2776 err = usb_autopm_get_interface(data->intf); in btusb_mtk_reset()
2784 usb_kill_anchored_urbs(&data->tx_anchor); in btusb_mtk_reset()
2786 err = btmtk_usb_subsys_reset(hdev, btmtk_data->dev_id); in btusb_mtk_reset()
2788 usb_queue_reset_device(data->intf); in btusb_mtk_reset()
2789 clear_bit(BTMTK_HW_RESET_ACTIVE, &btmtk_data->flags); in btusb_mtk_reset()
2798 BT_DBG("%s", hdev->name); in btusb_send_frame_mtk()
2819 btmtk_data->drv_name = btusb_driver.name; in btusb_mtk_setup()
2820 btmtk_data->intf = data->intf; in btusb_mtk_setup()
2821 btmtk_data->udev = data->udev; in btusb_mtk_setup()
2822 btmtk_data->ctrl_anchor = &data->ctrl_anchor; in btusb_mtk_setup()
2823 btmtk_data->reset_sync = btusb_mtk_reset; in btusb_mtk_setup()
2826 if (!test_bit(BTMTK_ISOPKT_OVER_INTR, &btmtk_data->flags)) { in btusb_mtk_setup()
2827 btmtk_data->isopkt_intf = usb_ifnum_to_if(data->udev, MTK_ISO_IFNUM); in btusb_mtk_setup()
2847 /* Configure an out-of-band gpio as wake-up pin, if specified in device tree */
2852 struct device *dev = &data->udev->dev; in marvell_config_oob_wake()
2858 if (of_property_read_u16(dev->of_node, "marvell,wakeup-pin", &pin) || in marvell_config_oob_wake()
2859 of_property_read_u16(dev->of_node, "marvell,wakeup-gap-ms", &gap)) in marvell_config_oob_wake()
2862 /* Vendor specific command to configure a GPIO as wake-up pin */ in marvell_config_oob_wake()
2865 cmd[1] = opcode >> 8; in marvell_config_oob_wake()
2873 return -ENOMEM; in marvell_config_oob_wake()
2898 buf[1] = sizeof(bdaddr_t); in btusb_set_bdaddr_marvell()
2921 buf[1] = 0x01; in btusb_set_bdaddr_ath3012()
2986 btdata->qca_dump.controller_id); in btusb_dump_hdr_qca()
2990 btdata->qca_dump.fw_version); in btusb_dump_hdr_qca()
2998 btdata->qca_dump.id_vendor, btdata->qca_dump.id_product); in btusb_dump_hdr_qca()
3002 hdev->lmp_subver); in btusb_dump_hdr_qca()
3011 err = __hci_cmd_send(hdev, 0xfc0c, 1, param); in btusb_coredump_qca()
3027 struct usb_device *udev = btdata->udev; in handle_dump_pkt_qca()
3035 dump_hdr = (struct qca_dump_hdr *)skb->data; in handle_dump_pkt_qca()
3037 seqno = le16_to_cpu(dump_hdr->seqno); in handle_dump_pkt_qca()
3039 set_bit(BTUSB_HW_SSR_ACTIVE, &btdata->flags); in handle_dump_pkt_qca()
3040 dump_size = le32_to_cpu(dump_hdr->ram_dump_size); in handle_dump_pkt_qca()
3042 ret = -EILSEQ; in handle_dump_pkt_qca()
3054 btdata->qca_dump.ram_dump_size = dump_size; in handle_dump_pkt_qca()
3055 btdata->qca_dump.ram_dump_seqno = 0; in handle_dump_pkt_qca()
3067 if (!btdata->qca_dump.ram_dump_size) { in handle_dump_pkt_qca()
3068 ret = -EINVAL; in handle_dump_pkt_qca()
3073 if ((seqno > btdata->qca_dump.ram_dump_seqno + 1) && (seqno != QCA_LAST_SEQUENCE_NUM)) { in handle_dump_pkt_qca()
3074 dump_size = QCA_MEMDUMP_PKT_SIZE * (seqno - btdata->qca_dump.ram_dump_seqno - 1); in handle_dump_pkt_qca()
3078 btdata->qca_dump.ram_dump_seqno, seqno); in handle_dump_pkt_qca()
3079 btdata->qca_dump.ram_dump_seqno = seqno; in handle_dump_pkt_qca()
3085 btdata->qca_dump.ram_dump_seqno++; in handle_dump_pkt_qca()
3089 btdata->qca_dump.ram_dump_seqno, btdata->qca_dump.ram_dump_size); in handle_dump_pkt_qca()
3097 if (btdata->qca_dump.ram_dump_size) in handle_dump_pkt_qca()
3099 btdata->qca_dump.ram_dump_size = 0; in handle_dump_pkt_qca()
3100 btdata->qca_dump.ram_dump_seqno = 0; in handle_dump_pkt_qca()
3101 clear_bit(BTUSB_HW_SSR_ACTIVE, &btdata->flags); in handle_dump_pkt_qca()
3121 if (!acl_hdr || (le16_to_cpu(acl_hdr->handle) != QCA_MEMDUMP_ACL_HANDLE)) in acl_pkt_is_dump_qca()
3125 if (!event_hdr || (event_hdr->evt != HCI_VENDOR_PKT)) in acl_pkt_is_dump_qca()
3129 if (!dump_hdr || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || in acl_pkt_is_dump_qca()
3130 (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) in acl_pkt_is_dump_qca()
3151 if (!event_hdr || (event_hdr->evt != HCI_VENDOR_PKT)) in evt_pkt_is_dump_qca()
3155 if (!dump_hdr || (dump_hdr->vse_class != QCA_MEMDUMP_VSE_CLASS) || in evt_pkt_is_dump_qca()
3156 (dump_hdr->msg_type != QCA_MEMDUMP_MSG_TYPE)) in evt_pkt_is_dump_qca()
3244 u16 flag = le16_to_cpu(ver->flag); in qca_extract_board_id()
3249 * The 1st byte is chip ID, and the 2nd byte is platform ID in qca_extract_board_id()
3258 board_id = (ver->chip_id << 8) + ver->platform_id; in qca_extract_board_id()
3274 rom_ver = le32_to_cpu(ver->rom_version); in qca_get_fw_subdirectory()
3279 for (ptr = qca_custom_btfws; ptr->rom_version; ptr++) { in qca_get_fw_subdirectory()
3280 if (ptr->rom_version == rom_ver && in qca_get_fw_subdirectory()
3281 ptr->board_id == board_id) in qca_get_fw_subdirectory()
3282 return ptr->subdirectory; in qca_get_fw_subdirectory()
3296 return -ENOMEM; in btusb_qca_send_vendor_req()
3305 dev_err(&udev->dev, "Failed to access otp area (%d)", err); in btusb_qca_send_vendor_req()
3322 struct usb_device *udev = btdata->udev; in btusb_setup_qca_download_fw()
3329 return -ENOMEM; in btusb_setup_qca_download_fw()
3331 count = firmware->size; in btusb_setup_qca_download_fw()
3334 memcpy(buf, firmware->data, size); in btusb_setup_qca_download_fw()
3350 count -= size; in btusb_setup_qca_download_fw()
3360 memcpy(buf, firmware->data + sent, size); in btusb_setup_qca_download_fw()
3367 sent, firmware->size, err); in btusb_setup_qca_download_fw()
3373 err = -EILSEQ; in btusb_setup_qca_download_fw()
3378 count -= size; in btusb_setup_qca_download_fw()
3398 ver_rom = le32_to_cpu(ver->rom_version); in btusb_setup_qca_load_rampatch()
3399 ver_patch = le32_to_cpu(ver->patch_version); in btusb_setup_qca_load_rampatch()
3409 err = request_firmware(&fw, fwname, &hdev->dev); in btusb_setup_qca_load_rampatch()
3418 rver = (struct qca_rampatch_version *)(fw->data + info->ver_offset); in btusb_setup_qca_load_rampatch()
3419 rver_rom_low = le16_to_cpu(rver->rom_version_low); in btusb_setup_qca_load_rampatch()
3420 rver_patch = le16_to_cpu(rver->patch_version); in btusb_setup_qca_load_rampatch()
3423 rver_rom_high = le16_to_cpu(rver->rom_version_high); in btusb_setup_qca_load_rampatch()
3435 err = -EINVAL; in btusb_setup_qca_load_rampatch()
3439 err = btusb_setup_qca_download_fw(hdev, fw, info->rampatch_hdr); in btusb_setup_qca_load_rampatch()
3450 u32 rom_version = le32_to_cpu(ver->rom_version); in btusb_generate_qca_nvm_name()
3458 switch (le32_to_cpu(ver->ram_version)) { in btusb_generate_qca_nvm_name()
3475 len += snprintf(fwname + len, max_size - len, "%s", variant); in btusb_generate_qca_nvm_name()
3477 len += snprintf(fwname + len, max_size - len, "_%04x", board_id); in btusb_generate_qca_nvm_name()
3478 len += snprintf(fwname + len, max_size - len, ".bin"); in btusb_generate_qca_nvm_name()
3491 err = request_firmware(&fw, fwname, &hdev->dev); in btusb_setup_qca_load_nvm()
3500 err = btusb_setup_qca_download_fw(hdev, fw, info->nvm_hdr); in btusb_setup_qca_load_nvm()
3522 struct usb_device *udev = btdata->udev; in btusb_setup_qca()
3549 return -ENODEV; in btusb_setup_qca()
3568 btdata->qca_dump.fw_version = le32_to_cpu(ver.patch_version); in btusb_setup_qca()
3569 btdata->qca_dump.controller_id = le32_to_cpu(ver.rom_version); in btusb_setup_qca()
3580 if (info->rom_version >= 0x00130201) in btusb_setup_qca()
3595 struct usb_interface *intf = data->diag; in __set_diag_interface()
3598 if (!data->diag) in __set_diag_interface()
3599 return -ENODEV; in __set_diag_interface()
3601 data->diag_tx_ep = NULL; in __set_diag_interface()
3602 data->diag_rx_ep = NULL; in __set_diag_interface()
3604 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in __set_diag_interface()
3607 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in __set_diag_interface()
3609 if (!data->diag_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) { in __set_diag_interface()
3610 data->diag_tx_ep = ep_desc; in __set_diag_interface()
3614 if (!data->diag_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) { in __set_diag_interface()
3615 data->diag_rx_ep = ep_desc; in __set_diag_interface()
3620 if (!data->diag_tx_ep || !data->diag_rx_ep) { in __set_diag_interface()
3622 return -ENODEV; in __set_diag_interface()
3635 if (!data->diag_tx_ep) in alloc_diag_urb()
3636 return ERR_PTR(-ENODEV); in alloc_diag_urb()
3640 return ERR_PTR(-ENOMEM); in alloc_diag_urb()
3645 return ERR_PTR(-ENOMEM); in alloc_diag_urb()
3651 pipe = usb_sndbulkpipe(data->udev, data->diag_tx_ep->bEndpointAddress); in alloc_diag_urb()
3653 usb_fill_bulk_urb(urb, data->udev, pipe, in alloc_diag_urb()
3654 skb->data, skb->len, btusb_tx_complete, skb); in alloc_diag_urb()
3656 skb->dev = (void *)hdev; in alloc_diag_urb()
3666 if (!data->diag) in btusb_bcm_set_diag()
3667 return -ENODEV; in btusb_bcm_set_diag()
3669 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_bcm_set_diag()
3670 return -ENETDOWN; in btusb_bcm_set_diag()
3684 pm_wakeup_event(&data->udev->dev, 0); in btusb_oob_wake_handler()
3688 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) { in btusb_oob_wake_handler()
3698 { .compatible = "usb4ca,301a" }, /* QCA6174A (Lite-On) */
3707 struct device *dev = &data->udev->dev; in btusb_config_oob_wake()
3710 clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags); in btusb_config_oob_wake()
3716 irq = of_irq_get_byname(dev->of_node, "wakeup"); in btusb_config_oob_wake()
3723 ret = devm_request_irq(&hdev->dev, irq, btusb_oob_wake_handler, in btusb_config_oob_wake()
3724 0, "OOB Wake-on-BT", data); in btusb_config_oob_wake()
3736 data->oob_wake_irq = irq; in btusb_config_oob_wake()
3737 bt_dev_info(hdev, "OOB Wake-on-BT configured at IRQ %u", irq); in btusb_config_oob_wake()
3745 interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME; in btusb_check_needs_reset_resume()
3752 return device_may_wakeup(&data->udev->dev); in btusb_wakeup()
3772 struct btusb_data *data = file->private_data; in force_poll_sync_read()
3775 buf[0] = data->poll_sync ? 'Y' : 'N'; in force_poll_sync_read()
3776 buf[1] = '\n'; in force_poll_sync_read()
3785 struct btusb_data *data = file->private_data; in force_poll_sync_write()
3794 if (test_bit(HCI_UP, &data->hdev->flags)) in force_poll_sync_write()
3795 return -EPERM; in force_poll_sync_write()
3797 if (data->poll_sync == enable) in force_poll_sync_write()
3798 return -EALREADY; in force_poll_sync_write()
3800 data->poll_sync = enable; in force_poll_sync_write()
3823 #define BTUSB_HCI_DRV_SWITCH_ALTSETTING_SIZE 1
3852 return -ENOMEM; in btusb_hci_drv_read_info()
3854 strscpy_pad(rp->driver_name, btusb_driver.name); in btusb_hci_drv_read_info()
3856 rp->num_supported_commands = cpu_to_le16(num_supported_commands); in btusb_hci_drv_read_info()
3864 rp->supported_commands[i] = cpu_to_le16(opcode); in btusb_hci_drv_read_info()
3883 /* There are at most 7 alt (0 - 6) */ in btusb_hci_drv_supported_altsettings()
3886 return -ENOMEM; in btusb_hci_drv_supported_altsettings()
3888 rp->num = 0; in btusb_hci_drv_supported_altsettings()
3889 if (!drvdata->isoc) in btusb_hci_drv_supported_altsettings()
3894 rp->altsettings[rp->num++] = i; in btusb_hci_drv_supported_altsettings()
3898 rp_size = sizeof(*rp) + rp->num; in btusb_hci_drv_supported_altsettings()
3912 if (cmd->altsetting > 6) { in btusb_hci_drv_switch_altsetting()
3915 if (btusb_switch_alt_setting(hdev, cmd->altsetting)) in btusb_hci_drv_switch_altsetting()
3955 if ((id->driver_info & BTUSB_IFNUM_2) && in btusb_probe()
3956 (intf->cur_altsetting->desc.bInterfaceNumber != 0) && in btusb_probe()
3957 (intf->cur_altsetting->desc.bInterfaceNumber != 2)) in btusb_probe()
3958 return -ENODEV; in btusb_probe()
3960 ifnum_base = intf->cur_altsetting->desc.bInterfaceNumber; in btusb_probe()
3962 if (!id->driver_info) { in btusb_probe()
3970 if (id->driver_info == BTUSB_IGNORE) in btusb_probe()
3971 return -ENODEV; in btusb_probe()
3973 if (id->driver_info & BTUSB_ATH3012) { in btusb_probe()
3979 if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001 && in btusb_probe()
3981 return -ENODEV; in btusb_probe()
3984 data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL); in btusb_probe()
3986 return -ENOMEM; in btusb_probe()
3988 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) { in btusb_probe()
3989 ep_desc = &intf->cur_altsetting->endpoint[i].desc; in btusb_probe()
3991 if (!data->intr_ep && usb_endpoint_is_int_in(ep_desc)) { in btusb_probe()
3992 data->intr_ep = ep_desc; in btusb_probe()
3996 if (!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) { in btusb_probe()
3997 data->bulk_tx_ep = ep_desc; in btusb_probe()
4001 if (!data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) { in btusb_probe()
4002 data->bulk_rx_ep = ep_desc; in btusb_probe()
4007 if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep) in btusb_probe()
4008 return -ENODEV; in btusb_probe()
4010 if (id->driver_info & BTUSB_AMP) { in btusb_probe()
4011 data->cmdreq_type = USB_TYPE_CLASS | 0x01; in btusb_probe()
4012 data->cmdreq = 0x2b; in btusb_probe()
4014 data->cmdreq_type = USB_TYPE_CLASS; in btusb_probe()
4015 data->cmdreq = 0x00; in btusb_probe()
4018 data->udev = interface_to_usbdev(intf); in btusb_probe()
4019 data->intf = intf; in btusb_probe()
4021 INIT_WORK(&data->work, btusb_work); in btusb_probe()
4022 INIT_WORK(&data->waker, btusb_waker); in btusb_probe()
4023 INIT_DELAYED_WORK(&data->rx_work, btusb_rx_work); in btusb_probe()
4025 skb_queue_head_init(&data->acl_q); in btusb_probe()
4027 init_usb_anchor(&data->deferred); in btusb_probe()
4028 init_usb_anchor(&data->tx_anchor); in btusb_probe()
4029 spin_lock_init(&data->txlock); in btusb_probe()
4031 init_usb_anchor(&data->intr_anchor); in btusb_probe()
4032 init_usb_anchor(&data->bulk_anchor); in btusb_probe()
4033 init_usb_anchor(&data->isoc_anchor); in btusb_probe()
4034 init_usb_anchor(&data->diag_anchor); in btusb_probe()
4035 init_usb_anchor(&data->ctrl_anchor); in btusb_probe()
4036 spin_lock_init(&data->rxlock); in btusb_probe()
4040 data->recv_event = hci_recv_frame; in btusb_probe()
4041 data->recv_bulk = btusb_recv_bulk; in btusb_probe()
4043 if (id->driver_info & BTUSB_INTEL_COMBINED) { in btusb_probe()
4048 data->recv_event = btintel_recv_event; in btusb_probe()
4049 data->recv_bulk = btusb_recv_bulk_intel; in btusb_probe()
4050 } else if (id->driver_info & BTUSB_REALTEK) { in btusb_probe()
4054 data->recv_event = btusb_recv_event_realtek; in btusb_probe()
4055 } else if (id->driver_info & BTUSB_MEDIATEK) { in btusb_probe()
4060 data->recv_acl = hci_recv_frame; in btusb_probe()
4064 return -ENOMEM; in btusb_probe()
4066 hdev->bus = HCI_USB; in btusb_probe()
4069 data->hdev = hdev; in btusb_probe()
4071 SET_HCIDEV_DEV(hdev, &intf->dev); in btusb_probe()
4073 reset_gpio = gpiod_get_optional(&data->udev->dev, "reset", in btusb_probe()
4079 data->reset_gpio = reset_gpio; in btusb_probe()
4082 hdev->open = btusb_open; in btusb_probe()
4083 hdev->close = btusb_close; in btusb_probe()
4084 hdev->flush = btusb_flush; in btusb_probe()
4085 hdev->send = btusb_send_frame; in btusb_probe()
4086 hdev->notify = btusb_notify; in btusb_probe()
4087 hdev->wakeup = btusb_wakeup; in btusb_probe()
4088 hdev->hci_drv = &btusb_hci_drv; in btusb_probe()
4096 if (id->driver_info & BTUSB_MARVELL && data->oob_wake_irq) { in btusb_probe()
4102 if (id->driver_info & BTUSB_CW6622) in btusb_probe()
4105 if (id->driver_info & BTUSB_BCM2045) in btusb_probe()
4108 if (id->driver_info & BTUSB_BCM92035) in btusb_probe()
4109 hdev->setup = btusb_setup_bcm92035; in btusb_probe()
4112 (id->driver_info & BTUSB_BCM_PATCHRAM)) { in btusb_probe()
4113 hdev->manufacturer = 15; in btusb_probe()
4114 hdev->setup = btbcm_setup_patchram; in btusb_probe()
4115 hdev->set_diag = btusb_bcm_set_diag; in btusb_probe()
4116 hdev->set_bdaddr = btbcm_set_bdaddr; in btusb_probe()
4119 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2); in btusb_probe()
4123 (id->driver_info & BTUSB_BCM_APPLE)) { in btusb_probe()
4124 hdev->manufacturer = 15; in btusb_probe()
4125 hdev->setup = btbcm_setup_apple; in btusb_probe()
4126 hdev->set_diag = btusb_bcm_set_diag; in btusb_probe()
4129 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2); in btusb_probe()
4133 if (id->driver_info & BTUSB_INTEL_COMBINED) { in btusb_probe()
4139 hdev->send = btusb_send_frame_intel; in btusb_probe()
4140 hdev->reset = btusb_intel_reset; in btusb_probe()
4142 if (id->driver_info & BTUSB_INTEL_NO_WBS_SUPPORT) in btusb_probe()
4145 if (id->driver_info & BTUSB_INTEL_BROKEN_INITIAL_NCMD) in btusb_probe()
4148 if (id->driver_info & BTUSB_INTEL_BROKEN_SHUTDOWN_LED) in btusb_probe()
4152 if (id->driver_info & BTUSB_MARVELL) in btusb_probe()
4153 hdev->set_bdaddr = btusb_set_bdaddr_marvell; in btusb_probe()
4156 (id->driver_info & BTUSB_MEDIATEK)) { in btusb_probe()
4157 hdev->setup = btusb_mtk_setup; in btusb_probe()
4158 hdev->shutdown = btusb_mtk_shutdown; in btusb_probe()
4159 hdev->manufacturer = 70; in btusb_probe()
4160 hdev->reset = btmtk_reset_sync; in btusb_probe()
4161 hdev->set_bdaddr = btmtk_set_bdaddr; in btusb_probe()
4162 hdev->send = btusb_send_frame_mtk; in btusb_probe()
4165 data->recv_acl = btmtk_usb_recv_acl; in btusb_probe()
4166 data->suspend = btmtk_usb_suspend; in btusb_probe()
4167 data->resume = btmtk_usb_resume; in btusb_probe()
4168 data->disconnect = btusb_mtk_disconnect; in btusb_probe()
4171 if (id->driver_info & BTUSB_SWAVE) { in btusb_probe()
4176 if (id->driver_info & BTUSB_INTEL_BOOT) { in btusb_probe()
4177 hdev->manufacturer = 2; in btusb_probe()
4181 if (id->driver_info & BTUSB_ATH3012) { in btusb_probe()
4182 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
4183 hdev->set_bdaddr = btusb_set_bdaddr_ath3012; in btusb_probe()
4188 if (id->driver_info & BTUSB_QCA_ROME) { in btusb_probe()
4189 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
4190 hdev->shutdown = btusb_shutdown_qca; in btusb_probe()
4191 hdev->set_bdaddr = btusb_set_bdaddr_ath3012; in btusb_probe()
4192 hdev->reset = btusb_qca_reset; in btusb_probe()
4197 if (id->driver_info & BTUSB_QCA_WCN6855) { in btusb_probe()
4198 data->qca_dump.id_vendor = id->idVendor; in btusb_probe()
4199 data->qca_dump.id_product = id->idProduct; in btusb_probe()
4200 data->recv_event = btusb_recv_evt_qca; in btusb_probe()
4201 data->recv_acl = btusb_recv_acl_qca; in btusb_probe()
4203 data->setup_on_usb = btusb_setup_qca; in btusb_probe()
4204 hdev->shutdown = btusb_shutdown_qca; in btusb_probe()
4205 hdev->set_bdaddr = btusb_set_bdaddr_wcn6855; in btusb_probe()
4206 hdev->reset = btusb_qca_reset; in btusb_probe()
4211 if (id->driver_info & BTUSB_AMP) { in btusb_probe()
4213 data->isoc = NULL; in btusb_probe()
4216 data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1); in btusb_probe()
4217 data->isoc_ifnum = ifnum_base + 1; in btusb_probe()
4221 (id->driver_info & BTUSB_REALTEK)) { in btusb_probe()
4223 hdev->setup = btusb_setup_realtek; in btusb_probe()
4224 hdev->shutdown = btrtl_shutdown_realtek; in btusb_probe()
4225 hdev->reset = btusb_rtl_reset; in btusb_probe()
4226 hdev->hw_error = btusb_rtl_hw_error; in btusb_probe()
4228 /* Realtek devices need to set remote wakeup on auto-suspend */ in btusb_probe()
4229 set_bit(BTUSB_WAKEUP_AUTOSUSPEND, &data->flags); in btusb_probe()
4230 set_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags); in btusb_probe()
4233 if (id->driver_info & BTUSB_ACTIONS_SEMI) { in btusb_probe()
4247 if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) { in btusb_probe()
4252 if (id->driver_info & BTUSB_BROKEN_ISOC) in btusb_probe()
4253 data->isoc = NULL; in btusb_probe()
4255 if (id->driver_info & BTUSB_WIDEBAND_SPEECH) in btusb_probe()
4258 if (id->driver_info & BTUSB_INVALID_LE_STATES) in btusb_probe()
4261 if (id->driver_info & BTUSB_DIGIANSWER) { in btusb_probe()
4262 data->cmdreq_type = USB_TYPE_VENDOR; in btusb_probe()
4266 if (id->driver_info & BTUSB_CSR) { in btusb_probe()
4267 struct usb_device *udev = data->udev; in btusb_probe()
4268 u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice); in btusb_probe()
4278 if (le16_to_cpu(udev->descriptor.idVendor) == 0x0a12 && in btusb_probe()
4279 le16_to_cpu(udev->descriptor.idProduct) == 0x0001) in btusb_probe()
4280 hdev->setup = btusb_setup_csr; in btusb_probe()
4283 if (id->driver_info & BTUSB_SNIFFER) { in btusb_probe()
4284 struct usb_device *udev = data->udev; in btusb_probe()
4287 if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997) in btusb_probe()
4291 if (id->driver_info & BTUSB_INTEL_BOOT) { in btusb_probe()
4295 err = usb_set_interface(data->udev, 0, 0); in btusb_probe()
4302 if (data->isoc) { in btusb_probe()
4304 data->isoc, data); in btusb_probe()
4309 if (IS_ENABLED(CONFIG_BT_HCIBTUSB_BCM) && data->diag) { in btusb_probe()
4311 data->diag, data)) in btusb_probe()
4314 data->diag = NULL; in btusb_probe()
4318 usb_enable_autosuspend(data->udev); in btusb_probe()
4320 data->poll_sync = enable_poll_sync; in btusb_probe()
4328 debugfs_create_file("force_poll_sync", 0644, hdev->debugfs, data, in btusb_probe()
4334 if (data->reset_gpio) in btusb_probe()
4335 gpiod_put(data->reset_gpio); in btusb_probe()
4350 hdev = data->hdev; in btusb_disconnect()
4351 usb_set_intfdata(data->intf, NULL); in btusb_disconnect()
4353 if (data->isoc) in btusb_disconnect()
4354 usb_set_intfdata(data->isoc, NULL); in btusb_disconnect()
4356 if (data->diag) in btusb_disconnect()
4357 usb_set_intfdata(data->diag, NULL); in btusb_disconnect()
4359 if (data->disconnect) in btusb_disconnect()
4360 data->disconnect(hdev); in btusb_disconnect()
4364 if (data->oob_wake_irq) in btusb_disconnect()
4365 device_init_wakeup(&data->udev->dev, false); in btusb_disconnect()
4366 if (data->reset_gpio) in btusb_disconnect()
4367 gpiod_put(data->reset_gpio); in btusb_disconnect()
4369 if (intf == data->intf) { in btusb_disconnect()
4370 if (data->isoc) in btusb_disconnect()
4371 usb_driver_release_interface(&btusb_driver, data->isoc); in btusb_disconnect()
4372 if (data->diag) in btusb_disconnect()
4373 usb_driver_release_interface(&btusb_driver, data->diag); in btusb_disconnect()
4374 } else if (intf == data->isoc) { in btusb_disconnect()
4375 if (data->diag) in btusb_disconnect()
4376 usb_driver_release_interface(&btusb_driver, data->diag); in btusb_disconnect()
4377 usb_driver_release_interface(&btusb_driver, data->intf); in btusb_disconnect()
4378 } else if (intf == data->diag) { in btusb_disconnect()
4379 if (data->isoc) in btusb_disconnect()
4380 usb_driver_release_interface(&btusb_driver, data->isoc); in btusb_disconnect()
4381 usb_driver_release_interface(&btusb_driver, data->intf); in btusb_disconnect()
4394 /* Don't auto-suspend if there are connections; external suspend calls in btusb_suspend()
4397 if (PMSG_IS_AUTO(message) && hci_conn_count(data->hdev)) in btusb_suspend()
4398 return -EBUSY; in btusb_suspend()
4400 if (data->suspend_count++) in btusb_suspend()
4403 spin_lock_irq(&data->txlock); in btusb_suspend()
4404 if (!(PMSG_IS_AUTO(message) && data->tx_in_flight)) { in btusb_suspend()
4405 set_bit(BTUSB_SUSPENDING, &data->flags); in btusb_suspend()
4406 spin_unlock_irq(&data->txlock); in btusb_suspend()
4408 spin_unlock_irq(&data->txlock); in btusb_suspend()
4409 data->suspend_count--; in btusb_suspend()
4410 return -EBUSY; in btusb_suspend()
4413 cancel_work_sync(&data->work); in btusb_suspend()
4415 if (data->suspend) in btusb_suspend()
4416 data->suspend(data->hdev); in btusb_suspend()
4419 usb_kill_anchored_urbs(&data->tx_anchor); in btusb_suspend()
4421 if (data->oob_wake_irq && device_may_wakeup(&data->udev->dev)) { in btusb_suspend()
4422 set_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags); in btusb_suspend()
4423 enable_irq_wake(data->oob_wake_irq); in btusb_suspend()
4424 enable_irq(data->oob_wake_irq); in btusb_suspend()
4432 if (test_bit(BTUSB_WAKEUP_AUTOSUSPEND, &data->flags)) { in btusb_suspend()
4434 device_can_wakeup(&data->udev->dev)) in btusb_suspend()
4435 data->udev->do_remote_wakeup = 1; in btusb_suspend()
4437 !device_may_wakeup(&data->udev->dev)) { in btusb_suspend()
4438 data->udev->do_remote_wakeup = 0; in btusb_suspend()
4439 data->udev->reset_resume = 1; in btusb_suspend()
4451 while ((urb = usb_get_from_anchor(&data->deferred))) { in play_deferred()
4452 usb_anchor_urb(urb, &data->tx_anchor); in play_deferred()
4456 if (err != -EPERM && err != -ENODEV) in play_deferred()
4458 data->hdev->name, urb, -err); in play_deferred()
4459 kfree(urb->setup_packet); in play_deferred()
4465 data->tx_in_flight++; in play_deferred()
4470 while ((urb = usb_get_from_anchor(&data->deferred))) { in play_deferred()
4471 kfree(urb->setup_packet); in play_deferred()
4479 struct hci_dev *hdev = data->hdev; in btusb_resume()
4484 if (--data->suspend_count) in btusb_resume()
4488 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) { in btusb_resume()
4489 disable_irq(data->oob_wake_irq); in btusb_resume()
4490 disable_irq_wake(data->oob_wake_irq); in btusb_resume()
4493 if (!test_bit(HCI_RUNNING, &hdev->flags)) in btusb_resume()
4496 if (test_bit(BTUSB_INTR_RUNNING, &data->flags)) { in btusb_resume()
4499 clear_bit(BTUSB_INTR_RUNNING, &data->flags); in btusb_resume()
4504 if (test_bit(BTUSB_BULK_RUNNING, &data->flags)) { in btusb_resume()
4507 clear_bit(BTUSB_BULK_RUNNING, &data->flags); in btusb_resume()
4514 if (test_bit(BTUSB_ISOC_RUNNING, &data->flags)) { in btusb_resume()
4516 clear_bit(BTUSB_ISOC_RUNNING, &data->flags); in btusb_resume()
4521 if (data->resume) in btusb_resume()
4522 data->resume(hdev); 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()
4547 struct hci_dev *hdev = data->hdev; in btusb_coredump()
4549 if (hdev->dump.coredump) in btusb_coredump()
4550 hdev->dump.coredump(hdev); in btusb_coredump()
4563 .supports_autosuspend = 1,
4564 .disable_hub_initiated_lpm = 1,