aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/xen-netback/interface.c')
-rw-r--r--drivers/net/xen-netback/interface.c26
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)
132static void xenvif_down(struct xenvif *vif) 132static 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
345void xenvif_disconnect(struct xenvif *vif) 346void 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
358void 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