Blame view

drivers/bluetooth/btusb.c 81.3 KB
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1
2
3
4
  /*
   *
   *  Generic Bluetooth USB driver
   *
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
5
   *  Copyright (C) 2005-2008  Marcel Holtmann <marcel@holtmann.org>
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
   *
   *
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation; either version 2 of the License, or
   *  (at your option) any later version.
   *
   *  This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License
   *  along with this program; if not, write to the Free Software
   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   *
   */
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
23
  #include <linux/module.h>
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
24
  #include <linux/usb.h>
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
25
  #include <linux/firmware.h>
a2698a9bf   Daniel Drake   Bluetooth: btusb:...
26
  #include <asm/unaligned.h>
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
27
28
29
  
  #include <net/bluetooth/bluetooth.h>
  #include <net/bluetooth/hci_core.h>
4185a0f5d   Marcel Holtmann   Bluetooth: btusb:...
30
  #include "btintel.h"
1df1f5910   Marcel Holtmann   Bluetooth: btusb:...
31
  #include "btbcm.h"
db33c77dd   Carlo Caione   Bluetooth: btrtl:...
32
  #include "btrtl.h"
1df1f5910   Marcel Holtmann   Bluetooth: btusb:...
33

34dced9bd   Marcel Holtmann   Bluetooth: btusb:...
34
  #define VERSION "0.8"
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
35

90ab5ee94   Rusty Russell   module_param: mak...
36
37
  static bool disable_scofix;
  static bool force_scofix;
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
38

917a33379   Shailendra Verma   Bluetooth: btusb:...
39
  static bool reset = true;
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
40
41
42
43
  
  static struct usb_driver btusb_driver;
  
  #define BTUSB_IGNORE		0x01
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
44
45
46
47
48
49
  #define BTUSB_DIGIANSWER	0x02
  #define BTUSB_CSR		0x04
  #define BTUSB_SNIFFER		0x08
  #define BTUSB_BCM92035		0x10
  #define BTUSB_BROKEN_ISOC	0x20
  #define BTUSB_WRONG_SCO_MTU	0x40
2d25f8b46   Steven.Li   Bluetooth: Add At...
50
  #define BTUSB_ATH3012		0x80
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
51
  #define BTUSB_INTEL		0x100
40df783d1   Marcel Holtmann   Bluetooth: Add su...
52
53
  #define BTUSB_INTEL_BOOT	0x200
  #define BTUSB_BCM_PATCHRAM	0x400
ae8df494e   Amitkumar Karwar   Bluetooth: add pu...
54
  #define BTUSB_MARVELL		0x800
4fcef8ed7   Marcel Holtmann   Bluetooth: Fix is...
55
  #define BTUSB_SWAVE		0x1000
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
56
  #define BTUSB_INTEL_NEW		0x2000
893ba5440   Marcel Holtmann   Bluetooth: btusb:...
57
  #define BTUSB_AMP		0x4000
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
58
  #define BTUSB_QCA_ROME		0x8000
17b2772b8   Marcel Holtmann   Bluetooth: Read B...
59
  #define BTUSB_BCM_APPLE		0x10000
a2698a9bf   Daniel Drake   Bluetooth: btusb:...
60
  #define BTUSB_REALTEK		0x20000
6c9d435d3   Marcel Holtmann   Bluetooth: btusb:...
61
  #define BTUSB_BCM2045		0x40000
22f8e9dbf   Marcel Holtmann   Bluetooth: btusb:...
62
  #define BTUSB_IFNUM_2		0x80000
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
63

54265202f   Marcel Holtmann   Bluetooth: Declar...
64
  static const struct usb_device_id btusb_table[] = {
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
65
66
  	/* Generic Bluetooth USB device */
  	{ USB_DEVICE_INFO(0xe0, 0x01, 0x01) },
893ba5440   Marcel Holtmann   Bluetooth: btusb:...
67
68
  	/* Generic Bluetooth AMP device */
  	{ USB_DEVICE_INFO(0xe0, 0x01, 0x04), .driver_info = BTUSB_AMP },
d63b28264   Daniel Drake   Bluetooth: btusb:...
69
70
  	/* Generic Bluetooth USB interface */
  	{ USB_INTERFACE_INFO(0xe0, 0x01, 0x01) },
1fa6535fa   Henrik Rydberg   Bluetooth: Add su...
71
  	/* Apple-specific (Broadcom) devices */
17b2772b8   Marcel Holtmann   Bluetooth: Read B...
72
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x05ac, 0xff, 0x01, 0x01),
22f8e9dbf   Marcel Holtmann   Bluetooth: btusb:...
73
  	  .driver_info = BTUSB_BCM_APPLE | BTUSB_IFNUM_2 },
1fa6535fa   Henrik Rydberg   Bluetooth: Add su...
74

178c059e7   Cho, Yu-Chen   Bluetooth: Add su...
75
76
  	/* MediaTek MT76x0E */
  	{ USB_DEVICE(0x0e8d, 0x763f) },
c510eae37   Oliver Neukum   btusb: add device...
77
  	/* Broadcom SoftSailing reporting vendor specific */
2e8b50631   Don Zickus   Bluetooth: btusb:...
78
  	{ USB_DEVICE(0x0a5c, 0x21e1) },
c510eae37   Oliver Neukum   btusb: add device...
79

3cd01976e   Nobuhiro Iwamatsu   Bluetooth: Add su...
80
81
  	/* Apple MacBookPro 7,1 */
  	{ USB_DEVICE(0x05ac, 0x8213) },
0a79f6744   Cyril Lacoux   Bluetooth: Added ...
82
83
  	/* Apple iMac11,1 */
  	{ USB_DEVICE(0x05ac, 0x8215) },
9c047157a   Nobuhiro Iwamatsu   Bluetooth: Add su...
84
85
  	/* Apple MacBookPro6,2 */
  	{ USB_DEVICE(0x05ac, 0x8218) },
3e3ede7dd   Edgar (gimli) Hucek   Bluetooth: Add Ma...
86
87
  	/* Apple MacBookAir3,1, MacBookAir3,2 */
  	{ USB_DEVICE(0x05ac, 0x821b) },
a63b723d0   Pieter-Augustijn Van Malleghem   Bluetooth: Add Ma...
88
89
  	/* Apple MacBookAir4,1 */
  	{ USB_DEVICE(0x05ac, 0x821f) },
88d377b6c   Marc-Antoine Perennou   Bluetooth: add su...
90
91
  	/* Apple MacBookPro8,2 */
  	{ USB_DEVICE(0x05ac, 0x821a) },
f78b68261   Jurgen Kramer   Bluetooth: add su...
92
93
  	/* Apple MacMini5,1 */
  	{ USB_DEVICE(0x05ac, 0x8281) },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
94
  	/* AVM BlueFRITZ! USB v2.0 */
4fcef8ed7   Marcel Holtmann   Bluetooth: Fix is...
95
  	{ USB_DEVICE(0x057c, 0x3800), .driver_info = BTUSB_SWAVE },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
96
97
98
99
100
101
102
103
104
105
106
107
  
  	/* Bluetooth Ultraport Module from IBM */
  	{ USB_DEVICE(0x04bf, 0x030a) },
  
  	/* ALPS Modules with non-standard id */
  	{ USB_DEVICE(0x044e, 0x3001) },
  	{ USB_DEVICE(0x044e, 0x3002) },
  
  	/* Ericsson with non-standard id */
  	{ USB_DEVICE(0x0bdb, 0x1002) },
  
  	/* Canyon CN-BTU1 with HID interfaces */
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
108
  	{ USB_DEVICE(0x0c10, 0x0000) },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
109

d13431ca3   Wen-chien Jesse Sung   Bluetooth: Add su...
110
111
  	/* Broadcom BCM20702A0 */
  	{ USB_DEVICE(0x413c, 0x8197) },
d049f4e51   Marcel Holtmann   Bluetooth: btusb:...
112
113
  	/* Broadcom BCM20702B0 (Dynex/Insignia) */
  	{ USB_DEVICE(0x19ff, 0x0239), .driver_info = BTUSB_BCM_PATCHRAM },
2faf71ce9   Santtu Rekilä   Bluetooth: btusb:...
114
115
  	/* Broadcom BCM43142A0 (Foxconn/Lenovo) */
  	{ USB_DEVICE(0x105b, 0xe065), .driver_info = BTUSB_BCM_PATCHRAM },
985140369   Steven Harms   Add Foxconn / Hon...
116
  	/* Foxconn - Hon Hai */
6029ddc23   Heinrich Siebmanns   Bluetooth: Add su...
117
118
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x0489, 0xff, 0x01, 0x01),
  	  .driver_info = BTUSB_BCM_PATCHRAM },
985140369   Steven Harms   Add Foxconn / Hon...
119

8f0c304c6   Matej Dubovy   Bluetooth: btusb:...
120
121
122
  	/* Lite-On Technology - Broadcom based */
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x04ca, 0xff, 0x01, 0x01),
  	  .driver_info = BTUSB_BCM_PATCHRAM },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
123
  	/* Broadcom devices with vendor specific id */
10d4c6736   Petri Gynther   Bluetooth: btusb:...
124
125
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01),
  	  .driver_info = BTUSB_BCM_PATCHRAM },
92c385f46   Gustavo Padovan   Bluetooth: Use US...
126

c2aef6e8c   Marcel Holtmann   Bluetooth: Add su...
127
  	/* ASUSTek Computer - Broadcom based */
9a5abdaaf   Rick Dunn   Bluetooth: btusb:...
128
129
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x0b05, 0xff, 0x01, 0x01),
  	  .driver_info = BTUSB_BCM_PATCHRAM },
c2aef6e8c   Marcel Holtmann   Bluetooth: Add su...
130

5bcecf325   Ken O'Brien   Bluetooth: btusb:...
131
  	/* Belkin F8065bf - Broadcom based */
6331c686e   Marcel Holtmann   Bluetooth: btusb:...
132
133
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01),
  	  .driver_info = BTUSB_BCM_PATCHRAM },
5bcecf325   Ken O'Brien   Bluetooth: btusb:...
134

9113bfd82   Jurgen Kramer   Bluetooth: btusb:...
135
  	/* IMC Networks - Broadcom based */
6331c686e   Marcel Holtmann   Bluetooth: btusb:...
136
137
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x13d3, 0xff, 0x01, 0x01),
  	  .driver_info = BTUSB_BCM_PATCHRAM },
9113bfd82   Jurgen Kramer   Bluetooth: btusb:...
138

1623d0bf8   Dmitry Tunin   Bluetooth: Add su...
139
140
141
  	/* Toshiba Corp - Broadcom based */
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x0930, 0xff, 0x01, 0x01),
  	  .driver_info = BTUSB_BCM_PATCHRAM },
40df783d1   Marcel Holtmann   Bluetooth: Add su...
142
  	/* Intel Bluetooth USB Bootloader (RAM module) */
d92f2df05   Marcel Holtmann   Bluetooth: Ignore...
143
144
  	{ USB_DEVICE(0x8087, 0x0a5a),
  	  .driver_info = BTUSB_INTEL_BOOT | BTUSB_BROKEN_ISOC },
40df783d1   Marcel Holtmann   Bluetooth: Add su...
145

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
146
147
148
149
  	{ }	/* Terminating entry */
  };
  
  MODULE_DEVICE_TABLE(usb, btusb_table);
54265202f   Marcel Holtmann   Bluetooth: Declar...
150
  static const struct usb_device_id blacklist_table[] = {
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
151
152
153
154
155
  	/* CSR BlueCore devices */
  	{ USB_DEVICE(0x0a12, 0x0001), .driver_info = BTUSB_CSR },
  
  	/* Broadcom BCM2033 without firmware */
  	{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },
6c9d435d3   Marcel Holtmann   Bluetooth: btusb:...
156
157
  	/* Broadcom BCM2045 devices */
  	{ USB_DEVICE(0x0a5c, 0x2045), .driver_info = BTUSB_BCM2045 },
be93112ac   Bala Shanmugam   Bluetooth: Add ne...
158
  	/* Atheros 3011 with sflash firmware */
0b8800623   Andy Shevchenko   Bluetooth: sort t...
159
160
  	{ USB_DEVICE(0x0489, 0xe027), .driver_info = BTUSB_IGNORE },
  	{ USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
2eeff0b43   Alexander Ploumistos   Bluetooth: ath3k:...
161
  	{ USB_DEVICE(0x04f2, 0xaff1), .driver_info = BTUSB_IGNORE },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
162
  	{ USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
be93112ac   Bala Shanmugam   Bluetooth: Add ne...
163
  	{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
6eda541d1   Marek Vasut   Bluetooth: Suppor...
164
  	{ USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
2a7bccccd   Andy Ross   Bluetooth: Device...
165
  	{ USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
be93112ac   Bala Shanmugam   Bluetooth: Add ne...
166

509e7861d   Cho, Yu-Chen   Bluetooth: add At...
167
168
  	/* Atheros AR9285 Malbec with sflash firmware */
  	{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
d9f51b51d   Bala Shanmugam   Bluetooth: Add fi...
169
  	/* Atheros 3012 with sflash firmware */
0b8800623   Andy Shevchenko   Bluetooth: sort t...
170
171
172
173
174
  	{ USB_DEVICE(0x0489, 0xe04d), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x0489, 0xe04e), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x0489, 0xe056), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x0489, 0xe05f), .driver_info = BTUSB_ATH3012 },
692c062e7   Dmitry Tunin   ath3k: Add suppor...
175
  	{ USB_DEVICE(0x0489, 0xe076), .driver_info = BTUSB_ATH3012 },
4b552bc9e   Anantha Krishnan   Bluetooth: Add su...
176
  	{ USB_DEVICE(0x0489, 0xe078), .driver_info = BTUSB_ATH3012 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
177
178
179
180
  	{ USB_DEVICE(0x04c5, 0x1330), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x04ca, 0x3004), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x04ca, 0x3006), .driver_info = BTUSB_ATH3012 },
1fb4e09a7   Mohammed Habibulla   Bluetooth: Add su...
181
  	{ USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
182
183
  	{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
7e730c7f3   Dmitry Tunin   Bluetooth: ath3k:...
184
  	{ USB_DEVICE(0x04ca, 0x300d), .driver_info = BTUSB_ATH3012 },
ec0810d2a   Dmitry Tunin   Bluetooth: ath3k:...
185
  	{ USB_DEVICE(0x04ca, 0x300f), .driver_info = BTUSB_ATH3012 },
134d3b355   Janne Heikkinen   Bluetooth: Add US...
186
  	{ USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
187
  	{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
cd355ff07   Dmitry Tunin   Bluetooth: ath3k:...
188
  	{ USB_DEVICE(0x0930, 0x021c), .driver_info = BTUSB_ATH3012 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
189
  	{ USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
89d2975fa   Vincent Zwanenburg   Add a new PID/VID...
190
  	{ USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
a735f9e22   Andy Shevchenko   Bluetooth: append...
191
  	{ USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
d66629c13   Ming Lei   Bluetooth: Add su...
192
  	{ USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
2d25f8b46   Steven.Li   Bluetooth: Add At...
193
  	{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
94a32d10f   Sunguk Lee   Bluetooth: Device...
194
  	{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
07c0ea874   Cho, Yu-Chen   Bluetooth: Add At...
195
  	{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
b131237ca   Oliver Neukum   Bluetooth: Enable...
196
  	{ USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
1e56f1eb2   Oliver Neukum   Bluetooth: Add fi...
197
  	{ USB_DEVICE(0x0cf3, 0x311f), .driver_info = BTUSB_ATH3012 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
198
  	{ USB_DEVICE(0x0cf3, 0x3121), .driver_info = BTUSB_ATH3012 },
ebaf5795e   Ming Lei   Bluetooth: Add su...
199
  	{ USB_DEVICE(0x0cf3, 0x817a), .driver_info = BTUSB_ATH3012 },
18e0afab8   Dmitry Tunin   Bluetooth: ath3k:...
200
  	{ USB_DEVICE(0x0cf3, 0x817b), .driver_info = BTUSB_ATH3012 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
201
  	{ USB_DEVICE(0x0cf3, 0xe003), .driver_info = BTUSB_ATH3012 },
ac71311e6   AceLan Kao   Bluetooth: Add su...
202
  	{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
0a3658ccc   Peng Chen   Bluetooth: Add a ...
203
  	{ USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
ca79f2320   Wen-chien Jesse Sung   Bluetooth: ath3k:...
204
  	{ USB_DEVICE(0x0cf3, 0xe006), .driver_info = BTUSB_ATH3012 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
205
206
  	{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
  	{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
eed307e29   AceLan Kao   Bluetooth: Add su...
207
  	{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
5b77a1f3d   Sujith Manoharan   Bluetooth: ath3k:...
208
  	{ USB_DEVICE(0x13d3, 0x3402), .driver_info = BTUSB_ATH3012 },
3bb30a7cd   Dmitry Tunin   Bluetooth: ath3k:...
209
  	{ USB_DEVICE(0x13d3, 0x3408), .driver_info = BTUSB_ATH3012 },
033efa920   Dmitry Tunin   Bluetooth: ath3k:...
210
  	{ USB_DEVICE(0x13d3, 0x3423), .driver_info = BTUSB_ATH3012 },
fa2f1394f   Anantha Krishnan   Bluetooth: Add su...
211
  	{ USB_DEVICE(0x13d3, 0x3432), .driver_info = BTUSB_ATH3012 },
0d0cef618   Dmitry Tunin   ath3k: add suppor...
212
  	{ USB_DEVICE(0x13d3, 0x3474), .driver_info = BTUSB_ATH3012 },
d9f51b51d   Bala Shanmugam   Bluetooth: Add fi...
213

e9036e336   Cho, Yu-Chen   Bluetooth: Add At...
214
215
  	/* Atheros AR5BBU12 with sflash firmware */
  	{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
85d59726c   Michael Gruetzner   Bluetooth: Add su...
216
  	/* Atheros AR5BBU12 with sflash firmware */
bc21fde2d   Yevgeniy Melnichuk   Bluetooth: Add su...
217
  	{ USB_DEVICE(0x0489, 0xe036), .driver_info = BTUSB_ATH3012 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
218
  	{ USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
85d59726c   Michael Gruetzner   Bluetooth: Add su...
219

3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
220
  	/* QCA ROME chipset */
2054111b1   Wen-chien Jesse Sung   Bluetooth: btusb:...
221
  	{ USB_DEVICE(0x0cf3, 0xe007), .driver_info = BTUSB_QCA_ROME },
c9e44474f   Marcel Holtmann   Bluetooth: btusb:...
222
223
  	{ USB_DEVICE(0x0cf3, 0xe300), .driver_info = BTUSB_QCA_ROME },
  	{ USB_DEVICE(0x0cf3, 0xe360), .driver_info = BTUSB_QCA_ROME },
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
224

cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
225
  	/* Broadcom BCM2035 */
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
226
  	{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
0b8800623   Andy Shevchenko   Bluetooth: sort t...
227
228
  	{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
  	{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
229
230
  
  	/* Broadcom BCM2045 */
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
231
232
  	{ USB_DEVICE(0x0a5c, 0x2039), .driver_info = BTUSB_WRONG_SCO_MTU },
  	{ USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_WRONG_SCO_MTU },
bdbef3d69   Marcel Holtmann   [Bluetooth] Fix I...
233

cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
234
  	/* IBM/Lenovo ThinkPad with Broadcom chip */
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
235
236
  	{ USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_WRONG_SCO_MTU },
  	{ USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_WRONG_SCO_MTU },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
237
238
  
  	/* HP laptop with Broadcom chip */
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
239
  	{ USB_DEVICE(0x03f0, 0x171d), .driver_info = BTUSB_WRONG_SCO_MTU },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
240
241
  
  	/* Dell laptop with Broadcom chip */
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
242
  	{ USB_DEVICE(0x413c, 0x8126), .driver_info = BTUSB_WRONG_SCO_MTU },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
243

5ddd4a606   Marcel Holtmann   Bluetooth: Allow ...
244
  	/* Dell Wireless 370 and 410 devices */
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
245
  	{ USB_DEVICE(0x413c, 0x8152), .driver_info = BTUSB_WRONG_SCO_MTU },
5ddd4a606   Marcel Holtmann   Bluetooth: Allow ...
246
  	{ USB_DEVICE(0x413c, 0x8156), .driver_info = BTUSB_WRONG_SCO_MTU },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
247

7a9d40205   Marcel Holtmann   Bluetooth: Send H...
248
249
250
  	/* Belkin F8T012 and F8T013 devices */
  	{ USB_DEVICE(0x050d, 0x0012), .driver_info = BTUSB_WRONG_SCO_MTU },
  	{ USB_DEVICE(0x050d, 0x0013), .driver_info = BTUSB_WRONG_SCO_MTU },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
251

5ddd4a606   Marcel Holtmann   Bluetooth: Allow ...
252
253
254
255
256
  	/* Asus WL-BTD202 device */
  	{ USB_DEVICE(0x0b05, 0x1715), .driver_info = BTUSB_WRONG_SCO_MTU },
  
  	/* Kensington Bluetooth USB adapter */
  	{ USB_DEVICE(0x047d, 0x105e), .driver_info = BTUSB_WRONG_SCO_MTU },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
257
258
259
260
261
262
  	/* RTX Telecom based adapters with buggy SCO support */
  	{ USB_DEVICE(0x0400, 0x0807), .driver_info = BTUSB_BROKEN_ISOC },
  	{ USB_DEVICE(0x0400, 0x080a), .driver_info = BTUSB_BROKEN_ISOC },
  
  	/* CONWISE Technology based adapters with buggy SCO support */
  	{ USB_DEVICE(0x0e5e, 0x6622), .driver_info = BTUSB_BROKEN_ISOC },
4fcef8ed7   Marcel Holtmann   Bluetooth: Fix is...
263
  	/* Roper Class 1 Bluetooth Dongle (Silicon Wave based) */
2eeac8716   Aleksei Volkov   Bluetooth: btusb:...
264
  	{ USB_DEVICE(0x1310, 0x0001), .driver_info = BTUSB_SWAVE },
4fcef8ed7   Marcel Holtmann   Bluetooth: Fix is...
265

cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
266
267
268
269
270
  	/* Digianswer devices */
  	{ USB_DEVICE(0x08fd, 0x0001), .driver_info = BTUSB_DIGIANSWER },
  	{ USB_DEVICE(0x08fd, 0x0002), .driver_info = BTUSB_IGNORE },
  
  	/* CSR BlueCore Bluetooth Sniffer */
4f64fa807   Marcel Holtmann   Bluetooth: Use BT...
271
272
  	{ USB_DEVICE(0x0a12, 0x0002),
  	  .driver_info = BTUSB_SNIFFER | BTUSB_BROKEN_ISOC },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
273
274
  
  	/* Frontline ComProbe Bluetooth Sniffer */
4f64fa807   Marcel Holtmann   Bluetooth: Use BT...
275
276
  	{ USB_DEVICE(0x16d3, 0x0002),
  	  .driver_info = BTUSB_SNIFFER | BTUSB_BROKEN_ISOC },
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
277

cb1ee89f9   Marcel Holtmann   Bluetooth: btusb:...
278
279
280
  	/* Marvell Bluetooth devices */
  	{ USB_DEVICE(0x1286, 0x2044), .driver_info = BTUSB_MARVELL },
  	{ USB_DEVICE(0x1286, 0x2046), .driver_info = BTUSB_MARVELL },
d0ac9eb72   Marcel Holtmann   Bluetooth: btusb:...
281
  	/* Intel Bluetooth devices */
407550fe2   Marcel Holtmann   Bluetooth: btusb:...
282
  	{ USB_DEVICE(0x8087, 0x07da), .driver_info = BTUSB_CSR },
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
283
  	{ USB_DEVICE(0x8087, 0x07dc), .driver_info = BTUSB_INTEL },
ef4e5e4a7   Tedd Ho-Jeong An   Bluetooth: Add su...
284
  	{ USB_DEVICE(0x8087, 0x0a2a), .driver_info = BTUSB_INTEL },
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
285
  	{ USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW },
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
286

d0ac9eb72   Marcel Holtmann   Bluetooth: btusb:...
287
288
289
  	/* Other Intel Bluetooth devices */
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x8087, 0xe0, 0x01, 0x01),
  	  .driver_info = BTUSB_IGNORE },
ae8df494e   Amitkumar Karwar   Bluetooth: add pu...
290

a2698a9bf   Daniel Drake   Bluetooth: btusb:...
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
  	/* Realtek Bluetooth devices */
  	{ USB_VENDOR_AND_INTERFACE_INFO(0x0bda, 0xe0, 0x01, 0x01),
  	  .driver_info = BTUSB_REALTEK },
  
  	/* Additional Realtek 8723AE Bluetooth devices */
  	{ USB_DEVICE(0x0930, 0x021d), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x13d3, 0x3394), .driver_info = BTUSB_REALTEK },
  
  	/* Additional Realtek 8723BE Bluetooth devices */
  	{ USB_DEVICE(0x0489, 0xe085), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x0489, 0xe08b), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x13d3, 0x3410), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x13d3, 0x3416), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x13d3, 0x3459), .driver_info = BTUSB_REALTEK },
  
  	/* Additional Realtek 8821AE Bluetooth devices */
  	{ USB_DEVICE(0x0b05, 0x17dc), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x13d3, 0x3414), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x13d3, 0x3458), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x13d3, 0x3461), .driver_info = BTUSB_REALTEK },
  	{ USB_DEVICE(0x13d3, 0x3462), .driver_info = BTUSB_REALTEK },
4481c0767   Peter Poklop   Bluetooth: btusb:...
312
313
  	/* Silicon Wave based devices */
  	{ USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_SWAVE },
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
314
315
  	{ }	/* Terminating entry */
  };
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
316
  #define BTUSB_MAX_ISOC_FRAMES	10
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
317
318
  #define BTUSB_INTR_RUNNING	0
  #define BTUSB_BULK_RUNNING	1
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
319
  #define BTUSB_ISOC_RUNNING	2
7bee549e1   Oliver Neukum   Bluetooth: Add US...
320
  #define BTUSB_SUSPENDING	3
08b8b6c45   Gustavo F. Padovan   Bluetooth: Move b...
321
  #define BTUSB_DID_ISO_RESUME	4
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
322
323
  #define BTUSB_BOOTLOADER	5
  #define BTUSB_DOWNLOADING	6
ce6bb9297   Marcel Holtmann   Bluetooth: btusb:...
324
  #define BTUSB_FIRMWARE_LOADED	7
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
325
  #define BTUSB_FIRMWARE_FAILED	8
ce6bb9297   Marcel Holtmann   Bluetooth: btusb:...
326
  #define BTUSB_BOOTING		9
04b8c8143   Daniel Drake   Bluetooth: btusb:...
327
  #define BTUSB_RESET_RESUME	10
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
328
  #define BTUSB_DIAG_RUNNING	11
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
329
330
331
332
  
  struct btusb_data {
  	struct hci_dev       *hdev;
  	struct usb_device    *udev;
5fbcd260c   Marcel Holtmann   [Bluetooth] Fix U...
333
  	struct usb_interface *intf;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
334
  	struct usb_interface *isoc;
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
335
  	struct usb_interface *diag;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
336

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
337
338
339
  	unsigned long flags;
  
  	struct work_struct work;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
340
  	struct work_struct waker;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
341

803b58367   Marcel Holtmann   Bluetooth: btusb:...
342
  	struct usb_anchor deferred;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
343
  	struct usb_anchor tx_anchor;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
344
345
  	int tx_in_flight;
  	spinlock_t txlock;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
346
347
  	struct usb_anchor intr_anchor;
  	struct usb_anchor bulk_anchor;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
348
  	struct usb_anchor isoc_anchor;
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
349
  	struct usb_anchor diag_anchor;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
350
351
352
353
354
  	spinlock_t rxlock;
  
  	struct sk_buff *evt_skb;
  	struct sk_buff *acl_skb;
  	struct sk_buff *sco_skb;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
355
356
357
358
  
  	struct usb_endpoint_descriptor *intr_ep;
  	struct usb_endpoint_descriptor *bulk_tx_ep;
  	struct usb_endpoint_descriptor *bulk_rx_ep;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
359
360
  	struct usb_endpoint_descriptor *isoc_tx_ep;
  	struct usb_endpoint_descriptor *isoc_rx_ep;
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
361
362
  	struct usb_endpoint_descriptor *diag_tx_ep;
  	struct usb_endpoint_descriptor *diag_rx_ep;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
363

7a9d40205   Marcel Holtmann   Bluetooth: Send H...
364
  	__u8 cmdreq_type;
893ba5440   Marcel Holtmann   Bluetooth: btusb:...
365
  	__u8 cmdreq;
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
366

43c2e57f9   Marcel Holtmann   Bluetooth: Submit...
367
  	unsigned int sco_num;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
368
  	int isoc_altsetting;
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
369
  	int suspend_count;
2cbd3f5cc   Marcel Holtmann   Bluetooth: btusb:...
370

97307f51d   Marcel Holtmann   Bluetooth: btusb:...
371
  	int (*recv_event)(struct hci_dev *hdev, struct sk_buff *skb);
2cbd3f5cc   Marcel Holtmann   Bluetooth: btusb:...
372
  	int (*recv_bulk)(struct btusb_data *data, void *buffer, int count);
ace319825   Kim, Ben Young Tae   Bluetooth: btusb:...
373
374
  
  	int (*setup_on_usb)(struct hci_dev *hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
375
  };
803b58367   Marcel Holtmann   Bluetooth: btusb:...
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
  static inline void btusb_free_frags(struct btusb_data *data)
  {
  	unsigned long flags;
  
  	spin_lock_irqsave(&data->rxlock, flags);
  
  	kfree_skb(data->evt_skb);
  	data->evt_skb = NULL;
  
  	kfree_skb(data->acl_skb);
  	data->acl_skb = NULL;
  
  	kfree_skb(data->sco_skb);
  	data->sco_skb = NULL;
  
  	spin_unlock_irqrestore(&data->rxlock, flags);
  }
1ffa4ad04   Marcel Holtmann   Bluetooth: btusb:...
393
394
  static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count)
  {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
  	struct sk_buff *skb;
  	int err = 0;
  
  	spin_lock(&data->rxlock);
  	skb = data->evt_skb;
  
  	while (count) {
  		int len;
  
  		if (!skb) {
  			skb = bt_skb_alloc(HCI_MAX_EVENT_SIZE, GFP_ATOMIC);
  			if (!skb) {
  				err = -ENOMEM;
  				break;
  			}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
410
411
  			hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
  			hci_skb_expect(skb) = HCI_EVENT_HDR_SIZE;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
412
  		}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
413
  		len = min_t(uint, hci_skb_expect(skb), count);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
414
415
416
417
  		memcpy(skb_put(skb, len), buffer, len);
  
  		count -= len;
  		buffer += len;
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
418
  		hci_skb_expect(skb) -= len;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
419
420
421
  
  		if (skb->len == HCI_EVENT_HDR_SIZE) {
  			/* Complete event header */
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
422
  			hci_skb_expect(skb) = hci_event_hdr(skb)->plen;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
423

618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
424
  			if (skb_tailroom(skb) < hci_skb_expect(skb)) {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
425
426
427
428
429
430
431
  				kfree_skb(skb);
  				skb = NULL;
  
  				err = -EILSEQ;
  				break;
  			}
  		}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
432
  		if (!hci_skb_expect(skb)) {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
433
  			/* Complete frame */
97307f51d   Marcel Holtmann   Bluetooth: btusb:...
434
  			data->recv_event(data->hdev, skb);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
435
436
437
438
439
440
441
442
  			skb = NULL;
  		}
  	}
  
  	data->evt_skb = skb;
  	spin_unlock(&data->rxlock);
  
  	return err;
1ffa4ad04   Marcel Holtmann   Bluetooth: btusb:...
443
444
445
446
  }
  
  static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
  {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
  	struct sk_buff *skb;
  	int err = 0;
  
  	spin_lock(&data->rxlock);
  	skb = data->acl_skb;
  
  	while (count) {
  		int len;
  
  		if (!skb) {
  			skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
  			if (!skb) {
  				err = -ENOMEM;
  				break;
  			}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
462
463
  			hci_skb_pkt_type(skb) = HCI_ACLDATA_PKT;
  			hci_skb_expect(skb) = HCI_ACL_HDR_SIZE;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
464
  		}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
465
  		len = min_t(uint, hci_skb_expect(skb), count);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
466
467
468
469
  		memcpy(skb_put(skb, len), buffer, len);
  
  		count -= len;
  		buffer += len;
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
470
  		hci_skb_expect(skb) -= len;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
471
472
473
474
475
  
  		if (skb->len == HCI_ACL_HDR_SIZE) {
  			__le16 dlen = hci_acl_hdr(skb)->dlen;
  
  			/* Complete ACL header */
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
476
  			hci_skb_expect(skb) = __le16_to_cpu(dlen);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
477

618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
478
  			if (skb_tailroom(skb) < hci_skb_expect(skb)) {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
479
480
481
482
483
484
485
  				kfree_skb(skb);
  				skb = NULL;
  
  				err = -EILSEQ;
  				break;
  			}
  		}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
486
  		if (!hci_skb_expect(skb)) {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
487
488
489
490
491
492
493
494
495
496
  			/* Complete frame */
  			hci_recv_frame(data->hdev, skb);
  			skb = NULL;
  		}
  	}
  
  	data->acl_skb = skb;
  	spin_unlock(&data->rxlock);
  
  	return err;
1ffa4ad04   Marcel Holtmann   Bluetooth: btusb:...
497
498
499
500
  }
  
  static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count)
  {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
  	struct sk_buff *skb;
  	int err = 0;
  
  	spin_lock(&data->rxlock);
  	skb = data->sco_skb;
  
  	while (count) {
  		int len;
  
  		if (!skb) {
  			skb = bt_skb_alloc(HCI_MAX_SCO_SIZE, GFP_ATOMIC);
  			if (!skb) {
  				err = -ENOMEM;
  				break;
  			}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
516
517
  			hci_skb_pkt_type(skb) = HCI_SCODATA_PKT;
  			hci_skb_expect(skb) = HCI_SCO_HDR_SIZE;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
518
  		}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
519
  		len = min_t(uint, hci_skb_expect(skb), count);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
520
521
522
523
  		memcpy(skb_put(skb, len), buffer, len);
  
  		count -= len;
  		buffer += len;
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
524
  		hci_skb_expect(skb) -= len;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
525
526
527
  
  		if (skb->len == HCI_SCO_HDR_SIZE) {
  			/* Complete SCO header */
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
528
  			hci_skb_expect(skb) = hci_sco_hdr(skb)->dlen;
803b58367   Marcel Holtmann   Bluetooth: btusb:...
529

618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
530
  			if (skb_tailroom(skb) < hci_skb_expect(skb)) {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
531
532
533
534
535
536
537
  				kfree_skb(skb);
  				skb = NULL;
  
  				err = -EILSEQ;
  				break;
  			}
  		}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
538
  		if (!hci_skb_expect(skb)) {
803b58367   Marcel Holtmann   Bluetooth: btusb:...
539
540
541
542
543
544
545
546
547
548
  			/* Complete frame */
  			hci_recv_frame(data->hdev, skb);
  			skb = NULL;
  		}
  	}
  
  	data->sco_skb = skb;
  	spin_unlock(&data->rxlock);
  
  	return err;
1ffa4ad04   Marcel Holtmann   Bluetooth: btusb:...
549
  }
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
550
551
552
  static void btusb_intr_complete(struct urb *urb)
  {
  	struct hci_dev *hdev = urb->context;
155961e80   David Herrmann   Bluetooth: Remove...
553
  	struct btusb_data *data = hci_get_drvdata(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
554
  	int err;
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
555
556
  	BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
  	       urb->actual_length);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
557
558
559
560
561
  
  	if (!test_bit(HCI_RUNNING, &hdev->flags))
  		return;
  
  	if (urb->status == 0) {
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
562
  		hdev->stat.byte_rx += urb->actual_length;
1ffa4ad04   Marcel Holtmann   Bluetooth: btusb:...
563
564
  		if (btusb_recv_intr(data, urb->transfer_buffer,
  				    urb->actual_length) < 0) {
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
565
566
567
  			BT_ERR("%s corrupted event packet", hdev->name);
  			hdev->stat.err_rx++;
  		}
85560c4a8   Champion Chen   Bluetooth: Fix is...
568
569
570
  	} else if (urb->status == -ENOENT) {
  		/* Avoid suspend failed when usb_kill_urb */
  		return;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
571
572
573
574
  	}
  
  	if (!test_bit(BTUSB_INTR_RUNNING, &data->flags))
  		return;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
575
  	usb_mark_last_busy(data->udev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
576
577
578
579
  	usb_anchor_urb(urb, &data->intr_anchor);
  
  	err = usb_submit_urb(urb, GFP_ATOMIC);
  	if (err < 0) {
4935f1c16   Paul Bolle   Bluetooth: btusb:...
580
581
582
  		/* -EPERM: urb is being killed;
  		 * -ENODEV: device got disconnected */
  		if (err != -EPERM && err != -ENODEV)
61faddf66   Stefan Seyfried   Bluetooth: Fix lo...
583
  			BT_ERR("%s urb %p failed to resubmit (%d)",
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
584
  			       hdev->name, urb, -err);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
585
586
587
  		usb_unanchor_urb(urb);
  	}
  }
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
588
  static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
589
  {
155961e80   David Herrmann   Bluetooth: Remove...
590
  	struct btusb_data *data = hci_get_drvdata(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
591
592
593
594
595
596
  	struct urb *urb;
  	unsigned char *buf;
  	unsigned int pipe;
  	int err, size;
  
  	BT_DBG("%s", hdev->name);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
597
598
  	if (!data->intr_ep)
  		return -ENODEV;
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
599
  	urb = usb_alloc_urb(0, mem_flags);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
600
601
602
603
  	if (!urb)
  		return -ENOMEM;
  
  	size = le16_to_cpu(data->intr_ep->wMaxPacketSize);
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
604
  	buf = kmalloc(size, mem_flags);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
605
606
607
608
609
610
611
612
  	if (!buf) {
  		usb_free_urb(urb);
  		return -ENOMEM;
  	}
  
  	pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress);
  
  	usb_fill_int_urb(urb, data->udev, pipe, buf, size,
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
613
  			 btusb_intr_complete, hdev, data->intr_ep->bInterval);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
614
615
616
617
  
  	urb->transfer_flags |= URB_FREE_BUFFER;
  
  	usb_anchor_urb(urb, &data->intr_anchor);
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
618
  	err = usb_submit_urb(urb, mem_flags);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
619
  	if (err < 0) {
d4b8d1c9c   Paul Bolle   Bluetooth: btusb:...
620
621
  		if (err != -EPERM && err != -ENODEV)
  			BT_ERR("%s urb %p submission failed (%d)",
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
622
  			       hdev->name, urb, -err);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
623
  		usb_unanchor_urb(urb);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
624
625
626
627
628
629
630
631
632
633
  	}
  
  	usb_free_urb(urb);
  
  	return err;
  }
  
  static void btusb_bulk_complete(struct urb *urb)
  {
  	struct hci_dev *hdev = urb->context;
155961e80   David Herrmann   Bluetooth: Remove...
634
  	struct btusb_data *data = hci_get_drvdata(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
635
  	int err;
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
636
637
  	BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
  	       urb->actual_length);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
638
639
640
641
642
  
  	if (!test_bit(HCI_RUNNING, &hdev->flags))
  		return;
  
  	if (urb->status == 0) {
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
643
  		hdev->stat.byte_rx += urb->actual_length;
2cbd3f5cc   Marcel Holtmann   Bluetooth: btusb:...
644
  		if (data->recv_bulk(data, urb->transfer_buffer,
1ffa4ad04   Marcel Holtmann   Bluetooth: btusb:...
645
  				    urb->actual_length) < 0) {
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
646
647
648
  			BT_ERR("%s corrupted ACL packet", hdev->name);
  			hdev->stat.err_rx++;
  		}
85560c4a8   Champion Chen   Bluetooth: Fix is...
649
650
651
  	} else if (urb->status == -ENOENT) {
  		/* Avoid suspend failed when usb_kill_urb */
  		return;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
652
653
654
655
656
657
  	}
  
  	if (!test_bit(BTUSB_BULK_RUNNING, &data->flags))
  		return;
  
  	usb_anchor_urb(urb, &data->bulk_anchor);
652fd781a   Oliver Neukum   Bluetooth: Preven...
658
  	usb_mark_last_busy(data->udev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
659
660
661
  
  	err = usb_submit_urb(urb, GFP_ATOMIC);
  	if (err < 0) {
4935f1c16   Paul Bolle   Bluetooth: btusb:...
662
663
664
  		/* -EPERM: urb is being killed;
  		 * -ENODEV: device got disconnected */
  		if (err != -EPERM && err != -ENODEV)
61faddf66   Stefan Seyfried   Bluetooth: Fix lo...
665
  			BT_ERR("%s urb %p failed to resubmit (%d)",
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
666
  			       hdev->name, urb, -err);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
667
668
669
  		usb_unanchor_urb(urb);
  	}
  }
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
670
  static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
671
  {
155961e80   David Herrmann   Bluetooth: Remove...
672
  	struct btusb_data *data = hci_get_drvdata(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
673
674
675
  	struct urb *urb;
  	unsigned char *buf;
  	unsigned int pipe;
290ba2008   Vikram Kandukuri   Bluetooth: Improv...
676
  	int err, size = HCI_MAX_FRAME_SIZE;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
677
678
  
  	BT_DBG("%s", hdev->name);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
679
680
  	if (!data->bulk_rx_ep)
  		return -ENODEV;
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
681
  	urb = usb_alloc_urb(0, mem_flags);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
682
683
  	if (!urb)
  		return -ENOMEM;
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
684
  	buf = kmalloc(size, mem_flags);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
685
686
687
688
689
690
  	if (!buf) {
  		usb_free_urb(urb);
  		return -ENOMEM;
  	}
  
  	pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress);
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
691
692
  	usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
  			  btusb_bulk_complete, hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
693
694
  
  	urb->transfer_flags |= URB_FREE_BUFFER;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
695
  	usb_mark_last_busy(data->udev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
696
  	usb_anchor_urb(urb, &data->bulk_anchor);
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
697
  	err = usb_submit_urb(urb, mem_flags);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
698
  	if (err < 0) {
d4b8d1c9c   Paul Bolle   Bluetooth: btusb:...
699
700
  		if (err != -EPERM && err != -ENODEV)
  			BT_ERR("%s urb %p submission failed (%d)",
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
701
  			       hdev->name, urb, -err);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
702
  		usb_unanchor_urb(urb);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
703
704
705
706
707
708
  	}
  
  	usb_free_urb(urb);
  
  	return err;
  }
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
709
710
711
  static void btusb_isoc_complete(struct urb *urb)
  {
  	struct hci_dev *hdev = urb->context;
155961e80   David Herrmann   Bluetooth: Remove...
712
  	struct btusb_data *data = hci_get_drvdata(hdev);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
713
  	int i, err;
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
714
715
  	BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
  	       urb->actual_length);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
716
717
718
719
720
721
722
723
724
725
726
727
728
  
  	if (!test_bit(HCI_RUNNING, &hdev->flags))
  		return;
  
  	if (urb->status == 0) {
  		for (i = 0; i < urb->number_of_packets; i++) {
  			unsigned int offset = urb->iso_frame_desc[i].offset;
  			unsigned int length = urb->iso_frame_desc[i].actual_length;
  
  			if (urb->iso_frame_desc[i].status)
  				continue;
  
  			hdev->stat.byte_rx += length;
1ffa4ad04   Marcel Holtmann   Bluetooth: btusb:...
729
730
  			if (btusb_recv_isoc(data, urb->transfer_buffer + offset,
  					    length) < 0) {
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
731
732
733
734
  				BT_ERR("%s corrupted SCO packet", hdev->name);
  				hdev->stat.err_rx++;
  			}
  		}
85560c4a8   Champion Chen   Bluetooth: Fix is...
735
736
737
  	} else if (urb->status == -ENOENT) {
  		/* Avoid suspend failed when usb_kill_urb */
  		return;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
738
739
740
741
742
743
744
745
746
  	}
  
  	if (!test_bit(BTUSB_ISOC_RUNNING, &data->flags))
  		return;
  
  	usb_anchor_urb(urb, &data->isoc_anchor);
  
  	err = usb_submit_urb(urb, GFP_ATOMIC);
  	if (err < 0) {
4935f1c16   Paul Bolle   Bluetooth: btusb:...
747
748
749
  		/* -EPERM: urb is being killed;
  		 * -ENODEV: device got disconnected */
  		if (err != -EPERM && err != -ENODEV)
61faddf66   Stefan Seyfried   Bluetooth: Fix lo...
750
  			BT_ERR("%s urb %p failed to resubmit (%d)",
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
751
  			       hdev->name, urb, -err);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
752
753
754
  		usb_unanchor_urb(urb);
  	}
  }
42b16b3fb   Jesper Juhl   Kill off warning:...
755
  static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
  {
  	int i, offset = 0;
  
  	BT_DBG("len %d mtu %d", len, mtu);
  
  	for (i = 0; i < BTUSB_MAX_ISOC_FRAMES && len >= mtu;
  					i++, offset += mtu, len -= mtu) {
  		urb->iso_frame_desc[i].offset = offset;
  		urb->iso_frame_desc[i].length = mtu;
  	}
  
  	if (len && i < BTUSB_MAX_ISOC_FRAMES) {
  		urb->iso_frame_desc[i].offset = offset;
  		urb->iso_frame_desc[i].length = len;
  		i++;
  	}
  
  	urb->number_of_packets = i;
  }
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
775
  static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
776
  {
155961e80   David Herrmann   Bluetooth: Remove...
777
  	struct btusb_data *data = hci_get_drvdata(hdev);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
778
779
780
781
782
783
784
785
786
  	struct urb *urb;
  	unsigned char *buf;
  	unsigned int pipe;
  	int err, size;
  
  	BT_DBG("%s", hdev->name);
  
  	if (!data->isoc_rx_ep)
  		return -ENODEV;
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
787
  	urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, mem_flags);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
788
789
790
791
792
  	if (!urb)
  		return -ENOMEM;
  
  	size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *
  						BTUSB_MAX_ISOC_FRAMES;
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
793
  	buf = kmalloc(size, mem_flags);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
794
795
796
797
798
799
  	if (!buf) {
  		usb_free_urb(urb);
  		return -ENOMEM;
  	}
  
  	pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress);
fa0fb93f2   Bing Zhao   Bluetooth: btusb:...
800
  	usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete,
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
801
  			 hdev, data->isoc_rx_ep->bInterval);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
802

89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
803
  	urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
804
805
  
  	__fill_isoc_descriptor(urb, size,
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
806
  			       le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize));
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
807
808
  
  	usb_anchor_urb(urb, &data->isoc_anchor);
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
809
  	err = usb_submit_urb(urb, mem_flags);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
810
  	if (err < 0) {
d4b8d1c9c   Paul Bolle   Bluetooth: btusb:...
811
812
  		if (err != -EPERM && err != -ENODEV)
  			BT_ERR("%s urb %p submission failed (%d)",
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
813
  			       hdev->name, urb, -err);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
814
  		usb_unanchor_urb(urb);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
815
816
817
818
819
820
  	}
  
  	usb_free_urb(urb);
  
  	return err;
  }
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
  static void btusb_diag_complete(struct urb *urb)
  {
  	struct hci_dev *hdev = urb->context;
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	int err;
  
  	BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
  	       urb->actual_length);
  
  	if (urb->status == 0) {
  		struct sk_buff *skb;
  
  		skb = bt_skb_alloc(urb->actual_length, GFP_ATOMIC);
  		if (skb) {
  			memcpy(skb_put(skb, urb->actual_length),
  			       urb->transfer_buffer, urb->actual_length);
  			hci_recv_diag(hdev, skb);
  		}
  	} else if (urb->status == -ENOENT) {
  		/* Avoid suspend failed when usb_kill_urb */
  		return;
  	}
  
  	if (!test_bit(BTUSB_DIAG_RUNNING, &data->flags))
  		return;
  
  	usb_anchor_urb(urb, &data->diag_anchor);
  	usb_mark_last_busy(data->udev);
  
  	err = usb_submit_urb(urb, GFP_ATOMIC);
  	if (err < 0) {
  		/* -EPERM: urb is being killed;
  		 * -ENODEV: device got disconnected */
  		if (err != -EPERM && err != -ENODEV)
  			BT_ERR("%s urb %p failed to resubmit (%d)",
  			       hdev->name, urb, -err);
  		usb_unanchor_urb(urb);
  	}
  }
  
  static int btusb_submit_diag_urb(struct hci_dev *hdev, gfp_t mem_flags)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	struct urb *urb;
  	unsigned char *buf;
  	unsigned int pipe;
  	int err, size = HCI_MAX_FRAME_SIZE;
  
  	BT_DBG("%s", hdev->name);
  
  	if (!data->diag_rx_ep)
  		return -ENODEV;
  
  	urb = usb_alloc_urb(0, mem_flags);
  	if (!urb)
  		return -ENOMEM;
  
  	buf = kmalloc(size, mem_flags);
  	if (!buf) {
  		usb_free_urb(urb);
  		return -ENOMEM;
  	}
  
  	pipe = usb_rcvbulkpipe(data->udev, data->diag_rx_ep->bEndpointAddress);
  
  	usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
  			  btusb_diag_complete, hdev);
  
  	urb->transfer_flags |= URB_FREE_BUFFER;
  
  	usb_mark_last_busy(data->udev);
  	usb_anchor_urb(urb, &data->diag_anchor);
  
  	err = usb_submit_urb(urb, mem_flags);
  	if (err < 0) {
  		if (err != -EPERM && err != -ENODEV)
  			BT_ERR("%s urb %p submission failed (%d)",
  			       hdev->name, urb, -err);
  		usb_unanchor_urb(urb);
  	}
  
  	usb_free_urb(urb);
  
  	return err;
  }
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
906
907
908
  static void btusb_tx_complete(struct urb *urb)
  {
  	struct sk_buff *skb = urb->context;
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
909
  	struct hci_dev *hdev = (struct hci_dev *)skb->dev;
155961e80   David Herrmann   Bluetooth: Remove...
910
  	struct btusb_data *data = hci_get_drvdata(hdev);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
911

89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
912
913
  	BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
  	       urb->actual_length);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
  
  	if (!test_bit(HCI_RUNNING, &hdev->flags))
  		goto done;
  
  	if (!urb->status)
  		hdev->stat.byte_tx += urb->transfer_buffer_length;
  	else
  		hdev->stat.err_tx++;
  
  done:
  	spin_lock(&data->txlock);
  	data->tx_in_flight--;
  	spin_unlock(&data->txlock);
  
  	kfree(urb->setup_packet);
  
  	kfree_skb(skb);
  }
  
  static void btusb_isoc_tx_complete(struct urb *urb)
  {
  	struct sk_buff *skb = urb->context;
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
936
  	struct hci_dev *hdev = (struct hci_dev *)skb->dev;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
937

89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
938
939
  	BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
  	       urb->actual_length);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
  
  	if (!test_bit(HCI_RUNNING, &hdev->flags))
  		goto done;
  
  	if (!urb->status)
  		hdev->stat.byte_tx += urb->transfer_buffer_length;
  	else
  		hdev->stat.err_tx++;
  
  done:
  	kfree(urb->setup_packet);
  
  	kfree_skb(skb);
  }
  
  static int btusb_open(struct hci_dev *hdev)
  {
155961e80   David Herrmann   Bluetooth: Remove...
957
  	struct btusb_data *data = hci_get_drvdata(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
958
959
960
  	int err;
  
  	BT_DBG("%s", hdev->name);
ace319825   Kim, Ben Young Tae   Bluetooth: btusb:...
961
962
963
964
965
  	/* Patching USB firmware files prior to starting any URBs of HCI path
  	 * It is more safe to use USB bulk channel for downloading USB patch
  	 */
  	if (data->setup_on_usb) {
  		err = data->setup_on_usb(hdev);
eb50042fd   Marcel Holtmann   Bluetooth: btusb:...
966
  		if (err < 0)
ace319825   Kim, Ben Young Tae   Bluetooth: btusb:...
967
968
  			return err;
  	}
7bee549e1   Oliver Neukum   Bluetooth: Add US...
969
970
971
972
973
  	err = usb_autopm_get_interface(data->intf);
  	if (err < 0)
  		return err;
  
  	data->intf->needs_remote_wakeup = 1;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
974
  	if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
7bee549e1   Oliver Neukum   Bluetooth: Add US...
975
  		goto done;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
976

2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
977
  	err = btusb_submit_intr_urb(hdev, GFP_KERNEL);
43c2e57f9   Marcel Holtmann   Bluetooth: Submit...
978
979
980
981
  	if (err < 0)
  		goto failed;
  
  	err = btusb_submit_bulk_urb(hdev, GFP_KERNEL);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
982
  	if (err < 0) {
43c2e57f9   Marcel Holtmann   Bluetooth: Submit...
983
984
  		usb_kill_anchored_urbs(&data->intr_anchor);
  		goto failed;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
985
  	}
43c2e57f9   Marcel Holtmann   Bluetooth: Submit...
986
987
  	set_bit(BTUSB_BULK_RUNNING, &data->flags);
  	btusb_submit_bulk_urb(hdev, GFP_KERNEL);
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
988
989
990
991
  	if (data->diag) {
  		if (!btusb_submit_diag_urb(hdev, GFP_KERNEL))
  			set_bit(BTUSB_DIAG_RUNNING, &data->flags);
  	}
7bee549e1   Oliver Neukum   Bluetooth: Add US...
992
993
  done:
  	usb_autopm_put_interface(data->intf);
43c2e57f9   Marcel Holtmann   Bluetooth: Submit...
994
995
996
997
  	return 0;
  
  failed:
  	clear_bit(BTUSB_INTR_RUNNING, &data->flags);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
998
  	usb_autopm_put_interface(data->intf);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
999
1000
  	return err;
  }
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1001
1002
1003
1004
1005
  static void btusb_stop_traffic(struct btusb_data *data)
  {
  	usb_kill_anchored_urbs(&data->intr_anchor);
  	usb_kill_anchored_urbs(&data->bulk_anchor);
  	usb_kill_anchored_urbs(&data->isoc_anchor);
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
1006
  	usb_kill_anchored_urbs(&data->diag_anchor);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1007
  }
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1008
1009
  static int btusb_close(struct hci_dev *hdev)
  {
155961e80   David Herrmann   Bluetooth: Remove...
1010
  	struct btusb_data *data = hci_get_drvdata(hdev);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1011
  	int err;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1012
1013
  
  	BT_DBG("%s", hdev->name);
e8c3c3d22   Marcel Holtmann   [Bluetooth] Fix w...
1014
  	cancel_work_sync(&data->work);
404291ac9   Linus Torvalds   btusb bluetooth d...
1015
  	cancel_work_sync(&data->waker);
e8c3c3d22   Marcel Holtmann   [Bluetooth] Fix w...
1016

9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1017
  	clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1018
  	clear_bit(BTUSB_BULK_RUNNING, &data->flags);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1019
  	clear_bit(BTUSB_INTR_RUNNING, &data->flags);
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
1020
  	clear_bit(BTUSB_DIAG_RUNNING, &data->flags);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1021
1022
  
  	btusb_stop_traffic(data);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
1023
  	btusb_free_frags(data);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1024
1025
  	err = usb_autopm_get_interface(data->intf);
  	if (err < 0)
7b8e2c1db   Oliver Neukum   fix memory leak i...
1026
  		goto failed;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1027
1028
1029
  
  	data->intf->needs_remote_wakeup = 0;
  	usb_autopm_put_interface(data->intf);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1030

7b8e2c1db   Oliver Neukum   fix memory leak i...
1031
1032
  failed:
  	usb_scuttle_anchored_urbs(&data->deferred);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1033
1034
1035
1036
1037
  	return 0;
  }
  
  static int btusb_flush(struct hci_dev *hdev)
  {
155961e80   David Herrmann   Bluetooth: Remove...
1038
  	struct btusb_data *data = hci_get_drvdata(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1039
1040
1041
1042
  
  	BT_DBG("%s", hdev->name);
  
  	usb_kill_anchored_urbs(&data->tx_anchor);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
1043
  	btusb_free_frags(data);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1044
1045
1046
  
  	return 0;
  }
047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1047
  static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb)
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1048
  {
155961e80   David Herrmann   Bluetooth: Remove...
1049
  	struct btusb_data *data = hci_get_drvdata(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1050
1051
1052
  	struct usb_ctrlrequest *dr;
  	struct urb *urb;
  	unsigned int pipe;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1053

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1054
1055
1056
  	urb = usb_alloc_urb(0, GFP_KERNEL);
  	if (!urb)
  		return ERR_PTR(-ENOMEM);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1057

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1058
1059
1060
1061
1062
  	dr = kmalloc(sizeof(*dr), GFP_KERNEL);
  	if (!dr) {
  		usb_free_urb(urb);
  		return ERR_PTR(-ENOMEM);
  	}
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1063

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1064
  	dr->bRequestType = data->cmdreq_type;
893ba5440   Marcel Holtmann   Bluetooth: btusb:...
1065
  	dr->bRequest     = data->cmdreq;
047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1066
1067
1068
  	dr->wIndex       = 0;
  	dr->wValue       = 0;
  	dr->wLength      = __cpu_to_le16(skb->len);
7bd8f09f6   Marcel Holtmann   Bluetooth: Add hd...
1069

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1070
  	pipe = usb_sndctrlpipe(data->udev, 0x00);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1071

89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
1072
  	usb_fill_control_urb(urb, data->udev, pipe, (void *)dr,
047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1073
  			     skb->data, skb->len, btusb_tx_complete, skb);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1074

89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
1075
  	skb->dev = (void *)hdev;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1076

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1077
1078
  	return urb;
  }
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1079

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1080
1081
1082
1083
1084
  static struct urb *alloc_bulk_urb(struct hci_dev *hdev, struct sk_buff *skb)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	struct urb *urb;
  	unsigned int pipe;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1085

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1086
1087
  	if (!data->bulk_tx_ep)
  		return ERR_PTR(-ENODEV);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1088

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1089
1090
1091
  	urb = usb_alloc_urb(0, GFP_KERNEL);
  	if (!urb)
  		return ERR_PTR(-ENOMEM);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1092

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1093
  	pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1094

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1095
1096
  	usb_fill_bulk_urb(urb, data->udev, pipe,
  			  skb->data, skb->len, btusb_tx_complete, skb);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1097

89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
1098
  	skb->dev = (void *)hdev;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1099

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1100
1101
  	return urb;
  }
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1102

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1103
1104
1105
1106
1107
  static struct urb *alloc_isoc_urb(struct hci_dev *hdev, struct sk_buff *skb)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	struct urb *urb;
  	unsigned int pipe;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1108

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1109
1110
  	if (!data->isoc_tx_ep)
  		return ERR_PTR(-ENODEV);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1111

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1112
1113
1114
  	urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL);
  	if (!urb)
  		return ERR_PTR(-ENOMEM);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1115

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1116
  	pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1117

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1118
1119
1120
  	usb_fill_int_urb(urb, data->udev, pipe,
  			 skb->data, skb->len, btusb_isoc_tx_complete,
  			 skb, data->isoc_tx_ep->bInterval);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1121

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1122
  	urb->transfer_flags  = URB_ISO_ASAP;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1123

047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1124
1125
  	__fill_isoc_descriptor(urb, skb->len,
  			       le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1126

89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
1127
  	skb->dev = (void *)hdev;
047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1128
1129
1130
1131
1132
1133
1134
1135
  
  	return urb;
  }
  
  static int submit_tx_urb(struct hci_dev *hdev, struct urb *urb)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	int err;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1136

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1137
  	usb_anchor_urb(urb, &data->tx_anchor);
e9753eff1   Johan Hedberg   Bluetooth: btusb:...
1138
  	err = usb_submit_urb(urb, GFP_KERNEL);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1139
  	if (err < 0) {
5a9b80e2c   Paul Bolle   Bluetooth: btusb:...
1140
1141
  		if (err != -EPERM && err != -ENODEV)
  			BT_ERR("%s urb %p submission failed (%d)",
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
1142
  			       hdev->name, urb, -err);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1143
1144
  		kfree(urb->setup_packet);
  		usb_unanchor_urb(urb);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1145
1146
  	} else {
  		usb_mark_last_busy(data->udev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1147
  	}
54a8a79c5   Cong Wang   btusb: fix a memo...
1148
  	usb_free_urb(urb);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1149
1150
  	return err;
  }
047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
  static int submit_or_queue_tx_urb(struct hci_dev *hdev, struct urb *urb)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	unsigned long flags;
  	bool suspending;
  
  	spin_lock_irqsave(&data->txlock, flags);
  	suspending = test_bit(BTUSB_SUSPENDING, &data->flags);
  	if (!suspending)
  		data->tx_in_flight++;
  	spin_unlock_irqrestore(&data->txlock, flags);
  
  	if (!suspending)
  		return submit_tx_urb(hdev, urb);
  
  	usb_anchor_urb(urb, &data->deferred);
  	schedule_work(&data->waker);
  
  	usb_free_urb(urb);
  	return 0;
  }
  
  static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
  {
  	struct urb *urb;
  
  	BT_DBG("%s", hdev->name);
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
1178
  	switch (hci_skb_pkt_type(skb)) {
047b2ec8d   Marcel Holtmann   Bluetooth: btusb:...
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
  	case HCI_COMMAND_PKT:
  		urb = alloc_ctrl_urb(hdev, skb);
  		if (IS_ERR(urb))
  			return PTR_ERR(urb);
  
  		hdev->stat.cmd_tx++;
  		return submit_or_queue_tx_urb(hdev, urb);
  
  	case HCI_ACLDATA_PKT:
  		urb = alloc_bulk_urb(hdev, skb);
  		if (IS_ERR(urb))
  			return PTR_ERR(urb);
  
  		hdev->stat.acl_tx++;
  		return submit_or_queue_tx_urb(hdev, urb);
  
  	case HCI_SCODATA_PKT:
  		if (hci_conn_num(hdev, SCO_LINK) < 1)
  			return -ENODEV;
  
  		urb = alloc_isoc_urb(hdev, skb);
  		if (IS_ERR(urb))
  			return PTR_ERR(urb);
  
  		hdev->stat.sco_tx++;
  		return submit_tx_urb(hdev, urb);
  	}
  
  	return -EILSEQ;
  }
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1209
1210
  static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
  {
155961e80   David Herrmann   Bluetooth: Remove...
1211
  	struct btusb_data *data = hci_get_drvdata(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1212
1213
  
  	BT_DBG("%s evt %d", hdev->name, evt);
014f7bc78   Marcel Holtmann   Bluetooth: Use hc...
1214
1215
  	if (hci_conn_num(hdev, SCO_LINK) != data->sco_num) {
  		data->sco_num = hci_conn_num(hdev, SCO_LINK);
43c2e57f9   Marcel Holtmann   Bluetooth: Submit...
1216
  		schedule_work(&data->work);
a780efa81   Marcel Holtmann   Bluetooth: Handle...
1217
  	}
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1218
  }
42b16b3fb   Jesper Juhl   Kill off warning:...
1219
  static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting)
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1220
  {
155961e80   David Herrmann   Bluetooth: Remove...
1221
  	struct btusb_data *data = hci_get_drvdata(hdev);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
  	struct usb_interface *intf = data->isoc;
  	struct usb_endpoint_descriptor *ep_desc;
  	int i, err;
  
  	if (!data->isoc)
  		return -ENODEV;
  
  	err = usb_set_interface(data->udev, 1, altsetting);
  	if (err < 0) {
  		BT_ERR("%s setting interface failed (%d)", hdev->name, -err);
  		return err;
  	}
  
  	data->isoc_altsetting = altsetting;
  
  	data->isoc_tx_ep = NULL;
  	data->isoc_rx_ep = NULL;
  
  	for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
  		ep_desc = &intf->cur_altsetting->endpoint[i].desc;
  
  		if (!data->isoc_tx_ep && usb_endpoint_is_isoc_out(ep_desc)) {
  			data->isoc_tx_ep = ep_desc;
  			continue;
  		}
  
  		if (!data->isoc_rx_ep && usb_endpoint_is_isoc_in(ep_desc)) {
  			data->isoc_rx_ep = ep_desc;
  			continue;
  		}
  	}
  
  	if (!data->isoc_tx_ep || !data->isoc_rx_ep) {
  		BT_ERR("%s invalid SCO descriptors", hdev->name);
  		return -ENODEV;
  	}
  
  	return 0;
  }
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1261
1262
1263
1264
  static void btusb_work(struct work_struct *work)
  {
  	struct btusb_data *data = container_of(work, struct btusb_data, work);
  	struct hci_dev *hdev = data->hdev;
f4001d284   Mikel Astiz   Bluetooth: btusb:...
1265
  	int new_alts;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1266
  	int err;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1267

014f7bc78   Marcel Holtmann   Bluetooth: Use hc...
1268
  	if (data->sco_num > 0) {
08b8b6c45   Gustavo F. Padovan   Bluetooth: Move b...
1269
  		if (!test_bit(BTUSB_DID_ISO_RESUME, &data->flags)) {
8efdd0cdc   Oliver Neukum   Bluetooth: fix cr...
1270
  			err = usb_autopm_get_interface(data->isoc ? data->isoc : data->intf);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1271
1272
1273
1274
1275
  			if (err < 0) {
  				clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
  				usb_kill_anchored_urbs(&data->isoc_anchor);
  				return;
  			}
08b8b6c45   Gustavo F. Padovan   Bluetooth: Move b...
1276
  			set_bit(BTUSB_DID_ISO_RESUME, &data->flags);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1277
  		}
f4001d284   Mikel Astiz   Bluetooth: btusb:...
1278
1279
1280
  
  		if (hdev->voice_setting & 0x0020) {
  			static const int alts[3] = { 2, 4, 5 };
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
1281

014f7bc78   Marcel Holtmann   Bluetooth: Use hc...
1282
  			new_alts = alts[data->sco_num - 1];
f4001d284   Mikel Astiz   Bluetooth: btusb:...
1283
  		} else {
014f7bc78   Marcel Holtmann   Bluetooth: Use hc...
1284
  			new_alts = data->sco_num;
f4001d284   Mikel Astiz   Bluetooth: btusb:...
1285
1286
1287
  		}
  
  		if (data->isoc_altsetting != new_alts) {
f6fc86f2c   Kuba Pawlak   Bluetooth: Fix po...
1288
  			unsigned long flags;
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1289
1290
  			clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
  			usb_kill_anchored_urbs(&data->isoc_anchor);
8f9d02f47   Kuba Pawlak   Bluetooth: Remove...
1291
1292
1293
1294
1295
1296
1297
1298
1299
  			/* When isochronous alternate setting needs to be
  			 * changed, because SCO connection has been added
  			 * or removed, a packet fragment may be left in the
  			 * reassembling state. This could lead to wrongly
  			 * assembled fragments.
  			 *
  			 * Clear outstanding fragment when selecting a new
  			 * alternate setting.
  			 */
f6fc86f2c   Kuba Pawlak   Bluetooth: Fix po...
1300
  			spin_lock_irqsave(&data->rxlock, flags);
8f9d02f47   Kuba Pawlak   Bluetooth: Remove...
1301
1302
  			kfree_skb(data->sco_skb);
  			data->sco_skb = NULL;
f6fc86f2c   Kuba Pawlak   Bluetooth: Fix po...
1303
  			spin_unlock_irqrestore(&data->rxlock, flags);
8f9d02f47   Kuba Pawlak   Bluetooth: Remove...
1304

f4001d284   Mikel Astiz   Bluetooth: btusb:...
1305
  			if (__set_isoc_interface(hdev, new_alts) < 0)
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1306
1307
1308
1309
  				return;
  		}
  
  		if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
1310
  			if (btusb_submit_isoc_urb(hdev, GFP_KERNEL) < 0)
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1311
1312
  				clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
  			else
2eda66f4a   Marcel Holtmann   Bluetooth: Add fi...
1313
  				btusb_submit_isoc_urb(hdev, GFP_KERNEL);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
1314
1315
1316
1317
1318
1319
  		}
  	} else {
  		clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
  		usb_kill_anchored_urbs(&data->isoc_anchor);
  
  		__set_isoc_interface(hdev, 0);
08b8b6c45   Gustavo F. Padovan   Bluetooth: Move b...
1320
  		if (test_and_clear_bit(BTUSB_DID_ISO_RESUME, &data->flags))
8efdd0cdc   Oliver Neukum   Bluetooth: fix cr...
1321
  			usb_autopm_put_interface(data->isoc ? data->isoc : data->intf);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
1322
1323
  	}
  }
7bee549e1   Oliver Neukum   Bluetooth: Add US...
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
  static void btusb_waker(struct work_struct *work)
  {
  	struct btusb_data *data = container_of(work, struct btusb_data, waker);
  	int err;
  
  	err = usb_autopm_get_interface(data->intf);
  	if (err < 0)
  		return;
  
  	usb_autopm_put_interface(data->intf);
  }
9f8f962c8   Marcel Holtmann   Bluetooth: Use se...
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
  static int btusb_setup_bcm92035(struct hci_dev *hdev)
  {
  	struct sk_buff *skb;
  	u8 val = 0x00;
  
  	BT_DBG("%s", hdev->name);
  
  	skb = __hci_cmd_sync(hdev, 0xfc3b, 1, &val, HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb))
  		BT_ERR("BCM92035 command failed (%ld)", -PTR_ERR(skb));
  	else
  		kfree_skb(skb);
  
  	return 0;
  }
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
1350
1351
1352
1353
  static int btusb_setup_csr(struct hci_dev *hdev)
  {
  	struct hci_rp_read_local_version *rp;
  	struct sk_buff *skb;
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
1354
1355
  
  	BT_DBG("%s", hdev->name);
7cd84d720   Marcel Holtmann   Bluetooth: btusb:...
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
  	skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL,
  			     HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb)) {
  		int err = PTR_ERR(skb);
  		BT_ERR("%s: CSR: Local version failed (%d)", hdev->name, err);
  		return err;
  	}
  
  	if (skb->len != sizeof(struct hci_rp_read_local_version)) {
  		BT_ERR("%s: CSR: Local version length mismatch", hdev->name);
  		kfree_skb(skb);
  		return -EIO;
  	}
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
1369

89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
1370
  	rp = (struct hci_rp_read_local_version *)skb->data;
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
1371

6cafcd959   Johan Hedberg   Bluetooth: btusb:...
1372
1373
1374
  	/* Detect controllers which aren't real CSR ones. */
  	if (le16_to_cpu(rp->manufacturer) != 10 ||
  	    le16_to_cpu(rp->lmp_subver) == 0x0c5c) {
9641d3435   Marcel Holtmann   Bluetooth: btusb:...
1375
1376
1377
1378
  		/* Clear the reset quirk since this is not an actual
  		 * early Bluetooth 1.1 device from CSR.
  		 */
  		clear_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
1379

9641d3435   Marcel Holtmann   Bluetooth: btusb:...
1380
1381
1382
1383
1384
  		/* These fake CSR controllers have all a broken
  		 * stored link key handling and so just disable it.
  		 */
  		set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
  	}
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
1385
1386
  
  	kfree_skb(skb);
9641d3435   Marcel Holtmann   Bluetooth: btusb:...
1387
  	return 0;
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
1388
  }
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1389
  static const struct firmware *btusb_setup_intel_get_fw(struct hci_dev *hdev,
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
1390
  						       struct intel_version *ver)
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
  {
  	const struct firmware *fw;
  	char fwname[64];
  	int ret;
  
  	snprintf(fwname, sizeof(fwname),
  		 "intel/ibt-hw-%x.%x.%x-fw-%x.%x.%x.%x.%x.bseq",
  		 ver->hw_platform, ver->hw_variant, ver->hw_revision,
  		 ver->fw_variant,  ver->fw_revision, ver->fw_build_num,
  		 ver->fw_build_ww, ver->fw_build_yy);
  
  	ret = request_firmware(&fw, fwname, &hdev->dev);
  	if (ret < 0) {
  		if (ret == -EINVAL) {
  			BT_ERR("%s Intel firmware file request failed (%d)",
  			       hdev->name, ret);
  			return NULL;
  		}
  
  		BT_ERR("%s failed to open Intel firmware file: %s(%d)",
  		       hdev->name, fwname, ret);
  
  		/* If the correct firmware patch file is not found, use the
  		 * default firmware patch file instead
  		 */
  		snprintf(fwname, sizeof(fwname), "intel/ibt-hw-%x.%x.bseq",
  			 ver->hw_platform, ver->hw_variant);
  		if (request_firmware(&fw, fwname, &hdev->dev) < 0) {
  			BT_ERR("%s failed to open default Intel fw file: %s",
  			       hdev->name, fwname);
  			return NULL;
  		}
  	}
  
  	BT_INFO("%s: Intel Bluetooth firmware file: %s", hdev->name, fwname);
  
  	return fw;
  }
  
  static int btusb_setup_intel_patching(struct hci_dev *hdev,
  				      const struct firmware *fw,
  				      const u8 **fw_ptr, int *disable_patch)
  {
  	struct sk_buff *skb;
  	struct hci_command_hdr *cmd;
  	const u8 *cmd_param;
  	struct hci_event_hdr *evt = NULL;
  	const u8 *evt_param = NULL;
  	int remain = fw->size - (*fw_ptr - fw->data);
  
  	/* The first byte indicates the types of the patch command or event.
  	 * 0x01 means HCI command and 0x02 is HCI event. If the first bytes
  	 * in the current firmware buffer doesn't start with 0x01 or
  	 * the size of remain buffer is smaller than HCI command header,
  	 * the firmware file is corrupted and it should stop the patching
  	 * process.
  	 */
  	if (remain > HCI_COMMAND_HDR_SIZE && *fw_ptr[0] != 0x01) {
  		BT_ERR("%s Intel fw corrupted: invalid cmd read", hdev->name);
  		return -EINVAL;
  	}
  	(*fw_ptr)++;
  	remain--;
  
  	cmd = (struct hci_command_hdr *)(*fw_ptr);
  	*fw_ptr += sizeof(*cmd);
  	remain -= sizeof(*cmd);
  
  	/* Ensure that the remain firmware data is long enough than the length
  	 * of command parameter. If not, the firmware file is corrupted.
  	 */
  	if (remain < cmd->plen) {
  		BT_ERR("%s Intel fw corrupted: invalid cmd len", hdev->name);
  		return -EFAULT;
  	}
  
  	/* If there is a command that loads a patch in the firmware
  	 * file, then enable the patch upon success, otherwise just
  	 * disable the manufacturer mode, for example patch activation
  	 * is not required when the default firmware patch file is used
  	 * because there are no patch data to load.
  	 */
  	if (*disable_patch && le16_to_cpu(cmd->opcode) == 0xfc8e)
  		*disable_patch = 0;
  
  	cmd_param = *fw_ptr;
  	*fw_ptr += cmd->plen;
  	remain -= cmd->plen;
  
  	/* This reads the expected events when the above command is sent to the
  	 * device. Some vendor commands expects more than one events, for
  	 * example command status event followed by vendor specific event.
  	 * For this case, it only keeps the last expected event. so the command
  	 * can be sent with __hci_cmd_sync_ev() which returns the sk_buff of
  	 * last expected event.
  	 */
  	while (remain > HCI_EVENT_HDR_SIZE && *fw_ptr[0] == 0x02) {
  		(*fw_ptr)++;
  		remain--;
  
  		evt = (struct hci_event_hdr *)(*fw_ptr);
  		*fw_ptr += sizeof(*evt);
  		remain -= sizeof(*evt);
  
  		if (remain < evt->plen) {
  			BT_ERR("%s Intel fw corrupted: invalid evt len",
  			       hdev->name);
  			return -EFAULT;
  		}
  
  		evt_param = *fw_ptr;
  		*fw_ptr += evt->plen;
  		remain -= evt->plen;
  	}
  
  	/* Every HCI commands in the firmware file has its correspond event.
  	 * If event is not found or remain is smaller than zero, the firmware
  	 * file is corrupted.
  	 */
  	if (!evt || !evt_param || remain < 0) {
  		BT_ERR("%s Intel fw corrupted: invalid evt read", hdev->name);
  		return -EFAULT;
  	}
  
  	skb = __hci_cmd_sync_ev(hdev, le16_to_cpu(cmd->opcode), cmd->plen,
  				cmd_param, evt->evt, HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb)) {
  		BT_ERR("%s sending Intel patch command (0x%4.4x) failed (%ld)",
  		       hdev->name, cmd->opcode, PTR_ERR(skb));
d9c78e973   Adam Lee   Bluetooth: fix wr...
1520
  		return PTR_ERR(skb);
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
  	}
  
  	/* It ensures that the returned event matches the event data read from
  	 * the firmware file. At fist, it checks the length and then
  	 * the contents of the event.
  	 */
  	if (skb->len != evt->plen) {
  		BT_ERR("%s mismatch event length (opcode 0x%4.4x)", hdev->name,
  		       le16_to_cpu(cmd->opcode));
  		kfree_skb(skb);
  		return -EFAULT;
  	}
  
  	if (memcmp(skb->data, evt_param, evt->plen)) {
  		BT_ERR("%s mismatch event parameter (opcode 0x%4.4x)",
  		       hdev->name, le16_to_cpu(cmd->opcode));
  		kfree_skb(skb);
  		return -EFAULT;
  	}
  	kfree_skb(skb);
  
  	return 0;
  }
  
  static int btusb_setup_intel(struct hci_dev *hdev)
  {
  	struct sk_buff *skb;
  	const struct firmware *fw;
  	const u8 *fw_ptr;
28dc4b92e   Loic Poulain   Bluetooth: btinte...
1550
  	int disable_patch, err;
6c483de1b   Loic Poulain   Bluetooth: btinte...
1551
  	struct intel_version ver;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1552

dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
  	BT_DBG("%s", hdev->name);
  
  	/* The controller has a bug with the first HCI command sent to it
  	 * returning number of completed commands as zero. This would stall the
  	 * command processing in the Bluetooth core.
  	 *
  	 * As a workaround, send HCI Reset command first which will reset the
  	 * number of completed commands and allow normal command processing
  	 * from now on.
  	 */
  	skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb)) {
  		BT_ERR("%s sending initial HCI reset command failed (%ld)",
  		       hdev->name, PTR_ERR(skb));
d9c78e973   Adam Lee   Bluetooth: fix wr...
1567
  		return PTR_ERR(skb);
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1568
1569
1570
1571
1572
1573
1574
1575
1576
  	}
  	kfree_skb(skb);
  
  	/* Read Intel specific controller version first to allow selection of
  	 * which firmware file to load.
  	 *
  	 * The returned information are hardware variant and revision plus
  	 * firmware variant, revision and build number.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
1577
1578
1579
  	err = btintel_read_version(hdev, &ver);
  	if (err)
  		return err;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1580
1581
  
  	BT_INFO("%s: read Intel version: %02x%02x%02x%02x%02x%02x%02x%02x%02x",
6c483de1b   Loic Poulain   Bluetooth: btinte...
1582
1583
1584
  		hdev->name, ver.hw_platform, ver.hw_variant, ver.hw_revision,
  		ver.fw_variant,  ver.fw_revision, ver.fw_build_num,
  		ver.fw_build_ww, ver.fw_build_yy, ver.fw_patch_num);
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1585
1586
1587
  
  	/* fw_patch_num indicates the version of patch the device currently
  	 * have. If there is no patch data in the device, it is always 0x00.
5075edae0   Minjune Kim   Bluetooth: btusb:...
1588
  	 * So, if it is other than 0x00, no need to patch the device again.
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1589
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
1590
  	if (ver.fw_patch_num) {
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1591
  		BT_INFO("%s: Intel device is already patched. patch num: %02x",
6c483de1b   Loic Poulain   Bluetooth: btinte...
1592
  			hdev->name, ver.fw_patch_num);
213445b2b   Marcel Holtmann   Bluetooth: btinte...
1593
  		goto complete;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1594
1595
1596
1597
1598
1599
1600
1601
  	}
  
  	/* Opens the firmware patch file based on the firmware version read
  	 * from the controller. If it fails to open the matching firmware
  	 * patch file, it tries to open the default firmware patch file.
  	 * If no patch file is found, allow the device to operate without
  	 * a patch.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
1602
1603
  	fw = btusb_setup_intel_get_fw(hdev, &ver);
  	if (!fw)
213445b2b   Marcel Holtmann   Bluetooth: btinte...
1604
  		goto complete;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1605
  	fw_ptr = fw->data;
28dc4b92e   Loic Poulain   Bluetooth: btinte...
1606
  	/* Enable the manufacturer mode of the controller.
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1607
1608
1609
  	 * Only while this mode is enabled, the driver can download the
  	 * firmware patch data and configuration parameters.
  	 */
28dc4b92e   Loic Poulain   Bluetooth: btinte...
1610
1611
  	err = btintel_enter_mfg(hdev);
  	if (err) {
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1612
  		release_firmware(fw);
28dc4b92e   Loic Poulain   Bluetooth: btinte...
1613
  		return err;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1614
  	}
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
  	disable_patch = 1;
  
  	/* The firmware data file consists of list of Intel specific HCI
  	 * commands and its expected events. The first byte indicates the
  	 * type of the message, either HCI command or HCI event.
  	 *
  	 * It reads the command and its expected event from the firmware file,
  	 * and send to the controller. Once __hci_cmd_sync_ev() returns,
  	 * the returned event is compared with the event read from the firmware
  	 * file and it will continue until all the messages are downloaded to
  	 * the controller.
  	 *
  	 * Once the firmware patching is completed successfully,
  	 * the manufacturer mode is disabled with reset and activating the
  	 * downloaded patch.
  	 *
  	 * If the firmware patching fails, the manufacturer mode is
  	 * disabled with reset and deactivating the patch.
  	 *
  	 * If the default patch file is used, no reset is done when disabling
  	 * the manufacturer.
  	 */
  	while (fw->size > fw_ptr - fw->data) {
  		int ret;
  
  		ret = btusb_setup_intel_patching(hdev, fw, &fw_ptr,
  						 &disable_patch);
  		if (ret < 0)
  			goto exit_mfg_deactivate;
  	}
  
  	release_firmware(fw);
  
  	if (disable_patch)
  		goto exit_mfg_disable;
  
  	/* Patching completed successfully and disable the manufacturer mode
  	 * with reset and activate the downloaded firmware patches.
  	 */
28dc4b92e   Loic Poulain   Bluetooth: btinte...
1654
1655
1656
  	err = btintel_exit_mfg(hdev, true, true);
  	if (err)
  		return err;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1657
1658
1659
  
  	BT_INFO("%s: Intel Bluetooth firmware patch completed and activated",
  		hdev->name);
213445b2b   Marcel Holtmann   Bluetooth: btinte...
1660
  	goto complete;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1661
1662
1663
  
  exit_mfg_disable:
  	/* Disable the manufacturer mode without reset */
28dc4b92e   Loic Poulain   Bluetooth: btinte...
1664
1665
1666
  	err = btintel_exit_mfg(hdev, false, false);
  	if (err)
  		return err;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1667
1668
  
  	BT_INFO("%s: Intel Bluetooth firmware patch completed", hdev->name);
40cb09841   Marcel Holtmann   Bluetooth: Check ...
1669

213445b2b   Marcel Holtmann   Bluetooth: btinte...
1670
  	goto complete;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1671
1672
1673
1674
1675
1676
1677
  
  exit_mfg_deactivate:
  	release_firmware(fw);
  
  	/* Patching failed. Disable the manufacturer mode with reset and
  	 * deactivate the downloaded firmware patches.
  	 */
28dc4b92e   Loic Poulain   Bluetooth: btinte...
1678
1679
1680
  	err = btintel_exit_mfg(hdev, true, false);
  	if (err)
  		return err;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1681
1682
1683
  
  	BT_INFO("%s: Intel Bluetooth firmware patch completed and deactivated",
  		hdev->name);
213445b2b   Marcel Holtmann   Bluetooth: btinte...
1684
1685
1686
1687
1688
  complete:
  	/* Set the event mask for Intel specific vendor events. This enables
  	 * a few extra events that are useful during general operation.
  	 */
  	btintel_set_event_mask_mfg(hdev, false);
4185a0f5d   Marcel Holtmann   Bluetooth: btusb:...
1689
  	btintel_check_bdaddr(hdev);
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
1690
1691
  	return 0;
  }
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
  static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode)
  {
  	struct sk_buff *skb;
  	struct hci_event_hdr *hdr;
  	struct hci_ev_cmd_complete *evt;
  
  	skb = bt_skb_alloc(sizeof(*hdr) + sizeof(*evt) + 1, GFP_ATOMIC);
  	if (!skb)
  		return -ENOMEM;
  
  	hdr = (struct hci_event_hdr *)skb_put(skb, sizeof(*hdr));
  	hdr->evt = HCI_EV_CMD_COMPLETE;
  	hdr->plen = sizeof(*evt) + 1;
  
  	evt = (struct hci_ev_cmd_complete *)skb_put(skb, sizeof(*evt));
  	evt->ncmd = 0x01;
  	evt->opcode = cpu_to_le16(opcode);
  
  	*skb_put(skb, 1) = 0x00;
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
1711
  	hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
  
  	return hci_recv_frame(hdev, skb);
  }
  
  static int btusb_recv_bulk_intel(struct btusb_data *data, void *buffer,
  				 int count)
  {
  	/* When the device is in bootloader mode, then it can send
  	 * events via the bulk endpoint. These events are treated the
  	 * same way as the ones received from the interrupt endpoint.
  	 */
  	if (test_bit(BTUSB_BOOTLOADER, &data->flags))
  		return btusb_recv_intr(data, buffer, count);
  
  	return btusb_recv_bulk(data, buffer, count);
  }
ccd6da2ab   Marcel Holtmann   Bluetooth: btusb:...
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
  static void btusb_intel_bootup(struct btusb_data *data, const void *ptr,
  			       unsigned int len)
  {
  	const struct intel_bootup *evt = ptr;
  
  	if (len != sizeof(*evt))
  		return;
  
  	if (test_and_clear_bit(BTUSB_BOOTING, &data->flags)) {
  		smp_mb__after_atomic();
  		wake_up_bit(&data->flags, BTUSB_BOOTING);
  	}
  }
  
  static void btusb_intel_secure_send_result(struct btusb_data *data,
  					   const void *ptr, unsigned int len)
  {
  	const struct intel_secure_send_result *evt = ptr;
  
  	if (len != sizeof(*evt))
  		return;
  
  	if (evt->result)
  		set_bit(BTUSB_FIRMWARE_FAILED, &data->flags);
  
  	if (test_and_clear_bit(BTUSB_DOWNLOADING, &data->flags) &&
  	    test_bit(BTUSB_FIRMWARE_LOADED, &data->flags)) {
  		smp_mb__after_atomic();
  		wake_up_bit(&data->flags, BTUSB_DOWNLOADING);
  	}
  }
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1759
1760
1761
1762
1763
1764
  static int btusb_recv_event_intel(struct hci_dev *hdev, struct sk_buff *skb)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  
  	if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
  		struct hci_event_hdr *hdr = (void *)skb->data;
ccd6da2ab   Marcel Holtmann   Bluetooth: btusb:...
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
  		if (skb->len > HCI_EVENT_HDR_SIZE && hdr->evt == 0xff &&
  		    hdr->plen > 0) {
  			const void *ptr = skb->data + HCI_EVENT_HDR_SIZE + 1;
  			unsigned int len = skb->len - HCI_EVENT_HDR_SIZE - 1;
  
  			switch (skb->data[2]) {
  			case 0x02:
  				/* When switching to the operational firmware
  				 * the device sends a vendor specific event
  				 * indicating that the bootup completed.
  				 */
  				btusb_intel_bootup(data, ptr, len);
  				break;
  			case 0x06:
  				/* When the firmware loading completes the
  				 * device sends out a vendor specific event
  				 * indicating the result of the firmware
  				 * loading.
  				 */
  				btusb_intel_secure_send_result(data, ptr, len);
  				break;
fad709722   Johan Hedberg   Bluetooth: btusb:...
1786
  			}
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
  		}
  	}
  
  	return hci_recv_frame(hdev, skb);
  }
  
  static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	struct urb *urb;
  
  	BT_DBG("%s", hdev->name);
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
1799
  	switch (hci_skb_pkt_type(skb)) {
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
  	case HCI_COMMAND_PKT:
  		if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
  			struct hci_command_hdr *cmd = (void *)skb->data;
  			__u16 opcode = le16_to_cpu(cmd->opcode);
  
  			/* When in bootloader mode and the command 0xfc09
  			 * is received, it needs to be send down the
  			 * bulk endpoint. So allocate a bulk URB instead.
  			 */
  			if (opcode == 0xfc09)
  				urb = alloc_bulk_urb(hdev, skb);
  			else
  				urb = alloc_ctrl_urb(hdev, skb);
  
  			/* When the 0xfc01 command is issued to boot into
  			 * the operational firmware, it will actually not
  			 * send a command complete event. To keep the flow
  			 * control working inject that event here.
  			 */
  			if (opcode == 0xfc01)
  				inject_cmd_complete(hdev, opcode);
  		} else {
  			urb = alloc_ctrl_urb(hdev, skb);
  		}
  		if (IS_ERR(urb))
  			return PTR_ERR(urb);
  
  		hdev->stat.cmd_tx++;
  		return submit_or_queue_tx_urb(hdev, urb);
  
  	case HCI_ACLDATA_PKT:
  		urb = alloc_bulk_urb(hdev, skb);
  		if (IS_ERR(urb))
  			return PTR_ERR(urb);
  
  		hdev->stat.acl_tx++;
  		return submit_or_queue_tx_urb(hdev, urb);
  
  	case HCI_SCODATA_PKT:
  		if (hci_conn_num(hdev, SCO_LINK) < 1)
  			return -ENODEV;
  
  		urb = alloc_isoc_urb(hdev, skb);
  		if (IS_ERR(urb))
  			return PTR_ERR(urb);
  
  		hdev->stat.sco_tx++;
  		return submit_tx_urb(hdev, urb);
  	}
  
  	return -EILSEQ;
  }
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1852
1853
1854
1855
1856
1857
  static int btusb_setup_intel_new(struct hci_dev *hdev)
  {
  	static const u8 reset_param[] = { 0x00, 0x01, 0x00, 0x01,
  					  0x00, 0x08, 0x04, 0x00 };
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	struct sk_buff *skb;
6c483de1b   Loic Poulain   Bluetooth: btinte...
1858
  	struct intel_version ver;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1859
1860
1861
  	struct intel_boot_params *params;
  	const struct firmware *fw;
  	const u8 *fw_ptr;
e66890a96   Marcel Holtmann   Bluetooth: btusb:...
1862
  	u32 frag_len;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
  	char fwname[64];
  	ktime_t calltime, delta, rettime;
  	unsigned long long duration;
  	int err;
  
  	BT_DBG("%s", hdev->name);
  
  	calltime = ktime_get();
  
  	/* Read the Intel version information to determine if the device
  	 * is in bootloader mode or if it already has operational firmware
  	 * loaded.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
1876
1877
1878
  	err = btintel_read_version(hdev, &ver);
  	if (err)
  		return err;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1879
1880
1881
1882
  
  	/* The hardware platform number has a fixed value of 0x37 and
  	 * for now only accept this single value.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
1883
  	if (ver.hw_platform != 0x37) {
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1884
  		BT_ERR("%s: Unsupported Intel hardware platform (%u)",
6c483de1b   Loic Poulain   Bluetooth: btinte...
1885
  		       hdev->name, ver.hw_platform);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1886
1887
1888
1889
1890
1891
1892
1893
  		return -EINVAL;
  	}
  
  	/* At the moment only the hardware variant iBT 3.0 (LnP/SfP) is
  	 * supported by this firmware loading method. This check has been
  	 * put in place to ensure correct forward compatibility options
  	 * when newer hardware variants come along.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
1894
  	if (ver.hw_variant != 0x0b) {
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1895
  		BT_ERR("%s: Unsupported Intel hardware variant (%u)",
6c483de1b   Loic Poulain   Bluetooth: btinte...
1896
  		       hdev->name, ver.hw_variant);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1897
1898
  		return -EINVAL;
  	}
6c483de1b   Loic Poulain   Bluetooth: btinte...
1899
  	btintel_version_info(hdev, &ver);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
  
  	/* The firmware variant determines if the device is in bootloader
  	 * mode or is running operational firmware. The value 0x06 identifies
  	 * the bootloader and the value 0x23 identifies the operational
  	 * firmware.
  	 *
  	 * When the operational firmware is already present, then only
  	 * the check for valid Bluetooth device address is needed. This
  	 * determines if the device will be added as configured or
  	 * unconfigured controller.
  	 *
  	 * It is not possible to use the Secure Boot Parameters in this
  	 * case since that command is only available in bootloader mode.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
1914
  	if (ver.fw_variant == 0x23) {
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1915
  		clear_bit(BTUSB_BOOTLOADER, &data->flags);
4185a0f5d   Marcel Holtmann   Bluetooth: btusb:...
1916
  		btintel_check_bdaddr(hdev);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1917
1918
1919
1920
1921
1922
  		return 0;
  	}
  
  	/* If the device is not in bootloader mode, then the only possible
  	 * choice is to return an error and abort the device initialization.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
1923
  	if (ver.fw_variant != 0x06) {
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1924
  		BT_ERR("%s: Unsupported Intel firmware variant (%u)",
6c483de1b   Loic Poulain   Bluetooth: btinte...
1925
  		       hdev->name, ver.fw_variant);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1926
1927
  		return -ENODEV;
  	}
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
  	/* Read the secure boot parameters to identify the operating
  	 * details of the bootloader.
  	 */
  	skb = __hci_cmd_sync(hdev, 0xfc0d, 0, NULL, HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb)) {
  		BT_ERR("%s: Reading Intel boot parameters failed (%ld)",
  		       hdev->name, PTR_ERR(skb));
  		return PTR_ERR(skb);
  	}
  
  	if (skb->len != sizeof(*params)) {
  		BT_ERR("%s: Intel boot parameters size mismatch", hdev->name);
  		kfree_skb(skb);
  		return -EILSEQ;
  	}
  
  	params = (struct intel_boot_params *)skb->data;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1945
1946
1947
1948
1949
1950
  
  	BT_INFO("%s: Device revision is %u", hdev->name,
  		le16_to_cpu(params->dev_revid));
  
  	BT_INFO("%s: Secure boot is %s", hdev->name,
  		params->secure_boot ? "enabled" : "disabled");
2220994e7   Marcel Holtmann   Bluetooth: btusb:...
1951
1952
1953
1954
1955
1956
1957
1958
  	BT_INFO("%s: OTP lock is %s", hdev->name,
  		params->otp_lock ? "enabled" : "disabled");
  
  	BT_INFO("%s: API lock is %s", hdev->name,
  		params->api_lock ? "enabled" : "disabled");
  
  	BT_INFO("%s: Debug lock is %s", hdev->name,
  		params->debug_lock ? "enabled" : "disabled");
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
  	BT_INFO("%s: Minimum firmware build %u week %u %u", hdev->name,
  		params->min_fw_build_nn, params->min_fw_build_cw,
  		2000 + params->min_fw_build_yy);
  
  	/* It is required that every single firmware fragment is acknowledged
  	 * with a command complete event. If the boot parameters indicate
  	 * that this bootloader does not send them, then abort the setup.
  	 */
  	if (params->limited_cce != 0x00) {
  		BT_ERR("%s: Unsupported Intel firmware loading method (%u)",
  		       hdev->name, params->limited_cce);
  		kfree_skb(skb);
  		return -EINVAL;
  	}
  
  	/* If the OTP has no valid Bluetooth device address, then there will
  	 * also be no valid address for the operational firmware.
  	 */
  	if (!bacmp(&params->otp_bdaddr, BDADDR_ANY)) {
  		BT_INFO("%s: No device address configured", hdev->name);
  		set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
  	}
  
  	/* With this Intel bootloader only the hardware variant and device
  	 * revision information are used to select the right firmware.
  	 *
  	 * Currently this bootloader support is limited to hardware variant
  	 * iBT 3.0 (LnP/SfP) which is identified by the value 11 (0x0b).
  	 */
  	snprintf(fwname, sizeof(fwname), "intel/ibt-11-%u.sfi",
  		 le16_to_cpu(params->dev_revid));
  
  	err = request_firmware(&fw, fwname, &hdev->dev);
  	if (err < 0) {
  		BT_ERR("%s: Failed to load Intel firmware file (%d)",
  		       hdev->name, err);
  		kfree_skb(skb);
  		return err;
  	}
  
  	BT_INFO("%s: Found device firmware: %s", hdev->name, fwname);
52cc91681   Tedd Ho-Jeong An   Bluetooth: btusb:...
2000
2001
2002
2003
2004
  	/* Save the DDC file name for later use to apply once the firmware
  	 * downloading is done.
  	 */
  	snprintf(fwname, sizeof(fwname), "intel/ibt-11-%u.ddc",
  		 le16_to_cpu(params->dev_revid));
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
  	kfree_skb(skb);
  
  	if (fw->size < 644) {
  		BT_ERR("%s: Invalid size of firmware file (%zu)",
  		       hdev->name, fw->size);
  		err = -EBADF;
  		goto done;
  	}
  
  	set_bit(BTUSB_DOWNLOADING, &data->flags);
  
  	/* Start the firmware download transaction with the Init fragment
  	 * represented by the 128 bytes of CSS header.
  	 */
09df123d2   Marcel Holtmann   Bluetooth: btinte...
2019
  	err = btintel_secure_send(hdev, 0x00, 128, fw->data);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2020
2021
2022
2023
2024
2025
2026
2027
2028
  	if (err < 0) {
  		BT_ERR("%s: Failed to send firmware header (%d)",
  		       hdev->name, err);
  		goto done;
  	}
  
  	/* Send the 256 bytes of public key information from the firmware
  	 * as the PKey fragment.
  	 */
09df123d2   Marcel Holtmann   Bluetooth: btinte...
2029
  	err = btintel_secure_send(hdev, 0x03, 256, fw->data + 128);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2030
2031
2032
2033
2034
2035
2036
2037
2038
  	if (err < 0) {
  		BT_ERR("%s: Failed to send firmware public key (%d)",
  		       hdev->name, err);
  		goto done;
  	}
  
  	/* Send the 256 bytes of signature information from the firmware
  	 * as the Sign fragment.
  	 */
09df123d2   Marcel Holtmann   Bluetooth: btinte...
2039
  	err = btintel_secure_send(hdev, 0x02, 256, fw->data + 388);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2040
2041
2042
2043
2044
2045
2046
  	if (err < 0) {
  		BT_ERR("%s: Failed to send firmware signature (%d)",
  		       hdev->name, err);
  		goto done;
  	}
  
  	fw_ptr = fw->data + 644;
e66890a96   Marcel Holtmann   Bluetooth: btusb:...
2047
  	frag_len = 0;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2048
2049
  
  	while (fw_ptr - fw->data < fw->size) {
e66890a96   Marcel Holtmann   Bluetooth: btusb:...
2050
  		struct hci_command_hdr *cmd = (void *)(fw_ptr + frag_len);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2051

e66890a96   Marcel Holtmann   Bluetooth: btusb:...
2052
  		frag_len += sizeof(*cmd) + cmd->plen;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2053

5075edae0   Minjune Kim   Bluetooth: btusb:...
2054
  		/* The parameter length of the secure send command requires
e66890a96   Marcel Holtmann   Bluetooth: btusb:...
2055
2056
2057
2058
2059
2060
  		 * a 4 byte alignment. It happens so that the firmware file
  		 * contains proper Intel_NOP commands to align the fragments
  		 * as needed.
  		 *
  		 * Send set of commands with 4 byte alignment from the
  		 * firmware data buffer as a single Data fragement.
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2061
  		 */
e66890a96   Marcel Holtmann   Bluetooth: btusb:...
2062
  		if (!(frag_len % 4)) {
09df123d2   Marcel Holtmann   Bluetooth: btinte...
2063
  			err = btintel_secure_send(hdev, 0x01, frag_len, fw_ptr);
e66890a96   Marcel Holtmann   Bluetooth: btusb:...
2064
2065
2066
2067
2068
  			if (err < 0) {
  				BT_ERR("%s: Failed to send firmware data (%d)",
  				       hdev->name, err);
  				goto done;
  			}
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2069

e66890a96   Marcel Holtmann   Bluetooth: btusb:...
2070
2071
2072
  			fw_ptr += frag_len;
  			frag_len = 0;
  		}
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2073
  	}
ce6bb9297   Marcel Holtmann   Bluetooth: btusb:...
2074
  	set_bit(BTUSB_FIRMWARE_LOADED, &data->flags);
a087a98e0   Johan Hedberg   Bluetooth: btusb:...
2075
  	BT_INFO("%s: Waiting for firmware download to complete", hdev->name);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2076
2077
2078
2079
  	/* Before switching the device into operational mode and with that
  	 * booting the loaded firmware, wait for the bootloader notification
  	 * that all fragments have been successfully received.
  	 *
a087a98e0   Johan Hedberg   Bluetooth: btusb:...
2080
2081
2082
2083
2084
2085
  	 * When the event processing receives the notification, then the
  	 * BTUSB_DOWNLOADING flag will be cleared.
  	 *
  	 * The firmware loading should not take longer than 5 seconds
  	 * and thus just timeout if that happens and fail the setup
  	 * of this device.
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2086
  	 */
129a76931   Johan Hedberg   Bluetooth: btusb:...
2087
2088
2089
  	err = wait_on_bit_timeout(&data->flags, BTUSB_DOWNLOADING,
  				  TASK_INTERRUPTIBLE,
  				  msecs_to_jiffies(5000));
a087a98e0   Johan Hedberg   Bluetooth: btusb:...
2090
2091
2092
2093
2094
  	if (err == 1) {
  		BT_ERR("%s: Firmware loading interrupted", hdev->name);
  		err = -EINTR;
  		goto done;
  	}
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2095

a087a98e0   Johan Hedberg   Bluetooth: btusb:...
2096
2097
2098
2099
  	if (err) {
  		BT_ERR("%s: Firmware loading timeout", hdev->name);
  		err = -ETIMEDOUT;
  		goto done;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
  	}
  
  	if (test_bit(BTUSB_FIRMWARE_FAILED, &data->flags)) {
  		BT_ERR("%s: Firmware loading failed", hdev->name);
  		err = -ENOEXEC;
  		goto done;
  	}
  
  	rettime = ktime_get();
  	delta = ktime_sub(rettime, calltime);
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
  
  	BT_INFO("%s: Firmware loaded in %llu usecs", hdev->name, duration);
  
  done:
  	release_firmware(fw);
  
  	if (err < 0)
  		return err;
  
  	calltime = ktime_get();
  
  	set_bit(BTUSB_BOOTING, &data->flags);
  
  	skb = __hci_cmd_sync(hdev, 0xfc01, sizeof(reset_param), reset_param,
  			     HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb))
  		return PTR_ERR(skb);
  
  	kfree_skb(skb);
  
  	/* The bootloader will not indicate when the device is ready. This
  	 * is done by the operational firmware sending bootup notification.
fad709722   Johan Hedberg   Bluetooth: btusb:...
2133
2134
2135
2136
  	 *
  	 * Booting into operational firmware should not take longer than
  	 * 1 second. However if that happens, then just fail the setup
  	 * since something went wrong.
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2137
  	 */
fad709722   Johan Hedberg   Bluetooth: btusb:...
2138
  	BT_INFO("%s: Waiting for device to boot", hdev->name);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2139

129a76931   Johan Hedberg   Bluetooth: btusb:...
2140
2141
2142
  	err = wait_on_bit_timeout(&data->flags, BTUSB_BOOTING,
  				  TASK_INTERRUPTIBLE,
  				  msecs_to_jiffies(1000));
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2143

fad709722   Johan Hedberg   Bluetooth: btusb:...
2144
2145
2146
2147
  	if (err == 1) {
  		BT_ERR("%s: Device boot interrupted", hdev->name);
  		return -EINTR;
  	}
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2148

fad709722   Johan Hedberg   Bluetooth: btusb:...
2149
2150
2151
  	if (err) {
  		BT_ERR("%s: Device boot timeout", hdev->name);
  		return -ETIMEDOUT;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2152
2153
2154
2155
2156
2157
2158
2159
2160
  	}
  
  	rettime = ktime_get();
  	delta = ktime_sub(rettime, calltime);
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
  
  	BT_INFO("%s: Device booted in %llu usecs", hdev->name, duration);
  
  	clear_bit(BTUSB_BOOTLOADER, &data->flags);
52cc91681   Tedd Ho-Jeong An   Bluetooth: btusb:...
2161
2162
2163
2164
2165
2166
  	/* Once the device is running in operational mode, it needs to apply
  	 * the device configuration (DDC) parameters.
  	 *
  	 * The device can work without DDC parameters, so even if it fails
  	 * to load the file, no need to fail the setup.
  	 */
e924d3d65   Loic Poulain   Bluetooth: btusb:...
2167
  	btintel_load_ddc_config(hdev, fwname);
52cc91681   Tedd Ho-Jeong An   Bluetooth: btusb:...
2168

213445b2b   Marcel Holtmann   Bluetooth: btinte...
2169
2170
2171
2172
2173
2174
2175
2176
  	/* Set the event mask for Intel specific vendor events. This enables
  	 * a few extra events that are useful during general operation. It
  	 * does not enable any debugging related events.
  	 *
  	 * The device will function correctly without these events enabled
  	 * and thus no need to fail the setup.
  	 */
  	btintel_set_event_mask(hdev, false);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2177
2178
  	return 0;
  }
bfbd45e9a   Tedd Ho-Jeong An   Bluetooth: Add de...
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
  static int btusb_shutdown_intel(struct hci_dev *hdev)
  {
  	struct sk_buff *skb;
  	long ret;
  
  	/* Some platforms have an issue with BT LED when the interface is
  	 * down or BT radio is turned off, which takes 5 seconds to BT LED
  	 * goes off. This command turns off the BT LED immediately.
  	 */
  	skb = __hci_cmd_sync(hdev, 0xfc3f, 0, NULL, HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb)) {
  		ret = PTR_ERR(skb);
  		BT_ERR("%s: turning off Intel device LED failed (%ld)",
  		       hdev->name, ret);
  		return ret;
  	}
  	kfree_skb(skb);
  
  	return 0;
  }
ae8df494e   Amitkumar Karwar   Bluetooth: add pu...
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
  static int btusb_set_bdaddr_marvell(struct hci_dev *hdev,
  				    const bdaddr_t *bdaddr)
  {
  	struct sk_buff *skb;
  	u8 buf[8];
  	long ret;
  
  	buf[0] = 0xfe;
  	buf[1] = sizeof(bdaddr_t);
  	memcpy(buf + 2, bdaddr, sizeof(bdaddr_t));
  
  	skb = __hci_cmd_sync(hdev, 0xfc22, sizeof(buf), buf, HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb)) {
  		ret = PTR_ERR(skb);
  		BT_ERR("%s: changing Marvell device address failed (%ld)",
  		       hdev->name, ret);
  		return ret;
  	}
  	kfree_skb(skb);
  
  	return 0;
  }
5859223e0   Toshi Kikuchi   Bluetooth: btusb:...
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
  static int btusb_set_bdaddr_ath3012(struct hci_dev *hdev,
  				    const bdaddr_t *bdaddr)
  {
  	struct sk_buff *skb;
  	u8 buf[10];
  	long ret;
  
  	buf[0] = 0x01;
  	buf[1] = 0x01;
  	buf[2] = 0x00;
  	buf[3] = sizeof(bdaddr_t);
  	memcpy(buf + 4, bdaddr, sizeof(bdaddr_t));
  
  	skb = __hci_cmd_sync(hdev, 0xfc0b, sizeof(buf), buf, HCI_INIT_TIMEOUT);
  	if (IS_ERR(skb)) {
  		ret = PTR_ERR(skb);
  		BT_ERR("%s: Change address command failed (%ld)",
  		       hdev->name, ret);
  		return ret;
  	}
  	kfree_skb(skb);
  
  	return 0;
  }
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
  #define QCA_DFU_PACKET_LEN	4096
  
  #define QCA_GET_TARGET_VERSION	0x09
  #define QCA_CHECK_STATUS	0x05
  #define QCA_DFU_DOWNLOAD	0x01
  
  #define QCA_SYSCFG_UPDATED	0x40
  #define QCA_PATCH_UPDATED	0x80
  #define QCA_DFU_TIMEOUT		3000
  
  struct qca_version {
  	__le32	rom_version;
  	__le32	patch_version;
  	__le32	ram_version;
  	__le32	ref_clock;
  	__u8	reserved[4];
  } __packed;
  
  struct qca_rampatch_version {
  	__le16	rom_version;
  	__le16	patch_version;
  } __packed;
  
  struct qca_device_info {
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2269
2270
2271
2272
  	u32	rom_version;
  	u8	rampatch_hdr;	/* length of header in rampatch */
  	u8	nvm_hdr;	/* length of header in NVM */
  	u8	ver_offset;	/* offset of version structure in rampatch */
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2273
2274
2275
2276
2277
  };
  
  static const struct qca_device_info qca_devices_table[] = {
  	{ 0x00000100, 20, 4, 10 }, /* Rome 1.0 */
  	{ 0x00000101, 20, 4, 10 }, /* Rome 1.1 */
7f6e63631   Chan-yeol Park   Bluetooth: btusb:...
2278
  	{ 0x00000200, 28, 4, 18 }, /* Rome 2.0 */
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
  	{ 0x00000201, 28, 4, 18 }, /* Rome 2.1 */
  	{ 0x00000300, 28, 4, 18 }, /* Rome 3.0 */
  	{ 0x00000302, 28, 4, 18 }, /* Rome 3.2 */
  };
  
  static int btusb_qca_send_vendor_req(struct hci_dev *hdev, u8 request,
  				     void *data, u16 size)
  {
  	struct btusb_data *btdata = hci_get_drvdata(hdev);
  	struct usb_device *udev = btdata->udev;
  	int pipe, err;
  	u8 *buf;
  
  	buf = kmalloc(size, GFP_KERNEL);
  	if (!buf)
  		return -ENOMEM;
  
  	/* Found some of USB hosts have IOT issues with ours so that we should
  	 * not wait until HCI layer is ready.
  	 */
  	pipe = usb_rcvctrlpipe(udev, 0);
  	err = usb_control_msg(udev, pipe, request, USB_TYPE_VENDOR | USB_DIR_IN,
  			      0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
  	if (err < 0) {
  		BT_ERR("%s: Failed to access otp area (%d)", hdev->name, err);
  		goto done;
  	}
  
  	memcpy(data, buf, size);
  
  done:
  	kfree(buf);
  
  	return err;
  }
  
  static int btusb_setup_qca_download_fw(struct hci_dev *hdev,
  				       const struct firmware *firmware,
  				       size_t hdr_size)
  {
  	struct btusb_data *btdata = hci_get_drvdata(hdev);
  	struct usb_device *udev = btdata->udev;
  	size_t count, size, sent = 0;
  	int pipe, len, err;
  	u8 *buf;
  
  	buf = kmalloc(QCA_DFU_PACKET_LEN, GFP_KERNEL);
  	if (!buf)
  		return -ENOMEM;
  
  	count = firmware->size;
  
  	size = min_t(size_t, count, hdr_size);
  	memcpy(buf, firmware->data, size);
  
  	/* USB patches should go down to controller through USB path
  	 * because binary format fits to go down through USB channel.
  	 * USB control path is for patching headers and USB bulk is for
  	 * patch body.
  	 */
  	pipe = usb_sndctrlpipe(udev, 0);
  	err = usb_control_msg(udev, pipe, QCA_DFU_DOWNLOAD, USB_TYPE_VENDOR,
  			      0, 0, buf, size, USB_CTRL_SET_TIMEOUT);
  	if (err < 0) {
  		BT_ERR("%s: Failed to send headers (%d)", hdev->name, err);
  		goto done;
  	}
  
  	sent += size;
  	count -= size;
  
  	while (count) {
  		size = min_t(size_t, count, QCA_DFU_PACKET_LEN);
  
  		memcpy(buf, firmware->data + sent, size);
  
  		pipe = usb_sndbulkpipe(udev, 0x02);
  		err = usb_bulk_msg(udev, pipe, buf, size, &len,
  				   QCA_DFU_TIMEOUT);
  		if (err < 0) {
  			BT_ERR("%s: Failed to send body at %zd of %zd (%d)",
  			       hdev->name, sent, firmware->size, err);
  			break;
  		}
  
  		if (size != len) {
  			BT_ERR("%s: Failed to get bulk buffer", hdev->name);
  			err = -EILSEQ;
  			break;
  		}
  
  		sent  += size;
  		count -= size;
  	}
  
  done:
  	kfree(buf);
  	return err;
  }
  
  static int btusb_setup_qca_load_rampatch(struct hci_dev *hdev,
  					 struct qca_version *ver,
  					 const struct qca_device_info *info)
  {
  	struct qca_rampatch_version *rver;
  	const struct firmware *fw;
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2385
2386
  	u32 ver_rom, ver_patch;
  	u16 rver_rom, rver_patch;
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2387
2388
  	char fwname[64];
  	int err;
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2389
2390
2391
2392
  	ver_rom = le32_to_cpu(ver->rom_version);
  	ver_patch = le32_to_cpu(ver->patch_version);
  
  	snprintf(fwname, sizeof(fwname), "qca/rampatch_usb_%08x.bin", ver_rom);
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2393
2394
2395
2396
2397
2398
2399
2400
2401
  
  	err = request_firmware(&fw, fwname, &hdev->dev);
  	if (err) {
  		BT_ERR("%s: failed to request rampatch file: %s (%d)",
  		       hdev->name, fwname, err);
  		return err;
  	}
  
  	BT_INFO("%s: using rampatch file: %s", hdev->name, fwname);
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2402

3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2403
  	rver = (struct qca_rampatch_version *)(fw->data + info->ver_offset);
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2404
2405
  	rver_rom = le16_to_cpu(rver->rom_version);
  	rver_patch = le16_to_cpu(rver->patch_version);
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2406
  	BT_INFO("%s: QCA: patch rome 0x%x build 0x%x, firmware rome 0x%x "
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2407
2408
  		"build 0x%x", hdev->name, rver_rom, rver_patch, ver_rom,
  		ver_patch);
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2409

bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2410
  	if (rver_rom != ver_rom || rver_patch <= ver_patch) {
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
  		BT_ERR("%s: rampatch file version did not match with firmware",
  		       hdev->name);
  		err = -EINVAL;
  		goto done;
  	}
  
  	err = btusb_setup_qca_download_fw(hdev, fw, info->rampatch_hdr);
  
  done:
  	release_firmware(fw);
  
  	return err;
  }
  
  static int btusb_setup_qca_load_nvm(struct hci_dev *hdev,
  				    struct qca_version *ver,
  				    const struct qca_device_info *info)
  {
  	const struct firmware *fw;
  	char fwname[64];
  	int err;
  
  	snprintf(fwname, sizeof(fwname), "qca/nvm_usb_%08x.bin",
  		 le32_to_cpu(ver->rom_version));
  
  	err = request_firmware(&fw, fwname, &hdev->dev);
  	if (err) {
  		BT_ERR("%s: failed to request NVM file: %s (%d)",
  		       hdev->name, fwname, err);
  		return err;
  	}
  
  	BT_INFO("%s: using NVM file: %s", hdev->name, fwname);
  
  	err = btusb_setup_qca_download_fw(hdev, fw, info->nvm_hdr);
  
  	release_firmware(fw);
  
  	return err;
  }
  
  static int btusb_setup_qca(struct hci_dev *hdev)
  {
  	const struct qca_device_info *info = NULL;
  	struct qca_version ver;
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2456
  	u32 ver_rom;
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2457
2458
2459
2460
  	u8 status;
  	int i, err;
  
  	err = btusb_qca_send_vendor_req(hdev, QCA_GET_TARGET_VERSION, &ver,
eb50042fd   Marcel Holtmann   Bluetooth: btusb:...
2461
  					sizeof(ver));
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2462
2463
  	if (err < 0)
  		return err;
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2464
  	ver_rom = le32_to_cpu(ver.rom_version);
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2465
  	for (i = 0; i < ARRAY_SIZE(qca_devices_table); i++) {
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2466
  		if (ver_rom == qca_devices_table[i].rom_version)
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2467
2468
2469
2470
  			info = &qca_devices_table[i];
  	}
  	if (!info) {
  		BT_ERR("%s: don't support firmware rome 0x%x", hdev->name,
bf906b3db   Kim, Ben Young Tae   Bluetooth: btusb:...
2471
  		       ver_rom);
3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
  		return -ENODEV;
  	}
  
  	err = btusb_qca_send_vendor_req(hdev, QCA_CHECK_STATUS, &status,
  					sizeof(status));
  	if (err < 0)
  		return err;
  
  	if (!(status & QCA_PATCH_UPDATED)) {
  		err = btusb_setup_qca_load_rampatch(hdev, &ver, info);
  		if (err < 0)
  			return err;
  	}
  
  	if (!(status & QCA_SYSCFG_UPDATED)) {
  		err = btusb_setup_qca_load_nvm(hdev, &ver, info);
  		if (err < 0)
  			return err;
  	}
  
  	return 0;
  }
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
  #ifdef CONFIG_BT_HCIBTUSB_BCM
  static inline int __set_diag_interface(struct hci_dev *hdev)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	struct usb_interface *intf = data->diag;
  	int i;
  
  	if (!data->diag)
  		return -ENODEV;
  
  	data->diag_tx_ep = NULL;
  	data->diag_rx_ep = NULL;
  
  	for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
  		struct usb_endpoint_descriptor *ep_desc;
  
  		ep_desc = &intf->cur_altsetting->endpoint[i].desc;
  
  		if (!data->diag_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
  			data->diag_tx_ep = ep_desc;
  			continue;
  		}
  
  		if (!data->diag_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
  			data->diag_rx_ep = ep_desc;
  			continue;
  		}
  	}
  
  	if (!data->diag_tx_ep || !data->diag_rx_ep) {
  		BT_ERR("%s invalid diagnostic descriptors", hdev->name);
  		return -ENODEV;
  	}
  
  	return 0;
  }
  
  static struct urb *alloc_diag_urb(struct hci_dev *hdev, bool enable)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	struct sk_buff *skb;
  	struct urb *urb;
  	unsigned int pipe;
  
  	if (!data->diag_tx_ep)
  		return ERR_PTR(-ENODEV);
  
  	urb = usb_alloc_urb(0, GFP_KERNEL);
  	if (!urb)
  		return ERR_PTR(-ENOMEM);
  
  	skb = bt_skb_alloc(2, GFP_KERNEL);
  	if (!skb) {
  		usb_free_urb(urb);
  		return ERR_PTR(-ENOMEM);
  	}
  
  	*skb_put(skb, 1) = 0xf0;
  	*skb_put(skb, 1) = enable;
  
  	pipe = usb_sndbulkpipe(data->udev, data->diag_tx_ep->bEndpointAddress);
  
  	usb_fill_bulk_urb(urb, data->udev, pipe,
  			  skb->data, skb->len, btusb_tx_complete, skb);
  
  	skb->dev = (void *)hdev;
  
  	return urb;
  }
  
  static int btusb_bcm_set_diag(struct hci_dev *hdev, bool enable)
  {
  	struct btusb_data *data = hci_get_drvdata(hdev);
  	struct urb *urb;
  
  	if (!data->diag)
  		return -ENODEV;
  
  	if (!test_bit(HCI_RUNNING, &hdev->flags))
  		return -ENETDOWN;
  
  	urb = alloc_diag_urb(hdev, enable);
  	if (IS_ERR(urb))
  		return PTR_ERR(urb);
  
  	return submit_or_queue_tx_urb(hdev, urb);
  }
  #endif
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2582
  static int btusb_probe(struct usb_interface *intf,
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
2583
  		       const struct usb_device_id *id)
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2584
2585
2586
2587
  {
  	struct usb_endpoint_descriptor *ep_desc;
  	struct btusb_data *data;
  	struct hci_dev *hdev;
22f8e9dbf   Marcel Holtmann   Bluetooth: btusb:...
2588
  	unsigned ifnum_base;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2589
2590
2591
  	int i, err;
  
  	BT_DBG("intf %p id %p", intf, id);
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
2592
  	/* interface numbers are hardcoded in the spec */
22f8e9dbf   Marcel Holtmann   Bluetooth: btusb:...
2593
2594
2595
2596
2597
2598
2599
2600
  	if (intf->cur_altsetting->desc.bInterfaceNumber != 0) {
  		if (!(id->driver_info & BTUSB_IFNUM_2))
  			return -ENODEV;
  		if (intf->cur_altsetting->desc.bInterfaceNumber != 2)
  			return -ENODEV;
  	}
  
  	ifnum_base = intf->cur_altsetting->desc.bInterfaceNumber;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2601
2602
2603
  
  	if (!id->driver_info) {
  		const struct usb_device_id *match;
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
2604

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2605
2606
2607
2608
  		match = usb_match_id(intf, blacklist_table);
  		if (match)
  			id = match;
  	}
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
2609
2610
  	if (id->driver_info == BTUSB_IGNORE)
  		return -ENODEV;
2d25f8b46   Steven.Li   Bluetooth: Add At...
2611
2612
2613
2614
2615
2616
2617
2618
  	if (id->driver_info & BTUSB_ATH3012) {
  		struct usb_device *udev = interface_to_usbdev(intf);
  
  		/* Old firmware would otherwise let ath3k driver load
  		 * patch and sysconfig files */
  		if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001)
  			return -ENODEV;
  	}
98921dbd0   Sachin Kamat   Bluetooth: Use de...
2619
  	data = devm_kzalloc(&intf->dev, sizeof(*data), GFP_KERNEL);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
  	if (!data)
  		return -ENOMEM;
  
  	for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
  		ep_desc = &intf->cur_altsetting->endpoint[i].desc;
  
  		if (!data->intr_ep && usb_endpoint_is_int_in(ep_desc)) {
  			data->intr_ep = ep_desc;
  			continue;
  		}
  
  		if (!data->bulk_tx_ep && usb_endpoint_is_bulk_out(ep_desc)) {
  			data->bulk_tx_ep = ep_desc;
  			continue;
  		}
  
  		if (!data->bulk_rx_ep && usb_endpoint_is_bulk_in(ep_desc)) {
  			data->bulk_rx_ep = ep_desc;
  			continue;
  		}
  	}
98921dbd0   Sachin Kamat   Bluetooth: Use de...
2641
  	if (!data->intr_ep || !data->bulk_tx_ep || !data->bulk_rx_ep)
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2642
  		return -ENODEV;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2643

893ba5440   Marcel Holtmann   Bluetooth: btusb:...
2644
2645
2646
2647
2648
2649
2650
  	if (id->driver_info & BTUSB_AMP) {
  		data->cmdreq_type = USB_TYPE_CLASS | 0x01;
  		data->cmdreq = 0x2b;
  	} else {
  		data->cmdreq_type = USB_TYPE_CLASS;
  		data->cmdreq = 0x00;
  	}
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
2651

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2652
  	data->udev = interface_to_usbdev(intf);
5fbcd260c   Marcel Holtmann   [Bluetooth] Fix U...
2653
  	data->intf = intf;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2654

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2655
  	INIT_WORK(&data->work, btusb_work);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2656
  	INIT_WORK(&data->waker, btusb_waker);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
2657
2658
  	init_usb_anchor(&data->deferred);
  	init_usb_anchor(&data->tx_anchor);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2659
  	spin_lock_init(&data->txlock);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2660

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2661
2662
  	init_usb_anchor(&data->intr_anchor);
  	init_usb_anchor(&data->bulk_anchor);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
2663
  	init_usb_anchor(&data->isoc_anchor);
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2664
  	init_usb_anchor(&data->diag_anchor);
803b58367   Marcel Holtmann   Bluetooth: btusb:...
2665
  	spin_lock_init(&data->rxlock);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2666

cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2667
2668
2669
2670
2671
2672
2673
2674
  	if (id->driver_info & BTUSB_INTEL_NEW) {
  		data->recv_event = btusb_recv_event_intel;
  		data->recv_bulk = btusb_recv_bulk_intel;
  		set_bit(BTUSB_BOOTLOADER, &data->flags);
  	} else {
  		data->recv_event = hci_recv_frame;
  		data->recv_bulk = btusb_recv_bulk;
  	}
2cbd3f5cc   Marcel Holtmann   Bluetooth: btusb:...
2675

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2676
  	hdev = hci_alloc_dev();
98921dbd0   Sachin Kamat   Bluetooth: Use de...
2677
  	if (!hdev)
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2678
  		return -ENOMEM;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2679

c13854cef   Marcel Holtmann   Bluetooth: Conver...
2680
  	hdev->bus = HCI_USB;
155961e80   David Herrmann   Bluetooth: Remove...
2681
  	hci_set_drvdata(hdev, data);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2682

893ba5440   Marcel Holtmann   Bluetooth: btusb:...
2683
2684
2685
2686
  	if (id->driver_info & BTUSB_AMP)
  		hdev->dev_type = HCI_AMP;
  	else
  		hdev->dev_type = HCI_BREDR;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2687
2688
2689
  	data->hdev = hdev;
  
  	SET_HCIDEV_DEV(hdev, &intf->dev);
9f8f962c8   Marcel Holtmann   Bluetooth: Use se...
2690
2691
2692
2693
2694
  	hdev->open   = btusb_open;
  	hdev->close  = btusb_close;
  	hdev->flush  = btusb_flush;
  	hdev->send   = btusb_send_frame;
  	hdev->notify = btusb_notify;
6c9d435d3   Marcel Holtmann   Bluetooth: btusb:...
2695
2696
  	if (id->driver_info & BTUSB_BCM2045)
  		set_bit(HCI_QUIRK_BROKEN_STORED_LINK_KEY, &hdev->quirks);
9f8f962c8   Marcel Holtmann   Bluetooth: Use se...
2697
2698
  	if (id->driver_info & BTUSB_BCM92035)
  		hdev->setup = btusb_setup_bcm92035;
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2699

c2bfb1009   Marcel Holtmann   Bluetooth: btusb:...
2700
  #ifdef CONFIG_BT_HCIBTUSB_BCM
abbaf50e3   Marcel Holtmann   Bluetooth: Add pu...
2701
  	if (id->driver_info & BTUSB_BCM_PATCHRAM) {
49a5f782d   Marcel Holtmann   Bluetooth: btusb:...
2702
  		hdev->manufacturer = 15;
c2bfb1009   Marcel Holtmann   Bluetooth: btusb:...
2703
  		hdev->setup = btbcm_setup_patchram;
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2704
  		hdev->set_diag = btusb_bcm_set_diag;
1df1f5910   Marcel Holtmann   Bluetooth: btusb:...
2705
  		hdev->set_bdaddr = btbcm_set_bdaddr;
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2706
2707
  
  		/* Broadcom LM_DIAG Interface numbers are hardcoded */
22f8e9dbf   Marcel Holtmann   Bluetooth: btusb:...
2708
  		data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2);
abbaf50e3   Marcel Holtmann   Bluetooth: Add pu...
2709
  	}
10d4c6736   Petri Gynther   Bluetooth: btusb:...
2710

9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2711
  	if (id->driver_info & BTUSB_BCM_APPLE) {
49a5f782d   Marcel Holtmann   Bluetooth: btusb:...
2712
  		hdev->manufacturer = 15;
c2bfb1009   Marcel Holtmann   Bluetooth: btusb:...
2713
  		hdev->setup = btbcm_setup_apple;
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2714
2715
2716
  		hdev->set_diag = btusb_bcm_set_diag;
  
  		/* Broadcom LM_DIAG Interface numbers are hardcoded */
22f8e9dbf   Marcel Holtmann   Bluetooth: btusb:...
2717
  		data->diag = usb_ifnum_to_if(data->udev, ifnum_base + 2);
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2718
  	}
c2bfb1009   Marcel Holtmann   Bluetooth: btusb:...
2719
  #endif
17b2772b8   Marcel Holtmann   Bluetooth: Read B...
2720

cb8d65973   Marcel Holtmann   Bluetooth: Add pu...
2721
  	if (id->driver_info & BTUSB_INTEL) {
49a5f782d   Marcel Holtmann   Bluetooth: btusb:...
2722
  		hdev->manufacturer = 2;
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
2723
  		hdev->setup = btusb_setup_intel;
bfbd45e9a   Tedd Ho-Jeong An   Bluetooth: Add de...
2724
  		hdev->shutdown = btusb_shutdown_intel;
3e24767b7   Marcel Holtmann   Bluetooth: btinte...
2725
  		hdev->set_diag = btintel_set_diag_mfg;
4185a0f5d   Marcel Holtmann   Bluetooth: btusb:...
2726
  		hdev->set_bdaddr = btintel_set_bdaddr;
c33fb9b4e   Jakub Pawlowski   Bluetooth: Set HC...
2727
  		set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
c11548427   Jakub Pawlowski   Bluetooth: Set HC...
2728
  		set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
3e24767b7   Marcel Holtmann   Bluetooth: btinte...
2729
  		set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
cb8d65973   Marcel Holtmann   Bluetooth: Add pu...
2730
  	}
dffd30ee9   Tedd Ho-Jeong An   Bluetooth: Add su...
2731

cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2732
  	if (id->driver_info & BTUSB_INTEL_NEW) {
49a5f782d   Marcel Holtmann   Bluetooth: btusb:...
2733
  		hdev->manufacturer = 2;
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2734
2735
  		hdev->send = btusb_send_frame_intel;
  		hdev->setup = btusb_setup_intel_new;
eeb6abe97   Marcel Holtmann   Bluetooth: btusb:...
2736
  		hdev->hw_error = btintel_hw_error;
6d2e50d24   Marcel Holtmann   Bluetooth: btinte...
2737
  		hdev->set_diag = btintel_set_diag;
4185a0f5d   Marcel Holtmann   Bluetooth: btusb:...
2738
  		hdev->set_bdaddr = btintel_set_bdaddr;
b970c5ba9   Marcel Holtmann   Bluetooth: Set HC...
2739
  		set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
d8270fbb3   Marcel Holtmann   Bluetooth: btinte...
2740
  		set_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks);
cda0dd780   Marcel Holtmann   Bluetooth: btusb:...
2741
  	}
ae8df494e   Amitkumar Karwar   Bluetooth: add pu...
2742
2743
  	if (id->driver_info & BTUSB_MARVELL)
  		hdev->set_bdaddr = btusb_set_bdaddr_marvell;
661cf88ac   Marcel Holtmann   Bluetooth: Use HC...
2744
2745
  	if (id->driver_info & BTUSB_SWAVE) {
  		set_bit(HCI_QUIRK_FIXUP_INQUIRY_MODE, &hdev->quirks);
d57dbe779   Marcel Holtmann   Bluetooth: btusb:...
2746
  		set_bit(HCI_QUIRK_BROKEN_LOCAL_COMMANDS, &hdev->quirks);
661cf88ac   Marcel Holtmann   Bluetooth: Use HC...
2747
  	}
d57dbe779   Marcel Holtmann   Bluetooth: btusb:...
2748

e4c534bba   Marcel Holtmann   Bluetooth: btusb:...
2749
2750
  	if (id->driver_info & BTUSB_INTEL_BOOT) {
  		hdev->manufacturer = 2;
40df783d1   Marcel Holtmann   Bluetooth: Add su...
2751
  		set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
e4c534bba   Marcel Holtmann   Bluetooth: btusb:...
2752
  	}
40df783d1   Marcel Holtmann   Bluetooth: Add su...
2753

79f0c87d9   Jakub Pawlowski   Bluetooth: Set HC...
2754
  	if (id->driver_info & BTUSB_ATH3012) {
5859223e0   Toshi Kikuchi   Bluetooth: btusb:...
2755
  		hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
3d50d51a5   Jakub Pawlowski   Bluetooth: Set HC...
2756
  		set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
79f0c87d9   Jakub Pawlowski   Bluetooth: Set HC...
2757
2758
  		set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
  	}
5859223e0   Toshi Kikuchi   Bluetooth: btusb:...
2759

3267c884c   Kim, Ben Young Tae   Bluetooth: btusb:...
2760
2761
2762
2763
  	if (id->driver_info & BTUSB_QCA_ROME) {
  		data->setup_on_usb = btusb_setup_qca;
  		hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
  	}
db33c77dd   Carlo Caione   Bluetooth: btrtl:...
2764
  #ifdef CONFIG_BT_HCIBTUSB_RTL
04b8c8143   Daniel Drake   Bluetooth: btusb:...
2765
  	if (id->driver_info & BTUSB_REALTEK) {
db33c77dd   Carlo Caione   Bluetooth: btrtl:...
2766
  		hdev->setup = btrtl_setup_realtek;
04b8c8143   Daniel Drake   Bluetooth: btusb:...
2767
2768
2769
2770
2771
2772
2773
  
  		/* Realtek devices lose their updated firmware over suspend,
  		 * but the USB hub doesn't notice any status change.
  		 * Explicitly request a device reset on resume.
  		 */
  		set_bit(BTUSB_RESET_RESUME, &data->flags);
  	}
db33c77dd   Carlo Caione   Bluetooth: btrtl:...
2774
  #endif
a2698a9bf   Daniel Drake   Bluetooth: btusb:...
2775

893ba5440   Marcel Holtmann   Bluetooth: btusb:...
2776
2777
2778
2779
  	if (id->driver_info & BTUSB_AMP) {
  		/* AMP controllers do not support SCO packets */
  		data->isoc = NULL;
  	} else {
22f8e9dbf   Marcel Holtmann   Bluetooth: btusb:...
2780
2781
  		/* Interface orders are hardcoded in the specification */
  		data->isoc = usb_ifnum_to_if(data->udev, ifnum_base + 1);
893ba5440   Marcel Holtmann   Bluetooth: btusb:...
2782
  	}
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
2783

7a9d40205   Marcel Holtmann   Bluetooth: Send H...
2784
  	if (!reset)
a6c511c63   Szymon Janc   Bluetooth: Rename...
2785
  		set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
2786
2787
2788
2789
2790
  
  	if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) {
  		if (!disable_scofix)
  			set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks);
  	}
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
2791
2792
  	if (id->driver_info & BTUSB_BROKEN_ISOC)
  		data->isoc = NULL;
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
2793
2794
  	if (id->driver_info & BTUSB_DIGIANSWER) {
  		data->cmdreq_type = USB_TYPE_VENDOR;
a6c511c63   Szymon Janc   Bluetooth: Rename...
2795
  		set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
2796
2797
2798
2799
  	}
  
  	if (id->driver_info & BTUSB_CSR) {
  		struct usb_device *udev = data->udev;
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
2800
  		u16 bcdDevice = le16_to_cpu(udev->descriptor.bcdDevice);
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
2801
2802
  
  		/* Old firmware would otherwise execute USB reset */
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
2803
  		if (bcdDevice < 0x117)
a6c511c63   Szymon Janc   Bluetooth: Rename...
2804
  			set_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks);
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
2805
2806
  
  		/* Fake CSR devices with broken commands */
6cafcd959   Johan Hedberg   Bluetooth: btusb:...
2807
  		if (bcdDevice <= 0x100 || bcdDevice == 0x134)
81cac64ba   Marcel Holtmann   Bluetooth: Deal w...
2808
  			hdev->setup = btusb_setup_csr;
49c989a0d   Jakub Pawlowski   Bluetooth: Set HC...
2809
2810
  
  		set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
7a9d40205   Marcel Holtmann   Bluetooth: Send H...
2811
  	}
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
2812
  	if (id->driver_info & BTUSB_SNIFFER) {
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
2813
  		struct usb_device *udev = data->udev;
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
2814

7a9d40205   Marcel Holtmann   Bluetooth: Send H...
2815
  		/* New sniffer firmware has crippled HCI interface */
cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
2816
2817
2818
  		if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
  			set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
  	}
3a5ef20c9   Marcel Holtmann   Bluetooth: Handle...
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
  	if (id->driver_info & BTUSB_INTEL_BOOT) {
  		/* A bug in the bootloader causes that interrupt interface is
  		 * only enabled after receiving SetInterface(0, AltSetting=0).
  		 */
  		err = usb_set_interface(data->udev, 0, 0);
  		if (err < 0) {
  			BT_ERR("failed to set interface 0, alt 0 %d", err);
  			hci_free_dev(hdev);
  			return err;
  		}
  	}
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
2830
2831
  	if (data->isoc) {
  		err = usb_driver_claim_interface(&btusb_driver,
89e7533d0   Marcel Holtmann   Bluetooth: btusb:...
2832
  						 data->isoc, data);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
2833
2834
  		if (err < 0) {
  			hci_free_dev(hdev);
9bfa35fe4   Marcel Holtmann   [Bluetooth] Add S...
2835
2836
2837
  			return err;
  		}
  	}
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2838
2839
2840
2841
2842
2843
2844
2845
2846
  #ifdef CONFIG_BT_HCIBTUSB_BCM
  	if (data->diag) {
  		if (!usb_driver_claim_interface(&btusb_driver,
  						data->diag, data))
  			__set_diag_interface(hdev);
  		else
  			data->diag = NULL;
  	}
  #endif
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2847
2848
2849
  	err = hci_register_dev(hdev);
  	if (err < 0) {
  		hci_free_dev(hdev);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
  		return err;
  	}
  
  	usb_set_intfdata(intf, data);
  
  	return 0;
  }
  
  static void btusb_disconnect(struct usb_interface *intf)
  {
  	struct btusb_data *data = usb_get_intfdata(intf);
  	struct hci_dev *hdev;
  
  	BT_DBG("intf %p", intf);
  
  	if (!data)
  		return;
  
  	hdev = data->hdev;
5fbcd260c   Marcel Holtmann   [Bluetooth] Fix U...
2869
2870
2871
2872
  	usb_set_intfdata(data->intf, NULL);
  
  	if (data->isoc)
  		usb_set_intfdata(data->isoc, NULL);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2873

9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2874
2875
  	if (data->diag)
  		usb_set_intfdata(data->diag, NULL);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2876
  	hci_unregister_dev(hdev);
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2877
2878
2879
2880
2881
2882
2883
2884
  	if (intf == data->intf) {
  		if (data->isoc)
  			usb_driver_release_interface(&btusb_driver, data->isoc);
  		if (data->diag)
  			usb_driver_release_interface(&btusb_driver, data->diag);
  	} else if (intf == data->isoc) {
  		if (data->diag)
  			usb_driver_release_interface(&btusb_driver, data->diag);
5fbcd260c   Marcel Holtmann   [Bluetooth] Fix U...
2885
  		usb_driver_release_interface(&btusb_driver, data->intf);
9d08f5040   Marcel Holtmann   Bluetooth: btusb:...
2886
2887
2888
2889
2890
  	} else if (intf == data->diag) {
  		usb_driver_release_interface(&btusb_driver, data->intf);
  		if (data->isoc)
  			usb_driver_release_interface(&btusb_driver, data->isoc);
  	}
5fbcd260c   Marcel Holtmann   [Bluetooth] Fix U...
2891

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2892
2893
  	hci_free_dev(hdev);
  }
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2894
  #ifdef CONFIG_PM
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2895
2896
2897
2898
2899
2900
2901
2902
  static int btusb_suspend(struct usb_interface *intf, pm_message_t message)
  {
  	struct btusb_data *data = usb_get_intfdata(intf);
  
  	BT_DBG("intf %p", intf);
  
  	if (data->suspend_count++)
  		return 0;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2903
  	spin_lock_irq(&data->txlock);
5b1b0b812   Alan Stern   PM / Runtime: Add...
2904
  	if (!(PMSG_IS_AUTO(message) && data->tx_in_flight)) {
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2905
2906
2907
2908
2909
2910
2911
  		set_bit(BTUSB_SUSPENDING, &data->flags);
  		spin_unlock_irq(&data->txlock);
  	} else {
  		spin_unlock_irq(&data->txlock);
  		data->suspend_count--;
  		return -EBUSY;
  	}
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2912
  	cancel_work_sync(&data->work);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2913
  	btusb_stop_traffic(data);
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2914
  	usb_kill_anchored_urbs(&data->tx_anchor);
04b8c8143   Daniel Drake   Bluetooth: btusb:...
2915
2916
2917
2918
2919
2920
2921
  	/* Optionally request a device reset on resume, but only when
  	 * wakeups are disabled. If wakeups are enabled we assume the
  	 * device will stay powered up throughout suspend.
  	 */
  	if (test_bit(BTUSB_RESET_RESUME, &data->flags) &&
  	    !device_may_wakeup(&data->udev->dev))
  		data->udev->reset_resume = 1;
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2922
2923
  	return 0;
  }
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
  static void play_deferred(struct btusb_data *data)
  {
  	struct urb *urb;
  	int err;
  
  	while ((urb = usb_get_from_anchor(&data->deferred))) {
  		err = usb_submit_urb(urb, GFP_ATOMIC);
  		if (err < 0)
  			break;
  
  		data->tx_in_flight++;
  	}
  	usb_scuttle_anchored_urbs(&data->deferred);
  }
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2938
2939
2940
2941
  static int btusb_resume(struct usb_interface *intf)
  {
  	struct btusb_data *data = usb_get_intfdata(intf);
  	struct hci_dev *hdev = data->hdev;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2942
  	int err = 0;
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2943
2944
2945
2946
2947
2948
2949
  
  	BT_DBG("intf %p", intf);
  
  	if (--data->suspend_count)
  		return 0;
  
  	if (!test_bit(HCI_RUNNING, &hdev->flags))
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2950
  		goto done;
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2951
2952
2953
2954
2955
  
  	if (test_bit(BTUSB_INTR_RUNNING, &data->flags)) {
  		err = btusb_submit_intr_urb(hdev, GFP_NOIO);
  		if (err < 0) {
  			clear_bit(BTUSB_INTR_RUNNING, &data->flags);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2956
  			goto failed;
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2957
2958
2959
2960
  		}
  	}
  
  	if (test_bit(BTUSB_BULK_RUNNING, &data->flags)) {
43c2e57f9   Marcel Holtmann   Bluetooth: Submit...
2961
2962
  		err = btusb_submit_bulk_urb(hdev, GFP_NOIO);
  		if (err < 0) {
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2963
  			clear_bit(BTUSB_BULK_RUNNING, &data->flags);
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2964
2965
2966
2967
  			goto failed;
  		}
  
  		btusb_submit_bulk_urb(hdev, GFP_NOIO);
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2968
2969
2970
2971
2972
2973
2974
2975
  	}
  
  	if (test_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
  		if (btusb_submit_isoc_urb(hdev, GFP_NOIO) < 0)
  			clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
  		else
  			btusb_submit_isoc_urb(hdev, GFP_NOIO);
  	}
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2976
2977
2978
2979
2980
  	spin_lock_irq(&data->txlock);
  	play_deferred(data);
  	clear_bit(BTUSB_SUSPENDING, &data->flags);
  	spin_unlock_irq(&data->txlock);
  	schedule_work(&data->work);
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2981
  	return 0;
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2982
2983
2984
2985
2986
2987
2988
2989
2990
  
  failed:
  	usb_scuttle_anchored_urbs(&data->deferred);
  done:
  	spin_lock_irq(&data->txlock);
  	clear_bit(BTUSB_SUSPENDING, &data->flags);
  	spin_unlock_irq(&data->txlock);
  
  	return err;
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2991
  }
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2992
  #endif
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2993

5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
2994
2995
2996
2997
  static struct usb_driver btusb_driver = {
  	.name		= "btusb",
  	.probe		= btusb_probe,
  	.disconnect	= btusb_disconnect,
7bee549e1   Oliver Neukum   Bluetooth: Add US...
2998
  #ifdef CONFIG_PM
6a88adf2a   Marcel Holtmann   Bluetooth: Add su...
2999
3000
  	.suspend	= btusb_suspend,
  	.resume		= btusb_resume,
7bee549e1   Oliver Neukum   Bluetooth: Add US...
3001
  #endif
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
3002
  	.id_table	= btusb_table,
7bee549e1   Oliver Neukum   Bluetooth: Add US...
3003
  	.supports_autosuspend = 1,
e1f12eb6b   Sarah Sharp   USB: Disable hub-...
3004
  	.disable_hub_initiated_lpm = 1,
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
3005
  };
93f1508cf   Greg Kroah-Hartman   USB: convert driv...
3006
  module_usb_driver(btusb_driver);
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
3007

cfeb41453   Marcel Holtmann   [Bluetooth] Add f...
3008
3009
3010
3011
3012
3013
3014
3015
  module_param(disable_scofix, bool, 0644);
  MODULE_PARM_DESC(disable_scofix, "Disable fixup of wrong SCO buffer size");
  
  module_param(force_scofix, bool, 0644);
  MODULE_PARM_DESC(force_scofix, "Force fixup of wrong SCO buffers size");
  
  module_param(reset, bool, 0644);
  MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
5e23b923d   Marcel Holtmann   [Bluetooth] Add g...
3016
3017
3018
3019
  MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
  MODULE_DESCRIPTION("Generic Bluetooth USB driver ver " VERSION);
  MODULE_VERSION(VERSION);
  MODULE_LICENSE("GPL");