diff options
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
| -rw-r--r-- | drivers/net/xen-netback/interface.c | 28 | 
1 files changed, 17 insertions, 11 deletions
| diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index b7d41f8c338..d9841416848 100644 --- a/drivers/net/xen-netback/interface.c +++ b/drivers/net/xen-netback/interface.c @@ -132,6 +132,7 @@ static void xenvif_up(struct xenvif *vif)  static void xenvif_down(struct xenvif *vif)  {  	disable_irq(vif->irq); +	del_timer_sync(&vif->credit_timeout);  	xen_netbk_deschedule_xenvif(vif);  	xen_netbk_remove_xenvif(vif);  } @@ -238,6 +239,8 @@ static const struct net_device_ops xenvif_netdev_ops = {  	.ndo_stop	= xenvif_close,  	.ndo_change_mtu	= xenvif_change_mtu,  	.ndo_fix_features = xenvif_fix_features, +	.ndo_set_mac_address = eth_mac_addr, +	.ndo_validate_addr   = eth_validate_addr,  };  struct xenvif *xenvif_alloc(struct device *parent, domid_t domid, @@ -343,23 +346,26 @@ err:  	return err;  } -void xenvif_disconnect(struct xenvif *vif) +void xenvif_carrier_off(struct xenvif *vif)  {  	struct net_device *dev = vif->dev; -	if (netif_carrier_ok(dev)) { -		rtnl_lock(); -		netif_carrier_off(dev); /* discard queued packets */ -		if (netif_running(dev)) -			xenvif_down(vif); -		rtnl_unlock(); -		xenvif_put(vif); -	} + +	rtnl_lock(); +	netif_carrier_off(dev); /* discard queued packets */ +	if (netif_running(dev)) +		xenvif_down(vif); +	rtnl_unlock(); +	xenvif_put(vif); +} + +void xenvif_disconnect(struct xenvif *vif) +{ +	if (netif_carrier_ok(vif->dev)) +		xenvif_carrier_off(vif);  	atomic_dec(&vif->refcnt);  	wait_event(vif->waiting_to_free, atomic_read(&vif->refcnt) == 0); -	del_timer_sync(&vif->credit_timeout); -  	if (vif->irq)  		unbind_from_irqhandler(vif->irq, vif); | 
