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

Anders Larsen alarsen at rea.de
Fri Oct 7 16:53:33 CEST 2005


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 at 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;





More information about the U-Boot mailing list