aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/layerscape/patches-5.4/701-net-0178-staging-dpaa2-mac-add-link-up-down-events-for-dpmac.patch
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/layerscape/patches-5.4/701-net-0178-staging-dpaa2-mac-add-link-up-down-events-for-dpmac.patch')
-rw-r--r--target/linux/layerscape/patches-5.4/701-net-0178-staging-dpaa2-mac-add-link-up-down-events-for-dpmac.patch91
1 files changed, 91 insertions, 0 deletions
diff --git a/target/linux/layerscape/patches-5.4/701-net-0178-staging-dpaa2-mac-add-link-up-down-events-for-dpmac.patch b/target/linux/layerscape/patches-5.4/701-net-0178-staging-dpaa2-mac-add-link-up-down-events-for-dpmac.patch
new file mode 100644
index 0000000000..9fbd8c79ab
--- /dev/null
+++ b/target/linux/layerscape/patches-5.4/701-net-0178-staging-dpaa2-mac-add-link-up-down-events-for-dpmac.patch
@@ -0,0 +1,91 @@
+From 3b07b109823a593f43e794cbf44ba3a84ceefbdb Mon Sep 17 00:00:00 2001
+From: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
+Date: Fri, 23 Aug 2019 18:02:27 +0300
+Subject: [PATCH] staging: dpaa2-mac: add link up/down events for dpmac
+
+Fix a limitation that affects the networking behavior when the user
+issues ifconfig down/up on a DPNI and the link remains down.
+The actual problem was that the mac driver was not aware of the
+dpni link change event. Now, the event is sent by firmware and
+phylib state machine is manipulated conveniently.
+
+Signed-off-by: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
+Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
+---
+ drivers/staging/fsl-dpaa2/mac/dpmac.h | 5 +++++
+ drivers/staging/fsl-dpaa2/mac/mac.c | 15 ++++++++++++---
+ 2 files changed, 17 insertions(+), 3 deletions(-)
+
+--- a/drivers/staging/fsl-dpaa2/mac/dpmac.h
++++ b/drivers/staging/fsl-dpaa2/mac/dpmac.h
+@@ -124,6 +124,11 @@ int dpmac_destroy(struct fsl_mc_io *mc_i
+ * IRQ event - Indicates that the link state changed
+ */
+ #define DPMAC_IRQ_EVENT_LINK_CHANGED 0x00000002
++/**
++ * IRQ event - Indicate if the phy needs to suspend or resume
++ */
++#define DPMAC_IRQ_EVENT_LINK_UP_REQ 0x00000004
++#define DPMAC_IRQ_EVENT_LINK_DOWN_REQ 0x00000008
+
+ int dpmac_set_irq_enable(struct fsl_mc_io *mc_io,
+ u32 cmd_flags,
+--- a/drivers/staging/fsl-dpaa2/mac/mac.c
++++ b/drivers/staging/fsl-dpaa2/mac/mac.c
+@@ -181,6 +181,7 @@ static void dpaa2_mac_link_changed(struc
+ dev_err(&priv->mc_dev->dev, "dpmac_set_link_state: %d\n", err);
+ }
+
++#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
+ static int dpaa2_mac_open(struct net_device *netdev)
+ {
+ /* start PHY state machine */
+@@ -188,6 +189,7 @@ static int dpaa2_mac_open(struct net_dev
+
+ return 0;
+ }
++#endif
+
+ static int dpaa2_mac_stop(struct net_device *netdev)
+ {
+@@ -450,6 +452,7 @@ static irqreturn_t dpaa2_mac_irq_handler
+ struct device *dev = (struct device *)arg;
+ struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
+ struct dpaa2_mac_priv *priv = dev_get_drvdata(dev);
++ struct net_device *ndev = priv->netdev;
+ struct dpmac_link_cfg link_cfg = { 0 };
+ u32 status;
+ int err;
+@@ -475,6 +478,12 @@ static irqreturn_t dpaa2_mac_irq_handler
+ configure_link(priv, &link_cfg);
+ }
+
++ if (status & DPMAC_IRQ_EVENT_LINK_UP_REQ)
++ phy_start(ndev->phydev);
++
++ if (status & DPMAC_IRQ_EVENT_LINK_DOWN_REQ)
++ phy_stop(ndev->phydev);
++
+ out:
+ dpmac_clear_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
+ DPMAC_IRQ_INDEX, status);
+@@ -505,7 +514,9 @@ static int setup_irqs(struct fsl_mc_devi
+ }
+
+ err = dpmac_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle,
+- DPMAC_IRQ_INDEX, DPMAC_IRQ_EVENT_LINK_CFG_REQ);
++ DPMAC_IRQ_INDEX, DPMAC_IRQ_EVENT_LINK_CFG_REQ |
++ DPMAC_IRQ_EVENT_LINK_UP_REQ |
++ DPMAC_IRQ_EVENT_LINK_DOWN_REQ);
+ if (err) {
+ dev_err(&mc_dev->dev, "dpmac_set_irq_mask err %d\n", err);
+ goto free_irq;
+@@ -734,8 +745,6 @@ probe_fixed_link:
+ dev_info(dev, "Registered fixed PHY.\n");
+ }
+
+- dpaa2_mac_open(netdev);
+-
+ return 0;
+
+ err_no_if_mode: