Hi Ben,
> Hi Michal,
> 
> Michal Simek wrote:
> 
> <snip>
>>> All of the above mentioned issues are ones that I could easily deal
>>> with, but one thing that really does need to change is that you need to
>>> use the CONFIG_NET_MULTI API.  In other words, your driver should have a
>>> single initialize() function (prototyped in include/netdev.h), and an
>>> eth_device struct that gets registered.  All your access functions
>>> (eth_init, eth_send, eth_recv etc.) will be static and pointed to by the
>>> eth_device struct.  Most drivers are already this way.
>>>     
>>
>> I look at it and I did some change and the main problem is in
>> Microblaze GCC.
>> We use GCC 3.4.1 and CONFIG_NET_MULTI use weak function and
>> board_eth_init is
>> never called. We are working on GCC 4.1.2 but I don't know when I get it.
>>
>>   
> According to the documentation I could find, weak symbols were present
> in gcc 3.4.1.  Are you sure you're using them properly?  Due to the way
> linking is performed in U-boot, any weak symbol overrides need to be in
> source files that have strongly linked symbols.  You'll see that all
> implementations of cpu_eth_init() and board_eth_init() are in files that
> already contain stuff that is sure to be linked.


hmm. I did some tests and I found that the my problem is with this line 40. (I
use board_eth_init initialization)
int board_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init")));
I am not gcc specialist but I smell problem with GCC.

First log is when this line is there. -> here is board_eth_init called

SDRAM :
                Icache:OK
                Dcache:OK
        U-Boot Start:0x91800000
FLASH: 32 MB
MAC:00:E0:0C:00:00:FD
before
after
No ethernet found.
*** Warning - bad CRC, using default environment

U-BOOT for hw

U-Boot-mONStR>


Commented that line.


SDRAM :
                Icache:OK
                Dcache:OK
        U-Boot Start:0x91800000
FLASH: 32 MB
MAC:00:E0:0C:00:00:FD
before
board_eth_initafter
Xilinx LL Temac
*** Warning - bad CRC, using default environment

U-BOOT for hw

U-Boot-mONStR> ping 192.168.0.1
Xilinx LL Temac: Xilinx XPS LocalLink Tri-Mode Ether MAC #0 at 0x81C00000.
100BASE-T/FD
Using Xilinx LL Temac device
host 192.168.0.1 is alive
U-Boot-mONStR>


Not working -> dump

918038c8:       b000ffff        imm     -1
918038cc:       b9f4fdf8        brlid   r15, -520       // 918036c4 
<cpu_eth_init>
918038d0:       10b30000        addk    r5, r19, r0
918038d4:       bca30010        bgei    r3, 16          // 918038e4
918038d8:       b000ffff        imm     -1
918038dc:       b9f4fde8        brlid   r15, -536       // 918036c4 
<cpu_eth_init>

Working dump

918038c8:       b0000001        imm     1
918038cc:       b9f49268        brlid   r15, -28056     // 9181cb34 
<board_eth_init>
918038d0:       10b30000        addk    r5, r19, r0
918038d4:       bca30010        bgei    r3, 16          // 918038e4
918038d8:       b000ffff        imm     -1
918038dc:       b9f4fde8        brlid   r15, -536       // 918036c4 
<cpu_eth_init>

Using cpu_eth_init nothing solve -> gcc has problem with attributes - weak or
alias?

>> I have two more Xilinx eth drivers in U-BOOT and I think that will be
>> the best
>> to do all changes together. What do you think?
>>
>> Thanks,
>> Michal
>>
>>   
> If you're really unable to make this change due to your tools, I'm not
> opposed to pulling this driver in.  I just want to know that you intend
> to port all the Xilinx drivers over some time in the near future.

Yes. I will do it. Below are my changes for ll_temac driver. Do you see any
problem in it?

Thanks,
Michal

> regards,
> Ben


diff --git a/board/xilinx/microblaze-generic/microblaze-generic.c
b/board/xilinx/microblaze-generic/microblaze-generic.c
index f388b77..878a2a3 100644
--- a/board/xilinx/microblaze-generic/microblaze-generic.c
+++ b/board/xilinx/microblaze-generic/microblaze-generic.c
@@ -27,6 +27,7 @@

 #include <common.h>
 #include <config.h>
+#include <netdev.h>
 #include <asm/microblaze_intc.h>
 #include <asm/asm.h>

@@ -67,3 +68,11 @@ void fsl_init2 (void) {
  NULL);
 }
 #endif
+
+int board_eth_init(bd_t *bis)
+{
+       puts (__func__);
+#ifdef CONFIG_XILINX_LL_TEMAC
+       return lltemac_eth_initialize(bis);
+#endif
+}
diff --git a/drivers/net/xilinx_ll_temac.c b/drivers/net/xilinx_ll_temac.c
index 4f897d2..d6d767a 100644
--- a/drivers/net/xilinx_ll_temac.c
+++ b/drivers/net/xilinx_ll_temac.c
@@ -21,6 +21,7 @@
 #include <common.h>
 #include <net.h>
 #include <malloc.h>
+#include <netdev.h>
 #include <asm/processor.h>
 #include <asm/io.h>

@@ -394,16 +395,16 @@ static int xps_ll_temac_recv_fifo()

        if (ll_fifo->isr & 0x04000000 ) {
                ll_fifo->isr = 0xffffffff; /* reset isr */
-       
+
                /* while (ll_fifo->isr); */
                len = ll_fifo->rlf & 0x7FF;
                len2 = (len / 4) + 1;
-       
+
                for (i = 0; i < len2; i++) {
                        val = ll_fifo->rdfd;
                        *buf++ = val ;
                }
-       
+
                /* debugll(1); */
                NetReceive (&rx_buffer, len);
        }
@@ -479,35 +480,19 @@ static int xps_ll_temac_halt(void)
 #endif

 /* halt device */
-void eth_halt(void){
+static void lltemac_eth_halt(struct eth_device *dev)
+{
        link = 0;
 #ifdef ETH_HALTING
        xps_ll_temac_halt();
 #endif
 }

-int eth_init(bd_t *bis)
+static int lltemac_eth_init(struct eth_device *dev, bd_t * bis)
 {
-       static int first = 1;
-       struct eth_device *dev;
-       struct xps_ll_temac_private *lp;
 #ifdef DEBUG
        int i;
 #endif
-
-       if(!first)
-               return 0;
-       first = 0;
-       dev = (struct eth_device *) calloc(1, sizeof(struct eth_device));
-       if (NULL == dev)
-               return 0;
-
-       lp = (struct xps_ll_temac_private *) calloc(1, sizeof(struct
xps_ll_temac_private));
-       if (lp == NULL)
-               return 0;
-       dev->priv = lp;
-       sprintf(dev->name, "eth0");
-
        xps_ll_temac_init(dev, bis);

        printf("%s: Xilinx XPS LocalLink Tri-Mode Ether MAC #%d at 0x%08X.\n",
@@ -522,7 +507,9 @@ int eth_init(bd_t *bis)
        return 1;
 }

-int eth_send(volatile void *packet, int length)
+
+static int lltemac_eth_send(struct eth_device *dev, volatile void *packet,
+                                               int length)
 {
 #ifdef SDMA_MODE
        return xps_ll_temac_send_sdma((unsigned char *)packet, length);
@@ -532,7 +519,7 @@ int eth_send(volatile void *packet, int length)
 #endif
 }

-int eth_rx(void)
+static int lltemac_eth_recv(struct eth_device *dev)
 {
 #ifdef SDMA_MODE
        return xps_ll_temac_recv_sdma();
@@ -541,3 +528,31 @@ int eth_rx(void)
        return xps_ll_temac_recv_fifo();
 #endif
 }
+
+int lltemac_eth_initialize(bd_t * bis)
+{
+       struct eth_device *dev;
+       struct xps_ll_temac_private *lp;
+
+       dev = (struct eth_device *) calloc(1, sizeof(struct eth_device));
+       if (NULL == dev)
+       {
+               puts("Failed to allocate memory\n");
+               return -1;
+       }
+       memset(dev, 0, sizeof(*dev));
+
+       sprintf(dev->name, "Xilinx LL Temac");
+       dev->init = lltemac_eth_init;
+       dev->halt = lltemac_eth_halt;
+       dev->send = lltemac_eth_send;
+       dev->recv = lltemac_eth_recv;
+
+       lp = (struct xps_ll_temac_private *) calloc(1, sizeof(struct
xps_ll_temac_private));
+       if (lp == NULL)
+               return 0;
+       dev->priv = lp;
+
+       eth_register(dev);
+       return 0;
+}
diff --git a/include/configs/microblaze-generic.h
b/include/configs/microblaze-generic.h
index 7110f91..2035923 100644
--- a/include/configs/microblaze-generic.h
+++ b/include/configs/microblaze-generic.h
@@ -67,6 +67,7 @@
 #elif XILINX_LLTEMAC_BASEADDR
        #define CONFIG_XILINX_LL_TEMAC  1
        #define CONFIG_SYS_ENET
+       #define CONFIG_NET_MULTI
 #endif

 #undef ET_DEBUG

diff --git a/include/netdev.h b/include/netdev.h
index 751f0da..398c589 100644
--- a/include/netdev.h
+++ b/include/netdev.h
@@ -51,6 +51,7 @@ int fec_initialize (bd_t *bis);
 int greth_initialize(bd_t *bis);
 void gt6426x_eth_initialize(bd_t *bis);
 int inca_switch_initialize(bd_t *bis);
+int lltemac_eth_initialize(bd_t * bis);
 int macb_eth_initialize(int id, void *regs, unsigned int phy_addr);
 int mcdmafec_initialize(bd_t *bis);
 int mcffec_initialize(bd_t *bis);
diff --git a/lib_microblaze/board.c b/lib_microblaze/board.c
index 30d7641..1274934 100644
--- a/lib_microblaze/board.c
+++ b/lib_microblaze/board.c
@@ -29,6 +29,7 @@
 #include <malloc.h>
 #include <timestamp.h>
 #include <version.h>
+#include <net.h>
 #include <watchdog.h>

 DECLARE_GLOBAL_DATA_PTR;
@@ -43,7 +44,7 @@ extern int interrupts_init (void);
 #endif
 #if defined(CONFIG_CMD_NET)
 extern int eth_init (bd_t * bis);
-extern int getenv_IPaddr (char *);
+//extern int getenv_IPaddr (char *);
 #endif

 /*
@@ -183,7 +184,9 @@ void board_init (void)
        }
        /* IP Address */
        bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
-       eth_init (bd);
+//     eth_init (bd);
+       eth_initialize (bd);
+
 #endif

        /* relocate environment function pointers etc. */
diff --git a/net/eth.c b/net/eth.c
index b7ef09f..f5e6bc4 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -37,7 +37,7 @@ static int __def_eth_init(bd_t *bis)
        return -1;
 }
 int cpu_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init")));
-int board_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init")));
+//int board_eth_init(bd_t *bis) __attribute((weak, alias("__def_eth_init")));

 extern int mv6436x_eth_initialize(bd_t *);
 extern int mv6446x_eth_initialize(bd_t *);
@@ -143,9 +143,13 @@ int eth_initialize(bd_t *bis)
 #endif
        /* Try board-specific initialization first.  If it fails or isn't
         * present, try the cpu-specific initialization */
+       puts ("before\n");
+
        if (board_eth_init(bis) < 0)
                cpu_eth_init(bis);

+       puts("after\n");
+
 #if defined(CONFIG_DB64360) || defined(CONFIG_CPCI750)
        mv6436x_eth_initialize(bis);
 #endif


-- 
Michal Simek, Ing. (M.Eng)
w: www.monstr.eu p: +42-0-721842854
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to