56 lines
2.1 KiB
Diff
56 lines
2.1 KiB
Diff
|
From d0a934b764c67b4bf626f5b7cf725a6e3066afd2 Mon Sep 17 00:00:00 2001
|
||
|
From: David Herrmann <dh.herrmann@gmail.com>
|
||
|
Date: Mon, 13 May 2013 15:01:30 +0000
|
||
|
Subject: HID: input: return ENODATA if reading battery attrs fails
|
||
|
|
||
|
power_supply core has the bad habit of calling our battery callbacks
|
||
|
from within power_supply_register(). Furthermore, if the callbacks
|
||
|
fail with an unhandled error code, it will skip any uevent that it
|
||
|
might currently process.
|
||
|
So if HID-core registers battery devices, an "add" uevent is generated
|
||
|
and the battery callbacks are called. These will gracefully fail due
|
||
|
to timeouts as they might still hold locks on event processing. One
|
||
|
could argue that this should be fixed in power_supply core, but the
|
||
|
least we can do is to signal ENODATA so power_supply core will just
|
||
|
skip the property and continue with the uevent.
|
||
|
|
||
|
This fixes a bug where "add" and "remove" uevents are skipped for
|
||
|
battery devices. upower is unable to track these devices and currently
|
||
|
needs to ignore them.
|
||
|
|
||
|
This patch also overwrites any other error code. I cannot see any reason
|
||
|
why we should forward protocol- or I/O-errors to the power_supply core.
|
||
|
We handle these errors in hid_ll_driver later, anyway, so just skip
|
||
|
them. power_supply core cannot do anything useful with them, anyway,
|
||
|
and we avoid skipping important uevents and confusing user-space.
|
||
|
|
||
|
Thanks a lot to Daniel Nicoletti for pushing and investigating
|
||
|
on this.
|
||
|
|
||
|
Cc: Jiri Kosina <jkosina@suse.cz>
|
||
|
Cc: Anton Vorontsov <cbou@mail.ru>
|
||
|
Cc: David Woodhouse <dwmw2@infradead.org>
|
||
|
Reported-by: Daniel Nicoletti <dantti12@gmail.com>
|
||
|
Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
|
||
|
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||
|
---
|
||
|
diff --git a/drivers/hid/hid-input.c b/drivers/hid/hid-input.c
|
||
|
index 945b815..c526a3c 100644
|
||
|
--- a/drivers/hid/hid-input.c
|
||
|
+++ b/drivers/hid/hid-input.c
|
||
|
@@ -354,10 +354,10 @@ static int hidinput_get_battery_property(struct power_supply *psy,
|
||
|
dev->battery_report_type);
|
||
|
|
||
|
if (ret != 2) {
|
||
|
- if (ret >= 0)
|
||
|
- ret = -EINVAL;
|
||
|
+ ret = -ENODATA;
|
||
|
break;
|
||
|
}
|
||
|
+ ret = 0;
|
||
|
|
||
|
if (dev->battery_min < dev->battery_max &&
|
||
|
buf[1] >= dev->battery_min &&
|
||
|
--
|
||
|
cgit v0.9.2
|