On 06/12/2017 17:59, Andrew Lunn wrote: > On Wed, Dec 06, 2017 at 05:39:00PM +0100, Mason wrote: > >> 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.
What you've described is, in fact, the existing implementation! ;-) nb8800_pause_config() checks for netif_running() and, when true, tries to disable everything, make the change, then re-enable everything. The problem with this is the following mind-boggling quirk of the hardware: once RX DMA is enabled, there is no supported way to disable it! Thus, I'm trying to find a clean way to set the control flow parameter BEFORE enabling the MAC. Regards.