blob: c8c8b0b8d333434fbe08dfc94f1a87e6f002b2e2 [file] [log] [blame]
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001/*
2 *
3 * Generic Bluetooth USB driver
4 *
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02005 * Copyright (C) 2005-2008 Marcel Holtmann <marcel@holtmann.org>
Marcel Holtmann5e23b922007-10-20 14:12:34 +02006 *
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 *
22 */
23
Hans de Goede1fdb9262018-02-20 09:06:18 +010024#include <linux/dmi.h>
Marcel Holtmann5e23b922007-10-20 14:12:34 +020025#include <linux/module.h>
Marcel Holtmann5e23b922007-10-20 14:12:34 +020026#include <linux/usb.h>
Hans de Goede61f5ace2018-01-08 10:44:16 +010027#include <linux/usb/quirks.h>
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -070028#include <linux/firmware.h>
Rajat Jainfd913ef2017-02-01 14:24:09 -080029#include <linux/of_device.h>
30#include <linux/of_irq.h>
Jeffy Chen017789f2017-02-24 14:24:29 +080031#include <linux/suspend.h>
Daniel Drakea2698a92015-04-16 14:09:55 -060032#include <asm/unaligned.h>
Marcel Holtmann5e23b922007-10-20 14:12:34 +020033
34#include <net/bluetooth/bluetooth.h>
35#include <net/bluetooth/hci_core.h>
36
Marcel Holtmann4185a0f2015-04-06 00:52:12 -070037#include "btintel.h"
Marcel Holtmann1df1f592015-04-05 22:52:11 -070038#include "btbcm.h"
Carlo Caionedb33c772015-05-14 10:49:09 +020039#include "btrtl.h"
Marcel Holtmann1df1f592015-04-05 22:52:11 -070040
Marcel Holtmann34dced9b2015-04-05 22:52:16 -070041#define VERSION "0.8"
Marcel Holtmanncfeb4142008-08-07 22:26:56 +020042
Rusty Russell90ab5ee2012-01-13 09:32:20 +103043static bool disable_scofix;
44static bool force_scofix;
Hans de Goedeeff2d682017-11-13 14:44:16 +010045static bool enable_autosuspend = IS_ENABLED(CONFIG_BT_HCIBTUSB_AUTOSUSPEND);
Marcel Holtmann7a9d4022008-11-30 12:17:26 +010046
Shailendra Verma917a3332015-05-25 23:53:40 +053047static bool reset = true;
Marcel Holtmanncfeb4142008-08-07 22:26:56 +020048
49static struct usb_driver btusb_driver;
50
51#define BTUSB_IGNORE 0x01
Marcel Holtmann7a9d4022008-11-30 12:17:26 +010052#define BTUSB_DIGIANSWER 0x02
53#define BTUSB_CSR 0x04
54#define BTUSB_SNIFFER 0x08
55#define BTUSB_BCM92035 0x10
56#define BTUSB_BROKEN_ISOC 0x20
57#define BTUSB_WRONG_SCO_MTU 0x40
Steven.Li2d25f8b2011-07-01 14:02:36 +080058#define BTUSB_ATH3012 0x80
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -070059#define BTUSB_INTEL 0x100
Marcel Holtmann40df7832014-07-06 13:29:58 +020060#define BTUSB_INTEL_BOOT 0x200
61#define BTUSB_BCM_PATCHRAM 0x400
Amitkumar Karwarae8df492014-07-18 14:47:06 -070062#define BTUSB_MARVELL 0x800
Marcel Holtmann4fcef8e2015-01-01 17:34:37 -080063#define BTUSB_SWAVE 0x1000
Marcel Holtmanncda0dd72015-01-26 21:33:48 -080064#define BTUSB_INTEL_NEW 0x2000
Marcel Holtmann893ba542015-01-28 20:27:34 -080065#define BTUSB_AMP 0x4000
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +000066#define BTUSB_QCA_ROME 0x8000
Marcel Holtmann17b27722015-03-22 15:52:38 +010067#define BTUSB_BCM_APPLE 0x10000
Daniel Drakea2698a92015-04-16 14:09:55 -060068#define BTUSB_REALTEK 0x20000
Marcel Holtmann6c9d4352015-10-17 14:39:27 +020069#define BTUSB_BCM2045 0x40000
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +020070#define BTUSB_IFNUM_2 0x80000
Szymon Janc418678b2016-09-01 17:22:37 +020071#define BTUSB_CW6622 0x100000
Marcel Holtmann5e23b922007-10-20 14:12:34 +020072
Marcel Holtmann54265202013-10-11 07:46:18 -070073static const struct usb_device_id btusb_table[] = {
Marcel Holtmann5e23b922007-10-20 14:12:34 +020074 /* Generic Bluetooth USB device */
75 { USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
76
Marcel Holtmann893ba542015-01-28 20:27:34 -080077 /* Generic Bluetooth AMP device */
78 { USB_DEVICE_INFO(0xe0, 0x01, 0x04), .driver_info = BTUSB_AMP },
79
Daniel Draked63b2822015-07-17 11:12:25 -060080 /* Generic Bluetooth USB interface */
81 { USB_INTERFACE_INFO(0xe0, 0x01, 0x01) },
82
Henrik Rydberg1fa65352012-08-25 19:28:06 +020083 /* Apple-specific (Broadcom) devices */
Marcel Holtmann17b27722015-03-22 15:52:38 +010084 { USB_VENDOR_AND_INTERFACE_INFO(0x05ac, 0xff, 0x01, 0x01),
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +020085 .driver_info = BTUSB_BCM_APPLE | BTUSB_IFNUM_2 },
Henrik Rydberg1fa65352012-08-25 19:28:06 +020086
Cho, Yu-Chen178c0592013-06-04 21:40:26 +080087 /* MediaTek MT76x0E */
88 { USB_DEVICE(0x0e8d, 0x763f) },
89
Oliver Neukumc510eae2011-09-21 11:41:45 +020090 /* Broadcom SoftSailing reporting vendor specific */
Don Zickus2e8b50632012-03-28 16:41:11 -040091 { USB_DEVICE(0x0a5c, 0x21e1) },
Oliver Neukumc510eae2011-09-21 11:41:45 +020092
Nobuhiro Iwamatsu3cd01972010-08-20 16:24:07 +090093 /* Apple MacBookPro 7,1 */
94 { USB_DEVICE(0x05ac, 0x8213) },
95
Cyril Lacoux0a79f672010-07-14 10:29:27 +040096 /* Apple iMac11,1 */
97 { USB_DEVICE(0x05ac, 0x8215) },
98
Nobuhiro Iwamatsu9c047152010-08-20 16:24:06 +090099 /* Apple MacBookPro6,2 */
100 { USB_DEVICE(0x05ac, 0x8218) },
101
Edgar (gimli) Hucek3e3ede72010-11-04 08:04:33 +0100102 /* Apple MacBookAir3,1, MacBookAir3,2 */
103 { USB_DEVICE(0x05ac, 0x821b) },
104
Pieter-Augustijn Van Malleghema63b7232011-09-07 02:28:10 -0400105 /* Apple MacBookAir4,1 */
106 { USB_DEVICE(0x05ac, 0x821f) },
107
Marc-Antoine Perennou88d377b2011-03-24 14:51:21 -0300108 /* Apple MacBookPro8,2 */
109 { USB_DEVICE(0x05ac, 0x821a) },
110
Jurgen Kramerf78b68262011-09-04 18:01:42 +0200111 /* Apple MacMini5,1 */
112 { USB_DEVICE(0x05ac, 0x8281) },
113
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200114 /* AVM BlueFRITZ! USB v2.0 */
Marcel Holtmann4fcef8e2015-01-01 17:34:37 -0800115 { USB_DEVICE(0x057c, 0x3800), .driver_info = BTUSB_SWAVE },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200116
117 /* Bluetooth Ultraport Module from IBM */
118 { USB_DEVICE(0x04bf, 0x030a) },
119
120 /* ALPS Modules with non-standard id */
121 { USB_DEVICE(0x044e, 0x3001) },
122 { USB_DEVICE(0x044e, 0x3002) },
123
124 /* Ericsson with non-standard id */
125 { USB_DEVICE(0x0bdb, 0x1002) },
126
127 /* Canyon CN-BTU1 with HID interfaces */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100128 { USB_DEVICE(0x0c10, 0x0000) },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200129
Wen-chien Jesse Sungd13431c2011-11-08 14:30:22 +0800130 /* Broadcom BCM20702A0 */
131 { USB_DEVICE(0x413c, 0x8197) },
132
Marcel Holtmannd049f4e2015-01-26 20:35:32 -0800133 /* Broadcom BCM20702B0 (Dynex/Insignia) */
134 { USB_DEVICE(0x19ff, 0x0239), .driver_info = BTUSB_BCM_PATCHRAM },
135
Santtu Rekilä2faf71c2015-10-05 15:45:27 +0300136 /* Broadcom BCM43142A0 (Foxconn/Lenovo) */
Dmitry Tunin628c26b2017-07-06 14:41:13 +0300137 { USB_VENDOR_AND_INTERFACE_INFO(0x105b, 0xff, 0x01, 0x01),
138 .driver_info = BTUSB_BCM_PATCHRAM },
Santtu Rekilä2faf71c2015-10-05 15:45:27 +0300139
Christoph Haaga57bac42017-02-10 14:02:45 +0100140 /* Broadcom BCM920703 (HTC Vive) */
141 { USB_VENDOR_AND_INTERFACE_INFO(0x0bb4, 0xff, 0x01, 0x01),
142 .driver_info = BTUSB_BCM_PATCHRAM },
143
Steven Harms98514032012-04-13 14:45:55 -0400144 /* Foxconn - Hon Hai */
Heinrich Siebmanns6029ddc2014-12-03 19:32:22 +0100145 { USB_VENDOR_AND_INTERFACE_INFO(0x0489, 0xff, 0x01, 0x01),
146 .driver_info = BTUSB_BCM_PATCHRAM },
Steven Harms98514032012-04-13 14:45:55 -0400147
Matej Dubovy8f0c3042015-02-02 18:50:14 +0100148 /* Lite-On Technology - Broadcom based */
149 { USB_VENDOR_AND_INTERFACE_INFO(0x04ca, 0xff, 0x01, 0x01),
150 .driver_info = BTUSB_BCM_PATCHRAM },
151
Andy Shevchenko0b880062014-02-18 18:26:19 +0200152 /* Broadcom devices with vendor specific id */
Petri Gynther10d4c672014-05-08 15:50:01 -0700153 { USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01),
154 .driver_info = BTUSB_BCM_PATCHRAM },
Gustavo Padovan92c385f2012-08-06 15:36:49 -0300155
Marcel Holtmannc2aef6e2014-07-21 14:02:33 +0200156 /* ASUSTek Computer - Broadcom based */
Rick Dunn9a5abdaa2015-01-17 05:29:12 +0100157 { USB_VENDOR_AND_INTERFACE_INFO(0x0b05, 0xff, 0x01, 0x01),
158 .driver_info = BTUSB_BCM_PATCHRAM },
Marcel Holtmannc2aef6e2014-07-21 14:02:33 +0200159
Ken O'Brien5bcecf32013-09-21 19:14:43 +0100160 /* Belkin F8065bf - Broadcom based */
Marcel Holtmann6331c682015-03-27 15:11:41 -0700161 { USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01),
162 .driver_info = BTUSB_BCM_PATCHRAM },
Ken O'Brien5bcecf32013-09-21 19:14:43 +0100163
Jurgen Kramer9113bfd2014-02-15 12:01:09 +0100164 /* IMC Networks - Broadcom based */
Marcel Holtmann6331c682015-03-27 15:11:41 -0700165 { USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01),
166 .driver_info = BTUSB_BCM_PATCHRAM },
Jurgen Kramer9113bfd2014-02-15 12:01:09 +0100167
Wen-chien Jesse Sungfdfddc62017-01-10 15:41:13 +0800168 /* Dell Computer - Broadcom based */
169 { USB_VENDOR_AND_INTERFACE_INFO(0x413c, 0xff, 0x01, 0x01),
170 .driver_info = BTUSB_BCM_PATCHRAM },
171
Dmitry Tunin1623d0b2015-12-05 14:09:36 +0300172 /* Toshiba Corp - Broadcom based */
173 { USB_VENDOR_AND_INTERFACE_INFO(0x0930, 0xff, 0x01, 0x01),
174 .driver_info = BTUSB_BCM_PATCHRAM },
175
Marcel Holtmann40df7832014-07-06 13:29:58 +0200176 /* Intel Bluetooth USB Bootloader (RAM module) */
Marcel Holtmannd92f2df2014-07-06 14:53:55 +0200177 { USB_DEVICE(0x8087, 0x0a5a),
178 .driver_info = BTUSB_INTEL_BOOT | BTUSB_BROKEN_ISOC },
Marcel Holtmann40df7832014-07-06 13:29:58 +0200179
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200180 { } /* Terminating entry */
181};
182
183MODULE_DEVICE_TABLE(usb, btusb_table);
184
Marcel Holtmann54265202013-10-11 07:46:18 -0700185static const struct usb_device_id blacklist_table[] = {
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200186 /* CSR BlueCore devices */
187 { USB_DEVICE(0x0a12, 0x0001), .driver_info = BTUSB_CSR },
188
189 /* Broadcom BCM2033 without firmware */
190 { USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },
191
Marcel Holtmann6c9d4352015-10-17 14:39:27 +0200192 /* Broadcom BCM2045 devices */
193 { USB_DEVICE(0x0a5c, 0x2045), .driver_info = BTUSB_BCM2045 },
194
Bala Shanmugambe931122010-11-26 17:35:46 +0530195 /* Atheros 3011 with sflash firmware */
Andy Shevchenko0b880062014-02-18 18:26:19 +0200196 { USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE },
197 { USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
Alexander Ploumistos2eeff0b2015-02-13 21:05:11 +0200198 { USB_DEVICE(0x04f2, 0xaff1), .driver_info = BTUSB_IGNORE },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200199 { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
Bala Shanmugambe931122010-11-26 17:35:46 +0530200 { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
Marek Vasut6eda5412012-06-08 14:32:50 +0200201 { USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
Andy Ross2a7bccc2011-05-09 16:11:16 -0700202 { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
Bala Shanmugambe931122010-11-26 17:35:46 +0530203
Cho, Yu-Chen509e7862011-01-26 17:10:59 +0800204 /* Atheros AR9285 Malbec with sflash firmware */
205 { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
206
Bala Shanmugamd9f51b52011-02-11 15:38:53 +0530207 /* Atheros 3012 with sflash firmware */
Andy Shevchenko0b880062014-02-18 18:26:19 +0200208 { USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
209 { USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
210 { USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
211 { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
212 { USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin692c0622015-06-06 20:25:40 +0300213 { USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
Anantha Krishnan4b552bc2014-10-06 16:31:49 +0530214 { USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin28c971d2016-02-10 00:49:11 +0300215 { USB_DEVICE(0x0489, 0xe095), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200216 { USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
217 { USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
218 { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
219 { USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
Mohammed Habibulla1fb4e092014-04-17 11:37:13 -0700220 { USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200221 { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
222 { USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin7e730c7f2015-06-18 20:41:51 +0300223 { USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 },
Dmitry Tuninec0810d2015-05-02 13:36:58 +0300224 { USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 },
Janne Heikkinen134d3b32014-12-09 07:44:51 +0200225 { USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin81d90442016-02-28 11:04:06 +0300226 { USB_DEVICE(0x04ca, 0x3014), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin441ad622017-01-05 13:19:53 +0300227 { USB_DEVICE(0x04ca, 0x3018), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200228 { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
Dmitry Tunincd355ff2015-10-05 19:29:33 +0300229 { USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200230 { USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
Vincent Zwanenburg89d29752014-08-08 12:33:56 +0100231 { USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
Andy Shevchenkoa735f9e2014-02-18 18:26:20 +0200232 { USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
Ming Leid66629c2013-03-15 11:00:39 +0800233 { USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
Sunguk Lee94a32d102013-03-12 04:41:58 +0900234 { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
Cho, Yu-Chen07c0ea82012-03-14 22:01:21 +0200235 { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
Oliver Neukumb1312372014-01-16 15:37:11 +0100236 { USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
Oliver Neukum1e56f1e2014-01-16 16:02:58 +0100237 { USB_DEVICE(0x0cf3, 0x311f), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200238 { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
Ming Leiebaf5792013-03-18 23:45:11 +0800239 { USB_DEVICE(0x0cf3, 0x817a), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin18e0afa2015-10-16 11:45:26 +0300240 { USB_DEVICE(0x0cf3, 0x817b), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200241 { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
AceLan Kaoac713112012-04-19 14:53:45 +0800242 { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
Peng Chen0a3658c2013-08-30 17:41:40 +0800243 { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
Wen-chien Jesse Sungca79f232015-05-13 11:39:24 +0800244 { USB_DEVICE(0x0cf3, 0xe006), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200245 { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
246 { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
AceLan Kaoeed307e2012-12-11 11:41:20 +0800247 { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin609574e2016-02-10 15:33:17 +0300248 { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
Sujith Manoharan5b77a1f2013-07-15 09:29:03 +0530249 { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin3bb30a7c2014-11-25 20:19:52 +0300250 { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin033efa92015-01-18 00:16:51 +0300251 { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 },
Anantha Krishnanfa2f1392014-07-08 19:25:08 +0530252 { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin75c6aca2016-03-04 01:32:19 +0300253 { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin0d0cef62015-06-06 20:29:25 +0300254 { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
Lauro Costa72f9f8b2016-05-09 17:36:11 -0300255 { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin12d86892016-07-12 01:35:18 +0300256 { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 },
Bala Shanmugamd9f51b52011-02-11 15:38:53 +0530257
Cho, Yu-Chene9036e32011-02-15 10:20:07 +0800258 /* Atheros AR5BBU12 with sflash firmware */
259 { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
260
Michael Gruetzner85d59722012-05-02 22:33:40 +0200261 /* Atheros AR5BBU12 with sflash firmware */
Yevgeniy Melnichukbc21fde2012-08-07 19:48:10 +0530262 { USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200263 { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
Michael Gruetzner85d59722012-05-02 22:33:40 +0200264
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +0000265 /* QCA ROME chipset */
Takashi Iwaif44cb4b2018-03-15 17:02:34 +0100266 { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_QCA_ROME },
Wen-chien Jesse Sung20541112015-05-13 11:39:25 +0800267 { USB_DEVICE(0x0cf3, 0xe007), .driver_info = BTUSB_QCA_ROME },
Kai-Heng Feng93519932016-08-16 12:50:06 +0800268 { USB_DEVICE(0x0cf3, 0xe009), .driver_info = BTUSB_QCA_ROME },
AceLan Kaoe5a49ee2018-01-02 10:41:11 +0800269 { USB_DEVICE(0x0cf3, 0xe010), .driver_info = BTUSB_QCA_ROME },
Marcel Holtmannc9e44472015-03-16 23:56:04 -0700270 { USB_DEVICE(0x0cf3, 0xe300), .driver_info = BTUSB_QCA_ROME },
Gabriel1eef1c32017-02-20 12:32:22 -0500271 { USB_DEVICE(0x0cf3, 0xe301), .driver_info = BTUSB_QCA_ROME },
Marcel Holtmannc9e44472015-03-16 23:56:04 -0700272 { USB_DEVICE(0x0cf3, 0xe360), .driver_info = BTUSB_QCA_ROME },
Yvain THONNART47ca5892016-06-11 15:43:30 +0200273 { USB_DEVICE(0x0489, 0xe092), .driver_info = BTUSB_QCA_ROME },
Bartosz Chronowski858ff382017-10-26 10:22:43 +0200274 { USB_DEVICE(0x0489, 0xe09f), .driver_info = BTUSB_QCA_ROME },
Shih-Yuan Lee (FourDollars)06e41d82017-06-14 14:42:00 +0800275 { USB_DEVICE(0x0489, 0xe0a2), .driver_info = BTUSB_QCA_ROME },
Dmitry Tunin1144a4e2016-09-21 19:13:08 +0300276 { USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME },
Ioan Moldovan0a03f982017-08-28 18:09:39 +0300277 { USB_DEVICE(0x04ca, 0x3015), .driver_info = BTUSB_QCA_ROME },
Brian Norrisd829b9e2017-07-31 17:59:39 -0700278 { USB_DEVICE(0x04ca, 0x3016), .driver_info = BTUSB_QCA_ROME },
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +0000279
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200280 /* Broadcom BCM2035 */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100281 { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200282 { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
283 { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200284
285 /* Broadcom BCM2045 */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100286 { USB_DEVICE(0x0a5c, 0x2039), .driver_info = BTUSB_WRONG_SCO_MTU },
287 { USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmannbdbef3d2008-09-23 00:16:35 +0200288
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200289 /* IBM/Lenovo ThinkPad with Broadcom chip */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100290 { USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_WRONG_SCO_MTU },
291 { USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200292
293 /* HP laptop with Broadcom chip */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100294 { USB_DEVICE(0x03f0, 0x171d), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200295
296 /* Dell laptop with Broadcom chip */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100297 { USB_DEVICE(0x413c, 0x8126), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200298
Marcel Holtmann5ddd4a62008-11-30 12:17:27 +0100299 /* Dell Wireless 370 and 410 devices */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100300 { USB_DEVICE(0x413c, 0x8152), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmann5ddd4a62008-11-30 12:17:27 +0100301 { USB_DEVICE(0x413c, 0x8156), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200302
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100303 /* Belkin F8T012 and F8T013 devices */
304 { USB_DEVICE(0x050d, 0x0012), .driver_info = BTUSB_WRONG_SCO_MTU },
305 { USB_DEVICE(0x050d, 0x0013), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200306
Marcel Holtmann5ddd4a62008-11-30 12:17:27 +0100307 /* Asus WL-BTD202 device */
308 { USB_DEVICE(0x0b05, 0x1715), .driver_info = BTUSB_WRONG_SCO_MTU },
309
310 /* Kensington Bluetooth USB adapter */
311 { USB_DEVICE(0x047d, 0x105e), .driver_info = BTUSB_WRONG_SCO_MTU },
312
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200313 /* RTX Telecom based adapters with buggy SCO support */
314 { USB_DEVICE(0x0400, 0x0807), .driver_info = BTUSB_BROKEN_ISOC },
315 { USB_DEVICE(0x0400, 0x080a), .driver_info = BTUSB_BROKEN_ISOC },
316
317 /* CONWISE Technology based adapters with buggy SCO support */
Szymon Janc418678b2016-09-01 17:22:37 +0200318 { USB_DEVICE(0x0e5e, 0x6622),
319 .driver_info = BTUSB_BROKEN_ISOC | BTUSB_CW6622},
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200320
Marcel Holtmann4fcef8e2015-01-01 17:34:37 -0800321 /* Roper Class 1 Bluetooth Dongle (Silicon Wave based) */
Aleksei Volkov2eeac872015-06-08 12:02:10 +0300322 { USB_DEVICE(0x1310, 0x0001), .driver_info = BTUSB_SWAVE },
Marcel Holtmann4fcef8e2015-01-01 17:34:37 -0800323
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200324 /* Digianswer devices */
325 { USB_DEVICE(0x08fd, 0x0001), .driver_info = BTUSB_DIGIANSWER },
326 { USB_DEVICE(0x08fd, 0x0002), .driver_info = BTUSB_IGNORE },
327
328 /* CSR BlueCore Bluetooth Sniffer */
Marcel Holtmann4f64fa82014-07-07 00:12:04 +0200329 { USB_DEVICE(0x0a12, 0x0002),
330 .driver_info = BTUSB_SNIFFER | BTUSB_BROKEN_ISOC },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200331
332 /* Frontline ComProbe Bluetooth Sniffer */
Marcel Holtmann4f64fa82014-07-07 00:12:04 +0200333 { USB_DEVICE(0x16d3, 0x0002),
334 .driver_info = BTUSB_SNIFFER | BTUSB_BROKEN_ISOC },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200335
Marcel Holtmanncb1ee892015-01-28 19:41:42 -0800336 /* Marvell Bluetooth devices */
337 { USB_DEVICE(0x1286, 0x2044), .driver_info = BTUSB_MARVELL },
338 { USB_DEVICE(0x1286, 0x2046), .driver_info = BTUSB_MARVELL },
Amitkumar Karwar1165df02016-09-28 16:18:35 +0530339 { USB_DEVICE(0x1286, 0x204e), .driver_info = BTUSB_MARVELL },
Marcel Holtmanncb1ee892015-01-28 19:41:42 -0800340
Marcel Holtmannd0ac9eb2015-01-28 19:41:43 -0800341 /* Intel Bluetooth devices */
Marcel Holtmannde766142017-03-06 15:38:28 -0800342 { USB_DEVICE(0x8087, 0x0025), .driver_info = BTUSB_INTEL_NEW },
Tedd Ho-Jeong An1ce0cec2018-02-05 14:20:36 -0800343 { USB_DEVICE(0x8087, 0x0026), .driver_info = BTUSB_INTEL_NEW },
Marcel Holtmann407550f2015-02-22 15:41:18 -0800344 { USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR },
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -0700345 { USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL },
Tedd Ho-Jeong Anef4e5e42013-11-12 13:10:58 -0800346 { USB_DEVICE(0x8087, 0x0a2a), .driver_info = BTUSB_INTEL },
Marcel Holtmanncda0dd72015-01-26 21:33:48 -0800347 { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW },
Tedd Ho-Jeong An439e65d2016-06-20 13:43:40 -0700348 { USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL },
Tedd Ho-Jeong An86a61292017-05-01 13:35:12 -0700349 { USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW },
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -0700350
Marcel Holtmannd0ac9eb2015-01-28 19:41:43 -0800351 /* Other Intel Bluetooth devices */
352 { USB_VENDOR_AND_INTERFACE_INFO(0x8087, 0xe0, 0x01, 0x01),
353 .driver_info = BTUSB_IGNORE },
Amitkumar Karwarae8df492014-07-18 14:47:06 -0700354
Daniel Drakea2698a92015-04-16 14:09:55 -0600355 /* Realtek Bluetooth devices */
356 { USB_VENDOR_AND_INTERFACE_INFO(0x0bda, 0xe0, 0x01, 0x01),
357 .driver_info = BTUSB_REALTEK },
358
359 /* Additional Realtek 8723AE Bluetooth devices */
360 { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK },
361 { USB_DEVICE(0x13d3, 0x3394), .driver_info = BTUSB_REALTEK },
362
363 /* Additional Realtek 8723BE Bluetooth devices */
364 { USB_DEVICE(0x0489, 0xe085), .driver_info = BTUSB_REALTEK },
365 { USB_DEVICE(0x0489, 0xe08b), .driver_info = BTUSB_REALTEK },
366 { USB_DEVICE(0x13d3, 0x3410), .driver_info = BTUSB_REALTEK },
367 { USB_DEVICE(0x13d3, 0x3416), .driver_info = BTUSB_REALTEK },
368 { USB_DEVICE(0x13d3, 0x3459), .driver_info = BTUSB_REALTEK },
Dmitry Tunina81d72d2017-08-08 14:09:02 +0300369 { USB_DEVICE(0x13d3, 0x3494), .driver_info = BTUSB_REALTEK },
Daniel Drakea2698a92015-04-16 14:09:55 -0600370
Vicente Bergasa41e0792018-03-20 19:41:10 +0100371 /* Additional Realtek 8723BU Bluetooth devices */
372 { USB_DEVICE(0x7392, 0xa611), .driver_info = BTUSB_REALTEK },
373
Daniel Drakea2698a92015-04-16 14:09:55 -0600374 /* Additional Realtek 8821AE Bluetooth devices */
375 { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK },
376 { USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK },
377 { USB_DEVICE(0x13d3, 0x3458), .driver_info = BTUSB_REALTEK },
378 { USB_DEVICE(0x13d3, 0x3461), .driver_info = BTUSB_REALTEK },
379 { USB_DEVICE(0x13d3, 0x3462), .driver_info = BTUSB_REALTEK },
380
Larry Fingerfed03fe2018-02-11 12:24:32 -0600381 /* Additional Realtek 8822BE Bluetooth devices */
382 { USB_DEVICE(0x0b05, 0x185c), .driver_info = BTUSB_REALTEK },
383
Peter Poklop4481c072015-08-15 20:47:09 +0200384 /* Silicon Wave based devices */
385 { USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_SWAVE },
386
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200387 { } /* Terminating entry */
388};
389
Hans de Goede1fdb9262018-02-20 09:06:18 +0100390/* The Bluetooth USB module build into some devices needs to be reset on resume,
391 * this is a problem with the platform (likely shutting off all power) not with
392 * the module itself. So we use a DMI list to match known broken platforms.
393 */
394static const struct dmi_system_id btusb_needs_reset_resume_table[] = {
395 {
Kai-Heng Feng0c6e5262018-03-01 13:42:52 +0800396 /* Dell OptiPlex 3060 (QCA ROME device 0cf3:e007) */
Hans de Goede1fdb9262018-02-20 09:06:18 +0100397 .matches = {
Kai-Heng Feng0c6e5262018-03-01 13:42:52 +0800398 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
399 DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 3060"),
Hans de Goede1fdb9262018-02-20 09:06:18 +0100400 },
401 },
402 {}
403};
404
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200405#define BTUSB_MAX_ISOC_FRAMES 10
406
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200407#define BTUSB_INTR_RUNNING 0
408#define BTUSB_BULK_RUNNING 1
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200409#define BTUSB_ISOC_RUNNING 2
Oliver Neukum7bee5492009-08-24 23:44:59 +0200410#define BTUSB_SUSPENDING 3
Gustavo F. Padovan08b8b6c2010-07-16 17:20:33 -0300411#define BTUSB_DID_ISO_RESUME 4
Marcel Holtmanncda0dd72015-01-26 21:33:48 -0800412#define BTUSB_BOOTLOADER 5
413#define BTUSB_DOWNLOADING 6
Marcel Holtmannce6bb922015-01-28 01:58:40 -0800414#define BTUSB_FIRMWARE_LOADED 7
Marcel Holtmanncda0dd72015-01-26 21:33:48 -0800415#define BTUSB_FIRMWARE_FAILED 8
Marcel Holtmannce6bb922015-01-28 01:58:40 -0800416#define BTUSB_BOOTING 9
Hans de Goede61f5ace2018-01-08 10:44:16 +0100417#define BTUSB_DIAG_RUNNING 10
418#define BTUSB_OOB_WAKE_ENABLED 11
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200419
420struct btusb_data {
421 struct hci_dev *hdev;
422 struct usb_device *udev;
Marcel Holtmann5fbcd262008-09-23 00:16:36 +0200423 struct usb_interface *intf;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200424 struct usb_interface *isoc;
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200425 struct usb_interface *diag;
Marcel Holtmann459232f2017-10-24 19:42:45 +0200426 unsigned isoc_ifnum;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200427
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200428 unsigned long flags;
429
430 struct work_struct work;
Oliver Neukum7bee5492009-08-24 23:44:59 +0200431 struct work_struct waker;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200432
Marcel Holtmann803b5832014-09-16 08:00:29 +0200433 struct usb_anchor deferred;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200434 struct usb_anchor tx_anchor;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200435 int tx_in_flight;
436 spinlock_t txlock;
437
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200438 struct usb_anchor intr_anchor;
439 struct usb_anchor bulk_anchor;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200440 struct usb_anchor isoc_anchor;
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200441 struct usb_anchor diag_anchor;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200442 spinlock_t rxlock;
443
444 struct sk_buff *evt_skb;
445 struct sk_buff *acl_skb;
446 struct sk_buff *sco_skb;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200447
448 struct usb_endpoint_descriptor *intr_ep;
449 struct usb_endpoint_descriptor *bulk_tx_ep;
450 struct usb_endpoint_descriptor *bulk_rx_ep;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200451 struct usb_endpoint_descriptor *isoc_tx_ep;
452 struct usb_endpoint_descriptor *isoc_rx_ep;
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200453 struct usb_endpoint_descriptor *diag_tx_ep;
454 struct usb_endpoint_descriptor *diag_rx_ep;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200455
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100456 __u8 cmdreq_type;
Marcel Holtmann893ba542015-01-28 20:27:34 -0800457 __u8 cmdreq;
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100458
Marcel Holtmann43c2e572009-02-04 17:41:38 +0100459 unsigned int sco_num;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200460 int isoc_altsetting;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +0100461 int suspend_count;
Marcel Holtmann2cbd3f52014-11-03 05:16:07 +0100462
Marcel Holtmann97307f52015-01-12 13:51:10 -0800463 int (*recv_event)(struct hci_dev *hdev, struct sk_buff *skb);
Marcel Holtmann2cbd3f52014-11-03 05:16:07 +0100464 int (*recv_bulk)(struct btusb_data *data, void *buffer, int count);
Kim, Ben Young Taeace31982015-02-15 23:06:14 +0000465
466 int (*setup_on_usb)(struct hci_dev *hdev);
Rajat Jainfd913ef2017-02-01 14:24:09 -0800467
468 int oob_wake_irq; /* irq for out-of-band wake-on-bt */
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200469};
470
Marcel Holtmann803b5832014-09-16 08:00:29 +0200471static inline void btusb_free_frags(struct btusb_data *data)
472{
473 unsigned long flags;
474
475 spin_lock_irqsave(&data->rxlock, flags);
476
477 kfree_skb(data->evt_skb);
478 data->evt_skb = NULL;
479
480 kfree_skb(data->acl_skb);
481 data->acl_skb = NULL;
482
483 kfree_skb(data->sco_skb);
484 data->sco_skb = NULL;
485
486 spin_unlock_irqrestore(&data->rxlock, flags);
487}
488
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200489static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count)
490{
Marcel Holtmann803b5832014-09-16 08:00:29 +0200491 struct sk_buff *skb;
492 int err = 0;
493
494 spin_lock(&data->rxlock);
495 skb = data->evt_skb;
496
497 while (count) {
498 int len;
499
500 if (!skb) {
501 skb = bt_skb_alloc(HCI_MAX_EVENT_SIZE, GFP_ATOMIC);
502 if (!skb) {
503 err = -ENOMEM;
504 break;
505 }
506
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100507 hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
508 hci_skb_expect(skb) = HCI_EVENT_HDR_SIZE;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200509 }
510
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100511 len = min_t(uint, hci_skb_expect(skb), count);
Johannes Berg59ae1d12017-06-16 14:29:20 +0200512 skb_put_data(skb, buffer, len);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200513
514 count -= len;
515 buffer += len;
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100516 hci_skb_expect(skb) -= len;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200517
518 if (skb->len == HCI_EVENT_HDR_SIZE) {
519 /* Complete event header */
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100520 hci_skb_expect(skb) = hci_event_hdr(skb)->plen;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200521
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100522 if (skb_tailroom(skb) < hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200523 kfree_skb(skb);
524 skb = NULL;
525
526 err = -EILSEQ;
527 break;
528 }
529 }
530
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100531 if (!hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200532 /* Complete frame */
Marcel Holtmann97307f52015-01-12 13:51:10 -0800533 data->recv_event(data->hdev, skb);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200534 skb = NULL;
535 }
536 }
537
538 data->evt_skb = skb;
539 spin_unlock(&data->rxlock);
540
541 return err;
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200542}
543
544static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
545{
Marcel Holtmann803b5832014-09-16 08:00:29 +0200546 struct sk_buff *skb;
547 int err = 0;
548
549 spin_lock(&data->rxlock);
550 skb = data->acl_skb;
551
552 while (count) {
553 int len;
554
555 if (!skb) {
556 skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
557 if (!skb) {
558 err = -ENOMEM;
559 break;
560 }
561
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100562 hci_skb_pkt_type(skb) = HCI_ACLDATA_PKT;
563 hci_skb_expect(skb) = HCI_ACL_HDR_SIZE;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200564 }
565
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100566 len = min_t(uint, hci_skb_expect(skb), count);
Johannes Berg59ae1d12017-06-16 14:29:20 +0200567 skb_put_data(skb, buffer, len);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200568
569 count -= len;
570 buffer += len;
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100571 hci_skb_expect(skb) -= len;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200572
573 if (skb->len == HCI_ACL_HDR_SIZE) {
574 __le16 dlen = hci_acl_hdr(skb)->dlen;
575
576 /* Complete ACL header */
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100577 hci_skb_expect(skb) = __le16_to_cpu(dlen);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200578
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100579 if (skb_tailroom(skb) < hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200580 kfree_skb(skb);
581 skb = NULL;
582
583 err = -EILSEQ;
584 break;
585 }
586 }
587
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100588 if (!hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200589 /* Complete frame */
590 hci_recv_frame(data->hdev, skb);
591 skb = NULL;
592 }
593 }
594
595 data->acl_skb = skb;
596 spin_unlock(&data->rxlock);
597
598 return err;
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200599}
600
601static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count)
602{
Marcel Holtmann803b5832014-09-16 08:00:29 +0200603 struct sk_buff *skb;
604 int err = 0;
605
606 spin_lock(&data->rxlock);
607 skb = data->sco_skb;
608
609 while (count) {
610 int len;
611
612 if (!skb) {
613 skb = bt_skb_alloc(HCI_MAX_SCO_SIZE, GFP_ATOMIC);
614 if (!skb) {
615 err = -ENOMEM;
616 break;
617 }
618
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100619 hci_skb_pkt_type(skb) = HCI_SCODATA_PKT;
620 hci_skb_expect(skb) = HCI_SCO_HDR_SIZE;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200621 }
622
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100623 len = min_t(uint, hci_skb_expect(skb), count);
Johannes Berg59ae1d12017-06-16 14:29:20 +0200624 skb_put_data(skb, buffer, len);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200625
626 count -= len;
627 buffer += len;
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100628 hci_skb_expect(skb) -= len;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200629
630 if (skb->len == HCI_SCO_HDR_SIZE) {
631 /* Complete SCO header */
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100632 hci_skb_expect(skb) = hci_sco_hdr(skb)->dlen;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200633
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100634 if (skb_tailroom(skb) < hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200635 kfree_skb(skb);
636 skb = NULL;
637
638 err = -EILSEQ;
639 break;
640 }
641 }
642
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100643 if (!hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200644 /* Complete frame */
645 hci_recv_frame(data->hdev, skb);
646 skb = NULL;
647 }
648 }
649
650 data->sco_skb = skb;
651 spin_unlock(&data->rxlock);
652
653 return err;
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200654}
655
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200656static void btusb_intr_complete(struct urb *urb)
657{
658 struct hci_dev *hdev = urb->context;
David Herrmann155961e2012-02-09 21:58:32 +0100659 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200660 int err;
661
Marcel Holtmann89e75332014-09-16 04:44:50 +0200662 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
663 urb->actual_length);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200664
665 if (!test_bit(HCI_RUNNING, &hdev->flags))
666 return;
667
668 if (urb->status == 0) {
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200669 hdev->stat.byte_rx += urb->actual_length;
670
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200671 if (btusb_recv_intr(data, urb->transfer_buffer,
672 urb->actual_length) < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100673 bt_dev_err(hdev, "corrupted event packet");
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200674 hdev->stat.err_rx++;
675 }
Champion Chen85560c42014-09-06 14:06:08 -0500676 } else if (urb->status == -ENOENT) {
677 /* Avoid suspend failed when usb_kill_urb */
678 return;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200679 }
680
681 if (!test_bit(BTUSB_INTR_RUNNING, &data->flags))
682 return;
683
Oliver Neukum7bee5492009-08-24 23:44:59 +0200684 usb_mark_last_busy(data->udev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200685 usb_anchor_urb(urb, &data->intr_anchor);
686
687 err = usb_submit_urb(urb, GFP_ATOMIC);
688 if (err < 0) {
Paul Bolle4935f1c2011-08-09 17:16:28 +0200689 /* -EPERM: urb is being killed;
Derek Robsond98422c2017-07-22 13:47:07 +1200690 * -ENODEV: device got disconnected
691 */
Paul Bolle4935f1c2011-08-09 17:16:28 +0200692 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100693 bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
694 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200695 usb_unanchor_urb(urb);
696 }
697}
698
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100699static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200700{
David Herrmann155961e2012-02-09 21:58:32 +0100701 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200702 struct urb *urb;
703 unsigned char *buf;
704 unsigned int pipe;
705 int err, size;
706
707 BT_DBG("%s", hdev->name);
708
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200709 if (!data->intr_ep)
710 return -ENODEV;
711
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100712 urb = usb_alloc_urb(0, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200713 if (!urb)
714 return -ENOMEM;
715
716 size = le16_to_cpu(data->intr_ep->wMaxPacketSize);
717
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100718 buf = kmalloc(size, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200719 if (!buf) {
720 usb_free_urb(urb);
721 return -ENOMEM;
722 }
723
724 pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress);
725
726 usb_fill_int_urb(urb, data->udev, pipe, buf, size,
Marcel Holtmann89e75332014-09-16 04:44:50 +0200727 btusb_intr_complete, hdev, data->intr_ep->bInterval);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200728
729 urb->transfer_flags |= URB_FREE_BUFFER;
730
731 usb_anchor_urb(urb, &data->intr_anchor);
732
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100733 err = usb_submit_urb(urb, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200734 if (err < 0) {
Paul Bolled4b8d1c2011-10-09 12:12:22 +0200735 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100736 bt_dev_err(hdev, "urb %p submission failed (%d)",
737 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200738 usb_unanchor_urb(urb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200739 }
740
741 usb_free_urb(urb);
742
743 return err;
744}
745
746static void btusb_bulk_complete(struct urb *urb)
747{
748 struct hci_dev *hdev = urb->context;
David Herrmann155961e2012-02-09 21:58:32 +0100749 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200750 int err;
751
Marcel Holtmann89e75332014-09-16 04:44:50 +0200752 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
753 urb->actual_length);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200754
755 if (!test_bit(HCI_RUNNING, &hdev->flags))
756 return;
757
758 if (urb->status == 0) {
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200759 hdev->stat.byte_rx += urb->actual_length;
760
Marcel Holtmann2cbd3f52014-11-03 05:16:07 +0100761 if (data->recv_bulk(data, urb->transfer_buffer,
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200762 urb->actual_length) < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100763 bt_dev_err(hdev, "corrupted ACL packet");
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200764 hdev->stat.err_rx++;
765 }
Champion Chen85560c42014-09-06 14:06:08 -0500766 } else if (urb->status == -ENOENT) {
767 /* Avoid suspend failed when usb_kill_urb */
768 return;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200769 }
770
771 if (!test_bit(BTUSB_BULK_RUNNING, &data->flags))
772 return;
773
774 usb_anchor_urb(urb, &data->bulk_anchor);
Oliver Neukum652fd782009-12-16 19:23:43 +0100775 usb_mark_last_busy(data->udev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200776
777 err = usb_submit_urb(urb, GFP_ATOMIC);
778 if (err < 0) {
Paul Bolle4935f1c2011-08-09 17:16:28 +0200779 /* -EPERM: urb is being killed;
Derek Robsond98422c2017-07-22 13:47:07 +1200780 * -ENODEV: device got disconnected
781 */
Paul Bolle4935f1c2011-08-09 17:16:28 +0200782 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100783 bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
784 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200785 usb_unanchor_urb(urb);
786 }
787}
788
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100789static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200790{
David Herrmann155961e2012-02-09 21:58:32 +0100791 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200792 struct urb *urb;
793 unsigned char *buf;
794 unsigned int pipe;
Vikram Kandukuri290ba202009-07-02 14:31:59 +0530795 int err, size = HCI_MAX_FRAME_SIZE;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200796
797 BT_DBG("%s", hdev->name);
798
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200799 if (!data->bulk_rx_ep)
800 return -ENODEV;
801
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100802 urb = usb_alloc_urb(0, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200803 if (!urb)
804 return -ENOMEM;
805
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100806 buf = kmalloc(size, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200807 if (!buf) {
808 usb_free_urb(urb);
809 return -ENOMEM;
810 }
811
812 pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress);
813
Marcel Holtmann89e75332014-09-16 04:44:50 +0200814 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
815 btusb_bulk_complete, hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200816
817 urb->transfer_flags |= URB_FREE_BUFFER;
818
Oliver Neukum7bee5492009-08-24 23:44:59 +0200819 usb_mark_last_busy(data->udev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200820 usb_anchor_urb(urb, &data->bulk_anchor);
821
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100822 err = usb_submit_urb(urb, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200823 if (err < 0) {
Paul Bolled4b8d1c2011-10-09 12:12:22 +0200824 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100825 bt_dev_err(hdev, "urb %p submission failed (%d)",
826 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200827 usb_unanchor_urb(urb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200828 }
829
830 usb_free_urb(urb);
831
832 return err;
833}
834
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200835static void btusb_isoc_complete(struct urb *urb)
836{
837 struct hci_dev *hdev = urb->context;
David Herrmann155961e2012-02-09 21:58:32 +0100838 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200839 int i, err;
840
Marcel Holtmann89e75332014-09-16 04:44:50 +0200841 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
842 urb->actual_length);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200843
844 if (!test_bit(HCI_RUNNING, &hdev->flags))
845 return;
846
847 if (urb->status == 0) {
848 for (i = 0; i < urb->number_of_packets; i++) {
849 unsigned int offset = urb->iso_frame_desc[i].offset;
850 unsigned int length = urb->iso_frame_desc[i].actual_length;
851
852 if (urb->iso_frame_desc[i].status)
853 continue;
854
855 hdev->stat.byte_rx += length;
856
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200857 if (btusb_recv_isoc(data, urb->transfer_buffer + offset,
858 length) < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100859 bt_dev_err(hdev, "corrupted SCO packet");
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200860 hdev->stat.err_rx++;
861 }
862 }
Champion Chen85560c42014-09-06 14:06:08 -0500863 } else if (urb->status == -ENOENT) {
864 /* Avoid suspend failed when usb_kill_urb */
865 return;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200866 }
867
868 if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags))
869 return;
870
871 usb_anchor_urb(urb, &data->isoc_anchor);
872
873 err = usb_submit_urb(urb, GFP_ATOMIC);
874 if (err < 0) {
Paul Bolle4935f1c2011-08-09 17:16:28 +0200875 /* -EPERM: urb is being killed;
Derek Robsond98422c2017-07-22 13:47:07 +1200876 * -ENODEV: device got disconnected
877 */
Paul Bolle4935f1c2011-08-09 17:16:28 +0200878 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100879 bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
880 urb, -err);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200881 usb_unanchor_urb(urb);
882 }
883}
884
Jesper Juhl42b16b32011-01-17 00:09:38 +0100885static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200886{
887 int i, offset = 0;
888
889 BT_DBG("len %d mtu %d", len, mtu);
890
891 for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu;
892 i++, offset += mtu, len -= mtu) {
893 urb->iso_frame_desc[i].offset = offset;
894 urb->iso_frame_desc[i].length = mtu;
895 }
896
897 if (len && i < BTUSB_MAX_ISOC_FRAMES) {
898 urb->iso_frame_desc[i].offset = offset;
899 urb->iso_frame_desc[i].length = len;
900 i++;
901 }
902
903 urb->number_of_packets = i;
904}
905
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100906static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200907{
David Herrmann155961e2012-02-09 21:58:32 +0100908 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200909 struct urb *urb;
910 unsigned char *buf;
911 unsigned int pipe;
912 int err, size;
913
914 BT_DBG("%s", hdev->name);
915
916 if (!data->isoc_rx_ep)
917 return -ENODEV;
918
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100919 urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, mem_flags);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200920 if (!urb)
921 return -ENOMEM;
922
923 size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *
924 BTUSB_MAX_ISOC_FRAMES;
925
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100926 buf = kmalloc(size, mem_flags);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200927 if (!buf) {
928 usb_free_urb(urb);
929 return -ENOMEM;
930 }
931
932 pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress);
933
Bing Zhaofa0fb932011-12-20 18:19:00 -0800934 usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete,
Marcel Holtmann89e75332014-09-16 04:44:50 +0200935 hdev, data->isoc_rx_ep->bInterval);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200936
Marcel Holtmann89e75332014-09-16 04:44:50 +0200937 urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200938
939 __fill_isoc_descriptor(urb, size,
Marcel Holtmann89e75332014-09-16 04:44:50 +0200940 le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize));
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200941
942 usb_anchor_urb(urb, &data->isoc_anchor);
943
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100944 err = usb_submit_urb(urb, mem_flags);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200945 if (err < 0) {
Paul Bolled4b8d1c2011-10-09 12:12:22 +0200946 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100947 bt_dev_err(hdev, "urb %p submission failed (%d)",
948 urb, -err);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200949 usb_unanchor_urb(urb);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200950 }
951
952 usb_free_urb(urb);
953
954 return err;
955}
956
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200957static void btusb_diag_complete(struct urb *urb)
958{
959 struct hci_dev *hdev = urb->context;
960 struct btusb_data *data = hci_get_drvdata(hdev);
961 int err;
962
963 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
964 urb->actual_length);
965
966 if (urb->status == 0) {
967 struct sk_buff *skb;
968
969 skb = bt_skb_alloc(urb->actual_length, GFP_ATOMIC);
970 if (skb) {
Johannes Berg59ae1d12017-06-16 14:29:20 +0200971 skb_put_data(skb, urb->transfer_buffer,
972 urb->actual_length);
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200973 hci_recv_diag(hdev, skb);
974 }
975 } else if (urb->status == -ENOENT) {
976 /* Avoid suspend failed when usb_kill_urb */
977 return;
978 }
979
980 if (!test_bit(BTUSB_DIAG_RUNNING, &data->flags))
981 return;
982
983 usb_anchor_urb(urb, &data->diag_anchor);
984 usb_mark_last_busy(data->udev);
985
986 err = usb_submit_urb(urb, GFP_ATOMIC);
987 if (err < 0) {
988 /* -EPERM: urb is being killed;
Derek Robsond98422c2017-07-22 13:47:07 +1200989 * -ENODEV: device got disconnected
990 */
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200991 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100992 bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
993 urb, -err);
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200994 usb_unanchor_urb(urb);
995 }
996}
997
998static int btusb_submit_diag_urb(struct hci_dev *hdev, gfp_t mem_flags)
999{
1000 struct btusb_data *data = hci_get_drvdata(hdev);
1001 struct urb *urb;
1002 unsigned char *buf;
1003 unsigned int pipe;
1004 int err, size = HCI_MAX_FRAME_SIZE;
1005
1006 BT_DBG("%s", hdev->name);
1007
1008 if (!data->diag_rx_ep)
1009 return -ENODEV;
1010
1011 urb = usb_alloc_urb(0, mem_flags);
1012 if (!urb)
1013 return -ENOMEM;
1014
1015 buf = kmalloc(size, mem_flags);
1016 if (!buf) {
1017 usb_free_urb(urb);
1018 return -ENOMEM;
1019 }
1020
1021 pipe = usb_rcvbulkpipe(data->udev, data->diag_rx_ep->bEndpointAddress);
1022
1023 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
1024 btusb_diag_complete, hdev);
1025
1026 urb->transfer_flags |= URB_FREE_BUFFER;
1027
1028 usb_mark_last_busy(data->udev);
1029 usb_anchor_urb(urb, &data->diag_anchor);
1030
1031 err = usb_submit_urb(urb, mem_flags);
1032 if (err < 0) {
1033 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001034 bt_dev_err(hdev, "urb %p submission failed (%d)",
1035 urb, -err);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001036 usb_unanchor_urb(urb);
1037 }
1038
1039 usb_free_urb(urb);
1040
1041 return err;
1042}
1043
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001044static void btusb_tx_complete(struct urb *urb)
1045{
1046 struct sk_buff *skb = urb->context;
Marcel Holtmann89e75332014-09-16 04:44:50 +02001047 struct hci_dev *hdev = (struct hci_dev *)skb->dev;
David Herrmann155961e2012-02-09 21:58:32 +01001048 struct btusb_data *data = hci_get_drvdata(hdev);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001049
Marcel Holtmann89e75332014-09-16 04:44:50 +02001050 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
1051 urb->actual_length);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001052
1053 if (!test_bit(HCI_RUNNING, &hdev->flags))
1054 goto done;
1055
1056 if (!urb->status)
1057 hdev->stat.byte_tx += urb->transfer_buffer_length;
1058 else
1059 hdev->stat.err_tx++;
1060
1061done:
1062 spin_lock(&data->txlock);
1063 data->tx_in_flight--;
1064 spin_unlock(&data->txlock);
1065
1066 kfree(urb->setup_packet);
1067
1068 kfree_skb(skb);
1069}
1070
1071static void btusb_isoc_tx_complete(struct urb *urb)
1072{
1073 struct sk_buff *skb = urb->context;
Marcel Holtmann89e75332014-09-16 04:44:50 +02001074 struct hci_dev *hdev = (struct hci_dev *)skb->dev;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001075
Marcel Holtmann89e75332014-09-16 04:44:50 +02001076 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
1077 urb->actual_length);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001078
1079 if (!test_bit(HCI_RUNNING, &hdev->flags))
1080 goto done;
1081
1082 if (!urb->status)
1083 hdev->stat.byte_tx += urb->transfer_buffer_length;
1084 else
1085 hdev->stat.err_tx++;
1086
1087done:
1088 kfree(urb->setup_packet);
1089
1090 kfree_skb(skb);
1091}
1092
1093static int btusb_open(struct hci_dev *hdev)
1094{
David Herrmann155961e2012-02-09 21:58:32 +01001095 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001096 int err;
1097
1098 BT_DBG("%s", hdev->name);
1099
Ethan Hsiehc7e163f2016-10-07 12:06:42 +08001100 err = usb_autopm_get_interface(data->intf);
1101 if (err < 0)
1102 return err;
1103
Kim, Ben Young Taeace31982015-02-15 23:06:14 +00001104 /* Patching USB firmware files prior to starting any URBs of HCI path
1105 * It is more safe to use USB bulk channel for downloading USB patch
1106 */
1107 if (data->setup_on_usb) {
1108 err = data->setup_on_usb(hdev);
Marcel Holtmanneb500422015-04-16 23:15:50 +02001109 if (err < 0)
Kim, Ben Young Taeace31982015-02-15 23:06:14 +00001110 return err;
1111 }
1112
Oliver Neukum7bee5492009-08-24 23:44:59 +02001113 data->intf->needs_remote_wakeup = 1;
Sukumar Ghoraia0085f22017-08-16 14:46:55 -07001114 /* device specific wakeup source enabled and required for USB
1115 * remote wakeup while host is suspended
1116 */
1117 device_wakeup_enable(&data->udev->dev);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001118
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001119 if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
Oliver Neukum7bee5492009-08-24 23:44:59 +02001120 goto done;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001121
Marcel Holtmann2eda66f2008-11-30 12:17:10 +01001122 err = btusb_submit_intr_urb(hdev, GFP_KERNEL);
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001123 if (err < 0)
1124 goto failed;
1125
1126 err = btusb_submit_bulk_urb(hdev, GFP_KERNEL);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001127 if (err < 0) {
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001128 usb_kill_anchored_urbs(&data->intr_anchor);
1129 goto failed;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001130 }
1131
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001132 set_bit(BTUSB_BULK_RUNNING, &data->flags);
1133 btusb_submit_bulk_urb(hdev, GFP_KERNEL);
1134
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001135 if (data->diag) {
1136 if (!btusb_submit_diag_urb(hdev, GFP_KERNEL))
1137 set_bit(BTUSB_DIAG_RUNNING, &data->flags);
1138 }
1139
Oliver Neukum7bee5492009-08-24 23:44:59 +02001140done:
1141 usb_autopm_put_interface(data->intf);
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001142 return 0;
1143
1144failed:
1145 clear_bit(BTUSB_INTR_RUNNING, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001146 usb_autopm_put_interface(data->intf);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001147 return err;
1148}
1149
Oliver Neukum7bee5492009-08-24 23:44:59 +02001150static void btusb_stop_traffic(struct btusb_data *data)
1151{
1152 usb_kill_anchored_urbs(&data->intr_anchor);
1153 usb_kill_anchored_urbs(&data->bulk_anchor);
1154 usb_kill_anchored_urbs(&data->isoc_anchor);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001155 usb_kill_anchored_urbs(&data->diag_anchor);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001156}
1157
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001158static int btusb_close(struct hci_dev *hdev)
1159{
David Herrmann155961e2012-02-09 21:58:32 +01001160 struct btusb_data *data = hci_get_drvdata(hdev);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001161 int err;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001162
1163 BT_DBG("%s", hdev->name);
1164
Marcel Holtmanne8c3c3d2008-09-23 00:16:36 +02001165 cancel_work_sync(&data->work);
Linus Torvalds404291a2009-11-11 13:32:29 -08001166 cancel_work_sync(&data->waker);
Marcel Holtmanne8c3c3d2008-09-23 00:16:36 +02001167
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001168 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001169 clear_bit(BTUSB_BULK_RUNNING, &data->flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001170 clear_bit(BTUSB_INTR_RUNNING, &data->flags);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001171 clear_bit(BTUSB_DIAG_RUNNING, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001172
1173 btusb_stop_traffic(data);
Marcel Holtmann803b5832014-09-16 08:00:29 +02001174 btusb_free_frags(data);
1175
Oliver Neukum7bee5492009-08-24 23:44:59 +02001176 err = usb_autopm_get_interface(data->intf);
1177 if (err < 0)
Oliver Neukum7b8e2c12009-11-13 14:26:23 +01001178 goto failed;
Oliver Neukum7bee5492009-08-24 23:44:59 +02001179
1180 data->intf->needs_remote_wakeup = 0;
Sukumar Ghoraia0085f22017-08-16 14:46:55 -07001181 device_wakeup_disable(&data->udev->dev);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001182 usb_autopm_put_interface(data->intf);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001183
Oliver Neukum7b8e2c12009-11-13 14:26:23 +01001184failed:
1185 usb_scuttle_anchored_urbs(&data->deferred);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001186 return 0;
1187}
1188
1189static int btusb_flush(struct hci_dev *hdev)
1190{
David Herrmann155961e2012-02-09 21:58:32 +01001191 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001192
1193 BT_DBG("%s", hdev->name);
1194
1195 usb_kill_anchored_urbs(&data->tx_anchor);
Marcel Holtmann803b5832014-09-16 08:00:29 +02001196 btusb_free_frags(data);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001197
1198 return 0;
1199}
1200
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001201static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001202{
David Herrmann155961e2012-02-09 21:58:32 +01001203 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001204 struct usb_ctrlrequest *dr;
1205 struct urb *urb;
1206 unsigned int pipe;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001207
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001208 urb = usb_alloc_urb(0, GFP_KERNEL);
1209 if (!urb)
1210 return ERR_PTR(-ENOMEM);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001211
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001212 dr = kmalloc(sizeof(*dr), GFP_KERNEL);
1213 if (!dr) {
1214 usb_free_urb(urb);
1215 return ERR_PTR(-ENOMEM);
1216 }
1217
1218 dr->bRequestType = data->cmdreq_type;
Marcel Holtmann893ba542015-01-28 20:27:34 -08001219 dr->bRequest = data->cmdreq;
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001220 dr->wIndex = 0;
1221 dr->wValue = 0;
1222 dr->wLength = __cpu_to_le16(skb->len);
1223
1224 pipe = usb_sndctrlpipe(data->udev, 0x00);
1225
Marcel Holtmann89e75332014-09-16 04:44:50 +02001226 usb_fill_control_urb(urb, data->udev, pipe, (void *)dr,
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001227 skb->data, skb->len, btusb_tx_complete, skb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001228
Marcel Holtmann89e75332014-09-16 04:44:50 +02001229 skb->dev = (void *)hdev;
Marcel Holtmann7bd8f092013-10-11 06:19:18 -07001230
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001231 return urb;
1232}
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001233
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001234static struct urb *alloc_bulk_urb(struct hci_dev *hdev, struct sk_buff *skb)
1235{
1236 struct btusb_data *data = hci_get_drvdata(hdev);
1237 struct urb *urb;
1238 unsigned int pipe;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001239
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001240 if (!data->bulk_tx_ep)
1241 return ERR_PTR(-ENODEV);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001242
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001243 urb = usb_alloc_urb(0, GFP_KERNEL);
1244 if (!urb)
1245 return ERR_PTR(-ENOMEM);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001246
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001247 pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001248
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001249 usb_fill_bulk_urb(urb, data->udev, pipe,
1250 skb->data, skb->len, btusb_tx_complete, skb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001251
Marcel Holtmann89e75332014-09-16 04:44:50 +02001252 skb->dev = (void *)hdev;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001253
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001254 return urb;
1255}
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001256
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001257static struct urb *alloc_isoc_urb(struct hci_dev *hdev, struct sk_buff *skb)
1258{
1259 struct btusb_data *data = hci_get_drvdata(hdev);
1260 struct urb *urb;
1261 unsigned int pipe;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001262
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001263 if (!data->isoc_tx_ep)
1264 return ERR_PTR(-ENODEV);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001265
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001266 urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL);
1267 if (!urb)
1268 return ERR_PTR(-ENOMEM);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001269
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001270 pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001271
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001272 usb_fill_int_urb(urb, data->udev, pipe,
1273 skb->data, skb->len, btusb_isoc_tx_complete,
1274 skb, data->isoc_tx_ep->bInterval);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001275
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001276 urb->transfer_flags = URB_ISO_ASAP;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001277
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001278 __fill_isoc_descriptor(urb, skb->len,
1279 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001280
Marcel Holtmann89e75332014-09-16 04:44:50 +02001281 skb->dev = (void *)hdev;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001282
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001283 return urb;
1284}
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001285
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001286static int submit_tx_urb(struct hci_dev *hdev, struct urb *urb)
1287{
1288 struct btusb_data *data = hci_get_drvdata(hdev);
1289 int err;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001290
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001291 usb_anchor_urb(urb, &data->tx_anchor);
1292
Johan Hedberge9753ef2014-09-14 08:49:34 +03001293 err = usb_submit_urb(urb, GFP_KERNEL);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001294 if (err < 0) {
Paul Bolle5a9b80e2011-10-09 12:12:16 +02001295 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001296 bt_dev_err(hdev, "urb %p submission failed (%d)",
1297 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001298 kfree(urb->setup_packet);
1299 usb_unanchor_urb(urb);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001300 } else {
1301 usb_mark_last_busy(data->udev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001302 }
1303
Cong Wang54a8a792011-11-22 09:32:57 +08001304 usb_free_urb(urb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001305 return err;
1306}
1307
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001308static int submit_or_queue_tx_urb(struct hci_dev *hdev, struct urb *urb)
1309{
1310 struct btusb_data *data = hci_get_drvdata(hdev);
1311 unsigned long flags;
1312 bool suspending;
1313
1314 spin_lock_irqsave(&data->txlock, flags);
1315 suspending = test_bit(BTUSB_SUSPENDING, &data->flags);
1316 if (!suspending)
1317 data->tx_in_flight++;
1318 spin_unlock_irqrestore(&data->txlock, flags);
1319
1320 if (!suspending)
1321 return submit_tx_urb(hdev, urb);
1322
1323 usb_anchor_urb(urb, &data->deferred);
1324 schedule_work(&data->waker);
1325
1326 usb_free_urb(urb);
1327 return 0;
1328}
1329
1330static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
1331{
1332 struct urb *urb;
1333
1334 BT_DBG("%s", hdev->name);
1335
Marcel Holtmann618e8bc2015-11-05 07:33:56 +01001336 switch (hci_skb_pkt_type(skb)) {
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001337 case HCI_COMMAND_PKT:
1338 urb = alloc_ctrl_urb(hdev, skb);
1339 if (IS_ERR(urb))
1340 return PTR_ERR(urb);
1341
1342 hdev->stat.cmd_tx++;
1343 return submit_or_queue_tx_urb(hdev, urb);
1344
1345 case HCI_ACLDATA_PKT:
1346 urb = alloc_bulk_urb(hdev, skb);
1347 if (IS_ERR(urb))
1348 return PTR_ERR(urb);
1349
1350 hdev->stat.acl_tx++;
1351 return submit_or_queue_tx_urb(hdev, urb);
1352
1353 case HCI_SCODATA_PKT:
1354 if (hci_conn_num(hdev, SCO_LINK) < 1)
1355 return -ENODEV;
1356
1357 urb = alloc_isoc_urb(hdev, skb);
1358 if (IS_ERR(urb))
1359 return PTR_ERR(urb);
1360
1361 hdev->stat.sco_tx++;
1362 return submit_tx_urb(hdev, urb);
1363 }
1364
1365 return -EILSEQ;
1366}
1367
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001368static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
1369{
David Herrmann155961e2012-02-09 21:58:32 +01001370 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001371
1372 BT_DBG("%s evt %d", hdev->name, evt);
1373
Marcel Holtmann014f7bc2013-10-10 09:47:55 -07001374 if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) {
1375 data->sco_num = hci_conn_num(hdev, SCO_LINK);
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001376 schedule_work(&data->work);
Marcel Holtmanna780efa2008-11-30 12:17:12 +01001377 }
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001378}
1379
Jesper Juhl42b16b32011-01-17 00:09:38 +01001380static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001381{
David Herrmann155961e2012-02-09 21:58:32 +01001382 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001383 struct usb_interface *intf = data->isoc;
1384 struct usb_endpoint_descriptor *ep_desc;
1385 int i, err;
1386
1387 if (!data->isoc)
1388 return -ENODEV;
1389
Marcel Holtmann459232f2017-10-24 19:42:45 +02001390 err = usb_set_interface(data->udev, data->isoc_ifnum, altsetting);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001391 if (err < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001392 bt_dev_err(hdev, "setting interface failed (%d)", -err);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001393 return err;
1394 }
1395
1396 data->isoc_altsetting = altsetting;
1397
1398 data->isoc_tx_ep = NULL;
1399 data->isoc_rx_ep = NULL;
1400
1401 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
1402 ep_desc = &intf->cur_altsetting->endpoint[i].desc;
1403
1404 if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) {
1405 data->isoc_tx_ep = ep_desc;
1406 continue;
1407 }
1408
1409 if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) {
1410 data->isoc_rx_ep = ep_desc;
1411 continue;
1412 }
1413 }
1414
1415 if (!data->isoc_tx_ep || !data->isoc_rx_ep) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001416 bt_dev_err(hdev, "invalid SCO descriptors");
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001417 return -ENODEV;
1418 }
1419
1420 return 0;
1421}
1422
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001423static void btusb_work(struct work_struct *work)
1424{
1425 struct btusb_data *data = container_of(work, struct btusb_data, work);
1426 struct hci_dev *hdev = data->hdev;
Mikel Astizf4001d22012-04-11 08:48:51 +02001427 int new_alts;
Oliver Neukum7bee5492009-08-24 23:44:59 +02001428 int err;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001429
Marcel Holtmann014f7bc2013-10-10 09:47:55 -07001430 if (data->sco_num > 0) {
Gustavo F. Padovan08b8b6c2010-07-16 17:20:33 -03001431 if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) {
Oliver Neukum8efdd0c2011-02-11 13:00:06 +01001432 err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001433 if (err < 0) {
1434 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
1435 usb_kill_anchored_urbs(&data->isoc_anchor);
1436 return;
1437 }
1438
Gustavo F. Padovan08b8b6c2010-07-16 17:20:33 -03001439 set_bit(BTUSB_DID_ISO_RESUME, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001440 }
Mikel Astizf4001d22012-04-11 08:48:51 +02001441
1442 if (hdev->voice_setting & 0x0020) {
1443 static const int alts[3] = { 2, 4, 5 };
Marcel Holtmann89e75332014-09-16 04:44:50 +02001444
Marcel Holtmann014f7bc2013-10-10 09:47:55 -07001445 new_alts = alts[data->sco_num - 1];
Mikel Astizf4001d22012-04-11 08:48:51 +02001446 } else {
Marcel Holtmann014f7bc2013-10-10 09:47:55 -07001447 new_alts = data->sco_num;
Mikel Astizf4001d22012-04-11 08:48:51 +02001448 }
1449
1450 if (data->isoc_altsetting != new_alts) {
Kuba Pawlakf6fc86f2015-10-28 15:18:05 +01001451 unsigned long flags;
1452
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001453 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
1454 usb_kill_anchored_urbs(&data->isoc_anchor);
1455
Kuba Pawlak8f9d02f2015-09-10 17:07:00 +01001456 /* When isochronous alternate setting needs to be
1457 * changed, because SCO connection has been added
1458 * or removed, a packet fragment may be left in the
1459 * reassembling state. This could lead to wrongly
1460 * assembled fragments.
1461 *
1462 * Clear outstanding fragment when selecting a new
1463 * alternate setting.
1464 */
Kuba Pawlakf6fc86f2015-10-28 15:18:05 +01001465 spin_lock_irqsave(&data->rxlock, flags);
Kuba Pawlak8f9d02f2015-09-10 17:07:00 +01001466 kfree_skb(data->sco_skb);
1467 data->sco_skb = NULL;
Kuba Pawlakf6fc86f2015-10-28 15:18:05 +01001468 spin_unlock_irqrestore(&data->rxlock, flags);
Kuba Pawlak8f9d02f2015-09-10 17:07:00 +01001469
Mikel Astizf4001d22012-04-11 08:48:51 +02001470 if (__set_isoc_interface(hdev, new_alts) < 0)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001471 return;
1472 }
1473
1474 if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
Marcel Holtmann2eda66f2008-11-30 12:17:10 +01001475 if (btusb_submit_isoc_urb(hdev, GFP_KERNEL) < 0)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001476 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
1477 else
Marcel Holtmann2eda66f2008-11-30 12:17:10 +01001478 btusb_submit_isoc_urb(hdev, GFP_KERNEL);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001479 }
1480 } else {
1481 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
1482 usb_kill_anchored_urbs(&data->isoc_anchor);
1483
1484 __set_isoc_interface(hdev, 0);
Gustavo F. Padovan08b8b6c2010-07-16 17:20:33 -03001485 if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags))
Oliver Neukum8efdd0c2011-02-11 13:00:06 +01001486 usb_autopm_put_interface(data->isoc ? data->isoc : data->intf);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001487 }
1488}
1489
Oliver Neukum7bee5492009-08-24 23:44:59 +02001490static void btusb_waker(struct work_struct *work)
1491{
1492 struct btusb_data *data = container_of(work, struct btusb_data, waker);
1493 int err;
1494
1495 err = usb_autopm_get_interface(data->intf);
1496 if (err < 0)
1497 return;
1498
1499 usb_autopm_put_interface(data->intf);
1500}
1501
Marcel Holtmann9f8f9622013-04-10 08:11:35 -07001502static int btusb_setup_bcm92035(struct hci_dev *hdev)
1503{
1504 struct sk_buff *skb;
1505 u8 val = 0x00;
1506
1507 BT_DBG("%s", hdev->name);
1508
1509 skb = __hci_cmd_sync(hdev, 0xfc3b, 1, &val, HCI_INIT_TIMEOUT);
1510 if (IS_ERR(skb))
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001511 bt_dev_err(hdev, "BCM92035 command failed (%ld)", PTR_ERR(skb));
Marcel Holtmann9f8f9622013-04-10 08:11:35 -07001512 else
1513 kfree_skb(skb);
1514
1515 return 0;
1516}
1517
Marcel Holtmann81cac642014-01-03 03:02:36 -08001518static int btusb_setup_csr(struct hci_dev *hdev)
1519{
1520 struct hci_rp_read_local_version *rp;
1521 struct sk_buff *skb;
Marcel Holtmann81cac642014-01-03 03:02:36 -08001522
1523 BT_DBG("%s", hdev->name);
1524
Marcel Holtmann7cd84d72015-06-07 10:01:02 +02001525 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
1526 HCI_INIT_TIMEOUT);
1527 if (IS_ERR(skb)) {
1528 int err = PTR_ERR(skb);
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001529 bt_dev_err(hdev, "CSR: Local version failed (%d)", err);
Marcel Holtmann7cd84d72015-06-07 10:01:02 +02001530 return err;
1531 }
1532
1533 if (skb->len != sizeof(struct hci_rp_read_local_version)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001534 bt_dev_err(hdev, "CSR: Local version length mismatch");
Marcel Holtmann7cd84d72015-06-07 10:01:02 +02001535 kfree_skb(skb);
1536 return -EIO;
1537 }
Marcel Holtmann81cac642014-01-03 03:02:36 -08001538
Marcel Holtmann89e75332014-09-16 04:44:50 +02001539 rp = (struct hci_rp_read_local_version *)skb->data;
Marcel Holtmann81cac642014-01-03 03:02:36 -08001540
Johan Hedberg6cafcd92015-08-30 21:47:21 +03001541 /* Detect controllers which aren't real CSR ones. */
1542 if (le16_to_cpu(rp->manufacturer) != 10 ||
1543 le16_to_cpu(rp->lmp_subver) == 0x0c5c) {
Marcel Holtmann9641d342015-06-07 10:01:01 +02001544 /* Clear the reset quirk since this is not an actual
1545 * early Bluetooth 1.1 device from CSR.
1546 */
1547 clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
Marcel Holtmann81cac642014-01-03 03:02:36 -08001548
Marcel Holtmann9641d342015-06-07 10:01:01 +02001549 /* These fake CSR controllers have all a broken
1550 * stored link key handling and so just disable it.
1551 */
1552 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
Marcel Holtmann81cac642014-01-03 03:02:36 -08001553 }
1554
Marcel Holtmann81cac642014-01-03 03:02:36 -08001555 kfree_skb(skb);
1556
Marcel Holtmann9641d342015-06-07 10:01:01 +02001557 return 0;
Marcel Holtmann81cac642014-01-03 03:02:36 -08001558}
1559
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001560static const struct firmware *btusb_setup_intel_get_fw(struct hci_dev *hdev,
Marcel Holtmann89e75332014-09-16 04:44:50 +02001561 struct intel_version *ver)
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001562{
1563 const struct firmware *fw;
1564 char fwname[64];
1565 int ret;
1566
1567 snprintf(fwname, sizeof(fwname),
1568 "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq",
1569 ver->hw_platform, ver->hw_variant, ver->hw_revision,
1570 ver->fw_variant, ver->fw_revision, ver->fw_build_num,
1571 ver->fw_build_ww, ver->fw_build_yy);
1572
1573 ret = request_firmware(&fw, fwname, &hdev->dev);
1574 if (ret < 0) {
1575 if (ret == -EINVAL) {
1576 BT_ERR("%s Intel firmware file request failed (%d)",
1577 hdev->name, ret);
1578 return NULL;
1579 }
1580
1581 BT_ERR("%s failed to open Intel firmware file: %s(%d)",
1582 hdev->name, fwname, ret);
1583
1584 /* If the correct firmware patch file is not found, use the
1585 * default firmware patch file instead
1586 */
1587 snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq",
1588 ver->hw_platform, ver->hw_variant);
1589 if (request_firmware(&fw, fwname, &hdev->dev) < 0) {
1590 BT_ERR("%s failed to open default Intel fw file: %s",
1591 hdev->name, fwname);
1592 return NULL;
1593 }
1594 }
1595
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001596 bt_dev_info(hdev, "Intel Bluetooth firmware file: %s", fwname);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001597
1598 return fw;
1599}
1600
1601static int btusb_setup_intel_patching(struct hci_dev *hdev,
1602 const struct firmware *fw,
1603 const u8 **fw_ptr, int *disable_patch)
1604{
1605 struct sk_buff *skb;
1606 struct hci_command_hdr *cmd;
1607 const u8 *cmd_param;
1608 struct hci_event_hdr *evt = NULL;
1609 const u8 *evt_param = NULL;
1610 int remain = fw->size - (*fw_ptr - fw->data);
1611
1612 /* The first byte indicates the types of the patch command or event.
1613 * 0x01 means HCI command and 0x02 is HCI event. If the first bytes
1614 * in the current firmware buffer doesn't start with 0x01 or
1615 * the size of remain buffer is smaller than HCI command header,
1616 * the firmware file is corrupted and it should stop the patching
1617 * process.
1618 */
1619 if (remain > HCI_COMMAND_HDR_SIZE && *fw_ptr[0] != 0x01) {
1620 BT_ERR("%s Intel fw corrupted: invalid cmd read", hdev->name);
1621 return -EINVAL;
1622 }
1623 (*fw_ptr)++;
1624 remain--;
1625
1626 cmd = (struct hci_command_hdr *)(*fw_ptr);
1627 *fw_ptr += sizeof(*cmd);
1628 remain -= sizeof(*cmd);
1629
1630 /* Ensure that the remain firmware data is long enough than the length
1631 * of command parameter. If not, the firmware file is corrupted.
1632 */
1633 if (remain < cmd->plen) {
1634 BT_ERR("%s Intel fw corrupted: invalid cmd len", hdev->name);
1635 return -EFAULT;
1636 }
1637
1638 /* If there is a command that loads a patch in the firmware
1639 * file, then enable the patch upon success, otherwise just
1640 * disable the manufacturer mode, for example patch activation
1641 * is not required when the default firmware patch file is used
1642 * because there are no patch data to load.
1643 */
1644 if (*disable_patch && le16_to_cpu(cmd->opcode) == 0xfc8e)
1645 *disable_patch = 0;
1646
1647 cmd_param = *fw_ptr;
1648 *fw_ptr += cmd->plen;
1649 remain -= cmd->plen;
1650
1651 /* This reads the expected events when the above command is sent to the
1652 * device. Some vendor commands expects more than one events, for
1653 * example command status event followed by vendor specific event.
1654 * For this case, it only keeps the last expected event. so the command
1655 * can be sent with __hci_cmd_sync_ev() which returns the sk_buff of
1656 * last expected event.
1657 */
1658 while (remain > HCI_EVENT_HDR_SIZE && *fw_ptr[0] == 0x02) {
1659 (*fw_ptr)++;
1660 remain--;
1661
1662 evt = (struct hci_event_hdr *)(*fw_ptr);
1663 *fw_ptr += sizeof(*evt);
1664 remain -= sizeof(*evt);
1665
1666 if (remain < evt->plen) {
1667 BT_ERR("%s Intel fw corrupted: invalid evt len",
1668 hdev->name);
1669 return -EFAULT;
1670 }
1671
1672 evt_param = *fw_ptr;
1673 *fw_ptr += evt->plen;
1674 remain -= evt->plen;
1675 }
1676
1677 /* Every HCI commands in the firmware file has its correspond event.
1678 * If event is not found or remain is smaller than zero, the firmware
1679 * file is corrupted.
1680 */
1681 if (!evt || !evt_param || remain < 0) {
1682 BT_ERR("%s Intel fw corrupted: invalid evt read", hdev->name);
1683 return -EFAULT;
1684 }
1685
1686 skb = __hci_cmd_sync_ev(hdev, le16_to_cpu(cmd->opcode), cmd->plen,
1687 cmd_param, evt->evt, HCI_INIT_TIMEOUT);
1688 if (IS_ERR(skb)) {
1689 BT_ERR("%s sending Intel patch command (0x%4.4x) failed (%ld)",
1690 hdev->name, cmd->opcode, PTR_ERR(skb));
Adam Leed9c78e92013-07-10 10:02:12 +08001691 return PTR_ERR(skb);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001692 }
1693
1694 /* It ensures that the returned event matches the event data read from
1695 * the firmware file. At fist, it checks the length and then
1696 * the contents of the event.
1697 */
1698 if (skb->len != evt->plen) {
1699 BT_ERR("%s mismatch event length (opcode 0x%4.4x)", hdev->name,
1700 le16_to_cpu(cmd->opcode));
1701 kfree_skb(skb);
1702 return -EFAULT;
1703 }
1704
1705 if (memcmp(skb->data, evt_param, evt->plen)) {
1706 BT_ERR("%s mismatch event parameter (opcode 0x%4.4x)",
1707 hdev->name, le16_to_cpu(cmd->opcode));
1708 kfree_skb(skb);
1709 return -EFAULT;
1710 }
1711 kfree_skb(skb);
1712
1713 return 0;
1714}
1715
1716static int btusb_setup_intel(struct hci_dev *hdev)
1717{
1718 struct sk_buff *skb;
1719 const struct firmware *fw;
1720 const u8 *fw_ptr;
Loic Poulain28dc4b92015-12-03 16:10:22 +01001721 int disable_patch, err;
Loic Poulain6c483de2015-12-06 16:18:34 +01001722 struct intel_version ver;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001723
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001724 BT_DBG("%s", hdev->name);
1725
1726 /* The controller has a bug with the first HCI command sent to it
1727 * returning number of completed commands as zero. This would stall the
1728 * command processing in the Bluetooth core.
1729 *
1730 * As a workaround, send HCI Reset command first which will reset the
1731 * number of completed commands and allow normal command processing
1732 * from now on.
1733 */
1734 skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
1735 if (IS_ERR(skb)) {
1736 BT_ERR("%s sending initial HCI reset command failed (%ld)",
1737 hdev->name, PTR_ERR(skb));
Adam Leed9c78e92013-07-10 10:02:12 +08001738 return PTR_ERR(skb);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001739 }
1740 kfree_skb(skb);
1741
1742 /* Read Intel specific controller version first to allow selection of
1743 * which firmware file to load.
1744 *
1745 * The returned information are hardware variant and revision plus
1746 * firmware variant, revision and build number.
1747 */
Loic Poulain6c483de2015-12-06 16:18:34 +01001748 err = btintel_read_version(hdev, &ver);
1749 if (err)
1750 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001751
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001752 bt_dev_info(hdev, "read Intel version: %02x%02x%02x%02x%02x%02x%02x%02x%02x",
1753 ver.hw_platform, ver.hw_variant, ver.hw_revision,
1754 ver.fw_variant, ver.fw_revision, ver.fw_build_num,
1755 ver.fw_build_ww, ver.fw_build_yy, ver.fw_patch_num);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001756
1757 /* fw_patch_num indicates the version of patch the device currently
1758 * have. If there is no patch data in the device, it is always 0x00.
Minjune Kim5075eda2015-08-27 13:21:52 +09001759 * So, if it is other than 0x00, no need to patch the device again.
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001760 */
Loic Poulain6c483de2015-12-06 16:18:34 +01001761 if (ver.fw_patch_num) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001762 bt_dev_info(hdev, "Intel device is already patched. "
1763 "patch num: %02x", ver.fw_patch_num);
Marcel Holtmann213445b2015-10-21 02:45:19 +02001764 goto complete;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001765 }
1766
1767 /* Opens the firmware patch file based on the firmware version read
1768 * from the controller. If it fails to open the matching firmware
1769 * patch file, it tries to open the default firmware patch file.
1770 * If no patch file is found, allow the device to operate without
1771 * a patch.
1772 */
Loic Poulain6c483de2015-12-06 16:18:34 +01001773 fw = btusb_setup_intel_get_fw(hdev, &ver);
1774 if (!fw)
Marcel Holtmann213445b2015-10-21 02:45:19 +02001775 goto complete;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001776 fw_ptr = fw->data;
1777
Loic Poulain28dc4b92015-12-03 16:10:22 +01001778 /* Enable the manufacturer mode of the controller.
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001779 * Only while this mode is enabled, the driver can download the
1780 * firmware patch data and configuration parameters.
1781 */
Loic Poulain28dc4b92015-12-03 16:10:22 +01001782 err = btintel_enter_mfg(hdev);
1783 if (err) {
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001784 release_firmware(fw);
Loic Poulain28dc4b92015-12-03 16:10:22 +01001785 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001786 }
1787
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001788 disable_patch = 1;
1789
1790 /* The firmware data file consists of list of Intel specific HCI
1791 * commands and its expected events. The first byte indicates the
1792 * type of the message, either HCI command or HCI event.
1793 *
1794 * It reads the command and its expected event from the firmware file,
1795 * and send to the controller. Once __hci_cmd_sync_ev() returns,
1796 * the returned event is compared with the event read from the firmware
1797 * file and it will continue until all the messages are downloaded to
1798 * the controller.
1799 *
1800 * Once the firmware patching is completed successfully,
1801 * the manufacturer mode is disabled with reset and activating the
1802 * downloaded patch.
1803 *
1804 * If the firmware patching fails, the manufacturer mode is
1805 * disabled with reset and deactivating the patch.
1806 *
1807 * If the default patch file is used, no reset is done when disabling
1808 * the manufacturer.
1809 */
1810 while (fw->size > fw_ptr - fw->data) {
1811 int ret;
1812
1813 ret = btusb_setup_intel_patching(hdev, fw, &fw_ptr,
1814 &disable_patch);
1815 if (ret < 0)
1816 goto exit_mfg_deactivate;
1817 }
1818
1819 release_firmware(fw);
1820
1821 if (disable_patch)
1822 goto exit_mfg_disable;
1823
1824 /* Patching completed successfully and disable the manufacturer mode
1825 * with reset and activate the downloaded firmware patches.
1826 */
Loic Poulain28dc4b92015-12-03 16:10:22 +01001827 err = btintel_exit_mfg(hdev, true, true);
1828 if (err)
1829 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001830
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001831 bt_dev_info(hdev, "Intel firmware patch completed and activated");
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001832
Marcel Holtmann213445b2015-10-21 02:45:19 +02001833 goto complete;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001834
1835exit_mfg_disable:
1836 /* Disable the manufacturer mode without reset */
Loic Poulain28dc4b92015-12-03 16:10:22 +01001837 err = btintel_exit_mfg(hdev, false, false);
1838 if (err)
1839 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001840
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001841 bt_dev_info(hdev, "Intel firmware patch completed");
Marcel Holtmann40cb0982014-07-02 12:06:45 +02001842
Marcel Holtmann213445b2015-10-21 02:45:19 +02001843 goto complete;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001844
1845exit_mfg_deactivate:
1846 release_firmware(fw);
1847
1848 /* Patching failed. Disable the manufacturer mode with reset and
1849 * deactivate the downloaded firmware patches.
1850 */
Loic Poulain28dc4b92015-12-03 16:10:22 +01001851 err = btintel_exit_mfg(hdev, true, false);
1852 if (err)
1853 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001854
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001855 bt_dev_info(hdev, "Intel firmware patch completed and deactivated");
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001856
Marcel Holtmann213445b2015-10-21 02:45:19 +02001857complete:
1858 /* Set the event mask for Intel specific vendor events. This enables
1859 * a few extra events that are useful during general operation.
1860 */
1861 btintel_set_event_mask_mfg(hdev, false);
1862
Marcel Holtmann4185a0f2015-04-06 00:52:12 -07001863 btintel_check_bdaddr(hdev);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001864 return 0;
1865}
1866
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001867static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode)
1868{
1869 struct sk_buff *skb;
1870 struct hci_event_hdr *hdr;
1871 struct hci_ev_cmd_complete *evt;
1872
1873 skb = bt_skb_alloc(sizeof(*hdr) + sizeof(*evt) + 1, GFP_ATOMIC);
1874 if (!skb)
1875 return -ENOMEM;
1876
Johannes Berg4df864c2017-06-16 14:29:21 +02001877 hdr = skb_put(skb, sizeof(*hdr));
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001878 hdr->evt = HCI_EV_CMD_COMPLETE;
1879 hdr->plen = sizeof(*evt) + 1;
1880
Johannes Berg4df864c2017-06-16 14:29:21 +02001881 evt = skb_put(skb, sizeof(*evt));
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001882 evt->ncmd = 0x01;
1883 evt->opcode = cpu_to_le16(opcode);
1884
Johannes Berg634fef62017-06-16 14:29:24 +02001885 skb_put_u8(skb, 0x00);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001886
Marcel Holtmann618e8bc2015-11-05 07:33:56 +01001887 hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001888
1889 return hci_recv_frame(hdev, skb);
1890}
1891
1892static int btusb_recv_bulk_intel(struct btusb_data *data, void *buffer,
1893 int count)
1894{
1895 /* When the device is in bootloader mode, then it can send
1896 * events via the bulk endpoint. These events are treated the
1897 * same way as the ones received from the interrupt endpoint.
1898 */
1899 if (test_bit(BTUSB_BOOTLOADER, &data->flags))
1900 return btusb_recv_intr(data, buffer, count);
1901
1902 return btusb_recv_bulk(data, buffer, count);
1903}
1904
Marcel Holtmannccd6da22015-04-09 00:35:19 -07001905static void btusb_intel_bootup(struct btusb_data *data, const void *ptr,
1906 unsigned int len)
1907{
1908 const struct intel_bootup *evt = ptr;
1909
1910 if (len != sizeof(*evt))
1911 return;
1912
1913 if (test_and_clear_bit(BTUSB_BOOTING, &data->flags)) {
1914 smp_mb__after_atomic();
1915 wake_up_bit(&data->flags, BTUSB_BOOTING);
1916 }
1917}
1918
1919static void btusb_intel_secure_send_result(struct btusb_data *data,
1920 const void *ptr, unsigned int len)
1921{
1922 const struct intel_secure_send_result *evt = ptr;
1923
1924 if (len != sizeof(*evt))
1925 return;
1926
1927 if (evt->result)
1928 set_bit(BTUSB_FIRMWARE_FAILED, &data->flags);
1929
1930 if (test_and_clear_bit(BTUSB_DOWNLOADING, &data->flags) &&
1931 test_bit(BTUSB_FIRMWARE_LOADED, &data->flags)) {
1932 smp_mb__after_atomic();
1933 wake_up_bit(&data->flags, BTUSB_DOWNLOADING);
1934 }
1935}
1936
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001937static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb)
1938{
1939 struct btusb_data *data = hci_get_drvdata(hdev);
1940
1941 if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
1942 struct hci_event_hdr *hdr = (void *)skb->data;
1943
Marcel Holtmannccd6da22015-04-09 00:35:19 -07001944 if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
1945 hdr->plen > 0) {
1946 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
1947 unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001948
Marcel Holtmannccd6da22015-04-09 00:35:19 -07001949 switch (skb->data[2]) {
1950 case 0x02:
1951 /* When switching to the operational firmware
1952 * the device sends a vendor specific event
1953 * indicating that the bootup completed.
1954 */
1955 btusb_intel_bootup(data, ptr, len);
1956 break;
1957 case 0x06:
1958 /* When the firmware loading completes the
1959 * device sends out a vendor specific event
1960 * indicating the result of the firmware
1961 * loading.
1962 */
1963 btusb_intel_secure_send_result(data, ptr, len);
1964 break;
Johan Hedbergfad70972015-01-30 10:58:55 +02001965 }
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001966 }
1967 }
1968
1969 return hci_recv_frame(hdev, skb);
1970}
1971
1972static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
1973{
1974 struct btusb_data *data = hci_get_drvdata(hdev);
1975 struct urb *urb;
1976
1977 BT_DBG("%s", hdev->name);
1978
Marcel Holtmann618e8bc2015-11-05 07:33:56 +01001979 switch (hci_skb_pkt_type(skb)) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001980 case HCI_COMMAND_PKT:
1981 if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
1982 struct hci_command_hdr *cmd = (void *)skb->data;
1983 __u16 opcode = le16_to_cpu(cmd->opcode);
1984
1985 /* When in bootloader mode and the command 0xfc09
1986 * is received, it needs to be send down the
1987 * bulk endpoint. So allocate a bulk URB instead.
1988 */
1989 if (opcode == 0xfc09)
1990 urb = alloc_bulk_urb(hdev, skb);
1991 else
1992 urb = alloc_ctrl_urb(hdev, skb);
1993
1994 /* When the 0xfc01 command is issued to boot into
1995 * the operational firmware, it will actually not
1996 * send a command complete event. To keep the flow
1997 * control working inject that event here.
1998 */
1999 if (opcode == 0xfc01)
2000 inject_cmd_complete(hdev, opcode);
2001 } else {
2002 urb = alloc_ctrl_urb(hdev, skb);
2003 }
2004 if (IS_ERR(urb))
2005 return PTR_ERR(urb);
2006
2007 hdev->stat.cmd_tx++;
2008 return submit_or_queue_tx_urb(hdev, urb);
2009
2010 case HCI_ACLDATA_PKT:
2011 urb = alloc_bulk_urb(hdev, skb);
2012 if (IS_ERR(urb))
2013 return PTR_ERR(urb);
2014
2015 hdev->stat.acl_tx++;
2016 return submit_or_queue_tx_urb(hdev, urb);
2017
2018 case HCI_SCODATA_PKT:
2019 if (hci_conn_num(hdev, SCO_LINK) < 1)
2020 return -ENODEV;
2021
2022 urb = alloc_isoc_urb(hdev, skb);
2023 if (IS_ERR(urb))
2024 return PTR_ERR(urb);
2025
2026 hdev->stat.sco_tx++;
2027 return submit_tx_urb(hdev, urb);
2028 }
2029
2030 return -EILSEQ;
2031}
2032
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002033static int btusb_setup_intel_new(struct hci_dev *hdev)
2034{
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002035 struct btusb_data *data = hci_get_drvdata(hdev);
Loic Poulain6c483de2015-12-06 16:18:34 +01002036 struct intel_version ver;
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002037 struct intel_boot_params params;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002038 const struct firmware *fw;
Tedd Ho-Jeong Ane5889af2018-01-24 09:19:18 -08002039 u32 boot_param;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002040 char fwname[64];
2041 ktime_t calltime, delta, rettime;
2042 unsigned long long duration;
2043 int err;
2044
2045 BT_DBG("%s", hdev->name);
2046
Tedd Ho-Jeong An04d729b2018-01-24 09:19:19 -08002047 /* Set the default boot parameter to 0x0 and it is updated to
2048 * SKU specific boot parameter after reading Intel_Write_Boot_Params
2049 * command while downloading the firmware.
2050 */
2051 boot_param = 0x00000000;
Tedd Ho-Jeong Ane5889af2018-01-24 09:19:18 -08002052
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002053 calltime = ktime_get();
2054
2055 /* Read the Intel version information to determine if the device
2056 * is in bootloader mode or if it already has operational firmware
2057 * loaded.
2058 */
Loic Poulain6c483de2015-12-06 16:18:34 +01002059 err = btintel_read_version(hdev, &ver);
2060 if (err)
2061 return err;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002062
2063 /* The hardware platform number has a fixed value of 0x37 and
2064 * for now only accept this single value.
2065 */
Loic Poulain6c483de2015-12-06 16:18:34 +01002066 if (ver.hw_platform != 0x37) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002067 BT_ERR("%s: Unsupported Intel hardware platform (%u)",
Loic Poulain6c483de2015-12-06 16:18:34 +01002068 hdev->name, ver.hw_platform);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002069 return -EINVAL;
2070 }
2071
Tedd Ho-Jeong An92688342017-03-06 15:38:26 -08002072 /* Check for supported iBT hardware variants of this firmware
2073 * loading method.
Tedd Ho-Jeong Ana0af53b2016-05-06 11:53:46 -07002074 *
2075 * This check has been put in place to ensure correct forward
2076 * compatibility options when newer hardware variants come along.
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002077 */
Tedd Ho-Jeong An92688342017-03-06 15:38:26 -08002078 switch (ver.hw_variant) {
2079 case 0x0b: /* SfP */
2080 case 0x0c: /* WsP */
Tedd Ho-Jeong An86a61292017-05-01 13:35:12 -07002081 case 0x11: /* JfP */
Marcel Holtmannde766142017-03-06 15:38:28 -08002082 case 0x12: /* ThP */
Tedd Ho-Jeong An1ce0cec2018-02-05 14:20:36 -08002083 case 0x13: /* HrP */
2084 case 0x14: /* QnJ, IcP */
Tedd Ho-Jeong An92688342017-03-06 15:38:26 -08002085 break;
2086 default:
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002087 BT_ERR("%s: Unsupported Intel hardware variant (%u)",
Loic Poulain6c483de2015-12-06 16:18:34 +01002088 hdev->name, ver.hw_variant);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002089 return -EINVAL;
2090 }
2091
Loic Poulain6c483de2015-12-06 16:18:34 +01002092 btintel_version_info(hdev, &ver);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002093
2094 /* The firmware variant determines if the device is in bootloader
2095 * mode or is running operational firmware. The value 0x06 identifies
2096 * the bootloader and the value 0x23 identifies the operational
2097 * firmware.
2098 *
2099 * When the operational firmware is already present, then only
2100 * the check for valid Bluetooth device address is needed. This
2101 * determines if the device will be added as configured or
2102 * unconfigured controller.
2103 *
2104 * It is not possible to use the Secure Boot Parameters in this
2105 * case since that command is only available in bootloader mode.
2106 */
Loic Poulain6c483de2015-12-06 16:18:34 +01002107 if (ver.fw_variant == 0x23) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002108 clear_bit(BTUSB_BOOTLOADER, &data->flags);
Marcel Holtmann4185a0f2015-04-06 00:52:12 -07002109 btintel_check_bdaddr(hdev);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002110 return 0;
2111 }
2112
2113 /* If the device is not in bootloader mode, then the only possible
2114 * choice is to return an error and abort the device initialization.
2115 */
Loic Poulain6c483de2015-12-06 16:18:34 +01002116 if (ver.fw_variant != 0x06) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002117 BT_ERR("%s: Unsupported Intel firmware variant (%u)",
Loic Poulain6c483de2015-12-06 16:18:34 +01002118 hdev->name, ver.fw_variant);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002119 return -ENODEV;
2120 }
2121
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002122 /* Read the secure boot parameters to identify the operating
2123 * details of the bootloader.
2124 */
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002125 err = btintel_read_boot_params(hdev, &params);
2126 if (err)
2127 return err;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002128
2129 /* It is required that every single firmware fragment is acknowledged
2130 * with a command complete event. If the boot parameters indicate
2131 * that this bootloader does not send them, then abort the setup.
2132 */
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002133 if (params.limited_cce != 0x00) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002134 BT_ERR("%s: Unsupported Intel firmware loading method (%u)",
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002135 hdev->name, params.limited_cce);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002136 return -EINVAL;
2137 }
2138
2139 /* If the OTP has no valid Bluetooth device address, then there will
2140 * also be no valid address for the operational firmware.
2141 */
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002142 if (!bacmp(&params.otp_bdaddr, BDADDR_ANY)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002143 bt_dev_info(hdev, "No device address configured");
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002144 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
2145 }
2146
2147 /* With this Intel bootloader only the hardware variant and device
Jaya P Gaf3715e2017-10-30 11:01:22 +01002148 * revision information are used to select the right firmware for SfP
2149 * and WsP.
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002150 *
Tedd Ho-Jeong An230b04a2016-06-28 08:56:39 -07002151 * The firmware filename is ibt-<hw_variant>-<dev_revid>.sfi.
2152 *
2153 * Currently the supported hardware variants are:
2154 * 11 (0x0b) for iBT3.0 (LnP/SfP)
2155 * 12 (0x0c) for iBT3.5 (WsP)
Jaya P Gaf3715e2017-10-30 11:01:22 +01002156 *
2157 * For ThP/JfP and for future SKU's, the FW name varies based on HW
2158 * variant, HW revision and FW revision, as these are dependent on CNVi
2159 * and RF Combination.
2160 *
Tedd Ho-Jeong An86a61292017-05-01 13:35:12 -07002161 * 17 (0x11) for iBT3.5 (JfP)
2162 * 18 (0x12) for iBT3.5 (ThP)
Jaya P Gaf3715e2017-10-30 11:01:22 +01002163 *
2164 * The firmware file name for these will be
2165 * ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi.
2166 *
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002167 */
Jaya P Gaf3715e2017-10-30 11:01:22 +01002168 switch (ver.hw_variant) {
2169 case 0x0b: /* SfP */
2170 case 0x0c: /* WsP */
2171 snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi",
2172 le16_to_cpu(ver.hw_variant),
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002173 le16_to_cpu(params.dev_revid));
Jaya P Gaf3715e2017-10-30 11:01:22 +01002174 break;
2175 case 0x11: /* JfP */
2176 case 0x12: /* ThP */
Tedd Ho-Jeong An1ce0cec2018-02-05 14:20:36 -08002177 case 0x13: /* HrP */
2178 case 0x14: /* QnJ, IcP */
Jaya P Gaf3715e2017-10-30 11:01:22 +01002179 snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.sfi",
2180 le16_to_cpu(ver.hw_variant),
2181 le16_to_cpu(ver.hw_revision),
2182 le16_to_cpu(ver.fw_revision));
2183 break;
2184 default:
2185 BT_ERR("%s: Unsupported Intel firmware naming", hdev->name);
2186 return -EINVAL;
2187 }
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002188
2189 err = request_firmware(&fw, fwname, &hdev->dev);
2190 if (err < 0) {
2191 BT_ERR("%s: Failed to load Intel firmware file (%d)",
2192 hdev->name, err);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002193 return err;
2194 }
2195
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002196 bt_dev_info(hdev, "Found device firmware: %s", fwname);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002197
Tedd Ho-Jeong An52cc9162015-06-12 16:20:05 -07002198 /* Save the DDC file name for later use to apply once the firmware
2199 * downloading is done.
2200 */
Jaya P Gaf3715e2017-10-30 11:01:22 +01002201 switch (ver.hw_variant) {
2202 case 0x0b: /* SfP */
2203 case 0x0c: /* WsP */
2204 snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.ddc",
2205 le16_to_cpu(ver.hw_variant),
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002206 le16_to_cpu(params.dev_revid));
Jaya P Gaf3715e2017-10-30 11:01:22 +01002207 break;
2208 case 0x11: /* JfP */
2209 case 0x12: /* ThP */
Tedd Ho-Jeong An1ce0cec2018-02-05 14:20:36 -08002210 case 0x13: /* HrP */
2211 case 0x14: /* QnJ, IcP */
Jaya P Gaf3715e2017-10-30 11:01:22 +01002212 snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.ddc",
2213 le16_to_cpu(ver.hw_variant),
2214 le16_to_cpu(ver.hw_revision),
2215 le16_to_cpu(ver.fw_revision));
2216 break;
2217 default:
2218 BT_ERR("%s: Unsupported Intel firmware naming", hdev->name);
2219 return -EINVAL;
2220 }
Tedd Ho-Jeong An52cc9162015-06-12 16:20:05 -07002221
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002222 if (fw->size < 644) {
2223 BT_ERR("%s: Invalid size of firmware file (%zu)",
2224 hdev->name, fw->size);
2225 err = -EBADF;
2226 goto done;
2227 }
2228
2229 set_bit(BTUSB_DOWNLOADING, &data->flags);
2230
Tedd Ho-Jeong Anfbbe83c2018-01-24 09:19:21 -08002231 /* Start firmware downloading and get boot parameter */
2232 err = btintel_download_firmware(hdev, fw, &boot_param);
2233 if (err < 0)
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002234 goto done;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002235
Marcel Holtmannce6bb922015-01-28 01:58:40 -08002236 set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
2237
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002238 bt_dev_info(hdev, "Waiting for firmware download to complete");
Johan Hedberga087a982015-01-30 10:58:54 +02002239
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002240 /* Before switching the device into operational mode and with that
2241 * booting the loaded firmware, wait for the bootloader notification
2242 * that all fragments have been successfully received.
2243 *
Johan Hedberga087a982015-01-30 10:58:54 +02002244 * When the event processing receives the notification, then the
2245 * BTUSB_DOWNLOADING flag will be cleared.
2246 *
2247 * The firmware loading should not take longer than 5 seconds
2248 * and thus just timeout if that happens and fail the setup
2249 * of this device.
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002250 */
Johan Hedberg129a7692015-02-14 09:33:35 +02002251 err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING,
2252 TASK_INTERRUPTIBLE,
2253 msecs_to_jiffies(5000));
Bart Van Asschef0a70a02016-08-11 16:02:44 -07002254 if (err == -EINTR) {
Johan Hedberga087a982015-01-30 10:58:54 +02002255 BT_ERR("%s: Firmware loading interrupted", hdev->name);
Johan Hedberga087a982015-01-30 10:58:54 +02002256 goto done;
2257 }
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002258
Johan Hedberga087a982015-01-30 10:58:54 +02002259 if (err) {
2260 BT_ERR("%s: Firmware loading timeout", hdev->name);
2261 err = -ETIMEDOUT;
2262 goto done;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002263 }
2264
2265 if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) {
2266 BT_ERR("%s: Firmware loading failed", hdev->name);
2267 err = -ENOEXEC;
2268 goto done;
2269 }
2270
2271 rettime = ktime_get();
2272 delta = ktime_sub(rettime, calltime);
2273 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
2274
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002275 bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002276
2277done:
2278 release_firmware(fw);
2279
2280 if (err < 0)
2281 return err;
2282
2283 calltime = ktime_get();
2284
2285 set_bit(BTUSB_BOOTING, &data->flags);
2286
Tedd Ho-Jeong Ane5889af2018-01-24 09:19:18 -08002287 err = btintel_send_intel_reset(hdev, boot_param);
2288 if (err)
2289 return err;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002290
2291 /* The bootloader will not indicate when the device is ready. This
2292 * is done by the operational firmware sending bootup notification.
Johan Hedbergfad70972015-01-30 10:58:55 +02002293 *
2294 * Booting into operational firmware should not take longer than
2295 * 1 second. However if that happens, then just fail the setup
2296 * since something went wrong.
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002297 */
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002298 bt_dev_info(hdev, "Waiting for device to boot");
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002299
Johan Hedberg129a7692015-02-14 09:33:35 +02002300 err = wait_on_bit_timeout(&data->flags, BTUSB_BOOTING,
2301 TASK_INTERRUPTIBLE,
2302 msecs_to_jiffies(1000));
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002303
Bart Van Asschef0a70a02016-08-11 16:02:44 -07002304 if (err == -EINTR) {
Johan Hedbergfad70972015-01-30 10:58:55 +02002305 BT_ERR("%s: Device boot interrupted", hdev->name);
2306 return -EINTR;
2307 }
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002308
Johan Hedbergfad70972015-01-30 10:58:55 +02002309 if (err) {
2310 BT_ERR("%s: Device boot timeout", hdev->name);
2311 return -ETIMEDOUT;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002312 }
2313
2314 rettime = ktime_get();
2315 delta = ktime_sub(rettime, calltime);
2316 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
2317
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002318 bt_dev_info(hdev, "Device booted in %llu usecs", duration);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002319
2320 clear_bit(BTUSB_BOOTLOADER, &data->flags);
2321
Tedd Ho-Jeong An52cc9162015-06-12 16:20:05 -07002322 /* Once the device is running in operational mode, it needs to apply
2323 * the device configuration (DDC) parameters.
2324 *
2325 * The device can work without DDC parameters, so even if it fails
2326 * to load the file, no need to fail the setup.
2327 */
Loic Poulaine924d3d2015-09-04 17:54:36 +02002328 btintel_load_ddc_config(hdev, fwname);
Tedd Ho-Jeong An52cc9162015-06-12 16:20:05 -07002329
Marcel Holtmann213445b2015-10-21 02:45:19 +02002330 /* Set the event mask for Intel specific vendor events. This enables
2331 * a few extra events that are useful during general operation. It
2332 * does not enable any debugging related events.
2333 *
2334 * The device will function correctly without these events enabled
2335 * and thus no need to fail the setup.
2336 */
2337 btintel_set_event_mask(hdev, false);
2338
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002339 return 0;
2340}
2341
Tedd Ho-Jeong Anbfbd45e2015-02-13 09:20:52 -08002342static int btusb_shutdown_intel(struct hci_dev *hdev)
2343{
2344 struct sk_buff *skb;
2345 long ret;
2346
2347 /* Some platforms have an issue with BT LED when the interface is
2348 * down or BT radio is turned off, which takes 5 seconds to BT LED
2349 * goes off. This command turns off the BT LED immediately.
2350 */
2351 skb = __hci_cmd_sync(hdev, 0xfc3f, 0, NULL, HCI_INIT_TIMEOUT);
2352 if (IS_ERR(skb)) {
2353 ret = PTR_ERR(skb);
2354 BT_ERR("%s: turning off Intel device LED failed (%ld)",
2355 hdev->name, ret);
2356 return ret;
2357 }
2358 kfree_skb(skb);
2359
2360 return 0;
2361}
2362
Rajat Jaina4ccc9e2017-02-01 14:24:10 -08002363#ifdef CONFIG_PM
2364/* Configure an out-of-band gpio as wake-up pin, if specified in device tree */
2365static int marvell_config_oob_wake(struct hci_dev *hdev)
2366{
2367 struct sk_buff *skb;
2368 struct btusb_data *data = hci_get_drvdata(hdev);
2369 struct device *dev = &data->udev->dev;
2370 u16 pin, gap, opcode;
2371 int ret;
2372 u8 cmd[5];
2373
2374 /* Move on if no wakeup pin specified */
2375 if (of_property_read_u16(dev->of_node, "marvell,wakeup-pin", &pin) ||
2376 of_property_read_u16(dev->of_node, "marvell,wakeup-gap-ms", &gap))
2377 return 0;
2378
2379 /* Vendor specific command to configure a GPIO as wake-up pin */
2380 opcode = hci_opcode_pack(0x3F, 0x59);
2381 cmd[0] = opcode & 0xFF;
2382 cmd[1] = opcode >> 8;
2383 cmd[2] = 2; /* length of parameters that follow */
2384 cmd[3] = pin;
2385 cmd[4] = gap; /* time in ms, for which wakeup pin should be asserted */
2386
2387 skb = bt_skb_alloc(sizeof(cmd), GFP_KERNEL);
2388 if (!skb) {
2389 bt_dev_err(hdev, "%s: No memory\n", __func__);
2390 return -ENOMEM;
2391 }
2392
Johannes Berg59ae1d12017-06-16 14:29:20 +02002393 skb_put_data(skb, cmd, sizeof(cmd));
Rajat Jaina4ccc9e2017-02-01 14:24:10 -08002394 hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
2395
2396 ret = btusb_send_frame(hdev, skb);
2397 if (ret) {
2398 bt_dev_err(hdev, "%s: configuration failed\n", __func__);
2399 kfree_skb(skb);
2400 return ret;
2401 }
2402
2403 return 0;
2404}
2405#endif
2406
Amitkumar Karwarae8df492014-07-18 14:47:06 -07002407static int btusb_set_bdaddr_marvell(struct hci_dev *hdev,
2408 const bdaddr_t *bdaddr)
2409{
2410 struct sk_buff *skb;
2411 u8 buf[8];
2412 long ret;
2413
2414 buf[0] = 0xfe;
2415 buf[1] = sizeof(bdaddr_t);
2416 memcpy(buf + 2, bdaddr, sizeof(bdaddr_t));
2417
2418 skb = __hci_cmd_sync(hdev, 0xfc22, sizeof(buf), buf, HCI_INIT_TIMEOUT);
2419 if (IS_ERR(skb)) {
2420 ret = PTR_ERR(skb);
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002421 bt_dev_err(hdev, "changing Marvell device address failed (%ld)",
2422 ret);
Amitkumar Karwarae8df492014-07-18 14:47:06 -07002423 return ret;
2424 }
2425 kfree_skb(skb);
2426
2427 return 0;
2428}
2429
Toshi Kikuchi58592232014-12-12 10:58:05 -08002430static int btusb_set_bdaddr_ath3012(struct hci_dev *hdev,
2431 const bdaddr_t *bdaddr)
2432{
2433 struct sk_buff *skb;
2434 u8 buf[10];
2435 long ret;
2436
2437 buf[0] = 0x01;
2438 buf[1] = 0x01;
2439 buf[2] = 0x00;
2440 buf[3] = sizeof(bdaddr_t);
2441 memcpy(buf + 4, bdaddr, sizeof(bdaddr_t));
2442
2443 skb = __hci_cmd_sync(hdev, 0xfc0b, sizeof(buf), buf, HCI_INIT_TIMEOUT);
2444 if (IS_ERR(skb)) {
2445 ret = PTR_ERR(skb);
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002446 bt_dev_err(hdev, "Change address command failed (%ld)", ret);
Toshi Kikuchi58592232014-12-12 10:58:05 -08002447 return ret;
2448 }
2449 kfree_skb(skb);
2450
2451 return 0;
2452}
2453
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002454#define QCA_DFU_PACKET_LEN 4096
2455
2456#define QCA_GET_TARGET_VERSION 0x09
2457#define QCA_CHECK_STATUS 0x05
2458#define QCA_DFU_DOWNLOAD 0x01
2459
2460#define QCA_SYSCFG_UPDATED 0x40
2461#define QCA_PATCH_UPDATED 0x80
2462#define QCA_DFU_TIMEOUT 3000
2463
2464struct qca_version {
2465 __le32 rom_version;
2466 __le32 patch_version;
2467 __le32 ram_version;
2468 __le32 ref_clock;
2469 __u8 reserved[4];
2470} __packed;
2471
2472struct qca_rampatch_version {
2473 __le16 rom_version;
2474 __le16 patch_version;
2475} __packed;
2476
2477struct qca_device_info {
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002478 u32 rom_version;
2479 u8 rampatch_hdr; /* length of header in rampatch */
2480 u8 nvm_hdr; /* length of header in NVM */
2481 u8 ver_offset; /* offset of version structure in rampatch */
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002482};
2483
2484static const struct qca_device_info qca_devices_table[] = {
2485 { 0x00000100, 20, 4, 10 }, /* Rome 1.0 */
2486 { 0x00000101, 20, 4, 10 }, /* Rome 1.1 */
Chan-yeol Park7f6e6362015-05-21 11:24:27 +09002487 { 0x00000200, 28, 4, 18 }, /* Rome 2.0 */
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002488 { 0x00000201, 28, 4, 18 }, /* Rome 2.1 */
2489 { 0x00000300, 28, 4, 18 }, /* Rome 3.0 */
2490 { 0x00000302, 28, 4, 18 }, /* Rome 3.2 */
2491};
2492
2493static int btusb_qca_send_vendor_req(struct hci_dev *hdev, u8 request,
2494 void *data, u16 size)
2495{
2496 struct btusb_data *btdata = hci_get_drvdata(hdev);
2497 struct usb_device *udev = btdata->udev;
2498 int pipe, err;
2499 u8 *buf;
2500
2501 buf = kmalloc(size, GFP_KERNEL);
2502 if (!buf)
2503 return -ENOMEM;
2504
2505 /* Found some of USB hosts have IOT issues with ours so that we should
2506 * not wait until HCI layer is ready.
2507 */
2508 pipe = usb_rcvctrlpipe(udev, 0);
2509 err = usb_control_msg(udev, pipe, request, USB_TYPE_VENDOR | USB_DIR_IN,
2510 0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
2511 if (err < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002512 bt_dev_err(hdev, "Failed to access otp area (%d)", err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002513 goto done;
2514 }
2515
2516 memcpy(data, buf, size);
2517
2518done:
2519 kfree(buf);
2520
2521 return err;
2522}
2523
2524static int btusb_setup_qca_download_fw(struct hci_dev *hdev,
2525 const struct firmware *firmware,
2526 size_t hdr_size)
2527{
2528 struct btusb_data *btdata = hci_get_drvdata(hdev);
2529 struct usb_device *udev = btdata->udev;
2530 size_t count, size, sent = 0;
2531 int pipe, len, err;
2532 u8 *buf;
2533
2534 buf = kmalloc(QCA_DFU_PACKET_LEN, GFP_KERNEL);
2535 if (!buf)
2536 return -ENOMEM;
2537
2538 count = firmware->size;
2539
2540 size = min_t(size_t, count, hdr_size);
2541 memcpy(buf, firmware->data, size);
2542
2543 /* USB patches should go down to controller through USB path
2544 * because binary format fits to go down through USB channel.
2545 * USB control path is for patching headers and USB bulk is for
2546 * patch body.
2547 */
2548 pipe = usb_sndctrlpipe(udev, 0);
2549 err = usb_control_msg(udev, pipe, QCA_DFU_DOWNLOAD, USB_TYPE_VENDOR,
2550 0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
2551 if (err < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002552 bt_dev_err(hdev, "Failed to send headers (%d)", err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002553 goto done;
2554 }
2555
2556 sent += size;
2557 count -= size;
2558
2559 while (count) {
2560 size = min_t(size_t, count, QCA_DFU_PACKET_LEN);
2561
2562 memcpy(buf, firmware->data + sent, size);
2563
2564 pipe = usb_sndbulkpipe(udev, 0x02);
2565 err = usb_bulk_msg(udev, pipe, buf, size, &len,
2566 QCA_DFU_TIMEOUT);
2567 if (err < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002568 bt_dev_err(hdev, "Failed to send body at %zd of %zd (%d)",
2569 sent, firmware->size, err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002570 break;
2571 }
2572
2573 if (size != len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002574 bt_dev_err(hdev, "Failed to get bulk buffer");
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002575 err = -EILSEQ;
2576 break;
2577 }
2578
2579 sent += size;
2580 count -= size;
2581 }
2582
2583done:
2584 kfree(buf);
2585 return err;
2586}
2587
2588static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
2589 struct qca_version *ver,
2590 const struct qca_device_info *info)
2591{
2592 struct qca_rampatch_version *rver;
2593 const struct firmware *fw;
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002594 u32 ver_rom, ver_patch;
2595 u16 rver_rom, rver_patch;
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002596 char fwname[64];
2597 int err;
2598
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002599 ver_rom = le32_to_cpu(ver->rom_version);
2600 ver_patch = le32_to_cpu(ver->patch_version);
2601
2602 snprintf(fwname, sizeof(fwname), "qca/rampatch_usb_%08x.bin", ver_rom);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002603
2604 err = request_firmware(&fw, fwname, &hdev->dev);
2605 if (err) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002606 bt_dev_err(hdev, "failed to request rampatch file: %s (%d)",
2607 fwname, err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002608 return err;
2609 }
2610
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002611 bt_dev_info(hdev, "using rampatch file: %s", fwname);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002612
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002613 rver = (struct qca_rampatch_version *)(fw->data + info->ver_offset);
2614 rver_rom = le16_to_cpu(rver->rom_version);
2615 rver_patch = le16_to_cpu(rver->patch_version);
2616
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002617 bt_dev_info(hdev, "QCA: patch rome 0x%x build 0x%x, "
2618 "firmware rome 0x%x build 0x%x",
2619 rver_rom, rver_patch, ver_rom, ver_patch);
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002620
2621 if (rver_rom != ver_rom || rver_patch <= ver_patch) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002622 bt_dev_err(hdev, "rampatch file version did not match with firmware");
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002623 err = -EINVAL;
2624 goto done;
2625 }
2626
2627 err = btusb_setup_qca_download_fw(hdev, fw, info->rampatch_hdr);
2628
2629done:
2630 release_firmware(fw);
2631
2632 return err;
2633}
2634
2635static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
2636 struct qca_version *ver,
2637 const struct qca_device_info *info)
2638{
2639 const struct firmware *fw;
2640 char fwname[64];
2641 int err;
2642
2643 snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
2644 le32_to_cpu(ver->rom_version));
2645
2646 err = request_firmware(&fw, fwname, &hdev->dev);
2647 if (err) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002648 bt_dev_err(hdev, "failed to request NVM file: %s (%d)",
2649 fwname, err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002650 return err;
2651 }
2652
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002653 bt_dev_info(hdev, "using NVM file: %s", fwname);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002654
2655 err = btusb_setup_qca_download_fw(hdev, fw, info->nvm_hdr);
2656
2657 release_firmware(fw);
2658
2659 return err;
2660}
2661
2662static int btusb_setup_qca(struct hci_dev *hdev)
2663{
2664 const struct qca_device_info *info = NULL;
2665 struct qca_version ver;
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002666 u32 ver_rom;
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002667 u8 status;
2668 int i, err;
2669
2670 err = btusb_qca_send_vendor_req(hdev, QCA_GET_TARGET_VERSION, &ver,
Marcel Holtmanneb500422015-04-16 23:15:50 +02002671 sizeof(ver));
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002672 if (err < 0)
2673 return err;
2674
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002675 ver_rom = le32_to_cpu(ver.rom_version);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002676 for (i = 0; i < ARRAY_SIZE(qca_devices_table); i++) {
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002677 if (ver_rom == qca_devices_table[i].rom_version)
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002678 info = &qca_devices_table[i];
2679 }
2680 if (!info) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002681 bt_dev_err(hdev, "don't support firmware rome 0x%x", ver_rom);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002682 return -ENODEV;
2683 }
2684
2685 err = btusb_qca_send_vendor_req(hdev, QCA_CHECK_STATUS, &status,
2686 sizeof(status));
2687 if (err < 0)
2688 return err;
2689
2690 if (!(status & QCA_PATCH_UPDATED)) {
2691 err = btusb_setup_qca_load_rampatch(hdev, &ver, info);
2692 if (err < 0)
2693 return err;
2694 }
2695
2696 if (!(status & QCA_SYSCFG_UPDATED)) {
2697 err = btusb_setup_qca_load_nvm(hdev, &ver, info);
2698 if (err < 0)
2699 return err;
2700 }
2701
2702 return 0;
2703}
2704
Marcel Holtmann9d08f502015-10-08 20:23:08 +02002705#ifdef CONFIG_BT_HCIBTUSB_BCM
2706static inline int __set_diag_interface(struct hci_dev *hdev)
2707{
2708 struct btusb_data *data = hci_get_drvdata(hdev);
2709 struct usb_interface *intf = data->diag;
2710 int i;
2711
2712 if (!data->diag)
2713 return -ENODEV;
2714
2715 data->diag_tx_ep = NULL;
2716 data->diag_rx_ep = NULL;
2717
2718 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
2719 struct usb_endpoint_descriptor *ep_desc;
2720
2721 ep_desc = &intf->cur_altsetting->endpoint[i].desc;
2722
2723 if (!data->diag_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
2724 data->diag_tx_ep = ep_desc;
2725 continue;
2726 }
2727
2728 if (!data->diag_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
2729 data->diag_rx_ep = ep_desc;
2730 continue;
2731 }
2732 }
2733
2734 if (!data->diag_tx_ep || !data->diag_rx_ep) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002735 bt_dev_err(hdev, "invalid diagnostic descriptors");
Marcel Holtmann9d08f502015-10-08 20:23:08 +02002736 return -ENODEV;
2737 }
2738
2739 return 0;
2740}
2741
2742static struct urb *alloc_diag_urb(struct hci_dev *hdev, bool enable)
2743{
2744 struct btusb_data *data = hci_get_drvdata(hdev);
2745 struct sk_buff *skb;
2746 struct urb *urb;
2747 unsigned int pipe;
2748
2749 if (!data->diag_tx_ep)
2750 return ERR_PTR(-ENODEV);
2751
2752 urb = usb_alloc_urb(0, GFP_KERNEL);
2753 if (!urb)
2754 return ERR_PTR(-ENOMEM);
2755
2756 skb = bt_skb_alloc(2, GFP_KERNEL);
2757 if (!skb) {
2758 usb_free_urb(urb);
2759 return ERR_PTR(-ENOMEM);
2760 }
2761
Johannes Berg634fef62017-06-16 14:29:24 +02002762 skb_put_u8(skb, 0xf0);
2763 skb_put_u8(skb, enable);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02002764
2765 pipe = usb_sndbulkpipe(data->udev, data->diag_tx_ep->bEndpointAddress);
2766
2767 usb_fill_bulk_urb(urb, data->udev, pipe,
2768 skb->data, skb->len, btusb_tx_complete, skb);
2769
2770 skb->dev = (void *)hdev;
2771
2772 return urb;
2773}
2774
2775static int btusb_bcm_set_diag(struct hci_dev *hdev, bool enable)
2776{
2777 struct btusb_data *data = hci_get_drvdata(hdev);
2778 struct urb *urb;
2779
2780 if (!data->diag)
2781 return -ENODEV;
2782
2783 if (!test_bit(HCI_RUNNING, &hdev->flags))
2784 return -ENETDOWN;
2785
2786 urb = alloc_diag_urb(hdev, enable);
2787 if (IS_ERR(urb))
2788 return PTR_ERR(urb);
2789
2790 return submit_or_queue_tx_urb(hdev, urb);
2791}
2792#endif
2793
Rajat Jainfd913ef2017-02-01 14:24:09 -08002794#ifdef CONFIG_PM
2795static irqreturn_t btusb_oob_wake_handler(int irq, void *priv)
2796{
2797 struct btusb_data *data = priv;
2798
2799 pm_wakeup_event(&data->udev->dev, 0);
Jeffy Chen017789f2017-02-24 14:24:29 +08002800 pm_system_wakeup();
Rajat Jainfd913ef2017-02-01 14:24:09 -08002801
2802 /* Disable only if not already disabled (keep it balanced) */
2803 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) {
2804 disable_irq_nosync(irq);
2805 disable_irq_wake(irq);
2806 }
2807 return IRQ_HANDLED;
2808}
2809
2810static const struct of_device_id btusb_match_table[] = {
2811 { .compatible = "usb1286,204e" },
2812 { }
2813};
2814MODULE_DEVICE_TABLE(of, btusb_match_table);
2815
2816/* Use an oob wakeup pin? */
2817static int btusb_config_oob_wake(struct hci_dev *hdev)
2818{
2819 struct btusb_data *data = hci_get_drvdata(hdev);
2820 struct device *dev = &data->udev->dev;
2821 int irq, ret;
2822
2823 clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags);
2824
2825 if (!of_match_device(btusb_match_table, dev))
2826 return 0;
2827
2828 /* Move on if no IRQ specified */
2829 irq = of_irq_get_byname(dev->of_node, "wakeup");
2830 if (irq <= 0) {
2831 bt_dev_dbg(hdev, "%s: no OOB Wakeup IRQ in DT", __func__);
2832 return 0;
2833 }
2834
2835 ret = devm_request_irq(&hdev->dev, irq, btusb_oob_wake_handler,
2836 0, "OOB Wake-on-BT", data);
2837 if (ret) {
2838 bt_dev_err(hdev, "%s: IRQ request failed", __func__);
2839 return ret;
2840 }
2841
2842 ret = device_init_wakeup(dev, true);
2843 if (ret) {
2844 bt_dev_err(hdev, "%s: failed to init_wakeup", __func__);
2845 return ret;
2846 }
2847
2848 data->oob_wake_irq = irq;
2849 disable_irq(irq);
2850 bt_dev_info(hdev, "OOB Wake-on-BT configured at IRQ %u", irq);
2851 return 0;
2852}
2853#endif
2854
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002855static int btusb_probe(struct usb_interface *intf,
Marcel Holtmann89e75332014-09-16 04:44:50 +02002856 const struct usb_device_id *id)
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002857{
2858 struct usb_endpoint_descriptor *ep_desc;
2859 struct btusb_data *data;
2860 struct hci_dev *hdev;
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02002861 unsigned ifnum_base;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002862 int i, err;
2863
2864 BT_DBG("intf %p id %p", intf, id);
2865
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02002866 /* interface numbers are hardcoded in the spec */
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02002867 if (intf->cur_altsetting->desc.bInterfaceNumber != 0) {
2868 if (!(id->driver_info & BTUSB_IFNUM_2))
2869 return -ENODEV;
2870 if (intf->cur_altsetting->desc.bInterfaceNumber != 2)
2871 return -ENODEV;
2872 }
2873
2874 ifnum_base = intf->cur_altsetting->desc.bInterfaceNumber;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002875
2876 if (!id->driver_info) {
2877 const struct usb_device_id *match;
Marcel Holtmann89e75332014-09-16 04:44:50 +02002878
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002879 match = usb_match_id(intf, blacklist_table);
2880 if (match)
2881 id = match;
2882 }
2883
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02002884 if (id->driver_info == BTUSB_IGNORE)
2885 return -ENODEV;
2886
Steven.Li2d25f8b2011-07-01 14:02:36 +08002887 if (id->driver_info & BTUSB_ATH3012) {
2888 struct usb_device *udev = interface_to_usbdev(intf);
2889
2890 /* Old firmware would otherwise let ath3k driver load
Derek Robsond98422c2017-07-22 13:47:07 +12002891 * patch and sysconfig files
2892 */
Steven.Li2d25f8b2011-07-01 14:02:36 +08002893 if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001)
2894 return -ENODEV;
2895 }
2896
Sachin Kamat98921db2012-07-27 12:38:39 +05302897 data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002898 if (!data)
2899 return -ENOMEM;
2900
2901 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
2902 ep_desc = &intf->cur_altsetting->endpoint[i].desc;
2903
2904 if (!data->intr_ep && usb_endpoint_is_int_in(ep_desc)) {
2905 data->intr_ep = ep_desc;
2906 continue;
2907 }
2908
2909 if (!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
2910 data->bulk_tx_ep = ep_desc;
2911 continue;
2912 }
2913
2914 if (!data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
2915 data->bulk_rx_ep = ep_desc;
2916 continue;
2917 }
2918 }
2919
Sachin Kamat98921db2012-07-27 12:38:39 +05302920 if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep)
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002921 return -ENODEV;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002922
Marcel Holtmann893ba542015-01-28 20:27:34 -08002923 if (id->driver_info & BTUSB_AMP) {
2924 data->cmdreq_type = USB_TYPE_CLASS | 0x01;
2925 data->cmdreq = 0x2b;
2926 } else {
2927 data->cmdreq_type = USB_TYPE_CLASS;
2928 data->cmdreq = 0x00;
2929 }
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01002930
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002931 data->udev = interface_to_usbdev(intf);
Marcel Holtmann5fbcd262008-09-23 00:16:36 +02002932 data->intf = intf;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002933
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002934 INIT_WORK(&data->work, btusb_work);
Oliver Neukum7bee5492009-08-24 23:44:59 +02002935 INIT_WORK(&data->waker, btusb_waker);
Marcel Holtmann803b5832014-09-16 08:00:29 +02002936 init_usb_anchor(&data->deferred);
2937 init_usb_anchor(&data->tx_anchor);
Oliver Neukum7bee5492009-08-24 23:44:59 +02002938 spin_lock_init(&data->txlock);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002939
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002940 init_usb_anchor(&data->intr_anchor);
2941 init_usb_anchor(&data->bulk_anchor);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02002942 init_usb_anchor(&data->isoc_anchor);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02002943 init_usb_anchor(&data->diag_anchor);
Marcel Holtmann803b5832014-09-16 08:00:29 +02002944 spin_lock_init(&data->rxlock);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002945
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002946 if (id->driver_info & BTUSB_INTEL_NEW) {
2947 data->recv_event = btusb_recv_event_intel;
2948 data->recv_bulk = btusb_recv_bulk_intel;
2949 set_bit(BTUSB_BOOTLOADER, &data->flags);
2950 } else {
2951 data->recv_event = hci_recv_frame;
2952 data->recv_bulk = btusb_recv_bulk;
2953 }
Marcel Holtmann2cbd3f52014-11-03 05:16:07 +01002954
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002955 hdev = hci_alloc_dev();
Sachin Kamat98921db2012-07-27 12:38:39 +05302956 if (!hdev)
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002957 return -ENOMEM;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002958
Marcel Holtmannc13854c2010-02-08 15:27:07 +01002959 hdev->bus = HCI_USB;
David Herrmann155961e2012-02-09 21:58:32 +01002960 hci_set_drvdata(hdev, data);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002961
Marcel Holtmann893ba542015-01-28 20:27:34 -08002962 if (id->driver_info & BTUSB_AMP)
2963 hdev->dev_type = HCI_AMP;
2964 else
Marcel Holtmannca8bee52016-07-05 14:30:14 +02002965 hdev->dev_type = HCI_PRIMARY;
Marcel Holtmann893ba542015-01-28 20:27:34 -08002966
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002967 data->hdev = hdev;
2968
2969 SET_HCIDEV_DEV(hdev, &intf->dev);
2970
Marcel Holtmann9f8f9622013-04-10 08:11:35 -07002971 hdev->open = btusb_open;
2972 hdev->close = btusb_close;
2973 hdev->flush = btusb_flush;
2974 hdev->send = btusb_send_frame;
2975 hdev->notify = btusb_notify;
2976
Hans de Goede1fdb9262018-02-20 09:06:18 +01002977 if (dmi_check_system(btusb_needs_reset_resume_table))
2978 interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;
2979
Rajat Jainfd913ef2017-02-01 14:24:09 -08002980#ifdef CONFIG_PM
2981 err = btusb_config_oob_wake(hdev);
2982 if (err)
2983 goto out_free_dev;
Rajat Jaina4ccc9e2017-02-01 14:24:10 -08002984
2985 /* Marvell devices may need a specific chip configuration */
2986 if (id->driver_info & BTUSB_MARVELL && data->oob_wake_irq) {
2987 err = marvell_config_oob_wake(hdev);
2988 if (err)
2989 goto out_free_dev;
2990 }
Rajat Jainfd913ef2017-02-01 14:24:09 -08002991#endif
Szymon Janc418678b2016-09-01 17:22:37 +02002992 if (id->driver_info & BTUSB_CW6622)
2993 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
2994
Marcel Holtmann6c9d4352015-10-17 14:39:27 +02002995 if (id->driver_info & BTUSB_BCM2045)
2996 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
2997
Marcel Holtmann9f8f9622013-04-10 08:11:35 -07002998 if (id->driver_info & BTUSB_BCM92035)
2999 hdev->setup = btusb_setup_bcm92035;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003000
Marcel Holtmannc2bfb102015-04-05 22:52:14 -07003001#ifdef CONFIG_BT_HCIBTUSB_BCM
Marcel Holtmannabbaf502014-07-02 00:53:48 +02003002 if (id->driver_info & BTUSB_BCM_PATCHRAM) {
Marcel Holtmann49a5f782015-10-20 02:30:48 +02003003 hdev->manufacturer = 15;
Marcel Holtmannc2bfb102015-04-05 22:52:14 -07003004 hdev->setup = btbcm_setup_patchram;
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003005 hdev->set_diag = btusb_bcm_set_diag;
Marcel Holtmann1df1f592015-04-05 22:52:11 -07003006 hdev->set_bdaddr = btbcm_set_bdaddr;
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003007
3008 /* Broadcom LM_DIAG Interface numbers are hardcoded */
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02003009 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2);
Marcel Holtmannabbaf502014-07-02 00:53:48 +02003010 }
Petri Gynther10d4c672014-05-08 15:50:01 -07003011
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003012 if (id->driver_info & BTUSB_BCM_APPLE) {
Marcel Holtmann49a5f782015-10-20 02:30:48 +02003013 hdev->manufacturer = 15;
Marcel Holtmannc2bfb102015-04-05 22:52:14 -07003014 hdev->setup = btbcm_setup_apple;
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003015 hdev->set_diag = btusb_bcm_set_diag;
3016
3017 /* Broadcom LM_DIAG Interface numbers are hardcoded */
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02003018 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003019 }
Marcel Holtmannc2bfb102015-04-05 22:52:14 -07003020#endif
Marcel Holtmann17b27722015-03-22 15:52:38 +01003021
Marcel Holtmanncb8d6592014-07-02 11:25:25 +02003022 if (id->driver_info & BTUSB_INTEL) {
Marcel Holtmann49a5f782015-10-20 02:30:48 +02003023 hdev->manufacturer = 2;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07003024 hdev->setup = btusb_setup_intel;
Tedd Ho-Jeong Anbfbd45e2015-02-13 09:20:52 -08003025 hdev->shutdown = btusb_shutdown_intel;
Marcel Holtmann3e247672015-10-17 16:00:28 +02003026 hdev->set_diag = btintel_set_diag_mfg;
Marcel Holtmann4185a0f2015-04-06 00:52:12 -07003027 hdev->set_bdaddr = btintel_set_bdaddr;
Jakub Pawlowskic33fb9b2015-01-30 18:55:58 -08003028 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
Jakub Pawlowskic1154842015-03-17 09:04:16 -07003029 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
Marcel Holtmann3e247672015-10-17 16:00:28 +02003030 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
Marcel Holtmanncb8d6592014-07-02 11:25:25 +02003031 }
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07003032
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08003033 if (id->driver_info & BTUSB_INTEL_NEW) {
Marcel Holtmann49a5f782015-10-20 02:30:48 +02003034 hdev->manufacturer = 2;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08003035 hdev->send = btusb_send_frame_intel;
3036 hdev->setup = btusb_setup_intel_new;
Marcel Holtmanneeb6abe2015-07-05 14:37:39 +02003037 hdev->hw_error = btintel_hw_error;
Marcel Holtmann6d2e50d2015-10-09 14:42:08 +02003038 hdev->set_diag = btintel_set_diag;
Marcel Holtmann4185a0f2015-04-06 00:52:12 -07003039 hdev->set_bdaddr = btintel_set_bdaddr;
Marcel Holtmannb970c5b2015-02-01 23:57:18 -08003040 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
Marcel Holtmannd8270fb2015-10-17 16:00:27 +02003041 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08003042 }
3043
Amitkumar Karwarae8df492014-07-18 14:47:06 -07003044 if (id->driver_info & BTUSB_MARVELL)
3045 hdev->set_bdaddr = btusb_set_bdaddr_marvell;
3046
Marcel Holtmann661cf882015-01-02 23:35:20 -08003047 if (id->driver_info & BTUSB_SWAVE) {
3048 set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks);
Marcel Holtmannd57dbe72014-12-26 04:42:33 +01003049 set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks);
Marcel Holtmann661cf882015-01-02 23:35:20 -08003050 }
Marcel Holtmannd57dbe72014-12-26 04:42:33 +01003051
Marcel Holtmanne4c534b2015-10-21 01:31:45 +02003052 if (id->driver_info & BTUSB_INTEL_BOOT) {
3053 hdev->manufacturer = 2;
Marcel Holtmann40df7832014-07-06 13:29:58 +02003054 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
Marcel Holtmanne4c534b2015-10-21 01:31:45 +02003055 }
Marcel Holtmann40df7832014-07-06 13:29:58 +02003056
Jakub Pawlowski79f0c872015-01-29 10:38:34 -08003057 if (id->driver_info & BTUSB_ATH3012) {
Toshi Kikuchi58592232014-12-12 10:58:05 -08003058 hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
Jakub Pawlowski3d50d512015-03-17 09:04:15 -07003059 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
Jakub Pawlowski79f0c872015-01-29 10:38:34 -08003060 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
3061 }
Toshi Kikuchi58592232014-12-12 10:58:05 -08003062
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00003063 if (id->driver_info & BTUSB_QCA_ROME) {
3064 data->setup_on_usb = btusb_setup_qca;
3065 hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
Vic Wei96e58d32018-03-28 08:28:47 -07003066 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00003067 }
3068
Carlo Caionedb33c772015-05-14 10:49:09 +02003069#ifdef CONFIG_BT_HCIBTUSB_RTL
Daniel Drake04b8c812015-05-21 08:23:50 -06003070 if (id->driver_info & BTUSB_REALTEK) {
Carlo Caionedb33c772015-05-14 10:49:09 +02003071 hdev->setup = btrtl_setup_realtek;
Daniel Drake04b8c812015-05-21 08:23:50 -06003072
3073 /* Realtek devices lose their updated firmware over suspend,
3074 * but the USB hub doesn't notice any status change.
3075 * Explicitly request a device reset on resume.
3076 */
Hans de Goede61f5ace2018-01-08 10:44:16 +01003077 interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;
Daniel Drake04b8c812015-05-21 08:23:50 -06003078 }
Carlo Caionedb33c772015-05-14 10:49:09 +02003079#endif
Daniel Drakea2698a92015-04-16 14:09:55 -06003080
Marcel Holtmann893ba542015-01-28 20:27:34 -08003081 if (id->driver_info & BTUSB_AMP) {
3082 /* AMP controllers do not support SCO packets */
3083 data->isoc = NULL;
3084 } else {
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02003085 /* Interface orders are hardcoded in the specification */
3086 data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1);
Marcel Holtmann459232f2017-10-24 19:42:45 +02003087 data->isoc_ifnum = ifnum_base + 1;
Marcel Holtmann893ba542015-01-28 20:27:34 -08003088 }
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003089
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003090 if (!reset)
Szymon Janca6c511c2012-05-23 12:35:46 +02003091 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003092
3093 if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) {
3094 if (!disable_scofix)
3095 set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks);
3096 }
3097
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003098 if (id->driver_info & BTUSB_BROKEN_ISOC)
3099 data->isoc = NULL;
3100
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003101 if (id->driver_info & BTUSB_DIGIANSWER) {
3102 data->cmdreq_type = USB_TYPE_VENDOR;
Szymon Janca6c511c2012-05-23 12:35:46 +02003103 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003104 }
3105
3106 if (id->driver_info & BTUSB_CSR) {
3107 struct usb_device *udev = data->udev;
Marcel Holtmann81cac642014-01-03 03:02:36 -08003108 u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice);
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003109
3110 /* Old firmware would otherwise execute USB reset */
Marcel Holtmann81cac642014-01-03 03:02:36 -08003111 if (bcdDevice < 0x117)
Szymon Janca6c511c2012-05-23 12:35:46 +02003112 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
Marcel Holtmann81cac642014-01-03 03:02:36 -08003113
3114 /* Fake CSR devices with broken commands */
Johan Hedberg6cafcd92015-08-30 21:47:21 +03003115 if (bcdDevice <= 0x100 || bcdDevice == 0x134)
Marcel Holtmann81cac642014-01-03 03:02:36 -08003116 hdev->setup = btusb_setup_csr;
Jakub Pawlowski49c989a2015-03-17 09:04:17 -07003117
3118 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003119 }
3120
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003121 if (id->driver_info & BTUSB_SNIFFER) {
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003122 struct usb_device *udev = data->udev;
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003123
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003124 /* New sniffer firmware has crippled HCI interface */
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003125 if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
3126 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
3127 }
3128
Marcel Holtmann3a5ef202014-07-06 14:53:54 +02003129 if (id->driver_info & BTUSB_INTEL_BOOT) {
3130 /* A bug in the bootloader causes that interrupt interface is
3131 * only enabled after receiving SetInterface(0, AltSetting=0).
3132 */
3133 err = usb_set_interface(data->udev, 0, 0);
3134 if (err < 0) {
3135 BT_ERR("failed to set interface 0, alt 0 %d", err);
Rajat Jain10ab1332017-02-01 14:24:08 -08003136 goto out_free_dev;
Marcel Holtmann3a5ef202014-07-06 14:53:54 +02003137 }
3138 }
3139
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003140 if (data->isoc) {
3141 err = usb_driver_claim_interface(&btusb_driver,
Marcel Holtmann89e75332014-09-16 04:44:50 +02003142 data->isoc, data);
Rajat Jain10ab1332017-02-01 14:24:08 -08003143 if (err < 0)
3144 goto out_free_dev;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003145 }
3146
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003147#ifdef CONFIG_BT_HCIBTUSB_BCM
3148 if (data->diag) {
3149 if (!usb_driver_claim_interface(&btusb_driver,
3150 data->diag, data))
3151 __set_diag_interface(hdev);
3152 else
3153 data->diag = NULL;
3154 }
3155#endif
3156
Hans de Goedeeff2d682017-11-13 14:44:16 +01003157 if (enable_autosuspend)
3158 usb_enable_autosuspend(data->udev);
3159
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003160 err = hci_register_dev(hdev);
Rajat Jain10ab1332017-02-01 14:24:08 -08003161 if (err < 0)
3162 goto out_free_dev;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003163
3164 usb_set_intfdata(intf, data);
3165
3166 return 0;
Rajat Jain10ab1332017-02-01 14:24:08 -08003167
3168out_free_dev:
3169 hci_free_dev(hdev);
3170 return err;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003171}
3172
3173static void btusb_disconnect(struct usb_interface *intf)
3174{
3175 struct btusb_data *data = usb_get_intfdata(intf);
3176 struct hci_dev *hdev;
3177
3178 BT_DBG("intf %p", intf);
3179
3180 if (!data)
3181 return;
3182
3183 hdev = data->hdev;
Marcel Holtmann5fbcd262008-09-23 00:16:36 +02003184 usb_set_intfdata(data->intf, NULL);
3185
3186 if (data->isoc)
3187 usb_set_intfdata(data->isoc, NULL);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003188
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003189 if (data->diag)
3190 usb_set_intfdata(data->diag, NULL);
3191
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003192 hci_unregister_dev(hdev);
3193
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003194 if (intf == data->intf) {
3195 if (data->isoc)
3196 usb_driver_release_interface(&btusb_driver, data->isoc);
3197 if (data->diag)
3198 usb_driver_release_interface(&btusb_driver, data->diag);
3199 } else if (intf == data->isoc) {
3200 if (data->diag)
3201 usb_driver_release_interface(&btusb_driver, data->diag);
Marcel Holtmann5fbcd262008-09-23 00:16:36 +02003202 usb_driver_release_interface(&btusb_driver, data->intf);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003203 } else if (intf == data->diag) {
3204 usb_driver_release_interface(&btusb_driver, data->intf);
3205 if (data->isoc)
3206 usb_driver_release_interface(&btusb_driver, data->isoc);
3207 }
Marcel Holtmann5fbcd262008-09-23 00:16:36 +02003208
Rajat Jainfd913ef2017-02-01 14:24:09 -08003209 if (data->oob_wake_irq)
3210 device_init_wakeup(&data->udev->dev, false);
3211
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003212 hci_free_dev(hdev);
3213}
3214
Oliver Neukum7bee5492009-08-24 23:44:59 +02003215#ifdef CONFIG_PM
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003216static int btusb_suspend(struct usb_interface *intf, pm_message_t message)
3217{
3218 struct btusb_data *data = usb_get_intfdata(intf);
3219
3220 BT_DBG("intf %p", intf);
3221
3222 if (data->suspend_count++)
3223 return 0;
3224
Oliver Neukum7bee5492009-08-24 23:44:59 +02003225 spin_lock_irq(&data->txlock);
Alan Stern5b1b0b82011-08-19 23:49:48 +02003226 if (!(PMSG_IS_AUTO(message) && data->tx_in_flight)) {
Oliver Neukum7bee5492009-08-24 23:44:59 +02003227 set_bit(BTUSB_SUSPENDING, &data->flags);
3228 spin_unlock_irq(&data->txlock);
3229 } else {
3230 spin_unlock_irq(&data->txlock);
3231 data->suspend_count--;
3232 return -EBUSY;
3233 }
3234
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003235 cancel_work_sync(&data->work);
3236
Oliver Neukum7bee5492009-08-24 23:44:59 +02003237 btusb_stop_traffic(data);
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003238 usb_kill_anchored_urbs(&data->tx_anchor);
3239
Rajat Jainfd913ef2017-02-01 14:24:09 -08003240 if (data->oob_wake_irq && device_may_wakeup(&data->udev->dev)) {
3241 set_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags);
3242 enable_irq_wake(data->oob_wake_irq);
3243 enable_irq(data->oob_wake_irq);
3244 }
3245
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003246 return 0;
3247}
3248
Oliver Neukum7bee5492009-08-24 23:44:59 +02003249static void play_deferred(struct btusb_data *data)
3250{
3251 struct urb *urb;
3252 int err;
3253
3254 while ((urb = usb_get_from_anchor(&data->deferred))) {
Jeffy Chen19cfe912017-07-20 18:53:50 +08003255 usb_anchor_urb(urb, &data->tx_anchor);
3256
Oliver Neukum7bee5492009-08-24 23:44:59 +02003257 err = usb_submit_urb(urb, GFP_ATOMIC);
Jeffy Chen19cfe912017-07-20 18:53:50 +08003258 if (err < 0) {
3259 if (err != -EPERM && err != -ENODEV)
3260 BT_ERR("%s urb %p submission failed (%d)",
3261 data->hdev->name, urb, -err);
3262 kfree(urb->setup_packet);
3263 usb_unanchor_urb(urb);
3264 usb_free_urb(urb);
Oliver Neukum7bee5492009-08-24 23:44:59 +02003265 break;
Jeffy Chen19cfe912017-07-20 18:53:50 +08003266 }
Oliver Neukum7bee5492009-08-24 23:44:59 +02003267
3268 data->tx_in_flight++;
Jeffy Chen19cfe912017-07-20 18:53:50 +08003269 usb_free_urb(urb);
Oliver Neukum7bee5492009-08-24 23:44:59 +02003270 }
Jeffy Chen19cfe912017-07-20 18:53:50 +08003271
3272 /* Cleanup the rest deferred urbs. */
3273 while ((urb = usb_get_from_anchor(&data->deferred))) {
3274 kfree(urb->setup_packet);
3275 usb_free_urb(urb);
3276 }
Oliver Neukum7bee5492009-08-24 23:44:59 +02003277}
3278
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003279static int btusb_resume(struct usb_interface *intf)
3280{
3281 struct btusb_data *data = usb_get_intfdata(intf);
3282 struct hci_dev *hdev = data->hdev;
Oliver Neukum7bee5492009-08-24 23:44:59 +02003283 int err = 0;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003284
3285 BT_DBG("intf %p", intf);
3286
3287 if (--data->suspend_count)
3288 return 0;
3289
Rajat Jainfd913ef2017-02-01 14:24:09 -08003290 /* Disable only if not already disabled (keep it balanced) */
3291 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) {
3292 disable_irq(data->oob_wake_irq);
3293 disable_irq_wake(data->oob_wake_irq);
3294 }
3295
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003296 if (!test_bit(HCI_RUNNING, &hdev->flags))
Oliver Neukum7bee5492009-08-24 23:44:59 +02003297 goto done;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003298
3299 if (test_bit(BTUSB_INTR_RUNNING, &data->flags)) {
3300 err = btusb_submit_intr_urb(hdev, GFP_NOIO);
3301 if (err < 0) {
3302 clear_bit(BTUSB_INTR_RUNNING, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02003303 goto failed;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003304 }
3305 }
3306
3307 if (test_bit(BTUSB_BULK_RUNNING, &data->flags)) {
Marcel Holtmann43c2e572009-02-04 17:41:38 +01003308 err = btusb_submit_bulk_urb(hdev, GFP_NOIO);
3309 if (err < 0) {
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003310 clear_bit(BTUSB_BULK_RUNNING, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02003311 goto failed;
3312 }
3313
3314 btusb_submit_bulk_urb(hdev, GFP_NOIO);
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003315 }
3316
3317 if (test_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
3318 if (btusb_submit_isoc_urb(hdev, GFP_NOIO) < 0)
3319 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
3320 else
3321 btusb_submit_isoc_urb(hdev, GFP_NOIO);
3322 }
3323
Oliver Neukum7bee5492009-08-24 23:44:59 +02003324 spin_lock_irq(&data->txlock);
3325 play_deferred(data);
3326 clear_bit(BTUSB_SUSPENDING, &data->flags);
3327 spin_unlock_irq(&data->txlock);
3328 schedule_work(&data->work);
3329
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003330 return 0;
Oliver Neukum7bee5492009-08-24 23:44:59 +02003331
3332failed:
3333 usb_scuttle_anchored_urbs(&data->deferred);
3334done:
3335 spin_lock_irq(&data->txlock);
3336 clear_bit(BTUSB_SUSPENDING, &data->flags);
3337 spin_unlock_irq(&data->txlock);
3338
3339 return err;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003340}
Oliver Neukum7bee5492009-08-24 23:44:59 +02003341#endif
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003342
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003343static struct usb_driver btusb_driver = {
3344 .name = "btusb",
3345 .probe = btusb_probe,
3346 .disconnect = btusb_disconnect,
Oliver Neukum7bee5492009-08-24 23:44:59 +02003347#ifdef CONFIG_PM
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003348 .suspend = btusb_suspend,
3349 .resume = btusb_resume,
Oliver Neukum7bee5492009-08-24 23:44:59 +02003350#endif
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003351 .id_table = btusb_table,
Oliver Neukum7bee5492009-08-24 23:44:59 +02003352 .supports_autosuspend = 1,
Sarah Sharpe1f12eb2012-04-23 10:08:51 -07003353 .disable_hub_initiated_lpm = 1,
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003354};
3355
Greg Kroah-Hartman93f15082011-11-18 09:47:34 -08003356module_usb_driver(btusb_driver);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003357
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003358module_param(disable_scofix, bool, 0644);
3359MODULE_PARM_DESC(disable_scofix, "Disable fixup of wrong SCO buffer size");
3360
3361module_param(force_scofix, bool, 0644);
3362MODULE_PARM_DESC(force_scofix, "Force fixup of wrong SCO buffers size");
3363
Hans de Goedeeff2d682017-11-13 14:44:16 +01003364module_param(enable_autosuspend, bool, 0644);
3365MODULE_PARM_DESC(enable_autosuspend, "Enable USB autosuspend by default");
3366
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003367module_param(reset, bool, 0644);
3368MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
3369
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003370MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
3371MODULE_DESCRIPTION("Generic Bluetooth USB driver ver " VERSION);
3372MODULE_VERSION(VERSION);
3373MODULE_LICENSE("GPL");