summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorTsiChung Liew <Tsi-Chung.Liew@freescale.com>2008-04-30 12:11:19 -0500
committerWolfgang Denk <wd@denx.de>2008-04-30 22:38:49 +0200
commitf32f7fe7bd3a5bda3a476520f00e1aca7c2103a9 (patch)
treee7961e1d3aa084360df1d6c8268ccec3dccf3462 /drivers
parent886d90176fc257e0ab4d0db05d11d0749bbed3ca (diff)
downloadu-boot-imx-f32f7fe7bd3a5bda3a476520f00e1aca7c2103a9.zip
u-boot-imx-f32f7fe7bd3a5bda3a476520f00e1aca7c2103a9.tar.gz
u-boot-imx-f32f7fe7bd3a5bda3a476520f00e1aca7c2103a9.tar.bz2
ColdFire: Fix ethernet hang issue for mcf547x_8x
The ethernet hang is caused by receiving buffer in DRAM is not yet ready due to access cycles require longer time in DRAM. Relocate DMA buffer descriptors from DRAM to internal SRAM. Signed-off-by: TsiChung Liew <Tsi-Chung.Liew@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/fsl_mcdmafec.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/drivers/net/fsl_mcdmafec.c b/drivers/net/fsl_mcdmafec.c
index 0c876f3..2ef91f2 100644
--- a/drivers/net/fsl_mcdmafec.c
+++ b/drivers/net/fsl_mcdmafec.c
@@ -95,7 +95,11 @@ struct fec_info_dma fec_info[] = {
0, /* duplex and speed */
0, /* phy name */
0, /* phy name init */
+#ifdef CFG_DMA_USE_INTSRAM
+ DBUF_LENGTH, /* RX BD */
+#else
0, /* RX BD */
+#endif
0, /* TX BD */
0, /* rx Index */
0, /* tx Index */
@@ -164,7 +168,8 @@ static void dbg_fec_regs(struct eth_device *dev)
}
#endif
-static void set_fec_duplex_speed(volatile fecdma_t * fecp, bd_t * bd, int dup_spd)
+static void set_fec_duplex_speed(volatile fecdma_t * fecp, bd_t * bd,
+ int dup_spd)
{
if ((dup_spd >> 16) == FULL) {
/* Set maximum frame length */
@@ -513,6 +518,9 @@ int mcdmafec_initialize(bd_t * bis)
{
struct eth_device *dev;
int i;
+#ifdef CFG_DMA_USE_INTSRAM
+ u32 tmp = CFG_INTSRAM + 0x2000;
+#endif
for (i = 0; i < sizeof(fec_info) / sizeof(fec_info[0]); i++) {
@@ -533,6 +541,17 @@ int mcdmafec_initialize(bd_t * bis)
dev->recv = fec_recv;
/* setup Receive and Transmit buffer descriptor */
+#ifdef CFG_DMA_USE_INTSRAM
+ fec_info[i].rxbd = (int)fec_info[i].rxbd + tmp;
+ tmp = fec_info[i].rxbd;
+ fec_info[i].txbd =
+ (int)fec_info[i].txbd + tmp + (PKTBUFSRX * sizeof(cbd_t));
+ tmp = fec_info[i].txbd;
+ fec_info[i].txbuf =
+ (int)fec_info[i].txbuf + tmp +
+ (CFG_TX_ETH_BUFFER * sizeof(cbd_t));
+ tmp = fec_info[i].txbuf;
+#else
fec_info[i].rxbd =
(cbd_t *) memalign(CFG_CACHELINE_SIZE,
(PKTBUFSRX * sizeof(cbd_t)));
@@ -541,6 +560,7 @@ int mcdmafec_initialize(bd_t * bis)
(CFG_TX_ETH_BUFFER * sizeof(cbd_t)));
fec_info[i].txbuf =
(char *)memalign(CFG_CACHELINE_SIZE, DBUF_LENGTH);
+#endif
#ifdef ET_DEBUG
printf("rxbd %x txbd %x\n",