Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetoot...
authorDavid S. Miller <davem@davemloft.net>
Wed, 2 Aug 2017 00:42:58 +0000 (17:42 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 2 Aug 2017 00:42:58 +0000 (17:42 -0700)
Johan Hedberg says:

====================
pull request: bluetooth-next 2017-08-01

Here's our first batch of Bluetooth patches for the 4.14 kernel:

 - Several new USB IDs for the btusb driver
 - Memory leak fix in btusb driver
 - Cleanups & fixes to hci_nokia, hci_serdev and hci_bcm drivers
 - Fixed cleanup path in mrf24j40 (802.15.4) driver probe function
 - A few other smaller cleanups & fixes to drivers

Please let me know if there are any issues pulling. Thanks.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
18 files changed:
drivers/bluetooth/Kconfig
drivers/bluetooth/ath3k.c
drivers/bluetooth/bt3c_cs.c
drivers/bluetooth/btmrvl_sdio.c
drivers/bluetooth/btqca.c
drivers/bluetooth/btrtl.c
drivers/bluetooth/btsdio.c
drivers/bluetooth/btuart_cs.c
drivers/bluetooth/btusb.c
drivers/bluetooth/btwilink.c
drivers/bluetooth/hci_bcm.c
drivers/bluetooth/hci_h4.c
drivers/bluetooth/hci_ldisc.c
drivers/bluetooth/hci_ll.c
drivers/bluetooth/hci_nokia.c
drivers/bluetooth/hci_serdev.c
drivers/bluetooth/hci_uart.h
drivers/net/ieee802154/mrf24j40.c

index 35952a9..3a6ead6 100644 (file)
@@ -98,6 +98,7 @@ config BT_HCIUART_NOKIA
        depends on BT_HCIUART_SERDEV
        depends on PM
        select BT_HCIUART_H4
+       select BT_BCM
        help
          Nokia H4+ is serial protocol for communication between Bluetooth
          device and host. This protocol is required for Bluetooth devices
index b793853..204afe6 100644 (file)
@@ -140,7 +140,8 @@ MODULE_DEVICE_TABLE(usb, ath3k_table);
 
 #define BTUSB_ATH3012          0x80
 /* This table is to load patch and sysconfig files
- * for AR3012 */
+ * for AR3012
+ */
 static const struct usb_device_id ath3k_blist_tbl[] = {
 
        /* Atheros AR3012 with sflash firmware*/
index 32dcac0..1947887 100644 (file)
@@ -684,14 +684,16 @@ static int bt3c_config(struct pcmcia_device *link)
        unsigned long try;
 
        /* First pass: look for a config entry that looks normal.
-          Two tries: without IO aliases, then with aliases */
+        * Two tries: without IO aliases, then with aliases
+        */
        for (try = 0; try < 2; try++)
                if (!pcmcia_loop_config(link, bt3c_check_config, (void *) try))
                        goto found_port;
 
        /* Second pass: try to find an entry that isn't picky about
-          its base address, then try to grab any standard serial port
-          address, and finally try to get any free port. */
+        * its base address, then try to grab any standard serial port
+        * address, and finally try to get any free port.
+        */
        if (!pcmcia_loop_config(link, bt3c_check_config_notpicky, NULL))
                goto found_port;
 
index eb794f0..03341ce 100644 (file)
@@ -1455,7 +1455,8 @@ done:
        fw_dump_ptr = fw_dump_data;
 
        /* Dump all the memory data into single file, a userspace script will
-          be used to split all the memory data to multiple files*/
+        * be used to split all the memory data to multiple files
+        */
        BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump start");
        for (idx = 0; idx < dump_num; idx++) {
                struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
@@ -1482,7 +1483,8 @@ done:
        }
 
        /* fw_dump_data will be free in device coredump release function
-          after 5 min*/
+        * after 5 min
+        */
        dev_coredumpv(&card->func->dev, fw_dump_data, fw_dump_len, GFP_KERNEL);
        BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump end");
 }
index 28afd5d..0bbdfce 100644 (file)
@@ -81,7 +81,7 @@ static int rome_patch_ver_req(struct hci_dev *hdev, u32 *rome_version)
         * and lower 2 bytes from patch will be used.
         */
        *rome_version = (le32_to_cpu(ver->soc_id) << 16) |
-                       (le16_to_cpu(ver->rome_ver) & 0x0000ffff);
+                       (le16_to_cpu(ver->rome_ver) & 0x0000ffff);
 
 out:
        kfree_skb(skb);
index 8279094..d9a99b4 100644 (file)
@@ -279,6 +279,8 @@ static int rtl_load_config(struct hci_dev *hdev, const char *name, u8 **buff)
                return ret;
        ret = fw->size;
        *buff = kmemdup(fw->data, ret, GFP_KERNEL);
+       if (!*buff)
+               ret = -ENOMEM;
 
        release_firmware(fw);
 
index 1cb958e..c8e945d 100644 (file)
@@ -144,7 +144,8 @@ static int btsdio_rx_packet(struct btsdio_data *data)
        if (!skb) {
                /* Out of memory. Prepare a read retry and just
                 * return with the expectation that the next time
-                * we're called we'll have more memory. */
+                * we're called we'll have more memory.
+                */
                return -ENOMEM;
        }
 
index 7df79bb..310e9c2 100644 (file)
@@ -614,14 +614,16 @@ static int btuart_config(struct pcmcia_device *link)
        int try;
 
        /* First pass: look for a config entry that looks normal.
-          Two tries: without IO aliases, then with aliases */
+        * Two tries: without IO aliases, then with aliases
+        */
        for (try = 0; try < 2; try++)
                if (!pcmcia_loop_config(link, btuart_check_config, &try))
                        goto found_port;
 
        /* Second pass: try to find an entry that isn't picky about
-          its base address, then try to grab any standard serial port
-          address, and finally try to get any free port. */
+        * its base address, then try to grab any standard serial port
+        * address, and finally try to get any free port.
+        */
        if (!pcmcia_loop_config(link, btuart_check_config_notpicky, NULL))
                goto found_port;
 
index fa24d69..24cc838 100644 (file)
@@ -131,7 +131,8 @@ static const struct usb_device_id btusb_table[] = {
        { USB_DEVICE(0x19ff, 0x0239), .driver_info = BTUSB_BCM_PATCHRAM },
 
        /* Broadcom BCM43142A0 (Foxconn/Lenovo) */
-       { USB_DEVICE(0x105b, 0xe065), .driver_info = BTUSB_BCM_PATCHRAM },
+       { USB_VENDOR_AND_INTERFACE_INFO(0x105b, 0xff, 0x01, 0x01),
+         .driver_info = BTUSB_BCM_PATCHRAM },
 
        /* Broadcom BCM920703 (HTC Vive) */
        { USB_VENDOR_AND_INTERFACE_INFO(0x0bb4, 0xff, 0x01, 0x01),
@@ -268,6 +269,7 @@ static const struct usb_device_id blacklist_table[] = {
        { USB_DEVICE(0x0489, 0xe092), .driver_info = BTUSB_QCA_ROME },
        { USB_DEVICE(0x0489, 0xe0a2), .driver_info = BTUSB_QCA_ROME },
        { USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME },
+       { USB_DEVICE(0x04ca, 0x3016), .driver_info = BTUSB_QCA_ROME },
 
        /* Broadcom BCM2035 */
        { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
@@ -656,7 +658,8 @@ static void btusb_intr_complete(struct urb *urb)
        err = usb_submit_urb(urb, GFP_ATOMIC);
        if (err < 0) {
                /* -EPERM: urb is being killed;
-                * -ENODEV: device got disconnected */
+                * -ENODEV: device got disconnected
+                */
                if (err != -EPERM && err != -ENODEV)
                        BT_ERR("%s urb %p failed to resubmit (%d)",
                               hdev->name, urb, -err);
@@ -745,7 +748,8 @@ static void btusb_bulk_complete(struct urb *urb)
        err = usb_submit_urb(urb, GFP_ATOMIC);
        if (err < 0) {
                /* -EPERM: urb is being killed;
-                * -ENODEV: device got disconnected */
+                * -ENODEV: device got disconnected
+                */
                if (err != -EPERM && err != -ENODEV)
                        BT_ERR("%s urb %p failed to resubmit (%d)",
                               hdev->name, urb, -err);
@@ -840,7 +844,8 @@ static void btusb_isoc_complete(struct urb *urb)
        err = usb_submit_urb(urb, GFP_ATOMIC);
        if (err < 0) {
                /* -EPERM: urb is being killed;
-                * -ENODEV: device got disconnected */
+                * -ENODEV: device got disconnected
+                */
                if (err != -EPERM && err != -ENODEV)
                        BT_ERR("%s urb %p failed to resubmit (%d)",
                               hdev->name, urb, -err);
@@ -952,7 +957,8 @@ static void btusb_diag_complete(struct urb *urb)
        err = usb_submit_urb(urb, GFP_ATOMIC);
        if (err < 0) {
                /* -EPERM: urb is being killed;
-                * -ENODEV: device got disconnected */
+                * -ENODEV: device got disconnected
+                */
                if (err != -EPERM && err != -ENODEV)
                        BT_ERR("%s urb %p failed to resubmit (%d)",
                               hdev->name, urb, -err);
@@ -2896,7 +2902,8 @@ static int btusb_probe(struct usb_interface *intf,
                struct usb_device *udev = interface_to_usbdev(intf);
 
                /* Old firmware would otherwise let ath3k driver load
-                * patch and sysconfig files */
+                * patch and sysconfig files
+                */
                if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001)
                        return -ENODEV;
        }
@@ -3067,6 +3074,12 @@ static int btusb_probe(struct usb_interface *intf,
        if (id->driver_info & BTUSB_QCA_ROME) {
                data->setup_on_usb = btusb_setup_qca;
                hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
+
+               /* QCA Rome devices lose their updated firmware over suspend,
+                * but the USB hub doesn't notice any status change.
+                * Explicitly request a device reset on resume.
+                */
+               set_bit(BTUSB_RESET_RESUME, &data->flags);
        }
 
 #ifdef CONFIG_BT_HCIBTUSB_RTL
@@ -3259,13 +3272,28 @@ static void play_deferred(struct btusb_data *data)
        int err;
 
        while ((urb = usb_get_from_anchor(&data->deferred))) {
+               usb_anchor_urb(urb, &data->tx_anchor);
+
                err = usb_submit_urb(urb, GFP_ATOMIC);
-               if (err < 0)
+               if (err < 0) {
+                       if (err != -EPERM && err != -ENODEV)
+                               BT_ERR("%s urb %p submission failed (%d)",
+                                      data->hdev->name, urb, -err);
+                       kfree(urb->setup_packet);
+                       usb_unanchor_urb(urb);
+                       usb_free_urb(urb);
                        break;
+               }
 
                data->tx_in_flight++;
+               usb_free_urb(urb);
+       }
+
+       /* Cleanup the rest deferred urbs. */
+       while ((urb = usb_get_from_anchor(&data->deferred))) {
+               kfree(urb->setup_packet);
+               usb_free_urb(urb);
        }
-       usb_scuttle_anchored_urbs(&data->deferred);
 }
 
 static int btusb_resume(struct usb_interface *intf)
index 85a3978..5ef8000 100644 (file)
@@ -93,8 +93,7 @@ static void st_reg_completion_cb(void *priv_data, int data)
        complete(&lhst->wait_reg_completion);
 }
 
-/* Called by Shared Transport layer when receive data is
- * available */
+/* Called by Shared Transport layer when receive data is available */
 static long st_receive(void *priv_data, struct sk_buff *skb)
 {
        struct ti_st *lhst = priv_data;
@@ -198,7 +197,8 @@ static int ti_st_open(struct hci_dev *hdev)
                }
 
                /* Is ST registration callback
-                * called with ERROR status? */
+                * called with ERROR status?
+                */
                if (hst->reg_status != 0) {
                        BT_ERR("ST registration completed with invalid "
                                        "status %d", hst->reg_status);
@@ -276,7 +276,7 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
 
 static int bt_ti_probe(struct platform_device *pdev)
 {
-       static struct ti_st *hst;
+       struct ti_st *hst;
        struct hci_dev *hdev;
        int err;
 
index 6a662d0..6b42372 100644 (file)
@@ -176,7 +176,7 @@ static irqreturn_t bcm_host_wake(int irq, void *data)
 static int bcm_request_irq(struct bcm_data *bcm)
 {
        struct bcm_device *bdev = bcm->dev;
-       int err = 0;
+       int err;
 
        /* If this is not a platform device, do not enable PM functionalities */
        mutex_lock(&bcm_device_lock);
@@ -185,21 +185,23 @@ static int bcm_request_irq(struct bcm_data *bcm)
                goto unlock;
        }
 
-       if (bdev->irq > 0) {
-               err = devm_request_irq(&bdev->pdev->dev, bdev->irq,
-                                      bcm_host_wake, IRQF_TRIGGER_RISING,
-                                      "host_wake", bdev);
-               if (err)
-                       goto unlock;
+       if (bdev->irq <= 0) {
+               err = -EOPNOTSUPP;
+               goto unlock;
+       }
 
-               device_init_wakeup(&bdev->pdev->dev, true);
+       err = devm_request_irq(&bdev->pdev->dev, bdev->irq, bcm_host_wake,
+                              IRQF_TRIGGER_RISING, "host_wake", bdev);
+       if (err)
+               goto unlock;
 
-               pm_runtime_set_autosuspend_delay(&bdev->pdev->dev,
-                                                BCM_AUTOSUSPEND_DELAY);
-               pm_runtime_use_autosuspend(&bdev->pdev->dev);
-               pm_runtime_set_active(&bdev->pdev->dev);
-               pm_runtime_enable(&bdev->pdev->dev);
-       }
+       device_init_wakeup(&bdev->pdev->dev, true);
+
+       pm_runtime_set_autosuspend_delay(&bdev->pdev->dev,
+                                        BCM_AUTOSUSPEND_DELAY);
+       pm_runtime_use_autosuspend(&bdev->pdev->dev);
+       pm_runtime_set_active(&bdev->pdev->dev);
+       pm_runtime_enable(&bdev->pdev->dev);
 
 unlock:
        mutex_unlock(&bcm_device_lock);
index 4e328d7..3b82a87 100644 (file)
@@ -172,7 +172,7 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
                            const struct h4_recv_pkt *pkts, int pkts_count)
 {
        struct hci_uart *hu = hci_get_drvdata(hdev);
-       u8 alignment = hu->alignment;
+       u8 alignment = hu->alignment ? hu->alignment : 1;
 
        while (count) {
                int i, len;
index 8397b71..a746627 100644 (file)
@@ -457,7 +457,8 @@ static int hci_uart_tty_open(struct tty_struct *tty)
        BT_DBG("tty %p", tty);
 
        /* Error if the tty has no write op instead of leaving an exploitable
-          hole */
+        * hole
+        */
        if (tty->ops->write == NULL)
                return -EOPNOTSUPP;
 
index c982943..424c15a 100644 (file)
@@ -622,7 +622,8 @@ static int download_firmware(struct ll_device *lldev)
                        cmd = (struct hci_command *)action_ptr;
                        if (cmd->opcode == 0xff36) {
                                /* ignore remote change
-                                * baud rate HCI VS command */
+                                * baud rate HCI VS command
+                                */
                                bt_dev_warn(lldev->hu.hdev, "change remote baud rate command in firmware");
                                break;
                        }
@@ -742,14 +743,8 @@ static int hci_ti_probe(struct serdev_device *serdev)
 static void hci_ti_remove(struct serdev_device *serdev)
 {
        struct ll_device *lldev = serdev_device_get_drvdata(serdev);
-       struct hci_uart *hu = &lldev->hu;
-       struct hci_dev *hdev = hu->hdev;
 
-       cancel_work_sync(&hu->write_work);
-
-       hci_unregister_dev(hdev);
-       hci_free_dev(hdev);
-       hu->proto->close(hu);
+       hci_uart_unregister_device(&lldev->hu);
 }
 
 static const struct of_device_id hci_ti_of_match[] = {
index 181a15b..3539fd0 100644 (file)
@@ -767,16 +767,8 @@ static int nokia_bluetooth_serdev_probe(struct serdev_device *serdev)
 static void nokia_bluetooth_serdev_remove(struct serdev_device *serdev)
 {
        struct nokia_bt_dev *btdev = serdev_device_get_drvdata(serdev);
-       struct hci_uart *hu = &btdev->hu;
-       struct hci_dev *hdev = hu->hdev;
 
-       cancel_work_sync(&hu->write_work);
-
-       hci_unregister_dev(hdev);
-       hci_free_dev(hdev);
-       hu->proto->close(hu);
-
-       pm_runtime_disable(&btdev->serdev->dev);
+       hci_uart_unregister_device(&btdev->hu);
 }
 
 static int nokia_bluetooth_runtime_suspend(struct device *dev)
index aea9301..b725ac4 100644 (file)
@@ -354,3 +354,16 @@ err_alloc:
        return err;
 }
 EXPORT_SYMBOL_GPL(hci_uart_register_device);
+
+void hci_uart_unregister_device(struct hci_uart *hu)
+{
+       struct hci_dev *hdev = hu->hdev;
+
+       hci_unregister_dev(hdev);
+       hci_free_dev(hdev);
+
+       cancel_work_sync(&hu->write_work);
+
+       hu->proto->close(hu);
+}
+EXPORT_SYMBOL_GPL(hci_uart_unregister_device);
index c6e9e1c..d9cd95d 100644 (file)
@@ -112,6 +112,7 @@ struct hci_uart {
 int hci_uart_register_proto(const struct hci_uart_proto *p);
 int hci_uart_unregister_proto(const struct hci_uart_proto *p);
 int hci_uart_register_device(struct hci_uart *hu, const struct hci_uart_proto *p);
+void hci_uart_unregister_device(struct hci_uart *hu);
 
 int hci_uart_tx_wakeup(struct hci_uart *hu);
 int hci_uart_init_ready(struct hci_uart *hu);
index 7d33496..ee7084b 100644 (file)
@@ -1330,7 +1330,8 @@ static int mrf24j40_probe(struct spi_device *spi)
        if (spi->max_speed_hz > MAX_SPI_SPEED_HZ) {
                dev_warn(&spi->dev, "spi clock above possible maximum: %d",
                         MAX_SPI_SPEED_HZ);
-               return -EINVAL;
+               ret = -EINVAL;
+               goto err_register_device;
        }
 
        ret = mrf24j40_hw_init(devrec);