Skip to content

Commit 8876fc1

Browse files
LawstorantJiri Kosina
authored andcommitted
HID: pidff: Do not send effect envelope if it's empty
Envelope struct is always initialized, but the envelope itself is optional as described in USB PID Device class definition 1.0. 5.1.1.1 Type Specific Block Offsets ... 4) Effects that do not use Condition Blocks use 1 Parameter Block and an *optional* Envelope Block. Sending out "empty" envelope breaks force feedback on some devices with games that use SINE effect + offset to emulate constant force effect, as well as generally breaking Constant/Periodic effects. One of the affected brands is Moza Racing. This change prevents the envelope from being sent if it contains all 0 values while keeping the old behavior of only sending it, if it differs from the old one. Changes in v6: - Simplify the checks to make them clearer - Fix possible null pointer dereference while calling pidff_needs_set_envelope 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>
1 parent 37e0591 commit 8876fc1

1 file changed

Lines changed: 24 additions & 18 deletions

File tree

drivers/hid/usbhid/hid-pidff.c

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,22 @@ static void pidff_set_envelope_report(struct pidff_device *pidff,
262262
static int pidff_needs_set_envelope(struct ff_envelope *envelope,
263263
struct ff_envelope *old)
264264
{
265-
return envelope->attack_level != old->attack_level ||
266-
envelope->fade_level != old->fade_level ||
265+
bool needs_new_envelope;
266+
needs_new_envelope = envelope->attack_level != 0 ||
267+
envelope->fade_level != 0 ||
268+
envelope->attack_length != 0 ||
269+
envelope->fade_length != 0;
270+
271+
if (!needs_new_envelope)
272+
return false;
273+
274+
if (!old)
275+
return needs_new_envelope;
276+
277+
return envelope->attack_level != old->attack_level ||
278+
envelope->fade_level != old->fade_level ||
267279
envelope->attack_length != old->attack_length ||
268-
envelope->fade_length != old->fade_length;
280+
envelope->fade_length != old->fade_length;
269281
}
270282

271283
/*
@@ -580,11 +592,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
580592
pidff_set_effect_report(pidff, effect);
581593
if (!old || pidff_needs_set_constant(effect, old))
582594
pidff_set_constant_force_report(pidff, effect);
583-
if (!old ||
584-
pidff_needs_set_envelope(&effect->u.constant.envelope,
585-
&old->u.constant.envelope))
586-
pidff_set_envelope_report(pidff,
587-
&effect->u.constant.envelope);
595+
if (pidff_needs_set_envelope(&effect->u.constant.envelope,
596+
old ? &old->u.constant.envelope : NULL))
597+
pidff_set_envelope_report(pidff, &effect->u.constant.envelope);
588598
break;
589599

590600
case FF_PERIODIC:
@@ -619,11 +629,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
619629
pidff_set_effect_report(pidff, effect);
620630
if (!old || pidff_needs_set_periodic(effect, old))
621631
pidff_set_periodic_report(pidff, effect);
622-
if (!old ||
623-
pidff_needs_set_envelope(&effect->u.periodic.envelope,
624-
&old->u.periodic.envelope))
625-
pidff_set_envelope_report(pidff,
626-
&effect->u.periodic.envelope);
632+
if (pidff_needs_set_envelope(&effect->u.periodic.envelope,
633+
old ? &old->u.periodic.envelope : NULL))
634+
pidff_set_envelope_report(pidff, &effect->u.periodic.envelope);
627635
break;
628636

629637
case FF_RAMP:
@@ -637,11 +645,9 @@ static int pidff_upload_effect(struct input_dev *dev, struct ff_effect *effect,
637645
pidff_set_effect_report(pidff, effect);
638646
if (!old || pidff_needs_set_ramp(effect, old))
639647
pidff_set_ramp_force_report(pidff, effect);
640-
if (!old ||
641-
pidff_needs_set_envelope(&effect->u.ramp.envelope,
642-
&old->u.ramp.envelope))
643-
pidff_set_envelope_report(pidff,
644-
&effect->u.ramp.envelope);
648+
if (pidff_needs_set_envelope(&effect->u.ramp.envelope,
649+
old ? &old->u.ramp.envelope : NULL))
650+
pidff_set_envelope_report(pidff, &effect->u.ramp.envelope);
645651
break;
646652

647653
case FF_SPRING:

0 commit comments

Comments
 (0)