]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/staging/hv/vmbus_drv.c
include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit...
[net-next-2.6.git] / drivers / staging / hv / vmbus_drv.c
index 894eecfc63ca5bd3e8e84fb2b5bf11dc4680df05..3397ef08e0aaa87c25152b48c840a4b2d015949b 100644 (file)
 #include <linux/irq.h>
 #include <linux/interrupt.h>
 #include <linux/sysctl.h>
+#include <linux/pci.h>
+#include <linux/dmi.h>
+#include <linux/slab.h>
+#include "VersionInfo.h"
 #include "osd.h"
 #include "logging.h"
 #include "vmbus.h"
@@ -47,7 +51,7 @@ struct vmbus_driver_context {
        struct tasklet_struct event_dpc;
 
        /* The bus root device */
-       struct device_context device_ctx;
+       struct vm_device device_ctx;
 };
 
 static int vmbus_match(struct device *device, struct device_driver *driver);
@@ -135,7 +139,7 @@ static ssize_t vmbus_show_device_attr(struct device *dev,
                                      struct device_attribute *dev_attr,
                                      char *buf)
 {
-       struct device_context *device_ctx = device_to_device_context(dev);
+       struct vm_device *device_ctx = device_to_vm_device(dev);
        struct hv_device_info device_info;
 
        memset(&device_info, 0, sizeof(struct hv_device_info));
@@ -245,7 +249,7 @@ static int vmbus_bus_init(int (*drv_init)(struct hv_driver *drv))
 {
        struct vmbus_driver_context *vmbus_drv_ctx = &g_vmbus_drv;
        struct vmbus_driver *vmbus_drv_obj = &g_vmbus_drv.drv_obj;
-       struct device_context *dev_ctx = &g_vmbus_drv.device_ctx;
+       struct vm_device *dev_ctx = &g_vmbus_drv.device_ctx;
        int ret;
        unsigned int vector;
 
@@ -307,7 +311,7 @@ static int vmbus_bus_init(int (*drv_init)(struct hv_driver *drv))
        DPRINT_INFO(VMBUS_DRV, "irq 0x%x vector 0x%x", vmbus_irq, vector);
 
        /* Call to bus driver to add the root device */
-       memset(dev_ctx, 0, sizeof(struct device_context));
+       memset(dev_ctx, 0, sizeof(struct vm_device));
 
        ret = vmbus_drv_obj->Base.OnDeviceAdd(&dev_ctx->device_obj, &vector);
        if (ret != 0) {
@@ -368,7 +372,7 @@ static void vmbus_bus_exit(void)
        struct vmbus_driver *vmbus_drv_obj = &g_vmbus_drv.drv_obj;
        struct vmbus_driver_context *vmbus_drv_ctx = &g_vmbus_drv;
 
-       struct device_context *dev_ctx = &g_vmbus_drv.device_ctx;
+       struct vm_device *dev_ctx = &g_vmbus_drv.device_ctx;
 
        DPRINT_ENTER(VMBUS_DRV);
 
@@ -471,13 +475,13 @@ static struct hv_device *vmbus_child_device_create(struct hv_guid *type,
                                                   struct hv_guid *instance,
                                                   void *context)
 {
-       struct device_context *child_device_ctx;
+       struct vm_device *child_device_ctx;
        struct hv_device *child_device_obj;
 
        DPRINT_ENTER(VMBUS_DRV);
 
        /* Allocate the new child device */
-       child_device_ctx = kzalloc(sizeof(struct device_context), GFP_KERNEL);
+       child_device_ctx = kzalloc(sizeof(struct vm_device), GFP_KERNEL);
        if (!child_device_ctx) {
                DPRINT_ERR(VMBUS_DRV,
                        "unable to allocate device_context for child device");
@@ -526,10 +530,10 @@ static int vmbus_child_device_register(struct hv_device *root_device_obj,
                                       struct hv_device *child_device_obj)
 {
        int ret = 0;
-       struct device_context *root_device_ctx =
-                               to_device_context(root_device_obj);
-       struct device_context *child_device_ctx =
-                               to_device_context(child_device_obj);
+       struct vm_device *root_device_ctx =
+                               to_vm_device(root_device_obj);
+       struct vm_device *child_device_ctx =
+                               to_vm_device(child_device_obj);
        static atomic_t device_num = ATOMIC_INIT(0);
 
        DPRINT_ENTER(VMBUS_DRV);
@@ -572,7 +576,7 @@ static int vmbus_child_device_register(struct hv_device *root_device_obj,
  */
 static void vmbus_child_device_unregister(struct hv_device *device_obj)
 {
-       struct device_context *device_ctx = to_device_context(device_obj);
+       struct vm_device *device_ctx = to_vm_device(device_obj);
 
        DPRINT_ENTER(VMBUS_DRV);
 
@@ -610,7 +614,7 @@ static void vmbus_child_device_destroy(struct hv_device *device_obj)
  */
 static int vmbus_uevent(struct device *device, struct kobj_uevent_env *env)
 {
-       struct device_context *device_ctx = device_to_device_context(device);
+       struct vm_device *device_ctx = device_to_vm_device(device);
        int ret;
 
        DPRINT_ENTER(VMBUS_DRV);
@@ -687,7 +691,7 @@ static int vmbus_match(struct device *device, struct device_driver *driver)
 {
        int match = 0;
        struct driver_context *driver_ctx = driver_to_driver_context(driver);
-       struct device_context *device_ctx = device_to_device_context(device);
+       struct vm_device *device_ctx = device_to_vm_device(device);
 
        DPRINT_ENTER(VMBUS_DRV);
 
@@ -724,7 +728,7 @@ static int vmbus_match(struct device *device, struct device_driver *driver)
  */
 static void vmbus_probe_failed_cb(struct work_struct *context)
 {
-       struct device_context *device_ctx = (struct device_context *)context;
+       struct vm_device *device_ctx = (struct vm_device *)context;
 
        DPRINT_ENTER(VMBUS_DRV);
 
@@ -746,8 +750,8 @@ static int vmbus_probe(struct device *child_device)
        int ret = 0;
        struct driver_context *driver_ctx =
                        driver_to_driver_context(child_device->driver);
-       struct device_context *device_ctx =
-                       device_to_device_context(child_device);
+       struct vm_device *device_ctx =
+                       device_to_vm_device(child_device);
 
        DPRINT_ENTER(VMBUS_DRV);
 
@@ -871,7 +875,7 @@ static void vmbus_bus_release(struct device *device)
  */
 static void vmbus_device_release(struct device *device)
 {
-       struct device_context *device_ctx = device_to_device_context(device);
+       struct vm_device *device_ctx = device_to_vm_device(device);
 
        DPRINT_ENTER(VMBUS_DRV);
 
@@ -946,6 +950,19 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id)
        }
 }
 
+static struct dmi_system_id __initdata microsoft_hv_dmi_table[] = {
+       {
+               .ident = "Hyper-V",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Microsoft Corporation"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Virtual Machine"),
+                       DMI_MATCH(DMI_BOARD_NAME, "Virtual Machine"),
+               },
+       },
+       { },
+};
+MODULE_DEVICE_TABLE(dmi, microsoft_hv_dmi_table);
+
 static int __init vmbus_init(void)
 {
        int ret = 0;
@@ -957,6 +974,9 @@ static int __init vmbus_init(void)
                vmbus_loglevel, HIWORD(vmbus_loglevel), LOWORD(vmbus_loglevel));
        /* Todo: it is used for loglevel, to be ported to new kernel. */
 
+       if (!dmi_check_system(microsoft_hv_dmi_table))
+               return -ENODEV;
+
        ret = vmbus_bus_init(VmbusInitialize);
 
        DPRINT_EXIT(VMBUS_DRV);
@@ -973,7 +993,20 @@ static void __exit vmbus_exit(void)
        return;
 }
 
+/*
+ * We use a PCI table to determine if we should autoload this driver  This is
+ * needed by distro tools to determine if the hyperv drivers should be
+ * installed and/or configured.  We don't do anything else with the table, but
+ * it needs to be present.
+ */
+const static struct pci_device_id microsoft_hv_pci_table[] = {
+       { PCI_DEVICE(0x1414, 0x5353) }, /* VGA compatible controller */
+       { 0 }
+};
+MODULE_DEVICE_TABLE(pci, microsoft_hv_pci_table);
+
 MODULE_LICENSE("GPL");
+MODULE_VERSION(HV_DRV_VERSION);
 module_param(vmbus_irq, int, S_IRUGO);
 module_param(vmbus_loglevel, int, S_IRUGO);