aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/xen-netback/interface.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
-rw-r--r--drivers/net/xen-netback/interface.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c
index f733cae3d4b6..fc1b8d78f4bc 100644
--- a/drivers/net/xen-netback/interface.c
+++ b/drivers/net/xen-netback/interface.c
@@ -345,17 +345,22 @@ err:
345 return err; 345 return err;
346} 346}
347 347
348void xenvif_disconnect(struct xenvif *vif) 348void xenvif_carrier_off(struct xenvif *vif)
349{ 349{
350 struct net_device *dev = vif->dev; 350 struct net_device *dev = vif->dev;
351 if (netif_carrier_ok(dev)) { 351
352 rtnl_lock(); 352 rtnl_lock();
353 netif_carrier_off(dev); /* discard queued packets */ 353 netif_carrier_off(dev); /* discard queued packets */
354 if (netif_running(dev)) 354 if (netif_running(dev))
355 xenvif_down(vif); 355 xenvif_down(vif);
356 rtnl_unlock(); 356 rtnl_unlock();
357 xenvif_put(vif); 357 xenvif_put(vif);
358 } 358}
359
360void xenvif_disconnect(struct xenvif *vif)
361{
362 if (netif_carrier_ok(vif->dev))
363 xenvif_carrier_off(vif);
359 364
360 atomic_dec(&vif->refcnt); 365 atomic_dec(&vif->refcnt);
361 wait_event(vif->waiting_to_free, atomic_read(&vif->refcnt) == 0); 366 wait_event(vif->waiting_to_free, atomic_read(&vif->refcnt) == 0);