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