linux-input.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] HID: logitech-hidpp: Add more debug statements
@ 2023-02-06 13:58 Bastien Nocera
  2023-02-06 13:58 ` [PATCH 2/3] HID: logitech-hidpp: Retry commands when device is busy Bastien Nocera
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Bastien Nocera @ 2023-02-06 13:58 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Benjamin Tissoires,
	Peter F . Patel-Schneider, Filipe Laíns,
	Nestor Lopez Casado

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

Signed-off-by: Bastien Nocera <hadess@hadess.net>
---
 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/3] HID: logitech-hidpp: Retry commands when device is busy
  2023-02-06 13:58 [PATCH 1/3] HID: logitech-hidpp: Add more debug statements Bastien Nocera
@ 2023-02-06 13:58 ` Bastien Nocera
  2023-02-06 13:58 ` [PATCH 3/3] HID: logitech-hidpp: Add myself to authors Bastien Nocera
  2023-02-06 16:53 ` [PATCH 1/3] HID: logitech-hidpp: Add more debug statements kernel test robot
  2 siblings, 0 replies; 4+ messages in thread
From: Bastien Nocera @ 2023-02-06 13:58 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Benjamin Tissoires,
	Peter F . Patel-Schneider, Filipe Laíns,
	Nestor Lopez Casado

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 <hadess@hadess.net>
---
 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


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 3/3] HID: logitech-hidpp: Add myself to authors
  2023-02-06 13:58 [PATCH 1/3] HID: logitech-hidpp: Add more debug statements Bastien Nocera
  2023-02-06 13:58 ` [PATCH 2/3] HID: logitech-hidpp: Retry commands when device is busy Bastien Nocera
@ 2023-02-06 13:58 ` Bastien Nocera
  2023-02-06 16:53 ` [PATCH 1/3] HID: logitech-hidpp: Add more debug statements kernel test robot
  2 siblings, 0 replies; 4+ messages in thread
From: Bastien Nocera @ 2023-02-06 13:58 UTC (permalink / raw)
  To: linux-input
  Cc: linux-kernel, Jiri Kosina, Benjamin Tissoires,
	Peter F . Patel-Schneider, Filipe Laíns,
	Nestor Lopez Casado

Signed-off-by: Bastien Nocera <hadess@hadess.net>
---
 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 <benjamin.tissoires@gmail.com>");
 MODULE_AUTHOR("Nestor Lopez Casado <nlopezcasad@logitech.com>");
+MODULE_AUTHOR("Bastien Nocera <hadess@hadess.net>");
 
 static bool disable_tap_to_click;
 module_param(disable_tap_to_click, bool, 0644);
-- 
2.39.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/3] HID: logitech-hidpp: Add more debug statements
  2023-02-06 13:58 [PATCH 1/3] HID: logitech-hidpp: Add more debug statements Bastien Nocera
  2023-02-06 13:58 ` [PATCH 2/3] HID: logitech-hidpp: Retry commands when device is busy Bastien Nocera
  2023-02-06 13:58 ` [PATCH 3/3] HID: logitech-hidpp: Add myself to authors Bastien Nocera
@ 2023-02-06 16:53 ` kernel test robot
  2 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2023-02-06 16:53 UTC (permalink / raw)
  To: Bastien Nocera, linux-input
  Cc: oe-kbuild-all, linux-kernel, Jiri Kosina, Benjamin Tissoires,
	Peter F . Patel-Schneider, Filipe Laíns,
	Nestor Lopez Casado

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/202302070034.GqDB3Cje-lkp@intel.com/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 <lkp@intel.com>

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2023-02-06 16:54 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-06 13:58 [PATCH 1/3] HID: logitech-hidpp: Add more debug statements Bastien Nocera
2023-02-06 13:58 ` [PATCH 2/3] HID: logitech-hidpp: Retry commands when device is busy Bastien Nocera
2023-02-06 13:58 ` [PATCH 3/3] HID: logitech-hidpp: Add myself to authors Bastien Nocera
2023-02-06 16:53 ` [PATCH 1/3] HID: logitech-hidpp: Add more debug statements kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).