linux-can.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit
@ 2020-11-25 14:52 Marc Kleine-Budde
  2020-11-25 14:52 ` [net-next 1/3] can: mcp251xfd: convert tef_ring Marc Kleine-Budde
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2020-11-25 14:52 UTC (permalink / raw)
  To: linux-can; +Cc: Manivannan Sadhasivam, Thomas Kopp

Hello,

as Thomas wants to test the rx-path improvements, here is the same idea for the
TEF-path.

This is a short series to reduce the number SPI core requests to increment the
UINC bit after TEF handling. This is done by chaining the individual UINC bit
changes into a single SPI message consisting of several transfers.

I'll add proper commit messages to patch 1 and 2 later.

Happy testing,
Marc


^ permalink raw reply	[flat|nested] 7+ messages in thread

* [net-next 1/3] can: mcp251xfd: convert tef_ring
  2020-11-25 14:52 [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
@ 2020-11-25 14:52 ` Marc Kleine-Budde
  2020-11-25 14:52 ` [net-next 2/3] can: mcp251xfd: move mcp251xfd_tef_ring definition Marc Kleine-Budde
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2020-11-25 14:52 UTC (permalink / raw)
  To: linux-can; +Cc: Manivannan Sadhasivam, Thomas Kopp, Marc Kleine-Budde

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c | 18 ++++++++++--------
 drivers/net/can/spi/mcp251xfd/mcp251xfd.h      |  8 ++++----
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
index 724837fac992..4e7260571ba9 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
@@ -326,6 +326,7 @@ mcp251xfd_tx_ring_init_tx_obj(const struct mcp251xfd_priv *priv,
 
 static void mcp251xfd_ring_init(struct mcp251xfd_priv *priv)
 {
+	struct mcp251xfd_tef_ring *tef_ring;
 	struct mcp251xfd_tx_ring *tx_ring;
 	struct mcp251xfd_rx_ring *rx_ring, *prev_rx_ring = NULL;
 	struct mcp251xfd_tx_obj *tx_obj;
@@ -335,8 +336,9 @@ static void mcp251xfd_ring_init(struct mcp251xfd_priv *priv)
 	int i, j;
 
 	/* TEF */
-	priv->tef.head = 0;
-	priv->tef.tail = 0;
+	tef_ring = priv->tef;
+	tef_ring->head = 0;
+	tef_ring->tail = 0;
 
 	/* TX */
 	tx_ring = priv->tx;
@@ -1219,7 +1221,7 @@ mcp251xfd_handle_tefif_recover(const struct mcp251xfd_priv *priv, const u32 seq)
 		    tef_sta & MCP251XFD_REG_TEFSTA_TEFFIF ?
 		    "full" : tef_sta & MCP251XFD_REG_TEFSTA_TEFNEIF ?
 		    "not empty" : "empty",
-		    seq, priv->tef.tail, priv->tef.head, tx_ring->head);
+		    seq, priv->tef->tail, priv->tef->head, tx_ring->head);
 
 	/* The Sequence Number in the TEF doesn't match our tef_tail. */
 	return -EAGAIN;
@@ -1243,7 +1245,7 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
 	 */
 	seq_masked = seq &
 		field_mask(MCP251XFD_OBJ_FLAGS_SEQ_MCP2517FD_MASK);
-	tef_tail_masked = priv->tef.tail &
+	tef_tail_masked = priv->tef->tail &
 		field_mask(MCP251XFD_OBJ_FLAGS_SEQ_MCP2517FD_MASK);
 	if (seq_masked != tef_tail_masked)
 		return mcp251xfd_handle_tefif_recover(priv, seq);
@@ -1261,7 +1263,7 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
 	if (err)
 		return err;
 
-	priv->tef.tail++;
+	priv->tef->tail++;
 	tx_ring->tail++;
 
 	return mcp251xfd_check_tef_tail(priv);
@@ -1281,12 +1283,12 @@ static int mcp251xfd_tef_ring_update(struct mcp251xfd_priv *priv)
 	/* chip_tx_tail, is the next TX-Object send by the HW.
 	 * The new TEF head must be >= the old head, ...
 	 */
-	new_head = round_down(priv->tef.head, tx_ring->obj_num) + chip_tx_tail;
-	if (new_head <= priv->tef.head)
+	new_head = round_down(priv->tef->head, tx_ring->obj_num) + chip_tx_tail;
+	if (new_head <= priv->tef->head)
 		new_head += tx_ring->obj_num;
 
 	/* ... but it cannot exceed the TX head. */
-	priv->tef.head = min(new_head, tx_ring->head);
+	priv->tef->head = min(new_head, tx_ring->head);
 
 	return mcp251xfd_check_tef_tail(priv);
 }
diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
index 97dc182e2b42..76585a40d16e 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
@@ -583,7 +583,7 @@ struct mcp251xfd_priv {
 	struct spi_device *spi;
 	u32 spi_max_speed_hz_orig;
 
-	struct mcp251xfd_tef_ring tef;
+	struct mcp251xfd_tef_ring tef[1];
 	struct mcp251xfd_tx_ring tx[1];
 	struct mcp251xfd_rx_ring *rx[1];
 
@@ -744,17 +744,17 @@ mcp251xfd_get_rx_obj_addr(const struct mcp251xfd_rx_ring *ring, u8 n)
 
 static inline u8 mcp251xfd_get_tef_head(const struct mcp251xfd_priv *priv)
 {
-	return priv->tef.head & (priv->tx->obj_num - 1);
+	return priv->tef->head & (priv->tx->obj_num - 1);
 }
 
 static inline u8 mcp251xfd_get_tef_tail(const struct mcp251xfd_priv *priv)
 {
-	return priv->tef.tail & (priv->tx->obj_num - 1);
+	return priv->tef->tail & (priv->tx->obj_num - 1);
 }
 
 static inline u8 mcp251xfd_get_tef_len(const struct mcp251xfd_priv *priv)
 {
-	return priv->tef.head - priv->tef.tail;
+	return priv->tef->head - priv->tef->tail;
 }
 
 static inline u8 mcp251xfd_get_tef_linear_len(const struct mcp251xfd_priv *priv)
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [net-next 2/3] can: mcp251xfd: move mcp251xfd_tef_ring definition
  2020-11-25 14:52 [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
  2020-11-25 14:52 ` [net-next 1/3] can: mcp251xfd: convert tef_ring Marc Kleine-Budde
@ 2020-11-25 14:52 ` Marc Kleine-Budde
  2020-11-25 14:52 ` [net-next 3/3] can: mcp251xfd: tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2020-11-25 14:52 UTC (permalink / raw)
  To: linux-can; +Cc: Manivannan Sadhasivam, Thomas Kopp, Marc Kleine-Budde

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 drivers/net/can/spi/mcp251xfd/mcp251xfd.h | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
index 76585a40d16e..299dbf72e24b 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
@@ -459,14 +459,6 @@ struct mcp251xfd_hw_rx_obj_canfd {
 	u8 data[sizeof_field(struct canfd_frame, data)];
 };
 
-struct mcp251xfd_tef_ring {
-	unsigned int head;
-	unsigned int tail;
-
-	/* u8 obj_num equals tx_ring->obj_num */
-	/* u8 obj_size equals sizeof(struct mcp251xfd_hw_tef_obj) */
-};
-
 struct __packed mcp251xfd_buf_cmd {
 	__be16 cmd;
 };
@@ -506,6 +498,14 @@ struct mcp251xfd_tx_obj {
 	union mcp251xfd_tx_obj_load_buf buf;
 };
 
+struct mcp251xfd_tef_ring {
+	unsigned int head;
+	unsigned int tail;
+
+	/* u8 obj_num equals tx_ring->obj_num */
+	/* u8 obj_size equals sizeof(struct mcp251xfd_hw_tef_obj) */
+};
+
 struct mcp251xfd_tx_ring {
 	unsigned int head;
 	unsigned int tail;
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [net-next 3/3] can: mcp251xfd: tef-path: reduce number of SPI core requests to set UINC bit
  2020-11-25 14:52 [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
  2020-11-25 14:52 ` [net-next 1/3] can: mcp251xfd: convert tef_ring Marc Kleine-Budde
  2020-11-25 14:52 ` [net-next 2/3] can: mcp251xfd: move mcp251xfd_tef_ring definition Marc Kleine-Budde
@ 2020-11-25 14:52 ` Marc Kleine-Budde
  2020-11-25 15:11 ` [net-next 0/3] " Manivannan Sadhasivam
  2020-11-26 12:48 ` Thomas.Kopp
  4 siblings, 0 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2020-11-25 14:52 UTC (permalink / raw)
  To: linux-can; +Cc: Manivannan Sadhasivam, Thomas Kopp, Marc Kleine-Budde

Reduce the number of separate SPI core requests when setting the UINC bit in
the TEF FIFO, and instead batch them up into a single SPI core request.

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
---
 .../net/can/spi/mcp251xfd/mcp251xfd-core.c    | 62 +++++++++++++++----
 drivers/net/can/spi/mcp251xfd/mcp251xfd.h     |  3 +
 2 files changed, 53 insertions(+), 12 deletions(-)

diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
index 4e7260571ba9..9aae5f5fcd01 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
@@ -340,6 +340,23 @@ static void mcp251xfd_ring_init(struct mcp251xfd_priv *priv)
 	tef_ring->head = 0;
 	tef_ring->tail = 0;
 
+	/* FIFO increment TEF tail pointer */
+	addr = MCP251XFD_REG_TEFCON;
+	val = MCP251XFD_REG_TEFCON_UINC;
+	len = mcp251xfd_cmd_prepare_write_reg(priv, &tef_ring->uinc_buf,
+					      addr, val, val);
+
+	for (j = 0; j < ARRAY_SIZE(tef_ring->uinc_xfer); j++) {
+		struct spi_transfer *xfer;
+
+		xfer = &tef_ring->uinc_xfer[j];
+		xfer->tx_buf = &tef_ring->uinc_buf;
+		xfer->len = len;
+		xfer->cs_change = 1;
+		xfer->cs_change_delay.value = 0;
+		xfer->cs_change_delay.unit = SPI_DELAY_UNIT_NSECS;
+	}
+
 	/* TX */
 	tx_ring = priv->tx;
 	tx_ring->head = 0;
@@ -1231,10 +1248,8 @@ static int
 mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
 			   const struct mcp251xfd_hw_tef_obj *hw_tef_obj)
 {
-	struct mcp251xfd_tx_ring *tx_ring = priv->tx;
 	struct net_device_stats *stats = &priv->ndev->stats;
 	u32 seq, seq_masked, tef_tail_masked;
-	int err;
 
 	seq = FIELD_GET(MCP251XFD_OBJ_FLAGS_SEQ_MCP2518FD_MASK,
 			hw_tef_obj->flags);
@@ -1255,18 +1270,9 @@ mcp251xfd_handle_tefif_one(struct mcp251xfd_priv *priv,
 					    mcp251xfd_get_tef_tail(priv),
 					    hw_tef_obj->ts);
 	stats->tx_packets++;
-
-	/* finally increment the TEF pointer */
-	err = regmap_update_bits(priv->map_reg, MCP251XFD_REG_TEFCON,
-				 GENMASK(15, 8),
-				 MCP251XFD_REG_TEFCON_UINC);
-	if (err)
-		return err;
-
 	priv->tef->tail++;
-	tx_ring->tail++;
 
-	return mcp251xfd_check_tef_tail(priv);
+	return 0;
 }
 
 static int mcp251xfd_tef_ring_update(struct mcp251xfd_priv *priv)
@@ -1353,6 +1359,38 @@ static int mcp251xfd_handle_tefif(struct mcp251xfd_priv *priv)
 	}
 
  out_netif_wake_queue:
+	len = i;	/* number of handled goods TEFs */
+	if (len) {
+		struct mcp251xfd_tef_ring *ring = priv->tef;
+		struct mcp251xfd_tx_ring *tx_ring = priv->tx;
+		struct spi_transfer *last_xfer;
+
+		/* Increment the TEF FIFO tail pointer 'len' times in
+		 * a single SPI message.
+		 */
+		tx_ring->tail += len;
+
+		/* Note:
+		 *
+		 * "cs_change == 1" on the last transfer results in an
+		 * active chip select after the transfer. This causes
+		 * the controller to interpret the next register
+		 * access as data. Temporary set "cs_change" of the
+		 * last transfer to "0" to properly deactivate the
+		 * chip select at the end of the transfer.
+		 */
+		last_xfer = &ring->uinc_xfer[len - 1];
+		last_xfer->cs_change = 0;
+		err = spi_sync_transfer(priv->spi, ring->uinc_xfer, len);
+		last_xfer->cs_change = 1;
+		if (err)
+			return err;
+
+		err = mcp251xfd_check_tef_tail(priv);
+		if (err)
+			return err;
+	}
+
 	mcp251xfd_ecc_tefif_successful(priv);
 
 	if (mcp251xfd_get_tx_free(priv->tx)) {
diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
index 299dbf72e24b..cb6398c2a560 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd.h
@@ -504,6 +504,9 @@ struct mcp251xfd_tef_ring {
 
 	/* u8 obj_num equals tx_ring->obj_num */
 	/* u8 obj_size equals sizeof(struct mcp251xfd_hw_tef_obj) */
+
+	union mcp251xfd_write_reg_buf uinc_buf;
+	struct spi_transfer uinc_xfer[MCP251XFD_TX_OBJ_NUM_MAX];
 };
 
 struct mcp251xfd_tx_ring {
-- 
2.29.2



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit
  2020-11-25 14:52 [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
                   ` (2 preceding siblings ...)
  2020-11-25 14:52 ` [net-next 3/3] can: mcp251xfd: tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
@ 2020-11-25 15:11 ` Manivannan Sadhasivam
  2020-11-25 15:17   ` Marc Kleine-Budde
  2020-11-26 12:48 ` Thomas.Kopp
  4 siblings, 1 reply; 7+ messages in thread
From: Manivannan Sadhasivam @ 2020-11-25 15:11 UTC (permalink / raw)
  To: Marc Kleine-Budde; +Cc: linux-can, Thomas Kopp

Hi Marc,

Unrelated to this change, is it you or anyone working on internal
loopback support for this driver? If not, then I'll just pick up.

Thanks,
Mani

On Wed, Nov 25, 2020 at 03:52:19PM +0100, Marc Kleine-Budde wrote:
> Hello,
> 
> as Thomas wants to test the rx-path improvements, here is the same idea for the
> TEF-path.
> 
> This is a short series to reduce the number SPI core requests to increment the
> UINC bit after TEF handling. This is done by chaining the individual UINC bit
> changes into a single SPI message consisting of several transfers.
> 
> I'll add proper commit messages to patch 1 and 2 later.
> 
> Happy testing,
> Marc
> 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit
  2020-11-25 15:11 ` [net-next 0/3] " Manivannan Sadhasivam
@ 2020-11-25 15:17   ` Marc Kleine-Budde
  0 siblings, 0 replies; 7+ messages in thread
From: Marc Kleine-Budde @ 2020-11-25 15:17 UTC (permalink / raw)
  To: Manivannan Sadhasivam; +Cc: linux-can, Thomas Kopp


[-- Attachment #1.1: Type: text/plain, Size: 510 bytes --]

On 11/25/20 4:11 PM, Manivannan Sadhasivam wrote:
> Unrelated to this change, is it you or anyone working on internal
> loopback support for this driver? If not, then I'll just pick up.

I don't - happy hacking :)

regards,
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 #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* RE: [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit
  2020-11-25 14:52 [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
                   ` (3 preceding siblings ...)
  2020-11-25 15:11 ` [net-next 0/3] " Manivannan Sadhasivam
@ 2020-11-26 12:48 ` Thomas.Kopp
  4 siblings, 0 replies; 7+ messages in thread
From: Thomas.Kopp @ 2020-11-26 12:48 UTC (permalink / raw)
  To: mkl, linux-can; +Cc: manivannan.sadhasivam

> From: Marc Kleine-Budde <mkl@pengutronix.de>
> Sent: Wednesday, 25 November 2020 15:52
> To: linux-can@vger.kernel.org
> Cc: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>;
> Thomas Kopp - M43677 <Thomas.Kopp@microchip.com>
> Subject: [net-next 0/3] tef-path: reduce number of SPI core requests to
> set UINC bit
> 
> as Thomas wants to test the rx-path improvements, here is the same idea
> for the
> TEF-path.
> 
> This is a short series to reduce the number SPI core requests to increment
> the
> UINC bit after TEF handling. This is done by chaining the individual UINC bit
> changes into a single SPI message consisting of several transfers.

Thanks for the patches!

Tested by valid for both this series and can: mcp251xfd: rx-path: reduce 
number of SPI core requests to set UINC bit series. Tested on Pi4 with 
MCP2518FD and MCP2517FD.

Tested-by: Thomas Kopp <thomas.kopp@microchip.com>

Regards,
Thomas

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-11-26 12:48 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-25 14:52 [net-next 0/3] tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
2020-11-25 14:52 ` [net-next 1/3] can: mcp251xfd: convert tef_ring Marc Kleine-Budde
2020-11-25 14:52 ` [net-next 2/3] can: mcp251xfd: move mcp251xfd_tef_ring definition Marc Kleine-Budde
2020-11-25 14:52 ` [net-next 3/3] can: mcp251xfd: tef-path: reduce number of SPI core requests to set UINC bit Marc Kleine-Budde
2020-11-25 15:11 ` [net-next 0/3] " Manivannan Sadhasivam
2020-11-25 15:17   ` Marc Kleine-Budde
2020-11-26 12:48 ` Thomas.Kopp

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).