[U-Boot-Users] [PATCH][BUGFIX] AT91RM9200: eliminate hard-coded buffer address

Hi,
the driver for the AT91RM9200 on-chip Ethernet interface uses a hard-coded address of the transfer buffer descriptor table.
This is a ticking time-bomb (well, in fact it just blew up here overwriting U-Boot), AND the driver will not work at all on boards with less than 16MiB of RAM.
The patch below lets the linker decide where to place the buffer (due to this, I had to change the start-address for the csb637 board - AFAICT other AT91RM9200-based boards are not impaired by the larger size of U-Boot).
The Atmel errata #11 states that the transfer buffer descriptor table must be aligned on a 16-word boundary. As it turned out, this is insufficient - it seems the table must be aligned on a boundary at least as large as the table itself (in Linux this is not an issue - the table is aligned on a PAGE_SIZE (4096) boundary).
Cheers Anders
Signed-off-by: Anders Larsen alarsen@rea.de
CHANGELOG: Eliminate the hard-coded address of the Ethernet transfer buffer Patch by Anders Larsen, 07 Oct 2005
---
board/csb637/config.mk | 2 +- cpu/arm920t/at91rm9200/ether.c | 23 ++++++++--------------- 2 files changed, 9 insertions(+), 16 deletions(-)
diff --git a/board/csb637/config.mk b/board/csb637/config.mk --- a/board/csb637/config.mk +++ b/board/csb637/config.mk @@ -1 +1 @@ -TEXT_BASE = 0x23fe0000 +TEXT_BASE = 0x23fc0000 diff --git a/cpu/arm920t/at91rm9200/ether.c b/cpu/arm920t/at91rm9200/ether.c --- a/cpu/arm920t/at91rm9200/ether.c +++ b/cpu/arm920t/at91rm9200/ether.c @@ -44,21 +44,19 @@ typedef struct { #define RBF_LOCAL2 (1<<24) #define RBF_LOCAL1 (1<<23)
-/* Emac Buffers in last 512KBytes of SDRAM*/ -/* Be careful, buffer size is limited to 512KBytes !!! */ -#define RBF_FRAMEMAX 100 -/*#define RBF_FRAMEMEM 0x200000 */ -#define RBF_FRAMEMEM 0x21F80000 +#define RBF_FRAMEMAX 64 #define RBF_FRAMELEN 0x600
-#define RBF_FRAMEBTD RBF_FRAMEMEM -#define RBF_FRAMEBUF (RBF_FRAMEMEM + RBF_FRAMEMAX*sizeof(rbf_t)) - - #ifdef CONFIG_DRIVER_ETHER
#if (CONFIG_COMMANDS & CFG_CMD_NET)
+/* alignment as per Errata #11 (64 bytes) is insufficient! */ +rbf_t rbfdt[RBF_FRAMEMAX] __attribute((aligned(512))); +rbf_t *rbfp; + +unsigned char rbf_framebuf[RBF_FRAMEMAX][RBF_FRAMELEN] __attribute((aligned(4))); + /* structure to interface the PHY */ AT91S_PhyOps PhyOps;
@@ -153,9 +150,6 @@ UCHAR at91rm9200_EmacWritePhy (AT91PS_EM }
-rbf_t *rbfdt; -rbf_t *rbfp; - int eth_init (bd_t * bd) { int ret; @@ -188,9 +182,8 @@ int eth_init (bd_t * bd) p_mac->EMAC_CFG |= AT91C_EMAC_CSR; /* Clear statistics */
/* Init Ehternet buffers */ - rbfdt = (rbf_t *) RBF_FRAMEBTD; for (i = 0; i < RBF_FRAMEMAX; i++) { - rbfdt[i].addr = RBF_FRAMEBUF + RBF_FRAMELEN * i; + rbfdt[i].addr = rbf_framebuf[i]; rbfdt[i].size = 0; } rbfdt[RBF_FRAMEMAX - 1].addr |= RBF_WRAP;

In message fc.004c4e480038bcd5004c4e480038bcd5.38bcf2@rea.de you wrote:
CHANGELOG: Eliminate the hard-coded address of the Ethernet transfer buffer Patch by Anders Larsen, 07 Oct 2005
Added, thanks.
Best regards,
Wolfgang Denk
participants (2)
-
Anders Larsen
-
Wolfgang Denk