On 05.10.2020 18:00, Florian Fainelli wrote: > > > On 10/5/2020 8:54 AM, Heiner Kallweit wrote: >> On 05.10.2020 17:41, Florian Fainelli wrote: >>> >>> >>> On 10/5/2020 1:53 AM, Jisheng Zhang wrote: >>>> On Wed, 30 Sep 2020 13:23:29 -0700 Florian Fainelli wrote: >>>> >>>> >>>>> >>>>> On 9/30/2020 1:11 PM, Andrew Lunn wrote: >>>>>> On Wed, Sep 30, 2020 at 01:07:19PM -0700, Florian Fainelli wrote: >>>>>>> >>>>>>> >>>>>>> On 9/30/2020 12:09 PM, Andrew Lunn wrote: >>>>>>>> On Wed, Sep 30, 2020 at 05:47:43PM +0800, Jisheng Zhang wrote: >>>>>>>>> Hi, >>>>>>>>> >>>>>>>>> A GE phy supports pad isolation which can save power in WOL mode. But >>>>>>>>> once the >>>>>>>>> isolation is enabled, the MAC can't send/receive pkts to/from the phy >>>>>>>>> because >>>>>>>>> the phy is "isolated". To make the PHY work normally, I need to move >>>>>>>>> the >>>>>>>>> enabling isolation to suspend hook, so far so good. But the isolation >>>>>>>>> isn't >>>>>>>>> enabled in system shutdown case, to support this, I want to add >>>>>>>>> shutdown hook >>>>>>>>> to net phy_driver, then also enable the isolation in the shutdown >>>>>>>>> hook. Is >>>>>>>>> there any elegant solution? >>>>>>>> >>>>>>>>> Or we can break the assumption: ethernet can still send/receive pkts >>>>>>>>> after >>>>>>>>> enabling WoL, no? >>>>>>>> >>>>>>>> That is not an easy assumption to break. The MAC might be doing WOL, >>>>>>>> so it needs to be able to receive packets. >>>>>>>> >>>>>>>> What you might be able to assume is, if this PHY device has had WOL >>>>>>>> enabled, it can assume the MAC does not need to send/receive after >>>>>>>> suspend. The problem is, phy_suspend() will not call into the driver >>>>>>>> is WOL is enabled, so you have no idea when you can isolate the MAC >>>>>>>> from the PHY. >>>>>>>> >>>>>>>> So adding a shutdown in mdio_driver_register() seems reasonable. But >>>>>>>> you need to watch out for ordering. Is the MDIO bus driver still >>>>>>>> running? >>>>>>> >>>>>>> If your Ethernet MAC controller implements a shutdown callback and that >>>>>>> callback takes care of unregistering the network device which should >>>>>>> also >>>>>>> ensure that phy_disconnect() gets called, then your PHY's suspend >>>>>>> function >>>>>>> will be called. >>>>>> >>>>>> Hi Florian >>>>>> >>>>>> I could be missing something here, but: >>>>>> >>>>>> phy_suspend does not call into the PHY driver if WOL is enabled. So >>>>>> Jisheng needs a way to tell the PHY it should isolate itself from the >>>>>> MAC, and suspend is not that. >>>>> >>>>> I missed that part, that's right if WoL is enabled at the PHY level then >>>>> the suspend callback is not called, how about we change that and we >>>>> always call the PHY's suspend callback? This would require that we audit >>>> >>>> Hi all, >>>> >>>> The PHY's suspend callback usually calls genphy_suspend() which will set >>>> BMCR_PDOWN bit, this may break WoL. I think this is one the reason why >>>> we ignore the phydrv->suspend() when WoL is enabled. If we goes to this >>>> directly, it looks like we need to change each phy's suspend >>>> implementation, >>>> I.E if WoL is enabled, ignore genphy_suspend() and do possible isolation; >>>> If WoL is disabled, keep the code path as is. >>>> >>>> So compared with the shutdown hook, which direction is better? >>> >>> I believe you will have an easier time to add an argument to the PHY driver >>> suspend's function to indicate the WoL status, or to move down the check >>> for WoL being enabled/supported compared to adding support for shutdown >>> into the MDIO bus layer, and then PHY drivers. >> >> Maybe the shutdown callback of mdio_bus_type could be implemented. >> It could iterate over all PHY's on the bus, check for WoL (similar to >> mdio_bus_phy_may_suspend) and do whatever is needed. >> Seems to me to be the most generic way. > > OK and we optionally call into a PHY device's shutdown function if defined so > it can perform PHY specific work? That would work for me.
If suspend and shutdown procedure are the same for the PHY, then we may not need a shutdown hook in phy_driver. This seems to be the case here. I just wonder what the actual use case is, because typically MAC drivers call phy_stop (that calls phy_suspend) in their shutdown hook.