Re: [PATCH v3 6/7] net: can: flexcan: split the Message Buffer RAM area

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

 



On 08/01/2018 04:06 PM, Pankaj Bansal wrote:
> The message buffer RAM area is not a contiguous 1KB area but 2 partitions
> of 512 bytes each. Till now, we used Message buffers with payload size 8
> bytes, which translates to 32 MBs per partition and no spare space is left
> in any partition.
> However, in upcoming SOC LX2160A the message buffers can have payload size
> 64 bytes. This results in less than 32 MBs per partition and some empty
> area is left at the end of each partition.This empty area should not be
> accessed.
> Therefore, split the Message Buffer RAM area into two partitions.
> 
> Signed-off-by: Pankaj Bansal <pankaj.bansal@xxxxxxx>
> ---
> 
> Notes:
>     V3:
>      - No change
>     V2:
>      - removed mb_count_block1 and mb_count_block2 from priv structure due to
>        flexcan_get_mb function introduced in earlier patch
> 
>  drivers/net/can/flexcan.c | 19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
> index 232b70f371da..c9edfc808f8f 100644
> --- a/drivers/net/can/flexcan.c
> +++ b/drivers/net/can/flexcan.c
> @@ -224,7 +224,8 @@ struct flexcan_regs {
>  	u32 rxfgmask;		/* 0x48 */
>  	u32 rxfir;		/* 0x4c */
>  	u32 _reserved3[12];	/* 0x50 */
> -	u32 mb[256];		/* 0x80 */
> +	u32 mb1[128];		/* 0x80 */
> +	u32 mb2[128];		/* 0x280 */

Two "banks" a 512 byte. Banks is a more common name than blocks.

u8 mb[2][512]

>  	/* FIFO-mode:
>  	 *			MB
>  	 * 0x080...0x08f	0	RX message buffer
> @@ -357,18 +358,23 @@ static struct flexcan_mb *flexcan_get_mb(const struct flexcan_priv *priv,
>  					 u8 mb_index)
>  {
>  	u8 mb_size;
> -	u8 mb_count;
> +	u8 mb_count_block;

	bool bank;

>  
>  	if (priv->can.ctrlmode & CAN_CTRLMODE_FD)
>  		mb_size = sizeof(struct flexcan_mb) + CANFD_MAX_DLEN;
>  	else
>  		mb_size = sizeof(struct flexcan_mb) + CAN_MAX_DLEN;
> -	mb_count = (sizeof(priv->regs->mb) / mb_size);
> +	mb_count_block = (sizeof(priv->regs->mb1) / mb_size);
	mb_count_bank = sizeof(priv->regs->mb1) / mb_size;

>  
	bank = mb_index >= mb_count_bank;

	return (struct flexcan_mb __iomem *)
		(&priv->regs->mb[bank][mb_size * mb_index]);

> -	if (mb_index >= mb_count)
> +	if (mb_index < mb_count_block)
> +		return (struct flexcan_mb __iomem *)((u8 *)&priv->regs->mb1 +
> +						     (mb_size * mb_index));
> +
> +	mb_index -= mb_count_block;
> +	if (mb_index >= mb_count_block)
>  		return NULL;
>  
> -	return (struct flexcan_mb __iomem *)((u8 *)&priv->regs->mb +
> +	return (struct flexcan_mb __iomem *)((u8 *)&priv->regs->mb2 +
>  					     (mb_size * mb_index));
>  }
>  
> @@ -1171,7 +1177,8 @@ static int flexcan_open(struct net_device *dev)
>  		u64 imask;
>  
>  		priv->offload.mb_first = FLEXCAN_RX_MB_OFF_TIMESTAMP_FIRST;
> -		priv->offload.mb_last = (sizeof(priv->regs->mb) / mb_size) - 1;
> +		priv->offload.mb_last = (sizeof(priv->regs->mb1) / mb_size) +
> +					(sizeof(priv->regs->mb2) / mb_size) - 1;
>  
>  		imask = GENMASK_ULL(priv->offload.mb_last,
>  				    priv->offload.mb_first);
> 

Marc

-- 
Pengutronix e.K.                  | Marc Kleine-Budde           |
Industrial Linux Solutions        | Phone: +49-231-2826-924     |
Vertretung West/Dortmund          | Fax:   +49-5121-206917-5555 |
Amtsgericht Hildesheim, HRA 2686  | http://www.pengutronix.de   |

Attachment: signature.asc
Description: OpenPGP digital 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