From 825a0d5f22def03894f5579a108a6d4c8bee960e Mon Sep 17 00:00:00 2001 From: Suraj Jaiswal Date: Tue, 17 Dec 2019 18:32:32 +0530 Subject: data-kernel: EMAC: Etherent wol optimization. Enable wake on lan on interface open not during ethernet driver probe to reduce driver initialization time. Change-Id: Icee83f29e1276df2ce5287ed790f30368d4d09bc Signed-off-by: Sunil Paidimarri --- drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c | 82 +++++++++++++++-------------- drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h | 1 + 2 files changed, 43 insertions(+), 40 deletions(-) (limited to 'drivers/emac-dwc-eqos') diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c b/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c index faac49e..ce6b794 100644 --- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c +++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c @@ -445,6 +445,43 @@ void dump_phy_registers(struct DWC_ETH_QOS_prv_data *pdata) pr_alert("\n****************************************************\n"); } +static void DWC_ETH_QOS_request_phy_wol(struct DWC_ETH_QOS_prv_data *pdata) +{ + pdata->phy_wol_supported = 0; + pdata->phy_wol_wolopts = 0; + + /* Check if phydev is valid*/ + /* Check and enable Wake-on-LAN functionality in PHY*/ + if (pdata->phydev) { + struct ethtool_wolinfo wol = {.cmd = ETHTOOL_GWOL}; + wol.supported = 0; + wol.wolopts= 0; + + phy_ethtool_get_wol(pdata->phydev, &wol); + pdata->phy_wol_supported = wol.supported; + + /* Try to enable supported Wake-on-LAN features in PHY*/ + if (wol.supported) { + + device_set_wakeup_capable(&pdata->pdev->dev, 1); + + wol.cmd = ETHTOOL_SWOL; + wol.wolopts = wol.supported; + + if (!phy_ethtool_set_wol(pdata->phydev, &wol)){ + pdata->phy_wol_wolopts = wol.wolopts; + + enable_irq_wake(pdata->phy_irq); + + device_set_wakeup_enable(&pdata->pdev->dev, 1); + EMACDBG("Enabled WoL[0x%x] in %s\n", wol.wolopts, + pdata->phydev->drv->name); + pdata->wol_enabled = 1; + } + } + } +} + /*! * \brief API to enable or disable PHY hibernation mode * @@ -1007,6 +1044,9 @@ void DWC_ETH_QOS_adjust_link(struct net_device *dev) } #endif + if (pdata->phy_intr_en && !pdata->wol_enabled) + DWC_ETH_QOS_request_phy_wol(pdata); + if (pdata->ipa_enabled && netif_running(dev)) { if (phydev->link == 1) DWC_ETH_QOS_ipa_offload_event_handler(pdata, EV_PHY_LINK_UP); @@ -1030,42 +1070,6 @@ void DWC_ETH_QOS_adjust_link(struct net_device *dev) DBGPR_MDIO("<--DWC_ETH_QOS_adjust_link\n"); } -static void DWC_ETH_QOS_request_phy_wol(struct DWC_ETH_QOS_prv_data *pdata) -{ - pdata->phy_wol_supported = 0; - pdata->phy_wol_wolopts = 0; - - /* Check if phydev is valid*/ - /* Check and enable Wake-on-LAN functionality in PHY*/ - if (pdata->phydev) { - struct ethtool_wolinfo wol = {.cmd = ETHTOOL_GWOL}; - wol.supported = 0; - wol.wolopts= 0; - - phy_ethtool_get_wol(pdata->phydev, &wol); - pdata->phy_wol_supported = wol.supported; - - /* Try to enable supported Wake-on-LAN features in PHY*/ - if (wol.supported) { - - device_set_wakeup_capable(&pdata->pdev->dev, 1); - - wol.cmd = ETHTOOL_SWOL; - wol.wolopts = wol.supported; - - if (!phy_ethtool_set_wol(pdata->phydev, &wol)){ - pdata->phy_wol_wolopts = wol.wolopts; - - enable_irq_wake(pdata->phy_irq); - - device_set_wakeup_enable(&pdata->pdev->dev, 1); - EMACDBG("Enabled WoL[0x%x] in %s\n", wol.wolopts, - pdata->phydev->drv->name); - } - } - } -} - bool DWC_ETH_QOS_is_phy_link_up(struct DWC_ETH_QOS_prv_data *pdata) { /* PHY driver initializes phydev->link=1. @@ -1194,10 +1198,8 @@ static int DWC_ETH_QOS_init_phy(struct net_device *dev) phydev->irq = PHY_IGNORE_INTERRUPT; phydev->interrupts = PHY_INTERRUPT_ENABLED; - if (phydev->drv->config_intr && - !phydev->drv->config_intr(phydev)){ - DWC_ETH_QOS_request_phy_wol(pdata); - } else { + if (!(phydev->drv->config_intr && + !phydev->drv->config_intr(phydev))){ EMACERR("Failed to configure PHY interrupts"); BUG(); } diff --git a/drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h b/drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h index ee29121..1b9266a 100644 --- a/drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h +++ b/drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h @@ -1878,6 +1878,7 @@ struct DWC_ETH_QOS_prv_data { struct class* avb_class_b_class; struct delayed_work ipv6_addr_assign_wq; bool print_kpi; + bool wol_enabled; }; struct ip_params { -- cgit v1.2.3