}
 EXPORT_SYMBOL_GPL(fixed_phy_set_link_update);
 
+int fixed_phy_update_state(struct phy_device *phydev,
+                          const struct fixed_phy_status *status,
+                          const struct fixed_phy_status *changed)
+{
+       struct fixed_mdio_bus *fmb = &platform_fmb;
+       struct fixed_phy *fp;
+
+       if (!phydev || !phydev->bus)
+               return -EINVAL;
+
+       list_for_each_entry(fp, &fmb->phys, node) {
+               if (fp->addr == phydev->addr) {
+#define _UPD(x) if (changed->x) \
+       fp->status.x = status->x
+                       _UPD(link);
+                       _UPD(speed);
+                       _UPD(duplex);
+                       _UPD(pause);
+                       _UPD(asym_pause);
+#undef _UPD
+                       fixed_phy_update_regs(fp);
+                       return 0;
+               }
+       }
+
+       return -ENOENT;
+}
+EXPORT_SYMBOL(fixed_phy_update_state);
+
 int fixed_phy_add(unsigned int irq, int phy_addr,
                  struct fixed_phy_status *status)
 {
 
 extern int fixed_phy_set_link_update(struct phy_device *phydev,
                        int (*link_update)(struct net_device *,
                                           struct fixed_phy_status *));
+extern int fixed_phy_update_state(struct phy_device *phydev,
+                          const struct fixed_phy_status *status,
+                          const struct fixed_phy_status *changed);
 #else
 static inline int fixed_phy_add(unsigned int irq, int phy_id,
                                struct fixed_phy_status *status)
 {
        return -ENODEV;
 }
+static inline int fixed_phy_update_state(struct phy_device *phydev,
+                          const struct fixed_phy_status *status,
+                          const struct fixed_phy_status *changed)
+{
+       return -ENODEV;
+}
 #endif /* CONFIG_FIXED_PHY */
 
 #endif /* __PHY_FIXED_H */