K. Y. Srinivasan
2011-Apr-29 20:42 UTC
[RESEND] [PATCH 00/18] Staging: hv: Cleanup vmbus driver code
This is a resend of the patches yet to be applied. This patch-set addresses some of the bus/driver model cleanup that Greg sugested over the last couple of days. In this patch-set we deal with the following issues: 1) Cleanup error handling in the vmbus_probe() and vmbus_child_device_register() functions. Fixed a bug in the probe failure path as part of this cleanup. 2) The Windows host cannot handle the vmbus_driver being unloaded and subsequently loaded. Cleanup the driver with this in mind. 3) Get rid of struct hv_bus that embedded struct bus_type to conform with the LDM. 4) Add probe/remove/shutdown functions to struct hv_driver to conform to LDM. 5) On some older Hyper-V hosts, the Linux PCI sub-sytem is not able to allocate irq resources to the vmbus driver. I recently learnt that the vmbus driver is an acpi enumerated device on the Hyper-V platform. Added code to retrieve irq information from DSDT. Regards, K. Y
K. Y. Srinivasan
2011-Apr-29 20:44 UTC
[PATCH 01/18] Staging: hv: vmbus_driver cannot be unloaded; cleanup accordingly
The vmbus driver cannot be unloaded; the windows host does not permit this: A) All guest resources given to the host cannot be recovered and B) Windows host does not permit reloading the vmbus_driver without re-booting the guest. Both these issues are host related. Acknowledge this reality and cleanup the vmbus driver accordingly. Note that, ideally we will want to handle the root device through the Hyper-V block driver. In this case unloading the vmbus driver will not be possible because of the dependency issues. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_drv.c | 32 -------------------------------- 1 files changed, 0 insertions(+), 32 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index bf124a7..d597dd4 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -622,30 +622,6 @@ cleanup: return ret; } -/* - * vmbus_bus_exit - Terminate the vmbus driver. - * - * This routine is opposite of vmbus_bus_init() - */ -static void vmbus_bus_exit(void) -{ - - - vmbus_release_unattached_channels(); - vmbus_disconnect(); - on_each_cpu(hv_synic_cleanup, NULL, 1); - - hv_cleanup(); - - bus_unregister(&hv_bus.bus); - - free_irq(hv_pci_dev->irq, hv_pci_dev); - - tasklet_kill(&hv_bus.msg_dpc); - tasklet_kill(&hv_bus.event_dpc); -} - - /** * vmbus_child_driver_register() - Register a vmbus's child driver * @drv: Pointer to driver structure you want to register @@ -814,17 +790,9 @@ static int __init hv_pci_init(void) return pci_register_driver(&hv_bus_driver); } -static void __exit hv_pci_exit(void) -{ - vmbus_bus_exit(); - pci_unregister_driver(&hv_bus_driver); -} - - MODULE_LICENSE("GPL"); MODULE_VERSION(HV_DRV_VERSION); module_param(vmbus_loglevel, int, S_IRUGO|S_IWUSR); module_init(hv_pci_init); -module_exit(hv_pci_exit); -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 02/18] Staging: hv: Get rid of vmbus_release_unattached_channels() as it is not used
Since vmbus_release_unattached_channels() is only used in module unload path and since the vmbus driver cannot be unloaded, get rid of this "dead" code. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/channel_mgmt.c | 33 --------------------------------- drivers/staging/hv/channel_mgmt.h | 2 -- 2 files changed, 0 insertions(+), 35 deletions(-) diff --git a/drivers/staging/hv/channel_mgmt.c b/drivers/staging/hv/channel_mgmt.c index fe32f7e..1929ab3 100644 --- a/drivers/staging/hv/channel_mgmt.c +++ b/drivers/staging/hv/channel_mgmt.c @@ -791,37 +791,4 @@ cleanup: return ret; } -/* - * vmbus_release_unattached_channels - Release channels that are - * unattached/unconnected ie (no drivers associated) - */ -void vmbus_release_unattached_channels(void) -{ - struct vmbus_channel *channel, *pos; - struct vmbus_channel *start = NULL; - unsigned long flags; - - spin_lock_irqsave(&vmbus_connection.channel_lock, flags); - - list_for_each_entry_safe(channel, pos, &vmbus_connection.chn_list, - listentry) { - if (channel == start) - break; - - if (!channel->device_obj->drv) { - list_del(&channel->listentry); - - pr_err("Releasing unattached device object\n"); - - vmbus_child_device_unregister(channel->device_obj); - free_channel(channel); - } else { - if (!start) - start = channel; - } - } - - spin_unlock_irqrestore(&vmbus_connection.channel_lock, flags); -} - /* eof */ diff --git a/drivers/staging/hv/channel_mgmt.h b/drivers/staging/hv/channel_mgmt.h index 96f74e2..3b2c393 100644 --- a/drivers/staging/hv/channel_mgmt.h +++ b/drivers/staging/hv/channel_mgmt.h @@ -315,6 +315,4 @@ void vmbus_onmessage(void *context); int vmbus_request_offers(void); -void vmbus_release_unattached_channels(void); - #endif /* _CHANNEL_MGMT_H_ */ -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 03/18] Staging: hv: Get rid of the drv field in struct hv_device
Now, we can rid of the drv field in struct hv_device. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_api.h | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h index 51fa952..02e3587 100644 --- a/drivers/staging/hv/vmbus_api.h +++ b/drivers/staging/hv/vmbus_api.h @@ -103,9 +103,6 @@ struct hv_driver { /* Base device object */ struct hv_device { - /* the driver for this device */ - struct hv_driver *drv; - char name[64]; struct work_struct probe_failed_work_item; -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 04/18] Staging: hv: Cleanup error handling in vmbus_child_device_register()
Cleanup error handling in vmbus_child_device_register(). Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_drv.c | 3 --- 1 files changed, 0 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index d597dd4..1183459 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -720,9 +720,6 @@ int vmbus_child_device_register(struct hv_device *child_device_obj) */ ret = device_register(&child_device_obj->device); - /* vmbus_probe() error does not get propergate to device_register(). */ - ret = child_device_obj->probe_error; - if (ret) pr_err("Unable to register child device\n"); else -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 06/18] Staging: hv: Properly handle errors in hv_pci_probe()
Much of the vmbus driver initialization is done within the hv_pci_probe() function. Properly handle errors in hv_pci_probe so that we can appropriately deal with loading of the vmbus driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_drv.c | 34 +++++++++++++++++++++++++--------- 1 files changed, 25 insertions(+), 9 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 5f88249..8663f64 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -54,6 +54,8 @@ EXPORT_SYMBOL(vmbus_loglevel); /* (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); */ /* (((VMBUS | VMBUS_DRV)<<16) | DEBUG_LVL_ENTEREXIT); */ +static int pci_probe_error; +static struct completion probe_event; static void get_channel_info(struct hv_device *device, struct hv_device_info *info) @@ -722,19 +724,19 @@ void vmbus_child_device_unregister(struct hv_device *device_obj) static int __devinit hv_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { - int err; - hv_pci_dev = pdev; - err = pci_enable_device(pdev); - if (err) - return err; + pci_probe_error = pci_enable_device(pdev); + if (pci_probe_error) + goto probe_cleanup; - err = vmbus_bus_init(pdev); - if (err) + pci_probe_error = vmbus_bus_init(pdev); + if (pci_probe_error) pci_disable_device(pdev); - return err; +probe_cleanup: + complete(&probe_event); + return pci_probe_error; } /* @@ -757,7 +759,21 @@ static struct pci_driver hv_bus_driver = { static int __init hv_pci_init(void) { - return pci_register_driver(&hv_bus_driver); + int ret; + init_completion(&probe_event); + ret = pci_register_driver(&hv_bus_driver); + if (ret) + return ret; + /* + * All the vmbus initialization occurs within the + * hv_pci_probe() function. Wait for hv_pci_probe() + * to complete. + */ + wait_for_completion(&probe_event); + + if (pci_probe_error) + pci_unregister_driver(&hv_bus_driver); + return pci_probe_error; } -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 07/18] Staging: hv: Make hv_pci_dev a static variable
Make hv_pci_dev a static variable. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_drv.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 8663f64..4106dd3 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -40,7 +40,7 @@ #include "vmbus_private.h" -struct pci_dev *hv_pci_dev; +static struct pci_dev *hv_pci_dev; /* Main vmbus driver data structure */ struct hv_bus { -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 08/18] Staging: hv: Make msg_dpc a stand alone variable
In preparation for cleaning up (getting rid of) of the hv_bus structure, make msg_dpc a stand alone variable. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_drv.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 4106dd3..38bfff0 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -42,10 +42,11 @@ static struct pci_dev *hv_pci_dev; +static struct tasklet_struct msg_dpc; + /* Main vmbus driver data structure */ struct hv_bus { struct bus_type bus; - struct tasklet_struct msg_dpc; struct tasklet_struct event_dpc; }; @@ -515,7 +516,7 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id) /* Schedules a dpc if necessary */ if (ret > 0) { if (test_bit(0, (unsigned long *)&ret)) - tasklet_schedule(&hv_bus.msg_dpc); + tasklet_schedule(&msg_dpc); if (test_bit(1, (unsigned long *)&ret)) tasklet_schedule(&hv_bus.event_dpc); @@ -550,7 +551,7 @@ static int vmbus_bus_init(struct pci_dev *pdev) hv_bus.bus.name = driver_name; /* Initialize the bus context */ - tasklet_init(&hv_bus.msg_dpc, vmbus_on_msg_dpc, 0); + tasklet_init(&msg_dpc, vmbus_on_msg_dpc, 0); tasklet_init(&hv_bus.event_dpc, vmbus_on_event, 0); /* Now, register the bus with LDM */ -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 09/18] Staging: hv: Make event_dpc a stand alone variable
In preparation for getting rid of struct hv_bus, Make event_dpc a stand alone variable. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_drv.c | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 38bfff0..6cc01c2 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -43,11 +43,11 @@ static struct pci_dev *hv_pci_dev; static struct tasklet_struct msg_dpc; +static struct tasklet_struct event_dpc; /* Main vmbus driver data structure */ struct hv_bus { struct bus_type bus; - struct tasklet_struct event_dpc; }; unsigned int vmbus_loglevel = (ALL_MODULES << 16 | INFO_LVL); @@ -519,7 +519,7 @@ static irqreturn_t vmbus_isr(int irq, void *dev_id) tasklet_schedule(&msg_dpc); if (test_bit(1, (unsigned long *)&ret)) - tasklet_schedule(&hv_bus.event_dpc); + tasklet_schedule(&event_dpc); return IRQ_HANDLED; } else { @@ -552,7 +552,7 @@ static int vmbus_bus_init(struct pci_dev *pdev) /* Initialize the bus context */ tasklet_init(&msg_dpc, vmbus_on_msg_dpc, 0); - tasklet_init(&hv_bus.event_dpc, vmbus_on_event, 0); + tasklet_init(&event_dpc, vmbus_on_event, 0); /* Now, register the bus with LDM */ ret = bus_register(&hv_bus.bus); -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 10/18] Staging: hv: Get rid of struct hv_bus
Now, get rid of struct hv_bus. We will no longer be embedding struct bus_type. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_drv.c | 33 +++++++++++++-------------------- 1 files changed, 13 insertions(+), 20 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 6cc01c2..872752a 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -45,11 +45,6 @@ static struct pci_dev *hv_pci_dev; static struct tasklet_struct msg_dpc; static struct tasklet_struct event_dpc; -/* Main vmbus driver data structure */ -struct hv_bus { - struct bus_type bus; -}; - unsigned int vmbus_loglevel = (ALL_MODULES << 16 | INFO_LVL); EXPORT_SYMBOL(vmbus_loglevel); /* (ALL_MODULES << 16 | DEBUG_LVL_ENTEREXIT); */ @@ -403,14 +398,14 @@ static void vmbus_device_release(struct device *device) } /* The one and only one */ -static struct hv_bus hv_bus = { - .bus.name = "vmbus", - .bus.match = vmbus_match, - .bus.shutdown = vmbus_shutdown, - .bus.remove = vmbus_remove, - .bus.probe = vmbus_probe, - .bus.uevent = vmbus_uevent, - .bus.dev_attrs = vmbus_device_attrs, +static struct bus_type hv_bus = { + .name = "vmbus", + .match = vmbus_match, + .shutdown = vmbus_shutdown, + .remove = vmbus_remove, + .probe = vmbus_probe, + .uevent = vmbus_uevent, + .dev_attrs = vmbus_device_attrs, }; static const char *driver_name = "hyperv"; @@ -548,14 +543,12 @@ static int vmbus_bus_init(struct pci_dev *pdev) goto cleanup; } - hv_bus.bus.name = driver_name; - /* Initialize the bus context */ tasklet_init(&msg_dpc, vmbus_on_msg_dpc, 0); tasklet_init(&event_dpc, vmbus_on_event, 0); /* Now, register the bus with LDM */ - ret = bus_register(&hv_bus.bus); + ret = bus_register(&hv_bus); if (ret) { ret = -1; goto cleanup; @@ -570,7 +563,7 @@ static int vmbus_bus_init(struct pci_dev *pdev) pr_err("Unable to request IRQ %d\n", pdev->irq); - bus_unregister(&hv_bus.bus); + bus_unregister(&hv_bus); ret = -1; goto cleanup; @@ -586,7 +579,7 @@ static int vmbus_bus_init(struct pci_dev *pdev) ret = vmbus_connect(); if (ret) { free_irq(pdev->irq, pdev); - bus_unregister(&hv_bus.bus); + bus_unregister(&hv_bus); goto cleanup; } @@ -616,7 +609,7 @@ int vmbus_child_driver_register(struct device_driver *drv) pr_info("child driver registering - name %s\n", drv->name); /* The child driver on this vmbus */ - drv->bus = &hv_bus.bus; + drv->bus = &hv_bus; ret = driver_register(drv); @@ -686,7 +679,7 @@ int vmbus_child_device_register(struct hv_device *child_device_obj) atomic_inc_return(&device_num)); /* The new device belongs to this bus */ - child_device_obj->device.bus = &hv_bus.bus; /* device->dev.bus; */ + child_device_obj->device.bus = &hv_bus; /* device->dev.bus; */ child_device_obj->device.parent = &hv_pci_dev->dev; child_device_obj->device.release = vmbus_device_release; -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 11/18] Staging: hv: Add probe function to struct hv_driver
Add probe function to struct hv_driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_api.h | 3 +++ 1 files changed, 3 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h index 14df762..4ffb739 100644 --- a/drivers/staging/hv/vmbus_api.h +++ b/drivers/staging/hv/vmbus_api.h @@ -99,6 +99,9 @@ struct hv_driver { int (*dev_add)(struct hv_device *device, void *data); int (*dev_rm)(struct hv_device *device); void (*cleanup)(struct hv_driver *driver); + + int (*probe)(struct hv_device *); + }; /* Base device object */ -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 12/18] Staging: hv: Use the probe function in struct hv_driver
Use the newly introduced probe function. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/blkvsc_drv.c | 19 +++++++++---------- drivers/staging/hv/hv_mouse.c | 11 +++++------ drivers/staging/hv/netvsc_drv.c | 19 +++++++++---------- drivers/staging/hv/storvsc_drv.c | 23 +++++++++++------------ drivers/staging/hv/vmbus_drv.c | 6 +++--- 5 files changed, 37 insertions(+), 41 deletions(-) diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c index ec6a761..20b9a53 100644 --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -140,7 +140,7 @@ MODULE_PARM_DESC(ring_size, "Ring buffer size (in bytes)"); * There is a circular dependency involving blkvsc_probe() * and block_ops. */ -static int blkvsc_probe(struct device *dev); +static int blkvsc_probe(struct hv_device *dev); static int blk_vsc_on_device_add(struct hv_device *device, void *additional_info) @@ -882,7 +882,7 @@ static int blkvsc_drv_init(void) drv->driver.name = storvsc_drv_obj->base.name; - drv->driver.probe = blkvsc_probe; + drv->probe = blkvsc_probe; drv->driver.remove = blkvsc_remove; drv->driver.shutdown = blkvsc_shutdown; @@ -937,11 +937,10 @@ static void blkvsc_drv_exit(void) /* * blkvsc_probe - Add a new device for this driver */ -static int blkvsc_probe(struct device *device) +static int blkvsc_probe(struct hv_device *dev) { struct storvsc_driver_object *storvsc_drv_obj - drv_to_stordrv(device->driver); - struct hv_device *device_obj = device_to_hv_device(device); + drv_to_stordrv(dev->device.driver); struct block_device_context *blkdev = NULL; struct storvsc_device_info device_info; @@ -961,7 +960,7 @@ static int blkvsc_probe(struct device *device) spin_lock_init(&blkdev->lock); - blkdev->request_pool = kmem_cache_create(dev_name(&device_obj->device), + blkdev->request_pool = kmem_cache_create(dev_name(&dev->device), sizeof(struct blkvsc_request), 0, SLAB_HWCACHE_ALIGN, NULL); if (!blkdev->request_pool) { @@ -971,17 +970,17 @@ static int blkvsc_probe(struct device *device) /* Call to the vsc driver to add the device */ - ret = storvsc_drv_obj->base.dev_add(device_obj, &device_info); + ret = storvsc_drv_obj->base.dev_add(dev, &device_info); if (ret != 0) goto cleanup; - blkdev->device_ctx = device_obj; + blkdev->device_ctx = dev; /* this identified the device 0 or 1 */ blkdev->target = device_info.target_id; /* this identified the ide ctrl 0 or 1 */ blkdev->path = device_info.path_id; - dev_set_drvdata(device, blkdev); + dev_set_drvdata(&dev->device, blkdev); ret = stor_vsc_get_major_info(&device_info, &major_info); @@ -1041,7 +1040,7 @@ static int blkvsc_probe(struct device *device) return ret; remove: - storvsc_drv_obj->base.dev_rm(device_obj); + storvsc_drv_obj->base.dev_rm(dev); cleanup: if (blkdev) { diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index 4333247..e2363b3 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -832,23 +832,22 @@ static void mousevsc_hid_close(struct hid_device *hid) { } -static int mousevsc_probe(struct device *device) +static int mousevsc_probe(struct hv_device *dev) { int ret = 0; struct mousevsc_drv_obj *mousevsc_drv_obj - drv_to_mousedrv(device->driver); + drv_to_mousedrv(dev->device.driver); - struct hv_device *device_obj = device_to_hv_device(device); struct input_device_context *input_dev_ctx; input_dev_ctx = kmalloc(sizeof(struct input_device_context), GFP_KERNEL); - dev_set_drvdata(device, input_dev_ctx); + dev_set_drvdata(&dev->device, input_dev_ctx); /* Call to the vsc driver to add the device */ - ret = mousevsc_drv_obj->base.dev_add(device_obj, NULL); + ret = mousevsc_drv_obj->base.dev_add(dev, NULL); if (ret != 0) { DPRINT_ERR(INPUTVSC_DRV, "unable to add input vsc device"); @@ -1023,7 +1022,7 @@ static int __init mousevsc_init(void) drv->driver.name = input_drv_obj->base.name; - drv->driver.probe = mousevsc_probe; + drv->probe = mousevsc_probe; drv->driver.remove = mousevsc_remove; /* The driver belongs to vmbus */ diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index e61eb7e..685a6f5 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -340,11 +340,10 @@ static void netvsc_send_garp(struct work_struct *w) } -static int netvsc_probe(struct device *device) +static int netvsc_probe(struct hv_device *dev) { struct netvsc_driver *net_drv_obj - drv_to_netvscdrv(device->driver); - struct hv_device *device_obj = device_to_hv_device(device); + drv_to_netvscdrv(dev->device.driver); struct net_device *net = NULL; struct net_device_context *net_device_ctx; struct netvsc_device_info device_info; @@ -361,16 +360,16 @@ static int netvsc_probe(struct device *device) netif_carrier_off(net); net_device_ctx = netdev_priv(net); - net_device_ctx->device_ctx = device_obj; + net_device_ctx->device_ctx = dev; net_device_ctx->avail = ring_size; - dev_set_drvdata(device, net); + dev_set_drvdata(&dev->device, net); INIT_WORK(&net_device_ctx->work, netvsc_send_garp); /* Notify the netvsc driver of the new device */ - ret = net_drv_obj->base.dev_add(device_obj, &device_info); + ret = net_drv_obj->base.dev_add(dev, &device_info); if (ret != 0) { free_netdev(net); - dev_set_drvdata(device, NULL); + dev_set_drvdata(&dev->device, NULL); netdev_err(net, "unable to add netvsc device (ret %d)\n", ret); return ret; @@ -397,12 +396,12 @@ static int netvsc_probe(struct device *device) net->features = NETIF_F_SG; SET_ETHTOOL_OPS(net, ðtool_ops); - SET_NETDEV_DEV(net, device); + SET_NETDEV_DEV(net, &dev->device); ret = register_netdev(net); if (ret != 0) { /* Remove the device and release the resource */ - net_drv_obj->base.dev_rm(device_obj); + net_drv_obj->base.dev_rm(dev); free_netdev(net); } @@ -501,7 +500,7 @@ static int netvsc_drv_init(int (*drv_init)(struct hv_driver *drv)) drv->driver.name = net_drv_obj->base.name; - drv->driver.probe = netvsc_probe; + drv->probe = netvsc_probe; drv->driver.remove = netvsc_remove; /* The driver belongs to vmbus */ diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 5ac2904..2060206 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -123,7 +123,7 @@ static int stor_vsc_initialize(struct hv_driver *driver) } /* Static decl */ -static int storvsc_probe(struct device *dev); +static int storvsc_probe(struct hv_device *dev); static int storvsc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd); static int storvsc_device_alloc(struct scsi_device *); static int storvsc_device_configure(struct scsi_device *); @@ -213,7 +213,7 @@ static int storvsc_drv_init(void) drv->driver.name = storvsc_drv_obj->base.name; - drv->driver.probe = storvsc_probe; + drv->probe = storvsc_probe; drv->driver.remove = storvsc_remove; /* The driver belongs to vmbus */ @@ -320,12 +320,11 @@ static void storvsc_drv_exit(void) /* * storvsc_probe - Add a new device for this driver */ -static int storvsc_probe(struct device *device) +static int storvsc_probe(struct hv_device *device) { int ret; struct storvsc_driver_object *storvsc_drv_obj - drv_to_stordrv(device->driver); - struct hv_device *device_obj = device_to_hv_device(device); + drv_to_stordrv(device->device.driver); struct Scsi_Host *host; struct host_device_context *host_device_ctx; struct storvsc_device_info device_info; @@ -340,16 +339,16 @@ static int storvsc_probe(struct device *device) return -ENOMEM; } - dev_set_drvdata(device, host); + dev_set_drvdata(&device->device, host); host_device_ctx = (struct host_device_context *)host->hostdata; memset(host_device_ctx, 0, sizeof(struct host_device_context)); host_device_ctx->port = host->host_no; - host_device_ctx->device_ctx = device_obj; + host_device_ctx->device_ctx = device; host_device_ctx->request_pool - kmem_cache_create(dev_name(&device_obj->device), + kmem_cache_create(dev_name(&device->device), sizeof(struct storvsc_cmd_request), 0, SLAB_HWCACHE_ALIGN, NULL); @@ -360,8 +359,8 @@ static int storvsc_probe(struct device *device) device_info.port_number = host->host_no; /* Call to the vsc driver to add the device */ - ret = storvsc_drv_obj->base.dev_add(device_obj, - (void *)&device_info); + ret = storvsc_drv_obj->base.dev_add(device, (void *)&device_info); + if (ret != 0) { DPRINT_ERR(STORVSC_DRV, "unable to add scsi vsc device"); kmem_cache_destroy(host_device_ctx->request_pool); @@ -381,11 +380,11 @@ static int storvsc_probe(struct device *device) host->max_channel = STORVSC_MAX_CHANNELS - 1; /* Register the HBA and start the scsi bus scan */ - ret = scsi_add_host(host, device); + ret = scsi_add_host(host, &device->device); if (ret != 0) { DPRINT_ERR(STORVSC_DRV, "unable to add scsi host device"); - storvsc_drv_obj->base.dev_rm(device_obj); + storvsc_drv_obj->base.dev_rm(device); kmem_cache_destroy(host_device_ctx->request_pool); scsi_host_put(host); diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 872752a..fb55af2 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -319,10 +319,10 @@ static int vmbus_probe(struct device *child_device) int ret = 0; struct hv_driver *drv drv_to_hv_drv(child_device->driver); + struct hv_device *dev = device_to_hv_device(child_device); - /* Let the specific open-source driver handles the probe if it can */ - if (drv->driver.probe) { - ret = drv->driver.probe(child_device); + if (drv->probe) { + ret = drv->probe(dev); if (ret != 0) pr_err("probe failed for device %s (%d)\n", dev_name(child_device), ret); -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 13/18] Staging: hv: Add remove() function to struct hv_driver
Add remove() function to struct hv_driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_api.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h index 4ffb739..3ae0c46 100644 --- a/drivers/staging/hv/vmbus_api.h +++ b/drivers/staging/hv/vmbus_api.h @@ -101,6 +101,7 @@ struct hv_driver { void (*cleanup)(struct hv_driver *driver); int (*probe)(struct hv_device *); + int (*remove)(struct hv_device *); }; -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 14/18] Staging: hv: Use the remove() function in struct hv_driver
Use the newly introduced remove() function in struct hv_driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/blkvsc_drv.c | 11 +++++------ drivers/staging/hv/hv_mouse.c | 11 +++++------ drivers/staging/hv/netvsc_drv.c | 13 ++++++------- drivers/staging/hv/storvsc_drv.c | 13 ++++++------- drivers/staging/hv/vmbus_drv.c | 9 +++------ 5 files changed, 25 insertions(+), 32 deletions(-) diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c index 20b9a53..80f7c0e 100644 --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -537,19 +537,18 @@ out: /* * blkvsc_remove() - Callback when our device is removed */ -static int blkvsc_remove(struct device *device) +static int blkvsc_remove(struct hv_device *dev) { struct storvsc_driver_object *storvsc_drv_obj - drv_to_stordrv(device->driver); - struct hv_device *device_obj = device_to_hv_device(device); - struct block_device_context *blkdev = dev_get_drvdata(device); + drv_to_stordrv(dev->device.driver); + struct block_device_context *blkdev = dev_get_drvdata(&dev->device); unsigned long flags; /* * Call to the vsc driver to let it know that the device is being * removed */ - storvsc_drv_obj->base.dev_rm(device_obj); + storvsc_drv_obj->base.dev_rm(dev); /* Get to a known state */ spin_lock_irqsave(&blkdev->lock, flags); @@ -883,7 +882,7 @@ static int blkvsc_drv_init(void) drv->driver.name = storvsc_drv_obj->base.name; drv->probe = blkvsc_probe; - drv->driver.remove = blkvsc_remove; + drv->remove = blkvsc_remove; drv->driver.shutdown = blkvsc_shutdown; /* The driver belongs to vmbus */ diff --git a/drivers/staging/hv/hv_mouse.c b/drivers/staging/hv/hv_mouse.c index e2363b3..d49a51e 100644 --- a/drivers/staging/hv/hv_mouse.c +++ b/drivers/staging/hv/hv_mouse.c @@ -858,20 +858,19 @@ static int mousevsc_probe(struct hv_device *dev) return 0; } -static int mousevsc_remove(struct device *device) +static int mousevsc_remove(struct hv_device *dev) { int ret = 0; struct mousevsc_drv_obj *mousevsc_drv_obj - drv_to_mousedrv(device->driver); + drv_to_mousedrv(dev->device.driver); - struct hv_device *device_obj = device_to_hv_device(device); struct input_device_context *input_dev_ctx; input_dev_ctx = kmalloc(sizeof(struct input_device_context), GFP_KERNEL); - dev_set_drvdata(device, input_dev_ctx); + dev_set_drvdata(&dev->device, input_dev_ctx); if (input_dev_ctx->connected) { hidinput_disconnect(input_dev_ctx->hid_device); @@ -885,7 +884,7 @@ static int mousevsc_remove(struct device *device) * Call to the vsc driver to let it know that the device * is being removed */ - ret = mousevsc_drv_obj->base.dev_rm(device_obj); + ret = mousevsc_drv_obj->base.dev_rm(dev); if (ret != 0) { DPRINT_ERR(INPUTVSC_DRV, @@ -1023,7 +1022,7 @@ static int __init mousevsc_init(void) drv->driver.name = input_drv_obj->base.name; drv->probe = mousevsc_probe; - drv->driver.remove = mousevsc_remove; + drv->remove = mousevsc_remove; /* The driver belongs to vmbus */ vmbus_child_driver_register(&drv->driver); diff --git a/drivers/staging/hv/netvsc_drv.c b/drivers/staging/hv/netvsc_drv.c index 685a6f5..f4c6000 100644 --- a/drivers/staging/hv/netvsc_drv.c +++ b/drivers/staging/hv/netvsc_drv.c @@ -408,16 +408,15 @@ static int netvsc_probe(struct hv_device *dev) return ret; } -static int netvsc_remove(struct device *device) +static int netvsc_remove(struct hv_device *dev) { struct netvsc_driver *net_drv_obj - drv_to_netvscdrv(device->driver); - struct hv_device *device_obj = device_to_hv_device(device); - struct net_device *net = dev_get_drvdata(&device_obj->device); + drv_to_netvscdrv(dev->device.driver); + struct net_device *net = dev_get_drvdata(&dev->device); int ret; if (net == NULL) { - dev_err(device, "No net device to remove\n"); + dev_err(&dev->device, "No net device to remove\n"); return 0; } @@ -434,7 +433,7 @@ static int netvsc_remove(struct device *device) * Call to the vsc driver to let it know that the device is being * removed */ - ret = net_drv_obj->base.dev_rm(device_obj); + ret = net_drv_obj->base.dev_rm(dev); if (ret != 0) { /* TODO: */ netdev_err(net, "unable to remove vsc device (ret %d)\n", ret); @@ -501,7 +500,7 @@ static int netvsc_drv_init(int (*drv_init)(struct hv_driver *drv)) drv->driver.name = net_drv_obj->base.name; drv->probe = netvsc_probe; - drv->driver.remove = netvsc_remove; + drv->remove = netvsc_remove; /* The driver belongs to vmbus */ ret = vmbus_child_driver_register(&drv->driver); diff --git a/drivers/staging/hv/storvsc_drv.c b/drivers/staging/hv/storvsc_drv.c index 2060206..e449481 100644 --- a/drivers/staging/hv/storvsc_drv.c +++ b/drivers/staging/hv/storvsc_drv.c @@ -128,7 +128,7 @@ static int storvsc_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd static int storvsc_device_alloc(struct scsi_device *); static int storvsc_device_configure(struct scsi_device *); static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd); -static int storvsc_remove(struct device *dev); +static int storvsc_remove(struct hv_device *dev); static struct scatterlist *create_bounce_buffer(struct scatterlist *sgl, unsigned int sg_count, @@ -214,7 +214,7 @@ static int storvsc_drv_init(void) drv->driver.name = storvsc_drv_obj->base.name; drv->probe = storvsc_probe; - drv->driver.remove = storvsc_remove; + drv->remove = storvsc_remove; /* The driver belongs to vmbus */ ret = vmbus_child_driver_register(&drv->driver); @@ -398,12 +398,11 @@ static int storvsc_probe(struct hv_device *device) /* * storvsc_remove - Callback when our device is removed */ -static int storvsc_remove(struct device *device) +static int storvsc_remove(struct hv_device *dev) { struct storvsc_driver_object *storvsc_drv_obj - drv_to_stordrv(device->driver); - struct hv_device *device_obj = device_to_hv_device(device); - struct Scsi_Host *host = dev_get_drvdata(device); + drv_to_stordrv(dev->device.driver); + struct Scsi_Host *host = dev_get_drvdata(&dev->device); struct host_device_context *host_device_ctx (struct host_device_context *)host->hostdata; @@ -411,7 +410,7 @@ static int storvsc_remove(struct device *device) * Call to the vsc driver to let it know that the device is being * removed */ - storvsc_drv_obj->base.dev_rm(device_obj); + storvsc_drv_obj->base.dev_rm(dev); if (host_device_ctx->request_pool) { kmem_cache_destroy(host_device_ctx->request_pool); diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index fb55af2..b1e6cc4 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -343,16 +343,13 @@ static int vmbus_remove(struct device *child_device) int ret; struct hv_driver *drv; + struct hv_device *dev = device_to_hv_device(child_device); if (child_device->driver) { drv = drv_to_hv_drv(child_device->driver); - /* - * Let the specific open-source driver handles the removal if - * it can - */ - if (drv->driver.remove) { - ret = drv->driver.remove(child_device); + if (drv->remove) { + ret = drv->remove(dev); } else { pr_err("remove not set for driver %s\n", dev_name(child_device)); -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 15/18] Staging: hv: Add shutdown() function to struct hv_driver
Add shutdown() function to struct hv_driver. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_api.h | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h index 3ae0c46..8e6c107 100644 --- a/drivers/staging/hv/vmbus_api.h +++ b/drivers/staging/hv/vmbus_api.h @@ -102,6 +102,7 @@ struct hv_driver { int (*probe)(struct hv_device *); int (*remove)(struct hv_device *); + void (*shutdown)(struct hv_device *); }; -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 16/18] Staging: hv: Use the shutdown() function in struct hv_driver
Use the newly introduced shutdown() function. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/blkvsc_drv.c | 6 +++--- drivers/staging/hv/vmbus_drv.c | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/drivers/staging/hv/blkvsc_drv.c b/drivers/staging/hv/blkvsc_drv.c index 80f7c0e..db44cf6 100644 --- a/drivers/staging/hv/blkvsc_drv.c +++ b/drivers/staging/hv/blkvsc_drv.c @@ -585,9 +585,9 @@ static int blkvsc_remove(struct hv_device *dev) } -static void blkvsc_shutdown(struct device *device) +static void blkvsc_shutdown(struct hv_device *dev) { - struct block_device_context *blkdev = dev_get_drvdata(device); + struct block_device_context *blkdev = dev_get_drvdata(&dev->device); unsigned long flags; if (!blkdev) @@ -883,7 +883,7 @@ static int blkvsc_drv_init(void) drv->probe = blkvsc_probe; drv->remove = blkvsc_remove; - drv->driver.shutdown = blkvsc_shutdown; + drv->shutdown = blkvsc_shutdown; /* The driver belongs to vmbus */ ret = vmbus_child_driver_register(&drv->driver); diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index b1e6cc4..6bf5365 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -367,6 +367,7 @@ static int vmbus_remove(struct device *child_device) static void vmbus_shutdown(struct device *child_device) { struct hv_driver *drv; + struct hv_device *dev = device_to_hv_device(child_device); /* The device may not be attached yet */ @@ -375,9 +376,8 @@ static void vmbus_shutdown(struct device *child_device) drv = drv_to_hv_drv(child_device->driver); - /* Let the specific open-source driver handles the removal if it can */ - if (drv->driver.shutdown) - drv->driver.shutdown(child_device); + if (drv->shutdown) + drv->shutdown(dev); return; } -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 17/18] Staging: hv: VMBUS is a acpi enumerated device; get irq value from bios
On some Windows hosts, the Linux PCI sub-system is not allocating irq resources to the vmbus driver. It looks like VMBUS is an ACPI enumerated device. Retrieve the irq information from DSDT. Currently we use this bios specified irq, if the PCI sub-system fails to allocate the irq. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_drv.c | 101 +++++++++++++++++++++++++++++++++++++++- 1 files changed, 100 insertions(+), 1 deletions(-) diff --git a/drivers/staging/hv/vmbus_drv.c b/drivers/staging/hv/vmbus_drv.c index 6bf5365..5dcd87a 100644 --- a/drivers/staging/hv/vmbus_drv.c +++ b/drivers/staging/hv/vmbus_drv.c @@ -17,8 +17,8 @@ * Authors: * Haiyang Zhang <haiyangz at microsoft.com> * Hank Janssen <hjanssen at microsoft.com> + * K. Y. Srinivasan <kys at microsoft.com> * - * 3/9/2011: K. Y. Srinivasan - Significant restructuring and cleanup */ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt @@ -31,6 +31,8 @@ #include <linux/pci.h> #include <linux/dmi.h> #include <linux/slab.h> +#include <linux/acpi.h> +#include <acpi/acpi_bus.h> #include <linux/completion.h> #include "version_info.h" #include "hv_api.h" @@ -52,6 +54,7 @@ EXPORT_SYMBOL(vmbus_loglevel); static int pci_probe_error; static struct completion probe_event; +static int irq; static void get_channel_info(struct hv_device *device, struct hv_device_info *info) @@ -712,6 +715,74 @@ void vmbus_child_device_unregister(struct hv_device *device_obj) } +/* + * VMBUS is an acpi enumerated device. Get the the IRQ information + * from DSDT. + */ + +static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *irq) +{ + + if (res->type == ACPI_RESOURCE_TYPE_IRQ) { + struct acpi_resource_irq *irqp; + irqp = &res->data.irq; + + *((unsigned int *)irq) = irqp->interrupts[0]; + } + + return AE_OK; +} + +static int vmbus_acpi_add(struct acpi_device *device) +{ + acpi_status result; + + result + acpi_walk_resources(device->handle, METHOD_NAME__CRS, + vmbus_walk_resources, &irq); + + if (ACPI_FAILURE(result)) { + complete(&probe_event); + return -ENODEV; + } + complete(&probe_event); + return 0; +} + +static const struct acpi_device_id vmbus_acpi_device_ids[] = { + {"VMBUS", 0}, + {"", 0}, +}; +MODULE_DEVICE_TABLE(acpi, vmbus_acpi_device_ids); + +static struct acpi_driver vmbus_acpi_driver = { + .name = "vmbus", + .ids = vmbus_acpi_device_ids, + .ops = { + .add = vmbus_acpi_add, + }, +}; + +static int vmbus_acpi_init(void) +{ + int result; + + + result = acpi_bus_register_driver(&vmbus_acpi_driver); + if (result < 0) + return result; + + return 0; +} + +static void vmbus_acpi_exit(void) +{ + acpi_bus_unregister_driver(&vmbus_acpi_driver); + + return; +} + + static int __devinit hv_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { @@ -721,7 +792,16 @@ static int __devinit hv_pci_probe(struct pci_dev *pdev, if (pci_probe_error) goto probe_cleanup; + /* + * If the PCI sub-sytem did not assign us an + * irq, use the bios provided one. + */ + + if (pdev->irq == 0) + pdev->irq = irq; + pci_probe_error = vmbus_bus_init(pdev); + if (pci_probe_error) pci_disable_device(pdev); @@ -751,6 +831,25 @@ static struct pci_driver hv_bus_driver = { static int __init hv_pci_init(void) { int ret; + + init_completion(&probe_event); + + /* + * Get irq resources first. + */ + + ret = vmbus_acpi_init(); + if (ret) + return ret; + + wait_for_completion(&probe_event); + + if (irq <= 0) { + vmbus_acpi_exit(); + return -ENODEV; + } + + vmbus_acpi_exit(); init_completion(&probe_event); ret = pci_register_driver(&hv_bus_driver); if (ret) -- 1.7.4.1
K. Y. Srinivasan
2011-Apr-29 20:45 UTC
[PATCH 18/18] Staging: hv: Get rid of an unused variable from struct hv_driver
The name field is unused in struct hv_driver. Get rid of it. Signed-off-by: K. Y. Srinivasan <kys at microsoft.com> Signed-off-by: Haiyang Zhang <haiyangz at microsoft.com> Signed-off-by: Abhishek Kane <v-abkane at microsoft.com> Signed-off-by: Hank Janssen <hjanssen at microsoft.com> --- drivers/staging/hv/vmbus_api.h | 2 -- 1 files changed, 0 insertions(+), 2 deletions(-) diff --git a/drivers/staging/hv/vmbus_api.h b/drivers/staging/hv/vmbus_api.h index 8e6c107..50fbeb5 100644 --- a/drivers/staging/hv/vmbus_api.h +++ b/drivers/staging/hv/vmbus_api.h @@ -108,8 +108,6 @@ struct hv_driver { /* Base device object */ struct hv_device { - char name[64]; - /* the device type id of this device */ struct hv_guid dev_type; -- 1.7.4.1
Reasonably Related Threads
- [RESEND] [PATCH 00/18] Staging: hv: Cleanup vmbus driver code
- [PATCH 00/25] Staging: hv: Cleanup vmbus driver code
- [PATCH 00/25] Staging: hv: Cleanup vmbus driver code
- [PATCH 00/12] Staging: hv: Cleanup vmbus driver - Phase II
- [PATCH 00/12] Staging: hv: Cleanup vmbus driver - Phase II