MODULE_PARM_DESC(max_queues,
                 "Maximum number of queues per virtual interface");
 
+#define XENNET_TIMEOUT  (5 * HZ)
+
 static const struct ethtool_ops xennet_ethtool_ops;
 
 struct netfront_cb {
 
        netif_carrier_off(netdev);
 
-       xenbus_switch_state(dev, XenbusStateInitialising);
-       wait_event(module_wq,
-                  xenbus_read_driver_state(dev->otherend) !=
-                  XenbusStateClosed &&
-                  xenbus_read_driver_state(dev->otherend) !=
-                  XenbusStateUnknown);
+       do {
+               xenbus_switch_state(dev, XenbusStateInitialising);
+               err = wait_event_timeout(module_wq,
+                                xenbus_read_driver_state(dev->otherend) !=
+                                XenbusStateClosed &&
+                                xenbus_read_driver_state(dev->otherend) !=
+                                XenbusStateUnknown, XENNET_TIMEOUT);
+       } while (!err);
+
        return netdev;
 
  exit:
 };
 #endif /* CONFIG_SYSFS */
 
-static int xennet_remove(struct xenbus_device *dev)
+static void xennet_bus_close(struct xenbus_device *dev)
 {
-       struct netfront_info *info = dev_get_drvdata(&dev->dev);
-
-       dev_dbg(&dev->dev, "%s\n", dev->nodename);
+       int ret;
 
-       if (xenbus_read_driver_state(dev->otherend) != XenbusStateClosed) {
+       if (xenbus_read_driver_state(dev->otherend) == XenbusStateClosed)
+               return;
+       do {
                xenbus_switch_state(dev, XenbusStateClosing);
-               wait_event(module_wq,
-                          xenbus_read_driver_state(dev->otherend) ==
-                          XenbusStateClosing ||
-                          xenbus_read_driver_state(dev->otherend) ==
-                          XenbusStateUnknown);
+               ret = wait_event_timeout(module_wq,
+                                  xenbus_read_driver_state(dev->otherend) ==
+                                  XenbusStateClosing ||
+                                  xenbus_read_driver_state(dev->otherend) ==
+                                  XenbusStateClosed ||
+                                  xenbus_read_driver_state(dev->otherend) ==
+                                  XenbusStateUnknown,
+                                  XENNET_TIMEOUT);
+       } while (!ret);
+
+       if (xenbus_read_driver_state(dev->otherend) == XenbusStateClosed)
+               return;
 
+       do {
                xenbus_switch_state(dev, XenbusStateClosed);
-               wait_event(module_wq,
-                          xenbus_read_driver_state(dev->otherend) ==
-                          XenbusStateClosed ||
-                          xenbus_read_driver_state(dev->otherend) ==
-                          XenbusStateUnknown);
-       }
+               ret = wait_event_timeout(module_wq,
+                                  xenbus_read_driver_state(dev->otherend) ==
+                                  XenbusStateClosed ||
+                                  xenbus_read_driver_state(dev->otherend) ==
+                                  XenbusStateUnknown,
+                                  XENNET_TIMEOUT);
+       } while (!ret);
+}
+
+static int xennet_remove(struct xenbus_device *dev)
+{
+       struct netfront_info *info = dev_get_drvdata(&dev->dev);
 
+       xennet_bus_close(dev);
        xennet_disconnect_backend(info);
 
        if (info->netdev->reg_state == NETREG_REGISTERED)