Re: [PATCH] can: mcp251xfd: optimizing transfer size for CRC transfers size 1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Automotive Discussions]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [eCos]     [Asterisk Internet PBX]     [Linux API]     [CAN Bus]

  Powered by Linux