usb: gadget: webcam: Make g_webcam loadable again
[platform/kernel/linux-starfive.git] / net / bluetooth / hci_core.c
index a5992f1..65601aa 100644 (file)
@@ -2535,6 +2535,8 @@ struct hci_dev *hci_alloc_dev_priv(int sizeof_priv)
        mutex_init(&hdev->lock);
        mutex_init(&hdev->req_lock);
 
+       ida_init(&hdev->unset_handle_ida);
+
        INIT_LIST_HEAD(&hdev->mesh_pending);
        INIT_LIST_HEAD(&hdev->mgmt_pending);
        INIT_LIST_HEAD(&hdev->reject_list);
@@ -2617,7 +2619,11 @@ int hci_register_dev(struct hci_dev *hdev)
        if (id < 0)
                return id;
 
-       snprintf(hdev->name, sizeof(hdev->name), "hci%d", id);
+       error = dev_set_name(&hdev->dev, "hci%u", id);
+       if (error)
+               return error;
+
+       hdev->name = dev_name(&hdev->dev);
        hdev->id = id;
 
        BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus);
@@ -2639,8 +2645,6 @@ int hci_register_dev(struct hci_dev *hdev)
        if (!IS_ERR_OR_NULL(bt_debugfs))
                hdev->debugfs = debugfs_create_dir(hdev->name, bt_debugfs);
 
-       dev_set_name(&hdev->dev, "%s", hdev->name);
-
        error = device_add(&hdev->dev);
        if (error < 0)
                goto err_wqueue;
@@ -2784,8 +2788,10 @@ void hci_release_dev(struct hci_dev *hdev)
        hci_conn_params_clear_all(hdev);
        hci_discovery_filter_clear(hdev);
        hci_blocked_keys_clear(hdev);
+       hci_codec_list_clear(&hdev->local_codecs);
        hci_dev_unlock(hdev);
 
+       ida_destroy(&hdev->unset_handle_ida);
        ida_simple_remove(&hci_index_ida, hdev->id);
        kfree_skb(hdev->sent_cmd);
        kfree_skb(hdev->recv_event);
@@ -3418,7 +3424,12 @@ static void hci_link_tx_to(struct hci_dev *hdev, __u8 type)
                if (c->type == type && c->sent) {
                        bt_dev_err(hdev, "killing stalled connection %pMR",
                                   &c->dst);
+                       /* hci_disconnect might sleep, so, we have to release
+                        * the RCU read lock before calling it.
+                        */
+                       rcu_read_unlock();
                        hci_disconnect(c, HCI_ERROR_REMOTE_USER_TERM);
+                       rcu_read_lock();
                }
        }