]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
HID: steelseries: Fix battery requests stopping after some time
authorBastien Nocera <hadess@hadess.net>
Wed, 23 Oct 2024 11:24:37 +0000 (13:24 +0200)
committerJiri Kosina <jkosina@suse.com>
Wed, 6 Nov 2024 14:10:32 +0000 (15:10 +0100)
In some cases, the headset receiver will answer one of our requests with
garbage, or not at all. This is a problem when we only request battery
information once we've received a battery response, as we might never
get to request battery information again.

If the data from the receiver could not be parsed, and there's no
pending battery requests, schedule a new request.

Signed-off-by: Bastien Nocera <hadess@hadess.net>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/hid-steelseries.c

index 7e83fee1ffa043a756d416e0a02de0734e6909e3..16138f7dae17fdf0005f1775f465471d66ece36e 100644 (file)
@@ -603,8 +603,11 @@ static int steelseries_headset_raw_event(struct hid_device *hdev,
                hid_dbg(sd->hdev,
                        "Parsing raw event for Arctis 1 headset (%*ph)\n", size, read_buf);
                if (size < ARCTIS_1_BATTERY_RESPONSE_LEN ||
-                   memcmp (read_buf, arctis_1_battery_request, sizeof(arctis_1_battery_request)))
+                   memcmp(read_buf, arctis_1_battery_request, sizeof(arctis_1_battery_request))) {
+                       if (!delayed_work_pending(&sd->battery_work))
+                               goto request_battery;
                        return 0;
+               }
                if (read_buf[2] == 0x01) {
                        connected = false;
                        capacity = 100;
@@ -631,6 +634,7 @@ static int steelseries_headset_raw_event(struct hid_device *hdev,
                power_supply_changed(sd->battery);
        }
 
+request_battery:
        spin_lock_irqsave(&sd->lock, flags);
        if (!sd->removed)
                schedule_delayed_work(&sd->battery_work,