From mboxrd@z Thu Jan 1 00:00:00 1970 From: Heinrich Schuchardt Date: Sun, 24 Feb 2019 05:48:43 +0100 Subject: [U-Boot] FEC and EFI Simple Network In-Reply-To: References: <20180327121216.GA94647@nyx.local> <8e228ced-ba86-bc76-6427-13667b433bbc@suse.de> Message-ID: <77b4fa1d-582b-ecd2-32c4-d661788decc8@gmx.de> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit To: u-boot@lists.denx.de On 2/23/19 3:23 PM, Alexander Graf wrote: > > > 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 wrote: >>>> Adding Joe in case he has some ideas. >>>> >>>> On Tue, Mar 27, 2018 at 9:12 AM, Patrick Wildt 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 > With commit 0c5d2a3dac01 ("efi_loader: completely initialize network") we changed efi_net_initialize() from only calling eth_init() to execute the following sequence:         /* Setup packet buffers */         net_init();         /* Disable hardware and put it into the reset state */         eth_halt();         /* Set current device according to environment variables */         eth_set_current();         /* Get hardware ready for send and receive operations */         ret = eth_init(); So I am wondering if our additional call to eth_halt() shouldn't have fixed the problem that Patrick originally reported. Best regards Heinrich