From: kernel test robot <lkp@intel.com>
To: Andrea Merello <andrea.merello@gmail.com>,
jic23@kernel.org, mchehab+huawei@kernel.org,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org
Cc: kbuild-all@lists.01.org, lars@metafoo.de, robh+dt@kernel.org,
andy.shevchenko@gmail.com, matt.ranostay@konsulko.com,
ardeleanalex@gmail.com, jacopo@jmondi.org,
Andrea Merello <andrea.merello@gmail.com>
Subject: Re: [v3 11/13] iio: imu: add BNO055 serdev driver
Date: Fri, 18 Feb 2022 03:47:43 +0800 [thread overview]
Message-ID: <202202180353.lRcys4tc-lkp@intel.com> (raw)
In-Reply-To: <20220217162710.33615-12-andrea.merello@gmail.com>
Hi Andrea,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on jic23-iio/togreg]
[also build test WARNING on linux/master linus/master v5.17-rc4 next-20220217]
[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]
url: https://github.com/0day-ci/linux/commits/Andrea-Merello/Add-support-for-Bosch-BNO055-IMU/20220218-002932
base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
config: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20220218/202202180353.lRcys4tc-lkp@intel.com/config)
compiler: alpha-linux-gcc (GCC) 11.2.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/0day-ci/linux/commit/98d7db4486f0404718da9e85ae13da54d757104b
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Andrea-Merello/Add-support-for-Bosch-BNO055-IMU/20220218-002932
git checkout 98d7db4486f0404718da9e85ae13da54d757104b
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=alpha SHELL=/bin/bash drivers/iio/imu/bno055/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/iio/imu/bno055/bno055.c:285:5: warning: no previous prototype for 'bno055_calibration_load' [-Wmissing-prototypes]
285 | int bno055_calibration_load(struct bno055_priv *priv, const u8 *data, int len)
| ^~~~~~~~~~~~~~~~~~~~~~~
In file included from include/linux/printk.h:555,
from include/linux/kernel.h:29,
from include/linux/clk.h:13,
from drivers/iio/imu/bno055/bno055.c:18:
drivers/iio/imu/bno055/bno055.c: In function 'bno055_calibration_load':
>> drivers/iio/imu/bno055/bno055.c:288:36: warning: format '%zu' expects argument of type 'size_t', but argument 4 has type 'int' [-Wformat=]
288 | dev_dbg(priv->dev, "Invalid calibration file size %zu (expected %d)",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _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__)
| ^~~~~~~
drivers/iio/imu/bno055/bno055.c:288:17: note: in expansion of macro 'dev_dbg'
288 | dev_dbg(priv->dev, "Invalid calibration file size %zu (expected %d)",
| ^~~~~~~
drivers/iio/imu/bno055/bno055.c:288:69: note: format string is defined here
288 | dev_dbg(priv->dev, "Invalid calibration file size %zu (expected %d)",
| ~~^
| |
| long unsigned int
| %u
drivers/iio/imu/bno055/bno055.c: At top level:
>> drivers/iio/imu/bno055/bno055.c:748:5: warning: no previous prototype for 'bno055_sysfs_attr_avail' [-Wmissing-prototypes]
748 | int bno055_sysfs_attr_avail(struct bno055_priv *priv, struct bno055_sysfs_attr *attr,
| ^~~~~~~~~~~~~~~~~~~~~~~
>> drivers/iio/imu/bno055/bno055.c:1203:5: warning: no previous prototype for 'bno055_debugfs_reg_access' [-Wmissing-prototypes]
1203 | int bno055_debugfs_reg_access(struct iio_dev *iio_dev, unsigned int reg,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
--
In file included from include/linux/device.h:15,
from drivers/iio/imu/bno055/bno055_sl.c:18:
drivers/iio/imu/bno055/bno055_sl.c: In function 'bno055_sl_read_reg':
>> drivers/iio/imu/bno055/bno055_sl.c:305:45: warning: format '%d' expects argument of type 'int', but argument 3 has type 'size_t' {aka 'long unsigned int'} [-Wformat=]
305 | dev_err(&priv->serdev->dev, "Invalid read valsize %d",
| ^~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~
include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt'
144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:305:17: note: in expansion of macro 'dev_err'
305 | dev_err(&priv->serdev->dev, "Invalid read valsize %d",
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:305:68: note: format string is defined here
305 | dev_err(&priv->serdev->dev, "Invalid read valsize %d",
| ~^
| |
| int
| %ld
In file included from include/linux/printk.h:555,
from include/asm-generic/bug.h:22,
from arch/alpha/include/asm/bug.h:23,
from include/linux/bug.h:5,
from include/linux/thread_info.h:13,
from include/asm-generic/preempt.h:5,
from ./arch/alpha/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:78,
from include/linux/spinlock.h:55,
from include/linux/swait.h:7,
from include/linux/completion.h:12,
from drivers/iio/imu/bno055/bno055_sl.c:17:
drivers/iio/imu/bno055/bno055_sl.c:311:37: warning: format '%d' expects argument of type 'int', but argument 5 has type 'size_t' {aka 'long unsigned int'} [-Wformat=]
311 | dev_dbg(&priv->serdev->dev, "rd reg 0x%x (len %d)", reg_addr, val_size);
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _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__)
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:311:9: note: in expansion of macro 'dev_dbg'
311 | dev_dbg(&priv->serdev->dev, "rd reg 0x%x (len %d)", reg_addr, val_size);
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:311:56: note: format string is defined here
311 | dev_dbg(&priv->serdev->dev, "rd reg 0x%x (len %d)", reg_addr, val_size);
| ~^
| |
| int
| %ld
In file included from include/linux/printk.h:555,
from include/asm-generic/bug.h:22,
from arch/alpha/include/asm/bug.h:23,
from include/linux/bug.h:5,
from include/linux/thread_info.h:13,
from include/asm-generic/preempt.h:5,
from ./arch/alpha/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:78,
from include/linux/spinlock.h:55,
from include/linux/swait.h:7,
from include/linux/completion.h:12,
from drivers/iio/imu/bno055/bno055_sl.c:17:
drivers/iio/imu/bno055/bno055_sl.c: In function 'bno055_sl_receive_buf':
>> drivers/iio/imu/bno055/bno055_sl.c:387:37: warning: field width specifier '*' expects argument of type 'int', but argument 5 has type 'size_t' {aka 'long unsigned int'} [-Wformat=]
387 | dev_dbg(&priv->serdev->dev, "recv (len %zu): %*ph ", size, size, buf);
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _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__)
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:387:9: note: in expansion of macro 'dev_dbg'
387 | dev_dbg(&priv->serdev->dev, "recv (len %zu): %*ph ", size, size, buf);
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:387:55: note: format string is defined here
387 | dev_dbg(&priv->serdev->dev, "recv (len %zu): %*ph ", size, size, buf);
| ~^~
| |
| int
vim +305 drivers/iio/imu/bno055/bno055_sl.c
295
296 static int bno055_sl_read_reg(void *context,
297 const void *reg, size_t reg_size,
298 void *val, size_t val_size)
299 {
300 int ret;
301 int reg_addr;
302 struct bno055_sl_priv *priv = context;
303
304 if (val_size > 128) {
> 305 dev_err(&priv->serdev->dev, "Invalid read valsize %d",
306 val_size);
307 return -EINVAL;
308 }
309
310 reg_addr = ((u8 *)reg)[0];
311 dev_dbg(&priv->serdev->dev, "rd reg 0x%x (len %d)", reg_addr, val_size);
312 mutex_lock(&priv->lock);
313 priv->expected_data_len = val_size;
314 priv->response_buf = val;
315 mutex_unlock(&priv->lock);
316
317 ret = bno_sl_send_cmd(priv, 1, reg_addr, val_size, NULL);
318
319 mutex_lock(&priv->lock);
320 priv->response_buf = NULL;
321 mutex_unlock(&priv->lock);
322
323 return ret;
324 }
325
326 /*
327 * Handler for received data; this is called from the reicever callback whenever
328 * it got some packet from the serial bus. The status tell us whether the
329 * packet is valid (i.e. header ok && received payload len consistent wrt the
330 * header). It's now our responsability to check whether this is what we
331 * expected, of whether we got some unexpected, yet valid, packet.
332 */
333 static void bno055_sl_handle_rx(struct bno055_sl_priv *priv, int status)
334 {
335 mutex_lock(&priv->lock);
336 switch (priv->expect_response) {
337 case CMD_NONE:
338 dev_warn(&priv->serdev->dev, "received unexpected, yet valid, data from sensor");
339 mutex_unlock(&priv->lock);
340 return;
341
342 case CMD_READ:
343 priv->cmd_status = status;
344 if (status == STATUS_OK &&
345 priv->rx.databuf_count != priv->expected_data_len) {
346 /*
347 * If we got here, then the lower layer serial protocol
348 * seems consistent with itself; if we got an unexpected
349 * amount of data then signal it as a non critical error
350 */
351 priv->cmd_status = STATUS_FAIL;
352 dev_warn(&priv->serdev->dev, "received an unexpected amount of, yet valid, data from sensor");
353 }
354 break;
355
356 case CMD_WRITE:
357 priv->cmd_status = status;
358 break;
359 }
360
361 priv->expect_response = CMD_NONE;
362 complete(&priv->cmd_complete);
363 mutex_unlock(&priv->lock);
364 }
365
366 /*
367 * Serdev receiver FSM. This tracks the serial communication and parse the
368 * header. It pushes packets to bno055_sl_handle_rx(), eventually communicating
369 * failures (i.e. malformed packets).
370 * Ideally it doesn't know anything about upper layer (i.e. if this is the
371 * packet we were really expecting), but since we copies the payload into the
372 * receiver buffer (that is not valid when i.e. we don't expect data), we
373 * snoop a bit in the upper layer..
374 * Also, we assume to RX one pkt per time (i.e. the HW doesn't send anything
375 * unless we require to AND we don't queue more than one request per time).
376 */
377 static int bno055_sl_receive_buf(struct serdev_device *serdev,
378 const unsigned char *buf, size_t size)
379 {
380 int status;
381 struct bno055_sl_priv *priv = serdev_device_get_drvdata(serdev);
382 int remaining = size;
383
384 if (size == 0)
385 return 0;
386
> 387 dev_dbg(&priv->serdev->dev, "recv (len %zu): %*ph ", size, size, buf);
388 switch (priv->rx.state) {
389 case RX_IDLE:
390 /*
391 * New packet.
392 * Check for its 1st byte, that identifies the pkt type.
393 */
394 if (buf[0] != 0xEE && buf[0] != 0xBB) {
395 dev_err(&priv->serdev->dev,
396 "Invalid packet start %x", buf[0]);
397 bno055_sl_handle_rx(priv, STATUS_CRIT);
398 break;
399 }
400 priv->rx.type = buf[0];
401 priv->rx.state = RX_START;
402 remaining--;
403 buf++;
404 priv->rx.databuf_count = 0;
405 fallthrough;
406
407 case RX_START:
408 /*
409 * Packet RX in progress, we expect either 1-byte len or 1-byte
410 * status depending by the packet type.
411 */
412 if (remaining == 0)
413 break;
414
415 if (priv->rx.type == 0xEE) {
416 if (remaining > 1) {
417 dev_err(&priv->serdev->dev, "EE pkt. Extra data received");
418 status = STATUS_CRIT;
419
420 } else {
421 status = (buf[0] == 1) ? STATUS_OK : STATUS_FAIL;
422 }
423 bno055_sl_handle_rx(priv, status);
424 priv->rx.state = RX_IDLE;
425 break;
426
427 } else {
428 /*priv->rx.type == 0xBB */
429 priv->rx.state = RX_DATA;
430 priv->rx.expected_len = buf[0];
431 remaining--;
432 buf++;
433 }
434 fallthrough;
435
436 case RX_DATA:
437 /* Header parsed; now receiving packet data payload */
438 if (remaining == 0)
439 break;
440
441 if (priv->rx.databuf_count + remaining > priv->rx.expected_len) {
442 /*
443 * This is a inconsistency in serial protocol, we lost
444 * sync and we don't know how to handle further data
445 */
446 dev_err(&priv->serdev->dev, "BB pkt. Extra data received");
447 bno055_sl_handle_rx(priv, STATUS_CRIT);
448 priv->rx.state = RX_IDLE;
449 break;
450 }
451
452 mutex_lock(&priv->lock);
453 /*
454 * NULL e.g. when read cmd is stale or when no read cmd is
455 * actually pending.
456 */
457 if (priv->response_buf &&
458 /*
459 * Snoop on the upper layer protocol stuff to make sure not
460 * to write to an invalid memory. Apart for this, let's the
461 * upper layer manage any inconsistency wrt expected data
462 * len (as long as the serial protocol is consistent wrt
463 * itself (i.e. response header is consistent with received
464 * response len.
465 */
466 (priv->rx.databuf_count + remaining <= priv->expected_data_len))
467 memcpy(priv->response_buf + priv->rx.databuf_count,
468 buf, remaining);
469 mutex_unlock(&priv->lock);
470
471 priv->rx.databuf_count += remaining;
472
473 /*
474 * Reached expected len advertised by the IMU for the current
475 * packet. Pass it to the upper layer (for us it is just valid).
476 */
477 if (priv->rx.databuf_count == priv->rx.expected_len) {
478 bno055_sl_handle_rx(priv, STATUS_OK);
479 priv->rx.state = RX_IDLE;
480 }
481 break;
482 }
483
484 return size;
485 }
486
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: Re: [v3 11/13] iio: imu: add BNO055 serdev driver
Date: Fri, 18 Feb 2022 03:47:43 +0800 [thread overview]
Message-ID: <202202180353.lRcys4tc-lkp@intel.com> (raw)
In-Reply-To: <20220217162710.33615-12-andrea.merello@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 18474 bytes --]
Hi Andrea,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on jic23-iio/togreg]
[also build test WARNING on linux/master linus/master v5.17-rc4 next-20220217]
[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]
url: https://github.com/0day-ci/linux/commits/Andrea-Merello/Add-support-for-Bosch-BNO055-IMU/20220218-002932
base: https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
config: alpha-allyesconfig (https://download.01.org/0day-ci/archive/20220218/202202180353.lRcys4tc-lkp(a)intel.com/config)
compiler: alpha-linux-gcc (GCC) 11.2.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/0day-ci/linux/commit/98d7db4486f0404718da9e85ae13da54d757104b
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Andrea-Merello/Add-support-for-Bosch-BNO055-IMU/20220218-002932
git checkout 98d7db4486f0404718da9e85ae13da54d757104b
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=alpha SHELL=/bin/bash drivers/iio/imu/bno055/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/iio/imu/bno055/bno055.c:285:5: warning: no previous prototype for 'bno055_calibration_load' [-Wmissing-prototypes]
285 | int bno055_calibration_load(struct bno055_priv *priv, const u8 *data, int len)
| ^~~~~~~~~~~~~~~~~~~~~~~
In file included from include/linux/printk.h:555,
from include/linux/kernel.h:29,
from include/linux/clk.h:13,
from drivers/iio/imu/bno055/bno055.c:18:
drivers/iio/imu/bno055/bno055.c: In function 'bno055_calibration_load':
>> drivers/iio/imu/bno055/bno055.c:288:36: warning: format '%zu' expects argument of type 'size_t', but argument 4 has type 'int' [-Wformat=]
288 | dev_dbg(priv->dev, "Invalid calibration file size %zu (expected %d)",
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _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__)
| ^~~~~~~
drivers/iio/imu/bno055/bno055.c:288:17: note: in expansion of macro 'dev_dbg'
288 | dev_dbg(priv->dev, "Invalid calibration file size %zu (expected %d)",
| ^~~~~~~
drivers/iio/imu/bno055/bno055.c:288:69: note: format string is defined here
288 | dev_dbg(priv->dev, "Invalid calibration file size %zu (expected %d)",
| ~~^
| |
| long unsigned int
| %u
drivers/iio/imu/bno055/bno055.c: At top level:
>> drivers/iio/imu/bno055/bno055.c:748:5: warning: no previous prototype for 'bno055_sysfs_attr_avail' [-Wmissing-prototypes]
748 | int bno055_sysfs_attr_avail(struct bno055_priv *priv, struct bno055_sysfs_attr *attr,
| ^~~~~~~~~~~~~~~~~~~~~~~
>> drivers/iio/imu/bno055/bno055.c:1203:5: warning: no previous prototype for 'bno055_debugfs_reg_access' [-Wmissing-prototypes]
1203 | int bno055_debugfs_reg_access(struct iio_dev *iio_dev, unsigned int reg,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
--
In file included from include/linux/device.h:15,
from drivers/iio/imu/bno055/bno055_sl.c:18:
drivers/iio/imu/bno055/bno055_sl.c: In function 'bno055_sl_read_reg':
>> drivers/iio/imu/bno055/bno055_sl.c:305:45: warning: format '%d' expects argument of type 'int', but argument 3 has type 'size_t' {aka 'long unsigned int'} [-Wformat=]
305 | dev_err(&priv->serdev->dev, "Invalid read valsize %d",
| ^~~~~~~~~~~~~~~~~~~~~~~~~
include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
110 | _p_func(dev, fmt, ##__VA_ARGS__); \
| ^~~
include/linux/dev_printk.h:144:56: note: in expansion of macro 'dev_fmt'
144 | dev_printk_index_wrap(_dev_err, KERN_ERR, dev, dev_fmt(fmt), ##__VA_ARGS__)
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:305:17: note: in expansion of macro 'dev_err'
305 | dev_err(&priv->serdev->dev, "Invalid read valsize %d",
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:305:68: note: format string is defined here
305 | dev_err(&priv->serdev->dev, "Invalid read valsize %d",
| ~^
| |
| int
| %ld
In file included from include/linux/printk.h:555,
from include/asm-generic/bug.h:22,
from arch/alpha/include/asm/bug.h:23,
from include/linux/bug.h:5,
from include/linux/thread_info.h:13,
from include/asm-generic/preempt.h:5,
from ./arch/alpha/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:78,
from include/linux/spinlock.h:55,
from include/linux/swait.h:7,
from include/linux/completion.h:12,
from drivers/iio/imu/bno055/bno055_sl.c:17:
drivers/iio/imu/bno055/bno055_sl.c:311:37: warning: format '%d' expects argument of type 'int', but argument 5 has type 'size_t' {aka 'long unsigned int'} [-Wformat=]
311 | dev_dbg(&priv->serdev->dev, "rd reg 0x%x (len %d)", reg_addr, val_size);
| ^~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _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__)
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:311:9: note: in expansion of macro 'dev_dbg'
311 | dev_dbg(&priv->serdev->dev, "rd reg 0x%x (len %d)", reg_addr, val_size);
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:311:56: note: format string is defined here
311 | dev_dbg(&priv->serdev->dev, "rd reg 0x%x (len %d)", reg_addr, val_size);
| ~^
| |
| int
| %ld
In file included from include/linux/printk.h:555,
from include/asm-generic/bug.h:22,
from arch/alpha/include/asm/bug.h:23,
from include/linux/bug.h:5,
from include/linux/thread_info.h:13,
from include/asm-generic/preempt.h:5,
from ./arch/alpha/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:78,
from include/linux/spinlock.h:55,
from include/linux/swait.h:7,
from include/linux/completion.h:12,
from drivers/iio/imu/bno055/bno055_sl.c:17:
drivers/iio/imu/bno055/bno055_sl.c: In function 'bno055_sl_receive_buf':
>> drivers/iio/imu/bno055/bno055_sl.c:387:37: warning: field width specifier '*' expects argument of type 'int', but argument 5 has type 'size_t' {aka 'long unsigned int'} [-Wformat=]
387 | dev_dbg(&priv->serdev->dev, "recv (len %zu): %*ph ", size, size, buf);
| ^~~~~~~~~~~~~~~~~~~~~~~
include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
134 | func(&id, ##__VA_ARGS__); \
| ^~~~~~~~~~~
include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
166 | _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__)
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:387:9: note: in expansion of macro 'dev_dbg'
387 | dev_dbg(&priv->serdev->dev, "recv (len %zu): %*ph ", size, size, buf);
| ^~~~~~~
drivers/iio/imu/bno055/bno055_sl.c:387:55: note: format string is defined here
387 | dev_dbg(&priv->serdev->dev, "recv (len %zu): %*ph ", size, size, buf);
| ~^~
| |
| int
vim +305 drivers/iio/imu/bno055/bno055_sl.c
295
296 static int bno055_sl_read_reg(void *context,
297 const void *reg, size_t reg_size,
298 void *val, size_t val_size)
299 {
300 int ret;
301 int reg_addr;
302 struct bno055_sl_priv *priv = context;
303
304 if (val_size > 128) {
> 305 dev_err(&priv->serdev->dev, "Invalid read valsize %d",
306 val_size);
307 return -EINVAL;
308 }
309
310 reg_addr = ((u8 *)reg)[0];
311 dev_dbg(&priv->serdev->dev, "rd reg 0x%x (len %d)", reg_addr, val_size);
312 mutex_lock(&priv->lock);
313 priv->expected_data_len = val_size;
314 priv->response_buf = val;
315 mutex_unlock(&priv->lock);
316
317 ret = bno_sl_send_cmd(priv, 1, reg_addr, val_size, NULL);
318
319 mutex_lock(&priv->lock);
320 priv->response_buf = NULL;
321 mutex_unlock(&priv->lock);
322
323 return ret;
324 }
325
326 /*
327 * Handler for received data; this is called from the reicever callback whenever
328 * it got some packet from the serial bus. The status tell us whether the
329 * packet is valid (i.e. header ok && received payload len consistent wrt the
330 * header). It's now our responsability to check whether this is what we
331 * expected, of whether we got some unexpected, yet valid, packet.
332 */
333 static void bno055_sl_handle_rx(struct bno055_sl_priv *priv, int status)
334 {
335 mutex_lock(&priv->lock);
336 switch (priv->expect_response) {
337 case CMD_NONE:
338 dev_warn(&priv->serdev->dev, "received unexpected, yet valid, data from sensor");
339 mutex_unlock(&priv->lock);
340 return;
341
342 case CMD_READ:
343 priv->cmd_status = status;
344 if (status == STATUS_OK &&
345 priv->rx.databuf_count != priv->expected_data_len) {
346 /*
347 * If we got here, then the lower layer serial protocol
348 * seems consistent with itself; if we got an unexpected
349 * amount of data then signal it as a non critical error
350 */
351 priv->cmd_status = STATUS_FAIL;
352 dev_warn(&priv->serdev->dev, "received an unexpected amount of, yet valid, data from sensor");
353 }
354 break;
355
356 case CMD_WRITE:
357 priv->cmd_status = status;
358 break;
359 }
360
361 priv->expect_response = CMD_NONE;
362 complete(&priv->cmd_complete);
363 mutex_unlock(&priv->lock);
364 }
365
366 /*
367 * Serdev receiver FSM. This tracks the serial communication and parse the
368 * header. It pushes packets to bno055_sl_handle_rx(), eventually communicating
369 * failures (i.e. malformed packets).
370 * Ideally it doesn't know anything about upper layer (i.e. if this is the
371 * packet we were really expecting), but since we copies the payload into the
372 * receiver buffer (that is not valid when i.e. we don't expect data), we
373 * snoop a bit in the upper layer..
374 * Also, we assume to RX one pkt per time (i.e. the HW doesn't send anything
375 * unless we require to AND we don't queue more than one request per time).
376 */
377 static int bno055_sl_receive_buf(struct serdev_device *serdev,
378 const unsigned char *buf, size_t size)
379 {
380 int status;
381 struct bno055_sl_priv *priv = serdev_device_get_drvdata(serdev);
382 int remaining = size;
383
384 if (size == 0)
385 return 0;
386
> 387 dev_dbg(&priv->serdev->dev, "recv (len %zu): %*ph ", size, size, buf);
388 switch (priv->rx.state) {
389 case RX_IDLE:
390 /*
391 * New packet.
392 * Check for its 1st byte, that identifies the pkt type.
393 */
394 if (buf[0] != 0xEE && buf[0] != 0xBB) {
395 dev_err(&priv->serdev->dev,
396 "Invalid packet start %x", buf[0]);
397 bno055_sl_handle_rx(priv, STATUS_CRIT);
398 break;
399 }
400 priv->rx.type = buf[0];
401 priv->rx.state = RX_START;
402 remaining--;
403 buf++;
404 priv->rx.databuf_count = 0;
405 fallthrough;
406
407 case RX_START:
408 /*
409 * Packet RX in progress, we expect either 1-byte len or 1-byte
410 * status depending by the packet type.
411 */
412 if (remaining == 0)
413 break;
414
415 if (priv->rx.type == 0xEE) {
416 if (remaining > 1) {
417 dev_err(&priv->serdev->dev, "EE pkt. Extra data received");
418 status = STATUS_CRIT;
419
420 } else {
421 status = (buf[0] == 1) ? STATUS_OK : STATUS_FAIL;
422 }
423 bno055_sl_handle_rx(priv, status);
424 priv->rx.state = RX_IDLE;
425 break;
426
427 } else {
428 /*priv->rx.type == 0xBB */
429 priv->rx.state = RX_DATA;
430 priv->rx.expected_len = buf[0];
431 remaining--;
432 buf++;
433 }
434 fallthrough;
435
436 case RX_DATA:
437 /* Header parsed; now receiving packet data payload */
438 if (remaining == 0)
439 break;
440
441 if (priv->rx.databuf_count + remaining > priv->rx.expected_len) {
442 /*
443 * This is a inconsistency in serial protocol, we lost
444 * sync and we don't know how to handle further data
445 */
446 dev_err(&priv->serdev->dev, "BB pkt. Extra data received");
447 bno055_sl_handle_rx(priv, STATUS_CRIT);
448 priv->rx.state = RX_IDLE;
449 break;
450 }
451
452 mutex_lock(&priv->lock);
453 /*
454 * NULL e.g. when read cmd is stale or when no read cmd is
455 * actually pending.
456 */
457 if (priv->response_buf &&
458 /*
459 * Snoop on the upper layer protocol stuff to make sure not
460 * to write to an invalid memory. Apart for this, let's the
461 * upper layer manage any inconsistency wrt expected data
462 * len (as long as the serial protocol is consistent wrt
463 * itself (i.e. response header is consistent with received
464 * response len.
465 */
466 (priv->rx.databuf_count + remaining <= priv->expected_data_len))
467 memcpy(priv->response_buf + priv->rx.databuf_count,
468 buf, remaining);
469 mutex_unlock(&priv->lock);
470
471 priv->rx.databuf_count += remaining;
472
473 /*
474 * Reached expected len advertised by the IMU for the current
475 * packet. Pass it to the upper layer (for us it is just valid).
476 */
477 if (priv->rx.databuf_count == priv->rx.expected_len) {
478 bno055_sl_handle_rx(priv, STATUS_OK);
479 priv->rx.state = RX_IDLE;
480 }
481 break;
482 }
483
484 return size;
485 }
486
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
next prev parent reply other threads:[~2022-02-17 19:48 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-17 16:26 [v3 00/13] Add support for Bosch BNO055 IMU Andrea Merello
2022-02-17 16:26 ` [v3 01/13] iio: add modifiers for linear acceleration Andrea Merello
2022-02-17 16:26 ` [v3 02/13] iio: document linear acceleration modifiers Andrea Merello
2022-02-19 16:08 ` Jonathan Cameron
2022-02-17 16:27 ` [v3 03/13] iio: event_monitor: add " Andrea Merello
2022-02-17 16:27 ` [v3 04/13] iio: add modifers for pitch, yaw, roll Andrea Merello
2022-02-17 16:27 ` [v3 05/13] iio: document pitch, yaw, roll modifiers Andrea Merello
2022-02-19 16:31 ` Jonathan Cameron
2022-02-17 16:27 ` [v3 06/13] iio: event_monitor: add pitch, yaw and " Andrea Merello
2022-02-17 16:27 ` [v3 07/13] iio: imu: add Bosch Sensortec BNO055 core driver Andrea Merello
2022-02-17 21:58 ` Peter Meerwald-Stadler
2022-02-19 17:41 ` Jonathan Cameron
2022-03-22 10:27 ` Andrea Merello
2022-03-27 16:11 ` Jonathan Cameron
2022-03-28 13:02 ` Greg Kroah-Hartman
2022-04-04 6:30 ` Andrea Merello
2022-04-04 7:54 ` Greg Kroah-Hartman
2022-03-22 10:14 ` Andrea Merello
2022-02-17 16:27 ` [v3 08/13] iio: document bno055 private sysfs attributes Andrea Merello
2022-02-19 16:50 ` Jonathan Cameron
2022-02-17 16:27 ` [v3 09/13] iio: document "serial_number" sysfs attribute Andrea Merello
2022-02-19 16:52 ` Jonathan Cameron
2022-02-17 16:27 ` [v3 10/13] dt-bindings: iio: imu: add documentation for Bosch BNO055 bindings Andrea Merello
2022-02-24 19:54 ` Rob Herring
2022-02-17 16:27 ` [v3 11/13] iio: imu: add BNO055 serdev driver Andrea Merello
2022-02-17 19:47 ` kernel test robot [this message]
2022-02-17 19:47 ` kernel test robot
2022-02-18 5:20 ` kernel test robot
2022-02-18 5:20 ` kernel test robot
2022-02-21 20:27 ` Andy Shevchenko
2022-03-22 10:37 ` Andrea Merello
2022-02-17 16:27 ` [v3 12/13] iio: imu: add BNO055 I2C driver Andrea Merello
2022-02-19 17:03 ` Jonathan Cameron
2022-02-21 20:32 ` Andy Shevchenko
2022-02-17 16:27 ` [v3 13/13] docs: iio: add documentation for BNO055 driver Andrea Merello
2022-02-19 17:06 ` Jonathan Cameron
2022-03-22 10:30 ` Andrea Merello
2022-03-22 20:32 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202202180353.lRcys4tc-lkp@intel.com \
--to=lkp@intel.com \
--cc=andrea.merello@gmail.com \
--cc=andy.shevchenko@gmail.com \
--cc=ardeleanalex@gmail.com \
--cc=devicetree@vger.kernel.org \
--cc=jacopo@jmondi.org \
--cc=jic23@kernel.org \
--cc=kbuild-all@lists.01.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=matt.ranostay@konsulko.com \
--cc=mchehab+huawei@kernel.org \
--cc=robh+dt@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.