Commit 88d64367 authored by Vladimir Oltean's avatar Vladimir Oltean Committed by Paolo Abeni
Browse files

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: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Tested-by: default avatarIoana Ciornei <ioana.ciornei@nxp.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 02d61948
Loading
Loading
Loading
Loading
+12 −9
Original line number Diff line number Diff line
@@ -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 @@ static int dpaa2_switch_port_connect_mac(struct ethsw_port_priv *port_priv)

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)