diff options
author | David Kershner <david.kershner@unisys.com> | 2017-03-28 09:34:53 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-29 09:17:03 +0200 |
commit | 15d9ce9d3797fdb9eb90fd229cdd51d906eeaaec (patch) | |
tree | 2608aa146166df1c01a226c4fd9cb29f83ea0398 /drivers/staging/unisys | |
parent | 293deb2c0ca4f541b1bed06c1f5dd25cdb60a2d8 (diff) |
staging: unisys: visorbus: add error handling to initiate_chipset_device_pause_resume
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>
Diffstat (limited to 'drivers/staging/unisys')
-rw-r--r-- | drivers/staging/unisys/visorbus/visorbus_main.c | 74 |
1 files changed, 32 insertions, 42 deletions
diff --git a/drivers/staging/unisys/visorbus/visorbus_main.c b/drivers/staging/unisys/visorbus/visorbus_main.c index 0aa731d09c1f..58e4009ae21f 100644 --- a/drivers/staging/unisys/visorbus/visorbus_main.c +++ b/drivers/staging/unisys/visorbus/visorbus_main.c @@ -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 |