Rely on the port state seen by the firmware since it will also be the
one erroring out when trying to setup anything major when the port is
up.

Signed-off-by: Ioana Ciornei <ioana.cior...@nxp.com>
---
 drivers/staging/fsl-dpaa2/ethsw/ethsw.c | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c 
b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
index 9114437645a8..c6885912c60b 100644
--- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
+++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
@@ -43,6 +43,25 @@ static int ethsw_add_vlan(struct ethsw_core *ethsw, u16 vid)
        return 0;
 }
 
+static bool ethsw_port_is_up(struct ethsw_port_priv *port_priv)
+{
+       struct net_device *netdev = port_priv->netdev;
+       struct dpsw_link_state state;
+       int err;
+
+       err = dpsw_if_get_link_state(port_priv->ethsw_data->mc_io, 0,
+                                    port_priv->ethsw_data->dpsw_handle,
+                                    port_priv->idx, &state);
+       if (err) {
+               netdev_err(netdev, "dpsw_if_get_link_state() err %d\n", err);
+               return true;
+       }
+
+       WARN_ONCE(state.up > 1, "Garbage read into link_state");
+
+       return state.up ? true : false;
+}
+
 static int ethsw_port_set_pvid(struct ethsw_port_priv *port_priv, u16 pvid)
 {
        struct ethsw_core *ethsw = port_priv->ethsw_data;
@@ -61,7 +80,7 @@ static int ethsw_port_set_pvid(struct ethsw_port_priv 
*port_priv, u16 pvid)
        tci_cfg.vlan_id = pvid;
 
        /* Interface needs to be down to change PVID */
-       up = netif_running(netdev);
+       up = ethsw_port_is_up(port_priv);
        if (up) {
                err = dpsw_if_disable(ethsw->mc_io, 0,
                                      ethsw->dpsw_handle,
-- 
2.25.1

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to