--- /dev/null
+From cda5c15b23fb9d683a491e8bd137d11d8552ac02 Mon Sep 17 00:00:00 2001
+From: Neil Armstrong <narmstrong@baylibre.com>
+Date: Mon, 7 Dec 2015 13:57:35 +0100
+Subject: net: dsa: move dsa slave destroy code to slave.c
+
+From: Neil Armstrong <narmstrong@baylibre.com>
+
+commit cda5c15b23fb9d683a491e8bd137d11d8552ac02 upstream.
+
+Move dsa slave dedicated code from dsa_switch_destroy to a new
+dsa_slave_destroy function in slave.c.
+Add the netif_carrier_off and phy_disconnect calls in order to
+correctly cleanup the netdev state and PHY state machine.
+
+Signed-off-by: Frode Isaksen <fisaksen@baylibre.com>
+Signed-off-by: Neil Armstrong <narmstrong@baylibre.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/dsa/dsa.c | 3 +--
+ net/dsa/dsa_priv.h | 1 +
+ net/dsa/slave.c | 11 +++++++++++
+ 3 files changed, 13 insertions(+), 2 deletions(-)
+
+--- a/net/dsa/dsa.c
++++ b/net/dsa/dsa.c
+@@ -454,8 +454,7 @@ static void dsa_switch_destroy(struct ds
+ if (!ds->ports[port])
+ continue;
+
+- unregister_netdev(ds->ports[port]);
+- free_netdev(ds->ports[port]);
++ dsa_slave_destroy(ds->ports[port]);
+ }
+
+ mdiobus_unregister(ds->slave_mii_bus);
+--- a/net/dsa/dsa_priv.h
++++ b/net/dsa/dsa_priv.h
+@@ -61,6 +61,7 @@ extern const struct dsa_device_ops notag
+ void dsa_slave_mii_bus_init(struct dsa_switch *ds);
+ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
+ int port, char *name);
++void dsa_slave_destroy(struct net_device *slave_dev);
+ int dsa_slave_suspend(struct net_device *slave_dev);
+ int dsa_slave_resume(struct net_device *slave_dev);
+ int dsa_slave_netdevice_event(struct notifier_block *unused,
+--- a/net/dsa/slave.c
++++ b/net/dsa/slave.c
+@@ -1225,6 +1225,17 @@ int dsa_slave_create(struct dsa_switch *
+ return 0;
+ }
+
++void dsa_slave_destroy(struct net_device *slave_dev)
++{
++ struct dsa_slave_priv *p = netdev_priv(slave_dev);
++
++ netif_carrier_off(slave_dev);
++ if (p->phy)
++ phy_disconnect(p->phy);
++ unregister_netdev(slave_dev);
++ free_netdev(slave_dev);
++}
++
+ static bool dsa_slave_dev_check(struct net_device *dev)
+ {
+ return dev->netdev_ops == &dsa_slave_netdev_ops;
--- /dev/null
+From 881eadabe71fa78c081eda3cd5701768f3778a21 Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Mon, 28 Nov 2016 19:25:09 +0100
+Subject: net: dsa: slave: fix fixed-link phydev leaks
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 881eadabe71fa78c081eda3cd5701768f3778a21 upstream.
+
+Make sure to deregister and free any fixed-link PHY registered using
+of_phy_register_fixed_link() on slave-setup errors and on slave destroy.
+
+Fixes: 0d8bcdd383b8 ("net: dsa: allow for more complex PHY setups")
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ net/dsa/slave.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/net/dsa/slave.c
++++ b/net/dsa/slave.c
+@@ -1083,6 +1083,8 @@ static int dsa_slave_phy_setup(struct ds
+ ret = dsa_slave_phy_connect(p, slave_dev, p->port);
+ if (ret) {
+ netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret);
++ if (phy_is_fixed)
++ of_phy_deregister_fixed_link(port_dn);
+ return ret;
+ }
+ } else {
--- /dev/null
+From 140ca9d3471c424ab4c4036ab8d8d995f24a9c5b Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Mon, 28 Nov 2016 19:24:59 +0100
+Subject: net: ethernet: bcmgenet: fix fixed-link phydev leaks
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 140ca9d3471c424ab4c4036ab8d8d995f24a9c5b upstream.
+
+Make sure to deregister and free any fixed-link PHY registered using
+of_phy_register_fixed_link() on probe errors and on driver unbind.
+
+Note that we're still leaking any fixed-link PHY registered in the
+non-OF probe path.
+
+Fixes: 9abf0c2b717a ("net: bcmgenet: use the new fixed PHY helpers")
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/broadcom/genet/bcmmii.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
++++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
+@@ -629,6 +629,7 @@ static int bcmgenet_mii_bus_init(struct
+ int bcmgenet_mii_init(struct net_device *dev)
+ {
+ struct bcmgenet_priv *priv = netdev_priv(dev);
++ struct device_node *dn = priv->pdev->dev.of_node;
+ int ret;
+
+ ret = bcmgenet_mii_alloc(priv);
+@@ -642,6 +643,8 @@ int bcmgenet_mii_init(struct net_device
+ return 0;
+
+ out:
++ if (of_phy_is_fixed_link(dn))
++ of_phy_deregister_fixed_link(dn);
+ of_node_put(priv->phy_dn);
+ mdiobus_unregister(priv->mii_bus);
+ kfree(priv->mii_bus->irq);
+@@ -652,7 +655,10 @@ out:
+ void bcmgenet_mii_exit(struct net_device *dev)
+ {
+ struct bcmgenet_priv *priv = netdev_priv(dev);
++ struct device_node *dn = priv->pdev->dev.of_node;
+
++ if (of_phy_is_fixed_link(dn))
++ of_phy_deregister_fixed_link(dn);
+ of_node_put(priv->phy_dn);
+ mdiobus_unregister(priv->mii_bus);
+ kfree(priv->mii_bus->irq);
--- /dev/null
+From 39f8b0d426e0b3e04ddf4c6ef0ae28873c0f8c0f Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Mon, 28 Nov 2016 19:24:58 +0100
+Subject: net: ethernet: bcmsysport: fix fixed-link phydev leaks
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 39f8b0d426e0b3e04ddf4c6ef0ae28873c0f8c0f upstream.
+
+Make sure to deregister and free any fixed-link PHY registered using
+of_phy_register_fixed_link() on probe errors and on driver unbind.
+
+Fixes: 186534a3f832 ("net: systemport: use the new fixed PHY helpers")
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/broadcom/bcmsysport.c | 17 ++++++++++++-----
+ 1 file changed, 12 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bcmsysport.c
++++ b/drivers/net/ethernet/broadcom/bcmsysport.c
+@@ -1781,13 +1781,13 @@ static int bcm_sysport_probe(struct plat
+ if (priv->irq0 <= 0 || priv->irq1 <= 0) {
+ dev_err(&pdev->dev, "invalid interrupts\n");
+ ret = -EINVAL;
+- goto err;
++ goto err_free_netdev;
+ }
+
+ priv->base = devm_ioremap_resource(&pdev->dev, r);
+ if (IS_ERR(priv->base)) {
+ ret = PTR_ERR(priv->base);
+- goto err;
++ goto err_free_netdev;
+ }
+
+ priv->netdev = dev;
+@@ -1805,7 +1805,7 @@ static int bcm_sysport_probe(struct plat
+ ret = of_phy_register_fixed_link(dn);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to register fixed PHY\n");
+- goto err;
++ goto err_free_netdev;
+ }
+
+ priv->phy_dn = dn;
+@@ -1847,7 +1847,7 @@ static int bcm_sysport_probe(struct plat
+ ret = register_netdev(dev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to register net_device\n");
+- goto err;
++ goto err_deregister_fixed_link;
+ }
+
+ priv->rev = topctrl_readl(priv, REV_CNTL) & REV_MASK;
+@@ -1858,7 +1858,11 @@ static int bcm_sysport_probe(struct plat
+ priv->base, priv->irq0, priv->irq1, txq, rxq);
+
+ return 0;
+-err:
++
++err_deregister_fixed_link:
++ if (of_phy_is_fixed_link(dn))
++ of_phy_deregister_fixed_link(dn);
++err_free_netdev:
+ free_netdev(dev);
+ return ret;
+ }
+@@ -1866,11 +1870,14 @@ err:
+ static int bcm_sysport_remove(struct platform_device *pdev)
+ {
+ struct net_device *dev = dev_get_drvdata(&pdev->dev);
++ struct device_node *dn = pdev->dev.of_node;
+
+ /* Not much to do, ndo_close has been called
+ * and we use managed allocations
+ */
+ unregister_netdev(dev);
++ if (of_phy_is_fixed_link(dn))
++ of_phy_deregister_fixed_link(dn);
+ free_netdev(dev);
+ dev_set_drvdata(&pdev->dev, NULL);
+
--- /dev/null
+From 82005b1c19b11998ea98532d742c021a19f948d7 Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Mon, 28 Nov 2016 19:25:00 +0100
+Subject: net: ethernet: fec: fix fixed-link phydev leaks
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 82005b1c19b11998ea98532d742c021a19f948d7 upstream.
+
+Make sure to deregister and free any fixed-link PHY registered using
+of_phy_register_fixed_link() on probe errors and on driver unbind.
+
+Fixes: 407066f8f371 ("net: fec: Support phys probed from devicetree and
+fixed-link")
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/freescale/fec_main.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -3519,6 +3519,8 @@ failed_regulator:
+ failed_clk_ipg:
+ fec_enet_clk_enable(ndev, false);
+ failed_clk:
++ if (of_phy_is_fixed_link(np))
++ of_phy_deregister_fixed_link(np);
+ failed_phy:
+ of_node_put(phy_node);
+ failed_ioremap:
+@@ -3532,6 +3534,7 @@ fec_drv_remove(struct platform_device *p
+ {
+ struct net_device *ndev = platform_get_drvdata(pdev);
+ struct fec_enet_private *fep = netdev_priv(ndev);
++ struct device_node *np = pdev->dev.of_node;
+
+ cancel_work_sync(&fep->tx_timeout_work);
+ fec_ptp_stop(pdev);
+@@ -3541,6 +3544,8 @@ fec_drv_remove(struct platform_device *p
+ regulator_disable(fep->reg_phy);
+ pm_runtime_put(&pdev->dev);
+ pm_runtime_disable(&pdev->dev);
++ if (of_phy_is_fixed_link(np))
++ of_phy_deregister_fixed_link(np);
+ of_node_put(fep->phy_node);
+ free_netdev(ndev);
+
--- /dev/null
+From 14cab6f6510c498c2fd55d4fd6063a91b477d2ff Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Mon, 28 Nov 2016 19:25:08 +0100
+Subject: net: ethernet: ti: davinci_emac: fix fixed-link phydev and of-node leaks
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 14cab6f6510c498c2fd55d4fd6063a91b477d2ff upstream.
+
+Make sure to deregister and free any fixed-link PHY registered using
+of_phy_register_fixed_link() on probe errors and on driver unbind.
+
+Also remember to put the of-node reference on probe errors.
+
+Fixes: 1bb6aa56bb38 ("net: davinci_emac: Add support for fixed-link
+PHY")
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/net/ethernet/ti/davinci_emac.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+--- a/drivers/net/ethernet/ti/davinci_emac.c
++++ b/drivers/net/ethernet/ti/davinci_emac.c
+@@ -1909,6 +1909,7 @@ static int davinci_emac_try_get_mac(stru
+ */
+ static int davinci_emac_probe(struct platform_device *pdev)
+ {
++ struct device_node *np = pdev->dev.of_node;
+ int rc = 0;
+ struct resource *res, *res_ctrl;
+ struct net_device *ndev;
+@@ -1947,7 +1948,7 @@ static int davinci_emac_probe(struct pla
+ if (!pdata) {
+ dev_err(&pdev->dev, "no platform data\n");
+ rc = -ENODEV;
+- goto no_pdata;
++ goto err_free_netdev;
+ }
+
+ /* MAC addr and PHY mask , RMII enable info from platform_data */
+@@ -2083,6 +2084,10 @@ no_cpdma_chan:
+ cpdma_chan_destroy(priv->rxchan);
+ cpdma_ctlr_destroy(priv->dma);
+ no_pdata:
++ if (of_phy_is_fixed_link(np))
++ of_phy_deregister_fixed_link(np);
++ of_node_put(priv->phy_node);
++err_free_netdev:
+ free_netdev(ndev);
+ return rc;
+ }
+@@ -2098,6 +2103,7 @@ static int davinci_emac_remove(struct pl
+ {
+ struct net_device *ndev = platform_get_drvdata(pdev);
+ struct emac_priv *priv = netdev_priv(ndev);
++ struct device_node *np = pdev->dev.of_node;
+
+ dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n");
+
+@@ -2109,6 +2115,8 @@ static int davinci_emac_remove(struct pl
+
+ unregister_netdev(ndev);
+ of_node_put(priv->phy_node);
++ if (of_phy_is_fixed_link(np))
++ of_phy_deregister_fixed_link(np);
+ free_netdev(ndev);
+
+ return 0;
--- /dev/null
+From 3f65047c853a2a5abcd8ac1984af3452b5df4ada Mon Sep 17 00:00:00 2001
+From: Johan Hovold <johan@kernel.org>
+Date: Mon, 28 Nov 2016 19:24:55 +0100
+Subject: of_mdio: add helper to deregister fixed-link PHYs
+
+From: Johan Hovold <johan@kernel.org>
+
+commit 3f65047c853a2a5abcd8ac1984af3452b5df4ada upstream.
+
+Add helper to deregister fixed-link PHYs registered using
+of_phy_register_fixed_link().
+
+Convert the two drivers that care to deregister their fixed-link PHYs to
+use the new helper, but note that most drivers currently fail to do so.
+
+Signed-off-by: Johan Hovold <johan@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+[only take helper function for 4.4.y - gregkh]
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/of/of_mdio.c | 15 +++++++++++++++
+ include/linux/of_mdio.h | 4 ++++
+ 2 files changed, 19 insertions(+)
+
+--- a/drivers/of/of_mdio.c
++++ b/drivers/of/of_mdio.c
+@@ -367,4 +367,19 @@ int of_phy_register_fixed_link(struct de
+ return -ENODEV;
+ }
+ EXPORT_SYMBOL(of_phy_register_fixed_link);
++
++void of_phy_deregister_fixed_link(struct device_node *np)
++{
++ struct phy_device *phydev;
++
++ phydev = of_phy_find_device(np);
++ if (!phydev)
++ return;
++
++ fixed_phy_unregister(phydev);
++
++ put_device(&phydev->mdio.dev); /* of_phy_find_device() */
++ phy_device_free(phydev); /* fixed_phy_register() */
++}
++EXPORT_SYMBOL(of_phy_deregister_fixed_link);
+ #endif
+--- a/include/linux/of_mdio.h
++++ b/include/linux/of_mdio.h
+@@ -71,12 +71,16 @@ static inline int of_mdio_parse_addr(str
+
+ #if defined(CONFIG_OF) && defined(CONFIG_FIXED_PHY)
+ extern int of_phy_register_fixed_link(struct device_node *np);
++extern void of_phy_deregister_fixed_link(struct device_node *np);
+ extern bool of_phy_is_fixed_link(struct device_node *np);
+ #else
+ static inline int of_phy_register_fixed_link(struct device_node *np)
+ {
+ return -ENOSYS;
+ }
++static inline void of_phy_deregister_fixed_link(struct device_node *np)
++{
++}
+ static inline bool of_phy_is_fixed_link(struct device_node *np)
+ {
+ return false;
net-phy-avoid-polling-phy-with-phy_ignore_interrupts.patch
net-phy-fix-phy_mac_interrupt.patch
net-phy-bcm7xxx-fix-shadow-mode-2-disabling.patch
-net-ethernet-fs_enet-fix-fixed-link-phydev-leaks.patch
-net-ethernet-gianfar-fix-fixed-link-phydev-leaks.patch
-net-ethernet-marvell-mvneta-fix-fixed-link-phydev-leaks.patch
-net-ethernet-ucc_geth-fix-fixed-link-phydev-leaks.patch
of_mdio-fix-node-leak-in-of_phy_register_fixed_link-error-path.patch
phy-micrel-fix-finding-phy-properties-in-mac-node-for-ksz9031.patch
phy-micrel-disable-auto-negotiation-on-startup.patch
net_sched-flower-avoid-dissection-of-unmasked-keys.patch
pkt_sched-fq-use-proper-locking-in-fq_dump_stats.patch
sched-preempt-fix-preempt_count-manipulations.patch
+of_mdio-add-helper-to-deregister-fixed-link-phys.patch
+net-ethernet-fs_enet-fix-fixed-link-phydev-leaks.patch
+net-ethernet-gianfar-fix-fixed-link-phydev-leaks.patch
+net-ethernet-marvell-mvneta-fix-fixed-link-phydev-leaks.patch
+net-ethernet-ucc_geth-fix-fixed-link-phydev-leaks.patch
+net-ethernet-bcmsysport-fix-fixed-link-phydev-leaks.patch
+net-ethernet-bcmgenet-fix-fixed-link-phydev-leaks.patch
+net-ethernet-fec-fix-fixed-link-phydev-leaks.patch
+net-ethernet-ti-davinci_emac-fix-fixed-link-phydev-and-of-node-leaks.patch
+net-dsa-move-dsa-slave-destroy-code-to-slave.c.patch
+net-dsa-slave-fix-fixed-link-phydev-leaks.patch