[U-Boot] [PATCH 3/6] net: asix: split out basic reset function

Lucas Stach dev at lynxeye.de
Thu Aug 23 10:37:29 CEST 2012


Hi Mike,

Am Mittwoch, den 22.08.2012, 23:01 -0400 schrieb Mike Frysinger:
> On Wednesday 22 August 2012 06:09:04 Lucas Stach wrote:
> > The basic device reset ensures that the device is ready to
> > service commands and does not need to get redone before each
> > network operation.
> > 
> > Split out the basic reset from asix_init() and instead call it
> > from asix_eth_get_info(), so that it only gets called once.
> 
> i'm afraid this is wrong.  the register step (which asix_eth_get_info is 
> afaict) should not touch the hardware (other than to extract the MAC address).  
> the init func is supposed to bring up the hardware from scratch since the 
> expectation is that the halt func brings it down completely.  if it's not 
> really possible to completely "bring down" the hardware, then have the 
> asix_init func declare a local static int so that it does the "full" bring up 
> only once.
> 
> so NAK this patch as is
> -mike

I still think the patch does the right thing. Let's look at the call
chain. When doing a usb start of the controller where the ethernet
device is attached we do the following to register the device:
1. probe (just check if we found suitable hardware, don't touch it yet)
2. get_info (at this point we extract the MAC, which means we have to
bring up the hardware at a basic level, to even be able to touch the
registers)
3. write_hwaddr (eth core sets the MAC address of the device, remember
this is only done _once_ for each device and also needs basic init)

Every network operation basically does first a init() and then a halt().
If we would bring down the device here to a point where it's completely
reset, we would also lose the MAC address set in the register step. This
is clearly not what we want, but also we don't want to set the MAC over
and over again with each network operation. So IMHO halt() should only
bring down the device to a state where the current ethernet connection
is gone. Therefore init() only needs to bring up the ethernet connection
from this state. The basic device initialisation (including the MAC)
should be persistent across multiple network operations.

This is the behaviour this patch implements, aside from halt() not
really doing it's job in the asix driver, but that is for another patch.

Thanks,
Lucas



More information about the U-Boot mailing list