summaryrefslogtreecommitdiff
path: root/drivers/emac-dwc-eqos
diff options
context:
space:
mode:
authorSuraj Jaiswal <jsuraj@codeaurora.org>2019-12-17 18:32:32 +0530
committerSuraj Jaiswal <jsuraj@codeaurora.org>2020-01-28 12:21:57 +0530
commit825a0d5f22def03894f5579a108a6d4c8bee960e (patch)
tree2c98ac83d5e9e686f8a4d4171ca0c7da34d5d51c /drivers/emac-dwc-eqos
parentbdc07671ca3f0f6e5d37f667ce028fe128636679 (diff)
downloaddata-kernel-825a0d5f22def03894f5579a108a6d4c8bee960e.tar.gz
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 <hisunil@codeaurora.org>
Diffstat (limited to 'drivers/emac-dwc-eqos')
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_mdio.c82
-rw-r--r--drivers/emac-dwc-eqos/DWC_ETH_QOS_yheader.h1
2 files changed, 43 insertions, 40 deletions
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 {