Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/holtmann/bluetooth-next-2.6
This commit is contained in:
commit
3f8c6c9c77
@ -2,26 +2,6 @@
|
||||
menu "Bluetooth device drivers"
|
||||
depends on BT
|
||||
|
||||
config BT_HCIUSB
|
||||
tristate "HCI USB driver (old version)"
|
||||
depends on USB && BT_HCIBTUSB=n
|
||||
help
|
||||
Bluetooth HCI USB driver.
|
||||
This driver is required if you want to use Bluetooth devices with
|
||||
USB interface.
|
||||
|
||||
Say Y here to compile support for Bluetooth USB devices into the
|
||||
kernel or say M to compile it as module (hci_usb).
|
||||
|
||||
config BT_HCIUSB_SCO
|
||||
bool "SCO (voice) support"
|
||||
depends on BT_HCIUSB
|
||||
help
|
||||
This option enables the SCO support in the HCI USB driver. You need this
|
||||
to transmit voice data with your Bluetooth USB device.
|
||||
|
||||
Say Y here to compile support for SCO over HCI USB.
|
||||
|
||||
config BT_HCIBTUSB
|
||||
tristate "HCI USB driver"
|
||||
depends on USB
|
||||
|
@ -2,7 +2,6 @@
|
||||
# Makefile for the Linux Bluetooth HCI device drivers.
|
||||
#
|
||||
|
||||
obj-$(CONFIG_BT_HCIUSB) += hci_usb.o
|
||||
obj-$(CONFIG_BT_HCIVHCI) += hci_vhci.o
|
||||
obj-$(CONFIG_BT_HCIUART) += hci_uart.o
|
||||
obj-$(CONFIG_BT_HCIBCM203X) += bcm203x.o
|
||||
|
@ -37,11 +37,6 @@
|
||||
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCIBCM203X_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "1.2"
|
||||
|
||||
static struct usb_device_id bcm203x_table[] = {
|
||||
@ -199,7 +194,7 @@ static int bcm203x_probe(struct usb_interface *intf, const struct usb_device_id
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
BT_DBG("minidrv data %p size %d", firmware->data, firmware->size);
|
||||
BT_DBG("minidrv data %p size %zu", firmware->data, firmware->size);
|
||||
|
||||
size = max_t(uint, firmware->size, 4096);
|
||||
|
||||
@ -227,7 +222,7 @@ static int bcm203x_probe(struct usb_interface *intf, const struct usb_device_id
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
BT_DBG("firmware data %p size %d", firmware->data, firmware->size);
|
||||
BT_DBG("firmware data %p size %zu", firmware->data, firmware->size);
|
||||
|
||||
data->fw_data = kmalloc(firmware->size, GFP_KERNEL);
|
||||
if (!data->fw_data) {
|
||||
|
@ -38,11 +38,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCIBFUSB_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "1.2"
|
||||
|
||||
static struct usb_driver bfusb_driver;
|
||||
@ -221,7 +216,7 @@ static int bfusb_rx_submit(struct bfusb_data *data, struct urb *urb)
|
||||
struct sk_buff *skb;
|
||||
int err, pipe, size = HCI_MAX_FRAME_SIZE + 32;
|
||||
|
||||
BT_DBG("bfusb %p urb %p", bfusb, urb);
|
||||
BT_DBG("bfusb %p urb %p", data, urb);
|
||||
|
||||
if (!urb && !(urb = usb_alloc_urb(0, GFP_ATOMIC)))
|
||||
return -ENOMEM;
|
||||
@ -354,7 +349,7 @@ static void bfusb_rx_complete(struct urb *urb)
|
||||
int count = urb->actual_length;
|
||||
int err, hdr, len;
|
||||
|
||||
BT_DBG("bfusb %p urb %p skb %p len %d", bfusb, urb, skb, skb->len);
|
||||
BT_DBG("bfusb %p urb %p skb %p len %d", data, urb, skb, skb->len);
|
||||
|
||||
read_lock(&data->lock);
|
||||
|
||||
@ -691,7 +686,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
|
||||
goto error;
|
||||
}
|
||||
|
||||
BT_DBG("firmware data %p size %d", firmware->data, firmware->size);
|
||||
BT_DBG("firmware data %p size %zu", firmware->data, firmware->size);
|
||||
|
||||
if (bfusb_load_firmware(data, firmware->data, firmware->size) < 0) {
|
||||
BT_ERR("Firmware loading failed");
|
||||
|
@ -35,11 +35,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCIBPA10X_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "0.10"
|
||||
|
||||
static struct usb_device_id bpa10x_table[] = {
|
||||
@ -489,6 +484,8 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
|
||||
|
||||
err = hci_register_dev(hdev);
|
||||
if (err < 0) {
|
||||
hci_free_dev(hdev);
|
||||
|
@ -502,15 +502,15 @@ static int bt3c_load_firmware(bt3c_info_t *info, const unsigned char *firmware,
|
||||
|
||||
memset(b, 0, sizeof(b));
|
||||
memcpy(b, ptr + 2, 2);
|
||||
size = simple_strtol(b, NULL, 16);
|
||||
size = simple_strtoul(b, NULL, 16);
|
||||
|
||||
memset(b, 0, sizeof(b));
|
||||
memcpy(b, ptr + 4, 8);
|
||||
addr = simple_strtol(b, NULL, 16);
|
||||
addr = simple_strtoul(b, NULL, 16);
|
||||
|
||||
memset(b, 0, sizeof(b));
|
||||
memcpy(b, ptr + (size * 2) + 2, 2);
|
||||
fcs = simple_strtol(b, NULL, 16);
|
||||
fcs = simple_strtoul(b, NULL, 16);
|
||||
|
||||
memset(b, 0, sizeof(b));
|
||||
for (tmp = 0, i = 0; i < size; i++) {
|
||||
@ -530,7 +530,7 @@ static int bt3c_load_firmware(bt3c_info_t *info, const unsigned char *firmware,
|
||||
memset(b, 0, sizeof(b));
|
||||
for (i = 0; i < (size - 4) / 2; i++) {
|
||||
memcpy(b, ptr + (i * 4) + 12, 4);
|
||||
tmp = simple_strtol(b, NULL, 16);
|
||||
tmp = simple_strtoul(b, NULL, 16);
|
||||
bt3c_put(iobase, tmp);
|
||||
}
|
||||
}
|
||||
|
@ -37,11 +37,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCIBTSDIO_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "0.1"
|
||||
|
||||
static const struct sdio_device_id btsdio_table[] = {
|
||||
@ -91,6 +86,7 @@ static int btsdio_tx_packet(struct btsdio_data *data, struct sk_buff *skb)
|
||||
|
||||
err = sdio_writesb(data->func, REG_TDAT, skb->data, skb->len);
|
||||
if (err < 0) {
|
||||
skb_pull(skb, 4);
|
||||
sdio_writeb(data->func, 0x01, REG_PC_WRT, NULL);
|
||||
return err;
|
||||
}
|
||||
|
@ -35,31 +35,25 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
//#define CONFIG_BT_HCIBTUSB_DEBUG
|
||||
#ifndef CONFIG_BT_HCIBTUSB_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "0.3"
|
||||
#define VERSION "0.4"
|
||||
|
||||
static int ignore_dga;
|
||||
static int ignore_csr;
|
||||
static int ignore_sniffer;
|
||||
static int disable_scofix;
|
||||
static int force_scofix;
|
||||
static int reset;
|
||||
|
||||
static int reset = 1;
|
||||
|
||||
static struct usb_driver btusb_driver;
|
||||
|
||||
#define BTUSB_IGNORE 0x01
|
||||
#define BTUSB_RESET 0x02
|
||||
#define BTUSB_DIGIANSWER 0x04
|
||||
#define BTUSB_CSR 0x08
|
||||
#define BTUSB_SNIFFER 0x10
|
||||
#define BTUSB_BCM92035 0x20
|
||||
#define BTUSB_BROKEN_ISOC 0x40
|
||||
#define BTUSB_WRONG_SCO_MTU 0x80
|
||||
#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
|
||||
|
||||
static struct usb_device_id btusb_table[] = {
|
||||
/* Generic Bluetooth USB device */
|
||||
@ -79,7 +73,7 @@ static struct usb_device_id btusb_table[] = {
|
||||
{ USB_DEVICE(0x0bdb, 0x1002) },
|
||||
|
||||
/* Canyon CN-BTU1 with HID interfaces */
|
||||
{ USB_DEVICE(0x0c10, 0x0000), .driver_info = BTUSB_RESET },
|
||||
{ USB_DEVICE(0x0c10, 0x0000) },
|
||||
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
@ -94,52 +88,37 @@ static struct usb_device_id blacklist_table[] = {
|
||||
{ USB_DEVICE(0x0a5c, 0x2033), .driver_info = BTUSB_IGNORE },
|
||||
|
||||
/* Broadcom BCM2035 */
|
||||
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
|
||||
|
||||
/* Broadcom BCM2045 */
|
||||
{ USB_DEVICE(0x0a5c, 0x2039), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* Broadcom BCM2046 */
|
||||
{ USB_DEVICE(0x0a5c, 0x2146), .driver_info = BTUSB_RESET },
|
||||
{ USB_DEVICE(0x0a5c, 0x2151), .driver_info = BTUSB_RESET },
|
||||
|
||||
/* Apple MacBook Pro with Broadcom chip */
|
||||
{ USB_DEVICE(0x05ac, 0x820f), .driver_info = BTUSB_RESET },
|
||||
{ USB_DEVICE(0x0a5c, 0x2039), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x2101), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* IBM/Lenovo ThinkPad with Broadcom chip */
|
||||
{ USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* Targus ACB10US */
|
||||
{ USB_DEVICE(0x0a5c, 0x2100), .driver_info = BTUSB_RESET },
|
||||
{ USB_DEVICE(0x0a5c, 0x2154), .driver_info = BTUSB_RESET },
|
||||
|
||||
/* ANYCOM Bluetooth USB-200 and USB-250 */
|
||||
{ USB_DEVICE(0x0a5c, 0x2111), .driver_info = BTUSB_RESET },
|
||||
{ USB_DEVICE(0x0a5c, 0x201e), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x0a5c, 0x2110), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* HP laptop with Broadcom chip */
|
||||
{ USB_DEVICE(0x03f0, 0x171d), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x03f0, 0x171d), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* Dell laptop with Broadcom chip */
|
||||
{ USB_DEVICE(0x413c, 0x8126), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x413c, 0x8126), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* Dell Wireless 370 */
|
||||
{ USB_DEVICE(0x413c, 0x8156), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
/* Dell Wireless 370 and 410 devices */
|
||||
{ USB_DEVICE(0x413c, 0x8152), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x413c, 0x8156), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* Dell Wireless 410 */
|
||||
{ USB_DEVICE(0x413c, 0x8152), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
/* 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 },
|
||||
|
||||
/* Microsoft Wireless Transceiver for Bluetooth 2.0 */
|
||||
{ USB_DEVICE(0x045e, 0x009c), .driver_info = BTUSB_RESET },
|
||||
/* Asus WL-BTD202 device */
|
||||
{ USB_DEVICE(0x0b05, 0x1715), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* Kensington Bluetooth USB adapter */
|
||||
{ USB_DEVICE(0x047d, 0x105d), .driver_info = BTUSB_RESET },
|
||||
{ USB_DEVICE(0x047d, 0x105e), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* ISSC Bluetooth Adapter v3.1 */
|
||||
{ USB_DEVICE(0x1131, 0x1001), .driver_info = BTUSB_RESET },
|
||||
{ USB_DEVICE(0x047d, 0x105e), .driver_info = BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* RTX Telecom based adapters with buggy SCO support */
|
||||
{ USB_DEVICE(0x0400, 0x0807), .driver_info = BTUSB_BROKEN_ISOC },
|
||||
@ -148,13 +127,6 @@ static struct usb_device_id blacklist_table[] = {
|
||||
/* CONWISE Technology based adapters with buggy SCO support */
|
||||
{ USB_DEVICE(0x0e5e, 0x6622), .driver_info = BTUSB_BROKEN_ISOC },
|
||||
|
||||
/* Belkin F8T012 and F8T013 devices */
|
||||
{ USB_DEVICE(0x050d, 0x0012), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
{ USB_DEVICE(0x050d, 0x0013), .driver_info = BTUSB_RESET | BTUSB_WRONG_SCO_MTU },
|
||||
|
||||
/* Belkin F8T016 device */
|
||||
{ USB_DEVICE(0x050d, 0x016a), .driver_info = BTUSB_RESET },
|
||||
|
||||
/* Digianswer devices */
|
||||
{ USB_DEVICE(0x08fd, 0x0001), .driver_info = BTUSB_DIGIANSWER },
|
||||
{ USB_DEVICE(0x08fd, 0x0002), .driver_info = BTUSB_IGNORE },
|
||||
@ -197,7 +169,10 @@ struct btusb_data {
|
||||
struct usb_endpoint_descriptor *isoc_tx_ep;
|
||||
struct usb_endpoint_descriptor *isoc_rx_ep;
|
||||
|
||||
__u8 cmdreq_type;
|
||||
|
||||
int isoc_altsetting;
|
||||
int suspend_count;
|
||||
};
|
||||
|
||||
static void btusb_intr_complete(struct urb *urb)
|
||||
@ -236,7 +211,7 @@ static void btusb_intr_complete(struct urb *urb)
|
||||
}
|
||||
}
|
||||
|
||||
static int btusb_submit_intr_urb(struct hci_dev *hdev)
|
||||
static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct urb *urb;
|
||||
@ -249,13 +224,13 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev)
|
||||
if (!data->intr_ep)
|
||||
return -ENODEV;
|
||||
|
||||
urb = usb_alloc_urb(0, GFP_ATOMIC);
|
||||
urb = usb_alloc_urb(0, mem_flags);
|
||||
if (!urb)
|
||||
return -ENOMEM;
|
||||
|
||||
size = le16_to_cpu(data->intr_ep->wMaxPacketSize);
|
||||
|
||||
buf = kmalloc(size, GFP_ATOMIC);
|
||||
buf = kmalloc(size, mem_flags);
|
||||
if (!buf) {
|
||||
usb_free_urb(urb);
|
||||
return -ENOMEM;
|
||||
@ -271,7 +246,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev)
|
||||
|
||||
usb_anchor_urb(urb, &data->intr_anchor);
|
||||
|
||||
err = usb_submit_urb(urb, GFP_ATOMIC);
|
||||
err = usb_submit_urb(urb, mem_flags);
|
||||
if (err < 0) {
|
||||
BT_ERR("%s urb %p submission failed (%d)",
|
||||
hdev->name, urb, -err);
|
||||
@ -319,7 +294,7 @@ static void btusb_bulk_complete(struct urb *urb)
|
||||
}
|
||||
}
|
||||
|
||||
static int btusb_submit_bulk_urb(struct hci_dev *hdev)
|
||||
static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct urb *urb;
|
||||
@ -332,13 +307,13 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev)
|
||||
if (!data->bulk_rx_ep)
|
||||
return -ENODEV;
|
||||
|
||||
urb = usb_alloc_urb(0, GFP_KERNEL);
|
||||
urb = usb_alloc_urb(0, mem_flags);
|
||||
if (!urb)
|
||||
return -ENOMEM;
|
||||
|
||||
size = le16_to_cpu(data->bulk_rx_ep->wMaxPacketSize);
|
||||
|
||||
buf = kmalloc(size, GFP_KERNEL);
|
||||
buf = kmalloc(size, mem_flags);
|
||||
if (!buf) {
|
||||
usb_free_urb(urb);
|
||||
return -ENOMEM;
|
||||
@ -353,7 +328,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev)
|
||||
|
||||
usb_anchor_urb(urb, &data->bulk_anchor);
|
||||
|
||||
err = usb_submit_urb(urb, GFP_KERNEL);
|
||||
err = usb_submit_urb(urb, mem_flags);
|
||||
if (err < 0) {
|
||||
BT_ERR("%s urb %p submission failed (%d)",
|
||||
hdev->name, urb, -err);
|
||||
@ -430,7 +405,7 @@ static void inline __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
|
||||
urb->number_of_packets = i;
|
||||
}
|
||||
|
||||
static int btusb_submit_isoc_urb(struct hci_dev *hdev)
|
||||
static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
|
||||
{
|
||||
struct btusb_data *data = hdev->driver_data;
|
||||
struct urb *urb;
|
||||
@ -443,14 +418,14 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev)
|
||||
if (!data->isoc_rx_ep)
|
||||
return -ENODEV;
|
||||
|
||||
urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL);
|
||||
urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, mem_flags);
|
||||
if (!urb)
|
||||
return -ENOMEM;
|
||||
|
||||
size = le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize) *
|
||||
BTUSB_MAX_ISOC_FRAMES;
|
||||
|
||||
buf = kmalloc(size, GFP_KERNEL);
|
||||
buf = kmalloc(size, mem_flags);
|
||||
if (!buf) {
|
||||
usb_free_urb(urb);
|
||||
return -ENOMEM;
|
||||
@ -473,7 +448,7 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev)
|
||||
|
||||
usb_anchor_urb(urb, &data->isoc_anchor);
|
||||
|
||||
err = usb_submit_urb(urb, GFP_KERNEL);
|
||||
err = usb_submit_urb(urb, mem_flags);
|
||||
if (err < 0) {
|
||||
BT_ERR("%s urb %p submission failed (%d)",
|
||||
hdev->name, urb, -err);
|
||||
@ -520,7 +495,7 @@ static int btusb_open(struct hci_dev *hdev)
|
||||
if (test_and_set_bit(BTUSB_INTR_RUNNING, &data->flags))
|
||||
return 0;
|
||||
|
||||
err = btusb_submit_intr_urb(hdev);
|
||||
err = btusb_submit_intr_urb(hdev, GFP_KERNEL);
|
||||
if (err < 0) {
|
||||
clear_bit(BTUSB_INTR_RUNNING, &data->flags);
|
||||
clear_bit(HCI_RUNNING, &hdev->flags);
|
||||
@ -589,7 +564,7 @@ static int btusb_send_frame(struct sk_buff *skb)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dr->bRequestType = USB_TYPE_CLASS;
|
||||
dr->bRequestType = data->cmdreq_type;
|
||||
dr->bRequest = 0;
|
||||
dr->wIndex = 0;
|
||||
dr->wValue = 0;
|
||||
@ -680,8 +655,19 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
|
||||
|
||||
BT_DBG("%s evt %d", hdev->name, evt);
|
||||
|
||||
if (evt == HCI_NOTIFY_CONN_ADD || evt == HCI_NOTIFY_CONN_DEL)
|
||||
schedule_work(&data->work);
|
||||
if (hdev->conn_hash.acl_num > 0) {
|
||||
if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) {
|
||||
if (btusb_submit_bulk_urb(hdev, GFP_ATOMIC) < 0)
|
||||
clear_bit(BTUSB_BULK_RUNNING, &data->flags);
|
||||
else
|
||||
btusb_submit_bulk_urb(hdev, GFP_ATOMIC);
|
||||
}
|
||||
} else {
|
||||
clear_bit(BTUSB_BULK_RUNNING, &data->flags);
|
||||
usb_unlink_anchored_urbs(&data->bulk_anchor);
|
||||
}
|
||||
|
||||
schedule_work(&data->work);
|
||||
}
|
||||
|
||||
static int inline __set_isoc_interface(struct hci_dev *hdev, int altsetting)
|
||||
@ -732,18 +718,6 @@ 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;
|
||||
|
||||
if (hdev->conn_hash.acl_num > 0) {
|
||||
if (!test_and_set_bit(BTUSB_BULK_RUNNING, &data->flags)) {
|
||||
if (btusb_submit_bulk_urb(hdev) < 0)
|
||||
clear_bit(BTUSB_BULK_RUNNING, &data->flags);
|
||||
else
|
||||
btusb_submit_bulk_urb(hdev);
|
||||
}
|
||||
} else {
|
||||
clear_bit(BTUSB_BULK_RUNNING, &data->flags);
|
||||
usb_kill_anchored_urbs(&data->bulk_anchor);
|
||||
}
|
||||
|
||||
if (hdev->conn_hash.sco_num > 0) {
|
||||
if (data->isoc_altsetting != 2) {
|
||||
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
|
||||
@ -754,10 +728,10 @@ static void btusb_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
if (!test_and_set_bit(BTUSB_ISOC_RUNNING, &data->flags)) {
|
||||
if (btusb_submit_isoc_urb(hdev) < 0)
|
||||
if (btusb_submit_isoc_urb(hdev, GFP_KERNEL) < 0)
|
||||
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
|
||||
else
|
||||
btusb_submit_isoc_urb(hdev);
|
||||
btusb_submit_isoc_urb(hdev, GFP_KERNEL);
|
||||
}
|
||||
} else {
|
||||
clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
|
||||
@ -828,6 +802,8 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
data->cmdreq_type = USB_TYPE_CLASS;
|
||||
|
||||
data->udev = interface_to_usbdev(intf);
|
||||
data->intf = intf;
|
||||
|
||||
@ -862,11 +838,11 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
/* interface numbers are hardcoded in the spec */
|
||||
/* Interface numbers are hardcoded in the specification */
|
||||
data->isoc = usb_ifnum_to_if(data->udev, 1);
|
||||
|
||||
if (reset || id->driver_info & BTUSB_RESET)
|
||||
set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks);
|
||||
if (!reset)
|
||||
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
|
||||
|
||||
if (force_scofix || id->driver_info & BTUSB_WRONG_SCO_MTU) {
|
||||
if (!disable_scofix)
|
||||
@ -876,9 +852,23 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
if (id->driver_info & BTUSB_BROKEN_ISOC)
|
||||
data->isoc = NULL;
|
||||
|
||||
if (id->driver_info & BTUSB_DIGIANSWER) {
|
||||
data->cmdreq_type = USB_TYPE_VENDOR;
|
||||
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_CSR) {
|
||||
struct usb_device *udev = data->udev;
|
||||
|
||||
/* Old firmware would otherwise execute USB reset */
|
||||
if (le16_to_cpu(udev->descriptor.bcdDevice) < 0x117)
|
||||
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
|
||||
}
|
||||
|
||||
if (id->driver_info & BTUSB_SNIFFER) {
|
||||
struct usb_device *udev = data->udev;
|
||||
|
||||
/* New sniffer firmware has crippled HCI interface */
|
||||
if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x997)
|
||||
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
|
||||
|
||||
@ -949,10 +939,71 @@ static void btusb_disconnect(struct usb_interface *intf)
|
||||
hci_free_dev(hdev);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
cancel_work_sync(&data->work);
|
||||
|
||||
usb_kill_anchored_urbs(&data->tx_anchor);
|
||||
|
||||
usb_kill_anchored_urbs(&data->isoc_anchor);
|
||||
usb_kill_anchored_urbs(&data->bulk_anchor);
|
||||
usb_kill_anchored_urbs(&data->intr_anchor);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int btusb_resume(struct usb_interface *intf)
|
||||
{
|
||||
struct btusb_data *data = usb_get_intfdata(intf);
|
||||
struct hci_dev *hdev = data->hdev;
|
||||
int err;
|
||||
|
||||
BT_DBG("intf %p", intf);
|
||||
|
||||
if (--data->suspend_count)
|
||||
return 0;
|
||||
|
||||
if (!test_bit(HCI_RUNNING, &hdev->flags))
|
||||
return 0;
|
||||
|
||||
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);
|
||||
return err;
|
||||
}
|
||||
}
|
||||
|
||||
if (test_bit(BTUSB_BULK_RUNNING, &data->flags)) {
|
||||
if (btusb_submit_bulk_urb(hdev, GFP_NOIO) < 0)
|
||||
clear_bit(BTUSB_BULK_RUNNING, &data->flags);
|
||||
else
|
||||
btusb_submit_bulk_urb(hdev, GFP_NOIO);
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct usb_driver btusb_driver = {
|
||||
.name = "btusb",
|
||||
.probe = btusb_probe,
|
||||
.disconnect = btusb_disconnect,
|
||||
.suspend = btusb_suspend,
|
||||
.resume = btusb_resume,
|
||||
.id_table = btusb_table,
|
||||
};
|
||||
|
||||
|
@ -47,11 +47,6 @@
|
||||
|
||||
#include "hci_uart.h"
|
||||
|
||||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#endif
|
||||
|
||||
#define VERSION "0.3"
|
||||
|
||||
static int txcrc = 1;
|
||||
|
@ -46,11 +46,6 @@
|
||||
|
||||
#include "hci_uart.h"
|
||||
|
||||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#endif
|
||||
|
||||
#define VERSION "1.2"
|
||||
|
||||
struct h4_struct {
|
||||
|
@ -46,11 +46,6 @@
|
||||
|
||||
#include "hci_uart.h"
|
||||
|
||||
#ifndef CONFIG_BT_HCIUART_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#endif
|
||||
|
||||
#define VERSION "2.2"
|
||||
|
||||
static int reset = 0;
|
||||
@ -399,8 +394,8 @@ static int hci_uart_register_dev(struct hci_uart *hu)
|
||||
|
||||
hdev->owner = THIS_MODULE;
|
||||
|
||||
if (reset)
|
||||
set_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks);
|
||||
if (!reset)
|
||||
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
|
||||
|
||||
if (hci_register_dev(hdev) < 0) {
|
||||
BT_ERR("Can't register HCI device");
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,129 +0,0 @@
|
||||
/*
|
||||
HCI USB driver for Linux Bluetooth protocol stack (BlueZ)
|
||||
Copyright (C) 2000-2001 Qualcomm Incorporated
|
||||
Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
|
||||
|
||||
Copyright (C) 2003 Maxim Krasnyansky <maxk@qualcomm.com>
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation;
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
|
||||
IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
|
||||
CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
|
||||
COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
|
||||
SOFTWARE IS DISCLAIMED.
|
||||
*/
|
||||
|
||||
/* Class, SubClass, and Protocol codes that describe a Bluetooth device */
|
||||
#define HCI_DEV_CLASS 0xe0 /* Wireless class */
|
||||
#define HCI_DEV_SUBCLASS 0x01 /* RF subclass */
|
||||
#define HCI_DEV_PROTOCOL 0x01 /* Bluetooth programming protocol */
|
||||
|
||||
#define HCI_IGNORE 0x01
|
||||
#define HCI_RESET 0x02
|
||||
#define HCI_DIGIANSWER 0x04
|
||||
#define HCI_CSR 0x08
|
||||
#define HCI_SNIFFER 0x10
|
||||
#define HCI_BCM92035 0x20
|
||||
#define HCI_BROKEN_ISOC 0x40
|
||||
#define HCI_WRONG_SCO_MTU 0x80
|
||||
|
||||
#define HCI_MAX_IFACE_NUM 3
|
||||
|
||||
#define HCI_MAX_BULK_TX 4
|
||||
#define HCI_MAX_BULK_RX 1
|
||||
|
||||
#define HCI_MAX_ISOC_RX 2
|
||||
#define HCI_MAX_ISOC_TX 2
|
||||
|
||||
#define HCI_MAX_ISOC_FRAMES 10
|
||||
|
||||
struct _urb_queue {
|
||||
struct list_head head;
|
||||
spinlock_t lock;
|
||||
};
|
||||
|
||||
struct _urb {
|
||||
struct list_head list;
|
||||
struct _urb_queue *queue;
|
||||
int type;
|
||||
void *priv;
|
||||
struct urb urb;
|
||||
};
|
||||
|
||||
static inline void _urb_queue_init(struct _urb_queue *q)
|
||||
{
|
||||
INIT_LIST_HEAD(&q->head);
|
||||
spin_lock_init(&q->lock);
|
||||
}
|
||||
|
||||
static inline void _urb_queue_head(struct _urb_queue *q, struct _urb *_urb)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&q->lock, flags);
|
||||
/* _urb_unlink needs to know which spinlock to use, thus smp_mb(). */
|
||||
_urb->queue = q; smp_mb(); list_add(&_urb->list, &q->head);
|
||||
spin_unlock_irqrestore(&q->lock, flags);
|
||||
}
|
||||
|
||||
static inline void _urb_queue_tail(struct _urb_queue *q, struct _urb *_urb)
|
||||
{
|
||||
unsigned long flags;
|
||||
spin_lock_irqsave(&q->lock, flags);
|
||||
/* _urb_unlink needs to know which spinlock to use, thus smp_mb(). */
|
||||
_urb->queue = q; smp_mb(); list_add_tail(&_urb->list, &q->head);
|
||||
spin_unlock_irqrestore(&q->lock, flags);
|
||||
}
|
||||
|
||||
static inline void _urb_unlink(struct _urb *_urb)
|
||||
{
|
||||
struct _urb_queue *q;
|
||||
unsigned long flags;
|
||||
|
||||
smp_mb();
|
||||
q = _urb->queue;
|
||||
/* If q is NULL, it will die at easy-to-debug NULL pointer dereference.
|
||||
No need to BUG(). */
|
||||
spin_lock_irqsave(&q->lock, flags);
|
||||
list_del(&_urb->list); _urb->queue = NULL;
|
||||
spin_unlock_irqrestore(&q->lock, flags);
|
||||
}
|
||||
|
||||
struct hci_usb {
|
||||
struct hci_dev *hdev;
|
||||
|
||||
unsigned long state;
|
||||
|
||||
struct usb_device *udev;
|
||||
|
||||
struct usb_host_endpoint *bulk_in_ep;
|
||||
struct usb_host_endpoint *bulk_out_ep;
|
||||
struct usb_host_endpoint *intr_in_ep;
|
||||
|
||||
struct usb_interface *isoc_iface;
|
||||
struct usb_host_endpoint *isoc_out_ep;
|
||||
struct usb_host_endpoint *isoc_in_ep;
|
||||
|
||||
__u8 ctrl_req;
|
||||
|
||||
struct sk_buff_head transmit_q[4];
|
||||
|
||||
rwlock_t completion_lock;
|
||||
|
||||
atomic_t pending_tx[4]; /* Number of pending requests */
|
||||
struct _urb_queue pending_q[4]; /* Pending requests */
|
||||
struct _urb_queue completed_q[4]; /* Completed requests */
|
||||
};
|
||||
|
||||
/* States */
|
||||
#define HCI_USB_TX_PROCESS 1
|
||||
#define HCI_USB_TX_WAKEUP 2
|
@ -40,11 +40,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCIVHCI_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "1.2"
|
||||
|
||||
static int minor = MISC_DYNAMIC_MINOR;
|
||||
|
@ -54,8 +54,8 @@
|
||||
#define SOL_RFCOMM 18
|
||||
|
||||
#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
|
||||
#define BT_DBG(fmt, arg...) printk(KERN_INFO "%s: " fmt "\n" , __func__ , ## arg)
|
||||
#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
|
||||
#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
|
||||
#define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg)
|
||||
|
||||
/* Connection and socket states */
|
||||
enum {
|
||||
|
@ -54,7 +54,7 @@
|
||||
|
||||
/* HCI device quirks */
|
||||
enum {
|
||||
HCI_QUIRK_RESET_ON_INIT,
|
||||
HCI_QUIRK_NO_RESET,
|
||||
HCI_QUIRK_RAW_DEVICE,
|
||||
HCI_QUIRK_FIXUP_BUFFER_SIZE
|
||||
};
|
||||
|
@ -41,18 +41,14 @@
|
||||
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
|
||||
#ifndef CONFIG_BT_SOCK_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "2.13"
|
||||
#define VERSION "2.14"
|
||||
|
||||
/* Bluetooth sockets */
|
||||
#define BT_MAX_PROTO 8
|
||||
static struct net_proto_family *bt_proto[BT_MAX_PROTO];
|
||||
static DEFINE_RWLOCK(bt_proto_lock);
|
||||
|
||||
static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
|
||||
#ifdef CONFIG_DEBUG_LOCK_ALLOC
|
||||
static struct lock_class_key bt_lock_key[BT_MAX_PROTO];
|
||||
static const char *bt_key_strings[BT_MAX_PROTO] = {
|
||||
"sk_lock-AF_BLUETOOTH-BTPROTO_L2CAP",
|
||||
@ -65,6 +61,7 @@ static const char *bt_key_strings[BT_MAX_PROTO] = {
|
||||
"sk_lock-AF_BLUETOOTH-BTPROTO_AVDTP",
|
||||
};
|
||||
|
||||
static struct lock_class_key bt_slock_key[BT_MAX_PROTO];
|
||||
static const char *bt_slock_key_strings[BT_MAX_PROTO] = {
|
||||
"slock-AF_BLUETOOTH-BTPROTO_L2CAP",
|
||||
"slock-AF_BLUETOOTH-BTPROTO_HCI",
|
||||
@ -75,7 +72,25 @@ static const char *bt_slock_key_strings[BT_MAX_PROTO] = {
|
||||
"slock-AF_BLUETOOTH-BTPROTO_HIDP",
|
||||
"slock-AF_BLUETOOTH-BTPROTO_AVDTP",
|
||||
};
|
||||
static DEFINE_RWLOCK(bt_proto_lock);
|
||||
|
||||
static inline void bt_sock_reclassify_lock(struct socket *sock, int proto)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
if (!sk)
|
||||
return;
|
||||
|
||||
BUG_ON(sock_owned_by_user(sk));
|
||||
|
||||
sock_lock_init_class_and_name(sk,
|
||||
bt_slock_key_strings[proto], &bt_slock_key[proto],
|
||||
bt_key_strings[proto], &bt_lock_key[proto]);
|
||||
}
|
||||
#else
|
||||
static inline void bt_sock_reclassify_lock(struct socket *sock, int proto)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
int bt_sock_register(int proto, struct net_proto_family *ops)
|
||||
{
|
||||
@ -117,21 +132,6 @@ int bt_sock_unregister(int proto)
|
||||
}
|
||||
EXPORT_SYMBOL(bt_sock_unregister);
|
||||
|
||||
static void bt_reclassify_sock_lock(struct socket *sock, int proto)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
||||
if (!sk)
|
||||
return;
|
||||
BUG_ON(sock_owned_by_user(sk));
|
||||
|
||||
sock_lock_init_class_and_name(sk,
|
||||
bt_slock_key_strings[proto],
|
||||
&bt_slock_key[proto],
|
||||
bt_key_strings[proto],
|
||||
&bt_lock_key[proto]);
|
||||
}
|
||||
|
||||
static int bt_sock_create(struct net *net, struct socket *sock, int proto)
|
||||
{
|
||||
int err;
|
||||
@ -151,7 +151,7 @@ static int bt_sock_create(struct net *net, struct socket *sock, int proto)
|
||||
|
||||
if (bt_proto[proto] && try_module_get(bt_proto[proto]->owner)) {
|
||||
err = bt_proto[proto]->create(net, sock, proto);
|
||||
bt_reclassify_sock_lock(sock, proto);
|
||||
bt_sock_reclassify_lock(sock, proto);
|
||||
module_put(bt_proto[proto]->owner);
|
||||
}
|
||||
|
||||
@ -240,7 +240,7 @@ int bt_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
size_t copied;
|
||||
int err;
|
||||
|
||||
BT_DBG("sock %p sk %p len %d", sock, sk, len);
|
||||
BT_DBG("sock %p sk %p len %zu", sock, sk, len);
|
||||
|
||||
if (flags & (MSG_OOB))
|
||||
return -EOPNOTSUPP;
|
||||
|
@ -161,7 +161,7 @@ struct bnep_session {
|
||||
struct msghdr msg;
|
||||
|
||||
struct bnep_proto_filter proto_filter[BNEP_MAX_PROTO_FILTERS];
|
||||
u64 mc_filter;
|
||||
unsigned long long mc_filter;
|
||||
|
||||
struct socket *sock;
|
||||
struct net_device *dev;
|
||||
|
@ -52,11 +52,6 @@
|
||||
|
||||
#include "bnep.h"
|
||||
|
||||
#ifndef CONFIG_BT_BNEP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "1.3"
|
||||
|
||||
static int compress_src = 1;
|
||||
|
@ -41,11 +41,6 @@
|
||||
|
||||
#include "bnep.h"
|
||||
|
||||
#ifndef CONFIG_BT_BNEP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#endif
|
||||
|
||||
#define BNEP_TX_QUEUE_LEN 20
|
||||
|
||||
static int bnep_net_open(struct net_device *dev)
|
||||
|
@ -46,11 +46,6 @@
|
||||
|
||||
#include "bnep.h"
|
||||
|
||||
#ifndef CONFIG_BT_BNEP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG( A... )
|
||||
#endif
|
||||
|
||||
static int bnep_sock_release(struct socket *sock)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
@ -42,11 +42,6 @@
|
||||
|
||||
#include "cmtp.h"
|
||||
|
||||
#ifndef CONFIG_BT_CMTP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define CAPI_INTEROPERABILITY 0x20
|
||||
|
||||
#define CAPI_INTEROPERABILITY_REQ CAPICMD(CAPI_INTEROPERABILITY, CAPI_REQ)
|
||||
|
@ -44,11 +44,6 @@
|
||||
|
||||
#include "cmtp.h"
|
||||
|
||||
#ifndef CONFIG_BT_CMTP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "1.0"
|
||||
|
||||
static DECLARE_RWSEM(cmtp_session_sem);
|
||||
|
@ -43,11 +43,6 @@
|
||||
|
||||
#include "cmtp.h"
|
||||
|
||||
#ifndef CONFIG_BT_CMTP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
static int cmtp_sock_release(struct socket *sock)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
@ -45,11 +45,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCI_CORE_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
void hci_acl_connect(struct hci_conn *conn)
|
||||
{
|
||||
struct hci_dev *hdev = conn->hdev;
|
||||
|
@ -48,11 +48,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCI_CORE_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
static void hci_cmd_task(unsigned long arg);
|
||||
static void hci_rx_task(unsigned long arg);
|
||||
static void hci_tx_task(unsigned long arg);
|
||||
@ -205,7 +200,7 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt)
|
||||
/* Mandatory initialization */
|
||||
|
||||
/* Reset */
|
||||
if (test_bit(HCI_QUIRK_RESET_ON_INIT, &hdev->quirks))
|
||||
if (!test_bit(HCI_QUIRK_NO_RESET, &hdev->quirks))
|
||||
hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL);
|
||||
|
||||
/* Read Local Supported Features */
|
||||
@ -290,7 +285,7 @@ static void hci_linkpol_req(struct hci_dev *hdev, unsigned long opt)
|
||||
{
|
||||
__le16 policy = cpu_to_le16(opt);
|
||||
|
||||
BT_DBG("%s %x", hdev->name, opt);
|
||||
BT_DBG("%s %x", hdev->name, policy);
|
||||
|
||||
/* Default link policy */
|
||||
hci_send_cmd(hdev, HCI_OP_WRITE_DEF_LINK_POLICY, 2, &policy);
|
||||
@ -756,7 +751,7 @@ int hci_get_dev_list(void __user *arg)
|
||||
|
||||
size = sizeof(*dl) + dev_num * sizeof(*dr);
|
||||
|
||||
if (!(dl = kmalloc(size, GFP_KERNEL)))
|
||||
if (!(dl = kzalloc(size, GFP_KERNEL)))
|
||||
return -ENOMEM;
|
||||
|
||||
dr = dl->dev_req;
|
||||
|
@ -45,11 +45,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCI_CORE_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
/* Handle HCI Event packets */
|
||||
|
||||
static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb)
|
||||
|
@ -49,11 +49,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCI_SOCK_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
/* ----- HCI socket interface ----- */
|
||||
|
||||
static inline int hci_test_bit(int nr, void *addr)
|
||||
|
@ -6,11 +6,6 @@
|
||||
#include <net/bluetooth/bluetooth.h>
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
|
||||
#ifndef CONFIG_BT_HCI_CORE_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
struct class *bt_class = NULL;
|
||||
EXPORT_SYMBOL_GPL(bt_class);
|
||||
|
||||
@ -420,7 +415,7 @@ int hci_register_sysfs(struct hci_dev *hdev)
|
||||
dev->class = bt_class;
|
||||
dev->parent = hdev->parent;
|
||||
|
||||
dev_set_name(dev, hdev->name);
|
||||
dev_set_name(dev, "%s", hdev->name);
|
||||
|
||||
dev_set_drvdata(dev, hdev);
|
||||
|
||||
|
@ -47,11 +47,6 @@
|
||||
|
||||
#include "hidp.h"
|
||||
|
||||
#ifndef CONFIG_BT_HIDP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "1.2"
|
||||
|
||||
static DECLARE_RWSEM(hidp_session_sem);
|
||||
|
@ -39,11 +39,6 @@
|
||||
|
||||
#include "hidp.h"
|
||||
|
||||
#ifndef CONFIG_BT_HIDP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
static int hidp_sock_release(struct socket *sock)
|
||||
{
|
||||
struct sock *sk = sock->sk;
|
||||
|
@ -50,11 +50,6 @@
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
#include <net/bluetooth/l2cap.h>
|
||||
|
||||
#ifndef CONFIG_BT_L2CAP_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "2.11"
|
||||
|
||||
static u32 l2cap_feat_mask = 0x0000;
|
||||
|
@ -46,11 +46,6 @@
|
||||
#include <net/bluetooth/l2cap.h>
|
||||
#include <net/bluetooth/rfcomm.h>
|
||||
|
||||
#ifndef CONFIG_BT_RFCOMM_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "1.10"
|
||||
|
||||
static int disable_cfc = 0;
|
||||
|
@ -50,11 +50,6 @@
|
||||
#include <net/bluetooth/l2cap.h>
|
||||
#include <net/bluetooth/rfcomm.h>
|
||||
|
||||
#ifndef CONFIG_BT_RFCOMM_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
static const struct proto_ops rfcomm_sock_ops;
|
||||
|
||||
static struct bt_sock_list rfcomm_sk_list = {
|
||||
@ -644,7 +639,7 @@ static int rfcomm_sock_recvmsg(struct kiocb *iocb, struct socket *sock,
|
||||
|
||||
msg->msg_namelen = 0;
|
||||
|
||||
BT_DBG("sk %p size %d", sk, size);
|
||||
BT_DBG("sk %p size %zu", sk, size);
|
||||
|
||||
lock_sock(sk);
|
||||
|
||||
|
@ -39,11 +39,6 @@
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
#include <net/bluetooth/rfcomm.h>
|
||||
|
||||
#ifndef CONFIG_BT_RFCOMM_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define RFCOMM_TTY_MAGIC 0x6d02 /* magic number for rfcomm struct */
|
||||
#define RFCOMM_TTY_PORTS RFCOMM_MAX_DEV /* whole lotta rfcomm devices */
|
||||
#define RFCOMM_TTY_MAJOR 216 /* device node major id of the usb/bluetooth.c driver */
|
||||
@ -58,7 +53,7 @@ struct rfcomm_dev {
|
||||
char name[12];
|
||||
int id;
|
||||
unsigned long flags;
|
||||
int opened;
|
||||
atomic_t opened;
|
||||
int err;
|
||||
|
||||
bdaddr_t src;
|
||||
@ -261,6 +256,8 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
|
||||
dev->flags = req->flags &
|
||||
((1 << RFCOMM_RELEASE_ONHUP) | (1 << RFCOMM_REUSE_DLC));
|
||||
|
||||
atomic_set(&dev->opened, 0);
|
||||
|
||||
init_waitqueue_head(&dev->wait);
|
||||
tasklet_init(&dev->wakeup_task, rfcomm_tty_wakeup, (unsigned long) dev);
|
||||
|
||||
@ -330,10 +327,10 @@ static void rfcomm_dev_del(struct rfcomm_dev *dev)
|
||||
{
|
||||
BT_DBG("dev %p", dev);
|
||||
|
||||
if (test_bit(RFCOMM_TTY_RELEASED, &dev->flags))
|
||||
BUG_ON(1);
|
||||
else
|
||||
set_bit(RFCOMM_TTY_RELEASED, &dev->flags);
|
||||
BUG_ON(test_and_set_bit(RFCOMM_TTY_RELEASED, &dev->flags));
|
||||
|
||||
if (atomic_read(&dev->opened) > 0)
|
||||
return;
|
||||
|
||||
write_lock_bh(&rfcomm_dev_lock);
|
||||
list_del_init(&dev->list);
|
||||
@ -689,9 +686,10 @@ static int rfcomm_tty_open(struct tty_struct *tty, struct file *filp)
|
||||
if (!dev)
|
||||
return -ENODEV;
|
||||
|
||||
BT_DBG("dev %p dst %s channel %d opened %d", dev, batostr(&dev->dst), dev->channel, dev->opened);
|
||||
BT_DBG("dev %p dst %s channel %d opened %d", dev, batostr(&dev->dst),
|
||||
dev->channel, atomic_read(&dev->opened));
|
||||
|
||||
if (dev->opened++ != 0)
|
||||
if (atomic_inc_return(&dev->opened) > 1)
|
||||
return 0;
|
||||
|
||||
dlc = dev->dlc;
|
||||
@ -747,9 +745,10 @@ static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp)
|
||||
if (!dev)
|
||||
return;
|
||||
|
||||
BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc, dev->opened);
|
||||
BT_DBG("tty %p dev %p dlc %p opened %d", tty, dev, dev->dlc,
|
||||
atomic_read(&dev->opened));
|
||||
|
||||
if (--dev->opened == 0) {
|
||||
if (atomic_dec_and_test(&dev->opened)) {
|
||||
if (dev->tty_dev->parent)
|
||||
device_move(dev->tty_dev, NULL);
|
||||
|
||||
@ -763,6 +762,14 @@ static void rfcomm_tty_close(struct tty_struct *tty, struct file *filp)
|
||||
tty->driver_data = NULL;
|
||||
dev->tty = NULL;
|
||||
rfcomm_dlc_unlock(dev->dlc);
|
||||
|
||||
if (test_bit(RFCOMM_TTY_RELEASED, &dev->flags)) {
|
||||
write_lock_bh(&rfcomm_dev_lock);
|
||||
list_del_init(&dev->list);
|
||||
write_unlock_bh(&rfcomm_dev_lock);
|
||||
|
||||
rfcomm_dev_put(dev);
|
||||
}
|
||||
}
|
||||
|
||||
rfcomm_dev_put(dev);
|
||||
|
@ -48,11 +48,6 @@
|
||||
#include <net/bluetooth/hci_core.h>
|
||||
#include <net/bluetooth/sco.h>
|
||||
|
||||
#ifndef CONFIG_BT_SCO_DEBUG
|
||||
#undef BT_DBG
|
||||
#define BT_DBG(D...)
|
||||
#endif
|
||||
|
||||
#define VERSION "0.6"
|
||||
|
||||
static int disable_esco = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user