static void vmbus_device_release(struct device *device);
static void vmbus_bus_release(struct device *device);
-static DEVICE_OBJECT* vmbus_child_device_create(GUID type, GUID instance, void* context);
-static void vmbus_child_device_destroy(DEVICE_OBJECT* device_obj);
-static int vmbus_child_device_register(DEVICE_OBJECT* root_device_obj, DEVICE_OBJECT* child_device_obj);
-static void vmbus_child_device_unregister(DEVICE_OBJECT* child_device_obj);
-static void vmbus_child_device_get_info(DEVICE_OBJECT *device_obj, DEVICE_INFO *device_info);
+static struct hv_device *vmbus_child_device_create(GUID type, GUID instance, void* context);
+static void vmbus_child_device_destroy(struct hv_device *device_obj);
+static int vmbus_child_device_register(struct hv_device *root_device_obj, struct hv_device *child_device_obj);
+static void vmbus_child_device_unregister(struct hv_device *child_device_obj);
+static void vmbus_child_device_get_info(struct hv_device *device_obj, DEVICE_INFO *device_info);
/* static ssize_t vmbus_show_class_id(struct device *dev, struct device_attribute *attr, char *buf); */
/* static ssize_t vmbus_show_device_id(struct device *dev, struct device_attribute *attr, char *buf); */
/* Setup /proc/sys/bus/vmbus/vmbus_loglevel */
/* Allow usage of sysctl cmd to set the logging level */
-static struct ctl_table_header *vmbus_ctl_table_hdr;
-
-static ctl_table vmbus_dev_ctl_table[] = {
- { .ctl_name = 8461,
- .procname = "vmbus_loglevel",
- .data = &vmbus_loglevel,
- .maxlen = sizeof(vmbus_loglevel),
- .mode = 0644,
- .proc_handler = &proc_dointvec },
- { }
-};
-
-static ctl_table vmbus_ctl_table[] = {
- { .ctl_name = CTL_DEV,
- .procname = "vmbus",
- .mode = 0555,
- .child = vmbus_dev_ctl_table },
- { }
-};
-
-static ctl_table vmus_root_ctl_table[] = {
- { .ctl_name = CTL_BUS,
- .procname = "bus",
- .mode = 0555,
- .child = vmbus_ctl_table },
- { }
-};
-
/* Set up per device attributes in /sys/bus/vmbus/devices/<bus device> */
- setup the vmbus root device
- retrieve the channel offers
--*/
-int vmbus_bus_init(PFN_DRIVERINITIALIZE pfn_drv_init)
+static int vmbus_bus_init(PFN_DRIVERINITIALIZE pfn_drv_init)
{
int ret=0;
unsigned int vector=0;
tasklet_init(&vmbus_drv_ctx->event_dpc, vmbus_event_dpc, (unsigned long)vmbus_drv_obj);
/* Now, register the bus driver with LDM */
- bus_register(&vmbus_drv_ctx->bus);
+ ret = bus_register(&vmbus_drv_ctx->bus);
+ if (ret)
+ {
+ ret = -1;
+ goto cleanup;
+ }
/* Get the interrupt resource */
ret = request_irq(vmbus_irq,
dev_ctx->device.release = vmbus_bus_release;
/* Setup the bus as root device */
- device_register(&dev_ctx->device);
+ ret = device_register(&dev_ctx->device);
+ if (ret)
+ {
+ DPRINT_ERR(VMBUS_DRV, "ERROR - Unable to register vmbus root device");
+
+ free_irq(vmbus_irq, NULL);
+ bus_unregister(&vmbus_drv_ctx->bus);
+
+ ret = -1;
+ goto cleanup;
+ }
+
vmbus_drv_obj->GetChannelOffers();
Desc: Terminate the vmbus driver. This routine is opposite of vmbus_bus_init()
--*/
-void vmbus_bus_exit(void)
+static void vmbus_bus_exit(void)
{
VMBUS_DRIVER_OBJECT *vmbus_drv_obj=&g_vmbus_drv.drv_obj;
struct vmbus_driver_context *vmbus_drv_ctx=&g_vmbus_drv;
Desc: Register a vmbus's child driver
--*/
-void vmbus_child_driver_register(struct driver_context* driver_ctx)
+int vmbus_child_driver_register(struct driver_context* driver_ctx)
{
VMBUS_DRIVER_OBJECT *vmbus_drv_obj=&g_vmbus_drv.drv_obj;
+ int ret;
DPRINT_ENTER(VMBUS_DRV);
/* The child driver on this vmbus */
driver_ctx->driver.bus = &g_vmbus_drv.bus;
- driver_register(&driver_ctx->driver);
+ ret = driver_register(&driver_ctx->driver);
vmbus_drv_obj->GetChannelOffers();
DPRINT_EXIT(VMBUS_DRV);
+
+ return ret;
}
EXPORT_SYMBOL(vmbus_child_driver_register);
Desc: Get the vmbus child device info. This is invoked to display various device attributes in sysfs.
--*/
-static void vmbus_child_device_get_info(DEVICE_OBJECT *device_obj, DEVICE_INFO *device_info)
+static void vmbus_child_device_get_info(struct hv_device *device_obj, DEVICE_INFO *device_info)
{
VMBUS_DRIVER_OBJECT *vmbus_drv_obj=&g_vmbus_drv.drv_obj;
Desc: Creates and registers a new child device on the vmbus.
--*/
-static DEVICE_OBJECT* vmbus_child_device_create(GUID type, GUID instance, void* context)
+static struct hv_device *vmbus_child_device_create(GUID type, GUID instance, void* context)
{
struct device_context *child_device_ctx;
- DEVICE_OBJECT* child_device_obj;
+ struct hv_device *child_device_obj;
DPRINT_ENTER(VMBUS_DRV);
Desc: Register the child device on the specified bus
--*/
-static int vmbus_child_device_register(DEVICE_OBJECT* root_device_obj, DEVICE_OBJECT* child_device_obj)
+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);
ret = child_device_ctx->probe_error;
if (ret)
- DPRINT_ERR(VMBUS_DRV, "unable to register child device (%p) (%d)", &child_device_ctx->device);
+ DPRINT_ERR(VMBUS_DRV, "unable to register child device (%p)", &child_device_ctx->device);
else
DPRINT_INFO(VMBUS_DRV, "child device (%p) registered", &child_device_ctx->device);
Desc: Remove the specified child device from the vmbus.
--*/
-static void vmbus_child_device_unregister(DEVICE_OBJECT* device_obj)
+static void vmbus_child_device_unregister(struct hv_device *device_obj)
{
struct device_context *device_ctx = to_device_context(device_obj);
Desc: Destroy the specified child device on the vmbus.
--*/
-static void vmbus_child_device_destroy(DEVICE_OBJECT* device_obj)
+static void vmbus_child_device_destroy(struct hv_device *device_obj)
{
DPRINT_ENTER(VMBUS_DRV);
if (memcmp(&device_ctx->class_id, &driver_ctx->class_id, sizeof(GUID)) == 0)
{
/* !! NOTE: The driver_ctx is not a vmbus_drv_ctx. We typecast it here to access the */
- /* DRIVER_OBJECT field */
+ /* struct hv_driver field */
struct vmbus_driver_context *vmbus_drv_ctx = (struct vmbus_driver_context*)driver_ctx;
device_ctx->device_obj.Driver = &vmbus_drv_ctx->drv_obj.Base;
DPRINT_INFO(VMBUS_DRV, "device object (%p) set to driver object (%p)", &device_ctx->device_obj, device_ctx->device_obj.Driver);