Updated support for Embedded Artist and FDI boards.
authorSrinivas Bakki <srinivas.bakki@nxp.com>
Tue, 28 Feb 2012 16:02:28 +0000 (16:02 +0000)
committerSrinivas Bakki <srinivas.bakki@nxp.com>
Tue, 28 Feb 2012 16:02:28 +0000 (16:02 +0000)
board/nxp/ea3250/Makefile
board/nxp/ea3250/ea3250.c
board/nxp/ea3250/net.c
board/nxp/fdi3250/Makefile
board/nxp/fdi3250/fdi3250.c
board/nxp/fdi3250/net.c
include/configs/ea3250.h
include/configs/fdi3250.h

index 135a524..bf6d43a 100644 (file)
@@ -23,7 +23,7 @@
 
 include $(TOPDIR)/config.mk
 
-LIB    = $(obj)lib$(BOARD).a
+LIB    = $(obj)lib$(BOARD).o
 
 COBJS  := ea3250.o net.o
 COBJS  += lowlevelsys_init.o
@@ -34,7 +34,8 @@ OBJS  := $(addprefix $(obj),$(COBJS))
 SOBJS  := $(addprefix $(obj),$(SOBJS))
 
 $(LIB):        $(obj).depend $(OBJS) $(SOBJS)
-       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
 
 clean:
        rm -f $(SOBJS) $(OBJS)
index 99ef996..171e55b 100644 (file)
@@ -92,13 +92,6 @@ DECLARE_GLOBAL_DATA_PTR;
 /*
  * Dummy function to handle errors for EABI incompatibility
  */
-void raise(void)
-{
-}
-
-/*
- * Dummy function to handle errors for EABI incompatibility
- */
 void abort(void)
 {
 }
@@ -133,16 +126,17 @@ ulong get_timer (ulong base)
        return tcr - base;
 }
 
-void timer_init(void)
+int timer_init(void)
 {
        /* Enable timer system clock */
        CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 |=
                CLKPWR_TMRPWMCLK_TIMER0_EN;
 
        reset_timer();
+       return 0;
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned long tbaseclk;
 
index 29f3bd3..58e8bd4 100644 (file)
@@ -43,7 +43,6 @@ static unsigned long pRXVBuffs [ENET_MAX_RX_PACKETS];
 static unsigned long ethbuffs[4096];\r
 #endif
 
-
 static void msDelay(unsigned long ms)\r
 {\r
        udelay(ms * 1000);
@@ -78,7 +77,7 @@ static int RMII_Write (unsigned long PhyReg, unsigned long Value)
 }\r
 \r
 //------------------------------------------------------------------------------\r
-int RMII_Read(unsigned long PhyReg, unsigned long *data) \r
+static int RMII_Read(unsigned long PhyReg, unsigned long *data) \r
 {\r
        unsigned long mst = 250;\r
        int sts = 0;\r
@@ -108,56 +107,25 @@ int RMII_Read(unsigned long PhyReg, unsigned long *data)
        return sts;\r
 }\r
 \r
-//------------------------------------------------------------------------------\r
-int HYPHYReset(void)\r
-{\r
-       int goodacc;\r
-       unsigned long tmp1, mst;\r
-\r
-       // Reset the PHY and wait for reset to complete\r
-       goodacc = RMII_Write(PHY_BMCR, PHY_BMCR_RESET);\r
-       if (goodacc == 0)\r
-       {\r
-               return 0;\r
-       }\r
-       mst = 400;\r
-       goodacc = 0;\r
-       while (mst > 0)\r
-       {\r
-               RMII_Read(PHY_BMCR, &tmp1);\r
-               if ((tmp1 & PHY_BMCR_RESET) == 0)\r
-               {\r
-                       mst = 0;\r
-                       goodacc = 1;\r
-               }\r
-               else\r
-               {\r
-                       mst--;\r
-                       msDelay(1);\r
-               }\r
-       }\r
-\r
-       return goodacc;\r
-}\r
-\r
+
 static int phy_get_link_status (void)
 {
         unsigned long status;
 
         /* Status is read once to clear old link state */
-        RMII_Read(PHY_BMSR,&status);
+        RMII_Read(MII_BMSR,&status);
 
         /*
         * Wait if the link is up, and autonegotiation is in progress
         * (ie - we're capable and it's not done)
         */
         status = 0;
-        RMII_Read(PHY_BMSR,&status);
-        if ((status & PHY_BMSR_LS) && (status & PHY_BMSR_AUTN_ABLE)
-            && !(status & PHY_BMSR_AUTN_COMP)) {
+        RMII_Read(MII_BMSR,&status);
+        if ((status & BMSR_LSTATUS) && (status & BMSR_ANEGCAPABLE)
+            && !(status & BMSR_ANEGCOMPLETE)) {
                 int i = 0;
 
-                while (!(status & PHY_BMSR_AUTN_COMP)) {
+                while (!(status & BMSR_ANEGCOMPLETE)) {
                         /* Timeout reached */
                         if (i > 1000) {
                                 printf("Timeout\n");
@@ -165,11 +133,11 @@ static int phy_get_link_status (void)
                         }
                         i++;
                         msDelay(1);   /* 1 ms */
-                        RMII_Read(PHY_BMSR,&status);
+                        RMII_Read(MII_BMSR,&status);
                 }
                 return 0;
         } else {
-                if (status & PHY_BMSR_LS)
+                if (status & BMSR_LSTATUS)
                         return 0;
                 else
                         return 1;
@@ -178,7 +146,7 @@ static int phy_get_link_status (void)
 }
 
 //------------------------------------------------------------------------------\r
-int txrx_setup(void)\r
+static int txrx_setup(void)\r
 {\r
        int idx;\r
        unsigned long *pTXStatusL, pbase1, pbase2, pbase3;\r
@@ -267,12 +235,95 @@ int txrx_setup(void)
     return 1;\r
 }\r
 \r
+
+/* Get a data block via Ethernet */
+static int eth_recv (struct eth_device *dev)
+{
+       unsigned long idx, length;\r
+
+       // Determine if a frame has been received\r
+       length = 0;\r
+       idx = ENETMAC->rxconsumeindex;\r
+       if (ENETMAC->rxproduceindex != idx)\r
+       {
+               // Clear interrupt\r
+               ENETMAC->intclear = MACINT_RXDONEINTEN;\r
+\r
+               // Frame received, get size of RX packet\r
+               length = (pRXStatus[idx].statusinfo & 0x7FF);\r
+
+               /* Pass the packet up to the protocol layer */
+               if (length > 0)
+               {
+                       memcpy((void *) NetRxPackets[0], (void *) pRXVBuffs [idx], length);\r
+                       NetReceive (NetRxPackets[0], (unsigned short) length);
+               }
+
+               // Return DMA buffer\r
+               idx++;\r
+               if (idx >= ENET_MAX_TX_PACKETS)\r
+               {\r
+                       idx = 0;\r
+               }\r
+               ENETMAC->rxconsumeindex = (unsigned long) idx;\r
+       }\r
+\r
+       return (int) length;
+}
+
+
+/* Send a data block via Ethernet. */
+static int eth_tx (struct eth_device *dev,volatile void *packet, int length)
+{
+       unsigned long idx, cidx, fb;
+
+       // Determine number of free buffers and wait for a buffer if needed\r
+       fb = 0;\r
+       while (fb == 0)\r
+       {\r
+               idx = ENETMAC->txproduceindex;\r
+               cidx = ENETMAC->txconsumeindex;\r
+\r
+               if (idx == cidx)\r
+               {\r
+                       // Producer and consumer are the same, all buffers are free\r
+                       fb = ENET_MAX_TX_PACKETS;\r
+               }\r
+               else if (cidx > idx)\r
+               {\r
+                       fb = (ENET_MAX_TX_PACKETS - 1) -\r
+                               ((idx + ENET_MAX_TX_PACKETS) - cidx);\r
+               }\r
+               else\r
+               {\r
+                       fb = (ENET_MAX_TX_PACKETS - 1) - (cidx - idx);\r
+               }\r
+       }\r
+\r
+       // Update descriptor with new frame size\r
+       pTXDesc[idx].control = (length | 0x40000000);\r
+\r
+       // Move data to buffer\r
+       memcpy((void *) pTXVBuffs [idx], (void *) packet, length);\r
+\r
+       // Get next index for transmit data DMA buffer and descriptor\r
+       idx++;\r
+       if (idx >= ENET_MAX_TX_PACKETS)\r
+       {\r
+               idx = 0;\r
+       }\r
+       ENETMAC->txproduceindex = idx;\r
+\r
+       return 0;
+}
+
 //------------------------------------------------------------------------------\r
-int HWInit(bd_t * bd)\r
+int HWInit(struct eth_device *dev, bd_t * bis)\r
 {\r
        int btemp;\r
        unsigned int duplex, speed;
        unsigned long tmp1, mst = 250;\r
+       unsigned char bi_enetaddr[6];
 
        // Enable MAC interface\r
        CLKPWR->clkpwr_macclk_ctrl = (CLKPWR_MACCTRL_HRCCLK_EN |\r
@@ -315,14 +366,8 @@ int HWInit(bd_t * bd)
        // MII setup\r
        ENETMAC->command = COMMAND_PASSRUNTFRAME;\r
 #endif\r
-       // Enable rate auto-negotiation for the link\r
-       if (RMII_Write(PHY_BMCR,\r
-               (PHY_BMCR_100MB | PHY_BMCR_AUTON)) == 0)\r
-       {\r
-               return 0;\r
-       }\r
         
-       mst = 1000;
+        mst = 1000;
         btemp = 1;
         while(mst > 0)
         {
@@ -377,10 +422,11 @@ int HWInit(bd_t * bd)
                printf("ENET:10Base\n");\r
        }\r
 \r
+          eth_getenv_enetaddr("ethaddr",bi_enetaddr);
        // Save station address\r
-       ENETMAC->sa [2] = (unsigned long) (bd->bi_enetaddr[0] | (bd->bi_enetaddr[1] << 8));\r
-       ENETMAC->sa [1] = (unsigned long) (bd->bi_enetaddr[2] | (bd->bi_enetaddr[3] << 8));\r
-       ENETMAC->sa [0] = (unsigned long) (bd->bi_enetaddr[4] | (bd->bi_enetaddr[5] << 8));\r
+       ENETMAC->sa [2] = (unsigned long) (bi_enetaddr[0] | (bi_enetaddr[1] << 8));\r
+       ENETMAC->sa [1] = (unsigned long) (bi_enetaddr[2] | (bi_enetaddr[3] << 8));\r
+       ENETMAC->sa [0] = (unsigned long) (bi_enetaddr[4] | (bi_enetaddr[5] << 8));\r
 \r
        // Setup TX and RX descriptors\r
        txrx_setup();\r
@@ -401,7 +447,7 @@ int HWInit(bd_t * bd)
        // to 'prime' the MAC. The first packet after a reset seems to wait\r
        // until at least 2 packets are ready to go.\r
        tmp1 = 0;\r
-       eth_send(&tmp1, 4);\r
+       eth_tx(dev,&tmp1, 4);\r
 \r
        return 1;\r
 }\r
@@ -409,8 +455,7 @@ int HWInit(bd_t * bd)
 //------------------------------------------------------------------------------\r
 int HWDeInit(void)\r
 {\r
-       // Reset PHY\r
-       (void) HYPHYReset();\r
+
 \r
        // Reset all MAC logic\r
        ENETMAC->mac1 = (MAC1_SOFT_RESET | MAC1_SIMULATION_RESET |\r
@@ -430,122 +475,45 @@ int HWDeInit(void)
        return 1;\r
 }\r
 
-void eth_halt (void)
+static int eth_stop (void)
 {
        HWDeInit();
 }
-
-int eth_init (bd_t * bd)
+int board_eth_init (bd_t *bd)
 {
        int rc;
-
+       unsigned char bi_enetaddr[6];
+       struct eth_device *dev;
        char *s, *e;
        int i;
 
+
+       dev = malloc(sizeof(*dev));
+       if(!dev) {
+         return 0;
+       }
+       memset(dev, 0, sizeof(*dev));
+
+
        s = getenv ("ethaddr");
        for (i = 0; i < 6; ++i) {
-               bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
+               dev->enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
                if (s)
                        s = (*e) ? e + 1 : e;
        }
 
-\r
        printf ("\tHW MAC address:  "
                "%02X:%02X:%02X:%02X:%02X:%02X\n",
-               bd->bi_enetaddr[0], bd->bi_enetaddr[1],
-               bd->bi_enetaddr[2], bd->bi_enetaddr[3],
-               bd->bi_enetaddr[4], bd->bi_enetaddr[5] );
+               dev->enetaddr[0], dev->enetaddr[1],
+               dev->enetaddr[2], dev->enetaddr[3],
+               dev->enetaddr[4], dev->enetaddr[5] );
 
-       rc = HWInit(bd);\r
-\r
-       // De-init if an error occurred\r
-       if (rc == 0)\r
-       {
-               printf ("ENET init failure\n");\r
-               HWDeInit();\r
-               return -1;
-       }\r
+         dev->init = HWInit;
+         dev->halt = eth_stop;
+         dev->send = eth_tx;
+         dev->recv = eth_recv;
+         
+         eth_register(dev);
 \r
        return 0;\r
 }
-
-/* Get a data block via Ethernet */
-int eth_rx (void)
-{
-       unsigned long idx, length;\r
-
-       // Determine if a frame has been received\r
-       length = 0;\r
-       idx = ENETMAC->rxconsumeindex;\r
-       if (ENETMAC->rxproduceindex != idx)\r
-       {
-               // Clear interrupt\r
-               ENETMAC->intclear = MACINT_RXDONEINTEN;\r
-\r
-               // Frame received, get size of RX packet\r
-               length = (pRXStatus[idx].statusinfo & 0x7FF);\r
-
-               /* Pass the packet up to the protocol layer */
-               if (length > 0)
-               {
-                       memcpy((void *) NetRxPackets[0], (void *) pRXVBuffs [idx], length);\r
-                       NetReceive (NetRxPackets[0], (unsigned short) length);
-               }
-
-               // Return DMA buffer\r
-               idx++;\r
-               if (idx >= ENET_MAX_TX_PACKETS)\r
-               {\r
-                       idx = 0;\r
-               }\r
-               ENETMAC->rxconsumeindex = (unsigned long) idx;\r
-       }\r
-\r
-       return (int) length;
-}
-
-/* Send a data block via Ethernet. */
-int eth_send (volatile void *packet, int length)
-{
-       unsigned long idx, cidx, fb;
-
-       // Determine number of free buffers and wait for a buffer if needed\r
-       fb = 0;\r
-       while (fb == 0)\r
-       {\r
-               idx = ENETMAC->txproduceindex;\r
-               cidx = ENETMAC->txconsumeindex;\r
-\r
-               if (idx == cidx)\r
-               {\r
-                       // Producer and consumer are the same, all buffers are free\r
-                       fb = ENET_MAX_TX_PACKETS;\r
-               }\r
-               else if (cidx > idx)\r
-               {\r
-                       fb = (ENET_MAX_TX_PACKETS - 1) -\r
-                               ((idx + ENET_MAX_TX_PACKETS) - cidx);\r
-               }\r
-               else\r
-               {\r
-                       fb = (ENET_MAX_TX_PACKETS - 1) - (cidx - idx);\r
-               }\r
-       }\r
-\r
-       // Update descriptor with new frame size\r
-       pTXDesc[idx].control = (length | 0x40000000);\r
-\r
-       // Move data to buffer\r
-       memcpy((void *) pTXVBuffs [idx], (void *)packet, length);\r
-\r
-       // Get next index for transmit data DMA buffer and descriptor\r
-       idx++;\r
-       if (idx >= ENET_MAX_TX_PACKETS)\r
-       {\r
-               idx = 0;\r
-       }\r
-       ENETMAC->txproduceindex = idx;\r
-\r
-       return 0;
-}
-
index 90cfb7e..7c16002 100644 (file)
@@ -23,7 +23,7 @@
 
 include $(TOPDIR)/config.mk
 
-LIB    = $(obj)lib$(BOARD).a
+LIB    = $(obj)lib$(BOARD).o
 
 COBJS  := fdi3250.o net.o
 COBJS  += lowlevelsys_init.o
@@ -34,7 +34,8 @@ OBJS  := $(addprefix $(obj),$(COBJS))
 SOBJS  := $(addprefix $(obj),$(SOBJS))
 
 $(LIB):        $(obj).depend $(OBJS) $(SOBJS)
-       $(AR) $(ARFLAGS) $@ $(OBJS) $(SOBJS)
+       $(call cmd_link_o_target, $(OBJS) $(SOBJS))
+
 
 clean:
        rm -f $(SOBJS) $(OBJS)
index 7f5ee10..366f66d 100644 (file)
@@ -33,13 +33,6 @@ DECLARE_GLOBAL_DATA_PTR;
 /*
  * Dummy function to handle errors for EABI incompatibility
  */
-void raise(void)
-{
-}
-
-/*
- * Dummy function to handle errors for EABI incompatibility
- */
 void abort(void)
 {
 }
@@ -74,16 +67,17 @@ ulong get_timer (ulong base)
        return tcr - base;
 }
 
-void timer_init(void)
+int timer_init(void)
 {
        /* Enable timer system clock */
        CLKPWR->clkpwr_timers_pwms_clk_ctrl_1 |=
                CLKPWR_TMRPWMCLK_TIMER0_EN;
 
        reset_timer();
+       return 0;
 }
 
-void udelay(unsigned long usec)
+void __udelay(unsigned long usec)
 {
        unsigned long tbaseclk;
 
index 55215e2..017cccc 100644 (file)
@@ -76,7 +76,7 @@ static int RMII_Write (unsigned long PhyReg, unsigned long Value)
 }
 
 //------------------------------------------------------------------------------
-int RMII_Read(unsigned long PhyReg, unsigned long *data) 
+static int RMII_Read(unsigned long PhyReg, unsigned long *data) 
 {
        unsigned long mst = 250;
        int sts = 0;
@@ -106,56 +106,25 @@ int RMII_Read(unsigned long PhyReg, unsigned long *data)
        return sts;
 }
 
-//------------------------------------------------------------------------------
-int HYPHYReset(void)
-{
-       int goodacc;
-       unsigned long tmp1, mst;
-
-       // Reset the PHY and wait for reset to complete
-       goodacc = RMII_Write(PHY_BMCR, PHY_BMCR_RESET);
-       if (goodacc == 0)
-       {
-               return 0;
-       }
-       mst = 400;
-       goodacc = 0;
-       while (mst > 0)
-       {
-               RMII_Read(PHY_BMCR, &tmp1);
-               if ((tmp1 & PHY_BMCR_RESET) == 0)
-               {
-                       mst = 0;
-                       goodacc = 1;
-               }
-               else
-               {
-                       mst--;
-                       msDelay(1);
-               }
-       }
-
-       return goodacc;
-}
 
 static int phy_get_link_status (void)
 {
         unsigned long status;
 
         /* Status is read once to clear old link state */
-        RMII_Read(PHY_BMSR,&status);
+        RMII_Read(MII_BMSR,&status);
 
         /*
         * Wait if the link is up, and autonegotiation is in progress
         * (ie - we're capable and it's not done)
         */
         status = 0;
-        RMII_Read(PHY_BMSR,&status);
-        if ((status & PHY_BMSR_LS) && (status & PHY_BMSR_AUTN_ABLE)
-            && !(status & PHY_BMSR_AUTN_COMP)) {
+        RMII_Read(MII_BMSR,&status);
+        if ((status & BMSR_LSTATUS) && (status & BMSR_ANEGCAPABLE)
+            && !(status & BMSR_ANEGCOMPLETE)) {
                 int i = 0;
 
-                while (!(status & PHY_BMSR_AUTN_COMP)) {
+                while (!(status & BMSR_ANEGCOMPLETE)) {
                         /* Timeout reached */
                         if (i > 1000) {
                                 printf("Timeout\n");
@@ -163,11 +132,11 @@ static int phy_get_link_status (void)
                         }
                         i++;
                         msDelay(1);   /* 1 ms */
-                        RMII_Read(PHY_BMSR,&status);
+                        RMII_Read(MII_BMSR,&status);
                 }
                 return 0;
         } else {
-                if (status & PHY_BMSR_LS)
+                if (status & BMSR_LSTATUS)
                         return 0;
                 else
                         return 1;
@@ -176,7 +145,7 @@ static int phy_get_link_status (void)
 }
 
 //------------------------------------------------------------------------------
-int txrx_setup(void)
+static int txrx_setup(void)
 {
        int idx;
        unsigned long *pTXStatusL, pbase1, pbase2, pbase3;
@@ -264,13 +233,94 @@ int txrx_setup(void)
 
     return 1;
 }
+/* Get a data block via Ethernet */
+static int eth_recv (struct eth_device *dev)
+{
+       unsigned long idx, length;\r
+
+       // Determine if a frame has been received\r
+       length = 0;\r
+       idx = ENETMAC->rxconsumeindex;\r
+       if (ENETMAC->rxproduceindex != idx)\r
+       {
+               // Clear interrupt\r
+               ENETMAC->intclear = MACINT_RXDONEINTEN;\r
+\r
+               // Frame received, get size of RX packet\r
+               length = (pRXStatus[idx].statusinfo & 0x7FF);\r
+
+               /* Pass the packet up to the protocol layer */
+               if (length > 0)
+               {
+                       memcpy((void *) NetRxPackets[0], (void *) pRXVBuffs [idx], length);\r
+                       NetReceive (NetRxPackets[0], (unsigned short) length);
+               }
+
+               // Return DMA buffer\r
+               idx++;\r
+               if (idx >= ENET_MAX_TX_PACKETS)\r
+               {\r
+                       idx = 0;\r
+               }\r
+               ENETMAC->rxconsumeindex = (unsigned long) idx;\r
+       }\r
+\r
+       return (int) length;
+}
+
+
+/* Send a data block via Ethernet. */
+static int eth_tx (struct eth_device *dev,volatile void *packet, int length)
+{
+       unsigned long idx, cidx, fb;
+
+       // Determine number of free buffers and wait for a buffer if needed\r
+       fb = 0;\r
+       while (fb == 0)\r
+       {\r
+               idx = ENETMAC->txproduceindex;\r
+               cidx = ENETMAC->txconsumeindex;\r
+\r
+               if (idx == cidx)\r
+               {\r
+                       // Producer and consumer are the same, all buffers are free\r
+                       fb = ENET_MAX_TX_PACKETS;\r
+               }\r
+               else if (cidx > idx)\r
+               {\r
+                       fb = (ENET_MAX_TX_PACKETS - 1) -\r
+                               ((idx + ENET_MAX_TX_PACKETS) - cidx);\r
+               }\r
+               else\r
+               {\r
+                       fb = (ENET_MAX_TX_PACKETS - 1) - (cidx - idx);\r
+               }\r
+       }\r
+\r
+       // Update descriptor with new frame size\r
+       pTXDesc[idx].control = (length | 0x40000000);\r
+\r
+       // Move data to buffer\r
+       memcpy((void *) pTXVBuffs [idx], (void *) packet, length);\r
+\r
+       // Get next index for transmit data DMA buffer and descriptor\r
+       idx++;\r
+       if (idx >= ENET_MAX_TX_PACKETS)\r
+       {\r
+               idx = 0;\r
+       }\r
+       ENETMAC->txproduceindex = idx;\r
+\r
+       return 0;
+}
 
 //------------------------------------------------------------------------------
-int HWInit(bd_t * bd)
+int HWInit(struct eth_device *dev, bd_t * bis)
 {
        int btemp;
        unsigned int duplex, speed;
        unsigned long tmp1, mst = 250;
+       unsigned char bi_enetaddr[6];
 
        // Enable MAC interface
        CLKPWR->clkpwr_macclk_ctrl = (CLKPWR_MACCTRL_HRCCLK_EN |
@@ -313,14 +363,8 @@ int HWInit(bd_t * bd)
        // MII setup
        ENETMAC->command = COMMAND_PASSRUNTFRAME;
 #endif
-       // Enable rate auto-negotiation for the link
-       if (RMII_Write(PHY_BMCR,
-               (PHY_BMCR_100MB | PHY_BMCR_AUTON)) == 0)
-       {
-               return 0;
-       }
         
-       mst = 1000;
+        mst = 1000;
         btemp = 1;
         while(mst > 0)
         {
@@ -374,11 +418,11 @@ int HWInit(bd_t * bd)
                ENETMAC->supp = 0;
                printf("ENET:10Base\n");
        }
-
+          eth_getenv_enetaddr("ethaddr",bi_enetaddr);
        // Save station address
-       ENETMAC->sa [2] = (unsigned long) (bd->bi_enetaddr[0] | (bd->bi_enetaddr[1] << 8));
-       ENETMAC->sa [1] = (unsigned long) (bd->bi_enetaddr[2] | (bd->bi_enetaddr[3] << 8));
-       ENETMAC->sa [0] = (unsigned long) (bd->bi_enetaddr[4] | (bd->bi_enetaddr[5] << 8));
+       ENETMAC->sa [2] = (unsigned long) (bi_enetaddr[0] | (bi_enetaddr[1] << 8));
+       ENETMAC->sa [1] = (unsigned long) (bi_enetaddr[2] | (bi_enetaddr[3] << 8));
+       ENETMAC->sa [0] = (unsigned long) (bi_enetaddr[4] | (bi_enetaddr[5] << 8));
 
        // Setup TX and RX descriptors
        txrx_setup();
@@ -399,7 +443,7 @@ int HWInit(bd_t * bd)
        // to 'prime' the MAC. The first packet after a reset seems to wait
        // until at least 2 packets are ready to go.
        tmp1 = 0;
-       eth_send(&tmp1, 4);
+          eth_tx(dev,&tmp1, 4);
 
        return 1;
 }
@@ -407,8 +451,6 @@ int HWInit(bd_t * bd)
 //------------------------------------------------------------------------------
 int HWDeInit(void)
 {
-       // Reset PHY
-       (void) HYPHYReset();
 
        // Reset all MAC logic
        ENETMAC->mac1 = (MAC1_SOFT_RESET | MAC1_SIMULATION_RESET |
@@ -428,21 +470,28 @@ int HWDeInit(void)
        return 1;
 }
 
-void eth_halt (void)
+static void eth_stop (void)
 {
        HWDeInit();
 }
 
-int eth_init (bd_t * bd)
+int board_eth_init (bd_t * bd)
 {
        int rc;
-
+       struct eth_device *dev;
        char *s, *e;
        int i;
 
+       dev = malloc(sizeof(*dev));
+       if(!dev) {
+         return 0;
+       }
+       memset(dev, 0, sizeof(*dev));
+
+
        s = getenv ("ethaddr");
        for (i = 0; i < 6; ++i) {
-               bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
+               dev->enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
                if (s)
                        s = (*e) ? e + 1 : e;
        }
@@ -450,100 +499,16 @@ int eth_init (bd_t * bd)
 
        printf ("\tHW MAC address:  "
                "%02X:%02X:%02X:%02X:%02X:%02X\n",
-               bd->bi_enetaddr[0], bd->bi_enetaddr[1],
-               bd->bi_enetaddr[2], bd->bi_enetaddr[3],
-               bd->bi_enetaddr[4], bd->bi_enetaddr[5] );
+               dev->enetaddr[0], dev->enetaddr[1],
+               dev->enetaddr[2], dev->enetaddr[3],
+               dev->enetaddr[4], dev->enetaddr[5] );
 
-       rc = HWInit(bd);
-
-       // De-init if an error occurred
-       if (rc == 0)
-       {
-               printf ("ENET init failure\n");
-               HWDeInit();
-               return -1;
-       }
-
-       return 0;
-}
-
-/* Get a data block via Ethernet */
-int eth_rx (void)
-{
-       unsigned long idx, length;
-
-       // Determine if a frame has been received
-       length = 0;
-       idx = ENETMAC->rxconsumeindex;
-       if (ENETMAC->rxproduceindex != idx)
-       {
-               // Clear interrupt
-               ENETMAC->intclear = MACINT_RXDONEINTEN;
-
-               // Frame received, get size of RX packet
-               length = (pRXStatus[idx].statusinfo & 0x7FF);
-
-               /* Pass the packet up to the protocol layer */
-               if (length > 0)
-               {
-                       memcpy((void *) NetRxPackets[0], (void *) pRXVBuffs [idx], length);
-                       NetReceive (NetRxPackets[0], (unsigned short) length);
-               }
-
-               // Return DMA buffer
-               idx++;
-               if (idx >= ENET_MAX_TX_PACKETS)
-               {
-                       idx = 0;
-               }
-               ENETMAC->rxconsumeindex = (unsigned long) idx;
-       }
-
-       return (int) length;
-}
-
-/* Send a data block via Ethernet. */
-int eth_send (volatile void *packet, int length)
-{
-       unsigned long idx, cidx, fb;
-
-       // Determine number of free buffers and wait for a buffer if needed
-       fb = 0;
-       while (fb == 0)
-       {
-               idx = ENETMAC->txproduceindex;
-               cidx = ENETMAC->txconsumeindex;
-
-               if (idx == cidx)
-               {
-                       // Producer and consumer are the same, all buffers are free
-                       fb = ENET_MAX_TX_PACKETS;
-               }
-               else if (cidx > idx)
-               {
-                       fb = (ENET_MAX_TX_PACKETS - 1) -
-                               ((idx + ENET_MAX_TX_PACKETS) - cidx);
-               }
-               else
-               {
-                       fb = (ENET_MAX_TX_PACKETS - 1) - (cidx - idx);
-               }
-       }
-
-       // Update descriptor with new frame size
-       pTXDesc[idx].control = (length | 0x40000000);
-
-       // Move data to buffer
-       memcpy((void *) pTXVBuffs [idx], (void *)packet, length);
-
-       // Get next index for transmit data DMA buffer and descriptor
-       idx++;
-       if (idx >= ENET_MAX_TX_PACKETS)
-       {
-               idx = 0;
-       }
-       ENETMAC->txproduceindex = idx;
+         dev->init = HWInit;
+         dev->halt = eth_stop;
+         dev->send = eth_tx;
+         dev->recv = eth_recv;
+         
+         eth_register(dev);
 
        return 0;
 }
-
index 0b47bfe..2e81921 100644 (file)
@@ -56,6 +56,8 @@
 #define CONFIG_NR_DRAM_BANKS    1
 #define PHYS_SDRAM_1           0x80000000 /* SDRAM Bank #1 */
 
+#define CONFIG_SYS_SDRAM_BASE  PHYS_SDRAM_1
+#define CONFIG_SYS_TEXT_BASE  0x83FA0000
 /*
  * NOR FLASH not supported
  */
  */
 #define CONFIG_STACKSIZE (32*1024) /* 32K stack */
 
+/* 3 words are left on the stack for the abort handler */
+#define CONFIG_SYS_INIT_SP_ADDR 0x0003C000
 /*
  * ATAG support
  */
 #define CONFIG_ETHADDR         00:1a:f1:00:00:00
 #define CONFIG_GATEWAYIP       192.168.1.1
 
-#define CONFIG_BOOTFILE                uImage
+#define CONFIG_BOOTFILE                "uImage"
 #define CONFIG_LOADADDR                0x80100000
-#define CONFIG_ROOTPATH                /home/user/ltib/rootfs
+#define CONFIG_ROOTPATH                "/home/user/ltib/rootfs"
 
 /* Boot arguments for JFFS2 root file system in NAND */
 #define MTDROOTCOMMAND "mtdboot="                              \
index 37ff45b..9329f43 100644 (file)
@@ -53,6 +53,8 @@
 #define CONFIG_NR_DRAM_BANKS    1
 #define PHYS_SDRAM_1           0x80000000 /* SDRAM Bank #1 */
 
+#define CONFIG_SYS_SDRAM_BASE  PHYS_SDRAM_1
+#define CONFIG_SYS_TEXT_BASE  0x81F80000
 /*
  * NOR FLASH not supported
  */
@@ -96,6 +98,8 @@
  */
 #define CONFIG_STACKSIZE (32*1024) /* 32K stack */
 
+/* 3 words are left on the stack for the abort handler */
+#define CONFIG_SYS_INIT_SP_ADDR 0x0003C000
 /*
  * ATAG support
  */
 #define CONFIG_ETHADDR         00:1a:f1:00:00:00
 #define CONFIG_GATEWAYIP       192.168.1.1
 
-#define CONFIG_BOOTFILE                uImage
+#define CONFIG_BOOTFILE                "uImage"
 #define CONFIG_LOADADDR                0x80100000
-#define CONFIG_ROOTPATH                /home/user/ltib/rootfs
+#define CONFIG_ROOTPATH                "/home/user/ltib/rootfs"
 
 /* Boot arguments for JFFS2 root file system in NAND */
 #define MTDROOTCOMMAND "mtdboot="                              \