diff options
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
-rw-r--r-- | drivers/net/xen-netback/interface.c | 26 |
1 files changed, 15 insertions, 11 deletions
diff --git a/drivers/net/xen-netback/interface.c b/drivers/net/xen-netback/interface.c index 182562952c7..8eaf0e2aaf2 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) | |||
132 | static void xenvif_down(struct xenvif *vif) | 132 | static void xenvif_down(struct xenvif *vif) |
133 | { | 133 | { |
134 | disable_irq(vif->irq); | 134 | disable_irq(vif->irq); |
135 | del_timer_sync(&vif->credit_timeout); | ||
135 | xen_netbk_deschedule_xenvif(vif); | 136 | xen_netbk_deschedule_xenvif(vif); |
136 | xen_netbk_remove_xenvif(vif); | 137 | xen_netbk_remove_xenvif(vif); |
137 | } | 138 | } |
@@ -342,23 +343,26 @@ err: | |||
342 | return err; | 343 | return err; |
343 | } | 344 | } |
344 | 345 | ||
345 | void xenvif_disconnect(struct xenvif *vif) | 346 | void xenvif_carrier_off(struct xenvif *vif) |
346 | { | 347 | { |
347 | struct net_device *dev = vif->dev; | 348 | struct net_device *dev = vif->dev; |
348 | if (netif_carrier_ok(dev)) { | 349 | |
349 | rtnl_lock(); | 350 | rtnl_lock(); |
350 | netif_carrier_off(dev); /* discard queued packets */ | 351 | netif_carrier_off(dev); /* discard queued packets */ |
351 | if (netif_running(dev)) | 352 | if (netif_running(dev)) |
352 | xenvif_down(vif); | 353 | xenvif_down(vif); |
353 | rtnl_unlock(); | 354 | rtnl_unlock(); |
354 | xenvif_put(vif); | 355 | xenvif_put(vif); |
355 | } | 356 | } |
357 | |||
358 | void xenvif_disconnect(struct xenvif *vif) | ||
359 | { | ||
360 | if (netif_carrier_ok(vif->dev)) | ||
361 | xenvif_carrier_off(vif); | ||
356 | 362 | ||
357 | atomic_dec(&vif->refcnt); | 363 | atomic_dec(&vif->refcnt); |
358 | wait_event(vif->waiting_to_free, atomic_read(&vif->refcnt) == 0); | 364 | wait_event(vif->waiting_to_free, atomic_read(&vif->refcnt) == 0); |
359 | 365 | ||
360 | del_timer_sync(&vif->credit_timeout); | ||
361 | |||
362 | if (vif->irq) | 366 | if (vif->irq) |
363 | unbind_from_irqhandler(vif->irq, vif); | 367 | unbind_from_irqhandler(vif->irq, vif); |
364 | 368 | ||