blob: 84de6244ae66db071bcc0dab2d1c6490d1c60952 [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 },
Hans de Goede544a5912018-04-26 14:18:19 +0200234 { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
Sunguk Lee94a32d102013-03-12 04:41:58 +0900235 { USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
Cho, Yu-Chen07c0ea82012-03-14 22:01:21 +0200236 { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
Oliver Neukumb1312372014-01-16 15:37:11 +0100237 { USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
Oliver Neukum1e56f1e2014-01-16 16:02:58 +0100238 { USB_DEVICE(0x0cf3, 0x311f), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200239 { USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
Ming Leiebaf5792013-03-18 23:45:11 +0800240 { USB_DEVICE(0x0cf3, 0x817a), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin18e0afa2015-10-16 11:45:26 +0300241 { USB_DEVICE(0x0cf3, 0x817b), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200242 { USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
AceLan Kaoac713112012-04-19 14:53:45 +0800243 { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
Peng Chen0a3658c2013-08-30 17:41:40 +0800244 { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
Wen-chien Jesse Sungca79f232015-05-13 11:39:24 +0800245 { USB_DEVICE(0x0cf3, 0xe006), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200246 { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
247 { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
AceLan Kaoeed307e2012-12-11 11:41:20 +0800248 { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin609574e2016-02-10 15:33:17 +0300249 { USB_DEVICE(0x13d3, 0x3395), .driver_info = BTUSB_ATH3012 },
Sujith Manoharan5b77a1f2013-07-15 09:29:03 +0530250 { USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin3bb30a7c2014-11-25 20:19:52 +0300251 { USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin033efa92015-01-18 00:16:51 +0300252 { USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 },
Anantha Krishnanfa2f1392014-07-08 19:25:08 +0530253 { USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin75c6aca2016-03-04 01:32:19 +0300254 { USB_DEVICE(0x13d3, 0x3472), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin0d0cef62015-06-06 20:29:25 +0300255 { USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
Lauro Costa72f9f8b2016-05-09 17:36:11 -0300256 { USB_DEVICE(0x13d3, 0x3487), .driver_info = BTUSB_ATH3012 },
Dmitry Tunin12d86892016-07-12 01:35:18 +0300257 { USB_DEVICE(0x13d3, 0x3490), .driver_info = BTUSB_ATH3012 },
Bala Shanmugamd9f51b52011-02-11 15:38:53 +0530258
Cho, Yu-Chene9036e32011-02-15 10:20:07 +0800259 /* Atheros AR5BBU12 with sflash firmware */
260 { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
261
Michael Gruetzner85d59722012-05-02 22:33:40 +0200262 /* Atheros AR5BBU12 with sflash firmware */
Yevgeniy Melnichukbc21fde2012-08-07 19:48:10 +0530263 { USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200264 { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
Michael Gruetzner85d59722012-05-02 22:33:40 +0200265
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +0000266 /* QCA ROME chipset */
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 },
Vic Weid666fc52018-04-23 15:17:07 -0700279 { USB_DEVICE(0x04ca, 0x301a), .driver_info = BTUSB_QCA_ROME },
João Paulo Rechi Vitadf2445b2018-04-27 10:09:58 -0700280 { USB_DEVICE(0x13d3, 0x3496), .driver_info = BTUSB_QCA_ROME },
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +0000281
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200282 /* Broadcom BCM2035 */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100283 { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
Andy Shevchenko0b880062014-02-18 18:26:19 +0200284 { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
285 { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200286
287 /* Broadcom BCM2045 */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100288 { USB_DEVICE(0x0a5c, 0x2039), .driver_info = BTUSB_WRONG_SCO_MTU },
289 { USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmannbdbef3d2008-09-23 00:16:35 +0200290
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200291 /* IBM/Lenovo ThinkPad with Broadcom chip */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100292 { USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_WRONG_SCO_MTU },
293 { USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200294
295 /* HP laptop with Broadcom chip */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100296 { USB_DEVICE(0x03f0, 0x171d), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200297
298 /* Dell laptop with Broadcom chip */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100299 { USB_DEVICE(0x413c, 0x8126), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200300
Marcel Holtmann5ddd4a62008-11-30 12:17:27 +0100301 /* Dell Wireless 370 and 410 devices */
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100302 { USB_DEVICE(0x413c, 0x8152), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmann5ddd4a62008-11-30 12:17:27 +0100303 { USB_DEVICE(0x413c, 0x8156), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200304
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100305 /* Belkin F8T012 and F8T013 devices */
306 { USB_DEVICE(0x050d, 0x0012), .driver_info = BTUSB_WRONG_SCO_MTU },
307 { USB_DEVICE(0x050d, 0x0013), .driver_info = BTUSB_WRONG_SCO_MTU },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200308
Marcel Holtmann5ddd4a62008-11-30 12:17:27 +0100309 /* Asus WL-BTD202 device */
310 { USB_DEVICE(0x0b05, 0x1715), .driver_info = BTUSB_WRONG_SCO_MTU },
311
312 /* Kensington Bluetooth USB adapter */
313 { USB_DEVICE(0x047d, 0x105e), .driver_info = BTUSB_WRONG_SCO_MTU },
314
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200315 /* RTX Telecom based adapters with buggy SCO support */
316 { USB_DEVICE(0x0400, 0x0807), .driver_info = BTUSB_BROKEN_ISOC },
317 { USB_DEVICE(0x0400, 0x080a), .driver_info = BTUSB_BROKEN_ISOC },
318
319 /* CONWISE Technology based adapters with buggy SCO support */
Szymon Janc418678b2016-09-01 17:22:37 +0200320 { USB_DEVICE(0x0e5e, 0x6622),
321 .driver_info = BTUSB_BROKEN_ISOC | BTUSB_CW6622},
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200322
Marcel Holtmann4fcef8e2015-01-01 17:34:37 -0800323 /* Roper Class 1 Bluetooth Dongle (Silicon Wave based) */
Aleksei Volkov2eeac872015-06-08 12:02:10 +0300324 { USB_DEVICE(0x1310, 0x0001), .driver_info = BTUSB_SWAVE },
Marcel Holtmann4fcef8e2015-01-01 17:34:37 -0800325
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200326 /* Digianswer devices */
327 { USB_DEVICE(0x08fd, 0x0001), .driver_info = BTUSB_DIGIANSWER },
328 { USB_DEVICE(0x08fd, 0x0002), .driver_info = BTUSB_IGNORE },
329
330 /* CSR BlueCore Bluetooth Sniffer */
Marcel Holtmann4f64fa82014-07-07 00:12:04 +0200331 { USB_DEVICE(0x0a12, 0x0002),
332 .driver_info = BTUSB_SNIFFER | BTUSB_BROKEN_ISOC },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200333
334 /* Frontline ComProbe Bluetooth Sniffer */
Marcel Holtmann4f64fa82014-07-07 00:12:04 +0200335 { USB_DEVICE(0x16d3, 0x0002),
336 .driver_info = BTUSB_SNIFFER | BTUSB_BROKEN_ISOC },
Marcel Holtmanncfeb4142008-08-07 22:26:56 +0200337
Marcel Holtmanncb1ee892015-01-28 19:41:42 -0800338 /* Marvell Bluetooth devices */
339 { USB_DEVICE(0x1286, 0x2044), .driver_info = BTUSB_MARVELL },
340 { USB_DEVICE(0x1286, 0x2046), .driver_info = BTUSB_MARVELL },
Amitkumar Karwar1165df02016-09-28 16:18:35 +0530341 { USB_DEVICE(0x1286, 0x204e), .driver_info = BTUSB_MARVELL },
Marcel Holtmanncb1ee892015-01-28 19:41:42 -0800342
Marcel Holtmannd0ac9eb2015-01-28 19:41:43 -0800343 /* Intel Bluetooth devices */
Marcel Holtmannde766142017-03-06 15:38:28 -0800344 { USB_DEVICE(0x8087, 0x0025), .driver_info = BTUSB_INTEL_NEW },
Tedd Ho-Jeong An1ce0cec2018-02-05 14:20:36 -0800345 { USB_DEVICE(0x8087, 0x0026), .driver_info = BTUSB_INTEL_NEW },
Marcel Holtmann407550f2015-02-22 15:41:18 -0800346 { USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR },
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -0700347 { USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL },
Tedd Ho-Jeong Anef4e5e42013-11-12 13:10:58 -0800348 { USB_DEVICE(0x8087, 0x0a2a), .driver_info = BTUSB_INTEL },
Marcel Holtmanncda0dd72015-01-26 21:33:48 -0800349 { USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW },
Tedd Ho-Jeong An439e65d2016-06-20 13:43:40 -0700350 { USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL },
Tedd Ho-Jeong An86a61292017-05-01 13:35:12 -0700351 { USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW },
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -0700352
Marcel Holtmannd0ac9eb2015-01-28 19:41:43 -0800353 /* Other Intel Bluetooth devices */
354 { USB_VENDOR_AND_INTERFACE_INFO(0x8087, 0xe0, 0x01, 0x01),
355 .driver_info = BTUSB_IGNORE },
Amitkumar Karwarae8df492014-07-18 14:47:06 -0700356
Daniel Drakea2698a92015-04-16 14:09:55 -0600357 /* Realtek Bluetooth devices */
358 { USB_VENDOR_AND_INTERFACE_INFO(0x0bda, 0xe0, 0x01, 0x01),
359 .driver_info = BTUSB_REALTEK },
360
361 /* Additional Realtek 8723AE Bluetooth devices */
362 { USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK },
363 { USB_DEVICE(0x13d3, 0x3394), .driver_info = BTUSB_REALTEK },
364
365 /* Additional Realtek 8723BE Bluetooth devices */
366 { USB_DEVICE(0x0489, 0xe085), .driver_info = BTUSB_REALTEK },
367 { USB_DEVICE(0x0489, 0xe08b), .driver_info = BTUSB_REALTEK },
368 { USB_DEVICE(0x13d3, 0x3410), .driver_info = BTUSB_REALTEK },
369 { USB_DEVICE(0x13d3, 0x3416), .driver_info = BTUSB_REALTEK },
370 { USB_DEVICE(0x13d3, 0x3459), .driver_info = BTUSB_REALTEK },
Dmitry Tunina81d72d2017-08-08 14:09:02 +0300371 { USB_DEVICE(0x13d3, 0x3494), .driver_info = BTUSB_REALTEK },
Daniel Drakea2698a92015-04-16 14:09:55 -0600372
Vicente Bergasa41e0792018-03-20 19:41:10 +0100373 /* Additional Realtek 8723BU Bluetooth devices */
374 { USB_DEVICE(0x7392, 0xa611), .driver_info = BTUSB_REALTEK },
375
Jian-Hong Pan66d99752018-05-21 18:09:20 +0800376 /* Additional Realtek 8723DE Bluetooth devices */
377 { USB_DEVICE(0x2ff8, 0xb011), .driver_info = BTUSB_REALTEK },
378
Daniel Drakea2698a92015-04-16 14:09:55 -0600379 /* Additional Realtek 8821AE Bluetooth devices */
380 { USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK },
381 { USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK },
382 { USB_DEVICE(0x13d3, 0x3458), .driver_info = BTUSB_REALTEK },
383 { USB_DEVICE(0x13d3, 0x3461), .driver_info = BTUSB_REALTEK },
384 { USB_DEVICE(0x13d3, 0x3462), .driver_info = BTUSB_REALTEK },
385
Larry Fingerfed03fe2018-02-11 12:24:32 -0600386 /* Additional Realtek 8822BE Bluetooth devices */
387 { USB_DEVICE(0x0b05, 0x185c), .driver_info = BTUSB_REALTEK },
388
Peter Poklop4481c072015-08-15 20:47:09 +0200389 /* Silicon Wave based devices */
390 { USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_SWAVE },
391
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200392 { } /* Terminating entry */
393};
394
Hans de Goede1fdb9262018-02-20 09:06:18 +0100395/* The Bluetooth USB module build into some devices needs to be reset on resume,
396 * this is a problem with the platform (likely shutting off all power) not with
397 * the module itself. So we use a DMI list to match known broken platforms.
398 */
399static const struct dmi_system_id btusb_needs_reset_resume_table[] = {
400 {
Kai-Heng Feng0c6e5262018-03-01 13:42:52 +0800401 /* Dell OptiPlex 3060 (QCA ROME device 0cf3:e007) */
Hans de Goede1fdb9262018-02-20 09:06:18 +0100402 .matches = {
Kai-Heng Feng0c6e5262018-03-01 13:42:52 +0800403 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
404 DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 3060"),
Hans de Goede1fdb9262018-02-20 09:06:18 +0100405 },
406 },
Hans de Goede596b07a2018-04-26 20:52:06 +0200407 {
408 /* Dell XPS 9360 (QCA ROME device 0cf3:e300) */
409 .matches = {
410 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
411 DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9360"),
412 },
413 },
Hans de Goede1fdb9262018-02-20 09:06:18 +0100414 {}
415};
416
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200417#define BTUSB_MAX_ISOC_FRAMES 10
418
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200419#define BTUSB_INTR_RUNNING 0
420#define BTUSB_BULK_RUNNING 1
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200421#define BTUSB_ISOC_RUNNING 2
Oliver Neukum7bee5492009-08-24 23:44:59 +0200422#define BTUSB_SUSPENDING 3
Gustavo F. Padovan08b8b6c2010-07-16 17:20:33 -0300423#define BTUSB_DID_ISO_RESUME 4
Marcel Holtmanncda0dd72015-01-26 21:33:48 -0800424#define BTUSB_BOOTLOADER 5
425#define BTUSB_DOWNLOADING 6
Marcel Holtmannce6bb922015-01-28 01:58:40 -0800426#define BTUSB_FIRMWARE_LOADED 7
Marcel Holtmanncda0dd72015-01-26 21:33:48 -0800427#define BTUSB_FIRMWARE_FAILED 8
Marcel Holtmannce6bb922015-01-28 01:58:40 -0800428#define BTUSB_BOOTING 9
Hans de Goede61f5ace2018-01-08 10:44:16 +0100429#define BTUSB_DIAG_RUNNING 10
430#define BTUSB_OOB_WAKE_ENABLED 11
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200431
432struct btusb_data {
433 struct hci_dev *hdev;
434 struct usb_device *udev;
Marcel Holtmann5fbcd262008-09-23 00:16:36 +0200435 struct usb_interface *intf;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200436 struct usb_interface *isoc;
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200437 struct usb_interface *diag;
Marcel Holtmann459232f2017-10-24 19:42:45 +0200438 unsigned isoc_ifnum;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200439
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200440 unsigned long flags;
441
442 struct work_struct work;
Oliver Neukum7bee5492009-08-24 23:44:59 +0200443 struct work_struct waker;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200444
Marcel Holtmann803b5832014-09-16 08:00:29 +0200445 struct usb_anchor deferred;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200446 struct usb_anchor tx_anchor;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200447 int tx_in_flight;
448 spinlock_t txlock;
449
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200450 struct usb_anchor intr_anchor;
451 struct usb_anchor bulk_anchor;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200452 struct usb_anchor isoc_anchor;
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200453 struct usb_anchor diag_anchor;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200454 spinlock_t rxlock;
455
456 struct sk_buff *evt_skb;
457 struct sk_buff *acl_skb;
458 struct sk_buff *sco_skb;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200459
460 struct usb_endpoint_descriptor *intr_ep;
461 struct usb_endpoint_descriptor *bulk_tx_ep;
462 struct usb_endpoint_descriptor *bulk_rx_ep;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200463 struct usb_endpoint_descriptor *isoc_tx_ep;
464 struct usb_endpoint_descriptor *isoc_rx_ep;
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200465 struct usb_endpoint_descriptor *diag_tx_ep;
466 struct usb_endpoint_descriptor *diag_rx_ep;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200467
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100468 __u8 cmdreq_type;
Marcel Holtmann893ba542015-01-28 20:27:34 -0800469 __u8 cmdreq;
Marcel Holtmann7a9d4022008-11-30 12:17:26 +0100470
Marcel Holtmann43c2e572009-02-04 17:41:38 +0100471 unsigned int sco_num;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200472 int isoc_altsetting;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +0100473 int suspend_count;
Marcel Holtmann2cbd3f52014-11-03 05:16:07 +0100474
Marcel Holtmann97307f52015-01-12 13:51:10 -0800475 int (*recv_event)(struct hci_dev *hdev, struct sk_buff *skb);
Marcel Holtmann2cbd3f52014-11-03 05:16:07 +0100476 int (*recv_bulk)(struct btusb_data *data, void *buffer, int count);
Kim, Ben Young Taeace31982015-02-15 23:06:14 +0000477
478 int (*setup_on_usb)(struct hci_dev *hdev);
Rajat Jainfd913ef2017-02-01 14:24:09 -0800479
480 int oob_wake_irq; /* irq for out-of-band wake-on-bt */
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200481};
482
Marcel Holtmann803b5832014-09-16 08:00:29 +0200483static inline void btusb_free_frags(struct btusb_data *data)
484{
485 unsigned long flags;
486
487 spin_lock_irqsave(&data->rxlock, flags);
488
489 kfree_skb(data->evt_skb);
490 data->evt_skb = NULL;
491
492 kfree_skb(data->acl_skb);
493 data->acl_skb = NULL;
494
495 kfree_skb(data->sco_skb);
496 data->sco_skb = NULL;
497
498 spin_unlock_irqrestore(&data->rxlock, flags);
499}
500
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200501static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count)
502{
Marcel Holtmann803b5832014-09-16 08:00:29 +0200503 struct sk_buff *skb;
504 int err = 0;
505
506 spin_lock(&data->rxlock);
507 skb = data->evt_skb;
508
509 while (count) {
510 int len;
511
512 if (!skb) {
513 skb = bt_skb_alloc(HCI_MAX_EVENT_SIZE, GFP_ATOMIC);
514 if (!skb) {
515 err = -ENOMEM;
516 break;
517 }
518
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100519 hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
520 hci_skb_expect(skb) = HCI_EVENT_HDR_SIZE;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200521 }
522
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100523 len = min_t(uint, hci_skb_expect(skb), count);
Johannes Berg59ae1d12017-06-16 14:29:20 +0200524 skb_put_data(skb, buffer, len);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200525
526 count -= len;
527 buffer += len;
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100528 hci_skb_expect(skb) -= len;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200529
530 if (skb->len == HCI_EVENT_HDR_SIZE) {
531 /* Complete event header */
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100532 hci_skb_expect(skb) = hci_event_hdr(skb)->plen;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200533
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100534 if (skb_tailroom(skb) < hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200535 kfree_skb(skb);
536 skb = NULL;
537
538 err = -EILSEQ;
539 break;
540 }
541 }
542
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100543 if (!hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200544 /* Complete frame */
Marcel Holtmann97307f52015-01-12 13:51:10 -0800545 data->recv_event(data->hdev, skb);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200546 skb = NULL;
547 }
548 }
549
550 data->evt_skb = skb;
551 spin_unlock(&data->rxlock);
552
553 return err;
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200554}
555
556static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
557{
Marcel Holtmann803b5832014-09-16 08:00:29 +0200558 struct sk_buff *skb;
559 int err = 0;
560
561 spin_lock(&data->rxlock);
562 skb = data->acl_skb;
563
564 while (count) {
565 int len;
566
567 if (!skb) {
568 skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
569 if (!skb) {
570 err = -ENOMEM;
571 break;
572 }
573
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100574 hci_skb_pkt_type(skb) = HCI_ACLDATA_PKT;
575 hci_skb_expect(skb) = HCI_ACL_HDR_SIZE;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200576 }
577
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100578 len = min_t(uint, hci_skb_expect(skb), count);
Johannes Berg59ae1d12017-06-16 14:29:20 +0200579 skb_put_data(skb, buffer, len);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200580
581 count -= len;
582 buffer += len;
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100583 hci_skb_expect(skb) -= len;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200584
585 if (skb->len == HCI_ACL_HDR_SIZE) {
586 __le16 dlen = hci_acl_hdr(skb)->dlen;
587
588 /* Complete ACL header */
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100589 hci_skb_expect(skb) = __le16_to_cpu(dlen);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200590
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100591 if (skb_tailroom(skb) < hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200592 kfree_skb(skb);
593 skb = NULL;
594
595 err = -EILSEQ;
596 break;
597 }
598 }
599
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100600 if (!hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200601 /* Complete frame */
602 hci_recv_frame(data->hdev, skb);
603 skb = NULL;
604 }
605 }
606
607 data->acl_skb = skb;
608 spin_unlock(&data->rxlock);
609
610 return err;
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200611}
612
613static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count)
614{
Marcel Holtmann803b5832014-09-16 08:00:29 +0200615 struct sk_buff *skb;
616 int err = 0;
617
618 spin_lock(&data->rxlock);
619 skb = data->sco_skb;
620
621 while (count) {
622 int len;
623
624 if (!skb) {
625 skb = bt_skb_alloc(HCI_MAX_SCO_SIZE, GFP_ATOMIC);
626 if (!skb) {
627 err = -ENOMEM;
628 break;
629 }
630
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100631 hci_skb_pkt_type(skb) = HCI_SCODATA_PKT;
632 hci_skb_expect(skb) = HCI_SCO_HDR_SIZE;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200633 }
634
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100635 len = min_t(uint, hci_skb_expect(skb), count);
Johannes Berg59ae1d12017-06-16 14:29:20 +0200636 skb_put_data(skb, buffer, len);
Marcel Holtmann803b5832014-09-16 08:00:29 +0200637
638 count -= len;
639 buffer += len;
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100640 hci_skb_expect(skb) -= len;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200641
642 if (skb->len == HCI_SCO_HDR_SIZE) {
643 /* Complete SCO header */
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100644 hci_skb_expect(skb) = hci_sco_hdr(skb)->dlen;
Marcel Holtmann803b5832014-09-16 08:00:29 +0200645
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100646 if (skb_tailroom(skb) < hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200647 kfree_skb(skb);
648 skb = NULL;
649
650 err = -EILSEQ;
651 break;
652 }
653 }
654
Marcel Holtmann618e8bc2015-11-05 07:33:56 +0100655 if (!hci_skb_expect(skb)) {
Marcel Holtmann803b5832014-09-16 08:00:29 +0200656 /* Complete frame */
657 hci_recv_frame(data->hdev, skb);
658 skb = NULL;
659 }
660 }
661
662 data->sco_skb = skb;
663 spin_unlock(&data->rxlock);
664
665 return err;
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200666}
667
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200668static void btusb_intr_complete(struct urb *urb)
669{
670 struct hci_dev *hdev = urb->context;
David Herrmann155961e2012-02-09 21:58:32 +0100671 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200672 int err;
673
Marcel Holtmann89e75332014-09-16 04:44:50 +0200674 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
675 urb->actual_length);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200676
677 if (!test_bit(HCI_RUNNING, &hdev->flags))
678 return;
679
680 if (urb->status == 0) {
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200681 hdev->stat.byte_rx += urb->actual_length;
682
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200683 if (btusb_recv_intr(data, urb->transfer_buffer,
684 urb->actual_length) < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100685 bt_dev_err(hdev, "corrupted event packet");
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200686 hdev->stat.err_rx++;
687 }
Champion Chen85560c42014-09-06 14:06:08 -0500688 } else if (urb->status == -ENOENT) {
689 /* Avoid suspend failed when usb_kill_urb */
690 return;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200691 }
692
693 if (!test_bit(BTUSB_INTR_RUNNING, &data->flags))
694 return;
695
Oliver Neukum7bee5492009-08-24 23:44:59 +0200696 usb_mark_last_busy(data->udev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200697 usb_anchor_urb(urb, &data->intr_anchor);
698
699 err = usb_submit_urb(urb, GFP_ATOMIC);
700 if (err < 0) {
Paul Bolle4935f1c2011-08-09 17:16:28 +0200701 /* -EPERM: urb is being killed;
Derek Robsond98422c2017-07-22 13:47:07 +1200702 * -ENODEV: device got disconnected
703 */
Paul Bolle4935f1c2011-08-09 17:16:28 +0200704 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100705 bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
706 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200707 usb_unanchor_urb(urb);
708 }
709}
710
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100711static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200712{
David Herrmann155961e2012-02-09 21:58:32 +0100713 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200714 struct urb *urb;
715 unsigned char *buf;
716 unsigned int pipe;
717 int err, size;
718
719 BT_DBG("%s", hdev->name);
720
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200721 if (!data->intr_ep)
722 return -ENODEV;
723
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100724 urb = usb_alloc_urb(0, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200725 if (!urb)
726 return -ENOMEM;
727
728 size = le16_to_cpu(data->intr_ep->wMaxPacketSize);
729
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100730 buf = kmalloc(size, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200731 if (!buf) {
732 usb_free_urb(urb);
733 return -ENOMEM;
734 }
735
736 pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress);
737
738 usb_fill_int_urb(urb, data->udev, pipe, buf, size,
Marcel Holtmann89e75332014-09-16 04:44:50 +0200739 btusb_intr_complete, hdev, data->intr_ep->bInterval);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200740
741 urb->transfer_flags |= URB_FREE_BUFFER;
742
743 usb_anchor_urb(urb, &data->intr_anchor);
744
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100745 err = usb_submit_urb(urb, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200746 if (err < 0) {
Paul Bolled4b8d1c2011-10-09 12:12:22 +0200747 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100748 bt_dev_err(hdev, "urb %p submission failed (%d)",
749 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200750 usb_unanchor_urb(urb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200751 }
752
753 usb_free_urb(urb);
754
755 return err;
756}
757
758static void btusb_bulk_complete(struct urb *urb)
759{
760 struct hci_dev *hdev = urb->context;
David Herrmann155961e2012-02-09 21:58:32 +0100761 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200762 int err;
763
Marcel Holtmann89e75332014-09-16 04:44:50 +0200764 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
765 urb->actual_length);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200766
767 if (!test_bit(HCI_RUNNING, &hdev->flags))
768 return;
769
770 if (urb->status == 0) {
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200771 hdev->stat.byte_rx += urb->actual_length;
772
Marcel Holtmann2cbd3f52014-11-03 05:16:07 +0100773 if (data->recv_bulk(data, urb->transfer_buffer,
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200774 urb->actual_length) < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100775 bt_dev_err(hdev, "corrupted ACL packet");
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200776 hdev->stat.err_rx++;
777 }
Champion Chen85560c42014-09-06 14:06:08 -0500778 } else if (urb->status == -ENOENT) {
779 /* Avoid suspend failed when usb_kill_urb */
780 return;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200781 }
782
783 if (!test_bit(BTUSB_BULK_RUNNING, &data->flags))
784 return;
785
786 usb_anchor_urb(urb, &data->bulk_anchor);
Oliver Neukum652fd782009-12-16 19:23:43 +0100787 usb_mark_last_busy(data->udev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200788
789 err = usb_submit_urb(urb, GFP_ATOMIC);
790 if (err < 0) {
Paul Bolle4935f1c2011-08-09 17:16:28 +0200791 /* -EPERM: urb is being killed;
Derek Robsond98422c2017-07-22 13:47:07 +1200792 * -ENODEV: device got disconnected
793 */
Paul Bolle4935f1c2011-08-09 17:16:28 +0200794 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100795 bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
796 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200797 usb_unanchor_urb(urb);
798 }
799}
800
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100801static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200802{
David Herrmann155961e2012-02-09 21:58:32 +0100803 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200804 struct urb *urb;
805 unsigned char *buf;
806 unsigned int pipe;
Vikram Kandukuri290ba202009-07-02 14:31:59 +0530807 int err, size = HCI_MAX_FRAME_SIZE;
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200808
809 BT_DBG("%s", hdev->name);
810
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200811 if (!data->bulk_rx_ep)
812 return -ENODEV;
813
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100814 urb = usb_alloc_urb(0, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200815 if (!urb)
816 return -ENOMEM;
817
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100818 buf = kmalloc(size, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200819 if (!buf) {
820 usb_free_urb(urb);
821 return -ENOMEM;
822 }
823
824 pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress);
825
Marcel Holtmann89e75332014-09-16 04:44:50 +0200826 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
827 btusb_bulk_complete, hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200828
829 urb->transfer_flags |= URB_FREE_BUFFER;
830
Oliver Neukum7bee5492009-08-24 23:44:59 +0200831 usb_mark_last_busy(data->udev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200832 usb_anchor_urb(urb, &data->bulk_anchor);
833
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100834 err = usb_submit_urb(urb, mem_flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200835 if (err < 0) {
Paul Bolled4b8d1c2011-10-09 12:12:22 +0200836 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100837 bt_dev_err(hdev, "urb %p submission failed (%d)",
838 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200839 usb_unanchor_urb(urb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +0200840 }
841
842 usb_free_urb(urb);
843
844 return err;
845}
846
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200847static void btusb_isoc_complete(struct urb *urb)
848{
849 struct hci_dev *hdev = urb->context;
David Herrmann155961e2012-02-09 21:58:32 +0100850 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200851 int i, err;
852
Marcel Holtmann89e75332014-09-16 04:44:50 +0200853 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
854 urb->actual_length);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200855
856 if (!test_bit(HCI_RUNNING, &hdev->flags))
857 return;
858
859 if (urb->status == 0) {
860 for (i = 0; i < urb->number_of_packets; i++) {
861 unsigned int offset = urb->iso_frame_desc[i].offset;
862 unsigned int length = urb->iso_frame_desc[i].actual_length;
863
864 if (urb->iso_frame_desc[i].status)
865 continue;
866
867 hdev->stat.byte_rx += length;
868
Marcel Holtmann1ffa4ad2014-09-16 05:33:33 +0200869 if (btusb_recv_isoc(data, urb->transfer_buffer + offset,
870 length) < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100871 bt_dev_err(hdev, "corrupted SCO packet");
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200872 hdev->stat.err_rx++;
873 }
874 }
Champion Chen85560c42014-09-06 14:06:08 -0500875 } else if (urb->status == -ENOENT) {
876 /* Avoid suspend failed when usb_kill_urb */
877 return;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200878 }
879
880 if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags))
881 return;
882
883 usb_anchor_urb(urb, &data->isoc_anchor);
884
885 err = usb_submit_urb(urb, GFP_ATOMIC);
886 if (err < 0) {
Paul Bolle4935f1c2011-08-09 17:16:28 +0200887 /* -EPERM: urb is being killed;
Derek Robsond98422c2017-07-22 13:47:07 +1200888 * -ENODEV: device got disconnected
889 */
Paul Bolle4935f1c2011-08-09 17:16:28 +0200890 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100891 bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
892 urb, -err);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200893 usb_unanchor_urb(urb);
894 }
895}
896
Jesper Juhl42b16b32011-01-17 00:09:38 +0100897static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200898{
899 int i, offset = 0;
900
901 BT_DBG("len %d mtu %d", len, mtu);
902
903 for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu;
904 i++, offset += mtu, len -= mtu) {
905 urb->iso_frame_desc[i].offset = offset;
906 urb->iso_frame_desc[i].length = mtu;
907 }
908
909 if (len && i < BTUSB_MAX_ISOC_FRAMES) {
910 urb->iso_frame_desc[i].offset = offset;
911 urb->iso_frame_desc[i].length = len;
912 i++;
913 }
914
915 urb->number_of_packets = i;
916}
917
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100918static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200919{
David Herrmann155961e2012-02-09 21:58:32 +0100920 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200921 struct urb *urb;
922 unsigned char *buf;
923 unsigned int pipe;
924 int err, size;
925
926 BT_DBG("%s", hdev->name);
927
928 if (!data->isoc_rx_ep)
929 return -ENODEV;
930
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100931 urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, mem_flags);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200932 if (!urb)
933 return -ENOMEM;
934
935 size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *
936 BTUSB_MAX_ISOC_FRAMES;
937
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100938 buf = kmalloc(size, mem_flags);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200939 if (!buf) {
940 usb_free_urb(urb);
941 return -ENOMEM;
942 }
943
944 pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress);
945
Bing Zhaofa0fb932011-12-20 18:19:00 -0800946 usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete,
Marcel Holtmann89e75332014-09-16 04:44:50 +0200947 hdev, data->isoc_rx_ep->bInterval);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200948
Marcel Holtmann89e75332014-09-16 04:44:50 +0200949 urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200950
951 __fill_isoc_descriptor(urb, size,
Marcel Holtmann89e75332014-09-16 04:44:50 +0200952 le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize));
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200953
954 usb_anchor_urb(urb, &data->isoc_anchor);
955
Marcel Holtmann2eda66f2008-11-30 12:17:10 +0100956 err = usb_submit_urb(urb, mem_flags);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200957 if (err < 0) {
Paul Bolled4b8d1c2011-10-09 12:12:22 +0200958 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +0100959 bt_dev_err(hdev, "urb %p submission failed (%d)",
960 urb, -err);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200961 usb_unanchor_urb(urb);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +0200962 }
963
964 usb_free_urb(urb);
965
966 return err;
967}
968
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200969static void btusb_diag_complete(struct urb *urb)
970{
971 struct hci_dev *hdev = urb->context;
972 struct btusb_data *data = hci_get_drvdata(hdev);
973 int err;
974
975 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
976 urb->actual_length);
977
978 if (urb->status == 0) {
979 struct sk_buff *skb;
980
981 skb = bt_skb_alloc(urb->actual_length, GFP_ATOMIC);
982 if (skb) {
Johannes Berg59ae1d12017-06-16 14:29:20 +0200983 skb_put_data(skb, urb->transfer_buffer,
984 urb->actual_length);
Marcel Holtmann9d08f502015-10-08 20:23:08 +0200985 hci_recv_diag(hdev, skb);
986 }
987 } else if (urb->status == -ENOENT) {
988 /* Avoid suspend failed when usb_kill_urb */
989 return;
990 }
991
992 if (!test_bit(BTUSB_DIAG_RUNNING, &data->flags))
993 return;
994
995 usb_anchor_urb(urb, &data->diag_anchor);
996 usb_mark_last_busy(data->udev);
997
998 err = usb_submit_urb(urb, GFP_ATOMIC);
999 if (err < 0) {
1000 /* -EPERM: urb is being killed;
Derek Robsond98422c2017-07-22 13:47:07 +12001001 * -ENODEV: device got disconnected
1002 */
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001003 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001004 bt_dev_err(hdev, "urb %p failed to resubmit (%d)",
1005 urb, -err);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001006 usb_unanchor_urb(urb);
1007 }
1008}
1009
1010static int btusb_submit_diag_urb(struct hci_dev *hdev, gfp_t mem_flags)
1011{
1012 struct btusb_data *data = hci_get_drvdata(hdev);
1013 struct urb *urb;
1014 unsigned char *buf;
1015 unsigned int pipe;
1016 int err, size = HCI_MAX_FRAME_SIZE;
1017
1018 BT_DBG("%s", hdev->name);
1019
1020 if (!data->diag_rx_ep)
1021 return -ENODEV;
1022
1023 urb = usb_alloc_urb(0, mem_flags);
1024 if (!urb)
1025 return -ENOMEM;
1026
1027 buf = kmalloc(size, mem_flags);
1028 if (!buf) {
1029 usb_free_urb(urb);
1030 return -ENOMEM;
1031 }
1032
1033 pipe = usb_rcvbulkpipe(data->udev, data->diag_rx_ep->bEndpointAddress);
1034
1035 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
1036 btusb_diag_complete, hdev);
1037
1038 urb->transfer_flags |= URB_FREE_BUFFER;
1039
1040 usb_mark_last_busy(data->udev);
1041 usb_anchor_urb(urb, &data->diag_anchor);
1042
1043 err = usb_submit_urb(urb, mem_flags);
1044 if (err < 0) {
1045 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001046 bt_dev_err(hdev, "urb %p submission failed (%d)",
1047 urb, -err);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001048 usb_unanchor_urb(urb);
1049 }
1050
1051 usb_free_urb(urb);
1052
1053 return err;
1054}
1055
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001056static void btusb_tx_complete(struct urb *urb)
1057{
1058 struct sk_buff *skb = urb->context;
Marcel Holtmann89e75332014-09-16 04:44:50 +02001059 struct hci_dev *hdev = (struct hci_dev *)skb->dev;
David Herrmann155961e2012-02-09 21:58:32 +01001060 struct btusb_data *data = hci_get_drvdata(hdev);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001061
Marcel Holtmann89e75332014-09-16 04:44:50 +02001062 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
1063 urb->actual_length);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001064
1065 if (!test_bit(HCI_RUNNING, &hdev->flags))
1066 goto done;
1067
1068 if (!urb->status)
1069 hdev->stat.byte_tx += urb->transfer_buffer_length;
1070 else
1071 hdev->stat.err_tx++;
1072
1073done:
1074 spin_lock(&data->txlock);
1075 data->tx_in_flight--;
1076 spin_unlock(&data->txlock);
1077
1078 kfree(urb->setup_packet);
1079
1080 kfree_skb(skb);
1081}
1082
1083static void btusb_isoc_tx_complete(struct urb *urb)
1084{
1085 struct sk_buff *skb = urb->context;
Marcel Holtmann89e75332014-09-16 04:44:50 +02001086 struct hci_dev *hdev = (struct hci_dev *)skb->dev;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001087
Marcel Holtmann89e75332014-09-16 04:44:50 +02001088 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
1089 urb->actual_length);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001090
1091 if (!test_bit(HCI_RUNNING, &hdev->flags))
1092 goto done;
1093
1094 if (!urb->status)
1095 hdev->stat.byte_tx += urb->transfer_buffer_length;
1096 else
1097 hdev->stat.err_tx++;
1098
1099done:
1100 kfree(urb->setup_packet);
1101
1102 kfree_skb(skb);
1103}
1104
1105static int btusb_open(struct hci_dev *hdev)
1106{
David Herrmann155961e2012-02-09 21:58:32 +01001107 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001108 int err;
1109
1110 BT_DBG("%s", hdev->name);
1111
Ethan Hsiehc7e163f2016-10-07 12:06:42 +08001112 err = usb_autopm_get_interface(data->intf);
1113 if (err < 0)
1114 return err;
1115
Kim, Ben Young Taeace31982015-02-15 23:06:14 +00001116 /* Patching USB firmware files prior to starting any URBs of HCI path
1117 * It is more safe to use USB bulk channel for downloading USB patch
1118 */
1119 if (data->setup_on_usb) {
1120 err = data->setup_on_usb(hdev);
Marcel Holtmanneb500422015-04-16 23:15:50 +02001121 if (err < 0)
Kim, Ben Young Taeace31982015-02-15 23:06:14 +00001122 return err;
1123 }
1124
Oliver Neukum7bee5492009-08-24 23:44:59 +02001125 data->intf->needs_remote_wakeup = 1;
Sukumar Ghoraia0085f22017-08-16 14:46:55 -07001126 /* device specific wakeup source enabled and required for USB
1127 * remote wakeup while host is suspended
1128 */
1129 device_wakeup_enable(&data->udev->dev);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001130
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001131 if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
Oliver Neukum7bee5492009-08-24 23:44:59 +02001132 goto done;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001133
Marcel Holtmann2eda66f2008-11-30 12:17:10 +01001134 err = btusb_submit_intr_urb(hdev, GFP_KERNEL);
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001135 if (err < 0)
1136 goto failed;
1137
1138 err = btusb_submit_bulk_urb(hdev, GFP_KERNEL);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001139 if (err < 0) {
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001140 usb_kill_anchored_urbs(&data->intr_anchor);
1141 goto failed;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001142 }
1143
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001144 set_bit(BTUSB_BULK_RUNNING, &data->flags);
1145 btusb_submit_bulk_urb(hdev, GFP_KERNEL);
1146
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001147 if (data->diag) {
1148 if (!btusb_submit_diag_urb(hdev, GFP_KERNEL))
1149 set_bit(BTUSB_DIAG_RUNNING, &data->flags);
1150 }
1151
Oliver Neukum7bee5492009-08-24 23:44:59 +02001152done:
1153 usb_autopm_put_interface(data->intf);
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001154 return 0;
1155
1156failed:
1157 clear_bit(BTUSB_INTR_RUNNING, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001158 usb_autopm_put_interface(data->intf);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001159 return err;
1160}
1161
Oliver Neukum7bee5492009-08-24 23:44:59 +02001162static void btusb_stop_traffic(struct btusb_data *data)
1163{
1164 usb_kill_anchored_urbs(&data->intr_anchor);
1165 usb_kill_anchored_urbs(&data->bulk_anchor);
1166 usb_kill_anchored_urbs(&data->isoc_anchor);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001167 usb_kill_anchored_urbs(&data->diag_anchor);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001168}
1169
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001170static int btusb_close(struct hci_dev *hdev)
1171{
David Herrmann155961e2012-02-09 21:58:32 +01001172 struct btusb_data *data = hci_get_drvdata(hdev);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001173 int err;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001174
1175 BT_DBG("%s", hdev->name);
1176
Marcel Holtmanne8c3c3d2008-09-23 00:16:36 +02001177 cancel_work_sync(&data->work);
Linus Torvalds404291a2009-11-11 13:32:29 -08001178 cancel_work_sync(&data->waker);
Marcel Holtmanne8c3c3d2008-09-23 00:16:36 +02001179
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001180 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001181 clear_bit(BTUSB_BULK_RUNNING, &data->flags);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001182 clear_bit(BTUSB_INTR_RUNNING, &data->flags);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02001183 clear_bit(BTUSB_DIAG_RUNNING, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001184
1185 btusb_stop_traffic(data);
Marcel Holtmann803b5832014-09-16 08:00:29 +02001186 btusb_free_frags(data);
1187
Oliver Neukum7bee5492009-08-24 23:44:59 +02001188 err = usb_autopm_get_interface(data->intf);
1189 if (err < 0)
Oliver Neukum7b8e2c12009-11-13 14:26:23 +01001190 goto failed;
Oliver Neukum7bee5492009-08-24 23:44:59 +02001191
1192 data->intf->needs_remote_wakeup = 0;
Sukumar Ghoraia0085f22017-08-16 14:46:55 -07001193 device_wakeup_disable(&data->udev->dev);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001194 usb_autopm_put_interface(data->intf);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001195
Oliver Neukum7b8e2c12009-11-13 14:26:23 +01001196failed:
1197 usb_scuttle_anchored_urbs(&data->deferred);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001198 return 0;
1199}
1200
1201static int btusb_flush(struct hci_dev *hdev)
1202{
David Herrmann155961e2012-02-09 21:58:32 +01001203 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001204
1205 BT_DBG("%s", hdev->name);
1206
1207 usb_kill_anchored_urbs(&data->tx_anchor);
Marcel Holtmann803b5832014-09-16 08:00:29 +02001208 btusb_free_frags(data);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001209
1210 return 0;
1211}
1212
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001213static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb)
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001214{
David Herrmann155961e2012-02-09 21:58:32 +01001215 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001216 struct usb_ctrlrequest *dr;
1217 struct urb *urb;
1218 unsigned int pipe;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001219
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001220 urb = usb_alloc_urb(0, GFP_KERNEL);
1221 if (!urb)
1222 return ERR_PTR(-ENOMEM);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001223
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001224 dr = kmalloc(sizeof(*dr), GFP_KERNEL);
1225 if (!dr) {
1226 usb_free_urb(urb);
1227 return ERR_PTR(-ENOMEM);
1228 }
1229
1230 dr->bRequestType = data->cmdreq_type;
Marcel Holtmann893ba542015-01-28 20:27:34 -08001231 dr->bRequest = data->cmdreq;
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001232 dr->wIndex = 0;
1233 dr->wValue = 0;
1234 dr->wLength = __cpu_to_le16(skb->len);
1235
1236 pipe = usb_sndctrlpipe(data->udev, 0x00);
1237
Marcel Holtmann89e75332014-09-16 04:44:50 +02001238 usb_fill_control_urb(urb, data->udev, pipe, (void *)dr,
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001239 skb->data, skb->len, btusb_tx_complete, skb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001240
Marcel Holtmann89e75332014-09-16 04:44:50 +02001241 skb->dev = (void *)hdev;
Marcel Holtmann7bd8f092013-10-11 06:19:18 -07001242
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001243 return urb;
1244}
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001245
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001246static struct urb *alloc_bulk_urb(struct hci_dev *hdev, struct sk_buff *skb)
1247{
1248 struct btusb_data *data = hci_get_drvdata(hdev);
1249 struct urb *urb;
1250 unsigned int pipe;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001251
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001252 if (!data->bulk_tx_ep)
1253 return ERR_PTR(-ENODEV);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001254
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001255 urb = usb_alloc_urb(0, GFP_KERNEL);
1256 if (!urb)
1257 return ERR_PTR(-ENOMEM);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001258
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001259 pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001260
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001261 usb_fill_bulk_urb(urb, data->udev, pipe,
1262 skb->data, skb->len, btusb_tx_complete, skb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001263
Marcel Holtmann89e75332014-09-16 04:44:50 +02001264 skb->dev = (void *)hdev;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001265
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001266 return urb;
1267}
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001268
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001269static struct urb *alloc_isoc_urb(struct hci_dev *hdev, struct sk_buff *skb)
1270{
1271 struct btusb_data *data = hci_get_drvdata(hdev);
1272 struct urb *urb;
1273 unsigned int pipe;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001274
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001275 if (!data->isoc_tx_ep)
1276 return ERR_PTR(-ENODEV);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001277
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001278 urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL);
1279 if (!urb)
1280 return ERR_PTR(-ENOMEM);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001281
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001282 pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001283
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001284 usb_fill_int_urb(urb, data->udev, pipe,
1285 skb->data, skb->len, btusb_isoc_tx_complete,
1286 skb, data->isoc_tx_ep->bInterval);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001287
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001288 urb->transfer_flags = URB_ISO_ASAP;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001289
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001290 __fill_isoc_descriptor(urb, skb->len,
1291 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001292
Marcel Holtmann89e75332014-09-16 04:44:50 +02001293 skb->dev = (void *)hdev;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001294
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001295 return urb;
1296}
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001297
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001298static int submit_tx_urb(struct hci_dev *hdev, struct urb *urb)
1299{
1300 struct btusb_data *data = hci_get_drvdata(hdev);
1301 int err;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001302
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001303 usb_anchor_urb(urb, &data->tx_anchor);
1304
Johan Hedberge9753ef2014-09-14 08:49:34 +03001305 err = usb_submit_urb(urb, GFP_KERNEL);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001306 if (err < 0) {
Paul Bolle5a9b80e2011-10-09 12:12:16 +02001307 if (err != -EPERM && err != -ENODEV)
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001308 bt_dev_err(hdev, "urb %p submission failed (%d)",
1309 urb, -err);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001310 kfree(urb->setup_packet);
1311 usb_unanchor_urb(urb);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001312 } else {
1313 usb_mark_last_busy(data->udev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001314 }
1315
Cong Wang54a8a792011-11-22 09:32:57 +08001316 usb_free_urb(urb);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001317 return err;
1318}
1319
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001320static int submit_or_queue_tx_urb(struct hci_dev *hdev, struct urb *urb)
1321{
1322 struct btusb_data *data = hci_get_drvdata(hdev);
1323 unsigned long flags;
1324 bool suspending;
1325
1326 spin_lock_irqsave(&data->txlock, flags);
1327 suspending = test_bit(BTUSB_SUSPENDING, &data->flags);
1328 if (!suspending)
1329 data->tx_in_flight++;
1330 spin_unlock_irqrestore(&data->txlock, flags);
1331
1332 if (!suspending)
1333 return submit_tx_urb(hdev, urb);
1334
1335 usb_anchor_urb(urb, &data->deferred);
1336 schedule_work(&data->waker);
1337
1338 usb_free_urb(urb);
1339 return 0;
1340}
1341
1342static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
1343{
1344 struct urb *urb;
1345
1346 BT_DBG("%s", hdev->name);
1347
Marcel Holtmann618e8bc2015-11-05 07:33:56 +01001348 switch (hci_skb_pkt_type(skb)) {
Marcel Holtmann047b2ec2014-09-14 09:11:06 +02001349 case HCI_COMMAND_PKT:
1350 urb = alloc_ctrl_urb(hdev, skb);
1351 if (IS_ERR(urb))
1352 return PTR_ERR(urb);
1353
1354 hdev->stat.cmd_tx++;
1355 return submit_or_queue_tx_urb(hdev, urb);
1356
1357 case HCI_ACLDATA_PKT:
1358 urb = alloc_bulk_urb(hdev, skb);
1359 if (IS_ERR(urb))
1360 return PTR_ERR(urb);
1361
1362 hdev->stat.acl_tx++;
1363 return submit_or_queue_tx_urb(hdev, urb);
1364
1365 case HCI_SCODATA_PKT:
1366 if (hci_conn_num(hdev, SCO_LINK) < 1)
1367 return -ENODEV;
1368
1369 urb = alloc_isoc_urb(hdev, skb);
1370 if (IS_ERR(urb))
1371 return PTR_ERR(urb);
1372
1373 hdev->stat.sco_tx++;
1374 return submit_tx_urb(hdev, urb);
1375 }
1376
1377 return -EILSEQ;
1378}
1379
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001380static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
1381{
David Herrmann155961e2012-02-09 21:58:32 +01001382 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001383
1384 BT_DBG("%s evt %d", hdev->name, evt);
1385
Marcel Holtmann014f7bc2013-10-10 09:47:55 -07001386 if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) {
1387 data->sco_num = hci_conn_num(hdev, SCO_LINK);
Marcel Holtmann43c2e572009-02-04 17:41:38 +01001388 schedule_work(&data->work);
Marcel Holtmanna780efa2008-11-30 12:17:12 +01001389 }
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001390}
1391
Jesper Juhl42b16b32011-01-17 00:09:38 +01001392static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001393{
David Herrmann155961e2012-02-09 21:58:32 +01001394 struct btusb_data *data = hci_get_drvdata(hdev);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001395 struct usb_interface *intf = data->isoc;
1396 struct usb_endpoint_descriptor *ep_desc;
1397 int i, err;
1398
1399 if (!data->isoc)
1400 return -ENODEV;
1401
Marcel Holtmann459232f2017-10-24 19:42:45 +02001402 err = usb_set_interface(data->udev, data->isoc_ifnum, altsetting);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001403 if (err < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001404 bt_dev_err(hdev, "setting interface failed (%d)", -err);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001405 return err;
1406 }
1407
1408 data->isoc_altsetting = altsetting;
1409
1410 data->isoc_tx_ep = NULL;
1411 data->isoc_rx_ep = NULL;
1412
1413 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
1414 ep_desc = &intf->cur_altsetting->endpoint[i].desc;
1415
1416 if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) {
1417 data->isoc_tx_ep = ep_desc;
1418 continue;
1419 }
1420
1421 if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) {
1422 data->isoc_rx_ep = ep_desc;
1423 continue;
1424 }
1425 }
1426
1427 if (!data->isoc_tx_ep || !data->isoc_rx_ep) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001428 bt_dev_err(hdev, "invalid SCO descriptors");
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001429 return -ENODEV;
1430 }
1431
1432 return 0;
1433}
1434
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001435static void btusb_work(struct work_struct *work)
1436{
1437 struct btusb_data *data = container_of(work, struct btusb_data, work);
1438 struct hci_dev *hdev = data->hdev;
Mikel Astizf4001d22012-04-11 08:48:51 +02001439 int new_alts;
Oliver Neukum7bee5492009-08-24 23:44:59 +02001440 int err;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001441
Marcel Holtmann014f7bc2013-10-10 09:47:55 -07001442 if (data->sco_num > 0) {
Gustavo F. Padovan08b8b6c2010-07-16 17:20:33 -03001443 if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) {
Oliver Neukum8efdd0c2011-02-11 13:00:06 +01001444 err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001445 if (err < 0) {
1446 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
1447 usb_kill_anchored_urbs(&data->isoc_anchor);
1448 return;
1449 }
1450
Gustavo F. Padovan08b8b6c2010-07-16 17:20:33 -03001451 set_bit(BTUSB_DID_ISO_RESUME, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02001452 }
Mikel Astizf4001d22012-04-11 08:48:51 +02001453
1454 if (hdev->voice_setting & 0x0020) {
1455 static const int alts[3] = { 2, 4, 5 };
Marcel Holtmann89e75332014-09-16 04:44:50 +02001456
Marcel Holtmann014f7bc2013-10-10 09:47:55 -07001457 new_alts = alts[data->sco_num - 1];
Mikel Astizf4001d22012-04-11 08:48:51 +02001458 } else {
Marcel Holtmann014f7bc2013-10-10 09:47:55 -07001459 new_alts = data->sco_num;
Mikel Astizf4001d22012-04-11 08:48:51 +02001460 }
1461
1462 if (data->isoc_altsetting != new_alts) {
Kuba Pawlakf6fc86f2015-10-28 15:18:05 +01001463 unsigned long flags;
1464
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001465 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
1466 usb_kill_anchored_urbs(&data->isoc_anchor);
1467
Kuba Pawlak8f9d02f2015-09-10 17:07:00 +01001468 /* When isochronous alternate setting needs to be
1469 * changed, because SCO connection has been added
1470 * or removed, a packet fragment may be left in the
1471 * reassembling state. This could lead to wrongly
1472 * assembled fragments.
1473 *
1474 * Clear outstanding fragment when selecting a new
1475 * alternate setting.
1476 */
Kuba Pawlakf6fc86f2015-10-28 15:18:05 +01001477 spin_lock_irqsave(&data->rxlock, flags);
Kuba Pawlak8f9d02f2015-09-10 17:07:00 +01001478 kfree_skb(data->sco_skb);
1479 data->sco_skb = NULL;
Kuba Pawlakf6fc86f2015-10-28 15:18:05 +01001480 spin_unlock_irqrestore(&data->rxlock, flags);
Kuba Pawlak8f9d02f2015-09-10 17:07:00 +01001481
Mikel Astizf4001d22012-04-11 08:48:51 +02001482 if (__set_isoc_interface(hdev, new_alts) < 0)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001483 return;
1484 }
1485
1486 if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
Marcel Holtmann2eda66f2008-11-30 12:17:10 +01001487 if (btusb_submit_isoc_urb(hdev, GFP_KERNEL) < 0)
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001488 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
1489 else
Marcel Holtmann2eda66f2008-11-30 12:17:10 +01001490 btusb_submit_isoc_urb(hdev, GFP_KERNEL);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02001491 }
1492 } else {
1493 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
1494 usb_kill_anchored_urbs(&data->isoc_anchor);
1495
1496 __set_isoc_interface(hdev, 0);
Gustavo F. Padovan08b8b6c2010-07-16 17:20:33 -03001497 if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags))
Oliver Neukum8efdd0c2011-02-11 13:00:06 +01001498 usb_autopm_put_interface(data->isoc ? data->isoc : data->intf);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02001499 }
1500}
1501
Oliver Neukum7bee5492009-08-24 23:44:59 +02001502static void btusb_waker(struct work_struct *work)
1503{
1504 struct btusb_data *data = container_of(work, struct btusb_data, waker);
1505 int err;
1506
1507 err = usb_autopm_get_interface(data->intf);
1508 if (err < 0)
1509 return;
1510
1511 usb_autopm_put_interface(data->intf);
1512}
1513
Marcel Holtmann9f8f9622013-04-10 08:11:35 -07001514static int btusb_setup_bcm92035(struct hci_dev *hdev)
1515{
1516 struct sk_buff *skb;
1517 u8 val = 0x00;
1518
1519 BT_DBG("%s", hdev->name);
1520
1521 skb = __hci_cmd_sync(hdev, 0xfc3b, 1, &val, HCI_INIT_TIMEOUT);
1522 if (IS_ERR(skb))
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001523 bt_dev_err(hdev, "BCM92035 command failed (%ld)", PTR_ERR(skb));
Marcel Holtmann9f8f9622013-04-10 08:11:35 -07001524 else
1525 kfree_skb(skb);
1526
1527 return 0;
1528}
1529
Marcel Holtmann81cac642014-01-03 03:02:36 -08001530static int btusb_setup_csr(struct hci_dev *hdev)
1531{
1532 struct hci_rp_read_local_version *rp;
1533 struct sk_buff *skb;
Marcel Holtmann81cac642014-01-03 03:02:36 -08001534
1535 BT_DBG("%s", hdev->name);
1536
Marcel Holtmann7cd84d72015-06-07 10:01:02 +02001537 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
1538 HCI_INIT_TIMEOUT);
1539 if (IS_ERR(skb)) {
1540 int err = PTR_ERR(skb);
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001541 bt_dev_err(hdev, "CSR: Local version failed (%d)", err);
Marcel Holtmann7cd84d72015-06-07 10:01:02 +02001542 return err;
1543 }
1544
1545 if (skb->len != sizeof(struct hci_rp_read_local_version)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001546 bt_dev_err(hdev, "CSR: Local version length mismatch");
Marcel Holtmann7cd84d72015-06-07 10:01:02 +02001547 kfree_skb(skb);
1548 return -EIO;
1549 }
Marcel Holtmann81cac642014-01-03 03:02:36 -08001550
Marcel Holtmann89e75332014-09-16 04:44:50 +02001551 rp = (struct hci_rp_read_local_version *)skb->data;
Marcel Holtmann81cac642014-01-03 03:02:36 -08001552
Johan Hedberg6cafcd92015-08-30 21:47:21 +03001553 /* Detect controllers which aren't real CSR ones. */
1554 if (le16_to_cpu(rp->manufacturer) != 10 ||
1555 le16_to_cpu(rp->lmp_subver) == 0x0c5c) {
Marcel Holtmann9641d342015-06-07 10:01:01 +02001556 /* Clear the reset quirk since this is not an actual
1557 * early Bluetooth 1.1 device from CSR.
1558 */
1559 clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
Marcel Holtmann81cac642014-01-03 03:02:36 -08001560
Marcel Holtmann9641d342015-06-07 10:01:01 +02001561 /* These fake CSR controllers have all a broken
1562 * stored link key handling and so just disable it.
1563 */
1564 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
Marcel Holtmann81cac642014-01-03 03:02:36 -08001565 }
1566
Marcel Holtmann81cac642014-01-03 03:02:36 -08001567 kfree_skb(skb);
1568
Marcel Holtmann9641d342015-06-07 10:01:01 +02001569 return 0;
Marcel Holtmann81cac642014-01-03 03:02:36 -08001570}
1571
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001572static const struct firmware *btusb_setup_intel_get_fw(struct hci_dev *hdev,
Marcel Holtmann89e75332014-09-16 04:44:50 +02001573 struct intel_version *ver)
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001574{
1575 const struct firmware *fw;
1576 char fwname[64];
1577 int ret;
1578
1579 snprintf(fwname, sizeof(fwname),
1580 "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq",
1581 ver->hw_platform, ver->hw_variant, ver->hw_revision,
1582 ver->fw_variant, ver->fw_revision, ver->fw_build_num,
1583 ver->fw_build_ww, ver->fw_build_yy);
1584
1585 ret = request_firmware(&fw, fwname, &hdev->dev);
1586 if (ret < 0) {
1587 if (ret == -EINVAL) {
1588 BT_ERR("%s Intel firmware file request failed (%d)",
1589 hdev->name, ret);
1590 return NULL;
1591 }
1592
1593 BT_ERR("%s failed to open Intel firmware file: %s(%d)",
1594 hdev->name, fwname, ret);
1595
1596 /* If the correct firmware patch file is not found, use the
1597 * default firmware patch file instead
1598 */
1599 snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq",
1600 ver->hw_platform, ver->hw_variant);
1601 if (request_firmware(&fw, fwname, &hdev->dev) < 0) {
1602 BT_ERR("%s failed to open default Intel fw file: %s",
1603 hdev->name, fwname);
1604 return NULL;
1605 }
1606 }
1607
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001608 bt_dev_info(hdev, "Intel Bluetooth firmware file: %s", fwname);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001609
1610 return fw;
1611}
1612
1613static int btusb_setup_intel_patching(struct hci_dev *hdev,
1614 const struct firmware *fw,
1615 const u8 **fw_ptr, int *disable_patch)
1616{
1617 struct sk_buff *skb;
1618 struct hci_command_hdr *cmd;
1619 const u8 *cmd_param;
1620 struct hci_event_hdr *evt = NULL;
1621 const u8 *evt_param = NULL;
1622 int remain = fw->size - (*fw_ptr - fw->data);
1623
1624 /* The first byte indicates the types of the patch command or event.
1625 * 0x01 means HCI command and 0x02 is HCI event. If the first bytes
1626 * in the current firmware buffer doesn't start with 0x01 or
1627 * the size of remain buffer is smaller than HCI command header,
1628 * the firmware file is corrupted and it should stop the patching
1629 * process.
1630 */
1631 if (remain > HCI_COMMAND_HDR_SIZE && *fw_ptr[0] != 0x01) {
1632 BT_ERR("%s Intel fw corrupted: invalid cmd read", hdev->name);
1633 return -EINVAL;
1634 }
1635 (*fw_ptr)++;
1636 remain--;
1637
1638 cmd = (struct hci_command_hdr *)(*fw_ptr);
1639 *fw_ptr += sizeof(*cmd);
1640 remain -= sizeof(*cmd);
1641
1642 /* Ensure that the remain firmware data is long enough than the length
1643 * of command parameter. If not, the firmware file is corrupted.
1644 */
1645 if (remain < cmd->plen) {
1646 BT_ERR("%s Intel fw corrupted: invalid cmd len", hdev->name);
1647 return -EFAULT;
1648 }
1649
1650 /* If there is a command that loads a patch in the firmware
1651 * file, then enable the patch upon success, otherwise just
1652 * disable the manufacturer mode, for example patch activation
1653 * is not required when the default firmware patch file is used
1654 * because there are no patch data to load.
1655 */
1656 if (*disable_patch && le16_to_cpu(cmd->opcode) == 0xfc8e)
1657 *disable_patch = 0;
1658
1659 cmd_param = *fw_ptr;
1660 *fw_ptr += cmd->plen;
1661 remain -= cmd->plen;
1662
1663 /* This reads the expected events when the above command is sent to the
1664 * device. Some vendor commands expects more than one events, for
1665 * example command status event followed by vendor specific event.
1666 * For this case, it only keeps the last expected event. so the command
1667 * can be sent with __hci_cmd_sync_ev() which returns the sk_buff of
1668 * last expected event.
1669 */
1670 while (remain > HCI_EVENT_HDR_SIZE && *fw_ptr[0] == 0x02) {
1671 (*fw_ptr)++;
1672 remain--;
1673
1674 evt = (struct hci_event_hdr *)(*fw_ptr);
1675 *fw_ptr += sizeof(*evt);
1676 remain -= sizeof(*evt);
1677
1678 if (remain < evt->plen) {
1679 BT_ERR("%s Intel fw corrupted: invalid evt len",
1680 hdev->name);
1681 return -EFAULT;
1682 }
1683
1684 evt_param = *fw_ptr;
1685 *fw_ptr += evt->plen;
1686 remain -= evt->plen;
1687 }
1688
1689 /* Every HCI commands in the firmware file has its correspond event.
1690 * If event is not found or remain is smaller than zero, the firmware
1691 * file is corrupted.
1692 */
1693 if (!evt || !evt_param || remain < 0) {
1694 BT_ERR("%s Intel fw corrupted: invalid evt read", hdev->name);
1695 return -EFAULT;
1696 }
1697
1698 skb = __hci_cmd_sync_ev(hdev, le16_to_cpu(cmd->opcode), cmd->plen,
1699 cmd_param, evt->evt, HCI_INIT_TIMEOUT);
1700 if (IS_ERR(skb)) {
1701 BT_ERR("%s sending Intel patch command (0x%4.4x) failed (%ld)",
1702 hdev->name, cmd->opcode, PTR_ERR(skb));
Adam Leed9c78e92013-07-10 10:02:12 +08001703 return PTR_ERR(skb);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001704 }
1705
1706 /* It ensures that the returned event matches the event data read from
1707 * the firmware file. At fist, it checks the length and then
1708 * the contents of the event.
1709 */
1710 if (skb->len != evt->plen) {
1711 BT_ERR("%s mismatch event length (opcode 0x%4.4x)", hdev->name,
1712 le16_to_cpu(cmd->opcode));
1713 kfree_skb(skb);
1714 return -EFAULT;
1715 }
1716
1717 if (memcmp(skb->data, evt_param, evt->plen)) {
1718 BT_ERR("%s mismatch event parameter (opcode 0x%4.4x)",
1719 hdev->name, le16_to_cpu(cmd->opcode));
1720 kfree_skb(skb);
1721 return -EFAULT;
1722 }
1723 kfree_skb(skb);
1724
1725 return 0;
1726}
1727
1728static int btusb_setup_intel(struct hci_dev *hdev)
1729{
1730 struct sk_buff *skb;
1731 const struct firmware *fw;
1732 const u8 *fw_ptr;
Loic Poulain28dc4b92015-12-03 16:10:22 +01001733 int disable_patch, err;
Loic Poulain6c483de2015-12-06 16:18:34 +01001734 struct intel_version ver;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001735
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001736 BT_DBG("%s", hdev->name);
1737
1738 /* The controller has a bug with the first HCI command sent to it
1739 * returning number of completed commands as zero. This would stall the
1740 * command processing in the Bluetooth core.
1741 *
1742 * As a workaround, send HCI Reset command first which will reset the
1743 * number of completed commands and allow normal command processing
1744 * from now on.
1745 */
1746 skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
1747 if (IS_ERR(skb)) {
1748 BT_ERR("%s sending initial HCI reset command failed (%ld)",
1749 hdev->name, PTR_ERR(skb));
Adam Leed9c78e92013-07-10 10:02:12 +08001750 return PTR_ERR(skb);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001751 }
1752 kfree_skb(skb);
1753
1754 /* Read Intel specific controller version first to allow selection of
1755 * which firmware file to load.
1756 *
1757 * The returned information are hardware variant and revision plus
1758 * firmware variant, revision and build number.
1759 */
Loic Poulain6c483de2015-12-06 16:18:34 +01001760 err = btintel_read_version(hdev, &ver);
1761 if (err)
1762 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001763
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001764 bt_dev_info(hdev, "read Intel version: %02x%02x%02x%02x%02x%02x%02x%02x%02x",
1765 ver.hw_platform, ver.hw_variant, ver.hw_revision,
1766 ver.fw_variant, ver.fw_revision, ver.fw_build_num,
1767 ver.fw_build_ww, ver.fw_build_yy, ver.fw_patch_num);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001768
1769 /* fw_patch_num indicates the version of patch the device currently
1770 * have. If there is no patch data in the device, it is always 0x00.
Minjune Kim5075eda2015-08-27 13:21:52 +09001771 * So, if it is other than 0x00, no need to patch the device again.
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001772 */
Loic Poulain6c483de2015-12-06 16:18:34 +01001773 if (ver.fw_patch_num) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001774 bt_dev_info(hdev, "Intel device is already patched. "
1775 "patch num: %02x", ver.fw_patch_num);
Marcel Holtmann213445b2015-10-21 02:45:19 +02001776 goto complete;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001777 }
1778
1779 /* Opens the firmware patch file based on the firmware version read
1780 * from the controller. If it fails to open the matching firmware
1781 * patch file, it tries to open the default firmware patch file.
1782 * If no patch file is found, allow the device to operate without
1783 * a patch.
1784 */
Loic Poulain6c483de2015-12-06 16:18:34 +01001785 fw = btusb_setup_intel_get_fw(hdev, &ver);
1786 if (!fw)
Marcel Holtmann213445b2015-10-21 02:45:19 +02001787 goto complete;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001788 fw_ptr = fw->data;
1789
Loic Poulain28dc4b92015-12-03 16:10:22 +01001790 /* Enable the manufacturer mode of the controller.
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001791 * Only while this mode is enabled, the driver can download the
1792 * firmware patch data and configuration parameters.
1793 */
Loic Poulain28dc4b92015-12-03 16:10:22 +01001794 err = btintel_enter_mfg(hdev);
1795 if (err) {
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001796 release_firmware(fw);
Loic Poulain28dc4b92015-12-03 16:10:22 +01001797 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001798 }
1799
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001800 disable_patch = 1;
1801
1802 /* The firmware data file consists of list of Intel specific HCI
1803 * commands and its expected events. The first byte indicates the
1804 * type of the message, either HCI command or HCI event.
1805 *
1806 * It reads the command and its expected event from the firmware file,
1807 * and send to the controller. Once __hci_cmd_sync_ev() returns,
1808 * the returned event is compared with the event read from the firmware
1809 * file and it will continue until all the messages are downloaded to
1810 * the controller.
1811 *
1812 * Once the firmware patching is completed successfully,
1813 * the manufacturer mode is disabled with reset and activating the
1814 * downloaded patch.
1815 *
1816 * If the firmware patching fails, the manufacturer mode is
1817 * disabled with reset and deactivating the patch.
1818 *
1819 * If the default patch file is used, no reset is done when disabling
1820 * the manufacturer.
1821 */
1822 while (fw->size > fw_ptr - fw->data) {
1823 int ret;
1824
1825 ret = btusb_setup_intel_patching(hdev, fw, &fw_ptr,
1826 &disable_patch);
1827 if (ret < 0)
1828 goto exit_mfg_deactivate;
1829 }
1830
1831 release_firmware(fw);
1832
1833 if (disable_patch)
1834 goto exit_mfg_disable;
1835
1836 /* Patching completed successfully and disable the manufacturer mode
1837 * with reset and activate the downloaded firmware patches.
1838 */
Loic Poulain28dc4b92015-12-03 16:10:22 +01001839 err = btintel_exit_mfg(hdev, true, true);
1840 if (err)
1841 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001842
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001843 bt_dev_info(hdev, "Intel firmware patch completed and activated");
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001844
Marcel Holtmann213445b2015-10-21 02:45:19 +02001845 goto complete;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001846
1847exit_mfg_disable:
1848 /* Disable the manufacturer mode without reset */
Loic Poulain28dc4b92015-12-03 16:10:22 +01001849 err = btintel_exit_mfg(hdev, false, false);
1850 if (err)
1851 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001852
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001853 bt_dev_info(hdev, "Intel firmware patch completed");
Marcel Holtmann40cb0982014-07-02 12:06:45 +02001854
Marcel Holtmann213445b2015-10-21 02:45:19 +02001855 goto complete;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001856
1857exit_mfg_deactivate:
1858 release_firmware(fw);
1859
1860 /* Patching failed. Disable the manufacturer mode with reset and
1861 * deactivate the downloaded firmware patches.
1862 */
Loic Poulain28dc4b92015-12-03 16:10:22 +01001863 err = btintel_exit_mfg(hdev, true, false);
1864 if (err)
1865 return err;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001866
Marcel Holtmann2064ee32017-10-30 10:42:59 +01001867 bt_dev_info(hdev, "Intel firmware patch completed and deactivated");
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001868
Marcel Holtmann213445b2015-10-21 02:45:19 +02001869complete:
1870 /* Set the event mask for Intel specific vendor events. This enables
1871 * a few extra events that are useful during general operation.
1872 */
1873 btintel_set_event_mask_mfg(hdev, false);
1874
Marcel Holtmann4185a0f2015-04-06 00:52:12 -07001875 btintel_check_bdaddr(hdev);
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07001876 return 0;
1877}
1878
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001879static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode)
1880{
1881 struct sk_buff *skb;
1882 struct hci_event_hdr *hdr;
1883 struct hci_ev_cmd_complete *evt;
1884
1885 skb = bt_skb_alloc(sizeof(*hdr) + sizeof(*evt) + 1, GFP_ATOMIC);
1886 if (!skb)
1887 return -ENOMEM;
1888
Johannes Berg4df864c2017-06-16 14:29:21 +02001889 hdr = skb_put(skb, sizeof(*hdr));
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001890 hdr->evt = HCI_EV_CMD_COMPLETE;
1891 hdr->plen = sizeof(*evt) + 1;
1892
Johannes Berg4df864c2017-06-16 14:29:21 +02001893 evt = skb_put(skb, sizeof(*evt));
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001894 evt->ncmd = 0x01;
1895 evt->opcode = cpu_to_le16(opcode);
1896
Johannes Berg634fef62017-06-16 14:29:24 +02001897 skb_put_u8(skb, 0x00);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001898
Marcel Holtmann618e8bc2015-11-05 07:33:56 +01001899 hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001900
1901 return hci_recv_frame(hdev, skb);
1902}
1903
1904static int btusb_recv_bulk_intel(struct btusb_data *data, void *buffer,
1905 int count)
1906{
1907 /* When the device is in bootloader mode, then it can send
1908 * events via the bulk endpoint. These events are treated the
1909 * same way as the ones received from the interrupt endpoint.
1910 */
1911 if (test_bit(BTUSB_BOOTLOADER, &data->flags))
1912 return btusb_recv_intr(data, buffer, count);
1913
1914 return btusb_recv_bulk(data, buffer, count);
1915}
1916
Marcel Holtmannccd6da22015-04-09 00:35:19 -07001917static void btusb_intel_bootup(struct btusb_data *data, const void *ptr,
1918 unsigned int len)
1919{
1920 const struct intel_bootup *evt = ptr;
1921
1922 if (len != sizeof(*evt))
1923 return;
1924
1925 if (test_and_clear_bit(BTUSB_BOOTING, &data->flags)) {
1926 smp_mb__after_atomic();
1927 wake_up_bit(&data->flags, BTUSB_BOOTING);
1928 }
1929}
1930
1931static void btusb_intel_secure_send_result(struct btusb_data *data,
1932 const void *ptr, unsigned int len)
1933{
1934 const struct intel_secure_send_result *evt = ptr;
1935
1936 if (len != sizeof(*evt))
1937 return;
1938
1939 if (evt->result)
1940 set_bit(BTUSB_FIRMWARE_FAILED, &data->flags);
1941
1942 if (test_and_clear_bit(BTUSB_DOWNLOADING, &data->flags) &&
1943 test_bit(BTUSB_FIRMWARE_LOADED, &data->flags)) {
1944 smp_mb__after_atomic();
1945 wake_up_bit(&data->flags, BTUSB_DOWNLOADING);
1946 }
1947}
1948
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001949static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb)
1950{
1951 struct btusb_data *data = hci_get_drvdata(hdev);
1952
1953 if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
1954 struct hci_event_hdr *hdr = (void *)skb->data;
1955
Marcel Holtmannccd6da22015-04-09 00:35:19 -07001956 if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
1957 hdr->plen > 0) {
1958 const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
1959 unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001960
Marcel Holtmannccd6da22015-04-09 00:35:19 -07001961 switch (skb->data[2]) {
1962 case 0x02:
1963 /* When switching to the operational firmware
1964 * the device sends a vendor specific event
1965 * indicating that the bootup completed.
1966 */
1967 btusb_intel_bootup(data, ptr, len);
1968 break;
1969 case 0x06:
1970 /* When the firmware loading completes the
1971 * device sends out a vendor specific event
1972 * indicating the result of the firmware
1973 * loading.
1974 */
1975 btusb_intel_secure_send_result(data, ptr, len);
1976 break;
Johan Hedbergfad70972015-01-30 10:58:55 +02001977 }
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001978 }
1979 }
1980
1981 return hci_recv_frame(hdev, skb);
1982}
1983
1984static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
1985{
1986 struct btusb_data *data = hci_get_drvdata(hdev);
1987 struct urb *urb;
1988
1989 BT_DBG("%s", hdev->name);
1990
Marcel Holtmann618e8bc2015-11-05 07:33:56 +01001991 switch (hci_skb_pkt_type(skb)) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08001992 case HCI_COMMAND_PKT:
1993 if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
1994 struct hci_command_hdr *cmd = (void *)skb->data;
1995 __u16 opcode = le16_to_cpu(cmd->opcode);
1996
1997 /* When in bootloader mode and the command 0xfc09
1998 * is received, it needs to be send down the
1999 * bulk endpoint. So allocate a bulk URB instead.
2000 */
2001 if (opcode == 0xfc09)
2002 urb = alloc_bulk_urb(hdev, skb);
2003 else
2004 urb = alloc_ctrl_urb(hdev, skb);
2005
2006 /* When the 0xfc01 command is issued to boot into
2007 * the operational firmware, it will actually not
2008 * send a command complete event. To keep the flow
2009 * control working inject that event here.
2010 */
2011 if (opcode == 0xfc01)
2012 inject_cmd_complete(hdev, opcode);
2013 } else {
2014 urb = alloc_ctrl_urb(hdev, skb);
2015 }
2016 if (IS_ERR(urb))
2017 return PTR_ERR(urb);
2018
2019 hdev->stat.cmd_tx++;
2020 return submit_or_queue_tx_urb(hdev, urb);
2021
2022 case HCI_ACLDATA_PKT:
2023 urb = alloc_bulk_urb(hdev, skb);
2024 if (IS_ERR(urb))
2025 return PTR_ERR(urb);
2026
2027 hdev->stat.acl_tx++;
2028 return submit_or_queue_tx_urb(hdev, urb);
2029
2030 case HCI_SCODATA_PKT:
2031 if (hci_conn_num(hdev, SCO_LINK) < 1)
2032 return -ENODEV;
2033
2034 urb = alloc_isoc_urb(hdev, skb);
2035 if (IS_ERR(urb))
2036 return PTR_ERR(urb);
2037
2038 hdev->stat.sco_tx++;
2039 return submit_tx_urb(hdev, urb);
2040 }
2041
2042 return -EILSEQ;
2043}
2044
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002045static int btusb_setup_intel_new(struct hci_dev *hdev)
2046{
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002047 struct btusb_data *data = hci_get_drvdata(hdev);
Loic Poulain6c483de2015-12-06 16:18:34 +01002048 struct intel_version ver;
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002049 struct intel_boot_params params;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002050 const struct firmware *fw;
Tedd Ho-Jeong Ane5889af2018-01-24 09:19:18 -08002051 u32 boot_param;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002052 char fwname[64];
2053 ktime_t calltime, delta, rettime;
2054 unsigned long long duration;
2055 int err;
2056
2057 BT_DBG("%s", hdev->name);
2058
Tedd Ho-Jeong An04d729b2018-01-24 09:19:19 -08002059 /* Set the default boot parameter to 0x0 and it is updated to
2060 * SKU specific boot parameter after reading Intel_Write_Boot_Params
2061 * command while downloading the firmware.
2062 */
2063 boot_param = 0x00000000;
Tedd Ho-Jeong Ane5889af2018-01-24 09:19:18 -08002064
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002065 calltime = ktime_get();
2066
2067 /* Read the Intel version information to determine if the device
2068 * is in bootloader mode or if it already has operational firmware
2069 * loaded.
2070 */
Loic Poulain6c483de2015-12-06 16:18:34 +01002071 err = btintel_read_version(hdev, &ver);
2072 if (err)
2073 return err;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002074
2075 /* The hardware platform number has a fixed value of 0x37 and
2076 * for now only accept this single value.
2077 */
Loic Poulain6c483de2015-12-06 16:18:34 +01002078 if (ver.hw_platform != 0x37) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002079 BT_ERR("%s: Unsupported Intel hardware platform (%u)",
Loic Poulain6c483de2015-12-06 16:18:34 +01002080 hdev->name, ver.hw_platform);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002081 return -EINVAL;
2082 }
2083
Tedd Ho-Jeong An92688342017-03-06 15:38:26 -08002084 /* Check for supported iBT hardware variants of this firmware
2085 * loading method.
Tedd Ho-Jeong Ana0af53b2016-05-06 11:53:46 -07002086 *
2087 * This check has been put in place to ensure correct forward
2088 * compatibility options when newer hardware variants come along.
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002089 */
Tedd Ho-Jeong An92688342017-03-06 15:38:26 -08002090 switch (ver.hw_variant) {
2091 case 0x0b: /* SfP */
2092 case 0x0c: /* WsP */
Tedd Ho-Jeong An86a61292017-05-01 13:35:12 -07002093 case 0x11: /* JfP */
Marcel Holtmannde766142017-03-06 15:38:28 -08002094 case 0x12: /* ThP */
Tedd Ho-Jeong An1ce0cec2018-02-05 14:20:36 -08002095 case 0x13: /* HrP */
2096 case 0x14: /* QnJ, IcP */
Tedd Ho-Jeong An92688342017-03-06 15:38:26 -08002097 break;
2098 default:
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002099 BT_ERR("%s: Unsupported Intel hardware variant (%u)",
Loic Poulain6c483de2015-12-06 16:18:34 +01002100 hdev->name, ver.hw_variant);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002101 return -EINVAL;
2102 }
2103
Loic Poulain6c483de2015-12-06 16:18:34 +01002104 btintel_version_info(hdev, &ver);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002105
2106 /* The firmware variant determines if the device is in bootloader
2107 * mode or is running operational firmware. The value 0x06 identifies
2108 * the bootloader and the value 0x23 identifies the operational
2109 * firmware.
2110 *
2111 * When the operational firmware is already present, then only
2112 * the check for valid Bluetooth device address is needed. This
2113 * determines if the device will be added as configured or
2114 * unconfigured controller.
2115 *
2116 * It is not possible to use the Secure Boot Parameters in this
2117 * case since that command is only available in bootloader mode.
2118 */
Loic Poulain6c483de2015-12-06 16:18:34 +01002119 if (ver.fw_variant == 0x23) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002120 clear_bit(BTUSB_BOOTLOADER, &data->flags);
Marcel Holtmann4185a0f2015-04-06 00:52:12 -07002121 btintel_check_bdaddr(hdev);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002122 return 0;
2123 }
2124
2125 /* If the device is not in bootloader mode, then the only possible
2126 * choice is to return an error and abort the device initialization.
2127 */
Loic Poulain6c483de2015-12-06 16:18:34 +01002128 if (ver.fw_variant != 0x06) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002129 BT_ERR("%s: Unsupported Intel firmware variant (%u)",
Loic Poulain6c483de2015-12-06 16:18:34 +01002130 hdev->name, ver.fw_variant);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002131 return -ENODEV;
2132 }
2133
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002134 /* Read the secure boot parameters to identify the operating
2135 * details of the bootloader.
2136 */
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002137 err = btintel_read_boot_params(hdev, &params);
2138 if (err)
2139 return err;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002140
2141 /* It is required that every single firmware fragment is acknowledged
2142 * with a command complete event. If the boot parameters indicate
2143 * that this bootloader does not send them, then abort the setup.
2144 */
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002145 if (params.limited_cce != 0x00) {
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002146 BT_ERR("%s: Unsupported Intel firmware loading method (%u)",
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002147 hdev->name, params.limited_cce);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002148 return -EINVAL;
2149 }
2150
2151 /* If the OTP has no valid Bluetooth device address, then there will
2152 * also be no valid address for the operational firmware.
2153 */
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002154 if (!bacmp(&params.otp_bdaddr, BDADDR_ANY)) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002155 bt_dev_info(hdev, "No device address configured");
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002156 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
2157 }
2158
2159 /* With this Intel bootloader only the hardware variant and device
Jaya P Gaf3715e2017-10-30 11:01:22 +01002160 * revision information are used to select the right firmware for SfP
2161 * and WsP.
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002162 *
Tedd Ho-Jeong An230b04a2016-06-28 08:56:39 -07002163 * The firmware filename is ibt-<hw_variant>-<dev_revid>.sfi.
2164 *
2165 * Currently the supported hardware variants are:
2166 * 11 (0x0b) for iBT3.0 (LnP/SfP)
2167 * 12 (0x0c) for iBT3.5 (WsP)
Jaya P Gaf3715e2017-10-30 11:01:22 +01002168 *
2169 * For ThP/JfP and for future SKU's, the FW name varies based on HW
2170 * variant, HW revision and FW revision, as these are dependent on CNVi
2171 * and RF Combination.
2172 *
Tedd Ho-Jeong An86a61292017-05-01 13:35:12 -07002173 * 17 (0x11) for iBT3.5 (JfP)
2174 * 18 (0x12) for iBT3.5 (ThP)
Jaya P Gaf3715e2017-10-30 11:01:22 +01002175 *
2176 * The firmware file name for these will be
2177 * ibt-<hw_variant>-<hw_revision>-<fw_revision>.sfi.
2178 *
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002179 */
Jaya P Gaf3715e2017-10-30 11:01:22 +01002180 switch (ver.hw_variant) {
2181 case 0x0b: /* SfP */
2182 case 0x0c: /* WsP */
2183 snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi",
2184 le16_to_cpu(ver.hw_variant),
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002185 le16_to_cpu(params.dev_revid));
Jaya P Gaf3715e2017-10-30 11:01:22 +01002186 break;
2187 case 0x11: /* JfP */
2188 case 0x12: /* ThP */
Tedd Ho-Jeong An1ce0cec2018-02-05 14:20:36 -08002189 case 0x13: /* HrP */
2190 case 0x14: /* QnJ, IcP */
Jaya P Gaf3715e2017-10-30 11:01:22 +01002191 snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.sfi",
2192 le16_to_cpu(ver.hw_variant),
2193 le16_to_cpu(ver.hw_revision),
2194 le16_to_cpu(ver.fw_revision));
2195 break;
2196 default:
2197 BT_ERR("%s: Unsupported Intel firmware naming", hdev->name);
2198 return -EINVAL;
2199 }
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002200
2201 err = request_firmware(&fw, fwname, &hdev->dev);
2202 if (err < 0) {
2203 BT_ERR("%s: Failed to load Intel firmware file (%d)",
2204 hdev->name, err);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002205 return err;
2206 }
2207
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002208 bt_dev_info(hdev, "Found device firmware: %s", fwname);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002209
Tedd Ho-Jeong An52cc9162015-06-12 16:20:05 -07002210 /* Save the DDC file name for later use to apply once the firmware
2211 * downloading is done.
2212 */
Jaya P Gaf3715e2017-10-30 11:01:22 +01002213 switch (ver.hw_variant) {
2214 case 0x0b: /* SfP */
2215 case 0x0c: /* WsP */
2216 snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.ddc",
2217 le16_to_cpu(ver.hw_variant),
Tedd Ho-Jeong Anfaf174d2018-01-24 09:19:20 -08002218 le16_to_cpu(params.dev_revid));
Jaya P Gaf3715e2017-10-30 11:01:22 +01002219 break;
2220 case 0x11: /* JfP */
2221 case 0x12: /* ThP */
Tedd Ho-Jeong An1ce0cec2018-02-05 14:20:36 -08002222 case 0x13: /* HrP */
2223 case 0x14: /* QnJ, IcP */
Jaya P Gaf3715e2017-10-30 11:01:22 +01002224 snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u-%u.ddc",
2225 le16_to_cpu(ver.hw_variant),
2226 le16_to_cpu(ver.hw_revision),
2227 le16_to_cpu(ver.fw_revision));
2228 break;
2229 default:
2230 BT_ERR("%s: Unsupported Intel firmware naming", hdev->name);
2231 return -EINVAL;
2232 }
Tedd Ho-Jeong An52cc9162015-06-12 16:20:05 -07002233
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002234 if (fw->size < 644) {
2235 BT_ERR("%s: Invalid size of firmware file (%zu)",
2236 hdev->name, fw->size);
2237 err = -EBADF;
2238 goto done;
2239 }
2240
2241 set_bit(BTUSB_DOWNLOADING, &data->flags);
2242
Tedd Ho-Jeong Anfbbe83c2018-01-24 09:19:21 -08002243 /* Start firmware downloading and get boot parameter */
2244 err = btintel_download_firmware(hdev, fw, &boot_param);
2245 if (err < 0)
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002246 goto done;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002247
Marcel Holtmannce6bb922015-01-28 01:58:40 -08002248 set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
2249
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002250 bt_dev_info(hdev, "Waiting for firmware download to complete");
Johan Hedberga087a982015-01-30 10:58:54 +02002251
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002252 /* Before switching the device into operational mode and with that
2253 * booting the loaded firmware, wait for the bootloader notification
2254 * that all fragments have been successfully received.
2255 *
Johan Hedberga087a982015-01-30 10:58:54 +02002256 * When the event processing receives the notification, then the
2257 * BTUSB_DOWNLOADING flag will be cleared.
2258 *
2259 * The firmware loading should not take longer than 5 seconds
2260 * and thus just timeout if that happens and fail the setup
2261 * of this device.
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002262 */
Johan Hedberg129a7692015-02-14 09:33:35 +02002263 err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING,
2264 TASK_INTERRUPTIBLE,
2265 msecs_to_jiffies(5000));
Bart Van Asschef0a70a02016-08-11 16:02:44 -07002266 if (err == -EINTR) {
Johan Hedberga087a982015-01-30 10:58:54 +02002267 BT_ERR("%s: Firmware loading interrupted", hdev->name);
Johan Hedberga087a982015-01-30 10:58:54 +02002268 goto done;
2269 }
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002270
Johan Hedberga087a982015-01-30 10:58:54 +02002271 if (err) {
2272 BT_ERR("%s: Firmware loading timeout", hdev->name);
2273 err = -ETIMEDOUT;
2274 goto done;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002275 }
2276
2277 if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) {
2278 BT_ERR("%s: Firmware loading failed", hdev->name);
2279 err = -ENOEXEC;
2280 goto done;
2281 }
2282
2283 rettime = ktime_get();
2284 delta = ktime_sub(rettime, calltime);
2285 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
2286
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002287 bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002288
2289done:
2290 release_firmware(fw);
2291
2292 if (err < 0)
2293 return err;
2294
2295 calltime = ktime_get();
2296
2297 set_bit(BTUSB_BOOTING, &data->flags);
2298
Tedd Ho-Jeong Ane5889af2018-01-24 09:19:18 -08002299 err = btintel_send_intel_reset(hdev, boot_param);
2300 if (err)
2301 return err;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002302
2303 /* The bootloader will not indicate when the device is ready. This
2304 * is done by the operational firmware sending bootup notification.
Johan Hedbergfad70972015-01-30 10:58:55 +02002305 *
2306 * Booting into operational firmware should not take longer than
2307 * 1 second. However if that happens, then just fail the setup
2308 * since something went wrong.
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002309 */
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002310 bt_dev_info(hdev, "Waiting for device to boot");
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002311
Johan Hedberg129a7692015-02-14 09:33:35 +02002312 err = wait_on_bit_timeout(&data->flags, BTUSB_BOOTING,
2313 TASK_INTERRUPTIBLE,
2314 msecs_to_jiffies(1000));
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002315
Bart Van Asschef0a70a02016-08-11 16:02:44 -07002316 if (err == -EINTR) {
Johan Hedbergfad70972015-01-30 10:58:55 +02002317 BT_ERR("%s: Device boot interrupted", hdev->name);
2318 return -EINTR;
2319 }
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002320
Johan Hedbergfad70972015-01-30 10:58:55 +02002321 if (err) {
2322 BT_ERR("%s: Device boot timeout", hdev->name);
2323 return -ETIMEDOUT;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002324 }
2325
2326 rettime = ktime_get();
2327 delta = ktime_sub(rettime, calltime);
2328 duration = (unsigned long long) ktime_to_ns(delta) >> 10;
2329
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002330 bt_dev_info(hdev, "Device booted in %llu usecs", duration);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002331
2332 clear_bit(BTUSB_BOOTLOADER, &data->flags);
2333
Tedd Ho-Jeong An52cc9162015-06-12 16:20:05 -07002334 /* Once the device is running in operational mode, it needs to apply
2335 * the device configuration (DDC) parameters.
2336 *
2337 * The device can work without DDC parameters, so even if it fails
2338 * to load the file, no need to fail the setup.
2339 */
Loic Poulaine924d3d2015-09-04 17:54:36 +02002340 btintel_load_ddc_config(hdev, fwname);
Tedd Ho-Jeong An52cc9162015-06-12 16:20:05 -07002341
Marcel Holtmann213445b2015-10-21 02:45:19 +02002342 /* Set the event mask for Intel specific vendor events. This enables
2343 * a few extra events that are useful during general operation. It
2344 * does not enable any debugging related events.
2345 *
2346 * The device will function correctly without these events enabled
2347 * and thus no need to fail the setup.
2348 */
2349 btintel_set_event_mask(hdev, false);
2350
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002351 return 0;
2352}
2353
Tedd Ho-Jeong Anbfbd45e2015-02-13 09:20:52 -08002354static int btusb_shutdown_intel(struct hci_dev *hdev)
2355{
2356 struct sk_buff *skb;
2357 long ret;
2358
2359 /* Some platforms have an issue with BT LED when the interface is
2360 * down or BT radio is turned off, which takes 5 seconds to BT LED
2361 * goes off. This command turns off the BT LED immediately.
2362 */
2363 skb = __hci_cmd_sync(hdev, 0xfc3f, 0, NULL, HCI_INIT_TIMEOUT);
2364 if (IS_ERR(skb)) {
2365 ret = PTR_ERR(skb);
2366 BT_ERR("%s: turning off Intel device LED failed (%ld)",
2367 hdev->name, ret);
2368 return ret;
2369 }
2370 kfree_skb(skb);
2371
2372 return 0;
2373}
2374
Rajat Jaina4ccc9e2017-02-01 14:24:10 -08002375#ifdef CONFIG_PM
2376/* Configure an out-of-band gpio as wake-up pin, if specified in device tree */
2377static int marvell_config_oob_wake(struct hci_dev *hdev)
2378{
2379 struct sk_buff *skb;
2380 struct btusb_data *data = hci_get_drvdata(hdev);
2381 struct device *dev = &data->udev->dev;
2382 u16 pin, gap, opcode;
2383 int ret;
2384 u8 cmd[5];
2385
2386 /* Move on if no wakeup pin specified */
2387 if (of_property_read_u16(dev->of_node, "marvell,wakeup-pin", &pin) ||
2388 of_property_read_u16(dev->of_node, "marvell,wakeup-gap-ms", &gap))
2389 return 0;
2390
2391 /* Vendor specific command to configure a GPIO as wake-up pin */
2392 opcode = hci_opcode_pack(0x3F, 0x59);
2393 cmd[0] = opcode & 0xFF;
2394 cmd[1] = opcode >> 8;
2395 cmd[2] = 2; /* length of parameters that follow */
2396 cmd[3] = pin;
2397 cmd[4] = gap; /* time in ms, for which wakeup pin should be asserted */
2398
2399 skb = bt_skb_alloc(sizeof(cmd), GFP_KERNEL);
2400 if (!skb) {
2401 bt_dev_err(hdev, "%s: No memory\n", __func__);
2402 return -ENOMEM;
2403 }
2404
Johannes Berg59ae1d12017-06-16 14:29:20 +02002405 skb_put_data(skb, cmd, sizeof(cmd));
Rajat Jaina4ccc9e2017-02-01 14:24:10 -08002406 hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
2407
2408 ret = btusb_send_frame(hdev, skb);
2409 if (ret) {
2410 bt_dev_err(hdev, "%s: configuration failed\n", __func__);
2411 kfree_skb(skb);
2412 return ret;
2413 }
2414
2415 return 0;
2416}
2417#endif
2418
Amitkumar Karwarae8df492014-07-18 14:47:06 -07002419static int btusb_set_bdaddr_marvell(struct hci_dev *hdev,
2420 const bdaddr_t *bdaddr)
2421{
2422 struct sk_buff *skb;
2423 u8 buf[8];
2424 long ret;
2425
2426 buf[0] = 0xfe;
2427 buf[1] = sizeof(bdaddr_t);
2428 memcpy(buf + 2, bdaddr, sizeof(bdaddr_t));
2429
2430 skb = __hci_cmd_sync(hdev, 0xfc22, sizeof(buf), buf, HCI_INIT_TIMEOUT);
2431 if (IS_ERR(skb)) {
2432 ret = PTR_ERR(skb);
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002433 bt_dev_err(hdev, "changing Marvell device address failed (%ld)",
2434 ret);
Amitkumar Karwarae8df492014-07-18 14:47:06 -07002435 return ret;
2436 }
2437 kfree_skb(skb);
2438
2439 return 0;
2440}
2441
Toshi Kikuchi58592232014-12-12 10:58:05 -08002442static int btusb_set_bdaddr_ath3012(struct hci_dev *hdev,
2443 const bdaddr_t *bdaddr)
2444{
2445 struct sk_buff *skb;
2446 u8 buf[10];
2447 long ret;
2448
2449 buf[0] = 0x01;
2450 buf[1] = 0x01;
2451 buf[2] = 0x00;
2452 buf[3] = sizeof(bdaddr_t);
2453 memcpy(buf + 4, bdaddr, sizeof(bdaddr_t));
2454
2455 skb = __hci_cmd_sync(hdev, 0xfc0b, sizeof(buf), buf, HCI_INIT_TIMEOUT);
2456 if (IS_ERR(skb)) {
2457 ret = PTR_ERR(skb);
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002458 bt_dev_err(hdev, "Change address command failed (%ld)", ret);
Toshi Kikuchi58592232014-12-12 10:58:05 -08002459 return ret;
2460 }
2461 kfree_skb(skb);
2462
2463 return 0;
2464}
2465
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002466#define QCA_DFU_PACKET_LEN 4096
2467
2468#define QCA_GET_TARGET_VERSION 0x09
2469#define QCA_CHECK_STATUS 0x05
2470#define QCA_DFU_DOWNLOAD 0x01
2471
2472#define QCA_SYSCFG_UPDATED 0x40
2473#define QCA_PATCH_UPDATED 0x80
2474#define QCA_DFU_TIMEOUT 3000
2475
2476struct qca_version {
2477 __le32 rom_version;
2478 __le32 patch_version;
2479 __le32 ram_version;
2480 __le32 ref_clock;
2481 __u8 reserved[4];
2482} __packed;
2483
2484struct qca_rampatch_version {
2485 __le16 rom_version;
2486 __le16 patch_version;
2487} __packed;
2488
2489struct qca_device_info {
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002490 u32 rom_version;
2491 u8 rampatch_hdr; /* length of header in rampatch */
2492 u8 nvm_hdr; /* length of header in NVM */
2493 u8 ver_offset; /* offset of version structure in rampatch */
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002494};
2495
2496static const struct qca_device_info qca_devices_table[] = {
2497 { 0x00000100, 20, 4, 10 }, /* Rome 1.0 */
2498 { 0x00000101, 20, 4, 10 }, /* Rome 1.1 */
Chan-yeol Park7f6e6362015-05-21 11:24:27 +09002499 { 0x00000200, 28, 4, 18 }, /* Rome 2.0 */
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002500 { 0x00000201, 28, 4, 18 }, /* Rome 2.1 */
2501 { 0x00000300, 28, 4, 18 }, /* Rome 3.0 */
2502 { 0x00000302, 28, 4, 18 }, /* Rome 3.2 */
2503};
2504
Takashi Iwai803cdb82018-05-21 22:34:52 +02002505static int btusb_qca_send_vendor_req(struct usb_device *udev, u8 request,
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002506 void *data, u16 size)
2507{
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002508 int pipe, err;
2509 u8 *buf;
2510
2511 buf = kmalloc(size, GFP_KERNEL);
2512 if (!buf)
2513 return -ENOMEM;
2514
2515 /* Found some of USB hosts have IOT issues with ours so that we should
2516 * not wait until HCI layer is ready.
2517 */
2518 pipe = usb_rcvctrlpipe(udev, 0);
2519 err = usb_control_msg(udev, pipe, request, USB_TYPE_VENDOR | USB_DIR_IN,
2520 0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
2521 if (err < 0) {
Takashi Iwai803cdb82018-05-21 22:34:52 +02002522 dev_err(&udev->dev, "Failed to access otp area (%d)", err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002523 goto done;
2524 }
2525
2526 memcpy(data, buf, size);
2527
2528done:
2529 kfree(buf);
2530
2531 return err;
2532}
2533
2534static int btusb_setup_qca_download_fw(struct hci_dev *hdev,
2535 const struct firmware *firmware,
2536 size_t hdr_size)
2537{
2538 struct btusb_data *btdata = hci_get_drvdata(hdev);
2539 struct usb_device *udev = btdata->udev;
2540 size_t count, size, sent = 0;
2541 int pipe, len, err;
2542 u8 *buf;
2543
2544 buf = kmalloc(QCA_DFU_PACKET_LEN, GFP_KERNEL);
2545 if (!buf)
2546 return -ENOMEM;
2547
2548 count = firmware->size;
2549
2550 size = min_t(size_t, count, hdr_size);
2551 memcpy(buf, firmware->data, size);
2552
2553 /* USB patches should go down to controller through USB path
2554 * because binary format fits to go down through USB channel.
2555 * USB control path is for patching headers and USB bulk is for
2556 * patch body.
2557 */
2558 pipe = usb_sndctrlpipe(udev, 0);
2559 err = usb_control_msg(udev, pipe, QCA_DFU_DOWNLOAD, USB_TYPE_VENDOR,
2560 0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
2561 if (err < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002562 bt_dev_err(hdev, "Failed to send headers (%d)", err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002563 goto done;
2564 }
2565
2566 sent += size;
2567 count -= size;
2568
2569 while (count) {
2570 size = min_t(size_t, count, QCA_DFU_PACKET_LEN);
2571
2572 memcpy(buf, firmware->data + sent, size);
2573
2574 pipe = usb_sndbulkpipe(udev, 0x02);
2575 err = usb_bulk_msg(udev, pipe, buf, size, &len,
2576 QCA_DFU_TIMEOUT);
2577 if (err < 0) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002578 bt_dev_err(hdev, "Failed to send body at %zd of %zd (%d)",
2579 sent, firmware->size, err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002580 break;
2581 }
2582
2583 if (size != len) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002584 bt_dev_err(hdev, "Failed to get bulk buffer");
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002585 err = -EILSEQ;
2586 break;
2587 }
2588
2589 sent += size;
2590 count -= size;
2591 }
2592
2593done:
2594 kfree(buf);
2595 return err;
2596}
2597
2598static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
2599 struct qca_version *ver,
2600 const struct qca_device_info *info)
2601{
2602 struct qca_rampatch_version *rver;
2603 const struct firmware *fw;
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002604 u32 ver_rom, ver_patch;
2605 u16 rver_rom, rver_patch;
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002606 char fwname[64];
2607 int err;
2608
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002609 ver_rom = le32_to_cpu(ver->rom_version);
2610 ver_patch = le32_to_cpu(ver->patch_version);
2611
2612 snprintf(fwname, sizeof(fwname), "qca/rampatch_usb_%08x.bin", ver_rom);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002613
2614 err = request_firmware(&fw, fwname, &hdev->dev);
2615 if (err) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002616 bt_dev_err(hdev, "failed to request rampatch file: %s (%d)",
2617 fwname, err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002618 return err;
2619 }
2620
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002621 bt_dev_info(hdev, "using rampatch file: %s", fwname);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002622
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002623 rver = (struct qca_rampatch_version *)(fw->data + info->ver_offset);
2624 rver_rom = le16_to_cpu(rver->rom_version);
2625 rver_patch = le16_to_cpu(rver->patch_version);
2626
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002627 bt_dev_info(hdev, "QCA: patch rome 0x%x build 0x%x, "
2628 "firmware rome 0x%x build 0x%x",
2629 rver_rom, rver_patch, ver_rom, ver_patch);
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002630
2631 if (rver_rom != ver_rom || rver_patch <= ver_patch) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002632 bt_dev_err(hdev, "rampatch file version did not match with firmware");
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002633 err = -EINVAL;
2634 goto done;
2635 }
2636
2637 err = btusb_setup_qca_download_fw(hdev, fw, info->rampatch_hdr);
2638
2639done:
2640 release_firmware(fw);
2641
2642 return err;
2643}
2644
2645static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
2646 struct qca_version *ver,
2647 const struct qca_device_info *info)
2648{
2649 const struct firmware *fw;
2650 char fwname[64];
2651 int err;
2652
2653 snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
2654 le32_to_cpu(ver->rom_version));
2655
2656 err = request_firmware(&fw, fwname, &hdev->dev);
2657 if (err) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002658 bt_dev_err(hdev, "failed to request NVM file: %s (%d)",
2659 fwname, err);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002660 return err;
2661 }
2662
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002663 bt_dev_info(hdev, "using NVM file: %s", fwname);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002664
2665 err = btusb_setup_qca_download_fw(hdev, fw, info->nvm_hdr);
2666
2667 release_firmware(fw);
2668
2669 return err;
2670}
2671
Takashi Iwai803cdb82018-05-21 22:34:52 +02002672/* identify the ROM version and check whether patches are needed */
2673static bool btusb_qca_need_patch(struct usb_device *udev)
2674{
2675 struct qca_version ver;
2676
2677 if (btusb_qca_send_vendor_req(udev, QCA_GET_TARGET_VERSION, &ver,
2678 sizeof(ver)) < 0)
2679 return false;
2680 /* only low ROM versions need patches */
2681 return !(le32_to_cpu(ver.rom_version) & ~0xffffU);
2682}
2683
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002684static int btusb_setup_qca(struct hci_dev *hdev)
2685{
Takashi Iwai803cdb82018-05-21 22:34:52 +02002686 struct btusb_data *btdata = hci_get_drvdata(hdev);
2687 struct usb_device *udev = btdata->udev;
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002688 const struct qca_device_info *info = NULL;
2689 struct qca_version ver;
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002690 u32 ver_rom;
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002691 u8 status;
2692 int i, err;
2693
Takashi Iwai803cdb82018-05-21 22:34:52 +02002694 err = btusb_qca_send_vendor_req(udev, QCA_GET_TARGET_VERSION, &ver,
Marcel Holtmanneb500422015-04-16 23:15:50 +02002695 sizeof(ver));
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002696 if (err < 0)
2697 return err;
2698
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002699 ver_rom = le32_to_cpu(ver.rom_version);
Takashi Iwai803cdb82018-05-21 22:34:52 +02002700 /* Don't care about high ROM versions */
2701 if (ver_rom & ~0xffffU)
2702 return 0;
2703
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002704 for (i = 0; i < ARRAY_SIZE(qca_devices_table); i++) {
Kim, Ben Young Taebf906b32015-03-10 23:34:58 +00002705 if (ver_rom == qca_devices_table[i].rom_version)
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002706 info = &qca_devices_table[i];
2707 }
2708 if (!info) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002709 bt_dev_err(hdev, "don't support firmware rome 0x%x", ver_rom);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002710 return -ENODEV;
2711 }
2712
Takashi Iwai803cdb82018-05-21 22:34:52 +02002713 err = btusb_qca_send_vendor_req(udev, QCA_CHECK_STATUS, &status,
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00002714 sizeof(status));
2715 if (err < 0)
2716 return err;
2717
2718 if (!(status & QCA_PATCH_UPDATED)) {
2719 err = btusb_setup_qca_load_rampatch(hdev, &ver, info);
2720 if (err < 0)
2721 return err;
2722 }
2723
2724 if (!(status & QCA_SYSCFG_UPDATED)) {
2725 err = btusb_setup_qca_load_nvm(hdev, &ver, info);
2726 if (err < 0)
2727 return err;
2728 }
2729
2730 return 0;
2731}
2732
Marcel Holtmann9d08f502015-10-08 20:23:08 +02002733#ifdef CONFIG_BT_HCIBTUSB_BCM
2734static inline int __set_diag_interface(struct hci_dev *hdev)
2735{
2736 struct btusb_data *data = hci_get_drvdata(hdev);
2737 struct usb_interface *intf = data->diag;
2738 int i;
2739
2740 if (!data->diag)
2741 return -ENODEV;
2742
2743 data->diag_tx_ep = NULL;
2744 data->diag_rx_ep = NULL;
2745
2746 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
2747 struct usb_endpoint_descriptor *ep_desc;
2748
2749 ep_desc = &intf->cur_altsetting->endpoint[i].desc;
2750
2751 if (!data->diag_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
2752 data->diag_tx_ep = ep_desc;
2753 continue;
2754 }
2755
2756 if (!data->diag_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
2757 data->diag_rx_ep = ep_desc;
2758 continue;
2759 }
2760 }
2761
2762 if (!data->diag_tx_ep || !data->diag_rx_ep) {
Marcel Holtmann2064ee32017-10-30 10:42:59 +01002763 bt_dev_err(hdev, "invalid diagnostic descriptors");
Marcel Holtmann9d08f502015-10-08 20:23:08 +02002764 return -ENODEV;
2765 }
2766
2767 return 0;
2768}
2769
2770static struct urb *alloc_diag_urb(struct hci_dev *hdev, bool enable)
2771{
2772 struct btusb_data *data = hci_get_drvdata(hdev);
2773 struct sk_buff *skb;
2774 struct urb *urb;
2775 unsigned int pipe;
2776
2777 if (!data->diag_tx_ep)
2778 return ERR_PTR(-ENODEV);
2779
2780 urb = usb_alloc_urb(0, GFP_KERNEL);
2781 if (!urb)
2782 return ERR_PTR(-ENOMEM);
2783
2784 skb = bt_skb_alloc(2, GFP_KERNEL);
2785 if (!skb) {
2786 usb_free_urb(urb);
2787 return ERR_PTR(-ENOMEM);
2788 }
2789
Johannes Berg634fef62017-06-16 14:29:24 +02002790 skb_put_u8(skb, 0xf0);
2791 skb_put_u8(skb, enable);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02002792
2793 pipe = usb_sndbulkpipe(data->udev, data->diag_tx_ep->bEndpointAddress);
2794
2795 usb_fill_bulk_urb(urb, data->udev, pipe,
2796 skb->data, skb->len, btusb_tx_complete, skb);
2797
2798 skb->dev = (void *)hdev;
2799
2800 return urb;
2801}
2802
2803static int btusb_bcm_set_diag(struct hci_dev *hdev, bool enable)
2804{
2805 struct btusb_data *data = hci_get_drvdata(hdev);
2806 struct urb *urb;
2807
2808 if (!data->diag)
2809 return -ENODEV;
2810
2811 if (!test_bit(HCI_RUNNING, &hdev->flags))
2812 return -ENETDOWN;
2813
2814 urb = alloc_diag_urb(hdev, enable);
2815 if (IS_ERR(urb))
2816 return PTR_ERR(urb);
2817
2818 return submit_or_queue_tx_urb(hdev, urb);
2819}
2820#endif
2821
Rajat Jainfd913ef2017-02-01 14:24:09 -08002822#ifdef CONFIG_PM
2823static irqreturn_t btusb_oob_wake_handler(int irq, void *priv)
2824{
2825 struct btusb_data *data = priv;
2826
2827 pm_wakeup_event(&data->udev->dev, 0);
Jeffy Chen017789f2017-02-24 14:24:29 +08002828 pm_system_wakeup();
Rajat Jainfd913ef2017-02-01 14:24:09 -08002829
2830 /* Disable only if not already disabled (keep it balanced) */
2831 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) {
2832 disable_irq_nosync(irq);
2833 disable_irq_wake(irq);
2834 }
2835 return IRQ_HANDLED;
2836}
2837
2838static const struct of_device_id btusb_match_table[] = {
2839 { .compatible = "usb1286,204e" },
2840 { }
2841};
2842MODULE_DEVICE_TABLE(of, btusb_match_table);
2843
2844/* Use an oob wakeup pin? */
2845static int btusb_config_oob_wake(struct hci_dev *hdev)
2846{
2847 struct btusb_data *data = hci_get_drvdata(hdev);
2848 struct device *dev = &data->udev->dev;
2849 int irq, ret;
2850
2851 clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags);
2852
2853 if (!of_match_device(btusb_match_table, dev))
2854 return 0;
2855
2856 /* Move on if no IRQ specified */
2857 irq = of_irq_get_byname(dev->of_node, "wakeup");
2858 if (irq <= 0) {
2859 bt_dev_dbg(hdev, "%s: no OOB Wakeup IRQ in DT", __func__);
2860 return 0;
2861 }
2862
2863 ret = devm_request_irq(&hdev->dev, irq, btusb_oob_wake_handler,
2864 0, "OOB Wake-on-BT", data);
2865 if (ret) {
2866 bt_dev_err(hdev, "%s: IRQ request failed", __func__);
2867 return ret;
2868 }
2869
2870 ret = device_init_wakeup(dev, true);
2871 if (ret) {
2872 bt_dev_err(hdev, "%s: failed to init_wakeup", __func__);
2873 return ret;
2874 }
2875
2876 data->oob_wake_irq = irq;
2877 disable_irq(irq);
2878 bt_dev_info(hdev, "OOB Wake-on-BT configured at IRQ %u", irq);
2879 return 0;
2880}
2881#endif
2882
Hans de Goedefc549102018-04-27 11:26:43 +02002883static void btusb_check_needs_reset_resume(struct usb_interface *intf)
2884{
2885 if (dmi_check_system(btusb_needs_reset_resume_table))
2886 interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;
2887}
2888
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002889static int btusb_probe(struct usb_interface *intf,
Marcel Holtmann89e75332014-09-16 04:44:50 +02002890 const struct usb_device_id *id)
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002891{
2892 struct usb_endpoint_descriptor *ep_desc;
2893 struct btusb_data *data;
2894 struct hci_dev *hdev;
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02002895 unsigned ifnum_base;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002896 int i, err;
2897
2898 BT_DBG("intf %p id %p", intf, id);
2899
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02002900 /* interface numbers are hardcoded in the spec */
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02002901 if (intf->cur_altsetting->desc.bInterfaceNumber != 0) {
2902 if (!(id->driver_info & BTUSB_IFNUM_2))
2903 return -ENODEV;
2904 if (intf->cur_altsetting->desc.bInterfaceNumber != 2)
2905 return -ENODEV;
2906 }
2907
2908 ifnum_base = intf->cur_altsetting->desc.bInterfaceNumber;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002909
2910 if (!id->driver_info) {
2911 const struct usb_device_id *match;
Marcel Holtmann89e75332014-09-16 04:44:50 +02002912
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002913 match = usb_match_id(intf, blacklist_table);
2914 if (match)
2915 id = match;
2916 }
2917
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02002918 if (id->driver_info == BTUSB_IGNORE)
2919 return -ENODEV;
2920
Steven.Li2d25f8b2011-07-01 14:02:36 +08002921 if (id->driver_info & BTUSB_ATH3012) {
2922 struct usb_device *udev = interface_to_usbdev(intf);
2923
2924 /* Old firmware would otherwise let ath3k driver load
Derek Robsond98422c2017-07-22 13:47:07 +12002925 * patch and sysconfig files
2926 */
Takashi Iwai803cdb82018-05-21 22:34:52 +02002927 if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001 &&
2928 !btusb_qca_need_patch(udev))
Steven.Li2d25f8b2011-07-01 14:02:36 +08002929 return -ENODEV;
2930 }
2931
Sachin Kamat98921db2012-07-27 12:38:39 +05302932 data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002933 if (!data)
2934 return -ENOMEM;
2935
2936 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
2937 ep_desc = &intf->cur_altsetting->endpoint[i].desc;
2938
2939 if (!data->intr_ep && usb_endpoint_is_int_in(ep_desc)) {
2940 data->intr_ep = ep_desc;
2941 continue;
2942 }
2943
2944 if (!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
2945 data->bulk_tx_ep = ep_desc;
2946 continue;
2947 }
2948
2949 if (!data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
2950 data->bulk_rx_ep = ep_desc;
2951 continue;
2952 }
2953 }
2954
Sachin Kamat98921db2012-07-27 12:38:39 +05302955 if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep)
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002956 return -ENODEV;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002957
Marcel Holtmann893ba542015-01-28 20:27:34 -08002958 if (id->driver_info & BTUSB_AMP) {
2959 data->cmdreq_type = USB_TYPE_CLASS | 0x01;
2960 data->cmdreq = 0x2b;
2961 } else {
2962 data->cmdreq_type = USB_TYPE_CLASS;
2963 data->cmdreq = 0x00;
2964 }
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01002965
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002966 data->udev = interface_to_usbdev(intf);
Marcel Holtmann5fbcd262008-09-23 00:16:36 +02002967 data->intf = intf;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002968
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002969 INIT_WORK(&data->work, btusb_work);
Oliver Neukum7bee5492009-08-24 23:44:59 +02002970 INIT_WORK(&data->waker, btusb_waker);
Marcel Holtmann803b5832014-09-16 08:00:29 +02002971 init_usb_anchor(&data->deferred);
2972 init_usb_anchor(&data->tx_anchor);
Oliver Neukum7bee5492009-08-24 23:44:59 +02002973 spin_lock_init(&data->txlock);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002974
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002975 init_usb_anchor(&data->intr_anchor);
2976 init_usb_anchor(&data->bulk_anchor);
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02002977 init_usb_anchor(&data->isoc_anchor);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02002978 init_usb_anchor(&data->diag_anchor);
Marcel Holtmann803b5832014-09-16 08:00:29 +02002979 spin_lock_init(&data->rxlock);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002980
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08002981 if (id->driver_info & BTUSB_INTEL_NEW) {
2982 data->recv_event = btusb_recv_event_intel;
2983 data->recv_bulk = btusb_recv_bulk_intel;
2984 set_bit(BTUSB_BOOTLOADER, &data->flags);
2985 } else {
2986 data->recv_event = hci_recv_frame;
2987 data->recv_bulk = btusb_recv_bulk;
2988 }
Marcel Holtmann2cbd3f52014-11-03 05:16:07 +01002989
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002990 hdev = hci_alloc_dev();
Sachin Kamat98921db2012-07-27 12:38:39 +05302991 if (!hdev)
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002992 return -ENOMEM;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002993
Marcel Holtmannc13854c2010-02-08 15:27:07 +01002994 hdev->bus = HCI_USB;
David Herrmann155961e2012-02-09 21:58:32 +01002995 hci_set_drvdata(hdev, data);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02002996
Marcel Holtmann893ba542015-01-28 20:27:34 -08002997 if (id->driver_info & BTUSB_AMP)
2998 hdev->dev_type = HCI_AMP;
2999 else
Marcel Holtmannca8bee52016-07-05 14:30:14 +02003000 hdev->dev_type = HCI_PRIMARY;
Marcel Holtmann893ba542015-01-28 20:27:34 -08003001
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003002 data->hdev = hdev;
3003
3004 SET_HCIDEV_DEV(hdev, &intf->dev);
3005
Marcel Holtmann9f8f9622013-04-10 08:11:35 -07003006 hdev->open = btusb_open;
3007 hdev->close = btusb_close;
3008 hdev->flush = btusb_flush;
3009 hdev->send = btusb_send_frame;
3010 hdev->notify = btusb_notify;
3011
Rajat Jainfd913ef2017-02-01 14:24:09 -08003012#ifdef CONFIG_PM
3013 err = btusb_config_oob_wake(hdev);
3014 if (err)
3015 goto out_free_dev;
Rajat Jaina4ccc9e2017-02-01 14:24:10 -08003016
3017 /* Marvell devices may need a specific chip configuration */
3018 if (id->driver_info & BTUSB_MARVELL && data->oob_wake_irq) {
3019 err = marvell_config_oob_wake(hdev);
3020 if (err)
3021 goto out_free_dev;
3022 }
Rajat Jainfd913ef2017-02-01 14:24:09 -08003023#endif
Szymon Janc418678b2016-09-01 17:22:37 +02003024 if (id->driver_info & BTUSB_CW6622)
3025 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
3026
Marcel Holtmann6c9d4352015-10-17 14:39:27 +02003027 if (id->driver_info & BTUSB_BCM2045)
3028 set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
3029
Marcel Holtmann9f8f9622013-04-10 08:11:35 -07003030 if (id->driver_info & BTUSB_BCM92035)
3031 hdev->setup = btusb_setup_bcm92035;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003032
Marcel Holtmannc2bfb102015-04-05 22:52:14 -07003033#ifdef CONFIG_BT_HCIBTUSB_BCM
Marcel Holtmannabbaf502014-07-02 00:53:48 +02003034 if (id->driver_info & BTUSB_BCM_PATCHRAM) {
Marcel Holtmann49a5f782015-10-20 02:30:48 +02003035 hdev->manufacturer = 15;
Marcel Holtmannc2bfb102015-04-05 22:52:14 -07003036 hdev->setup = btbcm_setup_patchram;
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003037 hdev->set_diag = btusb_bcm_set_diag;
Marcel Holtmann1df1f592015-04-05 22:52:11 -07003038 hdev->set_bdaddr = btbcm_set_bdaddr;
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003039
3040 /* Broadcom LM_DIAG Interface numbers are hardcoded */
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02003041 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2);
Marcel Holtmannabbaf502014-07-02 00:53:48 +02003042 }
Petri Gynther10d4c672014-05-08 15:50:01 -07003043
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003044 if (id->driver_info & BTUSB_BCM_APPLE) {
Marcel Holtmann49a5f782015-10-20 02:30:48 +02003045 hdev->manufacturer = 15;
Marcel Holtmannc2bfb102015-04-05 22:52:14 -07003046 hdev->setup = btbcm_setup_apple;
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003047 hdev->set_diag = btusb_bcm_set_diag;
3048
3049 /* Broadcom LM_DIAG Interface numbers are hardcoded */
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02003050 data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003051 }
Marcel Holtmannc2bfb102015-04-05 22:52:14 -07003052#endif
Marcel Holtmann17b27722015-03-22 15:52:38 +01003053
Marcel Holtmanncb8d6592014-07-02 11:25:25 +02003054 if (id->driver_info & BTUSB_INTEL) {
Marcel Holtmann49a5f782015-10-20 02:30:48 +02003055 hdev->manufacturer = 2;
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07003056 hdev->setup = btusb_setup_intel;
Tedd Ho-Jeong Anbfbd45e2015-02-13 09:20:52 -08003057 hdev->shutdown = btusb_shutdown_intel;
Marcel Holtmann3e247672015-10-17 16:00:28 +02003058 hdev->set_diag = btintel_set_diag_mfg;
Marcel Holtmann4185a0f2015-04-06 00:52:12 -07003059 hdev->set_bdaddr = btintel_set_bdaddr;
Jakub Pawlowskic33fb9b2015-01-30 18:55:58 -08003060 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
Jakub Pawlowskic1154842015-03-17 09:04:16 -07003061 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
Marcel Holtmann3e247672015-10-17 16:00:28 +02003062 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
Marcel Holtmanncb8d6592014-07-02 11:25:25 +02003063 }
Tedd Ho-Jeong Andffd30e2013-04-19 09:57:43 -07003064
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08003065 if (id->driver_info & BTUSB_INTEL_NEW) {
Marcel Holtmann49a5f782015-10-20 02:30:48 +02003066 hdev->manufacturer = 2;
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08003067 hdev->send = btusb_send_frame_intel;
3068 hdev->setup = btusb_setup_intel_new;
Marcel Holtmanneeb6abe2015-07-05 14:37:39 +02003069 hdev->hw_error = btintel_hw_error;
Marcel Holtmann6d2e50d2015-10-09 14:42:08 +02003070 hdev->set_diag = btintel_set_diag;
Marcel Holtmann4185a0f2015-04-06 00:52:12 -07003071 hdev->set_bdaddr = btintel_set_bdaddr;
Marcel Holtmannb970c5b2015-02-01 23:57:18 -08003072 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
Marcel Holtmannd8270fb2015-10-17 16:00:27 +02003073 set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
Marcel Holtmanncda0dd72015-01-26 21:33:48 -08003074 }
3075
Amitkumar Karwarae8df492014-07-18 14:47:06 -07003076 if (id->driver_info & BTUSB_MARVELL)
3077 hdev->set_bdaddr = btusb_set_bdaddr_marvell;
3078
Marcel Holtmann661cf882015-01-02 23:35:20 -08003079 if (id->driver_info & BTUSB_SWAVE) {
3080 set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks);
Marcel Holtmannd57dbe72014-12-26 04:42:33 +01003081 set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks);
Marcel Holtmann661cf882015-01-02 23:35:20 -08003082 }
Marcel Holtmannd57dbe72014-12-26 04:42:33 +01003083
Marcel Holtmanne4c534b2015-10-21 01:31:45 +02003084 if (id->driver_info & BTUSB_INTEL_BOOT) {
3085 hdev->manufacturer = 2;
Marcel Holtmann40df7832014-07-06 13:29:58 +02003086 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
Marcel Holtmanne4c534b2015-10-21 01:31:45 +02003087 }
Marcel Holtmann40df7832014-07-06 13:29:58 +02003088
Jakub Pawlowski79f0c872015-01-29 10:38:34 -08003089 if (id->driver_info & BTUSB_ATH3012) {
Takashi Iwai803cdb82018-05-21 22:34:52 +02003090 data->setup_on_usb = btusb_setup_qca;
Toshi Kikuchi58592232014-12-12 10:58:05 -08003091 hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
Jakub Pawlowski3d50d512015-03-17 09:04:15 -07003092 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
Jakub Pawlowski79f0c872015-01-29 10:38:34 -08003093 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
3094 }
Toshi Kikuchi58592232014-12-12 10:58:05 -08003095
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00003096 if (id->driver_info & BTUSB_QCA_ROME) {
3097 data->setup_on_usb = btusb_setup_qca;
3098 hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
Vic Wei96e58d32018-03-28 08:28:47 -07003099 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
Hans de Goedefc549102018-04-27 11:26:43 +02003100 btusb_check_needs_reset_resume(intf);
Kim, Ben Young Tae3267c882015-02-15 23:07:33 +00003101 }
3102
Carlo Caionedb33c772015-05-14 10:49:09 +02003103#ifdef CONFIG_BT_HCIBTUSB_RTL
Daniel Drake04b8c812015-05-21 08:23:50 -06003104 if (id->driver_info & BTUSB_REALTEK) {
Carlo Caionedb33c772015-05-14 10:49:09 +02003105 hdev->setup = btrtl_setup_realtek;
Daniel Drake04b8c812015-05-21 08:23:50 -06003106
3107 /* Realtek devices lose their updated firmware over suspend,
3108 * but the USB hub doesn't notice any status change.
3109 * Explicitly request a device reset on resume.
3110 */
Hans de Goede61f5ace2018-01-08 10:44:16 +01003111 interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;
Daniel Drake04b8c812015-05-21 08:23:50 -06003112 }
Carlo Caionedb33c772015-05-14 10:49:09 +02003113#endif
Daniel Drakea2698a92015-04-16 14:09:55 -06003114
Marcel Holtmann893ba542015-01-28 20:27:34 -08003115 if (id->driver_info & BTUSB_AMP) {
3116 /* AMP controllers do not support SCO packets */
3117 data->isoc = NULL;
3118 } else {
Marcel Holtmann22f8e9d2015-10-20 00:53:33 +02003119 /* Interface orders are hardcoded in the specification */
3120 data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1);
Marcel Holtmann459232f2017-10-24 19:42:45 +02003121 data->isoc_ifnum = ifnum_base + 1;
Marcel Holtmann893ba542015-01-28 20:27:34 -08003122 }
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003123
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003124 if (!reset)
Szymon Janca6c511c2012-05-23 12:35:46 +02003125 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003126
3127 if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) {
3128 if (!disable_scofix)
3129 set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks);
3130 }
3131
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003132 if (id->driver_info & BTUSB_BROKEN_ISOC)
3133 data->isoc = NULL;
3134
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003135 if (id->driver_info & BTUSB_DIGIANSWER) {
3136 data->cmdreq_type = USB_TYPE_VENDOR;
Szymon Janca6c511c2012-05-23 12:35:46 +02003137 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003138 }
3139
3140 if (id->driver_info & BTUSB_CSR) {
3141 struct usb_device *udev = data->udev;
Marcel Holtmann81cac642014-01-03 03:02:36 -08003142 u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice);
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003143
3144 /* Old firmware would otherwise execute USB reset */
Marcel Holtmann81cac642014-01-03 03:02:36 -08003145 if (bcdDevice < 0x117)
Szymon Janca6c511c2012-05-23 12:35:46 +02003146 set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
Marcel Holtmann81cac642014-01-03 03:02:36 -08003147
3148 /* Fake CSR devices with broken commands */
Johan Hedberg6cafcd92015-08-30 21:47:21 +03003149 if (bcdDevice <= 0x100 || bcdDevice == 0x134)
Marcel Holtmann81cac642014-01-03 03:02:36 -08003150 hdev->setup = btusb_setup_csr;
Jakub Pawlowski49c989a2015-03-17 09:04:17 -07003151
3152 set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003153 }
3154
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003155 if (id->driver_info & BTUSB_SNIFFER) {
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003156 struct usb_device *udev = data->udev;
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003157
Marcel Holtmann7a9d4022008-11-30 12:17:26 +01003158 /* New sniffer firmware has crippled HCI interface */
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003159 if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
3160 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
3161 }
3162
Marcel Holtmann3a5ef202014-07-06 14:53:54 +02003163 if (id->driver_info & BTUSB_INTEL_BOOT) {
3164 /* A bug in the bootloader causes that interrupt interface is
3165 * only enabled after receiving SetInterface(0, AltSetting=0).
3166 */
3167 err = usb_set_interface(data->udev, 0, 0);
3168 if (err < 0) {
3169 BT_ERR("failed to set interface 0, alt 0 %d", err);
Rajat Jain10ab1332017-02-01 14:24:08 -08003170 goto out_free_dev;
Marcel Holtmann3a5ef202014-07-06 14:53:54 +02003171 }
3172 }
3173
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003174 if (data->isoc) {
3175 err = usb_driver_claim_interface(&btusb_driver,
Marcel Holtmann89e75332014-09-16 04:44:50 +02003176 data->isoc, data);
Rajat Jain10ab1332017-02-01 14:24:08 -08003177 if (err < 0)
3178 goto out_free_dev;
Marcel Holtmann9bfa35f2008-08-18 13:23:52 +02003179 }
3180
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003181#ifdef CONFIG_BT_HCIBTUSB_BCM
3182 if (data->diag) {
3183 if (!usb_driver_claim_interface(&btusb_driver,
3184 data->diag, data))
3185 __set_diag_interface(hdev);
3186 else
3187 data->diag = NULL;
3188 }
3189#endif
3190
Hans de Goedeeff2d682017-11-13 14:44:16 +01003191 if (enable_autosuspend)
3192 usb_enable_autosuspend(data->udev);
3193
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003194 err = hci_register_dev(hdev);
Rajat Jain10ab1332017-02-01 14:24:08 -08003195 if (err < 0)
3196 goto out_free_dev;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003197
3198 usb_set_intfdata(intf, data);
3199
3200 return 0;
Rajat Jain10ab1332017-02-01 14:24:08 -08003201
3202out_free_dev:
3203 hci_free_dev(hdev);
3204 return err;
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003205}
3206
3207static void btusb_disconnect(struct usb_interface *intf)
3208{
3209 struct btusb_data *data = usb_get_intfdata(intf);
3210 struct hci_dev *hdev;
3211
3212 BT_DBG("intf %p", intf);
3213
3214 if (!data)
3215 return;
3216
3217 hdev = data->hdev;
Marcel Holtmann5fbcd262008-09-23 00:16:36 +02003218 usb_set_intfdata(data->intf, NULL);
3219
3220 if (data->isoc)
3221 usb_set_intfdata(data->isoc, NULL);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003222
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003223 if (data->diag)
3224 usb_set_intfdata(data->diag, NULL);
3225
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003226 hci_unregister_dev(hdev);
3227
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003228 if (intf == data->intf) {
3229 if (data->isoc)
3230 usb_driver_release_interface(&btusb_driver, data->isoc);
3231 if (data->diag)
3232 usb_driver_release_interface(&btusb_driver, data->diag);
3233 } else if (intf == data->isoc) {
3234 if (data->diag)
3235 usb_driver_release_interface(&btusb_driver, data->diag);
Marcel Holtmann5fbcd262008-09-23 00:16:36 +02003236 usb_driver_release_interface(&btusb_driver, data->intf);
Marcel Holtmann9d08f502015-10-08 20:23:08 +02003237 } else if (intf == data->diag) {
3238 usb_driver_release_interface(&btusb_driver, data->intf);
3239 if (data->isoc)
3240 usb_driver_release_interface(&btusb_driver, data->isoc);
3241 }
Marcel Holtmann5fbcd262008-09-23 00:16:36 +02003242
Rajat Jainfd913ef2017-02-01 14:24:09 -08003243 if (data->oob_wake_irq)
3244 device_init_wakeup(&data->udev->dev, false);
3245
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003246 hci_free_dev(hdev);
3247}
3248
Oliver Neukum7bee5492009-08-24 23:44:59 +02003249#ifdef CONFIG_PM
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003250static int btusb_suspend(struct usb_interface *intf, pm_message_t message)
3251{
3252 struct btusb_data *data = usb_get_intfdata(intf);
3253
3254 BT_DBG("intf %p", intf);
3255
3256 if (data->suspend_count++)
3257 return 0;
3258
Oliver Neukum7bee5492009-08-24 23:44:59 +02003259 spin_lock_irq(&data->txlock);
Alan Stern5b1b0b82011-08-19 23:49:48 +02003260 if (!(PMSG_IS_AUTO(message) && data->tx_in_flight)) {
Oliver Neukum7bee5492009-08-24 23:44:59 +02003261 set_bit(BTUSB_SUSPENDING, &data->flags);
3262 spin_unlock_irq(&data->txlock);
3263 } else {
3264 spin_unlock_irq(&data->txlock);
3265 data->suspend_count--;
3266 return -EBUSY;
3267 }
3268
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003269 cancel_work_sync(&data->work);
3270
Oliver Neukum7bee5492009-08-24 23:44:59 +02003271 btusb_stop_traffic(data);
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003272 usb_kill_anchored_urbs(&data->tx_anchor);
3273
Rajat Jainfd913ef2017-02-01 14:24:09 -08003274 if (data->oob_wake_irq && device_may_wakeup(&data->udev->dev)) {
3275 set_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags);
3276 enable_irq_wake(data->oob_wake_irq);
3277 enable_irq(data->oob_wake_irq);
3278 }
3279
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003280 return 0;
3281}
3282
Oliver Neukum7bee5492009-08-24 23:44:59 +02003283static void play_deferred(struct btusb_data *data)
3284{
3285 struct urb *urb;
3286 int err;
3287
3288 while ((urb = usb_get_from_anchor(&data->deferred))) {
Jeffy Chen19cfe912017-07-20 18:53:50 +08003289 usb_anchor_urb(urb, &data->tx_anchor);
3290
Oliver Neukum7bee5492009-08-24 23:44:59 +02003291 err = usb_submit_urb(urb, GFP_ATOMIC);
Jeffy Chen19cfe912017-07-20 18:53:50 +08003292 if (err < 0) {
3293 if (err != -EPERM && err != -ENODEV)
3294 BT_ERR("%s urb %p submission failed (%d)",
3295 data->hdev->name, urb, -err);
3296 kfree(urb->setup_packet);
3297 usb_unanchor_urb(urb);
3298 usb_free_urb(urb);
Oliver Neukum7bee5492009-08-24 23:44:59 +02003299 break;
Jeffy Chen19cfe912017-07-20 18:53:50 +08003300 }
Oliver Neukum7bee5492009-08-24 23:44:59 +02003301
3302 data->tx_in_flight++;
Jeffy Chen19cfe912017-07-20 18:53:50 +08003303 usb_free_urb(urb);
Oliver Neukum7bee5492009-08-24 23:44:59 +02003304 }
Jeffy Chen19cfe912017-07-20 18:53:50 +08003305
3306 /* Cleanup the rest deferred urbs. */
3307 while ((urb = usb_get_from_anchor(&data->deferred))) {
3308 kfree(urb->setup_packet);
3309 usb_free_urb(urb);
3310 }
Oliver Neukum7bee5492009-08-24 23:44:59 +02003311}
3312
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003313static int btusb_resume(struct usb_interface *intf)
3314{
3315 struct btusb_data *data = usb_get_intfdata(intf);
3316 struct hci_dev *hdev = data->hdev;
Oliver Neukum7bee5492009-08-24 23:44:59 +02003317 int err = 0;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003318
3319 BT_DBG("intf %p", intf);
3320
3321 if (--data->suspend_count)
3322 return 0;
3323
Rajat Jainfd913ef2017-02-01 14:24:09 -08003324 /* Disable only if not already disabled (keep it balanced) */
3325 if (test_and_clear_bit(BTUSB_OOB_WAKE_ENABLED, &data->flags)) {
3326 disable_irq(data->oob_wake_irq);
3327 disable_irq_wake(data->oob_wake_irq);
3328 }
3329
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003330 if (!test_bit(HCI_RUNNING, &hdev->flags))
Oliver Neukum7bee5492009-08-24 23:44:59 +02003331 goto done;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003332
3333 if (test_bit(BTUSB_INTR_RUNNING, &data->flags)) {
3334 err = btusb_submit_intr_urb(hdev, GFP_NOIO);
3335 if (err < 0) {
3336 clear_bit(BTUSB_INTR_RUNNING, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02003337 goto failed;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003338 }
3339 }
3340
3341 if (test_bit(BTUSB_BULK_RUNNING, &data->flags)) {
Marcel Holtmann43c2e572009-02-04 17:41:38 +01003342 err = btusb_submit_bulk_urb(hdev, GFP_NOIO);
3343 if (err < 0) {
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003344 clear_bit(BTUSB_BULK_RUNNING, &data->flags);
Oliver Neukum7bee5492009-08-24 23:44:59 +02003345 goto failed;
3346 }
3347
3348 btusb_submit_bulk_urb(hdev, GFP_NOIO);
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003349 }
3350
3351 if (test_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
3352 if (btusb_submit_isoc_urb(hdev, GFP_NOIO) < 0)
3353 clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
3354 else
3355 btusb_submit_isoc_urb(hdev, GFP_NOIO);
3356 }
3357
Oliver Neukum7bee5492009-08-24 23:44:59 +02003358 spin_lock_irq(&data->txlock);
3359 play_deferred(data);
3360 clear_bit(BTUSB_SUSPENDING, &data->flags);
3361 spin_unlock_irq(&data->txlock);
3362 schedule_work(&data->work);
3363
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003364 return 0;
Oliver Neukum7bee5492009-08-24 23:44:59 +02003365
3366failed:
3367 usb_scuttle_anchored_urbs(&data->deferred);
3368done:
3369 spin_lock_irq(&data->txlock);
3370 clear_bit(BTUSB_SUSPENDING, &data->flags);
3371 spin_unlock_irq(&data->txlock);
3372
3373 return err;
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003374}
Oliver Neukum7bee5492009-08-24 23:44:59 +02003375#endif
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003376
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003377static struct usb_driver btusb_driver = {
3378 .name = "btusb",
3379 .probe = btusb_probe,
3380 .disconnect = btusb_disconnect,
Oliver Neukum7bee5492009-08-24 23:44:59 +02003381#ifdef CONFIG_PM
Marcel Holtmann6a88adf2008-11-30 12:17:14 +01003382 .suspend = btusb_suspend,
3383 .resume = btusb_resume,
Oliver Neukum7bee5492009-08-24 23:44:59 +02003384#endif
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003385 .id_table = btusb_table,
Oliver Neukum7bee5492009-08-24 23:44:59 +02003386 .supports_autosuspend = 1,
Sarah Sharpe1f12eb2012-04-23 10:08:51 -07003387 .disable_hub_initiated_lpm = 1,
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003388};
3389
Greg Kroah-Hartman93f15082011-11-18 09:47:34 -08003390module_usb_driver(btusb_driver);
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003391
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003392module_param(disable_scofix, bool, 0644);
3393MODULE_PARM_DESC(disable_scofix, "Disable fixup of wrong SCO buffer size");
3394
3395module_param(force_scofix, bool, 0644);
3396MODULE_PARM_DESC(force_scofix, "Force fixup of wrong SCO buffers size");
3397
Hans de Goedeeff2d682017-11-13 14:44:16 +01003398module_param(enable_autosuspend, bool, 0644);
3399MODULE_PARM_DESC(enable_autosuspend, "Enable USB autosuspend by default");
3400
Marcel Holtmanncfeb4142008-08-07 22:26:56 +02003401module_param(reset, bool, 0644);
3402MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
3403
Marcel Holtmann5e23b922007-10-20 14:12:34 +02003404MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
3405MODULE_DESCRIPTION("Generic Bluetooth USB driver ver " VERSION);
3406MODULE_VERSION(VERSION);
3407MODULE_LICENSE("GPL");