armvirt: add SFP support patches for NXP Layerscape DPAA2 platforms
[openwrt/openwrt.git] / target / linux / armvirt / patches-6.1 / 701-v6.2-0006-net-dpaa2-switch-assign-port_priv-mac-after-dpaa2_ma.patch
diff --git a/target/linux/armvirt/patches-6.1/701-v6.2-0006-net-dpaa2-switch-assign-port_priv-mac-after-dpaa2_ma.patch b/target/linux/armvirt/patches-6.1/701-v6.2-0006-net-dpaa2-switch-assign-port_priv-mac-after-dpaa2_ma.patch
new file mode 100644 (file)
index 0000000..e636549
--- /dev/null
@@ -0,0 +1,73 @@
+From a5e7f7e277bd4403c45c1c7922d56d0eb08dbc7c Mon Sep 17 00:00:00 2001
+From: Vladimir Oltean <vladimir.oltean@nxp.com>
+Date: Tue, 29 Nov 2022 16:12:15 +0200
+Subject: [PATCH 08/14] net: dpaa2-switch: assign port_priv->mac after
+ dpaa2_mac_connect() call
+
+The dpaa2-switch has the exact same locking requirements when connected
+to a DPMAC, so it needs port_priv->mac to always point either to NULL,
+or to a DPMAC with a fully initialized phylink instance.
+
+Make the same preparatory change in the dpaa2-switch driver as in the
+dpaa2-eth one.
+
+Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
+Reviewed-by: Ioana Ciornei <ioana.ciornei@nxp.com>
+Tested-by: Ioana Ciornei <ioana.ciornei@nxp.com>
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+---
+ .../ethernet/freescale/dpaa2/dpaa2-switch.c   | 21 +++++++++++--------
+ 1 file changed, 12 insertions(+), 9 deletions(-)
+
+--- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
++++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c
+@@ -1450,9 +1450,8 @@ static int dpaa2_switch_port_connect_mac
+       err = dpaa2_mac_open(mac);
+       if (err)
+               goto err_free_mac;
+-      port_priv->mac = mac;
+-      if (dpaa2_switch_port_is_type_phy(port_priv)) {
++      if (dpaa2_mac_is_type_phy(mac)) {
+               err = dpaa2_mac_connect(mac);
+               if (err) {
+                       netdev_err(port_priv->netdev,
+@@ -1462,11 +1461,12 @@ static int dpaa2_switch_port_connect_mac
+               }
+       }
++      port_priv->mac = mac;
++
+       return 0;
+ err_close_mac:
+       dpaa2_mac_close(mac);
+-      port_priv->mac = NULL;
+ err_free_mac:
+       kfree(mac);
+       return err;
+@@ -1474,15 +1474,18 @@ err_free_mac:
+ static void dpaa2_switch_port_disconnect_mac(struct ethsw_port_priv *port_priv)
+ {
+-      if (dpaa2_switch_port_is_type_phy(port_priv))
+-              dpaa2_mac_disconnect(port_priv->mac);
++      struct dpaa2_mac *mac = port_priv->mac;
++
++      port_priv->mac = NULL;
+-      if (!dpaa2_switch_port_has_mac(port_priv))
++      if (!mac)
+               return;
+-      dpaa2_mac_close(port_priv->mac);
+-      kfree(port_priv->mac);
+-      port_priv->mac = NULL;
++      if (dpaa2_mac_is_type_phy(mac))
++              dpaa2_mac_disconnect(mac);
++
++      dpaa2_mac_close(mac);
++      kfree(mac);
+ }
+ static irqreturn_t dpaa2_switch_irq0_handler_thread(int irq_num, void *arg)