| From 068ce8efa11d4de60585c859a7d39cb0167a4a69 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Sat, 1 Feb 2025 12:38:45 +0100 |
| Subject: HID: pidff: Convert infinite length from Linux API to PID standard |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com> |
| |
| [ Upstream commit 37e0591fe44dce39d1ebc7a82d5b6e4dba1582eb ] |
| |
| Software uses 0 as de-facto infinite lenght on Linux FF apis (SDL), |
| Linux doesn't actually define anythi as of now, while USB PID defines |
| NULL (0xffff). Most PID devices do not expect a 0-length effect and |
| can't interpret it as infinite. This change fixes Force Feedback for |
| most PID compliant devices. |
| |
| As most games depend on updating the values of already playing infinite |
| effects, this is crucial to ensure they will actually work. |
| |
| Previously, users had to rely on third-party software to do this conversion |
| and make their PID devices usable. |
| |
| Co-developed-by: Makarenko Oleg <oleg@makarenk.ooo> |
| Signed-off-by: Makarenko Oleg <oleg@makarenk.ooo> |
| Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com> |
| Reviewed-by: Michał Kopeć <michal@nozomi.space> |
| Reviewed-by: Paul Dino Jones <paul@spacefreak18.xyz> |
| Tested-by: Paul Dino Jones <paul@spacefreak18.xyz> |
| Tested-by: Cristóferson Bueno <cbueno81@gmail.com> |
| Tested-by: Pablo Cisneros <patchkez@protonmail.com> |
| Signed-off-by: Jiri Kosina <jkosina@suse.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/hid/usbhid/hid-pidff.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c |
| index 07a9fe97d2e05..badcb5f28607e 100644 |
| --- a/drivers/hid/usbhid/hid-pidff.c |
| +++ b/drivers/hid/usbhid/hid-pidff.c |
| @@ -21,6 +21,7 @@ |
| #include "usbhid.h" |
| |
| #define PID_EFFECTS_MAX 64 |
| +#define PID_INFINITE 0xffff |
| |
| /* Report usage table used to put reports into an array */ |
| |
| @@ -301,7 +302,12 @@ static void pidff_set_effect_report(struct pidff_device *pidff, |
| pidff->block_load[PID_EFFECT_BLOCK_INDEX].value[0]; |
| pidff->set_effect_type->value[0] = |
| pidff->create_new_effect_type->value[0]; |
| - pidff->set_effect[PID_DURATION].value[0] = effect->replay.length; |
| + |
| + /* Convert infinite length from Linux API (0) |
| + to PID standard (NULL) if needed */ |
| + pidff->set_effect[PID_DURATION].value[0] = |
| + effect->replay.length == 0 ? PID_INFINITE : effect->replay.length; |
| + |
| pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = effect->trigger.button; |
| pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] = |
| effect->trigger.interval; |
| -- |
| 2.39.5 |
| |