From nobody Fri Apr 3 17:32:59 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B3B7B3D811A for ; Tue, 24 Mar 2026 08:47:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774342058; cv=none; b=ngJvihyQgRc+7fEQjEjzPcoggZhCPlO/F1J/E1d/tQ6nGaaIhM+uEd6cO1P7b3zWUZKvD58ciiplyZiDESppUszN8GAR+CV203ouZA8ROWtZNb08shvtcRB+8drOS7nwO8JnMVOSLMjmQLQDBZxQ8Hq++f6ez5pbZMRneGhvS14= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774342058; c=relaxed/simple; bh=LhhuQW+kXumxf4ZHnfybInW36mhcntwwfWxHRNAL3MI=; h=From:To:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=p8l+TnUJ0SmiaBBNBr2yP7TBRs03lrUm692OYA1BuDV3qkB+aytw4ZoDRCwVSPwOAMfKmaB90wEcMdyGFzZ5mMXeT/0EfAkJjKAyh31SiwQS11yGXsJ5r/xHVzGvQWpoxxDDKRBtO5lp1MSXnvK2vgWmBwmIB84ItJhuBi0tYYg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com; spf=pass smtp.mailfrom=baylibre.com; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b=2vag2aFf; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=baylibre.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=baylibre.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=baylibre-com.20230601.gappssmtp.com header.i=@baylibre-com.20230601.gappssmtp.com header.b="2vag2aFf" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4870206f73bso20681745e9.3 for ; Tue, 24 Mar 2026 01:47:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20230601.gappssmtp.com; s=20230601; t=1774342055; x=1774946855; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=D6Ly+Y1OaGrVPqGuh6+YPQYhQbgbR6xEfPk5ktqV5IQ=; b=2vag2aFfDgWe2MSYJMaX/FTfJPtLNUnY5FjFHKiPa5MjdQo9Y9IMXJbDCGmwj97OXC pLAWLzCf1fYvHz4pc9zwNELSsNw8KWUIsVfceJArYz2Rmffk5hJo16OYB14E76iplX8V BcjoSwm+WUFBrgt5ESvPZUO/mA8N0mvzYdXs4eVUj2xNBwbjByq3mCqSlHzM8lvOdyGo a/oVdkq40uwjWYVN0wujWk/ADfZ/eahkoufcynX3g58oVVVwFDzn82bg6/SuCcBF3o+K Zk1Fv6xwqYdQHUtaCytIEVHwTLkl71ryfrACqV78LTJGDTQ0S069/l65qemHadvpT7Ai dhOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774342055; x=1774946855; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=D6Ly+Y1OaGrVPqGuh6+YPQYhQbgbR6xEfPk5ktqV5IQ=; b=mT3xkMrFS3rf7rMGLV851MKKO776xlUvrw8bKADXG1w0X8yI3tZOd13OoqEtCTwzY5 wOnz6MMeWdLW56ZzKUxdsuohvjoPfZrObXmAcby7p+O/arQ0OwkbTxj8usIlWbsoB3KZ cNVGtFMA61z0/eAViwx1lFswUweaZQl+bvCxA44Mbic13E2D3jKOrw2v173UjySbq7WT YDSauy9YQud9VrbnykR9AgdsGD0tzJYVrbX5hjq581MjVduhdbopmuyRzvNcODzNzs8p 80zRTz9IixRQwsVjxboTOawceCa9WjVp+upBPVzAtRyROF1ZzmHGJFc4c+T3m5usYJhi JS/A== X-Forwarded-Encrypted: i=1; AJvYcCWT23g+42kOpiw2+i45sXhIIMQ9nF7QLI5aRAHVKivHjRwn7NTeejZxGaUgmDIzM+B4zSz/w1eNi/tZecU=@vger.kernel.org X-Gm-Message-State: AOJu0Yz9ClBfB6oRHLzI12K4apajoVNn17mIaSl3l5Q1vDoxnYz4Z2GN AvNMdRr7d03Z9pEQQDiVqHpyaP3oam1ncm+jd5iutfAz4i/B4sxWebcgp3FB+KAVgF0= X-Gm-Gg: ATEYQzyJFtNClr+zh5T4/AZM2aEZFKs55hZ/LsicBuWigY/voMoFw3JFGHr1Y+mO0an Y7f25MHSXhTXLlI8BWlh0/1sgXbHCgFw0Il3y+xaB5d7zI5isC+uElKMMSBQrSlgpYJyu745PCq dvqu0Idt634ETY3GDRccT+UNsaLxthr0TQhbtuK6uJi2LrRvCuC56qXERJsNMtU0JmmbmFdqDK9 amIzXN2wEgl+GZow+V7dadajkYEeEa+FF5bl4jh+hRC2LYWHMXi7eFPZlU0RpZQRRmzTS+1yRJc H4dYB9t/svB8DFkfaJp2GF++MTxGai1FVF5/p5+9ojNfGM46F9kzVb5V/h/rKmPw73rzHav2vcu 1CzJ1mRImliBvDsMr/U9AdTFtKw9W5Z8Z3dSRZFAodEZrI3/d6sKgaPzkGFWd62xVUds= X-Received: by 2002:a05:600c:c167:b0:486:fb5c:3b20 with SMTP id 5b1f17b1804b1-486fedc39e5mr196391305e9.13.1774342055028; Tue, 24 Mar 2026 01:47:35 -0700 (PDT) Received: from localhost ([151.43.230.2]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-487116f17f3sm31333105e9.1.2026.03.24.01.47.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Mar 2026 01:47:34 -0700 (PDT) From: Francesco Lavra To: Lorenzo Bianconi , Jonathan Cameron , David Lechner , =?UTF-8?q?Nuno=20S=C3=A1?= , Andy Shevchenko , linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v9 1/6] iio: imu: st_lsm6dsx: Fix check for invalid samples from FIFO Date: Tue, 24 Mar 2026 09:47:33 +0100 Message-Id: <20260324084733.653906-1-flavra@baylibre.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260324084655.653781-1-flavra@baylibre.com> References: <20260324084655.653781-1-flavra@baylibre.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Developer-Signature: v=1; a=openpgp-sha256; l=3896; i=flavra@baylibre.com; h=from:subject; bh=LhhuQW+kXumxf4ZHnfybInW36mhcntwwfWxHRNAL3MI=; b=owEB7QES/pANAwAKAe3xO3POlDZfAcsmYgBpwk+lL3a1po6S4t6UgIXVMNxGsQxe+I2iIBwUl 6sQCXcfE7yJAbMEAAEKAB0WIQSGV4VPlTvcox7DFObt8TtzzpQ2XwUCacJPpQAKCRDt8TtzzpQ2 X/YpC/wIwu5GGBLlNaWQ+zF2JSZosTWqJ7IQSMY98lF9BVvCHPMKn2kYlHSIRSvhIu7veNsOr/E xV+wuYVF6uQZDHgJCkV3u3T1t7OEHdlQvN1dHf9YGxWCfYcAw1AmhvLktRgHUhJksZZ4p7HYrqh Ds+yEkA5n73knf0JR2XNlSm3JRkii6QXO7i/rvuj9uElv2QhAKRuldoAInaXZQ7K/IRgo3Fq56r NyMB4vUE70ggPzM2drhmucN6k+1uxgjHnMAcDBO6a6gjPbqXF6Tr1KQbwc8crVM4Syyl+e8ONiG +FCbaBtrvcqFJermd1C0YBASiOZhXM0T2hjdpxk5Ln0Mz3QbgS7TmaPquIUNO6CwqWaHaeQLxL2 vADLzOJU5jc5849eap7oabdOtGrm8obxYtCeuVMPCkRusBItUoXlghQkeaAySr0Dmy06H5GtVZh yIM8yayG+bdyURhkHL+u1wgFPITd3yeAwTXgBWu8FVdMCLynEwakfhvetDQz7jaO1n770= X-Developer-Key: i=flavra@baylibre.com; a=openpgp; fpr=8657854F953BDCA31EC314E6EDF13B73CE94365F Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The DRDY_MASK feature implemented in sensor chips marks gyroscope and accelerometer invalid samples (i.e. samples that have been acquired during the settling time of sensor filters) with the special values 0x7FFFh, 0x7FFE, and 0x7FFD. The driver checks FIFO samples against these special values in order to discard invalid samples; however, it does the check regardless of the type of samples being processed, whereas this feature is specific to gyroscope and accelerometer data. This could cause valid samples to be discarded. Fix the above check so that it takes into account the type of samples being processed. To avoid casting to __le16 * when checking sample values, clean up the type representation for data read from the FIFO. Fixes: 960506ed2c69 ("iio: imu: st_lsm6dsx: enable drdy-mask if available") Signed-off-by: Francesco Lavra Acked-by: Lorenzo Bianconi --- .../iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c b/drivers/iio/i= mu/st_lsm6dsx/st_lsm6dsx_buffer.c index 5b28a3ffcc3d..19232146bd61 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_buffer.c @@ -365,8 +365,6 @@ static inline int st_lsm6dsx_read_block(struct st_lsm6d= sx_hw *hw, u8 addr, return 0; } =20 -#define ST_LSM6DSX_IIO_BUFF_SIZE (ALIGN(ST_LSM6DSX_SAMPLE_SIZE, \ - sizeof(s64)) + sizeof(s64)) /** * st_lsm6dsx_read_fifo() - hw FIFO read routine * @hw: Pointer to instance of struct st_lsm6dsx_hw. @@ -537,16 +535,24 @@ int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw) } =20 #define ST_LSM6DSX_INVALID_SAMPLE 0x7ffd +static bool st_lsm6dsx_check_data(u8 tag, __le16 *data) +{ + if ((tag =3D=3D ST_LSM6DSX_GYRO_TAG || tag =3D=3D ST_LSM6DSX_ACC_TAG) && + (s16)le16_to_cpup(data) >=3D ST_LSM6DSX_INVALID_SAMPLE) + return false; + + return true; +} + static int st_lsm6dsx_push_tagged_data(struct st_lsm6dsx_hw *hw, u8 tag, - u8 *data, s64 ts) + __le16 *data, s64 ts) { - s16 val =3D le16_to_cpu(*(__le16 *)data); struct st_lsm6dsx_sensor *sensor; struct iio_dev *iio_dev; =20 /* invalid sample during bootstrap phase */ - if (val >=3D ST_LSM6DSX_INVALID_SAMPLE) + if (!st_lsm6dsx_check_data(tag, data)) return -EINVAL; =20 /* @@ -609,7 +615,13 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *= hw) * must be passed a buffer that is aligned to 8 bytes so * as to allow insertion of a naturally aligned timestamp. */ - u8 iio_buff[ST_LSM6DSX_IIO_BUFF_SIZE] __aligned(8); + struct { + union { + __le16 data[3]; + __le32 fifo_ts; + }; + aligned_s64 timestamp; + } iio_buff =3D { }; u8 tag; bool reset_ts =3D false; int i, err, read_len; @@ -648,7 +660,7 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *h= w) =20 for (i =3D 0; i < pattern_len; i +=3D ST_LSM6DSX_TAGGED_SAMPLE_SIZE) { - memcpy(iio_buff, &hw->buff[i + ST_LSM6DSX_TAG_SIZE], + memcpy(&iio_buff, &hw->buff[i + ST_LSM6DSX_TAG_SIZE], ST_LSM6DSX_SAMPLE_SIZE); =20 tag =3D hw->buff[i] >> 3; @@ -659,7 +671,7 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *h= w) * B0 =3D ts[7:0], B1 =3D ts[15:8], B2 =3D ts[23:16], * B3 =3D ts[31:24] */ - ts =3D le32_to_cpu(*((__le32 *)iio_buff)); + ts =3D le32_to_cpu(iio_buff.fifo_ts); /* * check if hw timestamp engine is going to * reset (the sensor generates an interrupt @@ -670,7 +682,8 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *h= w) reset_ts =3D true; ts *=3D hw->ts_gain; } else { - st_lsm6dsx_push_tagged_data(hw, tag, iio_buff, + st_lsm6dsx_push_tagged_data(hw, tag, + iio_buff.data, ts); } } --=20 2.39.5