input: Disconnect ctrl chan only if intr chan was disconnected by us
authorArchie Pusaka <apusaka@chromium.org>
Wed, 10 Jun 2020 15:04:46 +0000 (23:04 +0800)
committerAyush Garg <ayush.garg@samsung.com>
Mon, 12 Apr 2021 09:00:49 +0000 (14:30 +0530)
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.

Signed-off-by: Anuj Jain <anuj01.jain@samsung.com>
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
profiles/input/device.c

index be5f972..a4f9e3b 100644 (file)
@@ -335,8 +335,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);