staging: unisys: visorbus: fix double response
authorDavid Kershner <david.kershner@unisys.com>
Thu, 3 Nov 2016 15:44:18 +0000 (11:44 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 7 Nov 2016 09:56:39 +0000 (10:56 +0100)
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>
drivers/staging/unisys/visorbus/visorchipset.c

index 0cd4ae2570e34ca5aa53ed9186f631098117d955..7e2004f5935ad207043fe6f3eb614a81c6ad5e4e 100644 (file)
@@ -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: