^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Generic Bluetooth USB driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (C) 2005-2008 Marcel Holtmann <marcel@holtmann.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/dmi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/usb.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/usb/quirks.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/firmware.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/iopoll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/of_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/of_irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/suspend.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/gpio/consumer.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <asm/unaligned.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <net/bluetooth/bluetooth.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <net/bluetooth/hci_core.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include "btintel.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include "btbcm.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include "btrtl.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define VERSION "0.8"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) static bool disable_scofix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) static bool force_scofix;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) static bool enable_autosuspend = IS_ENABLED(CONFIG_BT_HCIBTUSB_AUTOSUSPEND);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) static bool reset = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) static struct usb_driver btusb_driver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define BTUSB_IGNORE 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define BTUSB_DIGIANSWER 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define BTUSB_CSR 0x04
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define BTUSB_SNIFFER 0x08
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define BTUSB_BCM92035 0x10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define BTUSB_BROKEN_ISOC 0x20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define BTUSB_WRONG_SCO_MTU 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define BTUSB_ATH3012 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define BTUSB_INTEL 0x100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define BTUSB_INTEL_BOOT 0x200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define BTUSB_BCM_PATCHRAM 0x400
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define BTUSB_MARVELL 0x800
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #define BTUSB_SWAVE 0x1000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define BTUSB_INTEL_NEW 0x2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define BTUSB_AMP 0x4000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define BTUSB_QCA_ROME 0x8000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define BTUSB_BCM_APPLE 0x10000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define BTUSB_REALTEK 0x20000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define BTUSB_BCM2045 0x40000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define BTUSB_IFNUM_2 0x80000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define BTUSB_CW6622 0x100000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define BTUSB_MEDIATEK 0x200000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #define BTUSB_WIDEBAND_SPEECH 0x400000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define BTUSB_VALID_LE_STATES 0x800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define BTUSB_QCA_WCN6855 0x1000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define BTUSB_INTEL_NEWGEN 0x2000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) static const struct usb_device_id btusb_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* Generic Bluetooth USB device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) { USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* Generic Bluetooth AMP device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) { USB_DEVICE_INFO(0xe0, 0x01, 0x04), .driver_info = BTUSB_AMP },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) /* Generic Bluetooth USB interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) { USB_INTERFACE_INFO(0xe0, 0x01, 0x01) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /* Apple-specific (Broadcom) devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) { USB_VENDOR_AND_INTERFACE_INFO(0x05ac, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) .driver_info = BTUSB_BCM_APPLE | BTUSB_IFNUM_2 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /* MediaTek MT76x0E */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) { USB_DEVICE(0x0e8d, 0x763f) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) /* Broadcom SoftSailing reporting vendor specific */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) { USB_DEVICE(0x0a5c, 0x21e1) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* Apple MacBookPro 7,1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) { USB_DEVICE(0x05ac, 0x8213) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) /* Apple iMac11,1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) { USB_DEVICE(0x05ac, 0x8215) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) /* Apple MacBookPro6,2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) { USB_DEVICE(0x05ac, 0x8218) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /* Apple MacBookAir3,1, MacBookAir3,2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) { USB_DEVICE(0x05ac, 0x821b) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /* Apple MacBookAir4,1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) { USB_DEVICE(0x05ac, 0x821f) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) /* Apple MacBookPro8,2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) { USB_DEVICE(0x05ac, 0x821a) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) /* Apple MacMini5,1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) { USB_DEVICE(0x05ac, 0x8281) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) /* AVM BlueFRITZ! USB v2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) { USB_DEVICE(0x057c, 0x3800), .driver_info = BTUSB_SWAVE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) /* Bluetooth Ultraport Module from IBM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) { USB_DEVICE(0x04bf, 0x030a) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) /* ALPS Modules with non-standard id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) { USB_DEVICE(0x044e, 0x3001) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) { USB_DEVICE(0x044e, 0x3002) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) /* Ericsson with non-standard id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) { USB_DEVICE(0x0bdb, 0x1002) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) /* Canyon CN-BTU1 with HID interfaces */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) { USB_DEVICE(0x0c10, 0x0000) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /* Broadcom BCM20702A0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) { USB_DEVICE(0x413c, 0x8197) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) /* Broadcom BCM20702B0 (Dynex/Insignia) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) { USB_DEVICE(0x19ff, 0x0239), .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) /* Broadcom BCM43142A0 (Foxconn/Lenovo) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) { USB_VENDOR_AND_INTERFACE_INFO(0x105b, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) /* Broadcom BCM920703 (HTC Vive) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) { USB_VENDOR_AND_INTERFACE_INFO(0x0bb4, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /* Foxconn - Hon Hai */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) { USB_VENDOR_AND_INTERFACE_INFO(0x0489, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /* Lite-On Technology - Broadcom based */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) { USB_VENDOR_AND_INTERFACE_INFO(0x04ca, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) /* Broadcom devices with vendor specific id */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) { USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /* ASUSTek Computer - Broadcom based */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) { USB_VENDOR_AND_INTERFACE_INFO(0x0b05, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) /* Belkin F8065bf - Broadcom based */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) { USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /* IMC Networks - Broadcom based */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) { USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* Dell Computer - Broadcom based */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) { USB_VENDOR_AND_INTERFACE_INFO(0x413c, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) /* Toshiba Corp - Broadcom based */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) { USB_VENDOR_AND_INTERFACE_INFO(0x0930, 0xff, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) .driver_info = BTUSB_BCM_PATCHRAM },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) /* Intel Bluetooth USB Bootloader (RAM module) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) { USB_DEVICE(0x8087, 0x0a5a),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .driver_info = BTUSB_INTEL_BOOT | BTUSB_BROKEN_ISOC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) MODULE_DEVICE_TABLE(usb, btusb_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) static const struct usb_device_id blacklist_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) /* CSR BlueCore devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) { USB_DEVICE(0x0a12, 0x0001), .driver_info = BTUSB_CSR },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) /* Broadcom BCM2033 without firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) { USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) /* Broadcom BCM2045 devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) { USB_DEVICE(0x0a5c, 0x2045), .driver_info = BTUSB_BCM2045 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) /* Atheros 3011 with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) { USB_DEVICE(0x04f2, 0xaff1), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) { USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) /* Atheros AR9285 Malbec with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) /* Atheros 3012 with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) { USB_DEVICE(0x04ca, 0x3018), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) { USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) { USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) { USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) { USB_DEVICE(0x0cf3, 0x311f), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) { USB_DEVICE(0x0cf3, 0x817a), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) { USB_DEVICE(0x0cf3, 0x817b), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) { USB_DEVICE(0x0cf3, 0xe006), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) /* Atheros AR5BBU12 with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) /* Atheros AR5BBU12 with sflash firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) { USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /* QCA ROME chipset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) { USB_DEVICE(0x0cf3, 0x535b), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) { USB_DEVICE(0x0cf3, 0xe007), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) { USB_DEVICE(0x0cf3, 0xe009), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) { USB_DEVICE(0x0cf3, 0xe010), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) { USB_DEVICE(0x0cf3, 0xe300), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) { USB_DEVICE(0x0cf3, 0xe301), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) { USB_DEVICE(0x0cf3, 0xe360), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) { USB_DEVICE(0x0cf3, 0xe500), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) { USB_DEVICE(0x0489, 0xe092), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) { USB_DEVICE(0x0489, 0xe09f), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) { USB_DEVICE(0x0489, 0xe0a2), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) { USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) { USB_DEVICE(0x04ca, 0x3015), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) { USB_DEVICE(0x04ca, 0x3016), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) { USB_DEVICE(0x04ca, 0x301a), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) { USB_DEVICE(0x04ca, 0x3021), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) { USB_DEVICE(0x13d3, 0x3491), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) { USB_DEVICE(0x13d3, 0x3496), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) { USB_DEVICE(0x13d3, 0x3501), .driver_info = BTUSB_QCA_ROME |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /* QCA WCN6855 chipset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) { USB_DEVICE(0x0cf3, 0xe600), .driver_info = BTUSB_QCA_WCN6855 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) /* Broadcom BCM2035 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) /* Broadcom BCM2045 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) { USB_DEVICE(0x0a5c, 0x2039), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) { USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) /* IBM/Lenovo ThinkPad with Broadcom chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) { USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) { USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) /* HP laptop with Broadcom chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) { USB_DEVICE(0x03f0, 0x171d), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) /* Dell laptop with Broadcom chip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) { USB_DEVICE(0x413c, 0x8126), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) /* Dell Wireless 370 and 410 devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) { USB_DEVICE(0x413c, 0x8152), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) { USB_DEVICE(0x413c, 0x8156), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) /* Belkin F8T012 and F8T013 devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) { USB_DEVICE(0x050d, 0x0012), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) { USB_DEVICE(0x050d, 0x0013), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) /* Asus WL-BTD202 device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) { USB_DEVICE(0x0b05, 0x1715), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) /* Kensington Bluetooth USB adapter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) { USB_DEVICE(0x047d, 0x105e), .driver_info = BTUSB_WRONG_SCO_MTU },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) /* RTX Telecom based adapters with buggy SCO support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) { USB_DEVICE(0x0400, 0x0807), .driver_info = BTUSB_BROKEN_ISOC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) { USB_DEVICE(0x0400, 0x080a), .driver_info = BTUSB_BROKEN_ISOC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) /* CONWISE Technology based adapters with buggy SCO support */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) { USB_DEVICE(0x0e5e, 0x6622),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) .driver_info = BTUSB_BROKEN_ISOC | BTUSB_CW6622},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) /* Roper Class 1 Bluetooth Dongle (Silicon Wave based) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) { USB_DEVICE(0x1310, 0x0001), .driver_info = BTUSB_SWAVE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) /* Digianswer devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) { USB_DEVICE(0x08fd, 0x0001), .driver_info = BTUSB_DIGIANSWER },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) { USB_DEVICE(0x08fd, 0x0002), .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) /* CSR BlueCore Bluetooth Sniffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) { USB_DEVICE(0x0a12, 0x0002),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) .driver_info = BTUSB_SNIFFER | BTUSB_BROKEN_ISOC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) /* Frontline ComProbe Bluetooth Sniffer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) { USB_DEVICE(0x16d3, 0x0002),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) .driver_info = BTUSB_SNIFFER | BTUSB_BROKEN_ISOC },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) /* Marvell Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) { USB_DEVICE(0x1286, 0x2044), .driver_info = BTUSB_MARVELL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) { USB_DEVICE(0x1286, 0x2046), .driver_info = BTUSB_MARVELL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) { USB_DEVICE(0x1286, 0x204e), .driver_info = BTUSB_MARVELL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) /* Intel Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) { USB_DEVICE(0x8087, 0x0025), .driver_info = BTUSB_INTEL_NEW |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) BTUSB_WIDEBAND_SPEECH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) BTUSB_VALID_LE_STATES },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) { USB_DEVICE(0x8087, 0x0026), .driver_info = BTUSB_INTEL_NEW |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) { USB_DEVICE(0x8087, 0x0029), .driver_info = BTUSB_INTEL_NEW |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) { USB_DEVICE(0x8087, 0x0032), .driver_info = BTUSB_INTEL_NEWGEN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) BTUSB_WIDEBAND_SPEECH},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) { USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) { USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) { USB_DEVICE(0x8087, 0x0a2a), .driver_info = BTUSB_INTEL },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) { USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) { USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) BTUSB_WIDEBAND_SPEECH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) BTUSB_VALID_LE_STATES },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) { USB_DEVICE(0x10ab, 0x9309), .driver_info = BTUSB_QCA_WCN6855 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) BTUSB_WIDEBAND_SPEECH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) BTUSB_VALID_LE_STATES },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) { USB_DEVICE(0x10ab, 0x9409), .driver_info = BTUSB_QCA_WCN6855 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) BTUSB_WIDEBAND_SPEECH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) BTUSB_VALID_LE_STATES },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) { USB_DEVICE(0x0489, 0xe0d0), .driver_info = BTUSB_QCA_WCN6855 |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) BTUSB_WIDEBAND_SPEECH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) BTUSB_VALID_LE_STATES },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) /* Other Intel Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) { USB_VENDOR_AND_INTERFACE_INFO(0x8087, 0xe0, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) .driver_info = BTUSB_IGNORE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) /* Realtek 8822CE Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) { USB_DEVICE(0x0bda, 0xb00c), .driver_info = BTUSB_REALTEK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) { USB_DEVICE(0x0bda, 0xc822), .driver_info = BTUSB_REALTEK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) BTUSB_WIDEBAND_SPEECH },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) /* Realtek Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) { USB_VENDOR_AND_INTERFACE_INFO(0x0bda, 0xe0, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) /* MediaTek Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) { USB_VENDOR_AND_INTERFACE_INFO(0x0e8d, 0xe0, 0x01, 0x01),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) .driver_info = BTUSB_MEDIATEK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) BTUSB_WIDEBAND_SPEECH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) BTUSB_VALID_LE_STATES },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) /* MediaTek MT7922A Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) { USB_DEVICE(0x0489, 0xe0d8), .driver_info = BTUSB_MEDIATEK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) BTUSB_WIDEBAND_SPEECH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) BTUSB_VALID_LE_STATES },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) { USB_DEVICE(0x0489, 0xe0d9), .driver_info = BTUSB_MEDIATEK |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) BTUSB_WIDEBAND_SPEECH |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) BTUSB_VALID_LE_STATES },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) /* Additional Realtek 8723AE Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) { USB_DEVICE(0x13d3, 0x3394), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) /* Additional Realtek 8723BE Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) { USB_DEVICE(0x0489, 0xe085), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) { USB_DEVICE(0x0489, 0xe08b), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) { USB_DEVICE(0x13d3, 0x3410), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) { USB_DEVICE(0x13d3, 0x3416), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) { USB_DEVICE(0x13d3, 0x3459), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) { USB_DEVICE(0x13d3, 0x3494), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) /* Additional Realtek 8723BU Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) { USB_DEVICE(0x7392, 0xa611), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) /* Additional Realtek 8723DE Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) { USB_DEVICE(0x0bda, 0xb009), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) { USB_DEVICE(0x2ff8, 0xb011), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) /* Additional Realtek 8821AE Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) { USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) { USB_DEVICE(0x13d3, 0x3458), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) { USB_DEVICE(0x13d3, 0x3461), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) { USB_DEVICE(0x13d3, 0x3462), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) /* Additional Realtek 8822BE Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) { USB_DEVICE(0x13d3, 0x3526), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) { USB_DEVICE(0x0b05, 0x185c), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) /* Additional Realtek 8822CE Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) { USB_DEVICE(0x04ca, 0x4005), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) { USB_DEVICE(0x13d3, 0x3548), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) /* Realtek 8852BE Bluetooth devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) { USB_DEVICE(0x0bda, 0xb85b), .driver_info = BTUSB_REALTEK },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) /* Silicon Wave based devices */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) { USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_SWAVE },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) { } /* Terminating entry */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) /* The Bluetooth USB module build into some devices needs to be reset on resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) * this is a problem with the platform (likely shutting off all power) not with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) * the module itself. So we use a DMI list to match known broken platforms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) static const struct dmi_system_id btusb_needs_reset_resume_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) /* Dell OptiPlex 3060 (QCA ROME device 0cf3:e007) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 3060"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) /* Dell XPS 9360 (QCA ROME device 0cf3:e300) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9360"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) /* Dell Inspiron 5565 (QCA ROME device 0cf3:e009) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) .matches = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5565"),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) #define BTUSB_MAX_ISOC_FRAMES 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) #define BTUSB_INTR_RUNNING 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) #define BTUSB_BULK_RUNNING 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) #define BTUSB_ISOC_RUNNING 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) #define BTUSB_SUSPENDING 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) #define BTUSB_DID_ISO_RESUME 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) #define BTUSB_BOOTLOADER 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) #define BTUSB_DOWNLOADING 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) #define BTUSB_FIRMWARE_LOADED 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) #define BTUSB_FIRMWARE_FAILED 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) #define BTUSB_BOOTING 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) #define BTUSB_DIAG_RUNNING 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) #define BTUSB_OOB_WAKE_ENABLED 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) #define BTUSB_HW_RESET_ACTIVE 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) #define BTUSB_TX_WAIT_VND_EVT 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) #define BTUSB_WAKEUP_DISABLE 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) #define BTUSB_USE_ALT3_FOR_WBS 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) struct btusb_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) struct hci_dev *hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) struct usb_device *udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) struct usb_interface *intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) struct usb_interface *isoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) struct usb_interface *diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) unsigned isoc_ifnum;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) struct work_struct work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) struct work_struct waker;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) struct usb_anchor deferred;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) struct usb_anchor tx_anchor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) int tx_in_flight;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) spinlock_t txlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) struct usb_anchor intr_anchor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) struct usb_anchor bulk_anchor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) struct usb_anchor isoc_anchor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) struct usb_anchor diag_anchor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) struct usb_anchor ctrl_anchor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) spinlock_t rxlock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) struct sk_buff *evt_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) struct sk_buff *acl_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) struct sk_buff *sco_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) struct usb_endpoint_descriptor *intr_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) struct usb_endpoint_descriptor *bulk_tx_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) struct usb_endpoint_descriptor *bulk_rx_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) struct usb_endpoint_descriptor *isoc_tx_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) struct usb_endpoint_descriptor *isoc_rx_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) struct usb_endpoint_descriptor *diag_tx_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) struct usb_endpoint_descriptor *diag_rx_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) struct gpio_desc *reset_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) __u8 cmdreq_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) __u8 cmdreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) unsigned int sco_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) unsigned int air_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) bool usb_alt6_packet_flow;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) int isoc_altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) int suspend_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) int (*recv_event)(struct hci_dev *hdev, struct sk_buff *skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) int (*recv_bulk)(struct btusb_data *data, void *buffer, int count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) int (*setup_on_usb)(struct hci_dev *hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) int oob_wake_irq; /* irq for out-of-band wake-on-bt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) unsigned cmd_timeout_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) static void btusb_intel_cmd_timeout(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) struct gpio_desc *reset_gpio = data->reset_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) if (++data->cmd_timeout_cnt < 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) if (!reset_gpio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) bt_dev_err(hdev, "No way to reset. Ignoring and continuing");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) * Toggle the hard reset line if the platform provides one. The reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) * is going to yank the device off the USB and then replug. So doing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) * once is enough. The cleanup is handled correctly on the way out
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) * (standard USB disconnect), and the new device is detected cleanly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) * and bound to the driver again like it should be.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) bt_dev_err(hdev, "last reset failed? Not resetting again");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) bt_dev_err(hdev, "Initiating HW reset via gpio");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) gpiod_set_value_cansleep(reset_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) msleep(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) gpiod_set_value_cansleep(reset_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) static void btusb_rtl_cmd_timeout(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) struct gpio_desc *reset_gpio = data->reset_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) if (++data->cmd_timeout_cnt < 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) if (!reset_gpio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) bt_dev_err(hdev, "No gpio to reset Realtek device, ignoring");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) /* Toggle the hard reset line. The Realtek device is going to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) * yank itself off the USB and then replug. The cleanup is handled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) * correctly on the way out (standard USB disconnect), and the new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) * device is detected cleanly and bound to the driver again like
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) * it should be.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if (test_and_set_bit(BTUSB_HW_RESET_ACTIVE, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) bt_dev_err(hdev, "last reset failed? Not resetting again");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) bt_dev_err(hdev, "Reset Realtek device via gpio");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) gpiod_set_value_cansleep(reset_gpio, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) msleep(200);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) gpiod_set_value_cansleep(reset_gpio, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) static void btusb_qca_cmd_timeout(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) if (++data->cmd_timeout_cnt < 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) bt_dev_err(hdev, "Multiple cmd timeouts seen. Resetting usb device.");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) /* This is not an unbalanced PM reference since the device will reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) err = usb_autopm_get_interface(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if (!err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) usb_queue_reset_device(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) bt_dev_err(hdev, "Failed usb_autopm_get_interface with %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) static inline void btusb_free_frags(struct btusb_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) spin_lock_irqsave(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) kfree_skb(data->evt_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) data->evt_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) kfree_skb(data->acl_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) data->acl_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) kfree_skb(data->sco_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) data->sco_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) spin_unlock_irqrestore(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) spin_lock_irqsave(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) skb = data->evt_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) skb = bt_skb_alloc(HCI_MAX_EVENT_SIZE, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) hci_skb_expect(skb) = HCI_EVENT_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) len = min_t(uint, hci_skb_expect(skb), count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) skb_put_data(skb, buffer, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) count -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) buffer += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) hci_skb_expect(skb) -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) if (skb->len == HCI_EVENT_HDR_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) /* Complete event header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) hci_skb_expect(skb) = hci_event_hdr(skb)->plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) if (skb_tailroom(skb) < hci_skb_expect(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) err = -EILSEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) if (!hci_skb_expect(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) /* Complete frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) data->recv_event(data->hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) data->evt_skb = skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) spin_unlock_irqrestore(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) spin_lock_irqsave(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) skb = data->acl_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) hci_skb_pkt_type(skb) = HCI_ACLDATA_PKT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) hci_skb_expect(skb) = HCI_ACL_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) len = min_t(uint, hci_skb_expect(skb), count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) skb_put_data(skb, buffer, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) count -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) buffer += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) hci_skb_expect(skb) -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) if (skb->len == HCI_ACL_HDR_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) __le16 dlen = hci_acl_hdr(skb)->dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) /* Complete ACL header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) hci_skb_expect(skb) = __le16_to_cpu(dlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) if (skb_tailroom(skb) < hci_skb_expect(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) err = -EILSEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if (!hci_skb_expect(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) /* Complete frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) hci_recv_frame(data->hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) data->acl_skb = skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) spin_unlock_irqrestore(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) spin_lock_irqsave(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) skb = data->sco_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) skb = bt_skb_alloc(HCI_MAX_SCO_SIZE, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) err = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) hci_skb_pkt_type(skb) = HCI_SCODATA_PKT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) hci_skb_expect(skb) = HCI_SCO_HDR_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) len = min_t(uint, hci_skb_expect(skb), count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) skb_put_data(skb, buffer, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) count -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) buffer += len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) hci_skb_expect(skb) -= len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) if (skb->len == HCI_SCO_HDR_SIZE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) /* Complete SCO header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) hci_skb_expect(skb) = hci_sco_hdr(skb)->dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) if (skb_tailroom(skb) < hci_skb_expect(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) err = -EILSEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) if (!hci_skb_expect(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) /* Complete frame */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) hci_recv_frame(data->hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) data->sco_skb = skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) spin_unlock_irqrestore(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) static void btusb_intr_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) struct hci_dev *hdev = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) if (!test_bit(HCI_RUNNING, &hdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) if (urb->status == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) hdev->stat.byte_rx += urb->actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) if (btusb_recv_intr(data, urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) urb->actual_length) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) bt_dev_err(hdev, "corrupted event packet");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) hdev->stat.err_rx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) } else if (urb->status == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) /* Avoid suspend failed when usb_kill_urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) if (!test_bit(BTUSB_INTR_RUNNING, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) usb_mark_last_busy(data->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) usb_anchor_urb(urb, &data->intr_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) err = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) /* -EPERM: urb is being killed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) * -ENODEV: device got disconnected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) unsigned char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) int err, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) if (!data->intr_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) urb = usb_alloc_urb(0, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) size = le16_to_cpu(data->intr_ep->wMaxPacketSize);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) buf = kmalloc(size, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) if (!buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) usb_fill_int_urb(urb, data->udev, pipe, buf, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) btusb_intr_complete, hdev, data->intr_ep->bInterval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) urb->transfer_flags |= URB_FREE_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) usb_anchor_urb(urb, &data->intr_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) err = usb_submit_urb(urb, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) bt_dev_err(hdev, "urb %p submission failed (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) static void btusb_bulk_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) struct hci_dev *hdev = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) if (!test_bit(HCI_RUNNING, &hdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) if (urb->status == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) hdev->stat.byte_rx += urb->actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) if (data->recv_bulk(data, urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) urb->actual_length) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) bt_dev_err(hdev, "corrupted ACL packet");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) hdev->stat.err_rx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) } else if (urb->status == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) /* Avoid suspend failed when usb_kill_urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950) if (!test_bit(BTUSB_BULK_RUNNING, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) usb_anchor_urb(urb, &data->bulk_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) usb_mark_last_busy(data->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) err = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) /* -EPERM: urb is being killed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) * -ENODEV: device got disconnected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) unsigned char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) int err, size = HCI_MAX_FRAME_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) if (!data->bulk_rx_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) urb = usb_alloc_urb(0, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) buf = kmalloc(size, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) if (!buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) btusb_bulk_complete, hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) urb->transfer_flags |= URB_FREE_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) usb_mark_last_busy(data->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) usb_anchor_urb(urb, &data->bulk_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) err = usb_submit_urb(urb, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) bt_dev_err(hdev, "urb %p submission failed (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) static void btusb_isoc_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) struct hci_dev *hdev = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) int i, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) if (!test_bit(HCI_RUNNING, &hdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) if (urb->status == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) for (i = 0; i < urb->number_of_packets; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) unsigned int offset = urb->iso_frame_desc[i].offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) unsigned int length = urb->iso_frame_desc[i].actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) if (urb->iso_frame_desc[i].status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) hdev->stat.byte_rx += length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) if (btusb_recv_isoc(data, urb->transfer_buffer + offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) length) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038) bt_dev_err(hdev, "corrupted SCO packet");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) hdev->stat.err_rx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) } else if (urb->status == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) /* Avoid suspend failed when usb_kill_urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050) usb_anchor_urb(urb, &data->isoc_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) err = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) /* -EPERM: urb is being killed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) * -ENODEV: device got disconnected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) static inline void __fill_isoc_descriptor_msbc(struct urb *urb, int len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) int mtu, struct btusb_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) int i, offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) unsigned int interval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) BT_DBG("len %d mtu %d", len, mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /* For mSBC ALT 6 setting the host will send the packet at continuous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) * flow. As per core spec 5, vol 4, part B, table 2.1. For ALT setting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) * 6 the HCI PACKET INTERVAL should be 7.5ms for every usb packets.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) * To maintain the rate we send 63bytes of usb packets alternatively for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) * 7ms and 8ms to maintain the rate as 7.5ms.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) if (data->usb_alt6_packet_flow) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) interval = 7;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) data->usb_alt6_packet_flow = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) interval = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) data->usb_alt6_packet_flow = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) for (i = 0; i < interval; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) urb->iso_frame_desc[i].offset = offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) urb->iso_frame_desc[i].length = offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) if (len && i < BTUSB_MAX_ISOC_FRAMES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) urb->iso_frame_desc[i].offset = offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) urb->iso_frame_desc[i].length = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) urb->number_of_packets = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) int i, offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) BT_DBG("len %d mtu %d", len, mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) i++, offset += mtu, len -= mtu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) urb->iso_frame_desc[i].offset = offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) urb->iso_frame_desc[i].length = mtu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (len && i < BTUSB_MAX_ISOC_FRAMES) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) urb->iso_frame_desc[i].offset = offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) urb->iso_frame_desc[i].length = len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) i++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) urb->number_of_packets = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) unsigned char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) int err, size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) if (!data->isoc_rx_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) BTUSB_MAX_ISOC_FRAMES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) buf = kmalloc(size, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) if (!buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) hdev, data->isoc_rx_ep->bInterval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) __fill_isoc_descriptor(urb, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) usb_anchor_urb(urb, &data->isoc_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) err = usb_submit_urb(urb, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) bt_dev_err(hdev, "urb %p submission failed (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) static void btusb_diag_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) struct hci_dev *hdev = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) if (urb->status == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) skb = bt_skb_alloc(urb->actual_length, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) if (skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) skb_put_data(skb, urb->transfer_buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) hci_recv_diag(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) } else if (urb->status == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) /* Avoid suspend failed when usb_kill_urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) if (!test_bit(BTUSB_DIAG_RUNNING, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) usb_anchor_urb(urb, &data->diag_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) usb_mark_last_busy(data->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) err = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) /* -EPERM: urb is being killed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) * -ENODEV: device got disconnected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) static int btusb_submit_diag_urb(struct hci_dev *hdev, gfp_t mem_flags)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) unsigned char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) int err, size = HCI_MAX_FRAME_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) if (!data->diag_rx_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) urb = usb_alloc_urb(0, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) buf = kmalloc(size, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231) if (!buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) pipe = usb_rcvbulkpipe(data->udev, data->diag_rx_ep->bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) btusb_diag_complete, hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) urb->transfer_flags |= URB_FREE_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) usb_mark_last_busy(data->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) usb_anchor_urb(urb, &data->diag_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) err = usb_submit_urb(urb, mem_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) bt_dev_err(hdev, "urb %p submission failed (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) static void btusb_tx_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) struct sk_buff *skb = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) struct hci_dev *hdev = (struct hci_dev *)skb->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) if (!test_bit(HCI_RUNNING, &hdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) if (!urb->status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) hdev->stat.byte_tx += urb->transfer_buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) hdev->stat.err_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) spin_lock_irqsave(&data->txlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) data->tx_in_flight--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) spin_unlock_irqrestore(&data->txlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) static void btusb_isoc_tx_complete(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) struct sk_buff *skb = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) struct hci_dev *hdev = (struct hci_dev *)skb->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) if (!test_bit(HCI_RUNNING, &hdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) if (!urb->status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) hdev->stat.byte_tx += urb->transfer_buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) hdev->stat.err_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) static int btusb_open(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) err = usb_autopm_get_interface(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) /* Patching USB firmware files prior to starting any URBs of HCI path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) * It is more safe to use USB bulk channel for downloading USB patch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) if (data->setup_on_usb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) err = data->setup_on_usb(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) goto setup_fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) data->intf->needs_remote_wakeup = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) /* Disable device remote wakeup when host is suspended
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) * For Realtek chips, global suspend without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) * SET_FEATURE (DEVICE_REMOTE_WAKEUP) can save more power in device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) device_wakeup_disable(&data->udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) err = btusb_submit_intr_urb(hdev, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) err = btusb_submit_bulk_urb(hdev, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347) usb_kill_anchored_urbs(&data->intr_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) set_bit(BTUSB_BULK_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) btusb_submit_bulk_urb(hdev, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) if (data->diag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) if (!btusb_submit_diag_urb(hdev, GFP_KERNEL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) set_bit(BTUSB_DIAG_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) usb_autopm_put_interface(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364) clear_bit(BTUSB_INTR_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) setup_fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) usb_autopm_put_interface(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370) static void btusb_stop_traffic(struct btusb_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) usb_kill_anchored_urbs(&data->intr_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) usb_kill_anchored_urbs(&data->bulk_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374) usb_kill_anchored_urbs(&data->isoc_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) usb_kill_anchored_urbs(&data->diag_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376) usb_kill_anchored_urbs(&data->ctrl_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) static int btusb_close(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386) cancel_work_sync(&data->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) cancel_work_sync(&data->waker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) clear_bit(BTUSB_BULK_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) clear_bit(BTUSB_INTR_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) clear_bit(BTUSB_DIAG_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) btusb_stop_traffic(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) btusb_free_frags(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) err = usb_autopm_get_interface(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) data->intf->needs_remote_wakeup = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) /* Enable remote wake up for auto-suspend */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) data->intf->needs_remote_wakeup = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) usb_autopm_put_interface(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) usb_scuttle_anchored_urbs(&data->deferred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) static int btusb_flush(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) usb_kill_anchored_urbs(&data->tx_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) btusb_free_frags(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) struct usb_ctrlrequest *dr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433) urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) dr = kmalloc(sizeof(*dr), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) if (!dr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) dr->bRequestType = data->cmdreq_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) dr->bRequest = data->cmdreq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) dr->wIndex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) dr->wValue = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) dr->wLength = __cpu_to_le16(skb->len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) pipe = usb_sndctrlpipe(data->udev, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) usb_fill_control_urb(urb, data->udev, pipe, (void *)dr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452) skb->data, skb->len, btusb_tx_complete, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) skb->dev = (void *)hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) return urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) static struct urb *alloc_bulk_urb(struct hci_dev *hdev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465) if (!data->bulk_tx_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) usb_fill_bulk_urb(urb, data->udev, pipe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) skb->data, skb->len, btusb_tx_complete, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) skb->dev = (void *)hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) return urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) static struct urb *alloc_isoc_urb(struct hci_dev *hdev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488) if (!data->isoc_tx_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) usb_fill_int_urb(urb, data->udev, pipe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) skb->data, skb->len, btusb_isoc_tx_complete,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) skb, data->isoc_tx_ep->bInterval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) urb->transfer_flags = URB_ISO_ASAP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) if (data->isoc_altsetting == 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) __fill_isoc_descriptor_msbc(urb, skb->len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) __fill_isoc_descriptor(urb, skb->len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510) skb->dev = (void *)hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) return urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) static int submit_tx_urb(struct hci_dev *hdev, struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) usb_anchor_urb(urb, &data->tx_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) err = usb_submit_urb(urb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) bt_dev_err(hdev, "urb %p submission failed (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) usb_mark_last_busy(data->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) static int submit_or_queue_tx_urb(struct hci_dev *hdev, struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) bool suspending;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) spin_lock_irqsave(&data->txlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) suspending = test_bit(BTUSB_SUSPENDING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) if (!suspending)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546) data->tx_in_flight++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) spin_unlock_irqrestore(&data->txlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549) if (!suspending)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) return submit_tx_urb(hdev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) usb_anchor_urb(urb, &data->deferred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) schedule_work(&data->waker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) switch (hci_skb_pkt_type(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) case HCI_COMMAND_PKT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) urb = alloc_ctrl_urb(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) if (IS_ERR(urb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) return PTR_ERR(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571) hdev->stat.cmd_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) return submit_or_queue_tx_urb(hdev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) case HCI_ACLDATA_PKT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) urb = alloc_bulk_urb(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576) if (IS_ERR(urb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) return PTR_ERR(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) hdev->stat.acl_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) return submit_or_queue_tx_urb(hdev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) case HCI_SCODATA_PKT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) if (hci_conn_num(hdev, SCO_LINK) < 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) urb = alloc_isoc_urb(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) if (IS_ERR(urb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) return PTR_ERR(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) hdev->stat.sco_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) return submit_tx_urb(hdev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594) return -EILSEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) BT_DBG("%s evt %d", hdev->name, evt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) data->sco_num = hci_conn_num(hdev, SCO_LINK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605) data->air_mode = evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) schedule_work(&data->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) struct usb_interface *intf = data->isoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) struct usb_endpoint_descriptor *ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) int i, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) if (!data->isoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) err = usb_set_interface(data->udev, data->isoc_ifnum, altsetting);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) bt_dev_err(hdev, "setting interface failed (%d)", -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) data->isoc_altsetting = altsetting;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628) data->isoc_tx_ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) data->isoc_rx_ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) ep_desc = &intf->cur_altsetting->endpoint[i].desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) data->isoc_tx_ep = ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) data->isoc_rx_ep = ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) if (!data->isoc_tx_ep || !data->isoc_rx_ep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) bt_dev_err(hdev, "invalid SCO descriptors");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) static int btusb_switch_alt_setting(struct hci_dev *hdev, int new_alts)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) if (data->isoc_altsetting != new_alts) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) usb_kill_anchored_urbs(&data->isoc_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) /* When isochronous alternate setting needs to be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) * changed, because SCO connection has been added
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) * or removed, a packet fragment may be left in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667) * reassembling state. This could lead to wrongly
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) * assembled fragments.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) * Clear outstanding fragment when selecting a new
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) * alternate setting.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) spin_lock_irqsave(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) kfree_skb(data->sco_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) data->sco_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) spin_unlock_irqrestore(&data->rxlock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) err = __set_isoc_interface(hdev, new_alts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) if (btusb_submit_isoc_urb(hdev, GFP_KERNEL) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) btusb_submit_isoc_urb(hdev, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) static struct usb_host_interface *btusb_find_altsetting(struct btusb_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) int alt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696) struct usb_interface *intf = data->isoc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) BT_DBG("Looking for Alt no :%d", alt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) if (!intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) for (i = 0; i < intf->num_altsetting; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) if (intf->altsetting[i].desc.bAlternateSetting == alt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) return &intf->altsetting[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) static void btusb_work(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) struct btusb_data *data = container_of(work, struct btusb_data, work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715) struct hci_dev *hdev = data->hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) int new_alts = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) if (data->sco_num > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) usb_kill_anchored_urbs(&data->isoc_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728) set_bit(BTUSB_DID_ISO_RESUME, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_CVSD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) if (hdev->voice_setting & 0x0020) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733) static const int alts[3] = { 2, 4, 5 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735) new_alts = alts[data->sco_num - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) new_alts = data->sco_num;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739) } else if (data->air_mode == HCI_NOTIFY_ENABLE_SCO_TRANSP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) /* Bluetooth USB spec recommends alt 6 (63 bytes), but
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) * many adapters do not support it. Alt 1 appears to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742) * work for all adapters that do not have alt 6, and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) * which work with WBS at all. Some devices prefer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) * alt 3 (HCI payload >= 60 Bytes let air packet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) * data satisfy 60 bytes), requiring
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746) * MTU >= 3 (packets) * 25 (size) - 3 (headers) = 72
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) * see also Core spec 5, vol 4, B 2.1.1 & Table 2.1.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) if (btusb_find_altsetting(data, 6))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) new_alts = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) else if (btusb_find_altsetting(data, 3) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752) hdev->sco_mtu >= 72 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) test_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) new_alts = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756) new_alts = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) if (btusb_switch_alt_setting(hdev, new_alts) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) bt_dev_err(hdev, "set USB alt:(%d) failed!", new_alts);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) usb_kill_anchored_urbs(&data->isoc_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) __set_isoc_interface(hdev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) usb_autopm_put_interface(data->isoc ? data->isoc : data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) static void btusb_waker(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) struct btusb_data *data = container_of(work, struct btusb_data, waker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) err = usb_autopm_get_interface(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) usb_autopm_put_interface(data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) static int btusb_setup_bcm92035(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) u8 val = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) skb = __hci_cmd_sync(hdev, 0xfc3b, 1, &val, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) if (IS_ERR(skb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792) bt_dev_err(hdev, "BCM92035 command failed (%ld)", PTR_ERR(skb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) static int btusb_setup_csr(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) u16 bcdDevice = le16_to_cpu(data->udev->descriptor.bcdDevice);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) struct hci_rp_read_local_version *rp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) bool is_fake = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810) HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) int err = PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) bt_dev_err(hdev, "CSR: Local version failed (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) if (skb->len != sizeof(struct hci_rp_read_local_version)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) bt_dev_err(hdev, "CSR: Local version length mismatch");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) rp = (struct hci_rp_read_local_version *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) /* Detect a wide host of Chinese controllers that aren't CSR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) * Known fake bcdDevices: 0x0100, 0x0134, 0x1915, 0x2520, 0x7558, 0x8891
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829) * The main thing they have in common is that these are really popular low-cost
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) * options that support newer Bluetooth versions but rely on heavy VID/PID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) * squatting of this poor old Bluetooth 1.1 device. Even sold as such.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833) * We detect actual CSR devices by checking that the HCI manufacturer code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) * is Cambridge Silicon Radio (10) and ensuring that LMP sub-version and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) * HCI rev values always match. As they both store the firmware number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837) if (le16_to_cpu(rp->manufacturer) != 10 ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) le16_to_cpu(rp->hci_rev) != le16_to_cpu(rp->lmp_subver))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) is_fake = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) /* Known legit CSR firmware build numbers and their supported BT versions:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) * - 1.1 (0x1) -> 0x0073, 0x020d, 0x033c, 0x034e
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) * - 1.2 (0x2) -> 0x04d9, 0x0529
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) * - 2.0 (0x3) -> 0x07a6, 0x07ad, 0x0c5c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) * - 2.1 (0x4) -> 0x149c, 0x1735, 0x1899 (0x1899 is a BlueCore4-External)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) * - 4.0 (0x6) -> 0x1d86, 0x2031, 0x22bb
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) * e.g. Real CSR dongles with LMP subversion 0x73 are old enough that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) * support BT 1.1 only; so it's a dead giveaway when some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850) * third-party BT 4.0 dongle reuses it.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) else if (le16_to_cpu(rp->lmp_subver) <= 0x034e &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_1_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854) is_fake = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) else if (le16_to_cpu(rp->lmp_subver) <= 0x0529 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_1_2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858) is_fake = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860) else if (le16_to_cpu(rp->lmp_subver) <= 0x0c5c &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_2_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) is_fake = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) else if (le16_to_cpu(rp->lmp_subver) <= 0x1899 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_2_1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) is_fake = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) else if (le16_to_cpu(rp->lmp_subver) <= 0x22bb &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) le16_to_cpu(rp->hci_ver) > BLUETOOTH_VER_4_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870) is_fake = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) /* Other clones which beat all the above checks */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) else if (bcdDevice == 0x0134 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) le16_to_cpu(rp->lmp_subver) == 0x0c5c &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) le16_to_cpu(rp->hci_ver) == BLUETOOTH_VER_2_0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) is_fake = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878) if (is_fake) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) bt_dev_warn(hdev, "CSR: Unbranded CSR clone detected; adding workarounds...");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) /* Generally these clones have big discrepancies between
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882) * advertised features and what's actually supported.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) * Probably will need to be expanded in the future;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) * without these the controller will lock up.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) set_bit(HCI_QUIRK_BROKEN_ERR_DATA_REPORTING, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) /* Clear the reset quirk since this is not an actual
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) * early Bluetooth 1.1 device from CSR.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893) clear_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) static const struct firmware *btusb_setup_intel_get_fw(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) struct intel_version *ver)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905) char fwname[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) snprintf(fwname, sizeof(fwname),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909) "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) ver->hw_platform, ver->hw_variant, ver->hw_revision,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) ver->fw_variant, ver->fw_revision, ver->fw_build_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912) ver->fw_build_ww, ver->fw_build_yy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) ret = request_firmware(&fw, fwname, &hdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) if (ret == -EINVAL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) bt_dev_err(hdev, "Intel firmware file request failed (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) bt_dev_err(hdev, "failed to open Intel firmware file: %s (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) fwname, ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) /* If the correct firmware patch file is not found, use the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) * default firmware patch file instead
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929) ver->hw_platform, ver->hw_variant);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930) if (request_firmware(&fw, fwname, &hdev->dev) < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) bt_dev_err(hdev, "failed to open default fw file: %s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) fwname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) bt_dev_info(hdev, "Intel Bluetooth firmware file: %s", fwname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) return fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942) static int btusb_setup_intel_patching(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) const struct firmware *fw,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) const u8 **fw_ptr, int *disable_patch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) struct hci_command_hdr *cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) const u8 *cmd_param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) struct hci_event_hdr *evt = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950) const u8 *evt_param = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) int remain = fw->size - (*fw_ptr - fw->data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) /* The first byte indicates the types of the patch command or event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) * 0x01 means HCI command and 0x02 is HCI event. If the first bytes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) * in the current firmware buffer doesn't start with 0x01 or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) * the size of remain buffer is smaller than HCI command header,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) * the firmware file is corrupted and it should stop the patching
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) * process.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) if (remain > HCI_COMMAND_HDR_SIZE && *fw_ptr[0] != 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961) bt_dev_err(hdev, "Intel fw corrupted: invalid cmd read");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) (*fw_ptr)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) remain--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) cmd = (struct hci_command_hdr *)(*fw_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) *fw_ptr += sizeof(*cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969) remain -= sizeof(*cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) /* Ensure that the remain firmware data is long enough than the length
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) * of command parameter. If not, the firmware file is corrupted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) if (remain < cmd->plen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) bt_dev_err(hdev, "Intel fw corrupted: invalid cmd len");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) /* If there is a command that loads a patch in the firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) * file, then enable the patch upon success, otherwise just
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981) * disable the manufacturer mode, for example patch activation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) * is not required when the default firmware patch file is used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) * because there are no patch data to load.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) if (*disable_patch && le16_to_cpu(cmd->opcode) == 0xfc8e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) *disable_patch = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) cmd_param = *fw_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) *fw_ptr += cmd->plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) remain -= cmd->plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) /* This reads the expected events when the above command is sent to the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) * device. Some vendor commands expects more than one events, for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) * example command status event followed by vendor specific event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) * For this case, it only keeps the last expected event. so the command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) * can be sent with __hci_cmd_sync_ev() which returns the sk_buff of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) * last expected event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) while (remain > HCI_EVENT_HDR_SIZE && *fw_ptr[0] == 0x02) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) (*fw_ptr)++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) remain--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) evt = (struct hci_event_hdr *)(*fw_ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) *fw_ptr += sizeof(*evt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) remain -= sizeof(*evt);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) if (remain < evt->plen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) bt_dev_err(hdev, "Intel fw corrupted: invalid evt len");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) evt_param = *fw_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) *fw_ptr += evt->plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014) remain -= evt->plen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) /* Every HCI commands in the firmware file has its correspond event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) * If event is not found or remain is smaller than zero, the firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) * file is corrupted.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) if (!evt || !evt_param || remain < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) bt_dev_err(hdev, "Intel fw corrupted: invalid evt read");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) skb = __hci_cmd_sync_ev(hdev, le16_to_cpu(cmd->opcode), cmd->plen,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) cmd_param, evt->evt, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) bt_dev_err(hdev, "sending Intel patch command (0x%4.4x) failed (%ld)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) cmd->opcode, PTR_ERR(skb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031) return PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034) /* It ensures that the returned event matches the event data read from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) * the firmware file. At fist, it checks the length and then
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) * the contents of the event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038) if (skb->len != evt->plen) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) bt_dev_err(hdev, "mismatch event length (opcode 0x%4.4x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) le16_to_cpu(cmd->opcode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045) if (memcmp(skb->data, evt_param, evt->plen)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) bt_dev_err(hdev, "mismatch event parameter (opcode 0x%4.4x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) le16_to_cpu(cmd->opcode));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) static int btusb_setup_intel(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) const u8 *fw_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) int disable_patch, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) struct intel_version ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) /* The controller has a bug with the first HCI command sent to it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) * returning number of completed commands as zero. This would stall the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) * command processing in the Bluetooth core.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) * As a workaround, send HCI Reset command first which will reset the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) * number of completed commands and allow normal command processing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) * from now on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074) skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) bt_dev_err(hdev, "sending initial HCI reset command failed (%ld)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077) PTR_ERR(skb));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) return PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) /* Read Intel specific controller version first to allow selection of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) * which firmware file to load.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) * The returned information are hardware variant and revision plus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) * firmware variant, revision and build number.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) err = btintel_read_version(hdev, &ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) bt_dev_info(hdev, "read Intel version: %02x%02x%02x%02x%02x%02x%02x%02x%02x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093) ver.hw_platform, ver.hw_variant, ver.hw_revision,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) ver.fw_variant, ver.fw_revision, ver.fw_build_num,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) ver.fw_build_ww, ver.fw_build_yy, ver.fw_patch_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097) /* fw_patch_num indicates the version of patch the device currently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) * have. If there is no patch data in the device, it is always 0x00.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) * So, if it is other than 0x00, no need to patch the device again.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) if (ver.fw_patch_num) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) bt_dev_info(hdev, "Intel device is already patched. "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) "patch num: %02x", ver.fw_patch_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) goto complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107) /* Opens the firmware patch file based on the firmware version read
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) * from the controller. If it fails to open the matching firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) * patch file, it tries to open the default firmware patch file.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) * If no patch file is found, allow the device to operate without
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) * a patch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) fw = btusb_setup_intel_get_fw(hdev, &ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) if (!fw)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) goto complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) fw_ptr = fw->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) /* Enable the manufacturer mode of the controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) * Only while this mode is enabled, the driver can download the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120) * firmware patch data and configuration parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122) err = btintel_enter_mfg(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) disable_patch = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130) /* The firmware data file consists of list of Intel specific HCI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) * commands and its expected events. The first byte indicates the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) * type of the message, either HCI command or HCI event.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) * It reads the command and its expected event from the firmware file,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) * and send to the controller. Once __hci_cmd_sync_ev() returns,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) * the returned event is compared with the event read from the firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137) * file and it will continue until all the messages are downloaded to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) * the controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) * Once the firmware patching is completed successfully,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) * the manufacturer mode is disabled with reset and activating the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142) * downloaded patch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) * If the firmware patching fails, the manufacturer mode is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145) * disabled with reset and deactivating the patch.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) * If the default patch file is used, no reset is done when disabling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) * the manufacturer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) while (fw->size > fw_ptr - fw->data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) ret = btusb_setup_intel_patching(hdev, fw, &fw_ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) &disable_patch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) if (ret < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) goto exit_mfg_deactivate;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) if (disable_patch)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162) goto exit_mfg_disable;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) /* Patching completed successfully and disable the manufacturer mode
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) * with reset and activate the downloaded firmware patches.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) err = btintel_exit_mfg(hdev, true, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) /* Need build number for downloaded fw patches in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) * every power-on boot
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) err = btintel_read_version(hdev, &ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) bt_dev_info(hdev, "Intel BT fw patch 0x%02x completed & activated",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) ver.fw_patch_num);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) goto complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) exit_mfg_disable:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) /* Disable the manufacturer mode without reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) err = btintel_exit_mfg(hdev, false, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188) bt_dev_info(hdev, "Intel firmware patch completed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) goto complete;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) exit_mfg_deactivate:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) /* Patching failed. Disable the manufacturer mode with reset and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) * deactivate the downloaded firmware patches.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) err = btintel_exit_mfg(hdev, true, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) bt_dev_info(hdev, "Intel firmware patch completed and deactivated");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) complete:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) /* Set the event mask for Intel specific vendor events. This enables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) * a few extra events that are useful during general operation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) btintel_set_event_mask_mfg(hdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) btintel_check_bdaddr(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) struct hci_event_hdr *hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) struct hci_ev_cmd_complete *evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) skb = bt_skb_alloc(sizeof(*hdr) + sizeof(*evt) + 1, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) if (!skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) hdr = skb_put(skb, sizeof(*hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) hdr->evt = HCI_EV_CMD_COMPLETE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) hdr->plen = sizeof(*evt) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) evt = skb_put(skb, sizeof(*evt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) evt->ncmd = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) evt->opcode = cpu_to_le16(opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) skb_put_u8(skb, 0x00);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) return hci_recv_frame(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) static int btusb_recv_bulk_intel(struct btusb_data *data, void *buffer,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) int count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242) /* When the device is in bootloader mode, then it can send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) * events via the bulk endpoint. These events are treated the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) * same way as the ones received from the interrupt endpoint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) if (test_bit(BTUSB_BOOTLOADER, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) return btusb_recv_intr(data, buffer, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) return btusb_recv_bulk(data, buffer, count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) static void btusb_intel_bootup(struct btusb_data *data, const void *ptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) const struct intel_bootup *evt = ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) if (len != sizeof(*evt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) if (test_and_clear_bit(BTUSB_BOOTING, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) wake_up_bit(&data->flags, BTUSB_BOOTING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) static void btusb_intel_secure_send_result(struct btusb_data *data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) const void *ptr, unsigned int len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) const struct intel_secure_send_result *evt = ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269) if (len != sizeof(*evt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) if (evt->result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) set_bit(BTUSB_FIRMWARE_FAILED, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) if (test_and_clear_bit(BTUSB_DOWNLOADING, &data->flags) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) test_bit(BTUSB_FIRMWARE_LOADED, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) wake_up_bit(&data->flags, BTUSB_DOWNLOADING);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) struct hci_event_hdr *hdr = (void *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) hdr->plen > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) switch (skb->data[2]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) case 0x02:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) /* When switching to the operational firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) * the device sends a vendor specific event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) * indicating that the bootup completed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) btusb_intel_bootup(data, ptr, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) case 0x06:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) /* When the firmware loading completes the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2302) * device sends out a vendor specific event
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2303) * indicating the result of the firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2304) * loading.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2306) btusb_intel_secure_send_result(data, ptr, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2307) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2312) return hci_recv_frame(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2315) static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2316) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2317) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2318) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2319)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2320) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2321)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2322) switch (hci_skb_pkt_type(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2323) case HCI_COMMAND_PKT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2324) if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2325) struct hci_command_hdr *cmd = (void *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2326) __u16 opcode = le16_to_cpu(cmd->opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2327)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2328) /* When in bootloader mode and the command 0xfc09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2329) * is received, it needs to be send down the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2330) * bulk endpoint. So allocate a bulk URB instead.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2331) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2332) if (opcode == 0xfc09)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2333) urb = alloc_bulk_urb(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2334) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2335) urb = alloc_ctrl_urb(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2337) /* When the 0xfc01 command is issued to boot into
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2338) * the operational firmware, it will actually not
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2339) * send a command complete event. To keep the flow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2340) * control working inject that event here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2341) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2342) if (opcode == 0xfc01)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2343) inject_cmd_complete(hdev, opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2344) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2345) urb = alloc_ctrl_urb(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2347) if (IS_ERR(urb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2348) return PTR_ERR(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2350) hdev->stat.cmd_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2351) return submit_or_queue_tx_urb(hdev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2353) case HCI_ACLDATA_PKT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2354) urb = alloc_bulk_urb(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2355) if (IS_ERR(urb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2356) return PTR_ERR(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2358) hdev->stat.acl_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2359) return submit_or_queue_tx_urb(hdev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2361) case HCI_SCODATA_PKT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2362) if (hci_conn_num(hdev, SCO_LINK) < 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2363) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2365) urb = alloc_isoc_urb(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2366) if (IS_ERR(urb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2367) return PTR_ERR(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2369) hdev->stat.sco_tx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2370) return submit_tx_urb(hdev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2373) return -EILSEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2374) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2376) static bool btusb_setup_intel_new_get_fw_name(struct intel_version *ver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2377) struct intel_boot_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2378) char *fw_name, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2379) const char *suffix)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2380) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2381) switch (ver->hw_variant) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2382) case 0x0b: /* SfP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2383) case 0x0c: /* WsP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2384) snprintf(fw_name, len, "intel/ibt-%u-%u.%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2385) le16_to_cpu(ver->hw_variant),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2386) le16_to_cpu(params->dev_revid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2387) suffix);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2388) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2389) case 0x11: /* JfP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2390) case 0x12: /* ThP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2391) case 0x13: /* HrP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2392) case 0x14: /* CcP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2393) snprintf(fw_name, len, "intel/ibt-%u-%u-%u.%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2394) le16_to_cpu(ver->hw_variant),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2395) le16_to_cpu(ver->hw_revision),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2396) le16_to_cpu(ver->fw_revision),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2397) suffix);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2398) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2399) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2400) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2401) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2402) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2403) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2405) static void btusb_setup_intel_newgen_get_fw_name(const struct intel_version_tlv *ver_tlv,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2406) char *fw_name, size_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2407) const char *suffix)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2409) /* The firmware file name for new generation controllers will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2410) * ibt-<cnvi_top type+cnvi_top step>-<cnvr_top type+cnvr_top step>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2411) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2412) snprintf(fw_name, len, "intel/ibt-%04x-%04x.%s",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2413) INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver_tlv->cnvi_top),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2414) INTEL_CNVX_TOP_STEP(ver_tlv->cnvi_top)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2415) INTEL_CNVX_TOP_PACK_SWAB(INTEL_CNVX_TOP_TYPE(ver_tlv->cnvr_top),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2416) INTEL_CNVX_TOP_STEP(ver_tlv->cnvr_top)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2417) suffix);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2420) static int btusb_intel_download_firmware_newgen(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2421) struct intel_version_tlv *ver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2422) u32 *boot_param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2423) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2424) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2425) char fwname[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2426) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2427) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2429) if (!ver || !boot_param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2430) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2432) /* The hardware platform number has a fixed value of 0x37 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2433) * for now only accept this single value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2434) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2435) if (INTEL_HW_PLATFORM(ver->cnvi_bt) != 0x37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2436) bt_dev_err(hdev, "Unsupported Intel hardware platform (0x%2x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2437) INTEL_HW_PLATFORM(ver->cnvi_bt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2438) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2439) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2440)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2441) /* The firmware variant determines if the device is in bootloader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2442) * mode or is running operational firmware. The value 0x03 identifies
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2443) * the bootloader and the value 0x23 identifies the operational
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2444) * firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2445) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2446) * When the operational firmware is already present, then only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2447) * the check for valid Bluetooth device address is needed. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2448) * determines if the device will be added as configured or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2449) * unconfigured controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2450) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2451) * It is not possible to use the Secure Boot Parameters in this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2452) * case since that command is only available in bootloader mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2453) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2454) if (ver->img_type == 0x03) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2455) clear_bit(BTUSB_BOOTLOADER, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2456) btintel_check_bdaddr(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2457) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2458) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2459)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2460) /* Check for supported iBT hardware variants of this firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2461) * loading method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2462) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2463) * This check has been put in place to ensure correct forward
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2464) * compatibility options when newer hardware variants come along.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2465) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2466) switch (INTEL_HW_VARIANT(ver->cnvi_bt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2467) case 0x17: /* TyP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2468) case 0x18: /* Slr */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2469) case 0x19: /* Slr-F */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2470) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2471) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2472) bt_dev_err(hdev, "Unsupported Intel hardware variant (0x%x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2473) INTEL_HW_VARIANT(ver->cnvi_bt));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2474) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2475) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2476)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2477) /* If the device is not in bootloader mode, then the only possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2478) * choice is to return an error and abort the device initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2479) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2480) if (ver->img_type != 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2481) bt_dev_err(hdev, "Unsupported Intel firmware variant (0x%x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2482) ver->img_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2483) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2486) /* It is required that every single firmware fragment is acknowledged
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2487) * with a command complete event. If the boot parameters indicate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2488) * that this bootloader does not send them, then abort the setup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2489) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2490) if (ver->limited_cce != 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2491) bt_dev_err(hdev, "Unsupported Intel firmware loading method (0x%x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2492) ver->limited_cce);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2493) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2495)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2496) /* Secure boot engine type should be either 1 (ECDSA) or 0 (RSA) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2497) if (ver->sbe_type > 0x01) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2498) bt_dev_err(hdev, "Unsupported Intel secure boot engine type (0x%x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2499) ver->sbe_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2500) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2501) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2502)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2503) /* If the OTP has no valid Bluetooth device address, then there will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2504) * also be no valid address for the operational firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2505) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2506) if (!bacmp(&ver->otp_bd_addr, BDADDR_ANY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2507) bt_dev_info(hdev, "No device address configured");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2508) set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2511) btusb_setup_intel_newgen_get_fw_name(ver, fwname, sizeof(fwname), "sfi");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2512) err = request_firmware(&fw, fwname, &hdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2513) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2514) bt_dev_err(hdev, "Failed to load Intel firmware file (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2515) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2518) bt_dev_info(hdev, "Found device firmware: %s", fwname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2520) if (fw->size < 644) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2521) bt_dev_err(hdev, "Invalid size of firmware file (%zu)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2522) fw->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2523) err = -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2524) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2525) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2527) set_bit(BTUSB_DOWNLOADING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2529) /* Start firmware downloading and get boot parameter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2530) err = btintel_download_firmware_newgen(hdev, fw, boot_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2531) INTEL_HW_VARIANT(ver->cnvi_bt),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2532) ver->sbe_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2533) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2534) /* When FW download fails, send Intel Reset to retry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2535) * FW download.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2536) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2537) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2538) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2539) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2540) set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2542) bt_dev_info(hdev, "Waiting for firmware download to complete");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2544) /* Before switching the device into operational mode and with that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2545) * booting the loaded firmware, wait for the bootloader notification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2546) * that all fragments have been successfully received.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2547) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2548) * When the event processing receives the notification, then the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2549) * BTUSB_DOWNLOADING flag will be cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2550) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2551) * The firmware loading should not take longer than 5 seconds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2552) * and thus just timeout if that happens and fail the setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2553) * of this device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2554) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2555) err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2556) TASK_INTERRUPTIBLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2557) msecs_to_jiffies(5000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2558) if (err == -EINTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2559) bt_dev_err(hdev, "Firmware loading interrupted");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2560) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2561) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2563) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2564) bt_dev_err(hdev, "Firmware loading timeout");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2565) err = -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2566) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2567) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2570) if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2571) bt_dev_err(hdev, "Firmware loading failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2572) err = -ENOEXEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2573) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2574) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2575)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2576) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2577) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2578) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2581) static int btusb_intel_download_firmware(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2582) struct intel_version *ver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2583) struct intel_boot_params *params,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2584) u32 *boot_param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2586) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2587) char fwname[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2588) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2589) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2591) if (!ver || !params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2592) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2593)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2594) /* The hardware platform number has a fixed value of 0x37 and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2595) * for now only accept this single value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2596) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2597) if (ver->hw_platform != 0x37) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2598) bt_dev_err(hdev, "Unsupported Intel hardware platform (%u)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2599) ver->hw_platform);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2600) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2603) /* Check for supported iBT hardware variants of this firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2604) * loading method.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2605) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2606) * This check has been put in place to ensure correct forward
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2607) * compatibility options when newer hardware variants come along.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2608) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2609) switch (ver->hw_variant) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2610) case 0x0b: /* SfP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2611) case 0x0c: /* WsP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2612) case 0x11: /* JfP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2613) case 0x12: /* ThP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2614) case 0x13: /* HrP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2615) case 0x14: /* CcP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2616) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2617) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2618) bt_dev_err(hdev, "Unsupported Intel hardware variant (%u)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2619) ver->hw_variant);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2620) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2621) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2623) btintel_version_info(hdev, ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2624)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2625) /* The firmware variant determines if the device is in bootloader
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2626) * mode or is running operational firmware. The value 0x06 identifies
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2627) * the bootloader and the value 0x23 identifies the operational
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2628) * firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2629) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2630) * When the operational firmware is already present, then only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2631) * the check for valid Bluetooth device address is needed. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2632) * determines if the device will be added as configured or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2633) * unconfigured controller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2634) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2635) * It is not possible to use the Secure Boot Parameters in this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2636) * case since that command is only available in bootloader mode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2637) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2638) if (ver->fw_variant == 0x23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2639) clear_bit(BTUSB_BOOTLOADER, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2640) btintel_check_bdaddr(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2641) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2643)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2644) /* If the device is not in bootloader mode, then the only possible
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2645) * choice is to return an error and abort the device initialization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2646) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2647) if (ver->fw_variant != 0x06) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2648) bt_dev_err(hdev, "Unsupported Intel firmware variant (%u)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2649) ver->fw_variant);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2650) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2651) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2653) /* Read the secure boot parameters to identify the operating
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2654) * details of the bootloader.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2655) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2656) err = btintel_read_boot_params(hdev, params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2657) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2658) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2660) /* It is required that every single firmware fragment is acknowledged
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2661) * with a command complete event. If the boot parameters indicate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2662) * that this bootloader does not send them, then abort the setup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2663) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2664) if (params->limited_cce != 0x00) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2665) bt_dev_err(hdev, "Unsupported Intel firmware loading method (%u)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2666) params->limited_cce);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2667) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2668) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2670) /* If the OTP has no valid Bluetooth device address, then there will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2671) * also be no valid address for the operational firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2672) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2673) if (!bacmp(¶ms->otp_bdaddr, BDADDR_ANY)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2674) bt_dev_info(hdev, "No device address configured");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2675) set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2676) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2678) /* With this Intel bootloader only the hardware variant and device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2679) * revision information are used to select the right firmware for SfP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2680) * and WsP.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2681) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2682) * The firmware filename is ibt-<hw_variant>-<dev_revid>.sfi.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2683) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2684) * Currently the supported hardware variants are:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2685) * 11 (0x0b) for iBT3.0 (LnP/SfP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2686) * 12 (0x0c) for iBT3.5 (WsP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2687) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2688) * For ThP/JfP and for future SKU's, the FW name varies based on HW
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2689) * variant, HW revision and FW revision, as these are dependent on CNVi
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2690) * and RF Combination.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2691) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2692) * 17 (0x11) for iBT3.5 (JfP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2693) * 18 (0x12) for iBT3.5 (ThP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2694) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2695) * The firmware file name for these will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2696) * ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2697) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2698) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2699) err = btusb_setup_intel_new_get_fw_name(ver, params, fwname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2700) sizeof(fwname), "sfi");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2701) if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2702) bt_dev_err(hdev, "Unsupported Intel firmware naming");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2703) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2704) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2706) err = request_firmware(&fw, fwname, &hdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2707) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2708) bt_dev_err(hdev, "Failed to load Intel firmware file (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2709) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2710) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2712) bt_dev_info(hdev, "Found device firmware: %s", fwname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2714) if (fw->size < 644) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2715) bt_dev_err(hdev, "Invalid size of firmware file (%zu)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2716) fw->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2717) err = -EBADF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2718) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2719) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2721) set_bit(BTUSB_DOWNLOADING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2723) /* Start firmware downloading and get boot parameter */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2724) err = btintel_download_firmware(hdev, fw, boot_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2725) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2726) /* When FW download fails, send Intel Reset to retry
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2727) * FW download.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2728) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2729) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2730) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2731) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2732) set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2734) bt_dev_info(hdev, "Waiting for firmware download to complete");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2736) /* Before switching the device into operational mode and with that
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2737) * booting the loaded firmware, wait for the bootloader notification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2738) * that all fragments have been successfully received.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2739) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2740) * When the event processing receives the notification, then the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2741) * BTUSB_DOWNLOADING flag will be cleared.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2742) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2743) * The firmware loading should not take longer than 5 seconds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2744) * and thus just timeout if that happens and fail the setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2745) * of this device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2746) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2747) err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2748) TASK_INTERRUPTIBLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2749) msecs_to_jiffies(5000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2750) if (err == -EINTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2751) bt_dev_err(hdev, "Firmware loading interrupted");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2752) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2753) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2754)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2755) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2756) bt_dev_err(hdev, "Firmware loading timeout");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2757) err = -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2758) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2759) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2760) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2762) if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2763) bt_dev_err(hdev, "Firmware loading failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2764) err = -ENOEXEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2765) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2766) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2767)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2768) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2769) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2770) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2771) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2772)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2773) static int btusb_setup_intel_new(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2774) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2775) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2776) struct intel_version ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2777) struct intel_boot_params params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2778) u32 boot_param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2779) char ddcname[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2780) ktime_t calltime, delta, rettime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2781) unsigned long long duration;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2782) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2783) struct intel_debug_features features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2784)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2785) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2787) /* Set the default boot parameter to 0x0 and it is updated to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2788) * SKU specific boot parameter after reading Intel_Write_Boot_Params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2789) * command while downloading the firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2790) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2791) boot_param = 0x00000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2793) calltime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2794)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2795) /* Read the Intel version information to determine if the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2796) * is in bootloader mode or if it already has operational firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2797) * loaded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2798) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2799) err = btintel_read_version(hdev, &ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2800) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2801) bt_dev_err(hdev, "Intel Read version failed (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2802) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2803) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2805)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2806) err = btusb_intel_download_firmware(hdev, &ver, ¶ms, &boot_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2807) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2808) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2809)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2810) /* controller is already having an operational firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2811) if (ver.fw_variant == 0x23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2812) goto finish;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2813)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2814) rettime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2815) delta = ktime_sub(rettime, calltime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2816) duration = (unsigned long long) ktime_to_ns(delta) >> 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2817)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2818) bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2820) calltime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2822) set_bit(BTUSB_BOOTING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2823)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2824) err = btintel_send_intel_reset(hdev, boot_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2825) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2826) bt_dev_err(hdev, "Intel Soft Reset failed (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2827) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2828) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2829) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2831) /* The bootloader will not indicate when the device is ready. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2832) * is done by the operational firmware sending bootup notification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2833) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2834) * Booting into operational firmware should not take longer than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2835) * 1 second. However if that happens, then just fail the setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2836) * since something went wrong.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2837) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2838) bt_dev_info(hdev, "Waiting for device to boot");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2839)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2840) err = wait_on_bit_timeout(&data->flags, BTUSB_BOOTING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2841) TASK_INTERRUPTIBLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2842) msecs_to_jiffies(1000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2843)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2844) if (err == -EINTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2845) bt_dev_err(hdev, "Device boot interrupted");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2846) return -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2847) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2848)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2849) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2850) bt_dev_err(hdev, "Device boot timeout");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2851) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2852) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2855) rettime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2856) delta = ktime_sub(rettime, calltime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2857) duration = (unsigned long long) ktime_to_ns(delta) >> 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2859) bt_dev_info(hdev, "Device booted in %llu usecs", duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2861) clear_bit(BTUSB_BOOTLOADER, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2863) err = btusb_setup_intel_new_get_fw_name(&ver, ¶ms, ddcname,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2864) sizeof(ddcname), "ddc");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2865)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2866) if (!err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2867) bt_dev_err(hdev, "Unsupported Intel firmware naming");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2868) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2869) /* Once the device is running in operational mode, it needs to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2870) * apply the device configuration (DDC) parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2871) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2872) * The device can work without DDC parameters, so even if it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2873) * fails to load the file, no need to fail the setup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2874) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2875) btintel_load_ddc_config(hdev, ddcname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2878) /* Read the Intel supported features and if new exception formats
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2879) * supported, need to load the additional DDC config to enable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2880) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2881) btintel_read_debug_features(hdev, &features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2883) /* Set DDC mask for available debug features */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2884) btintel_set_debug_features(hdev, &features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2885)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2886) /* Read the Intel version information after loading the FW */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2887) err = btintel_read_version(hdev, &ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2888) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2889) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2890)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2891) btintel_version_info(hdev, &ver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2892)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2893) finish:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2894) /* All Intel controllers that support the Microsoft vendor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2895) * extension are using 0xFC1E for VsMsftOpCode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2896) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2897) switch (ver.hw_variant) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2898) case 0x12: /* ThP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2899) hci_set_msft_opcode(hdev, 0xFC1E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2900) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2901) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2902)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2903) /* Set the event mask for Intel specific vendor events. This enables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2904) * a few extra events that are useful during general operation. It
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2905) * does not enable any debugging related events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2906) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2907) * The device will function correctly without these events enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2908) * and thus no need to fail the setup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2909) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2910) btintel_set_event_mask(hdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2912) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2913) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2914)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2915) static int btusb_setup_intel_newgen(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2916) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2917) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2918) u32 boot_param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2919) char ddcname[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2920) ktime_t calltime, delta, rettime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2921) unsigned long long duration;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2922) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2923) struct intel_debug_features features;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2924) struct intel_version_tlv version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2926) BT_DBG("%s", hdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2928) /* Set the default boot parameter to 0x0 and it is updated to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2929) * SKU specific boot parameter after reading Intel_Write_Boot_Params
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2930) * command while downloading the firmware.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2931) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2932) boot_param = 0x00000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2934) calltime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2935)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2936) /* Read the Intel version information to determine if the device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2937) * is in bootloader mode or if it already has operational firmware
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2938) * loaded.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2939) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2940) err = btintel_read_version_tlv(hdev, &version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2941) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2942) bt_dev_err(hdev, "Intel Read version failed (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2943) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2944) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2945) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2947) btintel_version_info_tlv(hdev, &version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2948)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2949) err = btusb_intel_download_firmware_newgen(hdev, &version, &boot_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2950) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2951) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2952)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2953) /* check if controller is already having an operational firmware */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2954) if (version.img_type == 0x03)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2955) goto finish;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2956)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2957) rettime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2958) delta = ktime_sub(rettime, calltime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2959) duration = (unsigned long long)ktime_to_ns(delta) >> 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2960)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2961) bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2962)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2963) calltime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2964)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2965) set_bit(BTUSB_BOOTING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2967) err = btintel_send_intel_reset(hdev, boot_param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2968) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2969) bt_dev_err(hdev, "Intel Soft Reset failed (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2970) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2971) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2972) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2973)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2974) /* The bootloader will not indicate when the device is ready. This
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2975) * is done by the operational firmware sending bootup notification.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2976) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2977) * Booting into operational firmware should not take longer than
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2978) * 1 second. However if that happens, then just fail the setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2979) * since something went wrong.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2980) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2981) bt_dev_info(hdev, "Waiting for device to boot");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2982)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2983) err = wait_on_bit_timeout(&data->flags, BTUSB_BOOTING,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2984) TASK_INTERRUPTIBLE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2985) msecs_to_jiffies(1000));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2987) if (err == -EINTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2988) bt_dev_err(hdev, "Device boot interrupted");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2989) return -EINTR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2990) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2991)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2992) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2993) bt_dev_err(hdev, "Device boot timeout");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2994) btintel_reset_to_bootloader(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2995) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2996) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2998) rettime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2999) delta = ktime_sub(rettime, calltime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3000) duration = (unsigned long long)ktime_to_ns(delta) >> 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3002) bt_dev_info(hdev, "Device booted in %llu usecs", duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3003)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3004) clear_bit(BTUSB_BOOTLOADER, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3005) btusb_setup_intel_newgen_get_fw_name(&version, ddcname, sizeof(ddcname),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3006) "ddc");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3007)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3008) /* Once the device is running in operational mode, it needs to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3009) * apply the device configuration (DDC) parameters.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3010) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3011) * The device can work without DDC parameters, so even if it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3012) * fails to load the file, no need to fail the setup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3013) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3014) btintel_load_ddc_config(hdev, ddcname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3016) /* Read the Intel supported features and if new exception formats
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3017) * supported, need to load the additional DDC config to enable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3018) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3019) btintel_read_debug_features(hdev, &features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3020)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3021) /* Set DDC mask for available debug features */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3022) btintel_set_debug_features(hdev, &features);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3024) /* Read the Intel version information after loading the FW */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3025) err = btintel_read_version_tlv(hdev, &version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3026) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3027) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3028)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3029) btintel_version_info_tlv(hdev, &version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3031) finish:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3032) /* Set the event mask for Intel specific vendor events. This enables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3033) * a few extra events that are useful during general operation. It
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3034) * does not enable any debugging related events.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3035) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3036) * The device will function correctly without these events enabled
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3037) * and thus no need to fail the setup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3038) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3039) btintel_set_event_mask(hdev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3041) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3042) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3043)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3044) static int btusb_shutdown_intel(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3045) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3046) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3047) long ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3049) /* In the shutdown sequence where Bluetooth is turned off followed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3050) * by WiFi being turned off, turning WiFi back on causes issue with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3051) * the RF calibration.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3052) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3053) * To ensure that any RF activity has been stopped, issue HCI Reset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3054) * command to clear all ongoing activity including advertising,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3055) * scanning etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3056) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3057) skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3058) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3059) ret = PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3060) bt_dev_err(hdev, "HCI reset during shutdown failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3061) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3062) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3063) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3064)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3065) /* Some platforms have an issue with BT LED when the interface is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3066) * down or BT radio is turned off, which takes 5 seconds to BT LED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3067) * goes off. This command turns off the BT LED immediately.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3068) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3069) skb = __hci_cmd_sync(hdev, 0xfc3f, 0, NULL, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3070) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3071) ret = PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3072) bt_dev_err(hdev, "turning off Intel device LED failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3073) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3074) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3075) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3077) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3078) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3080) static int btusb_shutdown_intel_new(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3081) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3082) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3083)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3084) /* Send HCI Reset to the controller to stop any BT activity which
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3085) * were triggered. This will help to save power and maintain the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3086) * sync b/w Host and controller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3087) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3088) skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3089) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3090) bt_dev_err(hdev, "HCI reset during shutdown failed");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3091) return PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3092) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3093) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3095) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3096) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3098) #define FIRMWARE_MT7663 "mediatek/mt7663pr2h.bin"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3099) #define FIRMWARE_MT7668 "mediatek/mt7668pr2h.bin"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3101) #define HCI_WMT_MAX_EVENT_SIZE 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3103) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3104) BTMTK_WMT_PATCH_DWNLD = 0x1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3105) BTMTK_WMT_FUNC_CTRL = 0x6,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3106) BTMTK_WMT_RST = 0x7,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3107) BTMTK_WMT_SEMAPHORE = 0x17,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3108) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3110) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3111) BTMTK_WMT_INVALID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3112) BTMTK_WMT_PATCH_UNDONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3113) BTMTK_WMT_PATCH_DONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3114) BTMTK_WMT_ON_UNDONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3115) BTMTK_WMT_ON_DONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3116) BTMTK_WMT_ON_PROGRESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3117) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3119) struct btmtk_wmt_hdr {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3120) u8 dir;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3121) u8 op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3122) __le16 dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3123) u8 flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3124) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3126) struct btmtk_hci_wmt_cmd {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3127) struct btmtk_wmt_hdr hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3128) u8 data[256];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3129) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3131) struct btmtk_hci_wmt_evt {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3132) struct hci_event_hdr hhdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3133) struct btmtk_wmt_hdr whdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3134) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3136) struct btmtk_hci_wmt_evt_funcc {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3137) struct btmtk_hci_wmt_evt hwhdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3138) __be16 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3139) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3141) struct btmtk_tci_sleep {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3142) u8 mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3143) __le16 duration;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3144) __le16 host_duration;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3145) u8 host_wakeup_pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3146) u8 time_compensation;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3147) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3149) struct btmtk_hci_wmt_params {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3150) u8 op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3151) u8 flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3152) u16 dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3153) const void *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3154) u32 *status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3155) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3157) static void btusb_mtk_wmt_recv(struct urb *urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3158) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3159) struct hci_dev *hdev = urb->context;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3160) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3161) struct hci_event_hdr *hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3162) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3163) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3165) if (urb->status == 0 && urb->actual_length > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3166) hdev->stat.byte_rx += urb->actual_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3167)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3168) /* WMT event shouldn't be fragmented and the size should be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3169) * less than HCI_WMT_MAX_EVENT_SIZE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3170) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3171) skb = bt_skb_alloc(HCI_WMT_MAX_EVENT_SIZE, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3172) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3173) hdev->stat.err_rx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3174) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3175) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3178) hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3179) skb_put_data(skb, urb->transfer_buffer, urb->actual_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3181) hdr = (void *)skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3182) /* Fix up the vendor event id with 0xff for vendor specific
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3183) * instead of 0xe4 so that event send via monitoring socket can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3184) * be parsed properly.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3185) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3186) hdr->evt = 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3188) /* When someone waits for the WMT event, the skb is being cloned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3189) * and being processed the events from there then.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3190) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3191) if (test_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3192) data->evt_skb = skb_clone(skb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3193) if (!data->evt_skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3194) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3195) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3196) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3197) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3200) err = hci_recv_frame(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3201) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3202) kfree_skb(data->evt_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3203) data->evt_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3204) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3205) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3206) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3208) if (test_and_clear_bit(BTUSB_TX_WAIT_VND_EVT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3209) &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3210) /* Barrier to sync with other CPUs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3211) smp_mb__after_atomic();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3212) wake_up_bit(&data->flags,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3213) BTUSB_TX_WAIT_VND_EVT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3215) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3216) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3217) } else if (urb->status == -ENOENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3218) /* Avoid suspend failed when usb_kill_urb */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3219) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3220) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3221)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3222) usb_mark_last_busy(data->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3224) /* The URB complete handler is still called with urb->actual_length = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3225) * when the event is not available, so we should keep re-submitting
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3226) * URB until WMT event returns, Also, It's necessary to wait some time
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3227) * between the two consecutive control URBs to relax the target device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3228) * to generate the event. Otherwise, the WMT event cannot return from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3229) * the device successfully.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3230) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3231) udelay(100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3233) usb_anchor_urb(urb, &data->ctrl_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3234) err = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3235) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3236) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3237) /* -EPERM: urb is being killed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3238) * -ENODEV: device got disconnected
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3239) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3240) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3241) bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3242) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3243) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3245) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3246)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3247) static int btusb_mtk_submit_wmt_recv_urb(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3248) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3249) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3250) struct usb_ctrlrequest *dr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3251) unsigned char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3252) int err, size = 64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3253) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3254) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3256) urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3257) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3258) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3260) dr = kmalloc(sizeof(*dr), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3261) if (!dr) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3262) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3263) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3264) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3265)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3266) dr->bRequestType = USB_TYPE_VENDOR | USB_DIR_IN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3267) dr->bRequest = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3268) dr->wIndex = cpu_to_le16(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3269) dr->wValue = cpu_to_le16(48);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3270) dr->wLength = cpu_to_le16(size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3272) buf = kmalloc(size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3273) if (!buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3274) kfree(dr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3275) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3276) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3277) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3279) pipe = usb_rcvctrlpipe(data->udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3281) usb_fill_control_urb(urb, data->udev, pipe, (void *)dr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3282) buf, size, btusb_mtk_wmt_recv, hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3284) urb->transfer_flags |= URB_FREE_BUFFER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3286) usb_anchor_urb(urb, &data->ctrl_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3287) err = usb_submit_urb(urb, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3288) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3289) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3290) bt_dev_err(hdev, "urb %p submission failed (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3291) urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3292) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3293) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3295) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3297) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3300) static int btusb_mtk_hci_wmt_sync(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3301) struct btmtk_hci_wmt_params *wmt_params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3302) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3303) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3304) struct btmtk_hci_wmt_evt_funcc *wmt_evt_funcc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3305) u32 hlen, status = BTMTK_WMT_INVALID;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3306) struct btmtk_hci_wmt_evt *wmt_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3307) struct btmtk_hci_wmt_cmd wc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3308) struct btmtk_wmt_hdr *hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3309) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3311) /* Send the WMT command and wait until the WMT event returns */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3312) hlen = sizeof(*hdr) + wmt_params->dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3313) if (hlen > 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3314) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3316) hdr = (struct btmtk_wmt_hdr *)&wc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3317) hdr->dir = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3318) hdr->op = wmt_params->op;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3319) hdr->dlen = cpu_to_le16(wmt_params->dlen + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3320) hdr->flag = wmt_params->flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3321) memcpy(wc.data, wmt_params->data, wmt_params->dlen);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3323) set_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3325) err = __hci_cmd_send(hdev, 0xfc6f, hlen, &wc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3327) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3328) clear_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3329) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3332) /* Submit control IN URB on demand to process the WMT event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3333) err = btusb_mtk_submit_wmt_recv_urb(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3334) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3335) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3337) /* The vendor specific WMT commands are all answered by a vendor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3338) * specific event and will have the Command Status or Command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3339) * Complete as with usual HCI command flow control.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3340) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3341) * After sending the command, wait for BTUSB_TX_WAIT_VND_EVT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3342) * state to be cleared. The driver specific event receive routine
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3343) * will clear that state and with that indicate completion of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3344) * WMT command.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3345) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3346) err = wait_on_bit_timeout(&data->flags, BTUSB_TX_WAIT_VND_EVT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3347) TASK_INTERRUPTIBLE, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3348) if (err == -EINTR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3349) bt_dev_err(hdev, "Execution of wmt command interrupted");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3350) clear_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3351) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3352) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3353)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3354) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3355) bt_dev_err(hdev, "Execution of wmt command timed out");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3356) clear_bit(BTUSB_TX_WAIT_VND_EVT, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3357) return -ETIMEDOUT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3360) /* Parse and handle the return WMT event */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3361) wmt_evt = (struct btmtk_hci_wmt_evt *)data->evt_skb->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3362) if (wmt_evt->whdr.op != hdr->op) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3363) bt_dev_err(hdev, "Wrong op received %d expected %d",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3364) wmt_evt->whdr.op, hdr->op);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3365) err = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3366) goto err_free_skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3368)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3369) switch (wmt_evt->whdr.op) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3370) case BTMTK_WMT_SEMAPHORE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3371) if (wmt_evt->whdr.flag == 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3372) status = BTMTK_WMT_PATCH_UNDONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3373) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3374) status = BTMTK_WMT_PATCH_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3375) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3376) case BTMTK_WMT_FUNC_CTRL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3377) wmt_evt_funcc = (struct btmtk_hci_wmt_evt_funcc *)wmt_evt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3378) if (be16_to_cpu(wmt_evt_funcc->status) == 0x404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3379) status = BTMTK_WMT_ON_DONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3380) else if (be16_to_cpu(wmt_evt_funcc->status) == 0x420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3381) status = BTMTK_WMT_ON_PROGRESS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3382) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3383) status = BTMTK_WMT_ON_UNDONE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3384) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3387) if (wmt_params->status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3388) *wmt_params->status = status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3390) err_free_skb:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3391) kfree_skb(data->evt_skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3392) data->evt_skb = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3394) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3396)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3397) static int btusb_mtk_setup_firmware(struct hci_dev *hdev, const char *fwname)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3398) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3399) struct btmtk_hci_wmt_params wmt_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3400) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3401) const u8 *fw_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3402) size_t fw_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3403) int err, dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3404) u8 flag, param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3406) err = request_firmware(&fw, fwname, &hdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3407) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3408) bt_dev_err(hdev, "Failed to load firmware file (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3409) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3410) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3411)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3412) /* Power on data RAM the firmware relies on. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3413) param = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3414) wmt_params.op = BTMTK_WMT_FUNC_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3415) wmt_params.flag = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3416) wmt_params.dlen = sizeof(param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3417) wmt_params.data = ¶m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3418) wmt_params.status = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3420) err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3421) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3422) bt_dev_err(hdev, "Failed to power on data RAM (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3423) goto err_release_fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3424) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3425)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3426) fw_ptr = fw->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3427) fw_size = fw->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3429) /* The size of patch header is 30 bytes, should be skip */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3430) if (fw_size < 30) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3431) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3432) goto err_release_fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3433) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3434)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3435) fw_size -= 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3436) fw_ptr += 30;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3437) flag = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3438)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3439) wmt_params.op = BTMTK_WMT_PATCH_DWNLD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3440) wmt_params.status = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3441)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3442) while (fw_size > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3443) dlen = min_t(int, 250, fw_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3445) /* Tell deivice the position in sequence */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3446) if (fw_size - dlen <= 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3447) flag = 3;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3448) else if (fw_size < fw->size - 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3449) flag = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3450)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3451) wmt_params.flag = flag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3452) wmt_params.dlen = dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3453) wmt_params.data = fw_ptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3454)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3455) err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3456) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3457) bt_dev_err(hdev, "Failed to send wmt patch dwnld (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3458) err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3459) goto err_release_fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3462) fw_size -= dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3463) fw_ptr += dlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3466) wmt_params.op = BTMTK_WMT_RST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3467) wmt_params.flag = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3468) wmt_params.dlen = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3469) wmt_params.data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3470) wmt_params.status = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3472) /* Activate funciton the firmware providing to */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3473) err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3474) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3475) bt_dev_err(hdev, "Failed to send wmt rst (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3476) goto err_release_fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3477) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3479) /* Wait a few moments for firmware activation done */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3480) usleep_range(10000, 12000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3481)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3482) err_release_fw:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3483) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3485) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3486) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3488) static int btusb_mtk_func_query(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3489) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3490) struct btmtk_hci_wmt_params wmt_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3491) int status, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3492) u8 param = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3493)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3494) /* Query whether the function is enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3495) wmt_params.op = BTMTK_WMT_FUNC_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3496) wmt_params.flag = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3497) wmt_params.dlen = sizeof(param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3498) wmt_params.data = ¶m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3499) wmt_params.status = &status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3501) err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3502) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3503) bt_dev_err(hdev, "Failed to query function status (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3504) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3507) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3508) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3510) static int btusb_mtk_reg_read(struct btusb_data *data, u32 reg, u32 *val)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3511) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3512) int pipe, err, size = sizeof(u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3513) void *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3515) buf = kzalloc(size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3516) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3517) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3518)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3519) pipe = usb_rcvctrlpipe(data->udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3520) err = usb_control_msg(data->udev, pipe, 0x63,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3521) USB_TYPE_VENDOR | USB_DIR_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3522) reg >> 16, reg & 0xffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3523) buf, size, USB_CTRL_SET_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3524) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3525) goto err_free_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3527) *val = get_unaligned_le32(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3529) err_free_buf:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3530) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3531)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3532) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3533) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3534)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3535) static int btusb_mtk_id_get(struct btusb_data *data, u32 *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3536) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3537) return btusb_mtk_reg_read(data, 0x80000008, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3538) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3540) static int btusb_mtk_setup(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3541) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3542) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3543) struct btmtk_hci_wmt_params wmt_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3544) ktime_t calltime, delta, rettime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3545) struct btmtk_tci_sleep tci_sleep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3546) unsigned long long duration;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3547) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3548) const char *fwname;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3549) int err, status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3550) u32 dev_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3551) u8 param;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3552)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3553) calltime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3555) err = btusb_mtk_id_get(data, &dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3556) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3557) bt_dev_err(hdev, "Failed to get device id (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3558) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3559) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3561) switch (dev_id) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3562) case 0x7663:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3563) fwname = FIRMWARE_MT7663;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3564) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3565) case 0x7668:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3566) fwname = FIRMWARE_MT7668;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3567) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3568) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3569) bt_dev_err(hdev, "Unsupported support hardware variant (%08x)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3570) dev_id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3571) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3572) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3573)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3574) /* Query whether the firmware is already download */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3575) wmt_params.op = BTMTK_WMT_SEMAPHORE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3576) wmt_params.flag = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3577) wmt_params.dlen = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3578) wmt_params.data = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3579) wmt_params.status = &status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3581) err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3582) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3583) bt_dev_err(hdev, "Failed to query firmware status (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3584) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3586)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3587) if (status == BTMTK_WMT_PATCH_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3588) bt_dev_info(hdev, "firmware already downloaded");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3589) goto ignore_setup_fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3590) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3591)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3592) /* Setup a firmware which the device definitely requires */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3593) err = btusb_mtk_setup_firmware(hdev, fwname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3594) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3595) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3597) ignore_setup_fw:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3598) err = readx_poll_timeout(btusb_mtk_func_query, hdev, status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3599) status < 0 || status != BTMTK_WMT_ON_PROGRESS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3600) 2000, 5000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3601) /* -ETIMEDOUT happens */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3602) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3603) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3605) /* The other errors happen in btusb_mtk_func_query */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3606) if (status < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3607) return status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3609) if (status == BTMTK_WMT_ON_DONE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3610) bt_dev_info(hdev, "function already on");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3611) goto ignore_func_on;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3614) /* Enable Bluetooth protocol */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3615) param = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3616) wmt_params.op = BTMTK_WMT_FUNC_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3617) wmt_params.flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3618) wmt_params.dlen = sizeof(param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3619) wmt_params.data = ¶m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3620) wmt_params.status = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3621)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3622) err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3623) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3624) bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3625) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3628) ignore_func_on:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3629) /* Apply the low power environment setup */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3630) tci_sleep.mode = 0x5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3631) tci_sleep.duration = cpu_to_le16(0x640);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3632) tci_sleep.host_duration = cpu_to_le16(0x640);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3633) tci_sleep.host_wakeup_pin = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3634) tci_sleep.time_compensation = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3635)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3636) skb = __hci_cmd_sync(hdev, 0xfc7a, sizeof(tci_sleep), &tci_sleep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3637) HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3638) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3639) err = PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3640) bt_dev_err(hdev, "Failed to apply low power setting (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3641) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3642) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3643) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3645) rettime = ktime_get();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3646) delta = ktime_sub(rettime, calltime);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3647) duration = (unsigned long long)ktime_to_ns(delta) >> 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3648)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3649) bt_dev_info(hdev, "Device setup in %llu usecs", duration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3650)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3651) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3652) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3653)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3654) static int btusb_mtk_shutdown(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3655) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3656) struct btmtk_hci_wmt_params wmt_params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3657) u8 param = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3658) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3660) /* Disable the device */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3661) wmt_params.op = BTMTK_WMT_FUNC_CTRL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3662) wmt_params.flag = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3663) wmt_params.dlen = sizeof(param);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3664) wmt_params.data = ¶m;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3665) wmt_params.status = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3667) err = btusb_mtk_hci_wmt_sync(hdev, &wmt_params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3668) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3669) bt_dev_err(hdev, "Failed to send wmt func ctrl (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3670) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3671) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3673) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3676) MODULE_FIRMWARE(FIRMWARE_MT7663);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3677) MODULE_FIRMWARE(FIRMWARE_MT7668);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3678)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3679) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3680) /* Configure an out-of-band gpio as wake-up pin, if specified in device tree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3681) static int marvell_config_oob_wake(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3682) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3683) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3684) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3685) struct device *dev = &data->udev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3686) u16 pin, gap, opcode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3687) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3688) u8 cmd[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3689)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3690) /* Move on if no wakeup pin specified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3691) if (of_property_read_u16(dev->of_node, "marvell,wakeup-pin", &pin) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3692) of_property_read_u16(dev->of_node, "marvell,wakeup-gap-ms", &gap))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3693) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3694)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3695) /* Vendor specific command to configure a GPIO as wake-up pin */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3696) opcode = hci_opcode_pack(0x3F, 0x59);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3697) cmd[0] = opcode & 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3698) cmd[1] = opcode >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3699) cmd[2] = 2; /* length of parameters that follow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3700) cmd[3] = pin;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3701) cmd[4] = gap; /* time in ms, for which wakeup pin should be asserted */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3702)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3703) skb = bt_skb_alloc(sizeof(cmd), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3704) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3705) bt_dev_err(hdev, "%s: No memory\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3706) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3709) skb_put_data(skb, cmd, sizeof(cmd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3710) hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3712) ret = btusb_send_frame(hdev, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3713) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3714) bt_dev_err(hdev, "%s: configuration failed\n", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3715) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3716) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3717) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3719) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3721) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3722)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3723) static int btusb_set_bdaddr_marvell(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3724) const bdaddr_t *bdaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3725) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3726) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3727) u8 buf[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3728) long ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3729)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3730) buf[0] = 0xfe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3731) buf[1] = sizeof(bdaddr_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3732) memcpy(buf + 2, bdaddr, sizeof(bdaddr_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3734) skb = __hci_cmd_sync(hdev, 0xfc22, sizeof(buf), buf, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3735) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3736) ret = PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3737) bt_dev_err(hdev, "changing Marvell device address failed (%ld)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3738) ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3739) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3741) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3743) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3744) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3745)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3746) static int btusb_set_bdaddr_ath3012(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3747) const bdaddr_t *bdaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3748) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3749) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3750) u8 buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3751) long ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3753) buf[0] = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3754) buf[1] = 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3755) buf[2] = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3756) buf[3] = sizeof(bdaddr_t);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3757) memcpy(buf + 4, bdaddr, sizeof(bdaddr_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3758)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3759) skb = __hci_cmd_sync(hdev, 0xfc0b, sizeof(buf), buf, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3760) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3761) ret = PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3762) bt_dev_err(hdev, "Change address command failed (%ld)", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3763) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3764) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3765) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3767) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3770) static int btusb_set_bdaddr_wcn6855(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3771) const bdaddr_t *bdaddr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3773) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3774) u8 buf[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3775) long ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3777) memcpy(buf, bdaddr, sizeof(bdaddr_t));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3778)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3779) skb = __hci_cmd_sync_ev(hdev, 0xfc14, sizeof(buf), buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3780) HCI_EV_CMD_COMPLETE, HCI_INIT_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3781) if (IS_ERR(skb)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3782) ret = PTR_ERR(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3783) bt_dev_err(hdev, "Change address command failed (%ld)", ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3784) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3785) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3786) kfree_skb(skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3788) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3789) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3790)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3791) #define QCA_DFU_PACKET_LEN 4096
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3793) #define QCA_GET_TARGET_VERSION 0x09
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3794) #define QCA_CHECK_STATUS 0x05
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3795) #define QCA_DFU_DOWNLOAD 0x01
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3796)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3797) #define QCA_SYSCFG_UPDATED 0x40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3798) #define QCA_PATCH_UPDATED 0x80
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3799) #define QCA_DFU_TIMEOUT 3000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3800)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3801) struct qca_version {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3802) __le32 rom_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3803) __le32 patch_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3804) __le32 ram_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3805) __le32 ref_clock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3806) __u8 reserved[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3807) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3808)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3809) struct qca_rampatch_version {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3810) __le16 rom_version_high;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3811) __le16 rom_version_low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3812) __le16 patch_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3813) } __packed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3815) struct qca_device_info {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3816) u32 rom_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3817) u8 rampatch_hdr; /* length of header in rampatch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3818) u8 nvm_hdr; /* length of header in NVM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3819) u8 ver_offset; /* offset of version structure in rampatch */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3820) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3822) static const struct qca_device_info qca_devices_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3823) { 0x00000100, 20, 4, 8 }, /* Rome 1.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3824) { 0x00000101, 20, 4, 8 }, /* Rome 1.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3825) { 0x00000200, 28, 4, 16 }, /* Rome 2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3826) { 0x00000201, 28, 4, 16 }, /* Rome 2.1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3827) { 0x00000300, 28, 4, 16 }, /* Rome 3.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3828) { 0x00000302, 28, 4, 16 }, /* Rome 3.2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3829) { 0x00130100, 40, 4, 16 }, /* WCN6855 1.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3830) { 0x00130200, 40, 4, 16 }, /* WCN6855 2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3831) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3832)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3833) static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3834) void *data, u16 size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3835) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3836) int pipe, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3837) u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3839) buf = kmalloc(size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3840) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3841) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3842)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3843) /* Found some of USB hosts have IOT issues with ours so that we should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3844) * not wait until HCI layer is ready.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3845) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3846) pipe = usb_rcvctrlpipe(udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3847) err = usb_control_msg(udev, pipe, request, USB_TYPE_VENDOR | USB_DIR_IN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3848) 0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3849) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3850) dev_err(&udev->dev, "Failed to access otp area (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3851) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3852) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3853)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3854) memcpy(data, buf, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3855)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3856) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3857) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3859) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3861)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3862) static int btusb_setup_qca_download_fw(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3863) const struct firmware *firmware,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3864) size_t hdr_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3865) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3866) struct btusb_data *btdata = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3867) struct usb_device *udev = btdata->udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3868) size_t count, size, sent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3869) int pipe, len, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3870) u8 *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3871)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3872) buf = kmalloc(QCA_DFU_PACKET_LEN, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3873) if (!buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3874) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3875)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3876) count = firmware->size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3878) size = min_t(size_t, count, hdr_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3879) memcpy(buf, firmware->data, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3880)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3881) /* USB patches should go down to controller through USB path
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3882) * because binary format fits to go down through USB channel.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3883) * USB control path is for patching headers and USB bulk is for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3884) * patch body.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3885) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3886) pipe = usb_sndctrlpipe(udev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3887) err = usb_control_msg(udev, pipe, QCA_DFU_DOWNLOAD, USB_TYPE_VENDOR,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3888) 0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3889) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3890) bt_dev_err(hdev, "Failed to send headers (%d)", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3891) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3894) sent += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3895) count -= size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3897) /* ep2 need time to switch from function acl to function dfu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3898) * so we add 20ms delay here.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3899) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3900) msleep(20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3902) while (count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3903) size = min_t(size_t, count, QCA_DFU_PACKET_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3904)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3905) memcpy(buf, firmware->data + sent, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3906)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3907) pipe = usb_sndbulkpipe(udev, 0x02);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3908) err = usb_bulk_msg(udev, pipe, buf, size, &len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3909) QCA_DFU_TIMEOUT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3910) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3911) bt_dev_err(hdev, "Failed to send body at %zd of %zd (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3912) sent, firmware->size, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3913) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3916) if (size != len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3917) bt_dev_err(hdev, "Failed to get bulk buffer");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3918) err = -EILSEQ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3919) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3921)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3922) sent += size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3923) count -= size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3924) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3925)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3926) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3927) kfree(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3928) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3929) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3931) static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3932) struct qca_version *ver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3933) const struct qca_device_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3934) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3935) struct qca_rampatch_version *rver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3936) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3937) u32 ver_rom, ver_patch, rver_rom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3938) u16 rver_rom_low, rver_rom_high, rver_patch;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3939) char fwname[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3940) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3941)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3942) ver_rom = le32_to_cpu(ver->rom_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3943) ver_patch = le32_to_cpu(ver->patch_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3945) snprintf(fwname, sizeof(fwname), "qca/rampatch_usb_%08x.bin", ver_rom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3946)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3947) err = request_firmware(&fw, fwname, &hdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3948) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3949) bt_dev_err(hdev, "failed to request rampatch file: %s (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3950) fwname, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3951) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3952) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3954) bt_dev_info(hdev, "using rampatch file: %s", fwname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3955)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3956) rver = (struct qca_rampatch_version *)(fw->data + info->ver_offset);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3957) rver_rom_low = le16_to_cpu(rver->rom_version_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3958) rver_patch = le16_to_cpu(rver->patch_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3959)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3960) if (ver_rom & ~0xffffU) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3961) rver_rom_high = le16_to_cpu(rver->rom_version_high);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3962) rver_rom = le32_to_cpu(rver_rom_high << 16 | rver_rom_low);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3963) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3964) rver_rom = rver_rom_low;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3966)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3967) bt_dev_info(hdev, "QCA: patch rome 0x%x build 0x%x, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3968) "firmware rome 0x%x build 0x%x",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3969) rver_rom, rver_patch, ver_rom, ver_patch);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3971) if (rver_rom != ver_rom || rver_patch <= ver_patch) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3972) bt_dev_err(hdev, "rampatch file version did not match with firmware");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3973) err = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3974) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3975) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3976)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3977) err = btusb_setup_qca_download_fw(hdev, fw, info->rampatch_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3978)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3979) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3980) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3982) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3983) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3985) static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3986) struct qca_version *ver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3987) const struct qca_device_info *info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3988) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3989) const struct firmware *fw;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3990) char fwname[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3991) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3992)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3993) snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3994) le32_to_cpu(ver->rom_version));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3995)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3996) err = request_firmware(&fw, fwname, &hdev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3997) if (err) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3998) bt_dev_err(hdev, "failed to request NVM file: %s (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3999) fwname, err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4000) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4001) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4002)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4003) bt_dev_info(hdev, "using NVM file: %s", fwname);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4004)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4005) err = btusb_setup_qca_download_fw(hdev, fw, info->nvm_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4007) release_firmware(fw);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4008)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4009) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4012) /* identify the ROM version and check whether patches are needed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4013) static bool btusb_qca_need_patch(struct usb_device *udev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4014) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4015) struct qca_version ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4016)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4017) if (btusb_qca_send_vendor_req(udev, QCA_GET_TARGET_VERSION, &ver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4018) sizeof(ver)) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4019) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4020) /* only low ROM versions need patches */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4021) return !(le32_to_cpu(ver.rom_version) & ~0xffffU);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4022) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4023)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4024) static int btusb_setup_qca(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4025) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4026) struct btusb_data *btdata = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4027) struct usb_device *udev = btdata->udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4028) const struct qca_device_info *info = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4029) struct qca_version ver;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4030) u32 ver_rom;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4031) u8 status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4032) int i, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4034) err = btusb_qca_send_vendor_req(udev, QCA_GET_TARGET_VERSION, &ver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4035) sizeof(ver));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4036) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4037) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4039) ver_rom = le32_to_cpu(ver.rom_version);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4041) for (i = 0; i < ARRAY_SIZE(qca_devices_table); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4042) if (ver_rom == qca_devices_table[i].rom_version)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4043) info = &qca_devices_table[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4045) if (!info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4046) /* If the rom_version is not matched in the qca_devices_table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4047) * and the high ROM version is not zero, we assume this chip no
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4048) * need to load the rampatch and nvm.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4049) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4050) if (ver_rom & ~0xffffU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4051) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4053) bt_dev_err(hdev, "don't support firmware rome 0x%x", ver_rom);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4054) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4055) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4057) err = btusb_qca_send_vendor_req(udev, QCA_CHECK_STATUS, &status,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4058) sizeof(status));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4059) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4060) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4062) if (!(status & QCA_PATCH_UPDATED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4063) err = btusb_setup_qca_load_rampatch(hdev, &ver, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4064) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4065) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4066) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4067)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4068) if (!(status & QCA_SYSCFG_UPDATED)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4069) err = btusb_setup_qca_load_nvm(hdev, &ver, info);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4070) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4071) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4072) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4074) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4075) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4076)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4077) static inline int __set_diag_interface(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4078) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4079) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4080) struct usb_interface *intf = data->diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4081) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4082)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4083) if (!data->diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4084) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4085)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4086) data->diag_tx_ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4087) data->diag_rx_ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4088)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4089) for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4090) struct usb_endpoint_descriptor *ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4091)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4092) ep_desc = &intf->cur_altsetting->endpoint[i].desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4094) if (!data->diag_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4095) data->diag_tx_ep = ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4096) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4097) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4098)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4099) if (!data->diag_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4100) data->diag_rx_ep = ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4101) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4102) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4105) if (!data->diag_tx_ep || !data->diag_rx_ep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4106) bt_dev_err(hdev, "invalid diagnostic descriptors");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4107) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4110) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4111) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4113) static struct urb *alloc_diag_urb(struct hci_dev *hdev, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4114) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4115) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4116) struct sk_buff *skb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4117) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4118) unsigned int pipe;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4120) if (!data->diag_tx_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4121) return ERR_PTR(-ENODEV);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4123) urb = usb_alloc_urb(0, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4124) if (!urb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4125) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4127) skb = bt_skb_alloc(2, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4128) if (!skb) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4129) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4130) return ERR_PTR(-ENOMEM);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4133) skb_put_u8(skb, 0xf0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4134) skb_put_u8(skb, enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4136) pipe = usb_sndbulkpipe(data->udev, data->diag_tx_ep->bEndpointAddress);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4138) usb_fill_bulk_urb(urb, data->udev, pipe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4139) skb->data, skb->len, btusb_tx_complete, skb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4141) skb->dev = (void *)hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4143) return urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4146) static int btusb_bcm_set_diag(struct hci_dev *hdev, bool enable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4148) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4149) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4151) if (!data->diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4152) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4154) if (!test_bit(HCI_RUNNING, &hdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4155) return -ENETDOWN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4157) urb = alloc_diag_urb(hdev, enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4158) if (IS_ERR(urb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4159) return PTR_ERR(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4161) return submit_or_queue_tx_urb(hdev, urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4164) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4165) static irqreturn_t btusb_oob_wake_handler(int irq, void *priv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4167) struct btusb_data *data = priv;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4169) pm_wakeup_event(&data->udev->dev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4170) pm_system_wakeup();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4171)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4172) /* Disable only if not already disabled (keep it balanced) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4173) if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4174) disable_irq_nosync(irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4175) disable_irq_wake(irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4176) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4177) return IRQ_HANDLED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4180) static const struct of_device_id btusb_match_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4181) { .compatible = "usb1286,204e" },
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4182) { .compatible = "usbcf3,e300" }, /* QCA6174A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4183) { .compatible = "usb4ca,301a" }, /* QCA6174A (Lite-On) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4184) { }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4185) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4186) MODULE_DEVICE_TABLE(of, btusb_match_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4188) /* Use an oob wakeup pin? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4189) static int btusb_config_oob_wake(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4191) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4192) struct device *dev = &data->udev->dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4193) int irq, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4195) clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4197) if (!of_match_device(btusb_match_table, dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4198) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4200) /* Move on if no IRQ specified */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4201) irq = of_irq_get_byname(dev->of_node, "wakeup");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4202) if (irq <= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4203) bt_dev_dbg(hdev, "%s: no OOB Wakeup IRQ in DT", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4204) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4205) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4207) irq_set_status_flags(irq, IRQ_NOAUTOEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4208) ret = devm_request_irq(&hdev->dev, irq, btusb_oob_wake_handler,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4209) 0, "OOB Wake-on-BT", data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4210) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4211) bt_dev_err(hdev, "%s: IRQ request failed", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4212) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4215) ret = device_init_wakeup(dev, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4216) if (ret) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4217) bt_dev_err(hdev, "%s: failed to init_wakeup", __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4218) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4219) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4221) data->oob_wake_irq = irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4222) bt_dev_info(hdev, "OOB Wake-on-BT configured at IRQ %u", irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4223) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4225) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4227) static void btusb_check_needs_reset_resume(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4228) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4229) if (dmi_check_system(btusb_needs_reset_resume_table))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4230) interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4233) static bool btusb_prevent_wake(struct hci_dev *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4234) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4235) struct btusb_data *data = hci_get_drvdata(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4237) if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4238) return true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4239)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4240) return !device_may_wakeup(&data->udev->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4243) static int btusb_probe(struct usb_interface *intf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4244) const struct usb_device_id *id)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4245) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4246) struct usb_endpoint_descriptor *ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4247) struct gpio_desc *reset_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4248) struct btusb_data *data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4249) struct hci_dev *hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4250) unsigned ifnum_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4251) int i, err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4253) BT_DBG("intf %p id %p", intf, id);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4255) /* interface numbers are hardcoded in the spec */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4256) if (intf->cur_altsetting->desc.bInterfaceNumber != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4257) if (!(id->driver_info & BTUSB_IFNUM_2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4258) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4259) if (intf->cur_altsetting->desc.bInterfaceNumber != 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4260) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4263) ifnum_base = intf->cur_altsetting->desc.bInterfaceNumber;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4265) if (!id->driver_info) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4266) const struct usb_device_id *match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4268) match = usb_match_id(intf, blacklist_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4269) if (match)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4270) id = match;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4273) if (id->driver_info == BTUSB_IGNORE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4274) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4276) if (id->driver_info & BTUSB_ATH3012) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4277) struct usb_device *udev = interface_to_usbdev(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4279) /* Old firmware would otherwise let ath3k driver load
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4280) * patch and sysconfig files
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4281) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4282) if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4283) !btusb_qca_need_patch(udev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4284) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4285) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4287) data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4288) if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4289) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4291) for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4292) ep_desc = &intf->cur_altsetting->endpoint[i].desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4294) if (!data->intr_ep && usb_endpoint_is_int_in(ep_desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4295) data->intr_ep = ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4296) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4297) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4298)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4299) if (!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4300) data->bulk_tx_ep = ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4301) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4304) if (!data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4305) data->bulk_rx_ep = ep_desc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4306) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4307) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4310) if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4311) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4313) if (id->driver_info & BTUSB_AMP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4314) data->cmdreq_type = USB_TYPE_CLASS | 0x01;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4315) data->cmdreq = 0x2b;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4316) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4317) data->cmdreq_type = USB_TYPE_CLASS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4318) data->cmdreq = 0x00;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4321) data->udev = interface_to_usbdev(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4322) data->intf = intf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4324) INIT_WORK(&data->work, btusb_work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4325) INIT_WORK(&data->waker, btusb_waker);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4326) init_usb_anchor(&data->deferred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4327) init_usb_anchor(&data->tx_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4328) spin_lock_init(&data->txlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4330) init_usb_anchor(&data->intr_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4331) init_usb_anchor(&data->bulk_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4332) init_usb_anchor(&data->isoc_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4333) init_usb_anchor(&data->diag_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4334) init_usb_anchor(&data->ctrl_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4335) spin_lock_init(&data->rxlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4336)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4337) if (id->driver_info & BTUSB_INTEL_NEW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4338) data->recv_event = btusb_recv_event_intel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4339) data->recv_bulk = btusb_recv_bulk_intel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4340) set_bit(BTUSB_BOOTLOADER, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4341) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4342) data->recv_event = hci_recv_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4343) data->recv_bulk = btusb_recv_bulk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4344) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4345)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4346) hdev = hci_alloc_dev();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4347) if (!hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4348) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4350) hdev->bus = HCI_USB;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4351) hci_set_drvdata(hdev, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4352)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4353) if (id->driver_info & BTUSB_AMP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4354) hdev->dev_type = HCI_AMP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4355) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4356) hdev->dev_type = HCI_PRIMARY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4358) data->hdev = hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4360) SET_HCIDEV_DEV(hdev, &intf->dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4361)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4362) reset_gpio = gpiod_get_optional(&data->udev->dev, "reset",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4363) GPIOD_OUT_LOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4364) if (IS_ERR(reset_gpio)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4365) err = PTR_ERR(reset_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4366) goto out_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4367) } else if (reset_gpio) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4368) data->reset_gpio = reset_gpio;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4369) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4371) hdev->open = btusb_open;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4372) hdev->close = btusb_close;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4373) hdev->flush = btusb_flush;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4374) hdev->send = btusb_send_frame;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4375) hdev->notify = btusb_notify;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4376) hdev->prevent_wake = btusb_prevent_wake;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4377)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4378) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4379) err = btusb_config_oob_wake(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4380) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4381) goto out_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4382)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4383) /* Marvell devices may need a specific chip configuration */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4384) if (id->driver_info & BTUSB_MARVELL && data->oob_wake_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4385) err = marvell_config_oob_wake(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4386) if (err)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4387) goto out_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4389) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4390) if (id->driver_info & BTUSB_CW6622)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4391) set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4393) if (id->driver_info & BTUSB_BCM2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4394) set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4396) if (id->driver_info & BTUSB_BCM92035)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4397) hdev->setup = btusb_setup_bcm92035;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4399) if (IS_ENABLED(CONFIG_BT_HCIBTUSB_BCM) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4400) (id->driver_info & BTUSB_BCM_PATCHRAM)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4401) hdev->manufacturer = 15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4402) hdev->setup = btbcm_setup_patchram;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4403) hdev->set_diag = btusb_bcm_set_diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4404) hdev->set_bdaddr = btbcm_set_bdaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4406) /* Broadcom LM_DIAG Interface numbers are hardcoded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4407) data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4410) if (IS_ENABLED(CONFIG_BT_HCIBTUSB_BCM) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4411) (id->driver_info & BTUSB_BCM_APPLE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4412) hdev->manufacturer = 15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4413) hdev->setup = btbcm_setup_apple;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4414) hdev->set_diag = btusb_bcm_set_diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4415)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4416) /* Broadcom LM_DIAG Interface numbers are hardcoded */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4417) data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4418) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4420) if (id->driver_info & BTUSB_INTEL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4421) hdev->manufacturer = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4422) hdev->setup = btusb_setup_intel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4423) hdev->shutdown = btusb_shutdown_intel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4424) hdev->set_diag = btintel_set_diag_mfg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4425) hdev->set_bdaddr = btintel_set_bdaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4426) hdev->cmd_timeout = btusb_intel_cmd_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4427) set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4428) set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4429) set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4432) if (id->driver_info & BTUSB_INTEL_NEW) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4433) hdev->manufacturer = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4434) hdev->send = btusb_send_frame_intel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4435) hdev->setup = btusb_setup_intel_new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4436) hdev->shutdown = btusb_shutdown_intel_new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4437) hdev->hw_error = btintel_hw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4438) hdev->set_diag = btintel_set_diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4439) hdev->set_bdaddr = btintel_set_bdaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4440) hdev->cmd_timeout = btusb_intel_cmd_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4441) set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4442) set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4443) set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4444) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4445)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4446) if (id->driver_info & BTUSB_INTEL_NEWGEN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4447) hdev->manufacturer = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4448) hdev->send = btusb_send_frame_intel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4449) hdev->setup = btusb_setup_intel_newgen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4450) hdev->shutdown = btusb_shutdown_intel_new;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4451) hdev->hw_error = btintel_hw_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4452) hdev->set_diag = btintel_set_diag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4453) hdev->set_bdaddr = btintel_set_bdaddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4454) hdev->cmd_timeout = btusb_intel_cmd_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4455) set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4456) set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4457) set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4459) data->recv_event = btusb_recv_event_intel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4460) data->recv_bulk = btusb_recv_bulk_intel;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4461) set_bit(BTUSB_BOOTLOADER, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4462) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4463)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4464) if (id->driver_info & BTUSB_MARVELL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4465) hdev->set_bdaddr = btusb_set_bdaddr_marvell;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4467) if (IS_ENABLED(CONFIG_BT_HCIBTUSB_MTK) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4468) (id->driver_info & BTUSB_MEDIATEK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4469) hdev->setup = btusb_mtk_setup;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4470) hdev->shutdown = btusb_mtk_shutdown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4471) hdev->manufacturer = 70;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4472) set_bit(HCI_QUIRK_NON_PERSISTENT_SETUP, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4473) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4474)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4475) if (id->driver_info & BTUSB_SWAVE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4476) set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4477) set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4480) if (id->driver_info & BTUSB_INTEL_BOOT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4481) hdev->manufacturer = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4482) set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4485) if (id->driver_info & BTUSB_ATH3012) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4486) data->setup_on_usb = btusb_setup_qca;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4487) hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4488) set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4489) set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4490) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4491)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4492) if (id->driver_info & BTUSB_QCA_ROME) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4493) data->setup_on_usb = btusb_setup_qca;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4494) hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4495) hdev->cmd_timeout = btusb_qca_cmd_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4496) set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4497) btusb_check_needs_reset_resume(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4498) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4499)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4500) if (id->driver_info & BTUSB_QCA_WCN6855) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4501) data->setup_on_usb = btusb_setup_qca;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4502) hdev->set_bdaddr = btusb_set_bdaddr_wcn6855;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4503) hdev->cmd_timeout = btusb_qca_cmd_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4504) set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4507) if (id->driver_info & BTUSB_AMP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4508) /* AMP controllers do not support SCO packets */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4509) data->isoc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4510) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4511) /* Interface orders are hardcoded in the specification */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4512) data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4513) data->isoc_ifnum = ifnum_base + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4516) if (IS_ENABLED(CONFIG_BT_HCIBTUSB_RTL) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4517) (id->driver_info & BTUSB_REALTEK)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4518) hdev->setup = btrtl_setup_realtek;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4519) hdev->shutdown = btrtl_shutdown_realtek;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4520) hdev->cmd_timeout = btusb_rtl_cmd_timeout;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4521)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4522) /* Realtek devices lose their updated firmware over global
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4523) * suspend that means host doesn't send SET_FEATURE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4524) * (DEVICE_REMOTE_WAKEUP)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4525) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4526) set_bit(BTUSB_WAKEUP_DISABLE, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4527) set_bit(BTUSB_USE_ALT3_FOR_WBS, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4528) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4530) if (!reset)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4531) set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4532)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4533) if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4534) if (!disable_scofix)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4535) set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4536) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4537)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4538) if (id->driver_info & BTUSB_BROKEN_ISOC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4539) data->isoc = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4540)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4541) if (id->driver_info & BTUSB_WIDEBAND_SPEECH)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4542) set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4543)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4544) if (id->driver_info & BTUSB_VALID_LE_STATES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4545) set_bit(HCI_QUIRK_VALID_LE_STATES, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4547) if (id->driver_info & BTUSB_DIGIANSWER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4548) data->cmdreq_type = USB_TYPE_VENDOR;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4549) set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4552) if (id->driver_info & BTUSB_CSR) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4553) struct usb_device *udev = data->udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4554) u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4556) /* Old firmware would otherwise execute USB reset */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4557) if (bcdDevice < 0x117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4558) set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4560) /* This must be set first in case we disable it for fakes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4561) set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4562)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4563) /* Fake CSR devices with broken commands */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4564) if (le16_to_cpu(udev->descriptor.idVendor) == 0x0a12 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4565) le16_to_cpu(udev->descriptor.idProduct) == 0x0001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4566) hdev->setup = btusb_setup_csr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4567) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4568)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4569) if (id->driver_info & BTUSB_SNIFFER) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4570) struct usb_device *udev = data->udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4572) /* New sniffer firmware has crippled HCI interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4573) if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4574) set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4577) if (id->driver_info & BTUSB_INTEL_BOOT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4578) /* A bug in the bootloader causes that interrupt interface is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4579) * only enabled after receiving SetInterface(0, AltSetting=0).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4580) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4581) err = usb_set_interface(data->udev, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4582) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4583) BT_ERR("failed to set interface 0, alt 0 %d", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4584) goto out_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4586) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4587)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4588) if (data->isoc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4589) err = usb_driver_claim_interface(&btusb_driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4590) data->isoc, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4591) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4592) goto out_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4595) if (IS_ENABLED(CONFIG_BT_HCIBTUSB_BCM) && data->diag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4596) if (!usb_driver_claim_interface(&btusb_driver,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4597) data->diag, data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4598) __set_diag_interface(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4599) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4600) data->diag = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4601) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4602)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4603) if (enable_autosuspend)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4604) usb_enable_autosuspend(data->udev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4606) err = hci_register_dev(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4607) if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4608) goto out_free_dev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4610) usb_set_intfdata(intf, data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4611)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4612) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4614) out_free_dev:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4615) if (data->reset_gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4616) gpiod_put(data->reset_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4617) hci_free_dev(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4618) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4621) static void btusb_disconnect(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4622) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4623) struct btusb_data *data = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4624) struct hci_dev *hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4626) BT_DBG("intf %p", intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4628) if (!data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4629) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4631) hdev = data->hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4632) usb_set_intfdata(data->intf, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4634) if (data->isoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4635) usb_set_intfdata(data->isoc, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4637) if (data->diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4638) usb_set_intfdata(data->diag, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4640) hci_unregister_dev(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4641)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4642) if (intf == data->intf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4643) if (data->isoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4644) usb_driver_release_interface(&btusb_driver, data->isoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4645) if (data->diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4646) usb_driver_release_interface(&btusb_driver, data->diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4647) } else if (intf == data->isoc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4648) if (data->diag)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4649) usb_driver_release_interface(&btusb_driver, data->diag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4650) usb_driver_release_interface(&btusb_driver, data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4651) } else if (intf == data->diag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4652) usb_driver_release_interface(&btusb_driver, data->intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4653) if (data->isoc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4654) usb_driver_release_interface(&btusb_driver, data->isoc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4655) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4656)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4657) if (data->oob_wake_irq)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4658) device_init_wakeup(&data->udev->dev, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4659)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4660) if (data->reset_gpio)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4661) gpiod_put(data->reset_gpio);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4663) hci_free_dev(hdev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4664) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4665)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4666) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4667) static int btusb_suspend(struct usb_interface *intf, pm_message_t message)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4668) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4669) struct btusb_data *data = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4670)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4671) BT_DBG("intf %p", intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4672)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4673) if (data->suspend_count++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4674) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4675)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4676) spin_lock_irq(&data->txlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4677) if (!(PMSG_IS_AUTO(message) && data->tx_in_flight)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4678) set_bit(BTUSB_SUSPENDING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4679) spin_unlock_irq(&data->txlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4680) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4681) spin_unlock_irq(&data->txlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4682) data->suspend_count--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4683) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4684) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4685)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4686) cancel_work_sync(&data->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4688) btusb_stop_traffic(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4689) usb_kill_anchored_urbs(&data->tx_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4691) if (data->oob_wake_irq && device_may_wakeup(&data->udev->dev)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4692) set_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4693) enable_irq_wake(data->oob_wake_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4694) enable_irq(data->oob_wake_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4695) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4697) /* For global suspend, Realtek devices lose the loaded fw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4698) * in them. But for autosuspend, firmware should remain.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4699) * Actually, it depends on whether the usb host sends
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4700) * set feature (enable wakeup) or not.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4701) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4702) if (test_bit(BTUSB_WAKEUP_DISABLE, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4703) if (PMSG_IS_AUTO(message) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4704) device_can_wakeup(&data->udev->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4705) data->udev->do_remote_wakeup = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4706) else if (!PMSG_IS_AUTO(message))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4707) data->udev->reset_resume = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4708) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4710) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4711) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4712)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4713) static void play_deferred(struct btusb_data *data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4714) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4715) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4716) int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4718) while ((urb = usb_get_from_anchor(&data->deferred))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4719) usb_anchor_urb(urb, &data->tx_anchor);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4721) err = usb_submit_urb(urb, GFP_ATOMIC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4722) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4723) if (err != -EPERM && err != -ENODEV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4724) BT_ERR("%s urb %p submission failed (%d)",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4725) data->hdev->name, urb, -err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4726) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4727) usb_unanchor_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4728) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4729) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4730) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4731)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4732) data->tx_in_flight++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4733) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4734) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4736) /* Cleanup the rest deferred urbs. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4737) while ((urb = usb_get_from_anchor(&data->deferred))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4738) kfree(urb->setup_packet);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4739) usb_free_urb(urb);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4740) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4741) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4743) static int btusb_resume(struct usb_interface *intf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4744) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4745) struct btusb_data *data = usb_get_intfdata(intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4746) struct hci_dev *hdev = data->hdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4747) int err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4749) BT_DBG("intf %p", intf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4750)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4751) if (--data->suspend_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4752) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4754) /* Disable only if not already disabled (keep it balanced) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4755) if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4756) disable_irq(data->oob_wake_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4757) disable_irq_wake(data->oob_wake_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4758) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4760) if (!test_bit(HCI_RUNNING, &hdev->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4761) goto done;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4763) if (test_bit(BTUSB_INTR_RUNNING, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4764) err = btusb_submit_intr_urb(hdev, GFP_NOIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4765) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4766) clear_bit(BTUSB_INTR_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4767) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4768) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4769) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4770)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4771) if (test_bit(BTUSB_BULK_RUNNING, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4772) err = btusb_submit_bulk_urb(hdev, GFP_NOIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4773) if (err < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4774) clear_bit(BTUSB_BULK_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4775) goto failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4778) btusb_submit_bulk_urb(hdev, GFP_NOIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4779) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4780)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4781) if (test_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4782) if (btusb_submit_isoc_urb(hdev, GFP_NOIO) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4783) clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4784) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4785) btusb_submit_isoc_urb(hdev, GFP_NOIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4786) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4787)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4788) spin_lock_irq(&data->txlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4789) play_deferred(data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4790) clear_bit(BTUSB_SUSPENDING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4791) spin_unlock_irq(&data->txlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4792) schedule_work(&data->work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4794) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4795)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4796) failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4797) usb_scuttle_anchored_urbs(&data->deferred);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4798) done:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4799) spin_lock_irq(&data->txlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4800) clear_bit(BTUSB_SUSPENDING, &data->flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4801) spin_unlock_irq(&data->txlock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4802)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4803) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4804) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4805) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4806)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4807) static struct usb_driver btusb_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4808) .name = "btusb",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4809) .probe = btusb_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4810) .disconnect = btusb_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4811) #ifdef CONFIG_PM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4812) .suspend = btusb_suspend,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4813) .resume = btusb_resume,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4814) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4815) .id_table = btusb_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4816) .supports_autosuspend = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4817) .disable_hub_initiated_lpm = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4818) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4819)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4820) module_usb_driver(btusb_driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4822) module_param(disable_scofix, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4823) MODULE_PARM_DESC(disable_scofix, "Disable fixup of wrong SCO buffer size");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4824)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4825) module_param(force_scofix, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4826) MODULE_PARM_DESC(force_scofix, "Force fixup of wrong SCO buffers size");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4827)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4828) module_param(enable_autosuspend, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4829) MODULE_PARM_DESC(enable_autosuspend, "Enable USB autosuspend by default");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4830)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4831) module_param(reset, bool, 0644);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4832) MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4834) MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4835) MODULE_DESCRIPTION("Generic Bluetooth USB driver ver " VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4836) MODULE_VERSION(VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4837) MODULE_LICENSE("GPL");