Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d510bdf authored by Halil Pasic's avatar Halil Pasic Committed by Greg Kroah-Hartman
Browse files

s390/zcrypt: enable AP bus scan without a valid default domain



[ Upstream commit 1c472d46283263497adccd7a0bec64ee2f9c09e5 ]

The AP bus scan is aborted before doing anything worth mentioning if
ap_select_domain() fails, e.g. if the ap_rights.aqm mask is all zeros.
As the result of this the ap bus fails to manage (e.g. create and
register) devices like it is supposed to.

Let us make ap_scan_bus() work even if ap_select_domain() can't select a
default domain. Let's also make ap_select_domain() return void, as there
are no more callers interested in its return value.

Signed-off-by: default avatarHalil Pasic <pasic@linux.ibm.com>
Reported-by: default avatarMichael Mueller <mimu@linux.ibm.com>
Fixes: 7e0bdbe5 "s390/zcrypt: AP bus support for alternate driver(s)"
[freude@linux.ibm.com: title and patch header slightly modified]
Signed-off-by: default avatarHarald Freudenberger <freude@linux.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 5e9923e8
Loading
Loading
Loading
Loading
+6 −12
Original line number Diff line number Diff line
@@ -1223,11 +1223,10 @@ static struct bus_attribute *const ap_bus_attrs[] = {
};

/**
 * ap_select_domain(): Select an AP domain.
 *
 * Pick one of the 16 AP domains.
 * ap_select_domain(): Select an AP domain if possible and we haven't
 * already done so before.
 */
static int ap_select_domain(void)
static void ap_select_domain(void)
{
	int count, max_count, best_domain;
	struct ap_queue_status status;
@@ -1242,7 +1241,7 @@ static int ap_select_domain(void)
	if (ap_domain_index >= 0) {
		/* Domain has already been selected. */
		spin_unlock_bh(&ap_domain_lock);
		return 0;
		return;
	}
	best_domain = -1;
	max_count = 0;
@@ -1269,11 +1268,8 @@ static int ap_select_domain(void)
	if (best_domain >= 0) {
		ap_domain_index = best_domain;
		AP_DBF(DBF_DEBUG, "new ap_domain_index=%d\n", ap_domain_index);
		spin_unlock_bh(&ap_domain_lock);
		return 0;
	}
	spin_unlock_bh(&ap_domain_lock);
	return -ENODEV;
}

/*
@@ -1351,8 +1347,7 @@ static void ap_scan_bus(struct work_struct *unused)
	AP_DBF(DBF_DEBUG, "%s running\n", __func__);

	ap_query_configuration(ap_configuration);
	if (ap_select_domain() != 0)
		goto out;
	ap_select_domain();

	for (id = 0; id < AP_DEVICES; id++) {
		/* check if device is registered */
@@ -1468,12 +1463,11 @@ static void ap_scan_bus(struct work_struct *unused)
		}
	} /* end device loop */

	if (defdomdevs < 1)
	if (ap_domain_index >= 0 && defdomdevs < 1)
		AP_DBF(DBF_INFO,
		       "no queue device with default domain %d available\n",
		       ap_domain_index);

out:
	mod_timer(&ap_config_timer, jiffies + ap_config_time * HZ);
}