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