pandora: defconfig: update
[pandora-kernel.git] / drivers / hv / vmbus_drv.c
index 0c048dd..f58067f 100644 (file)
@@ -62,6 +62,14 @@ struct hv_device_info {
        struct hv_dev_port_info outbound;
 };
 
+static int vmbus_exists(void)
+{
+       if (hv_acpi_dev == NULL)
+               return -ENODEV;
+
+       return 0;
+}
+
 
 static void get_channel_info(struct hv_device *device,
                             struct hv_device_info *info)
@@ -458,7 +466,7 @@ static void vmbus_on_msg_dpc(unsigned long data)
                 * will not deliver any more messages since there is
                 * no empty slot
                 */
-               smp_mb();
+               mb();
 
                if (msg->header.message_flags.msg_pending) {
                        /*
@@ -590,6 +598,10 @@ int __vmbus_driver_register(struct hv_driver *hv_driver, struct module *owner, c
 
        pr_info("registering driver %s\n", hv_driver->name);
 
+       ret = vmbus_exists();
+       if (ret < 0)
+               return ret;
+
        hv_driver->driver.name = hv_driver->name;
        hv_driver->driver.owner = owner;
        hv_driver->driver.mod_name = mod_name;
@@ -614,8 +626,8 @@ void vmbus_driver_unregister(struct hv_driver *hv_driver)
 {
        pr_info("unregistering driver %s\n", hv_driver->name);
 
-       driver_unregister(&hv_driver->driver);
-
+       if (!vmbus_exists())
+               driver_unregister(&hv_driver->driver);
 }
 EXPORT_SYMBOL_GPL(vmbus_driver_unregister);
 
@@ -669,7 +681,7 @@ int vmbus_device_register(struct hv_device *child_device_obj)
        if (ret)
                pr_err("Unable to register child device\n");
        else
-               pr_info("child device %s registered\n",
+               pr_debug("child device %s registered\n",
                        dev_name(&child_device_obj->device));
 
        return ret;
@@ -681,14 +693,14 @@ int vmbus_device_register(struct hv_device *child_device_obj)
  */
 void vmbus_device_unregister(struct hv_device *device_obj)
 {
+       pr_debug("child device %s unregistered\n",
+               dev_name(&device_obj->device));
+
        /*
         * Kick off the process of unregistering the device.
         * This will call vmbus_remove() and eventually vmbus_device_release()
         */
        device_unregister(&device_obj->device);
-
-       pr_info("child device %s unregistered\n",
-               dev_name(&device_obj->device));
 }
 
 
@@ -776,6 +788,7 @@ static int __init hv_acpi_init(void)
 
 cleanup:
        acpi_bus_unregister_driver(&vmbus_acpi_driver);
+       hv_acpi_dev = NULL;
        return ret;
 }