Re: [RFC 4/5] net: rtl8169: make it work on big-endian system

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

 



On Tue, 4 Feb 2020 15:03:53 +0100
Oleksij Rempel <o.rempel@xxxxxxxxxxxxxx> wrote:

> Hi Antony,
> 
> do you wont to resent this patches as not RFC?

It looks like some additional testing is necessary.

There is an alignment issue on MIPS.
We can't just pass cache line size unaligned address to dma_sync_single_for_device().
Some workaround is necessary, e.g.

--- a/drivers/net/rtl8169.c
+++ b/drivers/net/rtl8169.c
@@ -220,10 +220,10 @@ static void rtl8169_init_ring(struct rtl8169_priv *priv)
 
        priv->tx_desc = dma_alloc_coherent(NUM_TX_DESC *
                                sizeof(struct bufdesc), &priv->tx_desc_phys);
-       priv->tx_buf = malloc(NUM_TX_DESC * PKT_BUF_SIZE);
+       priv->tx_buf = dma_alloc_coherent(NUM_TX_DESC * PKT_BUF_SIZE, DMA_ADDRESS_BROKEN);
        priv->rx_desc = dma_alloc_coherent(NUM_RX_DESC *
                                sizeof(struct bufdesc), &priv->rx_desc_phys);
-       priv->rx_buf = malloc(NUM_RX_DESC * PKT_BUF_SIZE);
+       priv->rx_buf = dma_alloc_coherent(NUM_RX_DESC * PKT_BUF_SIZE, DMA_ADDRESS_BROKEN);
        dma_sync_single_for_device((unsigned long)priv->rx_buf,
                                   NUM_RX_DESC * PKT_BUF_SIZE, DMA_FROM_DEVICE);

> 
> On 09.01.20 08:28, Antony Pavlov wrote:
> > Signed-off-by: Antony Pavlov <antonynpavlov@xxxxxxxxx>
> > ---
> >   drivers/net/rtl8169.c | 34 +++++++++++++++++-----------------
> >   1 file changed, 17 insertions(+), 17 deletions(-)
> > 
> > diff --git a/drivers/net/rtl8169.c b/drivers/net/rtl8169.c
> > index 80997dc89f..3762cb6354 100644
> > --- a/drivers/net/rtl8169.c
> > +++ b/drivers/net/rtl8169.c
> > @@ -230,13 +230,13 @@ static void rtl8169_init_ring(struct rtl8169_priv *priv)
> >   	for (i = 0; i < NUM_RX_DESC; i++) {
> >   		if (i == (NUM_RX_DESC - 1))
> >   			priv->rx_desc[i].status =
> > -				BD_STAT_OWN | BD_STAT_EOR | PKT_BUF_SIZE;
> > +				cpu_to_le32(BD_STAT_OWN | BD_STAT_EOR | PKT_BUF_SIZE);
> >   		else
> >   			priv->rx_desc[i].status =
> > -				BD_STAT_OWN | PKT_BUF_SIZE;
> > +				cpu_to_le32(BD_STAT_OWN | PKT_BUF_SIZE);
> >   
> >   		priv->rx_desc[i].buf_addr =
> > -				virt_to_phys(priv->rx_buf + i * PKT_BUF_SIZE);
> > +				cpu_to_le32(virt_to_phys(priv->rx_buf + i * PKT_BUF_SIZE));
> >   	}
> >   }
> >   
> > @@ -358,21 +358,21 @@ static int rtl8169_eth_send(struct eth_device *edev, void *packet,
> >   
> >   	priv->tx_desc[entry].buf_Haddr = 0;
> >   	priv->tx_desc[entry].buf_addr =
> > -		virt_to_phys(priv->tx_buf + entry * PKT_BUF_SIZE);
> > +		cpu_to_le32(virt_to_phys(priv->tx_buf + entry * PKT_BUF_SIZE));
> >   
> >   	if (entry != (NUM_TX_DESC - 1)) {
> >   		priv->tx_desc[entry].status =
> > -			BD_STAT_OWN | BD_STAT_FS | BD_STAT_LS |
> > -			((packet_length > ETH_ZLEN) ? packet_length : ETH_ZLEN);
> > +			cpu_to_le32(BD_STAT_OWN | BD_STAT_FS | BD_STAT_LS |
> > +			((packet_length > ETH_ZLEN) ? packet_length : ETH_ZLEN));
> >   	} else {
> >   		priv->tx_desc[entry].status =
> > -			BD_STAT_OWN | BD_STAT_EOR | BD_STAT_FS | BD_STAT_LS |
> > -			((packet_length > ETH_ZLEN) ? packet_length : ETH_ZLEN);
> > +			cpu_to_le32(BD_STAT_OWN | BD_STAT_EOR | BD_STAT_FS | BD_STAT_LS |
> > +			((packet_length > ETH_ZLEN) ? packet_length : ETH_ZLEN));
> >   	}
> >   
> >   	RTL_W8(priv, TxPoll, 0x40);
> >   
> > -	while (priv->tx_desc[entry].status & BD_STAT_OWN)
> > +	while (le32_to_cpu(priv->tx_desc[entry].status) & BD_STAT_OWN)
> >   		;
> >   
> >   	dma_sync_single_for_cpu((unsigned long)priv->tx_buf + entry *
> > @@ -391,9 +391,9 @@ static int rtl8169_eth_rx(struct eth_device *edev)
> >   
> >   	entry = priv->cur_rx % NUM_RX_DESC;
> >   
> > -	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;
> > +	if ((le32_to_cpu(priv->rx_desc[entry].status) & BD_STAT_OWN) == 0) {
> > +		if (!(le32_to_cpu(priv->rx_desc[entry].status) & BD_STAT_RX_RES)) {
> > +			pkt_size = (le32_to_cpu(priv->rx_desc[entry].status) & 0x1fff) - 4;
> >   
> >   			dma_sync_single_for_cpu((unsigned long)priv->rx_buf
> >   						+ entry * PKT_BUF_SIZE,
> > @@ -407,14 +407,14 @@ static int rtl8169_eth_rx(struct eth_device *edev)
> >   						   pkt_size, DMA_FROM_DEVICE);
> >   
> >   			if (entry == NUM_RX_DESC - 1)
> > -				priv->rx_desc[entry].status = BD_STAT_OWN |
> > -					BD_STAT_EOR | PKT_BUF_SIZE;
> > +				priv->rx_desc[entry].status = cpu_to_le32(BD_STAT_OWN |
> > +					BD_STAT_EOR | PKT_BUF_SIZE);
> >   			else
> >   				priv->rx_desc[entry].status =
> > -					BD_STAT_OWN | PKT_BUF_SIZE;
> > +					cpu_to_le32(BD_STAT_OWN | PKT_BUF_SIZE);
> >   			priv->rx_desc[entry].buf_addr =
> > -				virt_to_phys(priv->rx_buf +
> > -				             entry * PKT_BUF_SIZE);
> > +				cpu_to_le32(virt_to_phys(priv->rx_buf +
> > +				             entry * PKT_BUF_SIZE));
> >   		} else {
> >   			dev_err(&edev->dev, "rx error\n");
> >   		}
> > 
> 
> Kind regards,
> Oleksij Rempel
> 
> -- 
> 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 |


-- 
Best regards,
  Antony Pavlov

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




[Index of Archives]     [Linux Embedded]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux