[U-Boot] FEC and EFI Simple Network

Alexander Graf agraf at suse.de
Sat Feb 23 14:23:51 UTC 2019



On 02.12.18 22:42, Alexander Graf wrote:
> 
> 
> On 29.03.18 06:02, Joe Hershberger wrote:
>> Hi Patrick,
>>
>> On Wed, Mar 28, 2018 at 4:54 PM, Fabio Estevam <festevam at gmail.com> wrote:
>>> Adding Joe in case he has some ideas.
>>>
>>> On Tue, Mar 27, 2018 at 9:12 AM, Patrick Wildt <patrick at blueri.se> wrote:
>>>> Hi,
>>>>
>>>> I have been debugging network issues when running an EFI Application
>>>> that uses the EFI Simple Network protocol on an i.MX6 machine (FEC).
>>>>
>>>> The symptom is that u-boot's (FEC) internal RX ring index is reset to 0,
>>>> while the controller is still at idx 3 (or something else).  This is
>>>> caused by the following circumstances:
>>>>
>>>> The Simple Network protocol offers methods like Start(), Stop(),
>>>> Initialize(), Shutdown(), Reset().  Also the protocol has a state.  The
>>>> states are Stopped, Started, Initialized.  The transition is as follows:
>>>>
>>>> Stopped ---Start()---> Started ---Initialize()--> Initialized
>>>>
>>>> Start() does some initialization, Initialize() allocates the TX/RX
>>>> descriptors and actually kicks off the network engine.
>>>>
>>>> So far, only Initialize() is implemented in our u-boot interface, and it
>>>> calls eth_init() which in the end calls fec_init().  Our network state
>>>> is _always_ Started.  This means that EFI Applications see that that the
>>>> state is Started and then call Initialize() to start the actual network
>>>> traffic.  There is no call to Stop()/Shutdown()/Reset() as it's supposed
>>>> to be in a sane state.
>>>>
>>>> In my case the FEC is already initialized since I booted using network
>>>> and the RX desc index is already non-zero.  Now the EFI Application sees
>>>> that the state is Started, calls Initialize() which makes u-boot call
>>>> eth_init() which then calls fec_init().
>>>>
>>>> fec_init() does not reset the controller so that the controller-internal
>>>> RX desc index is not reset to zero.  fec_init() calls fec_open() which
>>>> then resets the driver-internal RX desc index to zero.  Now they are out
>>>> of sync, boom.
>>
>> Would it be reasonable for fec_init to use a state variable to keep
>> track of if it (and the HW) is already initialized and not call
>> fec_open in that case? Also, fec_halt would need to update that state
>> as well.
> 
> Ping? Is this still an issue?

Last Ping.


Alex


More information about the U-Boot mailing list