aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorGregory CLEMENT2019-04-17 11:41:42 +0200
committerTom Rini2019-04-26 18:58:20 -0400
commit32dfc12b703faf9e6ab1e544a05ec5dba7d45449 (patch)
tree9a23c1cac15d16ef05b891698830d83844e14c1b /drivers
parent5f626e78491c95dbf3e5036cc0c67aea8b1746fd (diff)
net: lpc32xx: Use IRAM for transmit buffer
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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/lpc32xx_eth.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/net/lpc32xx_eth.c b/drivers/net/lpc32xx_eth.c
index 2d15fc8db20..ec5184edf88 100644
--- a/drivers/net/lpc32xx_eth.c
+++ b/drivers/net/lpc32xx_eth.c
@@ -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);