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