From: Archie Pusaka <apusaka@xxxxxxxxxxxx> 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 d89da2d7c..a858bbb19 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.27.0.278.ge193c7cf3a9-goog