All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/44] staging: unisys: continued rework of s-Par drivers
@ 2015-05-13 17:21 Benjamin Romer
  2015-05-13 17:21 ` [PATCH 01/44] staging: unisys: visorchipset_file_{init, cleanup}(): mark static Benjamin Romer
                   ` (43 more replies)
  0 siblings, 44 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:21 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, driverdev-devel, sparmaintainer, Benjamin Romer

This patch series continues the redesign and cleanup of the Unisys s-Par
driver set, continuing work on the visorbus driver and consolidation of other
drivers' code into the visorbus driver to reduce complexity. The patches were
cleaned up so there should be no warnings or errors generated at all during
the build; bugs that were located in these patches during their review have
not yet been addressed, and will be fixed individually in later patches.

David Kershner (13):
  staging: unisys: Remove appos_subsystems.h
  staging: unisys: move hypervisor calls into visorbus
  staging: unisys: Move controlframework into controlvmchannel.h
  staging: unisys: Move channel.h to include. Controvlm to visorbus
  staging: unisys: vbuschannel belonsg to visorbus
  staging: unisys: Move diagchannel to include
  staging: unisys: Move files out of common-spar
  staging: unisys: Get rid of references to common-spar
  staging: unisys: get rid of sparstop
  staging: unisys: remove remaining utility headers
  staging: unisys: Update diag serverity enum
  staging: unisys: Remove unneeded fields in diagchannel.h
  staging: unisys: Clean up diag_serverity enum

Don Zickus (25):
  staging: unisys: Temporarily add visorbus/ ccflags
  staging: unisys: Remove temporarily added visorbus/ include in
    Makefile
  staging: unisys: Embed struct device for easier handling of attr
  staging: unisys: Wire up proper device attr for bus
  staging: unisys: Move the visorbus device underneath devices
  staging: unisys: Properly move version file into bus attr
  staging: unisys: Remove dead kobj structs
  staging: unisys: Clean up device sysfs attributes
  staging: unisys: Prep for removing 'info' structs
  staging: unisys: Add visor device find routine
  staging: unisys: Add a function to set the clientpartition
  staging: unisys: Add checks for creation
  staging: unisys: Remove unused intr
  staging: unisys: Convert the device attributes to visor_device
  staging: unisys: Convert bus functions to pass bus_info pointer around
  staging: unisys: Convert device functions to pass dev_info pointer    
    around
  staging: unisys: Move channel creation up the stack
  staging: unisys: Convert pending_msg_hdr to a pointer
  staging: unisys: Prepare vbus_hdr_info to be public
  staging: unisys: Migrate bus from devdata to visor_device
  staging: unisys: Remove unused cruft
  staging: unisys: Remove server flags
  staging: unisys: Do not use 0 as the default bus root device number
  staging: unisys: Convert bus creation to use visor_device
  staging: unisys: Convert device creation to use visor_device

Jes Sorensen (6):
  staging: unisys: visorchipset_file_{init, cleanup}(): mark static
  staging: unisys: Remove unused visorchipset_save_message()
  staging: unisys: visorchipset_init(): Simplify initial checks
  staging: unisys: Remove unused livedump_info
  staging: unisys: Include missing headers
  staging: unisys: Removed unused entries from struct
    visor_channeltype_descriptor

 .../unisys/common-spar/include/channels/channel.h  |  590 ----------
 .../common-spar/include/channels/channel_guid.h    |   61 --
 .../include/channels/controlframework.h            |   62 --
 .../include/channels/controlvmchannel.h            |  455 --------
 .../common-spar/include/channels/diagchannel.h     |  427 --------
 .../common-spar/include/channels/iochannel.h       |  651 -----------
 .../common-spar/include/channels/vbuschannel.h     |   94 --
 .../include/controlvmcompletionstatus.h            |   94 --
 .../include/diagnostics/appos_subsystems.h         |  310 ------
 .../unisys/common-spar/include/iovmcall_gnuc.h     |   49 -
 .../unisys/common-spar/include/vbusdeviceinfo.h    |  213 ----
 .../staging/unisys/common-spar/include/version.h   |   45 -
 .../unisys/common-spar/include/vmcallinterface.h   |  163 ---
 drivers/staging/unisys/include/channel.h           |  555 ++++++++++
 drivers/staging/unisys/include/channel_guid.h      |   61 ++
 drivers/staging/unisys/include/diagchannel.h       |   43 +
 drivers/staging/unisys/include/guestlinuxdebug.h   |    1 -
 drivers/staging/unisys/include/iochannel.h         |  651 +++++++++++
 drivers/staging/unisys/include/sparstop.h          |   29 -
 drivers/staging/unisys/include/uisqueue.h          |  396 -------
 drivers/staging/unisys/include/uisthread.h         |   42 -
 drivers/staging/unisys/include/uisutils.h          |  294 -----
 drivers/staging/unisys/include/vbushelper.h        |    2 -
 drivers/staging/unisys/include/version.h           |   45 +
 drivers/staging/unisys/include/visorbus.h          |   31 +-
 drivers/staging/unisys/visorbus/Makefile           |    2 -
 drivers/staging/unisys/visorbus/controlvmchannel.h |  485 +++++++++
 .../unisys/visorbus/controlvmcompletionstatus.h    |   94 ++
 drivers/staging/unisys/visorbus/iovmcall_gnuc.h    |   49 +
 drivers/staging/unisys/visorbus/vbuschannel.h      |   94 ++
 drivers/staging/unisys/visorbus/vbusdeviceinfo.h   |  213 ++++
 drivers/staging/unisys/visorbus/visorbus_main.c    | 1141 +++++---------------
 drivers/staging/unisys/visorbus/visorbus_private.h |  114 +-
 drivers/staging/unisys/visorbus/visorchannel.c     |   15 +
 drivers/staging/unisys/visorbus/visorchipset.c     |  706 +++++-------
 drivers/staging/unisys/visorbus/vmcallinterface.h  |  161 +++
 drivers/staging/unisys/visorchannel/Makefile       |    2 -
 37 files changed, 3062 insertions(+), 5378 deletions(-)
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/channel.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/channel_guid.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/controlframework.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/diagchannel.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/iochannel.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/vbuschannel.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/controlvmcompletionstatus.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/diagnostics/appos_subsystems.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/iovmcall_gnuc.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/vbusdeviceinfo.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/version.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/vmcallinterface.h
 create mode 100644 drivers/staging/unisys/include/channel.h
 create mode 100644 drivers/staging/unisys/include/channel_guid.h
 create mode 100644 drivers/staging/unisys/include/diagchannel.h
 create mode 100644 drivers/staging/unisys/include/iochannel.h
 delete mode 100644 drivers/staging/unisys/include/sparstop.h
 delete mode 100644 drivers/staging/unisys/include/uisqueue.h
 delete mode 100644 drivers/staging/unisys/include/uisthread.h
 delete mode 100644 drivers/staging/unisys/include/uisutils.h
 create mode 100644 drivers/staging/unisys/include/version.h
 create mode 100644 drivers/staging/unisys/visorbus/controlvmchannel.h
 create mode 100644 drivers/staging/unisys/visorbus/controlvmcompletionstatus.h
 create mode 100644 drivers/staging/unisys/visorbus/iovmcall_gnuc.h
 create mode 100644 drivers/staging/unisys/visorbus/vbuschannel.h
 create mode 100644 drivers/staging/unisys/visorbus/vbusdeviceinfo.h
 create mode 100644 drivers/staging/unisys/visorbus/vmcallinterface.h

-- 
2.1.4

^ permalink raw reply	[flat|nested] 57+ messages in thread

* [PATCH 01/44] staging: unisys: visorchipset_file_{init, cleanup}(): mark static
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
@ 2015-05-13 17:21 ` Benjamin Romer
  2015-05-13 17:21 ` [PATCH 02/44] staging: unisys: Remove unused visorchipset_save_message() Benjamin Romer
                   ` (42 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:21 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, driverdev-devel, sparmaintainer, Benjamin Romer

From: Jes Sorensen <Jes.Sorensen@redhat.com>

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorchipset.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index ca22f49..66ae3d0 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -2351,7 +2351,7 @@ static const struct file_operations visorchipset_fops = {
 	.mmap = visorchipset_mmap,
 };
 
-int
+static int
 visorchipset_file_init(dev_t major_dev, struct visorchannel **controlvm_channel)
 {
 	int rc = 0;
@@ -2460,7 +2460,7 @@ cleanup:
 	return rc;
 }
 
-void
+static void
 visorchipset_file_cleanup(dev_t major_dev)
 {
 	if (file_cdev.ops)
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 02/44] staging: unisys: Remove unused visorchipset_save_message()
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
  2015-05-13 17:21 ` [PATCH 01/44] staging: unisys: visorchipset_file_{init, cleanup}(): mark static Benjamin Romer
@ 2015-05-13 17:21 ` Benjamin Romer
  2015-05-13 17:21 ` [PATCH 03/44] staging: unisys: visorchipset_init(): Simplify initial checks Benjamin Romer
                   ` (41 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:21 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, driverdev-devel, sparmaintainer, Benjamin Romer

From: Jes Sorensen <Jes.Sorensen@redhat.com>

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorchipset.c | 56 --------------------------
 1 file changed, 56 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 66ae3d0..d88f11f 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -933,62 +933,6 @@ enum crash_obj_type {
 	CRASH_BUS,
 };
 
-void
-visorchipset_save_message(struct controlvm_message *msg,
-			  enum crash_obj_type type)
-{
-	u32 crash_msg_offset;
-	u16 crash_msg_count;
-
-	/* get saved message count */
-	if (visorchannel_read(controlvm_channel,
-			      offsetof(struct spar_controlvm_channel_protocol,
-				       saved_crash_message_count),
-			      &crash_msg_count, sizeof(u16)) < 0) {
-		POSTCODE_LINUX_2(CRASH_DEV_CTRL_RD_FAILURE_PC,
-				 POSTCODE_SEVERITY_ERR);
-		return;
-	}
-
-	if (crash_msg_count != CONTROLVM_CRASHMSG_MAX) {
-		POSTCODE_LINUX_3(CRASH_DEV_COUNT_FAILURE_PC,
-				 crash_msg_count,
-				 POSTCODE_SEVERITY_ERR);
-		return;
-	}
-
-	/* get saved crash message offset */
-	if (visorchannel_read(controlvm_channel,
-			      offsetof(struct spar_controlvm_channel_protocol,
-				       saved_crash_message_offset),
-			      &crash_msg_offset, sizeof(u32)) < 0) {
-		POSTCODE_LINUX_2(CRASH_DEV_CTRL_RD_FAILURE_PC,
-				 POSTCODE_SEVERITY_ERR);
-		return;
-	}
-
-	if (type == CRASH_BUS) {
-		if (visorchannel_write(controlvm_channel,
-				       crash_msg_offset,
-				       msg,
-				       sizeof(struct controlvm_message)) < 0) {
-			POSTCODE_LINUX_2(SAVE_MSG_BUS_FAILURE_PC,
-					 POSTCODE_SEVERITY_ERR);
-			return;
-		}
-	} else { /* CRASH_DEV */
-		if (visorchannel_write(controlvm_channel,
-				       crash_msg_offset +
-				       sizeof(struct controlvm_message), msg,
-				       sizeof(struct controlvm_message)) < 0) {
-			POSTCODE_LINUX_2(SAVE_MSG_DEV_FAILURE_PC,
-					 POSTCODE_SEVERITY_ERR);
-			return;
-		}
-	}
-}
-EXPORT_SYMBOL_GPL(visorchipset_save_message);
-
 static void
 bus_responder(enum controlvm_id cmd_id, u32 bus_no, int response)
 {
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 03/44] staging: unisys: visorchipset_init(): Simplify initial checks
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
  2015-05-13 17:21 ` [PATCH 01/44] staging: unisys: visorchipset_file_{init, cleanup}(): mark static Benjamin Romer
  2015-05-13 17:21 ` [PATCH 02/44] staging: unisys: Remove unused visorchipset_save_message() Benjamin Romer
@ 2015-05-13 17:21 ` Benjamin Romer
  2015-05-13 17:21 ` [PATCH 04/44] staging: unisys: Remove unused livedump_info Benjamin Romer
                   ` (40 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:21 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: Jes Sorensen <Jes.Sorensen@redhat.com>

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorchipset.c | 40 +++++++++++---------------
 1 file changed, 17 insertions(+), 23 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index d88f11f..88a2b5e 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -1474,15 +1474,14 @@ initialize_controlvm_payload(void)
 /*  Send ACTION=online for DEVPATH=/sys/devices/platform/visorchipset.
  *  Returns CONTROLVM_RESP_xxx code.
  */
-int
+static int
 visorchipset_chipset_ready(void)
 {
 	kobject_uevent(&visorchipset_platform_device.dev.kobj, KOBJ_ONLINE);
 	return CONTROLVM_RESP_SUCCESS;
 }
-EXPORT_SYMBOL_GPL(visorchipset_chipset_ready);
 
-int
+static int
 visorchipset_chipset_selftest(void)
 {
 	char env_selftest[20];
@@ -1493,18 +1492,16 @@ visorchipset_chipset_selftest(void)
 			   envp);
 	return CONTROLVM_RESP_SUCCESS;
 }
-EXPORT_SYMBOL_GPL(visorchipset_chipset_selftest);
 
 /*  Send ACTION=offline for DEVPATH=/sys/devices/platform/visorchipset.
  *  Returns CONTROLVM_RESP_xxx code.
  */
-int
+static int
 visorchipset_chipset_notready(void)
 {
 	kobject_uevent(&visorchipset_platform_device.dev.kobj, KOBJ_OFFLINE);
 	return CONTROLVM_RESP_SUCCESS;
 }
-EXPORT_SYMBOL_GPL(visorchipset_chipset_notready);
 
 static void
 chipset_ready(struct controlvm_message_header *msg_hdr)
@@ -2099,14 +2096,13 @@ device_destroy_response(u32 bus_no, u32 dev_no, int response)
 	device_responder(CONTROLVM_DEVICE_DESTROY, bus_no, dev_no, response);
 }
 
-void
+static void
 visorchipset_device_pause_response(u32 bus_no, u32 dev_no, int response)
 {
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
 				     bus_no, dev_no, response,
 				     segment_state_standby);
 }
-EXPORT_SYMBOL_GPL(visorchipset_device_pause_response);
 
 static void
 device_resume_response(u32 bus_no, u32 dev_no, int response)
@@ -2327,28 +2323,26 @@ visorchipset_init(struct acpi_device *acpi_device)
 {
 	int rc = 0;
 	u64 addr;
+	int tmp_sz = sizeof(struct spar_controlvm_channel_protocol);
+	uuid_le uuid = SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID;
+
+	addr = controlvm_get_channel_address();
+	if (!addr)
+		return -ENODEV;
 
 	memset(&busdev_notifiers, 0, sizeof(busdev_notifiers));
 	memset(&controlvm_payload_info, 0, sizeof(controlvm_payload_info));
 	memset(&livedump_info, 0, sizeof(livedump_info));
 	atomic_set(&livedump_info.buffers_in_use, 0);
 
-	addr = controlvm_get_channel_address();
-	if (addr) {
-		int tmp_sz = sizeof(struct spar_controlvm_channel_protocol);
-		uuid_le uuid = SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID;
-		controlvm_channel =
-			visorchannel_create_with_lock(addr, tmp_sz,
-						      GFP_KERNEL, uuid);
-		if (SPAR_CONTROLVM_CHANNEL_OK_CLIENT(
-				visorchannel_get_header(controlvm_channel))) {
-			initialize_controlvm_payload();
-		} else {
-			visorchannel_destroy(controlvm_channel);
-			controlvm_channel = NULL;
-			return -ENODEV;
-		}
+	controlvm_channel = visorchannel_create_with_lock(addr, tmp_sz,
+							  GFP_KERNEL, uuid);
+	if (SPAR_CONTROLVM_CHANNEL_OK_CLIENT(
+		    visorchannel_get_header(controlvm_channel))) {
+		initialize_controlvm_payload();
 	} else {
+		visorchannel_destroy(controlvm_channel);
+		controlvm_channel = NULL;
 		return -ENODEV;
 	}
 
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 04/44] staging: unisys: Remove unused livedump_info
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (2 preceding siblings ...)
  2015-05-13 17:21 ` [PATCH 03/44] staging: unisys: visorchipset_init(): Simplify initial checks Benjamin Romer
@ 2015-05-13 17:21 ` Benjamin Romer
  2015-05-13 17:21 ` [PATCH 05/44] staging: unisys: Remove appos_subsystems.h Benjamin Romer
                   ` (39 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:21 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, driverdev-devel, sparmaintainer, Benjamin Romer

From: Jes Sorensen <Jes.Sorensen@redhat.com>

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorchipset.c | 18 ------------------
 1 file changed, 18 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 88a2b5e..e6d7075 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -135,22 +135,6 @@ struct visor_controlvm_payload_info {
 
 static struct visor_controlvm_payload_info controlvm_payload_info;
 
-/* Manages the info for a CONTROLVM_DUMP_CAPTURESTATE /
- * CONTROLVM_DUMP_GETTEXTDUMP / CONTROLVM_DUMP_COMPLETE conversation.
- */
-struct visor_livedump_info {
-	struct controlvm_message_header dumpcapture_header;
-	struct controlvm_message_header gettextdump_header;
-	struct controlvm_message_header dumpcomplete_header;
-	bool gettextdump_outstanding;
-	u32 crc32;
-	unsigned long length;
-	atomic_t buffers_in_use;
-	unsigned long destination;
-};
-
-static struct visor_livedump_info livedump_info;
-
 /* The following globals are used to handle the scenario where we are unable to
  * offload the payload from a controlvm message due to memory requirements.  In
  * this scenario, we simply stash the controlvm message, then attempt to
@@ -2332,8 +2316,6 @@ visorchipset_init(struct acpi_device *acpi_device)
 
 	memset(&busdev_notifiers, 0, sizeof(busdev_notifiers));
 	memset(&controlvm_payload_info, 0, sizeof(controlvm_payload_info));
-	memset(&livedump_info, 0, sizeof(livedump_info));
-	atomic_set(&livedump_info.buffers_in_use, 0);
 
 	controlvm_channel = visorchannel_create_with_lock(addr, tmp_sz,
 							  GFP_KERNEL, uuid);
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 05/44] staging: unisys: Remove appos_subsystems.h
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (3 preceding siblings ...)
  2015-05-13 17:21 ` [PATCH 04/44] staging: unisys: Remove unused livedump_info Benjamin Romer
@ 2015-05-13 17:21 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 06/44] staging: unisys: Include missing headers Benjamin Romer
                   ` (38 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:21 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Get rid of common-spar/include/diagnostics/appos_subsystems.h.

No one is using it.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 .../include/diagnostics/appos_subsystems.h         | 310 ---------------------
 drivers/staging/unisys/include/uisutils.h          |   1 -
 2 files changed, 311 deletions(-)
 delete mode 100644 drivers/staging/unisys/common-spar/include/diagnostics/appos_subsystems.h

diff --git a/drivers/staging/unisys/common-spar/include/diagnostics/appos_subsystems.h b/drivers/staging/unisys/common-spar/include/diagnostics/appos_subsystems.h
deleted file mode 100644
index 18cc9ed..0000000
--- a/drivers/staging/unisys/common-spar/include/diagnostics/appos_subsystems.h
+++ /dev/null
@@ -1,310 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/* Please note that this file is to be used ONLY for defining diagnostic
- * subsystem values for the appos (sPAR Linux service partitions) component.
- */
-#ifndef __APPOS_SUBSYSTEMS_H__
-#define __APPOS_SUBSYSTEMS_H__
-
-#ifdef __KERNEL__
-#include <linux/kernel.h>
-#include <linux/string.h>
-#else
-#include <stdio.h>
-#include <string.h>
-#endif
-
-static inline char *
-subsys_unknown_to_s(int subsys, char *s, int n)
-{
-	snprintf(s, n, "SUBSYS-%-2.2d", subsys);
-	s[n - 1] = '\0';
-	return s;
-}
-
-#define SUBSYS_TO_MASK(subsys)      (1ULL << (subsys))
-
-/* The first SUBSYS_APPOS_MAX subsystems are the same for each AppOS type
- * (IOVM, SMS, etc.) The rest have unique values for each AppOS type.
- */
-#define SUBSYS_APPOS_MAX 16
-
-#define	SUBSYS_APPOS_DEFAULT         1	/* or "other" */
-#define SUBSYS_APPOS_CHIPSET         2	/* controlvm and other */
-					/* low-level sPAR activity */
-#define SUBSYS_APPOS_BUS             3	/* sPAR bus */
-/* DAK #define SUBSYS_APPOS_DIAG            4  // diagnostics and dump */
-#define SUBSYS_APPOS_CHANNELACCESS   5	/* generic channel access */
-#define SUBSYS_APPOS_NICCLIENT       6	/* virtual NIC client */
-#define SUBSYS_APPOS_HBACLIENT       7	/* virtual HBA client */
-#define SUBSYS_APPOS_CONSOLESERIAL   8	/* sPAR virtual serial console */
-#define SUBSYS_APPOS_UISLIB          9	/*  */
-#define SUBSYS_APPOS_VRTCUPDD       10	/*  */
-#define SUBSYS_APPOS_WATCHDOG       11	/* watchdog timer and healthcheck */
-#define SUBSYS_APPOS_13             13	/* available */
-#define SUBSYS_APPOS_14             14	/* available */
-#define SUBSYS_APPOS_15             15	/* available */
-#define SUBSYS_APPOS_16             16	/* available */
-static inline char *
-subsys_generic_to_s(int subsys, char *s, int n)
-{
-	switch (subsys) {
-	case SUBSYS_APPOS_DEFAULT:
-		strncpy(s, "APPOS_DEFAULT", n);
-		break;
-	case SUBSYS_APPOS_CHIPSET:
-		strncpy(s, "APPOS_CHIPSET", n);
-		break;
-	case SUBSYS_APPOS_BUS:
-		strncpy(s, "APPOS_BUS", n);
-		break;
-	case SUBSYS_APPOS_CHANNELACCESS:
-		strncpy(s, "APPOS_CHANNELACCESS", n);
-		break;
-	case SUBSYS_APPOS_NICCLIENT:
-		strncpy(s, "APPOS_NICCLIENT", n);
-		break;
-	case SUBSYS_APPOS_HBACLIENT:
-		strncpy(s, "APPOS_HBACLIENT", n);
-		break;
-	case SUBSYS_APPOS_CONSOLESERIAL:
-		strncpy(s, "APPOS_CONSOLESERIAL", n);
-		break;
-	case SUBSYS_APPOS_UISLIB:
-		strncpy(s, "APPOS_UISLIB", n);
-		break;
-	case SUBSYS_APPOS_VRTCUPDD:
-		strncpy(s, "APPOS_VRTCUPDD", n);
-		break;
-	case SUBSYS_APPOS_WATCHDOG:
-		strncpy(s, "APPOS_WATCHDOG", n);
-		break;
-	case SUBSYS_APPOS_13:
-		strncpy(s, "APPOS_13", n);
-		break;
-	case SUBSYS_APPOS_14:
-		strncpy(s, "APPOS_14", n);
-		break;
-	case SUBSYS_APPOS_15:
-		strncpy(s, "APPOS_15", n);
-		break;
-	case SUBSYS_APPOS_16:
-		strncpy(s, "APPOS_16", n);
-		break;
-	default:
-		subsys_unknown_to_s(subsys, s, n);
-		break;
-	}
-	s[n - 1] = '\0';
-	return s;
-}
-
-/* CONSOLE */
-
-#define SUBSYS_CONSOLE_VIDEO        (SUBSYS_APPOS_MAX + 1)	/* 17 */
-#define SUBSYS_CONSOLE_KBDMOU       (SUBSYS_APPOS_MAX + 2)	/* 18 */
-#define SUBSYS_CONSOLE_04           (SUBSYS_APPOS_MAX + 4)
-#define SUBSYS_CONSOLE_05           (SUBSYS_APPOS_MAX + 5)
-#define SUBSYS_CONSOLE_06           (SUBSYS_APPOS_MAX + 6)
-#define SUBSYS_CONSOLE_07           (SUBSYS_APPOS_MAX + 7)
-#define SUBSYS_CONSOLE_08           (SUBSYS_APPOS_MAX + 8)
-#define SUBSYS_CONSOLE_09           (SUBSYS_APPOS_MAX + 9)
-#define SUBSYS_CONSOLE_10           (SUBSYS_APPOS_MAX + 10)
-#define SUBSYS_CONSOLE_11           (SUBSYS_APPOS_MAX + 11)
-#define SUBSYS_CONSOLE_12           (SUBSYS_APPOS_MAX + 12)
-#define SUBSYS_CONSOLE_13           (SUBSYS_APPOS_MAX + 13)
-#define SUBSYS_CONSOLE_14           (SUBSYS_APPOS_MAX + 14)
-#define SUBSYS_CONSOLE_15           (SUBSYS_APPOS_MAX + 15)
-#define SUBSYS_CONSOLE_16           (SUBSYS_APPOS_MAX + 16)
-#define SUBSYS_CONSOLE_17           (SUBSYS_APPOS_MAX + 17)
-#define SUBSYS_CONSOLE_18           (SUBSYS_APPOS_MAX + 18)
-#define SUBSYS_CONSOLE_19           (SUBSYS_APPOS_MAX + 19)
-#define SUBSYS_CONSOLE_20           (SUBSYS_APPOS_MAX + 20)
-#define SUBSYS_CONSOLE_21           (SUBSYS_APPOS_MAX + 21)
-#define SUBSYS_CONSOLE_22           (SUBSYS_APPOS_MAX + 22)
-#define SUBSYS_CONSOLE_23           (SUBSYS_APPOS_MAX + 23)
-#define SUBSYS_CONSOLE_24           (SUBSYS_APPOS_MAX + 24)
-#define SUBSYS_CONSOLE_25           (SUBSYS_APPOS_MAX + 25)
-#define SUBSYS_CONSOLE_26           (SUBSYS_APPOS_MAX + 26)
-#define SUBSYS_CONSOLE_27           (SUBSYS_APPOS_MAX + 27)
-#define SUBSYS_CONSOLE_28           (SUBSYS_APPOS_MAX + 28)
-#define SUBSYS_CONSOLE_29           (SUBSYS_APPOS_MAX + 29)
-#define SUBSYS_CONSOLE_30           (SUBSYS_APPOS_MAX + 30)
-#define SUBSYS_CONSOLE_31           (SUBSYS_APPOS_MAX + 31)
-#define SUBSYS_CONSOLE_32           (SUBSYS_APPOS_MAX + 32)
-#define SUBSYS_CONSOLE_33           (SUBSYS_APPOS_MAX + 33)
-#define SUBSYS_CONSOLE_34           (SUBSYS_APPOS_MAX + 34)
-#define SUBSYS_CONSOLE_35           (SUBSYS_APPOS_MAX + 35)
-#define SUBSYS_CONSOLE_36           (SUBSYS_APPOS_MAX + 36)
-#define SUBSYS_CONSOLE_37           (SUBSYS_APPOS_MAX + 37)
-#define SUBSYS_CONSOLE_38           (SUBSYS_APPOS_MAX + 38)
-#define SUBSYS_CONSOLE_39           (SUBSYS_APPOS_MAX + 39)
-#define SUBSYS_CONSOLE_40           (SUBSYS_APPOS_MAX + 40)
-#define SUBSYS_CONSOLE_41           (SUBSYS_APPOS_MAX + 41)
-#define SUBSYS_CONSOLE_42           (SUBSYS_APPOS_MAX + 42)
-#define SUBSYS_CONSOLE_43           (SUBSYS_APPOS_MAX + 43)
-#define SUBSYS_CONSOLE_44           (SUBSYS_APPOS_MAX + 44)
-#define SUBSYS_CONSOLE_45           (SUBSYS_APPOS_MAX + 45)
-#define SUBSYS_CONSOLE_46           (SUBSYS_APPOS_MAX + 46)
-
-static inline char *
-subsys_console_to_s(int subsys, char *s, int n)
-{
-	switch (subsys) {
-	case SUBSYS_CONSOLE_VIDEO:
-		strncpy(s, "CONSOLE_VIDEO", n);
-		break;
-	case SUBSYS_CONSOLE_KBDMOU:
-		strncpy(s, "CONSOLE_KBDMOU", n);
-		break;
-	case SUBSYS_CONSOLE_04:
-		strncpy(s, "CONSOLE_04", n);
-		break;
-	case SUBSYS_CONSOLE_05:
-		strncpy(s, "CONSOLE_05", n);
-		break;
-	case SUBSYS_CONSOLE_06:
-		strncpy(s, "CONSOLE_06", n);
-		break;
-	case SUBSYS_CONSOLE_07:
-		strncpy(s, "CONSOLE_07", n);
-		break;
-	case SUBSYS_CONSOLE_08:
-		strncpy(s, "CONSOLE_08", n);
-		break;
-	case SUBSYS_CONSOLE_09:
-		strncpy(s, "CONSOLE_09", n);
-		break;
-	case SUBSYS_CONSOLE_10:
-		strncpy(s, "CONSOLE_10", n);
-		break;
-	case SUBSYS_CONSOLE_11:
-		strncpy(s, "CONSOLE_11", n);
-		break;
-	case SUBSYS_CONSOLE_12:
-		strncpy(s, "CONSOLE_12", n);
-		break;
-	case SUBSYS_CONSOLE_13:
-		strncpy(s, "CONSOLE_13", n);
-		break;
-	case SUBSYS_CONSOLE_14:
-		strncpy(s, "CONSOLE_14", n);
-		break;
-	case SUBSYS_CONSOLE_15:
-		strncpy(s, "CONSOLE_15", n);
-		break;
-	case SUBSYS_CONSOLE_16:
-		strncpy(s, "CONSOLE_16", n);
-		break;
-	case SUBSYS_CONSOLE_17:
-		strncpy(s, "CONSOLE_17", n);
-		break;
-	case SUBSYS_CONSOLE_18:
-		strncpy(s, "CONSOLE_18", n);
-		break;
-	case SUBSYS_CONSOLE_19:
-		strncpy(s, "CONSOLE_19", n);
-		break;
-	case SUBSYS_CONSOLE_20:
-		strncpy(s, "CONSOLE_20", n);
-		break;
-	case SUBSYS_CONSOLE_21:
-		strncpy(s, "CONSOLE_21", n);
-		break;
-	case SUBSYS_CONSOLE_22:
-		strncpy(s, "CONSOLE_22", n);
-		break;
-	case SUBSYS_CONSOLE_23:
-		strncpy(s, "CONSOLE_23", n);
-		break;
-	case SUBSYS_CONSOLE_24:
-		strncpy(s, "CONSOLE_24", n);
-		break;
-	case SUBSYS_CONSOLE_25:
-		strncpy(s, "CONSOLE_25", n);
-		break;
-	case SUBSYS_CONSOLE_26:
-		strncpy(s, "CONSOLE_26", n);
-		break;
-	case SUBSYS_CONSOLE_27:
-		strncpy(s, "CONSOLE_27", n);
-		break;
-	case SUBSYS_CONSOLE_28:
-		strncpy(s, "CONSOLE_28", n);
-		break;
-	case SUBSYS_CONSOLE_29:
-		strncpy(s, "CONSOLE_29", n);
-		break;
-	case SUBSYS_CONSOLE_30:
-		strncpy(s, "CONSOLE_30", n);
-		break;
-	case SUBSYS_CONSOLE_31:
-		strncpy(s, "CONSOLE_31", n);
-		break;
-	case SUBSYS_CONSOLE_32:
-		strncpy(s, "CONSOLE_32", n);
-		break;
-	case SUBSYS_CONSOLE_33:
-		strncpy(s, "CONSOLE_33", n);
-		break;
-	case SUBSYS_CONSOLE_34:
-		strncpy(s, "CONSOLE_34", n);
-		break;
-	case SUBSYS_CONSOLE_35:
-		strncpy(s, "CONSOLE_35", n);
-		break;
-	case SUBSYS_CONSOLE_36:
-		strncpy(s, "CONSOLE_36", n);
-		break;
-	case SUBSYS_CONSOLE_37:
-		strncpy(s, "CONSOLE_37", n);
-		break;
-	case SUBSYS_CONSOLE_38:
-		strncpy(s, "CONSOLE_38", n);
-		break;
-	case SUBSYS_CONSOLE_39:
-		strncpy(s, "CONSOLE_39", n);
-		break;
-	case SUBSYS_CONSOLE_40:
-		strncpy(s, "CONSOLE_40", n);
-		break;
-	case SUBSYS_CONSOLE_41:
-		strncpy(s, "CONSOLE_41", n);
-		break;
-	case SUBSYS_CONSOLE_42:
-		strncpy(s, "CONSOLE_42", n);
-		break;
-	case SUBSYS_CONSOLE_43:
-		strncpy(s, "CONSOLE_43", n);
-		break;
-	case SUBSYS_CONSOLE_44:
-		strncpy(s, "CONSOLE_44", n);
-		break;
-	case SUBSYS_CONSOLE_45:
-		strncpy(s, "CONSOLE_45", n);
-		break;
-	case SUBSYS_CONSOLE_46:
-		strncpy(s, "CONSOLE_46", n);
-		break;
-	default:
-		subsys_unknown_to_s(subsys, s, n);
-		break;
-	}
-	s[n - 1] = '\0';
-	return s;
-}
-
-#endif
diff --git a/drivers/staging/unisys/include/uisutils.h b/drivers/staging/unisys/include/uisutils.h
index 4514772..d58858b 100644
--- a/drivers/staging/unisys/include/uisutils.h
+++ b/drivers/staging/unisys/include/uisutils.h
@@ -32,7 +32,6 @@
 #include "channel.h"
 #include "uisthread.h"
 #include "uisqueue.h"
-#include "diagnostics/appos_subsystems.h"
 #include "vbusdeviceinfo.h"
 #include <linux/atomic.h>
 
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 06/44] staging: unisys: Include missing headers
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (4 preceding siblings ...)
  2015-05-13 17:21 ` [PATCH 05/44] staging: unisys: Remove appos_subsystems.h Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 07/44] staging: unisys: Temporarily add visorbus/ ccflags Benjamin Romer
                   ` (37 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Jes Sorensen <Jes.Sorensen@redhat.com>

This preps for the possible build breakage in the next few
patches.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
[updated changelog to reflect new patch order; instead
of 'fixes' the patch 'prevents' - dcz]
Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/guestlinuxdebug.h | 1 -
 drivers/staging/unisys/include/vbushelper.h      | 2 --
 drivers/staging/unisys/visorbus/visorbus_main.c  | 2 +-
 3 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/staging/unisys/include/guestlinuxdebug.h b/drivers/staging/unisys/include/guestlinuxdebug.h
index 98150aa5..82ee565 100644
--- a/drivers/staging/unisys/include/guestlinuxdebug.h
+++ b/drivers/staging/unisys/include/guestlinuxdebug.h
@@ -22,7 +22,6 @@
 * ISSUE_IO_VMCALL_POSTCODE_SEVERITY */
 
 /******* INFO ON ISSUE_POSTCODE_LINUX() BELOW *******/
-#include "vmcallinterface.h"
 enum driver_pc {		/* POSTCODE driver identifier tuples */
 	/* visorchipset driver files */
 	VISOR_CHIPSET_PC = 0xA0,
diff --git a/drivers/staging/unisys/include/vbushelper.h b/drivers/staging/unisys/include/vbushelper.h
index 84abe5f..f272975 100644
--- a/drivers/staging/unisys/include/vbushelper.h
+++ b/drivers/staging/unisys/include/vbushelper.h
@@ -18,8 +18,6 @@
 #ifndef __VBUSHELPER_H__
 #define __VBUSHELPER_H__
 
-#include "vbusdeviceinfo.h"
-
 /* TARGET_HOSTNAME specified as -DTARGET_HOSTNAME=\"thename\" on the
  * command line */
 
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 77afa9d..114a765 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -23,7 +23,7 @@
 #include "periodic_work.h"
 #include "vbuschannel.h"
 #include "guestlinuxdebug.h"
-#include "vbusdeviceinfo.h"
+#include "vmcallinterface.h"
 
 #define MYDRVNAME "visorbus"
 
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 07/44] staging: unisys: Temporarily add visorbus/ ccflags
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (5 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 06/44] staging: unisys: Include missing headers Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 08/44] staging: unisys: move hypervisor calls into visorbus Benjamin Romer
                   ` (36 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

To prep for the moving of include files, temporarily add the
visorbus/ as a ccflags -I.  Once the header files are all
transitioned, we can remove this.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/Makefile | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/staging/unisys/visorbus/Makefile b/drivers/staging/unisys/visorbus/Makefile
index 72d4d44..32f199e 100644
--- a/drivers/staging/unisys/visorbus/Makefile
+++ b/drivers/staging/unisys/visorbus/Makefile
@@ -13,3 +13,4 @@ ccflags-y += -Idrivers/staging/unisys/include
 ccflags-y += -Idrivers/staging/unisys/common-spar/include
 ccflags-y += -Idrivers/staging/unisys/common-spar/include/channels
 ccflags-y += -Idrivers/staging/unisys/visorutil
+ccflags-y += -Idrivers/staging/unisys/visorbus
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 08/44] staging: unisys: move hypervisor calls into visorbus
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (6 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 07/44] staging: unisys: Temporarily add visorbus/ ccflags Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 09/44] staging: unisys: Move controlframework into controlvmchannel.h Benjamin Romer
                   ` (35 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Move hypervisor calls into visorbus and move vbusdeviceinfo.h into
visorbus.
Drivers will call into that to update clientInfo field.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 .../unisys/common-spar/include/iovmcall_gnuc.h     |  49 -----
 .../unisys/common-spar/include/vbusdeviceinfo.h    | 213 ---------------------
 .../unisys/common-spar/include/vmcallinterface.h   | 163 ----------------
 drivers/staging/unisys/visorbus/iovmcall_gnuc.h    |  49 +++++
 drivers/staging/unisys/visorbus/vbusdeviceinfo.h   | 213 +++++++++++++++++++++
 drivers/staging/unisys/visorbus/vmcallinterface.h  | 161 ++++++++++++++++
 6 files changed, 423 insertions(+), 425 deletions(-)
 delete mode 100644 drivers/staging/unisys/common-spar/include/iovmcall_gnuc.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/vbusdeviceinfo.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/vmcallinterface.h
 create mode 100644 drivers/staging/unisys/visorbus/iovmcall_gnuc.h
 create mode 100644 drivers/staging/unisys/visorbus/vbusdeviceinfo.h
 create mode 100644 drivers/staging/unisys/visorbus/vmcallinterface.h

diff --git a/drivers/staging/unisys/common-spar/include/iovmcall_gnuc.h b/drivers/staging/unisys/common-spar/include/iovmcall_gnuc.h
deleted file mode 100644
index 57dd93e..0000000
--- a/drivers/staging/unisys/common-spar/include/iovmcall_gnuc.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/* Linux GCC Version (32-bit and 64-bit) */
-static inline unsigned long
-__unisys_vmcall_gnuc(unsigned long tuple, unsigned long reg_ebx,
-		     unsigned long reg_ecx)
-{
-	unsigned long result = 0;
-	unsigned int cpuid_eax, cpuid_ebx, cpuid_ecx, cpuid_edx;
-
-	cpuid(0x00000001, &cpuid_eax, &cpuid_ebx, &cpuid_ecx, &cpuid_edx);
-	if (!(cpuid_ecx & 0x80000000))
-		return -1;
-
-	__asm__ __volatile__(".byte 0x00f, 0x001, 0x0c1" : "=a"(result) :
-		"a"(tuple), "b"(reg_ebx), "c"(reg_ecx));
-	return result;
-}
-
-static inline unsigned long
-__unisys_extended_vmcall_gnuc(unsigned long long tuple,
-			      unsigned long long reg_ebx,
-			      unsigned long long reg_ecx,
-			      unsigned long long reg_edx)
-{
-	unsigned long result = 0;
-	unsigned int cpuid_eax, cpuid_ebx, cpuid_ecx, cpuid_edx;
-
-	cpuid(0x00000001, &cpuid_eax, &cpuid_ebx, &cpuid_ecx, &cpuid_edx);
-	if (!(cpuid_ecx & 0x80000000))
-		return -1;
-
-	__asm__ __volatile__(".byte 0x00f, 0x001, 0x0c1" : "=a"(result) :
-		"a"(tuple), "b"(reg_ebx), "c"(reg_ecx), "d"(reg_edx));
-	return result;
-}
diff --git a/drivers/staging/unisys/common-spar/include/vbusdeviceinfo.h b/drivers/staging/unisys/common-spar/include/vbusdeviceinfo.h
deleted file mode 100644
index 9b6d3e6..0000000
--- a/drivers/staging/unisys/common-spar/include/vbusdeviceinfo.h
+++ /dev/null
@@ -1,213 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-#ifndef __VBUSDEVICEINFO_H__
-#define __VBUSDEVICEINFO_H__
-
-#include <linux/types.h>
-
-#pragma pack(push, 1)		/* both GCC and VC now allow this pragma */
-
-/* An array of this struct is present in the channel area for each vbus.
- * (See vbuschannel.h.)
- * It is filled in by the client side to provide info about the device
- * and driver from the client's perspective.
- */
-struct ultra_vbus_deviceinfo {
-	u8 devtype[16];		/* short string identifying the device type */
-	u8 drvname[16];		/* driver .sys file name */
-	u8 infostrs[96];	/* sequence of tab-delimited id strings: */
-	/* <DRIVER_REV> <DRIVER_VERTAG> <DRIVER_COMPILETIME> */
-	u8 reserved[128];	/* pad size to 256 bytes */
-};
-
-#pragma pack(pop)
-
-/* Reads chars from the buffer at <src> for <srcmax> bytes, and writes to
- * the buffer at <p>, which is <remain> bytes long, ensuring never to
- * overflow the buffer at <p>, using the following rules:
- * - printable characters are simply copied from the buffer at <src> to the
- *   buffer at <p>
- * - intervening streaks of non-printable characters in the buffer at <src>
- *   are replaced with a single space in the buffer at <p>
- * Note that we pay no attention to '\0'-termination.
- * Returns the number of bytes written to <p>.
- *
- * Pass <p> == NULL and <remain> == 0 for this special behavior.  In this
- * case, we simply return the number of bytes that WOULD HAVE been written
- * to a buffer at <p>, had it been infinitely big.
- */
-static inline int
-vbuschannel_sanitize_buffer(char *p, int remain, char *src, int srcmax)
-{
-	int chars = 0;
-	int nonprintable_streak = 0;
-
-	while (srcmax > 0) {
-		if ((*src >= ' ') && (*src < 0x7f)) {
-			if (nonprintable_streak) {
-				if (remain > 0) {
-					*p = ' ';
-					p++;
-					remain--;
-					chars++;
-				} else if (p == NULL) {
-					chars++;
-				}
-				nonprintable_streak = 0;
-			}
-			if (remain > 0) {
-				*p = *src;
-				p++;
-				remain--;
-				chars++;
-			} else if (p == NULL) {
-				chars++;
-			}
-		} else {
-			nonprintable_streak = 1;
-		}
-		src++;
-		srcmax--;
-	}
-	return chars;
-}
-
-#define VBUSCHANNEL_ADDACHAR(ch, p, remain, chars) \
-	do {					   \
-		if (remain <= 0)		   \
-			break;			   \
-		*p = ch;			   \
-		p++;  chars++;  remain--;	   \
-	} while (0)
-
-/* Converts the non-negative value at <num> to an ascii decimal string
- * at <p>, writing at most <remain> bytes.  Note there is NO '\0' termination
- * written to <p>.
- *
- * Returns the number of bytes written to <p>.
- *
- * Note that we create this function because we need to do this operation in
- * an environment-independent way (since we are in a common header file).
- */
-static inline int
-vbuschannel_itoa(char *p, int remain, int num)
-{
-	int digits = 0;
-	char s[32];
-	int i;
-
-	if (num == 0) {
-		/* '0' is a special case */
-		if (remain <= 0)
-			return 0;
-		*p = '0';
-		return 1;
-	}
-	/* form a backwards decimal ascii string in <s> */
-	while (num > 0) {
-		if (digits >= (int)sizeof(s))
-			return 0;
-		s[digits++] = (num % 10) + '0';
-		num = num / 10;
-	}
-	if (remain < digits) {
-		/* not enough room left at <p> to hold number, so fill with
-		 * '?' */
-		for (i = 0; i < remain; i++, p++)
-			*p = '?';
-		return remain;
-	}
-	/* plug in the decimal ascii string representing the number, by */
-	/* reversing the string we just built in <s> */
-	i = digits;
-	while (i > 0) {
-		i--;
-		*p = s[i];
-		p++;
-	}
-	return digits;
-}
-
-/* Reads <devInfo>, and converts its contents to a printable string at <p>,
- * writing at most <remain> bytes.  Note there is NO '\0' termination
- * written to <p>.
- *
- * Pass <devix> >= 0 if you want a device index presented.
- *
- * Returns the number of bytes written to <p>.
- */
-static inline int
-vbuschannel_devinfo_to_string(struct ultra_vbus_deviceinfo *devinfo,
-			      char *p, int remain, int devix)
-{
-	char *psrc;
-	int nsrc, x, i, pad;
-	int chars = 0;
-
-	psrc = &devinfo->devtype[0];
-	nsrc = sizeof(devinfo->devtype);
-	if (vbuschannel_sanitize_buffer(NULL, 0, psrc, nsrc) <= 0)
-		return 0;
-
-	/* emit device index */
-	if (devix >= 0) {
-		VBUSCHANNEL_ADDACHAR('[', p, remain, chars);
-		x = vbuschannel_itoa(p, remain, devix);
-		p += x;
-		remain -= x;
-		chars += x;
-		VBUSCHANNEL_ADDACHAR(']', p, remain, chars);
-	} else {
-		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
-		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
-		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
-	}
-
-	/* emit device type */
-	x = vbuschannel_sanitize_buffer(p, remain, psrc, nsrc);
-	p += x;
-	remain -= x;
-	chars += x;
-	pad = 15 - x;		/* pad device type to be exactly 15 chars */
-	for (i = 0; i < pad; i++)
-		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
-	VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
-
-	/* emit driver name */
-	psrc = &devinfo->drvname[0];
-	nsrc = sizeof(devinfo->drvname);
-	x = vbuschannel_sanitize_buffer(p, remain, psrc, nsrc);
-	p += x;
-	remain -= x;
-	chars += x;
-	pad = 15 - x;		/* pad driver name to be exactly 15 chars */
-	for (i = 0; i < pad; i++)
-		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
-	VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
-
-	/* emit strings */
-	psrc = &devinfo->infostrs[0];
-	nsrc = sizeof(devinfo->infostrs);
-	x = vbuschannel_sanitize_buffer(p, remain, psrc, nsrc);
-	p += x;
-	remain -= x;
-	chars += x;
-	VBUSCHANNEL_ADDACHAR('\n', p, remain, chars);
-
-	return chars;
-}
-
-#endif
diff --git a/drivers/staging/unisys/common-spar/include/vmcallinterface.h b/drivers/staging/unisys/common-spar/include/vmcallinterface.h
deleted file mode 100644
index 59a7459..0000000
--- a/drivers/staging/unisys/common-spar/include/vmcallinterface.h
+++ /dev/null
@@ -1,163 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-#ifndef __IOMONINTF_H__
-#define __IOMONINTF_H__
-
-/*
-* This file contains all structures needed to support the VMCALLs for IO
-* Virtualization.  The VMCALLs are provided by Monitor and used by IO code
-* running on IO Partitions.
-*/
-
-#ifdef __GNUC__
-#include "iovmcall_gnuc.h"
-#endif	/*  */
-#include "diagchannel.h"
-
-#ifdef VMCALL_IO_CONTROLVM_ADDR
-#undef VMCALL_IO_CONTROLVM_ADDR
-#endif	/*  */
-
-/* define subsystem number for AppOS, used in uislib driver  */
-#define MDS_APPOS 0x4000000000000000L	/* subsystem = 62 - AppOS */
-enum vmcall_monitor_interface_method_tuple { /* VMCALL identification tuples  */
-	    /* Note: when a new VMCALL is added:
-	     * - the 1st 2 hex digits correspond to one of the
-	     *   VMCALL_MONITOR_INTERFACE types and
-	     * - the next 2 hex digits are the nth relative instance of within a
-	     *   type
-	     * E.G. for VMCALL_VIRTPART_RECYCLE_PART,
-	     * - the 0x02 identifies it as a VMCALL_VIRTPART type and
-	     * - the 0x01 identifies it as the 1st instance of a VMCALL_VIRTPART
-	     *   type of VMCALL
-	     */
-
-	VMCALL_IO_CONTROLVM_ADDR = 0x0501,	/* used by all Guests, not just
-						 * IO */
-	VMCALL_IO_DIAG_ADDR = 0x0508,
-	VMCALL_IO_VISORSERIAL_ADDR = 0x0509,
-	VMCALL_QUERY_GUEST_VIRTUAL_TIME_OFFSET = 0x0708, /* Allow caller to
-							  * query virtual time
-							  * offset */
-	VMCALL_CHANNEL_VERSION_MISMATCH = 0x0709,
-	VMCALL_POST_CODE_LOGEVENT = 0x070B,	/* LOGEVENT Post Code (RDX) with
-						 * specified subsystem mask (RCX
-						 * - monitor_subsystems.h) and
-						 * severity (RDX) */
-	VMCALL_GENERIC_SURRENDER_QUANTUM_FOREVER = 0x0802, /* Yield the
-							    * remainder & all
-							    * future quantums of
-							    * the caller */
-	VMCALL_MEASUREMENT_DO_NOTHING = 0x0901,
-	VMCALL_UPDATE_PHYSICAL_TIME = 0x0a02	/* Allow
-						 * ULTRA_SERVICE_CAPABILITY_TIME
-						 * capable guest to make
-						 * VMCALL */
-};
-
-#define VMCALL_SUCCESS 0
-#define VMCALL_SUCCESSFUL(result)	(result == 0)
-
-#ifdef __GNUC__
-#define unisys_vmcall(tuple, reg_ebx, reg_ecx) \
-	__unisys_vmcall_gnuc(tuple, reg_ebx, reg_ecx)
-#define unisys_extended_vmcall(tuple, reg_ebx, reg_ecx, reg_edx) \
-	__unisys_extended_vmcall_gnuc(tuple, reg_ebx, reg_ecx, reg_edx)
-#define ISSUE_IO_VMCALL(method, param, result) \
-	(result = unisys_vmcall(method, (param) & 0xFFFFFFFF,	\
-				(param) >> 32))
-#define ISSUE_IO_EXTENDED_VMCALL(method, param1, param2, param3) \
-	unisys_extended_vmcall(method, param1, param2, param3)
-
-    /* The following uses VMCALL_POST_CODE_LOGEVENT interface but is currently
-     * not used much */
-#define ISSUE_IO_VMCALL_POSTCODE_SEVERITY(postcode, severity)		\
-do {									\
-	ISSUE_IO_EXTENDED_VMCALL(VMCALL_POST_CODE_LOGEVENT, severity,	\
-				 MDS_APPOS, postcode);			\
-} while (0)
-#endif
-
-/* Structures for IO VMCALLs */
-
-/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
-/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
-#pragma pack(push, 1)
-struct phys_info {
-	u64 pi_pfn;
-	u16 pi_off;
-	u16 pi_len;
-};
-
-#pragma pack(pop)
-/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
-
-/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
-/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
-#pragma pack(push, 1)
-/* Parameters to VMCALL_IO_CONTROLVM_ADDR interface */
-struct vmcall_io_controlvm_addr_params {
-	    /* The Guest-relative physical address of the ControlVm channel.
-	    * This VMCall fills this in with the appropriate address. */
-	u64 address;	/* contents provided by this VMCALL (OUT) */
-	    /* the size of the ControlVm channel in bytes This VMCall fills this
-	    * in with the appropriate address. */
-	u32 channel_bytes;	/* contents provided by this VMCALL (OUT) */
-	u8 unused[4];		/* Unused Bytes in the 64-Bit Aligned Struct */
-};
-
-#pragma pack(pop)
-/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
-
-/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
-/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
-#pragma pack(push, 1)
-/* Parameters to VMCALL_IO_DIAG_ADDR interface */
-struct vmcall_io_diag_addr_params {
-	    /* The Guest-relative physical address of the diagnostic channel.
-	    * This VMCall fills this in with the appropriate address. */
-	u64 address;	/* contents provided by this VMCALL (OUT) */
-};
-
-#pragma pack(pop)
-/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
-
-/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
-/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
-#pragma pack(push, 1)
-/* Parameters to VMCALL_IO_VISORSERIAL_ADDR interface */
-struct vmcall_io_visorserial_addr_params {
-	    /* The Guest-relative physical address of the serial console
-	    * channel.  This VMCall fills this in with the appropriate
-	    * address. */
-	u64 address;	/* contents provided by this VMCALL (OUT) */
-};
-
-#pragma pack(pop)
-/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
-
-/* Parameters to VMCALL_CHANNEL_MISMATCH interface */
-struct vmcall_channel_version_mismatch_params {
-	u8 chname[32];	/* Null terminated string giving name of channel
-				 * (IN) */
-	u8 item_name[32];	/* Null terminated string giving name of
-				 * mismatched item (IN) */
-	u32 line_no;		/* line# where invoked. (IN) */
-	u8 file_name[36];	/* source code where invoked - Null terminated
-				 * string (IN) */
-};
-
-#endif /* __IOMONINTF_H__ */
diff --git a/drivers/staging/unisys/visorbus/iovmcall_gnuc.h b/drivers/staging/unisys/visorbus/iovmcall_gnuc.h
new file mode 100644
index 0000000..57dd93e
--- /dev/null
+++ b/drivers/staging/unisys/visorbus/iovmcall_gnuc.h
@@ -0,0 +1,49 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+/* Linux GCC Version (32-bit and 64-bit) */
+static inline unsigned long
+__unisys_vmcall_gnuc(unsigned long tuple, unsigned long reg_ebx,
+		     unsigned long reg_ecx)
+{
+	unsigned long result = 0;
+	unsigned int cpuid_eax, cpuid_ebx, cpuid_ecx, cpuid_edx;
+
+	cpuid(0x00000001, &cpuid_eax, &cpuid_ebx, &cpuid_ecx, &cpuid_edx);
+	if (!(cpuid_ecx & 0x80000000))
+		return -1;
+
+	__asm__ __volatile__(".byte 0x00f, 0x001, 0x0c1" : "=a"(result) :
+		"a"(tuple), "b"(reg_ebx), "c"(reg_ecx));
+	return result;
+}
+
+static inline unsigned long
+__unisys_extended_vmcall_gnuc(unsigned long long tuple,
+			      unsigned long long reg_ebx,
+			      unsigned long long reg_ecx,
+			      unsigned long long reg_edx)
+{
+	unsigned long result = 0;
+	unsigned int cpuid_eax, cpuid_ebx, cpuid_ecx, cpuid_edx;
+
+	cpuid(0x00000001, &cpuid_eax, &cpuid_ebx, &cpuid_ecx, &cpuid_edx);
+	if (!(cpuid_ecx & 0x80000000))
+		return -1;
+
+	__asm__ __volatile__(".byte 0x00f, 0x001, 0x0c1" : "=a"(result) :
+		"a"(tuple), "b"(reg_ebx), "c"(reg_ecx), "d"(reg_edx));
+	return result;
+}
diff --git a/drivers/staging/unisys/visorbus/vbusdeviceinfo.h b/drivers/staging/unisys/visorbus/vbusdeviceinfo.h
new file mode 100644
index 0000000..9b6d3e6
--- /dev/null
+++ b/drivers/staging/unisys/visorbus/vbusdeviceinfo.h
@@ -0,0 +1,213 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+#ifndef __VBUSDEVICEINFO_H__
+#define __VBUSDEVICEINFO_H__
+
+#include <linux/types.h>
+
+#pragma pack(push, 1)		/* both GCC and VC now allow this pragma */
+
+/* An array of this struct is present in the channel area for each vbus.
+ * (See vbuschannel.h.)
+ * It is filled in by the client side to provide info about the device
+ * and driver from the client's perspective.
+ */
+struct ultra_vbus_deviceinfo {
+	u8 devtype[16];		/* short string identifying the device type */
+	u8 drvname[16];		/* driver .sys file name */
+	u8 infostrs[96];	/* sequence of tab-delimited id strings: */
+	/* <DRIVER_REV> <DRIVER_VERTAG> <DRIVER_COMPILETIME> */
+	u8 reserved[128];	/* pad size to 256 bytes */
+};
+
+#pragma pack(pop)
+
+/* Reads chars from the buffer at <src> for <srcmax> bytes, and writes to
+ * the buffer at <p>, which is <remain> bytes long, ensuring never to
+ * overflow the buffer at <p>, using the following rules:
+ * - printable characters are simply copied from the buffer at <src> to the
+ *   buffer at <p>
+ * - intervening streaks of non-printable characters in the buffer at <src>
+ *   are replaced with a single space in the buffer at <p>
+ * Note that we pay no attention to '\0'-termination.
+ * Returns the number of bytes written to <p>.
+ *
+ * Pass <p> == NULL and <remain> == 0 for this special behavior.  In this
+ * case, we simply return the number of bytes that WOULD HAVE been written
+ * to a buffer at <p>, had it been infinitely big.
+ */
+static inline int
+vbuschannel_sanitize_buffer(char *p, int remain, char *src, int srcmax)
+{
+	int chars = 0;
+	int nonprintable_streak = 0;
+
+	while (srcmax > 0) {
+		if ((*src >= ' ') && (*src < 0x7f)) {
+			if (nonprintable_streak) {
+				if (remain > 0) {
+					*p = ' ';
+					p++;
+					remain--;
+					chars++;
+				} else if (p == NULL) {
+					chars++;
+				}
+				nonprintable_streak = 0;
+			}
+			if (remain > 0) {
+				*p = *src;
+				p++;
+				remain--;
+				chars++;
+			} else if (p == NULL) {
+				chars++;
+			}
+		} else {
+			nonprintable_streak = 1;
+		}
+		src++;
+		srcmax--;
+	}
+	return chars;
+}
+
+#define VBUSCHANNEL_ADDACHAR(ch, p, remain, chars) \
+	do {					   \
+		if (remain <= 0)		   \
+			break;			   \
+		*p = ch;			   \
+		p++;  chars++;  remain--;	   \
+	} while (0)
+
+/* Converts the non-negative value at <num> to an ascii decimal string
+ * at <p>, writing at most <remain> bytes.  Note there is NO '\0' termination
+ * written to <p>.
+ *
+ * Returns the number of bytes written to <p>.
+ *
+ * Note that we create this function because we need to do this operation in
+ * an environment-independent way (since we are in a common header file).
+ */
+static inline int
+vbuschannel_itoa(char *p, int remain, int num)
+{
+	int digits = 0;
+	char s[32];
+	int i;
+
+	if (num == 0) {
+		/* '0' is a special case */
+		if (remain <= 0)
+			return 0;
+		*p = '0';
+		return 1;
+	}
+	/* form a backwards decimal ascii string in <s> */
+	while (num > 0) {
+		if (digits >= (int)sizeof(s))
+			return 0;
+		s[digits++] = (num % 10) + '0';
+		num = num / 10;
+	}
+	if (remain < digits) {
+		/* not enough room left at <p> to hold number, so fill with
+		 * '?' */
+		for (i = 0; i < remain; i++, p++)
+			*p = '?';
+		return remain;
+	}
+	/* plug in the decimal ascii string representing the number, by */
+	/* reversing the string we just built in <s> */
+	i = digits;
+	while (i > 0) {
+		i--;
+		*p = s[i];
+		p++;
+	}
+	return digits;
+}
+
+/* Reads <devInfo>, and converts its contents to a printable string at <p>,
+ * writing at most <remain> bytes.  Note there is NO '\0' termination
+ * written to <p>.
+ *
+ * Pass <devix> >= 0 if you want a device index presented.
+ *
+ * Returns the number of bytes written to <p>.
+ */
+static inline int
+vbuschannel_devinfo_to_string(struct ultra_vbus_deviceinfo *devinfo,
+			      char *p, int remain, int devix)
+{
+	char *psrc;
+	int nsrc, x, i, pad;
+	int chars = 0;
+
+	psrc = &devinfo->devtype[0];
+	nsrc = sizeof(devinfo->devtype);
+	if (vbuschannel_sanitize_buffer(NULL, 0, psrc, nsrc) <= 0)
+		return 0;
+
+	/* emit device index */
+	if (devix >= 0) {
+		VBUSCHANNEL_ADDACHAR('[', p, remain, chars);
+		x = vbuschannel_itoa(p, remain, devix);
+		p += x;
+		remain -= x;
+		chars += x;
+		VBUSCHANNEL_ADDACHAR(']', p, remain, chars);
+	} else {
+		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
+		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
+		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
+	}
+
+	/* emit device type */
+	x = vbuschannel_sanitize_buffer(p, remain, psrc, nsrc);
+	p += x;
+	remain -= x;
+	chars += x;
+	pad = 15 - x;		/* pad device type to be exactly 15 chars */
+	for (i = 0; i < pad; i++)
+		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
+	VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
+
+	/* emit driver name */
+	psrc = &devinfo->drvname[0];
+	nsrc = sizeof(devinfo->drvname);
+	x = vbuschannel_sanitize_buffer(p, remain, psrc, nsrc);
+	p += x;
+	remain -= x;
+	chars += x;
+	pad = 15 - x;		/* pad driver name to be exactly 15 chars */
+	for (i = 0; i < pad; i++)
+		VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
+	VBUSCHANNEL_ADDACHAR(' ', p, remain, chars);
+
+	/* emit strings */
+	psrc = &devinfo->infostrs[0];
+	nsrc = sizeof(devinfo->infostrs);
+	x = vbuschannel_sanitize_buffer(p, remain, psrc, nsrc);
+	p += x;
+	remain -= x;
+	chars += x;
+	VBUSCHANNEL_ADDACHAR('\n', p, remain, chars);
+
+	return chars;
+}
+
+#endif
diff --git a/drivers/staging/unisys/visorbus/vmcallinterface.h b/drivers/staging/unisys/visorbus/vmcallinterface.h
new file mode 100644
index 0000000..dc09caf
--- /dev/null
+++ b/drivers/staging/unisys/visorbus/vmcallinterface.h
@@ -0,0 +1,161 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+#ifndef __IOMONINTF_H__
+#define __IOMONINTF_H__
+
+/*
+* This file contains all structures needed to support the VMCALLs for IO
+* Virtualization.  The VMCALLs are provided by Monitor and used by IO code
+* running on IO Partitions.
+*/
+
+#ifdef __GNUC__
+#include "iovmcall_gnuc.h"
+#endif	/*  */
+#include "diagchannel.h"
+
+#ifdef VMCALL_IO_CONTROLVM_ADDR
+#undef VMCALL_IO_CONTROLVM_ADDR
+#endif	/*  */
+
+/* define subsystem number for AppOS, used in uislib driver  */
+#define MDS_APPOS 0x4000000000000000L	/* subsystem = 62 - AppOS */
+enum vmcall_monitor_interface_method_tuple { /* VMCALL identification tuples  */
+	    /* Note: when a new VMCALL is added:
+	     * - the 1st 2 hex digits correspond to one of the
+	     *   VMCALL_MONITOR_INTERFACE types and
+	     * - the next 2 hex digits are the nth relative instance of within a
+	     *   type
+	     * E.G. for VMCALL_VIRTPART_RECYCLE_PART,
+	     * - the 0x02 identifies it as a VMCALL_VIRTPART type and
+	     * - the 0x01 identifies it as the 1st instance of a VMCALL_VIRTPART
+	     *   type of VMCALL
+	     */
+
+	VMCALL_IO_CONTROLVM_ADDR = 0x0501,	/* used by all Guests, not just
+						 * IO */
+	VMCALL_IO_DIAG_ADDR = 0x0508,
+	VMCALL_IO_VISORSERIAL_ADDR = 0x0509,
+	VMCALL_QUERY_GUEST_VIRTUAL_TIME_OFFSET = 0x0708, /* Allow caller to
+							  * query virtual time
+							  * offset */
+	VMCALL_CHANNEL_VERSION_MISMATCH = 0x0709,
+	VMCALL_POST_CODE_LOGEVENT = 0x070B,	/* LOGEVENT Post Code (RDX) with
+						 * specified subsystem mask (RCX
+						 * - monitor_subsystems.h) and
+						 * severity (RDX) */
+	VMCALL_GENERIC_SURRENDER_QUANTUM_FOREVER = 0x0802, /* Yield the
+							    * remainder & all
+							    * future quantums of
+							    * the caller */
+	VMCALL_MEASUREMENT_DO_NOTHING = 0x0901,
+	VMCALL_UPDATE_PHYSICAL_TIME = 0x0a02	/* Allow
+						 * ULTRA_SERVICE_CAPABILITY_TIME
+						 * capable guest to make
+						 * VMCALL */
+};
+
+#define VMCALL_SUCCESS 0
+#define VMCALL_SUCCESSFUL(result)	(result == 0)
+
+#ifdef __GNUC__
+#define unisys_vmcall(tuple, reg_ebx, reg_ecx) \
+	__unisys_vmcall_gnuc(tuple, reg_ebx, reg_ecx)
+#define unisys_extended_vmcall(tuple, reg_ebx, reg_ecx, reg_edx) \
+	__unisys_extended_vmcall_gnuc(tuple, reg_ebx, reg_ecx, reg_edx)
+#define ISSUE_IO_VMCALL(method, param, result) \
+	(result = unisys_vmcall(method, (param) & 0xFFFFFFFF,	\
+				(param) >> 32))
+#define ISSUE_IO_EXTENDED_VMCALL(method, param1, param2, param3) \
+	unisys_extended_vmcall(method, param1, param2, param3)
+
+    /* The following uses VMCALL_POST_CODE_LOGEVENT interface but is currently
+     * not used much */
+#define ISSUE_IO_VMCALL_POSTCODE_SEVERITY(postcode, severity)		\
+	ISSUE_IO_EXTENDED_VMCALL(VMCALL_POST_CODE_LOGEVENT, severity,	\
+				 MDS_APPOS, postcode)
+#endif
+
+/* Structures for IO VMCALLs */
+
+/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
+/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
+#pragma pack(push, 1)
+struct phys_info {
+	u64 pi_pfn;
+	u16 pi_off;
+	u16 pi_len;
+};
+
+#pragma pack(pop)
+/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
+
+/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
+/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
+#pragma pack(push, 1)
+/* Parameters to VMCALL_IO_CONTROLVM_ADDR interface */
+struct vmcall_io_controlvm_addr_params {
+	    /* The Guest-relative physical address of the ControlVm channel.
+	    * This VMCall fills this in with the appropriate address. */
+	u64 address;	/* contents provided by this VMCALL (OUT) */
+	    /* the size of the ControlVm channel in bytes This VMCall fills this
+	    * in with the appropriate address. */
+	u32 channel_bytes;	/* contents provided by this VMCALL (OUT) */
+	u8 unused[4];		/* Unused Bytes in the 64-Bit Aligned Struct */
+};
+
+#pragma pack(pop)
+/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
+
+/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
+/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
+#pragma pack(push, 1)
+/* Parameters to VMCALL_IO_DIAG_ADDR interface */
+struct vmcall_io_diag_addr_params {
+	    /* The Guest-relative physical address of the diagnostic channel.
+	    * This VMCall fills this in with the appropriate address. */
+	u64 address;	/* contents provided by this VMCALL (OUT) */
+};
+
+#pragma pack(pop)
+/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
+
+/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
+/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
+#pragma pack(push, 1)
+/* Parameters to VMCALL_IO_VISORSERIAL_ADDR interface */
+struct vmcall_io_visorserial_addr_params {
+	    /* The Guest-relative physical address of the serial console
+	    * channel.  This VMCall fills this in with the appropriate
+	    * address. */
+	u64 address;	/* contents provided by this VMCALL (OUT) */
+};
+
+#pragma pack(pop)
+/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
+
+/* Parameters to VMCALL_CHANNEL_MISMATCH interface */
+struct vmcall_channel_version_mismatch_params {
+	u8 chname[32];	/* Null terminated string giving name of channel
+				 * (IN) */
+	u8 item_name[32];	/* Null terminated string giving name of
+				 * mismatched item (IN) */
+	u32 line_no;		/* line# where invoked. (IN) */
+	u8 file_name[36];	/* source code where invoked - Null terminated
+				 * string (IN) */
+};
+
+#endif /* __IOMONINTF_H__ */
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 09/44] staging: unisys: Move controlframework into controlvmchannel.h
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (7 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 08/44] staging: unisys: move hypervisor calls into visorbus Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 10/44] staging: unisys: Move channel.h to include. Controvlm to visorbus Benjamin Romer
                   ` (34 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Controlframework was only needed by controlvmchannel, move the
structures into that header file.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 .../include/channels/controlframework.h            | 62 ----------------------
 .../include/channels/controlvmchannel.h            | 32 ++++++++++-
 2 files changed, 31 insertions(+), 63 deletions(-)
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/controlframework.h

diff --git a/drivers/staging/unisys/common-spar/include/channels/controlframework.h b/drivers/staging/unisys/common-spar/include/channels/controlframework.h
deleted file mode 100644
index 33d9caf..0000000
--- a/drivers/staging/unisys/common-spar/include/channels/controlframework.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/*
- * Module Name:
- *  controlframework.h
- *
- * Abstract: This file defines common structures in the unmanaged
- *	     Ultravisor (mostly EFI) space.
- *
- */
-
-#ifndef _CONTROL_FRAMEWORK_H_
-#define _CONTROL_FRAMEWORK_H_
-
-#include <linux/types.h>
-#include "channel.h"
-
-struct spar_segment_state  {
-	u16 enabled:1;		/* Bit 0: May enter other states */
-	u16 active:1;		/* Bit 1: Assigned to active partition */
-	u16 alive:1;		/* Bit 2: Configure message sent to
-				 * service/server */
-	u16 revoked:1;		/* Bit 3: similar to partition state
-				 * ShuttingDown */
-	u16 allocated:1;	/* Bit 4: memory (device/port number)
-				 * has been selected by Command */
-	u16 known:1;		/* Bit 5: has been introduced to the
-				 * service/guest partition */
-	u16 ready:1;		/* Bit 6: service/Guest partition has
-				 * responded to introduction */
-	u16 operating:1;	/* Bit 7: resource is configured and
-				 * operating */
-	/* Note: don't use high bit unless we need to switch to ushort
-	 * which is non-compliant */
-};
-
-static const struct spar_segment_state segment_state_running = {
-	1, 1, 1, 0, 1, 1, 1, 1
-};
-
-static const struct spar_segment_state segment_state_paused = {
-	1, 1, 1, 0, 1, 1, 1, 0
-};
-
-static const struct spar_segment_state segment_state_standby = {
-	1, 1, 0, 0, 1, 1, 1, 0
-};
-
-#endif				/* _CONTROL_FRAMEWORK_H_ not defined */
diff --git a/drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h b/drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h
index f1c86fb..a50d9cf 100644
--- a/drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h
+++ b/drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h
@@ -18,7 +18,6 @@
 
 #include <linux/uuid.h>
 #include "channel.h"
-#include "controlframework.h"
 
 /* {2B3C2D10-7EF5-4ad8-B966-3448B7386B3D} */
 #define SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID	\
@@ -56,6 +55,37 @@
 /* Max num of messages stored during IOVM creation to be reused after crash */
 #define CONTROLVM_CRASHMSG_MAX		2
 
+struct spar_segment_state  {
+	u16 enabled:1;		/* Bit 0: May enter other states */
+	u16 active:1;		/* Bit 1: Assigned to active partition */
+	u16 alive:1;		/* Bit 2: Configure message sent to
+				 * service/server */
+	u16 revoked:1;		/* Bit 3: similar to partition state
+				 * ShuttingDown */
+	u16 allocated:1;	/* Bit 4: memory (device/port number)
+				 * has been selected by Command */
+	u16 known:1;		/* Bit 5: has been introduced to the
+				 * service/guest partition */
+	u16 ready:1;		/* Bit 6: service/Guest partition has
+				 * responded to introduction */
+	u16 operating:1;	/* Bit 7: resource is configured and
+				 * operating */
+	/* Note: don't use high bit unless we need to switch to ushort
+	 * which is non-compliant */
+};
+
+static const struct spar_segment_state segment_state_running = {
+	1, 1, 1, 0, 1, 1, 1, 1
+};
+
+static const struct spar_segment_state segment_state_paused = {
+	1, 1, 1, 0, 1, 1, 1, 0
+};
+
+static const struct spar_segment_state segment_state_standby = {
+	1, 1, 0, 0, 1, 1, 1, 0
+};
+
 /* Ids for commands that may appear in either queue of a ControlVm channel.
  *
  *  Commands that are initiated by the command partition (CP), by an IO or
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 10/44] staging: unisys: Move channel.h to include. Controvlm to visorbus
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (8 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 09/44] staging: unisys: Move controlframework into controlvmchannel.h Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 11/44] staging: unisys: vbuschannel belonsg " Benjamin Romer
                   ` (33 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Channel.h is used by all channels, it needs to be in include.
Controlvm Channel is only used by visorbus, it needs to just be there.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 .../unisys/common-spar/include/channels/channel.h  | 590 ---------------------
 .../common-spar/include/channels/channel_guid.h    |  61 ---
 .../include/channels/controlvmchannel.h            | 485 -----------------
 drivers/staging/unisys/include/channel.h           | 555 +++++++++++++++++++
 drivers/staging/unisys/include/channel_guid.h      |  61 +++
 drivers/staging/unisys/visorbus/controlvmchannel.h | 485 +++++++++++++++++
 6 files changed, 1101 insertions(+), 1136 deletions(-)
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/channel.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/channel_guid.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h
 create mode 100644 drivers/staging/unisys/include/channel.h
 create mode 100644 drivers/staging/unisys/include/channel_guid.h
 create mode 100644 drivers/staging/unisys/visorbus/controlvmchannel.h

diff --git a/drivers/staging/unisys/common-spar/include/channels/channel.h b/drivers/staging/unisys/common-spar/include/channels/channel.h
deleted file mode 100644
index 6fb6e5b..0000000
--- a/drivers/staging/unisys/common-spar/include/channels/channel.h
+++ /dev/null
@@ -1,590 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-#ifndef __CHANNEL_H__
-#define __CHANNEL_H__
-
-#include <linux/types.h>
-#include <linux/io.h>
-#include <linux/uuid.h>
-
-/*
-* Whenever this file is changed a corresponding change must be made in
-* the Console/ServicePart/visordiag_early/supervisor_channel.h file
-* which is needed for Linux kernel compiles. These two files must be
-* in sync.
-*/
-
-/* define the following to prevent include nesting in kernel header
- * files of similar abbreviated content
- */
-#define __SUPERVISOR_CHANNEL_H__
-
-#define SIGNATURE_16(A, B) ((A) | (B<<8))
-#define SIGNATURE_32(A, B, C, D) \
-	(SIGNATURE_16(A, B) | (SIGNATURE_16(C, D) << 16))
-#define SIGNATURE_64(A, B, C, D, E, F, G, H) \
-	(SIGNATURE_32(A, B, C, D) | ((u64)(SIGNATURE_32(E, F, G, H)) << 32))
-
-#ifndef lengthof
-#define lengthof(TYPE, MEMBER) (sizeof(((TYPE *)0)->MEMBER))
-#endif
-#ifndef COVERQ
-#define COVERQ(v, d)  (((v)+(d)-1) / (d))
-#endif
-#ifndef COVER
-#define COVER(v, d)   ((d)*COVERQ(v, d))
-#endif
-
-#define ULTRA_CHANNEL_PROTOCOL_SIGNATURE  SIGNATURE_32('E', 'C', 'N', 'L')
-
-enum channel_serverstate {
-	CHANNELSRV_UNINITIALIZED = 0,	/* channel is in an undefined state */
-	CHANNELSRV_READY = 1	/* channel has been initialized by server */
-};
-
-enum channel_clientstate {
-	CHANNELCLI_DETACHED = 0,
-	CHANNELCLI_DISABLED = 1,	/* client can see channel but is NOT
-					 * allowed to use it unless given TBD
-					 * explicit request (should actually be
-					 * < DETACHED) */
-	CHANNELCLI_ATTACHING = 2,	/* legacy EFI client request
-					 * for EFI server to attach */
-	CHANNELCLI_ATTACHED = 3,	/* idle, but client may want
-					 * to use channel any time */
-	CHANNELCLI_BUSY = 4,	/* client either wants to use or is
-				 * using channel */
-	CHANNELCLI_OWNED = 5	/* "no worries" state - client can
-				 * access channel anytime */
-};
-
-static inline const u8 *
-ULTRA_CHANNELCLI_STRING(u32 v)
-{
-	switch (v) {
-	case CHANNELCLI_DETACHED:
-		return (const u8 *)("DETACHED");
-	case CHANNELCLI_DISABLED:
-		return (const u8 *)("DISABLED");
-	case CHANNELCLI_ATTACHING:
-		return (const u8 *)("ATTACHING");
-	case CHANNELCLI_ATTACHED:
-		return (const u8 *)("ATTACHED");
-	case CHANNELCLI_BUSY:
-		return (const u8 *)("BUSY");
-	case CHANNELCLI_OWNED:
-		return (const u8 *)("OWNED");
-	default:
-		break;
-	}
-	return (const u8 *)("?");
-}
-
-#define SPAR_CHANNEL_SERVER_READY(ch) \
-	(readl(&(ch)->srv_state) == CHANNELSRV_READY)
-
-#define ULTRA_VALID_CHANNELCLI_TRANSITION(o, n)				\
-	(((((o) == CHANNELCLI_DETACHED) && ((n) == CHANNELCLI_DISABLED)) || \
-	  (((o) == CHANNELCLI_ATTACHING) && ((n) == CHANNELCLI_DISABLED)) || \
-	  (((o) == CHANNELCLI_ATTACHED) && ((n) == CHANNELCLI_DISABLED)) || \
-	  (((o) == CHANNELCLI_ATTACHING) && ((n) == CHANNELCLI_DETACHED)) || \
-	  (((o) == CHANNELCLI_ATTACHED) && ((n) == CHANNELCLI_DETACHED)) || \
-	  (((o) == CHANNELCLI_DETACHED) && ((n) == CHANNELCLI_ATTACHING)) || \
-	  (((o) == CHANNELCLI_ATTACHING) && ((n) == CHANNELCLI_ATTACHED)) || \
-	  (((o) == CHANNELCLI_DETACHED) && ((n) == CHANNELCLI_ATTACHED)) || \
-	  (((o) == CHANNELCLI_BUSY) && ((n) == CHANNELCLI_ATTACHED)) ||	\
-	  (((o) == CHANNELCLI_ATTACHED) && ((n) == CHANNELCLI_BUSY)) ||	\
-	  (((o) == CHANNELCLI_DETACHED) && ((n) == CHANNELCLI_OWNED)) || \
-	  (((o) == CHANNELCLI_DISABLED) && ((n) == CHANNELCLI_OWNED)) || \
-	  (((o) == CHANNELCLI_ATTACHING) && ((n) == CHANNELCLI_OWNED)) || \
-	  (((o) == CHANNELCLI_ATTACHED) && ((n) == CHANNELCLI_OWNED)) || \
-	  (((o) == CHANNELCLI_BUSY) && ((n) == CHANNELCLI_OWNED)) || (0)) \
-	 ? (1) : (0))
-
-#define SPAR_CHANNEL_CLIENT_CHK_TRANSITION(old, new, id, log,	\
-					    file, line)			\
-	do {								\
-		if (!ULTRA_VALID_CHANNELCLI_TRANSITION(old, new))	\
-			pr_info("%s Channel StateTransition INVALID! (%s) %s(%d)-->%s(%d) @%s:%d\n", \
-				id, "CliState<x>",		\
-				ULTRA_CHANNELCLI_STRING(old),	\
-				old,				\
-				ULTRA_CHANNELCLI_STRING(new),	\
-				new,				\
-				pathname_last_n_nodes((u8 *)file, 4), \
-				line);				\
-	} while (0)
-
-#define SPAR_CHANNEL_CLIENT_TRANSITION(ch, id, newstate, log)		\
-	do {								\
-		SPAR_CHANNEL_CLIENT_CHK_TRANSITION(			\
-			readl(&(((struct channel_header __iomem *)\
-				 (ch))->cli_state_os)),		\
-			newstate, id, log, __FILE__, __LINE__);		\
-			pr_info("%s Channel StateTransition (%s) %s(%d)-->%s(%d) @%s:%d\n", \
-				id, "CliStateOS",			\
-				ULTRA_CHANNELCLI_STRING( \
-				      readl(&((struct channel_header __iomem *)\
-					      (ch))->cli_state_os)),	\
-				readl(&((struct channel_header __iomem *)\
-				      (ch))->cli_state_os),		\
-				ULTRA_CHANNELCLI_STRING(newstate),	\
-				newstate,				\
-				pathname_last_n_nodes(__FILE__, 4), __LINE__); \
-		writel(newstate, &((struct channel_header __iomem *)\
-				   (ch))->cli_state_os);		\
-		mb(); /* required for channel synch */			\
-	} while (0)
-
-/* Values for ULTRA_CHANNEL_PROTOCOL.CliErrorBoot: */
-/* throttling invalid boot channel statetransition error due to client
- * disabled */
-#define ULTRA_CLIERRORBOOT_THROTTLEMSG_DISABLED    0x01
-
-/* throttling invalid boot channel statetransition error due to client
- * not attached */
-#define ULTRA_CLIERRORBOOT_THROTTLEMSG_NOTATTACHED 0x02
-
-/* throttling invalid boot channel statetransition error due to busy channel */
-#define ULTRA_CLIERRORBOOT_THROTTLEMSG_BUSY        0x04
-
-/* Values for ULTRA_CHANNEL_PROTOCOL.CliErrorOS: */
-/* throttling invalid guest OS channel statetransition error due to
- * client disabled */
-#define ULTRA_CLIERROROS_THROTTLEMSG_DISABLED      0x01
-
-/* throttling invalid guest OS channel statetransition error due to
- * client not attached */
-#define ULTRA_CLIERROROS_THROTTLEMSG_NOTATTACHED   0x02
-
-/* throttling invalid guest OS channel statetransition error due to
- * busy channel */
-#define ULTRA_CLIERROROS_THROTTLEMSG_BUSY          0x04
-
-/* Values for ULTRA_CHANNEL_PROTOCOL.Features: This define exists so
-* that windows guest can look at the FeatureFlags in the io channel,
-* and configure the windows driver to use interrupts or not based on
-* this setting.  This flag is set in uislib after the
-* ULTRA_VHBA_init_channel is called.  All feature bits for all
-* channels should be defined here.  The io channel feature bits are
-* defined right here */
-#define ULTRA_IO_DRIVER_ENABLES_INTS (0x1ULL << 1)
-#define ULTRA_IO_CHANNEL_IS_POLLING (0x1ULL << 3)
-#define ULTRA_IO_IOVM_IS_OK_WITH_DRIVER_DISABLING_INTS (0x1ULL << 4)
-#define ULTRA_IO_DRIVER_DISABLES_INTS (0x1ULL << 5)
-#define ULTRA_IO_DRIVER_SUPPORTS_ENHANCED_RCVBUF_CHECKING (0x1ULL << 6)
-
-#pragma pack(push, 1)		/* both GCC and VC now allow this pragma */
-/* Common Channel Header */
-struct channel_header {
-	u64 signature;		/* Signature */
-	u32 legacy_state;	/* DEPRECATED - being replaced by */
-	/* /              SrvState, CliStateBoot, and CliStateOS below */
-	u32 header_size;	/* sizeof(struct channel_header) */
-	u64 size;		/* Total size of this channel in bytes */
-	u64 features;		/* Flags to modify behavior */
-	uuid_le chtype;		/* Channel type: data, bus, control, etc. */
-	u64 partition_handle;	/* ID of guest partition */
-	u64 handle;		/* Device number of this channel in client */
-	u64 ch_space_offset;	/* Offset in bytes to channel specific area */
-	u32 version_id;		/* struct channel_header Version ID */
-	u32 partition_index;	/* Index of guest partition */
-	uuid_le zone_uuid;	/* Guid of Channel's zone */
-	u32 cli_str_offset;	/* offset from channel header to
-				 * nul-terminated ClientString (0 if
-				 * ClientString not present) */
-	u32 cli_state_boot;	/* CHANNEL_CLIENTSTATE of pre-boot
-				 * EFI client of this channel */
-	u32 cmd_state_cli;	/* CHANNEL_COMMANDSTATE (overloaded in
-				 * Windows drivers, see ServerStateUp,
-				 * ServerStateDown, etc) */
-	u32 cli_state_os;	/* CHANNEL_CLIENTSTATE of Guest OS
-				 * client of this channel */
-	u32 ch_characteristic;	/* CHANNEL_CHARACTERISTIC_<xxx> */
-	u32 cmd_state_srv;	/* CHANNEL_COMMANDSTATE (overloaded in
-				 * Windows drivers, see ServerStateUp,
-				 * ServerStateDown, etc) */
-	u32 srv_state;		/* CHANNEL_SERVERSTATE */
-	u8 cli_error_boot;	/* bits to indicate err states for
-				 * boot clients, so err messages can
-				 * be throttled */
-	u8 cli_error_os;	/* bits to indicate err states for OS
-				 * clients, so err messages can be
-				 * throttled */
-	u8 filler[1];		/* Pad out to 128 byte cacheline */
-	/* Please add all new single-byte values below here */
-	u8 recover_channel;
-};
-
-#define ULTRA_CHANNEL_ENABLE_INTS (0x1ULL << 0)
-
-/* Subheader for the Signal Type variation of the Common Channel */
-struct signal_queue_header {
-	/* 1st cache line */
-	u32 version;		/* SIGNAL_QUEUE_HEADER Version ID */
-	u32 chtype;		/* Queue type: storage, network */
-	u64 size;		/* Total size of this queue in bytes */
-	u64 sig_base_offset;	/* Offset to signal queue area */
-	u64 features;		/* Flags to modify behavior */
-	u64 num_sent;		/* Total # of signals placed in this queue */
-	u64 num_overflows;	/* Total # of inserts failed due to
-				 * full queue */
-	u32 signal_size;	/* Total size of a signal for this queue */
-	u32 max_slots;		/* Max # of slots in queue, 1 slot is
-				 * always empty */
-	u32 max_signals;	/* Max # of signals in queue
-				 * (MaxSignalSlots-1) */
-	u32 head;		/* Queue head signal # */
-	/* 2nd cache line */
-	u64 num_received;	/* Total # of signals removed from this queue */
-	u32 tail;		/* Queue tail signal # (on separate
-				 * cache line) */
-	u32 reserved1;		/* Reserved field */
-	u64 reserved2;		/* Reserved field */
-	u64 client_queue;
-	u64 num_irq_received;	/* Total # of Interrupts received.  This
-					 * is incremented by the ISR in the
-					 * guest windows driver */
-	u64 num_empty;		/* Number of times that visor_signal_remove
-				 * is called and returned Empty
-				 * Status. */
-	u32 errorflags;		/* Error bits set during SignalReinit
-				 * to denote trouble with client's
-				 * fields */
-	u8 filler[12];		/* Pad out to 64 byte cacheline */
-};
-
-#pragma pack(pop)
-
-#define spar_signal_init(chan, QHDRFLD, QDATAFLD, QDATATYPE, ver, typ)	\
-	do {								\
-		memset(&chan->QHDRFLD, 0, sizeof(chan->QHDRFLD));	\
-		chan->QHDRFLD.version = ver;				\
-		chan->QHDRFLD.chtype = typ;				\
-		chan->QHDRFLD.size = sizeof(chan->QDATAFLD);		\
-		chan->QHDRFLD.signal_size = sizeof(QDATATYPE);		\
-		chan->QHDRFLD.sig_base_offset = (u64)(chan->QDATAFLD)-	\
-			(u64)(&chan->QHDRFLD);				\
-		chan->QHDRFLD.max_slots =				\
-			sizeof(chan->QDATAFLD)/sizeof(QDATATYPE);	\
-		chan->QHDRFLD.max_signals = chan->QHDRFLD.max_slots-1;	\
-	} while (0)
-
-/* Generic function useful for validating any type of channel when it is
- * received by the client that will be accessing the channel.
- * Note that <logCtx> is only needed for callers in the EFI environment, and
- * is used to pass the EFI_DIAG_CAPTURE_PROTOCOL needed to log messages.
- */
-static inline int
-spar_check_channel_client(void __iomem *ch,
-			  uuid_le expected_uuid,
-			  char *chname,
-			  u64 expected_min_bytes,
-			  u32 expected_version,
-			  u64 expected_signature)
-{
-	if (uuid_le_cmp(expected_uuid, NULL_UUID_LE) != 0) {
-		uuid_le guid;
-
-		memcpy_fromio(&guid,
-			      &((struct channel_header __iomem *)(ch))->chtype,
-			      sizeof(guid));
-		/* caller wants us to verify type GUID */
-		if (uuid_le_cmp(guid, expected_uuid) != 0) {
-			pr_err("Channel mismatch on channel=%s(%pUL) field=type expected=%pUL actual=%pUL\n",
-			       chname, &expected_uuid,
-			       &expected_uuid, &guid);
-			return 0;
-		}
-	}
-	if (expected_min_bytes > 0) {	/* caller wants us to verify
-					 * channel size */
-		unsigned long long bytes =
-				readq(&((struct channel_header __iomem *)
-					(ch))->size);
-		if (bytes < expected_min_bytes) {
-			pr_err("Channel mismatch on channel=%s(%pUL) field=size expected=0x%-8.8Lx actual=0x%-8.8Lx\n",
-			       chname, &expected_uuid,
-			       (unsigned long long)expected_min_bytes, bytes);
-			return 0;
-		}
-	}
-	if (expected_version > 0) {	/* caller wants us to verify
-					 * channel version */
-		unsigned long ver = readl(&((struct channel_header __iomem *)
-				    (ch))->version_id);
-		if (ver != expected_version) {
-			pr_err("Channel mismatch on channel=%s(%pUL) field=version expected=0x%-8.8lx actual=0x%-8.8lx\n",
-			       chname, &expected_uuid,
-			       (unsigned long)expected_version, ver);
-			return 0;
-		}
-	}
-	if (expected_signature > 0) {	/* caller wants us to verify
-					 * channel signature */
-		unsigned long long sig =
-				readq(&((struct channel_header __iomem *)
-					(ch))->signature);
-		if (sig != expected_signature) {
-			pr_err("Channel mismatch on channel=%s(%pUL) field=signature expected=0x%-8.8llx actual=0x%-8.8llx\n",
-			       chname, &expected_uuid,
-			       expected_signature, sig);
-			return 0;
-		}
-	}
-	return 1;
-}
-
-/* Generic function useful for validating any type of channel when it is about
- * to be initialized by the server of the channel.
- * Note that <logCtx> is only needed for callers in the EFI environment, and
- * is used to pass the EFI_DIAG_CAPTURE_PROTOCOL needed to log messages.
- */
-static inline int spar_check_channel_server(uuid_le typeuuid, char *name,
-					    u64 expected_min_bytes,
-					    u64 actual_bytes)
-{
-	if (expected_min_bytes > 0)	/* caller wants us to verify
-					 * channel size */
-		if (actual_bytes < expected_min_bytes) {
-			pr_err("Channel mismatch on channel=%s(%pUL) field=size expected=0x%-8.8llx actual=0x%-8.8llx\n",
-			       name, &typeuuid, expected_min_bytes,
-			       actual_bytes);
-			return 0;
-		}
-	return 1;
-}
-
-/* Given a file pathname <s> (with '/' or '\' separating directory nodes),
- * returns a pointer to the beginning of a node within that pathname such
- * that the number of nodes from that pointer to the end of the string is
- * NOT more than <n>.  Note that if the pathname has less than <n> nodes
- * in it, the return pointer will be to the beginning of the string.
- */
-static inline u8 *
-pathname_last_n_nodes(u8 *s, unsigned int n)
-{
-	u8 *p = s;
-	unsigned int node_count = 0;
-
-	while (*p != '\0') {
-		if ((*p == '/') || (*p == '\\'))
-			node_count++;
-		p++;
-	}
-	if (node_count <= n)
-		return s;
-	while (n > 0) {
-		p--;
-		if (p == s)
-			break;	/* should never happen, unless someone
-				 * is changing the string while we are
-				 * looking at it!! */
-		if ((*p == '/') || (*p == '\\'))
-			n--;
-	}
-	return p + 1;
-}
-
-static inline int
-spar_channel_client_acquire_os(void __iomem *ch, u8 *id)
-{
-	struct channel_header __iomem *hdr = ch;
-
-	if (readl(&hdr->cli_state_os) == CHANNELCLI_DISABLED) {
-		if ((readb(&hdr->cli_error_os)
-		     & ULTRA_CLIERROROS_THROTTLEMSG_DISABLED) == 0) {
-			/* we are NOT throttling this message */
-			writeb(readb(&hdr->cli_error_os) |
-			       ULTRA_CLIERROROS_THROTTLEMSG_DISABLED,
-			       &hdr->cli_error_os);
-			/* throttle until acquire successful */
-
-			pr_info("%s Channel StateTransition INVALID! - acquire failed because OS client DISABLED\n",
-				id);
-		}
-		return 0;
-	}
-	if ((readl(&hdr->cli_state_os) != CHANNELCLI_OWNED) &&
-	    (readl(&hdr->cli_state_boot) == CHANNELCLI_DISABLED)) {
-		/* Our competitor is DISABLED, so we can transition to OWNED */
-		pr_info("%s Channel StateTransition (%s) %s(%d)-->%s(%d)\n",
-			id, "cli_state_os",
-			ULTRA_CHANNELCLI_STRING(readl(&hdr->cli_state_os)),
-			readl(&hdr->cli_state_os),
-			ULTRA_CHANNELCLI_STRING(CHANNELCLI_OWNED),
-			CHANNELCLI_OWNED);
-		writel(CHANNELCLI_OWNED, &hdr->cli_state_os);
-		mb(); /* required for channel synch */
-	}
-	if (readl(&hdr->cli_state_os) == CHANNELCLI_OWNED) {
-		if (readb(&hdr->cli_error_os) != 0) {
-			/* we are in an error msg throttling state;
-			 * come out of it */
-			pr_info("%s Channel OS client acquire now successful\n",
-				id);
-			writeb(0, &hdr->cli_error_os);
-		}
-		return 1;
-	}
-
-	/* We have to do it the "hard way".  We transition to BUSY,
-	* and can use the channel iff our competitor has not also
-	* transitioned to BUSY. */
-	if (readl(&hdr->cli_state_os) != CHANNELCLI_ATTACHED) {
-		if ((readb(&hdr->cli_error_os)
-		     & ULTRA_CLIERROROS_THROTTLEMSG_NOTATTACHED) == 0) {
-			/* we are NOT throttling this message */
-			writeb(readb(&hdr->cli_error_os) |
-			       ULTRA_CLIERROROS_THROTTLEMSG_NOTATTACHED,
-			       &hdr->cli_error_os);
-			/* throttle until acquire successful */
-			pr_info("%s Channel StateTransition INVALID! - acquire failed because OS client NOT ATTACHED (state=%s(%d))\n",
-				id, ULTRA_CHANNELCLI_STRING(
-						readl(&hdr->cli_state_os)),
-				readl(&hdr->cli_state_os));
-		}
-		return 0;
-	}
-	writel(CHANNELCLI_BUSY, &hdr->cli_state_os);
-	mb(); /* required for channel synch */
-	if (readl(&hdr->cli_state_boot) == CHANNELCLI_BUSY) {
-		if ((readb(&hdr->cli_error_os)
-		     & ULTRA_CLIERROROS_THROTTLEMSG_BUSY) == 0) {
-			/* we are NOT throttling this message */
-			writeb(readb(&hdr->cli_error_os) |
-			       ULTRA_CLIERROROS_THROTTLEMSG_BUSY,
-			       &hdr->cli_error_os);
-			/* throttle until acquire successful */
-			pr_info("%s Channel StateTransition failed - host OS acquire failed because boot BUSY\n",
-				id);
-		}
-		/* reset busy */
-		writel(CHANNELCLI_ATTACHED, &hdr->cli_state_os);
-		mb(); /* required for channel synch */
-		return 0;
-	}
-	if (readb(&hdr->cli_error_os) != 0) {
-		/* we are in an error msg throttling state; come out of it */
-		pr_info("%s Channel OS client acquire now successful\n", id);
-		writeb(0, &hdr->cli_error_os);
-	}
-	return 1;
-}
-
-static inline void
-spar_channel_client_release_os(void __iomem *ch, u8 *id)
-{
-	struct channel_header __iomem *hdr = ch;
-
-	if (readb(&hdr->cli_error_os) != 0) {
-		/* we are in an error msg throttling state; come out of it */
-		pr_info("%s Channel OS client error state cleared\n", id);
-		writeb(0, &hdr->cli_error_os);
-	}
-	if (readl(&hdr->cli_state_os) == CHANNELCLI_OWNED)
-		return;
-	if (readl(&hdr->cli_state_os) != CHANNELCLI_BUSY) {
-		pr_info("%s Channel StateTransition INVALID! - release failed because OS client NOT BUSY (state=%s(%d))\n",
-			id, ULTRA_CHANNELCLI_STRING(
-					readl(&hdr->cli_state_os)),
-			readl(&hdr->cli_state_os));
-		/* return; */
-	}
-	writel(CHANNELCLI_ATTACHED, &hdr->cli_state_os); /* release busy */
-}
-
-/*
-* Routine Description:
-* Tries to insert the prebuilt signal pointed to by pSignal into the nth
-* Queue of the Channel pointed to by pChannel
-*
-* Parameters:
-* pChannel: (IN) points to the IO Channel
-* Queue: (IN) nth Queue of the IO Channel
-* pSignal: (IN) pointer to the signal
-*
-* Assumptions:
-* - pChannel, Queue and pSignal are valid.
-* - If insertion fails due to a full queue, the caller will determine the
-* retry policy (e.g. wait & try again, report an error, etc.).
-*
-* Return value: 1 if the insertion succeeds, 0 if the queue was
-* full.
-*/
-
-unsigned char spar_signal_insert(struct channel_header __iomem *ch, u32 queue,
-				 void *sig);
-
-/*
-* Routine Description:
-* Removes one signal from Channel pChannel's nth Queue at the
-* time of the call and copies it into the memory pointed to by
-* pSignal.
-*
-* Parameters:
-* pChannel: (IN) points to the IO Channel
-* Queue: (IN) nth Queue of the IO Channel
-* pSignal: (IN) pointer to where the signals are to be copied
-*
-* Assumptions:
-* - pChannel and Queue are valid.
-* - pSignal points to a memory area large enough to hold queue's SignalSize
-*
-* Return value: 1 if the removal succeeds, 0 if the queue was
-* empty.
-*/
-
-unsigned char spar_signal_remove(struct channel_header __iomem *ch, u32 queue,
-				 void *sig);
-
-/*
-* Routine Description:
-* Removes all signals present in Channel pChannel's nth Queue at the
-* time of the call and copies them into the memory pointed to by
-* pSignal.  Returns the # of signals copied as the value of the routine.
-*
-* Parameters:
-* pChannel: (IN) points to the IO Channel
-* Queue: (IN) nth Queue of the IO Channel
-* pSignal: (IN) pointer to where the signals are to be copied
-*
-* Assumptions:
-* - pChannel and Queue are valid.
-* - pSignal points to a memory area large enough to hold Queue's MaxSignals
-* # of signals, each of which is Queue's SignalSize.
-*
-* Return value:
-* # of signals copied.
-*/
-unsigned int spar_signal_remove_all(struct channel_header *ch, u32 queue,
-				    void *sig);
-
-/*
-* Routine Description:
-* Determine whether a signal queue is empty.
-*
-* Parameters:
-* pChannel: (IN) points to the IO Channel
-* Queue: (IN) nth Queue of the IO Channel
-*
-* Return value:
-* 1 if the signal queue is empty, 0 otherwise.
-*/
-unsigned char spar_signalqueue_empty(struct channel_header __iomem *ch,
-				     u32 queue);
-
-#endif
diff --git a/drivers/staging/unisys/common-spar/include/channels/channel_guid.h b/drivers/staging/unisys/common-spar/include/channels/channel_guid.h
deleted file mode 100644
index 706363fc..0000000
--- a/drivers/staging/unisys/common-spar/include/channels/channel_guid.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/*
- * CHANNEL Guids
- */
-
-/* Used in IOChannel
- * {414815ed-c58c-11da-95a9-00e08161165f}
- */
-#define SPAR_VHBA_CHANNEL_PROTOCOL_UUID \
-		UUID_LE(0x414815ed, 0xc58c, 0x11da, \
-				0x95, 0xa9, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f)
-static const uuid_le spar_vhba_channel_protocol_uuid =
-	SPAR_VHBA_CHANNEL_PROTOCOL_UUID;
-
-/* Used in IOChannel
- * {8cd5994d-c58e-11da-95a9-00e08161165f}
- */
-#define SPAR_VNIC_CHANNEL_PROTOCOL_UUID \
-		UUID_LE(0x8cd5994d, 0xc58e, 0x11da, \
-				0x95, 0xa9, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f)
-static const uuid_le spar_vnic_channel_protocol_uuid =
-	SPAR_VNIC_CHANNEL_PROTOCOL_UUID;
-
-/* Used in IOChannel
- * {72120008-4AAB-11DC-8530-444553544200}
- */
-#define SPAR_SIOVM_UUID \
-		UUID_LE(0x72120008, 0x4AAB, 0x11DC, \
-				0x85, 0x30, 0x44, 0x45, 0x53, 0x54, 0x42, 0x00)
-static const uuid_le spar_siovm_uuid = SPAR_SIOVM_UUID;
-
-/* Used in visornoop/visornoop_main.c
- * {5b52c5ac-e5f5-4d42-8dff-429eaecd221f}
- */
-#define SPAR_CONTROLDIRECTOR_CHANNEL_PROTOCOL_UUID  \
-		UUID_LE(0x5b52c5ac, 0xe5f5, 0x4d42, \
-				0x8d, 0xff, 0x42, 0x9e, 0xae, 0xcd, 0x22, 0x1f)
-
-static const uuid_le spar_controldirector_channel_protocol_uuid =
-	SPAR_CONTROLDIRECTOR_CHANNEL_PROTOCOL_UUID;
-
-/* Used in visorchipset/visorchipset_main.c
- * {B4E79625-AEDE-4EAA-9E11-D3EDDCD4504C}
- */
-#define SPAR_DIAG_POOL_CHANNEL_PROTOCOL_UUID				\
-		UUID_LE(0xb4e79625, 0xaede, 0x4eaa, \
-				0x9e, 0x11, 0xd3, 0xed, 0xdc, 0xd4, 0x50, 0x4c)
diff --git a/drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h b/drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h
deleted file mode 100644
index a50d9cf..0000000
--- a/drivers/staging/unisys/common-spar/include/channels/controlvmchannel.h
+++ /dev/null
@@ -1,485 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-#ifndef __CONTROLVMCHANNEL_H__
-#define __CONTROLVMCHANNEL_H__
-
-#include <linux/uuid.h>
-#include "channel.h"
-
-/* {2B3C2D10-7EF5-4ad8-B966-3448B7386B3D} */
-#define SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID	\
-		UUID_LE(0x2b3c2d10, 0x7ef5, 0x4ad8, \
-			0xb9, 0x66, 0x34, 0x48, 0xb7, 0x38, 0x6b, 0x3d)
-
-#define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE \
-	ULTRA_CHANNEL_PROTOCOL_SIGNATURE
-#define CONTROLVM_MESSAGE_MAX 64
-
-/* Must increment this whenever you insert or delete fields within
- * this channel struct.  Also increment whenever you change the meaning
- * of fields within this channel struct so as to break pre-existing
- * software.  Note that you can usually add fields to the END of the
- * channel struct withOUT needing to increment this.
- */
-#define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID  1
-
-#define SPAR_CONTROLVM_CHANNEL_OK_CLIENT(ch)           \
-	spar_check_channel_client(ch, \
-		SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID, \
-		"controlvm", \
-		sizeof(struct spar_controlvm_channel_protocol), \
-		ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID, \
-		ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE)
-
-#define MAX_SERIAL_NUM	32
-
-/* Defines for various channel queues */
-#define CONTROLVM_QUEUE_REQUEST		0
-#define CONTROLVM_QUEUE_RESPONSE	1
-#define CONTROLVM_QUEUE_EVENT		2
-#define CONTROLVM_QUEUE_ACK		3
-
-/* Max num of messages stored during IOVM creation to be reused after crash */
-#define CONTROLVM_CRASHMSG_MAX		2
-
-struct spar_segment_state  {
-	u16 enabled:1;		/* Bit 0: May enter other states */
-	u16 active:1;		/* Bit 1: Assigned to active partition */
-	u16 alive:1;		/* Bit 2: Configure message sent to
-				 * service/server */
-	u16 revoked:1;		/* Bit 3: similar to partition state
-				 * ShuttingDown */
-	u16 allocated:1;	/* Bit 4: memory (device/port number)
-				 * has been selected by Command */
-	u16 known:1;		/* Bit 5: has been introduced to the
-				 * service/guest partition */
-	u16 ready:1;		/* Bit 6: service/Guest partition has
-				 * responded to introduction */
-	u16 operating:1;	/* Bit 7: resource is configured and
-				 * operating */
-	/* Note: don't use high bit unless we need to switch to ushort
-	 * which is non-compliant */
-};
-
-static const struct spar_segment_state segment_state_running = {
-	1, 1, 1, 0, 1, 1, 1, 1
-};
-
-static const struct spar_segment_state segment_state_paused = {
-	1, 1, 1, 0, 1, 1, 1, 0
-};
-
-static const struct spar_segment_state segment_state_standby = {
-	1, 1, 0, 0, 1, 1, 1, 0
-};
-
-/* Ids for commands that may appear in either queue of a ControlVm channel.
- *
- *  Commands that are initiated by the command partition (CP), by an IO or
- *  console service partition (SP), or by a guest partition (GP)are:
- *  - issued on the RequestQueue queue (q #0) in the ControlVm channel
- *  - responded to on the ResponseQueue queue (q #1) in the ControlVm channel
- *
- *  Events that are initiated by an IO or console service partition (SP) or
- *  by a guest partition (GP) are:
- *  - issued on the EventQueue queue (q #2) in the ControlVm channel
- *  - responded to on the EventAckQueue queue (q #3) in the ControlVm channel
- */
-enum controlvm_id {
-	CONTROLVM_INVALID = 0,
-	/* SWITCH commands required Parameter: SwitchNumber */
-	/* BUS commands required Parameter: BusNumber */
-	CONTROLVM_BUS_CREATE = 0x101,			/* CP --> SP, GP */
-	CONTROLVM_BUS_DESTROY = 0x102,			/* CP --> SP, GP */
-	CONTROLVM_BUS_CONFIGURE = 0x104,		/* CP --> SP */
-	CONTROLVM_BUS_CHANGESTATE = 0x105,		/* CP --> SP, GP */
-	CONTROLVM_BUS_CHANGESTATE_EVENT = 0x106,	/* SP, GP --> CP */
-/* DEVICE commands required Parameter: BusNumber, DeviceNumber */
-
-	CONTROLVM_DEVICE_CREATE = 0x201,		/* CP --> SP, GP */
-	CONTROLVM_DEVICE_DESTROY = 0x202,		/* CP --> SP, GP */
-	CONTROLVM_DEVICE_CONFIGURE = 0x203,		/* CP --> SP */
-	CONTROLVM_DEVICE_CHANGESTATE = 0x204,		/* CP --> SP, GP */
-	CONTROLVM_DEVICE_CHANGESTATE_EVENT = 0x205,	/* SP, GP --> CP */
-	CONTROLVM_DEVICE_RECONFIGURE = 0x206,		/* CP --> Boot */
-/* CHIPSET commands */
-	CONTROLVM_CHIPSET_INIT = 0x301,			/* CP --> SP, GP */
-	CONTROLVM_CHIPSET_STOP = 0x302,			/* CP --> SP, GP */
-	CONTROLVM_CHIPSET_READY = 0x304,		/* CP --> SP */
-	CONTROLVM_CHIPSET_SELFTEST = 0x305,		/* CP --> SP */
-
-};
-
-struct irq_info {
-	u64 reserved1;
-
-	 /* specifies interrupt handle. It is used to retrieve the
-	  *   corresponding interrupt pin from Monitor; and the
-	  *   interrupt pin is used to connect to the corresponding
-	  *   interrupt.  Used by IOPart-GP only.
-	  */
-	u64 recv_irq_handle;
-
-	 /* specifies interrupt vector. It, interrupt pin, and shared are
-	  *   used to connect to the corresponding interrupt.  Used by
-	  *   IOPart-GP only.
-	  */
-	u32 recv_irq_vector;
-
-    /* specifies if the recvInterrupt is shared.  It, interrupt pin
-     * and vector are used to connect to 0 = not shared; 1 = shared.
-     * the corresponding interrupt.  Used by IOPart-GP only.
-     */
-	u8 recv_irq_shared;
-	u8 reserved[3];	/* Natural alignment purposes */
-};
-
-struct pci_id {
-	u16 domain;
-	u8 bus;
-	u8 slot;
-	u8 func;
-	u8 reserved[3];	/* Natural alignment purposes */
-};
-
-struct efi_spar_indication  {
-	u64 boot_to_fw_ui:1;		/* Bit 0: Stop in uefi ui */
-	u64 clear_nvram:1;		/* Bit 1: Clear NVRAM */
-	u64 clear_cmos:1;		/* Bit 2: Clear CMOS */
-	u64 boot_to_tool:1;		/* Bit 3: Run install tool */
-	/* remaining bits are available */
-};
-
-enum ultra_chipset_feature {
-	ULTRA_CHIPSET_FEATURE_REPLY = 0x00000001,
-	ULTRA_CHIPSET_FEATURE_PARA_HOTPLUG = 0x00000002,
-};
-
-/* This is the common structure that is at the beginning of every
- *  ControlVm message (both commands and responses) in any ControlVm
- *  queue.  Commands are easily distinguished from responses by
- *  looking at the flags.response field.
- */
-struct controlvm_message_header  {
-	u32 id;		/* See CONTROLVM_ID. */
-	/* For requests, indicates the message type. */
-	/* For responses, indicates the type of message we are responding to. */
-
-	u32 message_size;	/* Includes size of this struct + size
-				 * of message */
-	u32 segment_index;	/* Index of segment containing Vm
-				 * message/information */
-	u32 completion_status;	/* Error status code or result of
-				 * message completion */
-	struct  {
-		u32 failed:1;		   /* =1 in a response to * signify
-					    * failure */
-		u32 response_expected:1;   /* =1 in all messages that expect a
-					    * response (Control ignores this
-					    * bit) */
-		u32 server:1;		   /* =1 in all bus & device-related
-					    * messages where the message
-					    * receiver is to act as the bus or
-					    * device server */
-		u32 test_message:1;	   /* =1 for testing use only
-					    * (Control and Command ignore this
-					    * bit) */
-		u32 partial_completion:1;  /* =1 if there are forthcoming
-					    * responses/acks associated
-					    * with this message */
-		u32 preserve:1;		   /* =1 this is to let us know to
-					    * preserve channel contents
-					    * (for running guests)*/
-		u32 writer_in_diag:1;	   /* =1 the DiagWriter is active in the
-					    * Diagnostic Partition*/
-	} flags;
-	u32 reserved;		/* Natural alignment */
-	u64 message_handle;	/* Identifies the particular message instance,
-				 * and is used to match particular */
-	/* request instances with the corresponding response instance. */
-	u64 payload_vm_offset;	/* Offset of payload area from start of this
-				 * instance of ControlVm segment */
-	u32 payload_max_bytes;	/* Maximum bytes allocated in payload
-				 * area of ControlVm segment */
-	u32 payload_bytes;	/* Actual number of bytes of payload
-				 * area to copy between IO/Command; */
-	/* if non-zero, there is a payload to copy. */
-};
-
-struct controlvm_packet_device_create  {
-	u32 bus_no;		/* bus # (0..n-1) from the msg receiver's end */
-	u32 dev_no;		/* bus-relative (0..n-1) device number */
-	u64 channel_addr;	/* Guest physical address of the channel, which
-				 * can be dereferenced by the receiver of this
-				 * ControlVm command */
-	u64 channel_bytes;	/* specifies size of the channel in bytes */
-	uuid_le data_type_uuid;	/* specifies format of data in channel */
-	uuid_le dev_inst_uuid;	/* instance guid for the device */
-	struct irq_info intr;	/* specifies interrupt information */
-};	/* for CONTROLVM_DEVICE_CREATE */
-
-struct controlvm_packet_device_configure  {
-	u32 bus_no;	      /* bus # (0..n-1) from the msg
-			       * receiver's perspective */
-	/* Control uses header SegmentIndex field to access bus number... */
-	u32 dev_no;	      /* bus-relative (0..n-1) device number */
-} ;	/* for CONTROLVM_DEVICE_CONFIGURE */
-
-struct controlvm_message_device_create {
-	struct controlvm_message_header header;
-	struct controlvm_packet_device_create packet;
-};	/* total 128 bytes */
-
-struct controlvm_message_device_configure  {
-	struct controlvm_message_header header;
-	struct controlvm_packet_device_configure packet;
-};	/* total 56 bytes */
-
-/* This is the format for a message in any ControlVm queue. */
-struct controlvm_message_packet  {
-	union  {
-		struct  {
-			u32 bus_no;	/* bus # (0..n-1) from the msg
-					 * receiver's perspective */
-			u32 dev_count;	/* indicates the max number of
-					 * devices on this bus */
-			u64 channel_addr;	/* Guest physical address of
-						 * the channel, which can be
-						 * dereferenced by the receiver
-						 * of this ControlVm command */
-			u64 channel_bytes;	/* size of the channel */
-			uuid_le bus_data_type_uuid;	/* indicates format of
-							 * data in bus channel*/
-			uuid_le bus_inst_uuid;	/* instance uuid for the bus */
-		} create_bus;	/* for CONTROLVM_BUS_CREATE */
-		struct  {
-			u32 bus_no;	/* bus # (0..n-1) from the msg
-					 * receiver's perspective */
-			u32 reserved;	/* Natural alignment purposes */
-		} destroy_bus;	/* for CONTROLVM_BUS_DESTROY */
-		struct  {
-			u32 bus_no;	/* bus # (0..n-1) from the receiver's
-					 * perspective */
-			u32 reserved1;	/* for alignment purposes */
-			u64 guest_handle;	/* This is used to convert
-						 * guest physical address to
-						 * physical address */
-			u64 recv_bus_irq_handle;
-				/* specifies interrupt info. It is used by SP
-				 * to register to receive interrupts from the
-				 * CP. This interrupt is used for bus level
-				 * notifications.  The corresponding
-				 * sendBusInterruptHandle is kept in CP. */
-		} configure_bus;	/* for CONTROLVM_BUS_CONFIGURE */
-		/* for CONTROLVM_DEVICE_CREATE */
-		struct controlvm_packet_device_create create_device;
-		struct  {
-			u32 bus_no;	/* bus # (0..n-1) from the msg
-					 * receiver's perspective */
-			u32 dev_no;	/* bus-relative (0..n-1) device # */
-		} destroy_device;	/* for CONTROLVM_DEVICE_DESTROY */
-		/* for CONTROLVM_DEVICE_CONFIGURE */
-		struct controlvm_packet_device_configure configure_device;
-		struct  {
-			u32 bus_no;	/* bus # (0..n-1) from the msg
-					 * receiver's perspective */
-			u32 dev_no;	/* bus-relative (0..n-1) device # */
-		} reconfigure_device;	/* for CONTROLVM_DEVICE_RECONFIGURE */
-		struct  {
-			u32 bus_no;
-			struct spar_segment_state state;
-			u8 reserved[2];	/* Natural alignment purposes */
-		} bus_change_state;	/* for CONTROLVM_BUS_CHANGESTATE */
-		struct  {
-			u32 bus_no;
-			u32 dev_no;
-			struct spar_segment_state state;
-			struct  {
-				u32 phys_device:1;	/* =1 if message is for
-							 * a physical device */
-			} flags;
-			u8 reserved[2];	/* Natural alignment purposes */
-		} device_change_state;	/* for CONTROLVM_DEVICE_CHANGESTATE */
-		struct  {
-			u32 bus_no;
-			u32 dev_no;
-			struct spar_segment_state state;
-			u8 reserved[6];	/* Natural alignment purposes */
-		} device_change_state_event;
-			/* for CONTROLVM_DEVICE_CHANGESTATE_EVENT */
-		struct  {
-			u32 bus_count;	/* indicates the max number of busses */
-			u32 switch_count; /* indicates the max number of
-					   * switches if a service partition */
-			enum ultra_chipset_feature features;
-			u32 platform_number;	/* Platform Number */
-		} init_chipset;	/* for CONTROLVM_CHIPSET_INIT */
-		struct  {
-			u32 options;	/* reserved */
-			u32 test;	/* bit 0 set to run embedded selftest */
-		} chipset_selftest;	/* for CONTROLVM_CHIPSET_SELFTEST */
-		u64 addr;	/* a physical address of something, that can be
-				 * dereferenced by the receiver of this
-				 * ControlVm command (depends on command id) */
-		u64 handle;	/* a handle of something (depends on command
-				 * id) */
-	};
-};
-
-/* All messages in any ControlVm queue have this layout. */
-struct controlvm_message {
-	struct controlvm_message_header hdr;
-	struct controlvm_message_packet cmd;
-};
-
-struct spar_controlvm_channel_protocol {
-	struct channel_header header;
-	u64 gp_controlvm;	/* guest phys addr of this channel */
-	u64 gp_partition_tables;/* guest phys addr of partition tables */
-	u64 gp_diag_guest;	/* guest phys addr of diagnostic channel */
-	u64 gp_boot_romdisk;/* guest phys addr of (read* only) Boot ROM disk */
-	u64 gp_boot_ramdisk;/* guest phys addr of writable Boot RAM disk */
-	u64 gp_acpi_table;	/* guest phys addr of acpi table */
-	u64 gp_control_channel;/* guest phys addr of control channel */
-	u64 gp_diag_romdisk;/* guest phys addr of diagnostic ROM disk */
-	u64 gp_nvram;	/* guest phys addr of NVRAM channel */
-	u64 request_payload_offset;	/* Offset to request payload area */
-	u64 event_payload_offset;	/* Offset to event payload area */
-	u32 request_payload_bytes;	/* Bytes available in request payload
-					 * area */
-	u32 event_payload_bytes;/* Bytes available in event payload area */
-	u32 control_channel_bytes;
-	u32 nvram_channel_bytes;	/* Bytes in PartitionNvram segment */
-	u32 message_bytes;		/* sizeof(CONTROLVM_MESSAGE) */
-	u32 message_count;		/* CONTROLVM_MESSAGE_MAX */
-	u64 gp_smbios_table;		/* guest phys addr of SMBIOS tables */
-	u64 gp_physical_smbios_table;	/* guest phys addr of SMBIOS table  */
-	/* ULTRA_MAX_GUESTS_PER_SERVICE */
-	char gp_reserved[2688];
-
-	/* guest physical address of EFI firmware image base  */
-	u64 virtual_guest_firmware_image_base;
-
-	/* guest physical address of EFI firmware entry point  */
-	u64 virtual_guest_firmware_entry_point;
-
-	/* guest EFI firmware image size  */
-	u64 virtual_guest_firmware_image_size;
-
-	/* GPA = 1MB where EFI firmware image is copied to  */
-	u64 virtual_guest_firmware_boot_base;
-	u64 virtual_guest_image_base;
-	u64 virtual_guest_image_size;
-	u64 prototype_control_channel_offset;
-	u64 virtual_guest_partition_handle;
-
-	u16 restore_action;	/* Restore Action field to restore the guest
-				 * partition */
-	u16 dump_action;	/* For Windows guests it shows if the visordisk
-				 * is running in dump mode */
-	u16 nvram_fail_count;
-	u16 saved_crash_message_count;	/* = CONTROLVM_CRASHMSG_MAX */
-	u32 saved_crash_message_offset;	/* Offset to request payload area needed
-					 * for crash dump */
-	u32 installation_error;	/* Type of error encountered during
-				 * installation */
-	u32 installation_text_id;	/* Id of string to display */
-	u16 installation_remaining_steps;/* Number of remaining installation
-					  * steps (for progress bars) */
-	u8 tool_action;		/* ULTRA_TOOL_ACTIONS Installation Action
-				 * field */
-	u8 reserved;		/* alignment */
-	struct efi_spar_indication efi_spar_ind;
-	struct efi_spar_indication efi_spar_ind_supported;
-	u32 sp_reserved;
-	u8 reserved2[28];	/* Force signals to begin on 128-byte cache
-				 * line */
-	struct signal_queue_header request_queue;/* Service or guest partition
-						  * uses this queue to send
-						  * requests to Control */
-	struct signal_queue_header response_queue;/* Control uses this queue to
-						   * respond to service or guest
-						   * partition requests */
-	struct signal_queue_header event_queue;	/* Control uses this queue to
-						 * send events to service or
-						 * guest partition */
-	struct signal_queue_header event_ack_queue;/* Service or guest partition
-						    * uses this queue to ack
-						    * Control events */
-
-	 /* Request fixed-size message pool - does not include payload */
-	 struct controlvm_message request_msg[CONTROLVM_MESSAGE_MAX];
-
-	 /* Response fixed-size message pool - does not include payload */
-	 struct controlvm_message response_msg[CONTROLVM_MESSAGE_MAX];
-
-	 /* Event fixed-size message pool - does not include payload */
-	 struct controlvm_message event_msg[CONTROLVM_MESSAGE_MAX];
-
-	 /* Ack fixed-size message pool - does not include payload */
-	 struct controlvm_message event_ack_msg[CONTROLVM_MESSAGE_MAX];
-
-	 /* Message stored during IOVM creation to be reused after crash */
-	 struct controlvm_message saved_crash_msg[CONTROLVM_CRASHMSG_MAX];
-};
-
-/* Offsets for VM channel attributes */
-#define VM_CH_REQ_QUEUE_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, request_queue)
-#define VM_CH_RESP_QUEUE_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, response_queue)
-#define VM_CH_EVENT_QUEUE_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, event_queue)
-#define VM_CH_ACK_QUEUE_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, event_ack_queue)
-#define VM_CH_REQ_MSG_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, request_msg)
-#define VM_CH_RESP_MSG_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, response_msg)
-#define VM_CH_EVENT_MSG_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, event_msg)
-#define VM_CH_ACK_MSG_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, event_ack_msg)
-#define VM_CH_CRASH_MSG_OFFSET \
-	offsetof(struct spar_controlvm_channel_protocol, saved_crash_msg)
-
-/* The following header will be located at the beginning of PayloadVmOffset for
- * various ControlVm commands. The receiver of a ControlVm command with a
- * PayloadVmOffset will dereference this address and then use connection_offset,
- * initiator_offset, and target_offset to get the location of UTF-8 formatted
- * strings that can be parsed to obtain command-specific information. The value
- * of total_length should equal PayloadBytes. The format of the strings at
- * PayloadVmOffset will take different forms depending on the message.
- */
-struct spar_controlvm_parameters_header {
-	u32 total_length;
-	u32 header_length;
-	u32 connection_offset;
-	u32 connection_length;
-	u32 initiator_offset;
-	u32 initiator_length;
-	u32 target_offset;
-	u32 target_length;
-	u32 client_offset;
-	u32 client_length;
-	u32 name_offset;
-	u32 name_length;
-	uuid_le id;
-	u32 revision;
-	u32 reserved;		/* Natural alignment */
-};
-
-#endif				/* __CONTROLVMCHANNEL_H__ */
diff --git a/drivers/staging/unisys/include/channel.h b/drivers/staging/unisys/include/channel.h
new file mode 100644
index 0000000..da0b538
--- /dev/null
+++ b/drivers/staging/unisys/include/channel.h
@@ -0,0 +1,555 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+#ifndef __CHANNEL_H__
+#define __CHANNEL_H__
+
+#include <linux/types.h>
+#include <linux/io.h>
+#include <linux/uuid.h>
+
+/*
+* Whenever this file is changed a corresponding change must be made in
+* the Console/ServicePart/visordiag_early/supervisor_channel.h file
+* which is needed for Linux kernel compiles. These two files must be
+* in sync.
+*/
+
+/* define the following to prevent include nesting in kernel header
+ * files of similar abbreviated content
+ */
+#define __SUPERVISOR_CHANNEL_H__
+
+#define SIGNATURE_16(A, B) ((A) | (B<<8))
+#define SIGNATURE_32(A, B, C, D) \
+	(SIGNATURE_16(A, B) | (SIGNATURE_16(C, D) << 16))
+#define SIGNATURE_64(A, B, C, D, E, F, G, H) \
+	(SIGNATURE_32(A, B, C, D) | ((u64)(SIGNATURE_32(E, F, G, H)) << 32))
+
+#ifndef lengthof
+#define lengthof(TYPE, MEMBER) (sizeof(((TYPE *)0)->MEMBER))
+#endif
+#ifndef COVERQ
+#define COVERQ(v, d)  (((v)+(d)-1) / (d))
+#endif
+#ifndef COVER
+#define COVER(v, d)   ((d)*COVERQ(v, d))
+#endif
+
+#define ULTRA_CHANNEL_PROTOCOL_SIGNATURE  SIGNATURE_32('E', 'C', 'N', 'L')
+
+enum channel_serverstate {
+	CHANNELSRV_UNINITIALIZED = 0,	/* channel is in an undefined state */
+	CHANNELSRV_READY = 1	/* channel has been initialized by server */
+};
+
+enum channel_clientstate {
+	CHANNELCLI_DETACHED = 0,
+	CHANNELCLI_DISABLED = 1,	/* client can see channel but is NOT
+					 * allowed to use it unless given TBD
+					 * explicit request (should actually be
+					 * < DETACHED) */
+	CHANNELCLI_ATTACHING = 2,	/* legacy EFI client request
+					 * for EFI server to attach */
+	CHANNELCLI_ATTACHED = 3,	/* idle, but client may want
+					 * to use channel any time */
+	CHANNELCLI_BUSY = 4,	/* client either wants to use or is
+				 * using channel */
+	CHANNELCLI_OWNED = 5	/* "no worries" state - client can
+				 * access channel anytime */
+};
+
+static inline const u8 *
+ULTRA_CHANNELCLI_STRING(u32 v)
+{
+	switch (v) {
+	case CHANNELCLI_DETACHED:
+		return (const u8 *)("DETACHED");
+	case CHANNELCLI_DISABLED:
+		return (const u8 *)("DISABLED");
+	case CHANNELCLI_ATTACHING:
+		return (const u8 *)("ATTACHING");
+	case CHANNELCLI_ATTACHED:
+		return (const u8 *)("ATTACHED");
+	case CHANNELCLI_BUSY:
+		return (const u8 *)("BUSY");
+	case CHANNELCLI_OWNED:
+		return (const u8 *)("OWNED");
+	default:
+		break;
+	}
+	return (const u8 *)("?");
+}
+
+#define SPAR_CHANNEL_SERVER_READY(ch) \
+	(readl(&(ch)->srv_state) == CHANNELSRV_READY)
+
+#define ULTRA_VALID_CHANNELCLI_TRANSITION(o, n)				\
+	(((((o) == CHANNELCLI_DETACHED) && ((n) == CHANNELCLI_DISABLED)) || \
+	  (((o) == CHANNELCLI_ATTACHING) && ((n) == CHANNELCLI_DISABLED)) || \
+	  (((o) == CHANNELCLI_ATTACHED) && ((n) == CHANNELCLI_DISABLED)) || \
+	  (((o) == CHANNELCLI_ATTACHING) && ((n) == CHANNELCLI_DETACHED)) || \
+	  (((o) == CHANNELCLI_ATTACHED) && ((n) == CHANNELCLI_DETACHED)) || \
+	  (((o) == CHANNELCLI_DETACHED) && ((n) == CHANNELCLI_ATTACHING)) || \
+	  (((o) == CHANNELCLI_ATTACHING) && ((n) == CHANNELCLI_ATTACHED)) || \
+	  (((o) == CHANNELCLI_DETACHED) && ((n) == CHANNELCLI_ATTACHED)) || \
+	  (((o) == CHANNELCLI_BUSY) && ((n) == CHANNELCLI_ATTACHED)) ||	\
+	  (((o) == CHANNELCLI_ATTACHED) && ((n) == CHANNELCLI_BUSY)) ||	\
+	  (((o) == CHANNELCLI_DETACHED) && ((n) == CHANNELCLI_OWNED)) || \
+	  (((o) == CHANNELCLI_DISABLED) && ((n) == CHANNELCLI_OWNED)) || \
+	  (((o) == CHANNELCLI_ATTACHING) && ((n) == CHANNELCLI_OWNED)) || \
+	  (((o) == CHANNELCLI_ATTACHED) && ((n) == CHANNELCLI_OWNED)) || \
+	  (((o) == CHANNELCLI_BUSY) && ((n) == CHANNELCLI_OWNED)) || (0)) \
+	 ? (1) : (0))
+
+/* Values for ULTRA_CHANNEL_PROTOCOL.CliErrorBoot: */
+/* throttling invalid boot channel statetransition error due to client
+ * disabled */
+#define ULTRA_CLIERRORBOOT_THROTTLEMSG_DISABLED    0x01
+
+/* throttling invalid boot channel statetransition error due to client
+ * not attached */
+#define ULTRA_CLIERRORBOOT_THROTTLEMSG_NOTATTACHED 0x02
+
+/* throttling invalid boot channel statetransition error due to busy channel */
+#define ULTRA_CLIERRORBOOT_THROTTLEMSG_BUSY        0x04
+
+/* Values for ULTRA_CHANNEL_PROTOCOL.CliErrorOS: */
+/* throttling invalid guest OS channel statetransition error due to
+ * client disabled */
+#define ULTRA_CLIERROROS_THROTTLEMSG_DISABLED      0x01
+
+/* throttling invalid guest OS channel statetransition error due to
+ * client not attached */
+#define ULTRA_CLIERROROS_THROTTLEMSG_NOTATTACHED   0x02
+
+/* throttling invalid guest OS channel statetransition error due to
+ * busy channel */
+#define ULTRA_CLIERROROS_THROTTLEMSG_BUSY          0x04
+
+/* Values for ULTRA_CHANNEL_PROTOCOL.Features: This define exists so
+* that windows guest can look at the FeatureFlags in the io channel,
+* and configure the windows driver to use interrupts or not based on
+* this setting.  This flag is set in uislib after the
+* ULTRA_VHBA_init_channel is called.  All feature bits for all
+* channels should be defined here.  The io channel feature bits are
+* defined right here */
+#define ULTRA_IO_DRIVER_ENABLES_INTS (0x1ULL << 1)
+#define ULTRA_IO_CHANNEL_IS_POLLING (0x1ULL << 3)
+#define ULTRA_IO_IOVM_IS_OK_WITH_DRIVER_DISABLING_INTS (0x1ULL << 4)
+#define ULTRA_IO_DRIVER_DISABLES_INTS (0x1ULL << 5)
+#define ULTRA_IO_DRIVER_SUPPORTS_ENHANCED_RCVBUF_CHECKING (0x1ULL << 6)
+
+#pragma pack(push, 1)		/* both GCC and VC now allow this pragma */
+/* Common Channel Header */
+struct channel_header {
+	u64 signature;		/* Signature */
+	u32 legacy_state;	/* DEPRECATED - being replaced by */
+	/* /              SrvState, CliStateBoot, and CliStateOS below */
+	u32 header_size;	/* sizeof(struct channel_header) */
+	u64 size;		/* Total size of this channel in bytes */
+	u64 features;		/* Flags to modify behavior */
+	uuid_le chtype;		/* Channel type: data, bus, control, etc. */
+	u64 partition_handle;	/* ID of guest partition */
+	u64 handle;		/* Device number of this channel in client */
+	u64 ch_space_offset;	/* Offset in bytes to channel specific area */
+	u32 version_id;		/* struct channel_header Version ID */
+	u32 partition_index;	/* Index of guest partition */
+	uuid_le zone_uuid;	/* Guid of Channel's zone */
+	u32 cli_str_offset;	/* offset from channel header to
+				 * nul-terminated ClientString (0 if
+				 * ClientString not present) */
+	u32 cli_state_boot;	/* CHANNEL_CLIENTSTATE of pre-boot
+				 * EFI client of this channel */
+	u32 cmd_state_cli;	/* CHANNEL_COMMANDSTATE (overloaded in
+				 * Windows drivers, see ServerStateUp,
+				 * ServerStateDown, etc) */
+	u32 cli_state_os;	/* CHANNEL_CLIENTSTATE of Guest OS
+				 * client of this channel */
+	u32 ch_characteristic;	/* CHANNEL_CHARACTERISTIC_<xxx> */
+	u32 cmd_state_srv;	/* CHANNEL_COMMANDSTATE (overloaded in
+				 * Windows drivers, see ServerStateUp,
+				 * ServerStateDown, etc) */
+	u32 srv_state;		/* CHANNEL_SERVERSTATE */
+	u8 cli_error_boot;	/* bits to indicate err states for
+				 * boot clients, so err messages can
+				 * be throttled */
+	u8 cli_error_os;	/* bits to indicate err states for OS
+				 * clients, so err messages can be
+				 * throttled */
+	u8 filler[1];		/* Pad out to 128 byte cacheline */
+	/* Please add all new single-byte values below here */
+	u8 recover_channel;
+};
+
+#define ULTRA_CHANNEL_ENABLE_INTS (0x1ULL << 0)
+
+/* Subheader for the Signal Type variation of the Common Channel */
+struct signal_queue_header {
+	/* 1st cache line */
+	u32 version;		/* SIGNAL_QUEUE_HEADER Version ID */
+	u32 chtype;		/* Queue type: storage, network */
+	u64 size;		/* Total size of this queue in bytes */
+	u64 sig_base_offset;	/* Offset to signal queue area */
+	u64 features;		/* Flags to modify behavior */
+	u64 num_sent;		/* Total # of signals placed in this queue */
+	u64 num_overflows;	/* Total # of inserts failed due to
+				 * full queue */
+	u32 signal_size;	/* Total size of a signal for this queue */
+	u32 max_slots;		/* Max # of slots in queue, 1 slot is
+				 * always empty */
+	u32 max_signals;	/* Max # of signals in queue
+				 * (MaxSignalSlots-1) */
+	u32 head;		/* Queue head signal # */
+	/* 2nd cache line */
+	u64 num_received;	/* Total # of signals removed from this queue */
+	u32 tail;		/* Queue tail signal # (on separate
+				 * cache line) */
+	u32 reserved1;		/* Reserved field */
+	u64 reserved2;		/* Reserved field */
+	u64 client_queue;
+	u64 num_irq_received;	/* Total # of Interrupts received.  This
+					 * is incremented by the ISR in the
+					 * guest windows driver */
+	u64 num_empty;		/* Number of times that visor_signal_remove
+				 * is called and returned Empty
+				 * Status. */
+	u32 errorflags;		/* Error bits set during SignalReinit
+				 * to denote trouble with client's
+				 * fields */
+	u8 filler[12];		/* Pad out to 64 byte cacheline */
+};
+
+#pragma pack(pop)
+
+#define spar_signal_init(chan, QHDRFLD, QDATAFLD, QDATATYPE, ver, typ)	\
+	do {								\
+		memset(&chan->QHDRFLD, 0, sizeof(chan->QHDRFLD));	\
+		chan->QHDRFLD.version = ver;				\
+		chan->QHDRFLD.chtype = typ;				\
+		chan->QHDRFLD.size = sizeof(chan->QDATAFLD);		\
+		chan->QHDRFLD.signal_size = sizeof(QDATATYPE);		\
+		chan->QHDRFLD.sig_base_offset = (u64)(chan->QDATAFLD)-	\
+			(u64)(&chan->QHDRFLD);				\
+		chan->QHDRFLD.max_slots =				\
+			sizeof(chan->QDATAFLD)/sizeof(QDATATYPE);	\
+		chan->QHDRFLD.max_signals = chan->QHDRFLD.max_slots-1;	\
+	} while (0)
+
+/* Generic function useful for validating any type of channel when it is
+ * received by the client that will be accessing the channel.
+ * Note that <logCtx> is only needed for callers in the EFI environment, and
+ * is used to pass the EFI_DIAG_CAPTURE_PROTOCOL needed to log messages.
+ */
+static inline int
+spar_check_channel_client(void __iomem *ch,
+			  uuid_le expected_uuid,
+			  char *chname,
+			  u64 expected_min_bytes,
+			  u32 expected_version,
+			  u64 expected_signature)
+{
+	if (uuid_le_cmp(expected_uuid, NULL_UUID_LE) != 0) {
+		uuid_le guid;
+
+		memcpy_fromio(&guid,
+			      &((struct channel_header __iomem *)(ch))->chtype,
+			      sizeof(guid));
+		/* caller wants us to verify type GUID */
+		if (uuid_le_cmp(guid, expected_uuid) != 0) {
+			pr_err("Channel mismatch on channel=%s(%pUL) field=type expected=%pUL actual=%pUL\n",
+			       chname, &expected_uuid,
+			       &expected_uuid, &guid);
+			return 0;
+		}
+	}
+	if (expected_min_bytes > 0) {	/* caller wants us to verify
+					 * channel size */
+		unsigned long long bytes =
+				readq(&((struct channel_header __iomem *)
+					(ch))->size);
+		if (bytes < expected_min_bytes) {
+			pr_err("Channel mismatch on channel=%s(%pUL) field=size expected=0x%-8.8Lx actual=0x%-8.8Lx\n",
+			       chname, &expected_uuid,
+			       (unsigned long long)expected_min_bytes, bytes);
+			return 0;
+		}
+	}
+	if (expected_version > 0) {	/* caller wants us to verify
+					 * channel version */
+		unsigned long ver = readl(&((struct channel_header __iomem *)
+				    (ch))->version_id);
+		if (ver != expected_version) {
+			pr_err("Channel mismatch on channel=%s(%pUL) field=version expected=0x%-8.8lx actual=0x%-8.8lx\n",
+			       chname, &expected_uuid,
+			       (unsigned long)expected_version, ver);
+			return 0;
+		}
+	}
+	if (expected_signature > 0) {	/* caller wants us to verify
+					 * channel signature */
+		unsigned long long sig =
+				readq(&((struct channel_header __iomem *)
+					(ch))->signature);
+		if (sig != expected_signature) {
+			pr_err("Channel mismatch on channel=%s(%pUL) field=signature expected=0x%-8.8llx actual=0x%-8.8llx\n",
+			       chname, &expected_uuid,
+			       expected_signature, sig);
+			return 0;
+		}
+	}
+	return 1;
+}
+
+/* Generic function useful for validating any type of channel when it is about
+ * to be initialized by the server of the channel.
+ * Note that <logCtx> is only needed for callers in the EFI environment, and
+ * is used to pass the EFI_DIAG_CAPTURE_PROTOCOL needed to log messages.
+ */
+static inline int spar_check_channel_server(uuid_le typeuuid, char *name,
+					    u64 expected_min_bytes,
+					    u64 actual_bytes)
+{
+	if (expected_min_bytes > 0)	/* caller wants us to verify
+					 * channel size */
+		if (actual_bytes < expected_min_bytes) {
+			pr_err("Channel mismatch on channel=%s(%pUL) field=size expected=0x%-8.8llx actual=0x%-8.8llx\n",
+			       name, &typeuuid, expected_min_bytes,
+			       actual_bytes);
+			return 0;
+		}
+	return 1;
+}
+
+/* Given a file pathname <s> (with '/' or '\' separating directory nodes),
+ * returns a pointer to the beginning of a node within that pathname such
+ * that the number of nodes from that pointer to the end of the string is
+ * NOT more than <n>.  Note that if the pathname has less than <n> nodes
+ * in it, the return pointer will be to the beginning of the string.
+ */
+static inline u8 *
+pathname_last_n_nodes(u8 *s, unsigned int n)
+{
+	u8 *p = s;
+	unsigned int node_count = 0;
+
+	while (*p != '\0') {
+		if ((*p == '/') || (*p == '\\'))
+			node_count++;
+		p++;
+	}
+	if (node_count <= n)
+		return s;
+	while (n > 0) {
+		p--;
+		if (p == s)
+			break;	/* should never happen, unless someone
+				 * is changing the string while we are
+				 * looking at it!! */
+		if ((*p == '/') || (*p == '\\'))
+			n--;
+	}
+	return p + 1;
+}
+
+static inline int
+spar_channel_client_acquire_os(void __iomem *ch, u8 *id)
+{
+	struct channel_header __iomem *hdr = ch;
+
+	if (readl(&hdr->cli_state_os) == CHANNELCLI_DISABLED) {
+		if ((readb(&hdr->cli_error_os)
+		     & ULTRA_CLIERROROS_THROTTLEMSG_DISABLED) == 0) {
+			/* we are NOT throttling this message */
+			writeb(readb(&hdr->cli_error_os) |
+			       ULTRA_CLIERROROS_THROTTLEMSG_DISABLED,
+			       &hdr->cli_error_os);
+			/* throttle until acquire successful */
+
+			pr_info("%s Channel StateTransition INVALID! - acquire failed because OS client DISABLED\n",
+				id);
+		}
+		return 0;
+	}
+	if ((readl(&hdr->cli_state_os) != CHANNELCLI_OWNED) &&
+	    (readl(&hdr->cli_state_boot) == CHANNELCLI_DISABLED)) {
+		/* Our competitor is DISABLED, so we can transition to OWNED */
+		pr_info("%s Channel StateTransition (%s) %s(%d)-->%s(%d)\n",
+			id, "cli_state_os",
+			ULTRA_CHANNELCLI_STRING(readl(&hdr->cli_state_os)),
+			readl(&hdr->cli_state_os),
+			ULTRA_CHANNELCLI_STRING(CHANNELCLI_OWNED),
+			CHANNELCLI_OWNED);
+		writel(CHANNELCLI_OWNED, &hdr->cli_state_os);
+		mb(); /* required for channel synch */
+	}
+	if (readl(&hdr->cli_state_os) == CHANNELCLI_OWNED) {
+		if (readb(&hdr->cli_error_os) != 0) {
+			/* we are in an error msg throttling state;
+			 * come out of it */
+			pr_info("%s Channel OS client acquire now successful\n",
+				id);
+			writeb(0, &hdr->cli_error_os);
+		}
+		return 1;
+	}
+
+	/* We have to do it the "hard way".  We transition to BUSY,
+	* and can use the channel iff our competitor has not also
+	* transitioned to BUSY. */
+	if (readl(&hdr->cli_state_os) != CHANNELCLI_ATTACHED) {
+		if ((readb(&hdr->cli_error_os)
+		     & ULTRA_CLIERROROS_THROTTLEMSG_NOTATTACHED) == 0) {
+			/* we are NOT throttling this message */
+			writeb(readb(&hdr->cli_error_os) |
+			       ULTRA_CLIERROROS_THROTTLEMSG_NOTATTACHED,
+			       &hdr->cli_error_os);
+			/* throttle until acquire successful */
+			pr_info("%s Channel StateTransition INVALID! - acquire failed because OS client NOT ATTACHED (state=%s(%d))\n",
+				id, ULTRA_CHANNELCLI_STRING(
+						readl(&hdr->cli_state_os)),
+				readl(&hdr->cli_state_os));
+		}
+		return 0;
+	}
+	writel(CHANNELCLI_BUSY, &hdr->cli_state_os);
+	mb(); /* required for channel synch */
+	if (readl(&hdr->cli_state_boot) == CHANNELCLI_BUSY) {
+		if ((readb(&hdr->cli_error_os)
+		     & ULTRA_CLIERROROS_THROTTLEMSG_BUSY) == 0) {
+			/* we are NOT throttling this message */
+			writeb(readb(&hdr->cli_error_os) |
+			       ULTRA_CLIERROROS_THROTTLEMSG_BUSY,
+			       &hdr->cli_error_os);
+			/* throttle until acquire successful */
+			pr_info("%s Channel StateTransition failed - host OS acquire failed because boot BUSY\n",
+				id);
+		}
+		/* reset busy */
+		writel(CHANNELCLI_ATTACHED, &hdr->cli_state_os);
+		mb(); /* required for channel synch */
+		return 0;
+	}
+	if (readb(&hdr->cli_error_os) != 0) {
+		/* we are in an error msg throttling state; come out of it */
+		pr_info("%s Channel OS client acquire now successful\n", id);
+		writeb(0, &hdr->cli_error_os);
+	}
+	return 1;
+}
+
+static inline void
+spar_channel_client_release_os(void __iomem *ch, u8 *id)
+{
+	struct channel_header __iomem *hdr = ch;
+
+	if (readb(&hdr->cli_error_os) != 0) {
+		/* we are in an error msg throttling state; come out of it */
+		pr_info("%s Channel OS client error state cleared\n", id);
+		writeb(0, &hdr->cli_error_os);
+	}
+	if (readl(&hdr->cli_state_os) == CHANNELCLI_OWNED)
+		return;
+	if (readl(&hdr->cli_state_os) != CHANNELCLI_BUSY) {
+		pr_info("%s Channel StateTransition INVALID! - release failed because OS client NOT BUSY (state=%s(%d))\n",
+			id, ULTRA_CHANNELCLI_STRING(
+					readl(&hdr->cli_state_os)),
+			readl(&hdr->cli_state_os));
+		/* return; */
+	}
+	writel(CHANNELCLI_ATTACHED, &hdr->cli_state_os); /* release busy */
+}
+
+/*
+* Routine Description:
+* Tries to insert the prebuilt signal pointed to by pSignal into the nth
+* Queue of the Channel pointed to by pChannel
+*
+* Parameters:
+* pChannel: (IN) points to the IO Channel
+* Queue: (IN) nth Queue of the IO Channel
+* pSignal: (IN) pointer to the signal
+*
+* Assumptions:
+* - pChannel, Queue and pSignal are valid.
+* - If insertion fails due to a full queue, the caller will determine the
+* retry policy (e.g. wait & try again, report an error, etc.).
+*
+* Return value: 1 if the insertion succeeds, 0 if the queue was
+* full.
+*/
+
+unsigned char spar_signal_insert(struct channel_header __iomem *ch, u32 queue,
+				 void *sig);
+
+/*
+* Routine Description:
+* Removes one signal from Channel pChannel's nth Queue at the
+* time of the call and copies it into the memory pointed to by
+* pSignal.
+*
+* Parameters:
+* pChannel: (IN) points to the IO Channel
+* Queue: (IN) nth Queue of the IO Channel
+* pSignal: (IN) pointer to where the signals are to be copied
+*
+* Assumptions:
+* - pChannel and Queue are valid.
+* - pSignal points to a memory area large enough to hold queue's SignalSize
+*
+* Return value: 1 if the removal succeeds, 0 if the queue was
+* empty.
+*/
+
+unsigned char spar_signal_remove(struct channel_header __iomem *ch, u32 queue,
+				 void *sig);
+
+/*
+* Routine Description:
+* Removes all signals present in Channel pChannel's nth Queue at the
+* time of the call and copies them into the memory pointed to by
+* pSignal.  Returns the # of signals copied as the value of the routine.
+*
+* Parameters:
+* pChannel: (IN) points to the IO Channel
+* Queue: (IN) nth Queue of the IO Channel
+* pSignal: (IN) pointer to where the signals are to be copied
+*
+* Assumptions:
+* - pChannel and Queue are valid.
+* - pSignal points to a memory area large enough to hold Queue's MaxSignals
+* # of signals, each of which is Queue's SignalSize.
+*
+* Return value:
+* # of signals copied.
+*/
+unsigned int spar_signal_remove_all(struct channel_header *ch, u32 queue,
+				    void *sig);
+
+/*
+* Routine Description:
+* Determine whether a signal queue is empty.
+*
+* Parameters:
+* pChannel: (IN) points to the IO Channel
+* Queue: (IN) nth Queue of the IO Channel
+*
+* Return value:
+* 1 if the signal queue is empty, 0 otherwise.
+*/
+unsigned char spar_signalqueue_empty(struct channel_header __iomem *ch,
+				     u32 queue);
+
+#endif
diff --git a/drivers/staging/unisys/include/channel_guid.h b/drivers/staging/unisys/include/channel_guid.h
new file mode 100644
index 0000000..706363fc
--- /dev/null
+++ b/drivers/staging/unisys/include/channel_guid.h
@@ -0,0 +1,61 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+/*
+ * CHANNEL Guids
+ */
+
+/* Used in IOChannel
+ * {414815ed-c58c-11da-95a9-00e08161165f}
+ */
+#define SPAR_VHBA_CHANNEL_PROTOCOL_UUID \
+		UUID_LE(0x414815ed, 0xc58c, 0x11da, \
+				0x95, 0xa9, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f)
+static const uuid_le spar_vhba_channel_protocol_uuid =
+	SPAR_VHBA_CHANNEL_PROTOCOL_UUID;
+
+/* Used in IOChannel
+ * {8cd5994d-c58e-11da-95a9-00e08161165f}
+ */
+#define SPAR_VNIC_CHANNEL_PROTOCOL_UUID \
+		UUID_LE(0x8cd5994d, 0xc58e, 0x11da, \
+				0x95, 0xa9, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f)
+static const uuid_le spar_vnic_channel_protocol_uuid =
+	SPAR_VNIC_CHANNEL_PROTOCOL_UUID;
+
+/* Used in IOChannel
+ * {72120008-4AAB-11DC-8530-444553544200}
+ */
+#define SPAR_SIOVM_UUID \
+		UUID_LE(0x72120008, 0x4AAB, 0x11DC, \
+				0x85, 0x30, 0x44, 0x45, 0x53, 0x54, 0x42, 0x00)
+static const uuid_le spar_siovm_uuid = SPAR_SIOVM_UUID;
+
+/* Used in visornoop/visornoop_main.c
+ * {5b52c5ac-e5f5-4d42-8dff-429eaecd221f}
+ */
+#define SPAR_CONTROLDIRECTOR_CHANNEL_PROTOCOL_UUID  \
+		UUID_LE(0x5b52c5ac, 0xe5f5, 0x4d42, \
+				0x8d, 0xff, 0x42, 0x9e, 0xae, 0xcd, 0x22, 0x1f)
+
+static const uuid_le spar_controldirector_channel_protocol_uuid =
+	SPAR_CONTROLDIRECTOR_CHANNEL_PROTOCOL_UUID;
+
+/* Used in visorchipset/visorchipset_main.c
+ * {B4E79625-AEDE-4EAA-9E11-D3EDDCD4504C}
+ */
+#define SPAR_DIAG_POOL_CHANNEL_PROTOCOL_UUID				\
+		UUID_LE(0xb4e79625, 0xaede, 0x4eaa, \
+				0x9e, 0x11, 0xd3, 0xed, 0xdc, 0xd4, 0x50, 0x4c)
diff --git a/drivers/staging/unisys/visorbus/controlvmchannel.h b/drivers/staging/unisys/visorbus/controlvmchannel.h
new file mode 100644
index 0000000..a50d9cf
--- /dev/null
+++ b/drivers/staging/unisys/visorbus/controlvmchannel.h
@@ -0,0 +1,485 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+#ifndef __CONTROLVMCHANNEL_H__
+#define __CONTROLVMCHANNEL_H__
+
+#include <linux/uuid.h>
+#include "channel.h"
+
+/* {2B3C2D10-7EF5-4ad8-B966-3448B7386B3D} */
+#define SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID	\
+		UUID_LE(0x2b3c2d10, 0x7ef5, 0x4ad8, \
+			0xb9, 0x66, 0x34, 0x48, 0xb7, 0x38, 0x6b, 0x3d)
+
+#define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE \
+	ULTRA_CHANNEL_PROTOCOL_SIGNATURE
+#define CONTROLVM_MESSAGE_MAX 64
+
+/* Must increment this whenever you insert or delete fields within
+ * this channel struct.  Also increment whenever you change the meaning
+ * of fields within this channel struct so as to break pre-existing
+ * software.  Note that you can usually add fields to the END of the
+ * channel struct withOUT needing to increment this.
+ */
+#define ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID  1
+
+#define SPAR_CONTROLVM_CHANNEL_OK_CLIENT(ch)           \
+	spar_check_channel_client(ch, \
+		SPAR_CONTROLVM_CHANNEL_PROTOCOL_UUID, \
+		"controlvm", \
+		sizeof(struct spar_controlvm_channel_protocol), \
+		ULTRA_CONTROLVM_CHANNEL_PROTOCOL_VERSIONID, \
+		ULTRA_CONTROLVM_CHANNEL_PROTOCOL_SIGNATURE)
+
+#define MAX_SERIAL_NUM	32
+
+/* Defines for various channel queues */
+#define CONTROLVM_QUEUE_REQUEST		0
+#define CONTROLVM_QUEUE_RESPONSE	1
+#define CONTROLVM_QUEUE_EVENT		2
+#define CONTROLVM_QUEUE_ACK		3
+
+/* Max num of messages stored during IOVM creation to be reused after crash */
+#define CONTROLVM_CRASHMSG_MAX		2
+
+struct spar_segment_state  {
+	u16 enabled:1;		/* Bit 0: May enter other states */
+	u16 active:1;		/* Bit 1: Assigned to active partition */
+	u16 alive:1;		/* Bit 2: Configure message sent to
+				 * service/server */
+	u16 revoked:1;		/* Bit 3: similar to partition state
+				 * ShuttingDown */
+	u16 allocated:1;	/* Bit 4: memory (device/port number)
+				 * has been selected by Command */
+	u16 known:1;		/* Bit 5: has been introduced to the
+				 * service/guest partition */
+	u16 ready:1;		/* Bit 6: service/Guest partition has
+				 * responded to introduction */
+	u16 operating:1;	/* Bit 7: resource is configured and
+				 * operating */
+	/* Note: don't use high bit unless we need to switch to ushort
+	 * which is non-compliant */
+};
+
+static const struct spar_segment_state segment_state_running = {
+	1, 1, 1, 0, 1, 1, 1, 1
+};
+
+static const struct spar_segment_state segment_state_paused = {
+	1, 1, 1, 0, 1, 1, 1, 0
+};
+
+static const struct spar_segment_state segment_state_standby = {
+	1, 1, 0, 0, 1, 1, 1, 0
+};
+
+/* Ids for commands that may appear in either queue of a ControlVm channel.
+ *
+ *  Commands that are initiated by the command partition (CP), by an IO or
+ *  console service partition (SP), or by a guest partition (GP)are:
+ *  - issued on the RequestQueue queue (q #0) in the ControlVm channel
+ *  - responded to on the ResponseQueue queue (q #1) in the ControlVm channel
+ *
+ *  Events that are initiated by an IO or console service partition (SP) or
+ *  by a guest partition (GP) are:
+ *  - issued on the EventQueue queue (q #2) in the ControlVm channel
+ *  - responded to on the EventAckQueue queue (q #3) in the ControlVm channel
+ */
+enum controlvm_id {
+	CONTROLVM_INVALID = 0,
+	/* SWITCH commands required Parameter: SwitchNumber */
+	/* BUS commands required Parameter: BusNumber */
+	CONTROLVM_BUS_CREATE = 0x101,			/* CP --> SP, GP */
+	CONTROLVM_BUS_DESTROY = 0x102,			/* CP --> SP, GP */
+	CONTROLVM_BUS_CONFIGURE = 0x104,		/* CP --> SP */
+	CONTROLVM_BUS_CHANGESTATE = 0x105,		/* CP --> SP, GP */
+	CONTROLVM_BUS_CHANGESTATE_EVENT = 0x106,	/* SP, GP --> CP */
+/* DEVICE commands required Parameter: BusNumber, DeviceNumber */
+
+	CONTROLVM_DEVICE_CREATE = 0x201,		/* CP --> SP, GP */
+	CONTROLVM_DEVICE_DESTROY = 0x202,		/* CP --> SP, GP */
+	CONTROLVM_DEVICE_CONFIGURE = 0x203,		/* CP --> SP */
+	CONTROLVM_DEVICE_CHANGESTATE = 0x204,		/* CP --> SP, GP */
+	CONTROLVM_DEVICE_CHANGESTATE_EVENT = 0x205,	/* SP, GP --> CP */
+	CONTROLVM_DEVICE_RECONFIGURE = 0x206,		/* CP --> Boot */
+/* CHIPSET commands */
+	CONTROLVM_CHIPSET_INIT = 0x301,			/* CP --> SP, GP */
+	CONTROLVM_CHIPSET_STOP = 0x302,			/* CP --> SP, GP */
+	CONTROLVM_CHIPSET_READY = 0x304,		/* CP --> SP */
+	CONTROLVM_CHIPSET_SELFTEST = 0x305,		/* CP --> SP */
+
+};
+
+struct irq_info {
+	u64 reserved1;
+
+	 /* specifies interrupt handle. It is used to retrieve the
+	  *   corresponding interrupt pin from Monitor; and the
+	  *   interrupt pin is used to connect to the corresponding
+	  *   interrupt.  Used by IOPart-GP only.
+	  */
+	u64 recv_irq_handle;
+
+	 /* specifies interrupt vector. It, interrupt pin, and shared are
+	  *   used to connect to the corresponding interrupt.  Used by
+	  *   IOPart-GP only.
+	  */
+	u32 recv_irq_vector;
+
+    /* specifies if the recvInterrupt is shared.  It, interrupt pin
+     * and vector are used to connect to 0 = not shared; 1 = shared.
+     * the corresponding interrupt.  Used by IOPart-GP only.
+     */
+	u8 recv_irq_shared;
+	u8 reserved[3];	/* Natural alignment purposes */
+};
+
+struct pci_id {
+	u16 domain;
+	u8 bus;
+	u8 slot;
+	u8 func;
+	u8 reserved[3];	/* Natural alignment purposes */
+};
+
+struct efi_spar_indication  {
+	u64 boot_to_fw_ui:1;		/* Bit 0: Stop in uefi ui */
+	u64 clear_nvram:1;		/* Bit 1: Clear NVRAM */
+	u64 clear_cmos:1;		/* Bit 2: Clear CMOS */
+	u64 boot_to_tool:1;		/* Bit 3: Run install tool */
+	/* remaining bits are available */
+};
+
+enum ultra_chipset_feature {
+	ULTRA_CHIPSET_FEATURE_REPLY = 0x00000001,
+	ULTRA_CHIPSET_FEATURE_PARA_HOTPLUG = 0x00000002,
+};
+
+/* This is the common structure that is at the beginning of every
+ *  ControlVm message (both commands and responses) in any ControlVm
+ *  queue.  Commands are easily distinguished from responses by
+ *  looking at the flags.response field.
+ */
+struct controlvm_message_header  {
+	u32 id;		/* See CONTROLVM_ID. */
+	/* For requests, indicates the message type. */
+	/* For responses, indicates the type of message we are responding to. */
+
+	u32 message_size;	/* Includes size of this struct + size
+				 * of message */
+	u32 segment_index;	/* Index of segment containing Vm
+				 * message/information */
+	u32 completion_status;	/* Error status code or result of
+				 * message completion */
+	struct  {
+		u32 failed:1;		   /* =1 in a response to * signify
+					    * failure */
+		u32 response_expected:1;   /* =1 in all messages that expect a
+					    * response (Control ignores this
+					    * bit) */
+		u32 server:1;		   /* =1 in all bus & device-related
+					    * messages where the message
+					    * receiver is to act as the bus or
+					    * device server */
+		u32 test_message:1;	   /* =1 for testing use only
+					    * (Control and Command ignore this
+					    * bit) */
+		u32 partial_completion:1;  /* =1 if there are forthcoming
+					    * responses/acks associated
+					    * with this message */
+		u32 preserve:1;		   /* =1 this is to let us know to
+					    * preserve channel contents
+					    * (for running guests)*/
+		u32 writer_in_diag:1;	   /* =1 the DiagWriter is active in the
+					    * Diagnostic Partition*/
+	} flags;
+	u32 reserved;		/* Natural alignment */
+	u64 message_handle;	/* Identifies the particular message instance,
+				 * and is used to match particular */
+	/* request instances with the corresponding response instance. */
+	u64 payload_vm_offset;	/* Offset of payload area from start of this
+				 * instance of ControlVm segment */
+	u32 payload_max_bytes;	/* Maximum bytes allocated in payload
+				 * area of ControlVm segment */
+	u32 payload_bytes;	/* Actual number of bytes of payload
+				 * area to copy between IO/Command; */
+	/* if non-zero, there is a payload to copy. */
+};
+
+struct controlvm_packet_device_create  {
+	u32 bus_no;		/* bus # (0..n-1) from the msg receiver's end */
+	u32 dev_no;		/* bus-relative (0..n-1) device number */
+	u64 channel_addr;	/* Guest physical address of the channel, which
+				 * can be dereferenced by the receiver of this
+				 * ControlVm command */
+	u64 channel_bytes;	/* specifies size of the channel in bytes */
+	uuid_le data_type_uuid;	/* specifies format of data in channel */
+	uuid_le dev_inst_uuid;	/* instance guid for the device */
+	struct irq_info intr;	/* specifies interrupt information */
+};	/* for CONTROLVM_DEVICE_CREATE */
+
+struct controlvm_packet_device_configure  {
+	u32 bus_no;	      /* bus # (0..n-1) from the msg
+			       * receiver's perspective */
+	/* Control uses header SegmentIndex field to access bus number... */
+	u32 dev_no;	      /* bus-relative (0..n-1) device number */
+} ;	/* for CONTROLVM_DEVICE_CONFIGURE */
+
+struct controlvm_message_device_create {
+	struct controlvm_message_header header;
+	struct controlvm_packet_device_create packet;
+};	/* total 128 bytes */
+
+struct controlvm_message_device_configure  {
+	struct controlvm_message_header header;
+	struct controlvm_packet_device_configure packet;
+};	/* total 56 bytes */
+
+/* This is the format for a message in any ControlVm queue. */
+struct controlvm_message_packet  {
+	union  {
+		struct  {
+			u32 bus_no;	/* bus # (0..n-1) from the msg
+					 * receiver's perspective */
+			u32 dev_count;	/* indicates the max number of
+					 * devices on this bus */
+			u64 channel_addr;	/* Guest physical address of
+						 * the channel, which can be
+						 * dereferenced by the receiver
+						 * of this ControlVm command */
+			u64 channel_bytes;	/* size of the channel */
+			uuid_le bus_data_type_uuid;	/* indicates format of
+							 * data in bus channel*/
+			uuid_le bus_inst_uuid;	/* instance uuid for the bus */
+		} create_bus;	/* for CONTROLVM_BUS_CREATE */
+		struct  {
+			u32 bus_no;	/* bus # (0..n-1) from the msg
+					 * receiver's perspective */
+			u32 reserved;	/* Natural alignment purposes */
+		} destroy_bus;	/* for CONTROLVM_BUS_DESTROY */
+		struct  {
+			u32 bus_no;	/* bus # (0..n-1) from the receiver's
+					 * perspective */
+			u32 reserved1;	/* for alignment purposes */
+			u64 guest_handle;	/* This is used to convert
+						 * guest physical address to
+						 * physical address */
+			u64 recv_bus_irq_handle;
+				/* specifies interrupt info. It is used by SP
+				 * to register to receive interrupts from the
+				 * CP. This interrupt is used for bus level
+				 * notifications.  The corresponding
+				 * sendBusInterruptHandle is kept in CP. */
+		} configure_bus;	/* for CONTROLVM_BUS_CONFIGURE */
+		/* for CONTROLVM_DEVICE_CREATE */
+		struct controlvm_packet_device_create create_device;
+		struct  {
+			u32 bus_no;	/* bus # (0..n-1) from the msg
+					 * receiver's perspective */
+			u32 dev_no;	/* bus-relative (0..n-1) device # */
+		} destroy_device;	/* for CONTROLVM_DEVICE_DESTROY */
+		/* for CONTROLVM_DEVICE_CONFIGURE */
+		struct controlvm_packet_device_configure configure_device;
+		struct  {
+			u32 bus_no;	/* bus # (0..n-1) from the msg
+					 * receiver's perspective */
+			u32 dev_no;	/* bus-relative (0..n-1) device # */
+		} reconfigure_device;	/* for CONTROLVM_DEVICE_RECONFIGURE */
+		struct  {
+			u32 bus_no;
+			struct spar_segment_state state;
+			u8 reserved[2];	/* Natural alignment purposes */
+		} bus_change_state;	/* for CONTROLVM_BUS_CHANGESTATE */
+		struct  {
+			u32 bus_no;
+			u32 dev_no;
+			struct spar_segment_state state;
+			struct  {
+				u32 phys_device:1;	/* =1 if message is for
+							 * a physical device */
+			} flags;
+			u8 reserved[2];	/* Natural alignment purposes */
+		} device_change_state;	/* for CONTROLVM_DEVICE_CHANGESTATE */
+		struct  {
+			u32 bus_no;
+			u32 dev_no;
+			struct spar_segment_state state;
+			u8 reserved[6];	/* Natural alignment purposes */
+		} device_change_state_event;
+			/* for CONTROLVM_DEVICE_CHANGESTATE_EVENT */
+		struct  {
+			u32 bus_count;	/* indicates the max number of busses */
+			u32 switch_count; /* indicates the max number of
+					   * switches if a service partition */
+			enum ultra_chipset_feature features;
+			u32 platform_number;	/* Platform Number */
+		} init_chipset;	/* for CONTROLVM_CHIPSET_INIT */
+		struct  {
+			u32 options;	/* reserved */
+			u32 test;	/* bit 0 set to run embedded selftest */
+		} chipset_selftest;	/* for CONTROLVM_CHIPSET_SELFTEST */
+		u64 addr;	/* a physical address of something, that can be
+				 * dereferenced by the receiver of this
+				 * ControlVm command (depends on command id) */
+		u64 handle;	/* a handle of something (depends on command
+				 * id) */
+	};
+};
+
+/* All messages in any ControlVm queue have this layout. */
+struct controlvm_message {
+	struct controlvm_message_header hdr;
+	struct controlvm_message_packet cmd;
+};
+
+struct spar_controlvm_channel_protocol {
+	struct channel_header header;
+	u64 gp_controlvm;	/* guest phys addr of this channel */
+	u64 gp_partition_tables;/* guest phys addr of partition tables */
+	u64 gp_diag_guest;	/* guest phys addr of diagnostic channel */
+	u64 gp_boot_romdisk;/* guest phys addr of (read* only) Boot ROM disk */
+	u64 gp_boot_ramdisk;/* guest phys addr of writable Boot RAM disk */
+	u64 gp_acpi_table;	/* guest phys addr of acpi table */
+	u64 gp_control_channel;/* guest phys addr of control channel */
+	u64 gp_diag_romdisk;/* guest phys addr of diagnostic ROM disk */
+	u64 gp_nvram;	/* guest phys addr of NVRAM channel */
+	u64 request_payload_offset;	/* Offset to request payload area */
+	u64 event_payload_offset;	/* Offset to event payload area */
+	u32 request_payload_bytes;	/* Bytes available in request payload
+					 * area */
+	u32 event_payload_bytes;/* Bytes available in event payload area */
+	u32 control_channel_bytes;
+	u32 nvram_channel_bytes;	/* Bytes in PartitionNvram segment */
+	u32 message_bytes;		/* sizeof(CONTROLVM_MESSAGE) */
+	u32 message_count;		/* CONTROLVM_MESSAGE_MAX */
+	u64 gp_smbios_table;		/* guest phys addr of SMBIOS tables */
+	u64 gp_physical_smbios_table;	/* guest phys addr of SMBIOS table  */
+	/* ULTRA_MAX_GUESTS_PER_SERVICE */
+	char gp_reserved[2688];
+
+	/* guest physical address of EFI firmware image base  */
+	u64 virtual_guest_firmware_image_base;
+
+	/* guest physical address of EFI firmware entry point  */
+	u64 virtual_guest_firmware_entry_point;
+
+	/* guest EFI firmware image size  */
+	u64 virtual_guest_firmware_image_size;
+
+	/* GPA = 1MB where EFI firmware image is copied to  */
+	u64 virtual_guest_firmware_boot_base;
+	u64 virtual_guest_image_base;
+	u64 virtual_guest_image_size;
+	u64 prototype_control_channel_offset;
+	u64 virtual_guest_partition_handle;
+
+	u16 restore_action;	/* Restore Action field to restore the guest
+				 * partition */
+	u16 dump_action;	/* For Windows guests it shows if the visordisk
+				 * is running in dump mode */
+	u16 nvram_fail_count;
+	u16 saved_crash_message_count;	/* = CONTROLVM_CRASHMSG_MAX */
+	u32 saved_crash_message_offset;	/* Offset to request payload area needed
+					 * for crash dump */
+	u32 installation_error;	/* Type of error encountered during
+				 * installation */
+	u32 installation_text_id;	/* Id of string to display */
+	u16 installation_remaining_steps;/* Number of remaining installation
+					  * steps (for progress bars) */
+	u8 tool_action;		/* ULTRA_TOOL_ACTIONS Installation Action
+				 * field */
+	u8 reserved;		/* alignment */
+	struct efi_spar_indication efi_spar_ind;
+	struct efi_spar_indication efi_spar_ind_supported;
+	u32 sp_reserved;
+	u8 reserved2[28];	/* Force signals to begin on 128-byte cache
+				 * line */
+	struct signal_queue_header request_queue;/* Service or guest partition
+						  * uses this queue to send
+						  * requests to Control */
+	struct signal_queue_header response_queue;/* Control uses this queue to
+						   * respond to service or guest
+						   * partition requests */
+	struct signal_queue_header event_queue;	/* Control uses this queue to
+						 * send events to service or
+						 * guest partition */
+	struct signal_queue_header event_ack_queue;/* Service or guest partition
+						    * uses this queue to ack
+						    * Control events */
+
+	 /* Request fixed-size message pool - does not include payload */
+	 struct controlvm_message request_msg[CONTROLVM_MESSAGE_MAX];
+
+	 /* Response fixed-size message pool - does not include payload */
+	 struct controlvm_message response_msg[CONTROLVM_MESSAGE_MAX];
+
+	 /* Event fixed-size message pool - does not include payload */
+	 struct controlvm_message event_msg[CONTROLVM_MESSAGE_MAX];
+
+	 /* Ack fixed-size message pool - does not include payload */
+	 struct controlvm_message event_ack_msg[CONTROLVM_MESSAGE_MAX];
+
+	 /* Message stored during IOVM creation to be reused after crash */
+	 struct controlvm_message saved_crash_msg[CONTROLVM_CRASHMSG_MAX];
+};
+
+/* Offsets for VM channel attributes */
+#define VM_CH_REQ_QUEUE_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, request_queue)
+#define VM_CH_RESP_QUEUE_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, response_queue)
+#define VM_CH_EVENT_QUEUE_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, event_queue)
+#define VM_CH_ACK_QUEUE_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, event_ack_queue)
+#define VM_CH_REQ_MSG_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, request_msg)
+#define VM_CH_RESP_MSG_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, response_msg)
+#define VM_CH_EVENT_MSG_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, event_msg)
+#define VM_CH_ACK_MSG_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, event_ack_msg)
+#define VM_CH_CRASH_MSG_OFFSET \
+	offsetof(struct spar_controlvm_channel_protocol, saved_crash_msg)
+
+/* The following header will be located at the beginning of PayloadVmOffset for
+ * various ControlVm commands. The receiver of a ControlVm command with a
+ * PayloadVmOffset will dereference this address and then use connection_offset,
+ * initiator_offset, and target_offset to get the location of UTF-8 formatted
+ * strings that can be parsed to obtain command-specific information. The value
+ * of total_length should equal PayloadBytes. The format of the strings at
+ * PayloadVmOffset will take different forms depending on the message.
+ */
+struct spar_controlvm_parameters_header {
+	u32 total_length;
+	u32 header_length;
+	u32 connection_offset;
+	u32 connection_length;
+	u32 initiator_offset;
+	u32 initiator_length;
+	u32 target_offset;
+	u32 target_length;
+	u32 client_offset;
+	u32 client_length;
+	u32 name_offset;
+	u32 name_length;
+	uuid_le id;
+	u32 revision;
+	u32 reserved;		/* Natural alignment */
+};
+
+#endif				/* __CONTROLVMCHANNEL_H__ */
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 11/44] staging: unisys: vbuschannel belonsg to visorbus
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (9 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 10/44] staging: unisys: Move channel.h to include. Controvlm to visorbus Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 12/44] staging: unisys: Move diagchannel to include Benjamin Romer
                   ` (32 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Move vbuschannel.h into visorbus.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 .../common-spar/include/channels/vbuschannel.h     | 94 ----------------------
 drivers/staging/unisys/visorbus/vbuschannel.h      | 94 ++++++++++++++++++++++
 2 files changed, 94 insertions(+), 94 deletions(-)
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/vbuschannel.h
 create mode 100644 drivers/staging/unisys/visorbus/vbuschannel.h

diff --git a/drivers/staging/unisys/common-spar/include/channels/vbuschannel.h b/drivers/staging/unisys/common-spar/include/channels/vbuschannel.h
deleted file mode 100644
index 5ed83a3..0000000
--- a/drivers/staging/unisys/common-spar/include/channels/vbuschannel.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-#ifndef __VBUSCHANNEL_H__
-#define __VBUSCHANNEL_H__
-
-/*  The vbus channel is the channel area provided via the BUS_CREATE controlvm
- *  message for each virtual bus.  This channel area is provided to both server
- *  and client ends of the bus.  The channel header area is initialized by
- *  the server, and the remaining information is filled in by the client.
- *  We currently use this for the client to provide various information about
- *  the client devices and client drivers for the server end to see.
- */
-#include <linux/uuid.h>
-#include "vbusdeviceinfo.h"
-#include "channel.h"
-
-/* {193b331b-c58f-11da-95a9-00e08161165f} */
-#define SPAR_VBUS_CHANNEL_PROTOCOL_UUID \
-		UUID_LE(0x193b331b, 0xc58f, 0x11da, \
-				0x95, 0xa9, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f)
-static const uuid_le spar_vbus_channel_protocol_uuid =
-	SPAR_VBUS_CHANNEL_PROTOCOL_UUID;
-
-#define SPAR_VBUS_CHANNEL_PROTOCOL_SIGNATURE ULTRA_CHANNEL_PROTOCOL_SIGNATURE
-
-/* Must increment this whenever you insert or delete fields within this channel
-* struct.  Also increment whenever you change the meaning of fields within this
-* channel struct so as to break pre-existing software.  Note that you can
-* usually add fields to the END of the channel struct withOUT needing to
-* increment this. */
-#define SPAR_VBUS_CHANNEL_PROTOCOL_VERSIONID 1
-
-#define SPAR_VBUS_CHANNEL_OK_CLIENT(ch)       \
-	spar_check_channel_client(ch,				\
-				   spar_vbus_channel_protocol_uuid,	\
-				   "vbus",				\
-				   sizeof(struct spar_vbus_channel_protocol),\
-				   SPAR_VBUS_CHANNEL_PROTOCOL_VERSIONID, \
-				   SPAR_VBUS_CHANNEL_PROTOCOL_SIGNATURE)
-
-#define SPAR_VBUS_CHANNEL_OK_SERVER(actual_bytes)    \
-	(spar_check_channel_server(spar_vbus_channel_protocol_uuid,	\
-				   "vbus",				\
-				   sizeof(struct spar_vbus_channel_protocol),\
-				   actual_bytes))
-
-#pragma pack(push, 1)		/* both GCC and VC now allow this pragma */
-struct spar_vbus_headerinfo {
-	u32 struct_bytes;	/* size of this struct in bytes */
-	u32 device_info_struct_bytes;	/* sizeof(ULTRA_VBUS_DEVICEINFO) */
-	u32 dev_info_count;	/* num of items in DevInfo member */
-	/* (this is the allocated size) */
-	u32 chp_info_offset;	/* byte offset from beginning of this struct */
-	/* to the ChpInfo struct (below) */
-	u32 bus_info_offset;	/* byte offset from beginning of this struct */
-	/* to the BusInfo struct (below) */
-	u32 dev_info_offset;	/* byte offset from beginning of this struct */
-	/* to the DevInfo array (below) */
-	u8 reserved[104];
-};
-
-struct spar_vbus_channel_protocol {
-	struct channel_header channel_header;	/* initialized by server */
-	struct spar_vbus_headerinfo hdr_info;	/* initialized by server */
-	/* the remainder of this channel is filled in by the client */
-	struct ultra_vbus_deviceinfo chp_info;
-	/* describes client chipset device and driver */
-	struct ultra_vbus_deviceinfo bus_info;
-	/* describes client bus device and driver */
-	struct ultra_vbus_deviceinfo dev_info[0];
-	/* describes client device and driver for each device on the bus */
-};
-
-#define VBUS_CH_SIZE_EXACT(MAXDEVICES) \
-	(sizeof(ULTRA_VBUS_CHANNEL_PROTOCOL) + ((MAXDEVICES) * \
-						sizeof(ULTRA_VBUS_DEVICEINFO)))
-#define VBUS_CH_SIZE(MAXDEVICES) COVER(VBUS_CH_SIZE_EXACT(MAXDEVICES), 4096)
-
-#pragma pack(pop)
-
-#endif
diff --git a/drivers/staging/unisys/visorbus/vbuschannel.h b/drivers/staging/unisys/visorbus/vbuschannel.h
new file mode 100644
index 0000000..5ed83a3
--- /dev/null
+++ b/drivers/staging/unisys/visorbus/vbuschannel.h
@@ -0,0 +1,94 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+#ifndef __VBUSCHANNEL_H__
+#define __VBUSCHANNEL_H__
+
+/*  The vbus channel is the channel area provided via the BUS_CREATE controlvm
+ *  message for each virtual bus.  This channel area is provided to both server
+ *  and client ends of the bus.  The channel header area is initialized by
+ *  the server, and the remaining information is filled in by the client.
+ *  We currently use this for the client to provide various information about
+ *  the client devices and client drivers for the server end to see.
+ */
+#include <linux/uuid.h>
+#include "vbusdeviceinfo.h"
+#include "channel.h"
+
+/* {193b331b-c58f-11da-95a9-00e08161165f} */
+#define SPAR_VBUS_CHANNEL_PROTOCOL_UUID \
+		UUID_LE(0x193b331b, 0xc58f, 0x11da, \
+				0x95, 0xa9, 0x0, 0xe0, 0x81, 0x61, 0x16, 0x5f)
+static const uuid_le spar_vbus_channel_protocol_uuid =
+	SPAR_VBUS_CHANNEL_PROTOCOL_UUID;
+
+#define SPAR_VBUS_CHANNEL_PROTOCOL_SIGNATURE ULTRA_CHANNEL_PROTOCOL_SIGNATURE
+
+/* Must increment this whenever you insert or delete fields within this channel
+* struct.  Also increment whenever you change the meaning of fields within this
+* channel struct so as to break pre-existing software.  Note that you can
+* usually add fields to the END of the channel struct withOUT needing to
+* increment this. */
+#define SPAR_VBUS_CHANNEL_PROTOCOL_VERSIONID 1
+
+#define SPAR_VBUS_CHANNEL_OK_CLIENT(ch)       \
+	spar_check_channel_client(ch,				\
+				   spar_vbus_channel_protocol_uuid,	\
+				   "vbus",				\
+				   sizeof(struct spar_vbus_channel_protocol),\
+				   SPAR_VBUS_CHANNEL_PROTOCOL_VERSIONID, \
+				   SPAR_VBUS_CHANNEL_PROTOCOL_SIGNATURE)
+
+#define SPAR_VBUS_CHANNEL_OK_SERVER(actual_bytes)    \
+	(spar_check_channel_server(spar_vbus_channel_protocol_uuid,	\
+				   "vbus",				\
+				   sizeof(struct spar_vbus_channel_protocol),\
+				   actual_bytes))
+
+#pragma pack(push, 1)		/* both GCC and VC now allow this pragma */
+struct spar_vbus_headerinfo {
+	u32 struct_bytes;	/* size of this struct in bytes */
+	u32 device_info_struct_bytes;	/* sizeof(ULTRA_VBUS_DEVICEINFO) */
+	u32 dev_info_count;	/* num of items in DevInfo member */
+	/* (this is the allocated size) */
+	u32 chp_info_offset;	/* byte offset from beginning of this struct */
+	/* to the ChpInfo struct (below) */
+	u32 bus_info_offset;	/* byte offset from beginning of this struct */
+	/* to the BusInfo struct (below) */
+	u32 dev_info_offset;	/* byte offset from beginning of this struct */
+	/* to the DevInfo array (below) */
+	u8 reserved[104];
+};
+
+struct spar_vbus_channel_protocol {
+	struct channel_header channel_header;	/* initialized by server */
+	struct spar_vbus_headerinfo hdr_info;	/* initialized by server */
+	/* the remainder of this channel is filled in by the client */
+	struct ultra_vbus_deviceinfo chp_info;
+	/* describes client chipset device and driver */
+	struct ultra_vbus_deviceinfo bus_info;
+	/* describes client bus device and driver */
+	struct ultra_vbus_deviceinfo dev_info[0];
+	/* describes client device and driver for each device on the bus */
+};
+
+#define VBUS_CH_SIZE_EXACT(MAXDEVICES) \
+	(sizeof(ULTRA_VBUS_CHANNEL_PROTOCOL) + ((MAXDEVICES) * \
+						sizeof(ULTRA_VBUS_DEVICEINFO)))
+#define VBUS_CH_SIZE(MAXDEVICES) COVER(VBUS_CH_SIZE_EXACT(MAXDEVICES), 4096)
+
+#pragma pack(pop)
+
+#endif
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 12/44] staging: unisys: Move diagchannel to include
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (10 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 11/44] staging: unisys: vbuschannel belonsg " Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 13/44] staging: unisys: Move files out of common-spar Benjamin Romer
                   ` (31 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Diagchannel needs to go to standard include.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 .../common-spar/include/channels/diagchannel.h     | 427 ---------------------
 drivers/staging/unisys/include/diagchannel.h       | 427 +++++++++++++++++++++
 2 files changed, 427 insertions(+), 427 deletions(-)
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/diagchannel.h
 create mode 100644 drivers/staging/unisys/include/diagchannel.h

diff --git a/drivers/staging/unisys/common-spar/include/channels/diagchannel.h b/drivers/staging/unisys/common-spar/include/channels/diagchannel.h
deleted file mode 100644
index e8fb867..0000000
--- a/drivers/staging/unisys/common-spar/include/channels/diagchannel.h
+++ /dev/null
@@ -1,427 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/*++
- *
- * Module Name:
- *
- * diagchannel.h
- *
- * Abstract:
- *
- * This file defines the DiagChannel protocol.  This protocol is used to aid in
- * preserving event data sent by external applications.  This protocol provides
- * a region for event data to reside in.  This data will eventually be sent to
- * the Boot Partition where it will be committed to memory and/or disk.  This
- * file contains platform-independent data that can be built using any
- * Supervisor build environment (Windows, Linux, EFI).
- *
-*/
-
-#ifndef _DIAG_CHANNEL_H_
-#define _DIAG_CHANNEL_H_
-
-#include <linux/uuid.h>
-#include "channel.h"
-
-/* {EEA7A573-DB82-447c-8716-EFBEAAAE4858} */
-#define SPAR_DIAG_CHANNEL_PROTOCOL_UUID \
-		UUID_LE(0xeea7a573, 0xdb82, 0x447c, \
-				0x87, 0x16, 0xef, 0xbe, 0xaa, 0xae, 0x48, 0x58)
-
-static const uuid_le spar_diag_channel_protocol_uuid =
-	SPAR_DIAG_CHANNEL_PROTOCOL_UUID;
-
-/* {E850F968-3263-4484-8CA5-2A35D087A5A8} */
-#define ULTRA_DIAG_ROOT_CHANNEL_PROTOCOL_GUID \
-		UUID_LE(0xe850f968, 0x3263, 0x4484, \
-				0x8c, 0xa5, 0x2a, 0x35, 0xd0, 0x87, 0xa5, 0xa8)
-
-#define ULTRA_DIAG_CHANNEL_PROTOCOL_SIGNATURE  ULTRA_CHANNEL_PROTOCOL_SIGNATURE
-
-/* Must increment this whenever you insert or delete fields within this channel
-* struct.  Also increment whenever you change the meaning of fields within this
-* channel struct so as to break pre-existing software.  Note that you can
-* usually add fields to the END of the channel struct withOUT needing to
-* increment this. */
-#define ULTRA_DIAG_CHANNEL_PROTOCOL_VERSIONID 2
-
-#define SPAR_DIAG_CHANNEL_OK_CLIENT(ch)\
-	(spar_check_channel_client(ch,\
-				   spar_diag_channel_protocol_uuid,\
-				   "diag",\
-				   sizeof(struct spar_diag_channel_protocol),\
-				   ULTRA_DIAG_CHANNEL_PROTOCOL_VERSIONID,\
-				   ULTRA_DIAG_CHANNEL_PROTOCOL_SIGNATURE))
-
-#define SPAR_DIAG_CHANNEL_OK_SERVER(bytes)\
-	(spar_check_channel_server(spar_diag_channel_protocol_uuid,\
-				   "diag",\
-				   sizeof(struct spar_diag_channel_protocol),\
-				   bytes))
-
-#define MAX_MODULE_NAME_SIZE 128	/* Maximum length of module name... */
-#define MAX_ADDITIONAL_INFO_SIZE 256	/* Maximum length of any additional info
-					 * accompanying event... */
-#define MAX_SUBSYSTEMS 64	/* Maximum number of subsystems allowed in
-				 * DiagChannel... */
-#define LOW_SUBSYSTEMS 32	/* Half of MAX_SUBSYSTEMS to allow 64-bit
-				 * math */
-#define SUBSYSTEM_DEBUG 0	/* Standard subsystem for debug events */
-#define SUBSYSTEM_DEFAULT 1	/* Default subsystem for legacy calls to
-				 * ReportEvent */
-
-/* few useful subsystem mask values */
-#define SUBSYSTEM_MASK_DEBUG	0x01	/* Standard subsystem for debug
-					 * events */
-#define SUBSYSTEM_MASK_DEFAULT  0x02	/* Default subsystem for legacy calls to
-					 * ReportEvents */
-
-/* Event parameter "Severity" is overloaded with Cause in byte 2 and Severity in
- * byte 0, bytes 1 and 3 are reserved */
-#define SEVERITY_MASK 0x0FF	/* mask out all but the Severity in byte 0 */
-#define CAUSE_MASK 0x0FF0000	/* mask out all but the cause in byte 2 */
-#define CAUSE_SHIFT_AMT 16	/* shift 2 bytes to place it in byte 2 */
-
-/* SubsystemSeverityFilter */
-#define SEVERITY_FILTER_MASK 0x0F /* mask out the Cause half, SeverityFilter is
-				   * in the lower nibble */
-#define CAUSE_FILTER_MASK 0xF0	/* mask out the Severity half, CauseFilter is in
-				 * the upper nibble */
-#define CAUSE_FILTER_SHIFT_AMT	4 /* shift amount to place it in lower or upper
-				   * nibble */
-
-/* Copied from EFI's EFI_TIME struct in efidef.h.  EFI headers are not allowed
-* in some of the Supervisor areas, such as Monitor, so it has been "ported" here
-* for use in diagnostic event timestamps... */
-struct diag_efi_time  {
-	u16 year;		/* 1998 - 20XX */
-	u8 month;		/* 1 - 12 */
-	u8 day;			/* 1 - 31 */
-	u8 hour;		/* 0 - 23 */
-	u8 minute;		/* 0 - 59 */
-	u8 second;		/* 0 - 59 */
-	u8 pad1;
-	u32 nanosecond;	/* 0 - 999, 999, 999 */
-	s16 timezone;		/* -1440 to 1440 or 2047 */
-	u8 daylight;
-	u8 pad2;
-};
-
-enum spar_component_types  {
-	 ULTRA_COMPONENT_GUEST = 0,
-	 ULTRA_COMPONENT_MONITOR = 0x01,
-	 ULTRA_COMPONENT_CCM = 0x02,	/* Common Control module */
-	 /* RESERVED 0x03 - 0x7 */
-
-	 /* Ultravisor Components */
-	 ULTRA_COMPONENT_BOOT = 0x08,
-	 ULTRA_COMPONENT_IDLE = 0x09,
-	 ULTRA_COMPONENT_CONTROL = 0x0A,
-	 ULTRA_COMPONENT_LOGGER = 0x0B,
-	 ULTRA_COMPONENT_ACPI = 0X0C,
-	 /* RESERVED 0x0D - 0x0F */
-
-	 /* sPAR Components */
-	 ULTRA_COMPONENT_COMMAND = 0x10,
-	 ULTRA_COMPONENT_IODRIVER = 0x11,
-	 ULTRA_COMPONENT_CONSOLE = 0x12,
-	 ULTRA_COMPONENT_OPERATIONS = 0x13,
-	 ULTRA_COMPONENT_MANAGEMENT = 0x14,
-	 ULTRA_COMPONENT_DIAG = 0x15,
-	 ULTRA_COMPONENT_HWDIAG = 0x16,
-	 ULTRA_COMPONENT_PSERVICES = 0x17,
-	 ULTRA_COMPONENT_PDIAG = 0x18
-	 /* RESERVED 0x18 - 0x1F */
-};
-
-/* Structure: diag_channel_event Purpose: Contains attributes that make up an
- * event to be written to the DIAG_CHANNEL memory.  Attributes: EventId: Id of
- * the diagnostic event to write to memory.  Severity: Severity of the event
- * (Error, Info, etc).  ModuleName: Module/file name where event originated.
- * LineNumber: Line number in module name where event originated.  Timestamp:
- * Date/time when event was received by ReportEvent, and written to DiagChannel.
- * Reserved: Padding to align structure on a 64-byte cache line boundary.
- * AdditionalInfo: Array of characters for additional event info (may be
- * empty).  */
-struct diag_channel_event {
-	u32 event_id;
-	u32 severity;
-	u8 module_name[MAX_MODULE_NAME_SIZE];
-	u32 line_number;
-	struct diag_efi_time timestamp;	/* Size = 16 bytes */
-	u32 partition_number;	/* Filled in by Diag Switch as pool blocks are
-				 * filled */
-	u16 vcpu_number;
-	u16 lcpu_number;
-	u8 component_type;	/* ULTRA_COMPONENT_TYPES */
-	u8 subsystem;
-	u16 reserved0;		/* pad to u64 alignment */
-	u32 block_no;		/* filled in by DiagSwitch as pool blocks are
-				 * filled */
-	u32 block_no_high;
-	u32 event_no;		/* filled in by DiagSwitch as pool blocks are
-				 * filled */
-	u32 event_no_high;
-
-	/* The block_no and event_no fields are set only by DiagSwitch
-	 * and referenced only by WinDiagDisplay formatting tool as
-	 * additional diagnostic information.  Other tools including
-	 * WinDiagDisplay currently ignore these 'Reserved' bytes. */
-	u8 reserved[8];
-	u8 additional_info[MAX_ADDITIONAL_INFO_SIZE];
-
-	/* NOTE: Changes to diag_channel_event generally need to be reflected in
-	 * existing copies *
-	 * - for AppOS at
-	 * GuestLinux/visordiag_early/supervisor_diagchannel.h *
-	 * - for WinDiagDisplay at
-	 * EFI/Ultra/Tools/WinDiagDisplay/WinDiagDisplay/diagstruct.h */
-};
-
-/* Levels of severity for diagnostic events, in order from lowest severity to
-* highest (i.e. fatal errors are the most severe, and should always be logged,
-* but info events rarely need to be logged except during debugging).  The values
-* DIAG_SEVERITY_ENUM_BEGIN and DIAG_SEVERITY_ENUM_END are not valid severity
-* values.  They exist merely to dilineate the list, so that future additions
-* won't require changes to the driver (i.e. when checking for out-of-range
-* severities in SetSeverity).  The values DIAG_SEVERITY_OVERRIDE and
-* DIAG_SEVERITY_SHUTOFF are not valid severity values for logging events but
-* they are valid for controlling the amount of event data.  This enum is also
-* defined in DotNet\sParFramework\ControlFramework\ControlFramework.cs.  If a
-* change is made to this enum, they should also be reflected in that file.  */
-enum diag_severity {
-		DIAG_SEVERITY_ENUM_BEGIN = 0,
-		DIAG_SEVERITY_OVERRIDE = DIAG_SEVERITY_ENUM_BEGIN,
-		DIAG_SEVERITY_VERBOSE = DIAG_SEVERITY_OVERRIDE,	/* 0 */
-		DIAG_SEVERITY_INFO = DIAG_SEVERITY_VERBOSE + 1,	/* 1 */
-		DIAG_SEVERITY_WARNING = DIAG_SEVERITY_INFO + 1,	/* 2 */
-		DIAG_SEVERITY_ERR = DIAG_SEVERITY_WARNING + 1,	/* 3 */
-		DIAG_SEVERITY_PRINT = DIAG_SEVERITY_ERR + 1,	/* 4 */
-		DIAG_SEVERITY_SHUTOFF = DIAG_SEVERITY_PRINT + 1, /* 5 */
-		DIAG_SEVERITY_ENUM_END = DIAG_SEVERITY_SHUTOFF,	/* 5 */
-		DIAG_SEVERITY_NONFATAL_ERR = DIAG_SEVERITY_ERR,
-		DIAG_SEVERITY_FATAL_ERR = DIAG_SEVERITY_PRINT
-};
-
-/* Event Cause enums
-*
-* Levels of cause for diagnostic events, in order from least to greatest cause
-* Internal errors are most urgent since ideally they should never exist
-* Invalid requests are preventable by avoiding invalid inputs
-* Operations errors depend on environmental factors which may impact which
-* requests are possible
-* Manifest provides intermediate value to capture firmware and configuration
-* version information
-* Trace provides suplimental debug information in release firmware
-* Unknown Log captures unclasified LogEvent calls.
-* Debug is the least urgent since it provides suplimental debug information only
-* in debug firmware
-* Unknown Debug captures unclassified DebugEvent calls.
-* This enum is also defined in
-* DotNet\sParFramework\ControlFramework\ControlFramework.cs.
-* If a change is made to this enum, they should also be reflected in that
-* file.  */
-
-/* A cause value "DIAG_CAUSE_FILE_XFER" together with a severity value of
-* "DIAG_SEVERITY_PRINT" (=4), is used for transferring text or binary file to
-* the Diag partition. This cause-severity combination will be used by Logger
-* DiagSwitch to segregate events into block types. The files are transferred in
-* 256 byte chunks maximum, in the AdditionalInfo field of the diag_channel_event
-* structure. In the file transfer mode, some event fields will have different
-* meaning: EventId specifies the file offset, severity specifies the block type,
-* ModuleName specifies the filename, LineNumber specifies the number of valid
-* data bytes in an event and AdditionalInfo contains up to 256 bytes of data. */
-
-/* The Diag DiagWriter appends event blocks to events.raw as today, and for data
- * blocks uses diag_channel_event
- * PartitionNumber to extract and append 'AdditionalInfo' to filename (specified
- * by ModuleName). */
-
-/* The Dell PDiag uses this new mechanism to stash DSET .zip onto the
- * 'diagnostic' virtual disk.  */
-enum diag_cause {
-	DIAG_CAUSE_UNKNOWN = 0,
-	DIAG_CAUSE_UNKNOWN_DEBUG = DIAG_CAUSE_UNKNOWN + 1,	/* 1 */
-	DIAG_CAUSE_DEBUG = DIAG_CAUSE_UNKNOWN_DEBUG + 1,	/* 2 */
-	DIAG_CAUSE_UNKNOWN_LOG = DIAG_CAUSE_DEBUG + 1,	/* 3 */
-	DIAG_CAUSE_TRACE = DIAG_CAUSE_UNKNOWN_LOG + 1,	/* 4 */
-	DIAG_CAUSE_MANIFEST = DIAG_CAUSE_TRACE + 1,	/* 5 */
-	DIAG_CAUSE_OPERATIONS_ERROR = DIAG_CAUSE_MANIFEST + 1,	/* 6 */
-	DIAG_CAUSE_INVALID_REQUEST = DIAG_CAUSE_OPERATIONS_ERROR + 1,	/* 7 */
-	DIAG_CAUSE_INTERNAL_ERROR = DIAG_CAUSE_INVALID_REQUEST + 1, /* 8 */
-	DIAG_CAUSE_FILE_XFER = DIAG_CAUSE_INTERNAL_ERROR + 1,	/* 9 */
-	DIAG_CAUSE_ENUM_END = DIAG_CAUSE_FILE_XFER	/* 9 */
-};
-
-/* Event Cause category defined into the byte 2 of Severity */
-#define CAUSE_DEBUG (DIAG_CAUSE_DEBUG << CAUSE_SHIFT_AMT)
-#define CAUSE_TRACE (DIAG_CAUSE_TRACE << CAUSE_SHIFT_AMT)
-#define CAUSE_MANIFEST (DIAG_CAUSE_MANIFEST << CAUSE_SHIFT_AMT)
-#define CAUSE_OPERATIONS_ERROR (DIAG_CAUSE_OPERATIONS_ERROR << CAUSE_SHIFT_AMT)
-#define CAUSE_INVALID_REQUEST (DIAG_CAUSE_INVALID_REQUEST << CAUSE_SHIFT_AMT)
-#define CAUSE_INTERNAL_ERROR (DIAG_CAUSE_INTERNAL_ERROR << CAUSE_SHIFT_AMT)
-#define CAUSE_FILE_XFER (DIAG_CAUSE_FILE_XFER << CAUSE_SHIFT_AMT)
-#define CAUSE_ENUM_END CAUSE_FILE_XFER
-
-/* Combine Cause and Severity categories into one */
-#define CAUSE_DEBUG_SEVERITY_VERBOSE \
-	(CAUSE_DEBUG | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_TRACE_SEVERITY_VERBOSE \
-	(CAUSE_TRACE | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_MANIFEST_SEVERITY_VERBOSE\
-	(CAUSE_MANIFEST | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_OPERATIONS_SEVERITY_VERBOSE \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_INVALID_SEVERITY_VERBOSE \
-	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_INTERNAL_SEVERITY_VERBOSE \
-	(CAUSE_INTERNAL_ERROR   | DIAG_SEVERITY_VERBOSE)
-
-#define CAUSE_DEBUG_SEVERITY_INFO \
-	(CAUSE_DEBUG | DIAG_SEVERITY_INFO)
-#define CAUSE_TRACE_SEVERITY_INFO \
-	(CAUSE_TRACE | DIAG_SEVERITY_INFO)
-#define CAUSE_MANIFEST_SEVERITY_INFO \
-	(CAUSE_MANIFEST | DIAG_SEVERITY_INFO)
-#define CAUSE_OPERATIONS_SEVERITY_INFO \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_INFO)
-#define CAUSE_INVALID_SEVERITY_INFO \
-	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_INFO)
-#define CAUSE_INTERNAL_SEVERITY_INFO \
-	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_INFO)
-
-#define CAUSE_DEBUG_SEVERITY_WARN \
-	(CAUSE_DEBUG | DIAG_SEVERITY_WARNING)
-#define CAUSE_TRACE_SEVERITY_WARN \
-	(CAUSE_TRACE | DIAG_SEVERITY_WARNING)
-#define CAUSE_MANIFEST_SEVERITY_WARN \
-	(CAUSE_MANIFEST | DIAG_SEVERITY_WARNING)
-#define CAUSE_OPERATIONS_SEVERITY_WARN \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_WARNING)
-#define CAUSE_INVALID_SEVERITY_WARN \
-	(CAUSE_INVALID_REQUEST | DIAG_SEVERITY_WARNING)
-#define CAUSE_INTERNAL_SEVERITY_WARN \
-	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_WARNING)
-
-#define CAUSE_DEBUG_SEVERITY_ERR \
-	(CAUSE_DEBUG | DIAG_SEVERITY_ERR)
-#define CAUSE_TRACE_SEVERITY_ERR \
-	(CAUSE_TRACE | DIAG_SEVERITY_ERR)
-#define CAUSE_MANIFEST_SEVERITY_ERR \
-	(CAUSE_MANIFEST | DIAG_SEVERITY_ERR)
-#define CAUSE_OPERATIONS_SEVERITY_ERR \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_ERR)
-#define CAUSE_INVALID_SEVERITY_ERR \
-	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_ERR)
-#define CAUSE_INTERNAL_SEVERITY_ERR \
-	(CAUSE_INTERNAL_ERROR   | DIAG_SEVERITY_ERR)
-
-#define CAUSE_DEBUG_SEVERITY_PRINT \
-	(CAUSE_DEBUG | DIAG_SEVERITY_PRINT)
-#define CAUSE_TRACE_SEVERITY_PRINT \
-	(CAUSE_TRACE | DIAG_SEVERITY_PRINT)
-#define CAUSE_MANIFEST_SEVERITY_PRINT \
-	(CAUSE_MANIFEST | DIAG_SEVERITY_PRINT)
-#define CAUSE_OPERATIONS_SEVERITY_PRINT \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_PRINT)
-#define CAUSE_INVALID_SEVERITY_PRINT \
-	(CAUSE_INVALID_REQUEST | DIAG_SEVERITY_PRINT)
-#define CAUSE_INTERNAL_SEVERITY_PRINT \
-	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_PRINT)
-#define CAUSE_FILE_XFER_SEVERITY_PRINT \
-	(CAUSE_FILE_XFER | DIAG_SEVERITY_PRINT)
-
-/* Structure: diag_channel_protocol_header
- *
- * Purpose: Contains attributes that make up the header specific to the
- * DIAG_CHANNEL area.
- *
- * Attributes:
- *
- * DiagLock: Diag Channel spinlock.
- *
- *IsChannelInitialized: 1 iff SignalInit was called for this channel; otherwise
- *			0, and assume the channel is not ready for use yet.
- *
- * Reserved: Padding to align the fields in this structure.
- *
- *SubsystemSeverityFilter: Level of severity on a subsystem basis that controls
- *			whether events are logged.  Any event's severity for a
- *			particular subsystem below this level will be discarded.
- */
-struct diag_channel_protocol_header {
-	u32 diag_lock;
-	u8 channel_initialized;
-	u8 reserved[3];
-	u8 subsystem_severity_filter[64];
-};
-
-/* The Diagram for the Diagnostic Channel: */
-/* ----------------------- */
-/* | Channel Header        |	Defined by ULTRA_CHANNEL_PROTOCOL */
-/* ----------------------- */
-/* | Signal Queue Header   |	Defined by SIGNAL_QUEUE_HEADER */
-/* ----------------------- */
-/* | DiagChannel Header    |	Defined by diag_channel_protocol_header */
-/* ----------------------- */
-/* | Channel Event Info    |	Defined by diag_channel_event*MAX_EVENTS */
-/* ----------------------- */
-/* | Reserved              |	Reserved (pad out to 4MB) */
-/* ----------------------- */
-
-/* Offsets/sizes for diagnostic channel attributes... */
-#define DIAG_CH_QUEUE_HEADER_OFFSET (sizeof(struct channel_header))
-#define DIAG_CH_QUEUE_HEADER_SIZE (sizeof(struct signal_queue_header))
-#define DIAG_CH_PROTOCOL_HEADER_OFFSET \
-	(DIAG_CH_QUEUE_HEADER_OFFSET + DIAG_CH_QUEUE_HEADER_SIZE)
-#define DIAG_CH_PROTOCOL_HEADER_SIZE \
-	(sizeof(struct diag_channel_protocol_header))
-#define DIAG_CH_EVENT_OFFSET \
-	(DIAG_CH_PROTOCOL_HEADER_OFFSET + DIAG_CH_PROTOCOL_HEADER_SIZE)
-#define DIAG_CH_SIZE (4096 * 1024)
-
-/* For Control and Idle Partitions with larger (8 MB) diagnostic(root)
- * channels */
-#define DIAG_CH_LRG_SIZE (2 * DIAG_CH_SIZE)	/* 8 MB */
-
-/*
- * Structure: spar_diag_channel_protocol
- *
- * Purpose: Contains attributes that make up the DIAG_CHANNEL memory.
- *
- * Attributes:
- *
- * CommonChannelHeader:	Header info common to all channels.
- *
- * QueueHeader: Queue header common to all channels - used to determine where to
- * store event.
- *
- * DiagChannelHeader: Diagnostic channel header info (see
- * diag_channel_protocol_header comments).
- *
- * Events: Area where diagnostic events (up to MAX_EVENTS) are written.
- *
- *Reserved: Reserved area to allow for correct channel size padding.
-*/
-struct spar_diag_channel_protocol  {
-	struct channel_header common_channel_header;
-	struct signal_queue_header queue_header;
-	struct diag_channel_protocol_header diag_channel_header;
-	struct diag_channel_event events[(DIAG_CH_SIZE - DIAG_CH_EVENT_OFFSET) /
-				   sizeof(struct diag_channel_event)];
-};
-
-#endif
diff --git a/drivers/staging/unisys/include/diagchannel.h b/drivers/staging/unisys/include/diagchannel.h
new file mode 100644
index 0000000..e8fb867
--- /dev/null
+++ b/drivers/staging/unisys/include/diagchannel.h
@@ -0,0 +1,427 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+/*++
+ *
+ * Module Name:
+ *
+ * diagchannel.h
+ *
+ * Abstract:
+ *
+ * This file defines the DiagChannel protocol.  This protocol is used to aid in
+ * preserving event data sent by external applications.  This protocol provides
+ * a region for event data to reside in.  This data will eventually be sent to
+ * the Boot Partition where it will be committed to memory and/or disk.  This
+ * file contains platform-independent data that can be built using any
+ * Supervisor build environment (Windows, Linux, EFI).
+ *
+*/
+
+#ifndef _DIAG_CHANNEL_H_
+#define _DIAG_CHANNEL_H_
+
+#include <linux/uuid.h>
+#include "channel.h"
+
+/* {EEA7A573-DB82-447c-8716-EFBEAAAE4858} */
+#define SPAR_DIAG_CHANNEL_PROTOCOL_UUID \
+		UUID_LE(0xeea7a573, 0xdb82, 0x447c, \
+				0x87, 0x16, 0xef, 0xbe, 0xaa, 0xae, 0x48, 0x58)
+
+static const uuid_le spar_diag_channel_protocol_uuid =
+	SPAR_DIAG_CHANNEL_PROTOCOL_UUID;
+
+/* {E850F968-3263-4484-8CA5-2A35D087A5A8} */
+#define ULTRA_DIAG_ROOT_CHANNEL_PROTOCOL_GUID \
+		UUID_LE(0xe850f968, 0x3263, 0x4484, \
+				0x8c, 0xa5, 0x2a, 0x35, 0xd0, 0x87, 0xa5, 0xa8)
+
+#define ULTRA_DIAG_CHANNEL_PROTOCOL_SIGNATURE  ULTRA_CHANNEL_PROTOCOL_SIGNATURE
+
+/* Must increment this whenever you insert or delete fields within this channel
+* struct.  Also increment whenever you change the meaning of fields within this
+* channel struct so as to break pre-existing software.  Note that you can
+* usually add fields to the END of the channel struct withOUT needing to
+* increment this. */
+#define ULTRA_DIAG_CHANNEL_PROTOCOL_VERSIONID 2
+
+#define SPAR_DIAG_CHANNEL_OK_CLIENT(ch)\
+	(spar_check_channel_client(ch,\
+				   spar_diag_channel_protocol_uuid,\
+				   "diag",\
+				   sizeof(struct spar_diag_channel_protocol),\
+				   ULTRA_DIAG_CHANNEL_PROTOCOL_VERSIONID,\
+				   ULTRA_DIAG_CHANNEL_PROTOCOL_SIGNATURE))
+
+#define SPAR_DIAG_CHANNEL_OK_SERVER(bytes)\
+	(spar_check_channel_server(spar_diag_channel_protocol_uuid,\
+				   "diag",\
+				   sizeof(struct spar_diag_channel_protocol),\
+				   bytes))
+
+#define MAX_MODULE_NAME_SIZE 128	/* Maximum length of module name... */
+#define MAX_ADDITIONAL_INFO_SIZE 256	/* Maximum length of any additional info
+					 * accompanying event... */
+#define MAX_SUBSYSTEMS 64	/* Maximum number of subsystems allowed in
+				 * DiagChannel... */
+#define LOW_SUBSYSTEMS 32	/* Half of MAX_SUBSYSTEMS to allow 64-bit
+				 * math */
+#define SUBSYSTEM_DEBUG 0	/* Standard subsystem for debug events */
+#define SUBSYSTEM_DEFAULT 1	/* Default subsystem for legacy calls to
+				 * ReportEvent */
+
+/* few useful subsystem mask values */
+#define SUBSYSTEM_MASK_DEBUG	0x01	/* Standard subsystem for debug
+					 * events */
+#define SUBSYSTEM_MASK_DEFAULT  0x02	/* Default subsystem for legacy calls to
+					 * ReportEvents */
+
+/* Event parameter "Severity" is overloaded with Cause in byte 2 and Severity in
+ * byte 0, bytes 1 and 3 are reserved */
+#define SEVERITY_MASK 0x0FF	/* mask out all but the Severity in byte 0 */
+#define CAUSE_MASK 0x0FF0000	/* mask out all but the cause in byte 2 */
+#define CAUSE_SHIFT_AMT 16	/* shift 2 bytes to place it in byte 2 */
+
+/* SubsystemSeverityFilter */
+#define SEVERITY_FILTER_MASK 0x0F /* mask out the Cause half, SeverityFilter is
+				   * in the lower nibble */
+#define CAUSE_FILTER_MASK 0xF0	/* mask out the Severity half, CauseFilter is in
+				 * the upper nibble */
+#define CAUSE_FILTER_SHIFT_AMT	4 /* shift amount to place it in lower or upper
+				   * nibble */
+
+/* Copied from EFI's EFI_TIME struct in efidef.h.  EFI headers are not allowed
+* in some of the Supervisor areas, such as Monitor, so it has been "ported" here
+* for use in diagnostic event timestamps... */
+struct diag_efi_time  {
+	u16 year;		/* 1998 - 20XX */
+	u8 month;		/* 1 - 12 */
+	u8 day;			/* 1 - 31 */
+	u8 hour;		/* 0 - 23 */
+	u8 minute;		/* 0 - 59 */
+	u8 second;		/* 0 - 59 */
+	u8 pad1;
+	u32 nanosecond;	/* 0 - 999, 999, 999 */
+	s16 timezone;		/* -1440 to 1440 or 2047 */
+	u8 daylight;
+	u8 pad2;
+};
+
+enum spar_component_types  {
+	 ULTRA_COMPONENT_GUEST = 0,
+	 ULTRA_COMPONENT_MONITOR = 0x01,
+	 ULTRA_COMPONENT_CCM = 0x02,	/* Common Control module */
+	 /* RESERVED 0x03 - 0x7 */
+
+	 /* Ultravisor Components */
+	 ULTRA_COMPONENT_BOOT = 0x08,
+	 ULTRA_COMPONENT_IDLE = 0x09,
+	 ULTRA_COMPONENT_CONTROL = 0x0A,
+	 ULTRA_COMPONENT_LOGGER = 0x0B,
+	 ULTRA_COMPONENT_ACPI = 0X0C,
+	 /* RESERVED 0x0D - 0x0F */
+
+	 /* sPAR Components */
+	 ULTRA_COMPONENT_COMMAND = 0x10,
+	 ULTRA_COMPONENT_IODRIVER = 0x11,
+	 ULTRA_COMPONENT_CONSOLE = 0x12,
+	 ULTRA_COMPONENT_OPERATIONS = 0x13,
+	 ULTRA_COMPONENT_MANAGEMENT = 0x14,
+	 ULTRA_COMPONENT_DIAG = 0x15,
+	 ULTRA_COMPONENT_HWDIAG = 0x16,
+	 ULTRA_COMPONENT_PSERVICES = 0x17,
+	 ULTRA_COMPONENT_PDIAG = 0x18
+	 /* RESERVED 0x18 - 0x1F */
+};
+
+/* Structure: diag_channel_event Purpose: Contains attributes that make up an
+ * event to be written to the DIAG_CHANNEL memory.  Attributes: EventId: Id of
+ * the diagnostic event to write to memory.  Severity: Severity of the event
+ * (Error, Info, etc).  ModuleName: Module/file name where event originated.
+ * LineNumber: Line number in module name where event originated.  Timestamp:
+ * Date/time when event was received by ReportEvent, and written to DiagChannel.
+ * Reserved: Padding to align structure on a 64-byte cache line boundary.
+ * AdditionalInfo: Array of characters for additional event info (may be
+ * empty).  */
+struct diag_channel_event {
+	u32 event_id;
+	u32 severity;
+	u8 module_name[MAX_MODULE_NAME_SIZE];
+	u32 line_number;
+	struct diag_efi_time timestamp;	/* Size = 16 bytes */
+	u32 partition_number;	/* Filled in by Diag Switch as pool blocks are
+				 * filled */
+	u16 vcpu_number;
+	u16 lcpu_number;
+	u8 component_type;	/* ULTRA_COMPONENT_TYPES */
+	u8 subsystem;
+	u16 reserved0;		/* pad to u64 alignment */
+	u32 block_no;		/* filled in by DiagSwitch as pool blocks are
+				 * filled */
+	u32 block_no_high;
+	u32 event_no;		/* filled in by DiagSwitch as pool blocks are
+				 * filled */
+	u32 event_no_high;
+
+	/* The block_no and event_no fields are set only by DiagSwitch
+	 * and referenced only by WinDiagDisplay formatting tool as
+	 * additional diagnostic information.  Other tools including
+	 * WinDiagDisplay currently ignore these 'Reserved' bytes. */
+	u8 reserved[8];
+	u8 additional_info[MAX_ADDITIONAL_INFO_SIZE];
+
+	/* NOTE: Changes to diag_channel_event generally need to be reflected in
+	 * existing copies *
+	 * - for AppOS at
+	 * GuestLinux/visordiag_early/supervisor_diagchannel.h *
+	 * - for WinDiagDisplay at
+	 * EFI/Ultra/Tools/WinDiagDisplay/WinDiagDisplay/diagstruct.h */
+};
+
+/* Levels of severity for diagnostic events, in order from lowest severity to
+* highest (i.e. fatal errors are the most severe, and should always be logged,
+* but info events rarely need to be logged except during debugging).  The values
+* DIAG_SEVERITY_ENUM_BEGIN and DIAG_SEVERITY_ENUM_END are not valid severity
+* values.  They exist merely to dilineate the list, so that future additions
+* won't require changes to the driver (i.e. when checking for out-of-range
+* severities in SetSeverity).  The values DIAG_SEVERITY_OVERRIDE and
+* DIAG_SEVERITY_SHUTOFF are not valid severity values for logging events but
+* they are valid for controlling the amount of event data.  This enum is also
+* defined in DotNet\sParFramework\ControlFramework\ControlFramework.cs.  If a
+* change is made to this enum, they should also be reflected in that file.  */
+enum diag_severity {
+		DIAG_SEVERITY_ENUM_BEGIN = 0,
+		DIAG_SEVERITY_OVERRIDE = DIAG_SEVERITY_ENUM_BEGIN,
+		DIAG_SEVERITY_VERBOSE = DIAG_SEVERITY_OVERRIDE,	/* 0 */
+		DIAG_SEVERITY_INFO = DIAG_SEVERITY_VERBOSE + 1,	/* 1 */
+		DIAG_SEVERITY_WARNING = DIAG_SEVERITY_INFO + 1,	/* 2 */
+		DIAG_SEVERITY_ERR = DIAG_SEVERITY_WARNING + 1,	/* 3 */
+		DIAG_SEVERITY_PRINT = DIAG_SEVERITY_ERR + 1,	/* 4 */
+		DIAG_SEVERITY_SHUTOFF = DIAG_SEVERITY_PRINT + 1, /* 5 */
+		DIAG_SEVERITY_ENUM_END = DIAG_SEVERITY_SHUTOFF,	/* 5 */
+		DIAG_SEVERITY_NONFATAL_ERR = DIAG_SEVERITY_ERR,
+		DIAG_SEVERITY_FATAL_ERR = DIAG_SEVERITY_PRINT
+};
+
+/* Event Cause enums
+*
+* Levels of cause for diagnostic events, in order from least to greatest cause
+* Internal errors are most urgent since ideally they should never exist
+* Invalid requests are preventable by avoiding invalid inputs
+* Operations errors depend on environmental factors which may impact which
+* requests are possible
+* Manifest provides intermediate value to capture firmware and configuration
+* version information
+* Trace provides suplimental debug information in release firmware
+* Unknown Log captures unclasified LogEvent calls.
+* Debug is the least urgent since it provides suplimental debug information only
+* in debug firmware
+* Unknown Debug captures unclassified DebugEvent calls.
+* This enum is also defined in
+* DotNet\sParFramework\ControlFramework\ControlFramework.cs.
+* If a change is made to this enum, they should also be reflected in that
+* file.  */
+
+/* A cause value "DIAG_CAUSE_FILE_XFER" together with a severity value of
+* "DIAG_SEVERITY_PRINT" (=4), is used for transferring text or binary file to
+* the Diag partition. This cause-severity combination will be used by Logger
+* DiagSwitch to segregate events into block types. The files are transferred in
+* 256 byte chunks maximum, in the AdditionalInfo field of the diag_channel_event
+* structure. In the file transfer mode, some event fields will have different
+* meaning: EventId specifies the file offset, severity specifies the block type,
+* ModuleName specifies the filename, LineNumber specifies the number of valid
+* data bytes in an event and AdditionalInfo contains up to 256 bytes of data. */
+
+/* The Diag DiagWriter appends event blocks to events.raw as today, and for data
+ * blocks uses diag_channel_event
+ * PartitionNumber to extract and append 'AdditionalInfo' to filename (specified
+ * by ModuleName). */
+
+/* The Dell PDiag uses this new mechanism to stash DSET .zip onto the
+ * 'diagnostic' virtual disk.  */
+enum diag_cause {
+	DIAG_CAUSE_UNKNOWN = 0,
+	DIAG_CAUSE_UNKNOWN_DEBUG = DIAG_CAUSE_UNKNOWN + 1,	/* 1 */
+	DIAG_CAUSE_DEBUG = DIAG_CAUSE_UNKNOWN_DEBUG + 1,	/* 2 */
+	DIAG_CAUSE_UNKNOWN_LOG = DIAG_CAUSE_DEBUG + 1,	/* 3 */
+	DIAG_CAUSE_TRACE = DIAG_CAUSE_UNKNOWN_LOG + 1,	/* 4 */
+	DIAG_CAUSE_MANIFEST = DIAG_CAUSE_TRACE + 1,	/* 5 */
+	DIAG_CAUSE_OPERATIONS_ERROR = DIAG_CAUSE_MANIFEST + 1,	/* 6 */
+	DIAG_CAUSE_INVALID_REQUEST = DIAG_CAUSE_OPERATIONS_ERROR + 1,	/* 7 */
+	DIAG_CAUSE_INTERNAL_ERROR = DIAG_CAUSE_INVALID_REQUEST + 1, /* 8 */
+	DIAG_CAUSE_FILE_XFER = DIAG_CAUSE_INTERNAL_ERROR + 1,	/* 9 */
+	DIAG_CAUSE_ENUM_END = DIAG_CAUSE_FILE_XFER	/* 9 */
+};
+
+/* Event Cause category defined into the byte 2 of Severity */
+#define CAUSE_DEBUG (DIAG_CAUSE_DEBUG << CAUSE_SHIFT_AMT)
+#define CAUSE_TRACE (DIAG_CAUSE_TRACE << CAUSE_SHIFT_AMT)
+#define CAUSE_MANIFEST (DIAG_CAUSE_MANIFEST << CAUSE_SHIFT_AMT)
+#define CAUSE_OPERATIONS_ERROR (DIAG_CAUSE_OPERATIONS_ERROR << CAUSE_SHIFT_AMT)
+#define CAUSE_INVALID_REQUEST (DIAG_CAUSE_INVALID_REQUEST << CAUSE_SHIFT_AMT)
+#define CAUSE_INTERNAL_ERROR (DIAG_CAUSE_INTERNAL_ERROR << CAUSE_SHIFT_AMT)
+#define CAUSE_FILE_XFER (DIAG_CAUSE_FILE_XFER << CAUSE_SHIFT_AMT)
+#define CAUSE_ENUM_END CAUSE_FILE_XFER
+
+/* Combine Cause and Severity categories into one */
+#define CAUSE_DEBUG_SEVERITY_VERBOSE \
+	(CAUSE_DEBUG | DIAG_SEVERITY_VERBOSE)
+#define CAUSE_TRACE_SEVERITY_VERBOSE \
+	(CAUSE_TRACE | DIAG_SEVERITY_VERBOSE)
+#define CAUSE_MANIFEST_SEVERITY_VERBOSE\
+	(CAUSE_MANIFEST | DIAG_SEVERITY_VERBOSE)
+#define CAUSE_OPERATIONS_SEVERITY_VERBOSE \
+	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_VERBOSE)
+#define CAUSE_INVALID_SEVERITY_VERBOSE \
+	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_VERBOSE)
+#define CAUSE_INTERNAL_SEVERITY_VERBOSE \
+	(CAUSE_INTERNAL_ERROR   | DIAG_SEVERITY_VERBOSE)
+
+#define CAUSE_DEBUG_SEVERITY_INFO \
+	(CAUSE_DEBUG | DIAG_SEVERITY_INFO)
+#define CAUSE_TRACE_SEVERITY_INFO \
+	(CAUSE_TRACE | DIAG_SEVERITY_INFO)
+#define CAUSE_MANIFEST_SEVERITY_INFO \
+	(CAUSE_MANIFEST | DIAG_SEVERITY_INFO)
+#define CAUSE_OPERATIONS_SEVERITY_INFO \
+	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_INFO)
+#define CAUSE_INVALID_SEVERITY_INFO \
+	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_INFO)
+#define CAUSE_INTERNAL_SEVERITY_INFO \
+	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_INFO)
+
+#define CAUSE_DEBUG_SEVERITY_WARN \
+	(CAUSE_DEBUG | DIAG_SEVERITY_WARNING)
+#define CAUSE_TRACE_SEVERITY_WARN \
+	(CAUSE_TRACE | DIAG_SEVERITY_WARNING)
+#define CAUSE_MANIFEST_SEVERITY_WARN \
+	(CAUSE_MANIFEST | DIAG_SEVERITY_WARNING)
+#define CAUSE_OPERATIONS_SEVERITY_WARN \
+	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_WARNING)
+#define CAUSE_INVALID_SEVERITY_WARN \
+	(CAUSE_INVALID_REQUEST | DIAG_SEVERITY_WARNING)
+#define CAUSE_INTERNAL_SEVERITY_WARN \
+	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_WARNING)
+
+#define CAUSE_DEBUG_SEVERITY_ERR \
+	(CAUSE_DEBUG | DIAG_SEVERITY_ERR)
+#define CAUSE_TRACE_SEVERITY_ERR \
+	(CAUSE_TRACE | DIAG_SEVERITY_ERR)
+#define CAUSE_MANIFEST_SEVERITY_ERR \
+	(CAUSE_MANIFEST | DIAG_SEVERITY_ERR)
+#define CAUSE_OPERATIONS_SEVERITY_ERR \
+	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_ERR)
+#define CAUSE_INVALID_SEVERITY_ERR \
+	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_ERR)
+#define CAUSE_INTERNAL_SEVERITY_ERR \
+	(CAUSE_INTERNAL_ERROR   | DIAG_SEVERITY_ERR)
+
+#define CAUSE_DEBUG_SEVERITY_PRINT \
+	(CAUSE_DEBUG | DIAG_SEVERITY_PRINT)
+#define CAUSE_TRACE_SEVERITY_PRINT \
+	(CAUSE_TRACE | DIAG_SEVERITY_PRINT)
+#define CAUSE_MANIFEST_SEVERITY_PRINT \
+	(CAUSE_MANIFEST | DIAG_SEVERITY_PRINT)
+#define CAUSE_OPERATIONS_SEVERITY_PRINT \
+	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_PRINT)
+#define CAUSE_INVALID_SEVERITY_PRINT \
+	(CAUSE_INVALID_REQUEST | DIAG_SEVERITY_PRINT)
+#define CAUSE_INTERNAL_SEVERITY_PRINT \
+	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_PRINT)
+#define CAUSE_FILE_XFER_SEVERITY_PRINT \
+	(CAUSE_FILE_XFER | DIAG_SEVERITY_PRINT)
+
+/* Structure: diag_channel_protocol_header
+ *
+ * Purpose: Contains attributes that make up the header specific to the
+ * DIAG_CHANNEL area.
+ *
+ * Attributes:
+ *
+ * DiagLock: Diag Channel spinlock.
+ *
+ *IsChannelInitialized: 1 iff SignalInit was called for this channel; otherwise
+ *			0, and assume the channel is not ready for use yet.
+ *
+ * Reserved: Padding to align the fields in this structure.
+ *
+ *SubsystemSeverityFilter: Level of severity on a subsystem basis that controls
+ *			whether events are logged.  Any event's severity for a
+ *			particular subsystem below this level will be discarded.
+ */
+struct diag_channel_protocol_header {
+	u32 diag_lock;
+	u8 channel_initialized;
+	u8 reserved[3];
+	u8 subsystem_severity_filter[64];
+};
+
+/* The Diagram for the Diagnostic Channel: */
+/* ----------------------- */
+/* | Channel Header        |	Defined by ULTRA_CHANNEL_PROTOCOL */
+/* ----------------------- */
+/* | Signal Queue Header   |	Defined by SIGNAL_QUEUE_HEADER */
+/* ----------------------- */
+/* | DiagChannel Header    |	Defined by diag_channel_protocol_header */
+/* ----------------------- */
+/* | Channel Event Info    |	Defined by diag_channel_event*MAX_EVENTS */
+/* ----------------------- */
+/* | Reserved              |	Reserved (pad out to 4MB) */
+/* ----------------------- */
+
+/* Offsets/sizes for diagnostic channel attributes... */
+#define DIAG_CH_QUEUE_HEADER_OFFSET (sizeof(struct channel_header))
+#define DIAG_CH_QUEUE_HEADER_SIZE (sizeof(struct signal_queue_header))
+#define DIAG_CH_PROTOCOL_HEADER_OFFSET \
+	(DIAG_CH_QUEUE_HEADER_OFFSET + DIAG_CH_QUEUE_HEADER_SIZE)
+#define DIAG_CH_PROTOCOL_HEADER_SIZE \
+	(sizeof(struct diag_channel_protocol_header))
+#define DIAG_CH_EVENT_OFFSET \
+	(DIAG_CH_PROTOCOL_HEADER_OFFSET + DIAG_CH_PROTOCOL_HEADER_SIZE)
+#define DIAG_CH_SIZE (4096 * 1024)
+
+/* For Control and Idle Partitions with larger (8 MB) diagnostic(root)
+ * channels */
+#define DIAG_CH_LRG_SIZE (2 * DIAG_CH_SIZE)	/* 8 MB */
+
+/*
+ * Structure: spar_diag_channel_protocol
+ *
+ * Purpose: Contains attributes that make up the DIAG_CHANNEL memory.
+ *
+ * Attributes:
+ *
+ * CommonChannelHeader:	Header info common to all channels.
+ *
+ * QueueHeader: Queue header common to all channels - used to determine where to
+ * store event.
+ *
+ * DiagChannelHeader: Diagnostic channel header info (see
+ * diag_channel_protocol_header comments).
+ *
+ * Events: Area where diagnostic events (up to MAX_EVENTS) are written.
+ *
+ *Reserved: Reserved area to allow for correct channel size padding.
+*/
+struct spar_diag_channel_protocol  {
+	struct channel_header common_channel_header;
+	struct signal_queue_header queue_header;
+	struct diag_channel_protocol_header diag_channel_header;
+	struct diag_channel_event events[(DIAG_CH_SIZE - DIAG_CH_EVENT_OFFSET) /
+				   sizeof(struct diag_channel_event)];
+};
+
+#endif
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 13/44] staging: unisys: Move files out of common-spar
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (11 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 12/44] staging: unisys: Move diagchannel to include Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-24 20:28   ` Greg KH
  2015-05-13 17:22 ` [PATCH 14/44] staging: unisys: Get rid of references to common-spar Benjamin Romer
                   ` (30 subsequent siblings)
  43 siblings, 1 reply; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Jes.Sorensen, driverdev-devel, sparmaintainer, David Kershner,
	Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Move last three files out of common-spar

iochannel.h --> include (will be used by visorhba and visornic)
version.h --> moved to include
controlvmcompletionstatus.h --> moved to visorbus, part of
		controlvmchannel.h

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 .../common-spar/include/channels/iochannel.h       | 651 ---------------------
 .../include/controlvmcompletionstatus.h            |  94 ---
 .../staging/unisys/common-spar/include/version.h   |  45 --
 drivers/staging/unisys/include/iochannel.h         | 651 +++++++++++++++++++++
 drivers/staging/unisys/include/version.h           |  45 ++
 .../unisys/visorbus/controlvmcompletionstatus.h    |  94 +++
 6 files changed, 790 insertions(+), 790 deletions(-)
 delete mode 100644 drivers/staging/unisys/common-spar/include/channels/iochannel.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/controlvmcompletionstatus.h
 delete mode 100644 drivers/staging/unisys/common-spar/include/version.h
 create mode 100644 drivers/staging/unisys/include/iochannel.h
 create mode 100644 drivers/staging/unisys/include/version.h
 create mode 100644 drivers/staging/unisys/visorbus/controlvmcompletionstatus.h

diff --git a/drivers/staging/unisys/common-spar/include/channels/iochannel.h b/drivers/staging/unisys/common-spar/include/channels/iochannel.h
deleted file mode 100644
index cbb5875..0000000
--- a/drivers/staging/unisys/common-spar/include/channels/iochannel.h
+++ /dev/null
@@ -1,651 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION */
-/* All rights reserved. */
-#ifndef __IOCHANNEL_H__
-#define __IOCHANNEL_H__
-
-/*
- * Everything needed for IOPart-GuestPart communication is define in
- * this file.  Note: Everything is OS-independent because this file is
- * used by Windows, Linux and possible EFI drivers.  */
-
-/*
- * Communication flow between the IOPart and GuestPart uses the channel headers
- * channel state.  The following states are currently being used:
- *       UNINIT(All Zeroes), CHANNEL_ATTACHING, CHANNEL_ATTACHED, CHANNEL_OPENED
- *
- * additional states will be used later.  No locking is needed to switch between
- * states due to the following rules:
- *
- *      1.  IOPart is only the only partition allowed to change from UNIT
- *      2.  IOPart is only the only partition allowed to change from
- *		CHANNEL_ATTACHING
- *      3.  GuestPart is only the only partition allowed to change from
- *		CHANNEL_ATTACHED
- *
- * The state changes are the following: IOPart sees the channel is in UNINIT,
- *        UNINIT -> CHANNEL_ATTACHING (performed only by IOPart)
- *        CHANNEL_ATTACHING -> CHANNEL_ATTACHED (performed only by IOPart)
- *        CHANNEL_ATTACHED -> CHANNEL_OPENED (performed only by GuestPart)
- */
-
-#include <linux/uuid.h>
-
-#include "vmcallinterface.h"
-
-#define _ULTRA_CONTROLVM_CHANNEL_INLINE_
-#include <linux/dma-direction.h>
-#include "controlvmchannel.h"
-#include "vbuschannel.h"
-#undef _ULTRA_CONTROLVM_CHANNEL_INLINE_
-#include "channel.h"
-#include "channel_guid.h"
-
-#define ULTRA_VHBA_CHANNEL_PROTOCOL_SIGNATURE ULTRA_CHANNEL_PROTOCOL_SIGNATURE
-#define ULTRA_VNIC_CHANNEL_PROTOCOL_SIGNATURE ULTRA_CHANNEL_PROTOCOL_SIGNATURE
-#define ULTRA_VSWITCH_CHANNEL_PROTOCOL_SIGNATURE \
-	ULTRA_CHANNEL_PROTOCOL_SIGNATURE
-
-/* Must increment these whenever you insert or delete fields within this channel
- * struct.  Also increment whenever you change the meaning of fields within this
- * channel struct so as to break pre-existing software.  Note that you can
- * usually add fields to the END of the channel struct withOUT needing to
- * increment this.
- */
-#define ULTRA_VHBA_CHANNEL_PROTOCOL_VERSIONID 2
-#define ULTRA_VNIC_CHANNEL_PROTOCOL_VERSIONID 2
-#define ULTRA_VSWITCH_CHANNEL_PROTOCOL_VERSIONID 1
-
-#define SPAR_VHBA_CHANNEL_OK_CLIENT(ch)			\
-	(spar_check_channel_client(ch, spar_vhba_channel_protocol_uuid, \
-				   "vhba", MIN_IO_CHANNEL_SIZE,	\
-				   ULTRA_VHBA_CHANNEL_PROTOCOL_VERSIONID, \
-				   ULTRA_VHBA_CHANNEL_PROTOCOL_SIGNATURE))
-
-#define SPAR_VNIC_CHANNEL_OK_CLIENT(ch)			\
-	(spar_check_channel_client(ch, spar_vnic_channel_protocol_uuid, \
-				   "vnic", MIN_IO_CHANNEL_SIZE,	\
-				   ULTRA_VNIC_CHANNEL_PROTOCOL_VERSIONID, \
-				   ULTRA_VNIC_CHANNEL_PROTOCOL_SIGNATURE))
-
-/*
- * Everything necessary to handle SCSI & NIC traffic between Guest Partition and
- * IO Partition is defined below.
- */
-
-/*
- * Defines and enums.
- */
-
-#define MINNUM(a, b) (((a) < (b)) ? (a) : (b))
-#define MAXNUM(a, b) (((a) > (b)) ? (a) : (b))
-
-/* these define the two queues per data channel between iopart and
- * ioguestparts
- */
-#define IOCHAN_TO_IOPART 0 /* used by ioguestpart to 'insert' signals to
-			    * iopart */
-
-#define IOCHAN_FROM_IOPART 1 /* used by ioguestpart to 'remove' signals from
-			      * iopart - same queue as previous queue */
-
-/* size of cdb - i.e., scsi cmnd */
-#define MAX_CMND_SIZE 16
-
-#define MAX_SENSE_SIZE 64
-
-#define MAX_PHYS_INFO 64
-
-/* various types of network packets that can be sent in cmdrsp */
-enum net_types {
-	NET_RCV_POST = 0,	/* submit buffer to hold receiving
-				 * incoming packet */
-	/* virtnic -> uisnic */
-	NET_RCV,		/* incoming packet received */
-	/* uisnic -> virtpci */
-	NET_XMIT,		/* for outgoing net packets      */
-	/* virtnic -> uisnic */
-	NET_XMIT_DONE,		/* outgoing packet xmitted */
-	/* uisnic -> virtpci */
-	NET_RCV_ENBDIS,		/* enable/disable packet reception */
-	/* virtnic -> uisnic */
-	NET_RCV_ENBDIS_ACK,	/* acknowledge enable/disable packet
-				 * reception */
-	/* uisnic -> virtnic */
-	NET_RCV_PROMISC,	/* enable/disable promiscuous mode */
-	/* virtnic -> uisnic */
-	NET_CONNECT_STATUS,	/* indicate the loss or restoration of a network
-				 * connection */
-	/* uisnic -> virtnic */
-	NET_MACADDR,		/* indicates the client has requested to update
-				 * its MAC addr */
-	NET_MACADDR_ACK,	/* MAC address */
-
-};
-
-#define		ETH_HEADER_SIZE 14	/* size of ethernet header */
-
-#define		ETH_MIN_DATA_SIZE 46	/* minimum eth data size */
-#define		ETH_MIN_PACKET_SIZE (ETH_HEADER_SIZE + ETH_MIN_DATA_SIZE)
-
-#define		ETH_MAX_MTU 16384	/* maximum data size */
-
-#ifndef MAX_MACADDR_LEN
-#define MAX_MACADDR_LEN 6	/* number of bytes in MAC address */
-#endif				/* MAX_MACADDR_LEN */
-
-/* various types of scsi task mgmt commands  */
-enum task_mgmt_types {
-	TASK_MGMT_ABORT_TASK = 1,
-	TASK_MGMT_BUS_RESET,
-	TASK_MGMT_LUN_RESET,
-	TASK_MGMT_TARGET_RESET,
-};
-
-/* various types of vdisk mgmt commands  */
-enum vdisk_mgmt_types {
-	VDISK_MGMT_ACQUIRE = 1,
-	VDISK_MGMT_RELEASE,
-};
-
-/* structs with pragma pack  */
-
-/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
-/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
-
-#pragma pack(push, 1)
-
-struct guest_phys_info {
-	u64 address;
-	u64 length;
-};
-
-#define GPI_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof(struct guest_phys_info))
-
-struct uisscsi_dest {
-	u32 channel;		/* channel == bus number */
-	u32 id;			/* id == target number */
-	u32 lun;		/* lun == logical unit number */
-};
-
-struct vhba_wwnn {
-	u32 wwnn1;
-	u32 wwnn2;
-};
-
-/* WARNING: Values stired in this structure must contain maximum counts (not
- * maximum values). */
-struct vhba_config_max {	/* 20 bytes */
-	u32 max_channel;	/* maximum channel for devices attached to this
-				 * bus */
-	u32 max_id;		/* maximum SCSI ID for devices attached to this
-				 * bus */
-	u32 max_lun;		/* maximum SCSI LUN for devices attached to this
-				 * bus */
-	u32 cmd_per_lun;	/* maximum number of outstanding commands per
-				 * lun that are allowed at one time */
-	u32 max_io_size;	/* maximum io size for devices attached to this
-				 * bus */
-	/* max io size is often determined by the resource of the hba. e.g */
-	/* max scatter gather list length * page size / sector size */
-};
-
-struct uiscmdrsp_scsi {
-	void *scsicmd;		/* the handle to the cmd that was received -
-				 * send it back as is in the rsp packet.  */
-	u8 cmnd[MAX_CMND_SIZE];	/* the cdb for the command */
-	u32 bufflen;		/* length of data to be transferred out or in */
-	u16 guest_phys_entries;	/* Number of entries in scatter-gather (sg)
-				 * list */
-	struct guest_phys_info gpi_list[MAX_PHYS_INFO];	/* physical address
-							 * information for each
-							 * fragment */
-	enum dma_data_direction  data_dir; /* direction of the data, if any */
-	struct uisscsi_dest vdest;	/* identifies the virtual hba, id,
-					 * channel, lun to which cmd was sent */
-
-	    /* the following fields are needed to queue the rsp back to cmd
-	     * originator */
-	int linuxstat;		/* the original Linux status - for use by linux
-				 * vdisk code */
-	u8 scsistat;		/* the scsi status */
-	u8 addlstat;		/* non-scsi status - covers cases like timeout
-				 * needed by windows guests */
-#define ADDL_SEL_TIMEOUT	4
-
-	/* the following fields are need to determine the result of command */
-	 u8 sensebuf[MAX_SENSE_SIZE];	/* sense info in case cmd failed; */
-	/* it holds the sense_data struct; */
-	/* see that struct for details. */
-	void *vdisk; /* contains pointer to the vdisk so that we can clean up
-		      * when the IO completes. */
-	int no_disk_result;
-	/* used to return no disk inquiry result
-	 * when no_disk_result is set to 1,
-	 * scsi.scsistat is SAM_STAT_GOOD
-	 * scsi.addlstat is 0
-	 * scsi.linuxstat is SAM_STAT_GOOD
-	 * That is, there is NO error.
-	 */
-};
-
-/* Defines to support sending correct inquiry result when no disk is
- * configured.
- */
-
-/* From SCSI SPC2 -
- *
- * If the target is not capable of supporting a device on this logical unit, the
- * device server shall set this field to 7Fh (PERIPHERAL QUALIFIER set to 011b
- * and PERIPHERAL DEVICE TYPE set to 1Fh).
- *
- *The device server is capable of supporting the specified peripheral device
- *type on this logical unit. However, the physical device is not currently
- *connected to this logical unit.
- */
-
-#define DEV_NOT_CAPABLE 0x7f	/* peripheral qualifier of 0x3  */
-				/* peripheral type of 0x1f */
-				/* specifies no device but target present */
-
-#define DEV_DISK_CAPABLE_NOT_PRESENT 0x20 /* peripheral qualifier of 0x1 */
-    /* peripheral type of 0 - disk */
-    /* specifies device capable, but not present */
-
-#define DEV_HISUPPORT 0x10	/* HiSup = 1; shows support for report luns */
-				/* must be returned for lun 0. */
-
-/* NOTE: Linux code assumes inquiry contains 36 bytes. Without checking length
- * in buf[4] some linux code accesses bytes beyond 5 to retrieve vendor, product
- * & revision.  Yikes! So let us always send back 36 bytes, the minimum for
- * inquiry result.
- */
-#define NO_DISK_INQUIRY_RESULT_LEN 36
-
-#define MIN_INQUIRY_RESULT_LEN 5 /* we need at least 5 bytes minimum for inquiry
-				  * result */
-
-/* SCSI device version for no disk inquiry result */
-#define SCSI_SPC2_VER 4		/* indicates SCSI SPC2 (SPC3 is 5) */
-
-/* Windows and Linux want different things for a non-existent lun. So, we'll let
- * caller pass in the peripheral qualifier and type.
- * NOTE:[4] SCSI returns (n-4); so we return length-1-4 or length-5. */
-
-#define SET_NO_DISK_INQUIRY_RESULT(buf, len, lun, lun0notpresent, notpresent) \
-	do {								\
-		memset(buf, 0,						\
-		       MINNUM(len,					\
-			      (unsigned int)NO_DISK_INQUIRY_RESULT_LEN)); \
-		buf[2] = (u8)SCSI_SPC2_VER;				\
-		if (lun == 0) {						\
-			buf[0] = (u8)lun0notpresent;			\
-			buf[3] = (u8)DEV_HISUPPORT;			\
-		} else							\
-			buf[0] = (u8)notpresent;			\
-		buf[4] = (u8)(						\
-			MINNUM(len,					\
-			       (unsigned int)NO_DISK_INQUIRY_RESULT_LEN) - 5);\
-		if (len >= NO_DISK_INQUIRY_RESULT_LEN) {		\
-			buf[8] = 'D';					\
-			buf[9] = 'E';					\
-			buf[10] = 'L';					\
-			buf[11] = 'L';					\
-			buf[16] = 'P';					\
-			buf[17] = 'S';					\
-			buf[18] = 'E';					\
-			buf[19] = 'U';					\
-			buf[20] = 'D';					\
-			buf[21] = 'O';					\
-			buf[22] = ' ';					\
-			buf[23] = 'D';					\
-			buf[24] = 'E';					\
-			buf[25] = 'V';					\
-			buf[26] = 'I';					\
-			buf[27] = 'C';					\
-			buf[28] = 'E';					\
-			buf[30] = ' ';					\
-			buf[31] = '.';					\
-		}							\
-	} while (0)
-
-/*
- * Struct & Defines to support sense information.
- */
-
-/* The following struct is returned in sensebuf field in uiscmdrsp_scsi.  It is
- * initialized in exactly the manner that is recommended in Windows (hence the
- * odd values).
- * When set, these fields will have the following values:
- * ErrorCode = 0x70		indicates current error
- * Valid = 1			indicates sense info is valid
- * SenseKey			contains sense key as defined by SCSI specs.
- * AdditionalSenseCode		contains sense key as defined by SCSI specs.
- * AdditionalSenseCodeQualifier	contains qualifier to sense code as defined by
- *				scsi docs.
- * AdditionalSenseLength	contains will be sizeof(sense_data)-8=10.
- */
-struct sense_data {
-	u8 errorcode:7;
-	u8 valid:1;
-	u8 segment_number;
-	u8 sense_key:4;
-	u8 reserved:1;
-	u8 incorrect_length:1;
-	u8 end_of_media:1;
-	u8 file_mark:1;
-	u8 information[4];
-	u8 additional_sense_length;
-	u8 command_specific_information[4];
-	u8 additional_sense_code;
-	u8 additional_sense_code_qualifier;
-	u8 fru_code;
-	u8 sense_key_specific[3];
-};
-
-struct net_pkt_xmt {
-	int len;	/* full length of data in the packet */
-	int num_frags;	/* number of fragments in frags containing data */
-	struct phys_info frags[MAX_PHYS_INFO];	/* physical page information for
-						 * each fragment */
-	char ethhdr[ETH_HEADER_SIZE];	/* the ethernet header  */
-	struct {
-		    /* these are needed for csum at uisnic end */
-		u8 valid;	/* 1 = rest of this struct is valid - else
-				 * ignore */
-		u8 hrawoffv;	/* 1 = hwrafoff is valid */
-		u8 nhrawoffv;	/* 1 = nhwrafoff is valid */
-		u16 protocol;	/* specifies packet protocol */
-		u32 csum;	/* value used to set skb->csum at IOPart */
-		u32 hrawoff;	/* value used to set skb->h.raw at IOPart */
-		/* hrawoff points to the start of the TRANSPORT LAYER HEADER */
-		u32 nhrawoff;	/* value used to set skb->nh.raw at IOPart */
-		/* nhrawoff points to the start of the NETWORK LAYER HEADER */
-	} lincsum;
-
-	    /* **** NOTE ****
-	     * The full packet is described in frags but the ethernet header is
-	     * separately kept in ethhdr so that uisnic doesn't have "MAP" the
-	     * guest memory to get to the header. uisnic needs ethhdr to
-	     * determine how to route the packet.
-	     */
-};
-
-struct net_pkt_xmtdone {
-	u32 xmt_done_result;	/* result of NET_XMIT */
-};
-
-/* RCVPOST_BUF_SIZe must be at most page_size(4096) - cache_line_size (64) The
- * reason is because dev_skb_alloc which is used to generate RCV_POST skbs in
- * virtnic requires that there is "overhead" in the buffer, and pads 16 bytes. I
- * prefer to use 1 full cache line size for "overhead" so that transfers are
- * better.  IOVM requires that a buffer be represented by 1 phys_info structure
- * which can only cover page_size.
- */
-#define RCVPOST_BUF_SIZE 4032
-#define MAX_NET_RCV_CHAIN \
-	((ETH_MAX_MTU+ETH_HEADER_SIZE + RCVPOST_BUF_SIZE-1) / RCVPOST_BUF_SIZE)
-
-struct net_pkt_rcvpost {
-	    /* rcv buf size must be large enough to include ethernet data len +
-	     * ethernet header len - we are choosing 2K because it is guaranteed
-	     * to be describable */
-	    struct phys_info frag;	/* physical page information for the
-					 * single fragment 2K rcv buf */
-	    u64 unique_num;		/* This is used to make sure that
-					 * receive posts are returned to  */
-	    /* the Adapter which we sent them originally. */
-};
-
-struct net_pkt_rcv {
-	/* the number of receive buffers that can be chained  */
-	/* is based on max mtu and size of each rcv buf */
-	u32 rcv_done_len;	/* length of received data */
-	u8 numrcvbufs;		/* number of receive buffers that contain the */
-	/* incoming data; guest end MUST chain these together. */
-	void *rcvbuf[MAX_NET_RCV_CHAIN];	/* the list of receive buffers
-						 * that must be chained; */
-	/* each entry is a receive buffer provided by NET_RCV_POST. */
-	/* NOTE: first rcvbuf in the chain will also be provided in net.buf. */
-	u64 unique_num;
-	u32 rcvs_dropped_delta;
-};
-
-struct net_pkt_enbdis {
-	void *context;
-	u16 enable;		/* 1 = enable, 0 = disable */
-};
-
-struct net_pkt_macaddr {
-	void *context;
-	u8 macaddr[MAX_MACADDR_LEN];	/* 6 bytes */
-};
-
-/* cmd rsp packet used for VNIC network traffic  */
-struct uiscmdrsp_net {
-	enum net_types type;
-	void *buf;
-	union {
-		struct net_pkt_xmt xmt;		/* used for NET_XMIT */
-		struct net_pkt_xmtdone xmtdone;	/* used for NET_XMIT_DONE */
-		struct net_pkt_rcvpost rcvpost;	/* used for NET_RCV_POST */
-		struct net_pkt_rcv rcv;		/* used for NET_RCV */
-		struct net_pkt_enbdis enbdis;	/* used for NET_RCV_ENBDIS, */
-						/* NET_RCV_ENBDIS_ACK,  */
-						/* NET_RCV_PROMSIC, */
-						/* and NET_CONNECT_STATUS */
-		struct net_pkt_macaddr macaddr;
-	};
-};
-
-struct uiscmdrsp_scsitaskmgmt {
-	enum task_mgmt_types tasktype;
-
-	    /* the type of task */
-	struct uisscsi_dest vdest;
-
-	    /* the vdisk for which this task mgmt is generated */
-	void *scsicmd;
-
-	    /* This is some handle that the guest has saved off for its own use.
-	     * Its value is preserved by iopart & returned as is in the task
-	     * mgmt rsp.
-	     */
-	void *notify;
-
-	   /* For linux guests, this is a pointer to wait_queue_head that a
-	    * thread is waiting on to see if the taskmgmt command has completed.
-	    * For windows guests, this is a pointer to a location that a waiting
-	    * thread is testing to see if the taskmgmt command has completed.
-	    * When the rsp is received by guest, the thread receiving the
-	    * response uses this to notify the thread waiting for taskmgmt
-	    * command completion.  Its value is preserved by iopart & returned
-	    * as is in the task mgmt rsp.
-	    */
-	void *notifyresult;
-
-	    /* this is a handle to location in guest where the result of the
-	     * taskmgmt command (result field) is to saved off when the response
-	     * is handled.  Its value is preserved by iopart & returned as is in
-	     * the task mgmt rsp.
-	     */
-	char result;
-
-	    /* result of taskmgmt command - set by IOPart - values are: */
-#define TASK_MGMT_FAILED  0
-};
-
-/* The following is used by uissd to send disk add/remove notifications to
- * Guest */
-/* Note that the vHba pointer is not used by the Client/Guest side. */
-struct uiscmdrsp_disknotify {
-	u8 add;			/* 0-remove, 1-add */
-	void *v_hba;		/* Pointer to vhba_info for channel info to
-				 * route msg */
-	u32 channel, id, lun;	/* SCSI Path of Disk to added or removed */
-};
-
-/* The following is used by virthba/vSCSI to send the Acquire/Release commands
- * to the IOVM. */
-struct uiscmdrsp_vdiskmgmt {
-	enum vdisk_mgmt_types vdisktype;
-
-	    /* the type of task */
-	struct uisscsi_dest vdest;
-
-	    /* the vdisk for which this task mgmt is generated */
-	void *scsicmd;
-
-	    /* This is some handle that the guest has saved off for its own use.
-	     * Its value is preserved by iopart & returned as is in the task
-	     * mgmt rsp.
-	     */
-	void *notify;
-
-	    /* For linux guests, this is a pointer to wait_queue_head that a
-	     * thread is waiting on to see if the tskmgmt command has completed.
-	     * For win32 guests, this is a pointer to a location that a waiting
-	     * thread is testing to see if the taskmgmt command has completed.
-	     * When the rsp is received by guest, the thread receiving the
-	     * response uses this to notify the thread waiting for taskmgmt
-	     * command completion.  Its value is preserved by iopart & returned
-	     * as is in the task mgmt rsp.
-	     */
-	void *notifyresult;
-
-	    /* this is a handle to location in guest where the result of the
-	     * taskmgmt command (result field) is to saved off when the response
-	     * is handled.  Its value is preserved by iopart & returned as is in
-	     * the task mgmt rsp.
-	     */
-	char result;
-
-	    /* result of taskmgmt command - set by IOPart - values are: */
-#define VDISK_MGMT_FAILED  0
-};
-
-/* keeping cmd & rsp info in one structure for now cmd rsp packet for scsi */
-struct uiscmdrsp {
-	char cmdtype;
-
-/* describes what type of information is in the struct */
-#define CMD_SCSI_TYPE		1
-#define CMD_NET_TYPE		2
-#define CMD_SCSITASKMGMT_TYPE	3
-#define CMD_NOTIFYGUEST_TYPE	4
-#define CMD_VDISKMGMT_TYPE	5
-	union {
-		struct uiscmdrsp_scsi scsi;
-		struct uiscmdrsp_net net;
-		struct uiscmdrsp_scsitaskmgmt scsitaskmgmt;
-		struct uiscmdrsp_disknotify disknotify;
-		struct uiscmdrsp_vdiskmgmt vdiskmgmt;
-	};
-	void *private_data;	/* used to send the response when the cmd is
-				 * done (scsi & scsittaskmgmt). */
-	struct uiscmdrsp *next;	/* General Purpose Queue Link */
-	struct uiscmdrsp *activeQ_next;	/* Used to track active commands */
-	struct uiscmdrsp *activeQ_prev;	/* Used to track active commands */
-};
-
-/* This is just the header of the IO channel.  It is assumed that directly after
- * this header there is a large region of memory which contains the command and
- * response queues as specified in cmd_q and rsp_q SIGNAL_QUEUE_HEADERS.
- */
-struct spar_io_channel_protocol {
-	struct channel_header channel_header;
-	struct signal_queue_header cmd_q;
-	struct signal_queue_header rsp_q;
-	union {
-		struct {
-			struct vhba_wwnn wwnn;		/* 8 bytes */
-			struct vhba_config_max max;	/* 20 bytes */
-		} vhba;					/* total = 28 bytes */
-		struct {
-			u8 macaddr[MAX_MACADDR_LEN];	/* 6 bytes */
-			u32 num_rcv_bufs;		/* 4 bytes */
-			u32 mtu;			/* 4 bytes */
-			uuid_le zone_uuid;		/* 16 bytes */
-		} vnic;					/* total = 30 bytes */
-	};
-
-#define MAX_CLIENTSTRING_LEN 1024
-	 u8 client_string[MAX_CLIENTSTRING_LEN];/* NULL terminated - so holds
-						 * max - 1 bytes */
-};
-
-#pragma pack(pop)
-/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
-
-/*
- * INLINE functions for initializing and accessing I/O data channels
- */
-
-#define SIZEOF_PROTOCOL (COVER(sizeof(struct spar_io_channel_protocol), 64))
-#define SIZEOF_CMDRSP (COVER(sizeof(struct uiscmdrsp), 64))
-
-#define MIN_IO_CHANNEL_SIZE COVER(SIZEOF_PROTOCOL + \
-				  2 * MIN_NUMSIGNALS * SIZEOF_CMDRSP, 4096)
-
-/*
- * INLINE function for expanding a guest's pfn-off-size into multiple 4K page
- * pfn-off-size entires.
- */
-
-/* we deal with 4K page sizes when we it comes to passing page information
- * between */
-/* Guest and IOPartition. */
-#define PI_PAGE_SIZE  0x1000
-#define PI_PAGE_MASK  0x0FFF
-
-/* returns next non-zero index on success or zero on failure (i.e. out of
- * room)
- */
-static inline  u16
-add_physinfo_entries(u32 inp_pfn,	/* input - specifies the pfn to be used
-					 * to add entries */
-		     u16 inp_off,	/* input - specifies the off to be used
-					 * to add entries */
-		     u32 inp_len,	/* input - specifies the len to be used
-					 * to add entries */
-		     u16 index,		/* input - index in array at which new
-					 * entries are added */
-		     u16 max_pi_arr_entries,	/* input - specifies the maximum
-						 * entries pi_arr can hold */
-		     struct phys_info pi_arr[]) /* input & output - array to
-						  * which entries are added */
-{
-	u32 len;
-	u16 i, firstlen;
-
-	firstlen = PI_PAGE_SIZE - inp_off;
-	if (inp_len <= firstlen) {
-		/* the input entry spans only one page - add as is */
-		if (index >= max_pi_arr_entries)
-			return 0;
-		pi_arr[index].pi_pfn = inp_pfn;
-		pi_arr[index].pi_off = (u16)inp_off;
-		pi_arr[index].pi_len = (u16)inp_len;
-		    return index + 1;
-	}
-
-	    /* this entry spans multiple pages */
-	    for (len = inp_len, i = 0; len;
-		 len -= pi_arr[index + i].pi_len, i++) {
-		if (index + i >= max_pi_arr_entries)
-			return 0;
-		pi_arr[index + i].pi_pfn = inp_pfn + i;
-		if (i == 0) {
-			pi_arr[index].pi_off = inp_off;
-			pi_arr[index].pi_len = firstlen;
-		}
-
-		else {
-			pi_arr[index + i].pi_off = 0;
-			pi_arr[index + i].pi_len =
-			    (u16)MINNUM(len, (u32)PI_PAGE_SIZE);
-		}
-	}
-	return index + i;
-}
-
-#endif				/* __IOCHANNEL_H__ */
diff --git a/drivers/staging/unisys/common-spar/include/controlvmcompletionstatus.h b/drivers/staging/unisys/common-spar/include/controlvmcompletionstatus.h
deleted file mode 100644
index f74f5d8..0000000
--- a/drivers/staging/unisys/common-spar/include/controlvmcompletionstatus.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/* controlvmcompletionstatus.c
- *
- * Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/*  Defines for all valid values returned in the response message header
- *  completionStatus field.  See controlvmchannel.h for description of
- *  the header: _CONTROLVM_MESSAGE_HEADER.
- */
-
-#ifndef __CONTROLVMCOMPLETIONSTATUS_H__
-#define __CONTROLVMCOMPLETIONSTATUS_H__
-
-/* General Errors------------------------------------------------------[0-99] */
-#define CONTROLVM_RESP_SUCCESS                                  0
-#define CONTROLVM_RESP_ERROR_ALREADY_DONE                       1
-#define CONTROLVM_RESP_ERROR_IOREMAP_FAILED                     2
-#define CONTROLVM_RESP_ERROR_KMALLOC_FAILED                     3
-#define CONTROLVM_RESP_ERROR_MESSAGE_ID_UNKNOWN                 4
-#define CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT      5
-
-/* CONTROLVM_INIT_CHIPSET-------------------------------------------[100-199] */
-#define CONTROLVM_RESP_ERROR_CLIENT_SWITCHCOUNT_NONZERO         100
-#define CONTROLVM_RESP_ERROR_EXPECTED_CHIPSET_INIT              101
-
-/* Maximum Limit----------------------------------------------------[200-299] */
-#define CONTROLVM_RESP_ERROR_MAX_BUSES		201	/* BUS_CREATE */
-#define CONTROLVM_RESP_ERROR_MAX_DEVICES        202	/* DEVICE_CREATE */
-/* Payload and Parameter Related------------------------------------[400-499] */
-#define CONTROLVM_RESP_ERROR_PAYLOAD_INVALID	400	/* SWITCH_ATTACHEXTPORT,
-							 * DEVICE_CONFIGURE */
-#define CONTROLVM_RESP_ERROR_INITIATOR_PARAMETER_INVALID 401	/* Multiple */
-#define CONTROLVM_RESP_ERROR_TARGET_PARAMETER_INVALID 402 /* DEVICE_CONFIGURE */
-#define CONTROLVM_RESP_ERROR_CLIENT_PARAMETER_INVALID 403 /* DEVICE_CONFIGURE */
-/* Specified[Packet Structure] Value-------------------------------[500-599] */
-#define CONTROLVM_RESP_ERROR_BUS_INVALID	500	/* SWITCH_ATTACHINTPORT,
-							 * BUS_CONFIGURE,
-							 * DEVICE_CREATE,
-							 * DEVICE_CONFIG
-							 * DEVICE_DESTROY */
-#define CONTROLVM_RESP_ERROR_DEVICE_INVALID	501 /* SWITCH_ATTACHINTPORT */
-						    /* DEVICE_CREATE,
-						     * DEVICE_CONFIGURE,
-						     * DEVICE_DESTROY */
-#define CONTROLVM_RESP_ERROR_CHANNEL_INVALID	502 /* DEVICE_CREATE,
-						     * DEVICE_CONFIGURE */
-/* Partition Driver Callback Interface----------------------[600-699] */
-#define CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_FAILURE 604	/* BUS_CREATE,
-							 * BUS_DESTROY,
-							 * DEVICE_CREATE,
-							 * DEVICE_DESTROY */
-/* Unable to invoke VIRTPCI callback */
-#define CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_CALLBACK_ERROR 605
-							/* BUS_CREATE,
-							 * BUS_DESTROY,
-							 * DEVICE_CREATE,
-							 * DEVICE_DESTROY */
-/* VIRTPCI Callback returned error */
-#define CONTROLVM_RESP_ERROR_GENERIC_DRIVER_CALLBACK_ERROR 606
-							/* SWITCH_ATTACHEXTPORT,
-							 * SWITCH_DETACHEXTPORT
-							 * DEVICE_CONFIGURE */
-
-/* generic device callback returned error */
-/* Bus Related------------------------------------------------------[700-799] */
-#define CONTROLVM_RESP_ERROR_BUS_DEVICE_ATTACHED 700	/* BUS_DESTROY */
-/* Channel Related--------------------------------------------------[800-899] */
-#define CONTROLVM_RESP_ERROR_CHANNEL_TYPE_UNKNOWN 800	/* GET_CHANNELINFO,
-							 * DEVICE_DESTROY */
-#define CONTROLVM_RESP_ERROR_CHANNEL_SIZE_TOO_SMALL 801	/* DEVICE_CREATE */
-/* Chipset Shutdown Related---------------------------------------[1000-1099] */
-#define CONTROLVM_RESP_ERROR_CHIPSET_SHUTDOWN_FAILED            1000
-#define CONTROLVM_RESP_ERROR_CHIPSET_SHUTDOWN_ALREADY_ACTIVE    1001
-
-/* Chipset Stop Related-------------------------------------------[1100-1199] */
-#define CONTROLVM_RESP_ERROR_CHIPSET_STOP_FAILED_BUS            1100
-#define CONTROLVM_RESP_ERROR_CHIPSET_STOP_FAILED_SWITCH         1101
-
-/* Device Related-------------------------------------------------[1400-1499] */
-#define CONTROLVM_RESP_ERROR_DEVICE_UDEV_TIMEOUT                1400
-
-#endif /* __CONTROLVMCOMPLETIONSTATUS_H__ not defined */
diff --git a/drivers/staging/unisys/common-spar/include/version.h b/drivers/staging/unisys/common-spar/include/version.h
deleted file mode 100644
index 83d1da7..0000000
--- a/drivers/staging/unisys/common-spar/include/version.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/* version.h */
-
-/*  Common version/release info needed by all components goes here.
- *  (This file must compile cleanly in all environments.)
- *  Ultimately, this will be combined with defines generated dynamically as
- *  part of the sysgen, and some of the defines below may in fact end up
- *  being replaced with dynamically generated ones.
- */
-#ifndef __VERSION_H__
-#define __VERSION_H__
-
-#define SPARVER1 "1"
-#define SPARVER2 "0"
-#define SPARVER3 "0"
-#define SPARVER4 "0"
-
-#define  VERSION        SPARVER1 "." SPARVER2 "." SPARVER3 "." SPARVER4
-
-/* Here are various version forms needed in Windows environments.
- */
-#define VISOR_PRODUCTVERSION      SPARVERCOMMA
-#define VISOR_PRODUCTVERSION_STR  SPARVER1 "." SPARVER2 "." SPARVER3 "." \
-	SPARVER4
-#define VISOR_OBJECTVERSION_STR   SPARVER1 "," SPARVER2 "," SPARVER3 "," \
-	SPARVER4
-
-#define  COPYRIGHT      "Unisys Corporation"
-#define  COPYRIGHTDATE  "2010 - 2013"
-
-#endif
diff --git a/drivers/staging/unisys/include/iochannel.h b/drivers/staging/unisys/include/iochannel.h
new file mode 100644
index 0000000..cbb5875
--- /dev/null
+++ b/drivers/staging/unisys/include/iochannel.h
@@ -0,0 +1,651 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION */
+/* All rights reserved. */
+#ifndef __IOCHANNEL_H__
+#define __IOCHANNEL_H__
+
+/*
+ * Everything needed for IOPart-GuestPart communication is define in
+ * this file.  Note: Everything is OS-independent because this file is
+ * used by Windows, Linux and possible EFI drivers.  */
+
+/*
+ * Communication flow between the IOPart and GuestPart uses the channel headers
+ * channel state.  The following states are currently being used:
+ *       UNINIT(All Zeroes), CHANNEL_ATTACHING, CHANNEL_ATTACHED, CHANNEL_OPENED
+ *
+ * additional states will be used later.  No locking is needed to switch between
+ * states due to the following rules:
+ *
+ *      1.  IOPart is only the only partition allowed to change from UNIT
+ *      2.  IOPart is only the only partition allowed to change from
+ *		CHANNEL_ATTACHING
+ *      3.  GuestPart is only the only partition allowed to change from
+ *		CHANNEL_ATTACHED
+ *
+ * The state changes are the following: IOPart sees the channel is in UNINIT,
+ *        UNINIT -> CHANNEL_ATTACHING (performed only by IOPart)
+ *        CHANNEL_ATTACHING -> CHANNEL_ATTACHED (performed only by IOPart)
+ *        CHANNEL_ATTACHED -> CHANNEL_OPENED (performed only by GuestPart)
+ */
+
+#include <linux/uuid.h>
+
+#include "vmcallinterface.h"
+
+#define _ULTRA_CONTROLVM_CHANNEL_INLINE_
+#include <linux/dma-direction.h>
+#include "controlvmchannel.h"
+#include "vbuschannel.h"
+#undef _ULTRA_CONTROLVM_CHANNEL_INLINE_
+#include "channel.h"
+#include "channel_guid.h"
+
+#define ULTRA_VHBA_CHANNEL_PROTOCOL_SIGNATURE ULTRA_CHANNEL_PROTOCOL_SIGNATURE
+#define ULTRA_VNIC_CHANNEL_PROTOCOL_SIGNATURE ULTRA_CHANNEL_PROTOCOL_SIGNATURE
+#define ULTRA_VSWITCH_CHANNEL_PROTOCOL_SIGNATURE \
+	ULTRA_CHANNEL_PROTOCOL_SIGNATURE
+
+/* Must increment these whenever you insert or delete fields within this channel
+ * struct.  Also increment whenever you change the meaning of fields within this
+ * channel struct so as to break pre-existing software.  Note that you can
+ * usually add fields to the END of the channel struct withOUT needing to
+ * increment this.
+ */
+#define ULTRA_VHBA_CHANNEL_PROTOCOL_VERSIONID 2
+#define ULTRA_VNIC_CHANNEL_PROTOCOL_VERSIONID 2
+#define ULTRA_VSWITCH_CHANNEL_PROTOCOL_VERSIONID 1
+
+#define SPAR_VHBA_CHANNEL_OK_CLIENT(ch)			\
+	(spar_check_channel_client(ch, spar_vhba_channel_protocol_uuid, \
+				   "vhba", MIN_IO_CHANNEL_SIZE,	\
+				   ULTRA_VHBA_CHANNEL_PROTOCOL_VERSIONID, \
+				   ULTRA_VHBA_CHANNEL_PROTOCOL_SIGNATURE))
+
+#define SPAR_VNIC_CHANNEL_OK_CLIENT(ch)			\
+	(spar_check_channel_client(ch, spar_vnic_channel_protocol_uuid, \
+				   "vnic", MIN_IO_CHANNEL_SIZE,	\
+				   ULTRA_VNIC_CHANNEL_PROTOCOL_VERSIONID, \
+				   ULTRA_VNIC_CHANNEL_PROTOCOL_SIGNATURE))
+
+/*
+ * Everything necessary to handle SCSI & NIC traffic between Guest Partition and
+ * IO Partition is defined below.
+ */
+
+/*
+ * Defines and enums.
+ */
+
+#define MINNUM(a, b) (((a) < (b)) ? (a) : (b))
+#define MAXNUM(a, b) (((a) > (b)) ? (a) : (b))
+
+/* these define the two queues per data channel between iopart and
+ * ioguestparts
+ */
+#define IOCHAN_TO_IOPART 0 /* used by ioguestpart to 'insert' signals to
+			    * iopart */
+
+#define IOCHAN_FROM_IOPART 1 /* used by ioguestpart to 'remove' signals from
+			      * iopart - same queue as previous queue */
+
+/* size of cdb - i.e., scsi cmnd */
+#define MAX_CMND_SIZE 16
+
+#define MAX_SENSE_SIZE 64
+
+#define MAX_PHYS_INFO 64
+
+/* various types of network packets that can be sent in cmdrsp */
+enum net_types {
+	NET_RCV_POST = 0,	/* submit buffer to hold receiving
+				 * incoming packet */
+	/* virtnic -> uisnic */
+	NET_RCV,		/* incoming packet received */
+	/* uisnic -> virtpci */
+	NET_XMIT,		/* for outgoing net packets      */
+	/* virtnic -> uisnic */
+	NET_XMIT_DONE,		/* outgoing packet xmitted */
+	/* uisnic -> virtpci */
+	NET_RCV_ENBDIS,		/* enable/disable packet reception */
+	/* virtnic -> uisnic */
+	NET_RCV_ENBDIS_ACK,	/* acknowledge enable/disable packet
+				 * reception */
+	/* uisnic -> virtnic */
+	NET_RCV_PROMISC,	/* enable/disable promiscuous mode */
+	/* virtnic -> uisnic */
+	NET_CONNECT_STATUS,	/* indicate the loss or restoration of a network
+				 * connection */
+	/* uisnic -> virtnic */
+	NET_MACADDR,		/* indicates the client has requested to update
+				 * its MAC addr */
+	NET_MACADDR_ACK,	/* MAC address */
+
+};
+
+#define		ETH_HEADER_SIZE 14	/* size of ethernet header */
+
+#define		ETH_MIN_DATA_SIZE 46	/* minimum eth data size */
+#define		ETH_MIN_PACKET_SIZE (ETH_HEADER_SIZE + ETH_MIN_DATA_SIZE)
+
+#define		ETH_MAX_MTU 16384	/* maximum data size */
+
+#ifndef MAX_MACADDR_LEN
+#define MAX_MACADDR_LEN 6	/* number of bytes in MAC address */
+#endif				/* MAX_MACADDR_LEN */
+
+/* various types of scsi task mgmt commands  */
+enum task_mgmt_types {
+	TASK_MGMT_ABORT_TASK = 1,
+	TASK_MGMT_BUS_RESET,
+	TASK_MGMT_LUN_RESET,
+	TASK_MGMT_TARGET_RESET,
+};
+
+/* various types of vdisk mgmt commands  */
+enum vdisk_mgmt_types {
+	VDISK_MGMT_ACQUIRE = 1,
+	VDISK_MGMT_RELEASE,
+};
+
+/* structs with pragma pack  */
+
+/* ///////////// BEGIN PRAGMA PACK PUSH 1 ///////////////////////// */
+/* ///////////// ONLY STRUCT TYPE SHOULD BE BELOW */
+
+#pragma pack(push, 1)
+
+struct guest_phys_info {
+	u64 address;
+	u64 length;
+};
+
+#define GPI_ENTRIES_PER_PAGE (PAGE_SIZE / sizeof(struct guest_phys_info))
+
+struct uisscsi_dest {
+	u32 channel;		/* channel == bus number */
+	u32 id;			/* id == target number */
+	u32 lun;		/* lun == logical unit number */
+};
+
+struct vhba_wwnn {
+	u32 wwnn1;
+	u32 wwnn2;
+};
+
+/* WARNING: Values stired in this structure must contain maximum counts (not
+ * maximum values). */
+struct vhba_config_max {	/* 20 bytes */
+	u32 max_channel;	/* maximum channel for devices attached to this
+				 * bus */
+	u32 max_id;		/* maximum SCSI ID for devices attached to this
+				 * bus */
+	u32 max_lun;		/* maximum SCSI LUN for devices attached to this
+				 * bus */
+	u32 cmd_per_lun;	/* maximum number of outstanding commands per
+				 * lun that are allowed at one time */
+	u32 max_io_size;	/* maximum io size for devices attached to this
+				 * bus */
+	/* max io size is often determined by the resource of the hba. e.g */
+	/* max scatter gather list length * page size / sector size */
+};
+
+struct uiscmdrsp_scsi {
+	void *scsicmd;		/* the handle to the cmd that was received -
+				 * send it back as is in the rsp packet.  */
+	u8 cmnd[MAX_CMND_SIZE];	/* the cdb for the command */
+	u32 bufflen;		/* length of data to be transferred out or in */
+	u16 guest_phys_entries;	/* Number of entries in scatter-gather (sg)
+				 * list */
+	struct guest_phys_info gpi_list[MAX_PHYS_INFO];	/* physical address
+							 * information for each
+							 * fragment */
+	enum dma_data_direction  data_dir; /* direction of the data, if any */
+	struct uisscsi_dest vdest;	/* identifies the virtual hba, id,
+					 * channel, lun to which cmd was sent */
+
+	    /* the following fields are needed to queue the rsp back to cmd
+	     * originator */
+	int linuxstat;		/* the original Linux status - for use by linux
+				 * vdisk code */
+	u8 scsistat;		/* the scsi status */
+	u8 addlstat;		/* non-scsi status - covers cases like timeout
+				 * needed by windows guests */
+#define ADDL_SEL_TIMEOUT	4
+
+	/* the following fields are need to determine the result of command */
+	 u8 sensebuf[MAX_SENSE_SIZE];	/* sense info in case cmd failed; */
+	/* it holds the sense_data struct; */
+	/* see that struct for details. */
+	void *vdisk; /* contains pointer to the vdisk so that we can clean up
+		      * when the IO completes. */
+	int no_disk_result;
+	/* used to return no disk inquiry result
+	 * when no_disk_result is set to 1,
+	 * scsi.scsistat is SAM_STAT_GOOD
+	 * scsi.addlstat is 0
+	 * scsi.linuxstat is SAM_STAT_GOOD
+	 * That is, there is NO error.
+	 */
+};
+
+/* Defines to support sending correct inquiry result when no disk is
+ * configured.
+ */
+
+/* From SCSI SPC2 -
+ *
+ * If the target is not capable of supporting a device on this logical unit, the
+ * device server shall set this field to 7Fh (PERIPHERAL QUALIFIER set to 011b
+ * and PERIPHERAL DEVICE TYPE set to 1Fh).
+ *
+ *The device server is capable of supporting the specified peripheral device
+ *type on this logical unit. However, the physical device is not currently
+ *connected to this logical unit.
+ */
+
+#define DEV_NOT_CAPABLE 0x7f	/* peripheral qualifier of 0x3  */
+				/* peripheral type of 0x1f */
+				/* specifies no device but target present */
+
+#define DEV_DISK_CAPABLE_NOT_PRESENT 0x20 /* peripheral qualifier of 0x1 */
+    /* peripheral type of 0 - disk */
+    /* specifies device capable, but not present */
+
+#define DEV_HISUPPORT 0x10	/* HiSup = 1; shows support for report luns */
+				/* must be returned for lun 0. */
+
+/* NOTE: Linux code assumes inquiry contains 36 bytes. Without checking length
+ * in buf[4] some linux code accesses bytes beyond 5 to retrieve vendor, product
+ * & revision.  Yikes! So let us always send back 36 bytes, the minimum for
+ * inquiry result.
+ */
+#define NO_DISK_INQUIRY_RESULT_LEN 36
+
+#define MIN_INQUIRY_RESULT_LEN 5 /* we need at least 5 bytes minimum for inquiry
+				  * result */
+
+/* SCSI device version for no disk inquiry result */
+#define SCSI_SPC2_VER 4		/* indicates SCSI SPC2 (SPC3 is 5) */
+
+/* Windows and Linux want different things for a non-existent lun. So, we'll let
+ * caller pass in the peripheral qualifier and type.
+ * NOTE:[4] SCSI returns (n-4); so we return length-1-4 or length-5. */
+
+#define SET_NO_DISK_INQUIRY_RESULT(buf, len, lun, lun0notpresent, notpresent) \
+	do {								\
+		memset(buf, 0,						\
+		       MINNUM(len,					\
+			      (unsigned int)NO_DISK_INQUIRY_RESULT_LEN)); \
+		buf[2] = (u8)SCSI_SPC2_VER;				\
+		if (lun == 0) {						\
+			buf[0] = (u8)lun0notpresent;			\
+			buf[3] = (u8)DEV_HISUPPORT;			\
+		} else							\
+			buf[0] = (u8)notpresent;			\
+		buf[4] = (u8)(						\
+			MINNUM(len,					\
+			       (unsigned int)NO_DISK_INQUIRY_RESULT_LEN) - 5);\
+		if (len >= NO_DISK_INQUIRY_RESULT_LEN) {		\
+			buf[8] = 'D';					\
+			buf[9] = 'E';					\
+			buf[10] = 'L';					\
+			buf[11] = 'L';					\
+			buf[16] = 'P';					\
+			buf[17] = 'S';					\
+			buf[18] = 'E';					\
+			buf[19] = 'U';					\
+			buf[20] = 'D';					\
+			buf[21] = 'O';					\
+			buf[22] = ' ';					\
+			buf[23] = 'D';					\
+			buf[24] = 'E';					\
+			buf[25] = 'V';					\
+			buf[26] = 'I';					\
+			buf[27] = 'C';					\
+			buf[28] = 'E';					\
+			buf[30] = ' ';					\
+			buf[31] = '.';					\
+		}							\
+	} while (0)
+
+/*
+ * Struct & Defines to support sense information.
+ */
+
+/* The following struct is returned in sensebuf field in uiscmdrsp_scsi.  It is
+ * initialized in exactly the manner that is recommended in Windows (hence the
+ * odd values).
+ * When set, these fields will have the following values:
+ * ErrorCode = 0x70		indicates current error
+ * Valid = 1			indicates sense info is valid
+ * SenseKey			contains sense key as defined by SCSI specs.
+ * AdditionalSenseCode		contains sense key as defined by SCSI specs.
+ * AdditionalSenseCodeQualifier	contains qualifier to sense code as defined by
+ *				scsi docs.
+ * AdditionalSenseLength	contains will be sizeof(sense_data)-8=10.
+ */
+struct sense_data {
+	u8 errorcode:7;
+	u8 valid:1;
+	u8 segment_number;
+	u8 sense_key:4;
+	u8 reserved:1;
+	u8 incorrect_length:1;
+	u8 end_of_media:1;
+	u8 file_mark:1;
+	u8 information[4];
+	u8 additional_sense_length;
+	u8 command_specific_information[4];
+	u8 additional_sense_code;
+	u8 additional_sense_code_qualifier;
+	u8 fru_code;
+	u8 sense_key_specific[3];
+};
+
+struct net_pkt_xmt {
+	int len;	/* full length of data in the packet */
+	int num_frags;	/* number of fragments in frags containing data */
+	struct phys_info frags[MAX_PHYS_INFO];	/* physical page information for
+						 * each fragment */
+	char ethhdr[ETH_HEADER_SIZE];	/* the ethernet header  */
+	struct {
+		    /* these are needed for csum at uisnic end */
+		u8 valid;	/* 1 = rest of this struct is valid - else
+				 * ignore */
+		u8 hrawoffv;	/* 1 = hwrafoff is valid */
+		u8 nhrawoffv;	/* 1 = nhwrafoff is valid */
+		u16 protocol;	/* specifies packet protocol */
+		u32 csum;	/* value used to set skb->csum at IOPart */
+		u32 hrawoff;	/* value used to set skb->h.raw at IOPart */
+		/* hrawoff points to the start of the TRANSPORT LAYER HEADER */
+		u32 nhrawoff;	/* value used to set skb->nh.raw at IOPart */
+		/* nhrawoff points to the start of the NETWORK LAYER HEADER */
+	} lincsum;
+
+	    /* **** NOTE ****
+	     * The full packet is described in frags but the ethernet header is
+	     * separately kept in ethhdr so that uisnic doesn't have "MAP" the
+	     * guest memory to get to the header. uisnic needs ethhdr to
+	     * determine how to route the packet.
+	     */
+};
+
+struct net_pkt_xmtdone {
+	u32 xmt_done_result;	/* result of NET_XMIT */
+};
+
+/* RCVPOST_BUF_SIZe must be at most page_size(4096) - cache_line_size (64) The
+ * reason is because dev_skb_alloc which is used to generate RCV_POST skbs in
+ * virtnic requires that there is "overhead" in the buffer, and pads 16 bytes. I
+ * prefer to use 1 full cache line size for "overhead" so that transfers are
+ * better.  IOVM requires that a buffer be represented by 1 phys_info structure
+ * which can only cover page_size.
+ */
+#define RCVPOST_BUF_SIZE 4032
+#define MAX_NET_RCV_CHAIN \
+	((ETH_MAX_MTU+ETH_HEADER_SIZE + RCVPOST_BUF_SIZE-1) / RCVPOST_BUF_SIZE)
+
+struct net_pkt_rcvpost {
+	    /* rcv buf size must be large enough to include ethernet data len +
+	     * ethernet header len - we are choosing 2K because it is guaranteed
+	     * to be describable */
+	    struct phys_info frag;	/* physical page information for the
+					 * single fragment 2K rcv buf */
+	    u64 unique_num;		/* This is used to make sure that
+					 * receive posts are returned to  */
+	    /* the Adapter which we sent them originally. */
+};
+
+struct net_pkt_rcv {
+	/* the number of receive buffers that can be chained  */
+	/* is based on max mtu and size of each rcv buf */
+	u32 rcv_done_len;	/* length of received data */
+	u8 numrcvbufs;		/* number of receive buffers that contain the */
+	/* incoming data; guest end MUST chain these together. */
+	void *rcvbuf[MAX_NET_RCV_CHAIN];	/* the list of receive buffers
+						 * that must be chained; */
+	/* each entry is a receive buffer provided by NET_RCV_POST. */
+	/* NOTE: first rcvbuf in the chain will also be provided in net.buf. */
+	u64 unique_num;
+	u32 rcvs_dropped_delta;
+};
+
+struct net_pkt_enbdis {
+	void *context;
+	u16 enable;		/* 1 = enable, 0 = disable */
+};
+
+struct net_pkt_macaddr {
+	void *context;
+	u8 macaddr[MAX_MACADDR_LEN];	/* 6 bytes */
+};
+
+/* cmd rsp packet used for VNIC network traffic  */
+struct uiscmdrsp_net {
+	enum net_types type;
+	void *buf;
+	union {
+		struct net_pkt_xmt xmt;		/* used for NET_XMIT */
+		struct net_pkt_xmtdone xmtdone;	/* used for NET_XMIT_DONE */
+		struct net_pkt_rcvpost rcvpost;	/* used for NET_RCV_POST */
+		struct net_pkt_rcv rcv;		/* used for NET_RCV */
+		struct net_pkt_enbdis enbdis;	/* used for NET_RCV_ENBDIS, */
+						/* NET_RCV_ENBDIS_ACK,  */
+						/* NET_RCV_PROMSIC, */
+						/* and NET_CONNECT_STATUS */
+		struct net_pkt_macaddr macaddr;
+	};
+};
+
+struct uiscmdrsp_scsitaskmgmt {
+	enum task_mgmt_types tasktype;
+
+	    /* the type of task */
+	struct uisscsi_dest vdest;
+
+	    /* the vdisk for which this task mgmt is generated */
+	void *scsicmd;
+
+	    /* This is some handle that the guest has saved off for its own use.
+	     * Its value is preserved by iopart & returned as is in the task
+	     * mgmt rsp.
+	     */
+	void *notify;
+
+	   /* For linux guests, this is a pointer to wait_queue_head that a
+	    * thread is waiting on to see if the taskmgmt command has completed.
+	    * For windows guests, this is a pointer to a location that a waiting
+	    * thread is testing to see if the taskmgmt command has completed.
+	    * When the rsp is received by guest, the thread receiving the
+	    * response uses this to notify the thread waiting for taskmgmt
+	    * command completion.  Its value is preserved by iopart & returned
+	    * as is in the task mgmt rsp.
+	    */
+	void *notifyresult;
+
+	    /* this is a handle to location in guest where the result of the
+	     * taskmgmt command (result field) is to saved off when the response
+	     * is handled.  Its value is preserved by iopart & returned as is in
+	     * the task mgmt rsp.
+	     */
+	char result;
+
+	    /* result of taskmgmt command - set by IOPart - values are: */
+#define TASK_MGMT_FAILED  0
+};
+
+/* The following is used by uissd to send disk add/remove notifications to
+ * Guest */
+/* Note that the vHba pointer is not used by the Client/Guest side. */
+struct uiscmdrsp_disknotify {
+	u8 add;			/* 0-remove, 1-add */
+	void *v_hba;		/* Pointer to vhba_info for channel info to
+				 * route msg */
+	u32 channel, id, lun;	/* SCSI Path of Disk to added or removed */
+};
+
+/* The following is used by virthba/vSCSI to send the Acquire/Release commands
+ * to the IOVM. */
+struct uiscmdrsp_vdiskmgmt {
+	enum vdisk_mgmt_types vdisktype;
+
+	    /* the type of task */
+	struct uisscsi_dest vdest;
+
+	    /* the vdisk for which this task mgmt is generated */
+	void *scsicmd;
+
+	    /* This is some handle that the guest has saved off for its own use.
+	     * Its value is preserved by iopart & returned as is in the task
+	     * mgmt rsp.
+	     */
+	void *notify;
+
+	    /* For linux guests, this is a pointer to wait_queue_head that a
+	     * thread is waiting on to see if the tskmgmt command has completed.
+	     * For win32 guests, this is a pointer to a location that a waiting
+	     * thread is testing to see if the taskmgmt command has completed.
+	     * When the rsp is received by guest, the thread receiving the
+	     * response uses this to notify the thread waiting for taskmgmt
+	     * command completion.  Its value is preserved by iopart & returned
+	     * as is in the task mgmt rsp.
+	     */
+	void *notifyresult;
+
+	    /* this is a handle to location in guest where the result of the
+	     * taskmgmt command (result field) is to saved off when the response
+	     * is handled.  Its value is preserved by iopart & returned as is in
+	     * the task mgmt rsp.
+	     */
+	char result;
+
+	    /* result of taskmgmt command - set by IOPart - values are: */
+#define VDISK_MGMT_FAILED  0
+};
+
+/* keeping cmd & rsp info in one structure for now cmd rsp packet for scsi */
+struct uiscmdrsp {
+	char cmdtype;
+
+/* describes what type of information is in the struct */
+#define CMD_SCSI_TYPE		1
+#define CMD_NET_TYPE		2
+#define CMD_SCSITASKMGMT_TYPE	3
+#define CMD_NOTIFYGUEST_TYPE	4
+#define CMD_VDISKMGMT_TYPE	5
+	union {
+		struct uiscmdrsp_scsi scsi;
+		struct uiscmdrsp_net net;
+		struct uiscmdrsp_scsitaskmgmt scsitaskmgmt;
+		struct uiscmdrsp_disknotify disknotify;
+		struct uiscmdrsp_vdiskmgmt vdiskmgmt;
+	};
+	void *private_data;	/* used to send the response when the cmd is
+				 * done (scsi & scsittaskmgmt). */
+	struct uiscmdrsp *next;	/* General Purpose Queue Link */
+	struct uiscmdrsp *activeQ_next;	/* Used to track active commands */
+	struct uiscmdrsp *activeQ_prev;	/* Used to track active commands */
+};
+
+/* This is just the header of the IO channel.  It is assumed that directly after
+ * this header there is a large region of memory which contains the command and
+ * response queues as specified in cmd_q and rsp_q SIGNAL_QUEUE_HEADERS.
+ */
+struct spar_io_channel_protocol {
+	struct channel_header channel_header;
+	struct signal_queue_header cmd_q;
+	struct signal_queue_header rsp_q;
+	union {
+		struct {
+			struct vhba_wwnn wwnn;		/* 8 bytes */
+			struct vhba_config_max max;	/* 20 bytes */
+		} vhba;					/* total = 28 bytes */
+		struct {
+			u8 macaddr[MAX_MACADDR_LEN];	/* 6 bytes */
+			u32 num_rcv_bufs;		/* 4 bytes */
+			u32 mtu;			/* 4 bytes */
+			uuid_le zone_uuid;		/* 16 bytes */
+		} vnic;					/* total = 30 bytes */
+	};
+
+#define MAX_CLIENTSTRING_LEN 1024
+	 u8 client_string[MAX_CLIENTSTRING_LEN];/* NULL terminated - so holds
+						 * max - 1 bytes */
+};
+
+#pragma pack(pop)
+/* ///////////// END PRAGMA PACK PUSH 1 /////////////////////////// */
+
+/*
+ * INLINE functions for initializing and accessing I/O data channels
+ */
+
+#define SIZEOF_PROTOCOL (COVER(sizeof(struct spar_io_channel_protocol), 64))
+#define SIZEOF_CMDRSP (COVER(sizeof(struct uiscmdrsp), 64))
+
+#define MIN_IO_CHANNEL_SIZE COVER(SIZEOF_PROTOCOL + \
+				  2 * MIN_NUMSIGNALS * SIZEOF_CMDRSP, 4096)
+
+/*
+ * INLINE function for expanding a guest's pfn-off-size into multiple 4K page
+ * pfn-off-size entires.
+ */
+
+/* we deal with 4K page sizes when we it comes to passing page information
+ * between */
+/* Guest and IOPartition. */
+#define PI_PAGE_SIZE  0x1000
+#define PI_PAGE_MASK  0x0FFF
+
+/* returns next non-zero index on success or zero on failure (i.e. out of
+ * room)
+ */
+static inline  u16
+add_physinfo_entries(u32 inp_pfn,	/* input - specifies the pfn to be used
+					 * to add entries */
+		     u16 inp_off,	/* input - specifies the off to be used
+					 * to add entries */
+		     u32 inp_len,	/* input - specifies the len to be used
+					 * to add entries */
+		     u16 index,		/* input - index in array at which new
+					 * entries are added */
+		     u16 max_pi_arr_entries,	/* input - specifies the maximum
+						 * entries pi_arr can hold */
+		     struct phys_info pi_arr[]) /* input & output - array to
+						  * which entries are added */
+{
+	u32 len;
+	u16 i, firstlen;
+
+	firstlen = PI_PAGE_SIZE - inp_off;
+	if (inp_len <= firstlen) {
+		/* the input entry spans only one page - add as is */
+		if (index >= max_pi_arr_entries)
+			return 0;
+		pi_arr[index].pi_pfn = inp_pfn;
+		pi_arr[index].pi_off = (u16)inp_off;
+		pi_arr[index].pi_len = (u16)inp_len;
+		    return index + 1;
+	}
+
+	    /* this entry spans multiple pages */
+	    for (len = inp_len, i = 0; len;
+		 len -= pi_arr[index + i].pi_len, i++) {
+		if (index + i >= max_pi_arr_entries)
+			return 0;
+		pi_arr[index + i].pi_pfn = inp_pfn + i;
+		if (i == 0) {
+			pi_arr[index].pi_off = inp_off;
+			pi_arr[index].pi_len = firstlen;
+		}
+
+		else {
+			pi_arr[index + i].pi_off = 0;
+			pi_arr[index + i].pi_len =
+			    (u16)MINNUM(len, (u32)PI_PAGE_SIZE);
+		}
+	}
+	return index + i;
+}
+
+#endif				/* __IOCHANNEL_H__ */
diff --git a/drivers/staging/unisys/include/version.h b/drivers/staging/unisys/include/version.h
new file mode 100644
index 0000000..83d1da7
--- /dev/null
+++ b/drivers/staging/unisys/include/version.h
@@ -0,0 +1,45 @@
+/* Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+/* version.h */
+
+/*  Common version/release info needed by all components goes here.
+ *  (This file must compile cleanly in all environments.)
+ *  Ultimately, this will be combined with defines generated dynamically as
+ *  part of the sysgen, and some of the defines below may in fact end up
+ *  being replaced with dynamically generated ones.
+ */
+#ifndef __VERSION_H__
+#define __VERSION_H__
+
+#define SPARVER1 "1"
+#define SPARVER2 "0"
+#define SPARVER3 "0"
+#define SPARVER4 "0"
+
+#define  VERSION        SPARVER1 "." SPARVER2 "." SPARVER3 "." SPARVER4
+
+/* Here are various version forms needed in Windows environments.
+ */
+#define VISOR_PRODUCTVERSION      SPARVERCOMMA
+#define VISOR_PRODUCTVERSION_STR  SPARVER1 "." SPARVER2 "." SPARVER3 "." \
+	SPARVER4
+#define VISOR_OBJECTVERSION_STR   SPARVER1 "," SPARVER2 "," SPARVER3 "," \
+	SPARVER4
+
+#define  COPYRIGHT      "Unisys Corporation"
+#define  COPYRIGHTDATE  "2010 - 2013"
+
+#endif
diff --git a/drivers/staging/unisys/visorbus/controlvmcompletionstatus.h b/drivers/staging/unisys/visorbus/controlvmcompletionstatus.h
new file mode 100644
index 0000000..f74f5d8
--- /dev/null
+++ b/drivers/staging/unisys/visorbus/controlvmcompletionstatus.h
@@ -0,0 +1,94 @@
+/* controlvmcompletionstatus.c
+ *
+ * Copyright (C) 2010 - 2013 UNISYS CORPORATION
+ * All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT.  See the GNU General Public License for more
+ * details.
+ */
+
+/*  Defines for all valid values returned in the response message header
+ *  completionStatus field.  See controlvmchannel.h for description of
+ *  the header: _CONTROLVM_MESSAGE_HEADER.
+ */
+
+#ifndef __CONTROLVMCOMPLETIONSTATUS_H__
+#define __CONTROLVMCOMPLETIONSTATUS_H__
+
+/* General Errors------------------------------------------------------[0-99] */
+#define CONTROLVM_RESP_SUCCESS                                  0
+#define CONTROLVM_RESP_ERROR_ALREADY_DONE                       1
+#define CONTROLVM_RESP_ERROR_IOREMAP_FAILED                     2
+#define CONTROLVM_RESP_ERROR_KMALLOC_FAILED                     3
+#define CONTROLVM_RESP_ERROR_MESSAGE_ID_UNKNOWN                 4
+#define CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT      5
+
+/* CONTROLVM_INIT_CHIPSET-------------------------------------------[100-199] */
+#define CONTROLVM_RESP_ERROR_CLIENT_SWITCHCOUNT_NONZERO         100
+#define CONTROLVM_RESP_ERROR_EXPECTED_CHIPSET_INIT              101
+
+/* Maximum Limit----------------------------------------------------[200-299] */
+#define CONTROLVM_RESP_ERROR_MAX_BUSES		201	/* BUS_CREATE */
+#define CONTROLVM_RESP_ERROR_MAX_DEVICES        202	/* DEVICE_CREATE */
+/* Payload and Parameter Related------------------------------------[400-499] */
+#define CONTROLVM_RESP_ERROR_PAYLOAD_INVALID	400	/* SWITCH_ATTACHEXTPORT,
+							 * DEVICE_CONFIGURE */
+#define CONTROLVM_RESP_ERROR_INITIATOR_PARAMETER_INVALID 401	/* Multiple */
+#define CONTROLVM_RESP_ERROR_TARGET_PARAMETER_INVALID 402 /* DEVICE_CONFIGURE */
+#define CONTROLVM_RESP_ERROR_CLIENT_PARAMETER_INVALID 403 /* DEVICE_CONFIGURE */
+/* Specified[Packet Structure] Value-------------------------------[500-599] */
+#define CONTROLVM_RESP_ERROR_BUS_INVALID	500	/* SWITCH_ATTACHINTPORT,
+							 * BUS_CONFIGURE,
+							 * DEVICE_CREATE,
+							 * DEVICE_CONFIG
+							 * DEVICE_DESTROY */
+#define CONTROLVM_RESP_ERROR_DEVICE_INVALID	501 /* SWITCH_ATTACHINTPORT */
+						    /* DEVICE_CREATE,
+						     * DEVICE_CONFIGURE,
+						     * DEVICE_DESTROY */
+#define CONTROLVM_RESP_ERROR_CHANNEL_INVALID	502 /* DEVICE_CREATE,
+						     * DEVICE_CONFIGURE */
+/* Partition Driver Callback Interface----------------------[600-699] */
+#define CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_FAILURE 604	/* BUS_CREATE,
+							 * BUS_DESTROY,
+							 * DEVICE_CREATE,
+							 * DEVICE_DESTROY */
+/* Unable to invoke VIRTPCI callback */
+#define CONTROLVM_RESP_ERROR_VIRTPCI_DRIVER_CALLBACK_ERROR 605
+							/* BUS_CREATE,
+							 * BUS_DESTROY,
+							 * DEVICE_CREATE,
+							 * DEVICE_DESTROY */
+/* VIRTPCI Callback returned error */
+#define CONTROLVM_RESP_ERROR_GENERIC_DRIVER_CALLBACK_ERROR 606
+							/* SWITCH_ATTACHEXTPORT,
+							 * SWITCH_DETACHEXTPORT
+							 * DEVICE_CONFIGURE */
+
+/* generic device callback returned error */
+/* Bus Related------------------------------------------------------[700-799] */
+#define CONTROLVM_RESP_ERROR_BUS_DEVICE_ATTACHED 700	/* BUS_DESTROY */
+/* Channel Related--------------------------------------------------[800-899] */
+#define CONTROLVM_RESP_ERROR_CHANNEL_TYPE_UNKNOWN 800	/* GET_CHANNELINFO,
+							 * DEVICE_DESTROY */
+#define CONTROLVM_RESP_ERROR_CHANNEL_SIZE_TOO_SMALL 801	/* DEVICE_CREATE */
+/* Chipset Shutdown Related---------------------------------------[1000-1099] */
+#define CONTROLVM_RESP_ERROR_CHIPSET_SHUTDOWN_FAILED            1000
+#define CONTROLVM_RESP_ERROR_CHIPSET_SHUTDOWN_ALREADY_ACTIVE    1001
+
+/* Chipset Stop Related-------------------------------------------[1100-1199] */
+#define CONTROLVM_RESP_ERROR_CHIPSET_STOP_FAILED_BUS            1100
+#define CONTROLVM_RESP_ERROR_CHIPSET_STOP_FAILED_SWITCH         1101
+
+/* Device Related-------------------------------------------------[1400-1499] */
+#define CONTROLVM_RESP_ERROR_DEVICE_UDEV_TIMEOUT                1400
+
+#endif /* __CONTROLVMCOMPLETIONSTATUS_H__ not defined */
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 14/44] staging: unisys: Get rid of references to common-spar
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (12 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 13/44] staging: unisys: Move files out of common-spar Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 15/44] staging: unisys: get rid of sparstop Benjamin Romer
                   ` (29 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Makefiles still had common-spar listed in ccflags.

This gets rid of them.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/Makefile     | 2 --
 drivers/staging/unisys/visorchannel/Makefile | 2 --
 2 files changed, 4 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/Makefile b/drivers/staging/unisys/visorbus/Makefile
index 32f199e..2650b72 100644
--- a/drivers/staging/unisys/visorbus/Makefile
+++ b/drivers/staging/unisys/visorbus/Makefile
@@ -10,7 +10,5 @@ visorbus-y += visorchipset.o
 visorbus-y += periodic_work.o
 
 ccflags-y += -Idrivers/staging/unisys/include
-ccflags-y += -Idrivers/staging/unisys/common-spar/include
-ccflags-y += -Idrivers/staging/unisys/common-spar/include/channels
 ccflags-y += -Idrivers/staging/unisys/visorutil
 ccflags-y += -Idrivers/staging/unisys/visorbus
diff --git a/drivers/staging/unisys/visorchannel/Makefile b/drivers/staging/unisys/visorchannel/Makefile
index e079c96..0c0cacb 100644
--- a/drivers/staging/unisys/visorchannel/Makefile
+++ b/drivers/staging/unisys/visorchannel/Makefile
@@ -7,6 +7,4 @@ obj-$(CONFIG_UNISYS_VISORCHANNEL)	+= visorchannel.o
 visorchannel-y := visorchannel_main.o visorchannel_funcs.o
 
 ccflags-y += -Idrivers/staging/unisys/include
-ccflags-y += -Idrivers/staging/unisys/common-spar/include
-ccflags-y += -Idrivers/staging/unisys/common-spar/include/channels
 ccflags-y += -Idrivers/staging/unisys/visorutil
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 15/44] staging: unisys: get rid of sparstop
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (13 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 14/44] staging: unisys: Get rid of references to common-spar Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 16/44] staging: unisys: remove remaining utility headers Benjamin Romer
                   ` (28 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/sparstop.h | 29 -----------------------------
 1 file changed, 29 deletions(-)
 delete mode 100644 drivers/staging/unisys/include/sparstop.h

diff --git a/drivers/staging/unisys/include/sparstop.h b/drivers/staging/unisys/include/sparstop.h
deleted file mode 100644
index 6150d2d..0000000
--- a/drivers/staging/unisys/include/sparstop.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/* sparstop.h
- *
- * Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-#ifndef __SPARSTOP_H__
-#define __SPARSTOP_H__
-
-#include "version.h"
-#include <linux/ctype.h>
-
-typedef void (*SPARSTOP_COMPLETE_FUNC) (void *context, int status);
-
-int sp_stop(void *context, SPARSTOP_COMPLETE_FUNC get_complete_func);
-void test_remove_stop_device(void);
-
-#endif
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 16/44] staging: unisys: remove remaining utility headers
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (14 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 15/44] staging: unisys: get rid of sparstop Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 17/44] staging: unisys: Remove temporarily added visorbus/ include in Makefile Benjamin Romer
                   ` (27 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

remove uisqueue.h, uisthread.h, and uisutils.h
replace HOSTADDRESS with u64
remove "uisutils.h" from header list in visorchipset.c

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/uisqueue.h      | 396 -------------------------
 drivers/staging/unisys/include/uisthread.h     |  42 ---
 drivers/staging/unisys/include/uisutils.h      | 293 ------------------
 drivers/staging/unisys/visorbus/visorchipset.c |  37 ++-
 4 files changed, 36 insertions(+), 732 deletions(-)
 delete mode 100644 drivers/staging/unisys/include/uisqueue.h
 delete mode 100644 drivers/staging/unisys/include/uisthread.h
 delete mode 100644 drivers/staging/unisys/include/uisutils.h

diff --git a/drivers/staging/unisys/include/uisqueue.h b/drivers/staging/unisys/include/uisqueue.h
deleted file mode 100644
index 08ba16e..0000000
--- a/drivers/staging/unisys/include/uisqueue.h
+++ /dev/null
@@ -1,396 +0,0 @@
-/* uisqueue.h
- *
- * Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/*
- * Unisys IO Virtualization header NOTE: This file contains only Linux
- * specific structs.  All OS-independent structs are in iochannel.h.xx
- */
-
-#ifndef __UISQUEUE_H__
-#define __UISQUEUE_H__
-
-#include "linux/version.h"
-#include "iochannel.h"
-#include <linux/atomic.h>
-#include <linux/semaphore.h>
-#include <linux/uuid.h>
-
-#include "controlvmchannel.h"
-#include "controlvmcompletionstatus.h"
-
-struct uisqueue_info {
-	struct channel_header __iomem *chan;
-	/* channel containing queues in which scsi commands &
-	 * responses are queued
-	 */
-	u64 packets_sent;
-	u64 packets_received;
-	u64 interrupts_sent;
-	u64 interrupts_received;
-	u64 max_not_empty_cnt;
-	u64 total_wakeup_cnt;
-	u64 non_empty_wakeup_cnt;
-
-	struct {
-		struct signal_queue_header reserved1;	/*  */
-		struct signal_queue_header reserved2;	/*  */
-	} safe_uis_queue;
-	unsigned int (*send_int_if_needed)(struct uisqueue_info *info,
-					   unsigned int whichcqueue,
-					   unsigned char issue_irq_if_empty,
-					   u64 irq_handle,
-					   unsigned char io_termination);
-};
-
-/* uisqueue_put_cmdrsp_with_lock_client queues a commmand or response
- * to the specified queue, at the tail if the queue is full but
- * oktowait == 0, then it return 0 indicating failure.  otherwise it
- * wait for the queue to become non-full. If command is queued, return
- * 1 for success.
- */
-#define DONT_ISSUE_INTERRUPT 0
-#define ISSUE_INTERRUPT		 1
-
-#define DONT_WAIT			 0
-#define OK_TO_WAIT			 1
-#define UISLIB_LOCK_PREFIX \
-		".section .smp_locks,\"a\"\n"   \
-		_ASM_ALIGN "\n"                 \
-		_ASM_PTR "661f\n" /* address */ \
-		".previous\n"                   \
-		"661:\n\tlock; "
-
-unsigned long long uisqueue_interlocked_or(unsigned long long __iomem *tgt,
-					   unsigned long long set);
-unsigned long long uisqueue_interlocked_and(unsigned long long __iomem *tgt,
-					    unsigned long long set);
-
-int uisqueue_put_cmdrsp_with_lock_client(struct uisqueue_info *queueinfo,
-					 struct uiscmdrsp *cmdrsp,
-					 unsigned int queue,
-					 void *insertlock,
-					 unsigned char issue_irq_if_empty,
-					 u64 irq_handle,
-					 char oktowait,
-					 u8 *channel_id);
-
-/* uisqueue_get_cmdrsp gets the cmdrsp entry at the head of the queue
- * and copies it to the area pointed by cmdrsp param.
- * returns 0 if queue is empty, 1 otherwise
- */
-int
-
-uisqueue_get_cmdrsp(struct uisqueue_info *queueinfo, void *cmdrsp,
-		    unsigned int queue);
-
-#define MAX_NAME_SIZE_UISQUEUE 64
-
-struct extport_info {
-	u8 valid:1;
-	/* if 1, indicates this extport slot is occupied
-	 * if 0, indicates that extport slot is unoccupied */
-
-	u32 num_devs_using;
-	/* When extport is added, this is set to 0.  For exports
-	* located in NETWORK switches:
-	* Each time a VNIC, i.e., intport, is added to the switch this
-	* is used to assign a pref_pnic for the VNIC and when assigned
-	* to a VNIC this counter is incremented. When a VNIC is
-	* deleted, the extport corresponding to the VNIC's pref_pnic
-	* is located and its num_devs_using is decremented. For VNICs,
-	* num_devs_using is basically used to load-balance transmit
-	* traffic from VNICs.
-	*/
-
-	struct switch_info *swtch;
-	struct pci_id pci_id;
-	char name[MAX_NAME_SIZE_UISQUEUE];
-	union {
-		struct vhba_wwnn wwnn;
-		unsigned char macaddr[MAX_MACADDR_LEN];
-	};
-};
-
-struct device_info {
-	void __iomem *chanptr;
-	u64 channel_addr;
-	u64 channel_bytes;
-	uuid_le channel_uuid;
-	uuid_le instance_uuid;
-	struct irq_info intr;
-	struct switch_info *swtch;
-	char devid[30];		/* "vbus<busno>:dev<devno>" */
-	u16 polling;
-	struct semaphore interrupt_callback_lock;
-	u32 bus_no;
-	u32 dev_no;
-	int (*interrupt)(void *);
-	void *interrupt_context;
-	void *private_data;
-	struct list_head list_polling_device_channels;
-	unsigned long long moved_to_tail_cnt;
-	unsigned long long first_busy_cnt;
-	unsigned long long last_on_list_cnt;
-};
-
-enum switch_type {
-	RECOVERY_LAN = 1,
-	IB_LAN = 2
-};
-
-struct bus_info {
-	u32 bus_no, device_count;
-	struct device_info **device;
-	u64 guest_handle, recv_bus_irq_handle;
-	uuid_le bus_inst_uuid;
-	struct ultra_vbus_channel_protocol __iomem *bus_channel;
-	int bus_channel_bytes;
-	struct proc_dir_entry *proc_dir;	/* proc/uislib/vbus/<x> */
-	struct proc_dir_entry *proc_info;	/* proc/uislib/vbus/<x>/info */
-	char name[25];
-	char partition_name[99];
-	struct bus_info *next;
-	u8 local_vnic;		/* 1 if local vnic created internally
-				 * by IOVM; 0 otherwise... */
-};
-
-struct sn_list_entry {
-	struct uisscsi_dest pdest;	/* scsi bus, target, lun for
-					 * phys disk */
-	u8 sernum[MAX_SERIAL_NUM];	/* serial num of physical
-					 * disk.. The length is always
-					 * MAX_SERIAL_NUM, padded with
-					 * spaces */
-	struct sn_list_entry *next;
-};
-
-/*
- * IO messages sent to UisnicControlChanFunc & UissdControlChanFunc by
- * code that processes the ControlVm channel messages.
- */
-
-enum iopart_msg_type {
-	IOPART_ADD_VNIC,
-	IOPART_DEL_VNIC,
-	IOPART_DEL_ALL_VNICS,
-	IOPART_ADD_VHBA,
-	IOPART_ADD_VDISK,
-	IOPART_DEL_VHBA,
-	IOPART_DEL_VDISK,
-	IOPART_DEL_ALL_VDISKS_FOR_VHBA,
-	IOPART_DEL_ALL_VHBAS,
-	IOPART_ATTACH_PHBA,
-	IOPART_DETACH_PHBA,	/* 10 */
-	IOPART_ATTACH_PNIC,
-	IOPART_DETACH_PNIC,
-	IOPART_DETACH_VHBA,
-	IOPART_DETACH_VNIC,
-	IOPART_PAUSE_VDISK,
-	IOPART_RESUME_VDISK,
-	IOPART_ADD_DEVICE,	/* add generic device */
-	IOPART_DEL_DEVICE,	/* del generic device */
-};
-
-struct add_virt_iopart {
-	void *chanptr;		/* pointer to data channel */
-	u64 guest_handle;	/* used to convert guest physical
-				 * address to real physical address
-				 * for DMA, for ex. */
-	u64 recv_bus_irq_handle;	/* used to register to receive
-					 * bus level interrupts. */
-	struct irq_info intr;	/* contains recv & send
-					 * interrupt info */
-	/* recvInterruptHandle is used to register to receive
-	* interrupts on the data channel. Used by GuestLinux/Windows
-	* IO drivers to connect to interrupt.  sendInterruptHandle is
-	* used by IOPart drivers as parameter to
-	* Issue_VMCALL_IO_QUEUE_TRANSITION to interrupt thread in
-	* guest linux/windows IO drivers when data channel queue for
-	* vhba/vnic goes from EMPTY to NON-EMPTY. */
-	struct switch_info *swtch;	/* pointer to the virtual
-					 * switch to which the vnic is
-					 * connected */
-
-	u8 use_g2g_copy;	/* Used to determine if a virtual HBA
-				 * needs to use G2G copy. */
-	u8 filler[7];
-
-	u32 bus_no;
-	u32 dev_no;
-	char *params;
-	ulong params_bytes;
-
-};
-
-struct add_vdisk_iopart {
-	void *chanptr;		      /* pointer to data channel */
-	int implicit;
-	struct uisscsi_dest vdest;    /* scsi bus, target, lun for virt disk */
-	struct uisscsi_dest pdest;    /* scsi bus, target, lun for phys disk */
-	u8 sernum[MAX_SERIAL_NUM];    /* serial num of physical disk */
-	u32 serlen;		      /* length of serial num */
-};
-
-struct del_vdisk_iopart {
-	void *chanptr;		     /* pointer to data channel */
-	struct uisscsi_dest vdest;   /* scsi bus, target, lun for virt disk */
-};
-
-struct del_virt_iopart {
-	void *chanptr;		     /* pointer to data channel */
-};
-
-struct det_virt_iopart {	     /* detach internal port */
-	void *chanptr;		     /* pointer to data channel */
-	struct switch_info *swtch;
-};
-
-struct paures_vdisk_iopart {
-	void *chanptr;		     /* pointer to data channel */
-	struct uisscsi_dest vdest;   /* scsi bus, target, lun for virt disk */
-};
-
-struct add_switch_iopart {	     /* add switch */
-	struct switch_info *swtch;
-	char *params;
-	ulong params_bytes;
-};
-
-struct del_switch_iopart {	     /* destroy switch */
-	struct switch_info *swtch;
-};
-
-struct io_msgs {
-	enum iopart_msg_type msgtype;
-
-	/* additional params needed by some messages */
-	union {
-		struct add_virt_iopart add_vhba;
-		struct add_virt_iopart add_vnic;
-		struct add_vdisk_iopart add_vdisk;
-		struct del_virt_iopart del_vhba;
-		struct del_virt_iopart del_vnic;
-		struct det_virt_iopart det_vhba;
-		struct det_virt_iopart det_vnic;
-		struct del_vdisk_iopart del_vdisk;
-		struct del_virt_iopart del_all_vdisks_for_vhba;
-		struct add_virt_iopart add_device;
-		struct del_virt_iopart del_device;
-		struct det_virt_iopart det_intport;
-		struct add_switch_iopart add_switch;
-		struct del_switch_iopart del_switch;
-		struct extport_info *ext_port;	/* for attach or detach
-						 * pnic/generic delete all
-						 * vhbas/allvnics need no
-						 * parameters */
-		struct paures_vdisk_iopart paures_vdisk;
-	};
-};
-
-/*
-* Guest messages sent to VirtControlChanFunc by code that processes
-* the ControlVm channel messages.
-*/
-
-enum guestpart_msg_type {
-	GUEST_ADD_VBUS,
-	GUEST_ADD_VHBA,
-	GUEST_ADD_VNIC,
-	GUEST_DEL_VBUS,
-	GUEST_DEL_VHBA,
-	GUEST_DEL_VNIC,
-	GUEST_DEL_ALL_VHBAS,
-	GUEST_DEL_ALL_VNICS,
-	GUEST_DEL_ALL_VBUSES,	/* deletes all vhbas & vnics on all
-				 * buses and deletes all buses */
-	GUEST_PAUSE_VHBA,
-	GUEST_PAUSE_VNIC,
-	GUEST_RESUME_VHBA,
-	GUEST_RESUME_VNIC
-};
-
-struct add_vbus_guestpart {
-	void __iomem *chanptr;		/* pointer to data channel for bus -
-					 * NOT YET USED */
-	u32 bus_no;		/* bus number to be created/deleted */
-	u32 dev_count;	/* max num of devices on bus */
-	uuid_le bus_uuid;	/* indicates type of bus */
-	uuid_le instance_uuid;	/* instance guid for device */
-};
-
-struct del_vbus_guestpart {
-	u32 bus_no;		/* bus number to be deleted */
-	/* once we start using the bus's channel, add can dump busNo
-	* into the channel header and then delete will need only one
-	* parameter, chanptr. */
-};
-
-struct add_virt_guestpart {
-	void __iomem *chanptr;		/* pointer to data channel */
-	u32 bus_no;		/* bus number for the operation */
-	u32 device_no;		/* number of device on the bus */
-	uuid_le instance_uuid;	/* instance guid for device */
-	struct irq_info intr;	/* recv/send interrupt info */
-	/* recvInterruptHandle contains info needed in order to
-	 * register to receive interrupts on the data channel.
-	 * sendInterruptHandle contains handle which is provided to
-	 * monitor VMCALL that will cause an interrupt to be generated
-	 * for the other end.
-	 */
-};
-
-struct pause_virt_guestpart {
-	void __iomem *chanptr;		/* pointer to data channel */
-};
-
-struct resume_virt_guestpart {
-	void __iomem *chanptr;		/* pointer to data channel */
-};
-
-struct del_virt_guestpart {
-	void __iomem *chanptr;		/* pointer to data channel */
-};
-
-struct init_chipset_guestpart {
-	u32 bus_count;		/* indicates the max number of busses */
-	u32 switch_count;	/* indicates the max number of switches */
-};
-
-struct guest_msgs {
-	enum guestpart_msg_type msgtype;
-
-	/* additional params needed by messages */
-	union {
-		struct add_vbus_guestpart add_vbus;
-		struct add_virt_guestpart add_vhba;
-		struct add_virt_guestpart add_vnic;
-		struct pause_virt_guestpart pause_vhba;
-		struct pause_virt_guestpart pause_vnic;
-		struct resume_virt_guestpart resume_vhba;
-		struct resume_virt_guestpart resume_vnic;
-		struct del_vbus_guestpart del_vbus;
-		struct del_virt_guestpart del_vhba;
-		struct del_virt_guestpart del_vnic;
-		struct del_vbus_guestpart del_all_vhbas;
-		struct del_vbus_guestpart del_all_vnics;
-		/* del_all_vbuses needs no parameters */
-	};
-	struct init_chipset_guestpart init_chipset;
-
-};
-
-#endif				/* __UISQUEUE_H__ */
diff --git a/drivers/staging/unisys/include/uisthread.h b/drivers/staging/unisys/include/uisthread.h
deleted file mode 100644
index 52c3eb4..0000000
--- a/drivers/staging/unisys/include/uisthread.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/* uisthread.h
- *
- * Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/*****************************************************************************/
-/* Unisys thread utilities header                                            */
-/*****************************************************************************/
-
-#ifndef __UISTHREAD_H__
-#define __UISTHREAD_H__
-
-#include "linux/completion.h"
-
-struct uisthread_info {
-	struct task_struct *task;
-	int id;
-	struct completion has_stopped;
-};
-
-/* returns 0 for failure, 1 for success */
-int uisthread_start(
-	struct uisthread_info *thrinfo,
-	int (*threadfn)(void *),
-	void *thrcontext,
-	char *name);
-
-void uisthread_stop(struct uisthread_info *thrinfo);
-
-#endif /* __UISTHREAD_H__ */
diff --git a/drivers/staging/unisys/include/uisutils.h b/drivers/staging/unisys/include/uisutils.h
deleted file mode 100644
index d58858b..0000000
--- a/drivers/staging/unisys/include/uisutils.h
+++ /dev/null
@@ -1,293 +0,0 @@
-/* uisutils.h
- *
- * Copyright (C) 2010 - 2013 UNISYS CORPORATION
- * All rights reserved.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or (at
- * your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
- * NON INFRINGEMENT.  See the GNU General Public License for more
- * details.
- */
-
-/*
- * Unisys Virtual HBA utilities header
- */
-
-#ifndef __UISUTILS__H__
-#define __UISUTILS__H__
-#include <linux/string.h>
-#include <linux/io.h>
-#include <linux/sched.h>
-#include <linux/gfp.h>
-#include <linux/uuid.h>
-#include <linux/if_ether.h>
-
-#include "vmcallinterface.h"
-#include "channel.h"
-#include "uisthread.h"
-#include "uisqueue.h"
-#include "vbusdeviceinfo.h"
-#include <linux/atomic.h>
-
-/* This is the MAGIC number stuffed by virthba in host->this_id. Used to
- * identify virtual hbas.
- */
-#define UIS_MAGIC_VHBA 707
-
-/* global function pointers that act as callback functions into
- * uisnicmod, uissdmod, and virtpcimod
- */
-extern int (*uisnic_control_chan_func)(struct io_msgs *);
-extern int (*uissd_control_chan_func)(struct io_msgs *);
-extern int (*virt_control_chan_func)(struct guest_msgs *);
-
-/* Return values of above callback functions: */
-#define CCF_ERROR        0	/* completed and failed */
-#define CCF_OK           1	/* completed successfully */
-#define CCF_PENDING      2	/* operation still pending */
-extern atomic_t uisutils_registered_services;
-
-struct req_handler_info {
-	uuid_le switch_uuid;
-	int (*controlfunc)(struct io_msgs *);
-	unsigned long min_channel_bytes;
-	int (*server_channel_ok)(unsigned long channel_bytes);
-	int (*server_channel_init)(void *x, unsigned char *client_str,
-				   u32 client_str_len, u64 bytes);
-	char switch_type_name[99];
-	struct list_head list_link;	/* links into ReqHandlerInfo_list */
-};
-
-struct req_handler_info *req_handler_find(uuid_le switch_uuid);
-
-#define uislib_ioremap_cache(addr, size) \
-	dbg_ioremap_cache(addr, size, __FILE__, __LINE__)
-
-static inline void __iomem *
-dbg_ioremap_cache(u64 addr, unsigned long size, char *file, int line)
-{
-	void __iomem *new;
-
-	new = ioremap_cache(addr, size);
-	return new;
-}
-
-#define uislib_ioremap(addr, size) dbg_ioremap(addr, size, __FILE__, __LINE__)
-
-static inline void *
-dbg_ioremap(u64 addr, unsigned long size, char *file, int line)
-{
-	void *new;
-
-	new = ioremap(addr, size);
-	return new;
-}
-
-#define uislib_iounmap(addr) dbg_iounmap(addr, __FILE__, __LINE__)
-
-static inline void
-dbg_iounmap(void __iomem *addr, char *file, int line)
-{
-	iounmap(addr);
-}
-
-#define PROC_READ_BUFFER_SIZE 131072	/* size of the buffer to allocate to
-					 * hold all of /proc/XXX/info */
-int uisutil_add_proc_line_ex(int *total, char **buffer, int *buffer_remaining,
-			     char *format, ...);
-
-int uisctrl_register_req_handler(int type, void *fptr,
-			struct ultra_vbus_deviceinfo *chipset_driver_info);
-
-unsigned char *util_map_virt(struct phys_info *sg);
-void util_unmap_virt(struct phys_info *sg);
-unsigned char *util_map_virt_atomic(struct phys_info *sg);
-void util_unmap_virt_atomic(void *buf);
-int uislib_client_inject_add_bus(u32 bus_no, uuid_le inst_uuid,
-				 u64 channel_addr, ulong n_channel_bytes);
-int  uislib_client_inject_del_bus(u32 bus_no);
-
-int uislib_client_inject_add_vhba(u32 bus_no, u32 dev_no,
-				  u64 phys_chan_addr, u32 chan_bytes,
-				  int is_test_addr, uuid_le inst_uuid,
-				  struct irq_info *intr);
-int  uislib_client_inject_pause_vhba(u32 bus_no, u32 dev_no);
-int  uislib_client_inject_resume_vhba(u32 bus_no, u32 dev_no);
-int uislib_client_inject_del_vhba(u32 bus_no, u32 dev_no);
-int uislib_client_inject_add_vnic(u32 bus_no, u32 dev_no,
-				  u64 phys_chan_addr, u32 chan_bytes,
-				  int is_test_addr, uuid_le inst_uuid,
-				  struct irq_info *intr);
-int uislib_client_inject_pause_vnic(u32 bus_no, u32 dev_no);
-int uislib_client_inject_resume_vnic(u32 bus_no, u32 dev_no);
-int uislib_client_inject_del_vnic(u32 bus_no, u32 dev_no);
-#ifdef STORAGE_CHANNEL
-u64 uislib_storage_channel(int client_id);
-#endif
-int uislib_get_owned_pdest(struct uisscsi_dest *pdest);
-
-int uislib_send_event(enum controlvm_id id,
-		      struct controlvm_message_packet *event);
-
-/* structure used by vhba & vnic to keep track of queue & thread info */
-struct chaninfo {
-	struct uisqueue_info *queueinfo;
-	/* this specifies the queue structures for a channel */
-	/* ALLOCATED BY THE OTHER END - WE JUST GET A POINTER TO THE MEMORY */
-	spinlock_t insertlock;
-	/* currently used only in virtnic when sending data to uisnic */
-	/* to synchronize the inserts into the signal queue */
-	struct uisthread_info threadinfo;
-	/* this specifies the thread structures used by the thread that */
-	/* handles this channel */
-};
-
-/* this is the wait code for all the threads - it is used to get
-* something from a queue choices: wait_for_completion_interruptible,
-* _timeout, interruptible_timeout
-*/
-#define UIS_THREAD_WAIT_MSEC(x) { \
-	set_current_state(TASK_INTERRUPTIBLE); \
-	schedule_timeout(msecs_to_jiffies(x)); \
-}
-
-#define UIS_THREAD_WAIT_USEC(x) { \
-	set_current_state(TASK_INTERRUPTIBLE); \
-	schedule_timeout(usecs_to_jiffies(x)); \
-}
-
-#define UIS_THREAD_WAIT UIS_THREAD_WAIT_MSEC(5)
-
-#define UIS_THREAD_WAIT_SEC(x) { \
-	set_current_state(TASK_INTERRUPTIBLE); \
-	schedule_timeout((x)*HZ); \
-}
-
-/* This is a hack until we fix IOVM to initialize the channel header
- * correctly at DEVICE_CREATE time, INSTEAD OF waiting until
- * DEVICE_CONFIGURE time.
- */
-static inline void
-wait_for_valid_guid(uuid_le __iomem *guid)
-{
-	uuid_le tmpguid;
-
-	while (1) {
-		memcpy_fromio((void *)&tmpguid,
-			      (void __iomem *)guid, sizeof(uuid_le));
-		if (uuid_le_cmp(tmpguid, NULL_UUID_LE) != 0)
-			break;
-		UIS_THREAD_WAIT_SEC(5);
-	}
-}
-
-static inline unsigned int
-issue_vmcall_io_controlvm_addr(u64 *control_addr, u32 *control_bytes)
-{
-	struct vmcall_io_controlvm_addr_params params;
-	int result = VMCALL_SUCCESS;
-	u64 physaddr;
-
-	physaddr = virt_to_phys(&params);
-	ISSUE_IO_VMCALL(VMCALL_IO_CONTROLVM_ADDR, physaddr, result);
-	if (VMCALL_SUCCESSFUL(result)) {
-		*control_addr = params.address;
-		*control_bytes = params.channel_bytes;
-	}
-	return result;
-}
-
-static inline unsigned int issue_vmcall_io_diag_addr(u64 *diag_channel_addr)
-{
-	struct vmcall_io_diag_addr_params params;
-	int result = VMCALL_SUCCESS;
-	u64 physaddr;
-
-	physaddr = virt_to_phys(&params);
-	ISSUE_IO_VMCALL(VMCALL_IO_DIAG_ADDR, physaddr, result);
-	if (VMCALL_SUCCESSFUL(result))
-		*diag_channel_addr = params.address;
-	return result;
-}
-
-static inline unsigned int issue_vmcall_io_visorserial_addr(u64 *channel_addr)
-{
-	struct vmcall_io_visorserial_addr_params params;
-	int result = VMCALL_SUCCESS;
-	u64 physaddr;
-
-	physaddr = virt_to_phys(&params);
-	ISSUE_IO_VMCALL(VMCALL_IO_VISORSERIAL_ADDR, physaddr, result);
-	if (VMCALL_SUCCESSFUL(result))
-		*channel_addr = params.address;
-	return result;
-}
-
-static inline s64 issue_vmcall_query_guest_virtual_time_offset(void)
-{
-	u64 result = VMCALL_SUCCESS;
-	u64 physaddr = 0;
-
-	ISSUE_IO_VMCALL(VMCALL_QUERY_GUEST_VIRTUAL_TIME_OFFSET, physaddr,
-			result);
-	return result;
-}
-
-struct log_info_t {
-	unsigned long long last_cycles;
-	unsigned long long delta_sum[64];
-	unsigned long long delta_cnt[64];
-	unsigned long long max_delta[64];
-	unsigned long long min_delta[64];
-};
-
-static inline int issue_vmcall_update_physical_time(u64 adjustment)
-{
-	int result = VMCALL_SUCCESS;
-
-	ISSUE_IO_VMCALL(VMCALL_UPDATE_PHYSICAL_TIME, adjustment, result);
-	return result;
-}
-
-static inline unsigned int issue_vmcall_channel_mismatch(const char *chname,
-			      const char *item_name, u32 line_no,
-			      const char *path_n_fn)
-{
-	struct vmcall_channel_version_mismatch_params params;
-	int result = VMCALL_SUCCESS;
-	u64 physaddr;
-	char *last_slash = NULL;
-
-	strlcpy(params.chname, chname, sizeof(params.chname));
-	strlcpy(params.item_name, item_name, sizeof(params.item_name));
-	params.line_no = line_no;
-
-	last_slash = strrchr(path_n_fn, '/');
-	if (last_slash != NULL) {
-		last_slash++;
-		strlcpy(params.file_name, last_slash, sizeof(params.file_name));
-	} else
-		strlcpy(params.file_name,
-			"Cannot determine source filename",
-			sizeof(params.file_name));
-
-	physaddr = virt_to_phys(&params);
-	ISSUE_IO_VMCALL(VMCALL_CHANNEL_VERSION_MISMATCH, physaddr, result);
-	return result;
-}
-
-#define UIS_DAEMONIZE(nam)
-
-void uislib_enable_channel_interrupts(u32 bus_no, u32 dev_no,
-				      int (*interrupt)(void *),
-				      void *interrupt_context);
-void uislib_disable_channel_interrupts(u32 bus_no, u32 dev_no);
-void uislib_force_channel_interrupt(u32 bus_no, u32 dev_no);
-
-#endif /* __UISUTILS__H__ */
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index e6d7075..b96a40c 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -26,14 +26,15 @@
 #include <linux/uuid.h>
 #include <linux/crash_dump.h>
 
+#include "channel_guid.h"
 #include "controlvmchannel.h"
 #include "controlvmcompletionstatus.h"
 #include "guestlinuxdebug.h"
 #include "periodic_work.h"
-#include "uisutils.h"
 #include "version.h"
 #include "visorbus.h"
 #include "visorbus_private.h"
+#include "vmcallinterface.h"
 
 #define CURRENT_FILE_PC VISOR_CHIPSET_PC_visorchipset_main_c
 
@@ -1856,6 +1857,22 @@ handle_command(struct controlvm_message inmsg, u64 channel_addr)
 	return true;
 }
 
+static inline unsigned int
+issue_vmcall_io_controlvm_addr(u64 *control_addr, u32 *control_bytes)
+{
+	struct vmcall_io_controlvm_addr_params params;
+	int result = VMCALL_SUCCESS;
+	u64 physaddr;
+
+	physaddr = virt_to_phys(&params);
+	ISSUE_IO_VMCALL(VMCALL_IO_CONTROLVM_ADDR, physaddr, result);
+	if (VMCALL_SUCCESSFUL(result)) {
+		*control_addr = params.address;
+		*control_bytes = params.channel_bytes;
+	}
+	return result;
+}
+
 static u64 controlvm_get_channel_address(void)
 {
 	u64 addr = 0;
@@ -2239,6 +2256,24 @@ visorchipset_mmap(struct file *file, struct vm_area_struct *vma)
 	return 0;
 }
 
+static inline s64 issue_vmcall_query_guest_virtual_time_offset(void)
+{
+	u64 result = VMCALL_SUCCESS;
+	u64 physaddr = 0;
+
+	ISSUE_IO_VMCALL(VMCALL_QUERY_GUEST_VIRTUAL_TIME_OFFSET, physaddr,
+			result);
+	return result;
+}
+
+static inline int issue_vmcall_update_physical_time(u64 adjustment)
+{
+	int result = VMCALL_SUCCESS;
+
+	ISSUE_IO_VMCALL(VMCALL_UPDATE_PHYSICAL_TIME, adjustment, result);
+	return result;
+}
+
 static long visorchipset_ioctl(struct file *file, unsigned int cmd,
 			       unsigned long arg)
 {
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 17/44] staging: unisys: Remove temporarily added visorbus/ include in Makefile
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (15 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 16/44] staging: unisys: remove remaining utility headers Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 18/44] staging: unisys: Embed struct device for easier handling of attr Benjamin Romer
                   ` (26 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Now that the header file movement is complete, remove the temporary ccflags
include

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/Makefile | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/staging/unisys/visorbus/Makefile b/drivers/staging/unisys/visorbus/Makefile
index 2650b72..fa27ee5 100644
--- a/drivers/staging/unisys/visorbus/Makefile
+++ b/drivers/staging/unisys/visorbus/Makefile
@@ -11,4 +11,3 @@ visorbus-y += periodic_work.o
 
 ccflags-y += -Idrivers/staging/unisys/include
 ccflags-y += -Idrivers/staging/unisys/visorutil
-ccflags-y += -Idrivers/staging/unisys/visorbus
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 18/44] staging: unisys: Embed struct device for easier handling of attr
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (16 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 17/44] staging: unisys: Remove temporarily added visorbus/ include in Makefile Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 19/44] staging: unisys: Wire up proper device attr for bus Benjamin Romer
                   ` (25 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Handling the sysfs attributes become easier to deal with when you can just
run container_of(dev) to get devdata.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 28 ++++++++-----------------
 1 file changed, 9 insertions(+), 19 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 114a765..228aec5 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -41,7 +41,7 @@ int visorbus_debugref;
 struct visorbus_devdata {
 	int devno;		/* this is the chipset busNo */
 	struct list_head list_all;
-	struct device *dev;
+	struct device dev;
 	struct kobject kobj;
 	struct visorchannel *chan;	/* channel area for bus itself */
 	bool vbus_valid;
@@ -1329,7 +1329,7 @@ create_visor_device(struct visorbus_devdata *devdata,
 	dev->channel_bytes = chan_info.n_channel_bytes;
 	dev->chipset_bus_no = chipset_bus_no;
 	dev->chipset_dev_no = chipset_dev_no;
-	dev->device.parent = devdata->dev;
+	dev->device.parent = &devdata->dev;
 	sema_init(&dev->visordriver_callback_lock, 1);	/* unlocked */
 	dev->device.bus = &visorbus_type;
 	device_initialize(&dev->device);
@@ -1636,34 +1636,24 @@ create_bus_instance(int id)
 {
 	struct visorbus_devdata *rc = NULL;
 	struct visorbus_devdata *devdata = NULL;
-	struct device *dev;
 	struct visorchipset_bus_info bus_info;
 
 	POSTCODE_LINUX_2(BUS_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO);
-	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
-	if (!dev) {
+	devdata = kzalloc(sizeof(*devdata), GFP_KERNEL);
+	if (!devdata) {
 		POSTCODE_LINUX_2(MALLOC_FAILURE_PC, POSTCODE_SEVERITY_ERR);
 		rc = NULL;
 		goto away;
 	}
-	memset(dev, 0, sizeof(struct device));
-	dev_set_name(dev, "visorbus%d", id);
-	dev->release = visorbus_release_busdevice;
-	if (device_register(dev) < 0) {
+	dev_set_name(&devdata->dev, "visorbus%d", id);
+	devdata->dev.release = visorbus_release_busdevice;
+	if (device_register(&devdata->dev) < 0) {
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
 				 POSTCODE_SEVERITY_ERR);
 		rc = NULL;
 		goto away;
 	}
-	devdata = kmalloc(sizeof(*devdata), GFP_KERNEL);
-	if (!devdata) {
-		POSTCODE_LINUX_2(MALLOC_FAILURE_PC, POSTCODE_SEVERITY_ERR);
-		rc = NULL;
-		goto away;
-	}
-	memset(devdata, 0, sizeof(struct visorbus_devdata));
 	devdata->devno = id;
-	devdata->dev = dev;
 	if ((visorchipset_get_bus_info(id, &bus_info)) &&
 	    (bus_info.chan_info.channel_addr > 0) &&
 	    (bus_info.chan_info.n_channel_bytes > 0)) {
@@ -1707,7 +1697,7 @@ create_bus_instance(int id)
 	list_add_tail(&devdata->list_all, &list_all_bus_instances);
 	if (id == 0)
 			devdata = devdata;	/* for testing ONLY */
-	dev_set_drvdata(dev, devdata);
+	dev_set_drvdata(&devdata->dev, devdata);
 	rc = devdata;
 away:
 	return rc;
@@ -1732,7 +1722,7 @@ remove_bus_instance(struct visorbus_devdata *devdata)
 		devdata->chan = NULL;
 	}
 	list_del(&devdata->list_all);
-	device_unregister(devdata->dev);
+	device_unregister(&devdata->dev);
 }
 
 /** Create and register the one-and-only one instance of
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 19/44] staging: unisys: Wire up proper device attr for bus
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (17 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 18/44] staging: unisys: Embed struct device for easier handling of attr Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 20/44] staging: unisys: Move the visorbus device underneath devices Benjamin Romer
                   ` (24 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Jes.Sorensen, driverdev-devel, sparmaintainer, Don Zickus,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

This patch moves the attributes to underneath the bus device correctly.
This will help remove a bunch of cruft from the code and let the kernel
infrastructure manage the sysfs files instead of the driver.

After the move remove all the leftover code.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 266 +++++-------------------
 1 file changed, 55 insertions(+), 211 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 228aec5..e299371 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -606,113 +606,8 @@ void unregister_channel_attributes(struct visor_device *dev)
 	kobject_put(&dev->kobjchannel);
 	dev->kobjchannel.parent = NULL;
 }
-/*   This is actually something they forgot to put in the kernel.
- *   struct bus_type in the kernel SHOULD have a "busses" member, which
- *   should be treated similarly to the "devices" and "drivers" members.
- *   There SHOULD be:
- *   - a "businst_attribute" analogous to the existing "bus_attribute"
- *   - a "businst_create_file" and "businst_remove_file" analogous to the
- *     existing "bus_create_file" and "bus_remove_file".
- *   That's what I created businst.c and businst.h to do.
- *
- *   We want to add the "busses" sub-tree in sysfs, where we will house the
- *   names and properties of each bus instance:
- *
- *       /sys/bus/<bustypename>/
- *           version
- *           devices
- *               <devname1> --> /sys/devices/<businstancename><devname1>
- *               <devname2> --> /sys/devices/<businstancename><devname2>
- *           drivers
- *               <driverinstancename1>
- *                   <driverinstance1property1>
- *                   <driverinstance1property2>
- *                   ...
- *               <driverinstancename2>
- *                   <driverinstance2property1>
- *                   <driverinstance2property2>
- *                   ...
- *   >>      busses
- *   >>          <businstancename1>
- *   >>              <businstance1property1>
- *   >>              <businstance1property2>
- *   >>              ...
- *   >>          <businstancename2>
- *   >>              <businstance2property1>
- *   >>              <businstance2property2>
- *   >>              ...
- *
- *   I considered adding bus instance properties under
- *   /sys/devices/<businstancename>.  But I thought there may be existing
- *   notions that ONLY device sub-trees should live under
- *   /sys/devices/<businstancename>.  So I stayed out of there.
- *
- */
-
-struct businst_attribute {
-	struct attribute attr;
-	 ssize_t (*show)(struct visorbus_devdata*, char *buf);
-	 ssize_t (*store)(struct visorbus_devdata*, const char *buf,
-			  size_t count);
-};
-
-#define to_businst_attr(_attr) \
-	container_of(_attr, struct businst_attribute, attr)
 #define to_visorbus_devdata(obj) \
-	container_of(obj, struct visorbus_devdata, kobj)
-
-static ssize_t
-businst_attr_show(struct kobject *kobj, struct attribute *attr,
-		  char *buf)
-{
-	struct businst_attribute *businst_attr = to_businst_attr(attr);
-	struct visorbus_devdata *bus = to_visorbus_devdata(kobj);
-	ssize_t ret = 0;
-
-	if (businst_attr->show)
-		ret = businst_attr->show(bus, buf);
-	return ret;
-}
-
-static ssize_t
-businst_attr_store(struct kobject *kobj, struct attribute *attr,
-		   const char *buf, size_t count)
-{
-	struct businst_attribute *businst_attr = to_businst_attr(attr);
-	struct visorbus_devdata *bus = to_visorbus_devdata(kobj);
-	ssize_t ret = 0;
-
-	if (businst_attr->store)
-		ret = businst_attr->store(bus, buf, count);
-	return ret;
-}
-
-static int
-businst_create_file(struct visorbus_devdata *bus,
-		    struct businst_attribute *attr)
-{
-	return sysfs_create_file(&bus->kobj, &attr->attr);
-}
-
-static void
-businst_remove_file(struct visorbus_devdata *bus,
-		    struct businst_attribute *attr)
-{
-	sysfs_remove_file(&bus->kobj, &attr->attr);
-}
-
-static const struct sysfs_ops businst_sysfs_ops = {
-	.show = businst_attr_show,
-	.store = businst_attr_store,
-};
-
-static struct kobj_type businst_kobj_type = {
-	.sysfs_ops = &businst_sysfs_ops
-};
-
-static struct kset businstances = { /* should actually be a member of
-				     * bus_type */
-};
+	container_of(obj, struct visorbus_devdata, dev)
 
 /*  BUS type attributes
  *
@@ -736,23 +631,6 @@ register_bustype_attributes(void)
 	int rc = 0;
 
 	rc = bus_create_file(&visorbus_type, &bustype_attr_version);
-	if (rc < 0)
-			goto away;
-
-	/* Here we make up for the fact that bus_type does not yet have a
-	 * member to keep track of multiple bus instances for a given bus
-	 * type.  This is useful for stashing properties for each bus
-	 * instance.
-	 */
-	kobject_set_name(&businstances.kobj, "busses");
-	businstances.kobj.ktype = &businst_kobj_type;
-	businstances.kobj.parent = &visorbus_type.p->subsys.kobj;
-	rc = kset_register(&businstances);
-	if (rc < 0)
-			goto away;
-
-	rc = 0;
-away:
 	return rc;
 }
 
@@ -760,7 +638,6 @@ static void
 unregister_bustype_attributes(void)
 {
 	bus_remove_file(&visorbus_type, &bustype_attr_version);
-	kset_unregister(&businstances);
 }
 
 /*  BUS instance attributes
@@ -774,8 +651,10 @@ unregister_bustype_attributes(void)
  *
  */
 
-static ssize_t businst_attr_partition_handle(struct visorbus_devdata *businst,
-					     char *buf) {
+static ssize_t partition_handle_show(struct device *dev,
+				     struct device_attribute *attr,
+				     char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -786,8 +665,10 @@ static ssize_t businst_attr_partition_handle(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_partition_guid(struct visorbus_devdata *businst,
-					   char *buf) {
+static ssize_t partition_guid_show(struct device *dev,
+				   struct device_attribute *attr,
+				   char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -797,8 +678,10 @@ static ssize_t businst_attr_partition_guid(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_partition_name(struct visorbus_devdata *businst,
-					   char *buf) {
+static ssize_t partition_name_show(struct device *dev,
+				   struct device_attribute *attr,
+				   char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -809,8 +692,10 @@ static ssize_t businst_attr_partition_name(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_channel_addr(struct visorbus_devdata *businst,
-					 char *buf) {
+static ssize_t channel_addr_show(struct device *dev,
+				 struct device_attribute *attr,
+				 char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -820,8 +705,10 @@ static ssize_t businst_attr_channel_addr(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_nchannel_bytes(struct visorbus_devdata *businst,
-					   char *buf) {
+static ssize_t channel_bytes_show(struct device *dev,
+				  struct device_attribute *attr,
+				  char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int len = 0;
 
@@ -831,8 +718,10 @@ static ssize_t businst_attr_nchannel_bytes(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_channel_id(struct visorbus_devdata *businst,
-				       char *buf) {
+static ssize_t channel_id_show(struct device *dev,
+			       struct device_attribute *attr,
+			       char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	int len = 0;
 
 	if (businst && businst->chan) {
@@ -843,8 +732,10 @@ static ssize_t businst_attr_channel_id(struct visorbus_devdata *businst,
 	return len;
 }
 
-static ssize_t businst_attr_client_bus_info(struct visorbus_devdata *businst,
-					    char *buf) {
+static ssize_t client_bus_info_show(struct device *dev,
+				    struct device_attribute *attr,
+				    char *buf) {
+	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
 	struct visorchipset_bus_info bus_info;
 	int i, x, remain = PAGE_SIZE;
 	unsigned long off;
@@ -903,79 +794,33 @@ static ssize_t businst_attr_client_bus_info(struct visorbus_devdata *businst,
 	return PAGE_SIZE - remain;
 }
 
-static struct businst_attribute ba_partition_handle =
-	__ATTR(partition_handle, S_IRUGO, businst_attr_partition_handle, NULL);
-static struct businst_attribute ba_partition_guid =
-	__ATTR(partition_guid, S_IRUGO, businst_attr_partition_guid, NULL);
-static struct businst_attribute ba_partition_name =
-	__ATTR(partition_name, S_IRUGO, businst_attr_partition_name, NULL);
-static struct businst_attribute ba_channel_addr =
-	__ATTR(channel_addr, S_IRUGO, businst_attr_channel_addr, NULL);
-static struct businst_attribute ba_nchannel_bytes =
-	__ATTR(nchannel_bytes, S_IRUGO, businst_attr_nchannel_bytes, NULL);
-static struct businst_attribute ba_channel_id =
-	__ATTR(channel_id, S_IRUGO, businst_attr_channel_id, NULL);
-static struct businst_attribute ba_client_bus_info =
-	__ATTR(client_bus_info, S_IRUGO, businst_attr_client_bus_info, NULL);
-
-static int
-register_businst_attributes(struct visorbus_devdata *businst)
-{
-	int rc = 0;
-
-	businst->kobj.kset = &businstances;	/* identify parent sysfs dir */
-	rc = kobject_init_and_add(&businst->kobj, &businst_kobj_type,
-				  NULL, "visorbus%d", businst->devno);
-	if (rc < 0)
-			goto away;
-
-	rc = businst_create_file(businst, &ba_partition_handle);
-	if (rc < 0)
-			goto away;
-
-	rc = businst_create_file(businst, &ba_partition_guid);
-	if (rc < 0)
-			goto away;
-
-	rc = businst_create_file(businst, &ba_partition_name);
-	if (rc < 0)
-			goto away;
-
-	rc = businst_create_file(businst, &ba_channel_addr);
-	if (rc < 0)
-			goto away;
-
-	rc = businst_create_file(businst, &ba_nchannel_bytes);
-	if (rc < 0)
-			goto away;
-
-	rc = businst_create_file(businst, &ba_channel_id);
-	if (rc < 0)
-			goto away;
-
-	rc = businst_create_file(businst, &ba_client_bus_info);
-	if (rc < 0)
-			goto away;
-
-	kobject_uevent(&businst->kobj, KOBJ_ADD);
+static DEVICE_ATTR_RO(partition_handle);
+static DEVICE_ATTR_RO(partition_guid);
+static DEVICE_ATTR_RO(partition_name);
+static DEVICE_ATTR_RO(channel_addr);
+static DEVICE_ATTR_RO(channel_bytes);
+static DEVICE_ATTR_RO(channel_id);
+static DEVICE_ATTR_RO(client_bus_info);
+
+static struct attribute *dev_attrs[] = {
+		&dev_attr_partition_handle.attr,
+		&dev_attr_partition_guid.attr,
+		&dev_attr_partition_name.attr,
+		&dev_attr_channel_addr.attr,
+		&dev_attr_channel_bytes.attr,
+		&dev_attr_channel_id.attr,
+		&dev_attr_client_bus_info.attr,
+		NULL
+};
 
-	rc = 0;
-away:
-	return rc;
-}
+static struct attribute_group dev_attr_grp = {
+		.attrs = dev_attrs,
+};
 
-static void
-unregister_businst_attributes(struct visorbus_devdata *businst)
-{
-	businst_remove_file(businst, &ba_partition_handle);
-	businst_remove_file(businst, &ba_partition_guid);
-	businst_remove_file(businst, &ba_partition_name);
-	businst_remove_file(businst, &ba_channel_addr);
-	businst_remove_file(businst, &ba_nchannel_bytes);
-	businst_remove_file(businst, &ba_channel_id);
-	businst_remove_file(businst, &ba_client_bus_info);
-	kobject_put(&businst->kobj);
-}
+static const struct attribute_group *visorbus_groups[] = {
+		&dev_attr_grp,
+		NULL
+};
 
 /*  DRIVER attributes
  *
@@ -1646,6 +1491,7 @@ create_bus_instance(int id)
 		goto away;
 	}
 	dev_set_name(&devdata->dev, "visorbus%d", id);
+	devdata->dev.groups = visorbus_groups;
 	devdata->dev.release = visorbus_release_busdevice;
 	if (device_register(&devdata->dev) < 0) {
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
@@ -1692,7 +1538,6 @@ create_bus_instance(int id)
 			}
 		}
 	}
-	register_businst_attributes(devdata);
 	bus_count++;
 	list_add_tail(&devdata->list_all, &list_all_bus_instances);
 	if (id == 0)
@@ -1715,7 +1560,6 @@ remove_bus_instance(struct visorbus_devdata *devdata)
 	 * successfully been able to trace thru the code to see where/how
 	 * release() gets called.  But I know it does.
 	 */
-	unregister_businst_attributes(devdata);
 	bus_count--;
 	if (devdata->chan) {
 		visorchannel_destroy(devdata->chan);
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 20/44] staging: unisys: Move the visorbus device underneath devices
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (18 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 19/44] staging: unisys: Wire up proper device attr for bus Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 21/44] staging: unisys: Properly move version file into bus attr Benjamin Romer
                   ` (23 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Mimicing what other drivers do, this seems appropriate.  Yeah, it
is a bus, but it is a bus _device_.  This makes things work better
and smoother.  Now the sysfs looks like

[root@dhcp-17-174 visorbus]# ls -l /sys/bus/visorbus/devices/
total 0
lrwxrwxrwx. 1 root root 0 Apr 17 16:09 vbus1:dev2 ->
		../../../devices/visorbus1/vbus1:dev2
lrwxrwxrwx. 1 root root 0 Apr 17 16:09 visorbus1 ->
		../../../devices/visorbus1

Which looks correct.  All the attributes are still correct too, based on my
very minimal testing of 'ls -lR'. :-)

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index e299371..a9cbaa6 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -1491,6 +1491,7 @@ create_bus_instance(int id)
 		goto away;
 	}
 	dev_set_name(&devdata->dev, "visorbus%d", id);
+	devdata->dev.bus = &visorbus_type;
 	devdata->dev.groups = visorbus_groups;
 	devdata->dev.release = visorbus_release_busdevice;
 	if (device_register(&devdata->dev) < 0) {
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 21/44] staging: unisys: Properly move version file into bus attr
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (19 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 20/44] staging: unisys: Move the visorbus device underneath devices Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 22/44] staging: unisys: Remove dead kobj structs Benjamin Romer
                   ` (22 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Simplify things by moving the version file handling into the core.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 66 +++++++++++--------------
 1 file changed, 30 insertions(+), 36 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index a9cbaa6..1bad050 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -88,6 +88,35 @@ static int visorbus_uevent(struct device *xdev, struct kobj_uevent_env *env);
 static int visorbus_match(struct device *xdev, struct device_driver *xdrv);
 static void fix_vbus_dev_info(struct visor_device *visordev);
 
+/*  BUS type attributes
+ *
+ *  define & implement display of bus attributes under
+ *  /sys/bus/visorbus.
+ *
+ */
+
+static ssize_t version_show(struct bus_type *bus, char *buf)
+{
+	return snprintf(buf, PAGE_SIZE, "%s\n", VERSION);
+}
+
+static BUS_ATTR_RO(version);
+
+static struct attribute *visorbus_bus_attrs[] = {
+	&bus_attr_version.attr,
+	NULL,
+};
+
+static const struct attribute_group visorbus_bus_group = {
+	.attrs = visorbus_bus_attrs,
+};
+
+const struct attribute_group *visorbus_bus_groups[] = {
+	&visorbus_bus_group,
+	NULL,
+};
+
+
 /** This describes the TYPE of bus.
  *  (Don't confuse this with an INSTANCE of the bus.)
  */
@@ -95,6 +124,7 @@ static struct bus_type visorbus_type = {
 	.name = "visorbus",
 	.match = visorbus_match,
 	.uevent = visorbus_uevent,
+	.bus_groups = visorbus_bus_groups,
 };
 
 static struct delayed_work periodic_work;
@@ -609,37 +639,6 @@ void unregister_channel_attributes(struct visor_device *dev)
 #define to_visorbus_devdata(obj) \
 	container_of(obj, struct visorbus_devdata, dev)
 
-/*  BUS type attributes
- *
- *  define & implement display of bus attributes under
- *  /sys/bus/visorbus.
- *
- */
-
-static ssize_t
-BUSTYPE_ATTR_version(struct bus_type *bus, char *buf)
-{
-	return snprintf(buf, PAGE_SIZE, "%s\n", VERSION);
-}
-
-static struct bus_attribute bustype_attr_version =
-__ATTR(version, S_IRUGO, BUSTYPE_ATTR_version, NULL);
-
-static int
-register_bustype_attributes(void)
-{
-	int rc = 0;
-
-	rc = bus_create_file(&visorbus_type, &bustype_attr_version);
-	return rc;
-}
-
-static void
-unregister_bustype_attributes(void)
-{
-	bus_remove_file(&visorbus_type, &bustype_attr_version);
-}
-
 /*  BUS instance attributes
  *
  *  define & implement display of bus attributes under
@@ -1580,10 +1579,6 @@ create_bus_type(void)
 
 	visorbus_type.dev_attrs = visor_device_attrs;
 	rc = bus_register(&visorbus_type);
-	if (rc < 0)
-			return rc;
-
-	rc = register_bustype_attributes();
 	return rc;
 }
 
@@ -1592,7 +1587,6 @@ create_bus_type(void)
 static void
 remove_bus_type(void)
 {
-	unregister_bustype_attributes();
 	bus_unregister(&visorbus_type);
 }
 
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 22/44] staging: unisys: Remove dead kobj structs
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (20 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 21/44] staging: unisys: Properly move version file into bus attr Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 23/44] staging: unisys: Clean up device sysfs attributes Benjamin Romer
                   ` (21 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Remove stale code.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 32 -------------------------
 1 file changed, 32 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 1bad050..cacc534 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -48,38 +48,6 @@ struct visorbus_devdata {
 	struct spar_vbus_headerinfo vbus_hdr_info;
 };
 
-/* These forward declarations are required since our drivers are out-of-tree.
- * The structures referenced are kernel-private and are not in the headers, but
- * it is impossible to make a functioning bus driver without them.
- */
-struct subsys_private {
-	struct kset subsys;
-	struct kset *devices_kset;
-
-	struct kset *drivers_kset;
-	struct klist klist_devices;
-	struct klist klist_drivers;
-	struct blocking_notifier_head bus_notifier;
-	unsigned int drivers_autoprobe:1;
-	struct bus_type *bus;
-
-	struct list_head class_interfaces;
-	struct kset glue_dirs;
-	struct mutex class_mutex; /* ignore */
-	struct class *class;
-};
-
-struct bus_type_private {
-	struct kset subsys;
-	struct kset *drivers_kset;
-	struct kset *devices_kset;
-	struct klist klist_devices;
-	struct klist klist_drivers;
-	struct blocking_notifier_head bus_notifier;
-	unsigned int drivers_autoprobe:1;
-	struct bus_type *bus;
-};
-
 #define CURRENT_FILE_PC VISOR_BUS_PC_visorbus_main_c
 #define POLLJIFFIES_TESTWORK         100
 #define POLLJIFFIES_NORMALCHANNEL     10
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 23/44] staging: unisys: Clean up device sysfs attributes
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (21 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 22/44] staging: unisys: Remove dead kobj structs Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 24/44] staging: unisys: Prep for removing 'info' structs Benjamin Romer
                   ` (20 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Properly hook into the struct device groups element.  This allows the
core infrastructure to manage the files instead of the bus layer.  And
makes the code easier to read.

I didn't clean up the _show functions just modified them a bit to handle
the different args for now and to prevent a build warning.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/visorbus.h       |   1 -
 drivers/staging/unisys/visorbus/visorbus_main.c | 225 +++++++-----------------
 2 files changed, 68 insertions(+), 158 deletions(-)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index d542822..6c551df 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -128,7 +128,6 @@ struct visor_device {
 	struct periodic_work *periodic_work;
 	bool being_removed;
 	bool responded_to_device_create;
-	struct kobject kobjchannel;	/* visorbus<x>/dev<y>/channel/ */
 	struct kobject kobjdevmajorminor; /* visorbus<x>/dev<y>/devmajorminor/*/
 	struct {
 		int major, minor;
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index cacc534..c654c67 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -396,214 +396,134 @@ unregister_devmajorminor_attributes(struct visor_device *dev)
 	dev->kobjdevmajorminor.parent = NULL;
 }
 
-/* Implement publishing of channel attributes under:
- *
- *     /sys/bus/visorbus<x>/dev<y>/channel
- *
- */
-
-#define to_channel_attr(_attr) \
-	container_of(_attr, struct channel_attribute, attr)
-#define to_visor_device_from_kobjchannel(obj) \
-	container_of(obj, struct visor_device, kobjchannel)
-
-struct channel_attribute {
-	struct attribute attr;
-	 ssize_t (*show)(struct visor_device*, char *buf);
-	 ssize_t (*store)(struct visor_device*, const char *buf, size_t count);
-};
-
 /* begin implementation of specific channel attributes to appear under
 * /sys/bus/visorbus<x>/dev<y>/channel
 */
-static ssize_t devicechannel_attr_physaddr(struct visor_device *dev, char *buf)
+static ssize_t physaddr_show(struct device *dev, struct device_attribute *attr,
+			     char *buf)
 {
-	if (!dev->visorchannel)
+	struct visor_device *vdev = to_visor_device(dev);
+
+	if (!vdev->visorchannel)
 		return 0;
 	return snprintf(buf, PAGE_SIZE, "0x%Lx\n",
-			visorchannel_get_physaddr(dev->visorchannel));
+			visorchannel_get_physaddr(vdev->visorchannel));
 }
 
-static ssize_t devicechannel_attr_nbytes(struct visor_device *dev, char *buf)
+static ssize_t nbytes_show(struct device *dev, struct device_attribute *attr,
+			   char *buf)
 {
-	if (!dev->visorchannel)
+	struct visor_device *vdev = to_visor_device(dev);
+
+	if (!vdev->visorchannel)
 		return 0;
 	return snprintf(buf, PAGE_SIZE, "0x%lx\n",
-			visorchannel_get_nbytes(dev->visorchannel));
+			visorchannel_get_nbytes(vdev->visorchannel));
 }
 
-static ssize_t devicechannel_attr_clientpartition(struct visor_device *dev,
-						  char *buf) {
-	if (!dev->visorchannel)
+static ssize_t clientpartition_show(struct device *dev,
+				    struct device_attribute *attr, char *buf)
+{
+	struct visor_device *vdev = to_visor_device(dev);
+
+	if (!vdev->visorchannel)
 		return 0;
 	return snprintf(buf, PAGE_SIZE, "0x%Lx\n",
-			visorchannel_get_clientpartition(dev->visorchannel));
+			visorchannel_get_clientpartition(vdev->visorchannel));
 }
 
-static ssize_t devicechannel_attr_typeguid(struct visor_device *dev, char *buf)
+static ssize_t typeguid_show(struct device *dev, struct device_attribute *attr,
+			     char *buf)
 {
+	struct visor_device *vdev = to_visor_device(dev);
 	char s[99];
 
-	if (!dev->visorchannel)
+	if (!vdev->visorchannel)
 		return 0;
 	return snprintf(buf, PAGE_SIZE, "%s\n",
-			visorchannel_id(dev->visorchannel, s));
+			visorchannel_id(vdev->visorchannel, s));
 }
 
-static ssize_t devicechannel_attr_zoneguid(struct visor_device *dev, char *buf)
+static ssize_t zoneguid_show(struct device *dev, struct device_attribute *attr,
+			     char *buf)
 {
+	struct visor_device *vdev = to_visor_device(dev);
 	char s[99];
 
-	if (!dev->visorchannel)
+	if (!vdev->visorchannel)
 		return 0;
 	return snprintf(buf, PAGE_SIZE, "%s\n",
-			visorchannel_zoneid(dev->visorchannel, s));
+			visorchannel_zoneid(vdev->visorchannel, s));
 }
 
-static ssize_t devicechannel_attr_typename(struct visor_device *dev, char *buf)
+static ssize_t typename_show(struct device *dev, struct device_attribute *attr,
+			     char *buf)
 {
+	struct visor_device *vdev = to_visor_device(dev);
 	int i = 0;
-	struct bus_type *xbus = dev->device.bus;
-	struct device_driver *xdrv = dev->device.driver;
+	struct bus_type *xbus = dev->bus;
+	struct device_driver *xdrv = dev->driver;
 	struct visor_driver *drv = NULL;
 
-	if (!dev->visorchannel || !xbus || !xdrv)
+	if (!vdev->visorchannel || !xbus || !xdrv)
 		return 0;
-	i = xbus->match(&dev->device, xdrv);
+	i = xbus->match(dev, xdrv);
 	if (!i)
 		return 0;
 	drv = to_visor_driver(xdrv);
 	return snprintf(buf, PAGE_SIZE, "%s\n", drv->channel_types[i - 1].name);
 }
 
-static ssize_t devicechannel_attr_dump(struct visor_device *dev, char *buf)
+static ssize_t dump_show(struct device *dev, struct device_attribute *attr,
+			 char *buf)
 {
-	int count = 0;
 /* TODO: replace this with debugfs code
+	struct visor_device *vdev = to_visor_device(dev);
+	int count = 0;
 	struct seq_file *m = NULL;
-	if (dev->visorchannel == NULL)
+	if (vdev->visorchannel == NULL)
 		return 0;
 	m = visor_seq_file_new_buffer(buf, PAGE_SIZE - 1);
 	if (m == NULL)
 		return 0;
-	visorchannel_debug(dev->visorchannel, 1, m, 0);
+	visorchannel_debug(vdev->visorchannel, 1, m, 0);
 	count = m->count;
 	visor_seq_file_done_buffer(m);
 	m = NULL;
 */
-	return count;
-}
-
-static struct channel_attribute all_channel_attrs[] = {
-	__ATTR(physaddr, S_IRUGO,
-	       devicechannel_attr_physaddr, NULL),
-	__ATTR(nbytes, S_IRUGO,
-	       devicechannel_attr_nbytes, NULL),
-	__ATTR(clientpartition, S_IRUGO,
-	       devicechannel_attr_clientpartition, NULL),
-	__ATTR(typeguid, S_IRUGO,
-	       devicechannel_attr_typeguid, NULL),
-	__ATTR(zoneguid, S_IRUGO,
-	       devicechannel_attr_zoneguid, NULL),
-	__ATTR(typename, S_IRUGO,
-	       devicechannel_attr_typename, NULL),
-	__ATTR(dump, S_IRUGO,
-	       devicechannel_attr_dump, NULL),
-};
-
-/* end implementation of specific channel attributes */
-
-static ssize_t channel_attr_show(struct kobject *kobj, struct attribute *attr,
-				 char *buf)
-{
-	struct channel_attribute *channel_attr = to_channel_attr(attr);
-	struct visor_device *dev = to_visor_device_from_kobjchannel(kobj);
-	ssize_t ret = 0;
-
-	if (channel_attr->show)
-		ret = channel_attr->show(dev, buf);
-	return ret;
-}
-
-static ssize_t channel_attr_store(struct kobject *kobj, struct attribute *attr,
-				  const char *buf, size_t count)
-{
-	struct channel_attribute *channel_attr = to_channel_attr(attr);
-	struct visor_device *dev = to_visor_device_from_kobjchannel(kobj);
-	ssize_t ret = 0;
-
-	if (channel_attr->store)
-		ret = channel_attr->store(dev, buf, count);
-	return ret;
-}
-
-static int channel_create_file(struct visor_device *dev,
-			       struct channel_attribute *attr)
-{
-	return sysfs_create_file(&dev->kobjchannel, &attr->attr);
-}
-
-static void channel_remove_file(struct visor_device *dev,
-				struct channel_attribute *attr)
-{
-	sysfs_remove_file(&dev->kobjchannel, &attr->attr);
+	return 0;
 }
 
-static const struct sysfs_ops channel_sysfs_ops = {
-	.show = channel_attr_show,
-	.store = channel_attr_store,
+static DEVICE_ATTR_RO(physaddr);
+static DEVICE_ATTR_RO(nbytes);
+static DEVICE_ATTR_RO(clientpartition);
+static DEVICE_ATTR_RO(typeguid);
+static DEVICE_ATTR_RO(zoneguid);
+static DEVICE_ATTR_RO(typename);
+static DEVICE_ATTR_RO(dump);
+
+static struct attribute *channel_attrs[] = {
+		&dev_attr_physaddr.attr,
+		&dev_attr_nbytes.attr,
+		&dev_attr_clientpartition.attr,
+		&dev_attr_typeguid.attr,
+		&dev_attr_zoneguid.attr,
+		&dev_attr_typename.attr,
+		&dev_attr_dump.attr,
 };
 
-static struct kobj_type channel_kobj_type = {
-	.sysfs_ops = &channel_sysfs_ops
+static struct attribute_group channel_attr_grp = {
+		.name = "channel",
+		.attrs = channel_attrs,
 };
 
-int register_channel_attributes(struct visor_device *dev)
-{
-	int rc = 0, i = 0, x = 0;
-
-	if (dev->kobjchannel.parent)
-		goto away;	/* already registered */
-	x = kobject_init_and_add(&dev->kobjchannel, &channel_kobj_type,
-				 &dev->device.kobj, "channel");
-	if (x < 0) {
-		rc = x;
-		goto away;
-	}
-
-	kobject_uevent(&dev->kobjchannel, KOBJ_ADD);
-
-	for (i = 0;
-	     i < sizeof(all_channel_attrs) / sizeof(struct channel_attribute);
-	     i++)
-		x = channel_create_file(dev, &all_channel_attrs[i]);
-	if (x < 0) {
-		while (--i >= 0)
-			channel_remove_file(dev, &all_channel_attrs[i]);
-		kobject_del(&dev->kobjchannel);
-		kobject_put(&dev->kobjchannel);
-		rc = x;
-		goto away;
-	}
-away:
-	return rc;
-}
-
-void unregister_channel_attributes(struct visor_device *dev)
-{
-	int i = 0;
+static const struct attribute_group *visorbus_dev_groups[] = {
+		&channel_attr_grp,
+		NULL
+};
 
-	if (!dev->kobjchannel.parent)
-		return;		/* already unregistered */
-	for (i = 0;
-	     i < sizeof(all_channel_attrs) / sizeof(struct channel_attribute);
-	     i++)
-		channel_remove_file(dev, &all_channel_attrs[i]);
+/* end implementation of specific channel attributes */
 
-	kobject_del(&dev->kobjchannel);
-	kobject_put(&dev->kobjchannel);
-	dev->kobjchannel.parent = NULL;
-}
 #define to_visorbus_devdata(obj) \
 	container_of(obj, struct visorbus_devdata, dev)
 
@@ -1144,6 +1064,7 @@ create_visor_device(struct visorbus_devdata *devdata,
 	dev->device.parent = &devdata->dev;
 	sema_init(&dev->visordriver_callback_lock, 1);	/* unlocked */
 	dev->device.bus = &visorbus_type;
+	dev->device.groups = visorbus_dev_groups;
 	device_initialize(&dev->device);
 	dev->device.release = visorbus_release_device;
 	/* keep a reference just for us (now 2) */
@@ -1191,13 +1112,6 @@ create_visor_device(struct visorbus_devdata *devdata,
 	}
 
 	/* note: device_register is simply device_initialize + device_add */
-	rc = register_channel_attributes(dev);
-	if (rc < 0) {
-		POSTCODE_LINUX_3(DEVICE_REGISTER_FAILURE_PC, chipset_dev_no,
-				 DIAG_SEVERITY_ERR);
-		goto away;
-	}
-
 	registered1 = true;
 
 	rc = register_devmajorminor_attributes(dev);
@@ -1214,8 +1128,6 @@ away:
 	if (rc < 0) {
 		if (registered2)
 			unregister_devmajorminor_attributes(dev);
-		if (registered1)
-			unregister_channel_attributes(dev);
 		if (gotten)
 			put_device(&dev->device);
 		if (visorchannel)
@@ -1233,7 +1145,6 @@ remove_visor_device(struct visor_device *dev)
 {
 	list_del(&dev->list_all);
 	unregister_devmajorminor_attributes(dev);
-	unregister_channel_attributes(dev);
 	put_device(&dev->device);
 	device_unregister(&dev->device);
 }
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 24/44] staging: unisys: Prep for removing 'info' structs
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (22 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 23/44] staging: unisys: Clean up device sysfs attributes Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 25/44] staging: unisys: Add visor device find routine Benjamin Romer
                   ` (19 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

The visorbus driver has three _info structs lying around
(device, bus, channel) that store subsets of info from the
bigger structs.

Having these structs around make resource handling very difficult
and more complicated than it needs to be.  Use the device
infrastructure and instead pass 'struct visor_device' all
over the place.

In order to do that 'struct visor_device' needs to get smarter.
This patch adds the pieces to prep for it.  The new elements
will be used in later patches.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/visorbus.h          | 19 +++++++++++++++++++
 drivers/staging/unisys/visorbus/visorbus_main.c    |  2 +-
 drivers/staging/unisys/visorbus/visorbus_private.h |  9 ---------
 drivers/staging/unisys/visorbus/visorchannel.c     |  4 ++++
 4 files changed, 24 insertions(+), 10 deletions(-)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index 6c551df..14f6f8e 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -40,9 +40,18 @@
 
 struct visor_driver;
 struct visor_device;
+extern struct bus_type visorbus_type;
 
 typedef void (*visorbus_state_complete_func) (struct visor_device *dev,
 					      int status);
+struct visorchipset_state {
+	u32 created:1;
+	u32 attached:1;
+	u32 configured:1;
+	u32 running:1;
+	/* Add new fields above. */
+	/* Remaining bits in this 32-bit word are unused. */
+};
 
 /** This struct describes a specific Supervisor channel, by providing its
  *  GUID, name, and sizes.
@@ -141,6 +150,16 @@ struct visor_device {
 	bool resuming;
 	unsigned long chipset_bus_no;
 	unsigned long chipset_dev_no;
+	struct visorchipset_state state;
+	uuid_le type;
+	uuid_le inst;
+	u8 *name;
+	u8 *description;
+	struct controlvm_message_header *pending_msg_hdr;
+	void *vbus_hdr_info;
+	u32 switch_no;
+	u32 internal_port_no;
+	uuid_le partition_uuid;
 };
 
 #define to_visor_device(x) container_of(x, struct visor_device, device)
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index c654c67..7dddb07 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -88,7 +88,7 @@ const struct attribute_group *visorbus_bus_groups[] = {
 /** This describes the TYPE of bus.
  *  (Don't confuse this with an INSTANCE of the bus.)
  */
-static struct bus_type visorbus_type = {
+struct bus_type visorbus_type = {
 	.name = "visorbus",
 	.match = visorbus_match,
 	.uevent = visorbus_uevent,
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index 8326e4d..bbc64bd 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -27,15 +27,6 @@
 
 struct visorchannel;
 
-struct visorchipset_state {
-	u32 created:1;
-	u32 attached:1;
-	u32 configured:1;
-	u32 running:1;
-	/* Add new fields above. */
-	/* Remaining bits in this 32-bit word are unused. */
-};
-
 enum visorchipset_addresstype {
 	/** address is guest physical, but outside of the physical memory
 	 *  region that is controlled by the running OS (this is the normal
diff --git a/drivers/staging/unisys/visorbus/visorchannel.c b/drivers/staging/unisys/visorbus/visorchannel.c
index 2d3e4d6..a9c3ae1 100644
--- a/drivers/staging/unisys/visorbus/visorchannel.c
+++ b/drivers/staging/unisys/visorbus/visorchannel.c
@@ -23,6 +23,7 @@
 #include "version.h"
 #include "visorbus.h"
 #include <linux/uuid.h>
+#include "controlvmchannel.h"
 
 #define MYDRVNAME "visorchannel"
 
@@ -44,6 +45,9 @@ struct visorchannel {
 		struct signal_queue_header event_queue;
 		struct signal_queue_header ack_queue;
 	} safe_uis_queue;
+	struct irq_info intr;
+	uuid_le type;
+	uuid_le inst;
 };
 
 /* Creates the struct visorchannel abstraction for a data area in memory,
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 25/44] staging: unisys: Add visor device find routine
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (23 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 24/44] staging: unisys: Prep for removing 'info' structs Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 26/44] staging: unisys: Add a function to set the clientpartition Benjamin Romer
                   ` (18 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

If we are going to remove the bus_info structs than we need a way
to find the devices when the *_create/destroy cmds are sent over
the vmchannel.

This function crudely impements what pci has.  It takes a bus_no
and dev_no and finds the matching 'struct visor_device'.

This function can/should be optimzed later once we get our heads
wrapped around its needs.  For now, I am using dev_no=0 to mean
the visorbus itself.

The function is limited to chipset.c only because it is only needed
to do the lookups upon receiving a vmchannel command.  Future patches
will make sure the resulting 'struct visor_device' is used every
where else.

Also allow visorbus_type to be more visible for use.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorchipset.c | 39 ++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index b96a40c..42bf02a 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -711,6 +711,45 @@ dev_info_clear(void *v)
 	memset(p, 0, sizeof(struct visorchipset_device_info));
 }
 
+struct visor_busdev {
+	u32 bus_no;
+	u32 dev_no;
+};
+
+static int match_visorbus_dev_by_id(struct device *dev, void *data)
+{
+	struct visor_device *vdev = to_visor_device(dev);
+	struct visor_busdev *id = (struct visor_busdev *)data;
+	u32 bus_no = id->bus_no;
+	u32 dev_no = id->dev_no;
+
+	if (((bus_no == -1) || (vdev->chipset_bus_no == bus_no)) &&
+	    ((dev_no == -1) || (vdev->chipset_dev_no == dev_no)))
+		return 1;
+
+	return 0;
+}
+struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no,
+					       struct visor_device *from)
+{
+	struct device *dev;
+	struct device *dev_start = NULL;
+	struct visor_device *vdev = NULL;
+	struct visor_busdev id = {
+			.bus_no = bus_no,
+			.dev_no = dev_no
+		};
+
+	if (from)
+		dev_start = &from->device;
+	dev = bus_find_device(&visorbus_type, dev_start, (void *)&id,
+			      match_visorbus_dev_by_id);
+	if (dev)
+		vdev = to_visor_device(dev);
+	return vdev;
+}
+EXPORT_SYMBOL(visorbus_get_device_by_id);
+
 static struct visorchipset_bus_info *
 bus_find(struct list_head *list, u32 bus_no)
 {
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 26/44] staging: unisys: Add a function to set the clientpartition
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (24 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 25/44] staging: unisys: Add visor device find routine Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 27/44] staging: unisys: Add checks for creation Benjamin Romer
                   ` (17 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

This patch is an attempt to help hide the channel info behind
accessory functions.  I was trying to keep visorchannel as private
as possible.

The only function missing that seemed to be needed for now was
the ability to set the clientpartition.  So I expose that here.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/visorbus.h      | 2 ++
 drivers/staging/unisys/visorbus/visorchannel.c | 9 +++++++++
 2 files changed, 11 insertions(+)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index 14f6f8e..3375ffd 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -210,6 +210,8 @@ ulong visorchannel_get_nbytes(struct visorchannel *channel);
 char *visorchannel_id(struct visorchannel *channel, char *s);
 char *visorchannel_zoneid(struct visorchannel *channel, char *s);
 u64 visorchannel_get_clientpartition(struct visorchannel *channel);
+int visorchannel_set_clientpartition(struct visorchannel *channel,
+				     u64 partition_handle);
 uuid_le visorchannel_get_uuid(struct visorchannel *channel);
 char *visorchannel_uuid_id(uuid_le *guid, char *s);
 void visorchannel_debug(struct visorchannel *channel, int num_queues,
diff --git a/drivers/staging/unisys/visorbus/visorchannel.c b/drivers/staging/unisys/visorbus/visorchannel.c
index a9c3ae1..1789f9d 100644
--- a/drivers/staging/unisys/visorbus/visorchannel.c
+++ b/drivers/staging/unisys/visorbus/visorchannel.c
@@ -190,6 +190,15 @@ visorchannel_get_clientpartition(struct visorchannel *channel)
 }
 EXPORT_SYMBOL_GPL(visorchannel_get_clientpartition);
 
+int
+visorchannel_set_clientpartition(struct visorchannel *channel,
+				 u64 partition_handle)
+{
+	channel->chan_hdr.partition_handle = partition_handle;
+	return 0;
+}
+EXPORT_SYMBOL_GPL(visorchannel_set_clientpartition);
+
 uuid_le
 visorchannel_get_uuid(struct visorchannel *channel)
 {
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 27/44] staging: unisys: Add checks for creation
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (25 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 26/44] staging: unisys: Add a function to set the clientpartition Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 28/44] staging: unisys: Remove unused intr Benjamin Romer
                   ` (16 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

There was a bunch of channel creation checks before the
visorchannel_create function was called, moving some of those
checks inside.  This keeps the outside code cleaner and handles
the situation where a caller forgets to make these checks.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorchannel.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/staging/unisys/visorbus/visorchannel.c b/drivers/staging/unisys/visorbus/visorchannel.c
index 1789f9d..6e7675e 100644
--- a/drivers/staging/unisys/visorbus/visorchannel.c
+++ b/drivers/staging/unisys/visorbus/visorchannel.c
@@ -62,6 +62,9 @@ visorchannel_create_guts(u64 physaddr, unsigned long channel_bytes,
 	int err;
 	size_t size = sizeof(struct channel_header);
 
+	if (physaddr == 0)
+		return NULL;
+
 	channel = kzalloc(sizeof(*channel), gfp);
 	if (!channel)
 		goto cleanup;
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 28/44] staging: unisys: Remove unused intr
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (26 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 27/44] staging: unisys: Add checks for creation Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 29/44] staging: unisys: Convert the device attributes to visor_device Benjamin Romer
                   ` (15 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

The conversion to visor_device caused some compile issues.The main
problem was the new fields in 'struct visor_device' were not public.
Remove one that wasn't being used for now.

struct irq_info intr

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorchannel.c | 1 -
 drivers/staging/unisys/visorbus/visorchipset.c | 1 -
 2 files changed, 2 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorchannel.c b/drivers/staging/unisys/visorbus/visorchannel.c
index 6e7675e..e0dfaa9 100644
--- a/drivers/staging/unisys/visorbus/visorchannel.c
+++ b/drivers/staging/unisys/visorbus/visorchannel.c
@@ -45,7 +45,6 @@ struct visorchannel {
 		struct signal_queue_header event_queue;
 		struct signal_queue_header ack_queue;
 	} safe_uis_queue;
-	struct irq_info intr;
 	uuid_le type;
 	uuid_le inst;
 };
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 42bf02a..1487daf 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -1352,7 +1352,6 @@ my_device_create(struct controlvm_message *inmsg)
 	dev_info->chan_info.n_channel_bytes = cmd->create_device.channel_bytes;
 	dev_info->chan_info.channel_type_uuid =
 			cmd->create_device.data_type_uuid;
-	dev_info->chan_info.intr = cmd->create_device.intr;
 	list_add(&dev_info->entry, &dev_info_list);
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 29/44] staging: unisys: Convert the device attributes to visor_device
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (27 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 28/44] staging: unisys: Remove unused intr Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 30/44] staging: unisys: Convert bus functions to pass bus_info pointer around Benjamin Romer
                   ` (14 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Convert the device attribute files to properly use visor_device.
This removes a whole bunch of checks and assumptions and simplifies
the code.  Everything is straightforward.

No testing down as I can't mimic channel info correctl.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 80 +++++++++----------------
 1 file changed, 28 insertions(+), 52 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 7dddb07..b66fce5 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -541,78 +541,54 @@ static const struct attribute_group *visorbus_dev_groups[] = {
 static ssize_t partition_handle_show(struct device *dev,
 				     struct device_attribute *attr,
 				     char *buf) {
-	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
-	struct visorchipset_bus_info bus_info;
-	int len = 0;
+	struct visor_device *vdev = to_visor_device(dev);
+	u64 handle = visorchannel_get_clientpartition(vdev->visorchannel);
 
-	if (businst && visorchipset_get_bus_info(businst->devno, &bus_info))
-		len = snprintf(buf, PAGE_SIZE,
-			       "0x%Lx\n",
-			       (unsigned long long)bus_info.partition_handle);
-	return len;
+	return snprintf(buf, PAGE_SIZE, "0x%Lx\n", handle);
 }
 
 static ssize_t partition_guid_show(struct device *dev,
 				   struct device_attribute *attr,
 				   char *buf) {
-	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
-	struct visorchipset_bus_info bus_info;
-	int len = 0;
+	struct visor_device *vdev = to_visor_device(dev);
 
-	if (businst && visorchipset_get_bus_info(businst->devno, &bus_info))
-		len = snprintf(buf, PAGE_SIZE, "{%pUb}\n",
-			       &bus_info.partition_uuid);
-	return len;
+	return snprintf(buf, PAGE_SIZE, "{%pUb}\n", &vdev->partition_uuid);
 }
 
 static ssize_t partition_name_show(struct device *dev,
 				   struct device_attribute *attr,
 				   char *buf) {
-	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
-	struct visorchipset_bus_info bus_info;
-	int len = 0;
+	struct visor_device *vdev = to_visor_device(dev);
 
-	if (businst &&
-	    visorchipset_get_bus_info(businst->devno, &bus_info) &&
-	    bus_info.name)
-		len = snprintf(buf, PAGE_SIZE, "%s\n", bus_info.name);
-	return len;
+	return snprintf(buf, PAGE_SIZE, "%s\n", vdev->name);
 }
 
 static ssize_t channel_addr_show(struct device *dev,
 				 struct device_attribute *attr,
 				 char *buf) {
-	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
-	struct visorchipset_bus_info bus_info;
-	int len = 0;
+	struct visor_device *vdev = to_visor_device(dev);
+	u64 addr = visorchannel_get_physaddr(vdev->visorchannel);
 
-	if (businst && visorchipset_get_bus_info(businst->devno, &bus_info))
-		len = snprintf(buf, PAGE_SIZE, "0x%Lx\n", (unsigned long long)
-			       bus_info.chan_info.channel_addr);
-	return len;
+	return snprintf(buf, PAGE_SIZE, "0x%Lx\n", addr);
 }
 
 static ssize_t channel_bytes_show(struct device *dev,
 				  struct device_attribute *attr,
 				  char *buf) {
-	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
-	struct visorchipset_bus_info bus_info;
-	int len = 0;
+	struct visor_device *vdev = to_visor_device(dev);
+	u64 nbytes = visorchannel_get_nbytes(vdev->visorchannel);
 
-	if (businst && visorchipset_get_bus_info(businst->devno, &bus_info))
-		len = snprintf(buf, PAGE_SIZE, "0x%Lx\n", (unsigned long long)
-			       bus_info.chan_info.n_channel_bytes);
-	return len;
+	return snprintf(buf, PAGE_SIZE, "0x%Lx\n", nbytes);
 }
 
 static ssize_t channel_id_show(struct device *dev,
 			       struct device_attribute *attr,
 			       char *buf) {
-	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
+	struct visor_device *vdev = to_visor_device(dev);
 	int len = 0;
 
-	if (businst && businst->chan) {
-		visorchannel_id(businst->chan, buf);
+	if (vdev->visorchannel) {
+		visorchannel_id(vdev->visorchannel, buf);
 		len = strlen(buf);
 		buf[len++] = '\n';
 	}
@@ -622,8 +598,9 @@ static ssize_t channel_id_show(struct device *dev,
 static ssize_t client_bus_info_show(struct device *dev,
 				    struct device_attribute *attr,
 				    char *buf) {
-	struct visorbus_devdata *businst = to_visorbus_devdata(dev);
-	struct visorchipset_bus_info bus_info;
+	struct visor_device *vdev = to_visor_device(dev);
+	struct visorchannel *channel = vdev->visorchannel;
+
 	int i, x, remain = PAGE_SIZE;
 	unsigned long off;
 	char *p = buf;
@@ -631,16 +608,15 @@ static ssize_t client_bus_info_show(struct device *dev,
 	struct ultra_vbus_deviceinfo dev_info;
 
 	partition_name = "";
-	if (businst && businst->chan) {
-		if (visorchipset_get_bus_info(businst->devno, &bus_info) &&
-		    bus_info.name)
-			partition_name = bus_info.name;
+	if (channel) {
+		if (vdev->name)
+			partition_name = vdev->name;
 		x = snprintf(p, remain,
-			     "Client device / client driver info for %s partition (vbus #%d):\n",
-			     partition_name, businst->devno);
+			     "Client device / client driver info for %s partition (vbus #%ld):\n",
+			     partition_name, vdev->chipset_dev_no);
 		p += x;
 		remain -= x;
-		x = visorchannel_read(businst->chan,
+		x = visorchannel_read(channel,
 				      offsetof(struct
 					       spar_vbus_channel_protocol,
 					       chp_info),
@@ -651,7 +627,7 @@ static ssize_t client_bus_info_show(struct device *dev,
 			p += x;
 			remain -= x;
 		}
-		x = visorchannel_read(businst->chan,
+		x = visorchannel_read(channel,
 				      offsetof(struct
 					       spar_vbus_channel_protocol,
 					       bus_info),
@@ -665,8 +641,8 @@ static ssize_t client_bus_info_show(struct device *dev,
 		off = offsetof(struct spar_vbus_channel_protocol, dev_info);
 		i = 0;
 		while (off + sizeof(dev_info) <=
-		       visorchannel_get_nbytes(businst->chan)) {
-			x = visorchannel_read(businst->chan,
+		       visorchannel_get_nbytes(channel)) {
+			x = visorchannel_read(channel,
 					      off, &dev_info, sizeof(dev_info));
 			if (x >= 0) {
 				x = vbuschannel_devinfo_to_string
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 30/44] staging: unisys: Convert bus functions to pass bus_info pointer around
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (28 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 29/44] staging: unisys: Convert the device attributes to visor_device Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 31/44] staging: unisys: Convert device functions to pass dev_info " Benjamin Romer
                   ` (13 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Most bus functions pass bus_no around and then do a lookup inside each
function to find the bus_info struct.  Instead just pass the pointer.

This prepares us for a later conversion to using visor_device.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c    | 44 ++++++++++------------
 drivers/staging/unisys/visorbus/visorbus_private.h | 11 +++---
 drivers/staging/unisys/visorbus/visorchipset.c     | 39 +++++++++----------
 3 files changed, 42 insertions(+), 52 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index b66fce5..dd36d7b 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -108,8 +108,8 @@ static long long bus_count;	/** number of bus instances */
 static long long total_devices_created;
 					/** ever-increasing */
 
-static void chipset_bus_create(u32 bus_no);
-static void chipset_bus_destroy(u32 bus_no);
+static void chipset_bus_create(struct visorchipset_bus_info *bus_info);
+static void chipset_bus_destroy(struct visorchipset_bus_info *bus_info);
 static void chipset_device_create(u32 bus_no, u32 dev_no);
 static void chipset_device_destroy(u32 bus_no, u32 dev_no);
 static void chipset_device_pause(u32 bus_no, u32 dev_no);
@@ -1331,11 +1331,11 @@ fix_vbus_dev_info(struct visor_device *visordev)
 /** Create a device instance for the visor bus itself.
  */
 static struct visorbus_devdata *
-create_bus_instance(int id)
+create_bus_instance(struct visorchipset_bus_info *bus_info)
 {
 	struct visorbus_devdata *rc = NULL;
 	struct visorbus_devdata *devdata = NULL;
-	struct visorchipset_bus_info bus_info;
+	int id = bus_info->bus_no;
 
 	POSTCODE_LINUX_2(BUS_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO);
 	devdata = kzalloc(sizeof(*devdata), GFP_KERNEL);
@@ -1355,15 +1355,14 @@ create_bus_instance(int id)
 		goto away;
 	}
 	devdata->devno = id;
-	if ((visorchipset_get_bus_info(id, &bus_info)) &&
-	    (bus_info.chan_info.channel_addr > 0) &&
-	    (bus_info.chan_info.n_channel_bytes > 0)) {
-		u64 channel_addr = bus_info.chan_info.channel_addr;
+	if ((bus_info->chan_info.channel_addr > 0) &&
+	    (bus_info->chan_info.n_channel_bytes > 0)) {
+		u64 channel_addr = bus_info->chan_info.channel_addr;
 		unsigned long n_channel_bytes =
 				(unsigned long)
-				bus_info.chan_info.n_channel_bytes;
+				bus_info->chan_info.n_channel_bytes;
 		uuid_le channel_type_guid =
-				bus_info.chan_info.channel_type_uuid;
+				bus_info->chan_info.channel_type_uuid;
 
 		devdata->chan = visorchannel_create(channel_addr,
 						    n_channel_bytes,
@@ -1373,7 +1372,7 @@ create_bus_instance(int id)
 			POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, channel_addr,
 					 POSTCODE_SEVERITY_ERR);
 		} else {
-			if (bus_info.flags.server) {
+			if (bus_info->flags.server) {
 				init_vbus_channel(devdata->chan);
 			} else {
 				if (get_vbus_header_info(devdata->chan,
@@ -1466,19 +1465,17 @@ static unsigned long test_bus_nos[MAXDEVICETEST];
 static unsigned long test_dev_nos[MAXDEVICETEST];
 
 static void
-chipset_bus_create(u32 bus_no)
+chipset_bus_create(struct visorchipset_bus_info *bus_info)
 {
-	struct visorchipset_bus_info bus_info;
 	struct visorbus_devdata *devdata;
 	int rc = -1;
+	u32 bus_no = bus_info->bus_no;
 
 	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
-	if (!visorchipset_get_bus_info(bus_no, &bus_info))
-		goto away;
-	devdata = create_bus_instance(bus_no);
+	devdata = create_bus_instance(bus_info);
 	if (!devdata)
 		goto away;
-	if (!visorchipset_set_bus_context(bus_no, devdata))
+	if (!visorchipset_set_bus_context(bus_info, devdata))
 		goto away;
 	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
 	rc = 0;
@@ -1491,30 +1488,27 @@ away:
 	POSTCODE_LINUX_3(CHIPSET_INIT_SUCCESS_PC, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 	if (chipset_responders.bus_create)
-		(*chipset_responders.bus_create) (bus_no, rc);
+		(*chipset_responders.bus_create) (bus_info, rc);
 }
 
 static void
-chipset_bus_destroy(u32 bus_no)
+chipset_bus_destroy(struct visorchipset_bus_info *bus_info)
 {
-	struct visorchipset_bus_info bus_info;
 	struct visorbus_devdata *devdata;
 	int rc = -1;
 
-	if (!visorchipset_get_bus_info(bus_no, &bus_info))
-		goto away;
-	devdata = (struct visorbus_devdata *)(bus_info.bus_driver_context);
+	devdata = (struct visorbus_devdata *)(bus_info->bus_driver_context);
 	if (!devdata)
 		goto away;
 	remove_bus_instance(devdata);
-	if (!visorchipset_set_bus_context(bus_no, NULL))
+	if (!visorchipset_set_bus_context(bus_info, NULL))
 		goto away;
 	rc = 0;
 away:
 	if (rc < 0)
 		return;
 	if (chipset_responders.bus_destroy)
-		(*chipset_responders.bus_destroy)(bus_no, rc);
+		(*chipset_responders.bus_destroy)(bus_info, rc);
 }
 
 static void
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index bbc64bd..9a2d563 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -104,8 +104,8 @@ struct visorchipset_bus_info {
  *  visorchipset.)
  */
 struct visorchipset_busdev_notifiers {
-	void (*bus_create)(u32 bus_no);
-	void (*bus_destroy)(u32 bus_no);
+	void (*bus_create)(struct visorchipset_bus_info *bus_info);
+	void (*bus_destroy)(struct visorchipset_bus_info *bus_info);
 	void (*device_create)(u32 bus_no, u32 dev_no);
 	void (*device_destroy)(u32 bus_no, u32 dev_no);
 	void (*device_pause)(u32 bus_no, u32 dev_no);
@@ -119,8 +119,8 @@ struct visorchipset_busdev_notifiers {
  *      -1 = it failed
  */
 struct visorchipset_busdev_responders {
-	void (*bus_create)(u32 bus_no, int response);
-	void (*bus_destroy)(u32 bus_no, int response);
+	void (*bus_create)(struct visorchipset_bus_info *p, int response);
+	void (*bus_destroy)(struct visorchipset_bus_info *p, int response);
 	void (*device_create)(u32 bus_no, u32 dev_no, int response);
 	void (*device_destroy)(u32 bus_no, u32 dev_no, int response);
 	void (*device_pause)(u32 bus_no, u32 dev_no, int response);
@@ -142,7 +142,8 @@ bool visorchipset_get_bus_info(u32 bus_no,
 			       struct visorchipset_bus_info *bus_info);
 bool visorchipset_get_device_info(u32 bus_no, u32 dev_no,
 				  struct visorchipset_device_info *dev_info);
-bool visorchipset_set_bus_context(u32 bus_no, void *context);
+bool visorchipset_set_bus_context(struct visorchipset_bus_info *bus_info,
+				  void *context);
 
 /* visorbus init and exit functions */
 int visorbus_init(void);
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 1487daf..432158d 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -228,8 +228,8 @@ static void parahotplug_process_list(void);
  */
 static struct visorchipset_busdev_notifiers busdev_notifiers;
 
-static void bus_create_response(u32 bus_no, int response);
-static void bus_destroy_response(u32 bus_no, int response);
+static void bus_create_response(struct visorchipset_bus_info *p, int response);
+static void bus_destroy_response(struct visorchipset_bus_info *p, int response);
 static void device_create_response(u32 bus_no, u32 dev_no, int response);
 static void device_destroy_response(u32 bus_no, u32 dev_no, int response);
 static void device_resume_response(u32 bus_no, u32 dev_no, int response);
@@ -958,12 +958,12 @@ enum crash_obj_type {
 };
 
 static void
-bus_responder(enum controlvm_id cmd_id, u32 bus_no, int response)
+bus_responder(enum controlvm_id cmd_id, struct visorchipset_bus_info *p,
+	      int response)
 {
-	struct visorchipset_bus_info *p;
 	bool need_clear = false;
+	u32 bus_no = p->bus_no;
 
-	p = bus_find(&bus_info_list, bus_no);
 	if (!p)
 		return;
 
@@ -1049,15 +1049,12 @@ device_responder(enum controlvm_id cmd_id, u32 bus_no, u32 dev_no, int response)
 }
 
 static void
-bus_epilog(u32 bus_no,
+bus_epilog(struct visorchipset_bus_info *bus_info,
 	   u32 cmd, struct controlvm_message_header *msg_hdr,
 	   int response, bool need_response)
 {
-	struct visorchipset_bus_info *bus_info;
 	bool notified = false;
 
-	bus_info = bus_find(&bus_info_list, bus_no);
-
 	if (!bus_info)
 		return;
 
@@ -1073,13 +1070,13 @@ bus_epilog(u32 bus_no,
 		switch (cmd) {
 		case CONTROLVM_BUS_CREATE:
 			if (busdev_notifiers.bus_create) {
-				(*busdev_notifiers.bus_create) (bus_no);
+				(*busdev_notifiers.bus_create) (bus_info);
 				notified = true;
 			}
 			break;
 		case CONTROLVM_BUS_DESTROY:
 			if (busdev_notifiers.bus_destroy) {
-				(*busdev_notifiers.bus_destroy) (bus_no);
+				(*busdev_notifiers.bus_destroy) (bus_info);
 				notified = true;
 			}
 			break;
@@ -1092,7 +1089,7 @@ bus_epilog(u32 bus_no,
 		 */
 		;
 	else
-		bus_responder(cmd, bus_no, response);
+		bus_responder(cmd, bus_info, response);
 	up(&notifier_lock);
 }
 
@@ -1236,7 +1233,7 @@ bus_create(struct controlvm_message *inmsg)
 	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
 
 cleanup:
-	bus_epilog(bus_no, CONTROLVM_BUS_CREATE, &inmsg->hdr,
+	bus_epilog(bus_info, CONTROLVM_BUS_CREATE, &inmsg->hdr,
 		   rc, inmsg->hdr.flags.response_expected == 1);
 }
 
@@ -1254,7 +1251,7 @@ bus_destroy(struct controlvm_message *inmsg)
 	else if (bus_info->state.created == 0)
 		rc = -CONTROLVM_RESP_ERROR_ALREADY_DONE;
 
-	bus_epilog(bus_no, CONTROLVM_BUS_DESTROY, &inmsg->hdr,
+	bus_epilog(bus_info, CONTROLVM_BUS_DESTROY, &inmsg->hdr,
 		   rc, inmsg->hdr.flags.response_expected == 1);
 }
 
@@ -1295,7 +1292,7 @@ bus_configure(struct controlvm_message *inmsg,
 		POSTCODE_LINUX_3(BUS_CONFIGURE_EXIT_PC, bus_no,
 				 POSTCODE_SEVERITY_INFO);
 	}
-	bus_epilog(bus_no, CONTROLVM_BUS_CONFIGURE, &inmsg->hdr,
+	bus_epilog(bus_info, CONTROLVM_BUS_CONFIGURE, &inmsg->hdr,
 		   rc, inmsg->hdr.flags.response_expected == 1);
 }
 
@@ -2112,15 +2109,15 @@ cleanup:
 }
 
 static void
-bus_create_response(u32 bus_no, int response)
+bus_create_response(struct visorchipset_bus_info *bus_info, int response)
 {
-	bus_responder(CONTROLVM_BUS_CREATE, bus_no, response);
+	bus_responder(CONTROLVM_BUS_CREATE, bus_info, response);
 }
 
 static void
-bus_destroy_response(u32 bus_no, int response)
+bus_destroy_response(struct visorchipset_bus_info *bus_info, int response)
 {
-	bus_responder(CONTROLVM_BUS_DESTROY, bus_no, response);
+	bus_responder(CONTROLVM_BUS_DESTROY, bus_info, response);
 }
 
 static void
@@ -2164,10 +2161,8 @@ visorchipset_get_bus_info(u32 bus_no, struct visorchipset_bus_info *bus_info)
 EXPORT_SYMBOL_GPL(visorchipset_get_bus_info);
 
 bool
-visorchipset_set_bus_context(u32 bus_no, void *context)
+visorchipset_set_bus_context(struct visorchipset_bus_info *p, void *context)
 {
-	struct visorchipset_bus_info *p = bus_find(&bus_info_list, bus_no);
-
 	if (!p)
 		return false;
 	p->bus_driver_context = context;
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 31/44] staging: unisys: Convert device functions to pass dev_info pointer around
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (29 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 30/44] staging: unisys: Convert bus functions to pass bus_info pointer around Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 32/44] staging: unisys: Move channel creation up the stack Benjamin Romer
                   ` (12 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Most device functions pass bus_no and dev_no around and then do a lookup
inside each function to find the dev_info struct.  Instead just pass the
pointer.

This prepares us for a later conversion to using visor device.

No real technical changes.  Just function header changes and little
cleanups as a result.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/visorbus.h          |  8 +-
 drivers/staging/unisys/visorbus/visorbus_main.c    | 95 ++++++++++++----------
 drivers/staging/unisys/visorbus/visorbus_private.h | 17 ++--
 drivers/staging/unisys/visorbus/visorchipset.c     | 74 ++++++++---------
 4 files changed, 103 insertions(+), 91 deletions(-)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index 3375ffd..3152ba4 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -43,7 +43,7 @@ struct visor_device;
 extern struct bus_type visorbus_type;
 
 typedef void (*visorbus_state_complete_func) (struct visor_device *dev,
-					      int status);
+					      int status, void *dev_info);
 struct visorchipset_state {
 	u32 created:1;
 	u32 attached:1;
@@ -106,9 +106,11 @@ struct visor_driver {
 	 *  fails or completes successfully.
 	 */
 	int (*pause)(struct visor_device *dev,
-		     visorbus_state_complete_func complete_func);
+		     visorbus_state_complete_func complete_func,
+		     void *dev_info);
 	int (*resume)(struct visor_device *dev,
-		      visorbus_state_complete_func complete_func);
+		      visorbus_state_complete_func complete_func,
+		      void *dev_info);
 
 	/** These fields are for private use by the bus driver only. */
 	struct device_driver driver;
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index dd36d7b..a898896 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -110,10 +110,10 @@ static long long total_devices_created;
 
 static void chipset_bus_create(struct visorchipset_bus_info *bus_info);
 static void chipset_bus_destroy(struct visorchipset_bus_info *bus_info);
-static void chipset_device_create(u32 bus_no, u32 dev_no);
-static void chipset_device_destroy(u32 bus_no, u32 dev_no);
-static void chipset_device_pause(u32 bus_no, u32 dev_no);
-static void chipset_device_resume(u32 bus_no, u32 dev_no);
+static void chipset_device_create(struct visorchipset_device_info *dev_info);
+static void chipset_device_destroy(struct visorchipset_device_info *dev_info);
+static void chipset_device_pause(struct visorchipset_device_info *dev_info);
+static void chipset_device_resume(struct visorchipset_device_info *dev_info);
 
 /** These functions are implemented herein, and are called by the chipset
  *  driver to notify us about specific events.
@@ -813,11 +813,17 @@ away:
 	 *  initialized.
 	 */
 	if (!dev->responded_to_device_create) {
+		struct visorchipset_device_info dev_info;
+
+		if (!visorchipset_get_device_info(dev->chipset_bus_no,
+						  dev->chipset_dev_no,
+						  &dev_info))
+			/* hmm, what to do here */
+			return rc;
+
 		dev->responded_to_device_create = true;
 		if (chipset_responders.device_create)
-			(*chipset_responders.device_create)(dev->chipset_bus_no,
-							    dev->chipset_dev_no,
-							    rc);
+			(*chipset_responders.device_create)(&dev_info, rc);
 	}
 	return rc;
 }
@@ -1003,7 +1009,7 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
  */
 static int
 create_visor_device(struct visorbus_devdata *devdata,
-		    unsigned long chipset_bus_no, unsigned long chipset_dev_no,
+		    struct visorchipset_device_info *dev_info,
 		    struct visorchipset_channel_info chan_info,
 		    u64 partition_handle)
 {
@@ -1011,6 +1017,8 @@ create_visor_device(struct visorbus_devdata *devdata,
 	struct visorchannel *visorchannel = NULL;
 	struct visor_device *dev = NULL;
 	bool gotten = false, registered1 = false, registered2 = false;
+	u32 chipset_bus_no = dev_info->bus_no;
+	u32 chipset_dev_no = dev_info->dev_no;
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, chipset_dev_no, chipset_bus_no,
 			 POSTCODE_SEVERITY_INFO);
@@ -1061,7 +1069,7 @@ create_visor_device(struct visorbus_devdata *devdata,
 	 * (NOT bus instance).  That's why we need to include the bus
 	 * number within the name.
 	 */
-	dev_set_name(&dev->device, "vbus%lu:dev%lu",
+	dev_set_name(&dev->device, "vbus%u:dev%u",
 		     chipset_bus_no, chipset_dev_no);
 
 	/*  device_add does this:
@@ -1512,26 +1520,25 @@ away:
 }
 
 static void
-chipset_device_create(u32 bus_no, u32 dev_no)
+chipset_device_create(struct visorchipset_device_info *dev_info)
 {
-	struct visorchipset_device_info dev_info;
 	struct visorchipset_bus_info bus_info;
 	struct visorbus_devdata *devdata = NULL;
 	int rc = -1;
+	u32 bus_no = dev_info->bus_no;
+	u32 dev_no = dev_info->dev_no;
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
 	if (entered_testing_mode)
 		return;
-	if (!visorchipset_get_device_info(bus_no, dev_no, &dev_info))
-		goto away;
 	if (!visorchipset_get_bus_info(bus_no, &bus_info))
 		goto away;
 	if (visorbus_devicetest)
 		if (total_devices_created < MAXDEVICETEST) {
 			test_channel_infos[total_devices_created] =
-			    dev_info.chan_info;
+			    dev_info->chan_info;
 			test_bus_nos[total_devices_created] = bus_no;
 			test_dev_nos[total_devices_created] = dev_no;
 		}
@@ -1545,27 +1552,25 @@ away:
 		return;
 	}
 	devdata = (struct visorbus_devdata *)(bus_info.bus_driver_context);
-	rc = create_visor_device(devdata, bus_no, dev_no,
-				 dev_info.chan_info, bus_info.partition_handle);
+	rc = create_visor_device(devdata, dev_info,
+				 dev_info->chan_info,
+				 bus_info.partition_handle);
 	POSTCODE_LINUX_4(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 	if (rc < 0)
 		if (chipset_responders.device_create)
-			(*chipset_responders.device_create)(bus_no, dev_no, rc);
+			(*chipset_responders.device_create)(dev_info, rc);
 }
 
 static void
-chipset_device_destroy(u32 bus_no, u32 dev_no)
+chipset_device_destroy(struct visorchipset_device_info *dev_info)
 {
-	struct visorchipset_device_info dev_info;
 	struct visor_device *dev;
 	int rc = -1;
 
 	if (entered_testing_mode)
 		return;
-	if (!visorchipset_get_device_info(bus_no, dev_no, &dev_info))
-		goto away;
-	dev = find_visor_device_by_channel(dev_info.chan_info.channel_addr);
+	dev = find_visor_device_by_channel(dev_info->chan_info.channel_addr);
 	if (!dev)
 		goto away;
 	rc = 0;
@@ -1574,7 +1579,7 @@ away:
 			return;
 
 	if (chipset_responders.device_destroy)
-		(*chipset_responders.device_destroy) (bus_no, dev_no, rc);
+		(*chipset_responders.device_destroy) (dev_info, rc);
 	remove_visor_device(dev);
 }
 
@@ -1583,8 +1588,11 @@ away:
  * completed.
  */
 static void
-pause_state_change_complete(struct visor_device *dev, int status)
+pause_state_change_complete(struct visor_device *dev, int status,
+			    void *info)
 {
+	struct visorchipset_device_info *dev_info = info;
+
 	if (!dev->pausing)
 			return;
 
@@ -1595,8 +1603,7 @@ pause_state_change_complete(struct visor_device *dev, int status)
 	/* Notify the chipset driver that the pause is complete, which
 	* will presumably want to send some sort of response to the
 	* initiator. */
-	(*chipset_responders.device_pause) (dev->chipset_bus_no,
-					    dev->chipset_dev_no, status);
+	(*chipset_responders.device_pause) (dev_info, status);
 }
 
 /* This is the callback function specified for a function driver, to
@@ -1604,8 +1611,11 @@ pause_state_change_complete(struct visor_device *dev, int status)
  * completed.
  */
 static void
-resume_state_change_complete(struct visor_device *dev, int status)
+resume_state_change_complete(struct visor_device *dev, int status,
+			     void *info)
 {
+	struct visorchipset_device_info *dev_info = info;
+
 	if (!dev->resuming)
 			return;
 
@@ -1616,8 +1626,7 @@ resume_state_change_complete(struct visor_device *dev, int status)
 	/* Notify the chipset driver that the resume is complete,
 	 * which will presumably want to send some sort of response to
 	 * the initiator. */
-	(*chipset_responders.device_resume) (dev->chipset_bus_no,
-					     dev->chipset_dev_no, status);
+	(*chipset_responders.device_resume) (dev_info, status);
 }
 
 /* Tell the subordinate function driver for a specific device to pause
@@ -1625,13 +1634,14 @@ resume_state_change_complete(struct visor_device *dev, int status)
  * callback function.
  */
 static void
-initiate_chipset_device_pause_resume(u32 bus_no, u32 dev_no, bool is_pause)
+initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
+				     bool is_pause)
 {
-	struct visorchipset_device_info dev_info;
 	struct visor_device *dev = NULL;
 	int rc = -1, x;
 	struct visor_driver *drv = NULL;
-	void (*notify_func)(u32 bus_no, u32 dev_no, int response) = NULL;
+	void (*notify_func)(struct visorchipset_device_info *dev_info,
+			    int response) = NULL;
 
 	if (is_pause)
 		notify_func = chipset_responders.device_pause;
@@ -1640,10 +1650,7 @@ initiate_chipset_device_pause_resume(u32 bus_no, u32 dev_no, bool is_pause)
 	if (!notify_func)
 			goto away;
 
-	if (!visorchipset_get_device_info(bus_no, dev_no, &dev_info))
-			goto away;
-
-	dev = find_visor_device_by_channel(dev_info.chan_info.channel_addr);
+	dev = find_visor_device_by_channel(dev_info->chan_info.channel_addr);
 	if (!dev)
 			goto away;
 
@@ -1666,7 +1673,8 @@ initiate_chipset_device_pause_resume(u32 bus_no, u32 dev_no, bool is_pause)
 				goto away;
 
 		dev->pausing = true;
-		x = drv->pause(dev, pause_state_change_complete);
+		x = drv->pause(dev, pause_state_change_complete,
+			       (void *)dev_info);
 	} else {
 		/* This should be done at BUS resume time, but an
 		 * existing problem prevents us from ever getting a bus
@@ -1678,7 +1686,8 @@ initiate_chipset_device_pause_resume(u32 bus_no, u32 dev_no, bool is_pause)
 				goto away;
 
 		dev->resuming = true;
-		x = drv->resume(dev, resume_state_change_complete);
+		x = drv->resume(dev, resume_state_change_complete,
+				(void *)dev_info);
 	}
 	if (x < 0) {
 		if (is_pause)
@@ -1691,20 +1700,20 @@ initiate_chipset_device_pause_resume(u32 bus_no, u32 dev_no, bool is_pause)
 away:
 	if (rc < 0) {
 		if (notify_func)
-				(*notify_func)(bus_no, dev_no, rc);
+				(*notify_func)(dev_info, rc);
 	}
 }
 
 static void
-chipset_device_pause(u32 bus_no, u32 dev_no)
+chipset_device_pause(struct visorchipset_device_info *dev_info)
 {
-	initiate_chipset_device_pause_resume(bus_no, dev_no, true);
+	initiate_chipset_device_pause_resume(dev_info, true);
 }
 
 static void
-chipset_device_resume(u32 bus_no, u32 dev_no)
+chipset_device_resume(struct visorchipset_device_info *dev_info)
 {
-	initiate_chipset_device_pause_resume(bus_no, dev_no, false);
+	initiate_chipset_device_pause_resume(dev_info, false);
 }
 
 struct channel_size_info {
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index 9a2d563..81e4e8c 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -106,10 +106,10 @@ struct visorchipset_bus_info {
 struct visorchipset_busdev_notifiers {
 	void (*bus_create)(struct visorchipset_bus_info *bus_info);
 	void (*bus_destroy)(struct visorchipset_bus_info *bus_info);
-	void (*device_create)(u32 bus_no, u32 dev_no);
-	void (*device_destroy)(u32 bus_no, u32 dev_no);
-	void (*device_pause)(u32 bus_no, u32 dev_no);
-	void (*device_resume)(u32 bus_no, u32 dev_no);
+	void (*device_create)(struct visorchipset_device_info *bus_info);
+	void (*device_destroy)(struct visorchipset_device_info *bus_info);
+	void (*device_pause)(struct visorchipset_device_info *bus_info);
+	void (*device_resume)(struct visorchipset_device_info *bus_info);
 };
 
 /*  These functions live inside visorchipset, and will be called to indicate
@@ -121,10 +121,11 @@ struct visorchipset_busdev_notifiers {
 struct visorchipset_busdev_responders {
 	void (*bus_create)(struct visorchipset_bus_info *p, int response);
 	void (*bus_destroy)(struct visorchipset_bus_info *p, int response);
-	void (*device_create)(u32 bus_no, u32 dev_no, int response);
-	void (*device_destroy)(u32 bus_no, u32 dev_no, int response);
-	void (*device_pause)(u32 bus_no, u32 dev_no, int response);
-	void (*device_resume)(u32 bus_no, u32 dev_no, int response);
+	void (*device_create)(struct visorchipset_device_info *p, int response);
+	void (*device_destroy)(struct visorchipset_device_info *p,
+			       int response);
+	void (*device_pause)(struct visorchipset_device_info *p, int response);
+	void (*device_resume)(struct visorchipset_device_info *p, int response);
 };
 
 /** Register functions (in the bus driver) to get called by visorchipset
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 432158d..9bbc080 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -230,12 +230,16 @@ static struct visorchipset_busdev_notifiers busdev_notifiers;
 
 static void bus_create_response(struct visorchipset_bus_info *p, int response);
 static void bus_destroy_response(struct visorchipset_bus_info *p, int response);
-static void device_create_response(u32 bus_no, u32 dev_no, int response);
-static void device_destroy_response(u32 bus_no, u32 dev_no, int response);
-static void device_resume_response(u32 bus_no, u32 dev_no, int response);
+static void device_create_response(struct visorchipset_device_info *p,
+				   int response);
+static void device_destroy_response(struct visorchipset_device_info *p,
+				    int response);
+static void device_resume_response(struct visorchipset_device_info *p,
+				   int response);
 
-static void visorchipset_device_pause_response(u32 bus_no, u32 dev_no,
-					       int response);
+static void
+visorchipset_device_pause_response(struct visorchipset_device_info *p,
+				   int response);
 
 static struct visorchipset_busdev_responders busdev_responders = {
 	.bus_create = bus_create_response,
@@ -993,13 +997,13 @@ bus_responder(enum controlvm_id cmd_id, struct visorchipset_bus_info *p,
 
 static void
 device_changestate_responder(enum controlvm_id cmd_id,
-			     u32 bus_no, u32 dev_no, int response,
+			     struct visorchipset_device_info *p, int response,
 			     struct spar_segment_state response_state)
 {
-	struct visorchipset_device_info *p;
 	struct controlvm_message outmsg;
+	u32 bus_no = p->bus_no;
+	u32 dev_no = p->dev_no;
 
-	p = device_find(&dev_info_list, bus_no, dev_no);
 	if (!p)
 		return;
 	if (p->pending_msg_hdr.id == CONTROLVM_INVALID)
@@ -1021,12 +1025,11 @@ device_changestate_responder(enum controlvm_id cmd_id,
 }
 
 static void
-device_responder(enum controlvm_id cmd_id, u32 bus_no, u32 dev_no, int response)
+device_responder(enum controlvm_id cmd_id, struct visorchipset_device_info *p,
+		 int response)
 {
-	struct visorchipset_device_info *p;
 	bool need_clear = false;
 
-	p = device_find(&dev_info_list, bus_no, dev_no);
 	if (!p)
 		return;
 	if (response >= 0) {
@@ -1094,15 +1097,16 @@ bus_epilog(struct visorchipset_bus_info *bus_info,
 }
 
 static void
-device_epilog(u32 bus_no, u32 dev_no, struct spar_segment_state state, u32 cmd,
+device_epilog(struct visorchipset_device_info *dev_info,
+	      struct spar_segment_state state, u32 cmd,
 	      struct controlvm_message_header *msg_hdr, int response,
 	      bool need_response, bool for_visorbus)
 {
 	struct visorchipset_busdev_notifiers *notifiers;
 	bool notified = false;
+	u32 bus_no = dev_info->bus_no;
+	u32 dev_no = dev_info->dev_no;
 
-	struct visorchipset_device_info *dev_info =
-		device_find(&dev_info_list, bus_no, dev_no);
 	char *envp[] = {
 		"SPARSP_DIAGPOOL_PAUSED_STATE = 1",
 		NULL
@@ -1125,7 +1129,7 @@ device_epilog(u32 bus_no, u32 dev_no, struct spar_segment_state state, u32 cmd,
 		switch (cmd) {
 		case CONTROLVM_DEVICE_CREATE:
 			if (notifiers->device_create) {
-				(*notifiers->device_create) (bus_no, dev_no);
+				(*notifiers->device_create) (dev_info);
 				notified = true;
 			}
 			break;
@@ -1135,8 +1139,7 @@ device_epilog(u32 bus_no, u32 dev_no, struct spar_segment_state state, u32 cmd,
 			    state.operating ==
 				segment_state_running.operating) {
 				if (notifiers->device_resume) {
-					(*notifiers->device_resume) (bus_no,
-								     dev_no);
+					(*notifiers->device_resume) (dev_info);
 					notified = true;
 				}
 			}
@@ -1148,8 +1151,7 @@ device_epilog(u32 bus_no, u32 dev_no, struct spar_segment_state state, u32 cmd,
 				 * where server is lost
 				 */
 				if (notifiers->device_pause) {
-					(*notifiers->device_pause) (bus_no,
-								    dev_no);
+					(*notifiers->device_pause) (dev_info);
 					notified = true;
 				}
 			} else if (state.alive == segment_state_paused.alive &&
@@ -1171,7 +1173,7 @@ device_epilog(u32 bus_no, u32 dev_no, struct spar_segment_state state, u32 cmd,
 			break;
 		case CONTROLVM_DEVICE_DESTROY:
 			if (notifiers->device_destroy) {
-				(*notifiers->device_destroy) (bus_no, dev_no);
+				(*notifiers->device_destroy) (dev_info);
 				notified = true;
 			}
 			break;
@@ -1184,7 +1186,7 @@ device_epilog(u32 bus_no, u32 dev_no, struct spar_segment_state state, u32 cmd,
 		 */
 		;
 	else
-		device_responder(cmd, bus_no, dev_no, response);
+		device_responder(cmd, dev_info, response);
 	up(&notifier_lock);
 }
 
@@ -1359,7 +1361,7 @@ cleanup:
 		g_diagpool_bus_no = bus_no;
 		g_diagpool_dev_no = dev_no;
 	}
-	device_epilog(bus_no, dev_no, segment_state_running,
+	device_epilog(dev_info, segment_state_running,
 		      CONTROLVM_DEVICE_CREATE, &inmsg->hdr, rc,
 		      inmsg->hdr.flags.response_expected == 1, 1);
 }
@@ -1385,7 +1387,7 @@ my_device_changestate(struct controlvm_message *inmsg)
 		rc = -CONTROLVM_RESP_ERROR_DEVICE_INVALID;
 	}
 	if ((rc >= CONTROLVM_RESP_SUCCESS) && dev_info)
-		device_epilog(bus_no, dev_no, state,
+		device_epilog(dev_info, state,
 			      CONTROLVM_DEVICE_CHANGESTATE, &inmsg->hdr, rc,
 			      inmsg->hdr.flags.response_expected == 1, 1);
 }
@@ -1406,7 +1408,7 @@ my_device_destroy(struct controlvm_message *inmsg)
 		rc = -CONTROLVM_RESP_ERROR_ALREADY_DONE;
 
 	if ((rc >= CONTROLVM_RESP_SUCCESS) && dev_info)
-		device_epilog(bus_no, dev_no, segment_state_running,
+		device_epilog(dev_info, segment_state_running,
 			      CONTROLVM_DEVICE_DESTROY, &inmsg->hdr, rc,
 			      inmsg->hdr.flags.response_expected == 1, 1);
 }
@@ -2121,30 +2123,31 @@ bus_destroy_response(struct visorchipset_bus_info *bus_info, int response)
 }
 
 static void
-device_create_response(u32 bus_no, u32 dev_no, int response)
+device_create_response(struct visorchipset_device_info *dev_info, int response)
 {
-	device_responder(CONTROLVM_DEVICE_CREATE, bus_no, dev_no, response);
+	device_responder(CONTROLVM_DEVICE_CREATE, dev_info, response);
 }
 
 static void
-device_destroy_response(u32 bus_no, u32 dev_no, int response)
+device_destroy_response(struct visorchipset_device_info *dev_info, int response)
 {
-	device_responder(CONTROLVM_DEVICE_DESTROY, bus_no, dev_no, response);
+	device_responder(CONTROLVM_DEVICE_DESTROY, dev_info, response);
 }
 
 static void
-visorchipset_device_pause_response(u32 bus_no, u32 dev_no, int response)
+visorchipset_device_pause_response(struct visorchipset_device_info *dev_info,
+				   int response)
 {
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
-				     bus_no, dev_no, response,
+				     dev_info, response,
 				     segment_state_standby);
 }
 
 static void
-device_resume_response(u32 bus_no, u32 dev_no, int response)
+device_resume_response(struct visorchipset_device_info *dev_info, int response)
 {
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
-				     bus_no, dev_no, response,
+				     dev_info, response,
 				     segment_state_running);
 }
 
@@ -2184,12 +2187,9 @@ visorchipset_get_device_info(u32 bus_no, u32 dev_no,
 EXPORT_SYMBOL_GPL(visorchipset_get_device_info);
 
 bool
-visorchipset_set_device_context(u32 bus_no, u32 dev_no, void *context)
+visorchipset_set_device_context(struct visorchipset_device_info *p,
+				void *context)
 {
-	struct visorchipset_device_info *p;
-
-	p = device_find(&dev_info_list, bus_no, dev_no);
-
 	if (!p)
 		return false;
 	p->bus_driver_context = context;
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 32/44] staging: unisys: Move channel creation up the stack
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (30 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 31/44] staging: unisys: Convert device functions to pass dev_info " Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-16 11:38   ` Dan Carpenter
  2015-05-18 15:23   ` [PATCH 32/44 V2] " Don Zickus
  2015-05-13 17:22 ` [PATCH 33/44] staging: unisys: Convert pending_msg_hdr to a pointer Benjamin Romer
                   ` (11 subsequent siblings)
  43 siblings, 2 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Instead of creating a channel struct to temporarily hold the channel
info and passing it through multiple functions until the device is
created, just create the channel from the start.

This allows us to remove the channel_info struct.

I noticed 'chan_info.addr_type' was not being used, so I just deleted
it.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c    | 88 +++++++---------------
 drivers/staging/unisys/visorbus/visorbus_private.h | 16 +---
 drivers/staging/unisys/visorbus/visorchipset.c     | 52 ++++++++-----
 3 files changed, 61 insertions(+), 95 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index a898896..49a34bb 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -1010,11 +1010,9 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
 static int
 create_visor_device(struct visorbus_devdata *devdata,
 		    struct visorchipset_device_info *dev_info,
-		    struct visorchipset_channel_info chan_info,
 		    u64 partition_handle)
 {
 	int rc = -1;
-	struct visorchannel *visorchannel = NULL;
 	struct visor_device *dev = NULL;
 	bool gotten = false, registered1 = false, registered2 = false;
 	u32 chipset_bus_no = dev_info->bus_no;
@@ -1022,16 +1020,6 @@ create_visor_device(struct visorbus_devdata *devdata,
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, chipset_dev_no, chipset_bus_no,
 			 POSTCODE_SEVERITY_INFO);
-	/* prepare chan_hdr (abstraction to read/write channel memory) */
-	visorchannel = visorchannel_create(chan_info.channel_addr,
-					   chan_info.n_channel_bytes,
-					   GFP_KERNEL,
-					   chan_info.channel_type_uuid);
-	if (!visorchannel) {
-		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, chipset_dev_no,
-				 DIAG_SEVERITY_ERR);
-		goto away;
-	}
 	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
 	if (!dev) {
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, chipset_dev_no,
@@ -1040,9 +1028,8 @@ create_visor_device(struct visorbus_devdata *devdata,
 	}
 
 	memset(dev, 0, sizeof(struct visor_device));
-	dev->visorchannel = visorchannel;
-	dev->channel_type_guid = chan_info.channel_type_uuid;
-	dev->channel_bytes = chan_info.n_channel_bytes;
+	dev->visorchannel = dev_info->visorchannel;
+	dev->channel_type_guid = dev_info->channel_type_guid;
 	dev->chipset_bus_no = chipset_bus_no;
 	dev->chipset_dev_no = chipset_dev_no;
 	dev->device.parent = &devdata->dev;
@@ -1114,8 +1101,6 @@ away:
 			unregister_devmajorminor_attributes(dev);
 		if (gotten)
 			put_device(&dev->device);
-		if (visorchannel)
-			visorchannel_destroy(visorchannel);
 		kfree(dev);
 	} else {
 		total_devices_created++;
@@ -1134,7 +1119,7 @@ remove_visor_device(struct visor_device *dev)
 }
 
 static struct visor_device *
-find_visor_device_by_channel(u64 channel_physaddr)
+find_visor_device_by_channel(struct visorchannel *channel)
 {
 	struct list_head *listentry, *listtmp;
 
@@ -1142,8 +1127,7 @@ find_visor_device_by_channel(u64 channel_physaddr)
 		struct visor_device *dev = list_entry(listentry,
 						      struct visor_device,
 						      list_all);
-		if (visorchannel_get_physaddr(dev->visorchannel) ==
-		    channel_physaddr)
+		if (dev->visorchannel == channel)
 			return dev;
 	}
 	return NULL;
@@ -1363,41 +1347,23 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 		goto away;
 	}
 	devdata->devno = id;
-	if ((bus_info->chan_info.channel_addr > 0) &&
-	    (bus_info->chan_info.n_channel_bytes > 0)) {
-		u64 channel_addr = bus_info->chan_info.channel_addr;
-		unsigned long n_channel_bytes =
-				(unsigned long)
-				bus_info->chan_info.n_channel_bytes;
-		uuid_le channel_type_guid =
-				bus_info->chan_info.channel_type_uuid;
-
-		devdata->chan = visorchannel_create(channel_addr,
-						    n_channel_bytes,
-						    GFP_KERNEL,
-						    channel_type_guid);
-		if (!devdata->chan) {
-			POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, channel_addr,
-					 POSTCODE_SEVERITY_ERR);
-		} else {
-			if (bus_info->flags.server) {
-				init_vbus_channel(devdata->chan);
-			} else {
-				if (get_vbus_header_info(devdata->chan,
-							 &devdata->
-							 vbus_hdr_info) >= 0) {
-					devdata->vbus_valid = true;
-					write_vbus_chp_info(devdata->chan,
-							    &devdata->
-							    vbus_hdr_info,
-							    &chipset_driverinfo
-							    );
-					write_vbus_bus_info(devdata->chan,
-							    &devdata->
-								vbus_hdr_info,
-							&clientbus_driverinfo);
-				}
-			}
+	devdata->chan = bus_info->visorchannel;
+	if (bus_info->flags.server) {
+		init_vbus_channel(devdata->chan);
+	} else {
+		if (get_vbus_header_info(devdata->chan,
+					 &devdata->
+					 vbus_hdr_info) >= 0) {
+			devdata->vbus_valid = true;
+			write_vbus_chp_info(devdata->chan,
+					    &devdata->
+					    vbus_hdr_info,
+					    &chipset_driverinfo
+					    );
+			write_vbus_bus_info(devdata->chan,
+					    &devdata->
+						vbus_hdr_info,
+					&clientbus_driverinfo);
 		}
 	}
 	bus_count++;
@@ -1468,7 +1434,7 @@ remove_all_visor_devices(void)
 }
 
 static bool entered_testing_mode;
-static struct visorchipset_channel_info test_channel_infos[MAXDEVICETEST];
+static struct visorchannel *test_channel_infos[MAXDEVICETEST];
 static unsigned long test_bus_nos[MAXDEVICETEST];
 static unsigned long test_dev_nos[MAXDEVICETEST];
 
@@ -1538,7 +1504,7 @@ chipset_device_create(struct visorchipset_device_info *dev_info)
 	if (visorbus_devicetest)
 		if (total_devices_created < MAXDEVICETEST) {
 			test_channel_infos[total_devices_created] =
-			    dev_info->chan_info;
+			    dev_info->visorchannel;
 			test_bus_nos[total_devices_created] = bus_no;
 			test_dev_nos[total_devices_created] = dev_no;
 		}
@@ -1552,9 +1518,7 @@ away:
 		return;
 	}
 	devdata = (struct visorbus_devdata *)(bus_info.bus_driver_context);
-	rc = create_visor_device(devdata, dev_info,
-				 dev_info->chan_info,
-				 bus_info.partition_handle);
+	rc = create_visor_device(devdata, dev_info, bus_info.partition_handle);
 	POSTCODE_LINUX_4(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 	if (rc < 0)
@@ -1570,7 +1534,7 @@ chipset_device_destroy(struct visorchipset_device_info *dev_info)
 
 	if (entered_testing_mode)
 		return;
-	dev = find_visor_device_by_channel(dev_info->chan_info.channel_addr);
+	dev = find_visor_device_by_channel(dev_info->visorchannel);
 	if (!dev)
 		goto away;
 	rc = 0;
@@ -1650,7 +1614,7 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 	if (!notify_func)
 			goto away;
 
-	dev = find_visor_device_by_channel(dev_info->chan_info.channel_addr);
+	dev = find_visor_device_by_channel(dev_info->visorchannel);
 	if (!dev)
 			goto away;
 
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index 81e4e8c..912b6cd 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -40,17 +40,6 @@ enum visorchipset_addresstype {
 	ADDRTYPE_LOCALTEST,
 };
 
-/** Attributes for a particular Supervisor channel.
- */
-struct visorchipset_channel_info {
-	enum visorchipset_addresstype addr_type;
-	u64 channel_addr;
-	struct irq_info intr;
-	u64 n_channel_bytes;
-	uuid_le channel_type_uuid;
-	uuid_le channel_inst_uuid;
-};
-
 /** Attributes for a particular Supervisor device.
  *  Any visorchipset client can query these attributes using
  *  visorchipset_get_client_device_info() or
@@ -62,7 +51,8 @@ struct visorchipset_device_info {
 	u32 dev_no;
 	uuid_le dev_inst_uuid;
 	struct visorchipset_state state;
-	struct visorchipset_channel_info chan_info;
+	struct visorchannel *visorchannel;
+	uuid_le channel_type_guid;
 	u32 reserved1;		/* control_vm_id */
 	u64 reserved2;
 	u32 switch_no;		/* when devState.attached==1 */
@@ -82,7 +72,7 @@ struct visorchipset_bus_info {
 	struct list_head entry;
 	u32 bus_no;
 	struct visorchipset_state state;
-	struct visorchipset_channel_info chan_info;
+	struct visorchannel *visorchannel;
 	uuid_le partition_uuid;
 	u64 partition_handle;
 	u8 *name;		/* UTF8 */
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 9bbc080..e24b202 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -1197,6 +1197,7 @@ bus_create(struct controlvm_message *inmsg)
 	u32 bus_no = cmd->create_bus.bus_no;
 	int rc = CONTROLVM_RESP_SUCCESS;
 	struct visorchipset_bus_info *bus_info;
+	struct visorchannel *visorchannel;
 
 	bus_info = bus_find(&bus_info_list, bus_no);
 	if (bus_info && (bus_info->state.created == 1)) {
@@ -1218,18 +1219,21 @@ bus_create(struct controlvm_message *inmsg)
 
 	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
 
-	if (inmsg->hdr.flags.test_message == 1)
-		bus_info->chan_info.addr_type = ADDRTYPE_LOCALTEST;
-	else
-		bus_info->chan_info.addr_type = ADDRTYPE_LOCALPHYSICAL;
-
 	bus_info->flags.server = inmsg->hdr.flags.server;
-	bus_info->chan_info.channel_addr = cmd->create_bus.channel_addr;
-	bus_info->chan_info.n_channel_bytes = cmd->create_bus.channel_bytes;
-	bus_info->chan_info.channel_type_uuid =
-			cmd->create_bus.bus_data_type_uuid;
-	bus_info->chan_info.channel_inst_uuid = cmd->create_bus.bus_inst_uuid;
 
+	visorchannel = visorchannel_create(cmd->create_bus.channel_addr,
+					   cmd->create_bus.channel_bytes,
+					   GFP_KERNEL,
+					   cmd->create_bus.bus_data_type_uuid);
+
+	if (!visorchannel) {
+		POSTCODE_LINUX_3(BUS_CREATE_FAILURE_PC, bus_no,
+				 POSTCODE_SEVERITY_ERR);
+		rc = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
+		kfree(bus_info);
+		goto cleanup;
+	}
+	bus_info->visorchannel = visorchannel;
 	list_add(&bus_info->entry, &bus_info_list);
 
 	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
@@ -1285,7 +1289,8 @@ bus_configure(struct controlvm_message *inmsg,
 				 POSTCODE_SEVERITY_ERR);
 		rc = -CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT;
 	} else {
-		bus_info->partition_handle = cmd->configure_bus.guest_handle;
+		visorchannel_set_clientpartition(bus_info->visorchannel,
+				cmd->configure_bus.guest_handle);
 		bus_info->partition_uuid = parser_id_get(parser_ctx);
 		parser_param_start(parser_ctx, PARSERSTRING_NAME);
 		bus_info->name = parser_string_get(parser_ctx);
@@ -1306,6 +1311,7 @@ my_device_create(struct controlvm_message *inmsg)
 	u32 dev_no = cmd->create_device.dev_no;
 	struct visorchipset_device_info *dev_info;
 	struct visorchipset_bus_info *bus_info;
+	struct visorchannel *visorchannel;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
 	dev_info = device_find(&dev_info_list, bus_no, dev_no);
@@ -1343,21 +1349,27 @@ my_device_create(struct controlvm_message *inmsg)
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
-	if (inmsg->hdr.flags.test_message == 1)
-		dev_info->chan_info.addr_type = ADDRTYPE_LOCALTEST;
-	else
-		dev_info->chan_info.addr_type = ADDRTYPE_LOCALPHYSICAL;
-	dev_info->chan_info.channel_addr = cmd->create_device.channel_addr;
-	dev_info->chan_info.n_channel_bytes = cmd->create_device.channel_bytes;
-	dev_info->chan_info.channel_type_uuid =
-			cmd->create_device.data_type_uuid;
+	visorchannel = visorchannel_create(cmd->create_device.channel_addr,
+					   cmd->create_device.channel_bytes,
+					   GFP_KERNEL,
+					   cmd->create_device.data_type_uuid);
+
+	if (!visorchannel) {
+		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
+				 POSTCODE_SEVERITY_ERR);
+		rc = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
+		kfree(dev_info);
+		goto cleanup;
+	}
+	dev_info->visorchannel = visorchannel;
+	dev_info->channel_type_guid = cmd->create_device.data_type_uuid;
 	list_add(&dev_info->entry, &dev_info_list);
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 cleanup:
 	/* get the bus and devNo for DiagPool channel */
 	if (dev_info &&
-	    is_diagpool_channel(dev_info->chan_info.channel_type_uuid)) {
+	    is_diagpool_channel(cmd->create_device.data_type_uuid)) {
 		g_diagpool_bus_no = bus_no;
 		g_diagpool_dev_no = dev_no;
 	}
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 33/44] staging: unisys: Convert pending_msg_hdr to a pointer
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (31 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 32/44] staging: unisys: Move channel creation up the stack Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 34/44] staging: unisys: Prepare vbus_hdr_info to be public Benjamin Romer
                   ` (10 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

In order for bus/dev_info structs to become public structs, one
element, pending_msg_hdr, needs to become opaque.  This is to keep
all the internals of the controlvm struct private to the bus layer.

So a simple conversion of embedding the pending_msg_hdr struct into
a pointer is done.  The rest of the patch is the fallout.

The rules are modified slightly.  Instead of relying on the 'id' to be
CONTROLVM_INVALID to indicate invalid, just use the pointer set to NULL.

In addition, because bus/dev_info can be NULL and we still need to send
a
response, pass pending_msg_hdr to all 'responders' instead of bus/

That change causes some fallout in the success case.  Instead of setting
state
bits and clearing info in the responders, do all that magic in the
responder
wrappers.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_private.h |   4 +-
 drivers/staging/unisys/visorbus/visorchipset.c     | 185 +++++++++++++--------
 2 files changed, 118 insertions(+), 71 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index 912b6cd..f371f9d 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -57,7 +57,7 @@ struct visorchipset_device_info {
 	u64 reserved2;
 	u32 switch_no;		/* when devState.attached==1 */
 	u32 internal_port_no;	/* when devState.attached==1 */
-	struct controlvm_message_header pending_msg_hdr;/* CONTROLVM_MESSAGE */
+	struct controlvm_message_header *pending_msg_hdr;/* CONTROLVM_MESSAGE */
 	/** For private use by the bus driver */
 	void *bus_driver_context;
 };
@@ -84,7 +84,7 @@ struct visorchipset_bus_info {
 		/* Add new fields above. */
 		/* Remaining bits in this 32-bit word are unused. */
 	} flags;
-	struct controlvm_message_header pending_msg_hdr;/* CONTROLVM MsgHdr */
+	struct controlvm_message_header *pending_msg_hdr;/* CONTROLVM MsgHdr */
 	/** For private use by the bus driver */
 	void *bus_driver_context;
 };
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index e24b202..417a4bf 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -962,37 +962,17 @@ enum crash_obj_type {
 };
 
 static void
-bus_responder(enum controlvm_id cmd_id, struct visorchipset_bus_info *p,
+bus_responder(enum controlvm_id cmd_id,
+	      struct controlvm_message_header *pending_msg_hdr,
 	      int response)
 {
-	bool need_clear = false;
-	u32 bus_no = p->bus_no;
+	if (pending_msg_hdr == NULL)
+		return;		/* no controlvm response needed */
 
-	if (!p)
+	if (pending_msg_hdr->id != (u32)cmd_id)
 		return;
 
-	if (response < 0) {
-		if ((cmd_id == CONTROLVM_BUS_CREATE) &&
-		    (response != (-CONTROLVM_RESP_ERROR_ALREADY_DONE)))
-			/* undo the row we just created... */
-			busdevices_del(&dev_info_list, bus_no);
-	} else {
-		if (cmd_id == CONTROLVM_BUS_CREATE)
-			p->state.created = 1;
-		if (cmd_id == CONTROLVM_BUS_DESTROY)
-			need_clear = true;
-	}
-
-	if (p->pending_msg_hdr.id == CONTROLVM_INVALID)
-		return;		/* no controlvm response needed */
-	if (p->pending_msg_hdr.id != (u32)cmd_id)
-		return;
-	controlvm_respond(&p->pending_msg_hdr, response);
-	p->pending_msg_hdr.id = CONTROLVM_INVALID;
-	if (need_clear) {
-		bus_info_clear(p);
-		busdevices_del(&dev_info_list, bus_no);
-	}
+	controlvm_respond(pending_msg_hdr, response);
 }
 
 static void
@@ -1004,14 +984,12 @@ device_changestate_responder(enum controlvm_id cmd_id,
 	u32 bus_no = p->bus_no;
 	u32 dev_no = p->dev_no;
 
-	if (!p)
-		return;
-	if (p->pending_msg_hdr.id == CONTROLVM_INVALID)
+	if (p->pending_msg_hdr == NULL)
 		return;		/* no controlvm response needed */
-	if (p->pending_msg_hdr.id != cmd_id)
+	if (p->pending_msg_hdr->id != cmd_id)
 		return;
 
-	controlvm_init_response(&outmsg, &p->pending_msg_hdr, response);
+	controlvm_init_response(&outmsg, p->pending_msg_hdr, response);
 
 	outmsg.cmd.device_change_state.bus_no = bus_no;
 	outmsg.cmd.device_change_state.dev_no = dev_no;
@@ -1020,35 +998,20 @@ device_changestate_responder(enum controlvm_id cmd_id,
 	if (!visorchannel_signalinsert(controlvm_channel,
 				       CONTROLVM_QUEUE_REQUEST, &outmsg))
 		return;
-
-	p->pending_msg_hdr.id = CONTROLVM_INVALID;
 }
 
 static void
-device_responder(enum controlvm_id cmd_id, struct visorchipset_device_info *p,
+device_responder(enum controlvm_id cmd_id,
+		 struct controlvm_message_header *pending_msg_hdr,
 		 int response)
 {
-	bool need_clear = false;
-
-	if (!p)
-		return;
-	if (response >= 0) {
-		if (cmd_id == CONTROLVM_DEVICE_CREATE)
-			p->state.created = 1;
-		if (cmd_id == CONTROLVM_DEVICE_DESTROY)
-			need_clear = true;
-	}
-
-	if (p->pending_msg_hdr.id == CONTROLVM_INVALID)
+	if (pending_msg_hdr == NULL)
 		return;		/* no controlvm response needed */
 
-	if (p->pending_msg_hdr.id != (u32)cmd_id)
+	if (pending_msg_hdr->id != (u32)cmd_id)
 		return;
 
-	controlvm_respond(&p->pending_msg_hdr, response);
-	p->pending_msg_hdr.id = CONTROLVM_INVALID;
-	if (need_clear)
-		dev_info_clear(p);
+	controlvm_respond(pending_msg_hdr, response);
 }
 
 static void
@@ -1057,15 +1020,32 @@ bus_epilog(struct visorchipset_bus_info *bus_info,
 	   int response, bool need_response)
 {
 	bool notified = false;
+	struct controlvm_message_header *pmsg_hdr = NULL;
 
-	if (!bus_info)
-		return;
+	if (!bus_info) {
+		/* relying on a valid passed in response code */
+		/* be lazy and re-use msg_hdr for this failure, is this ok?? */
+		pmsg_hdr = msg_hdr;
+		goto away;
+	}
+
+	if (bus_info->pending_msg_hdr) {
+		/* only non-NULL if dev is still waiting on a response */
+		response = -CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT;
+		pmsg_hdr = bus_info->pending_msg_hdr;
+		goto away;
+	}
 
 	if (need_response) {
-		memcpy(&bus_info->pending_msg_hdr, msg_hdr,
+		pmsg_hdr = kzalloc(sizeof(*pmsg_hdr), GFP_KERNEL);
+		if (!pmsg_hdr) {
+			response = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
+			goto away;
+		}
+
+		memcpy(pmsg_hdr, msg_hdr,
 		       sizeof(struct controlvm_message_header));
-	} else {
-		bus_info->pending_msg_hdr.id = CONTROLVM_INVALID;
+		bus_info->pending_msg_hdr = pmsg_hdr;
 	}
 
 	down(&notifier_lock);
@@ -1085,6 +1065,7 @@ bus_epilog(struct visorchipset_bus_info *bus_info,
 			break;
 		}
 	}
+away:
 	if (notified)
 		/* The callback function just called above is responsible
 		 * for calling the appropriate visorchipset_busdev_responders
@@ -1092,7 +1073,12 @@ bus_epilog(struct visorchipset_bus_info *bus_info,
 		 */
 		;
 	else
-		bus_responder(cmd, bus_info, response);
+		/*
+		 * Do not kfree(pmsg_hdr) as this is the failure path.
+		 * The success path ('notified') will call the responder
+		 * directly and kfree() there.
+		 */
+		bus_responder(cmd, pmsg_hdr, response);
 	up(&notifier_lock);
 }
 
@@ -1106,22 +1092,39 @@ device_epilog(struct visorchipset_device_info *dev_info,
 	bool notified = false;
 	u32 bus_no = dev_info->bus_no;
 	u32 dev_no = dev_info->dev_no;
+	struct controlvm_message_header *pmsg_hdr = NULL;
 
 	char *envp[] = {
 		"SPARSP_DIAGPOOL_PAUSED_STATE = 1",
 		NULL
 	};
 
-	if (!dev_info)
-		return;
-
 	notifiers = &busdev_notifiers;
 
+	if (!dev_info) {
+		/* relying on a valid passed in response code */
+		/* be lazy and re-use msg_hdr for this failure, is this ok?? */
+		pmsg_hdr = msg_hdr;
+		goto away;
+	}
+
+	if (dev_info->pending_msg_hdr) {
+		/* only non-NULL if dev is still waiting on a response */
+		response = -CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT;
+		pmsg_hdr = dev_info->pending_msg_hdr;
+		goto away;
+	}
+
 	if (need_response) {
-		memcpy(&dev_info->pending_msg_hdr, msg_hdr,
+		pmsg_hdr = kzalloc(sizeof(*pmsg_hdr), GFP_KERNEL);
+		if (!pmsg_hdr) {
+			response = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
+			goto away;
+		}
+
+		memcpy(pmsg_hdr, msg_hdr,
 		       sizeof(struct controlvm_message_header));
-	} else {
-		dev_info->pending_msg_hdr.id = CONTROLVM_INVALID;
+		dev_info->pending_msg_hdr = pmsg_hdr;
 	}
 
 	down(&notifier_lock);
@@ -1179,6 +1182,7 @@ device_epilog(struct visorchipset_device_info *dev_info,
 			break;
 		}
 	}
+away:
 	if (notified)
 		/* The callback function just called above is responsible
 		 * for calling the appropriate visorchipset_busdev_responders
@@ -1186,7 +1190,12 @@ device_epilog(struct visorchipset_device_info *dev_info,
 		 */
 		;
 	else
-		device_responder(cmd, dev_info, response);
+		/*
+		 * Do not kfree(pmsg_hdr) as this is the failure path.
+		 * The success path ('notified') will call the responder
+		 * directly and kfree() there.
+		 */
+		device_responder(cmd, pmsg_hdr, response);
 	up(&notifier_lock);
 }
 
@@ -1284,7 +1293,7 @@ bus_configure(struct controlvm_message *inmsg,
 		POSTCODE_LINUX_3(BUS_CONFIGURE_FAILURE_PC, bus_no,
 				 POSTCODE_SEVERITY_ERR);
 		rc = -CONTROLVM_RESP_ERROR_BUS_INVALID;
-	} else if (bus_info->pending_msg_hdr.id != CONTROLVM_INVALID) {
+	} else if (bus_info->pending_msg_hdr != NULL) {
 		POSTCODE_LINUX_3(BUS_CONFIGURE_FAILURE_PC, bus_no,
 				 POSTCODE_SEVERITY_ERR);
 		rc = -CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT;
@@ -2125,25 +2134,57 @@ cleanup:
 static void
 bus_create_response(struct visorchipset_bus_info *bus_info, int response)
 {
-	bus_responder(CONTROLVM_BUS_CREATE, bus_info, response);
+	if (response >= 0) {
+		bus_info->state.created = 1;
+	} else {
+		if (response != -CONTROLVM_RESP_ERROR_ALREADY_DONE)
+			/* undo the row we just created... */
+			busdevices_del(&dev_info_list, bus_info->bus_no);
+	}
+
+	bus_responder(CONTROLVM_BUS_CREATE, bus_info->pending_msg_hdr,
+		      response);
+
+	kfree(bus_info->pending_msg_hdr);
+	bus_info->pending_msg_hdr = NULL;
 }
 
 static void
 bus_destroy_response(struct visorchipset_bus_info *bus_info, int response)
 {
-	bus_responder(CONTROLVM_BUS_DESTROY, bus_info, response);
+	bus_responder(CONTROLVM_BUS_DESTROY, bus_info->pending_msg_hdr,
+		      response);
+
+	kfree(bus_info->pending_msg_hdr);
+	bus_info->pending_msg_hdr = NULL;
+
+	bus_info_clear(bus_info);
+	busdevices_del(&dev_info_list, bus_info->bus_no);
 }
 
 static void
 device_create_response(struct visorchipset_device_info *dev_info, int response)
 {
-	device_responder(CONTROLVM_DEVICE_CREATE, dev_info, response);
+	if (response >= 0)
+		dev_info->state.created = 1;
+
+	device_responder(CONTROLVM_DEVICE_CREATE, dev_info->pending_msg_hdr,
+			 response);
+
+	kfree(dev_info->pending_msg_hdr);
+	dev_info->pending_msg_hdr = NULL;
 }
 
 static void
 device_destroy_response(struct visorchipset_device_info *dev_info, int response)
 {
-	device_responder(CONTROLVM_DEVICE_DESTROY, dev_info, response);
+	device_responder(CONTROLVM_DEVICE_DESTROY, dev_info->pending_msg_hdr,
+			 response);
+
+	kfree(dev_info->pending_msg_hdr);
+	dev_info->pending_msg_hdr = NULL;
+
+	dev_info_clear(dev_info);
 }
 
 static void
@@ -2153,6 +2194,9 @@ visorchipset_device_pause_response(struct visorchipset_device_info *dev_info,
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
 				     dev_info, response,
 				     segment_state_standby);
+
+	kfree(dev_info->pending_msg_hdr);
+	dev_info->pending_msg_hdr = NULL;
 }
 
 static void
@@ -2161,6 +2205,9 @@ device_resume_response(struct visorchipset_device_info *dev_info, int response)
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
 				     dev_info, response,
 				     segment_state_running);
+
+	kfree(dev_info->pending_msg_hdr);
+	dev_info->pending_msg_hdr = NULL;
 }
 
 bool
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 34/44] staging: unisys: Prepare vbus_hdr_info to be public
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (32 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 33/44] staging: unisys: Convert pending_msg_hdr to a pointer Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-16 11:22   ` Dan Carpenter
  2015-05-13 17:22 ` [PATCH 35/44] staging: unisys: Migrate bus from devdata to visor_device Benjamin Romer
                   ` (9 subsequent siblings)
  43 siblings, 1 reply; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Jes.Sorensen, driverdev-devel, sparmaintainer, Don Zickus,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

In order to remove bus_info, we need to migrate vbus_hdr_info into
the public namespace of visor_device.  Because the struct is private,
we use a void * to hide the contents.

As a result, we need to allocate vbus_hdr_info and manage it.

Also work around vbus_valid, as that variable will not be used
in the public namespace.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 52 ++++++++++++++-----------
 1 file changed, 30 insertions(+), 22 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 49a34bb..06d267b 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -45,7 +45,7 @@ struct visorbus_devdata {
 	struct kobject kobj;
 	struct visorchannel *chan;	/* channel area for bus itself */
 	bool vbus_valid;
-	struct spar_vbus_headerinfo vbus_hdr_info;
+	void *vbus_hdr_info;
 };
 
 #define CURRENT_FILE_PC VISOR_BUS_PC_visorbus_main_c
@@ -1276,10 +1276,13 @@ fix_vbus_dev_info(struct visor_device *visordev)
 	int dev_no = visordev->chipset_dev_no;
 	struct ultra_vbus_deviceinfo dev_info;
 	const char *chan_type_name = NULL;
+	struct spar_vbus_headerinfo *hdr_info;
 
 	if (!visordev->device.driver)
 			return;
 
+	hdr_info = (struct spar_vbus_headerinfo *)visordev->vbus_hdr_info;
+
 	visordrv = to_visor_driver(visordev->device.driver);
 	if (!visorchipset_get_bus_info(bus_no, &bus_info))
 			return;
@@ -1288,7 +1291,7 @@ fix_vbus_dev_info(struct visor_device *visordev)
 	if (!devdata)
 			return;
 
-	if (!devdata->vbus_valid)
+	if (!hdr_info)
 			return;
 
 	/* Within the list of device types (by GUID) that the driver
@@ -1308,16 +1311,13 @@ fix_vbus_dev_info(struct visor_device *visordev)
 	bus_device_info_init(&dev_info, chan_type_name,
 			     visordrv->name, visordrv->version,
 			     visordrv->vertag);
-	write_vbus_dev_info(devdata->chan,
-			    &devdata->vbus_hdr_info, &dev_info, dev_no);
+	write_vbus_dev_info(devdata->chan, hdr_info, &dev_info, dev_no);
 
 	/* Re-write bus+chipset info, because it is possible that this
 	* was previously written by our evil counterpart, virtpci.
 	*/
-	write_vbus_chp_info(devdata->chan, &devdata->vbus_hdr_info,
-			    &chipset_driverinfo);
-	write_vbus_bus_info(devdata->chan, &devdata->vbus_hdr_info,
-			    &clientbus_driverinfo);
+	write_vbus_chp_info(devdata->chan, hdr_info, &chipset_driverinfo);
+	write_vbus_bus_info(devdata->chan, hdr_info, &clientbus_driverinfo);
 }
 
 /** Create a device instance for the visor bus itself.
@@ -1328,6 +1328,7 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 	struct visorbus_devdata *rc = NULL;
 	struct visorbus_devdata *devdata = NULL;
 	int id = bus_info->bus_no;
+	struct spar_vbus_headerinfo *hdr_info;
 
 	POSTCODE_LINUX_2(BUS_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO);
 	devdata = kzalloc(sizeof(*devdata), GFP_KERNEL);
@@ -1336,6 +1337,13 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 		rc = NULL;
 		goto away;
 	}
+
+	hdr_info = kzalloc(sizeof(*hdr_info), GFP_KERNEL);
+	if (!hdr_info) {
+		rc = NULL;
+		goto away_mem;
+	}
+
 	dev_set_name(&devdata->dev, "visorbus%d", id);
 	devdata->dev.bus = &visorbus_type;
 	devdata->dev.groups = visorbus_groups;
@@ -1344,26 +1352,19 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
 				 POSTCODE_SEVERITY_ERR);
 		rc = NULL;
-		goto away;
+		goto away_mem2;
 	}
 	devdata->devno = id;
 	devdata->chan = bus_info->visorchannel;
 	if (bus_info->flags.server) {
 		init_vbus_channel(devdata->chan);
 	} else {
-		if (get_vbus_header_info(devdata->chan,
-					 &devdata->
-					 vbus_hdr_info) >= 0) {
-			devdata->vbus_valid = true;
-			write_vbus_chp_info(devdata->chan,
-					    &devdata->
-					    vbus_hdr_info,
-					    &chipset_driverinfo
-					    );
-			write_vbus_bus_info(devdata->chan,
-					    &devdata->
-						vbus_hdr_info,
-					&clientbus_driverinfo);
+		if (get_vbus_header_info(devdata->chan, hdr_info) >= 0) {
+			devdata->vbus_hdr_info = (void *)hdr_info;
+			write_vbus_chp_info(devdata->chan, hdr_info,
+					    &chipset_driverinfo);
+			write_vbus_bus_info(devdata->chan, hdr_info,
+					    &clientbus_driverinfo);
 		}
 	}
 	bus_count++;
@@ -1372,6 +1373,12 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 			devdata = devdata;	/* for testing ONLY */
 	dev_set_drvdata(&devdata->dev, devdata);
 	rc = devdata;
+	return rc;
+
+away_mem2:
+	kfree(hdr_info);
+away_mem:
+	kfree(devdata);
 away:
 	return rc;
 }
@@ -1393,6 +1400,7 @@ remove_bus_instance(struct visorbus_devdata *devdata)
 		visorchannel_destroy(devdata->chan);
 		devdata->chan = NULL;
 	}
+	kfree(devdata->vbus_hdr_info);
 	list_del(&devdata->list_all);
 	device_unregister(&devdata->dev);
 }
-- 
2.1.4

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 35/44] staging: unisys: Migrate bus from devdata to visor_device
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (33 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 34/44] staging: unisys: Prepare vbus_hdr_info to be public Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 36/44] staging: unisys: Remove unused cruft Benjamin Romer
                   ` (8 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

The bus device and regular device were using two different
structs.  Let's combine them as they are not entirely different
from one another.

This allows us to move this creation up the stack later and
actually remove bus/dev_info easily.

Most of the churn is just renaming devdata -> dev and 'struct
visorbus_devdata' to 'struct visor_device'.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c | 127 +++++++++++-------------
 1 file changed, 57 insertions(+), 70 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 06d267b..fc0f085 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -36,18 +36,6 @@ int visorbus_devicetest;
 int visorbus_debugref;
 #define SERIALLOOPBACKCHANADDR (100 * 1024 * 1024)
 
-/** This is the private data that we store for each bus device instance.
- */
-struct visorbus_devdata {
-	int devno;		/* this is the chipset busNo */
-	struct list_head list_all;
-	struct device dev;
-	struct kobject kobj;
-	struct visorchannel *chan;	/* channel area for bus itself */
-	bool vbus_valid;
-	void *vbus_hdr_info;
-};
-
 #define CURRENT_FILE_PC VISOR_BUS_PC_visorbus_main_c
 #define POLLJIFFIES_TESTWORK         100
 #define POLLJIFFIES_NORMALCHANNEL     10
@@ -137,7 +125,7 @@ static struct ultra_vbus_deviceinfo chipset_driverinfo;
 /* filled in with info about this driver, wrt it servicing client busses */
 static struct ultra_vbus_deviceinfo clientbus_driverinfo;
 
-/** list of visorbus_devdata structs, linked via .list_all */
+/** list of visor_device structs, linked via .list_all */
 static LIST_HEAD(list_all_bus_instances);
 /** list of visor_device structs, linked via .list_all */
 static LIST_HEAD(list_all_device_instances);
@@ -195,10 +183,10 @@ away:
 static void
 visorbus_release_busdevice(struct device *xdev)
 {
-	struct visorbus_devdata *devdata = dev_get_drvdata(xdev);
+	struct visor_device *dev = dev_get_drvdata(xdev);
 
 	dev_set_drvdata(xdev, NULL);
-	kfree(devdata);
+	kfree(dev);
 	kfree(xdev);
 }
 
@@ -524,9 +512,6 @@ static const struct attribute_group *visorbus_dev_groups[] = {
 
 /* end implementation of specific channel attributes */
 
-#define to_visorbus_devdata(obj) \
-	container_of(obj, struct visorbus_devdata, dev)
-
 /*  BUS instance attributes
  *
  *  define & implement display of bus attributes under
@@ -1008,7 +993,7 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
  *  device.
  */
 static int
-create_visor_device(struct visorbus_devdata *devdata,
+create_visor_device(struct visor_device *bdev,
 		    struct visorchipset_device_info *dev_info,
 		    u64 partition_handle)
 {
@@ -1032,7 +1017,7 @@ create_visor_device(struct visorbus_devdata *devdata,
 	dev->channel_type_guid = dev_info->channel_type_guid;
 	dev->chipset_bus_no = chipset_bus_no;
 	dev->chipset_dev_no = chipset_dev_no;
-	dev->device.parent = &devdata->dev;
+	dev->device.parent = &bdev->device;
 	sema_init(&dev->visordriver_callback_lock, 1);	/* unlocked */
 	dev->device.bus = &visorbus_type;
 	dev->device.groups = visorbus_dev_groups;
@@ -1270,7 +1255,7 @@ fix_vbus_dev_info(struct visor_device *visordev)
 {
 	int i;
 	struct visorchipset_bus_info bus_info;
-	struct visorbus_devdata *devdata = NULL;
+	struct visor_device *dev = NULL;
 	struct visor_driver *visordrv;
 	int bus_no = visordev->chipset_bus_no;
 	int dev_no = visordev->chipset_dev_no;
@@ -1287,8 +1272,8 @@ fix_vbus_dev_info(struct visor_device *visordev)
 	if (!visorchipset_get_bus_info(bus_no, &bus_info))
 			return;
 
-	devdata = (struct visorbus_devdata *)(bus_info.bus_driver_context);
-	if (!devdata)
+	dev = (struct visor_device *)(bus_info.bus_driver_context);
+	if (!dev)
 			return;
 
 	if (!hdr_info)
@@ -1311,28 +1296,28 @@ fix_vbus_dev_info(struct visor_device *visordev)
 	bus_device_info_init(&dev_info, chan_type_name,
 			     visordrv->name, visordrv->version,
 			     visordrv->vertag);
-	write_vbus_dev_info(devdata->chan, hdr_info, &dev_info, dev_no);
+	write_vbus_dev_info(dev->visorchannel, hdr_info, &dev_info, dev_no);
 
 	/* Re-write bus+chipset info, because it is possible that this
 	* was previously written by our evil counterpart, virtpci.
 	*/
-	write_vbus_chp_info(devdata->chan, hdr_info, &chipset_driverinfo);
-	write_vbus_bus_info(devdata->chan, hdr_info, &clientbus_driverinfo);
+	write_vbus_chp_info(dev->visorchannel, hdr_info, &chipset_driverinfo);
+	write_vbus_bus_info(dev->visorchannel, hdr_info, &clientbus_driverinfo);
 }
 
 /** Create a device instance for the visor bus itself.
  */
-static struct visorbus_devdata *
+static struct visor_device *
 create_bus_instance(struct visorchipset_bus_info *bus_info)
 {
-	struct visorbus_devdata *rc = NULL;
-	struct visorbus_devdata *devdata = NULL;
+	struct visor_device *rc = NULL;
+	struct visor_device *dev = NULL;
 	int id = bus_info->bus_no;
 	struct spar_vbus_headerinfo *hdr_info;
 
 	POSTCODE_LINUX_2(BUS_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO);
-	devdata = kzalloc(sizeof(*devdata), GFP_KERNEL);
-	if (!devdata) {
+	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+	if (!dev) {
 		POSTCODE_LINUX_2(MALLOC_FAILURE_PC, POSTCODE_SEVERITY_ERR);
 		rc = NULL;
 		goto away;
@@ -1344,41 +1329,43 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 		goto away_mem;
 	}
 
-	dev_set_name(&devdata->dev, "visorbus%d", id);
-	devdata->dev.bus = &visorbus_type;
-	devdata->dev.groups = visorbus_groups;
-	devdata->dev.release = visorbus_release_busdevice;
-	if (device_register(&devdata->dev) < 0) {
+	dev_set_name(&dev->device, "visorbus%d", id);
+	dev->device.bus = &visorbus_type;
+	dev->device.groups = visorbus_groups;
+	dev->device.release = visorbus_release_busdevice;
+	if (device_register(&dev->device) < 0) {
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
 				 POSTCODE_SEVERITY_ERR);
 		rc = NULL;
 		goto away_mem2;
 	}
-	devdata->devno = id;
-	devdata->chan = bus_info->visorchannel;
+	dev->chipset_bus_no = id;
+	dev->visorchannel = bus_info->visorchannel;
 	if (bus_info->flags.server) {
-		init_vbus_channel(devdata->chan);
+		init_vbus_channel(dev->visorchannel);
 	} else {
-		if (get_vbus_header_info(devdata->chan, hdr_info) >= 0) {
-			devdata->vbus_hdr_info = (void *)hdr_info;
-			write_vbus_chp_info(devdata->chan, hdr_info,
+		if (get_vbus_header_info(dev->visorchannel, hdr_info) >= 0) {
+			dev->vbus_hdr_info = (void *)hdr_info;
+			write_vbus_chp_info(dev->visorchannel, hdr_info,
 					    &chipset_driverinfo);
-			write_vbus_bus_info(devdata->chan, hdr_info,
+			write_vbus_bus_info(dev->visorchannel, hdr_info,
 					    &clientbus_driverinfo);
+		} else {
+			kfree(hdr_info);
 		}
 	}
 	bus_count++;
-	list_add_tail(&devdata->list_all, &list_all_bus_instances);
+	list_add_tail(&dev->list_all, &list_all_bus_instances);
 	if (id == 0)
-			devdata = devdata;	/* for testing ONLY */
-	dev_set_drvdata(&devdata->dev, devdata);
-	rc = devdata;
+			dev = dev;	/* for testing ONLY */
+	dev_set_drvdata(&dev->device, dev);
+	rc = dev;
 	return rc;
 
 away_mem2:
 	kfree(hdr_info);
 away_mem:
-	kfree(devdata);
+	kfree(dev);
 away:
 	return rc;
 }
@@ -1386,23 +1373,23 @@ away:
 /** Remove a device instance for the visor bus itself.
  */
 static void
-remove_bus_instance(struct visorbus_devdata *devdata)
+remove_bus_instance(struct visor_device *dev)
 {
 	/* Note that this will result in the release method for
-	 * devdata->dev being called, which will call
+	 * dev->dev being called, which will call
 	 * visorbus_release_busdevice().  This has something to do with
 	 * the put_device() done in device_unregister(), but I have never
 	 * successfully been able to trace thru the code to see where/how
 	 * release() gets called.  But I know it does.
 	 */
 	bus_count--;
-	if (devdata->chan) {
-		visorchannel_destroy(devdata->chan);
-		devdata->chan = NULL;
+	if (dev->visorchannel) {
+		visorchannel_destroy(dev->visorchannel);
+		dev->visorchannel = NULL;
 	}
-	kfree(devdata->vbus_hdr_info);
-	list_del(&devdata->list_all);
-	device_unregister(&devdata->dev);
+	kfree(dev->vbus_hdr_info);
+	list_del(&dev->list_all);
+	device_unregister(&dev->device);
 }
 
 /** Create and register the one-and-only one instance of
@@ -1449,15 +1436,15 @@ static unsigned long test_dev_nos[MAXDEVICETEST];
 static void
 chipset_bus_create(struct visorchipset_bus_info *bus_info)
 {
-	struct visorbus_devdata *devdata;
+	struct visor_device *dev;
 	int rc = -1;
 	u32 bus_no = bus_info->bus_no;
 
 	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
-	devdata = create_bus_instance(bus_info);
-	if (!devdata)
+	dev = create_bus_instance(bus_info);
+	if (!dev)
 		goto away;
-	if (!visorchipset_set_bus_context(bus_info, devdata))
+	if (!visorchipset_set_bus_context(bus_info, dev))
 		goto away;
 	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
 	rc = 0;
@@ -1476,13 +1463,13 @@ away:
 static void
 chipset_bus_destroy(struct visorchipset_bus_info *bus_info)
 {
-	struct visorbus_devdata *devdata;
+	struct visor_device *dev;
 	int rc = -1;
 
-	devdata = (struct visorbus_devdata *)(bus_info->bus_driver_context);
-	if (!devdata)
+	dev = (struct visor_device *)(bus_info->bus_driver_context);
+	if (!dev)
 		goto away;
-	remove_bus_instance(devdata);
+	remove_bus_instance(dev);
 	if (!visorchipset_set_bus_context(bus_info, NULL))
 		goto away;
 	rc = 0;
@@ -1497,7 +1484,7 @@ static void
 chipset_device_create(struct visorchipset_device_info *dev_info)
 {
 	struct visorchipset_bus_info bus_info;
-	struct visorbus_devdata *devdata = NULL;
+	struct visor_device *dev = NULL;
 	int rc = -1;
 	u32 bus_no = dev_info->bus_no;
 	u32 dev_no = dev_info->dev_no;
@@ -1525,8 +1512,8 @@ away:
 				 POSTCODE_SEVERITY_ERR);
 		return;
 	}
-	devdata = (struct visorbus_devdata *)(bus_info.bus_driver_context);
-	rc = create_visor_device(devdata, dev_info, bus_info.partition_handle);
+	dev = (struct visor_device *)(bus_info.bus_driver_context);
+	rc = create_visor_device(dev, dev_info, bus_info.partition_handle);
 	POSTCODE_LINUX_4(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 	if (rc < 0)
@@ -1758,11 +1745,11 @@ visorbus_exit(void)
 	}
 
 	list_for_each_safe(listentry, listtmp, &list_all_bus_instances) {
-		struct visorbus_devdata *devdata = list_entry(listentry,
+		struct visor_device *dev = list_entry(listentry,
 							      struct
-							      visorbus_devdata,
+							      visor_device,
 							      list_all);
-		remove_bus_instance(devdata);
+		remove_bus_instance(dev);
 	}
 	remove_bus_type();
 }
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 36/44] staging: unisys: Remove unused cruft
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (34 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 35/44] staging: unisys: Migrate bus from devdata to visor_device Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 37/44] staging: unisys: Remove server flags Benjamin Romer
                   ` (7 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

Removing stuff that isn't being used.  Another prepartion patch to
allow us to use visor_device everywhere without the baggage of
bus/dev_info.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c    | 72 ----------------------
 drivers/staging/unisys/visorbus/visorbus_private.h | 13 ----
 2 files changed, 85 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index fc0f085..ec20c46 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -31,8 +31,6 @@
 int visorbus_debug;
 int visorbus_forcematch;
 int visorbus_forcenomatch;
-#define MAXDEVICETEST 4
-int visorbus_devicetest;
 int visorbus_debugref;
 #define SERIALLOOPBACKCHANADDR (100 * 1024 * 1024)
 
@@ -93,7 +91,6 @@ static struct delayed_work periodic_work;
 static struct workqueue_struct *periodic_test_workqueue;
 static struct workqueue_struct *periodic_dev_workqueue;
 static long long bus_count;	/** number of bus instances */
-static long long total_devices_created;
 					/** ever-increasing */
 
 static void chipset_bus_create(struct visorchipset_bus_info *bus_info);
@@ -462,33 +459,12 @@ static ssize_t typename_show(struct device *dev, struct device_attribute *attr,
 	return snprintf(buf, PAGE_SIZE, "%s\n", drv->channel_types[i - 1].name);
 }
 
-static ssize_t dump_show(struct device *dev, struct device_attribute *attr,
-			 char *buf)
-{
-/* TODO: replace this with debugfs code
-	struct visor_device *vdev = to_visor_device(dev);
-	int count = 0;
-	struct seq_file *m = NULL;
-	if (vdev->visorchannel == NULL)
-		return 0;
-	m = visor_seq_file_new_buffer(buf, PAGE_SIZE - 1);
-	if (m == NULL)
-		return 0;
-	visorchannel_debug(vdev->visorchannel, 1, m, 0);
-	count = m->count;
-	visor_seq_file_done_buffer(m);
-	m = NULL;
-*/
-	return 0;
-}
-
 static DEVICE_ATTR_RO(physaddr);
 static DEVICE_ATTR_RO(nbytes);
 static DEVICE_ATTR_RO(clientpartition);
 static DEVICE_ATTR_RO(typeguid);
 static DEVICE_ATTR_RO(zoneguid);
 static DEVICE_ATTR_RO(typename);
-static DEVICE_ATTR_RO(dump);
 
 static struct attribute *channel_attrs[] = {
 		&dev_attr_physaddr.attr,
@@ -497,7 +473,6 @@ static struct attribute *channel_attrs[] = {
 		&dev_attr_typeguid.attr,
 		&dev_attr_zoneguid.attr,
 		&dev_attr_typename.attr,
-		&dev_attr_dump.attr,
 };
 
 static struct attribute_group channel_attr_grp = {
@@ -702,25 +677,6 @@ unregister_driver_attributes(struct visor_driver *drv)
 	driver_remove_file(&drv->driver, &drv->version_attr);
 }
 
-/*  DEVICE attributes
- *
- *  define & implement display of device attributes under
- *  /sys/bus/visorbus/devices/<devicename>.
- *
- */
-
-#define DEVATTR(nam, func) { \
-	.attr = { .name = __stringify(nam), \
-		  .mode = 0444, \
-		  .owner = THIS_MODULE },	\
-	.show = func, \
-}
-
-static struct device_attribute visor_device_attrs[] = {
-	/* DEVATTR(channel_nbytes, DEVICE_ATTR_channel_nbytes), */
-	__ATTR_NULL
-};
-
 static void
 dev_periodic_work(void *xdev)
 {
@@ -1088,7 +1044,6 @@ away:
 			put_device(&dev->device);
 		kfree(dev);
 	} else {
-		total_devices_created++;
 		list_add_tail(&dev->list_all, &list_all_device_instances);
 	}
 	return rc;
@@ -1400,7 +1355,6 @@ create_bus_type(void)
 {
 	int rc = 0;
 
-	visorbus_type.dev_attrs = visor_device_attrs;
 	rc = bus_register(&visorbus_type);
 	return rc;
 }
@@ -1428,11 +1382,6 @@ remove_all_visor_devices(void)
 	}
 }
 
-static bool entered_testing_mode;
-static struct visorchannel *test_channel_infos[MAXDEVICETEST];
-static unsigned long test_bus_nos[MAXDEVICETEST];
-static unsigned long test_dev_nos[MAXDEVICETEST];
-
 static void
 chipset_bus_create(struct visorchipset_bus_info *bus_info)
 {
@@ -1492,17 +1441,8 @@ chipset_device_create(struct visorchipset_device_info *dev_info)
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
-	if (entered_testing_mode)
-		return;
 	if (!visorchipset_get_bus_info(bus_no, &bus_info))
 		goto away;
-	if (visorbus_devicetest)
-		if (total_devices_created < MAXDEVICETEST) {
-			test_channel_infos[total_devices_created] =
-			    dev_info->visorchannel;
-			test_bus_nos[total_devices_created] = bus_no;
-			test_dev_nos[total_devices_created] = dev_no;
-		}
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 	rc = 0;
@@ -1527,8 +1467,6 @@ chipset_device_destroy(struct visorchipset_device_info *dev_info)
 	struct visor_device *dev;
 	int rc = -1;
 
-	if (entered_testing_mode)
-		return;
 	dev = find_visor_device_by_channel(dev_info->visorchannel);
 	if (!dev)
 		goto away;
@@ -1691,11 +1629,6 @@ visorbus_init(void)
 			     "clientbus", "visorbus",
 			     VERSION, NULL);
 
-	/* process module options */
-
-	if (visorbus_devicetest > MAXDEVICETEST)
-			visorbus_devicetest = MAXDEVICETEST;
-
 	rc = create_bus_type();
 	if (rc < 0) {
 		POSTCODE_LINUX_2(BUS_CREATE_ENTRY_PC, DIAG_SEVERITY_ERR);
@@ -1768,11 +1701,6 @@ MODULE_PARM_DESC(visorbus_forcenomatch,
 		 "1 to force an UNsuccessful dev <--> drv match");
 int visorbus_forcenomatch = 0;
 
-module_param_named(devicetest, visorbus_devicetest, int, S_IRUGO);
-MODULE_PARM_DESC(visorbus_devicetest,
-		 "non-0 to just test device creation and destruction");
-int visorbus_devicetest = 0;
-
 module_param_named(debugref, visorbus_debugref, int, S_IRUGO);
 MODULE_PARM_DESC(visorbus_debugref, "1 to debug reference counting");
 int visorbus_debugref = 0;
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index f371f9d..57db062 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -27,19 +27,6 @@
 
 struct visorchannel;
 
-enum visorchipset_addresstype {
-	/** address is guest physical, but outside of the physical memory
-	 *  region that is controlled by the running OS (this is the normal
-	 *  address type for Supervisor channels)
-	 */
-	ADDRTYPE_LOCALPHYSICAL,
-
-	/** address is guest physical, and withIN the confines of the
-	 *  physical memory controlled by the running OS.
-	 */
-	ADDRTYPE_LOCALTEST,
-};
-
 /** Attributes for a particular Supervisor device.
  *  Any visorchipset client can query these attributes using
  *  visorchipset_get_client_device_info() or
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 37/44] staging: unisys: Remove server flags
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (35 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 36/44] staging: unisys: Remove unused cruft Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 38/44] staging: unisys: Do not use 0 as the default bus root device number Benjamin Romer
                   ` (6 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

The bus driver doesn't work in server mode, just remove the left over
pieces.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/visorbus/visorbus_main.c    | 66 +++-------------------
 drivers/staging/unisys/visorbus/visorbus_private.h |  5 --
 drivers/staging/unisys/visorbus/visorchipset.c     |  2 -
 3 files changed, 7 insertions(+), 66 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index ec20c46..7667b15 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -1074,54 +1074,6 @@ find_visor_device_by_channel(struct visorchannel *channel)
 }
 
 static int
-init_vbus_channel(struct visorchannel *chan)
-{
-	int rc = -1;
-	unsigned long allocated_bytes = visorchannel_get_nbytes(chan);
-	struct spar_vbus_channel_protocol *x =
-		kmalloc(sizeof(struct spar_vbus_channel_protocol),
-			GFP_KERNEL);
-
-	POSTCODE_LINUX_3(VBUS_CHANNEL_ENTRY_PC, rc, POSTCODE_SEVERITY_INFO);
-
-	if (x) {
-		POSTCODE_LINUX_2(MALLOC_FAILURE_PC, POSTCODE_SEVERITY_ERR);
-		goto away;
-	}
-	if (visorchannel_clear(chan, 0, 0, allocated_bytes) < 0) {
-		POSTCODE_LINUX_2(VBUS_CHANNEL_FAILURE_PC,
-				 POSTCODE_SEVERITY_ERR);
-		goto away;
-	}
-	if (visorchannel_read
-	    (chan, 0, x, sizeof(struct spar_vbus_channel_protocol)) < 0) {
-		POSTCODE_LINUX_2(VBUS_CHANNEL_FAILURE_PC,
-				 POSTCODE_SEVERITY_ERR);
-		goto away;
-	}
-	if (!SPAR_VBUS_CHANNEL_OK_SERVER(allocated_bytes)) {
-		POSTCODE_LINUX_2(VBUS_CHANNEL_FAILURE_PC,
-				 POSTCODE_SEVERITY_ERR);
-		goto away;
-	}
-
-	if (visorchannel_write
-	    (chan, 0, x, sizeof(struct spar_vbus_channel_protocol)) < 0) {
-		POSTCODE_LINUX_3(VBUS_CHANNEL_FAILURE_PC, chan,
-				 POSTCODE_SEVERITY_ERR);
-		goto away;
-	}
-
-	POSTCODE_LINUX_3(VBUS_CHANNEL_EXIT_PC, chan, POSTCODE_SEVERITY_INFO);
-	rc = 0;
-
-away:
-	kfree(x);
-	x = NULL;
-	return rc;
-}
-
-static int
 get_vbus_header_info(struct visorchannel *chan,
 		     struct spar_vbus_headerinfo *hdr_info)
 {
@@ -1296,18 +1248,14 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 	}
 	dev->chipset_bus_no = id;
 	dev->visorchannel = bus_info->visorchannel;
-	if (bus_info->flags.server) {
-		init_vbus_channel(dev->visorchannel);
+	if (get_vbus_header_info(dev->visorchannel, hdr_info) >= 0) {
+		dev->vbus_hdr_info = (void *)hdr_info;
+		write_vbus_chp_info(dev->visorchannel, hdr_info,
+				    &chipset_driverinfo);
+		write_vbus_bus_info(dev->visorchannel, hdr_info,
+				    &clientbus_driverinfo);
 	} else {
-		if (get_vbus_header_info(dev->visorchannel, hdr_info) >= 0) {
-			dev->vbus_hdr_info = (void *)hdr_info;
-			write_vbus_chp_info(dev->visorchannel, hdr_info,
-					    &chipset_driverinfo);
-			write_vbus_bus_info(dev->visorchannel, hdr_info,
-					    &clientbus_driverinfo);
-		} else {
-			kfree(hdr_info);
-		}
+		kfree(hdr_info);
 	}
 	bus_count++;
 	list_add_tail(&dev->list_all, &list_all_bus_instances);
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index 57db062..af71809 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -66,11 +66,6 @@ struct visorchipset_bus_info {
 	u8 *description;	/* UTF8 */
 	u64 reserved1;
 	u32 reserved2;
-	struct {
-		u32 server:1;
-		/* Add new fields above. */
-		/* Remaining bits in this 32-bit word are unused. */
-	} flags;
 	struct controlvm_message_header *pending_msg_hdr;/* CONTROLVM MsgHdr */
 	/** For private use by the bus driver */
 	void *bus_driver_context;
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 417a4bf..e8a907f 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -1228,8 +1228,6 @@ bus_create(struct controlvm_message *inmsg)
 
 	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
 
-	bus_info->flags.server = inmsg->hdr.flags.server;
-
 	visorchannel = visorchannel_create(cmd->create_bus.channel_addr,
 					   cmd->create_bus.channel_bytes,
 					   GFP_KERNEL,
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 38/44] staging: unisys: Do not use 0 as the default bus root device number
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (36 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 37/44] staging: unisys: Remove server flags Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 39/44] staging: unisys: Convert bus creation to use visor_device Benjamin Romer
                   ` (5 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

I used 0 as the device id for the bus root, neglecting the fact that
device 0 is a valid id in Unisys's configuration.  Modify this to
use UINT_MAX instead as a unique number.

As fallout from this change it was noticed the bus_no and dev_no was not
defined the same way consistently.  Fix visorbus.h to use u32 there.  Fix
the resulting printk warning too.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/visorbus.h       | 4 ++--
 drivers/staging/unisys/visorbus/visorbus_main.c | 2 +-
 drivers/staging/unisys/visorbus/visorchipset.c  | 6 ++++--
 3 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index 3152ba4..c60f7d4 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -150,8 +150,8 @@ struct visor_device {
 	struct semaphore visordriver_callback_lock;
 	bool pausing;
 	bool resuming;
-	unsigned long chipset_bus_no;
-	unsigned long chipset_dev_no;
+	u32 chipset_bus_no;
+	u32 chipset_dev_no;
 	struct visorchipset_state state;
 	uuid_le type;
 	uuid_le inst;
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 7667b15..e5731b1 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -572,7 +572,7 @@ static ssize_t client_bus_info_show(struct device *dev,
 		if (vdev->name)
 			partition_name = vdev->name;
 		x = snprintf(p, remain,
-			     "Client device / client driver info for %s partition (vbus #%ld):\n",
+			     "Client device / client driver info for %s partition (vbus #%d):\n",
 			     partition_name, vdev->chipset_dev_no);
 		p += x;
 		remain -= x;
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index e8a907f..95fad07 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -56,6 +56,8 @@
 #define UNISYS_SPAR_ID_ECX 0x70537379
 #define UNISYS_SPAR_ID_EDX 0x34367261
 
+#define BUS_ROOT_DEVICE	UINT_MAX
+
 /*
  * Module parameters
  */
@@ -727,8 +729,8 @@ static int match_visorbus_dev_by_id(struct device *dev, void *data)
 	u32 bus_no = id->bus_no;
 	u32 dev_no = id->dev_no;
 
-	if (((bus_no == -1) || (vdev->chipset_bus_no == bus_no)) &&
-	    ((dev_no == -1) || (vdev->chipset_dev_no == dev_no)))
+	if ((vdev->chipset_bus_no == bus_no) &&
+	    (vdev->chipset_dev_no == dev_no))
 		return 1;
 
 	return 0;
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 39/44] staging: unisys: Convert bus creation to use visor_device
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (37 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 38/44] staging: unisys: Do not use 0 as the default bus root device number Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 40/44] staging: unisys: Convert device " Benjamin Romer
                   ` (4 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

This patch removes the legacy bus_info struct and instead creates
and passes around a traditional struct device.

This allows us to remove a lot of the various look up code and
removes the doubt if the struct exists or not.

Half of the churn is just the conversion of visorchipset_bus_info
to visor_device.  Various cleanups include re-arranging the failure
paths to make more sense.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/visorbus.h          |   3 +
 drivers/staging/unisys/visorbus/visorbus_main.c    | 131 ++++++++-------------
 drivers/staging/unisys/visorbus/visorbus_private.h |  34 +-----
 drivers/staging/unisys/visorbus/visorchipset.c     |  95 ++++-----------
 4 files changed, 77 insertions(+), 186 deletions(-)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index c60f7d4..e7f9984 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -220,4 +220,7 @@ void visorchannel_debug(struct visorchannel *channel, int num_queues,
 			struct seq_file *seq, u32 off);
 void __iomem *visorchannel_get_header(struct visorchannel *channel);
 
+#define BUS_ROOT_DEVICE		UINT_MAX
+struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no,
+					       struct visor_device *from);
 #endif
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index e5731b1..888e65d 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -93,8 +93,8 @@ static struct workqueue_struct *periodic_dev_workqueue;
 static long long bus_count;	/** number of bus instances */
 					/** ever-increasing */
 
-static void chipset_bus_create(struct visorchipset_bus_info *bus_info);
-static void chipset_bus_destroy(struct visorchipset_bus_info *bus_info);
+static void chipset_bus_create(struct visor_device *bus_info);
+static void chipset_bus_destroy(struct visor_device *bus_info);
 static void chipset_device_create(struct visorchipset_device_info *dev_info);
 static void chipset_device_destroy(struct visorchipset_device_info *dev_info);
 static void chipset_device_pause(struct visorchipset_device_info *dev_info);
@@ -950,8 +950,7 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
  */
 static int
 create_visor_device(struct visor_device *bdev,
-		    struct visorchipset_device_info *dev_info,
-		    u64 partition_handle)
+		    struct visorchipset_device_info *dev_info)
 {
 	int rc = -1;
 	struct visor_device *dev = NULL;
@@ -1161,8 +1160,7 @@ static void
 fix_vbus_dev_info(struct visor_device *visordev)
 {
 	int i;
-	struct visorchipset_bus_info bus_info;
-	struct visor_device *dev = NULL;
+	struct visor_device *bdev;
 	struct visor_driver *visordrv;
 	int bus_no = visordev->chipset_bus_no;
 	int dev_no = visordev->chipset_dev_no;
@@ -1174,17 +1172,14 @@ fix_vbus_dev_info(struct visor_device *visordev)
 			return;
 
 	hdr_info = (struct spar_vbus_headerinfo *)visordev->vbus_hdr_info;
+	if (!hdr_info)
+		return;
 
-	visordrv = to_visor_driver(visordev->device.driver);
-	if (!visorchipset_get_bus_info(bus_no, &bus_info))
-			return;
-
-	dev = (struct visor_device *)(bus_info.bus_driver_context);
-	if (!dev)
-			return;
+	bdev = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
+	if (!bdev)
+		return;
 
-	if (!hdr_info)
-			return;
+	visordrv = to_visor_driver(visordev->device.driver);
 
 	/* Within the list of device types (by GUID) that the driver
 	 * says it supports, find out which one of those types matches
@@ -1203,51 +1198,45 @@ fix_vbus_dev_info(struct visor_device *visordev)
 	bus_device_info_init(&dev_info, chan_type_name,
 			     visordrv->name, visordrv->version,
 			     visordrv->vertag);
-	write_vbus_dev_info(dev->visorchannel, hdr_info, &dev_info, dev_no);
+	write_vbus_dev_info(bdev->visorchannel, hdr_info, &dev_info, dev_no);
 
 	/* Re-write bus+chipset info, because it is possible that this
 	* was previously written by our evil counterpart, virtpci.
 	*/
-	write_vbus_chp_info(dev->visorchannel, hdr_info, &chipset_driverinfo);
-	write_vbus_bus_info(dev->visorchannel, hdr_info, &clientbus_driverinfo);
+	write_vbus_chp_info(bdev->visorchannel, hdr_info, &chipset_driverinfo);
+	write_vbus_bus_info(bdev->visorchannel, hdr_info,
+			    &clientbus_driverinfo);
 }
 
 /** Create a device instance for the visor bus itself.
  */
-static struct visor_device *
-create_bus_instance(struct visorchipset_bus_info *bus_info)
+static int
+create_bus_instance(struct visor_device *dev)
 {
-	struct visor_device *rc = NULL;
-	struct visor_device *dev = NULL;
-	int id = bus_info->bus_no;
+	int rc;
+	int id = dev->chipset_bus_no;
 	struct spar_vbus_headerinfo *hdr_info;
 
 	POSTCODE_LINUX_2(BUS_CREATE_ENTRY_PC, POSTCODE_SEVERITY_INFO);
-	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-	if (!dev) {
-		POSTCODE_LINUX_2(MALLOC_FAILURE_PC, POSTCODE_SEVERITY_ERR);
-		rc = NULL;
-		goto away;
-	}
 
 	hdr_info = kzalloc(sizeof(*hdr_info), GFP_KERNEL);
 	if (!hdr_info) {
-		rc = NULL;
-		goto away_mem;
+		rc = -1;
+		goto away;
 	}
 
 	dev_set_name(&dev->device, "visorbus%d", id);
 	dev->device.bus = &visorbus_type;
 	dev->device.groups = visorbus_groups;
 	dev->device.release = visorbus_release_busdevice;
+
 	if (device_register(&dev->device) < 0) {
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
 				 POSTCODE_SEVERITY_ERR);
-		rc = NULL;
-		goto away_mem2;
+		rc = -1;
+		goto away_mem;
 	}
-	dev->chipset_bus_no = id;
-	dev->visorchannel = bus_info->visorchannel;
+
 	if (get_vbus_header_info(dev->visorchannel, hdr_info) >= 0) {
 		dev->vbus_hdr_info = (void *)hdr_info;
 		write_vbus_chp_info(dev->visorchannel, hdr_info,
@@ -1259,16 +1248,11 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 	}
 	bus_count++;
 	list_add_tail(&dev->list_all, &list_all_bus_instances);
-	if (id == 0)
-			dev = dev;	/* for testing ONLY */
 	dev_set_drvdata(&dev->device, dev);
-	rc = dev;
-	return rc;
+	return 0;
 
-away_mem2:
-	kfree(hdr_info);
 away_mem:
-	kfree(dev);
+	kfree(hdr_info);
 away:
 	return rc;
 }
@@ -1331,57 +1315,38 @@ remove_all_visor_devices(void)
 }
 
 static void
-chipset_bus_create(struct visorchipset_bus_info *bus_info)
+chipset_bus_create(struct visor_device *dev)
 {
-	struct visor_device *dev;
-	int rc = -1;
-	u32 bus_no = bus_info->bus_no;
+	int rc;
+	u32 bus_no = dev->chipset_bus_no;
 
 	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
-	dev = create_bus_instance(bus_info);
-	if (!dev)
-		goto away;
-	if (!visorchipset_set_bus_context(bus_info, dev))
-		goto away;
+	rc = create_bus_instance(dev);
 	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
-	rc = 0;
-away:
-	if (rc < 0) {
+
+	if (rc < 0)
 		POSTCODE_LINUX_3(BUS_CREATE_FAILURE_PC, bus_no,
 				 POSTCODE_SEVERITY_ERR);
-		return;
-	}
-	POSTCODE_LINUX_3(CHIPSET_INIT_SUCCESS_PC, bus_no,
-			 POSTCODE_SEVERITY_INFO);
+	else
+		POSTCODE_LINUX_3(CHIPSET_INIT_SUCCESS_PC, bus_no,
+				 POSTCODE_SEVERITY_INFO);
+
 	if (chipset_responders.bus_create)
-		(*chipset_responders.bus_create) (bus_info, rc);
+		(*chipset_responders.bus_create) (dev, rc);
 }
 
 static void
-chipset_bus_destroy(struct visorchipset_bus_info *bus_info)
+chipset_bus_destroy(struct visor_device *dev)
 {
-	struct visor_device *dev;
-	int rc = -1;
-
-	dev = (struct visor_device *)(bus_info->bus_driver_context);
-	if (!dev)
-		goto away;
 	remove_bus_instance(dev);
-	if (!visorchipset_set_bus_context(bus_info, NULL))
-		goto away;
-	rc = 0;
-away:
-	if (rc < 0)
-		return;
 	if (chipset_responders.bus_destroy)
-		(*chipset_responders.bus_destroy)(bus_info, rc);
+		(*chipset_responders.bus_destroy)(dev, 0);
 }
 
 static void
 chipset_device_create(struct visorchipset_device_info *dev_info)
 {
-	struct visorchipset_bus_info bus_info;
-	struct visor_device *dev = NULL;
+	struct visor_device *bdev;
 	int rc = -1;
 	u32 bus_no = dev_info->bus_no;
 	u32 dev_no = dev_info->dev_no;
@@ -1389,24 +1354,24 @@ chipset_device_create(struct visorchipset_device_info *dev_info)
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
-	if (!visorchipset_get_bus_info(bus_no, &bus_info))
+	bdev = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
+	if (!bdev)
 		goto away;
+
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
-	rc = 0;
+
+	rc = create_visor_device(bdev, dev_info);
 away:
 	if (rc < 0) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
-		return;
+		if (chipset_responders.device_create)
+			(*chipset_responders.device_create)(dev_info, rc);
 	}
-	dev = (struct visor_device *)(bus_info.bus_driver_context);
-	rc = create_visor_device(dev, dev_info, bus_info.partition_handle);
+
 	POSTCODE_LINUX_4(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
-	if (rc < 0)
-		if (chipset_responders.device_create)
-			(*chipset_responders.device_create)(dev_info, rc);
 }
 
 static void
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index af71809..6fd55af 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -49,35 +49,13 @@ struct visorchipset_device_info {
 	void *bus_driver_context;
 };
 
-/** Attributes for a particular Supervisor bus.
- *  (For a service partition acting as the server for buses/devices, there
- *  is a 1-to-1 relationship between busses and guest partitions.)
- *  Any visorchipset client can query these attributes using
- *  visorchipset_get_client_bus_info() or visorchipset_get_bus_info().
- */
-struct visorchipset_bus_info {
-	struct list_head entry;
-	u32 bus_no;
-	struct visorchipset_state state;
-	struct visorchannel *visorchannel;
-	uuid_le partition_uuid;
-	u64 partition_handle;
-	u8 *name;		/* UTF8 */
-	u8 *description;	/* UTF8 */
-	u64 reserved1;
-	u32 reserved2;
-	struct controlvm_message_header *pending_msg_hdr;/* CONTROLVM MsgHdr */
-	/** For private use by the bus driver */
-	void *bus_driver_context;
-};
-
 /*  These functions will be called from within visorchipset when certain
  *  events happen.  (The implementation of these functions is outside of
  *  visorchipset.)
  */
 struct visorchipset_busdev_notifiers {
-	void (*bus_create)(struct visorchipset_bus_info *bus_info);
-	void (*bus_destroy)(struct visorchipset_bus_info *bus_info);
+	void (*bus_create)(struct visor_device *bus_info);
+	void (*bus_destroy)(struct visor_device *bus_info);
 	void (*device_create)(struct visorchipset_device_info *bus_info);
 	void (*device_destroy)(struct visorchipset_device_info *bus_info);
 	void (*device_pause)(struct visorchipset_device_info *bus_info);
@@ -91,8 +69,8 @@ struct visorchipset_busdev_notifiers {
  *      -1 = it failed
  */
 struct visorchipset_busdev_responders {
-	void (*bus_create)(struct visorchipset_bus_info *p, int response);
-	void (*bus_destroy)(struct visorchipset_bus_info *p, int response);
+	void (*bus_create)(struct visor_device *p, int response);
+	void (*bus_destroy)(struct visor_device *p, int response);
 	void (*device_create)(struct visorchipset_device_info *p, int response);
 	void (*device_destroy)(struct visorchipset_device_info *p,
 			       int response);
@@ -112,10 +90,10 @@ visorchipset_register_busdev(
 			struct ultra_vbus_deviceinfo *driver_info);
 
 bool visorchipset_get_bus_info(u32 bus_no,
-			       struct visorchipset_bus_info *bus_info);
+			       struct visor_device *bus_info);
 bool visorchipset_get_device_info(u32 bus_no, u32 dev_no,
 				  struct visorchipset_device_info *dev_info);
-bool visorchipset_set_bus_context(struct visorchipset_bus_info *bus_info,
+bool visorchipset_set_bus_context(struct visor_device *bus_info,
 				  void *context);
 
 /* visorbus init and exit functions */
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 95fad07..9d41fa9 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -56,8 +56,6 @@
 #define UNISYS_SPAR_ID_ECX 0x70537379
 #define UNISYS_SPAR_ID_EDX 0x34367261
 
-#define BUS_ROOT_DEVICE	UINT_MAX
-
 /*
  * Module parameters
  */
@@ -230,8 +228,8 @@ static void parahotplug_process_list(void);
  */
 static struct visorchipset_busdev_notifiers busdev_notifiers;
 
-static void bus_create_response(struct visorchipset_bus_info *p, int response);
-static void bus_destroy_response(struct visorchipset_bus_info *p, int response);
+static void bus_create_response(struct visor_device *p, int response);
+static void bus_destroy_response(struct visor_device *p, int response);
 static void device_create_response(struct visorchipset_device_info *p,
 				   int response);
 static void device_destroy_response(struct visorchipset_device_info *p,
@@ -699,16 +697,6 @@ static ssize_t remaining_steps_store(struct device *dev,
 }
 
 static void
-bus_info_clear(void *v)
-{
-	struct visorchipset_bus_info *p = (struct visorchipset_bus_info *) v;
-
-	kfree(p->name);
-	kfree(p->description);
-	memset(p, 0, sizeof(struct visorchipset_bus_info));
-}
-
-static void
 dev_info_clear(void *v)
 {
 	struct visorchipset_device_info *p =
@@ -756,19 +744,6 @@ struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no,
 }
 EXPORT_SYMBOL(visorbus_get_device_by_id);
 
-static struct visorchipset_bus_info *
-bus_find(struct list_head *list, u32 bus_no)
-{
-	struct visorchipset_bus_info *p;
-
-	list_for_each_entry(p, list, entry) {
-		if (p->bus_no == bus_no)
-			return p;
-	}
-
-	return NULL;
-}
-
 static struct visorchipset_device_info *
 device_find(struct list_head *list, u32 bus_no, u32 dev_no)
 {
@@ -842,15 +817,8 @@ EXPORT_SYMBOL_GPL(visorchipset_register_busdev);
 static void
 cleanup_controlvm_structures(void)
 {
-	struct visorchipset_bus_info *bi, *tmp_bi;
 	struct visorchipset_device_info *di, *tmp_di;
 
-	list_for_each_entry_safe(bi, tmp_bi, &bus_info_list, entry) {
-		bus_info_clear(bi);
-		list_del(&bi->entry);
-		kfree(bi);
-	}
-
 	list_for_each_entry_safe(di, tmp_di, &dev_info_list, entry) {
 		dev_info_clear(di);
 		list_del(&di->entry);
@@ -1017,7 +985,7 @@ device_responder(enum controlvm_id cmd_id,
 }
 
 static void
-bus_epilog(struct visorchipset_bus_info *bus_info,
+bus_epilog(struct visor_device *bus_info,
 	   u32 cmd, struct controlvm_message_header *msg_hdr,
 	   int response, bool need_response)
 {
@@ -1207,10 +1175,10 @@ bus_create(struct controlvm_message *inmsg)
 	struct controlvm_message_packet *cmd = &inmsg->cmd;
 	u32 bus_no = cmd->create_bus.bus_no;
 	int rc = CONTROLVM_RESP_SUCCESS;
-	struct visorchipset_bus_info *bus_info;
+	struct visor_device *bus_info;
 	struct visorchannel *visorchannel;
 
-	bus_info = bus_find(&bus_info_list, bus_no);
+	bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
 	if (bus_info && (bus_info->state.created == 1)) {
 		POSTCODE_LINUX_3(BUS_CREATE_FAILURE_PC, bus_no,
 				 POSTCODE_SEVERITY_ERR);
@@ -1225,8 +1193,8 @@ bus_create(struct controlvm_message *inmsg)
 		goto cleanup;
 	}
 
-	INIT_LIST_HEAD(&bus_info->entry);
-	bus_info->bus_no = bus_no;
+	bus_info->chipset_bus_no = bus_no;
+	bus_info->chipset_dev_no = BUS_ROOT_DEVICE;
 
 	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
 
@@ -1243,7 +1211,6 @@ bus_create(struct controlvm_message *inmsg)
 		goto cleanup;
 	}
 	bus_info->visorchannel = visorchannel;
-	list_add(&bus_info->entry, &bus_info_list);
 
 	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
 
@@ -1257,10 +1224,10 @@ bus_destroy(struct controlvm_message *inmsg)
 {
 	struct controlvm_message_packet *cmd = &inmsg->cmd;
 	u32 bus_no = cmd->destroy_bus.bus_no;
-	struct visorchipset_bus_info *bus_info;
+	struct visor_device *bus_info;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
-	bus_info = bus_find(&bus_info_list, bus_no);
+	bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
 	if (!bus_info)
 		rc = -CONTROLVM_RESP_ERROR_BUS_INVALID;
 	else if (bus_info->state.created == 0)
@@ -1268,6 +1235,8 @@ bus_destroy(struct controlvm_message *inmsg)
 
 	bus_epilog(bus_info, CONTROLVM_BUS_DESTROY, &inmsg->hdr,
 		   rc, inmsg->hdr.flags.response_expected == 1);
+
+	/* bus_info is freed as part of the busdevice_release function */
 }
 
 static void
@@ -1276,15 +1245,14 @@ bus_configure(struct controlvm_message *inmsg,
 {
 	struct controlvm_message_packet *cmd = &inmsg->cmd;
 	u32 bus_no;
-	struct visorchipset_bus_info *bus_info;
+	struct visor_device *bus_info;
 	int rc = CONTROLVM_RESP_SUCCESS;
-	char s[99];
 
 	bus_no = cmd->configure_bus.bus_no;
 	POSTCODE_LINUX_3(BUS_CONFIGURE_ENTRY_PC, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
-	bus_info = bus_find(&bus_info_list, bus_no);
+	bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
 	if (!bus_info) {
 		POSTCODE_LINUX_3(BUS_CONFIGURE_FAILURE_PC, bus_no,
 				 POSTCODE_SEVERITY_ERR);
@@ -1304,7 +1272,6 @@ bus_configure(struct controlvm_message *inmsg,
 		parser_param_start(parser_ctx, PARSERSTRING_NAME);
 		bus_info->name = parser_string_get(parser_ctx);
 
-		visorchannel_uuid_id(&bus_info->partition_uuid, s);
 		POSTCODE_LINUX_3(BUS_CONFIGURE_EXIT_PC, bus_no,
 				 POSTCODE_SEVERITY_INFO);
 	}
@@ -1319,7 +1286,7 @@ my_device_create(struct controlvm_message *inmsg)
 	u32 bus_no = cmd->create_device.bus_no;
 	u32 dev_no = cmd->create_device.dev_no;
 	struct visorchipset_device_info *dev_info;
-	struct visorchipset_bus_info *bus_info;
+	struct visor_device *bus_info;
 	struct visorchannel *visorchannel;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
@@ -1330,7 +1297,7 @@ my_device_create(struct controlvm_message *inmsg)
 		rc = -CONTROLVM_RESP_ERROR_ALREADY_DONE;
 		goto cleanup;
 	}
-	bus_info = bus_find(&bus_info_list, bus_no);
+	bus_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
 	if (!bus_info) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
@@ -2132,14 +2099,15 @@ cleanup:
 }
 
 static void
-bus_create_response(struct visorchipset_bus_info *bus_info, int response)
+bus_create_response(struct visor_device *bus_info, int response)
 {
 	if (response >= 0) {
 		bus_info->state.created = 1;
 	} else {
 		if (response != -CONTROLVM_RESP_ERROR_ALREADY_DONE)
 			/* undo the row we just created... */
-			busdevices_del(&dev_info_list, bus_info->bus_no);
+			busdevices_del(&dev_info_list,
+				       bus_info->chipset_bus_no);
 	}
 
 	bus_responder(CONTROLVM_BUS_CREATE, bus_info->pending_msg_hdr,
@@ -2150,7 +2118,7 @@ bus_create_response(struct visorchipset_bus_info *bus_info, int response)
 }
 
 static void
-bus_destroy_response(struct visorchipset_bus_info *bus_info, int response)
+bus_destroy_response(struct visor_device *bus_info, int response)
 {
 	bus_responder(CONTROLVM_BUS_DESTROY, bus_info->pending_msg_hdr,
 		      response);
@@ -2158,8 +2126,7 @@ bus_destroy_response(struct visorchipset_bus_info *bus_info, int response)
 	kfree(bus_info->pending_msg_hdr);
 	bus_info->pending_msg_hdr = NULL;
 
-	bus_info_clear(bus_info);
-	busdevices_del(&dev_info_list, bus_info->bus_no);
+	busdevices_del(&dev_info_list, bus_info->chipset_bus_no);
 }
 
 static void
@@ -2211,28 +2178,6 @@ device_resume_response(struct visorchipset_device_info *dev_info, int response)
 }
 
 bool
-visorchipset_get_bus_info(u32 bus_no, struct visorchipset_bus_info *bus_info)
-{
-	void *p = bus_find(&bus_info_list, bus_no);
-
-	if (!p)
-		return false;
-	memcpy(bus_info, p, sizeof(struct visorchipset_bus_info));
-	return true;
-}
-EXPORT_SYMBOL_GPL(visorchipset_get_bus_info);
-
-bool
-visorchipset_set_bus_context(struct visorchipset_bus_info *p, void *context)
-{
-	if (!p)
-		return false;
-	p->bus_driver_context = context;
-	return true;
-}
-EXPORT_SYMBOL_GPL(visorchipset_set_bus_context);
-
-bool
 visorchipset_get_device_info(u32 bus_no, u32 dev_no,
 			     struct visorchipset_device_info *dev_info)
 {
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 40/44] staging: unisys: Convert device creation to use visor_device
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (38 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 39/44] staging: unisys: Convert bus creation to use visor_device Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-16 11:32   ` Dan Carpenter
  2015-05-18 15:23   ` [PATCH 40/44 V2] " Don Zickus
  2015-05-13 17:22 ` [PATCH 41/44] staging: unisys: Removed unused entries from struct visor_channeltype_descriptor Benjamin Romer
                   ` (3 subsequent siblings)
  43 siblings, 2 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh
  Cc: Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel,
	Benjamin Romer

From: Don Zickus <dzickus@redhat.com>

This patch removes the legacy dev_info struct and instead creates
and passes around a traditional struct device.

This allows us to remove a lot of the various look up code and
removes the doubt if the struct exists or not.

Half of the churn is just the conversion of visorchipset_device_info
to visor_device.  Various cleanups include re-arranging the failure
paths to make more sense.

Pay attention to the create_visor_device function.  This had a lot of
churn to simplify everything.

Lots of functions disappeared because they are not needed any more.

Signed-off-by: Don Zickus <dzickus@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/visorbus.h          |   8 +-
 drivers/staging/unisys/visorbus/visorbus_main.c    | 148 +++++--------------
 drivers/staging/unisys/visorbus/visorbus_private.h |  49 ++-----
 drivers/staging/unisys/visorbus/visorchipset.c     | 157 +++++----------------
 4 files changed, 81 insertions(+), 281 deletions(-)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index e7f9984..581d962 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -43,7 +43,7 @@ struct visor_device;
 extern struct bus_type visorbus_type;
 
 typedef void (*visorbus_state_complete_func) (struct visor_device *dev,
-					      int status, void *dev_info);
+					      int status);
 struct visorchipset_state {
 	u32 created:1;
 	u32 attached:1;
@@ -106,11 +106,9 @@ struct visor_driver {
 	 *  fails or completes successfully.
 	 */
 	int (*pause)(struct visor_device *dev,
-		     visorbus_state_complete_func complete_func,
-		     void *dev_info);
+		     visorbus_state_complete_func complete_func);
 	int (*resume)(struct visor_device *dev,
-		      visorbus_state_complete_func complete_func,
-		      void *dev_info);
+		      visorbus_state_complete_func complete_func);
 
 	/** These fields are for private use by the bus driver only. */
 	struct device_driver driver;
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 888e65d..beff496 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -95,10 +95,10 @@ static long long bus_count;	/** number of bus instances */
 
 static void chipset_bus_create(struct visor_device *bus_info);
 static void chipset_bus_destroy(struct visor_device *bus_info);
-static void chipset_device_create(struct visorchipset_device_info *dev_info);
-static void chipset_device_destroy(struct visorchipset_device_info *dev_info);
-static void chipset_device_pause(struct visorchipset_device_info *dev_info);
-static void chipset_device_resume(struct visorchipset_device_info *dev_info);
+static void chipset_device_create(struct visor_device *dev_info);
+static void chipset_device_destroy(struct visor_device *dev_info);
+static void chipset_device_pause(struct visor_device *dev_info);
+static void chipset_device_resume(struct visor_device *dev_info);
 
 /** These functions are implemented herein, and are called by the chipset
  *  driver to notify us about specific events.
@@ -184,7 +184,6 @@ visorbus_release_busdevice(struct device *xdev)
 
 	dev_set_drvdata(xdev, NULL);
 	kfree(dev);
-	kfree(xdev);
 }
 
 /** This is called when device_unregister() is called for each child
@@ -754,17 +753,9 @@ away:
 	 *  initialized.
 	 */
 	if (!dev->responded_to_device_create) {
-		struct visorchipset_device_info dev_info;
-
-		if (!visorchipset_get_device_info(dev->chipset_bus_no,
-						  dev->chipset_dev_no,
-						  &dev_info))
-			/* hmm, what to do here */
-			return rc;
-
 		dev->responded_to_device_create = true;
 		if (chipset_responders.device_create)
-			(*chipset_responders.device_create)(&dev_info, rc);
+			(*chipset_responders.device_create)(dev, rc);
 	}
 	return rc;
 }
@@ -949,30 +940,15 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
  *  device.
  */
 static int
-create_visor_device(struct visor_device *bdev,
-		    struct visorchipset_device_info *dev_info)
+create_visor_device(struct visor_device *dev)
 {
 	int rc = -1;
-	struct visor_device *dev = NULL;
-	bool gotten = false, registered1 = false, registered2 = false;
-	u32 chipset_bus_no = dev_info->bus_no;
-	u32 chipset_dev_no = dev_info->dev_no;
+	u32 chipset_bus_no = dev->chipset_bus_no;
+	u32 chipset_dev_no = dev->chipset_dev_no;
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, chipset_dev_no, chipset_bus_no,
 			 POSTCODE_SEVERITY_INFO);
-	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
-	if (!dev) {
-		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, chipset_dev_no,
-				 DIAG_SEVERITY_ERR);
-		goto away;
-	}
 
-	memset(dev, 0, sizeof(struct visor_device));
-	dev->visorchannel = dev_info->visorchannel;
-	dev->channel_type_guid = dev_info->channel_type_guid;
-	dev->chipset_bus_no = chipset_bus_no;
-	dev->chipset_dev_no = chipset_dev_no;
-	dev->device.parent = &bdev->device;
 	sema_init(&dev->visordriver_callback_lock, 1);	/* unlocked */
 	dev->device.bus = &visorbus_type;
 	dev->device.groups = visorbus_dev_groups;
@@ -980,7 +956,6 @@ create_visor_device(struct visor_device *bdev,
 	dev->device.release = visorbus_release_device;
 	/* keep a reference just for us (now 2) */
 	get_device(&dev->device);
-	gotten = true;
 	dev->periodic_work =
 		visor_periodic_work_create(POLLJIFFIES_NORMALCHANNEL,
 					   periodic_dev_workqueue,
@@ -1022,29 +997,21 @@ create_visor_device(struct visor_device *bdev,
 		goto away;
 	}
 
-	/* note: device_register is simply device_initialize + device_add */
-	registered1 = true;
-
 	rc = register_devmajorminor_attributes(dev);
 	if (rc < 0) {
 		POSTCODE_LINUX_3(DEVICE_REGISTER_FAILURE_PC, chipset_dev_no,
 				 DIAG_SEVERITY_ERR);
-		goto away;
+		goto away_register;
 	}
 
-	registered2 = true;
-	rc = 0;
+	list_add_tail(&dev->list_all, &list_all_device_instances);
+	put_device(&dev->device);
+	return 0;
 
+away_register:
+	device_unregister(&dev->device);
 away:
-	if (rc < 0) {
-		if (registered2)
-			unregister_devmajorminor_attributes(dev);
-		if (gotten)
-			put_device(&dev->device);
-		kfree(dev);
-	} else {
-		list_add_tail(&dev->list_all, &list_all_device_instances);
-	}
+	put_device(&dev->device);
 	return rc;
 }
 
@@ -1057,21 +1024,6 @@ remove_visor_device(struct visor_device *dev)
 	device_unregister(&dev->device);
 }
 
-static struct visor_device *
-find_visor_device_by_channel(struct visorchannel *channel)
-{
-	struct list_head *listentry, *listtmp;
-
-	list_for_each_safe(listentry, listtmp, &list_all_device_instances) {
-		struct visor_device *dev = list_entry(listentry,
-						      struct visor_device,
-						      list_all);
-		if (dev->visorchannel == channel)
-			return dev;
-	}
-	return NULL;
-}
-
 static int
 get_vbus_header_info(struct visorchannel *chan,
 		     struct spar_vbus_headerinfo *hdr_info)
@@ -1344,25 +1296,16 @@ chipset_bus_destroy(struct visor_device *dev)
 }
 
 static void
-chipset_device_create(struct visorchipset_device_info *dev_info)
+chipset_device_create(struct visor_device *dev_info)
 {
-	struct visor_device *bdev;
 	int rc = -1;
-	u32 bus_no = dev_info->bus_no;
-	u32 dev_no = dev_info->dev_no;
+	u32 bus_no = dev_info->chipset_bus_no;
+	u32 dev_no = dev_info->chipset_dev_no;
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
-	bdev = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
-	if (!bdev)
-		goto away;
-
-	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
-			 POSTCODE_SEVERITY_INFO);
-
-	rc = create_visor_device(bdev, dev_info);
-away:
+	rc = create_visor_device(dev_info);
 	if (rc < 0) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
@@ -1375,22 +1318,12 @@ away:
 }
 
 static void
-chipset_device_destroy(struct visorchipset_device_info *dev_info)
+chipset_device_destroy(struct visor_device *dev_info)
 {
-	struct visor_device *dev;
-	int rc = -1;
-
-	dev = find_visor_device_by_channel(dev_info->visorchannel);
-	if (!dev)
-		goto away;
-	rc = 0;
-away:
-	if (rc < 0)
-			return;
+	remove_visor_device(dev_info);
 
 	if (chipset_responders.device_destroy)
-		(*chipset_responders.device_destroy) (dev_info, rc);
-	remove_visor_device(dev);
+		(*chipset_responders.device_destroy) (dev_info, 0);
 }
 
 /* This is the callback function specified for a function driver, to
@@ -1398,11 +1331,8 @@ away:
  * completed.
  */
 static void
-pause_state_change_complete(struct visor_device *dev, int status,
-			    void *info)
+pause_state_change_complete(struct visor_device *dev, int status)
 {
-	struct visorchipset_device_info *dev_info = info;
-
 	if (!dev->pausing)
 			return;
 
@@ -1413,7 +1343,7 @@ pause_state_change_complete(struct visor_device *dev, int status,
 	/* Notify the chipset driver that the pause is complete, which
 	* will presumably want to send some sort of response to the
 	* initiator. */
-	(*chipset_responders.device_pause) (dev_info, status);
+	(*chipset_responders.device_pause) (dev, status);
 }
 
 /* This is the callback function specified for a function driver, to
@@ -1421,11 +1351,8 @@ pause_state_change_complete(struct visor_device *dev, int status,
  * completed.
  */
 static void
-resume_state_change_complete(struct visor_device *dev, int status,
-			     void *info)
+resume_state_change_complete(struct visor_device *dev, int status)
 {
-	struct visorchipset_device_info *dev_info = info;
-
 	if (!dev->resuming)
 			return;
 
@@ -1436,7 +1363,7 @@ resume_state_change_complete(struct visor_device *dev, int status,
 	/* Notify the chipset driver that the resume is complete,
 	 * which will presumably want to send some sort of response to
 	 * the initiator. */
-	(*chipset_responders.device_resume) (dev_info, status);
+	(*chipset_responders.device_resume) (dev, status);
 }
 
 /* Tell the subordinate function driver for a specific device to pause
@@ -1444,14 +1371,11 @@ resume_state_change_complete(struct visor_device *dev, int status,
  * callback function.
  */
 static void
-initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
-				     bool is_pause)
+initiate_chipset_device_pause_resume(struct visor_device *dev, bool is_pause)
 {
-	struct visor_device *dev = NULL;
 	int rc = -1, x;
 	struct visor_driver *drv = NULL;
-	void (*notify_func)(struct visorchipset_device_info *dev_info,
-			    int response) = NULL;
+	void (*notify_func)(struct visor_device *dev, int response) = NULL;
 
 	if (is_pause)
 		notify_func = chipset_responders.device_pause;
@@ -1460,10 +1384,6 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 	if (!notify_func)
 			goto away;
 
-	dev = find_visor_device_by_channel(dev_info->visorchannel);
-	if (!dev)
-			goto away;
-
 	drv = to_visor_driver(dev->device.driver);
 	if (!drv)
 			goto away;
@@ -1483,8 +1403,7 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 				goto away;
 
 		dev->pausing = true;
-		x = drv->pause(dev, pause_state_change_complete,
-			       (void *)dev_info);
+		x = drv->pause(dev, pause_state_change_complete);
 	} else {
 		/* This should be done at BUS resume time, but an
 		 * existing problem prevents us from ever getting a bus
@@ -1496,8 +1415,7 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 				goto away;
 
 		dev->resuming = true;
-		x = drv->resume(dev, resume_state_change_complete,
-				(void *)dev_info);
+		x = drv->resume(dev, resume_state_change_complete);
 	}
 	if (x < 0) {
 		if (is_pause)
@@ -1510,18 +1428,18 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 away:
 	if (rc < 0) {
 		if (notify_func)
-				(*notify_func)(dev_info, rc);
+				(*notify_func)(dev, rc);
 	}
 }
 
 static void
-chipset_device_pause(struct visorchipset_device_info *dev_info)
+chipset_device_pause(struct visor_device *dev_info)
 {
 	initiate_chipset_device_pause_resume(dev_info, true);
 }
 
 static void
-chipset_device_resume(struct visorchipset_device_info *dev_info)
+chipset_device_resume(struct visor_device *dev_info)
 {
 	initiate_chipset_device_pause_resume(dev_info, false);
 }
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index 6fd55af..2f12483 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -20,35 +20,10 @@
 
 #include <linux/uuid.h>
 
-#include "channel.h"
 #include "controlvmchannel.h"
 #include "vbusdeviceinfo.h"
 #include "vbushelper.h"
 
-struct visorchannel;
-
-/** Attributes for a particular Supervisor device.
- *  Any visorchipset client can query these attributes using
- *  visorchipset_get_client_device_info() or
- *  visorchipset_get_server_device_info().
- */
-struct visorchipset_device_info {
-	struct list_head entry;
-	u32 bus_no;
-	u32 dev_no;
-	uuid_le dev_inst_uuid;
-	struct visorchipset_state state;
-	struct visorchannel *visorchannel;
-	uuid_le channel_type_guid;
-	u32 reserved1;		/* control_vm_id */
-	u64 reserved2;
-	u32 switch_no;		/* when devState.attached==1 */
-	u32 internal_port_no;	/* when devState.attached==1 */
-	struct controlvm_message_header *pending_msg_hdr;/* CONTROLVM_MESSAGE */
-	/** For private use by the bus driver */
-	void *bus_driver_context;
-};
-
 /*  These functions will be called from within visorchipset when certain
  *  events happen.  (The implementation of these functions is outside of
  *  visorchipset.)
@@ -56,10 +31,10 @@ struct visorchipset_device_info {
 struct visorchipset_busdev_notifiers {
 	void (*bus_create)(struct visor_device *bus_info);
 	void (*bus_destroy)(struct visor_device *bus_info);
-	void (*device_create)(struct visorchipset_device_info *bus_info);
-	void (*device_destroy)(struct visorchipset_device_info *bus_info);
-	void (*device_pause)(struct visorchipset_device_info *bus_info);
-	void (*device_resume)(struct visorchipset_device_info *bus_info);
+	void (*device_create)(struct visor_device *bus_info);
+	void (*device_destroy)(struct visor_device *bus_info);
+	void (*device_pause)(struct visor_device *bus_info);
+	void (*device_resume)(struct visor_device *bus_info);
 };
 
 /*  These functions live inside visorchipset, and will be called to indicate
@@ -71,11 +46,10 @@ struct visorchipset_busdev_notifiers {
 struct visorchipset_busdev_responders {
 	void (*bus_create)(struct visor_device *p, int response);
 	void (*bus_destroy)(struct visor_device *p, int response);
-	void (*device_create)(struct visorchipset_device_info *p, int response);
-	void (*device_destroy)(struct visorchipset_device_info *p,
-			       int response);
-	void (*device_pause)(struct visorchipset_device_info *p, int response);
-	void (*device_resume)(struct visorchipset_device_info *p, int response);
+	void (*device_create)(struct visor_device *p, int response);
+	void (*device_destroy)(struct visor_device *p, int response);
+	void (*device_pause)(struct visor_device *p, int response);
+	void (*device_resume)(struct visor_device *p, int response);
 };
 
 /** Register functions (in the bus driver) to get called by visorchipset
@@ -89,13 +63,6 @@ visorchipset_register_busdev(
 			struct visorchipset_busdev_responders *responders,
 			struct ultra_vbus_deviceinfo *driver_info);
 
-bool visorchipset_get_bus_info(u32 bus_no,
-			       struct visor_device *bus_info);
-bool visorchipset_get_device_info(u32 bus_no, u32 dev_no,
-				  struct visorchipset_device_info *dev_info);
-bool visorchipset_set_bus_context(struct visor_device *bus_info,
-				  void *context);
-
 /* visorbus init and exit functions */
 int visorbus_init(void);
 void visorbus_exit(void);
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 9d41fa9..dc40466 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -230,16 +230,12 @@ static struct visorchipset_busdev_notifiers busdev_notifiers;
 
 static void bus_create_response(struct visor_device *p, int response);
 static void bus_destroy_response(struct visor_device *p, int response);
-static void device_create_response(struct visorchipset_device_info *p,
-				   int response);
-static void device_destroy_response(struct visorchipset_device_info *p,
-				    int response);
-static void device_resume_response(struct visorchipset_device_info *p,
-				   int response);
+static void device_create_response(struct visor_device *p, int response);
+static void device_destroy_response(struct visor_device *p, int response);
+static void device_resume_response(struct visor_device *p, int response);
 
-static void
-visorchipset_device_pause_response(struct visorchipset_device_info *p,
-				   int response);
+static void visorchipset_device_pause_response(struct visor_device *p,
+					       int response);
 
 static struct visorchipset_busdev_responders busdev_responders = {
 	.bus_create = bus_create_response,
@@ -696,15 +692,6 @@ static ssize_t remaining_steps_store(struct device *dev,
 	return count;
 }
 
-static void
-dev_info_clear(void *v)
-{
-	struct visorchipset_device_info *p =
-		(struct visorchipset_device_info *) v;
-
-	memset(p, 0, sizeof(struct visorchipset_device_info));
-}
-
 struct visor_busdev {
 	u32 bus_no;
 	u32 dev_no;
@@ -744,31 +731,6 @@ struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no,
 }
 EXPORT_SYMBOL(visorbus_get_device_by_id);
 
-static struct visorchipset_device_info *
-device_find(struct list_head *list, u32 bus_no, u32 dev_no)
-{
-	struct visorchipset_device_info *p;
-
-	list_for_each_entry(p, list, entry) {
-		if (p->bus_no == bus_no && p->dev_no == dev_no)
-			return p;
-	}
-
-	return NULL;
-}
-
-static void busdevices_del(struct list_head *list, u32 bus_no)
-{
-	struct visorchipset_device_info *p, *tmp;
-
-	list_for_each_entry_safe(p, tmp, list, entry) {
-		if (p->bus_no == bus_no) {
-			list_del(&p->entry);
-			kfree(p);
-		}
-	}
-}
-
 static u8
 check_chipset_events(void)
 {
@@ -815,18 +777,6 @@ visorchipset_register_busdev(
 EXPORT_SYMBOL_GPL(visorchipset_register_busdev);
 
 static void
-cleanup_controlvm_structures(void)
-{
-	struct visorchipset_device_info *di, *tmp_di;
-
-	list_for_each_entry_safe(di, tmp_di, &dev_info_list, entry) {
-		dev_info_clear(di);
-		list_del(&di->entry);
-		kfree(di);
-	}
-}
-
-static void
 chipset_init(struct controlvm_message *inmsg)
 {
 	static int chipset_inited;
@@ -852,8 +802,6 @@ chipset_init(struct controlvm_message *inmsg)
 	features |= ULTRA_CHIPSET_FEATURE_REPLY;
 
 cleanup:
-	if (rc < 0)
-		cleanup_controlvm_structures();
 	if (inmsg->hdr.flags.response_expected)
 		controlvm_respond_chipset_init(&inmsg->hdr, rc, features);
 }
@@ -947,12 +895,12 @@ bus_responder(enum controlvm_id cmd_id,
 
 static void
 device_changestate_responder(enum controlvm_id cmd_id,
-			     struct visorchipset_device_info *p, int response,
+			     struct visor_device *p, int response,
 			     struct spar_segment_state response_state)
 {
 	struct controlvm_message outmsg;
-	u32 bus_no = p->bus_no;
-	u32 dev_no = p->dev_no;
+	u32 bus_no = p->chipset_bus_no;
+	u32 dev_no = p->chipset_dev_no;
 
 	if (p->pending_msg_hdr == NULL)
 		return;		/* no controlvm response needed */
@@ -1053,15 +1001,15 @@ away:
 }
 
 static void
-device_epilog(struct visorchipset_device_info *dev_info,
+device_epilog(struct visor_device *dev_info,
 	      struct spar_segment_state state, u32 cmd,
 	      struct controlvm_message_header *msg_hdr, int response,
 	      bool need_response, bool for_visorbus)
 {
 	struct visorchipset_busdev_notifiers *notifiers;
 	bool notified = false;
-	u32 bus_no = dev_info->bus_no;
-	u32 dev_no = dev_info->dev_no;
+	u32 bus_no = dev_info->chipset_bus_no;
+	u32 dev_no = dev_info->chipset_dev_no;
 	struct controlvm_message_header *pmsg_hdr = NULL;
 
 	char *envp[] = {
@@ -1285,31 +1233,34 @@ my_device_create(struct controlvm_message *inmsg)
 	struct controlvm_message_packet *cmd = &inmsg->cmd;
 	u32 bus_no = cmd->create_device.bus_no;
 	u32 dev_no = cmd->create_device.dev_no;
-	struct visorchipset_device_info *dev_info;
+	struct visor_device *dev_info = NULL;
 	struct visor_device *bus_info;
 	struct visorchannel *visorchannel;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
-	dev_info = device_find(&dev_info_list, bus_no, dev_no);
-	if (dev_info && (dev_info->state.created == 1)) {
+	bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
+	if (!bus_info) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
-		rc = -CONTROLVM_RESP_ERROR_ALREADY_DONE;
+		rc = -CONTROLVM_RESP_ERROR_BUS_INVALID;
 		goto cleanup;
 	}
-	bus_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
-	if (!bus_info) {
+
+	if (bus_info->state.created == 0) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
 		rc = -CONTROLVM_RESP_ERROR_BUS_INVALID;
 		goto cleanup;
 	}
-	if (bus_info->state.created == 0) {
+
+	dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
+	if (dev_info && (dev_info->state.created == 1)) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
-		rc = -CONTROLVM_RESP_ERROR_BUS_INVALID;
+		rc = -CONTROLVM_RESP_ERROR_ALREADY_DONE;
 		goto cleanup;
 	}
+
 	dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL);
 	if (!dev_info) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
@@ -1318,10 +1269,13 @@ my_device_create(struct controlvm_message *inmsg)
 		goto cleanup;
 	}
 
-	INIT_LIST_HEAD(&dev_info->entry);
-	dev_info->bus_no = bus_no;
-	dev_info->dev_no = dev_no;
-	dev_info->dev_inst_uuid = cmd->create_device.dev_inst_uuid;
+	dev_info->chipset_bus_no = bus_no;
+	dev_info->chipset_dev_no = dev_no;
+	dev_info->inst = cmd->create_device.dev_inst_uuid;
+
+	/* not sure where the best place to set the 'parent' */
+	dev_info->device.parent = &bus_info->device;
+
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
@@ -1339,7 +1293,6 @@ my_device_create(struct controlvm_message *inmsg)
 	}
 	dev_info->visorchannel = visorchannel;
 	dev_info->channel_type_guid = cmd->create_device.data_type_uuid;
-	list_add(&dev_info->entry, &dev_info_list);
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 cleanup:
@@ -1361,10 +1314,10 @@ my_device_changestate(struct controlvm_message *inmsg)
 	u32 bus_no = cmd->device_change_state.bus_no;
 	u32 dev_no = cmd->device_change_state.dev_no;
 	struct spar_segment_state state = cmd->device_change_state.state;
-	struct visorchipset_device_info *dev_info;
+	struct visor_device *dev_info;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
-	dev_info = device_find(&dev_info_list, bus_no, dev_no);
+	dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
 	if (!dev_info) {
 		POSTCODE_LINUX_4(DEVICE_CHANGESTATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
@@ -1386,10 +1339,10 @@ my_device_destroy(struct controlvm_message *inmsg)
 	struct controlvm_message_packet *cmd = &inmsg->cmd;
 	u32 bus_no = cmd->destroy_device.bus_no;
 	u32 dev_no = cmd->destroy_device.dev_no;
-	struct visorchipset_device_info *dev_info;
+	struct visor_device *dev_info;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
-	dev_info = device_find(&dev_info_list, bus_no, dev_no);
+	dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
 	if (!dev_info)
 		rc = -CONTROLVM_RESP_ERROR_DEVICE_INVALID;
 	else if (dev_info->state.created == 0)
@@ -2103,11 +2056,6 @@ bus_create_response(struct visor_device *bus_info, int response)
 {
 	if (response >= 0) {
 		bus_info->state.created = 1;
-	} else {
-		if (response != -CONTROLVM_RESP_ERROR_ALREADY_DONE)
-			/* undo the row we just created... */
-			busdevices_del(&dev_info_list,
-				       bus_info->chipset_bus_no);
 	}
 
 	bus_responder(CONTROLVM_BUS_CREATE, bus_info->pending_msg_hdr,
@@ -2125,12 +2073,10 @@ bus_destroy_response(struct visor_device *bus_info, int response)
 
 	kfree(bus_info->pending_msg_hdr);
 	bus_info->pending_msg_hdr = NULL;
-
-	busdevices_del(&dev_info_list, bus_info->chipset_bus_no);
 }
 
 static void
-device_create_response(struct visorchipset_device_info *dev_info, int response)
+device_create_response(struct visor_device *dev_info, int response)
 {
 	if (response >= 0)
 		dev_info->state.created = 1;
@@ -2139,23 +2085,20 @@ device_create_response(struct visorchipset_device_info *dev_info, int response)
 			 response);
 
 	kfree(dev_info->pending_msg_hdr);
-	dev_info->pending_msg_hdr = NULL;
 }
 
 static void
-device_destroy_response(struct visorchipset_device_info *dev_info, int response)
+device_destroy_response(struct visor_device *dev_info, int response)
 {
 	device_responder(CONTROLVM_DEVICE_DESTROY, dev_info->pending_msg_hdr,
 			 response);
 
 	kfree(dev_info->pending_msg_hdr);
 	dev_info->pending_msg_hdr = NULL;
-
-	dev_info_clear(dev_info);
 }
 
 static void
-visorchipset_device_pause_response(struct visorchipset_device_info *dev_info,
+visorchipset_device_pause_response(struct visor_device *dev_info,
 				   int response)
 {
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
@@ -2167,7 +2110,7 @@ visorchipset_device_pause_response(struct visorchipset_device_info *dev_info,
 }
 
 static void
-device_resume_response(struct visorchipset_device_info *dev_info, int response)
+device_resume_response(struct visor_device *dev_info, int response)
 {
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
 				     dev_info, response,
@@ -2177,30 +2120,6 @@ device_resume_response(struct visorchipset_device_info *dev_info, int response)
 	dev_info->pending_msg_hdr = NULL;
 }
 
-bool
-visorchipset_get_device_info(u32 bus_no, u32 dev_no,
-			     struct visorchipset_device_info *dev_info)
-{
-	void *p = device_find(&dev_info_list, bus_no, dev_no);
-
-	if (!p)
-		return false;
-	memcpy(dev_info, p, sizeof(struct visorchipset_device_info));
-	return true;
-}
-EXPORT_SYMBOL_GPL(visorchipset_get_device_info);
-
-bool
-visorchipset_set_device_context(struct visorchipset_device_info *p,
-				void *context)
-{
-	if (!p)
-		return false;
-	p->bus_driver_context = context;
-	return true;
-}
-EXPORT_SYMBOL_GPL(visorchipset_set_device_context);
-
 static ssize_t chipsetready_store(struct device *dev,
 				  struct device_attribute *attr,
 				  const char *buf, size_t count)
@@ -2474,8 +2393,6 @@ visorchipset_exit(struct acpi_device *acpi_device)
 	periodic_controlvm_workqueue = NULL;
 	destroy_controlvm_payload_info(&controlvm_payload_info);
 
-	cleanup_controlvm_structures();
-
 	memset(&g_chipset_msg_hdr, 0, sizeof(struct controlvm_message_header));
 
 	visorchannel_destroy(controlvm_channel);
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 41/44] staging: unisys: Removed unused entries from struct visor_channeltype_descriptor
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (39 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 40/44] staging: unisys: Convert device " Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 42/44] staging: unisys: Update diag serverity enum Benjamin Romer
                   ` (2 subsequent siblings)
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: Jes Sorensen <Jes.Sorensen@redhat.com>

min_size/max_size aren't used anywhere, and they were just causing
headaches in the drivers being ported over to the new interfaces.

Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/visorbus.h | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index 581d962..e4a21e4 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -59,8 +59,6 @@ struct visorchipset_state {
 struct visor_channeltype_descriptor {
 	const uuid_le guid;
 	const char *name;
-	unsigned long min_size;
-	unsigned long max_size;
 };
 
 /** Information provided by each visor driver when it registers with the
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 42/44] staging: unisys: Update diag serverity enum
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (40 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 41/44] staging: unisys: Removed unused entries from struct visor_channeltype_descriptor Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 43/44] staging: unisys: Remove unneeded fields in diagchannel.h Benjamin Romer
  2015-05-13 17:22 ` [PATCH 44/44] staging: unisys: Clean up diag_serverity enum Benjamin Romer
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Give the enum the correct values instead of based on other values.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/diagchannel.h | 34 ++++++++--------------------
 1 file changed, 10 insertions(+), 24 deletions(-)

diff --git a/drivers/staging/unisys/include/diagchannel.h b/drivers/staging/unisys/include/diagchannel.h
index e8fb867..c1e74e8 100644
--- a/drivers/staging/unisys/include/diagchannel.h
+++ b/drivers/staging/unisys/include/diagchannel.h
@@ -58,20 +58,6 @@ static const uuid_le spar_diag_channel_protocol_uuid =
 * increment this. */
 #define ULTRA_DIAG_CHANNEL_PROTOCOL_VERSIONID 2
 
-#define SPAR_DIAG_CHANNEL_OK_CLIENT(ch)\
-	(spar_check_channel_client(ch,\
-				   spar_diag_channel_protocol_uuid,\
-				   "diag",\
-				   sizeof(struct spar_diag_channel_protocol),\
-				   ULTRA_DIAG_CHANNEL_PROTOCOL_VERSIONID,\
-				   ULTRA_DIAG_CHANNEL_PROTOCOL_SIGNATURE))
-
-#define SPAR_DIAG_CHANNEL_OK_SERVER(bytes)\
-	(spar_check_channel_server(spar_diag_channel_protocol_uuid,\
-				   "diag",\
-				   sizeof(struct spar_diag_channel_protocol),\
-				   bytes))
-
 #define MAX_MODULE_NAME_SIZE 128	/* Maximum length of module name... */
 #define MAX_ADDITIONAL_INFO_SIZE 256	/* Maximum length of any additional info
 					 * accompanying event... */
@@ -204,16 +190,16 @@ struct diag_channel_event {
 * change is made to this enum, they should also be reflected in that file.  */
 enum diag_severity {
 		DIAG_SEVERITY_ENUM_BEGIN = 0,
-		DIAG_SEVERITY_OVERRIDE = DIAG_SEVERITY_ENUM_BEGIN,
-		DIAG_SEVERITY_VERBOSE = DIAG_SEVERITY_OVERRIDE,	/* 0 */
-		DIAG_SEVERITY_INFO = DIAG_SEVERITY_VERBOSE + 1,	/* 1 */
-		DIAG_SEVERITY_WARNING = DIAG_SEVERITY_INFO + 1,	/* 2 */
-		DIAG_SEVERITY_ERR = DIAG_SEVERITY_WARNING + 1,	/* 3 */
-		DIAG_SEVERITY_PRINT = DIAG_SEVERITY_ERR + 1,	/* 4 */
-		DIAG_SEVERITY_SHUTOFF = DIAG_SEVERITY_PRINT + 1, /* 5 */
-		DIAG_SEVERITY_ENUM_END = DIAG_SEVERITY_SHUTOFF,	/* 5 */
-		DIAG_SEVERITY_NONFATAL_ERR = DIAG_SEVERITY_ERR,
-		DIAG_SEVERITY_FATAL_ERR = DIAG_SEVERITY_PRINT
+		DIAG_SEVERITY_OVERRIDE = 0,
+		DIAG_SEVERITY_VERBOSE = 0,
+		DIAG_SEVERITY_INFO = 1,
+		DIAG_SEVERITY_WARNING = 2,
+		DIAG_SEVERITY_ERR = 3,
+		DIAG_SEVERITY_NONFATAL_ERR = 3,
+		DIAG_SEVERITY_PRINT = 4,
+		DIAG_SEVERITY_FATAL_ERR = 4,
+		DIAG_SEVERITY_SHUTOFF = 5,
+		DIAG_SEVERITY_ENUM_END = 5
 };
 
 /* Event Cause enums
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 43/44] staging: unisys: Remove unneeded fields in diagchannel.h
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (41 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 42/44] staging: unisys: Update diag serverity enum Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  2015-05-13 17:22 ` [PATCH 44/44] staging: unisys: Clean up diag_serverity enum Benjamin Romer
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Diagchannel.h is used primarily for the diagnostics channel. The
diagnostics channel is not being used by linux guests currently, so
the majority of the file is not needed. What is left is what is
needed to perform postcode vmcalls. Those postcodes will eventually
end up in the diag channel.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>

Conflicts:
	drivers/staging/unisys/visorbus/visorbus_main.c
	drivers/staging/unisys/visorbus/visorchipset.c
---
 drivers/staging/unisys/include/diagchannel.h   | 366 +------------------------
 drivers/staging/unisys/visorbus/visorchipset.c |  45 ---
 2 files changed, 2 insertions(+), 409 deletions(-)

diff --git a/drivers/staging/unisys/include/diagchannel.h b/drivers/staging/unisys/include/diagchannel.h
index c1e74e8..82932c5 100644
--- a/drivers/staging/unisys/include/diagchannel.h
+++ b/drivers/staging/unisys/include/diagchannel.h
@@ -13,169 +13,15 @@
  * details.
  */
 
-/*++
- *
- * Module Name:
- *
- * diagchannel.h
- *
- * Abstract:
- *
- * This file defines the DiagChannel protocol.  This protocol is used to aid in
- * preserving event data sent by external applications.  This protocol provides
- * a region for event data to reside in.  This data will eventually be sent to
- * the Boot Partition where it will be committed to memory and/or disk.  This
- * file contains platform-independent data that can be built using any
- * Supervisor build environment (Windows, Linux, EFI).
- *
-*/
-
 #ifndef _DIAG_CHANNEL_H_
 #define _DIAG_CHANNEL_H_
 
 #include <linux/uuid.h>
-#include "channel.h"
-
-/* {EEA7A573-DB82-447c-8716-EFBEAAAE4858} */
-#define SPAR_DIAG_CHANNEL_PROTOCOL_UUID \
-		UUID_LE(0xeea7a573, 0xdb82, 0x447c, \
-				0x87, 0x16, 0xef, 0xbe, 0xaa, 0xae, 0x48, 0x58)
-
-static const uuid_le spar_diag_channel_protocol_uuid =
-	SPAR_DIAG_CHANNEL_PROTOCOL_UUID;
-
-/* {E850F968-3263-4484-8CA5-2A35D087A5A8} */
-#define ULTRA_DIAG_ROOT_CHANNEL_PROTOCOL_GUID \
-		UUID_LE(0xe850f968, 0x3263, 0x4484, \
-				0x8c, 0xa5, 0x2a, 0x35, 0xd0, 0x87, 0xa5, 0xa8)
-
-#define ULTRA_DIAG_CHANNEL_PROTOCOL_SIGNATURE  ULTRA_CHANNEL_PROTOCOL_SIGNATURE
-
-/* Must increment this whenever you insert or delete fields within this channel
-* struct.  Also increment whenever you change the meaning of fields within this
-* channel struct so as to break pre-existing software.  Note that you can
-* usually add fields to the END of the channel struct withOUT needing to
-* increment this. */
-#define ULTRA_DIAG_CHANNEL_PROTOCOL_VERSIONID 2
 
 #define MAX_MODULE_NAME_SIZE 128	/* Maximum length of module name... */
 #define MAX_ADDITIONAL_INFO_SIZE 256	/* Maximum length of any additional info
-					 * accompanying event... */
-#define MAX_SUBSYSTEMS 64	/* Maximum number of subsystems allowed in
-				 * DiagChannel... */
-#define LOW_SUBSYSTEMS 32	/* Half of MAX_SUBSYSTEMS to allow 64-bit
-				 * math */
-#define SUBSYSTEM_DEBUG 0	/* Standard subsystem for debug events */
-#define SUBSYSTEM_DEFAULT 1	/* Default subsystem for legacy calls to
-				 * ReportEvent */
-
-/* few useful subsystem mask values */
-#define SUBSYSTEM_MASK_DEBUG	0x01	/* Standard subsystem for debug
-					 * events */
-#define SUBSYSTEM_MASK_DEFAULT  0x02	/* Default subsystem for legacy calls to
-					 * ReportEvents */
-
-/* Event parameter "Severity" is overloaded with Cause in byte 2 and Severity in
- * byte 0, bytes 1 and 3 are reserved */
-#define SEVERITY_MASK 0x0FF	/* mask out all but the Severity in byte 0 */
-#define CAUSE_MASK 0x0FF0000	/* mask out all but the cause in byte 2 */
-#define CAUSE_SHIFT_AMT 16	/* shift 2 bytes to place it in byte 2 */
-
-/* SubsystemSeverityFilter */
-#define SEVERITY_FILTER_MASK 0x0F /* mask out the Cause half, SeverityFilter is
-				   * in the lower nibble */
-#define CAUSE_FILTER_MASK 0xF0	/* mask out the Severity half, CauseFilter is in
-				 * the upper nibble */
-#define CAUSE_FILTER_SHIFT_AMT	4 /* shift amount to place it in lower or upper
-				   * nibble */
-
-/* Copied from EFI's EFI_TIME struct in efidef.h.  EFI headers are not allowed
-* in some of the Supervisor areas, such as Monitor, so it has been "ported" here
-* for use in diagnostic event timestamps... */
-struct diag_efi_time  {
-	u16 year;		/* 1998 - 20XX */
-	u8 month;		/* 1 - 12 */
-	u8 day;			/* 1 - 31 */
-	u8 hour;		/* 0 - 23 */
-	u8 minute;		/* 0 - 59 */
-	u8 second;		/* 0 - 59 */
-	u8 pad1;
-	u32 nanosecond;	/* 0 - 999, 999, 999 */
-	s16 timezone;		/* -1440 to 1440 or 2047 */
-	u8 daylight;
-	u8 pad2;
-};
-
-enum spar_component_types  {
-	 ULTRA_COMPONENT_GUEST = 0,
-	 ULTRA_COMPONENT_MONITOR = 0x01,
-	 ULTRA_COMPONENT_CCM = 0x02,	/* Common Control module */
-	 /* RESERVED 0x03 - 0x7 */
-
-	 /* Ultravisor Components */
-	 ULTRA_COMPONENT_BOOT = 0x08,
-	 ULTRA_COMPONENT_IDLE = 0x09,
-	 ULTRA_COMPONENT_CONTROL = 0x0A,
-	 ULTRA_COMPONENT_LOGGER = 0x0B,
-	 ULTRA_COMPONENT_ACPI = 0X0C,
-	 /* RESERVED 0x0D - 0x0F */
-
-	 /* sPAR Components */
-	 ULTRA_COMPONENT_COMMAND = 0x10,
-	 ULTRA_COMPONENT_IODRIVER = 0x11,
-	 ULTRA_COMPONENT_CONSOLE = 0x12,
-	 ULTRA_COMPONENT_OPERATIONS = 0x13,
-	 ULTRA_COMPONENT_MANAGEMENT = 0x14,
-	 ULTRA_COMPONENT_DIAG = 0x15,
-	 ULTRA_COMPONENT_HWDIAG = 0x16,
-	 ULTRA_COMPONENT_PSERVICES = 0x17,
-	 ULTRA_COMPONENT_PDIAG = 0x18
-	 /* RESERVED 0x18 - 0x1F */
-};
-
-/* Structure: diag_channel_event Purpose: Contains attributes that make up an
- * event to be written to the DIAG_CHANNEL memory.  Attributes: EventId: Id of
- * the diagnostic event to write to memory.  Severity: Severity of the event
- * (Error, Info, etc).  ModuleName: Module/file name where event originated.
- * LineNumber: Line number in module name where event originated.  Timestamp:
- * Date/time when event was received by ReportEvent, and written to DiagChannel.
- * Reserved: Padding to align structure on a 64-byte cache line boundary.
- * AdditionalInfo: Array of characters for additional event info (may be
- * empty).  */
-struct diag_channel_event {
-	u32 event_id;
-	u32 severity;
-	u8 module_name[MAX_MODULE_NAME_SIZE];
-	u32 line_number;
-	struct diag_efi_time timestamp;	/* Size = 16 bytes */
-	u32 partition_number;	/* Filled in by Diag Switch as pool blocks are
-				 * filled */
-	u16 vcpu_number;
-	u16 lcpu_number;
-	u8 component_type;	/* ULTRA_COMPONENT_TYPES */
-	u8 subsystem;
-	u16 reserved0;		/* pad to u64 alignment */
-	u32 block_no;		/* filled in by DiagSwitch as pool blocks are
-				 * filled */
-	u32 block_no_high;
-	u32 event_no;		/* filled in by DiagSwitch as pool blocks are
-				 * filled */
-	u32 event_no_high;
-
-	/* The block_no and event_no fields are set only by DiagSwitch
-	 * and referenced only by WinDiagDisplay formatting tool as
-	 * additional diagnostic information.  Other tools including
-	 * WinDiagDisplay currently ignore these 'Reserved' bytes. */
-	u8 reserved[8];
-	u8 additional_info[MAX_ADDITIONAL_INFO_SIZE];
-
-	/* NOTE: Changes to diag_channel_event generally need to be reflected in
-	 * existing copies *
-	 * - for AppOS at
-	 * GuestLinux/visordiag_early/supervisor_diagchannel.h *
-	 * - for WinDiagDisplay at
-	 * EFI/Ultra/Tools/WinDiagDisplay/WinDiagDisplay/diagstruct.h */
-};
+					 * accompanying event...
+					 */
 
 /* Levels of severity for diagnostic events, in order from lowest severity to
 * highest (i.e. fatal errors are the most severe, and should always be logged,
@@ -202,212 +48,4 @@ enum diag_severity {
 		DIAG_SEVERITY_ENUM_END = 5
 };
 
-/* Event Cause enums
-*
-* Levels of cause for diagnostic events, in order from least to greatest cause
-* Internal errors are most urgent since ideally they should never exist
-* Invalid requests are preventable by avoiding invalid inputs
-* Operations errors depend on environmental factors which may impact which
-* requests are possible
-* Manifest provides intermediate value to capture firmware and configuration
-* version information
-* Trace provides suplimental debug information in release firmware
-* Unknown Log captures unclasified LogEvent calls.
-* Debug is the least urgent since it provides suplimental debug information only
-* in debug firmware
-* Unknown Debug captures unclassified DebugEvent calls.
-* This enum is also defined in
-* DotNet\sParFramework\ControlFramework\ControlFramework.cs.
-* If a change is made to this enum, they should also be reflected in that
-* file.  */
-
-/* A cause value "DIAG_CAUSE_FILE_XFER" together with a severity value of
-* "DIAG_SEVERITY_PRINT" (=4), is used for transferring text or binary file to
-* the Diag partition. This cause-severity combination will be used by Logger
-* DiagSwitch to segregate events into block types. The files are transferred in
-* 256 byte chunks maximum, in the AdditionalInfo field of the diag_channel_event
-* structure. In the file transfer mode, some event fields will have different
-* meaning: EventId specifies the file offset, severity specifies the block type,
-* ModuleName specifies the filename, LineNumber specifies the number of valid
-* data bytes in an event and AdditionalInfo contains up to 256 bytes of data. */
-
-/* The Diag DiagWriter appends event blocks to events.raw as today, and for data
- * blocks uses diag_channel_event
- * PartitionNumber to extract and append 'AdditionalInfo' to filename (specified
- * by ModuleName). */
-
-/* The Dell PDiag uses this new mechanism to stash DSET .zip onto the
- * 'diagnostic' virtual disk.  */
-enum diag_cause {
-	DIAG_CAUSE_UNKNOWN = 0,
-	DIAG_CAUSE_UNKNOWN_DEBUG = DIAG_CAUSE_UNKNOWN + 1,	/* 1 */
-	DIAG_CAUSE_DEBUG = DIAG_CAUSE_UNKNOWN_DEBUG + 1,	/* 2 */
-	DIAG_CAUSE_UNKNOWN_LOG = DIAG_CAUSE_DEBUG + 1,	/* 3 */
-	DIAG_CAUSE_TRACE = DIAG_CAUSE_UNKNOWN_LOG + 1,	/* 4 */
-	DIAG_CAUSE_MANIFEST = DIAG_CAUSE_TRACE + 1,	/* 5 */
-	DIAG_CAUSE_OPERATIONS_ERROR = DIAG_CAUSE_MANIFEST + 1,	/* 6 */
-	DIAG_CAUSE_INVALID_REQUEST = DIAG_CAUSE_OPERATIONS_ERROR + 1,	/* 7 */
-	DIAG_CAUSE_INTERNAL_ERROR = DIAG_CAUSE_INVALID_REQUEST + 1, /* 8 */
-	DIAG_CAUSE_FILE_XFER = DIAG_CAUSE_INTERNAL_ERROR + 1,	/* 9 */
-	DIAG_CAUSE_ENUM_END = DIAG_CAUSE_FILE_XFER	/* 9 */
-};
-
-/* Event Cause category defined into the byte 2 of Severity */
-#define CAUSE_DEBUG (DIAG_CAUSE_DEBUG << CAUSE_SHIFT_AMT)
-#define CAUSE_TRACE (DIAG_CAUSE_TRACE << CAUSE_SHIFT_AMT)
-#define CAUSE_MANIFEST (DIAG_CAUSE_MANIFEST << CAUSE_SHIFT_AMT)
-#define CAUSE_OPERATIONS_ERROR (DIAG_CAUSE_OPERATIONS_ERROR << CAUSE_SHIFT_AMT)
-#define CAUSE_INVALID_REQUEST (DIAG_CAUSE_INVALID_REQUEST << CAUSE_SHIFT_AMT)
-#define CAUSE_INTERNAL_ERROR (DIAG_CAUSE_INTERNAL_ERROR << CAUSE_SHIFT_AMT)
-#define CAUSE_FILE_XFER (DIAG_CAUSE_FILE_XFER << CAUSE_SHIFT_AMT)
-#define CAUSE_ENUM_END CAUSE_FILE_XFER
-
-/* Combine Cause and Severity categories into one */
-#define CAUSE_DEBUG_SEVERITY_VERBOSE \
-	(CAUSE_DEBUG | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_TRACE_SEVERITY_VERBOSE \
-	(CAUSE_TRACE | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_MANIFEST_SEVERITY_VERBOSE\
-	(CAUSE_MANIFEST | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_OPERATIONS_SEVERITY_VERBOSE \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_INVALID_SEVERITY_VERBOSE \
-	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_VERBOSE)
-#define CAUSE_INTERNAL_SEVERITY_VERBOSE \
-	(CAUSE_INTERNAL_ERROR   | DIAG_SEVERITY_VERBOSE)
-
-#define CAUSE_DEBUG_SEVERITY_INFO \
-	(CAUSE_DEBUG | DIAG_SEVERITY_INFO)
-#define CAUSE_TRACE_SEVERITY_INFO \
-	(CAUSE_TRACE | DIAG_SEVERITY_INFO)
-#define CAUSE_MANIFEST_SEVERITY_INFO \
-	(CAUSE_MANIFEST | DIAG_SEVERITY_INFO)
-#define CAUSE_OPERATIONS_SEVERITY_INFO \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_INFO)
-#define CAUSE_INVALID_SEVERITY_INFO \
-	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_INFO)
-#define CAUSE_INTERNAL_SEVERITY_INFO \
-	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_INFO)
-
-#define CAUSE_DEBUG_SEVERITY_WARN \
-	(CAUSE_DEBUG | DIAG_SEVERITY_WARNING)
-#define CAUSE_TRACE_SEVERITY_WARN \
-	(CAUSE_TRACE | DIAG_SEVERITY_WARNING)
-#define CAUSE_MANIFEST_SEVERITY_WARN \
-	(CAUSE_MANIFEST | DIAG_SEVERITY_WARNING)
-#define CAUSE_OPERATIONS_SEVERITY_WARN \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_WARNING)
-#define CAUSE_INVALID_SEVERITY_WARN \
-	(CAUSE_INVALID_REQUEST | DIAG_SEVERITY_WARNING)
-#define CAUSE_INTERNAL_SEVERITY_WARN \
-	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_WARNING)
-
-#define CAUSE_DEBUG_SEVERITY_ERR \
-	(CAUSE_DEBUG | DIAG_SEVERITY_ERR)
-#define CAUSE_TRACE_SEVERITY_ERR \
-	(CAUSE_TRACE | DIAG_SEVERITY_ERR)
-#define CAUSE_MANIFEST_SEVERITY_ERR \
-	(CAUSE_MANIFEST | DIAG_SEVERITY_ERR)
-#define CAUSE_OPERATIONS_SEVERITY_ERR \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_ERR)
-#define CAUSE_INVALID_SEVERITY_ERR \
-	(CAUSE_INVALID_REQUEST  | DIAG_SEVERITY_ERR)
-#define CAUSE_INTERNAL_SEVERITY_ERR \
-	(CAUSE_INTERNAL_ERROR   | DIAG_SEVERITY_ERR)
-
-#define CAUSE_DEBUG_SEVERITY_PRINT \
-	(CAUSE_DEBUG | DIAG_SEVERITY_PRINT)
-#define CAUSE_TRACE_SEVERITY_PRINT \
-	(CAUSE_TRACE | DIAG_SEVERITY_PRINT)
-#define CAUSE_MANIFEST_SEVERITY_PRINT \
-	(CAUSE_MANIFEST | DIAG_SEVERITY_PRINT)
-#define CAUSE_OPERATIONS_SEVERITY_PRINT \
-	(CAUSE_OPERATIONS_ERROR | DIAG_SEVERITY_PRINT)
-#define CAUSE_INVALID_SEVERITY_PRINT \
-	(CAUSE_INVALID_REQUEST | DIAG_SEVERITY_PRINT)
-#define CAUSE_INTERNAL_SEVERITY_PRINT \
-	(CAUSE_INTERNAL_ERROR | DIAG_SEVERITY_PRINT)
-#define CAUSE_FILE_XFER_SEVERITY_PRINT \
-	(CAUSE_FILE_XFER | DIAG_SEVERITY_PRINT)
-
-/* Structure: diag_channel_protocol_header
- *
- * Purpose: Contains attributes that make up the header specific to the
- * DIAG_CHANNEL area.
- *
- * Attributes:
- *
- * DiagLock: Diag Channel spinlock.
- *
- *IsChannelInitialized: 1 iff SignalInit was called for this channel; otherwise
- *			0, and assume the channel is not ready for use yet.
- *
- * Reserved: Padding to align the fields in this structure.
- *
- *SubsystemSeverityFilter: Level of severity on a subsystem basis that controls
- *			whether events are logged.  Any event's severity for a
- *			particular subsystem below this level will be discarded.
- */
-struct diag_channel_protocol_header {
-	u32 diag_lock;
-	u8 channel_initialized;
-	u8 reserved[3];
-	u8 subsystem_severity_filter[64];
-};
-
-/* The Diagram for the Diagnostic Channel: */
-/* ----------------------- */
-/* | Channel Header        |	Defined by ULTRA_CHANNEL_PROTOCOL */
-/* ----------------------- */
-/* | Signal Queue Header   |	Defined by SIGNAL_QUEUE_HEADER */
-/* ----------------------- */
-/* | DiagChannel Header    |	Defined by diag_channel_protocol_header */
-/* ----------------------- */
-/* | Channel Event Info    |	Defined by diag_channel_event*MAX_EVENTS */
-/* ----------------------- */
-/* | Reserved              |	Reserved (pad out to 4MB) */
-/* ----------------------- */
-
-/* Offsets/sizes for diagnostic channel attributes... */
-#define DIAG_CH_QUEUE_HEADER_OFFSET (sizeof(struct channel_header))
-#define DIAG_CH_QUEUE_HEADER_SIZE (sizeof(struct signal_queue_header))
-#define DIAG_CH_PROTOCOL_HEADER_OFFSET \
-	(DIAG_CH_QUEUE_HEADER_OFFSET + DIAG_CH_QUEUE_HEADER_SIZE)
-#define DIAG_CH_PROTOCOL_HEADER_SIZE \
-	(sizeof(struct diag_channel_protocol_header))
-#define DIAG_CH_EVENT_OFFSET \
-	(DIAG_CH_PROTOCOL_HEADER_OFFSET + DIAG_CH_PROTOCOL_HEADER_SIZE)
-#define DIAG_CH_SIZE (4096 * 1024)
-
-/* For Control and Idle Partitions with larger (8 MB) diagnostic(root)
- * channels */
-#define DIAG_CH_LRG_SIZE (2 * DIAG_CH_SIZE)	/* 8 MB */
-
-/*
- * Structure: spar_diag_channel_protocol
- *
- * Purpose: Contains attributes that make up the DIAG_CHANNEL memory.
- *
- * Attributes:
- *
- * CommonChannelHeader:	Header info common to all channels.
- *
- * QueueHeader: Queue header common to all channels - used to determine where to
- * store event.
- *
- * DiagChannelHeader: Diagnostic channel header info (see
- * diag_channel_protocol_header comments).
- *
- * Events: Area where diagnostic events (up to MAX_EVENTS) are written.
- *
- *Reserved: Reserved area to allow for correct channel size padding.
-*/
-struct spar_diag_channel_protocol  {
-	struct channel_header common_channel_header;
-	struct signal_queue_header queue_header;
-	struct diag_channel_protocol_header diag_channel_header;
-	struct diag_channel_event events[(DIAG_CH_SIZE - DIAG_CH_EVENT_OFFSET) /
-				   sizeof(struct diag_channel_event)];
-};
-
 #endif
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index dc40466..016c8b0 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -110,17 +110,8 @@ static DEFINE_SEMAPHORE(notifier_lock);
 static struct cdev file_cdev;
 static struct visorchannel **file_controlvm_channel;
 static struct controlvm_message_header g_chipset_msg_hdr;
-static const uuid_le spar_diag_pool_channel_protocol_uuid =
-	SPAR_DIAG_POOL_CHANNEL_PROTOCOL_UUID;
-/* 0xffffff is an invalid Bus/Device number */
-static u32 g_diagpool_bus_no = 0xffffff;
-static u32 g_diagpool_dev_no = 0xffffff;
 static struct controlvm_message_packet g_devicechangestate_packet;
 
-#define is_diagpool_channel(channel_type_guid) \
-	(uuid_le_cmp(channel_type_guid,\
-		     spar_diag_pool_channel_protocol_uuid) == 0)
-
 static LIST_HEAD(bus_info_list);
 static LIST_HEAD(dev_info_list);
 
@@ -827,14 +818,6 @@ controlvm_respond(struct controlvm_message_header *msg_hdr, int response)
 	struct controlvm_message outmsg;
 
 	controlvm_init_response(&outmsg, msg_hdr, response);
-	/* For DiagPool channel DEVICE_CHANGESTATE, we need to send
-	* back the deviceChangeState structure in the packet. */
-	if (msg_hdr->id == CONTROLVM_DEVICE_CHANGESTATE &&
-	    g_devicechangestate_packet.device_change_state.bus_no ==
-	    g_diagpool_bus_no &&
-	    g_devicechangestate_packet.device_change_state.dev_no ==
-	    g_diagpool_dev_no)
-		outmsg.cmd = g_devicechangestate_packet;
 	if (outmsg.hdr.flags.test_message == 1)
 		return;
 
@@ -1008,15 +991,8 @@ device_epilog(struct visor_device *dev_info,
 {
 	struct visorchipset_busdev_notifiers *notifiers;
 	bool notified = false;
-	u32 bus_no = dev_info->chipset_bus_no;
-	u32 dev_no = dev_info->chipset_dev_no;
 	struct controlvm_message_header *pmsg_hdr = NULL;
 
-	char *envp[] = {
-		"SPARSP_DIAGPOOL_PAUSED_STATE = 1",
-		NULL
-	};
-
 	notifiers = &busdev_notifiers;
 
 	if (!dev_info) {
@@ -1075,21 +1051,6 @@ device_epilog(struct visor_device *dev_info,
 					(*notifiers->device_pause) (dev_info);
 					notified = true;
 				}
-			} else if (state.alive == segment_state_paused.alive &&
-				   state.operating ==
-				   segment_state_paused.operating) {
-				/* this is lite pause where channel is
-				 * still valid just 'pause' of it
-				 */
-				if (bus_no == g_diagpool_bus_no &&
-				    dev_no == g_diagpool_dev_no) {
-					/* this will trigger the
-					 * diag_shutdown.sh script in
-					 * the visorchipset hotplug */
-					kobject_uevent_env
-					    (&visorchipset_platform_device.dev.
-					     kobj, KOBJ_ONLINE, envp);
-				}
 			}
 			break;
 		case CONTROLVM_DEVICE_DESTROY:
@@ -1296,12 +1257,6 @@ my_device_create(struct controlvm_message *inmsg)
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 cleanup:
-	/* get the bus and devNo for DiagPool channel */
-	if (dev_info &&
-	    is_diagpool_channel(cmd->create_device.data_type_uuid)) {
-		g_diagpool_bus_no = bus_no;
-		g_diagpool_dev_no = dev_no;
-	}
 	device_epilog(dev_info, segment_state_running,
 		      CONTROLVM_DEVICE_CREATE, &inmsg->hdr, rc,
 		      inmsg->hdr.flags.response_expected == 1, 1);
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 44/44] staging: unisys: Clean up diag_serverity enum
  2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
                   ` (42 preceding siblings ...)
  2015-05-13 17:22 ` [PATCH 43/44] staging: unisys: Remove unneeded fields in diagchannel.h Benjamin Romer
@ 2015-05-13 17:22 ` Benjamin Romer
  43 siblings, 0 replies; 57+ messages in thread
From: Benjamin Romer @ 2015-05-13 17:22 UTC (permalink / raw)
  To: gregkh; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel, Benjamin Romer

From: David Kershner <david.kershner@unisys.com>

Get rid of unused values in the enum.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
---
 drivers/staging/unisys/include/diagchannel.h | 32 +++++++++++-----------------
 1 file changed, 12 insertions(+), 20 deletions(-)

diff --git a/drivers/staging/unisys/include/diagchannel.h b/drivers/staging/unisys/include/diagchannel.h
index 82932c5..d2d3568 100644
--- a/drivers/staging/unisys/include/diagchannel.h
+++ b/drivers/staging/unisys/include/diagchannel.h
@@ -16,36 +16,28 @@
 #ifndef _DIAG_CHANNEL_H_
 #define _DIAG_CHANNEL_H_
 
-#include <linux/uuid.h>
-
 #define MAX_MODULE_NAME_SIZE 128	/* Maximum length of module name... */
-#define MAX_ADDITIONAL_INFO_SIZE 256	/* Maximum length of any additional info
-					 * accompanying event...
+#define MAX_ADDITIONAL_INFO_SIZE 256	/* Maximum length of any additional
+					 * info accompanying event...
 					 */
 
 /* Levels of severity for diagnostic events, in order from lowest severity to
-* highest (i.e. fatal errors are the most severe, and should always be logged,
-* but info events rarely need to be logged except during debugging).  The values
-* DIAG_SEVERITY_ENUM_BEGIN and DIAG_SEVERITY_ENUM_END are not valid severity
-* values.  They exist merely to dilineate the list, so that future additions
-* won't require changes to the driver (i.e. when checking for out-of-range
-* severities in SetSeverity).  The values DIAG_SEVERITY_OVERRIDE and
-* DIAG_SEVERITY_SHUTOFF are not valid severity values for logging events but
-* they are valid for controlling the amount of event data.  This enum is also
-* defined in DotNet\sParFramework\ControlFramework\ControlFramework.cs.  If a
-* change is made to this enum, they should also be reflected in that file.  */
+ * highest (i.e. fatal errors are the most severe, and should always be logged,
+ * but info events rarely need to be logged except during debugging). The
+ * values DIAG_SEVERITY_ENUM_BEGIN and DIAG_SEVERITY_ENUM_END are not valid
+ * severity values.  They exist merely to dilineate the list, so that future
+ * additions won't require changes to the driver (i.e. when checking for
+ * out-of-range severities in SetSeverity). The values DIAG_SEVERITY_OVERRIDE
+ * and DIAG_SEVERITY_SHUTOFF are not valid severity values for logging events
+ * but they are valid for controlling the amount of event data. Changes made
+ * to the enum, need to be reflected in s-Par.
+ */
 enum diag_severity {
-		DIAG_SEVERITY_ENUM_BEGIN = 0,
-		DIAG_SEVERITY_OVERRIDE = 0,
 		DIAG_SEVERITY_VERBOSE = 0,
 		DIAG_SEVERITY_INFO = 1,
 		DIAG_SEVERITY_WARNING = 2,
 		DIAG_SEVERITY_ERR = 3,
-		DIAG_SEVERITY_NONFATAL_ERR = 3,
 		DIAG_SEVERITY_PRINT = 4,
-		DIAG_SEVERITY_FATAL_ERR = 4,
-		DIAG_SEVERITY_SHUTOFF = 5,
-		DIAG_SEVERITY_ENUM_END = 5
 };
 
 #endif
-- 
2.1.4

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* Re: [PATCH 34/44] staging: unisys: Prepare vbus_hdr_info to be public
  2015-05-13 17:22 ` [PATCH 34/44] staging: unisys: Prepare vbus_hdr_info to be public Benjamin Romer
@ 2015-05-16 11:22   ` Dan Carpenter
  2015-05-18 14:52     ` Don Zickus
  0 siblings, 1 reply; 57+ messages in thread
From: Dan Carpenter @ 2015-05-16 11:22 UTC (permalink / raw)
  To: Benjamin Romer
  Cc: gregkh, Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel

On Wed, May 13, 2015 at 01:22:28PM -0400, Benjamin Romer wrote:
> +	hdr_info = kzalloc(sizeof(*hdr_info), GFP_KERNEL);
> +	if (!hdr_info) {
> +		rc = NULL;
> +		goto away_mem;
> +	}
> +
>  	dev_set_name(&devdata->dev, "visorbus%d", id);
>  	devdata->dev.bus = &visorbus_type;
>  	devdata->dev.groups = visorbus_groups;
> @@ -1344,26 +1352,19 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
>  		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
>  				 POSTCODE_SEVERITY_ERR);
>  		rc = NULL;
> -		goto away;
> +		goto away_mem2;
>  	}
>  	devdata->devno = id;
>  	devdata->chan = bus_info->visorchannel;
>  	if (bus_info->flags.server) {
>  		init_vbus_channel(devdata->chan);
>  	} else {
> -		if (get_vbus_header_info(devdata->chan,
> -					 &devdata->
> -					 vbus_hdr_info) >= 0) {
> -			devdata->vbus_valid = true;
> -			write_vbus_chp_info(devdata->chan,
> -					    &devdata->
> -					    vbus_hdr_info,
> -					    &chipset_driverinfo
> -					    );
> -			write_vbus_bus_info(devdata->chan,
> -					    &devdata->
> -						vbus_hdr_info,
> -					&clientbus_driverinfo);
> +		if (get_vbus_header_info(devdata->chan, hdr_info) >= 0) {
> +			devdata->vbus_hdr_info = (void *)hdr_info;
> +			write_vbus_chp_info(devdata->chan, hdr_info,
> +					    &chipset_driverinfo);
> +			write_vbus_bus_info(devdata->chan, hdr_info,
> +					    &clientbus_driverinfo);
>  		}
>  	}
>  	bus_count++;

We still leak hdr_info on some paths.

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [PATCH 40/44] staging: unisys: Convert device creation to use visor_device
  2015-05-13 17:22 ` [PATCH 40/44] staging: unisys: Convert device " Benjamin Romer
@ 2015-05-16 11:32   ` Dan Carpenter
  2015-05-18 15:01     ` Don Zickus
  2015-05-18 15:23   ` [PATCH 40/44 V2] " Don Zickus
  1 sibling, 1 reply; 57+ messages in thread
From: Dan Carpenter @ 2015-05-16 11:32 UTC (permalink / raw)
  To: Benjamin Romer
  Cc: gregkh, Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel

On Wed, May 13, 2015 at 01:22:34PM -0400, Benjamin Romer wrote:
> @@ -1022,29 +997,21 @@ create_visor_device(struct visor_device *bdev,
>  		goto away;
>  	}
>  
> -	/* note: device_register is simply device_initialize + device_add */
> -	registered1 = true;
> -
>  	rc = register_devmajorminor_attributes(dev);
>  	if (rc < 0) {
>  		POSTCODE_LINUX_3(DEVICE_REGISTER_FAILURE_PC, chipset_dev_no,
>  				 DIAG_SEVERITY_ERR);
> -		goto away;
> +		goto away_register;
>  	}
>  
> -	registered2 = true;
> -	rc = 0;
> +	list_add_tail(&dev->list_all, &list_all_device_instances);
> +	put_device(&dev->device);

We don't want to call put_device() on the success path.  It hopefully
would have triggered an error if we call remove_visor_device()?

> +	return 0;
>  
> +away_register:
> +	device_unregister(&dev->device);
>  away:

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [PATCH 32/44] staging: unisys: Move channel creation up the stack
  2015-05-13 17:22 ` [PATCH 32/44] staging: unisys: Move channel creation up the stack Benjamin Romer
@ 2015-05-16 11:38   ` Dan Carpenter
  2015-05-18 15:20     ` Don Zickus
  2015-05-18 15:23   ` [PATCH 32/44 V2] " Don Zickus
  1 sibling, 1 reply; 57+ messages in thread
From: Dan Carpenter @ 2015-05-16 11:38 UTC (permalink / raw)
  To: Benjamin Romer
  Cc: gregkh, Don Zickus, Jes.Sorensen, sparmaintainer, driverdev-devel

On Wed, May 13, 2015 at 01:22:26PM -0400, Benjamin Romer wrote:
> --- a/drivers/staging/unisys/visorbus/visorchipset.c
> +++ b/drivers/staging/unisys/visorbus/visorchipset.c
> @@ -1197,6 +1197,7 @@ bus_create(struct controlvm_message *inmsg)
>  	u32 bus_no = cmd->create_bus.bus_no;
>  	int rc = CONTROLVM_RESP_SUCCESS;
>  	struct visorchipset_bus_info *bus_info;
> +	struct visorchannel *visorchannel;
>  
>  	bus_info = bus_find(&bus_info_list, bus_no);
>  	if (bus_info && (bus_info->state.created == 1)) {
> @@ -1218,18 +1219,21 @@ bus_create(struct controlvm_message *inmsg)
>  
>  	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
>  
> -	if (inmsg->hdr.flags.test_message == 1)
> -		bus_info->chan_info.addr_type = ADDRTYPE_LOCALTEST;
> -	else
> -		bus_info->chan_info.addr_type = ADDRTYPE_LOCALPHYSICAL;
> -
>  	bus_info->flags.server = inmsg->hdr.flags.server;
> -	bus_info->chan_info.channel_addr = cmd->create_bus.channel_addr;
> -	bus_info->chan_info.n_channel_bytes = cmd->create_bus.channel_bytes;
> -	bus_info->chan_info.channel_type_uuid =
> -			cmd->create_bus.bus_data_type_uuid;
> -	bus_info->chan_info.channel_inst_uuid = cmd->create_bus.bus_inst_uuid;
>  
> +	visorchannel = visorchannel_create(cmd->create_bus.channel_addr,
> +					   cmd->create_bus.channel_bytes,
> +					   GFP_KERNEL,
> +					   cmd->create_bus.bus_data_type_uuid);
> +
> +	if (!visorchannel) {
> +		POSTCODE_LINUX_3(BUS_CREATE_FAILURE_PC, bus_no,
> +				 POSTCODE_SEVERITY_ERR);
> +		rc = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
> +		kfree(bus_info);


I'm in a very lazy review mood but I can't immediately see how this is
correct.  We're calling kfree(bus_info), but the pointer is still there
and bus_find() will return it to someone else.  Actually it's worse than
that, because bus_find() will dereference it iterating through the
&bus_info_list.

> +		goto cleanup;
> +	}
> +	bus_info->visorchannel = visorchannel;
>  	list_add(&bus_info->entry, &bus_info_list);
>  
>  	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [PATCH 34/44] staging: unisys: Prepare vbus_hdr_info to be public
  2015-05-16 11:22   ` Dan Carpenter
@ 2015-05-18 14:52     ` Don Zickus
  2015-05-18 15:09       ` Dan Carpenter
  0 siblings, 1 reply; 57+ messages in thread
From: Don Zickus @ 2015-05-18 14:52 UTC (permalink / raw)
  To: Dan Carpenter
  Cc: Benjamin Romer, gregkh, Jes.Sorensen, sparmaintainer, driverdev-devel

On Sat, May 16, 2015 at 02:22:16PM +0300, Dan Carpenter wrote:
> On Wed, May 13, 2015 at 01:22:28PM -0400, Benjamin Romer wrote:
> > +	hdr_info = kzalloc(sizeof(*hdr_info), GFP_KERNEL);
> > +	if (!hdr_info) {
> > +		rc = NULL;
> > +		goto away_mem;
> > +	}
> > +
> >  	dev_set_name(&devdata->dev, "visorbus%d", id);
> >  	devdata->dev.bus = &visorbus_type;
> >  	devdata->dev.groups = visorbus_groups;
> > @@ -1344,26 +1352,19 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
> >  		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, id,
> >  				 POSTCODE_SEVERITY_ERR);
> >  		rc = NULL;
> > -		goto away;
> > +		goto away_mem2;
> >  	}
> >  	devdata->devno = id;
> >  	devdata->chan = bus_info->visorchannel;
> >  	if (bus_info->flags.server) {
> >  		init_vbus_channel(devdata->chan);
> >  	} else {
> > -		if (get_vbus_header_info(devdata->chan,
> > -					 &devdata->
> > -					 vbus_hdr_info) >= 0) {
> > -			devdata->vbus_valid = true;
> > -			write_vbus_chp_info(devdata->chan,
> > -					    &devdata->
> > -					    vbus_hdr_info,
> > -					    &chipset_driverinfo
> > -					    );
> > -			write_vbus_bus_info(devdata->chan,
> > -					    &devdata->
> > -						vbus_hdr_info,
> > -					&clientbus_driverinfo);
> > +		if (get_vbus_header_info(devdata->chan, hdr_info) >= 0) {
> > +			devdata->vbus_hdr_info = (void *)hdr_info;
> > +			write_vbus_chp_info(devdata->chan, hdr_info,
> > +					    &chipset_driverinfo);
> > +			write_vbus_bus_info(devdata->chan, hdr_info,
> > +					    &clientbus_driverinfo);
> >  		}
> >  	}
> >  	bus_count++;
> 
> We still leak hdr_info on some paths.

Agreed.  I noticed and fixed this up in patch 37 "Remove server flags".
Simplifying the code made the problem stand out eaiser.  I can migrate the
fix to this patch if you want.

Cheers,
Don

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [PATCH 40/44] staging: unisys: Convert device creation to use visor_device
  2015-05-16 11:32   ` Dan Carpenter
@ 2015-05-18 15:01     ` Don Zickus
  0 siblings, 0 replies; 57+ messages in thread
From: Don Zickus @ 2015-05-18 15:01 UTC (permalink / raw)
  To: Dan Carpenter
  Cc: Benjamin Romer, gregkh, Jes.Sorensen, sparmaintainer, driverdev-devel

On Sat, May 16, 2015 at 02:32:33PM +0300, Dan Carpenter wrote:
> On Wed, May 13, 2015 at 01:22:34PM -0400, Benjamin Romer wrote:
> > @@ -1022,29 +997,21 @@ create_visor_device(struct visor_device *bdev,
> >  		goto away;
> >  	}
> >  
> > -	/* note: device_register is simply device_initialize + device_add */
> > -	registered1 = true;
> > -
> >  	rc = register_devmajorminor_attributes(dev);
> >  	if (rc < 0) {
> >  		POSTCODE_LINUX_3(DEVICE_REGISTER_FAILURE_PC, chipset_dev_no,
> >  				 DIAG_SEVERITY_ERR);
> > -		goto away;
> > +		goto away_register;
> >  	}
> >  
> > -	registered2 = true;
> > -	rc = 0;
> > +	list_add_tail(&dev->list_all, &list_all_device_instances);
> > +	put_device(&dev->device);
> 
> We don't want to call put_device() on the success path.  It hopefully
> would have triggered an error if we call remove_visor_device()?

Yup, I agree.  Mistake on my part when I was tweaking the failure paths
here.  Thanks!  Let me respin that patch.

Cheers,
Don

> 
> > +	return 0;
> >  
> > +away_register:
> > +	device_unregister(&dev->device);
> >  away:
> 
> regards,
> dan carpenter

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [PATCH 34/44] staging: unisys: Prepare vbus_hdr_info to be public
  2015-05-18 14:52     ` Don Zickus
@ 2015-05-18 15:09       ` Dan Carpenter
  0 siblings, 0 replies; 57+ messages in thread
From: Dan Carpenter @ 2015-05-18 15:09 UTC (permalink / raw)
  To: Don Zickus
  Cc: Benjamin Romer, gregkh, Jes.Sorensen, sparmaintainer, driverdev-devel

On Mon, May 18, 2015 at 10:52:25AM -0400, Don Zickus wrote:
> On Sat, May 16, 2015 at 02:22:16PM +0300, Dan Carpenter wrote:
> > On Wed, May 13, 2015 at 01:22:28PM -0400, Benjamin Romer wrote:
> > 
> > We still leak hdr_info on some paths.
> 
> Agreed.  I noticed and fixed this up in patch 37 "Remove server flags".
> Simplifying the code made the problem stand out eaiser.  I can migrate the
> fix to this patch if you want.

I don't have strong opinions.  I hadn't read 37 when I sent this.

regards,
dan carpenter

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [PATCH 32/44] staging: unisys: Move channel creation up the stack
  2015-05-16 11:38   ` Dan Carpenter
@ 2015-05-18 15:20     ` Don Zickus
  2015-05-18 15:53       ` Dan Carpenter
  0 siblings, 1 reply; 57+ messages in thread
From: Don Zickus @ 2015-05-18 15:20 UTC (permalink / raw)
  To: Dan Carpenter
  Cc: Benjamin Romer, gregkh, Jes.Sorensen, sparmaintainer, driverdev-devel

On Sat, May 16, 2015 at 02:38:57PM +0300, Dan Carpenter wrote:
> On Wed, May 13, 2015 at 01:22:26PM -0400, Benjamin Romer wrote:
> > --- a/drivers/staging/unisys/visorbus/visorchipset.c
> > +++ b/drivers/staging/unisys/visorbus/visorchipset.c
> > @@ -1197,6 +1197,7 @@ bus_create(struct controlvm_message *inmsg)
> >  	u32 bus_no = cmd->create_bus.bus_no;
> >  	int rc = CONTROLVM_RESP_SUCCESS;
> >  	struct visorchipset_bus_info *bus_info;
> > +	struct visorchannel *visorchannel;
> >  
> >  	bus_info = bus_find(&bus_info_list, bus_no);
> >  	if (bus_info && (bus_info->state.created == 1)) {
> > @@ -1218,18 +1219,21 @@ bus_create(struct controlvm_message *inmsg)
> >  
> >  	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
> >  
> > -	if (inmsg->hdr.flags.test_message == 1)
> > -		bus_info->chan_info.addr_type = ADDRTYPE_LOCALTEST;
> > -	else
> > -		bus_info->chan_info.addr_type = ADDRTYPE_LOCALPHYSICAL;
> > -
> >  	bus_info->flags.server = inmsg->hdr.flags.server;
> > -	bus_info->chan_info.channel_addr = cmd->create_bus.channel_addr;
> > -	bus_info->chan_info.n_channel_bytes = cmd->create_bus.channel_bytes;
> > -	bus_info->chan_info.channel_type_uuid =
> > -			cmd->create_bus.bus_data_type_uuid;
> > -	bus_info->chan_info.channel_inst_uuid = cmd->create_bus.bus_inst_uuid;
> >  
> > +	visorchannel = visorchannel_create(cmd->create_bus.channel_addr,
> > +					   cmd->create_bus.channel_bytes,
> > +					   GFP_KERNEL,
> > +					   cmd->create_bus.bus_data_type_uuid);
> > +
> > +	if (!visorchannel) {
> > +		POSTCODE_LINUX_3(BUS_CREATE_FAILURE_PC, bus_no,
> > +				 POSTCODE_SEVERITY_ERR);
> > +		rc = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
> > +		kfree(bus_info);
> 
> 
> I'm in a very lazy review mood but I can't immediately see how this is
> correct.  We're calling kfree(bus_info), but the pointer is still there
> and bus_find() will return it to someone else.  Actually it's worse than
> that, because bus_find() will dereference it iterating through the
> &bus_info_list.

Thanks for the review, I am going to half disagree, see lines below. :-)

> 
> > +		goto cleanup;
> > +	}
> > +	bus_info->visorchannel = visorchannel;
> >  	list_add(&bus_info->entry, &bus_info_list);

bus_info gets attached to bus_info_list here, only on success.  So you
concern should never happen on the failure case.

What might be confusing you is the bus_info = bus_find() command above.
That is a sanity check to see if bus_info already exists.  If it does, the
function fails.  If not, bus_info is kzalloc'd and not attached to anything
yet.

That is my half disagreement. ;-)

The half that agrees with you, does show an error in this path.  What happens
is the 'goto cleanup' part calls bus_epilog.  But because bus_info is still
non-NULL, bus-epilog tries to treat it like valid data, which it isn't
anymore.

So I need to set bus_info to NULL after kfree'ing it.  I will respin for
that.

Cheers,
Don

> >  
> >  	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
> 
> regards,
> dan carpenter

^ permalink raw reply	[flat|nested] 57+ messages in thread

* [PATCH 32/44 V2] staging: unisys: Move channel creation up the stack
  2015-05-13 17:22 ` [PATCH 32/44] staging: unisys: Move channel creation up the stack Benjamin Romer
  2015-05-16 11:38   ` Dan Carpenter
@ 2015-05-18 15:23   ` Don Zickus
  2015-05-24 20:31     ` Greg KH
  1 sibling, 1 reply; 57+ messages in thread
From: Don Zickus @ 2015-05-18 15:23 UTC (permalink / raw)
  To: driverdev-devel
  Cc: dan.carpenter, benjamin.romer, gregkh, Jes.Sorensen,
	sparmaintainer, Don Zickus

Instead of creating a channel struct to temporarily hold the channel
info and passing it through multiple functions until the device is
created, just create the channel from the start.

This allows us to remove the channel_info struct.

I noticed 'chan_info.addr_type' was not being used, so I just deleted it.

Signed-off-by: Don Zickus <dzickus@redhat.com>

---
V2: Fix bus/dev_create error path by adding bus/dev_info = NULL (Dan Carpenter)
---
 drivers/staging/unisys/visorbus/visorbus_main.c    | 87 +++++++---------------
 drivers/staging/unisys/visorbus/visorbus_private.h | 16 +---
 drivers/staging/unisys/visorbus/visorchipset.c     | 54 +++++++++-----
 3 files changed, 63 insertions(+), 94 deletions(-)

diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index 5e5859c..da7d4de 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -1009,11 +1009,9 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
 static int
 create_visor_device(struct visorbus_devdata *devdata,
 		    struct visorchipset_device_info *dev_info,
-		    struct visorchipset_channel_info chan_info,
 		    u64 partition_handle)
 {
 	int rc = -1;
-	struct visorchannel *visorchannel = NULL;
 	struct visor_device *dev = NULL;
 	bool gotten = false, registered1 = false, registered2 = false;
 	u32 chipset_bus_no = dev_info->bus_no;
@@ -1021,16 +1019,6 @@ create_visor_device(struct visorbus_devdata *devdata,
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, chipset_dev_no, chipset_bus_no,
 			 POSTCODE_SEVERITY_INFO);
-	/* prepare chan_hdr (abstraction to read/write channel memory) */
-	visorchannel = visorchannel_create(chan_info.channel_addr,
-					   chan_info.n_channel_bytes,
-					   GFP_KERNEL,
-					   chan_info.channel_type_uuid);
-	if (!visorchannel) {
-		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, chipset_dev_no,
-				 DIAG_SEVERITY_ERR);
-		goto away;
-	}
 	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
 	if (!dev) {
 		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, chipset_dev_no,
@@ -1039,9 +1027,8 @@ create_visor_device(struct visorbus_devdata *devdata,
 	}
 
 	memset(dev, 0, sizeof(struct visor_device));
-	dev->visorchannel = visorchannel;
-	dev->channel_type_guid = chan_info.channel_type_uuid;
-	dev->channel_bytes = chan_info.n_channel_bytes;
+	dev->visorchannel = dev_info->visorchannel;
+	dev->channel_type_guid = dev_info->channel_type_guid;
 	dev->chipset_bus_no = chipset_bus_no;
 	dev->chipset_dev_no = chipset_dev_no;
 	dev->device.parent = &devdata->dev;
@@ -1113,8 +1100,6 @@ away:
 			unregister_devmajorminor_attributes(dev);
 		if (gotten)
 			put_device(&dev->device);
-		if (visorchannel)
-			visorchannel_destroy(visorchannel);
 		kfree(dev);
 	} else {
 		total_devices_created++;
@@ -1133,7 +1118,7 @@ remove_visor_device(struct visor_device *dev)
 }
 
 static struct visor_device *
-find_visor_device_by_channel(u64 channel_physaddr)
+find_visor_device_by_channel(struct visorchannel *channel)
 {
 	struct list_head *listentry, *listtmp;
 
@@ -1141,8 +1126,7 @@ find_visor_device_by_channel(u64 channel_physaddr)
 		struct visor_device *dev = list_entry(listentry,
 						      struct visor_device,
 						      list_all);
-		if (visorchannel_get_physaddr(dev->visorchannel) ==
-		    channel_physaddr)
+		if (dev->visorchannel == channel)
 			return dev;
 	}
 	return NULL;
@@ -1362,41 +1346,23 @@ create_bus_instance(struct visorchipset_bus_info *bus_info)
 		goto away;
 	}
 	devdata->devno = id;
-	if ((bus_info->chan_info.channel_addr > 0) &&
-	    (bus_info->chan_info.n_channel_bytes > 0)) {
-		u64 channel_addr = bus_info->chan_info.channel_addr;
-		unsigned long n_channel_bytes =
-				(unsigned long)
-				bus_info->chan_info.n_channel_bytes;
-		uuid_le channel_type_guid =
-				bus_info->chan_info.channel_type_uuid;
-
-		devdata->chan = visorchannel_create(channel_addr,
-						    n_channel_bytes,
-						    GFP_KERNEL,
-						    channel_type_guid);
-		if (!devdata->chan) {
-			POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, channel_addr,
-					 POSTCODE_SEVERITY_ERR);
-		} else {
-			if (bus_info->flags.server) {
-				init_vbus_channel(devdata->chan);
-			} else {
-				if (get_vbus_header_info(devdata->chan,
-							 &devdata->
-							 vbus_hdr_info) >= 0) {
-					devdata->vbus_valid = true;
-					write_vbus_chp_info(devdata->chan,
-							    &devdata->
-							    vbus_hdr_info,
-							    &chipset_driverinfo
-							    );
-					write_vbus_bus_info(devdata->chan,
-							    &devdata->
-								vbus_hdr_info,
-							&clientbus_driverinfo);
-				}
-			}
+	devdata->chan = bus_info->visorchannel;
+	if (bus_info->flags.server) {
+		init_vbus_channel(devdata->chan);
+	} else {
+		if (get_vbus_header_info(devdata->chan,
+					 &devdata->
+					 vbus_hdr_info) >= 0) {
+			devdata->vbus_valid = true;
+			write_vbus_chp_info(devdata->chan,
+					    &devdata->
+					    vbus_hdr_info,
+					    &chipset_driverinfo
+					    );
+			write_vbus_bus_info(devdata->chan,
+					    &devdata->
+						vbus_hdr_info,
+					&clientbus_driverinfo);
 		}
 	}
 	bus_count++;
@@ -1467,7 +1433,7 @@ remove_all_visor_devices(void)
 }
 
 static bool entered_testing_mode;
-static struct visorchipset_channel_info test_channel_infos[MAXDEVICETEST];
+static struct visorchannel *test_channel_infos[MAXDEVICETEST];
 static unsigned long test_bus_nos[MAXDEVICETEST];
 static unsigned long test_dev_nos[MAXDEVICETEST];
 
@@ -1537,7 +1503,7 @@ chipset_device_create(struct visorchipset_device_info *dev_info)
 	if (visorbus_devicetest)
 		if (total_devices_created < MAXDEVICETEST) {
 			test_channel_infos[total_devices_created] =
-			    dev_info->chan_info;
+			    dev_info->visorchannel;
 			test_bus_nos[total_devices_created] = bus_no;
 			test_dev_nos[total_devices_created] = dev_no;
 		}
@@ -1551,8 +1517,7 @@ away:
 		return;
 	}
 	devdata = (struct visorbus_devdata *)(bus_info.bus_driver_context);
-	rc = create_visor_device(devdata, dev_info,
-				 dev_info->chan_info, bus_info.partition_handle);
+	rc = create_visor_device(devdata, dev_info, bus_info.partition_handle);
 	POSTCODE_LINUX_4(DEVICE_CREATE_SUCCESS_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 	if (rc < 0)
@@ -1568,7 +1533,7 @@ chipset_device_destroy(struct visorchipset_device_info *dev_info)
 
 	if (entered_testing_mode)
 		return;
-	dev = find_visor_device_by_channel(dev_info->chan_info.channel_addr);
+	dev = find_visor_device_by_channel(dev_info->visorchannel);
 	if (!dev)
 		goto away;
 	rc = 0;
@@ -1648,7 +1613,7 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 	if (!notify_func)
 			goto away;
 
-	dev = find_visor_device_by_channel(dev_info->chan_info.channel_addr);
+	dev = find_visor_device_by_channel(dev_info->visorchannel);
 	if (!dev)
 			goto away;
 
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index 7a623c4..254583a 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -40,17 +40,6 @@ enum visorchipset_addresstype {
 	ADDRTYPE_LOCALTEST,
 };
 
-/** Attributes for a particular Supervisor channel.
- */
-struct visorchipset_channel_info {
-	enum visorchipset_addresstype addr_type;
-	u64 channel_addr;
-	struct irq_info intr;
-	u64 n_channel_bytes;
-	uuid_le channel_type_uuid;
-	uuid_le channel_inst_uuid;
-};
-
 /** Attributes for a particular Supervisor device.
  *  Any visorchipset client can query these attributes using
  *  visorchipset_get_client_device_info() or
@@ -62,7 +51,8 @@ struct visorchipset_device_info {
 	u32 dev_no;
 	uuid_le dev_inst_uuid;
 	struct visorchipset_state state;
-	struct visorchipset_channel_info chan_info;
+	struct visorchannel *visorchannel;
+	uuid_le channel_type_guid;
 	u32 reserved1;		/* control_vm_id */
 	u64 reserved2;
 	u32 switch_no;		/* when devState.attached==1 */
@@ -82,7 +72,7 @@ struct visorchipset_bus_info {
 	struct list_head entry;
 	u32 bus_no;
 	struct visorchipset_state state;
-	struct visorchipset_channel_info chan_info;
+	struct visorchannel *visorchannel;
 	uuid_le partition_uuid;
 	u64 partition_handle;
 	u8 *name;		/* UTF8 */
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 7226331..f4cb3dc 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -1193,6 +1193,7 @@ bus_create(struct controlvm_message *inmsg)
 	u32 bus_no = cmd->create_bus.bus_no;
 	int rc = CONTROLVM_RESP_SUCCESS;
 	struct visorchipset_bus_info *bus_info;
+	struct visorchannel *visorchannel;
 
 	bus_info = bus_find(&bus_info_list, bus_no);
 	if (bus_info && (bus_info->state.created == 1)) {
@@ -1214,18 +1215,22 @@ bus_create(struct controlvm_message *inmsg)
 
 	POSTCODE_LINUX_3(BUS_CREATE_ENTRY_PC, bus_no, POSTCODE_SEVERITY_INFO);
 
-	if (inmsg->hdr.flags.test_message == 1)
-		bus_info->chan_info.addr_type = ADDRTYPE_LOCALTEST;
-	else
-		bus_info->chan_info.addr_type = ADDRTYPE_LOCALPHYSICAL;
-
 	bus_info->flags.server = inmsg->hdr.flags.server;
-	bus_info->chan_info.channel_addr = cmd->create_bus.channel_addr;
-	bus_info->chan_info.n_channel_bytes = cmd->create_bus.channel_bytes;
-	bus_info->chan_info.channel_type_uuid =
-			cmd->create_bus.bus_data_type_uuid;
-	bus_info->chan_info.channel_inst_uuid = cmd->create_bus.bus_inst_uuid;
 
+	visorchannel = visorchannel_create(cmd->create_bus.channel_addr,
+					   cmd->create_bus.channel_bytes,
+					   GFP_KERNEL,
+					   cmd->create_bus.bus_data_type_uuid);
+
+	if (!visorchannel) {
+		POSTCODE_LINUX_3(BUS_CREATE_FAILURE_PC, bus_no,
+				 POSTCODE_SEVERITY_ERR);
+		rc = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
+		kfree(bus_info);
+		bus_info = NULL;
+		goto cleanup;
+	}
+	bus_info->visorchannel = visorchannel;
 	list_add(&bus_info->entry, &bus_info_list);
 
 	POSTCODE_LINUX_3(BUS_CREATE_EXIT_PC, bus_no, POSTCODE_SEVERITY_INFO);
@@ -1281,7 +1286,8 @@ bus_configure(struct controlvm_message *inmsg,
 				 POSTCODE_SEVERITY_ERR);
 		rc = -CONTROLVM_RESP_ERROR_MESSAGE_ID_INVALID_FOR_CLIENT;
 	} else {
-		bus_info->partition_handle = cmd->configure_bus.guest_handle;
+		visorchannel_set_clientpartition(bus_info->visorchannel,
+						 cmd->configure_bus.guest_handle);
 		bus_info->partition_uuid = parser_id_get(parser_ctx);
 		parser_param_start(parser_ctx, PARSERSTRING_NAME);
 		bus_info->name = parser_string_get(parser_ctx);
@@ -1302,6 +1308,7 @@ my_device_create(struct controlvm_message *inmsg)
 	u32 dev_no = cmd->create_device.dev_no;
 	struct visorchipset_device_info *dev_info;
 	struct visorchipset_bus_info *bus_info;
+	struct visorchannel *visorchannel;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
 	dev_info = device_find(&dev_info_list, bus_no, dev_no);
@@ -1339,21 +1346,28 @@ my_device_create(struct controlvm_message *inmsg)
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
-	if (inmsg->hdr.flags.test_message == 1)
-		dev_info->chan_info.addr_type = ADDRTYPE_LOCALTEST;
-	else
-		dev_info->chan_info.addr_type = ADDRTYPE_LOCALPHYSICAL;
-	dev_info->chan_info.channel_addr = cmd->create_device.channel_addr;
-	dev_info->chan_info.n_channel_bytes = cmd->create_device.channel_bytes;
-	dev_info->chan_info.channel_type_uuid =
-			cmd->create_device.data_type_uuid;
+	visorchannel = visorchannel_create(cmd->create_device.channel_addr,
+					   cmd->create_device.channel_bytes,
+					   GFP_KERNEL,
+					   cmd->create_device.data_type_uuid);
+
+	if (!visorchannel) {
+		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
+				 POSTCODE_SEVERITY_ERR);
+		rc = -CONTROLVM_RESP_ERROR_KMALLOC_FAILED;
+		kfree(dev_info);
+		dev_info = NULL;
+		goto cleanup;
+	}
+	dev_info->visorchannel = visorchannel;
+	dev_info->channel_type_guid = cmd->create_device.data_type_uuid;
 	list_add(&dev_info->entry, &dev_info_list);
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 cleanup:
 	/* get the bus and devNo for DiagPool channel */
 	if (dev_info &&
-	    is_diagpool_channel(dev_info->chan_info.channel_type_uuid)) {
+	    is_diagpool_channel(cmd->create_device.data_type_uuid)) {
 		g_diagpool_bus_no = bus_no;
 		g_diagpool_dev_no = dev_no;
 	}
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* [PATCH 40/44 V2] staging: unisys: Convert device creation to use visor_device
  2015-05-13 17:22 ` [PATCH 40/44] staging: unisys: Convert device " Benjamin Romer
  2015-05-16 11:32   ` Dan Carpenter
@ 2015-05-18 15:23   ` Don Zickus
  1 sibling, 0 replies; 57+ messages in thread
From: Don Zickus @ 2015-05-18 15:23 UTC (permalink / raw)
  To: driverdev-devel
  Cc: dan.carpenter, benjamin.romer, gregkh, Jes.Sorensen,
	sparmaintainer, Don Zickus

This patch removes the legacy dev_info struct and instead creates
and passes around a traditional struct device.

This allows us to remove a lot of the various look up code and
removes the doubt if the struct exists or not.

Half of the churn is just the conversion of visorchipset_device_info
to visor_device.  Various cleanups include re-arranging the failure
paths to make more sense.

Pay attention to the create_visor_device function.  This had a lot of
churn to simplify everything.

Lots of functions disappeared because they are not needed any more.

Signed-off-by: Don Zickus <dzickus@redhat.com>

---
V2: Remove the extra put_device().  (Dan Carpenter)
---
 drivers/staging/unisys/include/visorbus.h          |   8 +-
 drivers/staging/unisys/visorbus/visorbus_main.c    | 144 +++++---------------
 drivers/staging/unisys/visorbus/visorbus_private.h |  48 ++-----
 drivers/staging/unisys/visorbus/visorchipset.c     | 149 +++++----------------
 4 files changed, 79 insertions(+), 270 deletions(-)

diff --git a/drivers/staging/unisys/include/visorbus.h b/drivers/staging/unisys/include/visorbus.h
index e7f9984..581d962 100644
--- a/drivers/staging/unisys/include/visorbus.h
+++ b/drivers/staging/unisys/include/visorbus.h
@@ -43,7 +43,7 @@ struct visor_device;
 extern struct bus_type visorbus_type;
 
 typedef void (*visorbus_state_complete_func) (struct visor_device *dev,
-					      int status, void *dev_info);
+					      int status);
 struct visorchipset_state {
 	u32 created:1;
 	u32 attached:1;
@@ -106,11 +106,9 @@ struct visor_driver {
 	 *  fails or completes successfully.
 	 */
 	int (*pause)(struct visor_device *dev,
-		     visorbus_state_complete_func complete_func,
-		     void *dev_info);
+		     visorbus_state_complete_func complete_func);
 	int (*resume)(struct visor_device *dev,
-		      visorbus_state_complete_func complete_func,
-		      void *dev_info);
+		      visorbus_state_complete_func complete_func);
 
 	/** These fields are for private use by the bus driver only. */
 	struct device_driver driver;
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c
index bee626c..2cf11d8 100644
--- a/drivers/staging/unisys/visorbus/visorbus_main.c
+++ b/drivers/staging/unisys/visorbus/visorbus_main.c
@@ -95,10 +95,10 @@ static long long bus_count;	/** number of bus instances */
 
 static void chipset_bus_create(struct visor_device *bus_info);
 static void chipset_bus_destroy(struct visor_device *bus_info);
-static void chipset_device_create(struct visorchipset_device_info *dev_info);
-static void chipset_device_destroy(struct visorchipset_device_info *dev_info);
-static void chipset_device_pause(struct visorchipset_device_info *dev_info);
-static void chipset_device_resume(struct visorchipset_device_info *dev_info);
+static void chipset_device_create(struct visor_device *dev_info);
+static void chipset_device_destroy(struct visor_device *dev_info);
+static void chipset_device_pause(struct visor_device *dev_info);
+static void chipset_device_resume(struct visor_device *dev_info);
 
 /** These functions are implemented herein, and are called by the chipset
  *  driver to notify us about specific events.
@@ -184,7 +184,6 @@ visorbus_release_busdevice(struct device *xdev)
 
 	dev_set_drvdata(xdev, NULL);
 	kfree(dev);
-	kfree(xdev);
 }
 
 /** This is called when device_unregister() is called for each child
@@ -754,16 +753,9 @@ away:
 	 *  initialized.
 	 */
 	if (!dev->responded_to_device_create) {
-		struct visorchipset_device_info dev_info;
-
-		if (!visorchipset_get_device_info(dev->chipset_bus_no,
-						  dev->chipset_dev_no, &dev_info))
-			/* hmm, what to do here */
-			return rc;
-
 		dev->responded_to_device_create = true;
 		if (chipset_responders.device_create)
-			(*chipset_responders.device_create)(&dev_info, rc);
+			(*chipset_responders.device_create)(dev, rc);
 	}
 	return rc;
 }
@@ -948,30 +940,15 @@ EXPORT_SYMBOL_GPL(visorbus_disable_channel_interrupts);
  *  device.
  */
 static int
-create_visor_device(struct visor_device *bdev,
-		    struct visorchipset_device_info *dev_info)
+create_visor_device(struct visor_device *dev)
 {
 	int rc = -1;
-	struct visor_device *dev = NULL;
-	bool gotten = false, registered1 = false, registered2 = false;
-	u32 chipset_bus_no = dev_info->bus_no;
-	u32 chipset_dev_no = dev_info->dev_no;
+	u32 chipset_bus_no = dev->chipset_bus_no;
+	u32 chipset_dev_no = dev->chipset_dev_no;
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, chipset_dev_no, chipset_bus_no,
 			 POSTCODE_SEVERITY_INFO);
-	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
-	if (!dev) {
-		POSTCODE_LINUX_3(DEVICE_CREATE_FAILURE_PC, chipset_dev_no,
-				 DIAG_SEVERITY_ERR);
-		goto away;
-	}
 
-	memset(dev, 0, sizeof(struct visor_device));
-	dev->visorchannel = dev_info->visorchannel;
-	dev->channel_type_guid = dev_info->channel_type_guid;
-	dev->chipset_bus_no = chipset_bus_no;
-	dev->chipset_dev_no = chipset_dev_no;
-	dev->device.parent = &bdev->device;
 	sema_init(&dev->visordriver_callback_lock, 1);	/* unlocked */
 	dev->device.bus = &visorbus_type;
 	dev->device.groups = visorbus_dev_groups;
@@ -979,7 +956,6 @@ create_visor_device(struct visor_device *bdev,
 	dev->device.release = visorbus_release_device;
 	/* keep a reference just for us (now 2) */
 	get_device(&dev->device);
-	gotten = true;
 	dev->periodic_work =
 		visor_periodic_work_create(POLLJIFFIES_NORMALCHANNEL,
 					   periodic_dev_workqueue,
@@ -1021,29 +997,20 @@ create_visor_device(struct visor_device *bdev,
 		goto away;
 	}
 
-	/* note: device_register is simply device_initialize + device_add */
-	registered1 = true;
-
 	rc = register_devmajorminor_attributes(dev);
 	if (rc < 0) {
 		POSTCODE_LINUX_3(DEVICE_REGISTER_FAILURE_PC, chipset_dev_no,
 				 DIAG_SEVERITY_ERR);
-		goto away;
+		goto away_register;
 	}
 
-	registered2 = true;
-	rc = 0;
+	list_add_tail(&dev->list_all, &list_all_device_instances);
+	return 0;
 
+away_register:
+	device_unregister(&dev->device);
 away:
-	if (rc < 0) {
-		if (registered2)
-			unregister_devmajorminor_attributes(dev);
-		if (gotten)
-			put_device(&dev->device);
-		kfree(dev);
-	} else {
-		list_add_tail(&dev->list_all, &list_all_device_instances);
-	}
+	put_device(&dev->device);
 	return rc;
 }
 
@@ -1056,21 +1023,6 @@ remove_visor_device(struct visor_device *dev)
 	device_unregister(&dev->device);
 }
 
-static struct visor_device *
-find_visor_device_by_channel(struct visorchannel *channel)
-{
-	struct list_head *listentry, *listtmp;
-
-	list_for_each_safe(listentry, listtmp, &list_all_device_instances) {
-		struct visor_device *dev = list_entry(listentry,
-						      struct visor_device,
-						      list_all);
-		if (dev->visorchannel == channel)
-			return dev;
-	}
-	return NULL;
-}
-
 static int
 get_vbus_header_info(struct visorchannel *chan,
 		     struct spar_vbus_headerinfo *hdr_info)
@@ -1342,25 +1294,16 @@ chipset_bus_destroy(struct visor_device *dev)
 }
 
 static void
-chipset_device_create(struct visorchipset_device_info *dev_info)
+chipset_device_create(struct visor_device *dev_info)
 {
-	struct visor_device *bdev;
 	int rc = -1;
-	u32 bus_no = dev_info->bus_no;
-	u32 dev_no = dev_info->dev_no;
+	u32 bus_no = dev_info->chipset_bus_no;
+	u32 dev_no = dev_info->chipset_dev_no;
 
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
-	bdev = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
-	if (!bdev)
-		goto away;
-
-	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
-			 POSTCODE_SEVERITY_INFO);
-
-	rc = create_visor_device(bdev, dev_info);
-away:
+	rc = create_visor_device(dev_info);
 	if (rc < 0) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
@@ -1373,22 +1316,12 @@ away:
 }
 
 static void
-chipset_device_destroy(struct visorchipset_device_info *dev_info)
+chipset_device_destroy(struct visor_device *dev_info)
 {
-	struct visor_device *dev;
-	int rc = -1;
-
-	dev = find_visor_device_by_channel(dev_info->visorchannel);
-	if (!dev)
-		goto away;
-	rc = 0;
-away:
-	if (rc < 0)
-			return;
+	remove_visor_device(dev_info);
 
 	if (chipset_responders.device_destroy)
-		(*chipset_responders.device_destroy) (dev_info, rc);
-	remove_visor_device(dev);
+		(*chipset_responders.device_destroy) (dev_info, 0);
 }
 
 /* This is the callback function specified for a function driver, to
@@ -1396,11 +1329,8 @@ away:
  * completed.
  */
 static void
-pause_state_change_complete(struct visor_device *dev, int status,
-			    void *info)
+pause_state_change_complete(struct visor_device *dev, int status)
 {
-	struct visorchipset_device_info *dev_info = info;
-
 	if (!dev->pausing)
 			return;
 
@@ -1411,7 +1341,7 @@ pause_state_change_complete(struct visor_device *dev, int status,
 	/* Notify the chipset driver that the pause is complete, which
 	* will presumably want to send some sort of response to the
 	* initiator. */
-	(*chipset_responders.device_pause) (dev_info, status);
+	(*chipset_responders.device_pause) (dev, status);
 }
 
 /* This is the callback function specified for a function driver, to
@@ -1419,11 +1349,8 @@ pause_state_change_complete(struct visor_device *dev, int status,
  * completed.
  */
 static void
-resume_state_change_complete(struct visor_device *dev, int status,
-			     void *info)
+resume_state_change_complete(struct visor_device *dev, int status)
 {
-	struct visorchipset_device_info *dev_info = info;
-
 	if (!dev->resuming)
 			return;
 
@@ -1434,7 +1361,7 @@ resume_state_change_complete(struct visor_device *dev, int status,
 	/* Notify the chipset driver that the resume is complete,
 	 * which will presumably want to send some sort of response to
 	 * the initiator. */
-	(*chipset_responders.device_resume) (dev_info, status);
+	(*chipset_responders.device_resume) (dev, status);
 }
 
 /* Tell the subordinate function driver for a specific device to pause
@@ -1442,14 +1369,11 @@ resume_state_change_complete(struct visor_device *dev, int status,
  * callback function.
  */
 static void
-initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
-				     bool is_pause)
+initiate_chipset_device_pause_resume(struct visor_device *dev, bool is_pause)
 {
-	struct visor_device *dev = NULL;
 	int rc = -1, x;
 	struct visor_driver *drv = NULL;
-	void (*notify_func)(struct visorchipset_device_info *dev_info,
-			    int response) = NULL;
+	void (*notify_func)(struct visor_device *dev, int response) = NULL;
 
 	if (is_pause)
 		notify_func = chipset_responders.device_pause;
@@ -1458,10 +1382,6 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 	if (!notify_func)
 			goto away;
 
-	dev = find_visor_device_by_channel(dev_info->visorchannel);
-	if (!dev)
-			goto away;
-
 	drv = to_visor_driver(dev->device.driver);
 	if (!drv)
 			goto away;
@@ -1481,7 +1401,7 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 				goto away;
 
 		dev->pausing = true;
-		x = drv->pause(dev, pause_state_change_complete, (void *)dev_info);
+		x = drv->pause(dev, pause_state_change_complete);
 	} else {
 		/* This should be done at BUS resume time, but an
 		 * existing problem prevents us from ever getting a bus
@@ -1493,7 +1413,7 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 				goto away;
 
 		dev->resuming = true;
-		x = drv->resume(dev, resume_state_change_complete, (void *)dev_info);
+		x = drv->resume(dev, resume_state_change_complete);
 	}
 	if (x < 0) {
 		if (is_pause)
@@ -1506,18 +1426,18 @@ initiate_chipset_device_pause_resume(struct visorchipset_device_info *dev_info,
 away:
 	if (rc < 0) {
 		if (notify_func)
-				(*notify_func)(dev_info, rc);
+				(*notify_func)(dev, rc);
 	}
 }
 
 static void
-chipset_device_pause(struct visorchipset_device_info *dev_info)
+chipset_device_pause(struct visor_device *dev_info)
 {
 	initiate_chipset_device_pause_resume(dev_info, true);
 }
 
 static void
-chipset_device_resume(struct visorchipset_device_info *dev_info)
+chipset_device_resume(struct visor_device *dev_info)
 {
 	initiate_chipset_device_pause_resume(dev_info, false);
 }
diff --git a/drivers/staging/unisys/visorbus/visorbus_private.h b/drivers/staging/unisys/visorbus/visorbus_private.h
index a3bfa38..2f12483 100644
--- a/drivers/staging/unisys/visorbus/visorbus_private.h
+++ b/drivers/staging/unisys/visorbus/visorbus_private.h
@@ -20,35 +20,10 @@
 
 #include <linux/uuid.h>
 
-#include "channel.h"
 #include "controlvmchannel.h"
 #include "vbusdeviceinfo.h"
 #include "vbushelper.h"
 
-struct visorchannel;
-
-/** Attributes for a particular Supervisor device.
- *  Any visorchipset client can query these attributes using
- *  visorchipset_get_client_device_info() or
- *  visorchipset_get_server_device_info().
- */
-struct visorchipset_device_info {
-	struct list_head entry;
-	u32 bus_no;
-	u32 dev_no;
-	uuid_le dev_inst_uuid;
-	struct visorchipset_state state;
-	struct visorchannel *visorchannel;
-	uuid_le channel_type_guid;
-	u32 reserved1;		/* control_vm_id */
-	u64 reserved2;
-	u32 switch_no;		/* when devState.attached==1 */
-	u32 internal_port_no;	/* when devState.attached==1 */
-	struct controlvm_message_header *pending_msg_hdr;/* CONTROLVM_MESSAGE */
-	/** For private use by the bus driver */
-	void *bus_driver_context;
-};
-
 /*  These functions will be called from within visorchipset when certain
  *  events happen.  (The implementation of these functions is outside of
  *  visorchipset.)
@@ -56,10 +31,10 @@ struct visorchipset_device_info {
 struct visorchipset_busdev_notifiers {
 	void (*bus_create)(struct visor_device *bus_info);
 	void (*bus_destroy)(struct visor_device *bus_info);
-	void (*device_create)(struct visorchipset_device_info *bus_info);
-	void (*device_destroy)(struct visorchipset_device_info *bus_info);
-	void (*device_pause)(struct visorchipset_device_info *bus_info);
-	void (*device_resume)(struct visorchipset_device_info *bus_info);
+	void (*device_create)(struct visor_device *bus_info);
+	void (*device_destroy)(struct visor_device *bus_info);
+	void (*device_pause)(struct visor_device *bus_info);
+	void (*device_resume)(struct visor_device *bus_info);
 };
 
 /*  These functions live inside visorchipset, and will be called to indicate
@@ -71,10 +46,10 @@ struct visorchipset_busdev_notifiers {
 struct visorchipset_busdev_responders {
 	void (*bus_create)(struct visor_device *p, int response);
 	void (*bus_destroy)(struct visor_device *p, int response);
-	void (*device_create)(struct visorchipset_device_info *p, int response);
-	void (*device_destroy)(struct visorchipset_device_info *p, int response);
-	void (*device_pause)(struct visorchipset_device_info *p, int response);
-	void (*device_resume)(struct visorchipset_device_info *p, int response);
+	void (*device_create)(struct visor_device *p, int response);
+	void (*device_destroy)(struct visor_device *p, int response);
+	void (*device_pause)(struct visor_device *p, int response);
+	void (*device_resume)(struct visor_device *p, int response);
 };
 
 /** Register functions (in the bus driver) to get called by visorchipset
@@ -88,13 +63,6 @@ visorchipset_register_busdev(
 			struct visorchipset_busdev_responders *responders,
 			struct ultra_vbus_deviceinfo *driver_info);
 
-bool visorchipset_get_bus_info(u32 bus_no,
-			       struct visor_device *bus_info);
-bool visorchipset_get_device_info(u32 bus_no, u32 dev_no,
-				  struct visorchipset_device_info *dev_info);
-bool visorchipset_set_bus_context(struct visor_device *bus_info,
-				  void *context);
-
 /* visorbus init and exit functions */
 int visorbus_init(void);
 void visorbus_exit(void);
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c
index 5c29377..9689cfb 100644
--- a/drivers/staging/unisys/visorbus/visorchipset.c
+++ b/drivers/staging/unisys/visorbus/visorchipset.c
@@ -230,11 +230,11 @@ static struct visorchipset_busdev_notifiers busdev_notifiers;
 
 static void bus_create_response(struct visor_device *p, int response);
 static void bus_destroy_response(struct visor_device *p, int response);
-static void device_create_response(struct visorchipset_device_info *p, int response);
-static void device_destroy_response(struct visorchipset_device_info *p, int response);
-static void device_resume_response(struct visorchipset_device_info *p, int response);
+static void device_create_response(struct visor_device *p, int response);
+static void device_destroy_response(struct visor_device *p, int response);
+static void device_resume_response(struct visor_device *p, int response);
 
-static void visorchipset_device_pause_response(struct visorchipset_device_info *p,
+static void visorchipset_device_pause_response(struct visor_device *p,
 					       int response);
 
 static struct visorchipset_busdev_responders busdev_responders = {
@@ -692,15 +692,6 @@ static ssize_t remaining_steps_store(struct device *dev,
 	return count;
 }
 
-static void
-dev_info_clear(void *v)
-{
-	struct visorchipset_device_info *p =
-		(struct visorchipset_device_info *) v;
-
-	memset(p, 0, sizeof(struct visorchipset_device_info));
-}
-
 struct visor_busdev {
 	u32 bus_no;
 	u32 dev_no;
@@ -740,31 +731,6 @@ struct visor_device *visorbus_get_device_by_id(u32 bus_no, u32 dev_no,
 }
 EXPORT_SYMBOL(visorbus_get_device_by_id);
 
-static struct visorchipset_device_info *
-device_find(struct list_head *list, u32 bus_no, u32 dev_no)
-{
-	struct visorchipset_device_info *p;
-
-	list_for_each_entry(p, list, entry) {
-		if (p->bus_no == bus_no && p->dev_no == dev_no)
-			return p;
-	}
-
-	return NULL;
-}
-
-static void busdevices_del(struct list_head *list, u32 bus_no)
-{
-	struct visorchipset_device_info *p, *tmp;
-
-	list_for_each_entry_safe(p, tmp, list, entry) {
-		if (p->bus_no == bus_no) {
-			list_del(&p->entry);
-			kfree(p);
-		}
-	}
-}
-
 static u8
 check_chipset_events(void)
 {
@@ -811,18 +777,6 @@ visorchipset_register_busdev(
 EXPORT_SYMBOL_GPL(visorchipset_register_busdev);
 
 static void
-cleanup_controlvm_structures(void)
-{
-	struct visorchipset_device_info *di, *tmp_di;
-
-	list_for_each_entry_safe(di, tmp_di, &dev_info_list, entry) {
-		dev_info_clear(di);
-		list_del(&di->entry);
-		kfree(di);
-	}
-}
-
-static void
 chipset_init(struct controlvm_message *inmsg)
 {
 	static int chipset_inited;
@@ -848,8 +802,6 @@ chipset_init(struct controlvm_message *inmsg)
 	features |= ULTRA_CHIPSET_FEATURE_REPLY;
 
 cleanup:
-	if (rc < 0)
-		cleanup_controlvm_structures();
 	if (inmsg->hdr.flags.response_expected)
 		controlvm_respond_chipset_init(&inmsg->hdr, rc, features);
 }
@@ -943,12 +895,12 @@ bus_responder(enum controlvm_id cmd_id,
 
 static void
 device_changestate_responder(enum controlvm_id cmd_id,
-			     struct visorchipset_device_info *p, int response,
+			     struct visor_device *p, int response,
 			     struct spar_segment_state response_state)
 {
 	struct controlvm_message outmsg;
-	u32 bus_no = p->bus_no;
-	u32 dev_no = p->dev_no;
+	u32 bus_no = p->chipset_bus_no;
+	u32 dev_no = p->chipset_dev_no;
 
 	if (p->pending_msg_hdr == NULL)
 		return;		/* no controlvm response needed */
@@ -1049,15 +1001,15 @@ away:
 }
 
 static void
-device_epilog(struct visorchipset_device_info *dev_info,
+device_epilog(struct visor_device *dev_info,
 	      struct spar_segment_state state, u32 cmd,
 	      struct controlvm_message_header *msg_hdr, int response,
 	      bool need_response, bool for_visorbus)
 {
 	struct visorchipset_busdev_notifiers *notifiers;
 	bool notified = false;
-	u32 bus_no = dev_info->bus_no;
-	u32 dev_no = dev_info->dev_no;
+	u32 bus_no = dev_info->chipset_bus_no;
+	u32 dev_no = dev_info->chipset_dev_no;
 	struct controlvm_message_header *pmsg_hdr = NULL;
 
 	char *envp[] = {
@@ -1281,31 +1233,34 @@ my_device_create(struct controlvm_message *inmsg)
 	struct controlvm_message_packet *cmd = &inmsg->cmd;
 	u32 bus_no = cmd->create_device.bus_no;
 	u32 dev_no = cmd->create_device.dev_no;
-	struct visorchipset_device_info *dev_info;
+	struct visor_device *dev_info = NULL;
 	struct visor_device *bus_info;
 	struct visorchannel *visorchannel;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
-	dev_info = device_find(&dev_info_list, bus_no, dev_no);
-	if (dev_info && (dev_info->state.created == 1)) {
+	bus_info = visorbus_get_device_by_id(bus_no, BUS_ROOT_DEVICE, NULL);
+	if (!bus_info) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
-		rc = -CONTROLVM_RESP_ERROR_ALREADY_DONE;
+		rc = -CONTROLVM_RESP_ERROR_BUS_INVALID;
 		goto cleanup;
 	}
-	bus_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
-	if (!bus_info) {
+
+	if (bus_info->state.created == 0) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
 		rc = -CONTROLVM_RESP_ERROR_BUS_INVALID;
 		goto cleanup;
 	}
-	if (bus_info->state.created == 0) {
+
+	dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
+	if (dev_info && (dev_info->state.created == 1)) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
-		rc = -CONTROLVM_RESP_ERROR_BUS_INVALID;
+		rc = -CONTROLVM_RESP_ERROR_ALREADY_DONE;
 		goto cleanup;
 	}
+
 	dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL);
 	if (!dev_info) {
 		POSTCODE_LINUX_4(DEVICE_CREATE_FAILURE_PC, dev_no, bus_no,
@@ -1314,10 +1269,13 @@ my_device_create(struct controlvm_message *inmsg)
 		goto cleanup;
 	}
 
-	INIT_LIST_HEAD(&dev_info->entry);
-	dev_info->bus_no = bus_no;
-	dev_info->dev_no = dev_no;
-	dev_info->dev_inst_uuid = cmd->create_device.dev_inst_uuid;
+	dev_info->chipset_bus_no = bus_no;
+	dev_info->chipset_dev_no = dev_no;
+	dev_info->inst = cmd->create_device.dev_inst_uuid;
+
+	/* not sure where the best place to set the 'parent' */
+	dev_info->device.parent = &bus_info->device;
+
 	POSTCODE_LINUX_4(DEVICE_CREATE_ENTRY_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 
@@ -1335,7 +1293,6 @@ my_device_create(struct controlvm_message *inmsg)
 	}
 	dev_info->visorchannel = visorchannel;
 	dev_info->channel_type_guid = cmd->create_device.data_type_uuid;
-	list_add(&dev_info->entry, &dev_info_list);
 	POSTCODE_LINUX_4(DEVICE_CREATE_EXIT_PC, dev_no, bus_no,
 			 POSTCODE_SEVERITY_INFO);
 cleanup:
@@ -1357,10 +1314,10 @@ my_device_changestate(struct controlvm_message *inmsg)
 	u32 bus_no = cmd->device_change_state.bus_no;
 	u32 dev_no = cmd->device_change_state.dev_no;
 	struct spar_segment_state state = cmd->device_change_state.state;
-	struct visorchipset_device_info *dev_info;
+	struct visor_device *dev_info;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
-	dev_info = device_find(&dev_info_list, bus_no, dev_no);
+	dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
 	if (!dev_info) {
 		POSTCODE_LINUX_4(DEVICE_CHANGESTATE_FAILURE_PC, dev_no, bus_no,
 				 POSTCODE_SEVERITY_ERR);
@@ -1382,10 +1339,10 @@ my_device_destroy(struct controlvm_message *inmsg)
 	struct controlvm_message_packet *cmd = &inmsg->cmd;
 	u32 bus_no = cmd->destroy_device.bus_no;
 	u32 dev_no = cmd->destroy_device.dev_no;
-	struct visorchipset_device_info *dev_info;
+	struct visor_device *dev_info;
 	int rc = CONTROLVM_RESP_SUCCESS;
 
-	dev_info = device_find(&dev_info_list, bus_no, dev_no);
+	dev_info = visorbus_get_device_by_id(bus_no, dev_no, NULL);
 	if (!dev_info)
 		rc = -CONTROLVM_RESP_ERROR_DEVICE_INVALID;
 	else if (dev_info->state.created == 0)
@@ -2099,10 +2056,6 @@ bus_create_response(struct visor_device *bus_info, int response)
 {
 	if (response >= 0) {
 		bus_info->state.created = 1;
-	} else {
-		if (response != -CONTROLVM_RESP_ERROR_ALREADY_DONE)
-			/* undo the row we just created... */
-			busdevices_del(&dev_info_list, bus_info->chipset_bus_no);
 	}
 
 	bus_responder(CONTROLVM_BUS_CREATE, bus_info->pending_msg_hdr, response);
@@ -2118,12 +2071,10 @@ bus_destroy_response(struct visor_device *bus_info, int response)
 
 	kfree(bus_info->pending_msg_hdr);
 	bus_info->pending_msg_hdr = NULL;
-
-	busdevices_del(&dev_info_list, bus_info->chipset_bus_no);
 }
 
 static void
-device_create_response(struct visorchipset_device_info *dev_info, int response)
+device_create_response(struct visor_device *dev_info, int response)
 {
 	if (response >= 0)
 		dev_info->state.created = 1;
@@ -2131,22 +2082,19 @@ device_create_response(struct visorchipset_device_info *dev_info, int response)
 	device_responder(CONTROLVM_DEVICE_CREATE, dev_info->pending_msg_hdr, response);
 
 	kfree(dev_info->pending_msg_hdr);
-	dev_info->pending_msg_hdr = NULL;
 }
 
 static void
-device_destroy_response(struct visorchipset_device_info *dev_info, int response)
+device_destroy_response(struct visor_device *dev_info, int response)
 {
 	device_responder(CONTROLVM_DEVICE_DESTROY, dev_info->pending_msg_hdr, response);
 
 	kfree(dev_info->pending_msg_hdr);
 	dev_info->pending_msg_hdr = NULL;
-
-	dev_info_clear(dev_info);
 }
 
 static void
-visorchipset_device_pause_response(struct visorchipset_device_info *dev_info,
+visorchipset_device_pause_response(struct visor_device *dev_info,
 				   int response)
 {
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
@@ -2158,7 +2106,7 @@ visorchipset_device_pause_response(struct visorchipset_device_info *dev_info,
 }
 
 static void
-device_resume_response(struct visorchipset_device_info *dev_info, int response)
+device_resume_response(struct visor_device *dev_info, int response)
 {
 	device_changestate_responder(CONTROLVM_DEVICE_CHANGESTATE,
 				     dev_info, response,
@@ -2168,29 +2116,6 @@ device_resume_response(struct visorchipset_device_info *dev_info, int response)
 	dev_info->pending_msg_hdr = NULL;
 }
 
-bool
-visorchipset_get_device_info(u32 bus_no, u32 dev_no,
-			     struct visorchipset_device_info *dev_info)
-{
-	void *p = device_find(&dev_info_list, bus_no, dev_no);
-
-	if (!p)
-		return false;
-	memcpy(dev_info, p, sizeof(struct visorchipset_device_info));
-	return true;
-}
-EXPORT_SYMBOL_GPL(visorchipset_get_device_info);
-
-bool
-visorchipset_set_device_context(struct visorchipset_device_info *p, void *context)
-{
-	if (!p)
-		return false;
-	p->bus_driver_context = context;
-	return true;
-}
-EXPORT_SYMBOL_GPL(visorchipset_set_device_context);
-
 static ssize_t chipsetready_store(struct device *dev,
 				  struct device_attribute *attr,
 				  const char *buf, size_t count)
@@ -2464,8 +2389,6 @@ visorchipset_exit(struct acpi_device *acpi_device)
 	periodic_controlvm_workqueue = NULL;
 	destroy_controlvm_payload_info(&controlvm_payload_info);
 
-	cleanup_controlvm_structures();
-
 	memset(&g_chipset_msg_hdr, 0, sizeof(struct controlvm_message_header));
 
 	visorchannel_destroy(controlvm_channel);
-- 
2.1.0

^ permalink raw reply related	[flat|nested] 57+ messages in thread

* Re: [PATCH 32/44] staging: unisys: Move channel creation up the stack
  2015-05-18 15:20     ` Don Zickus
@ 2015-05-18 15:53       ` Dan Carpenter
  0 siblings, 0 replies; 57+ messages in thread
From: Dan Carpenter @ 2015-05-18 15:53 UTC (permalink / raw)
  To: Don Zickus
  Cc: gregkh, Benjamin Romer, sparmaintainer, driverdev-devel, Jes.Sorensen

On Mon, May 18, 2015 at 11:20:27AM -0400, Don Zickus wrote:

> What might be confusing you is the bus_info = bus_find() command above.

Yes.  You are right.  This was where I got confused.  Was in too much of
a hurry.  Sorry about that.

regards,
dan carpenter

_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [PATCH 13/44] staging: unisys: Move files out of common-spar
  2015-05-13 17:22 ` [PATCH 13/44] staging: unisys: Move files out of common-spar Benjamin Romer
@ 2015-05-24 20:28   ` Greg KH
  0 siblings, 0 replies; 57+ messages in thread
From: Greg KH @ 2015-05-24 20:28 UTC (permalink / raw)
  To: Benjamin Romer; +Cc: Jes.Sorensen, sparmaintainer, driverdev-devel

On Wed, May 13, 2015 at 01:22:07PM -0400, Benjamin Romer wrote:
> From: David Kershner <david.kershner@unisys.com>
> 
> Move last three files out of common-spar
> 
> iochannel.h --> include (will be used by visorhba and visornic)
> version.h --> moved to include
> controlvmcompletionstatus.h --> moved to visorbus, part of
> 		controlvmchannel.h
> 
> Signed-off-by: David Kershner <david.kershner@unisys.com>
> Signed-off-by: Benjamin Romer <benjamin.romer@unisys.com>
> ---
>  .../common-spar/include/channels/iochannel.h       | 651 ---------------------
>  .../include/controlvmcompletionstatus.h            |  94 ---
>  .../staging/unisys/common-spar/include/version.h   |  45 --
>  drivers/staging/unisys/include/iochannel.h         | 651 +++++++++++++++++++++
>  drivers/staging/unisys/include/version.h           |  45 ++
>  .../unisys/visorbus/controlvmcompletionstatus.h    |  94 +++
>  6 files changed, 790 insertions(+), 790 deletions(-)
>  delete mode 100644 drivers/staging/unisys/common-spar/include/channels/iochannel.h
>  delete mode 100644 drivers/staging/unisys/common-spar/include/controlvmcompletionstatus.h
>  delete mode 100644 drivers/staging/unisys/common-spar/include/version.h
>  create mode 100644 drivers/staging/unisys/include/iochannel.h
>  create mode 100644 drivers/staging/unisys/include/version.h
>  create mode 100644 drivers/staging/unisys/visorbus/controlvmcompletionstatus.h

In the future, please create patches with -m, so that we can see the
files being moved, not deleted and added.

thanks,

greg k-h
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply	[flat|nested] 57+ messages in thread

* Re: [PATCH 32/44 V2] staging: unisys: Move channel creation up the stack
  2015-05-18 15:23   ` [PATCH 32/44 V2] " Don Zickus
@ 2015-05-24 20:31     ` Greg KH
  0 siblings, 0 replies; 57+ messages in thread
From: Greg KH @ 2015-05-24 20:31 UTC (permalink / raw)
  To: Don Zickus
  Cc: Jes.Sorensen, benjamin.romer, driverdev-devel, dan.carpenter,
	sparmaintainer

On Mon, May 18, 2015 at 11:23:05AM -0400, Don Zickus wrote:
> Instead of creating a channel struct to temporarily hold the channel
> info and passing it through multiple functions until the device is
> created, just create the channel from the start.
> 
> This allows us to remove the channel_info struct.
> 
> I noticed 'chan_info.addr_type' was not being used, so I just deleted it.
> 
> Signed-off-by: Don Zickus <dzickus@redhat.com>
> 
> ---
> V2: Fix bus/dev_create error path by adding bus/dev_info = NULL (Dan Carpenter)

This patch doesn't apply to the tree, so something went wrong.  Please
fix it up and resend from here through the rest of the series, as I had
to stop at this patch.

thanks,

greg k-h
_______________________________________________
devel mailing list
devel@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

^ permalink raw reply	[flat|nested] 57+ messages in thread

end of thread, other threads:[~2015-05-24 20:31 UTC | newest]

Thread overview: 57+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-13 17:21 [PATCH 00/44] staging: unisys: continued rework of s-Par drivers Benjamin Romer
2015-05-13 17:21 ` [PATCH 01/44] staging: unisys: visorchipset_file_{init, cleanup}(): mark static Benjamin Romer
2015-05-13 17:21 ` [PATCH 02/44] staging: unisys: Remove unused visorchipset_save_message() Benjamin Romer
2015-05-13 17:21 ` [PATCH 03/44] staging: unisys: visorchipset_init(): Simplify initial checks Benjamin Romer
2015-05-13 17:21 ` [PATCH 04/44] staging: unisys: Remove unused livedump_info Benjamin Romer
2015-05-13 17:21 ` [PATCH 05/44] staging: unisys: Remove appos_subsystems.h Benjamin Romer
2015-05-13 17:22 ` [PATCH 06/44] staging: unisys: Include missing headers Benjamin Romer
2015-05-13 17:22 ` [PATCH 07/44] staging: unisys: Temporarily add visorbus/ ccflags Benjamin Romer
2015-05-13 17:22 ` [PATCH 08/44] staging: unisys: move hypervisor calls into visorbus Benjamin Romer
2015-05-13 17:22 ` [PATCH 09/44] staging: unisys: Move controlframework into controlvmchannel.h Benjamin Romer
2015-05-13 17:22 ` [PATCH 10/44] staging: unisys: Move channel.h to include. Controvlm to visorbus Benjamin Romer
2015-05-13 17:22 ` [PATCH 11/44] staging: unisys: vbuschannel belonsg " Benjamin Romer
2015-05-13 17:22 ` [PATCH 12/44] staging: unisys: Move diagchannel to include Benjamin Romer
2015-05-13 17:22 ` [PATCH 13/44] staging: unisys: Move files out of common-spar Benjamin Romer
2015-05-24 20:28   ` Greg KH
2015-05-13 17:22 ` [PATCH 14/44] staging: unisys: Get rid of references to common-spar Benjamin Romer
2015-05-13 17:22 ` [PATCH 15/44] staging: unisys: get rid of sparstop Benjamin Romer
2015-05-13 17:22 ` [PATCH 16/44] staging: unisys: remove remaining utility headers Benjamin Romer
2015-05-13 17:22 ` [PATCH 17/44] staging: unisys: Remove temporarily added visorbus/ include in Makefile Benjamin Romer
2015-05-13 17:22 ` [PATCH 18/44] staging: unisys: Embed struct device for easier handling of attr Benjamin Romer
2015-05-13 17:22 ` [PATCH 19/44] staging: unisys: Wire up proper device attr for bus Benjamin Romer
2015-05-13 17:22 ` [PATCH 20/44] staging: unisys: Move the visorbus device underneath devices Benjamin Romer
2015-05-13 17:22 ` [PATCH 21/44] staging: unisys: Properly move version file into bus attr Benjamin Romer
2015-05-13 17:22 ` [PATCH 22/44] staging: unisys: Remove dead kobj structs Benjamin Romer
2015-05-13 17:22 ` [PATCH 23/44] staging: unisys: Clean up device sysfs attributes Benjamin Romer
2015-05-13 17:22 ` [PATCH 24/44] staging: unisys: Prep for removing 'info' structs Benjamin Romer
2015-05-13 17:22 ` [PATCH 25/44] staging: unisys: Add visor device find routine Benjamin Romer
2015-05-13 17:22 ` [PATCH 26/44] staging: unisys: Add a function to set the clientpartition Benjamin Romer
2015-05-13 17:22 ` [PATCH 27/44] staging: unisys: Add checks for creation Benjamin Romer
2015-05-13 17:22 ` [PATCH 28/44] staging: unisys: Remove unused intr Benjamin Romer
2015-05-13 17:22 ` [PATCH 29/44] staging: unisys: Convert the device attributes to visor_device Benjamin Romer
2015-05-13 17:22 ` [PATCH 30/44] staging: unisys: Convert bus functions to pass bus_info pointer around Benjamin Romer
2015-05-13 17:22 ` [PATCH 31/44] staging: unisys: Convert device functions to pass dev_info " Benjamin Romer
2015-05-13 17:22 ` [PATCH 32/44] staging: unisys: Move channel creation up the stack Benjamin Romer
2015-05-16 11:38   ` Dan Carpenter
2015-05-18 15:20     ` Don Zickus
2015-05-18 15:53       ` Dan Carpenter
2015-05-18 15:23   ` [PATCH 32/44 V2] " Don Zickus
2015-05-24 20:31     ` Greg KH
2015-05-13 17:22 ` [PATCH 33/44] staging: unisys: Convert pending_msg_hdr to a pointer Benjamin Romer
2015-05-13 17:22 ` [PATCH 34/44] staging: unisys: Prepare vbus_hdr_info to be public Benjamin Romer
2015-05-16 11:22   ` Dan Carpenter
2015-05-18 14:52     ` Don Zickus
2015-05-18 15:09       ` Dan Carpenter
2015-05-13 17:22 ` [PATCH 35/44] staging: unisys: Migrate bus from devdata to visor_device Benjamin Romer
2015-05-13 17:22 ` [PATCH 36/44] staging: unisys: Remove unused cruft Benjamin Romer
2015-05-13 17:22 ` [PATCH 37/44] staging: unisys: Remove server flags Benjamin Romer
2015-05-13 17:22 ` [PATCH 38/44] staging: unisys: Do not use 0 as the default bus root device number Benjamin Romer
2015-05-13 17:22 ` [PATCH 39/44] staging: unisys: Convert bus creation to use visor_device Benjamin Romer
2015-05-13 17:22 ` [PATCH 40/44] staging: unisys: Convert device " Benjamin Romer
2015-05-16 11:32   ` Dan Carpenter
2015-05-18 15:01     ` Don Zickus
2015-05-18 15:23   ` [PATCH 40/44 V2] " Don Zickus
2015-05-13 17:22 ` [PATCH 41/44] staging: unisys: Removed unused entries from struct visor_channeltype_descriptor Benjamin Romer
2015-05-13 17:22 ` [PATCH 42/44] staging: unisys: Update diag serverity enum Benjamin Romer
2015-05-13 17:22 ` [PATCH 43/44] staging: unisys: Remove unneeded fields in diagchannel.h Benjamin Romer
2015-05-13 17:22 ` [PATCH 44/44] staging: unisys: Clean up diag_serverity enum Benjamin Romer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.