1 From 3b07b109823a593f43e794cbf44ba3a84ceefbdb Mon Sep 17 00:00:00 2001
2 From: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
3 Date: Fri, 23 Aug 2019 18:02:27 +0300
4 Subject: [PATCH] staging: dpaa2-mac: add link up/down events for dpmac
6 Fix a limitation that affects the networking behavior when the user
7 issues ifconfig down/up on a DPNI and the link remains down.
8 The actual problem was that the mac driver was not aware of the
9 dpni link change event. Now, the event is sent by firmware and
10 phylib state machine is manipulated conveniently.
12 Signed-off-by: Florin Chiculita <florinlaurentiu.chiculita@nxp.com>
13 Signed-off-by: Ioana Ciornei <ioana.ciornei@nxp.com>
15 drivers/staging/fsl-dpaa2/mac/dpmac.h | 5 +++++
16 drivers/staging/fsl-dpaa2/mac/mac.c | 15 ++++++++++++---
17 2 files changed, 17 insertions(+), 3 deletions(-)
19 --- a/drivers/staging/fsl-dpaa2/mac/dpmac.h
20 +++ b/drivers/staging/fsl-dpaa2/mac/dpmac.h
21 @@ -124,6 +124,11 @@ int dpmac_destroy(struct fsl_mc_io *mc_i
22 * IRQ event - Indicates that the link state changed
24 #define DPMAC_IRQ_EVENT_LINK_CHANGED 0x00000002
26 + * IRQ event - Indicate if the phy needs to suspend or resume
28 +#define DPMAC_IRQ_EVENT_LINK_UP_REQ 0x00000004
29 +#define DPMAC_IRQ_EVENT_LINK_DOWN_REQ 0x00000008
31 int dpmac_set_irq_enable(struct fsl_mc_io *mc_io,
33 --- a/drivers/staging/fsl-dpaa2/mac/mac.c
34 +++ b/drivers/staging/fsl-dpaa2/mac/mac.c
35 @@ -181,6 +181,7 @@ static void dpaa2_mac_link_changed(struc
36 dev_err(&priv->mc_dev->dev, "dpmac_set_link_state: %d\n", err);
39 +#ifdef CONFIG_FSL_DPAA2_MAC_NETDEVS
40 static int dpaa2_mac_open(struct net_device *netdev)
42 /* start PHY state machine */
43 @@ -188,6 +189,7 @@ static int dpaa2_mac_open(struct net_dev
49 static int dpaa2_mac_stop(struct net_device *netdev)
51 @@ -450,6 +452,7 @@ static irqreturn_t dpaa2_mac_irq_handler
52 struct device *dev = (struct device *)arg;
53 struct fsl_mc_device *mc_dev = to_fsl_mc_device(dev);
54 struct dpaa2_mac_priv *priv = dev_get_drvdata(dev);
55 + struct net_device *ndev = priv->netdev;
56 struct dpmac_link_cfg link_cfg = { 0 };
59 @@ -475,6 +478,12 @@ static irqreturn_t dpaa2_mac_irq_handler
60 configure_link(priv, &link_cfg);
63 + if (status & DPMAC_IRQ_EVENT_LINK_UP_REQ)
64 + phy_start(ndev->phydev);
66 + if (status & DPMAC_IRQ_EVENT_LINK_DOWN_REQ)
67 + phy_stop(ndev->phydev);
70 dpmac_clear_irq_status(mc_dev->mc_io, 0, mc_dev->mc_handle,
71 DPMAC_IRQ_INDEX, status);
72 @@ -505,7 +514,9 @@ static int setup_irqs(struct fsl_mc_devi
75 err = dpmac_set_irq_mask(mc_dev->mc_io, 0, mc_dev->mc_handle,
76 - DPMAC_IRQ_INDEX, DPMAC_IRQ_EVENT_LINK_CFG_REQ);
77 + DPMAC_IRQ_INDEX, DPMAC_IRQ_EVENT_LINK_CFG_REQ |
78 + DPMAC_IRQ_EVENT_LINK_UP_REQ |
79 + DPMAC_IRQ_EVENT_LINK_DOWN_REQ);
81 dev_err(&mc_dev->dev, "dpmac_set_irq_mask err %d\n", err);
83 @@ -734,8 +745,6 @@ probe_fixed_link:
84 dev_info(dev, "Registered fixed PHY.\n");
87 - dpaa2_mac_open(netdev);