Hi Gary, Gary Jennejohn wrote: > This change is needed for mgcoge because it uses two ethernet drivers. > > I like the idea of moving drivers to use CONFIG_NET_MULTI, particularly so that we can get rid of it as an option... There are a few more things you need to think about, though. > 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 <[EMAIL PROTECTED]> > --- > > I ran "MAKEALL ppc" and no errors were caused by this patch. > > cpu/mpc8260/ether_scc.c | 56 > +++++++++++++++++++++++++++++++++++++++++------ > net/eth.c | 8 ++++++ > 2 files changed, 57 insertions(+), 7 deletions(-) > > diff --git a/cpu/mpc8260/ether_scc.c b/cpu/mpc8260/ether_scc.c > index c65f0e0..537cd39 100644 > --- a/cpu/mpc8260/ether_scc.c > +++ b/cpu/mpc8260/ether_scc.c > @@ -10,6 +10,12 @@ > * Advent Networks, Inc. <http://www.adventnetworks.com> > * Jay Monkman <[EMAIL PROTECTED]> > * > + * 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 <[EMAIL PROTECTED]> > + * > * See file CREDITS for list of people who contributed to this > * project. > * > @@ -32,12 +38,17 @@ > #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) > While you're mucking around with this file, please settle on a single CONFIG that can allow conditional compilation from the Makefile, then get rid of this stuff. > > +#ifndef CONFIG_NET_MULTI > +#error "CONFIG_NET_MULTI must be defined." > +#endif > + > #if (CONFIG_ETHER_INDEX == 1) > # define PROFF_ENET PROFF_SCC1 > # define CPM_CR_ENET_PAGE CPM_CR_SCC1_PAGE > @@ -100,7 +111,7 @@ typedef volatile struct CommonBufferDescriptor { > static RTXBD *rtx; > > > -int eth_send(volatile void *packet, int length) > +int sec_send(struct eth_device *dev, volatile void *packet, int length) > Please give all these functions, except initialize(), file scope (i.e. make them static). I'm not crazy about the name 'sec', but if it's static the objection doesn't carry much weight. I also can't think of a better name. > { > int i; > int result = 0; > @@ -137,7 +148,7 @@ int eth_send(volatile void *packet, int length) > } > > > -int eth_rx(void) > +int sec_rx(struct eth_device *dev) > { > int length; > > @@ -184,19 +195,32 @@ int eth_rx(void) > * > *************************************************************/ > > -int eth_init(bd_t *bis) > +int sec_init(struct eth_device *dev, bd_t *bis) > { > int i; > volatile immap_t *immr = (immap_t *)CONFIG_SYS_IMMR; > scc_enet_t *pram_ptr; > uint dpaddr; > > +#if defined(CONFIG_CHECK_ETHERNET_PRESENT) > + if (ethernet_present (CONFIG_ETHER_INDEX) == 0) { > + printf("Ethernet index: %d not present.\n", > + CONFIG_ETHER_INDEX); > + return -1; > + } > +#endif > + > 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 +362,7 @@ int eth_init(bd_t *bis) > } > > > -void eth_halt(void) > +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 | > @@ -354,4 +378,22 @@ void restart(void) > } > #endif > > +int sec_initialize(bd_t *bis) > For this function with global namespace, please pick a more descriptive name. Maybe 82xx_scc_initialize() or something? > +{ > + 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; > +} > + > #endif > diff --git a/net/eth.c b/net/eth.c > index ccd871a..5fe8b83 100644 > --- a/net/eth.c > +++ b/net/eth.c > @@ -48,6 +48,8 @@ extern int ppc_4xx_eth_initialize(bd_t *); > extern int scc_initialize(bd_t*); > extern int npe_initialize(bd_t *); > extern int uec_initialize(int); > +extern int sec_initialize(bd_t *); > +extern int keymile_hdlc_enet_initialize(bd_t *); > > #ifdef CONFIG_API > extern void (*push_packet)(volatile void *, int); > @@ -196,6 +198,12 @@ int eth_initialize(bd_t *bis) > #if defined(CONFIG_IXP4XX_NPE) > npe_initialize(bis); > #endif > +#if defined(CONFIG_ETHER_ON_SCC) && defined(CONFIG_MPC8260) > + sec_initialize(bis); > +#endif > +#if defined(CONFIG_KEYMILE_HDLC_ENET) > + keymile_hdlc_enet_initialize(bis); > +#endif > if (!eth_devices) { > puts ("No ethernet found.\n"); > show_boot_progress (-64); > Please don't add anything to this file. All initializations now go in cpu_eth_init()/board_eth_init(). There are plenty of examples you can draw from. Don't forget to add your initializer function to include/netdev.h
You get bonus points if you move this driver to drivers/net regards, Ben _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot