Bluetooth: Add hdev parameter to hdev->send driver callback
authorMarcel Holtmann <marcel@holtmann.org>
Fri, 11 Oct 2013 13:19:18 +0000 (06:19 -0700)
committerJohan Hedberg <johan.hedberg@intel.com>
Fri, 11 Oct 2013 13:28:03 +0000 (15:28 +0200)
Instead of masking hdev inside the skb->dev parameter, hand it
directly to the driver as a parameter to hdev->send. This makes
the driver interface more clear and simpler.

This patch fixes all drivers to accept and handle the new parameter
of hdev->send callback. Special care has been taken for bpa10x
and btusb drivers that require having skb->dev set to hdev for
the URB transmit complete handlers.

Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
15 files changed:
drivers/bluetooth/bfusb.c
drivers/bluetooth/bluecard_cs.c
drivers/bluetooth/bpa10x.c
drivers/bluetooth/bt3c_cs.c
drivers/bluetooth/btmrvl_main.c
drivers/bluetooth/btsdio.c
drivers/bluetooth/btuart_cs.c
drivers/bluetooth/btusb.c
drivers/bluetooth/btwilink.c
drivers/bluetooth/dtl1_cs.c
drivers/bluetooth/hci_ldisc.c
drivers/bluetooth/hci_ll.c
drivers/bluetooth/hci_vhci.c
include/net/bluetooth/hci_core.h
net/bluetooth/hci_core.c

index b7b5bb879f08dd818cbfd2a650a724ea3a38530d..a6758490fa61952c7648e470a8741e19cae43cc4 100644 (file)
@@ -464,9 +464,8 @@ static int bfusb_close(struct hci_dev *hdev)
        return 0;
 }
 
-static int bfusb_send_frame(struct sk_buff *skb)
+static int bfusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_dev *hdev = (struct hci_dev *) skb->dev;
        struct bfusb_data *data;
        struct sk_buff *nskb;
        unsigned char buf[3];
index 395acde99d7863d13c5016a0ee7b14ac53e67a57..9194a1ba897f99487b16feb954e6d74f23d8ed96 100644 (file)
@@ -658,10 +658,9 @@ static int bluecard_hci_close(struct hci_dev *hdev)
 }
 
 
-static int bluecard_hci_send_frame(struct sk_buff *skb)
+static int bluecard_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
        bluecard_info_t *info;
-       struct hci_dev *hdev = (struct hci_dev *)(skb->dev);
 
        if (!hdev) {
                BT_ERR("Frame for unknown HCI device (hdev=NULL)");
index 3188fb48bf4b2b3ac1fdb0321d1d4ccd4866aba5..b9e4e621fb10a9a0cc3bb34e2251e028c5a0f1b1 100644 (file)
@@ -350,9 +350,8 @@ static int bpa10x_flush(struct hci_dev *hdev)
        return 0;
 }
 
-static int bpa10x_send_frame(struct sk_buff *skb)
+static int bpa10x_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_dev *hdev = (struct hci_dev *) skb->dev;
        struct bpa10x_data *data = hci_get_drvdata(hdev);
        struct usb_ctrlrequest *dr;
        struct urb *urb;
@@ -364,6 +363,8 @@ static int bpa10x_send_frame(struct sk_buff *skb)
        if (!test_bit(HCI_RUNNING, &hdev->flags))
                return -EBUSY;
 
+       skb->dev = (void *) hdev;
+
        urb = usb_alloc_urb(0, GFP_ATOMIC);
        if (!urb)
                return -ENOMEM;
index d8e4b0d7926e45765cbade9f8d2695aed6d7e0e8..fcd5fe993ad0540abf2f36943e7c2e6f3fb25a51 100644 (file)
@@ -415,10 +415,9 @@ static int bt3c_hci_close(struct hci_dev *hdev)
 }
 
 
-static int bt3c_hci_send_frame(struct sk_buff *skb)
+static int bt3c_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
        bt3c_info_t *info;
-       struct hci_dev *hdev = (struct hci_dev *)(skb->dev);
        unsigned long flags;
 
        if (!hdev) {
index 8ac4d938d89c61c0c734da2c16a50beb55db29c8..547a447149d3e96a6668cbeb1b13a026d44b69e2 100644 (file)
@@ -187,7 +187,6 @@ static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 cmd_no,
 
        bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT;
 
-       skb->dev = (void *) priv->btmrvl_dev.hcidev;
        skb_queue_head(&priv->adapter->tx_queue, skb);
 
        priv->btmrvl_dev.sendcmdflag = true;
@@ -356,9 +355,8 @@ static void btmrvl_free_adapter(struct btmrvl_private *priv)
        priv->adapter = NULL;
 }
 
-static int btmrvl_send_frame(struct sk_buff *skb)
+static int btmrvl_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_dev *hdev = (struct hci_dev *) skb->dev;
        struct btmrvl_private *priv = NULL;
 
        BT_DBG("type=%d, len=%d", skb->pkt_type, skb->len);
index 72fe49e60359b51565940979b9736ef496f37834..b61440aaee658210143f435a872ed51e649485e6 100644 (file)
@@ -254,9 +254,8 @@ static int btsdio_flush(struct hci_dev *hdev)
        return 0;
 }
 
-static int btsdio_send_frame(struct sk_buff *skb)
+static int btsdio_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_dev *hdev = (struct hci_dev *) skb->dev;
        struct btsdio_data *data = hci_get_drvdata(hdev);
 
        BT_DBG("%s", hdev->name);
index d0b89ecf1c5969319cd8d96a2fa6c09a092c4e2d..f567cd8424c3dc322fba75160a10716b9b9599c5 100644 (file)
@@ -423,10 +423,9 @@ static int btuart_hci_close(struct hci_dev *hdev)
 }
 
 
-static int btuart_hci_send_frame(struct sk_buff *skb)
+static int btuart_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
        btuart_info_t *info;
-       struct hci_dev *hdev = (struct hci_dev *)(skb->dev);
 
        if (!hdev) {
                BT_ERR("Frame for unknown HCI device (hdev=NULL)");
index faa429f7d8a1251405996f0a423c9dfa0c20c2df..621069cb3053d5ec365b3dec962bc8d826d18317 100644 (file)
@@ -716,9 +716,8 @@ static int btusb_flush(struct hci_dev *hdev)
        return 0;
 }
 
-static int btusb_send_frame(struct sk_buff *skb)
+static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_dev *hdev = (struct hci_dev *) skb->dev;
        struct btusb_data *data = hci_get_drvdata(hdev);
        struct usb_ctrlrequest *dr;
        struct urb *urb;
@@ -730,6 +729,8 @@ static int btusb_send_frame(struct sk_buff *skb)
        if (!test_bit(HCI_RUNNING, &hdev->flags))
                return -EBUSY;
 
+       skb->dev = (void *) hdev;
+
        switch (bt_cb(skb)->pkt_type) {
        case HCI_COMMAND_PKT:
                urb = usb_alloc_urb(0, GFP_ATOMIC);
index 5e10fb0a7e05bbe25c8d43305308d2dba635bcf2..f038dba19e36b77973da26ee9688ed7791126d2f 100644 (file)
@@ -251,14 +251,11 @@ static int ti_st_close(struct hci_dev *hdev)
        return err;
 }
 
-static int ti_st_send_frame(struct sk_buff *skb)
+static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_dev *hdev;
        struct ti_st *hst;
        long len;
 
-       hdev = (struct hci_dev *)skb->dev;
-
        if (!test_bit(HCI_RUNNING, &hdev->flags))
                return -EBUSY;
 
index 29451413bc04d2c9664ac119d34750e8b8ec47df..ad1a2f9dc7727ca4af8ed410592c327b70b40235 100644 (file)
@@ -382,10 +382,9 @@ static int dtl1_hci_close(struct hci_dev *hdev)
 }
 
 
-static int dtl1_hci_send_frame(struct sk_buff *skb)
+static int dtl1_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
        dtl1_info_t *info;
-       struct hci_dev *hdev = (struct hci_dev *)(skb->dev);
        struct sk_buff *s;
        nsh_t nsh;
 
index bc68a440d432cd21b2ee10885e7106cfe2852b79..b04054675c4843aadcedaf61e3c9322d46a78efe 100644 (file)
@@ -234,9 +234,8 @@ static int hci_uart_close(struct hci_dev *hdev)
 }
 
 /* Send frames from HCI layer */
-static int hci_uart_send_frame(struct sk_buff *skb)
+static int hci_uart_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_dev* hdev = (struct hci_dev *) skb->dev;
        struct hci_uart *hu;
 
        if (!hdev) {
index 58a9541feba670af2226d354f42b06a9ee7a7f3a..69a90b1b5ff56131aa7a2e51b7d18aabba28b560 100644 (file)
@@ -110,7 +110,6 @@ static int send_hcill_cmd(u8 cmd, struct hci_uart *hu)
        /* prepare packet */
        hcill_packet = (struct hcill_cmd *) skb_put(skb, 1);
        hcill_packet->cmd = cmd;
-       skb->dev = (void *) hu->hdev;
 
        /* send packet */
        skb_queue_tail(&ll->txq, skb);
index 0fd522e85a718717dc6ef2b3c805b09b874edfac..e6f591969d953fde01bff0747698d3e7a4adb8ae 100644 (file)
@@ -81,9 +81,8 @@ static int vhci_flush(struct hci_dev *hdev)
        return 0;
 }
 
-static int vhci_send_frame(struct sk_buff *skb)
+static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 {
-       struct hci_dev* hdev = (struct hci_dev *) skb->dev;
        struct vhci_data *data;
 
        if (!hdev) {
index 29b81476424c7342a4c18df34f69c9c5fcc0cd77..0e01dc257880c569391d4fe15fb27b864b0ddf32 100644 (file)
@@ -285,7 +285,7 @@ struct hci_dev {
        int (*close)(struct hci_dev *hdev);
        int (*flush)(struct hci_dev *hdev);
        int (*setup)(struct hci_dev *hdev);
-       int (*send)(struct sk_buff *skb);
+       int (*send)(struct hci_dev *hdev, struct sk_buff *skb);
        void (*notify)(struct hci_dev *hdev, unsigned int evt);
 };
 
index 4f0d4b443171af9498c0af921f42380f9dd13d48..a097a623912a60670c5708db7f0efcb599cfe3ee 100644 (file)
@@ -2713,9 +2713,7 @@ static void hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
        /* Get rid of skb owner, prior to sending to the driver. */
        skb_orphan(skb);
 
-       skb->dev = (void *) hdev;
-
-       if (hdev->send(skb) < 0)
+       if (hdev->send(hdev, skb) < 0)
                BT_ERR("%s sending frame failed", hdev->name);
 }