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 7b120c716228610b924dd3ddbafbc39c920de86a..8112f8df22a6ea798248faa1befaf474fa3e6509 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;
                }