aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/freescale/ucc_geth.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/freescale/ucc_geth.c')
-rw-r--r--drivers/net/ethernet/freescale/ucc_geth.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
index 786182480a73..53c5fcf1436c 100644
--- a/drivers/net/ethernet/freescale/ucc_geth.c
+++ b/drivers/net/ethernet/freescale/ucc_geth.c
@@ -3867,9 +3867,8 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3867 dev = alloc_etherdev(sizeof(*ugeth)); 3867 dev = alloc_etherdev(sizeof(*ugeth));
3868 3868
3869 if (dev == NULL) { 3869 if (dev == NULL) {
3870 of_node_put(ug_info->tbi_node); 3870 err = -ENOMEM;
3871 of_node_put(ug_info->phy_node); 3871 goto err_deregister_fixed_link;
3872 return -ENOMEM;
3873 } 3872 }
3874 3873
3875 ugeth = netdev_priv(dev); 3874 ugeth = netdev_priv(dev);
@@ -3906,10 +3905,7 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3906 if (netif_msg_probe(ugeth)) 3905 if (netif_msg_probe(ugeth))
3907 pr_err("%s: Cannot register net device, aborting\n", 3906 pr_err("%s: Cannot register net device, aborting\n",
3908 dev->name); 3907 dev->name);
3909 free_netdev(dev); 3908 goto err_free_netdev;
3910 of_node_put(ug_info->tbi_node);
3911 of_node_put(ug_info->phy_node);
3912 return err;
3913 } 3909 }
3914 3910
3915 mac_addr = of_get_mac_address(np); 3911 mac_addr = of_get_mac_address(np);
@@ -3922,16 +3918,29 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3922 ugeth->node = np; 3918 ugeth->node = np;
3923 3919
3924 return 0; 3920 return 0;
3921
3922err_free_netdev:
3923 free_netdev(dev);
3924err_deregister_fixed_link:
3925 if (of_phy_is_fixed_link(np))
3926 of_phy_deregister_fixed_link(np);
3927 of_node_put(ug_info->tbi_node);
3928 of_node_put(ug_info->phy_node);
3929
3930 return err;
3925} 3931}
3926 3932
3927static int ucc_geth_remove(struct platform_device* ofdev) 3933static int ucc_geth_remove(struct platform_device* ofdev)
3928{ 3934{
3929 struct net_device *dev = platform_get_drvdata(ofdev); 3935 struct net_device *dev = platform_get_drvdata(ofdev);
3930 struct ucc_geth_private *ugeth = netdev_priv(dev); 3936 struct ucc_geth_private *ugeth = netdev_priv(dev);
3937 struct device_node *np = ofdev->dev.of_node;
3931 3938
3932 unregister_netdev(dev); 3939 unregister_netdev(dev);
3933 free_netdev(dev); 3940 free_netdev(dev);
3934 ucc_geth_memclean(ugeth); 3941 ucc_geth_memclean(ugeth);
3942 if (of_phy_is_fixed_link(np))
3943 of_phy_deregister_fixed_link(np);
3935 of_node_put(ugeth->ug_info->tbi_node); 3944 of_node_put(ugeth->ug_info->tbi_node);
3936 of_node_put(ugeth->ug_info->phy_node); 3945 of_node_put(ugeth->ug_info->phy_node);
3937 3946