From 69d7d42e896e2ab6a23b62692a1011d552c42cc9 Mon Sep 17 00:00:00 2001 From: Archie Pusaka Date: Wed, 10 Jun 2020 23:04:46 +0800 Subject: [PATCH] input: Disconnect ctrl chan only if intr chan was disconnected by us If the intr channel was disconnected by the other party, then they are also responsible to close the ctrl channel. Such disconnection message would have the G_IO_ERR flag set, as opposed to it being unset if the disconnection is initiated by us. There doesn't seem to be an explicit rule in the specification about this behavior, but this is enforced in the PTS qualification tool. --- profiles/input/device.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/profiles/input/device.c b/profiles/input/device.c index e2ea459fe..d3724ed54 100644 --- a/profiles/input/device.c +++ b/profiles/input/device.c @@ -333,8 +333,10 @@ static gboolean intr_watch_cb(GIOChannel *chan, GIOCondition cond, gpointer data idev->intr_io = NULL; } - /* Close control channel */ - if (idev->ctrl_io && !(cond & G_IO_NVAL)) + /* Close control channel if the closing of interrupt channel is not + * initiated by the other party + */ + if (idev->ctrl_io && !(cond & (G_IO_NVAL | G_IO_ERR))) g_io_channel_shutdown(idev->ctrl_io, TRUE, NULL); btd_service_disconnecting_complete(idev->service, 0); -- 2.47.3