On Sat, 8 Feb 2025, Tomasz Pakuła wrote: > As noted by Anssi some 20 years ago, pool report is sometimes messed up. > This worked fine on many devices but casued oops on VRS DirectForce PRO. > > Here, we're making sure pool report is refetched before trying to access > any of it's fields. While loop was replaced with a for loop + exit > conditions were moved aroud to decrease the possibility of creating an > infinite loop scenario. > > Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@xxxxxxxxx> > --- > drivers/hid/usbhid/hid-pidff.c | 34 ++++++++++++++++------------------ > 1 file changed, 16 insertions(+), 18 deletions(-) > > diff --git a/drivers/hid/usbhid/hid-pidff.c b/drivers/hid/usbhid/hid-pidff.c > index f23381b6e344..acdcc0af86ba 100644 > --- a/drivers/hid/usbhid/hid-pidff.c > +++ b/drivers/hid/usbhid/hid-pidff.c > @@ -604,28 +604,26 @@ static void pidff_reset(struct pidff_device *pidff) > } > > /* > - * Refetch pool report > + * Fetch pool report > */ > static void pidff_fetch_pool(struct pidff_device *pidff) > { > - if (!pidff->pool[PID_SIMULTANEOUS_MAX].value) > - return; > - > - int i = 0; > - while (pidff->pool[PID_SIMULTANEOUS_MAX].value[0] < 2) { > - hid_dbg(pidff->hid, "pid_pool requested again\n"); > - hid_hw_request(pidff->hid, pidff->reports[PID_POOL], > - HID_REQ_GET_REPORT); > - hid_hw_wait(pidff->hid); > - > - /* break after 20 tries with SIMULTANEOUS_MAX < 2 */ > - if (i++ > 20) { > - hid_warn(pidff->hid, > - "device reports %d simultaneous effects\n", > - pidff->pool[PID_SIMULTANEOUS_MAX].value[0]); > - break; > - } > + int i; > + struct hid_device *hid = pidff->hid; > + > + /* Try 20 times if PID_SIMULTANEOUS_MAX < 2. > + We must make sure this isn't just an error */ Sorry for annoying nit: this is not really consistent with Kernel / HID comment style :) -- Jiri Kosina SUSE Labs