aboutsummaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut+renesas@gmail.com>2020-05-17 16:16:45 +0200
committerMarek Vasut <marek.vasut+renesas@gmail.com>2020-06-18 19:34:40 +0200
commit1c38c36eb99abfd1bc46b90c80f7daa5c65f3527 (patch)
treed69aa20a859c0d45fe5b98c726ab3e0dc56dbcf9 /drivers
parente4797c31612d9c31b7b65fce8c3081ae2d150d00 (diff)
downloadu-boot-1c38c36eb99abfd1bc46b90c80f7daa5c65f3527.zip
u-boot-1c38c36eb99abfd1bc46b90c80f7daa5c65f3527.tar.gz
u-boot-1c38c36eb99abfd1bc46b90c80f7daa5c65f3527.tar.bz2
net: pcnet: Simplify private data allocation
The current code is horribly complex. Both the RX and TX buffer descriptors are 16 bytes in size, the init block is 32 bytes in size, so simplify the code such that the entire private data of the driver are allocated cache aligned and the RX and TX buffer descriptors are part of the private data. This removes multiple malloc calls and cache flushes. Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com> Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com> Cc: Joe Hershberger <joe.hershberger@ni.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/pcnet.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/drivers/net/pcnet.c b/drivers/net/pcnet.c
index e7ce79e..72b9380 100644
--- a/drivers/net/pcnet.c
+++ b/drivers/net/pcnet.c
@@ -10,6 +10,7 @@
#include <cpu_func.h>
#include <log.h>
#include <malloc.h>
+#include <memalign.h>
#include <net.h>
#include <netdev.h>
#include <asm/cache.h>
@@ -74,12 +75,13 @@ struct pcnet_uncached_priv {
struct pcnet_rx_head rx_ring[RX_RING_SIZE];
struct pcnet_tx_head tx_ring[TX_RING_SIZE];
struct pcnet_init_block init_block;
-};
+} __aligned(ARCH_DMA_MINALIGN);
struct pcnet_priv {
- struct pcnet_uncached_priv *uc;
+ struct pcnet_uncached_priv ucp;
/* Receive Buffer space */
- unsigned char (*rx_buf)[RX_RING_SIZE][PKT_BUF_SZ + 4];
+ unsigned char rx_buf[RX_RING_SIZE][PKT_BUF_SZ + 4];
+ struct pcnet_uncached_priv *uc;
int cur_rx;
int cur_tx;
};
@@ -335,22 +337,11 @@ static int pcnet_init(struct eth_device *dev, bd_t *bis)
* must be aligned on 16-byte boundaries.
*/
if (lp == NULL) {
- addr = (unsigned long)malloc(sizeof(*lp) + 0x10);
- addr = (addr + 0xf) & ~0xf;
- lp = (struct pcnet_priv *)addr;
-
- addr = (unsigned long)memalign(ARCH_DMA_MINALIGN,
- sizeof(*lp->uc));
- flush_dcache_range(addr, addr + sizeof(*lp->uc));
- addr = (unsigned long)map_physmem(addr,
- roundup(sizeof(*lp->uc), ARCH_DMA_MINALIGN),
- MAP_NOCACHE);
- lp->uc = (struct pcnet_uncached_priv *)addr;
-
- addr = (unsigned long)memalign(ARCH_DMA_MINALIGN,
- sizeof(*lp->rx_buf));
- flush_dcache_range(addr, addr + sizeof(*lp->rx_buf));
- lp->rx_buf = (void *)addr;
+ lp = malloc_cache_aligned(sizeof(*lp));
+ lp->uc = map_physmem((phys_addr_t)&lp->ucp,
+ sizeof(lp->ucp), MAP_NOCACHE);
+ flush_dcache_range((unsigned long)lp,
+ (unsigned long)lp + sizeof(*lp));
}
uc = lp->uc;
@@ -364,7 +355,7 @@ static int pcnet_init(struct eth_device *dev, bd_t *bis)
*/
lp->cur_rx = 0;
for (i = 0; i < RX_RING_SIZE; i++) {
- addr = pcnet_virt_to_mem(dev, (*lp->rx_buf)[i]);
+ addr = pcnet_virt_to_mem(dev, lp->rx_buf[i]);
uc->rx_ring[i].base = cpu_to_le32(addr);
uc->rx_ring[i].buf_length = cpu_to_le16(-PKT_BUF_SZ);
uc->rx_ring[i].status = cpu_to_le16(0x8000);
@@ -521,7 +512,7 @@ static int pcnet_recv (struct eth_device *dev)
printf("%s: Rx%d: invalid packet length %d\n",
dev->name, lp->cur_rx, pkt_len);
} else {
- buf = (*lp->rx_buf)[lp->cur_rx];
+ buf = lp->rx_buf[lp->cur_rx];
invalidate_dcache_range((unsigned long)buf,
(unsigned long)buf + pkt_len);
net_process_received_packet(buf, pkt_len);