]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: lpc32xx: Use IRAM for transmit buffer
authorGregory CLEMENT <gregory.clement@bootlin.com>
Wed, 17 Apr 2019 09:41:42 +0000 (11:41 +0200)
committerTom Rini <trini@konsulko.com>
Fri, 26 Apr 2019 22:58:20 +0000 (18:58 -0400)
Since the introduction of the driver, some memory in IRAM is reserved for
the TX buffers.

However there are not used but instead of it, it is the buffer provided
by the net stack which is used. As stated in the comment of the driver,
not using the IRAM buffer could cause cache issue and lower the
throughput.

For the second argument it is less the case for transmitting buffers
because the throughput gain in IRAM is mitigated by the time to copy the
data from RAM to IRAM, but the first argument is still valid and indeed
this patch fixes issue seen with Ethernet on some boards

Signed-off-by: Gregory CLEMENT <gregory.clement@bootlin.com>
drivers/net/lpc32xx_eth.c

index 2d15fc8db20906b4fb57a42fe0691d28ef9c5aa9..ec5184edf887fc4c485d3ef049e70b81ba8cba20 100644 (file)
@@ -373,7 +373,8 @@ static int lpc32xx_eth_send(struct eth_device *dev, void *dataptr, int datasize)
        tx_index = readl(&regs->txproduceindex);
 
        /* set up transmit packet */
-       writel((u32)dataptr, &bufs->tx_desc[tx_index].packet);
+       memcpy((void *)&bufs->tx_buf[tx_index * PKTSIZE_ALIGN],
+              (void *)dataptr, datasize);
        writel(TX_CTRL_LAST | ((datasize - 1) & TX_CTRL_TXSIZE),
               &bufs->tx_desc[tx_index].control);
        writel(0, &bufs->tx_stat[tx_index].statusinfo);
@@ -508,6 +509,11 @@ static int lpc32xx_eth_init(struct eth_device *dev)
        writel((u32)(&bufs->rx_stat), &regs->rxstatus);
        writel(RX_BUF_COUNT-1, &regs->rxdescriptornumber);
 
+       /* set up transmit buffers */
+       for (index = 0; index < TX_BUF_COUNT; index++)
+               bufs->tx_desc[index].packet =
+                       (u32)(bufs->tx_buf + index * PKTSIZE_ALIGN);
+
        /* Enable broadcast and matching address packets */
        writel(RXFILTERCTRL_ACCEPTBROADCAST |
                RXFILTERCTRL_ACCEPTPERFECT, &regs->rxfilterctrl);