Commit 0111ad82 authored by David S. Miller's avatar David S. Miller
parents e427babe fdde0a26
...@@ -65,12 +65,14 @@ static struct usb_device_id ath3k_table[] = { ...@@ -65,12 +65,14 @@ static struct usb_device_id ath3k_table[] = {
{ USB_DEVICE(0x0CF3, 0x3002) }, { USB_DEVICE(0x0CF3, 0x3002) },
{ USB_DEVICE(0x13d3, 0x3304) }, { USB_DEVICE(0x13d3, 0x3304) },
{ USB_DEVICE(0x0930, 0x0215) }, { USB_DEVICE(0x0930, 0x0215) },
{ USB_DEVICE(0x0489, 0xE03D) },
/* Atheros AR9285 Malbec with sflash firmware */ /* Atheros AR9285 Malbec with sflash firmware */
{ USB_DEVICE(0x03F0, 0x311D) }, { USB_DEVICE(0x03F0, 0x311D) },
/* Atheros AR3012 with sflash firmware*/ /* Atheros AR3012 with sflash firmware*/
{ USB_DEVICE(0x0CF3, 0x3004) }, { USB_DEVICE(0x0CF3, 0x3004) },
{ USB_DEVICE(0x13d3, 0x3375) },
/* Atheros AR5BBU12 with sflash firmware */ /* Atheros AR5BBU12 with sflash firmware */
{ USB_DEVICE(0x0489, 0xE02C) }, { USB_DEVICE(0x0489, 0xE02C) },
...@@ -87,6 +89,7 @@ static struct usb_device_id ath3k_blist_tbl[] = { ...@@ -87,6 +89,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
/* Atheros AR3012 with sflash firmware*/ /* Atheros AR3012 with sflash firmware*/
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
{ } /* Terminating entry */ { } /* Terminating entry */
}; };
......
...@@ -411,7 +411,7 @@ static void bfusb_rx_complete(struct urb *urb) ...@@ -411,7 +411,7 @@ static void bfusb_rx_complete(struct urb *urb)
static int bfusb_open(struct hci_dev *hdev) static int bfusb_open(struct hci_dev *hdev)
{ {
struct bfusb_data *data = hdev->driver_data; struct bfusb_data *data = hci_get_drvdata(hdev);
unsigned long flags; unsigned long flags;
int i, err; int i, err;
...@@ -437,7 +437,7 @@ static int bfusb_open(struct hci_dev *hdev) ...@@ -437,7 +437,7 @@ static int bfusb_open(struct hci_dev *hdev)
static int bfusb_flush(struct hci_dev *hdev) static int bfusb_flush(struct hci_dev *hdev)
{ {
struct bfusb_data *data = hdev->driver_data; struct bfusb_data *data = hci_get_drvdata(hdev);
BT_DBG("hdev %p bfusb %p", hdev, data); BT_DBG("hdev %p bfusb %p", hdev, data);
...@@ -448,7 +448,7 @@ static int bfusb_flush(struct hci_dev *hdev) ...@@ -448,7 +448,7 @@ static int bfusb_flush(struct hci_dev *hdev)
static int bfusb_close(struct hci_dev *hdev) static int bfusb_close(struct hci_dev *hdev)
{ {
struct bfusb_data *data = hdev->driver_data; struct bfusb_data *data = hci_get_drvdata(hdev);
unsigned long flags; unsigned long flags;
BT_DBG("hdev %p bfusb %p", hdev, data); BT_DBG("hdev %p bfusb %p", hdev, data);
...@@ -483,7 +483,7 @@ static int bfusb_send_frame(struct sk_buff *skb) ...@@ -483,7 +483,7 @@ static int bfusb_send_frame(struct sk_buff *skb)
if (!test_bit(HCI_RUNNING, &hdev->flags)) if (!test_bit(HCI_RUNNING, &hdev->flags))
return -EBUSY; return -EBUSY;
data = hdev->driver_data; data = hci_get_drvdata(hdev);
switch (bt_cb(skb)->pkt_type) { switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
...@@ -544,15 +544,6 @@ static int bfusb_send_frame(struct sk_buff *skb) ...@@ -544,15 +544,6 @@ static int bfusb_send_frame(struct sk_buff *skb)
return 0; return 0;
} }
static void bfusb_destruct(struct hci_dev *hdev)
{
struct bfusb_data *data = hdev->driver_data;
BT_DBG("hdev %p bfusb %p", hdev, data);
kfree(data);
}
static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg) static int bfusb_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
{ {
return -ENOIOCTLCMD; return -ENOIOCTLCMD;
...@@ -705,18 +696,15 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i ...@@ -705,18 +696,15 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i
data->hdev = hdev; data->hdev = hdev;
hdev->bus = HCI_USB; hdev->bus = HCI_USB;
hdev->driver_data = data; hci_set_drvdata(hdev, data);
SET_HCIDEV_DEV(hdev, &intf->dev); SET_HCIDEV_DEV(hdev, &intf->dev);
hdev->open = bfusb_open; hdev->open = bfusb_open;
hdev->close = bfusb_close; hdev->close = bfusb_close;
hdev->flush = bfusb_flush; hdev->flush = bfusb_flush;
hdev->send = bfusb_send_frame; hdev->send = bfusb_send_frame;
hdev->destruct = bfusb_destruct;
hdev->ioctl = bfusb_ioctl; hdev->ioctl = bfusb_ioctl;
hdev->owner = THIS_MODULE;
if (hci_register_dev(hdev) < 0) { if (hci_register_dev(hdev) < 0) {
BT_ERR("Can't register HCI device"); BT_ERR("Can't register HCI device");
hci_free_dev(hdev); hci_free_dev(hdev);
...@@ -753,6 +741,7 @@ static void bfusb_disconnect(struct usb_interface *intf) ...@@ -753,6 +741,7 @@ static void bfusb_disconnect(struct usb_interface *intf)
hci_unregister_dev(hdev); hci_unregister_dev(hdev);
hci_free_dev(hdev); hci_free_dev(hdev);
kfree(data);
} }
static struct usb_driver bfusb_driver = { static struct usb_driver bfusb_driver = {
......
...@@ -561,7 +561,7 @@ static irqreturn_t bluecard_interrupt(int irq, void *dev_inst) ...@@ -561,7 +561,7 @@ static irqreturn_t bluecard_interrupt(int irq, void *dev_inst)
static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud) static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud)
{ {
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data); bluecard_info_t *info = hci_get_drvdata(hdev);
struct sk_buff *skb; struct sk_buff *skb;
/* Ericsson baud rate command */ /* Ericsson baud rate command */
...@@ -609,7 +609,7 @@ static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud) ...@@ -609,7 +609,7 @@ static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud)
static int bluecard_hci_flush(struct hci_dev *hdev) static int bluecard_hci_flush(struct hci_dev *hdev)
{ {
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data); bluecard_info_t *info = hci_get_drvdata(hdev);
/* Drop TX queue */ /* Drop TX queue */
skb_queue_purge(&(info->txq)); skb_queue_purge(&(info->txq));
...@@ -620,7 +620,7 @@ static int bluecard_hci_flush(struct hci_dev *hdev) ...@@ -620,7 +620,7 @@ static int bluecard_hci_flush(struct hci_dev *hdev)
static int bluecard_hci_open(struct hci_dev *hdev) static int bluecard_hci_open(struct hci_dev *hdev)
{ {
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data); bluecard_info_t *info = hci_get_drvdata(hdev);
unsigned int iobase = info->p_dev->resource[0]->start; unsigned int iobase = info->p_dev->resource[0]->start;
if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
...@@ -640,7 +640,7 @@ static int bluecard_hci_open(struct hci_dev *hdev) ...@@ -640,7 +640,7 @@ static int bluecard_hci_open(struct hci_dev *hdev)
static int bluecard_hci_close(struct hci_dev *hdev) static int bluecard_hci_close(struct hci_dev *hdev)
{ {
bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data); bluecard_info_t *info = hci_get_drvdata(hdev);
unsigned int iobase = info->p_dev->resource[0]->start; unsigned int iobase = info->p_dev->resource[0]->start;
if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags))) if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
...@@ -667,7 +667,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb) ...@@ -667,7 +667,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb)
return -ENODEV; return -ENODEV;
} }
info = (bluecard_info_t *)(hdev->driver_data); info = hci_get_drvdata(hdev);
switch (bt_cb(skb)->pkt_type) { switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
...@@ -691,11 +691,6 @@ static int bluecard_hci_send_frame(struct sk_buff *skb) ...@@ -691,11 +691,6 @@ static int bluecard_hci_send_frame(struct sk_buff *skb)
} }
static void bluecard_hci_destruct(struct hci_dev *hdev)
{
}
static int bluecard_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg) static int bluecard_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
{ {
return -ENOIOCTLCMD; return -ENOIOCTLCMD;
...@@ -734,18 +729,15 @@ static int bluecard_open(bluecard_info_t *info) ...@@ -734,18 +729,15 @@ static int bluecard_open(bluecard_info_t *info)
info->hdev = hdev; info->hdev = hdev;
hdev->bus = HCI_PCCARD; hdev->bus = HCI_PCCARD;
hdev->driver_data = info; hci_set_drvdata(hdev, info);
SET_HCIDEV_DEV(hdev, &info->p_dev->dev); SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
hdev->open = bluecard_hci_open; hdev->open = bluecard_hci_open;
hdev->close = bluecard_hci_close; hdev->close = bluecard_hci_close;
hdev->flush = bluecard_hci_flush; hdev->flush = bluecard_hci_flush;
hdev->send = bluecard_hci_send_frame; hdev->send = bluecard_hci_send_frame;
hdev->destruct = bluecard_hci_destruct;
hdev->ioctl = bluecard_hci_ioctl; hdev->ioctl = bluecard_hci_ioctl;
hdev->owner = THIS_MODULE;
id = inb(iobase + 0x30); id = inb(iobase + 0x30);
if ((id & 0x0f) == 0x02) if ((id & 0x0f) == 0x02)
......
...@@ -66,7 +66,7 @@ struct hci_vendor_hdr { ...@@ -66,7 +66,7 @@ struct hci_vendor_hdr {
static int bpa10x_recv(struct hci_dev *hdev, int queue, void *buf, int count) static int bpa10x_recv(struct hci_dev *hdev, int queue, void *buf, int count)
{ {
struct bpa10x_data *data = hdev->driver_data; struct bpa10x_data *data = hci_get_drvdata(hdev);
BT_DBG("%s queue %d buffer %p count %d", hdev->name, BT_DBG("%s queue %d buffer %p count %d", hdev->name,
queue, buf, count); queue, buf, count);
...@@ -189,7 +189,7 @@ static void bpa10x_tx_complete(struct urb *urb) ...@@ -189,7 +189,7 @@ static void bpa10x_tx_complete(struct urb *urb)
static void bpa10x_rx_complete(struct urb *urb) static void bpa10x_rx_complete(struct urb *urb)
{ {
struct hci_dev *hdev = urb->context; struct hci_dev *hdev = urb->context;
struct bpa10x_data *data = hdev->driver_data; struct bpa10x_data *data = hci_get_drvdata(hdev);
int err; int err;
BT_DBG("%s urb %p status %d count %d", hdev->name, BT_DBG("%s urb %p status %d count %d", hdev->name,
...@@ -219,7 +219,7 @@ static void bpa10x_rx_complete(struct urb *urb) ...@@ -219,7 +219,7 @@ static void bpa10x_rx_complete(struct urb *urb)
static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev) static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev)
{ {
struct bpa10x_data *data = hdev->driver_data; struct bpa10x_data *data = hci_get_drvdata(hdev);
struct urb *urb; struct urb *urb;
unsigned char *buf; unsigned char *buf;
unsigned int pipe; unsigned int pipe;
...@@ -260,7 +260,7 @@ static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev) ...@@ -260,7 +260,7 @@ static inline int bpa10x_submit_intr_urb(struct hci_dev *hdev)
static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev) static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev)
{ {
struct bpa10x_data *data = hdev->driver_data; struct bpa10x_data *data = hci_get_drvdata(hdev);
struct urb *urb; struct urb *urb;
unsigned char *buf; unsigned char *buf;
unsigned int pipe; unsigned int pipe;
...@@ -301,7 +301,7 @@ static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev) ...@@ -301,7 +301,7 @@ static inline int bpa10x_submit_bulk_urb(struct hci_dev *hdev)
static int bpa10x_open(struct hci_dev *hdev) static int bpa10x_open(struct hci_dev *hdev)
{ {
struct bpa10x_data *data = hdev->driver_data; struct bpa10x_data *data = hci_get_drvdata(hdev);
int err; int err;
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -329,7 +329,7 @@ static int bpa10x_open(struct hci_dev *hdev) ...@@ -329,7 +329,7 @@ static int bpa10x_open(struct hci_dev *hdev)
static int bpa10x_close(struct hci_dev *hdev) static int bpa10x_close(struct hci_dev *hdev)
{ {
struct bpa10x_data *data = hdev->driver_data; struct bpa10x_data *data = hci_get_drvdata(hdev);
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -343,7 +343,7 @@ static int bpa10x_close(struct hci_dev *hdev) ...@@ -343,7 +343,7 @@ static int bpa10x_close(struct hci_dev *hdev)
static int bpa10x_flush(struct hci_dev *hdev) static int bpa10x_flush(struct hci_dev *hdev)
{ {
struct bpa10x_data *data = hdev->driver_data; struct bpa10x_data *data = hci_get_drvdata(hdev);
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -355,7 +355,7 @@ static int bpa10x_flush(struct hci_dev *hdev) ...@@ -355,7 +355,7 @@ static int bpa10x_flush(struct hci_dev *hdev)
static int bpa10x_send_frame(struct sk_buff *skb) static int bpa10x_send_frame(struct sk_buff *skb)
{ {
struct hci_dev *hdev = (struct hci_dev *) skb->dev; struct hci_dev *hdev = (struct hci_dev *) skb->dev;
struct bpa10x_data *data = hdev->driver_data; struct bpa10x_data *data = hci_get_drvdata(hdev);
struct usb_ctrlrequest *dr; struct usb_ctrlrequest *dr;
struct urb *urb; struct urb *urb;
unsigned int pipe; unsigned int pipe;
...@@ -432,17 +432,6 @@ static int bpa10x_send_frame(struct sk_buff *skb) ...@@ -432,17 +432,6 @@ static int bpa10x_send_frame(struct sk_buff *skb)
return 0; return 0;
} }
static void bpa10x_destruct(struct hci_dev *hdev)
{
struct bpa10x_data *data = hdev->driver_data;
BT_DBG("%s", hdev->name);
kfree_skb(data->rx_skb[0]);
kfree_skb(data->rx_skb[1]);
kfree(data);
}
static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *id) static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *id)
{ {
struct bpa10x_data *data; struct bpa10x_data *data;
...@@ -470,7 +459,7 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id * ...@@ -470,7 +459,7 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *
} }
hdev->bus = HCI_USB; hdev->bus = HCI_USB;
hdev->driver_data = data; hci_set_drvdata(hdev, data);
data->hdev = hdev; data->hdev = hdev;
...@@ -480,9 +469,6 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id * ...@@ -480,9 +469,6 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id *
hdev->close = bpa10x_close; hdev->close = bpa10x_close;
hdev->flush = bpa10x_flush; hdev->flush = bpa10x_flush;
hdev->send = bpa10x_send_frame; hdev->send = bpa10x_send_frame;
hdev->destruct = bpa10x_destruct;
hdev->owner = THIS_MODULE;
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks); set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
...@@ -512,6 +498,9 @@ static void bpa10x_disconnect(struct usb_interface *intf) ...@@ -512,6 +498,9 @@ static void bpa10x_disconnect(struct usb_interface *intf)
hci_unregister_dev(data->hdev); hci_unregister_dev(data->hdev);
hci_free_dev(data->hdev); hci_free_dev(data->hdev);
kfree_skb(data->rx_skb[0]);
kfree_skb(data->rx_skb[1]);
kfree(data);
} }
static struct usb_driver bpa10x_driver = { static struct usb_driver bpa10x_driver = {
......
...@@ -389,7 +389,7 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst) ...@@ -389,7 +389,7 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst)
static int bt3c_hci_flush(struct hci_dev *hdev) static int bt3c_hci_flush(struct hci_dev *hdev)
{ {
bt3c_info_t *info = (bt3c_info_t *)(hdev->driver_data); bt3c_info_t *info = hci_get_drvdata(hdev);
/* Drop TX queue */ /* Drop TX queue */
skb_queue_purge(&(info->txq)); skb_queue_purge(&(info->txq));
...@@ -428,7 +428,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb) ...@@ -428,7 +428,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb)
return -ENODEV; return -ENODEV;
} }
info = (bt3c_info_t *) (hdev->driver_data); info = hci_get_drvdata(hdev);
switch (bt_cb(skb)->pkt_type) { switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
...@@ -456,11 +456,6 @@ static int bt3c_hci_send_frame(struct sk_buff *skb) ...@@ -456,11 +456,6 @@ static int bt3c_hci_send_frame(struct sk_buff *skb)
} }
static void bt3c_hci_destruct(struct hci_dev *hdev)
{
}
static int bt3c_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg) static int bt3c_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
{ {
return -ENOIOCTLCMD; return -ENOIOCTLCMD;
...@@ -580,18 +575,15 @@ static int bt3c_open(bt3c_info_t *info) ...@@ -580,18 +575,15 @@ static int bt3c_open(bt3c_info_t *info)
info->hdev = hdev; info->hdev = hdev;
hdev->bus = HCI_PCCARD; hdev->bus = HCI_PCCARD;
hdev->driver_data = info; hci_set_drvdata(hdev, info);
SET_HCIDEV_DEV(hdev, &info->p_dev->dev); SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
hdev->open = bt3c_hci_open; hdev->open = bt3c_hci_open;
hdev->close = bt3c_hci_close; hdev->close = bt3c_hci_close;
hdev->flush = bt3c_hci_flush; hdev->flush = bt3c_hci_flush;
hdev->send = bt3c_hci_send_frame; hdev->send = bt3c_hci_send_frame;
hdev->destruct = bt3c_hci_destruct;
hdev->ioctl = bt3c_hci_ioctl; hdev->ioctl = bt3c_hci_ioctl;
hdev->owner = THIS_MODULE;
/* Load firmware */ /* Load firmware */
err = request_firmware(&firmware, "BT3CPCC.bin", &info->p_dev->dev); err = request_firmware(&firmware, "BT3CPCC.bin", &info->p_dev->dev);
if (err < 0) { if (err < 0) {
......
...@@ -384,7 +384,7 @@ static const struct file_operations btmrvl_txdnldready_fops = { ...@@ -384,7 +384,7 @@ static const struct file_operations btmrvl_txdnldready_fops = {
void btmrvl_debugfs_init(struct hci_dev *hdev) void btmrvl_debugfs_init(struct hci_dev *hdev)
{ {
struct btmrvl_private *priv = hdev->driver_data; struct btmrvl_private *priv = hci_get_drvdata(hdev);
struct btmrvl_debugfs_data *dbg; struct btmrvl_debugfs_data *dbg;
if (!hdev->debugfs) if (!hdev->debugfs)
...@@ -401,36 +401,34 @@ void btmrvl_debugfs_init(struct hci_dev *hdev) ...@@ -401,36 +401,34 @@ void btmrvl_debugfs_init(struct hci_dev *hdev)
dbg->config_dir = debugfs_create_dir("config", hdev->debugfs); dbg->config_dir = debugfs_create_dir("config", hdev->debugfs);
dbg->psmode = debugfs_create_file("psmode", 0644, dbg->config_dir, dbg->psmode = debugfs_create_file("psmode", 0644, dbg->config_dir,
hdev->driver_data, &btmrvl_psmode_fops); priv, &btmrvl_psmode_fops);
dbg->pscmd = debugfs_create_file("pscmd", 0644, dbg->config_dir, dbg->pscmd = debugfs_create_file("pscmd", 0644, dbg->config_dir,
hdev->driver_data, &btmrvl_pscmd_fops); priv, &btmrvl_pscmd_fops);
dbg->gpiogap = debugfs_create_file("gpiogap", 0644, dbg->config_dir, dbg->gpiogap = debugfs_create_file("gpiogap", 0644, dbg->config_dir,
hdev->driver_data, &btmrvl_gpiogap_fops); priv, &btmrvl_gpiogap_fops);
dbg->hsmode = debugfs_create_file("hsmode", 0644, dbg->config_dir, dbg->hsmode = debugfs_create_file("hsmode", 0644, dbg->config_dir,
hdev->driver_data, &btmrvl_hsmode_fops); priv, &btmrvl_hsmode_fops);
dbg->hscmd = debugfs_create_file("hscmd", 0644, dbg->config_dir, dbg->hscmd = debugfs_create_file("hscmd", 0644, dbg->config_dir,
hdev->driver_data, &btmrvl_hscmd_fops); priv, &btmrvl_hscmd_fops);
dbg->hscfgcmd = debugfs_create_file("hscfgcmd", 0644, dbg->config_dir, dbg->hscfgcmd = debugfs_create_file("hscfgcmd", 0644, dbg->config_dir,
hdev->driver_data, &btmrvl_hscfgcmd_fops); priv, &btmrvl_hscfgcmd_fops);
dbg->status_dir = debugfs_create_dir("status", hdev->debugfs); dbg->status_dir = debugfs_create_dir("status", hdev->debugfs);
dbg->curpsmode = debugfs_create_file("curpsmode", 0444, dbg->curpsmode = debugfs_create_file("curpsmode", 0444,
dbg->status_dir, dbg->status_dir, priv,
hdev->driver_data, &btmrvl_curpsmode_fops);
&btmrvl_curpsmode_fops);
dbg->psstate = debugfs_create_file("psstate", 0444, dbg->status_dir, dbg->psstate = debugfs_create_file("psstate", 0444, dbg->status_dir,
hdev->driver_data, &btmrvl_psstate_fops); priv, &btmrvl_psstate_fops);
dbg->hsstate = debugfs_create_file("hsstate", 0444, dbg->status_dir, dbg->hsstate = debugfs_create_file("hsstate", 0444, dbg->status_dir,
hdev->driver_data, &btmrvl_hsstate_fops); priv, &btmrvl_hsstate_fops);
dbg->txdnldready = debugfs_create_file("txdnldready", 0444, dbg->txdnldready = debugfs_create_file("txdnldready", 0444,
dbg->status_dir, dbg->status_dir, priv,
hdev->driver_data, &btmrvl_txdnldready_fops);
&btmrvl_txdnldready_fops);
} }
void btmrvl_debugfs_remove(struct hci_dev *hdev) void btmrvl_debugfs_remove(struct hci_dev *hdev)
{ {
struct btmrvl_private *priv = hdev->driver_data; struct btmrvl_private *priv = hci_get_drvdata(hdev);
struct btmrvl_debugfs_data *dbg = priv->debugfs_data; struct btmrvl_debugfs_data *dbg = priv->debugfs_data;
if (!dbg) if (!dbg)
......
...@@ -387,10 +387,6 @@ static int btmrvl_ioctl(struct hci_dev *hdev, ...@@ -387,10 +387,6 @@ static int btmrvl_ioctl(struct hci_dev *hdev,
return -ENOIOCTLCMD; return -ENOIOCTLCMD;
} }
static void btmrvl_destruct(struct hci_dev *hdev)
{
}
static int btmrvl_send_frame(struct sk_buff *skb) static int btmrvl_send_frame(struct sk_buff *skb)
{ {
struct hci_dev *hdev = (struct hci_dev *) skb->dev; struct hci_dev *hdev = (struct hci_dev *) skb->dev;
...@@ -398,12 +394,13 @@ static int btmrvl_send_frame(struct sk_buff *skb) ...@@ -398,12 +394,13 @@ static int btmrvl_send_frame(struct sk_buff *skb)
BT_DBG("type=%d, len=%d", skb->pkt_type, skb->len); BT_DBG("type=%d, len=%d", skb->pkt_type, skb->len);
if (!hdev || !hdev->driver_data) { if (!hdev) {
BT_ERR("Frame for unknown HCI device"); BT_ERR("Frame for unknown HCI device");
return -ENODEV; return -ENODEV;
} }
priv = (struct btmrvl_private *) hdev->driver_data; priv = hci_get_drvdata(hdev);
if (!test_bit(HCI_RUNNING, &hdev->flags)) { if (!test_bit(HCI_RUNNING, &hdev->flags)) {
BT_ERR("Failed testing HCI_RUNING, flags=%lx", hdev->flags); BT_ERR("Failed testing HCI_RUNING, flags=%lx", hdev->flags);
print_hex_dump_bytes("data: ", DUMP_PREFIX_OFFSET, print_hex_dump_bytes("data: ", DUMP_PREFIX_OFFSET,
...@@ -434,7 +431,7 @@ static int btmrvl_send_frame(struct sk_buff *skb) ...@@ -434,7 +431,7 @@ static int btmrvl_send_frame(struct sk_buff *skb)
static int btmrvl_flush(struct hci_dev *hdev) static int btmrvl_flush(struct hci_dev *hdev)
{ {
struct btmrvl_private *priv = hdev->driver_data; struct btmrvl_private *priv = hci_get_drvdata(hdev);
skb_queue_purge(&priv->adapter->tx_queue); skb_queue_purge(&priv->adapter->tx_queue);
...@@ -443,7 +440,7 @@ static int btmrvl_flush(struct hci_dev *hdev) ...@@ -443,7 +440,7 @@ static int btmrvl_flush(struct hci_dev *hdev)
static int btmrvl_close(struct hci_dev *hdev) static int btmrvl_close(struct hci_dev *hdev)
{ {
struct btmrvl_private *priv = hdev->driver_data; struct btmrvl_private *priv = hci_get_drvdata(hdev);
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
return 0; return 0;
...@@ -546,16 +543,14 @@ int btmrvl_register_hdev(struct btmrvl_private *priv) ...@@ -546,16 +543,14 @@ int btmrvl_register_hdev(struct btmrvl_private *priv)
} }
priv->btmrvl_dev.hcidev = hdev; priv->btmrvl_dev.hcidev = hdev;
hdev->driver_data = priv; hci_set_drvdata(hdev, priv);
hdev->bus = HCI_SDIO; hdev->bus = HCI_SDIO;
hdev->open = btmrvl_open; hdev->open = btmrvl_open;
hdev->close = btmrvl_close; hdev->close = btmrvl_close;
hdev->flush = btmrvl_flush; hdev->flush = btmrvl_flush;
hdev->send = btmrvl_send_frame; hdev->send = btmrvl_send_frame;
hdev->destruct = btmrvl_destruct;
hdev->ioctl = btmrvl_ioctl; hdev->ioctl = btmrvl_ioctl;
hdev->owner = THIS_MODULE;
btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ); btmrvl_send_module_cfg_cmd(priv, MODULE_BRINGUP_REQ);
......
...@@ -189,7 +189,7 @@ static void btsdio_interrupt(struct sdio_func *func) ...@@ -189,7 +189,7 @@ static void btsdio_interrupt(struct sdio_func *func)
static int btsdio_open(struct hci_dev *hdev) static int btsdio_open(struct hci_dev *hdev)
{ {
struct btsdio_data *data = hdev->driver_data; struct btsdio_data *data = hci_get_drvdata(hdev);
int err; int err;
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -225,7 +225,7 @@ static int btsdio_open(struct hci_dev *hdev) ...@@ -225,7 +225,7 @@ static int btsdio_open(struct hci_dev *hdev)
static int btsdio_close(struct hci_dev *hdev) static int btsdio_close(struct hci_dev *hdev)
{ {
struct btsdio_data *data = hdev->driver_data; struct btsdio_data *data = hci_get_drvdata(hdev);
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -246,7 +246,7 @@ static int btsdio_close(struct hci_dev *hdev) ...@@ -246,7 +246,7 @@ static int btsdio_close(struct hci_dev *hdev)
static int btsdio_flush(struct hci_dev *hdev) static int btsdio_flush(struct hci_dev *hdev)
{ {
struct btsdio_data *data = hdev->driver_data; struct btsdio_data *data = hci_get_drvdata(hdev);
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -258,7 +258,7 @@ static int btsdio_flush(struct hci_dev *hdev) ...@@ -258,7 +258,7 @@ static int btsdio_flush(struct hci_dev *hdev)
static int btsdio_send_frame(struct sk_buff *skb) static int btsdio_send_frame(struct sk_buff *skb)
{ {
struct hci_dev *hdev = (struct hci_dev *) skb->dev; struct hci_dev *hdev = (struct hci_dev *) skb->dev;
struct btsdio_data *data = hdev->driver_data; struct btsdio_data *data = hci_get_drvdata(hdev);
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -289,15 +289,6 @@ static int btsdio_send_frame(struct sk_buff *skb) ...@@ -289,15 +289,6 @@ static int btsdio_send_frame(struct sk_buff *skb)
return 0; return 0;
} }
static void btsdio_destruct(struct hci_dev *hdev)
{
struct btsdio_data *data = hdev->driver_data;
BT_DBG("%s", hdev->name);
kfree(data);
}
static int btsdio_probe(struct sdio_func *func, static int btsdio_probe(struct sdio_func *func,
const struct sdio_device_id *id) const struct sdio_device_id *id)
{ {
...@@ -330,7 +321,7 @@ static int btsdio_probe(struct sdio_func *func, ...@@ -330,7 +321,7 @@ static int btsdio_probe(struct sdio_func *func,
} }
hdev->bus = HCI_SDIO; hdev->bus = HCI_SDIO;
hdev->driver_data = data; hci_set_drvdata(hdev, data);
if (id->class == SDIO_CLASS_BT_AMP) if (id->class == SDIO_CLASS_BT_AMP)
hdev->dev_type = HCI_AMP; hdev->dev_type = HCI_AMP;
...@@ -345,9 +336,6 @@ static int btsdio_probe(struct sdio_func *func, ...@@ -345,9 +336,6 @@ static int btsdio_probe(struct sdio_func *func,
hdev->close = btsdio_close; hdev->close = btsdio_close;
hdev->flush = btsdio_flush; hdev->flush = btsdio_flush;
hdev->send = btsdio_send_frame; hdev->send = btsdio_send_frame;
hdev->destruct = btsdio_destruct;
hdev->owner = THIS_MODULE;
err = hci_register_dev(hdev); err = hci_register_dev(hdev);
if (err < 0) { if (err < 0) {
...@@ -378,6 +366,7 @@ static void btsdio_remove(struct sdio_func *func) ...@@ -378,6 +366,7 @@ static void btsdio_remove(struct sdio_func *func)
hci_unregister_dev(hdev); hci_unregister_dev(hdev);
hci_free_dev(hdev); hci_free_dev(hdev);
kfree(data);
} }
static struct sdio_driver btsdio_driver = { static struct sdio_driver btsdio_driver = {
......
...@@ -397,7 +397,7 @@ static void btuart_change_speed(btuart_info_t *info, unsigned int speed) ...@@ -397,7 +397,7 @@ static void btuart_change_speed(btuart_info_t *info, unsigned int speed)
static int btuart_hci_flush(struct hci_dev *hdev) static int btuart_hci_flush(struct hci_dev *hdev)
{ {
btuart_info_t *info = (btuart_info_t *)(hdev->driver_data); btuart_info_t *info = hci_get_drvdata(hdev);
/* Drop TX queue */ /* Drop TX queue */
skb_queue_purge(&(info->txq)); skb_queue_purge(&(info->txq));
...@@ -435,7 +435,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb) ...@@ -435,7 +435,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb)
return -ENODEV; return -ENODEV;
} }
info = (btuart_info_t *)(hdev->driver_data); info = hci_get_drvdata(hdev);
switch (bt_cb(skb)->pkt_type) { switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
...@@ -459,11 +459,6 @@ static int btuart_hci_send_frame(struct sk_buff *skb) ...@@ -459,11 +459,6 @@ static int btuart_hci_send_frame(struct sk_buff *skb)
} }
static void btuart_hci_destruct(struct hci_dev *hdev)
{
}
static int btuart_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg) static int btuart_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
{ {
return -ENOIOCTLCMD; return -ENOIOCTLCMD;
...@@ -498,18 +493,15 @@ static int btuart_open(btuart_info_t *info) ...@@ -498,18 +493,15 @@ static int btuart_open(btuart_info_t *info)
info->hdev = hdev; info->hdev = hdev;
hdev->bus = HCI_PCCARD; hdev->bus = HCI_PCCARD;
hdev->driver_data = info; hci_set_drvdata(hdev, info);
SET_HCIDEV_DEV(hdev, &info->p_dev->dev); SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
hdev->open = btuart_hci_open; hdev->open = btuart_hci_open;
hdev->close = btuart_hci_close; hdev->close = btuart_hci_close;
hdev->flush = btuart_hci_flush; hdev->flush = btuart_hci_flush;
hdev->send = btuart_hci_send_frame; hdev->send = btuart_hci_send_frame;
hdev->destruct = btuart_hci_destruct;
hdev->ioctl = btuart_hci_ioctl; hdev->ioctl = btuart_hci_ioctl;
hdev->owner = THIS_MODULE;
spin_lock_irqsave(&(info->lock), flags); spin_lock_irqsave(&(info->lock), flags);
/* Reset UART */ /* Reset UART */
......
...@@ -102,6 +102,7 @@ static struct usb_device_id btusb_table[] = { ...@@ -102,6 +102,7 @@ static struct usb_device_id btusb_table[] = {
/* Broadcom BCM20702A0 */ /* Broadcom BCM20702A0 */
{ USB_DEVICE(0x0a5c, 0x21e3) }, { USB_DEVICE(0x0a5c, 0x21e3) },
{ USB_DEVICE(0x0a5c, 0x21e6) },
{ USB_DEVICE(0x0a5c, 0x21f3) }, { USB_DEVICE(0x0a5c, 0x21f3) },
{ USB_DEVICE(0x413c, 0x8197) }, { USB_DEVICE(0x413c, 0x8197) },
...@@ -121,12 +122,14 @@ static struct usb_device_id blacklist_table[] = { ...@@ -121,12 +122,14 @@ static struct usb_device_id blacklist_table[] = {
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
{ USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
{ USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
{ USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
/* Atheros AR9285 Malbec with sflash firmware */ /* Atheros AR9285 Malbec with sflash firmware */
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
/* Atheros 3012 with sflash firmware */ /* Atheros 3012 with sflash firmware */
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
{ USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 },
/* Atheros AR5BBU12 with sflash firmware */ /* Atheros AR5BBU12 with sflash firmware */
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
...@@ -243,7 +246,7 @@ static int inc_tx(struct btusb_data *data) ...@@ -243,7 +246,7 @@ static int inc_tx(struct btusb_data *data)
static void btusb_intr_complete(struct urb *urb) static void btusb_intr_complete(struct urb *urb)
{ {
struct hci_dev *hdev = urb->context; struct hci_dev *hdev = urb->context;
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
int err; int err;
BT_DBG("%s urb %p status %d count %d", hdev->name, BT_DBG("%s urb %p status %d count %d", hdev->name,
...@@ -282,7 +285,7 @@ static void btusb_intr_complete(struct urb *urb) ...@@ -282,7 +285,7 @@ static void btusb_intr_complete(struct urb *urb)
static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags) static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
struct urb *urb; struct urb *urb;
unsigned char *buf; unsigned char *buf;
unsigned int pipe; unsigned int pipe;
...@@ -331,7 +334,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags) ...@@ -331,7 +334,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
static void btusb_bulk_complete(struct urb *urb) static void btusb_bulk_complete(struct urb *urb)
{ {
struct hci_dev *hdev = urb->context; struct hci_dev *hdev = urb->context;
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
int err; int err;
BT_DBG("%s urb %p status %d count %d", hdev->name, BT_DBG("%s urb %p status %d count %d", hdev->name,
...@@ -370,7 +373,7 @@ static void btusb_bulk_complete(struct urb *urb) ...@@ -370,7 +373,7 @@ static void btusb_bulk_complete(struct urb *urb)
static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags) static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
struct urb *urb; struct urb *urb;
unsigned char *buf; unsigned char *buf;
unsigned int pipe; unsigned int pipe;
...@@ -417,7 +420,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags) ...@@ -417,7 +420,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
static void btusb_isoc_complete(struct urb *urb) static void btusb_isoc_complete(struct urb *urb)
{ {
struct hci_dev *hdev = urb->context; struct hci_dev *hdev = urb->context;
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
int i, err; int i, err;
BT_DBG("%s urb %p status %d count %d", hdev->name, BT_DBG("%s urb %p status %d count %d", hdev->name,
...@@ -484,7 +487,7 @@ static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu) ...@@ -484,7 +487,7 @@ static inline void __fill_isoc_descriptor(struct urb *urb, int len, int mtu)
static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags) static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
struct urb *urb; struct urb *urb;
unsigned char *buf; unsigned char *buf;
unsigned int pipe; unsigned int pipe;
...@@ -537,7 +540,7 @@ static void btusb_tx_complete(struct urb *urb) ...@@ -537,7 +540,7 @@ static void btusb_tx_complete(struct urb *urb)
{ {
struct sk_buff *skb = urb->context; struct sk_buff *skb = urb->context;
struct hci_dev *hdev = (struct hci_dev *) skb->dev; struct hci_dev *hdev = (struct hci_dev *) skb->dev;
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
BT_DBG("%s urb %p status %d count %d", hdev->name, BT_DBG("%s urb %p status %d count %d", hdev->name,
urb, urb->status, urb->actual_length); urb, urb->status, urb->actual_length);
...@@ -584,7 +587,7 @@ static void btusb_isoc_tx_complete(struct urb *urb) ...@@ -584,7 +587,7 @@ static void btusb_isoc_tx_complete(struct urb *urb)
static int btusb_open(struct hci_dev *hdev) static int btusb_open(struct hci_dev *hdev)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
int err; int err;
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -634,7 +637,7 @@ static void btusb_stop_traffic(struct btusb_data *data) ...@@ -634,7 +637,7 @@ static void btusb_stop_traffic(struct btusb_data *data)
static int btusb_close(struct hci_dev *hdev) static int btusb_close(struct hci_dev *hdev)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
int err; int err;
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -664,7 +667,7 @@ static int btusb_close(struct hci_dev *hdev) ...@@ -664,7 +667,7 @@ static int btusb_close(struct hci_dev *hdev)
static int btusb_flush(struct hci_dev *hdev) static int btusb_flush(struct hci_dev *hdev)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
...@@ -676,7 +679,7 @@ static int btusb_flush(struct hci_dev *hdev) ...@@ -676,7 +679,7 @@ static int btusb_flush(struct hci_dev *hdev)
static int btusb_send_frame(struct sk_buff *skb) static int btusb_send_frame(struct sk_buff *skb)
{ {
struct hci_dev *hdev = (struct hci_dev *) skb->dev; struct hci_dev *hdev = (struct hci_dev *) skb->dev;
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
struct usb_ctrlrequest *dr; struct usb_ctrlrequest *dr;
struct urb *urb; struct urb *urb;
unsigned int pipe; unsigned int pipe;
...@@ -784,18 +787,9 @@ static int btusb_send_frame(struct sk_buff *skb) ...@@ -784,18 +787,9 @@ static int btusb_send_frame(struct sk_buff *skb)
return err; return err;
} }
static void btusb_destruct(struct hci_dev *hdev)
{
struct btusb_data *data = hdev->driver_data;
BT_DBG("%s", hdev->name);
kfree(data);
}
static void btusb_notify(struct hci_dev *hdev, unsigned int evt) static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
BT_DBG("%s evt %d", hdev->name, evt); BT_DBG("%s evt %d", hdev->name, evt);
...@@ -807,7 +801,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt) ...@@ -807,7 +801,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting) static inline int __set_isoc_interface(struct hci_dev *hdev, int altsetting)
{ {
struct btusb_data *data = hdev->driver_data; struct btusb_data *data = hci_get_drvdata(hdev);
struct usb_interface *intf = data->isoc; struct usb_interface *intf = data->isoc;
struct usb_endpoint_descriptor *ep_desc; struct usb_endpoint_descriptor *ep_desc;
int i, err; int i, err;
...@@ -995,7 +989,7 @@ static int btusb_probe(struct usb_interface *intf, ...@@ -995,7 +989,7 @@ static int btusb_probe(struct usb_interface *intf,
} }
hdev->bus = HCI_USB; hdev->bus = HCI_USB;
hdev->driver_data = data; hci_set_drvdata(hdev, data);
data->hdev = hdev; data->hdev = hdev;
...@@ -1005,11 +999,8 @@ static int btusb_probe(struct usb_interface *intf, ...@@ -1005,11 +999,8 @@ static int btusb_probe(struct usb_interface *intf,
hdev->close = btusb_close; hdev->close = btusb_close;
hdev->flush = btusb_flush; hdev->flush = btusb_flush;
hdev->send = btusb_send_frame; hdev->send = btusb_send_frame;
hdev->destruct = btusb_destruct;
hdev->notify = btusb_notify; hdev->notify = btusb_notify;
hdev->owner = THIS_MODULE;
/* Interface numbers are hardcoded in the specification */ /* Interface numbers are hardcoded in the specification */
data->isoc = usb_ifnum_to_if(data->udev, 1); data->isoc = usb_ifnum_to_if(data->udev, 1);
...@@ -1091,9 +1082,6 @@ static void btusb_disconnect(struct usb_interface *intf) ...@@ -1091,9 +1082,6 @@ static void btusb_disconnect(struct usb_interface *intf)
return; return;
hdev = data->hdev; hdev = data->hdev;
__hci_dev_hold(hdev);
usb_set_intfdata(data->intf, NULL); usb_set_intfdata(data->intf, NULL);
if (data->isoc) if (data->isoc)
...@@ -1106,9 +1094,8 @@ static void btusb_disconnect(struct usb_interface *intf) ...@@ -1106,9 +1094,8 @@ static void btusb_disconnect(struct usb_interface *intf)
else if (data->isoc) else if (data->isoc)
usb_driver_release_interface(&btusb_driver, data->isoc); usb_driver_release_interface(&btusb_driver, data->isoc);
__hci_dev_put(hdev);
hci_free_dev(hdev); hci_free_dev(hdev);
kfree(data);
} }
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
...@@ -161,7 +161,7 @@ static int ti_st_open(struct hci_dev *hdev) ...@@ -161,7 +161,7 @@ static int ti_st_open(struct hci_dev *hdev)
return -EBUSY; return -EBUSY;
/* provide contexts for callbacks from ST */ /* provide contexts for callbacks from ST */
hst = hdev->driver_data; hst = hci_get_drvdata(hdev);
for (i = 0; i < MAX_BT_CHNL_IDS; i++) { for (i = 0; i < MAX_BT_CHNL_IDS; i++) {
ti_st_proto[i].priv_data = hst; ti_st_proto[i].priv_data = hst;
...@@ -236,7 +236,7 @@ static int ti_st_open(struct hci_dev *hdev) ...@@ -236,7 +236,7 @@ static int ti_st_open(struct hci_dev *hdev)
static int ti_st_close(struct hci_dev *hdev) static int ti_st_close(struct hci_dev *hdev)
{ {
int err, i; int err, i;
struct ti_st *hst = hdev->driver_data; struct ti_st *hst = hci_get_drvdata(hdev);
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
return 0; return 0;
...@@ -264,7 +264,7 @@ static int ti_st_send_frame(struct sk_buff *skb) ...@@ -264,7 +264,7 @@ static int ti_st_send_frame(struct sk_buff *skb)
if (!test_bit(HCI_RUNNING, &hdev->flags)) if (!test_bit(HCI_RUNNING, &hdev->flags))
return -EBUSY; return -EBUSY;
hst = hdev->driver_data; hst = hci_get_drvdata(hdev);
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
...@@ -291,14 +291,6 @@ static int ti_st_send_frame(struct sk_buff *skb) ...@@ -291,14 +291,6 @@ static int ti_st_send_frame(struct sk_buff *skb)
return 0; return 0;
} }
static void ti_st_destruct(struct hci_dev *hdev)
{
BT_DBG("%s", hdev->name);
/* do nothing here, since platform remove
* would free the hdev->driver_data
*/
}
static int bt_ti_probe(struct platform_device *pdev) static int bt_ti_probe(struct platform_device *pdev)
{ {
static struct ti_st *hst; static struct ti_st *hst;
...@@ -320,13 +312,11 @@ static int bt_ti_probe(struct platform_device *pdev) ...@@ -320,13 +312,11 @@ static int bt_ti_probe(struct platform_device *pdev)
hst->hdev = hdev; hst->hdev = hdev;
hdev->bus = HCI_UART; hdev->bus = HCI_UART;
hdev->driver_data = hst; hci_set_drvdata(hdev, hst);
hdev->open = ti_st_open; hdev->open = ti_st_open;
hdev->close = ti_st_close; hdev->close = ti_st_close;
hdev->flush = NULL; hdev->flush = NULL;
hdev->send = ti_st_send_frame; hdev->send = ti_st_send_frame;
hdev->destruct = ti_st_destruct;
hdev->owner = THIS_MODULE;
err = hci_register_dev(hdev); err = hci_register_dev(hdev);
if (err < 0) { if (err < 0) {
......
...@@ -83,9 +83,6 @@ typedef struct dtl1_info_t { ...@@ -83,9 +83,6 @@ typedef struct dtl1_info_t {
static int dtl1_config(struct pcmcia_device *link); static int dtl1_config(struct pcmcia_device *link);
static void dtl1_release(struct pcmcia_device *link);
static void dtl1_detach(struct pcmcia_device *p_dev);
/* Transmit states */ /* Transmit states */
...@@ -367,7 +364,7 @@ static int dtl1_hci_open(struct hci_dev *hdev) ...@@ -367,7 +364,7 @@ static int dtl1_hci_open(struct hci_dev *hdev)
static int dtl1_hci_flush(struct hci_dev *hdev) static int dtl1_hci_flush(struct hci_dev *hdev)
{ {
dtl1_info_t *info = (dtl1_info_t *)(hdev->driver_data); dtl1_info_t *info = hci_get_drvdata(hdev);
/* Drop TX queue */ /* Drop TX queue */
skb_queue_purge(&(info->txq)); skb_queue_purge(&(info->txq));
...@@ -399,7 +396,7 @@ static int dtl1_hci_send_frame(struct sk_buff *skb) ...@@ -399,7 +396,7 @@ static int dtl1_hci_send_frame(struct sk_buff *skb)
return -ENODEV; return -ENODEV;
} }
info = (dtl1_info_t *)(hdev->driver_data); info = hci_get_drvdata(hdev);
switch (bt_cb(skb)->pkt_type) { switch (bt_cb(skb)->pkt_type) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
...@@ -442,11 +439,6 @@ static int dtl1_hci_send_frame(struct sk_buff *skb) ...@@ -442,11 +439,6 @@ static int dtl1_hci_send_frame(struct sk_buff *skb)
} }
static void dtl1_hci_destruct(struct hci_dev *hdev)
{
}
static int dtl1_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg) static int dtl1_hci_ioctl(struct hci_dev *hdev, unsigned int cmd, unsigned long arg)
{ {
return -ENOIOCTLCMD; return -ENOIOCTLCMD;
...@@ -483,18 +475,15 @@ static int dtl1_open(dtl1_info_t *info) ...@@ -483,18 +475,15 @@ static int dtl1_open(dtl1_info_t *info)
info->hdev = hdev; info->hdev = hdev;
hdev->bus = HCI_PCCARD; hdev->bus = HCI_PCCARD;
hdev->driver_data = info; hci_set_drvdata(hdev, info);
SET_HCIDEV_DEV(hdev, &info->p_dev->dev); SET_HCIDEV_DEV(hdev, &info->p_dev->dev);
hdev->open = dtl1_hci_open; hdev->open = dtl1_hci_open;
hdev->close = dtl1_hci_close; hdev->close = dtl1_hci_close;
hdev->flush = dtl1_hci_flush; hdev->flush = dtl1_hci_flush;
hdev->send = dtl1_hci_send_frame; hdev->send = dtl1_hci_send_frame;
hdev->destruct = dtl1_hci_destruct;
hdev->ioctl = dtl1_hci_ioctl; hdev->ioctl = dtl1_hci_ioctl;
hdev->owner = THIS_MODULE;
spin_lock_irqsave(&(info->lock), flags); spin_lock_irqsave(&(info->lock), flags);
/* Reset UART */ /* Reset UART */
...@@ -579,8 +568,8 @@ static void dtl1_detach(struct pcmcia_device *link) ...@@ -579,8 +568,8 @@ static void dtl1_detach(struct pcmcia_device *link)
{ {
dtl1_info_t *info = link->priv; dtl1_info_t *info = link->priv;
dtl1_release(link); dtl1_close(info);
pcmcia_disable_device(link);
kfree(info); kfree(info);
} }
...@@ -619,21 +608,10 @@ static int dtl1_config(struct pcmcia_device *link) ...@@ -619,21 +608,10 @@ static int dtl1_config(struct pcmcia_device *link)
return 0; return 0;
failed: failed:
dtl1_release(link); dtl1_detach(link);
return -ENODEV; return -ENODEV;
} }
static void dtl1_release(struct pcmcia_device *link)
{
dtl1_info_t *info = link->priv;
dtl1_close(info);
pcmcia_disable_device(link);
}
static const struct pcmcia_device_id dtl1_ids[] = { static const struct pcmcia_device_id dtl1_ids[] = {
PCMCIA_DEVICE_PROD_ID12("Nokia Mobile Phones", "DTL-1", 0xe1bfdd64, 0xe168480d), PCMCIA_DEVICE_PROD_ID12("Nokia Mobile Phones", "DTL-1", 0xe1bfdd64, 0xe168480d),
PCMCIA_DEVICE_PROD_ID12("Nokia Mobile Phones", "DTL-4", 0xe1bfdd64, 0x9102bc82), PCMCIA_DEVICE_PROD_ID12("Nokia Mobile Phones", "DTL-4", 0xe1bfdd64, 0x9102bc82),
......
...@@ -112,7 +112,7 @@ static int ath_open(struct hci_uart *hu) ...@@ -112,7 +112,7 @@ static int ath_open(struct hci_uart *hu)
BT_DBG("hu %p", hu); BT_DBG("hu %p", hu);
ath = kzalloc(sizeof(*ath), GFP_ATOMIC); ath = kzalloc(sizeof(*ath), GFP_KERNEL);
if (!ath) if (!ath)
return -ENOMEM; return -ENOMEM;
......
...@@ -692,7 +692,7 @@ static int bcsp_open(struct hci_uart *hu) ...@@ -692,7 +692,7 @@ static int bcsp_open(struct hci_uart *hu)
BT_DBG("hu %p", hu); BT_DBG("hu %p", hu);
bcsp = kzalloc(sizeof(*bcsp), GFP_ATOMIC); bcsp = kzalloc(sizeof(*bcsp), GFP_KERNEL);
if (!bcsp) if (!bcsp)
return -ENOMEM; return -ENOMEM;
......
...@@ -69,7 +69,7 @@ static int h4_open(struct hci_uart *hu) ...@@ -69,7 +69,7 @@ static int h4_open(struct hci_uart *hu)
BT_DBG("hu %p", hu); BT_DBG("hu %p", hu);
h4 = kzalloc(sizeof(*h4), GFP_ATOMIC); h4 = kzalloc(sizeof(*h4), GFP_KERNEL);
if (!h4) if (!h4)
return -ENOMEM; return -ENOMEM;
......
...@@ -48,8 +48,6 @@ ...@@ -48,8 +48,6 @@
#define VERSION "2.2" #define VERSION "2.2"
static bool reset = 0;
static struct hci_uart_proto *hup[HCI_UART_MAX_PROTO]; static struct hci_uart_proto *hup[HCI_UART_MAX_PROTO];
int hci_uart_register_proto(struct hci_uart_proto *p) int hci_uart_register_proto(struct hci_uart_proto *p)
...@@ -174,7 +172,7 @@ static int hci_uart_open(struct hci_dev *hdev) ...@@ -174,7 +172,7 @@ static int hci_uart_open(struct hci_dev *hdev)
/* Reset device */ /* Reset device */
static int hci_uart_flush(struct hci_dev *hdev) static int hci_uart_flush(struct hci_dev *hdev)
{ {
struct hci_uart *hu = (struct hci_uart *) hdev->driver_data; struct hci_uart *hu = hci_get_drvdata(hdev);
struct tty_struct *tty = hu->tty; struct tty_struct *tty = hu->tty;
BT_DBG("hdev %p tty %p", hdev, tty); BT_DBG("hdev %p tty %p", hdev, tty);
...@@ -220,7 +218,7 @@ static int hci_uart_send_frame(struct sk_buff *skb) ...@@ -220,7 +218,7 @@ static int hci_uart_send_frame(struct sk_buff *skb)
if (!test_bit(HCI_RUNNING, &hdev->flags)) if (!test_bit(HCI_RUNNING, &hdev->flags))
return -EBUSY; return -EBUSY;
hu = (struct hci_uart *) hdev->driver_data; hu = hci_get_drvdata(hdev);
BT_DBG("%s: type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len); BT_DBG("%s: type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len);
...@@ -231,15 +229,6 @@ static int hci_uart_send_frame(struct sk_buff *skb) ...@@ -231,15 +229,6 @@ static int hci_uart_send_frame(struct sk_buff *skb)
return 0; return 0;
} }
static void hci_uart_destruct(struct hci_dev *hdev)
{
if (!hdev)
return;
BT_DBG("%s", hdev->name);
kfree(hdev->driver_data);
}
/* ------ LDISC part ------ */ /* ------ LDISC part ------ */
/* hci_uart_tty_open /* hci_uart_tty_open
* *
...@@ -316,6 +305,8 @@ static void hci_uart_tty_close(struct tty_struct *tty) ...@@ -316,6 +305,8 @@ static void hci_uart_tty_close(struct tty_struct *tty)
hci_free_dev(hdev); hci_free_dev(hdev);
} }
} }
kfree(hu);
} }
} }
...@@ -391,22 +382,24 @@ static int hci_uart_register_dev(struct hci_uart *hu) ...@@ -391,22 +382,24 @@ static int hci_uart_register_dev(struct hci_uart *hu)
hu->hdev = hdev; hu->hdev = hdev;
hdev->bus = HCI_UART; hdev->bus = HCI_UART;
hdev->driver_data = hu; hci_set_drvdata(hdev, hu);
hdev->open = hci_uart_open; hdev->open = hci_uart_open;
hdev->close = hci_uart_close; hdev->close = hci_uart_close;
hdev->flush = hci_uart_flush; hdev->flush = hci_uart_flush;
hdev->send = hci_uart_send_frame; hdev->send = hci_uart_send_frame;
hdev->destruct = hci_uart_destruct;
hdev->parent = hu->tty->dev; hdev->parent = hu->tty->dev;
hdev->owner = THIS_MODULE; if (test_bit(HCI_UART_RAW_DEVICE, &hu->hdev_flags))
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks);
if (!reset) if (!test_bit(HCI_UART_RESET_ON_INIT, &hu->hdev_flags))
set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks); set_bit(HCI_QUIRK_NO_RESET, &hdev->quirks);
if (test_bit(HCI_UART_RAW_DEVICE, &hu->hdev_flags)) if (test_bit(HCI_UART_CREATE_AMP, &hu->hdev_flags))
set_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks); hdev->dev_type = HCI_AMP;
else
hdev->dev_type = HCI_BREDR;
if (hci_register_dev(hdev) < 0) { if (hci_register_dev(hdev) < 0) {
BT_ERR("Can't register HCI device"); BT_ERR("Can't register HCI device");
...@@ -594,9 +587,6 @@ static void __exit hci_uart_exit(void) ...@@ -594,9 +587,6 @@ static void __exit hci_uart_exit(void)
module_init(hci_uart_init); module_init(hci_uart_init);
module_exit(hci_uart_exit); module_exit(hci_uart_exit);
module_param(reset, bool, 0644);
MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION); MODULE_DESCRIPTION("Bluetooth HCI UART driver ver " VERSION);
MODULE_VERSION(VERSION); MODULE_VERSION(VERSION);
......
...@@ -125,7 +125,7 @@ static int ll_open(struct hci_uart *hu) ...@@ -125,7 +125,7 @@ static int ll_open(struct hci_uart *hu)
BT_DBG("hu %p", hu); BT_DBG("hu %p", hu);
ll = kzalloc(sizeof(*ll), GFP_ATOMIC); ll = kzalloc(sizeof(*ll), GFP_KERNEL);
if (!ll) if (!ll)
return -ENOMEM; return -ENOMEM;
......
...@@ -45,6 +45,8 @@ ...@@ -45,6 +45,8 @@
#define HCI_UART_ATH3K 5 #define HCI_UART_ATH3K 5
#define HCI_UART_RAW_DEVICE 0 #define HCI_UART_RAW_DEVICE 0
#define HCI_UART_RESET_ON_INIT 1
#define HCI_UART_CREATE_AMP 2
struct hci_uart; struct hci_uart;
......
...@@ -61,7 +61,7 @@ static int vhci_open_dev(struct hci_dev *hdev) ...@@ -61,7 +61,7 @@ static int vhci_open_dev(struct hci_dev *hdev)
static int vhci_close_dev(struct hci_dev *hdev) static int vhci_close_dev(struct hci_dev *hdev)
{ {
struct vhci_data *data = hdev->driver_data; struct vhci_data *data = hci_get_drvdata(hdev);
if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags)) if (!test_and_clear_bit(HCI_RUNNING, &hdev->flags))
return 0; return 0;
...@@ -73,7 +73,7 @@ static int vhci_close_dev(struct hci_dev *hdev) ...@@ -73,7 +73,7 @@ static int vhci_close_dev(struct hci_dev *hdev)
static int vhci_flush(struct hci_dev *hdev) static int vhci_flush(struct hci_dev *hdev)
{ {
struct vhci_data *data = hdev->driver_data; struct vhci_data *data = hci_get_drvdata(hdev);
skb_queue_purge(&data->readq); skb_queue_purge(&data->readq);
...@@ -93,7 +93,7 @@ static int vhci_send_frame(struct sk_buff *skb) ...@@ -93,7 +93,7 @@ static int vhci_send_frame(struct sk_buff *skb)
if (!test_bit(HCI_RUNNING, &hdev->flags)) if (!test_bit(HCI_RUNNING, &hdev->flags))
return -EBUSY; return -EBUSY;
data = hdev->driver_data; data = hci_get_drvdata(hdev);
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1);
skb_queue_tail(&data->readq, skb); skb_queue_tail(&data->readq, skb);
...@@ -103,11 +103,6 @@ static int vhci_send_frame(struct sk_buff *skb) ...@@ -103,11 +103,6 @@ static int vhci_send_frame(struct sk_buff *skb)
return 0; return 0;
} }
static void vhci_destruct(struct hci_dev *hdev)
{
kfree(hdev->driver_data);
}
static inline ssize_t vhci_get_user(struct vhci_data *data, static inline ssize_t vhci_get_user(struct vhci_data *data,
const char __user *buf, size_t count) const char __user *buf, size_t count)
{ {
...@@ -239,7 +234,7 @@ static int vhci_open(struct inode *inode, struct file *file) ...@@ -239,7 +234,7 @@ static int vhci_open(struct inode *inode, struct file *file)
data->hdev = hdev; data->hdev = hdev;
hdev->bus = HCI_VIRTUAL; hdev->bus = HCI_VIRTUAL;
hdev->driver_data = data; hci_set_drvdata(hdev, data);
if (amp) if (amp)
hdev->dev_type = HCI_AMP; hdev->dev_type = HCI_AMP;
...@@ -248,9 +243,6 @@ static int vhci_open(struct inode *inode, struct file *file) ...@@ -248,9 +243,6 @@ static int vhci_open(struct inode *inode, struct file *file)
hdev->close = vhci_close_dev; hdev->close = vhci_close_dev;
hdev->flush = vhci_flush; hdev->flush = vhci_flush;
hdev->send = vhci_send_frame; hdev->send = vhci_send_frame;
hdev->destruct = vhci_destruct;
hdev->owner = THIS_MODULE;
if (hci_register_dev(hdev) < 0) { if (hci_register_dev(hdev) < 0) {
BT_ERR("Can't register HCI device"); BT_ERR("Can't register HCI device");
...@@ -273,6 +265,7 @@ static int vhci_release(struct inode *inode, struct file *file) ...@@ -273,6 +265,7 @@ static int vhci_release(struct inode *inode, struct file *file)
hci_free_dev(hdev); hci_free_dev(hdev);
file->private_data = NULL; file->private_data = NULL;
kfree(data);
return 0; return 0;
} }
......
...@@ -109,12 +109,14 @@ struct bt_power { ...@@ -109,12 +109,14 @@ struct bt_power {
*/ */
#define BT_CHANNEL_POLICY_AMP_PREFERRED 2 #define BT_CHANNEL_POLICY_AMP_PREFERRED 2
__printf(2, 3) __printf(1, 2)
int bt_printk(const char *level, const char *fmt, ...); int bt_info(const char *fmt, ...);
__printf(1, 2)
int bt_err(const char *fmt, ...);
#define BT_INFO(fmt, arg...) bt_printk(KERN_INFO, pr_fmt(fmt), ##arg) #define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
#define BT_ERR(fmt, arg...) bt_printk(KERN_ERR, pr_fmt(fmt), ##arg) #define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
#define BT_DBG(fmt, arg...) pr_debug(fmt "\n", ##arg) #define BT_DBG(fmt, ...) pr_debug(fmt "\n", ##__VA_ARGS__)
/* Connection and socket states */ /* Connection and socket states */
enum { enum {
...@@ -129,6 +131,33 @@ enum { ...@@ -129,6 +131,33 @@ enum {
BT_CLOSED BT_CLOSED
}; };
/* If unused will be removed by compiler */
static inline const char *state_to_string(int state)
{
switch (state) {
case BT_CONNECTED:
return "BT_CONNECTED";
case BT_OPEN:
return "BT_OPEN";
case BT_BOUND:
return "BT_BOUND";
case BT_LISTEN:
return "BT_LISTEN";
case BT_CONNECT:
return "BT_CONNECT";
case BT_CONNECT2:
return "BT_CONNECT2";
case BT_CONFIG:
return "BT_CONFIG";
case BT_DISCONN:
return "BT_DISCONN";
case BT_CLOSED:
return "BT_CLOSED";
}
return "invalid state";
}
/* BD Address */ /* BD Address */
typedef struct { typedef struct {
__u8 b[6]; __u8 b[6];
...@@ -193,7 +222,6 @@ struct bt_skb_cb { ...@@ -193,7 +222,6 @@ struct bt_skb_cb {
__u16 tx_seq; __u16 tx_seq;
__u8 retries; __u8 retries;
__u8 sar; __u8 sar;
unsigned short channel;
__u8 force_active; __u8 force_active;
}; };
#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb)) #define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
......
...@@ -77,14 +77,6 @@ enum { ...@@ -77,14 +77,6 @@ enum {
HCI_RAW, HCI_RAW,
HCI_SETUP,
HCI_AUTO_OFF,
HCI_MGMT,
HCI_PAIRABLE,
HCI_SERVICE_CACHE,
HCI_LINK_KEYS,
HCI_DEBUG_KEYS,
HCI_RESET, HCI_RESET,
}; };
...@@ -93,7 +85,22 @@ enum { ...@@ -93,7 +85,22 @@ enum {
* states from the controller. * states from the controller.
*/ */
enum { enum {
HCI_SETUP,
HCI_AUTO_OFF,
HCI_MGMT,
HCI_PAIRABLE,
HCI_SERVICE_CACHE,
HCI_LINK_KEYS,
HCI_DEBUG_KEYS,
HCI_LE_SCAN, HCI_LE_SCAN,
HCI_SSP_ENABLED,
HCI_HS_ENABLED,
HCI_LE_ENABLED,
HCI_CONNECTABLE,
HCI_DISCOVERABLE,
HCI_LINK_SECURITY,
HCI_PENDING_CLASS,
}; };
/* HCI ioctl defines */ /* HCI ioctl defines */
...@@ -130,6 +137,7 @@ enum { ...@@ -130,6 +137,7 @@ enum {
#define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */ #define HCI_IDLE_TIMEOUT (6000) /* 6 seconds */
#define HCI_INIT_TIMEOUT (10000) /* 10 seconds */ #define HCI_INIT_TIMEOUT (10000) /* 10 seconds */
#define HCI_CMD_TIMEOUT (1000) /* 1 seconds */ #define HCI_CMD_TIMEOUT (1000) /* 1 seconds */
#define HCI_ACL_TX_TIMEOUT (45000) /* 45 seconds */
/* HCI data types */ /* HCI data types */
#define HCI_COMMAND_PKT 0x01 #define HCI_COMMAND_PKT 0x01
...@@ -229,7 +237,9 @@ enum { ...@@ -229,7 +237,9 @@ enum {
#define LMP_EXTFEATURES 0x80 #define LMP_EXTFEATURES 0x80
/* Extended LMP features */ /* Extended LMP features */
#define LMP_HOST_LE 0x02 #define LMP_HOST_SSP 0x01
#define LMP_HOST_LE 0x02
#define LMP_HOST_LE_BREDR 0x04
/* Connection modes */ /* Connection modes */
#define HCI_CM_ACTIVE 0x0000 #define HCI_CM_ACTIVE 0x0000
...@@ -268,10 +278,11 @@ enum { ...@@ -268,10 +278,11 @@ enum {
#define HCI_LK_UNAUTH_COMBINATION 0x04 #define HCI_LK_UNAUTH_COMBINATION 0x04
#define HCI_LK_AUTH_COMBINATION 0x05 #define HCI_LK_AUTH_COMBINATION 0x05
#define HCI_LK_CHANGED_COMBINATION 0x06 #define HCI_LK_CHANGED_COMBINATION 0x06
/* The spec doesn't define types for SMP keys */ /* The spec doesn't define types for SMP keys, the _MASTER suffix is implied */
#define HCI_LK_SMP_LTK 0x81 #define HCI_SMP_STK 0x80
#define HCI_LK_SMP_IRK 0x82 #define HCI_SMP_STK_SLAVE 0x81
#define HCI_LK_SMP_CSRK 0x83 #define HCI_SMP_LTK 0x82
#define HCI_SMP_LTK_SLAVE 0x83
/* ---- HCI Error Codes ---- */ /* ---- HCI Error Codes ---- */
#define HCI_ERROR_AUTH_FAILURE 0x05 #define HCI_ERROR_AUTH_FAILURE 0x05
...@@ -284,6 +295,22 @@ enum { ...@@ -284,6 +295,22 @@ enum {
#define HCI_FLOW_CTL_MODE_PACKET_BASED 0x00 #define HCI_FLOW_CTL_MODE_PACKET_BASED 0x00
#define HCI_FLOW_CTL_MODE_BLOCK_BASED 0x01 #define HCI_FLOW_CTL_MODE_BLOCK_BASED 0x01
/* Extended Inquiry Response field types */
#define EIR_FLAGS 0x01 /* flags */
#define EIR_UUID16_SOME 0x02 /* 16-bit UUID, more available */
#define EIR_UUID16_ALL 0x03 /* 16-bit UUID, all listed */
#define EIR_UUID32_SOME 0x04 /* 32-bit UUID, more available */
#define EIR_UUID32_ALL 0x05 /* 32-bit UUID, all listed */
#define EIR_UUID128_SOME 0x06 /* 128-bit UUID, more available */
#define EIR_UUID128_ALL 0x07 /* 128-bit UUID, all listed */
#define EIR_NAME_SHORT 0x08 /* shortened local name */
#define EIR_NAME_COMPLETE 0x09 /* complete local name */
#define EIR_TX_POWER 0x0A /* transmit power level */
#define EIR_CLASS_OF_DEV 0x0D /* Class of Device */
#define EIR_SSP_HASH_C 0x0E /* Simple Pairing Hash C */
#define EIR_SSP_RAND_R 0x0F /* Simple Pairing Randomizer R */
#define EIR_DEVICE_ID 0x10 /* device ID */
/* ----- HCI Commands ---- */ /* ----- HCI Commands ---- */
#define HCI_OP_NOP 0x0000 #define HCI_OP_NOP 0x0000
...@@ -666,8 +693,8 @@ struct hci_cp_host_buffer_size { ...@@ -666,8 +693,8 @@ struct hci_cp_host_buffer_size {
#define HCI_OP_WRITE_EIR 0x0c52 #define HCI_OP_WRITE_EIR 0x0c52
struct hci_cp_write_eir { struct hci_cp_write_eir {
uint8_t fec; __u8 fec;
uint8_t data[HCI_MAX_EIR_LENGTH]; __u8 data[HCI_MAX_EIR_LENGTH];
} __packed; } __packed;
#define HCI_OP_READ_SSP_MODE 0x0c55 #define HCI_OP_READ_SSP_MODE 0x0c55
...@@ -698,8 +725,8 @@ struct hci_rp_read_flow_control_mode { ...@@ -698,8 +725,8 @@ struct hci_rp_read_flow_control_mode {
#define HCI_OP_WRITE_LE_HOST_SUPPORTED 0x0c6d #define HCI_OP_WRITE_LE_HOST_SUPPORTED 0x0c6d
struct hci_cp_write_le_host_supported { struct hci_cp_write_le_host_supported {
__u8 le; __u8 le;
__u8 simul; __u8 simul;
} __packed; } __packed;
#define HCI_OP_READ_LOCAL_VERSION 0x1001 #define HCI_OP_READ_LOCAL_VERSION 0x1001
...@@ -1155,6 +1182,19 @@ struct hci_ev_le_meta { ...@@ -1155,6 +1182,19 @@ struct hci_ev_le_meta {
__u8 subevent; __u8 subevent;
} __packed; } __packed;
#define HCI_EV_NUM_COMP_BLOCKS 0x48
struct hci_comp_blocks_info {
__le16 handle;
__le16 pkts;
__le16 blocks;
} __packed;
struct hci_ev_num_comp_blocks {
__le16 num_blocks;
__u8 num_hndl;
struct hci_comp_blocks_info handles[0];
} __packed;
/* Low energy meta events */ /* Low energy meta events */
#define HCI_EV_LE_CONN_COMPLETE 0x01 #define HCI_EV_LE_CONN_COMPLETE 0x01
struct hci_ev_le_conn_complete { struct hci_ev_le_conn_complete {
...@@ -1288,6 +1328,7 @@ struct sockaddr_hci { ...@@ -1288,6 +1328,7 @@ struct sockaddr_hci {
#define HCI_CHANNEL_RAW 0 #define HCI_CHANNEL_RAW 0
#define HCI_CHANNEL_CONTROL 1 #define HCI_CHANNEL_CONTROL 1
#define HCI_CHANNEL_MONITOR 2
struct hci_filter { struct hci_filter {
unsigned long type_mask; unsigned long type_mask;
...@@ -1389,5 +1430,6 @@ struct hci_inquiry_req { ...@@ -1389,5 +1430,6 @@ struct hci_inquiry_req {
#define IREQ_CACHE_FLUSH 0x0001 #define IREQ_CACHE_FLUSH 0x0001
extern bool enable_hs; extern bool enable_hs;
extern bool enable_le;
#endif /* __HCI_H */ #endif /* __HCI_H */
This diff is collapsed.
/*
BlueZ - Bluetooth protocol stack for Linux
Copyright (C) 2011-2012 Intel Corporation
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.
*/
#ifndef __HCI_MON_H
#define __HCI_MON_H
struct hci_mon_hdr {
__le16 opcode;
__le16 index;
__le16 len;
} __packed;
#define HCI_MON_HDR_SIZE 6
#define HCI_MON_NEW_INDEX 0
#define HCI_MON_DEL_INDEX 1
#define HCI_MON_COMMAND_PKT 2
#define HCI_MON_EVENT_PKT 3
#define HCI_MON_ACL_TX_PKT 4
#define HCI_MON_ACL_RX_PKT 5
#define HCI_MON_SCO_TX_PKT 6
#define HCI_MON_SCO_RX_PKT 7
struct hci_mon_new_index {
__u8 type;
__u8 bus;
bdaddr_t bdaddr;
char name[8];
} __packed;
#define HCI_MON_NEW_INDEX_SIZE 16
#endif /* __HCI_MON_H */
...@@ -45,11 +45,11 @@ ...@@ -45,11 +45,11 @@
#define L2CAP_DEFAULT_SDU_ITIME 0xFFFFFFFF #define L2CAP_DEFAULT_SDU_ITIME 0xFFFFFFFF
#define L2CAP_DEFAULT_ACC_LAT 0xFFFFFFFF #define L2CAP_DEFAULT_ACC_LAT 0xFFFFFFFF
#define L2CAP_DISC_TIMEOUT (100) #define L2CAP_DISC_TIMEOUT msecs_to_jiffies(100)
#define L2CAP_DISC_REJ_TIMEOUT (5000) /* 5 seconds */ #define L2CAP_DISC_REJ_TIMEOUT msecs_to_jiffies(5000)
#define L2CAP_ENC_TIMEOUT (5000) /* 5 seconds */ #define L2CAP_ENC_TIMEOUT msecs_to_jiffies(5000)
#define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */ #define L2CAP_CONN_TIMEOUT msecs_to_jiffies(40000)
#define L2CAP_INFO_TIMEOUT (4000) /* 4 seconds */ #define L2CAP_INFO_TIMEOUT msecs_to_jiffies(4000)
/* L2CAP socket address */ /* L2CAP socket address */
struct sockaddr_l2 { struct sockaddr_l2 {
...@@ -492,51 +492,56 @@ struct l2cap_chan { ...@@ -492,51 +492,56 @@ struct l2cap_chan {
struct sk_buff_head srej_q; struct sk_buff_head srej_q;
struct list_head srej_l; struct list_head srej_l;
struct list_head list; struct list_head list;
struct list_head global_l; struct list_head global_l;
void *data; void *data;
struct l2cap_ops *ops; struct l2cap_ops *ops;
struct mutex lock;
}; };
struct l2cap_ops { struct l2cap_ops {
char *name; char *name;
struct l2cap_chan *(*new_connection) (void *data); struct l2cap_chan *(*new_connection) (void *data);
int (*recv) (void *data, struct sk_buff *skb); int (*recv) (void *data, struct sk_buff *skb);
void (*close) (void *data); void (*close) (void *data);
void (*state_change) (void *data, int state); void (*state_change) (void *data, int state);
struct sk_buff *(*alloc_skb) (struct l2cap_chan *chan,
unsigned long len, int nb, int *err);
}; };
struct l2cap_conn { struct l2cap_conn {
struct hci_conn *hcon; struct hci_conn *hcon;
struct hci_chan *hchan; struct hci_chan *hchan;
bdaddr_t *dst; bdaddr_t *dst;
bdaddr_t *src; bdaddr_t *src;
unsigned int mtu; unsigned int mtu;
__u32 feat_mask; __u32 feat_mask;
__u8 fixed_chan_mask;
__u8 info_state; __u8 info_state;
__u8 info_ident; __u8 info_ident;
struct delayed_work info_timer; struct delayed_work info_timer;
spinlock_t lock; spinlock_t lock;
struct sk_buff *rx_skb; struct sk_buff *rx_skb;
__u32 rx_len; __u32 rx_len;
__u8 tx_ident; __u8 tx_ident;
__u8 disc_reason; __u8 disc_reason;
struct delayed_work security_timer; struct delayed_work security_timer;
struct smp_chan *smp_chan; struct smp_chan *smp_chan;
struct list_head chan_l; struct list_head chan_l;
struct mutex chan_lock; struct mutex chan_lock;
}; };
#define L2CAP_INFO_CL_MTU_REQ_SENT 0x01 #define L2CAP_INFO_CL_MTU_REQ_SENT 0x01
...@@ -551,9 +556,9 @@ struct l2cap_conn { ...@@ -551,9 +556,9 @@ struct l2cap_conn {
#define l2cap_pi(sk) ((struct l2cap_pinfo *) sk) #define l2cap_pi(sk) ((struct l2cap_pinfo *) sk)
struct l2cap_pinfo { struct l2cap_pinfo {
struct bt_sock bt; struct bt_sock bt;
struct l2cap_chan *chan; struct l2cap_chan *chan;
struct sk_buff *rx_busy_skb; struct sk_buff *rx_busy_skb;
}; };
enum { enum {
...@@ -606,21 +611,37 @@ static inline void l2cap_chan_put(struct l2cap_chan *c) ...@@ -606,21 +611,37 @@ static inline void l2cap_chan_put(struct l2cap_chan *c)
kfree(c); kfree(c);
} }
static inline void l2cap_chan_lock(struct l2cap_chan *chan)
{
mutex_lock(&chan->lock);
}
static inline void l2cap_chan_unlock(struct l2cap_chan *chan)
{
mutex_unlock(&chan->lock);
}
static inline void l2cap_set_timer(struct l2cap_chan *chan, static inline void l2cap_set_timer(struct l2cap_chan *chan,
struct delayed_work *work, long timeout) struct delayed_work *work, long timeout)
{ {
BT_DBG("chan %p state %d timeout %ld", chan, chan->state, timeout); BT_DBG("chan %p state %s timeout %ld", chan,
state_to_string(chan->state), timeout);
if (!cancel_delayed_work(work)) if (!cancel_delayed_work(work))
l2cap_chan_hold(chan); l2cap_chan_hold(chan);
schedule_delayed_work(work, timeout); schedule_delayed_work(work, timeout);
} }
static inline void l2cap_clear_timer(struct l2cap_chan *chan, static inline bool l2cap_clear_timer(struct l2cap_chan *chan,
struct delayed_work *work) struct delayed_work *work)
{ {
if (cancel_delayed_work(work)) bool ret;
ret = cancel_delayed_work(work);
if (ret)
l2cap_chan_put(chan); l2cap_chan_put(chan);
return ret;
} }
#define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t)) #define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t))
......
This diff is collapsed.
...@@ -127,7 +127,7 @@ struct smp_chan { ...@@ -127,7 +127,7 @@ struct smp_chan {
u8 rrnd[16]; /* SMP Pairing Random (remote) */ u8 rrnd[16]; /* SMP Pairing Random (remote) */
u8 pcnf[16]; /* SMP Pairing Confirm */ u8 pcnf[16]; /* SMP Pairing Confirm */
u8 tk[16]; /* SMP Temporary Key */ u8 tk[16]; /* SMP Temporary Key */
u8 smp_key_size; u8 enc_key_size;
unsigned long smp_flags; unsigned long smp_flags;
struct crypto_blkcipher *tfm; struct crypto_blkcipher *tfm;
struct work_struct confirm; struct work_struct confirm;
......
...@@ -29,7 +29,6 @@ menuconfig BT ...@@ -29,7 +29,6 @@ menuconfig BT
BNEP Module (Bluetooth Network Encapsulation Protocol) BNEP Module (Bluetooth Network Encapsulation Protocol)
CMTP Module (CAPI Message Transport Protocol) CMTP Module (CAPI Message Transport Protocol)
HIDP Module (Human Interface Device Protocol) HIDP Module (Human Interface Device Protocol)
SMP Module (Security Manager Protocol)
Say Y here to compile Bluetooth support into the kernel or say M to Say Y here to compile Bluetooth support into the kernel or say M to
compile it as module (bluetooth). compile it as module (bluetooth).
......
...@@ -143,10 +143,10 @@ static int bnep_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne ...@@ -143,10 +143,10 @@ static int bnep_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
{ {
if (cmd == BNEPGETCONNLIST) { if (cmd == BNEPGETCONNLIST) {
struct bnep_connlist_req cl; struct bnep_connlist_req cl;
uint32_t uci; u32 uci;
int err; int err;
if (get_user(cl.cnum, (uint32_t __user *) arg) || if (get_user(cl.cnum, (u32 __user *) arg) ||
get_user(uci, (u32 __user *) (arg + 4))) get_user(uci, (u32 __user *) (arg + 4)))
return -EFAULT; return -EFAULT;
...@@ -157,7 +157,7 @@ static int bnep_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne ...@@ -157,7 +157,7 @@ static int bnep_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
err = bnep_get_connlist(&cl); err = bnep_get_connlist(&cl);
if (!err && put_user(cl.cnum, (uint32_t __user *) arg)) if (!err && put_user(cl.cnum, (u32 __user *) arg))
err = -EFAULT; err = -EFAULT;
return err; return err;
......
...@@ -137,10 +137,10 @@ static int cmtp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne ...@@ -137,10 +137,10 @@ static int cmtp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
{ {
if (cmd == CMTPGETCONNLIST) { if (cmd == CMTPGETCONNLIST) {
struct cmtp_connlist_req cl; struct cmtp_connlist_req cl;
uint32_t uci; u32 uci;
int err; int err;
if (get_user(cl.cnum, (uint32_t __user *) arg) || if (get_user(cl.cnum, (u32 __user *) arg) ||
get_user(uci, (u32 __user *) (arg + 4))) get_user(uci, (u32 __user *) (arg + 4)))
return -EFAULT; return -EFAULT;
...@@ -151,7 +151,7 @@ static int cmtp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne ...@@ -151,7 +151,7 @@ static int cmtp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
err = cmtp_get_connlist(&cl); err = cmtp_get_connlist(&cl);
if (!err && put_user(cl.cnum, (uint32_t __user *) arg)) if (!err && put_user(cl.cnum, (u32 __user *) arg))
err = -EFAULT; err = -EFAULT;
return err; return err;
......
...@@ -35,7 +35,6 @@ ...@@ -35,7 +35,6 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/notifier.h>
#include <net/sock.h> #include <net/sock.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -51,7 +50,7 @@ static void hci_le_connect(struct hci_conn *conn) ...@@ -51,7 +50,7 @@ static void hci_le_connect(struct hci_conn *conn)
struct hci_cp_le_create_conn cp; struct hci_cp_le_create_conn cp;
conn->state = BT_CONNECT; conn->state = BT_CONNECT;
conn->out = 1; conn->out = true;
conn->link_mode |= HCI_LM_MASTER; conn->link_mode |= HCI_LM_MASTER;
conn->sec_level = BT_SECURITY_LOW; conn->sec_level = BT_SECURITY_LOW;
...@@ -80,10 +79,10 @@ void hci_acl_connect(struct hci_conn *conn) ...@@ -80,10 +79,10 @@ void hci_acl_connect(struct hci_conn *conn)
struct inquiry_entry *ie; struct inquiry_entry *ie;
struct hci_cp_create_conn cp; struct hci_cp_create_conn cp;
BT_DBG("%p", conn); BT_DBG("hcon %p", conn);
conn->state = BT_CONNECT; conn->state = BT_CONNECT;
conn->out = 1; conn->out = true;
conn->link_mode = HCI_LM_MASTER; conn->link_mode = HCI_LM_MASTER;
...@@ -105,7 +104,8 @@ void hci_acl_connect(struct hci_conn *conn) ...@@ -105,7 +104,8 @@ void hci_acl_connect(struct hci_conn *conn)
} }
memcpy(conn->dev_class, ie->data.dev_class, 3); memcpy(conn->dev_class, ie->data.dev_class, 3);
conn->ssp_mode = ie->data.ssp_mode; if (ie->data.ssp_mode > 0)
set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
} }
cp.pkt_type = cpu_to_le16(conn->pkt_type); cp.pkt_type = cpu_to_le16(conn->pkt_type);
...@@ -151,7 +151,7 @@ void hci_add_sco(struct hci_conn *conn, __u16 handle) ...@@ -151,7 +151,7 @@ void hci_add_sco(struct hci_conn *conn, __u16 handle)
BT_DBG("%p", conn); BT_DBG("%p", conn);
conn->state = BT_CONNECT; conn->state = BT_CONNECT;
conn->out = 1; conn->out = true;
conn->attempt++; conn->attempt++;
...@@ -169,7 +169,7 @@ void hci_setup_sync(struct hci_conn *conn, __u16 handle) ...@@ -169,7 +169,7 @@ void hci_setup_sync(struct hci_conn *conn, __u16 handle)
BT_DBG("%p", conn); BT_DBG("%p", conn);
conn->state = BT_CONNECT; conn->state = BT_CONNECT;
conn->out = 1; conn->out = true;
conn->attempt++; conn->attempt++;
...@@ -279,16 +279,13 @@ static void hci_conn_timeout(struct work_struct *work) ...@@ -279,16 +279,13 @@ static void hci_conn_timeout(struct work_struct *work)
{ {
struct hci_conn *conn = container_of(work, struct hci_conn, struct hci_conn *conn = container_of(work, struct hci_conn,
disc_work.work); disc_work.work);
struct hci_dev *hdev = conn->hdev;
__u8 reason; __u8 reason;
BT_DBG("conn %p state %d", conn, conn->state); BT_DBG("conn %p state %s", conn, state_to_string(conn->state));
if (atomic_read(&conn->refcnt)) if (atomic_read(&conn->refcnt))
return; return;
hci_dev_lock(hdev);
switch (conn->state) { switch (conn->state) {
case BT_CONNECT: case BT_CONNECT:
case BT_CONNECT2: case BT_CONNECT2:
...@@ -308,8 +305,6 @@ static void hci_conn_timeout(struct work_struct *work) ...@@ -308,8 +305,6 @@ static void hci_conn_timeout(struct work_struct *work)
conn->state = BT_CLOSED; conn->state = BT_CLOSED;
break; break;
} }
hci_dev_unlock(hdev);
} }
/* Enter sniff mode */ /* Enter sniff mode */
...@@ -337,7 +332,7 @@ static void hci_conn_enter_sniff_mode(struct hci_conn *conn) ...@@ -337,7 +332,7 @@ static void hci_conn_enter_sniff_mode(struct hci_conn *conn)
hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp); hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp);
} }
if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
struct hci_cp_sniff_mode cp; struct hci_cp_sniff_mode cp;
cp.handle = cpu_to_le16(conn->handle); cp.handle = cpu_to_le16(conn->handle);
cp.max_interval = cpu_to_le16(hdev->sniff_max_interval); cp.max_interval = cpu_to_le16(hdev->sniff_max_interval);
...@@ -372,7 +367,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) ...@@ -372,7 +367,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
BT_DBG("%s dst %s", hdev->name, batostr(dst)); BT_DBG("%s dst %s", hdev->name, batostr(dst));
conn = kzalloc(sizeof(struct hci_conn), GFP_ATOMIC); conn = kzalloc(sizeof(struct hci_conn), GFP_KERNEL);
if (!conn) if (!conn)
return NULL; return NULL;
...@@ -386,7 +381,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) ...@@ -386,7 +381,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
conn->remote_auth = 0xff; conn->remote_auth = 0xff;
conn->key_type = 0xff; conn->key_type = 0xff;
conn->power_save = 1; set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
conn->disc_timeout = HCI_DISCONN_TIMEOUT; conn->disc_timeout = HCI_DISCONN_TIMEOUT;
switch (type) { switch (type) {
...@@ -407,7 +402,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) ...@@ -407,7 +402,7 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
skb_queue_head_init(&conn->data_q); skb_queue_head_init(&conn->data_q);
INIT_LIST_HEAD(&conn->chan_list);; INIT_LIST_HEAD(&conn->chan_list);
INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout); INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout);
setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn); setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn);
...@@ -555,7 +550,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 ...@@ -555,7 +550,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8
if (!acl) { if (!acl) {
acl = hci_conn_add(hdev, ACL_LINK, dst); acl = hci_conn_add(hdev, ACL_LINK, dst);
if (!acl) if (!acl)
return NULL; return ERR_PTR(-ENOMEM);
} }
hci_conn_hold(acl); hci_conn_hold(acl);
...@@ -575,7 +570,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 ...@@ -575,7 +570,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8
sco = hci_conn_add(hdev, type, dst); sco = hci_conn_add(hdev, type, dst);
if (!sco) { if (!sco) {
hci_conn_put(acl); hci_conn_put(acl);
return NULL; return ERR_PTR(-ENOMEM);
} }
} }
...@@ -586,12 +581,12 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 ...@@ -586,12 +581,12 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8
if (acl->state == BT_CONNECTED && if (acl->state == BT_CONNECTED &&
(sco->state == BT_OPEN || sco->state == BT_CLOSED)) { (sco->state == BT_OPEN || sco->state == BT_CLOSED)) {
acl->power_save = 1; set_bit(HCI_CONN_POWER_SAVE, &acl->flags);
hci_conn_enter_active_mode(acl, BT_POWER_FORCE_ACTIVE_ON); hci_conn_enter_active_mode(acl, BT_POWER_FORCE_ACTIVE_ON);
if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->pend)) { if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->flags)) {
/* defer SCO setup until mode change completed */ /* defer SCO setup until mode change completed */
set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->pend); set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->flags);
return sco; return sco;
} }
...@@ -607,8 +602,7 @@ int hci_conn_check_link_mode(struct hci_conn *conn) ...@@ -607,8 +602,7 @@ int hci_conn_check_link_mode(struct hci_conn *conn)
{ {
BT_DBG("conn %p", conn); BT_DBG("conn %p", conn);
if (conn->ssp_mode > 0 && conn->hdev->ssp_mode > 0 && if (hci_conn_ssp_enabled(conn) && !(conn->link_mode & HCI_LM_ENCRYPT))
!(conn->link_mode & HCI_LM_ENCRYPT))
return 0; return 0;
return 1; return 1;
...@@ -633,17 +627,17 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) ...@@ -633,17 +627,17 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
conn->auth_type = auth_type; conn->auth_type = auth_type;
if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
struct hci_cp_auth_requested cp; struct hci_cp_auth_requested cp;
/* encrypt must be pending if auth is also pending */ /* encrypt must be pending if auth is also pending */
set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend); set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
cp.handle = cpu_to_le16(conn->handle); cp.handle = cpu_to_le16(conn->handle);
hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED, hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
sizeof(cp), &cp); sizeof(cp), &cp);
if (conn->key_type != 0xff) if (conn->key_type != 0xff)
set_bit(HCI_CONN_REAUTH_PEND, &conn->pend); set_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
} }
return 0; return 0;
...@@ -654,7 +648,7 @@ static void hci_conn_encrypt(struct hci_conn *conn) ...@@ -654,7 +648,7 @@ static void hci_conn_encrypt(struct hci_conn *conn)
{ {
BT_DBG("conn %p", conn); BT_DBG("conn %p", conn);
if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) { if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
struct hci_cp_set_conn_encrypt cp; struct hci_cp_set_conn_encrypt cp;
cp.handle = cpu_to_le16(conn->handle); cp.handle = cpu_to_le16(conn->handle);
cp.encrypt = 0x01; cp.encrypt = 0x01;
...@@ -674,8 +668,7 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) ...@@ -674,8 +668,7 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
/* For non 2.1 devices and low security level we don't need the link /* For non 2.1 devices and low security level we don't need the link
key. */ key. */
if (sec_level == BT_SECURITY_LOW && if (sec_level == BT_SECURITY_LOW && !hci_conn_ssp_enabled(conn))
(!conn->ssp_mode || !conn->hdev->ssp_mode))
return 1; return 1;
/* For other security levels we need the link key. */ /* For other security levels we need the link key. */
...@@ -704,7 +697,7 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) ...@@ -704,7 +697,7 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
goto encrypt; goto encrypt;
auth: auth:
if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
return 0; return 0;
if (!hci_conn_auth(conn, sec_level, auth_type)) if (!hci_conn_auth(conn, sec_level, auth_type))
...@@ -739,7 +732,7 @@ int hci_conn_change_link_key(struct hci_conn *conn) ...@@ -739,7 +732,7 @@ int hci_conn_change_link_key(struct hci_conn *conn)
{ {
BT_DBG("conn %p", conn); BT_DBG("conn %p", conn);
if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) { if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
struct hci_cp_change_conn_link_key cp; struct hci_cp_change_conn_link_key cp;
cp.handle = cpu_to_le16(conn->handle); cp.handle = cpu_to_le16(conn->handle);
hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY, hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY,
...@@ -758,7 +751,7 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role) ...@@ -758,7 +751,7 @@ int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
if (!role && conn->link_mode & HCI_LM_MASTER) if (!role && conn->link_mode & HCI_LM_MASTER)
return 1; return 1;
if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->pend)) { if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->flags)) {
struct hci_cp_switch_role cp; struct hci_cp_switch_role cp;
bacpy(&cp.bdaddr, &conn->dst); bacpy(&cp.bdaddr, &conn->dst);
cp.role = role; cp.role = role;
...@@ -782,10 +775,10 @@ void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active) ...@@ -782,10 +775,10 @@ void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active)
if (conn->mode != HCI_CM_SNIFF) if (conn->mode != HCI_CM_SNIFF)
goto timer; goto timer;
if (!conn->power_save && !force_active) if (!test_bit(HCI_CONN_POWER_SAVE, &conn->flags) && !force_active)
goto timer; goto timer;
if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) { if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
struct hci_cp_exit_sniff_mode cp; struct hci_cp_exit_sniff_mode cp;
cp.handle = cpu_to_le16(conn->handle); cp.handle = cpu_to_le16(conn->handle);
hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp); hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp);
...@@ -801,11 +794,11 @@ void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active) ...@@ -801,11 +794,11 @@ void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active)
void hci_conn_hash_flush(struct hci_dev *hdev) void hci_conn_hash_flush(struct hci_dev *hdev)
{ {
struct hci_conn_hash *h = &hdev->conn_hash; struct hci_conn_hash *h = &hdev->conn_hash;
struct hci_conn *c; struct hci_conn *c, *n;
BT_DBG("hdev %s", hdev->name); BT_DBG("hdev %s", hdev->name);
list_for_each_entry_rcu(c, &h->list, list) { list_for_each_entry_safe(c, n, &h->list, list) {
c->state = BT_CLOSED; c->state = BT_CLOSED;
hci_proto_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM); hci_proto_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM);
...@@ -950,7 +943,7 @@ struct hci_chan *hci_chan_create(struct hci_conn *conn) ...@@ -950,7 +943,7 @@ struct hci_chan *hci_chan_create(struct hci_conn *conn)
BT_DBG("%s conn %p", hdev->name, conn); BT_DBG("%s conn %p", hdev->name, conn);
chan = kzalloc(sizeof(struct hci_chan), GFP_ATOMIC); chan = kzalloc(sizeof(struct hci_chan), GFP_KERNEL);
if (!chan) if (!chan)
return NULL; return NULL;
...@@ -981,10 +974,10 @@ int hci_chan_del(struct hci_chan *chan) ...@@ -981,10 +974,10 @@ int hci_chan_del(struct hci_chan *chan)
void hci_chan_list_flush(struct hci_conn *conn) void hci_chan_list_flush(struct hci_conn *conn)
{ {
struct hci_chan *chan; struct hci_chan *chan, *n;
BT_DBG("conn %p", conn); BT_DBG("conn %p", conn);
list_for_each_entry_rcu(chan, &conn->chan_list, list) list_for_each_entry_safe(chan, n, &conn->chan_list, list)
hci_chan_del(chan); hci_chan_del(chan);
} }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -33,19 +33,19 @@ static inline char *link_typetostr(int type) ...@@ -33,19 +33,19 @@ static inline char *link_typetostr(int type)
static ssize_t show_link_type(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_link_type(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_conn *conn = dev_get_drvdata(dev); struct hci_conn *conn = to_hci_conn(dev);
return sprintf(buf, "%s\n", link_typetostr(conn->type)); return sprintf(buf, "%s\n", link_typetostr(conn->type));
} }
static ssize_t show_link_address(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_link_address(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_conn *conn = dev_get_drvdata(dev); struct hci_conn *conn = to_hci_conn(dev);
return sprintf(buf, "%s\n", batostr(&conn->dst)); return sprintf(buf, "%s\n", batostr(&conn->dst));
} }
static ssize_t show_link_features(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_link_features(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_conn *conn = dev_get_drvdata(dev); struct hci_conn *conn = to_hci_conn(dev);
return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n", return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
conn->features[0], conn->features[1], conn->features[0], conn->features[1],
...@@ -79,8 +79,8 @@ static const struct attribute_group *bt_link_groups[] = { ...@@ -79,8 +79,8 @@ static const struct attribute_group *bt_link_groups[] = {
static void bt_link_release(struct device *dev) static void bt_link_release(struct device *dev)
{ {
void *data = dev_get_drvdata(dev); struct hci_conn *conn = to_hci_conn(dev);
kfree(data); kfree(conn);
} }
static struct device_type bt_link = { static struct device_type bt_link = {
...@@ -120,8 +120,6 @@ void hci_conn_add_sysfs(struct hci_conn *conn) ...@@ -120,8 +120,6 @@ void hci_conn_add_sysfs(struct hci_conn *conn)
dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle);
dev_set_drvdata(&conn->dev, conn);
if (device_add(&conn->dev) < 0) { if (device_add(&conn->dev) < 0) {
BT_ERR("Failed to register connection device"); BT_ERR("Failed to register connection device");
return; return;
...@@ -189,19 +187,19 @@ static inline char *host_typetostr(int type) ...@@ -189,19 +187,19 @@ static inline char *host_typetostr(int type)
static ssize_t show_bus(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_bus(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%s\n", host_bustostr(hdev->bus)); return sprintf(buf, "%s\n", host_bustostr(hdev->bus));
} }
static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_type(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%s\n", host_typetostr(hdev->dev_type)); return sprintf(buf, "%s\n", host_typetostr(hdev->dev_type));
} }
static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
char name[HCI_MAX_NAME_LENGTH + 1]; char name[HCI_MAX_NAME_LENGTH + 1];
int i; int i;
...@@ -214,20 +212,20 @@ static ssize_t show_name(struct device *dev, struct device_attribute *attr, char ...@@ -214,20 +212,20 @@ static ssize_t show_name(struct device *dev, struct device_attribute *attr, char
static ssize_t show_class(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_class(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "0x%.2x%.2x%.2x\n", return sprintf(buf, "0x%.2x%.2x%.2x\n",
hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]); hdev->dev_class[2], hdev->dev_class[1], hdev->dev_class[0]);
} }
static ssize_t show_address(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_address(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%s\n", batostr(&hdev->bdaddr)); return sprintf(buf, "%s\n", batostr(&hdev->bdaddr));
} }
static ssize_t show_features(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_features(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n", return sprintf(buf, "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
hdev->features[0], hdev->features[1], hdev->features[0], hdev->features[1],
...@@ -238,31 +236,31 @@ static ssize_t show_features(struct device *dev, struct device_attribute *attr, ...@@ -238,31 +236,31 @@ static ssize_t show_features(struct device *dev, struct device_attribute *attr,
static ssize_t show_manufacturer(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_manufacturer(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%d\n", hdev->manufacturer); return sprintf(buf, "%d\n", hdev->manufacturer);
} }
static ssize_t show_hci_version(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_hci_version(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%d\n", hdev->hci_ver); return sprintf(buf, "%d\n", hdev->hci_ver);
} }
static ssize_t show_hci_revision(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_hci_revision(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%d\n", hdev->hci_rev); return sprintf(buf, "%d\n", hdev->hci_rev);
} }
static ssize_t show_idle_timeout(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_idle_timeout(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%d\n", hdev->idle_timeout); return sprintf(buf, "%d\n", hdev->idle_timeout);
} }
static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
unsigned int val; unsigned int val;
int rv; int rv;
...@@ -280,13 +278,13 @@ static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *a ...@@ -280,13 +278,13 @@ static ssize_t store_idle_timeout(struct device *dev, struct device_attribute *a
static ssize_t show_sniff_max_interval(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_sniff_max_interval(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%d\n", hdev->sniff_max_interval); return sprintf(buf, "%d\n", hdev->sniff_max_interval);
} }
static ssize_t store_sniff_max_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) static ssize_t store_sniff_max_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
u16 val; u16 val;
int rv; int rv;
...@@ -304,13 +302,13 @@ static ssize_t store_sniff_max_interval(struct device *dev, struct device_attrib ...@@ -304,13 +302,13 @@ static ssize_t store_sniff_max_interval(struct device *dev, struct device_attrib
static ssize_t show_sniff_min_interval(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t show_sniff_min_interval(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
return sprintf(buf, "%d\n", hdev->sniff_min_interval); return sprintf(buf, "%d\n", hdev->sniff_min_interval);
} }
static ssize_t store_sniff_min_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) static ssize_t store_sniff_min_interval(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{ {
struct hci_dev *hdev = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
u16 val; u16 val;
int rv; int rv;
...@@ -370,8 +368,9 @@ static const struct attribute_group *bt_host_groups[] = { ...@@ -370,8 +368,9 @@ static const struct attribute_group *bt_host_groups[] = {
static void bt_host_release(struct device *dev) static void bt_host_release(struct device *dev)
{ {
void *data = dev_get_drvdata(dev); struct hci_dev *hdev = to_hci_dev(dev);
kfree(data); kfree(hdev);
module_put(THIS_MODULE);
} }
static struct device_type bt_host = { static struct device_type bt_host = {
...@@ -383,12 +382,12 @@ static struct device_type bt_host = { ...@@ -383,12 +382,12 @@ static struct device_type bt_host = {
static int inquiry_cache_show(struct seq_file *f, void *p) static int inquiry_cache_show(struct seq_file *f, void *p)
{ {
struct hci_dev *hdev = f->private; struct hci_dev *hdev = f->private;
struct inquiry_cache *cache = &hdev->inq_cache; struct discovery_state *cache = &hdev->discovery;
struct inquiry_entry *e; struct inquiry_entry *e;
hci_dev_lock(hdev); hci_dev_lock(hdev);
for (e = cache->list; e; e = e->next) { list_for_each_entry(e, &cache->all, all) {
struct inquiry_data *data = &e->data; struct inquiry_data *data = &e->data;
seq_printf(f, "%s %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n", seq_printf(f, "%s %d %d %d 0x%.2x%.2x%.2x 0x%.4x %d %d %u\n",
batostr(&data->bdaddr), batostr(&data->bdaddr),
...@@ -523,7 +522,7 @@ void hci_init_sysfs(struct hci_dev *hdev) ...@@ -523,7 +522,7 @@ void hci_init_sysfs(struct hci_dev *hdev)
dev->type = &bt_host; dev->type = &bt_host;
dev->class = bt_class; dev->class = bt_class;
dev_set_drvdata(dev, hdev); __module_get(THIS_MODULE);
device_initialize(dev); device_initialize(dev);
} }
......
...@@ -160,10 +160,10 @@ static int hidp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne ...@@ -160,10 +160,10 @@ static int hidp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
{ {
if (cmd == HIDPGETCONNLIST) { if (cmd == HIDPGETCONNLIST) {
struct hidp_connlist_req cl; struct hidp_connlist_req cl;
uint32_t uci; u32 uci;
int err; int err;
if (get_user(cl.cnum, (uint32_t __user *) arg) || if (get_user(cl.cnum, (u32 __user *) arg) ||
get_user(uci, (u32 __user *) (arg + 4))) get_user(uci, (u32 __user *) (arg + 4)))
return -EFAULT; return -EFAULT;
...@@ -174,7 +174,7 @@ static int hidp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne ...@@ -174,7 +174,7 @@ static int hidp_sock_compat_ioctl(struct socket *sock, unsigned int cmd, unsigne
err = hidp_get_connlist(&cl); err = hidp_get_connlist(&cl);
if (!err && put_user(cl.cnum, (uint32_t __user *) arg)) if (!err && put_user(cl.cnum, (u32 __user *) arg))
err = -EFAULT; err = -EFAULT;
return err; return err;
......
This diff is collapsed.
...@@ -125,13 +125,15 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al ...@@ -125,13 +125,15 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al
err = l2cap_chan_connect(chan, la.l2_psm, la.l2_cid, &la.l2_bdaddr); err = l2cap_chan_connect(chan, la.l2_psm, la.l2_cid, &la.l2_bdaddr);
if (err) if (err)
goto done; return err;
lock_sock(sk);
err = bt_sock_wait_state(sk, BT_CONNECTED, err = bt_sock_wait_state(sk, BT_CONNECTED,
sock_sndtimeo(sk, flags & O_NONBLOCK)); sock_sndtimeo(sk, flags & O_NONBLOCK));
done:
if (sock_owned_by_user(sk)) release_sock(sk);
release_sock(sk);
return err; return err;
} }
...@@ -783,7 +785,7 @@ static void l2cap_sock_kill(struct sock *sk) ...@@ -783,7 +785,7 @@ static void l2cap_sock_kill(struct sock *sk)
if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket) if (!sock_flag(sk, SOCK_ZAPPED) || sk->sk_socket)
return; return;
BT_DBG("sk %p state %d", sk, sk->sk_state); BT_DBG("sk %p state %s", sk, state_to_string(sk->sk_state));
/* Kill poor orphan */ /* Kill poor orphan */
...@@ -795,7 +797,8 @@ static void l2cap_sock_kill(struct sock *sk) ...@@ -795,7 +797,8 @@ static void l2cap_sock_kill(struct sock *sk)
static int l2cap_sock_shutdown(struct socket *sock, int how) static int l2cap_sock_shutdown(struct socket *sock, int how)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
struct l2cap_chan *chan = l2cap_pi(sk)->chan; struct l2cap_chan *chan;
struct l2cap_conn *conn;
int err = 0; int err = 0;
BT_DBG("sock %p, sk %p", sock, sk); BT_DBG("sock %p, sk %p", sock, sk);
...@@ -803,13 +806,24 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) ...@@ -803,13 +806,24 @@ static int l2cap_sock_shutdown(struct socket *sock, int how)
if (!sk) if (!sk)
return 0; return 0;
chan = l2cap_pi(sk)->chan;
conn = chan->conn;
if (conn)
mutex_lock(&conn->chan_lock);
l2cap_chan_lock(chan);
lock_sock(sk); lock_sock(sk);
if (!sk->sk_shutdown) { if (!sk->sk_shutdown) {
if (chan->mode == L2CAP_MODE_ERTM) if (chan->mode == L2CAP_MODE_ERTM)
err = __l2cap_wait_ack(sk); err = __l2cap_wait_ack(sk);
sk->sk_shutdown = SHUTDOWN_MASK; sk->sk_shutdown = SHUTDOWN_MASK;
release_sock(sk);
l2cap_chan_close(chan, 0); l2cap_chan_close(chan, 0);
lock_sock(sk);
if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime) if (sock_flag(sk, SOCK_LINGER) && sk->sk_lingertime)
err = bt_sock_wait_state(sk, BT_CLOSED, err = bt_sock_wait_state(sk, BT_CLOSED,
...@@ -820,6 +834,11 @@ static int l2cap_sock_shutdown(struct socket *sock, int how) ...@@ -820,6 +834,11 @@ static int l2cap_sock_shutdown(struct socket *sock, int how)
err = -sk->sk_err; err = -sk->sk_err;
release_sock(sk); release_sock(sk);
l2cap_chan_unlock(chan);
if (conn)
mutex_unlock(&conn->chan_lock);
return err; return err;
} }
...@@ -862,8 +881,12 @@ static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb) ...@@ -862,8 +881,12 @@ static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
struct sock *sk = data; struct sock *sk = data;
struct l2cap_pinfo *pi = l2cap_pi(sk); struct l2cap_pinfo *pi = l2cap_pi(sk);
if (pi->rx_busy_skb) lock_sock(sk);
return -ENOMEM;
if (pi->rx_busy_skb) {
err = -ENOMEM;
goto done;
}
err = sock_queue_rcv_skb(sk, skb); err = sock_queue_rcv_skb(sk, skb);
...@@ -882,6 +905,9 @@ static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb) ...@@ -882,6 +905,9 @@ static int l2cap_sock_recv_cb(void *data, struct sk_buff *skb)
err = 0; err = 0;
} }
done:
release_sock(sk);
return err; return err;
} }
...@@ -899,12 +925,22 @@ static void l2cap_sock_state_change_cb(void *data, int state) ...@@ -899,12 +925,22 @@ static void l2cap_sock_state_change_cb(void *data, int state)
sk->sk_state = state; sk->sk_state = state;
} }
static struct sk_buff *l2cap_sock_alloc_skb_cb(struct l2cap_chan *chan,
unsigned long len, int nb,
int *err)
{
struct sock *sk = chan->sk;
return bt_skb_send_alloc(sk, len, nb, err);
}
static struct l2cap_ops l2cap_chan_ops = { static struct l2cap_ops l2cap_chan_ops = {
.name = "L2CAP Socket Interface", .name = "L2CAP Socket Interface",
.new_connection = l2cap_sock_new_connection_cb, .new_connection = l2cap_sock_new_connection_cb,
.recv = l2cap_sock_recv_cb, .recv = l2cap_sock_recv_cb,
.close = l2cap_sock_close_cb, .close = l2cap_sock_close_cb,
.state_change = l2cap_sock_state_change_cb, .state_change = l2cap_sock_state_change_cb,
.alloc_skb = l2cap_sock_alloc_skb_cb,
}; };
static void l2cap_sock_destruct(struct sock *sk) static void l2cap_sock_destruct(struct sock *sk)
...@@ -1004,7 +1040,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p ...@@ -1004,7 +1040,7 @@ static struct sock *l2cap_sock_alloc(struct net *net, struct socket *sock, int p
INIT_LIST_HEAD(&bt_sk(sk)->accept_q); INIT_LIST_HEAD(&bt_sk(sk)->accept_q);
sk->sk_destruct = l2cap_sock_destruct; sk->sk_destruct = l2cap_sock_destruct;
sk->sk_sndtimeo = msecs_to_jiffies(L2CAP_CONN_TIMEOUT); sk->sk_sndtimeo = L2CAP_CONN_TIMEOUT;
sock_reset_flag(sk, SOCK_ZAPPED); sock_reset_flag(sk, SOCK_ZAPPED);
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
/* Bluetooth kernel library. */ /* Bluetooth kernel library. */
#define pr_fmt(fmt) "Bluetooth: " fmt
#include <linux/module.h> #include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -151,7 +153,26 @@ int bt_to_errno(__u16 code) ...@@ -151,7 +153,26 @@ int bt_to_errno(__u16 code)
} }
EXPORT_SYMBOL(bt_to_errno); EXPORT_SYMBOL(bt_to_errno);
int bt_printk(const char *level, const char *format, ...) int bt_info(const char *format, ...)
{
struct va_format vaf;
va_list args;
int r;
va_start(args, format);
vaf.fmt = format;
vaf.va = &args;
r = pr_info("%pV", &vaf);
va_end(args);
return r;
}
EXPORT_SYMBOL(bt_info);
int bt_err(const char *format, ...)
{ {
struct va_format vaf; struct va_format vaf;
va_list args; va_list args;
...@@ -162,10 +183,10 @@ int bt_printk(const char *level, const char *format, ...) ...@@ -162,10 +183,10 @@ int bt_printk(const char *level, const char *format, ...)
vaf.fmt = format; vaf.fmt = format;
vaf.va = &args; vaf.va = &args;
r = printk("%sBluetooth: %pV\n", level, &vaf); r = pr_err("%pV", &vaf);
va_end(args); va_end(args);
return r; return r;
} }
EXPORT_SYMBOL(bt_printk); EXPORT_SYMBOL(bt_err);
This diff is collapsed.
...@@ -196,7 +196,7 @@ static DEVICE_ATTR(channel, S_IRUGO, show_channel, NULL); ...@@ -196,7 +196,7 @@ static DEVICE_ATTR(channel, S_IRUGO, show_channel, NULL);
static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
{ {
struct rfcomm_dev *dev, *entry; struct rfcomm_dev *dev, *entry;
struct list_head *head = &rfcomm_dev_list, *p; struct list_head *head = &rfcomm_dev_list;
int err = 0; int err = 0;
BT_DBG("id %d channel %d", req->dev_id, req->channel); BT_DBG("id %d channel %d", req->dev_id, req->channel);
...@@ -215,7 +215,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) ...@@ -215,7 +215,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
break; break;
dev->id++; dev->id++;
head = p; head = &entry->list;
} }
} else { } else {
dev->id = req->dev_id; dev->id = req->dev_id;
...@@ -229,7 +229,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc) ...@@ -229,7 +229,7 @@ static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
if (entry->id > dev->id - 1) if (entry->id > dev->id - 1)
break; break;
head = p; head = &entry->list;
} }
} }
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment