From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andrew Lunn Subject: Re: Waiting for the PHY to complete auto-negotiation Date: Wed, 6 Dec 2017 17:59:03 +0100 Message-ID: <20171206165903.GM27063@lunn.ch> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Cc: netdev , Florian Fainelli , David Miller To: Mason Return-path: Received: from vps0.lunn.ch ([185.16.172.187]:49710 "EHLO vps0.lunn.ch" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752252AbdLFQ7H (ORCPT ); Wed, 6 Dec 2017 11:59:07 -0500 Content-Disposition: inline In-Reply-To: Sender: netdev-owner@vger.kernel.org List-ID: On Wed, Dec 06, 2017 at 05:39:00PM +0100, Mason wrote: > Hello, > > I've been trying to wrap my head around Ethernet auto-negotiation, > vs actual / real packets seen at the MAC layer. I found the relevant > Wikipedia article to be fairly informative: > > https://en.wikipedia.org/wiki/Autonegotiation > > The reason I care is that my Ethernet HW does not allow changing the > flow control setting once the MAC has started (more specifically, once > RX DMA has been enabled). > > In nb8800_open(), the code currently works in this order: > > nb8800_start_rx(dev); > phy_start(phydev); > > The first line enables the MAC (and DMA). > The second enables the PHY and starts auto-negotiation. > > This is a problem: I would like for PHY auto-negotiation to be > /complete/ before I enable the MAC. > > What is the recommended way to wait for the PHY? > AFAICT, the PHY layer calls back into the eth driver through the > adjust_link() callback registered through of_phy_connect(). > It seems like this might be a good place to enable the MAC? That probably works, but you might have a few corner cases to handle. I'm not sure changes at the PHY always transition through down. So you could for example get a callback saying the link is up, 1Gbps, then a second call saying it has dropped to 100Mbps, if your cables/connectors are bad. If your hardware has problems, it might be safest to stop everything in the callback, make configuration changes, and they start everything back up. A link negotiation change is not something you expect to happen often. So making it slow but robust is O.K. Andrew