From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eugen.Hristev at microchip.com Date: Fri, 29 Mar 2019 14:40:49 +0000 Subject: [U-Boot] [PATCH] net: macb: Add small delay after link establishment In-Reply-To: <20190327102019.8268-1-sr@denx.de> References: <20190327102019.8268-1-sr@denx.de> Message-ID: <282db78e-95c8-de3e-dea0-e61ce653debe@microchip.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On 27.03.2019 12:20, Stefan Roese wrote: > I've noticed that the first ethernet packet after PHY link establishment > is not tranferred correctly most of the time on my AT91SAM9G25 board. > Here I usually see a timeout of a few seconds, which is quite > annoying. > > Adding a small delay (10ms in this case) after the link establishment > helps to solve this problem. With this patch applied, this timeout > on the first packet is not seen any more. Hi Stefan, I find this a bit odd... maybe someone with a different board having this Ethernet controller can confirm or infirm this ? Linux driver for macb has a similar issue ? Adding a delay just for the sake of it might hide another issue that we are missing at this point: why exactly transfer fails right away... it is likely that we want to send packets but link in fact is not ready ? Or any reason why the packet is not correctly transferred? Do you see errors on the line or the packet vanishes completely ? What kind of packet is this first one ? Does it depend on the packet type ? Sorry for maybe asking too many questions. I have added Nicolas and Claudiu who have more experience with macb on at91 boards Thanks, Eugen > > Signed-off-by: Stefan Roese > Cc: Wenyou Yang > Cc: Eugen Hristev > Cc: Joe Hershberger > --- > drivers/net/macb.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/macb.c b/drivers/net/macb.c > index 182331f61d..72614164e9 100644 > --- a/drivers/net/macb.c > +++ b/drivers/net/macb.c > @@ -550,8 +550,14 @@ static int macb_phy_init(struct macb_device *macb, const char *name) > > for (i = 0; i < MACB_AUTONEG_TIMEOUT / 100; i++) { > status = macb_mdio_read(macb, MII_BMSR); > - if (status & BMSR_LSTATUS) > + if (status & BMSR_LSTATUS) { > + /* > + * Delay a bit after the link is established, > + * so that the next xfer does not fail > + */ > + mdelay(10); > break; > + } > udelay(100); > } > } >