aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch')
-rw-r--r--target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch52
1 files changed, 52 insertions, 0 deletions
diff --git a/target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch b/target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch
new file mode 100644
index 0000000000..0eac6abb88
--- /dev/null
+++ b/target/linux/generic/backport-5.4/727-v5.5-net-sfp-control-TX_DISABLE-and-phy-only-from-main-st.patch
@@ -0,0 +1,52 @@
+From df5c4d93c5a59cba0f7479a4cd4e22b50726ce88 Mon Sep 17 00:00:00 2001
+From: Russell King <rmk+kernel@armlinux.org.uk>
+Date: Thu, 17 Oct 2019 11:12:42 +0100
+Subject: [PATCH 625/660] net: sfp: control TX_DISABLE and phy only from main
+ state machine
+
+We initialise TX_DISABLE when the sfp cage is probed, and then
+maintain its state in the main state machine. However, the module
+state machine:
+- negates it when detecting a newly inserted module when it's already
+ guaranteed to be negated.
+- negates it when the module is removed, but the main state machine
+ will do this anyway.
+
+Make TX_DISABLE entirely controlled by the main state machine.
+
+The main state machine also probes the module for a PHY, and removes
+the PHY when the the module is removed. Hence, removing the PHY in
+sfp_sm_module_remove() is also redundant, and is a left-over from
+when we tried to probe for the PHY from the module state machine.
+
+Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
+---
+ drivers/net/phy/sfp.c | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+--- a/drivers/net/phy/sfp.c
++++ b/drivers/net/phy/sfp.c
+@@ -1492,11 +1492,6 @@ static void sfp_sm_mod_remove(struct sfp
+
+ sfp_hwmon_remove(sfp);
+
+- if (sfp->mod_phy)
+- sfp_sm_phy_detach(sfp);
+-
+- sfp_module_tx_disable(sfp);
+-
+ memset(&sfp->id, 0, sizeof(sfp->id));
+ sfp->module_power_mW = 0;
+
+@@ -1534,10 +1529,8 @@ static void sfp_sm_module(struct sfp *sf
+
+ switch (sfp->sm_mod_state) {
+ default:
+- if (event == SFP_E_INSERT && sfp->attached) {
+- sfp_module_tx_disable(sfp);
++ if (event == SFP_E_INSERT && sfp->attached)
+ sfp_sm_mod_next(sfp, SFP_MOD_PROBE, T_SERIAL);
+- }
+ break;
+
+ case SFP_MOD_PROBE: