Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ac44739 authored by Dmitry Torokhov's avatar Dmitry Torokhov Committed by Todd Poynor
Browse files

ANDROID: hid: uhid: implement refcount for open and close



Fix concurrent open and close activity sending a UHID_CLOSE while
some consumers still have the device open.

Temporary solution for reference counts on device open and close
calls, absent a facility for this in the HID core likely to appear
in the future.

[toddpoynor@google.com: commit text]
Bug: 38448648
Signed-off-by: default avatarTodd Poynor <toddpoynor@google.com>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
Change-Id: I57413e42ec961a960a8ddc4942228df22c730d80
parent d887c7d3
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@
#define UHID_NAME	"uhid"
#define UHID_BUFSIZE	32

static DEFINE_MUTEX(uhid_open_mutex);

struct uhid_device {
	struct mutex devlock;
	bool running;
@@ -142,15 +144,26 @@ static void uhid_hid_stop(struct hid_device *hid)
static int uhid_hid_open(struct hid_device *hid)
{
	struct uhid_device *uhid = hid->driver_data;
	int retval = 0;

	return uhid_queue_event(uhid, UHID_OPEN);
	mutex_lock(&uhid_open_mutex);
	if (!hid->open++) {
		retval = uhid_queue_event(uhid, UHID_OPEN);
		if (retval)
			hid->open--;
	}
	mutex_unlock(&uhid_open_mutex);
	return retval;
}

static void uhid_hid_close(struct hid_device *hid)
{
	struct uhid_device *uhid = hid->driver_data;

	mutex_lock(&uhid_open_mutex);
	if (!--hid->open)
		uhid_queue_event(uhid, UHID_CLOSE);
	mutex_unlock(&uhid_open_mutex);
}

static int uhid_hid_parse(struct hid_device *hid)