Merge commit 'v2.6.37' into next
[firefly-linux-kernel-4.4.55.git] / drivers / staging / hv / vmbus_drv.c
index 8b3b14e5c37dfe1061a3aed645bc47c98cfeb2bd..0d9f3a411e729e005346feb5d3adf0c7ace64d65 100644 (file)
@@ -32,7 +32,7 @@
 #include "osd.h"
 #include "logging.h"
 #include "vmbus.h"
-#include "channel_interface.h"
+#include "channel.h"
 
 
 /* FIXME! We need to do this dynamically for PIC and APIC system */
@@ -71,7 +71,7 @@ static void vmbus_bus_release(struct device *device);
 
 static struct hv_device *vmbus_child_device_create(struct hv_guid *type,
                                                   struct hv_guid *instance,
-                                                  void *context);
+                                                  struct vmbus_channel *channel);
 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);
@@ -129,6 +129,47 @@ static struct vmbus_driver_context g_vmbus_drv = {
        .bus.dev_attrs =        vmbus_device_attrs,
 };
 
+static void get_channel_info(struct hv_device *device,
+                            struct hv_device_info *info)
+{
+       struct vmbus_channel_debug_info debug_info;
+
+       if (!device->channel)
+               return;
+
+       vmbus_get_debug_info(device->channel, &debug_info);
+
+       info->ChannelId = debug_info.RelId;
+       info->ChannelState = debug_info.State;
+       memcpy(&info->ChannelType, &debug_info.InterfaceType,
+              sizeof(struct hv_guid));
+       memcpy(&info->ChannelInstance, &debug_info.InterfaceInstance,
+              sizeof(struct hv_guid));
+
+       info->MonitorId = debug_info.MonitorId;
+
+       info->ServerMonitorPending = debug_info.ServerMonitorPending;
+       info->ServerMonitorLatency = debug_info.ServerMonitorLatency;
+       info->ServerMonitorConnectionId = debug_info.ServerMonitorConnectionId;
+
+       info->ClientMonitorPending = debug_info.ClientMonitorPending;
+       info->ClientMonitorLatency = debug_info.ClientMonitorLatency;
+       info->ClientMonitorConnectionId = debug_info.ClientMonitorConnectionId;
+
+       info->Inbound.InterruptMask = debug_info.Inbound.CurrentInterruptMask;
+       info->Inbound.ReadIndex = debug_info.Inbound.CurrentReadIndex;
+       info->Inbound.WriteIndex = debug_info.Inbound.CurrentWriteIndex;
+       info->Inbound.BytesAvailToRead = debug_info.Inbound.BytesAvailToRead;
+       info->Inbound.BytesAvailToWrite = debug_info.Inbound.BytesAvailToWrite;
+
+       info->Outbound.InterruptMask = debug_info.Outbound.CurrentInterruptMask;
+       info->Outbound.ReadIndex = debug_info.Outbound.CurrentReadIndex;
+       info->Outbound.WriteIndex = debug_info.Outbound.CurrentWriteIndex;
+       info->Outbound.BytesAvailToRead = debug_info.Outbound.BytesAvailToRead;
+       info->Outbound.BytesAvailToWrite =
+               debug_info.Outbound.BytesAvailToWrite;
+}
+
 /*
  * vmbus_show_device_attr - Show the device attribute in sysfs.
  *
@@ -444,30 +485,13 @@ void vmbus_child_driver_unregister(struct driver_context *driver_ctx)
 }
 EXPORT_SYMBOL(vmbus_child_driver_unregister);
 
-/**
- * vmbus_get_interface() - Get the vmbus channel interface.
- * @interface: Pointer to channel interface structure
- *
- * Get the Hyper-V channel used for the driver.
- *
- * @interface is of type &struct vmbus_channel_interface
- * This is invoked by child/client driver that sits above vmbus.
- *
- * Mainly used by Hyper-V drivers.
- */
-void vmbus_get_interface(struct vmbus_channel_interface *interface)
-{
-       *interface = vmbus_ops;
-}
-EXPORT_SYMBOL(vmbus_get_interface);
-
 /*
  * vmbus_child_device_create - Creates and registers a new child device
  * on the vmbus.
  */
 static struct hv_device *vmbus_child_device_create(struct hv_guid *type,
                                                   struct hv_guid *instance,
-                                                  void *context)
+                                                  struct vmbus_channel *channel)
 {
        struct vm_device *child_device_ctx;
        struct hv_device *child_device_obj;
@@ -500,7 +524,7 @@ static struct hv_device *vmbus_child_device_create(struct hv_guid *type,
                instance->data[14], instance->data[15]);
 
        child_device_obj = &child_device_ctx->device_obj;
-       child_device_obj->context = context;
+       child_device_obj->channel = channel;
        memcpy(&child_device_obj->deviceType, type, sizeof(struct hv_guid));
        memcpy(&child_device_obj->deviceInstance, instance,
               sizeof(struct hv_guid));