int dsa_port_mrp_del_ring_role(const struct dsa_port *dp,
                               const struct switchdev_obj_ring_role_mrp *mrp);
 int dsa_port_phylink_create(struct dsa_port *dp);
+void dsa_port_phylink_destroy(struct dsa_port *dp);
 int dsa_shared_port_link_register_of(struct dsa_port *dp);
 void dsa_shared_port_link_unregister_of(struct dsa_port *dp);
 int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr);
 
 {
        struct dsa_switch *ds = dp->ds;
        phy_interface_t mode;
+       struct phylink *pl;
        int err;
 
        err = of_get_phy_mode(dp->dn, &mode);
        if (ds->ops->phylink_get_caps)
                ds->ops->phylink_get_caps(ds, dp->index, &dp->pl_config);
 
-       dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(dp->dn),
-                               mode, &dsa_port_phylink_mac_ops);
-       if (IS_ERR(dp->pl)) {
+       pl = phylink_create(&dp->pl_config, of_fwnode_handle(dp->dn),
+                           mode, &dsa_port_phylink_mac_ops);
+       if (IS_ERR(pl)) {
                pr_err("error creating PHYLINK: %ld\n", PTR_ERR(dp->pl));
-               return PTR_ERR(dp->pl);
+               return PTR_ERR(pl);
        }
 
+       dp->pl = pl;
+
        return 0;
 }
 
+void dsa_port_phylink_destroy(struct dsa_port *dp)
+{
+       phylink_destroy(dp->pl);
+       dp->pl = NULL;
+}
+
 static int dsa_shared_port_setup_phy_of(struct dsa_port *dp, bool enable)
 {
        struct dsa_switch *ds = dp->ds;
        return 0;
 
 err_phy_connect:
-       phylink_destroy(dp->pl);
+       dsa_port_phylink_destroy(dp);
        return err;
 }
 
                rtnl_lock();
                phylink_disconnect_phy(dp->pl);
                rtnl_unlock();
-               phylink_destroy(dp->pl);
-               dp->pl = NULL;
+               dsa_port_phylink_destroy(dp);
                return;
        }
 
 
        if (ret) {
                netdev_err(slave_dev, "failed to connect to PHY: %pe\n",
                           ERR_PTR(ret));
-               phylink_destroy(dp->pl);
+               dsa_port_phylink_destroy(dp);
        }
 
        return ret;
        rtnl_lock();
        phylink_disconnect_phy(p->dp->pl);
        rtnl_unlock();
-       phylink_destroy(p->dp->pl);
+       dsa_port_phylink_destroy(p->dp);
 out_gcells:
        gro_cells_destroy(&p->gcells);
 out_free:
        phylink_disconnect_phy(dp->pl);
        rtnl_unlock();
 
-       phylink_destroy(dp->pl);
+       dsa_port_phylink_destroy(dp);
        gro_cells_destroy(&p->gcells);
        free_percpu(slave_dev->tstats);
        free_netdev(slave_dev);