]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: pidff: Support device error response from PID_BLOCK_LOAD
authorTomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
Tue, 11 Feb 2025 14:35:11 +0000 (15:35 +0100)
committerJiri Kosina <jkosina@suse.com>
Tue, 11 Feb 2025 22:15:33 +0000 (23:15 +0100)
If an error happens on the device, the driver will no longer fall
into the trap of reading this status 60 times before it decides that
this reply won't change to success/memory full.

Greatly reduces communication overhead during device error situation.

Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/usbhid/hid-pidff.c

index e2508a4d754d39944f4b7dc23a197d6cb688ac5e..d5734cbf745d1cf6655d1099b58ec0daabb71ebe 100644 (file)
@@ -138,7 +138,8 @@ static const u8 pidff_effect_types[] = {
 
 #define PID_BLOCK_LOAD_SUCCESS 0
 #define PID_BLOCK_LOAD_FULL    1
-static const u8 pidff_block_load_status[] = { 0x8c, 0x8d };
+#define PID_BLOCK_LOAD_ERROR   2
+static const u8 pidff_block_load_status[] = { 0x8c, 0x8d, 0x8e};
 
 #define PID_EFFECT_START       0
 #define PID_EFFECT_STOP                1
@@ -666,6 +667,11 @@ static int pidff_request_effect_upload(struct pidff_device *pidff, int efnum)
                                pidff->block_load[PID_RAM_POOL_AVAILABLE].value[0] : -1);
                        return -ENOSPC;
                }
+               if (pidff->block_load_status->value[0] ==
+                   pidff->status_id[PID_BLOCK_LOAD_ERROR]) {
+                       hid_dbg(pidff->hid, "device error during effect creation\n");
+                       return -EREMOTEIO;
+               }
        }
        hid_err(pidff->hid, "pid_block_load failed 60 times\n");
        return -EIO;