Commit 15d9ce9d authored by David Kershner's avatar David Kershner Committed by Greg Kroah-Hartman
Browse files

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: default avatarDavid Kershner <david.kershner@unisys.com>
Reviewed-by: default avatarReviewed-by: Tim Sell <timothy.sell@unisys.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 293deb2c
Loading
Loading
Loading
Loading
+32 −42
Original line number Diff line number Diff line
@@ -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