mgcoge make ether_scc.c work with CONFIG_NET_MULTI
authorGary Jennejohn <garyj@denx.de>
Thu, 20 Nov 2008 11:28:38 +0000 (12:28 +0100)
committerBen Warren <biggerbadderben@gmail.com>
Sun, 25 Jan 2009 04:45:52 +0000 (20:45 -0800)
This change is needed for mgcoge because it uses two ethernet drivers.

Add a check for the presence of the PIGGY board on mgcoge.  Without this
board networking cannot work and the initialization must be aborted.

Only allocate rtx once to prevent DPRAM exhaustion.

Initialize ether_scc.c and the keymile-specific HDLC driver (to be added
soon) in eth.c.

Signed-off-by: Gary Jennejohn <garyj@denx.de>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
cpu/mpc8260/Makefile
cpu/mpc8260/cpu.c
cpu/mpc8260/ether_scc.c
include/netdev.h

index 80d785229c523be3a20bbf7545eef5a9223717e7..9f0c2dd50cc706ce32cc0c0234091036b30f3a09 100644 (file)
@@ -1,5 +1,5 @@
 #
-# (C) Copyright 2000-2006
+# (C) Copyright 2000-2008
 # Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 #
 # See file CREDITS for list of people who contributed to this
@@ -27,9 +27,13 @@ LIB  = $(obj)lib$(CPU).a
 
 START  = start.o kgdb.o
 COBJS  = traps.o serial_smc.o serial_scc.o cpu.o cpu_init.o speed.o \
-         interrupts.o ether_scc.o ether_fcc.o i2c.o commproc.o \
+         interrupts.o ether_fcc.o i2c.o commproc.o \
          bedbug_603e.o pci.o spi.o
 
+COBJS-$(CONFIG_ETHER_ON_SCC) = ether_scc.o
+
+COBJS  += $(COBJS-y)
+
 SRCS   := $(START:.o=.S) $(SOBJS:.o=.S) $(COBJS:.o=.c)
 OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
 START  := $(addprefix $(obj),$(START))
index b9e748ab8b822c33e1be42b324bd68f5cd09a973..f4beca55be0d673392aacc4e68e679d5b411d0bf 100644 (file)
@@ -325,6 +325,9 @@ int cpu_eth_init(bd_t *bis)
 {
 #if defined(CONFIG_ETHER_ON_FCC)
        fec_initialize(bis);
+#endif
+#if defined(CONFIG_ETHER_ON_SCC)
+       mpc82xx_scc_enet_initialize(bd);
 #endif
        return 0;
 }
index c65f0e068f7ad9e29c3445c0b01ee67778874a4f..3671ef1dfba4a971f6741f9f26f9c94f9d68ad1d 100644 (file)
  * Advent Networks, Inc. <http://www.adventnetworks.com>
  * Jay Monkman <jtm@smoothsmoothie.com>
  *
+ * Modified so that it plays nicely when more than one ETHERNET interface
+ * is in use a la ether_fcc.c.
+ * (C) Copyright 2008
+ * DENX Software Engineerin GmbH
+ * Gary Jennejohn <garyj@denx.de>
+ *
  * See file CREDITS for list of people who contributed to this
  * project.
  *
 #include <common.h>
 #include <asm/cpm_8260.h>
 #include <mpc8260.h>
+#include <malloc.h>
 #include <net.h>
 #include <command.h>
 #include <config.h>
 
-#if defined(CONFIG_ETHER_ON_SCC) && defined(CONFIG_CMD_NET)
+#ifndef CONFIG_NET_MULTI
+#error "CONFIG_NET_MULTI must be defined."
+#endif
 
 #if (CONFIG_ETHER_INDEX == 1)
 #  define PROFF_ENET            PROFF_SCC1
@@ -100,7 +109,7 @@ typedef volatile struct CommonBufferDescriptor {
 static RTXBD *rtx;
 
 
-int eth_send(volatile void *packet, int length)
+static int sec_send(struct eth_device *dev, volatile void *packet, int length)
 {
     int i;
     int result = 0;
@@ -137,7 +146,7 @@ int eth_send(volatile void *packet, int length)
 }
 
 
-int eth_rx(void)
+static int sec_rx(struct eth_device *dev)
 {
     int length;
 
@@ -184,7 +193,7 @@ int eth_rx(void)
  *
  *************************************************************/
 
-int eth_init(bd_t *bis)
+static int sec_init(struct eth_device *dev, bd_t *bis)
 {
     int i;
     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
@@ -194,9 +203,14 @@ int eth_init(bd_t *bis)
     rxIdx = 0;
     txIdx = 0;
 
-    /* assign static pointer to BD area */
-    dpaddr = m8260_cpm_dpalloc(sizeof(RTXBD) + 2, 16);
-    rtx = (RTXBD *)&immr->im_dprambase[dpaddr];
+    /*
+     * Assign static pointer to BD area.
+     * Avoid exhausting DPRAM, which would cause a panic.
+     */
+    if (rtx == NULL) {
+           dpaddr = m8260_cpm_dpalloc(sizeof(RTXBD) + 2, 16);
+           rtx = (RTXBD *)&immr->im_dprambase[dpaddr];
+    }
 
     /* 24.21 - (1-3): ioports have been set up already */
 
@@ -338,7 +352,7 @@ int eth_init(bd_t *bis)
 }
 
 
-void eth_halt(void)
+static void sec_halt(struct eth_device *dev)
 {
     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
     immr->im_scc[CONFIG_ETHER_INDEX-1].scc_gsmrl &= ~(SCC_GSMRL_ENR |
@@ -346,7 +360,7 @@ void eth_halt(void)
 }
 
 #if 0
-void restart(void)
+static void sec_restart(void)
 {
     volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR;
     immr->im_cpm.cp_scc[CONFIG_ETHER_INDEX-1].scc_gsmrl |= (SCC_GSMRL_ENR |
@@ -354,4 +368,20 @@ void restart(void)
 }
 #endif
 
-#endif
+int mpc82xx_scc_enet_initialize(bd_t *bis)
+{
+       struct eth_device *dev;
+
+       dev = (struct eth_device *) malloc(sizeof *dev);
+       memset(dev, 0, sizeof *dev);
+
+       sprintf(dev->name, "SCC ETHERNET");
+       dev->init   = sec_init;
+       dev->halt   = sec_halt;
+       dev->send   = sec_send;
+       dev->recv   = sec_rx;
+
+       eth_register(dev);
+
+       return 1;
+}
index a7d662d75759a5286fffa8c1fafab0db2fc1c0a6..ce1ecbd8e82b61b98ffb3e5c4009c4a685682146 100644 (file)
@@ -57,6 +57,7 @@ int mcffec_initialize(bd_t *bis);
 int mpc512x_fec_initialize(bd_t *bis);
 int mpc5xxx_fec_initialize(bd_t *bis);
 int mpc8220_fec_initialize(bd_t *bis);
+int mpc82xx_scc_enet_initialize(bd_t *bis);
 int natsemi_initialize(bd_t *bis);
 int npe_initialize(bd_t *bis);
 int ns8382x_initialize(bd_t *bis);