diff options
author | David Kershner <david.kershner@unisys.com> | 2016-11-03 11:44:18 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2016-11-07 10:56:39 +0100 |
commit | ca1cbf907092e447be7c16df48458c02e5358308 (patch) | |
tree | 27f459406f1373a977b9db4114c91e50b1ab9487 /drivers/staging/unisys | |
parent | c4fe36cd262d5fe710ff9ee43cb99337e8b050de (diff) | |
download | op-kernel-dev-ca1cbf907092e447be7c16df48458c02e5358308.zip op-kernel-dev-ca1cbf907092e447be7c16df48458c02e5358308.tar.gz |
staging: unisys: visorbus: fix double response
This patch addresses the problem that we were sending double responses
back to the s-Par Firmware when processing CONTROLVM Messages. Every
message responds individually and the epilog functions would send a
response as well.
Since a message could delay the response, it was decided to remove the
extra response from the epilog function.
Signed-off-by: David Kershner <david.kershner@unisys.com>
Reviewed-by: Tim Sell <Timothy.Sell@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/unisys')
-rw-r--r-- | drivers/staging/unisys/visorbus/visorchipset.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/drivers/staging/unisys/visorbus/visorchipset.c b/drivers/staging/unisys/visorbus/visorchipset.c index 0cd4ae2..7e2004f 100644 --- a/drivers/staging/unisys/visorbus/visorchipset.c +++ b/drivers/staging/unisys/visorbus/visorchipset.c @@ -728,12 +728,17 @@ bus_epilog(struct visor_device *bus_info, if (response == CONTROLVM_RESP_SUCCESS) { switch (cmd) { case CONTROLVM_BUS_CREATE: + /* chipset_bus_create is responsible to respond */ chipset_bus_create(bus_info); break; case CONTROLVM_BUS_DESTROY: + /* chipset_bus_destroy is responsible to respond */ chipset_bus_destroy(bus_info); break; + default: + goto out_respond; } + return; } out_respond: @@ -779,6 +784,7 @@ device_epilog(struct visor_device *dev_info, if (response >= 0) { switch (cmd) { case CONTROLVM_DEVICE_CREATE: + /* chipset_device_create is responsible to respond */ chipset_device_create(dev_info); break; case CONTROLVM_DEVICE_CHANGESTATE: @@ -786,6 +792,7 @@ device_epilog(struct visor_device *dev_info, if (state.alive == segment_state_running.alive && state.operating == segment_state_running.operating) { + /* chipset_device_resume will respond */ chipset_device_resume(dev_info); } /* ServerNotReady / ServerLost / SegmentStateStandby */ @@ -794,15 +801,20 @@ device_epilog(struct visor_device *dev_info, segment_state_standby.operating) { /* * technically this is standby case - * where server is lost + * where server is lost and + * chipset_device_pause will respond */ chipset_device_pause(dev_info); } break; case CONTROLVM_DEVICE_DESTROY: + /* chipset_device_destroy is responsible to respond */ chipset_device_destroy(dev_info); break; + default: + goto out_respond; } + return; } out_respond: |