mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH] net: rtl8169: remove unnecessary cache maintenance
@ 2015-01-04 21:09 Lucas Stach
  2015-01-05 11:52 ` Sascha Hauer
  2015-01-05 17:19 ` Antony Pavlov
  0 siblings, 2 replies; 6+ messages in thread
From: Lucas Stach @ 2015-01-04 21:09 UTC (permalink / raw)
  To: barebox

The buffer descriptors are allocated from coherent memory, so there
is no cache maintenance needed. Only tell the compiler that the descriptors
can be modified by the hardware.

Signed-off-by: Lucas Stach <dev@lynxeye.de>
---
 drivers/net/rtl8169.c | 24 +++++-------------------
 1 file changed, 5 insertions(+), 19 deletions(-)

diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c
index 5702900..19f5763 100644
--- a/drivers/net/rtl8169.c
+++ b/drivers/net/rtl8169.c
@@ -50,11 +50,11 @@ struct rtl8169_priv {
 	struct pci_dev		*pci_dev;
 	int			chipset;
 
-	struct bufdesc		*tx_desc;
+	volatile struct bufdesc	*tx_desc;
 	void			*tx_buf;
 	unsigned int		cur_tx;
 
-	struct bufdesc		*rx_desc;
+	volatile struct bufdesc	*rx_desc;
 	void			*rx_buf;
 	unsigned int		cur_rx;
 
@@ -250,10 +250,6 @@ static void rtl8169_init_ring(struct rtl8169_priv *priv)
 		priv->rx_desc[i].buf_addr =
 				virt_to_phys(priv->rx_buf + i * PKT_BUF_SIZE);
 	}
-
-	dma_flush_range((unsigned long)priv->rx_desc,
-			(unsigned long)priv->rx_desc +
-			NUM_RX_DESC * sizeof(struct bufdesc));
 }
 
 static void rtl8169_hw_start(struct rtl8169_priv *priv)
@@ -386,14 +382,10 @@ static int rtl8169_eth_send(struct eth_device *edev, void *packet,
 			((packet_length > ETH_ZLEN) ? packet_length : ETH_ZLEN);
 	}
 
-	dma_flush_range((unsigned long)&priv->tx_desc[entry],
-			(unsigned long)&priv->tx_desc[entry + 1]);
-
 	RTL_W8(priv, TxPoll, 0x40);
-	do {
-		dma_inv_range((unsigned long)&priv->tx_desc[entry],
-		              (unsigned long)&priv->tx_desc[entry + 1]);
-	} while (priv->tx_desc[entry].status & BD_STAT_OWN);
+
+	while (priv->tx_desc[entry].status & BD_STAT_OWN)
+		;
 
 	priv->cur_tx++;
 
@@ -408,9 +400,6 @@ static int rtl8169_eth_rx(struct eth_device *edev)
 
 	entry = priv->cur_rx % NUM_RX_DESC;
 
-	dma_inv_range((unsigned long)&priv->rx_desc[entry],
-	              (unsigned long)&priv->rx_desc[entry + 1]);
-
 	if ((priv->rx_desc[entry].status & BD_STAT_OWN) == 0) {
 		if (!(priv->rx_desc[entry].status & BD_STAT_RX_RES)) {
 			pkt_size = (priv->rx_desc[entry].status & 0x1fff) - 4;
@@ -441,9 +430,6 @@ static int rtl8169_eth_rx(struct eth_device *edev)
 			priv->rx_desc[entry].buf_addr =
 				virt_to_phys(priv->rx_buf +
 				             entry * PKT_BUF_SIZE);
-
-			dma_flush_range((unsigned long)&priv->rx_desc[entry],
-			                (unsigned long)&priv->rx_desc[entry + 1]);
 		} else {
 			dev_err(&edev->dev, "rx error\n");
 		}
-- 
2.1.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH] net: rtl8169: remove unnecessary cache maintenance
  2015-01-04 21:09 [PATCH] net: rtl8169: remove unnecessary cache maintenance Lucas Stach
@ 2015-01-05 11:52 ` Sascha Hauer
  2015-01-05 17:19 ` Antony Pavlov
  1 sibling, 0 replies; 6+ messages in thread
From: Sascha Hauer @ 2015-01-05 11:52 UTC (permalink / raw)
  To: Lucas Stach; +Cc: barebox

On Sun, Jan 04, 2015 at 10:09:05PM +0100, Lucas Stach wrote:
> The buffer descriptors are allocated from coherent memory, so there
> is no cache maintenance needed. Only tell the compiler that the descriptors
> can be modified by the hardware.
> 
> Signed-off-by: Lucas Stach <dev@lynxeye.de>

Applied, thanks

Sascha


-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH] net: rtl8169: remove unnecessary cache maintenance
  2015-01-04 21:09 [PATCH] net: rtl8169: remove unnecessary cache maintenance Lucas Stach
  2015-01-05 11:52 ` Sascha Hauer
@ 2015-01-05 17:19 ` Antony Pavlov
  2015-01-05 17:37   ` Lucas Stach
  1 sibling, 1 reply; 6+ messages in thread
From: Antony Pavlov @ 2015-01-05 17:19 UTC (permalink / raw)
  To: Lucas Stach; +Cc: barebox

On Sun,  4 Jan 2015 22:09:05 +0100
Lucas Stach <dev@lynxeye.de> wrote:

I suppose that this patch can make problems on MIPS with explicid cache handling.

> The buffer descriptors are allocated from coherent memory, so there
> is no cache maintenance needed. Only tell the compiler that the descriptors
> can be modified by the hardware.
> 
> Signed-off-by: Lucas Stach <dev@lynxeye.de>
> ---
>  drivers/net/rtl8169.c | 24 +++++-------------------
>  1 file changed, 5 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c
> index 5702900..19f5763 100644
> --- a/drivers/net/rtl8169.c
> +++ b/drivers/net/rtl8169.c
> @@ -50,11 +50,11 @@ struct rtl8169_priv {
>  	struct pci_dev		*pci_dev;
>  	int			chipset;
>  
> -	struct bufdesc		*tx_desc;
> +	volatile struct bufdesc	*tx_desc;
>  	void			*tx_buf;
>  	unsigned int		cur_tx;
>  
> -	struct bufdesc		*rx_desc;
> +	volatile struct bufdesc	*rx_desc;
>  	void			*rx_buf;
>  	unsigned int		cur_rx;
>  
> @@ -250,10 +250,6 @@ static void rtl8169_init_ring(struct rtl8169_priv *priv)
>  		priv->rx_desc[i].buf_addr =
>  				virt_to_phys(priv->rx_buf + i * PKT_BUF_SIZE);
>  	}
> -
> -	dma_flush_range((unsigned long)priv->rx_desc,
> -			(unsigned long)priv->rx_desc +
> -			NUM_RX_DESC * sizeof(struct bufdesc));
>  }
>  
>  static void rtl8169_hw_start(struct rtl8169_priv *priv)
> @@ -386,14 +382,10 @@ static int rtl8169_eth_send(struct eth_device *edev, void *packet,
>  			((packet_length > ETH_ZLEN) ? packet_length : ETH_ZLEN);
>  	}
>  
> -	dma_flush_range((unsigned long)&priv->tx_desc[entry],
> -			(unsigned long)&priv->tx_desc[entry + 1]);
> -
>  	RTL_W8(priv, TxPoll, 0x40);
> -	do {
> -		dma_inv_range((unsigned long)&priv->tx_desc[entry],
> -		              (unsigned long)&priv->tx_desc[entry + 1]);
> -	} while (priv->tx_desc[entry].status & BD_STAT_OWN);
> +
> +	while (priv->tx_desc[entry].status & BD_STAT_OWN)
> +		;
>  
>  	priv->cur_tx++;
>  
> @@ -408,9 +400,6 @@ static int rtl8169_eth_rx(struct eth_device *edev)
>  
>  	entry = priv->cur_rx % NUM_RX_DESC;
>  
> -	dma_inv_range((unsigned long)&priv->rx_desc[entry],
> -	              (unsigned long)&priv->rx_desc[entry + 1]);
> -
>  	if ((priv->rx_desc[entry].status & BD_STAT_OWN) == 0) {
>  		if (!(priv->rx_desc[entry].status & BD_STAT_RX_RES)) {
>  			pkt_size = (priv->rx_desc[entry].status & 0x1fff) - 4;
> @@ -441,9 +430,6 @@ static int rtl8169_eth_rx(struct eth_device *edev)
>  			priv->rx_desc[entry].buf_addr =
>  				virt_to_phys(priv->rx_buf +
>  				             entry * PKT_BUF_SIZE);
> -
> -			dma_flush_range((unsigned long)&priv->rx_desc[entry],
> -			                (unsigned long)&priv->rx_desc[entry + 1]);
>  		} else {
>  			dev_err(&edev->dev, "rx error\n");
>  		}
> -- 
> 2.1.0
> 
> 
> _______________________________________________
> barebox mailing list
> barebox@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/barebox


-- 
-- 
Best regards,
  Antony Pavlov

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH] net: rtl8169: remove unnecessary cache maintenance
  2015-01-05 17:19 ` Antony Pavlov
@ 2015-01-05 17:37   ` Lucas Stach
  2015-01-06 10:56     ` Antony Pavlov
  0 siblings, 1 reply; 6+ messages in thread
From: Lucas Stach @ 2015-01-05 17:37 UTC (permalink / raw)
  To: Antony Pavlov; +Cc: barebox

Am Montag, den 05.01.2015, 20:19 +0300 schrieb Antony Pavlov:
> On Sun,  4 Jan 2015 22:09:05 +0100
> Lucas Stach <dev@lynxeye.de> wrote:
> 
> I suppose that this patch can make problems on MIPS with explicid cache handling.
> 
How would it?
This driver is ARM only for now (as we are using ARM MMU functions to
flush buffers) until someone gets around to properly implement generic
dma sync ops.

But even then MIPS knows about uncached memory types which is exactly
what should be returned for a dma coherent memory allocation.

Regards,
Lucas 
> > The buffer descriptors are allocated from coherent memory, so there
> > is no cache maintenance needed. Only tell the compiler that the descriptors
> > can be modified by the hardware.
> > 
> > Signed-off-by: Lucas Stach <dev@lynxeye.de>
> > ---
> >  drivers/net/rtl8169.c | 24 +++++-------------------
> >  1 file changed, 5 insertions(+), 19 deletions(-)
> > 
> > diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c
> > index 5702900..19f5763 100644
> > --- a/drivers/net/rtl8169.c
> > +++ b/drivers/net/rtl8169.c
> > @@ -50,11 +50,11 @@ struct rtl8169_priv {
> >  	struct pci_dev		*pci_dev;
> >  	int			chipset;
> >  
> > -	struct bufdesc		*tx_desc;
> > +	volatile struct bufdesc	*tx_desc;
> >  	void			*tx_buf;
> >  	unsigned int		cur_tx;
> >  
> > -	struct bufdesc		*rx_desc;
> > +	volatile struct bufdesc	*rx_desc;
> >  	void			*rx_buf;
> >  	unsigned int		cur_rx;
> >  
> > @@ -250,10 +250,6 @@ static void rtl8169_init_ring(struct rtl8169_priv *priv)
> >  		priv->rx_desc[i].buf_addr =
> >  				virt_to_phys(priv->rx_buf + i * PKT_BUF_SIZE);
> >  	}
> > -
> > -	dma_flush_range((unsigned long)priv->rx_desc,
> > -			(unsigned long)priv->rx_desc +
> > -			NUM_RX_DESC * sizeof(struct bufdesc));
> >  }
> >  
> >  static void rtl8169_hw_start(struct rtl8169_priv *priv)
> > @@ -386,14 +382,10 @@ static int rtl8169_eth_send(struct eth_device *edev, void *packet,
> >  			((packet_length > ETH_ZLEN) ? packet_length : ETH_ZLEN);
> >  	}
> >  
> > -	dma_flush_range((unsigned long)&priv->tx_desc[entry],
> > -			(unsigned long)&priv->tx_desc[entry + 1]);
> > -
> >  	RTL_W8(priv, TxPoll, 0x40);
> > -	do {
> > -		dma_inv_range((unsigned long)&priv->tx_desc[entry],
> > -		              (unsigned long)&priv->tx_desc[entry + 1]);
> > -	} while (priv->tx_desc[entry].status & BD_STAT_OWN);
> > +
> > +	while (priv->tx_desc[entry].status & BD_STAT_OWN)
> > +		;
> >  
> >  	priv->cur_tx++;
> >  
> > @@ -408,9 +400,6 @@ static int rtl8169_eth_rx(struct eth_device *edev)
> >  
> >  	entry = priv->cur_rx % NUM_RX_DESC;
> >  
> > -	dma_inv_range((unsigned long)&priv->rx_desc[entry],
> > -	              (unsigned long)&priv->rx_desc[entry + 1]);
> > -
> >  	if ((priv->rx_desc[entry].status & BD_STAT_OWN) == 0) {
> >  		if (!(priv->rx_desc[entry].status & BD_STAT_RX_RES)) {
> >  			pkt_size = (priv->rx_desc[entry].status & 0x1fff) - 4;
> > @@ -441,9 +430,6 @@ static int rtl8169_eth_rx(struct eth_device *edev)
> >  			priv->rx_desc[entry].buf_addr =
> >  				virt_to_phys(priv->rx_buf +
> >  				             entry * PKT_BUF_SIZE);
> > -
> > -			dma_flush_range((unsigned long)&priv->rx_desc[entry],
> > -			                (unsigned long)&priv->rx_desc[entry + 1]);
> >  		} else {
> >  			dev_err(&edev->dev, "rx error\n");
> >  		}
> > -- 
> > 2.1.0
> > 
> > 
> > _______________________________________________
> > barebox mailing list
> > barebox@lists.infradead.org
> > http://lists.infradead.org/mailman/listinfo/barebox
> 
> 



_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH] net: rtl8169: remove unnecessary cache maintenance
  2015-01-05 17:37   ` Lucas Stach
@ 2015-01-06 10:56     ` Antony Pavlov
  2015-01-06 11:11       ` Lucas Stach
  0 siblings, 1 reply; 6+ messages in thread
From: Antony Pavlov @ 2015-01-06 10:56 UTC (permalink / raw)
  To: Lucas Stach; +Cc: barebox

On Mon, 05 Jan 2015 18:37:29 +0100
Lucas Stach <dev@lynxeye.de> wrote:

> Am Montag, den 05.01.2015, 20:19 +0300 schrieb Antony Pavlov:
> > On Sun,  4 Jan 2015 22:09:05 +0100
> > Lucas Stach <dev@lynxeye.de> wrote:
> > 
> > I suppose that this patch can make problems on MIPS with explicid cache handling.
> > 
> How would it?
> This driver is ARM only for now (as we are using ARM MMU functions to
> flush buffers) until someone gets around to properly implement generic
> dma sync ops.

Anyway it is reasonable to add 'depends on ARM' to 'config DRIVER_NET_RTL8169'
record in drivers/net/Kconfig.

> But even then MIPS knows about uncached memory types which is exactly
> what should be returned for a dma coherent memory allocation.

Alas! We can't just add 'volatile' modifier to make pointer uncached on MIPS in general case.

> 
> Regards,
> Lucas 
> > > The buffer descriptors are allocated from coherent memory, so there
> > > is no cache maintenance needed. Only tell the compiler that the descriptors
> > > can be modified by the hardware.
> > > 
> > > Signed-off-by: Lucas Stach <dev@lynxeye.de>
> > > ---
> > >  drivers/net/rtl8169.c | 24 +++++-------------------
> > >  1 file changed, 5 insertions(+), 19 deletions(-)
> > > 
> > > diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c
> > > index 5702900..19f5763 100644
> > > --- a/drivers/net/rtl8169.c
> > > +++ b/drivers/net/rtl8169.c
> > > @@ -50,11 +50,11 @@ struct rtl8169_priv {
> > >  	struct pci_dev		*pci_dev;
> > >  	int			chipset;
> > >  
> > > -	struct bufdesc		*tx_desc;
> > > +	volatile struct bufdesc	*tx_desc;
> > >  	void			*tx_buf;
> > >  	unsigned int		cur_tx;
> > >  
> > > -	struct bufdesc		*rx_desc;
> > > +	volatile struct bufdesc	*rx_desc;
> > >  	void			*rx_buf;
> > >  	unsigned int		cur_rx;
> > >  
> > > @@ -250,10 +250,6 @@ static void rtl8169_init_ring(struct rtl8169_priv *priv)
> > >  		priv->rx_desc[i].buf_addr =
> > >  				virt_to_phys(priv->rx_buf + i * PKT_BUF_SIZE);
> > >  	}
> > > -
> > > -	dma_flush_range((unsigned long)priv->rx_desc,
> > > -			(unsigned long)priv->rx_desc +
> > > -			NUM_RX_DESC * sizeof(struct bufdesc));
> > >  }
> > >  
> > >  static void rtl8169_hw_start(struct rtl8169_priv *priv)
> > > @@ -386,14 +382,10 @@ static int rtl8169_eth_send(struct eth_device *edev, void *packet,
> > >  			((packet_length > ETH_ZLEN) ? packet_length : ETH_ZLEN);
> > >  	}
> > >  
> > > -	dma_flush_range((unsigned long)&priv->tx_desc[entry],
> > > -			(unsigned long)&priv->tx_desc[entry + 1]);
> > > -
> > >  	RTL_W8(priv, TxPoll, 0x40);
> > > -	do {
> > > -		dma_inv_range((unsigned long)&priv->tx_desc[entry],
> > > -		              (unsigned long)&priv->tx_desc[entry + 1]);
> > > -	} while (priv->tx_desc[entry].status & BD_STAT_OWN);
> > > +
> > > +	while (priv->tx_desc[entry].status & BD_STAT_OWN)
> > > +		;
> > >  
> > >  	priv->cur_tx++;
> > >  
> > > @@ -408,9 +400,6 @@ static int rtl8169_eth_rx(struct eth_device *edev)
> > >  
> > >  	entry = priv->cur_rx % NUM_RX_DESC;
> > >  
> > > -	dma_inv_range((unsigned long)&priv->rx_desc[entry],
> > > -	              (unsigned long)&priv->rx_desc[entry + 1]);
> > > -
> > >  	if ((priv->rx_desc[entry].status & BD_STAT_OWN) == 0) {
> > >  		if (!(priv->rx_desc[entry].status & BD_STAT_RX_RES)) {
> > >  			pkt_size = (priv->rx_desc[entry].status & 0x1fff) - 4;
> > > @@ -441,9 +430,6 @@ static int rtl8169_eth_rx(struct eth_device *edev)
> > >  			priv->rx_desc[entry].buf_addr =
> > >  				virt_to_phys(priv->rx_buf +
> > >  				             entry * PKT_BUF_SIZE);
> > > -
> > > -			dma_flush_range((unsigned long)&priv->rx_desc[entry],
> > > -			                (unsigned long)&priv->rx_desc[entry + 1]);
> > >  		} else {
> > >  			dev_err(&edev->dev, "rx error\n");
> > >  		}
> > > -- 
> > > 2.1.0
> > > 
> > > 
> > > _______________________________________________
> > > barebox mailing list
> > > barebox@lists.infradead.org
> > > http://lists.infradead.org/mailman/listinfo/barebox
> > 
> > 
> 
> 


-- 
-- 
Best regards,
  Antony Pavlov

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

* Re: [PATCH] net: rtl8169: remove unnecessary cache maintenance
  2015-01-06 10:56     ` Antony Pavlov
@ 2015-01-06 11:11       ` Lucas Stach
  0 siblings, 0 replies; 6+ messages in thread
From: Lucas Stach @ 2015-01-06 11:11 UTC (permalink / raw)
  To: Antony Pavlov; +Cc: barebox

Am Dienstag, den 06.01.2015, 13:56 +0300 schrieb Antony Pavlov:
> On Mon, 05 Jan 2015 18:37:29 +0100
> Lucas Stach <dev@lynxeye.de> wrote:
> 
> > Am Montag, den 05.01.2015, 20:19 +0300 schrieb Antony Pavlov:
> > > On Sun,  4 Jan 2015 22:09:05 +0100
> > > Lucas Stach <dev@lynxeye.de> wrote:
> > > 
> > > I suppose that this patch can make problems on MIPS with explicid cache handling.
> > > 
> > How would it?
> > This driver is ARM only for now (as we are using ARM MMU functions to
> > flush buffers) until someone gets around to properly implement generic
> > dma sync ops.
> 
> Anyway it is reasonable to add 'depends on ARM' to 'config DRIVER_NET_RTL8169'
> record in drivers/net/Kconfig.
> 
Yes, will do.

> > But even then MIPS knows about uncached memory types which is exactly
> > what should be returned for a dma coherent memory allocation.
> 
> Alas! We can't just add 'volatile' modifier to make pointer uncached on MIPS in general case.

This is not how it works. The memory for the buffer descriptors isn't
general malloc memory, but allocated with dma_alloc_coherent, which
makes sure the memory is uncached. This works on both ARM and MIPS.

Regards,
Lucas

-- 
Pengutronix e.K.             | Lucas Stach                 |
Industrial Linux Solutions   | http://www.pengutronix.de/  |


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

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

end of thread, other threads:[~2015-01-06 11:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-04 21:09 [PATCH] net: rtl8169: remove unnecessary cache maintenance Lucas Stach
2015-01-05 11:52 ` Sascha Hauer
2015-01-05 17:19 ` Antony Pavlov
2015-01-05 17:37   ` Lucas Stach
2015-01-06 10:56     ` Antony Pavlov
2015-01-06 11:11       ` Lucas Stach

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox