2023-02-06 13:59:16

by Bastien Nocera

[permalink] [raw]
Subject: [PATCH 1/3] HID: logitech-hidpp: Add more debug statements

This should help us figure out some hairy problems with some devices.

Signed-off-by: Bastien Nocera <[email protected]>
---
drivers/hid/hid-logitech-hidpp.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index f44ba7be3cc5..6386d3f023ca 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -338,8 +338,12 @@ static int hidpp_send_fap_command_sync(struct hidpp_device *hidpp,
struct hidpp_report *message;
int ret;

- if (param_count > sizeof(message->fap.params))
+ if (param_count > sizeof(message->fap.params)) {
+ hid_dbg(hidpp->hid_dev,
+ "Invalid number of parameters passed to command (%d != %ld)\n",
+ param_count, sizeof(message->fap.params));
return -EINVAL;
+ }

message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
if (!message)
@@ -3440,11 +3444,17 @@ static int hi_res_scroll_enable(struct hidpp_device *hidpp)
ret = hidpp10_enable_scrolling_acceleration(hidpp);
multiplier = 8;
}
- if (ret)
+ if (ret) {
+ hid_dbg(hidpp->hid_dev,
+ "Could not enable hi-res scrolling: %d\n", ret);
return ret;
+ }

- if (multiplier == 0)
+ if (multiplier == 0) {
+ hid_dbg(hidpp->hid_dev,
+ "Invalid multiplier 0 from device, setting it to 1\n");
multiplier = 1;
+ }

hidpp->vertical_wheel_counter.wheel_multiplier = multiplier;
hid_dbg(hidpp->hid_dev, "wheel multiplier = %d\n", multiplier);
--
2.39.1



2023-02-06 13:59:19

by Bastien Nocera

[permalink] [raw]
Subject: [PATCH 2/3] HID: logitech-hidpp: Retry commands when device is busy

Handle the busy error coming from the device or receiver. The
documentation says a busy error can be returned when:
"
Device (or receiver) cannot answer immediately to this request
for any reason i.e:
- already processing a request from the same or another SW
- pipe full
"

Signed-off-by: Bastien Nocera <[email protected]>
---
drivers/hid/hid-logitech-hidpp.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index 6386d3f023ca..ef497a82fe4e 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -295,6 +295,7 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
*/
*response = *message;

+retry:
ret = __hidpp_send_report(hidpp->hid_dev, message);

if (ret) {
@@ -321,6 +322,10 @@ static int hidpp_send_message_sync(struct hidpp_device *hidpp,
response->report_id == REPORT_ID_HIDPP_VERY_LONG) &&
response->fap.feature_index == HIDPP20_ERROR) {
ret = response->fap.params[1];
+ if (ret == HIDPP20_ERROR_BUSY) {
+ dbg_hid("%s:got busy hidpp 2.0 error %02X, retrying\n", __func__, ret);
+ goto retry;
+ }
dbg_hid("%s:got hidpp 2.0 error %02X\n", __func__, ret);
goto exit;
}
--
2.39.1


2023-02-06 13:59:21

by Bastien Nocera

[permalink] [raw]
Subject: [PATCH 3/3] HID: logitech-hidpp: Add myself to authors

Signed-off-by: Bastien Nocera <[email protected]>
---
drivers/hid/hid-logitech-hidpp.c | 1 +
1 file changed, 1 insertion(+)

diff --git a/drivers/hid/hid-logitech-hidpp.c b/drivers/hid/hid-logitech-hidpp.c
index ef497a82fe4e..fa0c8d1a89e3 100644
--- a/drivers/hid/hid-logitech-hidpp.c
+++ b/drivers/hid/hid-logitech-hidpp.c
@@ -30,6 +30,7 @@
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Benjamin Tissoires <[email protected]>");
MODULE_AUTHOR("Nestor Lopez Casado <[email protected]>");
+MODULE_AUTHOR("Bastien Nocera <[email protected]>");

static bool disable_tap_to_click;
module_param(disable_tap_to_click, bool, 0644);
--
2.39.1


2023-02-06 16:54:19

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 1/3] HID: logitech-hidpp: Add more debug statements

Hi Bastien,

I love your patch! Perhaps something to improve:

[auto build test WARNING on hid/for-next]
[also build test WARNING on linus/master v6.2-rc7 next-20230206]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Bastien-Nocera/HID-logitech-hidpp-Retry-commands-when-device-is-busy/20230206-215940
base: https://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git for-next
patch link: https://lore.kernel.org/r/20230206135808.8840-1-hadess%40hadess.net
patch subject: [PATCH 1/3] HID: logitech-hidpp: Add more debug statements
config: m68k-allyesconfig (https://download.01.org/0day-ci/archive/20230207/[email protected]/config)
compiler: m68k-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/f201298961e2cb71de94a0c8632cb9376975959f
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Bastien-Nocera/HID-logitech-hidpp-Retry-commands-when-device-is-busy/20230206-215940
git checkout f201298961e2cb71de94a0c8632cb9376975959f
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k olddefconfig
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=m68k SHELL=/bin/bash drivers/hid/

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

In file included from include/linux/printk.h:566,
from include/asm-generic/bug.h:22,
from arch/m68k/include/asm/bug.h:32,
from include/linux/bug.h:5,
from include/linux/thread_info.h:13,
from include/asm-generic/preempt.h:5,
from ./arch/m68k/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:78,
from arch/m68k/include/asm/irqflags.h:6,
from include/linux/irqflags.h:16,
from arch/m68k/include/asm/atomic.h:6,
from include/linux/atomic.h:7,
from include/linux/rcupdate.h:25,
from include/linux/rculist.h:11,
from include/linux/pid.h:5,
from include/linux/sched.h:14,
from include/linux/ratelimit.h:6,
from include/linux/dev_printk.h:16,
from include/linux/device.h:15,
from drivers/hid/hid-logitech-hidpp.c:13:
drivers/hid/hid-logitech-hidpp.c: In function 'hidpp_send_fap_command_sync':
>> drivers/hid/hid-logitech-hidpp.c:343:25: warning: format '%ld' expects argument of type 'long int', but argument 5 has type 'unsigned int' [-Wformat=]
343 | "Invalid number of parameters passed to command (%d != %ld)\n",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:223:29: note: in definition of macro '__dynamic_func_call_cls'
223 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:249:9: note: in expansion of macro '_dynamic_func_call_cls'
249 | _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:272:9: note: in expansion of macro '_dynamic_func_call'
272 | _dynamic_func_call(fmt, __dynamic_dev_dbg, \
| ^~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~~~~~~~~~
include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
155 | dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
include/linux/hid.h:1202:9: note: in expansion of macro 'dev_dbg'
1202 | dev_dbg(&(hid)->dev, fmt, ##__VA_ARGS__)
| ^~~~~~~
drivers/hid/hid-logitech-hidpp.c:342:17: note: in expansion of macro 'hid_dbg'
342 | hid_dbg(hidpp->hid_dev,
| ^~~~~~~
drivers/hid/hid-logitech-hidpp.c:343:82: note: format string is defined here
343 | "Invalid number of parameters passed to command (%d != %ld)\n",
| ~~^
| |
| long int
| %d


vim +343 drivers/hid/hid-logitech-hidpp.c

333
334 static int hidpp_send_fap_command_sync(struct hidpp_device *hidpp,
335 u8 feat_index, u8 funcindex_clientid, u8 *params, int param_count,
336 struct hidpp_report *response)
337 {
338 struct hidpp_report *message;
339 int ret;
340
341 if (param_count > sizeof(message->fap.params)) {
342 hid_dbg(hidpp->hid_dev,
> 343 "Invalid number of parameters passed to command (%d != %ld)\n",
344 param_count, sizeof(message->fap.params));
345 return -EINVAL;
346 }
347
348 message = kzalloc(sizeof(struct hidpp_report), GFP_KERNEL);
349 if (!message)
350 return -ENOMEM;
351
352 if (param_count > (HIDPP_REPORT_LONG_LENGTH - 4))
353 message->report_id = REPORT_ID_HIDPP_VERY_LONG;
354 else
355 message->report_id = REPORT_ID_HIDPP_LONG;
356 message->fap.feature_index = feat_index;
357 message->fap.funcindex_clientid = funcindex_clientid | LINUX_KERNEL_SW_ID;
358 memcpy(&message->fap.params, params, param_count);
359
360 ret = hidpp_send_message_sync(hidpp, message, response);
361 kfree(message);
362 return ret;
363 }
364

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests