diff options
Diffstat (limited to 'drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c')
-rw-r--r-- | drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c | 55 |
1 files changed, 34 insertions, 21 deletions
diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c index cf3a571..92a02a2 100644 --- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c +++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c @@ -808,10 +808,15 @@ static int DWC_ETH_QOS_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) { struct DWC_ETH_QOS_prv_data *pdata = netdev_priv(dev); - u32 support = WAKE_MAGIC | WAKE_UCAST | pdata->phy_wol_supported; + u32 emac_wol_support = 0; int ret = 0; - if (wol->wolopts & ~support) + if (pdata->hw_feat.mgk_sel == 1) + emac_wol_support |= WAKE_MAGIC; + if (pdata->hw_feat.rwk_sel == 1) + emac_wol_support |= WAKE_UCAST; + + if (wol->wolopts & ~(emac_wol_support | pdata->phy_wol_supported)) return -EOPNOTSUPP; if (!device_can_wakeup(&pdata->pdev->dev)) @@ -825,35 +830,43 @@ static int DWC_ETH_QOS_set_wol(struct net_device *dev, */ spin_lock_irq(&pdata->lock); - pdata->wolopts = 0; - if (pdata->hw_feat.mgk_sel == 1) pdata->wolopts |= WAKE_MAGIC; if (pdata->hw_feat.rwk_sel == 1) pdata->wolopts |= WAKE_UCAST; - if (pdata->wolopts) - enable_irq_wake(pdata->irq_number); - else - disable_irq_wake(pdata->irq_number); - spin_unlock_irq(&pdata->lock); - device_set_wakeup_enable(&pdata->pdev->dev, pdata->wolopts ? 1 : 0); + if (emac_wol_support && (pdata->wolopts != wol->wolopts)) { + if (pdata->wolopts) + enable_irq_wake(pdata->irq_number); + else + disable_irq_wake(pdata->irq_number); + + device_set_wakeup_enable(&pdata->pdev->dev, pdata->wolopts ? 1 : 0); + } - if (pdata->phy_intr_en && pdata->phy_irq && pdata->phy_wol_supported){ + if (pdata->phy_wol_wolopts != wol->wolopts) { + if (pdata->phy_intr_en && pdata->phy_wol_supported){ - pdata->phy_wol_wolopts = 0; + pdata->phy_wol_wolopts = 0; - if (!phy_ethtool_set_wol(pdata->phydev, wol)) - pdata->phy_wol_wolopts = pdata->phy_wol_supported; + ret = phy_ethtool_set_wol(pdata->phydev, wol); - if (pdata->phy_wol_wolopts) - enable_irq_wake(pdata->phy_irq); - else - disable_irq_wake(pdata->phy_irq); + if (ret) { + EMACERR("set wol in PHY failed\n"); + return ret; + } - device_set_wakeup_enable(&pdata->pdev->dev, pdata->phy_wol_wolopts ? 1 : 0); + pdata->phy_wol_wolopts = wol->wolopts; + + if (pdata->phy_wol_wolopts) + enable_irq_wake(pdata->phy_irq); + else + disable_irq_wake(pdata->phy_irq); + + device_set_wakeup_enable(&pdata->pdev->dev, pdata->phy_wol_wolopts ? 1 : 0); + } } DBGPR("<--DWC_ETH_QOS_set_wol\n"); @@ -1071,7 +1084,7 @@ static void DWC_ETH_QOS_get_ethtool_stats( /* Update IPA stats */ if (pdata->ipa_enabled) { - EMACINFO("Add IPA stats\n"); + EMACDBG("Add IPA stats\n"); DWC_ETH_QOS_ipa_stats_read(pdata); for (i = 0; i < DWC_ETH_QOS_IPA_STAT_LEN; i++) { char *p = (char *)pdata + @@ -1190,7 +1203,7 @@ static int DWC_ETH_QOS_get_ts_info(struct net_device *dev, struct DWC_ETH_QOS_prv_data *pdata = netdev_priv(dev); DBGPR("-->DWC_ETH_QOS_get_ts_info\n"); info->phc_index = DWC_ETH_QOS_phc_index(pdata); - EMACINFO("PHC index = %d\n", info->phc_index); + EMACDBG("PHC index = %d\n", info->phc_index); DBGPR("<--DWC_ETH_QOS_get_ts_info\n"); return 0; } |