net: dpaa2-switch: assign port_priv->mac after dpaa2_mac_connect() call
authorVladimir Oltean <vladimir.oltean@nxp.com>
Tue, 29 Nov 2022 14:12:15 +0000 (16:12 +0200)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 1 Dec 2022 12:40:22 +0000 (13:40 +0100)
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>
drivers/net/ethernet/freescale/dpaa2/dpaa2-switch.c

index 42d3290ccd8b0b50e850835cba08396e29faf8fe..3b0963d95f6778baed3bc726cd37da5c6038f973 100644 (file)
@@ -1449,9 +1449,8 @@ static int dpaa2_switch_port_connect_mac(struct ethsw_port_priv *port_priv)
        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,
@@ -1461,11 +1460,12 @@ static int dpaa2_switch_port_connect_mac(struct ethsw_port_priv *port_priv)
                }
        }
 
+       port_priv->mac = mac;
+
        return 0;
 
 err_close_mac:
        dpaa2_mac_close(mac);
-       port_priv->mac = NULL;
 err_free_mac:
        kfree(mac);
        return err;
@@ -1473,15 +1473,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;
 
-       if (!dpaa2_switch_port_has_mac(port_priv))
+       port_priv->mac = NULL;
+
+       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)