diff options
Diffstat (limited to 'net/dsa/slave.c')
| -rw-r--r-- | net/dsa/slave.c | 31 | 
1 files changed, 18 insertions, 13 deletions
| diff --git a/net/dsa/slave.c b/net/dsa/slave.c index 2afa99506f8b..865e29e62bad 100644 --- a/net/dsa/slave.c +++ b/net/dsa/slave.c @@ -1301,28 +1301,33 @@ int dsa_slave_create(struct dsa_port *port, const char *name)  	p->old_duplex = -1;  	port->netdev = slave_dev; -	ret = register_netdev(slave_dev); -	if (ret) { -		netdev_err(master, "error %d registering interface %s\n", -			   ret, slave_dev->name); -		port->netdev = NULL; -		free_percpu(p->stats64); -		free_netdev(slave_dev); -		return ret; -	}  	netif_carrier_off(slave_dev);  	ret = dsa_slave_phy_setup(p, slave_dev);  	if (ret) {  		netdev_err(master, "error %d setting up slave phy\n", ret); -		unregister_netdev(slave_dev); -		free_percpu(p->stats64); -		free_netdev(slave_dev); -		return ret; +		goto out_free; +	} + +	ret = register_netdev(slave_dev); +	if (ret) { +		netdev_err(master, "error %d registering interface %s\n", +			   ret, slave_dev->name); +		goto out_phy;  	}  	return 0; + +out_phy: +	phy_disconnect(p->phy); +	if (of_phy_is_fixed_link(p->dp->dn)) +		of_phy_deregister_fixed_link(p->dp->dn); +out_free: +	free_percpu(p->stats64); +	free_netdev(slave_dev); +	port->netdev = NULL; +	return ret;  }  void dsa_slave_destroy(struct net_device *slave_dev) | 
