int xenvif_schedulable(struct xenvif *vif)
 {
-       return netif_running(vif->dev) && netif_carrier_ok(vif->dev);
+       return netif_running(vif->dev) &&
+               test_bit(VIF_STATUS_CONNECTED, &vif->status);
 }
 
 static irqreturn_t xenvif_tx_interrupt(int irq, void *dev_id)
 static int xenvif_open(struct net_device *dev)
 {
        struct xenvif *vif = netdev_priv(dev);
-       if (netif_carrier_ok(dev))
+       if (test_bit(VIF_STATUS_CONNECTED, &vif->status))
                xenvif_up(vif);
        netif_tx_start_all_queues(dev);
        return 0;
 static int xenvif_close(struct net_device *dev)
 {
        struct xenvif *vif = netdev_priv(dev);
-       if (netif_carrier_ok(dev))
+       if (test_bit(VIF_STATUS_CONNECTED, &vif->status))
                xenvif_down(vif);
        netif_tx_stop_all_queues(dev);
        return 0;
        if (!vif->can_sg && vif->dev->mtu > ETH_DATA_LEN)
                dev_set_mtu(vif->dev, ETH_DATA_LEN);
        netdev_update_features(vif->dev);
+       set_bit(VIF_STATUS_CONNECTED, &vif->status);
        netif_carrier_on(vif->dev);
        if (netif_running(vif->dev))
                xenvif_up(vif);
        struct net_device *dev = vif->dev;
 
        rtnl_lock();
-       netif_carrier_off(dev); /* discard queued packets */
-       if (netif_running(dev))
-               xenvif_down(vif);
+       if (test_and_clear_bit(VIF_STATUS_CONNECTED, &vif->status)) {
+               netif_carrier_off(dev); /* discard queued packets */
+               if (netif_running(dev))
+                       xenvif_down(vif);
+       }
        rtnl_unlock();
 }
 
        unsigned int num_queues = vif->num_queues;
        unsigned int queue_index;
 
-       if (netif_carrier_ok(vif->dev))
-               xenvif_carrier_off(vif);
+       xenvif_carrier_off(vif);
 
        for (queue_index = 0; queue_index < num_queues; ++queue_index) {
                queue = &vif->queues[queue_index];