blob: e2d4beac74207c711bdafaf11399d0170d73d07b [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 HCI USB driver for Linux Bluetooth protocol stack (BlueZ)
3 Copyright (C) 2000-2001 Qualcomm Incorporated
4 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
5
6 Copyright (C) 2003 Maxim Krasnyansky <maxk@qualcomm.com>
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License version 2 as
10 published by the Free Software Foundation;
11
12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
13 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
15 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
16 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
17 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20
21 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
22 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
23 SOFTWARE IS DISCLAIMED.
24*/
25
26/*
27 * Bluetooth HCI USB driver.
28 * Based on original USB Bluetooth driver for Linux kernel
29 * Copyright (c) 2000 Greg Kroah-Hartman <greg@kroah.com>
30 * Copyright (c) 2000 Mark Douglas Corner <mcorner@umich.edu>
31 *
32 */
33
Linus Torvalds1da177e2005-04-16 15:20:36 -070034#include <linux/module.h>
35
36#include <linux/kernel.h>
37#include <linux/init.h>
38#include <linux/sched.h>
39#include <linux/unistd.h>
40#include <linux/types.h>
41#include <linux/interrupt.h>
42#include <linux/moduleparam.h>
43
44#include <linux/slab.h>
45#include <linux/errno.h>
46#include <linux/string.h>
47#include <linux/skbuff.h>
48
49#include <linux/usb.h>
50
51#include <net/bluetooth/bluetooth.h>
52#include <net/bluetooth/hci_core.h>
53
54#include "hci_usb.h"
55
56#ifndef CONFIG_BT_HCIUSB_DEBUG
57#undef BT_DBG
58#define BT_DBG(D...)
Linus Torvalds1da177e2005-04-16 15:20:36 -070059#endif
60
61#ifndef CONFIG_BT_HCIUSB_ZERO_PACKET
62#undef URB_ZERO_PACKET
63#define URB_ZERO_PACKET 0
64#endif
65
66static int ignore = 0;
Marcel Holtmann7ef934b2005-11-08 09:57:05 -080067static int ignore_dga = 0;
Marcel Holtmann0915e882005-09-13 01:32:37 +020068static int ignore_csr = 0;
69static int ignore_sniffer = 0;
Marcel Holtmann520ca782006-07-14 16:01:52 +020070static int disable_scofix = 0;
71static int force_scofix = 0;
Linus Torvalds1da177e2005-04-16 15:20:36 -070072static int reset = 0;
73
74#ifdef CONFIG_BT_HCIUSB_SCO
75static int isoc = 2;
76#endif
77
Marcel Holtmann0915e882005-09-13 01:32:37 +020078#define VERSION "2.9"
Linus Torvalds1da177e2005-04-16 15:20:36 -070079
80static struct usb_driver hci_usb_driver;
81
82static struct usb_device_id bluetooth_ids[] = {
83 /* Generic Bluetooth USB device */
84 { USB_DEVICE_INFO(HCI_DEV_CLASS, HCI_DEV_SUBCLASS, HCI_DEV_PROTOCOL) },
85
86 /* AVM BlueFRITZ! USB v2.0 */
87 { USB_DEVICE(0x057c, 0x3800) },
88
89 /* Bluetooth Ultraport Module from IBM */
90 { USB_DEVICE(0x04bf, 0x030a) },
91
92 /* ALPS Modules with non-standard id */
93 { USB_DEVICE(0x044e, 0x3001) },
94 { USB_DEVICE(0x044e, 0x3002) },
95
96 /* Ericsson with non-standard id */
97 { USB_DEVICE(0x0bdb, 0x1002) },
98
99 { } /* Terminating entry */
100};
101
102MODULE_DEVICE_TABLE (usb, bluetooth_ids);
103
104static struct usb_device_id blacklist_ids[] = {
Marcel Holtmann0915e882005-09-13 01:32:37 +0200105 /* CSR BlueCore devices */
106 { USB_DEVICE(0x0a12, 0x0001), .driver_info = HCI_CSR },
107
Linus Torvalds1da177e2005-04-16 15:20:36 -0700108 /* Broadcom BCM2033 without firmware */
109 { USB_DEVICE(0x0a5c, 0x2033), .driver_info = HCI_IGNORE },
110
111 /* Broadcom BCM2035 */
Marcel Holtmanne9e92902006-07-18 18:32:33 +0200112 { USB_DEVICE(0x0a5c, 0x200a), .driver_info = HCI_RESET | HCI_WRONG_SCO_MTU },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700113 { USB_DEVICE(0x0a5c, 0x2009), .driver_info = HCI_BCM92035 },
114
Marcel Holtmann520ca782006-07-14 16:01:52 +0200115 /* IBM/Lenovo ThinkPad with Broadcom chip */
116 { USB_DEVICE(0x0a5c, 0x201e), .driver_info = HCI_WRONG_SCO_MTU },
117
Linus Torvalds1da177e2005-04-16 15:20:36 -0700118 /* Microsoft Wireless Transceiver for Bluetooth 2.0 */
119 { USB_DEVICE(0x045e, 0x009c), .driver_info = HCI_RESET },
120
Marcel Holtmanncad0f622005-08-06 12:36:36 +0200121 /* Kensington Bluetooth USB adapter */
122 { USB_DEVICE(0x047d, 0x105d), .driver_info = HCI_RESET },
123
Linus Torvalds1da177e2005-04-16 15:20:36 -0700124 /* ISSC Bluetooth Adapter v3.1 */
125 { USB_DEVICE(0x1131, 0x1001), .driver_info = HCI_RESET },
126
Marcel Holtmann8e4f7232006-07-18 18:04:59 +0200127 /* RTX Telecom based adapters with buggy SCO support */
Linus Torvalds1da177e2005-04-16 15:20:36 -0700128 { USB_DEVICE(0x0400, 0x0807), .driver_info = HCI_BROKEN_ISOC },
Marcel Holtmann8e4f7232006-07-18 18:04:59 +0200129 { USB_DEVICE(0x0400, 0x080a), .driver_info = HCI_BROKEN_ISOC },
Linus Torvalds1da177e2005-04-16 15:20:36 -0700130
Marcel Holtmannea9727f2006-07-18 17:47:40 +0200131 /* Belkin F8T012 and F8T013 devices */
Marcel Holtmannda1f5192006-07-03 10:02:29 +0200132 { USB_DEVICE(0x050d, 0x0012), .driver_info = HCI_WRONG_SCO_MTU },
Marcel Holtmannea9727f2006-07-18 17:47:40 +0200133 { USB_DEVICE(0x050d, 0x0013), .driver_info = HCI_WRONG_SCO_MTU },
Marcel Holtmannda1f5192006-07-03 10:02:29 +0200134
Linus Torvalds1da177e2005-04-16 15:20:36 -0700135 /* Digianswer devices */
136 { USB_DEVICE(0x08fd, 0x0001), .driver_info = HCI_DIGIANSWER },
137 { USB_DEVICE(0x08fd, 0x0002), .driver_info = HCI_IGNORE },
138
139 /* CSR BlueCore Bluetooth Sniffer */
140 { USB_DEVICE(0x0a12, 0x0002), .driver_info = HCI_SNIFFER },
141
Marcel Holtmann2b86ad22006-07-03 10:02:18 +0200142 /* Frontline ComProbe Bluetooth Sniffer */
143 { USB_DEVICE(0x16d3, 0x0002), .driver_info = HCI_SNIFFER },
144
Linus Torvalds1da177e2005-04-16 15:20:36 -0700145 { } /* Terminating entry */
146};
147
Al Virodd0fc662005-10-07 07:46:04 +0100148static struct _urb *_urb_alloc(int isoc, gfp_t gfp)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700149{
150 struct _urb *_urb = kmalloc(sizeof(struct _urb) +
151 sizeof(struct usb_iso_packet_descriptor) * isoc, gfp);
152 if (_urb) {
153 memset(_urb, 0, sizeof(*_urb));
154 usb_init_urb(&_urb->urb);
155 }
156 return _urb;
157}
158
159static struct _urb *_urb_dequeue(struct _urb_queue *q)
160{
161 struct _urb *_urb = NULL;
162 unsigned long flags;
163 spin_lock_irqsave(&q->lock, flags);
164 {
165 struct list_head *head = &q->head;
166 struct list_head *next = head->next;
167 if (next != head) {
168 _urb = list_entry(next, struct _urb, list);
169 list_del(next); _urb->queue = NULL;
170 }
171 }
172 spin_unlock_irqrestore(&q->lock, flags);
173 return _urb;
174}
175
176static void hci_usb_rx_complete(struct urb *urb, struct pt_regs *regs);
177static void hci_usb_tx_complete(struct urb *urb, struct pt_regs *regs);
178
179#define __pending_tx(husb, type) (&husb->pending_tx[type-1])
180#define __pending_q(husb, type) (&husb->pending_q[type-1])
181#define __completed_q(husb, type) (&husb->completed_q[type-1])
182#define __transmit_q(husb, type) (&husb->transmit_q[type-1])
183#define __reassembly(husb, type) (husb->reassembly[type-1])
184
185static inline struct _urb *__get_completed(struct hci_usb *husb, int type)
186{
187 return _urb_dequeue(__completed_q(husb, type));
188}
189
190#ifdef CONFIG_BT_HCIUSB_SCO
191static void __fill_isoc_desc(struct urb *urb, int len, int mtu)
192{
193 int offset = 0, i;
194
195 BT_DBG("len %d mtu %d", len, mtu);
196
197 for (i=0; i < HCI_MAX_ISOC_FRAMES && len >= mtu; i++, offset += mtu, len -= mtu) {
198 urb->iso_frame_desc[i].offset = offset;
199 urb->iso_frame_desc[i].length = mtu;
200 BT_DBG("desc %d offset %d len %d", i, offset, mtu);
201 }
202 if (len && i < HCI_MAX_ISOC_FRAMES) {
203 urb->iso_frame_desc[i].offset = offset;
204 urb->iso_frame_desc[i].length = len;
205 BT_DBG("desc %d offset %d len %d", i, offset, len);
206 i++;
207 }
208 urb->number_of_packets = i;
209}
210#endif
211
212static int hci_usb_intr_rx_submit(struct hci_usb *husb)
213{
214 struct _urb *_urb;
215 struct urb *urb;
216 int err, pipe, interval, size;
217 void *buf;
218
219 BT_DBG("%s", husb->hdev->name);
220
221 size = le16_to_cpu(husb->intr_in_ep->desc.wMaxPacketSize);
222
223 buf = kmalloc(size, GFP_ATOMIC);
224 if (!buf)
225 return -ENOMEM;
226
227 _urb = _urb_alloc(0, GFP_ATOMIC);
228 if (!_urb) {
229 kfree(buf);
230 return -ENOMEM;
231 }
232 _urb->type = HCI_EVENT_PKT;
233 _urb_queue_tail(__pending_q(husb, _urb->type), _urb);
234
235 urb = &_urb->urb;
236 pipe = usb_rcvintpipe(husb->udev, husb->intr_in_ep->desc.bEndpointAddress);
237 interval = husb->intr_in_ep->desc.bInterval;
238 usb_fill_int_urb(urb, husb->udev, pipe, buf, size, hci_usb_rx_complete, husb, interval);
239
240 err = usb_submit_urb(urb, GFP_ATOMIC);
241 if (err) {
242 BT_ERR("%s intr rx submit failed urb %p err %d",
243 husb->hdev->name, urb, err);
244 _urb_unlink(_urb);
245 _urb_free(_urb);
246 kfree(buf);
247 }
248 return err;
249}
250
251static int hci_usb_bulk_rx_submit(struct hci_usb *husb)
252{
253 struct _urb *_urb;
254 struct urb *urb;
255 int err, pipe, size = HCI_MAX_FRAME_SIZE;
256 void *buf;
257
258 buf = kmalloc(size, GFP_ATOMIC);
259 if (!buf)
260 return -ENOMEM;
261
262 _urb = _urb_alloc(0, GFP_ATOMIC);
263 if (!_urb) {
264 kfree(buf);
265 return -ENOMEM;
266 }
267 _urb->type = HCI_ACLDATA_PKT;
268 _urb_queue_tail(__pending_q(husb, _urb->type), _urb);
269
270 urb = &_urb->urb;
271 pipe = usb_rcvbulkpipe(husb->udev, husb->bulk_in_ep->desc.bEndpointAddress);
272 usb_fill_bulk_urb(urb, husb->udev, pipe, buf, size, hci_usb_rx_complete, husb);
273 urb->transfer_flags = 0;
274
275 BT_DBG("%s urb %p", husb->hdev->name, urb);
276
277 err = usb_submit_urb(urb, GFP_ATOMIC);
278 if (err) {
279 BT_ERR("%s bulk rx submit failed urb %p err %d",
280 husb->hdev->name, urb, err);
281 _urb_unlink(_urb);
282 _urb_free(_urb);
283 kfree(buf);
284 }
285 return err;
286}
287
288#ifdef CONFIG_BT_HCIUSB_SCO
289static int hci_usb_isoc_rx_submit(struct hci_usb *husb)
290{
291 struct _urb *_urb;
292 struct urb *urb;
293 int err, mtu, size;
294 void *buf;
295
296 mtu = le16_to_cpu(husb->isoc_in_ep->desc.wMaxPacketSize);
297 size = mtu * HCI_MAX_ISOC_FRAMES;
298
299 buf = kmalloc(size, GFP_ATOMIC);
300 if (!buf)
301 return -ENOMEM;
302
303 _urb = _urb_alloc(HCI_MAX_ISOC_FRAMES, GFP_ATOMIC);
304 if (!_urb) {
305 kfree(buf);
306 return -ENOMEM;
307 }
308 _urb->type = HCI_SCODATA_PKT;
309 _urb_queue_tail(__pending_q(husb, _urb->type), _urb);
310
311 urb = &_urb->urb;
312
313 urb->context = husb;
314 urb->dev = husb->udev;
315 urb->pipe = usb_rcvisocpipe(husb->udev, husb->isoc_in_ep->desc.bEndpointAddress);
316 urb->complete = hci_usb_rx_complete;
317
318 urb->interval = husb->isoc_in_ep->desc.bInterval;
319
320 urb->transfer_buffer_length = size;
321 urb->transfer_buffer = buf;
322 urb->transfer_flags = URB_ISO_ASAP;
323
324 __fill_isoc_desc(urb, size, mtu);
325
326 BT_DBG("%s urb %p", husb->hdev->name, urb);
327
328 err = usb_submit_urb(urb, GFP_ATOMIC);
329 if (err) {
330 BT_ERR("%s isoc rx submit failed urb %p err %d",
331 husb->hdev->name, urb, err);
332 _urb_unlink(_urb);
333 _urb_free(_urb);
334 kfree(buf);
335 }
336 return err;
337}
338#endif
339
340/* Initialize device */
341static int hci_usb_open(struct hci_dev *hdev)
342{
343 struct hci_usb *husb = (struct hci_usb *) hdev->driver_data;
344 int i, err;
345 unsigned long flags;
346
347 BT_DBG("%s", hdev->name);
348
349 if (test_and_set_bit(HCI_RUNNING, &hdev->flags))
350 return 0;
351
352 write_lock_irqsave(&husb->completion_lock, flags);
353
354 err = hci_usb_intr_rx_submit(husb);
355 if (!err) {
356 for (i = 0; i < HCI_MAX_BULK_RX; i++)
357 hci_usb_bulk_rx_submit(husb);
358
359#ifdef CONFIG_BT_HCIUSB_SCO
360 if (husb->isoc_iface)
361 for (i = 0; i < HCI_MAX_ISOC_RX; i++)
362 hci_usb_isoc_rx_submit(husb);
363#endif
364 } else {
365 clear_bit(HCI_RUNNING, &hdev->flags);
366 }
367
368 write_unlock_irqrestore(&husb->completion_lock, flags);
369 return err;
370}
371
372/* Reset device */
373static int hci_usb_flush(struct hci_dev *hdev)
374{
375 struct hci_usb *husb = (struct hci_usb *) hdev->driver_data;
376 int i;
377
378 BT_DBG("%s", hdev->name);
379
380 for (i = 0; i < 4; i++)
381 skb_queue_purge(&husb->transmit_q[i]);
382 return 0;
383}
384
385static void hci_usb_unlink_urbs(struct hci_usb *husb)
386{
387 int i;
388
389 BT_DBG("%s", husb->hdev->name);
390
391 for (i = 0; i < 4; i++) {
392 struct _urb *_urb;
393 struct urb *urb;
394
395 /* Kill pending requests */
396 while ((_urb = _urb_dequeue(&husb->pending_q[i]))) {
397 urb = &_urb->urb;
398 BT_DBG("%s unlinking _urb %p type %d urb %p",
399 husb->hdev->name, _urb, _urb->type, urb);
400 usb_kill_urb(urb);
401 _urb_queue_tail(__completed_q(husb, _urb->type), _urb);
402 }
403
404 /* Release completed requests */
405 while ((_urb = _urb_dequeue(&husb->completed_q[i]))) {
406 urb = &_urb->urb;
407 BT_DBG("%s freeing _urb %p type %d urb %p",
408 husb->hdev->name, _urb, _urb->type, urb);
Marcel Holtmanne9a3e672005-08-06 12:36:47 +0200409 kfree(urb->setup_packet);
410 kfree(urb->transfer_buffer);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700411 _urb_free(_urb);
412 }
413
414 /* Release reassembly buffers */
415 if (husb->reassembly[i]) {
416 kfree_skb(husb->reassembly[i]);
417 husb->reassembly[i] = NULL;
418 }
419 }
420}
421
422/* Close device */
423static int hci_usb_close(struct hci_dev *hdev)
424{
425 struct hci_usb *husb = (struct hci_usb *) hdev->driver_data;
426 unsigned long flags;
427
428 if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
429 return 0;
430
431 BT_DBG("%s", hdev->name);
432
433 /* Synchronize with completion handlers */
434 write_lock_irqsave(&husb->completion_lock, flags);
435 write_unlock_irqrestore(&husb->completion_lock, flags);
436
437 hci_usb_unlink_urbs(husb);
438 hci_usb_flush(hdev);
439 return 0;
440}
441
442static int __tx_submit(struct hci_usb *husb, struct _urb *_urb)
443{
444 struct urb *urb = &_urb->urb;
445 int err;
446
447 BT_DBG("%s urb %p type %d", husb->hdev->name, urb, _urb->type);
448
449 _urb_queue_tail(__pending_q(husb, _urb->type), _urb);
450 err = usb_submit_urb(urb, GFP_ATOMIC);
451 if (err) {
452 BT_ERR("%s tx submit failed urb %p type %d err %d",
453 husb->hdev->name, urb, _urb->type, err);
454 _urb_unlink(_urb);
455 _urb_queue_tail(__completed_q(husb, _urb->type), _urb);
456 } else
457 atomic_inc(__pending_tx(husb, _urb->type));
458
459 return err;
460}
461
462static inline int hci_usb_send_ctrl(struct hci_usb *husb, struct sk_buff *skb)
463{
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700464 struct _urb *_urb = __get_completed(husb, bt_cb(skb)->pkt_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700465 struct usb_ctrlrequest *dr;
466 struct urb *urb;
467
468 if (!_urb) {
469 _urb = _urb_alloc(0, GFP_ATOMIC);
470 if (!_urb)
471 return -ENOMEM;
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700472 _urb->type = bt_cb(skb)->pkt_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473
474 dr = kmalloc(sizeof(*dr), GFP_ATOMIC);
475 if (!dr) {
476 _urb_free(_urb);
477 return -ENOMEM;
478 }
479 } else
480 dr = (void *) _urb->urb.setup_packet;
481
482 dr->bRequestType = husb->ctrl_req;
483 dr->bRequest = 0;
484 dr->wIndex = 0;
485 dr->wValue = 0;
486 dr->wLength = __cpu_to_le16(skb->len);
487
488 urb = &_urb->urb;
489 usb_fill_control_urb(urb, husb->udev, usb_sndctrlpipe(husb->udev, 0),
490 (void *) dr, skb->data, skb->len, hci_usb_tx_complete, husb);
491
492 BT_DBG("%s skb %p len %d", husb->hdev->name, skb, skb->len);
493
494 _urb->priv = skb;
495 return __tx_submit(husb, _urb);
496}
497
498static inline int hci_usb_send_bulk(struct hci_usb *husb, struct sk_buff *skb)
499{
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700500 struct _urb *_urb = __get_completed(husb, bt_cb(skb)->pkt_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700501 struct urb *urb;
502 int pipe;
503
504 if (!_urb) {
505 _urb = _urb_alloc(0, GFP_ATOMIC);
506 if (!_urb)
507 return -ENOMEM;
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700508 _urb->type = bt_cb(skb)->pkt_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700509 }
510
511 urb = &_urb->urb;
512 pipe = usb_sndbulkpipe(husb->udev, husb->bulk_out_ep->desc.bEndpointAddress);
513 usb_fill_bulk_urb(urb, husb->udev, pipe, skb->data, skb->len,
514 hci_usb_tx_complete, husb);
515 urb->transfer_flags = URB_ZERO_PACKET;
516
517 BT_DBG("%s skb %p len %d", husb->hdev->name, skb, skb->len);
518
519 _urb->priv = skb;
520 return __tx_submit(husb, _urb);
521}
522
523#ifdef CONFIG_BT_HCIUSB_SCO
524static inline int hci_usb_send_isoc(struct hci_usb *husb, struct sk_buff *skb)
525{
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700526 struct _urb *_urb = __get_completed(husb, bt_cb(skb)->pkt_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700527 struct urb *urb;
528
529 if (!_urb) {
530 _urb = _urb_alloc(HCI_MAX_ISOC_FRAMES, GFP_ATOMIC);
531 if (!_urb)
532 return -ENOMEM;
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700533 _urb->type = bt_cb(skb)->pkt_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 }
535
536 BT_DBG("%s skb %p len %d", husb->hdev->name, skb, skb->len);
537
538 urb = &_urb->urb;
539
540 urb->context = husb;
541 urb->dev = husb->udev;
542 urb->pipe = usb_sndisocpipe(husb->udev, husb->isoc_out_ep->desc.bEndpointAddress);
543 urb->complete = hci_usb_tx_complete;
544 urb->transfer_flags = URB_ISO_ASAP;
545
546 urb->interval = husb->isoc_out_ep->desc.bInterval;
547
548 urb->transfer_buffer = skb->data;
549 urb->transfer_buffer_length = skb->len;
550
551 __fill_isoc_desc(urb, skb->len, le16_to_cpu(husb->isoc_out_ep->desc.wMaxPacketSize));
552
553 _urb->priv = skb;
554 return __tx_submit(husb, _urb);
555}
556#endif
557
558static void hci_usb_tx_process(struct hci_usb *husb)
559{
560 struct sk_buff_head *q;
561 struct sk_buff *skb;
562
563 BT_DBG("%s", husb->hdev->name);
564
565 do {
566 clear_bit(HCI_USB_TX_WAKEUP, &husb->state);
567
568 /* Process command queue */
569 q = __transmit_q(husb, HCI_COMMAND_PKT);
570 if (!atomic_read(__pending_tx(husb, HCI_COMMAND_PKT)) &&
571 (skb = skb_dequeue(q))) {
572 if (hci_usb_send_ctrl(husb, skb) < 0)
573 skb_queue_head(q, skb);
574 }
575
576#ifdef CONFIG_BT_HCIUSB_SCO
577 /* Process SCO queue */
578 q = __transmit_q(husb, HCI_SCODATA_PKT);
579 if (atomic_read(__pending_tx(husb, HCI_SCODATA_PKT)) < HCI_MAX_ISOC_TX &&
580 (skb = skb_dequeue(q))) {
581 if (hci_usb_send_isoc(husb, skb) < 0)
582 skb_queue_head(q, skb);
583 }
584#endif
585
586 /* Process ACL queue */
587 q = __transmit_q(husb, HCI_ACLDATA_PKT);
588 while (atomic_read(__pending_tx(husb, HCI_ACLDATA_PKT)) < HCI_MAX_BULK_TX &&
589 (skb = skb_dequeue(q))) {
590 if (hci_usb_send_bulk(husb, skb) < 0) {
591 skb_queue_head(q, skb);
592 break;
593 }
594 }
595 } while(test_bit(HCI_USB_TX_WAKEUP, &husb->state));
596}
597
598static inline void hci_usb_tx_wakeup(struct hci_usb *husb)
599{
600 /* Serialize TX queue processing to avoid data reordering */
601 if (!test_and_set_bit(HCI_USB_TX_PROCESS, &husb->state)) {
602 hci_usb_tx_process(husb);
603 clear_bit(HCI_USB_TX_PROCESS, &husb->state);
604 } else
605 set_bit(HCI_USB_TX_WAKEUP, &husb->state);
606}
607
608/* Send frames from HCI layer */
609static int hci_usb_send_frame(struct sk_buff *skb)
610{
611 struct hci_dev *hdev = (struct hci_dev *) skb->dev;
612 struct hci_usb *husb;
613
614 if (!hdev) {
615 BT_ERR("frame for uknown device (hdev=NULL)");
616 return -ENODEV;
617 }
618
619 if (!test_bit(HCI_RUNNING, &hdev->flags))
620 return -EBUSY;
621
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700622 BT_DBG("%s type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700623
624 husb = (struct hci_usb *) hdev->driver_data;
625
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700626 switch (bt_cb(skb)->pkt_type) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627 case HCI_COMMAND_PKT:
628 hdev->stat.cmd_tx++;
629 break;
630
631 case HCI_ACLDATA_PKT:
632 hdev->stat.acl_tx++;
633 break;
634
635#ifdef CONFIG_BT_HCIUSB_SCO
636 case HCI_SCODATA_PKT:
637 hdev->stat.sco_tx++;
638 break;
639#endif
640
641 default:
642 kfree_skb(skb);
643 return 0;
644 }
645
646 read_lock(&husb->completion_lock);
647
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700648 skb_queue_tail(__transmit_q(husb, bt_cb(skb)->pkt_type), skb);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700649 hci_usb_tx_wakeup(husb);
650
651 read_unlock(&husb->completion_lock);
652 return 0;
653}
654
655static inline int __recv_frame(struct hci_usb *husb, int type, void *data, int count)
656{
657 BT_DBG("%s type %d data %p count %d", husb->hdev->name, type, data, count);
658
659 husb->hdev->stat.byte_rx += count;
660
661 while (count) {
662 struct sk_buff *skb = __reassembly(husb, type);
663 struct { int expect; } *scb;
664 int len = 0;
665
666 if (!skb) {
667 /* Start of the frame */
668
669 switch (type) {
670 case HCI_EVENT_PKT:
671 if (count >= HCI_EVENT_HDR_SIZE) {
672 struct hci_event_hdr *h = data;
673 len = HCI_EVENT_HDR_SIZE + h->plen;
674 } else
675 return -EILSEQ;
676 break;
677
678 case HCI_ACLDATA_PKT:
679 if (count >= HCI_ACL_HDR_SIZE) {
680 struct hci_acl_hdr *h = data;
681 len = HCI_ACL_HDR_SIZE + __le16_to_cpu(h->dlen);
682 } else
683 return -EILSEQ;
684 break;
685#ifdef CONFIG_BT_HCIUSB_SCO
686 case HCI_SCODATA_PKT:
687 if (count >= HCI_SCO_HDR_SIZE) {
688 struct hci_sco_hdr *h = data;
689 len = HCI_SCO_HDR_SIZE + h->dlen;
690 } else
691 return -EILSEQ;
692 break;
693#endif
694 }
695 BT_DBG("new packet len %d", len);
696
697 skb = bt_skb_alloc(len, GFP_ATOMIC);
698 if (!skb) {
699 BT_ERR("%s no memory for the packet", husb->hdev->name);
700 return -ENOMEM;
701 }
702 skb->dev = (void *) husb->hdev;
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700703 bt_cb(skb)->pkt_type = type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700704
705 __reassembly(husb, type) = skb;
706
707 scb = (void *) skb->cb;
708 scb->expect = len;
709 } else {
710 /* Continuation */
711 scb = (void *) skb->cb;
712 len = scb->expect;
713 }
714
715 len = min(len, count);
716
717 memcpy(skb_put(skb, len), data, len);
718
719 scb->expect -= len;
720 if (!scb->expect) {
721 /* Complete frame */
722 __reassembly(husb, type) = NULL;
Marcel Holtmann0d48d932005-08-09 20:30:28 -0700723 bt_cb(skb)->pkt_type = type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700724 hci_recv_frame(skb);
725 }
726
727 count -= len; data += len;
728 }
729 return 0;
730}
731
732static void hci_usb_rx_complete(struct urb *urb, struct pt_regs *regs)
733{
734 struct _urb *_urb = container_of(urb, struct _urb, urb);
735 struct hci_usb *husb = (void *) urb->context;
736 struct hci_dev *hdev = husb->hdev;
737 int err, count = urb->actual_length;
738
739 BT_DBG("%s urb %p type %d status %d count %d flags %x", hdev->name, urb,
740 _urb->type, urb->status, count, urb->transfer_flags);
741
742 read_lock(&husb->completion_lock);
743
744 if (!test_bit(HCI_RUNNING, &hdev->flags))
745 goto unlock;
746
747 if (urb->status || !count)
748 goto resubmit;
749
750 if (_urb->type == HCI_SCODATA_PKT) {
751#ifdef CONFIG_BT_HCIUSB_SCO
752 int i;
753 for (i=0; i < urb->number_of_packets; i++) {
754 BT_DBG("desc %d status %d offset %d len %d", i,
755 urb->iso_frame_desc[i].status,
756 urb->iso_frame_desc[i].offset,
757 urb->iso_frame_desc[i].actual_length);
758
759 if (!urb->iso_frame_desc[i].status)
760 __recv_frame(husb, _urb->type,
761 urb->transfer_buffer + urb->iso_frame_desc[i].offset,
762 urb->iso_frame_desc[i].actual_length);
763 }
764#else
765 ;
766#endif
767 } else {
768 err = __recv_frame(husb, _urb->type, urb->transfer_buffer, count);
769 if (err < 0) {
770 BT_ERR("%s corrupted packet: type %d count %d",
771 husb->hdev->name, _urb->type, count);
772 hdev->stat.err_rx++;
773 }
774 }
775
776resubmit:
777 urb->dev = husb->udev;
778 err = usb_submit_urb(urb, GFP_ATOMIC);
779 BT_DBG("%s urb %p type %d resubmit status %d", hdev->name, urb,
780 _urb->type, err);
781
782unlock:
783 read_unlock(&husb->completion_lock);
784}
785
786static void hci_usb_tx_complete(struct urb *urb, struct pt_regs *regs)
787{
788 struct _urb *_urb = container_of(urb, struct _urb, urb);
789 struct hci_usb *husb = (void *) urb->context;
790 struct hci_dev *hdev = husb->hdev;
791
792 BT_DBG("%s urb %p status %d flags %x", hdev->name, urb,
793 urb->status, urb->transfer_flags);
794
795 atomic_dec(__pending_tx(husb, _urb->type));
796
797 urb->transfer_buffer = NULL;
798 kfree_skb((struct sk_buff *) _urb->priv);
799
800 if (!test_bit(HCI_RUNNING, &hdev->flags))
801 return;
802
803 if (!urb->status)
804 hdev->stat.byte_tx += urb->transfer_buffer_length;
805 else
806 hdev->stat.err_tx++;
807
808 read_lock(&husb->completion_lock);
809
810 _urb_unlink(_urb);
811 _urb_queue_tail(__completed_q(husb, _urb->type), _urb);
812
813 hci_usb_tx_wakeup(husb);
814
815 read_unlock(&husb->completion_lock);
816}
817
818static void hci_usb_destruct(struct hci_dev *hdev)
819{
820 struct hci_usb *husb = (struct hci_usb *) hdev->driver_data;
821
822 BT_DBG("%s", hdev->name);
823
824 kfree(husb);
825}
826
827static void hci_usb_notify(struct hci_dev *hdev, unsigned int evt)
828{
829 BT_DBG("%s evt %d", hdev->name, evt);
830}
831
832static int hci_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
833{
834 struct usb_device *udev = interface_to_usbdev(intf);
835 struct usb_host_endpoint *bulk_out_ep = NULL;
836 struct usb_host_endpoint *bulk_in_ep = NULL;
837 struct usb_host_endpoint *intr_in_ep = NULL;
838 struct usb_host_endpoint *ep;
839 struct usb_host_interface *uif;
840 struct usb_interface *isoc_iface;
841 struct hci_usb *husb;
842 struct hci_dev *hdev;
843 int i, e, size, isoc_ifnum, isoc_alts;
844
845 BT_DBG("udev %p intf %p", udev, intf);
846
847 if (!id->driver_info) {
848 const struct usb_device_id *match;
849 match = usb_match_id(intf, blacklist_ids);
850 if (match)
851 id = match;
852 }
853
854 if (ignore || id->driver_info & HCI_IGNORE)
855 return -ENODEV;
856
Marcel Holtmann7ef934b2005-11-08 09:57:05 -0800857 if (ignore_dga && id->driver_info & HCI_DIGIANSWER)
858 return -ENODEV;
859
Marcel Holtmann0915e882005-09-13 01:32:37 +0200860 if (ignore_csr && id->driver_info & HCI_CSR)
861 return -ENODEV;
862
863 if (ignore_sniffer && id->driver_info & HCI_SNIFFER)
864 return -ENODEV;
865
Linus Torvalds1da177e2005-04-16 15:20:36 -0700866 if (intf->cur_altsetting->desc.bInterfaceNumber > 0)
867 return -ENODEV;
868
869 /* Find endpoints that we need */
870 uif = intf->cur_altsetting;
871 for (e = 0; e < uif->desc.bNumEndpoints; e++) {
872 ep = &uif->endpoint[e];
873
874 switch (ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
875 case USB_ENDPOINT_XFER_INT:
876 if (ep->desc.bEndpointAddress & USB_DIR_IN)
877 intr_in_ep = ep;
878 break;
879
880 case USB_ENDPOINT_XFER_BULK:
881 if (ep->desc.bEndpointAddress & USB_DIR_IN)
882 bulk_in_ep = ep;
883 else
884 bulk_out_ep = ep;
885 break;
886 }
887 }
888
889 if (!bulk_in_ep || !bulk_out_ep || !intr_in_ep) {
890 BT_DBG("Bulk endpoints not found");
891 goto done;
892 }
893
Deepak Saxena089b1db2005-11-07 01:01:26 -0800894 if (!(husb = kzalloc(sizeof(struct hci_usb), GFP_KERNEL))) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700895 BT_ERR("Can't allocate: control structure");
896 goto done;
897 }
898
Linus Torvalds1da177e2005-04-16 15:20:36 -0700899 husb->udev = udev;
900 husb->bulk_out_ep = bulk_out_ep;
901 husb->bulk_in_ep = bulk_in_ep;
902 husb->intr_in_ep = intr_in_ep;
903
904 if (id->driver_info & HCI_DIGIANSWER)
905 husb->ctrl_req = USB_TYPE_VENDOR;
906 else
907 husb->ctrl_req = USB_TYPE_CLASS;
908
909 /* Find isochronous endpoints that we can use */
910 size = 0;
911 isoc_iface = NULL;
912 isoc_alts = 0;
913 isoc_ifnum = 1;
914
915#ifdef CONFIG_BT_HCIUSB_SCO
916 if (isoc && !(id->driver_info & (HCI_BROKEN_ISOC | HCI_SNIFFER)))
917 isoc_iface = usb_ifnum_to_if(udev, isoc_ifnum);
918
919 if (isoc_iface) {
920 int a;
921 struct usb_host_endpoint *isoc_out_ep = NULL;
922 struct usb_host_endpoint *isoc_in_ep = NULL;
923
924 for (a = 0; a < isoc_iface->num_altsetting; a++) {
925 uif = &isoc_iface->altsetting[a];
926 for (e = 0; e < uif->desc.bNumEndpoints; e++) {
927 ep = &uif->endpoint[e];
928
929 switch (ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) {
930 case USB_ENDPOINT_XFER_ISOC:
931 if (le16_to_cpu(ep->desc.wMaxPacketSize) < size ||
932 uif->desc.bAlternateSetting != isoc)
933 break;
934 size = le16_to_cpu(ep->desc.wMaxPacketSize);
935
936 isoc_alts = uif->desc.bAlternateSetting;
937
938 if (ep->desc.bEndpointAddress & USB_DIR_IN)
939 isoc_in_ep = ep;
940 else
941 isoc_out_ep = ep;
942 break;
943 }
944 }
945 }
946
947 if (!isoc_in_ep || !isoc_out_ep)
948 BT_DBG("Isoc endpoints not found");
949 else {
950 BT_DBG("isoc ifnum %d alts %d", isoc_ifnum, isoc_alts);
951 if (usb_driver_claim_interface(&hci_usb_driver, isoc_iface, husb) != 0)
952 BT_ERR("Can't claim isoc interface");
953 else if (usb_set_interface(udev, isoc_ifnum, isoc_alts)) {
954 BT_ERR("Can't set isoc interface settings");
955 husb->isoc_iface = isoc_iface;
956 usb_driver_release_interface(&hci_usb_driver, isoc_iface);
957 husb->isoc_iface = NULL;
958 } else {
959 husb->isoc_iface = isoc_iface;
960 husb->isoc_in_ep = isoc_in_ep;
961 husb->isoc_out_ep = isoc_out_ep;
962 }
963 }
964 }
965#endif
966
967 rwlock_init(&husb->completion_lock);
968
969 for (i = 0; i < 4; i++) {
970 skb_queue_head_init(&husb->transmit_q[i]);
971 _urb_queue_init(&husb->pending_q[i]);
972 _urb_queue_init(&husb->completed_q[i]);
973 }
974
975 /* Initialize and register HCI device */
976 hdev = hci_alloc_dev();
977 if (!hdev) {
978 BT_ERR("Can't allocate HCI device");
979 goto probe_error;
980 }
981
982 husb->hdev = hdev;
983
984 hdev->type = HCI_USB;
985 hdev->driver_data = husb;
986 SET_HCIDEV_DEV(hdev, &intf->dev);
987
988 hdev->open = hci_usb_open;
989 hdev->close = hci_usb_close;
990 hdev->flush = hci_usb_flush;
991 hdev->send = hci_usb_send_frame;
992 hdev->destruct = hci_usb_destruct;
993 hdev->notify = hci_usb_notify;
994
995 hdev->owner = THIS_MODULE;
996
997 if (reset || id->driver_info & HCI_RESET)
998 set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks);
999
Marcel Holtmann520ca782006-07-14 16:01:52 +02001000 if (force_scofix || id->driver_info & HCI_WRONG_SCO_MTU) {
1001 if (!disable_scofix)
1002 set_bit(HCI_QUIRK_FIXUP_BUFFER_SIZE, &hdev->quirks);
1003 }
Marcel Holtmannda1f5192006-07-03 10:02:29 +02001004
Linus Torvalds1da177e2005-04-16 15:20:36 -07001005 if (id->driver_info & HCI_SNIFFER) {
1006 if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
1007 set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
1008 }
1009
1010 if (id->driver_info & HCI_BCM92035) {
1011 unsigned char cmd[] = { 0x3b, 0xfc, 0x01, 0x00 };
1012 struct sk_buff *skb;
1013
1014 skb = bt_skb_alloc(sizeof(cmd), GFP_KERNEL);
1015 if (skb) {
1016 memcpy(skb_put(skb, sizeof(cmd)), cmd, sizeof(cmd));
1017 skb_queue_tail(&hdev->driver_init, skb);
1018 }
1019 }
1020
1021 if (hci_register_dev(hdev) < 0) {
1022 BT_ERR("Can't register HCI device");
1023 hci_free_dev(hdev);
1024 goto probe_error;
1025 }
1026
1027 usb_set_intfdata(intf, husb);
1028 return 0;
1029
1030probe_error:
1031 if (husb->isoc_iface)
1032 usb_driver_release_interface(&hci_usb_driver, husb->isoc_iface);
1033 kfree(husb);
1034
1035done:
1036 return -EIO;
1037}
1038
1039static void hci_usb_disconnect(struct usb_interface *intf)
1040{
1041 struct hci_usb *husb = usb_get_intfdata(intf);
1042 struct hci_dev *hdev;
1043
1044 if (!husb || intf == husb->isoc_iface)
1045 return;
1046
1047 usb_set_intfdata(intf, NULL);
1048 hdev = husb->hdev;
1049
1050 BT_DBG("%s", hdev->name);
1051
1052 hci_usb_close(hdev);
1053
1054 if (husb->isoc_iface)
1055 usb_driver_release_interface(&hci_usb_driver, husb->isoc_iface);
1056
1057 if (hci_unregister_dev(hdev) < 0)
1058 BT_ERR("Can't unregister HCI device %s", hdev->name);
1059
1060 hci_free_dev(hdev);
1061}
1062
Marcel Holtmanndcdcf632006-07-03 10:02:24 +02001063static int hci_usb_suspend(struct usb_interface *intf, pm_message_t message)
1064{
1065 struct hci_usb *husb = usb_get_intfdata(intf);
1066 struct list_head killed;
1067 unsigned long flags;
1068 int i;
1069
1070 if (!husb || intf == husb->isoc_iface)
1071 return 0;
1072
1073 hci_suspend_dev(husb->hdev);
1074
1075 INIT_LIST_HEAD(&killed);
1076
1077 for (i = 0; i < 4; i++) {
1078 struct _urb_queue *q = &husb->pending_q[i];
1079 struct _urb *_urb, *_tmp;
1080
1081 while ((_urb = _urb_dequeue(q))) {
1082 /* reset queue since _urb_dequeue sets it to NULL */
1083 _urb->queue = q;
1084 usb_kill_urb(&_urb->urb);
1085 list_add(&_urb->list, &killed);
1086 }
1087
1088 spin_lock_irqsave(&q->lock, flags);
1089
1090 list_for_each_entry_safe(_urb, _tmp, &killed, list) {
1091 list_move_tail(&_urb->list, &q->head);
1092 }
1093
1094 spin_unlock_irqrestore(&q->lock, flags);
1095 }
1096
1097 return 0;
1098}
1099
1100static int hci_usb_resume(struct usb_interface *intf)
1101{
1102 struct hci_usb *husb = usb_get_intfdata(intf);
1103 unsigned long flags;
1104 int i, err = 0;
1105
1106 if (!husb || intf == husb->isoc_iface)
1107 return 0;
1108
1109 for (i = 0; i < 4; i++) {
1110 struct _urb_queue *q = &husb->pending_q[i];
1111 struct _urb *_urb;
1112
1113 spin_lock_irqsave(&q->lock, flags);
1114
1115 list_for_each_entry(_urb, &q->head, list) {
1116 err = usb_submit_urb(&_urb->urb, GFP_ATOMIC);
1117 if (err)
1118 break;
1119 }
1120
1121 spin_unlock_irqrestore(&q->lock, flags);
1122
1123 if (err)
1124 return -EIO;
1125 }
1126
1127 hci_resume_dev(husb->hdev);
1128
1129 return 0;
1130}
1131
Linus Torvalds1da177e2005-04-16 15:20:36 -07001132static struct usb_driver hci_usb_driver = {
Linus Torvalds1da177e2005-04-16 15:20:36 -07001133 .name = "hci_usb",
1134 .probe = hci_usb_probe,
1135 .disconnect = hci_usb_disconnect,
Marcel Holtmanndcdcf632006-07-03 10:02:24 +02001136 .suspend = hci_usb_suspend,
1137 .resume = hci_usb_resume,
Linus Torvalds1da177e2005-04-16 15:20:36 -07001138 .id_table = bluetooth_ids,
1139};
1140
1141static int __init hci_usb_init(void)
1142{
1143 int err;
1144
1145 BT_INFO("HCI USB driver ver %s", VERSION);
1146
1147 if ((err = usb_register(&hci_usb_driver)) < 0)
1148 BT_ERR("Failed to register HCI USB driver");
1149
1150 return err;
1151}
1152
1153static void __exit hci_usb_exit(void)
1154{
1155 usb_deregister(&hci_usb_driver);
1156}
1157
1158module_init(hci_usb_init);
1159module_exit(hci_usb_exit);
1160
1161module_param(ignore, bool, 0644);
1162MODULE_PARM_DESC(ignore, "Ignore devices from the matching table");
1163
Marcel Holtmann7ef934b2005-11-08 09:57:05 -08001164module_param(ignore_dga, bool, 0644);
1165MODULE_PARM_DESC(ignore_dga, "Ignore devices with id 08fd:0001");
1166
Marcel Holtmann0915e882005-09-13 01:32:37 +02001167module_param(ignore_csr, bool, 0644);
1168MODULE_PARM_DESC(ignore_csr, "Ignore devices with id 0a12:0001");
1169
1170module_param(ignore_sniffer, bool, 0644);
1171MODULE_PARM_DESC(ignore_sniffer, "Ignore devices with id 0a12:0002");
1172
Marcel Holtmann520ca782006-07-14 16:01:52 +02001173module_param(disable_scofix, bool, 0644);
1174MODULE_PARM_DESC(disable_scofix, "Disable fixup of wrong SCO buffer size");
1175
1176module_param(force_scofix, bool, 0644);
1177MODULE_PARM_DESC(force_scofix, "Force fixup of wrong SCO buffers size");
1178
Linus Torvalds1da177e2005-04-16 15:20:36 -07001179module_param(reset, bool, 0644);
1180MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
1181
1182#ifdef CONFIG_BT_HCIUSB_SCO
1183module_param(isoc, int, 0644);
1184MODULE_PARM_DESC(isoc, "Set isochronous transfers for SCO over HCI support");
1185#endif
1186
1187MODULE_AUTHOR("Maxim Krasnyansky <maxk@qualcomm.com>, Marcel Holtmann <marcel@holtmann.org>");
1188MODULE_DESCRIPTION("Bluetooth HCI USB driver ver " VERSION);
1189MODULE_VERSION(VERSION);
1190MODULE_LICENSE("GPL");