* [PATCH 0/4] Integrate better device support
@ 2012-01-27 15:47 David Herrmann
2012-01-27 15:47 ` [PATCH 1/4] Bluetooth: Introduce to_hci_dev() David Herrmann
` (4 more replies)
0 siblings, 5 replies; 18+ messages in thread
From: David Herrmann @ 2012-01-27 15:47 UTC (permalink / raw)
To: linux-bluetooth; +Cc: johan.hedberg, marcel, David Herrmann
Hi
"struct device" provides a drvdata-field that we should use properly to save
_driver-data_. This series makes the hci-core use pointer-arithmetic to avoid
using this field in the bus-core and instead converts the drivers to use the
drvdata field.
This also reduces the hci_dev structure by 4/8 bytes, yeah.
This behavior is very common and I tried to stick to naming-conventions. See the
usb-bus or input-bus for other examples.
Regards
David
David Herrmann (4):
Bluetooth: Introduce to_hci_dev()
Bluetooth: Remove hci_dev->driver_data
Bluetooth: Introduce to_hci_conn
Bluetooth: Use proper datatypes in release-callbacks
drivers/bluetooth/bfusb.c | 10 ++++----
drivers/bluetooth/bluecard_cs.c | 12 ++++----
drivers/bluetooth/bpa10x.c | 18 +++++++-------
drivers/bluetooth/bt3c_cs.c | 6 ++--
drivers/bluetooth/btmrvl_debugfs.c | 26 +++++++++----------
drivers/bluetooth/btmrvl_main.c | 10 ++++----
drivers/bluetooth/btsdio.c | 10 ++++----
drivers/bluetooth/btuart_cs.c | 6 ++--
drivers/bluetooth/btusb.c | 28 ++++++++++----------
drivers/bluetooth/btwilink.c | 8 +++---
drivers/bluetooth/dtl1_cs.c | 6 ++--
drivers/bluetooth/hci_ldisc.c | 6 ++--
drivers/bluetooth/hci_vhci.c | 8 +++---
include/net/bluetooth/hci_core.h | 14 ++++++++++-
net/bluetooth/hci_sysfs.c | 47 ++++++++++++++++-------------------
15 files changed, 111 insertions(+), 104 deletions(-)
--
1.7.8.4
^ permalink raw reply [flat|nested] 18+ messages in thread* [PATCH 1/4] Bluetooth: Introduce to_hci_dev() 2012-01-27 15:47 [PATCH 0/4] Integrate better device support David Herrmann @ 2012-01-27 15:47 ` David Herrmann 2012-01-30 21:55 ` Marcel Holtmann 2012-01-27 15:47 ` [PATCH 2/4] Bluetooth: Remove hci_dev->driver_data David Herrmann ` (3 subsequent siblings) 4 siblings, 1 reply; 18+ messages in thread From: David Herrmann @ 2012-01-27 15:47 UTC (permalink / raw) To: linux-bluetooth; +Cc: johan.hedberg, marcel, David Herrmann We currently use dev_set_drvdata to keep a pointer to ourself. This doesn't make sense as we are the bus and not a driver. Therefore, introduce to_hci_dev() so we can get a struct hci_dev pointer from a struct device pointer. dev_set/get_drvdata() is reserved for drivers that provide a device and not for the bus using the device. The bus can use simple pointer arithmetic to retrieve its private data. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> --- include/net/bluetooth/hci_core.h | 2 ++ net/bluetooth/hci_sysfs.c | 33 ++++++++++++++++----------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 25f449f..01fdd2c 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -612,6 +612,8 @@ static inline struct hci_dev *hci_dev_hold(struct hci_dev *d) #define hci_dev_lock(d) mutex_lock(&d->lock) #define hci_dev_unlock(d) mutex_unlock(&d->lock) +#define to_hci_dev(d) container_of(d, struct hci_dev, dev) + struct hci_dev *hci_dev_get(int index); struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst); diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index ec03ee2..2a0243a 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c @@ -189,19 +189,19 @@ static inline char *host_typetostr(int type) 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)); } 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)); } 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]; int i; @@ -214,20 +214,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) { - struct hci_dev *hdev = dev_get_drvdata(dev); + struct hci_dev *hdev = to_hci_dev(dev); return sprintf(buf, "0x%.2x%.2x%.2x\n", 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) { - struct hci_dev *hdev = dev_get_drvdata(dev); + struct hci_dev *hdev = to_hci_dev(dev); return sprintf(buf, "%s\n", batostr(&hdev->bdaddr)); } 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", hdev->features[0], hdev->features[1], @@ -238,31 +238,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) { - struct hci_dev *hdev = dev_get_drvdata(dev); + struct hci_dev *hdev = to_hci_dev(dev); return sprintf(buf, "%d\n", hdev->manufacturer); } 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); } 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); } 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); } 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; int rv; @@ -280,13 +280,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) { - 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); } 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; int rv; @@ -304,13 +304,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) { - 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); } 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; int rv; @@ -370,7 +370,7 @@ static const struct attribute_group *bt_host_groups[] = { static void bt_host_release(struct device *dev) { - void *data = dev_get_drvdata(dev); + void *data = to_hci_dev(dev); kfree(data); module_put(THIS_MODULE); } @@ -525,7 +525,6 @@ void hci_init_sysfs(struct hci_dev *hdev) dev->class = bt_class; __module_get(THIS_MODULE); - dev_set_drvdata(dev, hdev); device_initialize(dev); } -- 1.7.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 1/4] Bluetooth: Introduce to_hci_dev() 2012-01-27 15:47 ` [PATCH 1/4] Bluetooth: Introduce to_hci_dev() David Herrmann @ 2012-01-30 21:55 ` Marcel Holtmann 0 siblings, 0 replies; 18+ messages in thread From: Marcel Holtmann @ 2012-01-30 21:55 UTC (permalink / raw) To: David Herrmann; +Cc: linux-bluetooth, johan.hedberg Hi David, > We currently use dev_set_drvdata to keep a pointer to ourself. This > doesn't make sense as we are the bus and not a driver. Therefore, > introduce to_hci_dev() so we can get a struct hci_dev pointer from a > struct device pointer. > > dev_set/get_drvdata() is reserved for drivers that provide a device and > not for the bus using the device. The bus can use simple pointer > arithmetic to retrieve its private data. > > Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> > --- > include/net/bluetooth/hci_core.h | 2 ++ > net/bluetooth/hci_sysfs.c | 33 ++++++++++++++++----------------- > 2 files changed, 18 insertions(+), 17 deletions(-) Acked-by: Marcel Holtmann <marcel@holtmann.org> Regards Marcel ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 2/4] Bluetooth: Remove hci_dev->driver_data 2012-01-27 15:47 [PATCH 0/4] Integrate better device support David Herrmann 2012-01-27 15:47 ` [PATCH 1/4] Bluetooth: Introduce to_hci_dev() David Herrmann @ 2012-01-27 15:47 ` David Herrmann 2012-01-27 16:51 ` Anderson Lizardo 2012-01-27 15:47 ` [PATCH 3/4] Bluetooth: Introduce to_hci_conn David Herrmann ` (2 subsequent siblings) 4 siblings, 1 reply; 18+ messages in thread From: David Herrmann @ 2012-01-27 15:47 UTC (permalink / raw) To: linux-bluetooth; +Cc: johan.hedberg, marcel, David Herrmann The linux device model provides dev_set/get_drvdata so we can use this to save private driver data. This also removes several unnecessary casts. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> --- drivers/bluetooth/bfusb.c | 10 +++++----- drivers/bluetooth/bluecard_cs.c | 12 ++++++------ drivers/bluetooth/bpa10x.c | 18 +++++++++--------- drivers/bluetooth/bt3c_cs.c | 6 +++--- drivers/bluetooth/btmrvl_debugfs.c | 26 ++++++++++++-------------- drivers/bluetooth/btmrvl_main.c | 10 +++++----- drivers/bluetooth/btsdio.c | 10 +++++----- drivers/bluetooth/btuart_cs.c | 6 +++--- drivers/bluetooth/btusb.c | 28 ++++++++++++++-------------- drivers/bluetooth/btwilink.c | 8 ++++---- drivers/bluetooth/dtl1_cs.c | 6 +++--- drivers/bluetooth/hci_ldisc.c | 6 +++--- drivers/bluetooth/hci_vhci.c | 8 ++++---- include/net/bluetooth/hci_core.h | 11 ++++++++++- 14 files changed, 86 insertions(+), 79 deletions(-) diff --git a/drivers/bluetooth/bfusb.c b/drivers/bluetooth/bfusb.c index c7d6ff0..b8ac1c5 100644 --- a/drivers/bluetooth/bfusb.c +++ b/drivers/bluetooth/bfusb.c @@ -411,7 +411,7 @@ unlock: 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; int i, err; @@ -437,7 +437,7 @@ static int bfusb_open(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); @@ -448,7 +448,7 @@ static int bfusb_flush(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; BT_DBG("hdev %p bfusb %p", hdev, data); @@ -483,7 +483,7 @@ static int bfusb_send_frame(struct sk_buff *skb) if (!test_bit(HCI_RUNNING, &hdev->flags)) return -EBUSY; - data = hdev->driver_data; + data = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -696,7 +696,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i data->hdev = hdev; hdev->bus = HCI_USB; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); SET_HCIDEV_DEV(hdev, &intf->dev); hdev->open = bfusb_open; diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index 6b1261f..1fcd923 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c @@ -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) { - bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data); + bluecard_info_t *info = hci_get_drvdata(hdev); struct sk_buff *skb; /* Ericsson baud rate command */ @@ -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) { - bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data); + bluecard_info_t *info = hci_get_drvdata(hdev); /* Drop TX queue */ skb_queue_purge(&(info->txq)); @@ -620,7 +620,7 @@ static int bluecard_hci_flush(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; if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) @@ -640,7 +640,7 @@ static int bluecard_hci_open(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; if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags))) @@ -667,7 +667,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb) return -ENODEV; } - info = (bluecard_info_t *)(hdev->driver_data); + info = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -729,7 +729,7 @@ static int bluecard_open(bluecard_info_t *info) info->hdev = hdev; hdev->bus = HCI_PCCARD; - hdev->driver_data = info; + hci_set_drvdata(hdev, info); SET_HCIDEV_DEV(hdev, &info->p_dev->dev); hdev->open = bluecard_hci_open; diff --git a/drivers/bluetooth/bpa10x.c b/drivers/bluetooth/bpa10x.c index 9d63514..d894340 100644 --- a/drivers/bluetooth/bpa10x.c +++ b/drivers/bluetooth/bpa10x.c @@ -66,7 +66,7 @@ struct hci_vendor_hdr { 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, queue, buf, count); @@ -189,7 +189,7 @@ done: static void bpa10x_rx_complete(struct urb *urb) { struct hci_dev *hdev = urb->context; - struct bpa10x_data *data = hdev->driver_data; + struct bpa10x_data *data = hci_get_drvdata(hdev); int err; BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -219,7 +219,7 @@ static void bpa10x_rx_complete(struct urb *urb) 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; unsigned char *buf; unsigned int pipe; @@ -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) { - struct bpa10x_data *data = hdev->driver_data; + struct bpa10x_data *data = hci_get_drvdata(hdev); struct urb *urb; unsigned char *buf; unsigned int pipe; @@ -301,7 +301,7 @@ static inline int bpa10x_submit_bulk_urb(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; BT_DBG("%s", hdev->name); @@ -329,7 +329,7 @@ error: 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); @@ -343,7 +343,7 @@ static int bpa10x_close(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); @@ -355,7 +355,7 @@ static int bpa10x_flush(struct hci_dev *hdev) static int bpa10x_send_frame(struct sk_buff *skb) { 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 urb *urb; unsigned int pipe; @@ -459,7 +459,7 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id * } hdev->bus = HCI_USB; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); data->hdev = hdev; diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index 0e304cb..9c09d6f 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c @@ -389,7 +389,7 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst) 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 */ skb_queue_purge(&(info->txq)); @@ -428,7 +428,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb) return -ENODEV; } - info = (bt3c_info_t *) (hdev->driver_data); + info = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -575,7 +575,7 @@ static int bt3c_open(bt3c_info_t *info) info->hdev = hdev; hdev->bus = HCI_PCCARD; - hdev->driver_data = info; + hci_set_drvdata(hdev, info); SET_HCIDEV_DEV(hdev, &info->p_dev->dev); hdev->open = bt3c_hci_open; diff --git a/drivers/bluetooth/btmrvl_debugfs.c b/drivers/bluetooth/btmrvl_debugfs.c index 8ecf4c6..60fe333 100644 --- a/drivers/bluetooth/btmrvl_debugfs.c +++ b/drivers/bluetooth/btmrvl_debugfs.c @@ -384,7 +384,7 @@ static const struct file_operations btmrvl_txdnldready_fops = { 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; if (!hdev->debugfs) @@ -401,36 +401,34 @@ void btmrvl_debugfs_init(struct hci_dev *hdev) dbg->config_dir = debugfs_create_dir("config", hdev->debugfs); 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, - hdev->driver_data, &btmrvl_pscmd_fops); + priv, &btmrvl_pscmd_fops); 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, - hdev->driver_data, &btmrvl_hsmode_fops); + priv, &btmrvl_hsmode_fops); 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, - hdev->driver_data, &btmrvl_hscfgcmd_fops); + priv, &btmrvl_hscfgcmd_fops); dbg->status_dir = debugfs_create_dir("status", hdev->debugfs); dbg->curpsmode = debugfs_create_file("curpsmode", 0444, - dbg->status_dir, - hdev->driver_data, - &btmrvl_curpsmode_fops); + dbg->status_dir, priv, &btmrvl_curpsmode_fops); 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, - hdev->driver_data, &btmrvl_hsstate_fops); + priv, &btmrvl_hsstate_fops); dbg->txdnldready = debugfs_create_file("txdnldready", 0444, dbg->status_dir, - hdev->driver_data, + priv, &btmrvl_txdnldready_fops); } 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; if (!dbg) diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c index 66b58fd..8d0e090 100644 --- a/drivers/bluetooth/btmrvl_main.c +++ b/drivers/bluetooth/btmrvl_main.c @@ -394,12 +394,12 @@ static int btmrvl_send_frame(struct sk_buff *skb) BT_DBG("type=%d, len=%d", skb->pkt_type, skb->len); - if (!hdev || !hdev->driver_data) { + priv = hci_get_drvdata(hdev); + if (!hdev || !priv) { BT_ERR("Frame for unknown HCI device"); return -ENODEV; } - priv = (struct btmrvl_private *) hdev->driver_data; if (!test_bit(HCI_RUNNING, &hdev->flags)) { BT_ERR("Failed testing HCI_RUNING, flags=%lx", hdev->flags); print_hex_dump_bytes("data: ", DUMP_PREFIX_OFFSET, @@ -430,7 +430,7 @@ static int btmrvl_send_frame(struct sk_buff *skb) 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); @@ -439,7 +439,7 @@ static int btmrvl_flush(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)) return 0; @@ -542,7 +542,7 @@ int btmrvl_register_hdev(struct btmrvl_private *priv) } priv->btmrvl_dev.hcidev = hdev; - hdev->driver_data = priv; + hci_set_drvdata(hdev, priv); hdev->bus = HCI_SDIO; hdev->open = btmrvl_open; diff --git a/drivers/bluetooth/btsdio.c b/drivers/bluetooth/btsdio.c index 2d6e4ed..e10ea03 100644 --- a/drivers/bluetooth/btsdio.c +++ b/drivers/bluetooth/btsdio.c @@ -189,7 +189,7 @@ static void btsdio_interrupt(struct sdio_func *func) 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; BT_DBG("%s", hdev->name); @@ -225,7 +225,7 @@ release: 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); @@ -246,7 +246,7 @@ static int btsdio_close(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); @@ -258,7 +258,7 @@ static int btsdio_flush(struct hci_dev *hdev) static int btsdio_send_frame(struct sk_buff *skb) { 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); @@ -321,7 +321,7 @@ static int btsdio_probe(struct sdio_func *func, } hdev->bus = HCI_SDIO; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); if (id->class == SDIO_CLASS_BT_AMP) hdev->dev_type = HCI_AMP; diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index 80ad2b9..194224d 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c @@ -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) { - btuart_info_t *info = (btuart_info_t *)(hdev->driver_data); + btuart_info_t *info = hci_get_drvdata(hdev); /* Drop TX queue */ skb_queue_purge(&(info->txq)); @@ -435,7 +435,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb) return -ENODEV; } - info = (btuart_info_t *)(hdev->driver_data); + info = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -493,7 +493,7 @@ static int btuart_open(btuart_info_t *info) info->hdev = hdev; hdev->bus = HCI_PCCARD; - hdev->driver_data = info; + hci_set_drvdata(hdev, info); SET_HCIDEV_DEV(hdev, &info->p_dev->dev); hdev->open = btuart_hci_open; diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index d7664ff..0de3f5e 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -242,7 +242,7 @@ static int inc_tx(struct btusb_data *data) static void btusb_intr_complete(struct urb *urb) { struct hci_dev *hdev = urb->context; - struct btusb_data *data = hdev->driver_data; + struct btusb_data *data = hci_get_drvdata(hdev); int err; BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -281,7 +281,7 @@ static void btusb_intr_complete(struct urb *urb) 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; unsigned char *buf; unsigned int pipe; @@ -330,7 +330,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags) static void btusb_bulk_complete(struct urb *urb) { struct hci_dev *hdev = urb->context; - struct btusb_data *data = hdev->driver_data; + struct btusb_data *data = hci_get_drvdata(hdev); int err; BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -369,7 +369,7 @@ static void btusb_bulk_complete(struct urb *urb) 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; unsigned char *buf; unsigned int pipe; @@ -416,7 +416,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags) static void btusb_isoc_complete(struct urb *urb) { struct hci_dev *hdev = urb->context; - struct btusb_data *data = hdev->driver_data; + struct btusb_data *data = hci_get_drvdata(hdev); int i, err; BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -483,7 +483,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) { - struct btusb_data *data = hdev->driver_data; + struct btusb_data *data = hci_get_drvdata(hdev); struct urb *urb; unsigned char *buf; unsigned int pipe; @@ -536,7 +536,7 @@ static void btusb_tx_complete(struct urb *urb) { struct sk_buff *skb = urb->context; 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, urb, urb->status, urb->actual_length); @@ -583,7 +583,7 @@ done: 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; BT_DBG("%s", hdev->name); @@ -633,7 +633,7 @@ static void btusb_stop_traffic(struct btusb_data *data) 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; BT_DBG("%s", hdev->name); @@ -663,7 +663,7 @@ failed: 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); @@ -675,7 +675,7 @@ static int btusb_flush(struct hci_dev *hdev) static int btusb_send_frame(struct sk_buff *skb) { 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 urb *urb; unsigned int pipe; @@ -785,7 +785,7 @@ done: 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); @@ -797,7 +797,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt) 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_endpoint_descriptor *ep_desc; int i, err; @@ -985,7 +985,7 @@ static int btusb_probe(struct usb_interface *intf, } hdev->bus = HCI_USB; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); data->hdev = hdev; diff --git a/drivers/bluetooth/btwilink.c b/drivers/bluetooth/btwilink.c index b81b32e..8869469 100644 --- a/drivers/bluetooth/btwilink.c +++ b/drivers/bluetooth/btwilink.c @@ -161,7 +161,7 @@ static int ti_st_open(struct hci_dev *hdev) return -EBUSY; /* provide contexts for callbacks from ST */ - hst = hdev->driver_data; + hst = hci_get_drvdata(hdev); for (i = 0; i < MAX_BT_CHNL_IDS; i++) { ti_st_proto[i].priv_data = hst; @@ -236,7 +236,7 @@ done: static int ti_st_close(struct hci_dev *hdev) { 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)) return 0; @@ -264,7 +264,7 @@ static int ti_st_send_frame(struct sk_buff *skb) if (!test_bit(HCI_RUNNING, &hdev->flags)) return -EBUSY; - hst = hdev->driver_data; + hst = hci_get_drvdata(hdev); /* Prepend skb with frame type */ memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); @@ -312,7 +312,7 @@ static int bt_ti_probe(struct platform_device *pdev) hst->hdev = hdev; hdev->bus = HCI_UART; - hdev->driver_data = hst; + hci_set_drvdata(hdev, hst); hdev->open = ti_st_open; hdev->close = ti_st_close; hdev->flush = NULL; diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c index 295cf1b..049c059 100644 --- a/drivers/bluetooth/dtl1_cs.c +++ b/drivers/bluetooth/dtl1_cs.c @@ -364,7 +364,7 @@ static int dtl1_hci_open(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 */ skb_queue_purge(&(info->txq)); @@ -396,7 +396,7 @@ static int dtl1_hci_send_frame(struct sk_buff *skb) return -ENODEV; } - info = (dtl1_info_t *)(hdev->driver_data); + info = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -475,7 +475,7 @@ static int dtl1_open(dtl1_info_t *info) info->hdev = hdev; hdev->bus = HCI_PCCARD; - hdev->driver_data = info; + hci_set_drvdata(hdev, info); SET_HCIDEV_DEV(hdev, &info->p_dev->dev); hdev->open = dtl1_hci_open; diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index 459ff0b..01c23df 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c @@ -174,7 +174,7 @@ static int hci_uart_open(struct hci_dev *hdev) /* Reset device */ 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; BT_DBG("hdev %p tty %p", hdev, tty); @@ -220,7 +220,7 @@ static int hci_uart_send_frame(struct sk_buff *skb) if (!test_bit(HCI_RUNNING, &hdev->flags)) 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); @@ -384,7 +384,7 @@ static int hci_uart_register_dev(struct hci_uart *hu) hu->hdev = hdev; hdev->bus = HCI_UART; - hdev->driver_data = hu; + hci_set_drvdata(hdev, hu); hdev->open = hci_uart_open; hdev->close = hci_uart_close; diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index 5f305c1..158bfe5 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c @@ -61,7 +61,7 @@ static int vhci_open_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)) return 0; @@ -73,7 +73,7 @@ static int vhci_close_dev(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); @@ -93,7 +93,7 @@ static int vhci_send_frame(struct sk_buff *skb) if (!test_bit(HCI_RUNNING, &hdev->flags)) return -EBUSY; - data = hdev->driver_data; + data = hci_get_drvdata(hdev); memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); skb_queue_tail(&data->readq, skb); @@ -234,7 +234,7 @@ static int vhci_open(struct inode *inode, struct file *file) data->hdev = hdev; hdev->bus = HCI_VIRTUAL; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); if (amp) hdev->dev_type = HCI_AMP; diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 01fdd2c..9780f42 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -248,7 +248,6 @@ struct hci_dev { struct sk_buff_head driver_init; - void *driver_data; void *core_data; atomic_t promisc; @@ -614,6 +613,16 @@ static inline struct hci_dev *hci_dev_hold(struct hci_dev *d) #define to_hci_dev(d) container_of(d, struct hci_dev, dev) +static inline void *hci_get_drvdata(struct hci_dev *hdev) +{ + return dev_get_drvdata(&hdev->dev); +} + +static inline void hci_set_drvdata(struct hci_dev *hdev, void *data) +{ + dev_set_drvdata(&hdev->dev, data); +} + struct hci_dev *hci_dev_get(int index); struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst); -- 1.7.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 2/4] Bluetooth: Remove hci_dev->driver_data 2012-01-27 15:47 ` [PATCH 2/4] Bluetooth: Remove hci_dev->driver_data David Herrmann @ 2012-01-27 16:51 ` Anderson Lizardo 2012-01-27 16:56 ` David Herrmann 0 siblings, 1 reply; 18+ messages in thread From: Anderson Lizardo @ 2012-01-27 16:51 UTC (permalink / raw) To: David Herrmann; +Cc: linux-bluetooth, johan.hedberg, marcel Hi David, On Fri, Jan 27, 2012 at 11:47 AM, David Herrmann <dh.herrmann@googlemail.com> wrote: > diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_m= ain.c > index 66b58fd..8d0e090 100644 > --- a/drivers/bluetooth/btmrvl_main.c > +++ b/drivers/bluetooth/btmrvl_main.c > @@ -394,12 +394,12 @@ static int btmrvl_send_frame(struct sk_buff *skb) > > =A0 =A0 =A0 =A0BT_DBG("type=3D%d, len=3D%d", skb->pkt_type, skb->len); > > - =A0 =A0 =A0 if (!hdev || !hdev->driver_data) { > + =A0 =A0 =A0 priv =3D hci_get_drvdata(hdev); > + =A0 =A0 =A0 if (!hdev || !priv) { The change above will cause problems if hdev is NULL. hci_get_drvdata() dereferences hdev without checking for NULL. > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BT_ERR("Frame for unknown HCI device"); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENODEV; > =A0 =A0 =A0 =A0} > > - =A0 =A0 =A0 priv =3D (struct btmrvl_private *) hdev->driver_data; > =A0 =A0 =A0 =A0if (!test_bit(HCI_RUNNING, &hdev->flags)) { > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BT_ERR("Failed testing HCI_RUNING, flags= =3D%lx", hdev->flags); > =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0print_hex_dump_bytes("data: ", DUMP_PREFIX= _OFFSET, [...] > @@ -614,6 +613,16 @@ static inline struct hci_dev *hci_dev_hold(struct hc= i_dev *d) > > =A0#define to_hci_dev(d) container_of(d, struct hci_dev, dev) > > +static inline void *hci_get_drvdata(struct hci_dev *hdev) > +{ > + =A0 =A0 =A0 return dev_get_drvdata(&hdev->dev); > +} > + > +static inline void hci_set_drvdata(struct hci_dev *hdev, void *data) > +{ > + =A0 =A0 =A0 dev_set_drvdata(&hdev->dev, data); > +} > + > =A0struct hci_dev *hci_dev_get(int index); > =A0struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst); Regards, --=20 Anderson Lizardo Instituto Nokia de Tecnologia - INdT Manaus - Brazil ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 2/4] Bluetooth: Remove hci_dev->driver_data 2012-01-27 16:51 ` Anderson Lizardo @ 2012-01-27 16:56 ` David Herrmann 2012-01-27 17:01 ` [PATCH 2/4 v2] " David Herrmann 0 siblings, 1 reply; 18+ messages in thread From: David Herrmann @ 2012-01-27 16:56 UTC (permalink / raw) To: Anderson Lizardo; +Cc: linux-bluetooth, johan.hedberg, marcel Hi Anderson On Fri, Jan 27, 2012 at 5:51 PM, Anderson Lizardo <anderson.lizardo@openbossa.org> wrote: > Hi David, > > On Fri, Jan 27, 2012 at 11:47 AM, David Herrmann > <dh.herrmann@googlemail.com> wrote: >> diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_= main.c >> index 66b58fd..8d0e090 100644 >> --- a/drivers/bluetooth/btmrvl_main.c >> +++ b/drivers/bluetooth/btmrvl_main.c >> @@ -394,12 +394,12 @@ static int btmrvl_send_frame(struct sk_buff *skb) >> >> =A0 =A0 =A0 =A0BT_DBG("type=3D%d, len=3D%d", skb->pkt_type, skb->len); >> >> - =A0 =A0 =A0 if (!hdev || !hdev->driver_data) { >> + =A0 =A0 =A0 priv =3D hci_get_drvdata(hdev); >> + =A0 =A0 =A0 if (!hdev || !priv) { > > The change above will cause problems if hdev is NULL. > hci_get_drvdata() dereferences hdev without checking for NULL. Thanks for reviewing. I will resend it without the check for !priv. It doesn't make sense to check this. It can never be NULL, anyway. >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BT_ERR("Frame for unknown HCI device"); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0return -ENODEV; >> =A0 =A0 =A0 =A0} >> >> - =A0 =A0 =A0 priv =3D (struct btmrvl_private *) hdev->driver_data; >> =A0 =A0 =A0 =A0if (!test_bit(HCI_RUNNING, &hdev->flags)) { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0BT_ERR("Failed testing HCI_RUNING, flags= =3D%lx", hdev->flags); >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0print_hex_dump_bytes("data: ", DUMP_PREFI= X_OFFSET, > [...] >> @@ -614,6 +613,16 @@ static inline struct hci_dev *hci_dev_hold(struct h= ci_dev *d) >> >> =A0#define to_hci_dev(d) container_of(d, struct hci_dev, dev) >> >> +static inline void *hci_get_drvdata(struct hci_dev *hdev) >> +{ >> + =A0 =A0 =A0 return dev_get_drvdata(&hdev->dev); >> +} >> + >> +static inline void hci_set_drvdata(struct hci_dev *hdev, void *data) >> +{ >> + =A0 =A0 =A0 dev_set_drvdata(&hdev->dev, data); >> +} >> + >> =A0struct hci_dev *hci_dev_get(int index); >> =A0struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst); > > Regards, Regards David ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 2/4 v2] Bluetooth: Remove hci_dev->driver_data 2012-01-27 16:56 ` David Herrmann @ 2012-01-27 17:01 ` David Herrmann 2012-01-30 21:57 ` Marcel Holtmann 0 siblings, 1 reply; 18+ messages in thread From: David Herrmann @ 2012-01-27 17:01 UTC (permalink / raw) To: linux-bluetooth; +Cc: johan.hedberg, marcel, anderson.lizardo, David Herrmann The linux device model provides dev_set/get_drvdata so we can use this to save private driver data. This also removes several unnecessary casts. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> --- v2: Fixed a bug spotted by Anderson Lizardo. I checked the variables in btmrvl_main.c in the wrong order. drivers/bluetooth/bfusb.c | 10 +++++----- drivers/bluetooth/bluecard_cs.c | 12 ++++++------ drivers/bluetooth/bpa10x.c | 18 +++++++++--------- drivers/bluetooth/bt3c_cs.c | 6 +++--- drivers/bluetooth/btmrvl_debugfs.c | 26 ++++++++++++-------------- drivers/bluetooth/btmrvl_main.c | 11 ++++++----- drivers/bluetooth/btsdio.c | 10 +++++----- drivers/bluetooth/btuart_cs.c | 6 +++--- drivers/bluetooth/btusb.c | 28 ++++++++++++++-------------- drivers/bluetooth/btwilink.c | 8 ++++---- drivers/bluetooth/dtl1_cs.c | 6 +++--- drivers/bluetooth/hci_ldisc.c | 6 +++--- drivers/bluetooth/hci_vhci.c | 8 ++++---- include/net/bluetooth/hci_core.h | 11 ++++++++++- 14 files changed, 87 insertions(+), 79 deletions(-) diff --git a/drivers/bluetooth/bfusb.c b/drivers/bluetooth/bfusb.c index c7d6ff0..b8ac1c5 100644 --- a/drivers/bluetooth/bfusb.c +++ b/drivers/bluetooth/bfusb.c @@ -411,7 +411,7 @@ unlock: 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; int i, err; @@ -437,7 +437,7 @@ static int bfusb_open(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); @@ -448,7 +448,7 @@ static int bfusb_flush(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; BT_DBG("hdev %p bfusb %p", hdev, data); @@ -483,7 +483,7 @@ static int bfusb_send_frame(struct sk_buff *skb) if (!test_bit(HCI_RUNNING, &hdev->flags)) return -EBUSY; - data = hdev->driver_data; + data = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -696,7 +696,7 @@ static int bfusb_probe(struct usb_interface *intf, const struct usb_device_id *i data->hdev = hdev; hdev->bus = HCI_USB; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); SET_HCIDEV_DEV(hdev, &intf->dev); hdev->open = bfusb_open; diff --git a/drivers/bluetooth/bluecard_cs.c b/drivers/bluetooth/bluecard_cs.c index 6b1261f..1fcd923 100644 --- a/drivers/bluetooth/bluecard_cs.c +++ b/drivers/bluetooth/bluecard_cs.c @@ -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) { - bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data); + bluecard_info_t *info = hci_get_drvdata(hdev); struct sk_buff *skb; /* Ericsson baud rate command */ @@ -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) { - bluecard_info_t *info = (bluecard_info_t *)(hdev->driver_data); + bluecard_info_t *info = hci_get_drvdata(hdev); /* Drop TX queue */ skb_queue_purge(&(info->txq)); @@ -620,7 +620,7 @@ static int bluecard_hci_flush(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; if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) @@ -640,7 +640,7 @@ static int bluecard_hci_open(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; if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags))) @@ -667,7 +667,7 @@ static int bluecard_hci_send_frame(struct sk_buff *skb) return -ENODEV; } - info = (bluecard_info_t *)(hdev->driver_data); + info = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -729,7 +729,7 @@ static int bluecard_open(bluecard_info_t *info) info->hdev = hdev; hdev->bus = HCI_PCCARD; - hdev->driver_data = info; + hci_set_drvdata(hdev, info); SET_HCIDEV_DEV(hdev, &info->p_dev->dev); hdev->open = bluecard_hci_open; diff --git a/drivers/bluetooth/bpa10x.c b/drivers/bluetooth/bpa10x.c index 9d63514..d894340 100644 --- a/drivers/bluetooth/bpa10x.c +++ b/drivers/bluetooth/bpa10x.c @@ -66,7 +66,7 @@ struct hci_vendor_hdr { 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, queue, buf, count); @@ -189,7 +189,7 @@ done: static void bpa10x_rx_complete(struct urb *urb) { struct hci_dev *hdev = urb->context; - struct bpa10x_data *data = hdev->driver_data; + struct bpa10x_data *data = hci_get_drvdata(hdev); int err; BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -219,7 +219,7 @@ static void bpa10x_rx_complete(struct urb *urb) 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; unsigned char *buf; unsigned int pipe; @@ -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) { - struct bpa10x_data *data = hdev->driver_data; + struct bpa10x_data *data = hci_get_drvdata(hdev); struct urb *urb; unsigned char *buf; unsigned int pipe; @@ -301,7 +301,7 @@ static inline int bpa10x_submit_bulk_urb(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; BT_DBG("%s", hdev->name); @@ -329,7 +329,7 @@ error: 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); @@ -343,7 +343,7 @@ static int bpa10x_close(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); @@ -355,7 +355,7 @@ static int bpa10x_flush(struct hci_dev *hdev) static int bpa10x_send_frame(struct sk_buff *skb) { 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 urb *urb; unsigned int pipe; @@ -459,7 +459,7 @@ static int bpa10x_probe(struct usb_interface *intf, const struct usb_device_id * } hdev->bus = HCI_USB; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); data->hdev = hdev; diff --git a/drivers/bluetooth/bt3c_cs.c b/drivers/bluetooth/bt3c_cs.c index 0e304cb..9c09d6f 100644 --- a/drivers/bluetooth/bt3c_cs.c +++ b/drivers/bluetooth/bt3c_cs.c @@ -389,7 +389,7 @@ static irqreturn_t bt3c_interrupt(int irq, void *dev_inst) 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 */ skb_queue_purge(&(info->txq)); @@ -428,7 +428,7 @@ static int bt3c_hci_send_frame(struct sk_buff *skb) return -ENODEV; } - info = (bt3c_info_t *) (hdev->driver_data); + info = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -575,7 +575,7 @@ static int bt3c_open(bt3c_info_t *info) info->hdev = hdev; hdev->bus = HCI_PCCARD; - hdev->driver_data = info; + hci_set_drvdata(hdev, info); SET_HCIDEV_DEV(hdev, &info->p_dev->dev); hdev->open = bt3c_hci_open; diff --git a/drivers/bluetooth/btmrvl_debugfs.c b/drivers/bluetooth/btmrvl_debugfs.c index 8ecf4c6..60fe333 100644 --- a/drivers/bluetooth/btmrvl_debugfs.c +++ b/drivers/bluetooth/btmrvl_debugfs.c @@ -384,7 +384,7 @@ static const struct file_operations btmrvl_txdnldready_fops = { 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; if (!hdev->debugfs) @@ -401,36 +401,34 @@ void btmrvl_debugfs_init(struct hci_dev *hdev) dbg->config_dir = debugfs_create_dir("config", hdev->debugfs); 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, - hdev->driver_data, &btmrvl_pscmd_fops); + priv, &btmrvl_pscmd_fops); 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, - hdev->driver_data, &btmrvl_hsmode_fops); + priv, &btmrvl_hsmode_fops); 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, - hdev->driver_data, &btmrvl_hscfgcmd_fops); + priv, &btmrvl_hscfgcmd_fops); dbg->status_dir = debugfs_create_dir("status", hdev->debugfs); dbg->curpsmode = debugfs_create_file("curpsmode", 0444, - dbg->status_dir, - hdev->driver_data, - &btmrvl_curpsmode_fops); + dbg->status_dir, priv, &btmrvl_curpsmode_fops); 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, - hdev->driver_data, &btmrvl_hsstate_fops); + priv, &btmrvl_hsstate_fops); dbg->txdnldready = debugfs_create_file("txdnldready", 0444, dbg->status_dir, - hdev->driver_data, + priv, &btmrvl_txdnldready_fops); } 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; if (!dbg) diff --git a/drivers/bluetooth/btmrvl_main.c b/drivers/bluetooth/btmrvl_main.c index 66b58fd..d1209ad 100644 --- a/drivers/bluetooth/btmrvl_main.c +++ b/drivers/bluetooth/btmrvl_main.c @@ -394,12 +394,13 @@ static int btmrvl_send_frame(struct sk_buff *skb) 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"); return -ENODEV; } - priv = (struct btmrvl_private *) hdev->driver_data; + priv = hci_get_drvdata(hdev); + if (!test_bit(HCI_RUNNING, &hdev->flags)) { BT_ERR("Failed testing HCI_RUNING, flags=%lx", hdev->flags); print_hex_dump_bytes("data: ", DUMP_PREFIX_OFFSET, @@ -430,7 +431,7 @@ static int btmrvl_send_frame(struct sk_buff *skb) 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); @@ -439,7 +440,7 @@ static int btmrvl_flush(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)) return 0; @@ -542,7 +543,7 @@ int btmrvl_register_hdev(struct btmrvl_private *priv) } priv->btmrvl_dev.hcidev = hdev; - hdev->driver_data = priv; + hci_set_drvdata(hdev, priv); hdev->bus = HCI_SDIO; hdev->open = btmrvl_open; diff --git a/drivers/bluetooth/btsdio.c b/drivers/bluetooth/btsdio.c index 2d6e4ed..e10ea03 100644 --- a/drivers/bluetooth/btsdio.c +++ b/drivers/bluetooth/btsdio.c @@ -189,7 +189,7 @@ static void btsdio_interrupt(struct sdio_func *func) 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; BT_DBG("%s", hdev->name); @@ -225,7 +225,7 @@ release: 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); @@ -246,7 +246,7 @@ static int btsdio_close(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); @@ -258,7 +258,7 @@ static int btsdio_flush(struct hci_dev *hdev) static int btsdio_send_frame(struct sk_buff *skb) { 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); @@ -321,7 +321,7 @@ static int btsdio_probe(struct sdio_func *func, } hdev->bus = HCI_SDIO; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); if (id->class == SDIO_CLASS_BT_AMP) hdev->dev_type = HCI_AMP; diff --git a/drivers/bluetooth/btuart_cs.c b/drivers/bluetooth/btuart_cs.c index 80ad2b9..194224d 100644 --- a/drivers/bluetooth/btuart_cs.c +++ b/drivers/bluetooth/btuart_cs.c @@ -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) { - btuart_info_t *info = (btuart_info_t *)(hdev->driver_data); + btuart_info_t *info = hci_get_drvdata(hdev); /* Drop TX queue */ skb_queue_purge(&(info->txq)); @@ -435,7 +435,7 @@ static int btuart_hci_send_frame(struct sk_buff *skb) return -ENODEV; } - info = (btuart_info_t *)(hdev->driver_data); + info = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -493,7 +493,7 @@ static int btuart_open(btuart_info_t *info) info->hdev = hdev; hdev->bus = HCI_PCCARD; - hdev->driver_data = info; + hci_set_drvdata(hdev, info); SET_HCIDEV_DEV(hdev, &info->p_dev->dev); hdev->open = btuart_hci_open; diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index d7664ff..0de3f5e 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -242,7 +242,7 @@ static int inc_tx(struct btusb_data *data) static void btusb_intr_complete(struct urb *urb) { struct hci_dev *hdev = urb->context; - struct btusb_data *data = hdev->driver_data; + struct btusb_data *data = hci_get_drvdata(hdev); int err; BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -281,7 +281,7 @@ static void btusb_intr_complete(struct urb *urb) 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; unsigned char *buf; unsigned int pipe; @@ -330,7 +330,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags) static void btusb_bulk_complete(struct urb *urb) { struct hci_dev *hdev = urb->context; - struct btusb_data *data = hdev->driver_data; + struct btusb_data *data = hci_get_drvdata(hdev); int err; BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -369,7 +369,7 @@ static void btusb_bulk_complete(struct urb *urb) 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; unsigned char *buf; unsigned int pipe; @@ -416,7 +416,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags) static void btusb_isoc_complete(struct urb *urb) { struct hci_dev *hdev = urb->context; - struct btusb_data *data = hdev->driver_data; + struct btusb_data *data = hci_get_drvdata(hdev); int i, err; BT_DBG("%s urb %p status %d count %d", hdev->name, @@ -483,7 +483,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) { - struct btusb_data *data = hdev->driver_data; + struct btusb_data *data = hci_get_drvdata(hdev); struct urb *urb; unsigned char *buf; unsigned int pipe; @@ -536,7 +536,7 @@ static void btusb_tx_complete(struct urb *urb) { struct sk_buff *skb = urb->context; 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, urb, urb->status, urb->actual_length); @@ -583,7 +583,7 @@ done: 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; BT_DBG("%s", hdev->name); @@ -633,7 +633,7 @@ static void btusb_stop_traffic(struct btusb_data *data) 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; BT_DBG("%s", hdev->name); @@ -663,7 +663,7 @@ failed: 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); @@ -675,7 +675,7 @@ static int btusb_flush(struct hci_dev *hdev) static int btusb_send_frame(struct sk_buff *skb) { 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 urb *urb; unsigned int pipe; @@ -785,7 +785,7 @@ done: 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); @@ -797,7 +797,7 @@ static void btusb_notify(struct hci_dev *hdev, unsigned int evt) 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_endpoint_descriptor *ep_desc; int i, err; @@ -985,7 +985,7 @@ static int btusb_probe(struct usb_interface *intf, } hdev->bus = HCI_USB; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); data->hdev = hdev; diff --git a/drivers/bluetooth/btwilink.c b/drivers/bluetooth/btwilink.c index b81b32e..8869469 100644 --- a/drivers/bluetooth/btwilink.c +++ b/drivers/bluetooth/btwilink.c @@ -161,7 +161,7 @@ static int ti_st_open(struct hci_dev *hdev) return -EBUSY; /* provide contexts for callbacks from ST */ - hst = hdev->driver_data; + hst = hci_get_drvdata(hdev); for (i = 0; i < MAX_BT_CHNL_IDS; i++) { ti_st_proto[i].priv_data = hst; @@ -236,7 +236,7 @@ done: static int ti_st_close(struct hci_dev *hdev) { 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)) return 0; @@ -264,7 +264,7 @@ static int ti_st_send_frame(struct sk_buff *skb) if (!test_bit(HCI_RUNNING, &hdev->flags)) return -EBUSY; - hst = hdev->driver_data; + hst = hci_get_drvdata(hdev); /* Prepend skb with frame type */ memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); @@ -312,7 +312,7 @@ static int bt_ti_probe(struct platform_device *pdev) hst->hdev = hdev; hdev->bus = HCI_UART; - hdev->driver_data = hst; + hci_set_drvdata(hdev, hst); hdev->open = ti_st_open; hdev->close = ti_st_close; hdev->flush = NULL; diff --git a/drivers/bluetooth/dtl1_cs.c b/drivers/bluetooth/dtl1_cs.c index 295cf1b..049c059 100644 --- a/drivers/bluetooth/dtl1_cs.c +++ b/drivers/bluetooth/dtl1_cs.c @@ -364,7 +364,7 @@ static int dtl1_hci_open(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 */ skb_queue_purge(&(info->txq)); @@ -396,7 +396,7 @@ static int dtl1_hci_send_frame(struct sk_buff *skb) return -ENODEV; } - info = (dtl1_info_t *)(hdev->driver_data); + info = hci_get_drvdata(hdev); switch (bt_cb(skb)->pkt_type) { case HCI_COMMAND_PKT: @@ -475,7 +475,7 @@ static int dtl1_open(dtl1_info_t *info) info->hdev = hdev; hdev->bus = HCI_PCCARD; - hdev->driver_data = info; + hci_set_drvdata(hdev, info); SET_HCIDEV_DEV(hdev, &info->p_dev->dev); hdev->open = dtl1_hci_open; diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index 459ff0b..01c23df 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c @@ -174,7 +174,7 @@ static int hci_uart_open(struct hci_dev *hdev) /* Reset device */ 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; BT_DBG("hdev %p tty %p", hdev, tty); @@ -220,7 +220,7 @@ static int hci_uart_send_frame(struct sk_buff *skb) if (!test_bit(HCI_RUNNING, &hdev->flags)) 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); @@ -384,7 +384,7 @@ static int hci_uart_register_dev(struct hci_uart *hu) hu->hdev = hdev; hdev->bus = HCI_UART; - hdev->driver_data = hu; + hci_set_drvdata(hdev, hu); hdev->open = hci_uart_open; hdev->close = hci_uart_close; diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index 5f305c1..158bfe5 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c @@ -61,7 +61,7 @@ static int vhci_open_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)) return 0; @@ -73,7 +73,7 @@ static int vhci_close_dev(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); @@ -93,7 +93,7 @@ static int vhci_send_frame(struct sk_buff *skb) if (!test_bit(HCI_RUNNING, &hdev->flags)) return -EBUSY; - data = hdev->driver_data; + data = hci_get_drvdata(hdev); memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); skb_queue_tail(&data->readq, skb); @@ -234,7 +234,7 @@ static int vhci_open(struct inode *inode, struct file *file) data->hdev = hdev; hdev->bus = HCI_VIRTUAL; - hdev->driver_data = data; + hci_set_drvdata(hdev, data); if (amp) hdev->dev_type = HCI_AMP; diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 01fdd2c..9780f42 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -248,7 +248,6 @@ struct hci_dev { struct sk_buff_head driver_init; - void *driver_data; void *core_data; atomic_t promisc; @@ -614,6 +613,16 @@ static inline struct hci_dev *hci_dev_hold(struct hci_dev *d) #define to_hci_dev(d) container_of(d, struct hci_dev, dev) +static inline void *hci_get_drvdata(struct hci_dev *hdev) +{ + return dev_get_drvdata(&hdev->dev); +} + +static inline void hci_set_drvdata(struct hci_dev *hdev, void *data) +{ + dev_set_drvdata(&hdev->dev, data); +} + struct hci_dev *hci_dev_get(int index); struct hci_dev *hci_get_route(bdaddr_t *src, bdaddr_t *dst); -- 1.7.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 2/4 v2] Bluetooth: Remove hci_dev->driver_data 2012-01-27 17:01 ` [PATCH 2/4 v2] " David Herrmann @ 2012-01-30 21:57 ` Marcel Holtmann 0 siblings, 0 replies; 18+ messages in thread From: Marcel Holtmann @ 2012-01-30 21:57 UTC (permalink / raw) To: David Herrmann; +Cc: linux-bluetooth, johan.hedberg, anderson.lizardo Hi David, > The linux device model provides dev_set/get_drvdata so we can use this > to save private driver data. > This also removes several unnecessary casts. > > Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> > --- > v2: Fixed a bug spotted by Anderson Lizardo. I checked the variables in > btmrvl_main.c in the wrong order. > > drivers/bluetooth/bfusb.c | 10 +++++----- > drivers/bluetooth/bluecard_cs.c | 12 ++++++------ > drivers/bluetooth/bpa10x.c | 18 +++++++++--------- > drivers/bluetooth/bt3c_cs.c | 6 +++--- > drivers/bluetooth/btmrvl_debugfs.c | 26 ++++++++++++-------------- > drivers/bluetooth/btmrvl_main.c | 11 ++++++----- > drivers/bluetooth/btsdio.c | 10 +++++----- > drivers/bluetooth/btuart_cs.c | 6 +++--- > drivers/bluetooth/btusb.c | 28 ++++++++++++++-------------- > drivers/bluetooth/btwilink.c | 8 ++++---- > drivers/bluetooth/dtl1_cs.c | 6 +++--- > drivers/bluetooth/hci_ldisc.c | 6 +++--- > drivers/bluetooth/hci_vhci.c | 8 ++++---- > include/net/bluetooth/hci_core.h | 11 ++++++++++- > 14 files changed, 87 insertions(+), 79 deletions(-) Acked-by: Marcel Holtmann <marcel@holtmann.org> Regards Marcel ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 3/4] Bluetooth: Introduce to_hci_conn 2012-01-27 15:47 [PATCH 0/4] Integrate better device support David Herrmann 2012-01-27 15:47 ` [PATCH 1/4] Bluetooth: Introduce to_hci_dev() David Herrmann 2012-01-27 15:47 ` [PATCH 2/4] Bluetooth: Remove hci_dev->driver_data David Herrmann @ 2012-01-27 15:47 ` David Herrmann 2012-01-27 17:01 ` Andrei Emeltchenko 2012-01-30 21:59 ` Marcel Holtmann 2012-01-27 15:47 ` [PATCH 4/4] Bluetooth: Use proper datatypes in release-callbacks David Herrmann 2012-02-06 12:34 ` [PATCH 0/4] Integrate better device support Andrei Emeltchenko 4 siblings, 2 replies; 18+ messages in thread From: David Herrmann @ 2012-01-27 15:47 UTC (permalink / raw) To: linux-bluetooth; +Cc: johan.hedberg, marcel, David Herrmann This avoids using the dev_set/get_drvdata() functions to retrieve a pointer to our own structure. We can use simple pointer arithmetic here. The drvdata field is actually not needed by any other code-path but this makes the code more consistent with hci_dev. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> --- include/net/bluetooth/hci_core.h | 1 + net/bluetooth/hci_sysfs.c | 10 ++++------ 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 9780f42..8784da1 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h @@ -612,6 +612,7 @@ static inline struct hci_dev *hci_dev_hold(struct hci_dev *d) #define hci_dev_unlock(d) mutex_unlock(&d->lock) #define to_hci_dev(d) container_of(d, struct hci_dev, dev) +#define to_hci_conn(c) container_of(c, struct hci_conn, dev) static inline void *hci_get_drvdata(struct hci_dev *hdev) { diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 2a0243a..17e6cd4 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c @@ -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) { - 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)); } 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)); } 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", conn->features[0], conn->features[1], @@ -79,7 +79,7 @@ static const struct attribute_group *bt_link_groups[] = { static void bt_link_release(struct device *dev) { - void *data = dev_get_drvdata(dev); + void *data = to_hci_conn(dev); kfree(data); } @@ -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_drvdata(&conn->dev, conn); - if (device_add(&conn->dev) < 0) { BT_ERR("Failed to register connection device"); return; -- 1.7.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 3/4] Bluetooth: Introduce to_hci_conn 2012-01-27 15:47 ` [PATCH 3/4] Bluetooth: Introduce to_hci_conn David Herrmann @ 2012-01-27 17:01 ` Andrei Emeltchenko 2012-01-27 17:20 ` David Herrmann 2012-01-30 21:59 ` Marcel Holtmann 1 sibling, 1 reply; 18+ messages in thread From: Andrei Emeltchenko @ 2012-01-27 17:01 UTC (permalink / raw) To: David Herrmann; +Cc: johan.hedberg, marcel, linux-bluetooth [-- Attachment #1: Type: text/plain, Size: 1539 bytes --] Hi David, > This avoids using the dev_set/get_drvdata() functions to retrieve a > pointer to our own structure. We can use simple pointer arithmetic here. > The drvdata field is actually not needed by any other code-path but this > makes the code more consistent with hci_dev. > > Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> > --- > include/net/bluetooth/hci_core.h | 1 + > net/bluetooth/hci_sysfs.c | 10 ++++------ > 2 files changed, 5 insertions(+), 6 deletions(-) > > diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h > index 9780f42..8784da1 100644 > --- a/include/net/bluetooth/hci_core.h > +++ b/include/net/bluetooth/hci_core.h > @@ -612,6 +612,7 @@ static inline struct hci_dev *hci_dev_hold(struct hci_dev *d) > #define hci_dev_unlock(d) mutex_unlock(&d->lock) > > #define to_hci_dev(d) container_of(d, struct hci_dev, dev) > +#define to_hci_conn(c) container_of(c, struct hci_conn, dev) > > static inline void *hci_get_drvdata(struct hci_dev *hdev) > { > diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c > index 2a0243a..17e6cd4 100644 > --- a/net/bluetooth/hci_sysfs.c > +++ b/net/bluetooth/hci_sysfs.c > @@ -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) > { > - struct hci_conn *conn = dev_get_drvdata(dev); > + struct hci_conn *conn = to_hci_conn(dev); I personally think it was more readable before. --Andrei [-- Attachment #2: Type: text/html, Size: 1899 bytes --] ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/4] Bluetooth: Introduce to_hci_conn 2012-01-27 17:01 ` Andrei Emeltchenko @ 2012-01-27 17:20 ` David Herrmann 2012-01-30 21:37 ` Ulisses Furquim 0 siblings, 1 reply; 18+ messages in thread From: David Herrmann @ 2012-01-27 17:20 UTC (permalink / raw) To: Andrei Emeltchenko; +Cc: johan.hedberg, marcel, linux-bluetooth Hi Andrei On Fri, Jan 27, 2012 at 6:01 PM, Andrei Emeltchenko <andrei.emeltchenko.news@gmail.com> wrote: > Hi David, > >> This avoids using the dev_set/get_drvdata() functions to retrieve a >> pointer to our own structure. We can use simple pointer arithmetic here. >> The drvdata field is actually not needed by any other code-path but this >> makes the code more consistent with hci_dev. >> >> Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> >> --- >> =A0include/net/bluetooth/hci_core.h | =A0 =A01 + >> =A0net/bluetooth/hci_sysfs.c =A0 =A0 =A0 =A0| =A0 10 ++++------ >> =A02 files changed, 5 insertions(+), 6 deletions(-) >> >> diff --git a/include/net/bluetooth/hci_core.h >> b/include/net/bluetooth/hci_core.h >> index 9780f42..8784da1 100644 >> --- a/include/net/bluetooth/hci_core.h >> +++ b/include/net/bluetooth/hci_core.h >> @@ -612,6 +612,7 @@ static inline struct hci_dev *hci_dev_hold(struct >> hci_dev *d) >> =A0#define hci_dev_unlock(d) =A0 =A0 =A0mutex_unlock(&d->lock) >> >> =A0#define to_hci_dev(d) container_of(d, struct hci_dev, dev) >> +#define to_hci_conn(c) container_of(c, struct hci_conn, dev) >> >> =A0static inline void *hci_get_drvdata(struct hci_dev *hdev) >> =A0{ >> diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c >> index 2a0243a..17e6cd4 100644 >> --- a/net/bluetooth/hci_sysfs.c >> +++ b/net/bluetooth/hci_sysfs.c >> @@ -33,19 +33,19 @@ static inline char *link_typetostr(int type) >> >> =A0static ssize_t show_link_type(struct device *dev, struct device_attri= bute >> *attr, char *buf) >> =A0{ >> - =A0 =A0 =A0 struct hci_conn *conn =3D dev_get_drvdata(dev); >> + =A0 =A0 =A0 struct hci_conn *conn =3D to_hci_conn(dev); > > I personally think it was more readable before. I didn't write it to make it more readable but to make it conform to other subsystems using the drvdata field. I think using a pointer in a structure if we could also use container_of is a waste of memory. Anyway, in this case we will keep the drvdata field anyway as we cannot remove it so I have no objections if you drop this patch. Personally I'd prefer to_hci_conn, though, as we are no driver but a bus so "get_drvdata" sounds not right here. Regards David > --Andrei ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/4] Bluetooth: Introduce to_hci_conn 2012-01-27 17:20 ` David Herrmann @ 2012-01-30 21:37 ` Ulisses Furquim 0 siblings, 0 replies; 18+ messages in thread From: Ulisses Furquim @ 2012-01-30 21:37 UTC (permalink / raw) To: David Herrmann; +Cc: Andrei Emeltchenko, johan.hedberg, marcel, linux-bluetooth Hi David, On Fri, Jan 27, 2012 at 3:20 PM, David Herrmann <dh.herrmann@googlemail.com> wrote: > Hi Andrei > > On Fri, Jan 27, 2012 at 6:01 PM, Andrei Emeltchenko > <andrei.emeltchenko.news@gmail.com> wrote: >> Hi David, >> >>> This avoids using the dev_set/get_drvdata() functions to retrieve a >>> pointer to our own structure. We can use simple pointer arithmetic here= . >>> The drvdata field is actually not needed by any other code-path but thi= s >>> makes the code more consistent with hci_dev. >>> >>> Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> >>> --- >>> =A0include/net/bluetooth/hci_core.h | =A0 =A01 + >>> =A0net/bluetooth/hci_sysfs.c =A0 =A0 =A0 =A0| =A0 10 ++++------ >>> =A02 files changed, 5 insertions(+), 6 deletions(-) >>> >>> diff --git a/include/net/bluetooth/hci_core.h >>> b/include/net/bluetooth/hci_core.h >>> index 9780f42..8784da1 100644 >>> --- a/include/net/bluetooth/hci_core.h >>> +++ b/include/net/bluetooth/hci_core.h >>> @@ -612,6 +612,7 @@ static inline struct hci_dev *hci_dev_hold(struct >>> hci_dev *d) >>> =A0#define hci_dev_unlock(d) =A0 =A0 =A0mutex_unlock(&d->lock) >>> >>> =A0#define to_hci_dev(d) container_of(d, struct hci_dev, dev) >>> +#define to_hci_conn(c) container_of(c, struct hci_conn, dev) >>> >>> =A0static inline void *hci_get_drvdata(struct hci_dev *hdev) >>> =A0{ >>> diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c >>> index 2a0243a..17e6cd4 100644 >>> --- a/net/bluetooth/hci_sysfs.c >>> +++ b/net/bluetooth/hci_sysfs.c >>> @@ -33,19 +33,19 @@ static inline char *link_typetostr(int type) >>> >>> =A0static ssize_t show_link_type(struct device *dev, struct device_attr= ibute >>> *attr, char *buf) >>> =A0{ >>> - =A0 =A0 =A0 struct hci_conn *conn =3D dev_get_drvdata(dev); >>> + =A0 =A0 =A0 struct hci_conn *conn =3D to_hci_conn(dev); >> >> I personally think it was more readable before. > > I didn't write it to make it more readable but to make it conform to > other subsystems using the drvdata field. I think using a pointer in a > structure if we could also use container_of is a waste of memory. > Anyway, in this case we will keep the drvdata field anyway as we > cannot remove it so I have no objections if you drop this patch. > Personally I'd prefer to_hci_conn, though, as we are no driver but a > bus so "get_drvdata" sounds not right here. > > Regards > David > >> --Andrei Using container_of is pretty much common in the kernel. Maybe the macro names can be better? I think the series is an improvement but Marcel is the best one to rule on this. Regards, --=20 Ulisses Furquim ProFUSION embedded systems http://profusion.mobi Mobile: +55 19 9250 0942 Skype: ulissesffs ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 3/4] Bluetooth: Introduce to_hci_conn 2012-01-27 15:47 ` [PATCH 3/4] Bluetooth: Introduce to_hci_conn David Herrmann 2012-01-27 17:01 ` Andrei Emeltchenko @ 2012-01-30 21:59 ` Marcel Holtmann 1 sibling, 0 replies; 18+ messages in thread From: Marcel Holtmann @ 2012-01-30 21:59 UTC (permalink / raw) To: David Herrmann; +Cc: linux-bluetooth, johan.hedberg Hi David, > This avoids using the dev_set/get_drvdata() functions to retrieve a > pointer to our own structure. We can use simple pointer arithmetic here. > The drvdata field is actually not needed by any other code-path but this > makes the code more consistent with hci_dev. > > Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> > --- > include/net/bluetooth/hci_core.h | 1 + > net/bluetooth/hci_sysfs.c | 10 ++++------ > 2 files changed, 5 insertions(+), 6 deletions(-) I read through the comment and I am fine with to_hci_conn. Acked-by: Marcel Holtmann <marcel@holtmann.org> Regards Marcel ^ permalink raw reply [flat|nested] 18+ messages in thread
* [PATCH 4/4] Bluetooth: Use proper datatypes in release-callbacks 2012-01-27 15:47 [PATCH 0/4] Integrate better device support David Herrmann ` (2 preceding siblings ...) 2012-01-27 15:47 ` [PATCH 3/4] Bluetooth: Introduce to_hci_conn David Herrmann @ 2012-01-27 15:47 ` David Herrmann 2012-01-30 22:00 ` Marcel Holtmann 2012-02-06 12:34 ` [PATCH 0/4] Integrate better device support Andrei Emeltchenko 4 siblings, 1 reply; 18+ messages in thread From: David Herrmann @ 2012-01-27 15:47 UTC (permalink / raw) To: linux-bluetooth; +Cc: johan.hedberg, marcel, David Herrmann This enhances code readability a lot and avoids using void* even though we know the type of the variable. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> --- net/bluetooth/hci_sysfs.c | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 17e6cd4..bc15429 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c @@ -79,8 +79,8 @@ static const struct attribute_group *bt_link_groups[] = { static void bt_link_release(struct device *dev) { - void *data = to_hci_conn(dev); - kfree(data); + struct hci_conn *conn = to_hci_conn(dev); + kfree(conn); } static struct device_type bt_link = { @@ -368,8 +368,8 @@ static const struct attribute_group *bt_host_groups[] = { static void bt_host_release(struct device *dev) { - void *data = to_hci_dev(dev); - kfree(data); + struct hci_dev *hdev = to_hci_dev(dev); + kfree(hdev); module_put(THIS_MODULE); } -- 1.7.8.4 ^ permalink raw reply related [flat|nested] 18+ messages in thread
* Re: [PATCH 4/4] Bluetooth: Use proper datatypes in release-callbacks 2012-01-27 15:47 ` [PATCH 4/4] Bluetooth: Use proper datatypes in release-callbacks David Herrmann @ 2012-01-30 22:00 ` Marcel Holtmann 0 siblings, 0 replies; 18+ messages in thread From: Marcel Holtmann @ 2012-01-30 22:00 UTC (permalink / raw) To: David Herrmann; +Cc: linux-bluetooth, johan.hedberg Hi David, > This enhances code readability a lot and avoids using void* even though > we know the type of the variable. > > Signed-off-by: David Herrmann <dh.herrmann@googlemail.com> > --- > net/bluetooth/hci_sysfs.c | 8 ++++---- > 1 files changed, 4 insertions(+), 4 deletions(-) Acked-by: Marcel Holtmann <marcel@holtmann.org> Regards Marcel ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/4] Integrate better device support 2012-01-27 15:47 [PATCH 0/4] Integrate better device support David Herrmann ` (3 preceding siblings ...) 2012-01-27 15:47 ` [PATCH 4/4] Bluetooth: Use proper datatypes in release-callbacks David Herrmann @ 2012-02-06 12:34 ` Andrei Emeltchenko 2012-02-06 14:03 ` David Herrmann 2012-02-09 21:12 ` David Herrmann 4 siblings, 2 replies; 18+ messages in thread From: Andrei Emeltchenko @ 2012-02-06 12:34 UTC (permalink / raw) To: David Herrmann; +Cc: linux-bluetooth, johan.hedberg, marcel Hi David, On Fri, Jan 27, 2012 at 04:47:22PM +0100, David Herrmann wrote: > Hi > > "struct device" provides a drvdata-field that we should use properly to save > _driver-data_. This series makes the hci-core use pointer-arithmetic to avoid > using this field in the bus-core and instead converts the drivers to use the > drvdata field. > This also reduces the hci_dev structure by 4/8 bytes, yeah. I do not know does it related to those changes but recently I got several dumps like shown below: [ 276.028121] Bluetooth: Virtual HCI driver ver 1.3 [ 277.028692] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 [ 277.054874] Bluetooth: BNEP filters: protocol multicast < here comes module unloading> [ 302.632063] usbcore: deregistering interface driver btusb [ 302.664760] BUG: unable to handle kernel paging request at c16bef8f [ 302.668371] IP: [<c12a9011>] kobject_get+0x11/0x30 [ 302.668371] *pde = 36785063 *pte = 016be161 [ 302.668371] Oops: 0003 [#1] SMP [ 302.668371] Modules linked in: hci_vhci(O) btusb(-) bluetooth(O) snd_intel8x0 joydev snd_ac97_codec ac97_bus snd_pcm ppdev snd_seq snd_timer snd_seq_device parport_pc snd binfmt_misc psmouse serio_raw soundcore snd_page_alloc i2c_piix4 lp parport usbhid hid ahci libahci e1000 [last unloaded: bnep] [ 302.668371] [ 302.668371] Pid: 4310, comm: rmmod Tainted: G O 3.2.0niko+ #74 innotek GmbH VirtualBox [ 302.668371] EIP: 0060:[<c12a9011>] EFLAGS: 00010206 CPU: 0 [ 302.668371] EIP is at kobject_get+0x11/0x30 [ 302.668371] EAX: 6f6c2e71 EBX: c16bef73 ECX: 00000006 EDX: 00000000 [ 302.668371] ESI: c16be46b EDI: f5655c00 EBP: e9415e5c ESP: e9415e58 [ 302.668371] DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 [ 302.668371] Process rmmod (pid: 4310, ti=e9414000 task=e982bea0 task.ti=e9414000) [ 302.668371] Stack: [ 302.668371] f45c6400 e9415e64 c1366a16 e9415e90 f81589d8 00000002 f67e1d88 f67a6000 [ 302.668371] e9415e90 c16bef6b 00000000 f5655c1c f5655c00 f815c1d8 e9415eac c13e7bef [ 302.668371] 00000000 f67a6000 f5655c1c f815c1d8 f5655c50 e9415ebc c136aaaa f5655c1c [ 302.668371] Call Trace: [ 302.668371] [<c1366a16>] get_device+0x16/0x20 [ 302.668371] [<f81589d8>] btusb_disconnect+0x48/0xe0 [btusb] [ 302.668371] [<c13e7bef>] usb_unbind_interface+0x3f/0x150 [ 302.668371] [<c136aaaa>] __device_release_driver+0x6a/0xc0 [ 302.668371] [<c136b2e7>] driver_detach+0x97/0xa0 [ 302.668371] [<c136a944>] bus_remove_driver+0x74/0xe0 [ 302.668371] [<c136b988>] driver_unregister+0x48/0x80 [ 302.668371] [<c13e701c>] usb_deregister+0xac/0xc0 [ 302.668371] [<f815a0ed>] btusb_driver_exit+0xd/0xf20 [btusb] [ 302.668371] [<c108f455>] sys_delete_module+0x135/0x250 [ 302.668371] [<c113f0bd>] ? vfs_write+0xed/0x160 [ 302.668371] [<c113e4a0>] ? wait_on_retry_sync_kiocb+0x50/0x50 [ 302.668371] [<c15668ad>] ? restore_all+0xf/0xf [ 302.668371] [<c156d71f>] sysenter_do_call+0x12/0x38 [ 302.668371] Code: 24 08 c7 04 24 28 7a 7e c1 e8 1c 5c 01 00 8b 4c 24 18 e9 d0 fe ff ff 8d 76 00 55 85 c0 89 e5 53 89 c3 74 0b 8b 40 1c 85 c0 74 09 <3e> ff 43 1c 89 d8 5b 5d c3 ba 28 00 00 00 b8 9d 7b 6b c1 e8 17 [ 302.668371] EIP: [<c12a9011>] kobject_get+0x11/0x30 SS:ESP 0068:e9415e58 [ 302.668371] CR2: 00000000c16bef8f [ 302.668371] ---[ end trace de038ac80f57694f ]--- I have to say that usually I recompile only bluetooth modules and reload them, IMO this should not trigger it. Best regards Andrei Emeltchenko ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/4] Integrate better device support 2012-02-06 12:34 ` [PATCH 0/4] Integrate better device support Andrei Emeltchenko @ 2012-02-06 14:03 ` David Herrmann 2012-02-09 21:12 ` David Herrmann 1 sibling, 0 replies; 18+ messages in thread From: David Herrmann @ 2012-02-06 14:03 UTC (permalink / raw) To: Andrei Emeltchenko, David Herrmann, linux-bluetooth, johan.hedberg, marcel Hi Andrei On Mon, Feb 6, 2012 at 1:34 PM, Andrei Emeltchenko <andrei.emeltchenko.news@gmail.com> wrote: > Hi David, > > On Fri, Jan 27, 2012 at 04:47:22PM +0100, David Herrmann wrote: >> Hi >> >> "struct device" provides a drvdata-field that we should use properly to = save >> _driver-data_. This series makes the hci-core use pointer-arithmetic to = avoid >> using this field in the bus-core and instead converts the drivers to use= the >> drvdata field. >> This also reduces the hci_dev structure by 4/8 bytes, yeah. > > I do not know does it related to those changes but recently I got several > dumps like shown below: As far as I know Johan hasn't applied them yet so it is probably not related to this patchset. I'd rather guess that it is related to my previous changes. I will look at this later but I wasn't able to trigger it, yet. > [ =A0276.028121] Bluetooth: Virtual HCI driver ver 1.3 > [ =A0277.028692] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 > [ =A0277.054874] Bluetooth: BNEP filters: protocol multicast > > < here comes module unloading> > > [ =A0302.632063] usbcore: deregistering interface driver btusb > [ =A0302.664760] BUG: unable to handle kernel paging request at c16bef8f > [ =A0302.668371] IP: [<c12a9011>] kobject_get+0x11/0x30 > [ =A0302.668371] *pde =3D 36785063 *pte =3D 016be161 > [ =A0302.668371] Oops: 0003 [#1] SMP > [ =A0302.668371] Modules linked in: hci_vhci(O) btusb(-) bluetooth(O) > snd_intel8x0 joydev snd_ac97_codec ac97_bus snd_pcm ppdev snd_seq > snd_timer snd_seq_device parport_pc snd binfmt_misc psmouse serio_raw > soundcore snd_page_alloc i2c_piix4 lp parport usbhid hid ahci libahci > e1000 [last unloaded: bnep] > [ =A0302.668371] > [ =A0302.668371] Pid: 4310, comm: rmmod Tainted: G =A0 =A0 =A0 =A0 =A0 O = 3.2.0niko+ > #74 innotek GmbH VirtualBox > [ =A0302.668371] EIP: 0060:[<c12a9011>] EFLAGS: 00010206 CPU: 0 > [ =A0302.668371] EIP is at kobject_get+0x11/0x30 > [ =A0302.668371] EAX: 6f6c2e71 EBX: c16bef73 ECX: 00000006 EDX: 00000000 > [ =A0302.668371] ESI: c16be46b EDI: f5655c00 EBP: e9415e5c ESP: e9415e58 > [ =A0302.668371] =A0DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 > [ =A0302.668371] Process rmmod (pid: 4310, ti=3De9414000 task=3De982bea0 > task.ti=3De9414000) > [ =A0302.668371] Stack: > [ =A0302.668371] =A0f45c6400 e9415e64 c1366a16 e9415e90 f81589d8 00000002 > f67e1d88 f67a6000 > [ =A0302.668371] =A0e9415e90 c16bef6b 00000000 f5655c1c f5655c00 f815c1d8 > e9415eac c13e7bef > [ =A0302.668371] =A000000000 f67a6000 f5655c1c f815c1d8 f5655c50 e9415ebc > c136aaaa f5655c1c > [ =A0302.668371] Call Trace: > [ =A0302.668371] =A0[<c1366a16>] get_device+0x16/0x20 > [ =A0302.668371] =A0[<f81589d8>] btusb_disconnect+0x48/0xe0 [btusb] > [ =A0302.668371] =A0[<c13e7bef>] usb_unbind_interface+0x3f/0x150 > [ =A0302.668371] =A0[<c136aaaa>] __device_release_driver+0x6a/0xc0 > [ =A0302.668371] =A0[<c136b2e7>] driver_detach+0x97/0xa0 > [ =A0302.668371] =A0[<c136a944>] bus_remove_driver+0x74/0xe0 > [ =A0302.668371] =A0[<c136b988>] driver_unregister+0x48/0x80 > [ =A0302.668371] =A0[<c13e701c>] usb_deregister+0xac/0xc0 > [ =A0302.668371] =A0[<f815a0ed>] btusb_driver_exit+0xd/0xf20 [btusb] > [ =A0302.668371] =A0[<c108f455>] sys_delete_module+0x135/0x250 > [ =A0302.668371] =A0[<c113f0bd>] ? vfs_write+0xed/0x160 > [ =A0302.668371] =A0[<c113e4a0>] ? wait_on_retry_sync_kiocb+0x50/0x50 > [ =A0302.668371] =A0[<c15668ad>] ? restore_all+0xf/0xf > [ =A0302.668371] =A0[<c156d71f>] sysenter_do_call+0x12/0x38 > [ =A0302.668371] Code: 24 08 c7 04 24 28 7a 7e c1 e8 1c 5c 01 00 8b 4c 24= 18 > e9 d0 fe ff ff 8d 76 00 55 85 c0 89 e5 53 89 c3 74 0b 8b 40 1c 85 c0 74 0= 9 > <3e> ff 43 1c 89 d8 5b 5d c3 ba 28 00 00 00 b8 9d 7b 6b c1 e8 17 > [ =A0302.668371] EIP: [<c12a9011>] kobject_get+0x11/0x30 SS:ESP > 0068:e9415e58 > [ =A0302.668371] CR2: 00000000c16bef8f > [ =A0302.668371] ---[ end trace de038ac80f57694f ]--- > > I have to say that usually I recompile only bluetooth modules and reload > them, IMO this should not trigger it. > > Best regards > Andrei Emeltchenko Regards David ^ permalink raw reply [flat|nested] 18+ messages in thread
* Re: [PATCH 0/4] Integrate better device support 2012-02-06 12:34 ` [PATCH 0/4] Integrate better device support Andrei Emeltchenko 2012-02-06 14:03 ` David Herrmann @ 2012-02-09 21:12 ` David Herrmann 1 sibling, 0 replies; 18+ messages in thread From: David Herrmann @ 2012-02-09 21:12 UTC (permalink / raw) To: Andrei Emeltchenko, David Herrmann, linux-bluetooth, johan.hedberg, marcel Hi Andrei On Mon, Feb 6, 2012 at 1:34 PM, Andrei Emeltchenko <andrei.emeltchenko.news@gmail.com> wrote: > Hi David, > > On Fri, Jan 27, 2012 at 04:47:22PM +0100, David Herrmann wrote: >> Hi >> >> "struct device" provides a drvdata-field that we should use properly to = save >> _driver-data_. This series makes the hci-core use pointer-arithmetic to = avoid >> using this field in the bus-core and instead converts the drivers to use= the >> drvdata field. >> This also reduces the hci_dev structure by 4/8 bytes, yeah. > > I do not know does it related to those changes but recently I got several > dumps like shown below: > > [ =A0276.028121] Bluetooth: Virtual HCI driver ver 1.3 > [ =A0277.028692] Bluetooth: BNEP (Ethernet Emulation) ver 1.3 > [ =A0277.054874] Bluetooth: BNEP filters: protocol multicast > > < here comes module unloading> > > [ =A0302.632063] usbcore: deregistering interface driver btusb > [ =A0302.664760] BUG: unable to handle kernel paging request at c16bef8f > [ =A0302.668371] IP: [<c12a9011>] kobject_get+0x11/0x30 > [ =A0302.668371] *pde =3D 36785063 *pte =3D 016be161 > [ =A0302.668371] Oops: 0003 [#1] SMP > [ =A0302.668371] Modules linked in: hci_vhci(O) btusb(-) bluetooth(O) > snd_intel8x0 joydev snd_ac97_codec ac97_bus snd_pcm ppdev snd_seq > snd_timer snd_seq_device parport_pc snd binfmt_misc psmouse serio_raw > soundcore snd_page_alloc i2c_piix4 lp parport usbhid hid ahci libahci > e1000 [last unloaded: bnep] > [ =A0302.668371] > [ =A0302.668371] Pid: 4310, comm: rmmod Tainted: G =A0 =A0 =A0 =A0 =A0 O = 3.2.0niko+ > #74 innotek GmbH VirtualBox > [ =A0302.668371] EIP: 0060:[<c12a9011>] EFLAGS: 00010206 CPU: 0 > [ =A0302.668371] EIP is at kobject_get+0x11/0x30 > [ =A0302.668371] EAX: 6f6c2e71 EBX: c16bef73 ECX: 00000006 EDX: 00000000 > [ =A0302.668371] ESI: c16be46b EDI: f5655c00 EBP: e9415e5c ESP: e9415e58 > [ =A0302.668371] =A0DS: 007b ES: 007b FS: 00d8 GS: 00e0 SS: 0068 > [ =A0302.668371] Process rmmod (pid: 4310, ti=3De9414000 task=3De982bea0 > task.ti=3De9414000) > [ =A0302.668371] Stack: > [ =A0302.668371] =A0f45c6400 e9415e64 c1366a16 e9415e90 f81589d8 00000002 > f67e1d88 f67a6000 > [ =A0302.668371] =A0e9415e90 c16bef6b 00000000 f5655c1c f5655c00 f815c1d8 > e9415eac c13e7bef > [ =A0302.668371] =A000000000 f67a6000 f5655c1c f815c1d8 f5655c50 e9415ebc > c136aaaa f5655c1c > [ =A0302.668371] Call Trace: > [ =A0302.668371] =A0[<c1366a16>] get_device+0x16/0x20 > [ =A0302.668371] =A0[<f81589d8>] btusb_disconnect+0x48/0xe0 [btusb] > [ =A0302.668371] =A0[<c13e7bef>] usb_unbind_interface+0x3f/0x150 > [ =A0302.668371] =A0[<c136aaaa>] __device_release_driver+0x6a/0xc0 > [ =A0302.668371] =A0[<c136b2e7>] driver_detach+0x97/0xa0 Do you know which "get_device" call that is? I can assume its triggered by hci_dev_hold() in btusb_disconnect which only calls get_device, but if this call fails, the following call to hci_unregister_dev() must fail, too. I still cannot trigger this so can you provide some more information here? If "hdev" really is invalid here, we have a serious problem but if this get_device() is not at all related to the bt-core but rather in the usb-core I would have to search at a totally different place. If you can reliably trigger this BUG could you try to compile with frame-pointers/no-inline or sth. like that so we can get a better stack-trace? Anyway, its definitely not related to this series as they have not been applied yet but another patch I sent to the list "btusb: Remove device lock on release" touches this so could you try that one and see what hci_unregister_dev() does? > [ =A0302.668371] =A0[<c136a944>] bus_remove_driver+0x74/0xe0 > [ =A0302.668371] =A0[<c136b988>] driver_unregister+0x48/0x80 > [ =A0302.668371] =A0[<c13e701c>] usb_deregister+0xac/0xc0 > [ =A0302.668371] =A0[<f815a0ed>] btusb_driver_exit+0xd/0xf20 [btusb] > [ =A0302.668371] =A0[<c108f455>] sys_delete_module+0x135/0x250 > [ =A0302.668371] =A0[<c113f0bd>] ? vfs_write+0xed/0x160 > [ =A0302.668371] =A0[<c113e4a0>] ? wait_on_retry_sync_kiocb+0x50/0x50 > [ =A0302.668371] =A0[<c15668ad>] ? restore_all+0xf/0xf > [ =A0302.668371] =A0[<c156d71f>] sysenter_do_call+0x12/0x38 > [ =A0302.668371] Code: 24 08 c7 04 24 28 7a 7e c1 e8 1c 5c 01 00 8b 4c 24= 18 > e9 d0 fe ff ff 8d 76 00 55 85 c0 89 e5 53 89 c3 74 0b 8b 40 1c 85 c0 74 0= 9 > <3e> ff 43 1c 89 d8 5b 5d c3 ba 28 00 00 00 b8 9d 7b 6b c1 e8 17 > [ =A0302.668371] EIP: [<c12a9011>] kobject_get+0x11/0x30 SS:ESP > 0068:e9415e58 > [ =A0302.668371] CR2: 00000000c16bef8f > [ =A0302.668371] ---[ end trace de038ac80f57694f ]--- > > I have to say that usually I recompile only bluetooth modules and reload > them, IMO this should not trigger it. > > Best regards > Andrei Emeltchenko Cheers David ^ permalink raw reply [flat|nested] 18+ messages in thread
end of thread, other threads:[~2012-02-09 21:12 UTC | newest] Thread overview: 18+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-01-27 15:47 [PATCH 0/4] Integrate better device support David Herrmann 2012-01-27 15:47 ` [PATCH 1/4] Bluetooth: Introduce to_hci_dev() David Herrmann 2012-01-30 21:55 ` Marcel Holtmann 2012-01-27 15:47 ` [PATCH 2/4] Bluetooth: Remove hci_dev->driver_data David Herrmann 2012-01-27 16:51 ` Anderson Lizardo 2012-01-27 16:56 ` David Herrmann 2012-01-27 17:01 ` [PATCH 2/4 v2] " David Herrmann 2012-01-30 21:57 ` Marcel Holtmann 2012-01-27 15:47 ` [PATCH 3/4] Bluetooth: Introduce to_hci_conn David Herrmann 2012-01-27 17:01 ` Andrei Emeltchenko 2012-01-27 17:20 ` David Herrmann 2012-01-30 21:37 ` Ulisses Furquim 2012-01-30 21:59 ` Marcel Holtmann 2012-01-27 15:47 ` [PATCH 4/4] Bluetooth: Use proper datatypes in release-callbacks David Herrmann 2012-01-30 22:00 ` Marcel Holtmann 2012-02-06 12:34 ` [PATCH 0/4] Integrate better device support Andrei Emeltchenko 2012-02-06 14:03 ` David Herrmann 2012-02-09 21:12 ` David Herrmann
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).