OSDN Git Service

staging: unisys: visorbus: add error handling to initiate_chipset_device_pause_resume
authorDavid Kershner <david.kershner@unisys.com>
Tue, 28 Mar 2017 13:34:53 +0000 (09:34 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Mar 2017 07:17:03 +0000 (09:17 +0200)
Clean up the function to remove some if statments that should be done
in the calling function.

Signed-off-by: David Kershner <david.kershner@unisys.com>
Reviewed-by: Reviewed-by: Tim Sell <timothy.sell@unisys.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/unisys/visorbus/visorbus_main.c

index 0aa731d..58e4009 100644 (file)
@@ -1199,62 +1199,38 @@ resume_state_change_complete(struct visor_device *dev, int status)
  * via a callback function; see pause_state_change_complete() and
  * resume_state_change_complete().
  */
-static void
+static int
 initiate_chipset_device_pause_resume(struct visor_device *dev, bool is_pause)
 {
-       int rc;
+       int err;
        struct visor_driver *drv = NULL;
-       void (*notify_func)(struct visor_device *dev, int response) = NULL;
-
-       if (is_pause)
-               notify_func = device_pause_response;
-       else
-               notify_func = device_resume_response;
-       if (!notify_func)
-               return;
 
        drv = to_visor_driver(dev->device.driver);
-       if (!drv) {
-               (*notify_func)(dev, -ENODEV);
-               return;
-       }
+       if (!drv)
+               return -ENODEV;
 
-       if (dev->pausing || dev->resuming) {
-               (*notify_func)(dev, -EBUSY);
-               return;
-       }
+       if (dev->pausing || dev->resuming)
+               return -EBUSY;
 
        if (is_pause) {
-               if (!drv->pause) {
-                       (*notify_func)(dev, -EINVAL);
-                       return;
-               }
+               if (!drv->pause)
+                       return -EINVAL;
 
                dev->pausing = true;
-               rc = drv->pause(dev, pause_state_change_complete);
+               err = 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
-                * resume...  This hack would fail to work should we
-                * ever have a bus that contains NO devices, since we
-                * would never even get here in that case.
+               /* The vbus_dev_info structure in the channel was been
+                * cleared, make sure it is valid.
                 */
                fix_vbus_dev_info(dev);
-               if (!drv->resume) {
-                       (*notify_func)(dev, -EINVAL);
-                       return;
-               }
+               if (!drv->resume)
+                       return -EINVAL;
 
                dev->resuming = true;
-               rc = drv->resume(dev, resume_state_change_complete);
-       }
-       if (rc < 0) {
-               if (is_pause)
-                       dev->pausing = false;
-               else
-                       dev->resuming = false;
-               (*notify_func)(dev, -EINVAL);
+               err = drv->resume(dev, resume_state_change_complete);
        }
+
+       return err;
 }
 
 /**
@@ -1268,7 +1244,14 @@ initiate_chipset_device_pause_resume(struct visor_device *dev, bool is_pause)
 void
 chipset_device_pause(struct visor_device *dev_info)
 {
-       initiate_chipset_device_pause_resume(dev_info, true);
+       int err;
+
+       err = initiate_chipset_device_pause_resume(dev_info, true);
+
+       if (err < 0) {
+               dev_info->pausing = false;
+               device_pause_response(dev_info, err);
+       }
 }
 
 /**
@@ -1282,7 +1265,14 @@ chipset_device_pause(struct visor_device *dev_info)
 void
 chipset_device_resume(struct visor_device *dev_info)
 {
-       initiate_chipset_device_pause_resume(dev_info, false);
+       int err;
+
+       err = initiate_chipset_device_pause_resume(dev_info, false);
+
+       if (err < 0) {
+               device_resume_response(dev_info, err);
+               dev_info->resuming = false;
+       }
 }
 
 int