On 27.01.2023 13:42:58, Thomas Kopp wrote: > For CRC transfers with size 1 it is more efficient to use the > write_safe command instead of the write_crc command. This saves the > length byte on the SPI transfer. Looks good to me. But I cannot measure a difference. > Signed-off-by: Thomas Kopp <thomas.kopp@xxxxxxxxxxxxx> > --- > .../net/can/spi/mcp251xfd/mcp251xfd-ring.c | 31 ++++++++++++------- > drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 26 +++++++++++++--- > 2 files changed, 42 insertions(+), 15 deletions(-) > > diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c > index f69d5fc8c9afd..3c3bc9be1f295 100644 > --- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c > +++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c > @@ -30,22 +30,31 @@ mcp251xfd_cmd_prepare_write_reg(const struct mcp251xfd_priv *priv, > last_byte = mcp251xfd_last_byte_set(mask); > len = last_byte - first_byte + 1; > > - data = mcp251xfd_spi_cmd_write(priv, write_reg_buf, reg + first_byte); > + data = mcp251xfd_spi_cmd_write(priv, write_reg_buf, reg + first_byte, len); > val_le32 = cpu_to_le32(val >> BITS_PER_BYTE * first_byte); > memcpy(data, &val_le32, len); > > if (priv->devtype_data.quirks & MCP251XFD_QUIRK_CRC_REG) { > u16 crc; > - > - mcp251xfd_spi_cmd_crc_set_len_in_reg(&write_reg_buf->crc.cmd, > - len); > - /* CRC */ > - len += sizeof(write_reg_buf->crc.cmd); > - crc = mcp251xfd_crc16_compute(&write_reg_buf->crc, len); > - put_unaligned_be16(crc, (void *)write_reg_buf + len); > - > - /* Total length */ > - len += sizeof(write_reg_buf->crc.crc); > + if (len == 1) { > + /* CRC */ > + len += sizeof(write_reg_buf->safe.cmd); > + crc = mcp251xfd_crc16_compute(&write_reg_buf->safe, len); > + put_unaligned_be16(crc, (void *)write_reg_buf + len); > + > + /* Total length */ > + len += sizeof(write_reg_buf->safe.crc); > + } else { > + mcp251xfd_spi_cmd_crc_set_len_in_reg(&write_reg_buf->crc.cmd, > + len); > + /* CRC */ > + len += sizeof(write_reg_buf->crc.cmd); > + crc = mcp251xfd_crc16_compute(&write_reg_buf->crc, len); > + put_unaligned_be16(crc, (void *)write_reg_buf + len); > + > + /* Total length */ > + len += sizeof(write_reg_buf->crc.crc); > + } > } else { > len += sizeof(write_reg_buf->nocrc.cmd); > } I've moved changed the if() logic a bit, saving 1 level of indention. Marc -- Pengutronix e.K. | Marc Kleine-Budde | Embedded Linux | https://www.pengutronix.de | Vertretung West/Dortmund | Phone: +49-231-2826-924 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Attachment:
signature.asc
Description: PGP signature