From 9c2388387cb87829f2534434e6b23cee96cb8623 Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Fri, 29 Apr 2011 13:45:04 -0700 Subject: [PATCH] --- yaml --- r: 249351 b: refs/heads/master c: 71a6655dedc2d8be8a292fc96840924d846ab925 h: refs/heads/master i: 249349: aab8356178f02f4a2c79df244c170032f5f5d520 249347: 1048a78047acaabfc6b6549bfbbc7b709a8982e2 249343: bd5b9c42531d8b2415aa2fae85c3186407aada7d v: v3 --- [refs] | 2 +- trunk/drivers/staging/hv/vmbus_drv.c | 34 ++++++++++++++++++++-------- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/[refs] b/[refs] index 7d34d666f170..1ec1e6d5839b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: b14a7b3014b1151597d526f2e24f291ebc3a4f5b +refs/heads/master: 71a6655dedc2d8be8a292fc96840924d846ab925 diff --git a/trunk/drivers/staging/hv/vmbus_drv.c b/trunk/drivers/staging/hv/vmbus_drv.c index 5f88249ece8e..8663f6459dd8 100644 --- a/trunk/drivers/staging/hv/vmbus_drv.c +++ b/trunk/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; }