[U-Boot] [PATCH] ppc4xx: Fix problem with board_eth_init() vs cpu_eth_init() on AMCC boards
Ben Warren
biggerbadderben at gmail.com
Wed Feb 11 15:53:55 CET 2009
Hi Stefan/Wolfgang,
On Wed, Feb 11, 2009 at 5:02 AM, Wolfgang Denk <wd at denx.de> wrote:
> Dear Stefan,
>
> In message <200902111352.04598.sr at denx.de> you wrote:
> >
> > > > + cpu_eth_init(bis);
> > > > + pci_eth_init(bis);
> > > > +
> > > > + /*
> > > > + * Return 0 so that cpu_eth_init() won't get executed again
> > > > + */
> > > > + return 0;
> > >
> > > What happens in case of errors? This looks broken to me, or I
> > > misinderstand the comment.
> >
>
I think this is right, although the undocumented return code of 0 may not be
(more on this later in this e-mail)
>
> > This is the code calling board_eth_init() from net/eth.c:
> >
> > /* Try board-specific initialization first. If it fails or isn't
> > * present, try the cpu-specific initialization */
> > if (board_eth_init(bis) < 0)
> > cpu_eth_init(bis);
> >
> > So if we return with an error in board_eth_init(), cpu_eth_init() will
> get
> > called again. Another way to fix this problem would be this
> implementation:
>
> I consider this a buggy design that should be fixed. It should be
> possible to handle the situation that pci_eth_init() returns an error
> code.
>
What handling should there be in the case of a device initialization error?
Drivers currently printf something and don't register the device. What else
is appropriate?
>
> > board_eth_init()
> > {
> > pci_eth_init(bis);
> >
> > /*
> > * Return -1 so that cpu_eth_init() will get executed in net/eth.c
> > */
> > return -1;
> > }
> >
> > But I like the former implementation better, since the cpu internal
> ethernet
> > interfaces are added first to the network devices list.
>
> That would be as bad as the previous solution, or actually worse as it
> looks as if board_eth_init() was always failing.
>
> I think the key problems is here:
>
> > /* Try board-specific initialization first. If it fails or isn't
> > * present, try the cpu-specific initialization */
> > if (board_eth_init(bis) < 0)
> > cpu_eth_init(bis);
>
> I think we must differentiate between board_eth_init() not existing
> and a failure in board_eth_init(); these are two very different
> situations.
>
Sorry this is confusing. The -1 return code currently means "does not
exist", although there are a few individual drivers that return -1 on
failure, and should be cleaned up. All of the PCI drivers return the number
of interfaces found (i.e. return 0 if nothing is found or there's an
error). While this flaunts UNIX convention, it has the advantage of letting
us count the interfaces at initialization without stepping through the
list. I was thinking of taking advantage of this to get rid of the
CONFIG_NET_MULTI thing some time in the future.
>
> Best regards,
>
> Wolfgang Denk
>
regards,
Ben
More information about the U-Boot
mailing list