Message ID | 1399972998-21772-1-git-send-email-zhangfei.gao@linaro.org |
---|---|
State | Changes Requested |
Headers | show |
Hello. On 05/13/2014 01:23 PM, Zhangfei Gao wrote: > Commit be9dad1f9f26604fb suspend phydev when going to HALTED. Please also specify that commit's summary line in parens. > However not to resume phydev when going to RESUMING. > BMCR_PDOWN remains set "ifconfig eth0 down" -> "ifconfig eth0 up". > Unless phy_attach_direct is called in open function. > Fix the issue via phy_resume in PHY_RESUMING > Signed-off-by: Jiancheng Xue <xuejiancheng@huawei.com> > Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> WBR, Sergei -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
2014-05-13 11:51 GMT-07:00 Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>: > Hello. > > > On 05/13/2014 01:23 PM, Zhangfei Gao wrote: > >> Commit be9dad1f9f26604fb suspend phydev when going to HALTED. > > > Please also specify that commit's summary line in parens. That, and please rephrase your commit message such that we can understand the problem this fixes. Something along the lines of: "With commit be9dad1f9f26604fb ("net: phy: suspend phydev when going to HALTED"), an unused PHY device will be put in a low-power mode using BMCR_PDOWN. Some Ethernet drivers might be calling phy_connect() and phy_disconnect() from their ndo_open, respectively ndo_close() callbacks, in such a case, the PHY will be powered down during the phy_disconnect() call, but will fail to be powered up in phy_connect(). This patch fixes the following scenario." Thanks > > >> However not to resume phydev when going to RESUMING. >> BMCR_PDOWN remains set "ifconfig eth0 down" -> "ifconfig eth0 up". >> Unless phy_attach_direct is called in open function. > > >> Fix the issue via phy_resume in PHY_RESUMING > > >> Signed-off-by: Jiancheng Xue <xuejiancheng@huawei.com> >> Signed-off-by: Zhangfei Gao <zhangfei.gao@linaro.org> > > > WBR, Sergei >
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 1b6d09a..be5d52e 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -715,7 +715,7 @@ void phy_state_machine(struct work_struct *work) struct delayed_work *dwork = to_delayed_work(work); struct phy_device *phydev = container_of(dwork, struct phy_device, state_queue); - int needs_aneg = 0, do_suspend = 0; + int needs_aneg = 0, do_suspend = 0, do_resume = 0; int err = 0; mutex_lock(&phydev->lock); @@ -865,6 +865,8 @@ void phy_state_machine(struct work_struct *work) } phydev->adjust_link(phydev->attached_dev); } + + do_resume = 1; break; } @@ -876,6 +878,9 @@ void phy_state_machine(struct work_struct *work) if (do_suspend) phy_suspend(phydev); + if (do_resume) + phy_resume(phydev); + if (err < 0) phy_error(phydev);