summaryrefslogtreecommitdiff
path: root/drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c')
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_ethtool.c55
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;
}