[PATCH v6 4/6] net: can: flexcan: split the Message Buffer RAM area

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

 



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:
    V6:
     - No Change
    V5:
     - use if instead of ternary operator in flexcan_get_mb
     - in flexcan_open modify the priv->mb_count line as per review comments
    V4:
     - Make regs->mb to 2D array
     - use bank terminology instead of block in flexcan_get_mb
    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 | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c
index c4cf22c9b750..f6bbcfdd4d46 100644
--- a/drivers/net/can/flexcan.c
+++ b/drivers/net/can/flexcan.c
@@ -224,7 +224,7 @@ struct flexcan_regs {
 	u32 rxfgmask;		/* 0x48 */
 	u32 rxfir;		/* 0x4c */
 	u32 _reserved3[12];	/* 0x50 */
-	u8  mb[1024];		/* 0x80 */
+	u8 mb[2][512];		/* 0x80 */
 	/* FIFO-mode:
 	 *			MB
 	 * 0x080...0x08f	0	RX message buffer
@@ -358,11 +358,20 @@ static inline void flexcan_write_le(u32 val, void __iomem *addr)
 static struct flexcan_mb *flexcan_get_mb(const struct flexcan_priv *priv,
 					 u8 mb_index)
 {
+	u8 mb_count_bank;
+	bool bank;
+
 	if (WARN_ON(mb_index >= priv->mb_count))
 		return NULL;
 
+	mb_count_bank = sizeof(priv->regs->mb[0]) / priv->mb_size;
+
+	bank = mb_index >= mb_count_bank;
+	if (bank)
+		mb_index -= mb_count_bank;
+
 	return (struct flexcan_mb __iomem *)
-		(&priv->regs->mb[priv->mb_size * mb_index]);
+		(&priv->regs->mb[bank][priv->mb_size * mb_index]);
 }
 
 static inline void flexcan_error_irq_enable(const struct flexcan_priv *priv)
@@ -1146,7 +1155,8 @@ static int flexcan_open(struct net_device *dev)
 		priv->mb_size = sizeof(struct flexcan_mb) + CANFD_MAX_DLEN;
 	else
 		priv->mb_size = sizeof(struct flexcan_mb) + CAN_MAX_DLEN;
-	priv->mb_count = sizeof(priv->regs->mb) / priv->mb_size;
+	priv->mb_count = (sizeof(priv->regs->mb[0]) / priv->mb_size) +
+			 (sizeof(priv->regs->mb[1]) / priv->mb_size);
 
 	if (priv->devtype_data->quirks & FLEXCAN_QUIRK_USE_OFF_TIMESTAMP) {
 		priv->tx_mb_idx = FLEXCAN_TX_MB_OFF_TIMESTAMP;
-- 
2.17.1




[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