diff options
Diffstat (limited to 'drivers/net/ethernet/realtek/r8169.c')
| -rw-r--r-- | drivers/net/ethernet/realtek/r8169.c | 28 | 
1 files changed, 25 insertions, 3 deletions
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 28fb50a1e9c..4ecbe64a758 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -3818,6 +3818,30 @@ static void rtl_init_mdio_ops(struct rtl8169_private *tp)  	}  } +static void rtl_speed_down(struct rtl8169_private *tp) +{ +	u32 adv; +	int lpa; + +	rtl_writephy(tp, 0x1f, 0x0000); +	lpa = rtl_readphy(tp, MII_LPA); + +	if (lpa & (LPA_10HALF | LPA_10FULL)) +		adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full; +	else if (lpa & (LPA_100HALF | LPA_100FULL)) +		adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | +		      ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full; +	else +		adv = ADVERTISED_10baseT_Half | ADVERTISED_10baseT_Full | +		      ADVERTISED_100baseT_Half | ADVERTISED_100baseT_Full | +		      (tp->mii.supports_gmii ? +		       ADVERTISED_1000baseT_Half | +		       ADVERTISED_1000baseT_Full : 0); + +	rtl8169_set_speed(tp->dev, AUTONEG_ENABLE, SPEED_1000, DUPLEX_FULL, +			  adv); +} +  static void rtl_wol_suspend_quirk(struct rtl8169_private *tp)  {  	void __iomem *ioaddr = tp->mmio_addr; @@ -3848,9 +3872,7 @@ static bool rtl_wol_pll_power_down(struct rtl8169_private *tp)  	if (!(__rtl8169_get_wol(tp) & WAKE_ANY))  		return false; -	rtl_writephy(tp, 0x1f, 0x0000); -	rtl_writephy(tp, MII_BMCR, 0x0000); - +	rtl_speed_down(tp);  	rtl_wol_suspend_quirk(tp);  	return true;  |