[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