mirror of
https://git.kernel.org/pub/scm/bluetooth/bluez.git
synced 2024-11-27 06:04:32 +08:00
hog-lib: Don't destroy UHID device on detach
This makes bt_hog_detach not to destroy UHID device which means the device node don't need to be recreated in case of reconnections which speeds up the process. Fixes: https://github.com/bluez/bluez/issues/737
This commit is contained in:
parent
b55d98e5cc
commit
247ae85248
@ -1309,11 +1309,35 @@ static bool cancel_gatt_req(const void *data, const void *user_data)
|
||||
return g_attrib_cancel(hog->attrib, req->id);
|
||||
}
|
||||
|
||||
static void uhid_destroy(struct bt_hog *hog)
|
||||
{
|
||||
int err;
|
||||
struct uhid_event ev;
|
||||
|
||||
if (!hog->uhid_created)
|
||||
return;
|
||||
|
||||
bt_uhid_unregister_all(hog->uhid);
|
||||
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.type = UHID_DESTROY;
|
||||
|
||||
err = bt_uhid_send(hog->uhid, &ev);
|
||||
|
||||
if (err < 0) {
|
||||
error("bt_uhid_send: %s", strerror(-err));
|
||||
return;
|
||||
}
|
||||
|
||||
hog->uhid_created = false;
|
||||
}
|
||||
|
||||
static void hog_free(void *data)
|
||||
{
|
||||
struct bt_hog *hog = data;
|
||||
|
||||
bt_hog_detach(hog);
|
||||
uhid_destroy(hog);
|
||||
|
||||
queue_destroy(hog->input, free);
|
||||
queue_destroy(hog->bas, (void *) bt_bas_unref);
|
||||
@ -1823,29 +1847,6 @@ bool bt_hog_attach(struct bt_hog *hog, void *gatt)
|
||||
return true;
|
||||
}
|
||||
|
||||
static void uhid_destroy(struct bt_hog *hog)
|
||||
{
|
||||
int err;
|
||||
struct uhid_event ev;
|
||||
|
||||
if (!hog->uhid_created)
|
||||
return;
|
||||
|
||||
bt_uhid_unregister_all(hog->uhid);
|
||||
|
||||
memset(&ev, 0, sizeof(ev));
|
||||
ev.type = UHID_DESTROY;
|
||||
|
||||
err = bt_uhid_send(hog->uhid, &ev);
|
||||
|
||||
if (err < 0) {
|
||||
error("bt_uhid_send: %s", strerror(-err));
|
||||
return;
|
||||
}
|
||||
|
||||
hog->uhid_created = false;
|
||||
}
|
||||
|
||||
void bt_hog_detach(struct bt_hog *hog)
|
||||
{
|
||||
GSList *l;
|
||||
@ -1879,7 +1880,6 @@ void bt_hog_detach(struct bt_hog *hog)
|
||||
queue_remove_all(hog->gatt_op, cancel_gatt_req, hog, destroy_gatt_req);
|
||||
g_attrib_unref(hog->attrib);
|
||||
hog->attrib = NULL;
|
||||
uhid_destroy(hog);
|
||||
}
|
||||
|
||||
int bt_hog_set_control_point(struct bt_hog *hog, bool suspend)
|
||||
|
Loading…
Reference in New Issue
Block a user