can: mcp251xfd: mcp251xfd_regmap_crc_read(): ignore CRC error only if solely OSC...
authorMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 29 Oct 2020 09:46:51 +0000 (10:46 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 24 Feb 2022 07:26:04 +0000 (08:26 +0100)
MCP251XFD_REG_OSC is the first register the driver reads from. The
chip may be in deep sleep and the SPI transfer (i.e. the assertion of
the CS) will wake the chip up. This takes about 3ms. The CRC of this
transfer is wrong, or there isn't any chip at all, in this case the
CRC will be wrong, too. The driver ignores the CRC error and returns
the read data to the caller.

To avoid any confusion, this patch changes the
mcp251xfd_regmap_crc_read() function to only ignore the CRC error if
solely the OSC register is read. So when reading more than the OSC
registers at once, CRC errors are not ignored.

Link: https://lore.kernel.org/all/20220207131047.282110-3-mkl@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-regmap.c

index 7b120c7..8112f8d 100644 (file)
@@ -368,7 +368,7 @@ mcp251xfd_regmap_crc_read(void *context,
                 * to the caller. It will take care of both cases.
                 *
                 */
-               if (reg == MCP251XFD_REG_OSC) {
+               if (reg == MCP251XFD_REG_OSC && val_len == sizeof(__le32)) {
                        err = 0;
                        goto out;
                }