aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0615-Revert-net-phy-improve-handling-delayed-work.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0615-Revert-net-phy-improve-handling-delayed-work.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0615-Revert-net-phy-improve-handling-delayed-work.patch134
1 files changed, 134 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0615-Revert-net-phy-improve-handling-delayed-work.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0615-Revert-net-phy-improve-handling-delayed-work.patch
new file mode 100644
index 00000000..b995924a
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0615-Revert-net-phy-improve-handling-delayed-work.patch
@@ -0,0 +1,134 @@
+From 9c75912e647e11af6f297ebc12f0bd6ad463997b Mon Sep 17 00:00:00 2001
+From: Sudheesh Mavila <sudheesh.mavila@amd.com>
+Date: Mon, 4 Feb 2019 11:49:23 +0530
+Subject: [PATCH 0615/2940] Revert " net: phy: improve handling delayed work"
+
+This reverts commit 6b90bf7898c7f0fdf301af72d4f49f8649531438.
+---
+ drivers/net/phy/phy.c | 37 ++++++++++++++++---------------------
+ include/linux/phy.h | 2 +-
+ 2 files changed, 17 insertions(+), 22 deletions(-)
+ mode change 100755 => 100644 drivers/net/phy/phy.c
+
+diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
+old mode 100755
+new mode 100644
+index c15548ce06b9..1ee25877c4d1
+--- a/drivers/net/phy/phy.c
++++ b/drivers/net/phy/phy.c
+@@ -537,7 +537,7 @@ static int phy_start_aneg_priv(struct phy_device *phydev, bool sync)
+ mutex_unlock(&phydev->lock);
+
+ if (trigger)
+- phy_trigger_machine(phydev);
++ phy_trigger_machine(phydev, sync);
+
+ return err;
+ }
+@@ -635,13 +635,6 @@ int phy_speed_up(struct phy_device *phydev)
+ }
+ EXPORT_SYMBOL_GPL(phy_speed_up);
+
+-static void phy_queue_state_machine(struct phy_device *phydev,
+- unsigned int secs)
+-{
+- mod_delayed_work(system_power_efficient_wq, &phydev->state_queue,
+- secs * HZ);
+-}
+-
+ /**
+ * phy_start_machine - start PHY state machine tracking
+ * @phydev: the phy_device struct
+@@ -654,7 +647,7 @@ static void phy_queue_state_machine(struct phy_device *phydev,
+ */
+ void phy_start_machine(struct phy_device *phydev)
+ {
+- phy_queue_state_machine(phydev, 1);
++ queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, HZ);
+ }
+ EXPORT_SYMBOL_GPL(phy_start_machine);
+
+@@ -662,14 +655,19 @@ EXPORT_SYMBOL_GPL(phy_start_machine);
+ * phy_trigger_machine - trigger the state machine to run
+ *
+ * @phydev: the phy_device struct
++ * @sync: indicate whether we should wait for the workqueue cancelation
+ *
+ * Description: There has been a change in state which requires that the
+ * state machine runs.
+ */
+
+-void phy_trigger_machine(struct phy_device *phydev)
++void phy_trigger_machine(struct phy_device *phydev, bool sync)
+ {
+- phy_queue_state_machine(phydev, 0);
++ if (sync)
++ cancel_delayed_work_sync(&phydev->state_queue);
++ else
++ cancel_delayed_work(&phydev->state_queue);
++ queue_delayed_work(system_power_efficient_wq, &phydev->state_queue, 0);
+ }
+
+ /**
+@@ -705,7 +703,7 @@ static void phy_error(struct phy_device *phydev)
+ phydev->state = PHY_HALTED;
+ mutex_unlock(&phydev->lock);
+
+- phy_trigger_machine(phydev);
++ phy_trigger_machine(phydev, false);
+ }
+
+ /**
+@@ -747,7 +745,7 @@ static irqreturn_t phy_change(struct phy_device *phydev)
+ mutex_unlock(&phydev->lock);
+
+ /* reschedule state queue work to run as soon as possible */
+- phy_trigger_machine(phydev);
++ phy_trigger_machine(phydev, true);
+
+ if (phy_interrupt_is_valid(phydev) && phy_clear_interrupt(phydev))
+ goto phy_err;
+@@ -911,7 +909,7 @@ void phy_start(struct phy_device *phydev)
+ }
+ mutex_unlock(&phydev->lock);
+
+- phy_trigger_machine(phydev);
++ phy_trigger_machine(phydev, true);
+ }
+ EXPORT_SYMBOL(phy_start);
+
+@@ -1123,14 +1121,11 @@ void phy_state_machine(struct work_struct *work)
+
+ /* Only re-schedule a PHY state machine change if we are polling the
+ * PHY, if PHY_IGNORE_INTERRUPT is set, then we will be moving
+- * between states from phy_mac_interrupt().
+- *
+- * In state PHY_HALTED the PHY gets suspended, so rescheduling the
+- * state machine would be pointless and possibly error prone when
+- * called from phy_disconnect() synchronously.
++ * between states from phy_mac_interrupt()
+ */
+- if (phy_polling_mode(phydev) && old_state != PHY_HALTED)
+- phy_queue_state_machine(phydev, PHY_STATE_TIME);
++ if (phy_polling_mode(phydev))
++ queue_delayed_work(system_power_efficient_wq, &phydev->state_queue,
++ PHY_STATE_TIME * HZ);
+ }
+
+ /**
+diff --git a/include/linux/phy.h b/include/linux/phy.h
+index 2e86acadb9bc..7086051820f9 100644
+--- a/include/linux/phy.h
++++ b/include/linux/phy.h
+@@ -1048,7 +1048,7 @@ void phy_change_work(struct work_struct *work);
+ void phy_mac_interrupt(struct phy_device *phydev);
+ void phy_start_machine(struct phy_device *phydev);
+ void phy_stop_machine(struct phy_device *phydev);
+-void phy_trigger_machine(struct phy_device *phydev);
++void phy_trigger_machine(struct phy_device *phydev, bool sync);
+ int phy_ethtool_sset(struct phy_device *phydev, struct ethtool_cmd *cmd);
+ void phy_ethtool_ksettings_get(struct phy_device *phydev,
+ struct ethtool_link_ksettings *cmd);
+--
+2.17.1
+