Hello. A formal patch review this time... On 05/24/2018 02:11 PM, Vladimir Zapolskiy wrote: > The change fixes a sleep in atomic context issue, which can be > always triggered by running 'ethtool -r' command, because > phy_start_aneg() protects phydev fields by a mutex. OK so far... > Another note is that the change implicitly replaces phy_start_aneg() > with a newer phy_restart_aneg(). Why? Is this necessary to fix the BUG()? > Signed-off-by: Vladimir Zapolskiy <vladimir_zapolskiy@xxxxxxxxxx> > --- > drivers/net/ethernet/renesas/ravb_main.c | 17 +---------------- > 1 file changed, 1 insertion(+), 16 deletions(-) > > diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c > index 68f122140966..4a043eb0e2aa 100644 > --- a/drivers/net/ethernet/renesas/ravb_main.c > +++ b/drivers/net/ethernet/renesas/ravb_main.c > @@ -1150,21 +1150,6 @@ static int ravb_set_link_ksettings(struct net_device *ndev, > return error; > } > > -static int ravb_nway_reset(struct net_device *ndev) > -{ > - struct ravb_private *priv = netdev_priv(ndev); > - int error = -ENODEV; > - unsigned long flags; > - > - if (ndev->phydev) { > - spin_lock_irqsave(&priv->lock, flags); OK, removing spin_lock_irqsave() fixes the BUG()... Not sure what we rotect against here anyway, MAC interrupts? > - error = phy_start_aneg(ndev->phydev); > - spin_unlock_irqrestore(&priv->lock, flags); > - } > - > - return error; > -} > - > static u32 ravb_get_msglevel(struct net_device *ndev) > { > struct ravb_private *priv = netdev_priv(ndev); > @@ -1377,7 +1362,7 @@ static int ravb_set_wol(struct net_device *ndev, struct ethtool_wolinfo *wol) > } > > static const struct ethtool_ops ravb_ethtool_ops = { > - .nway_reset = ravb_nway_reset, > + .nway_reset = phy_ethtool_nway_reset, What does this fix? > .get_msglevel = ravb_get_msglevel, > .set_msglevel = ravb_set_msglevel, > .get_link = ethtool_op_get_link, MBR, Sergei