#include <linux/workqueue.h>
 #include <linux/of.h>
 #include <linux/phy.h>
+#include <linux/phy_fixed.h>
 
 #define DSA_MAX_SWITCHES       4
 #define DSA_MAX_PORTS          12
         */
        void    (*adjust_link)(struct dsa_switch *ds, int port,
                                struct phy_device *phydev);
+       void    (*fixed_link_update)(struct dsa_switch *ds, int port,
+                               struct fixed_phy_status *st);
 
        /*
         * ethtool hardware statistics.
 
                phy_print_status(p->phy);
 }
 
+static int dsa_slave_fixed_link_update(struct net_device *dev,
+                                      struct fixed_phy_status *status)
+{
+       struct dsa_slave_priv *p = netdev_priv(dev);
+       struct dsa_switch *ds = p->parent;
+
+       if (ds->drv->fixed_link_update)
+               ds->drv->fixed_link_update(ds, p->port, status);
+
+       return 0;
+}
+
 /* slave device setup *******************************************************/
 static void dsa_slave_phy_setup(struct dsa_slave_priv *p,
                                struct net_device *slave_dev)
        struct dsa_switch *ds = p->parent;
        struct dsa_chip_data *cd = ds->pd;
        struct device_node *phy_dn, *port_dn;
+       bool phy_is_fixed = false;
        int ret;
 
        port_dn = cd->port_dn[p->port];
                        pr_err("failed to register fixed PHY\n");
                        return;
                }
+               phy_is_fixed = true;
                phy_dn = port_dn;
        }
 
                                        dsa_slave_adjust_link, 0,
                                        p->phy_interface);
 
+       if (p->phy && phy_is_fixed)
+               fixed_phy_set_link_update(p->phy, dsa_slave_fixed_link_update);
+
        /* We could not connect to a designated PHY, so use the switch internal
         * MDIO bus instead
         */