/* Process SET PGID request result for a single path.  */
static void spid_callback(struct ccw_device *cdev, void *data, int rc)
/* Process SET PGID request result for a single path.  */
static void spid_callback(struct ccw_device *cdev, void *data, int rc)
{
	struct subchannel *sch = to_subchannel(cdev->dev.parent);
	struct ccw_request *req = &cdev->private->req;
	switch (rc) {
	case 0:
		sch->vpm |= req->lpm & sch->opm;
		break;
	case -EACCES:
		break;
	case -EOPNOTSUPP:
		if (cdev->private->flags.mpath) {
			cdev->private->flags.mpath = 0;
			goto out_restart;
		}
		cdev->private->flags.pgroup = 0;
		goto out_restart;
	default:
		goto err;
	}
	req->lpm >>= 1;
	spid_do(cdev);
	return;
out_restart:
	verify_start(cdev);
	return;
err:
	verify_done(cdev, rc);
}