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

Commit 3f722712 authored by Luis R. Rodriguez's avatar Luis R. Rodriguez Committed by Greg Kroah-Hartman
Browse files

firmware: replace #ifdef over FW_OPT_FALLBACK with function checks



Its not easy to follow the logic behind making FW_OPT_FALLBACK map
to an existing flag only if a kernel configuration option was set.
Its much easier to retpresent what was intended with function helpers
which make it clear that if CONFIG_FW_LOADER_USER_HELPER_FALLBACK is
set we force running the fallback mechanism unless a caller specifically
never wants to run it, such as request_firmware_direct().

Prior and after this change we upkeep the tradition:

CONFIG_FW_LOADER_USER_HELPER_FALLBACK
	request_firmware() force fallback
	request_firmware_into_buf() force fallback
	request_firmware_nowait() force fallback
	request_firmware_direct() always ignore fallback

!CONFIG_FW_LOADER_USER_HELPER_FALLBACK
	request_firmware() ignore fallback
	request_firmware_into_buf() ignore fallback
	request_firmware_nowait() depends on uevent flag
	request_firmware_direct() always ignore fallback

Signed-off-by: default avatarLuis R. Rodriguez <mcgrof@kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 25d39131
Loading
Loading
Loading
Loading
+29 −11
Original line number Diff line number Diff line
@@ -62,13 +62,9 @@ struct fw_state {
#define FW_OPT_UEVENT	(1U << 0)
#define FW_OPT_NOWAIT	(1U << 1)
#define FW_OPT_USERHELPER	(1U << 2)
#ifdef CONFIG_FW_LOADER_USER_HELPER_FALLBACK
#define FW_OPT_FALLBACK		FW_OPT_USERHELPER
#else
#define FW_OPT_FALLBACK		0
#endif
#define FW_OPT_NO_WARN	(1U << 3)
#define FW_OPT_NOCACHE	(1U << 4)
#define FW_OPT_NOFALLBACK (1U << 5)

struct firmware_cache {
	/* firmware_buf instance will be added into the below list */
@@ -1154,12 +1150,34 @@ static int fw_load_from_user_helper(struct firmware *firmware,
	return ret;
}

#ifdef CONFIG_FW_LOADER_USER_HELPER_FALLBACK
static bool fw_force_sysfs_fallback(unsigned int opt_flags)
{
	return true;
}
#else
static bool fw_force_sysfs_fallback(unsigned int opt_flags)
{
	if (!(opt_flags & FW_OPT_USERHELPER))
		return false;
	return true;
}
#endif

static bool fw_run_sysfs_fallback(unsigned int opt_flags)
{
	if ((opt_flags & FW_OPT_NOFALLBACK))
		return false;

	return fw_force_sysfs_fallback(opt_flags);
}

static int fw_sysfs_fallback(struct firmware *fw, const char *name,
			    struct device *device,
			    unsigned int opt_flags,
			    int ret)
{
	if (!(opt_flags & FW_OPT_USERHELPER))
	if (!fw_run_sysfs_fallback(opt_flags))
		return ret;

	dev_warn(device, "Falling back to user helper\n");
@@ -1326,7 +1344,7 @@ request_firmware(const struct firmware **firmware_p, const char *name,
	/* Need to pin this module until return */
	__module_get(THIS_MODULE);
	ret = _request_firmware(firmware_p, name, device, NULL, 0,
				FW_OPT_UEVENT | FW_OPT_FALLBACK);
				FW_OPT_UEVENT);
	module_put(THIS_MODULE);
	return ret;
}
@@ -1350,7 +1368,8 @@ int request_firmware_direct(const struct firmware **firmware_p,

	__module_get(THIS_MODULE);
	ret = _request_firmware(firmware_p, name, device, NULL, 0,
				FW_OPT_UEVENT | FW_OPT_NO_WARN);
				FW_OPT_UEVENT | FW_OPT_NO_WARN |
				FW_OPT_NOFALLBACK);
	module_put(THIS_MODULE);
	return ret;
}
@@ -1379,8 +1398,7 @@ request_firmware_into_buf(const struct firmware **firmware_p, const char *name,

	__module_get(THIS_MODULE);
	ret = _request_firmware(firmware_p, name, device, buf, size,
				FW_OPT_UEVENT | FW_OPT_FALLBACK |
				FW_OPT_NOCACHE);
				FW_OPT_UEVENT | FW_OPT_NOCACHE);
	module_put(THIS_MODULE);
	return ret;
}
@@ -1472,7 +1490,7 @@ request_firmware_nowait(
	fw_work->device = device;
	fw_work->context = context;
	fw_work->cont = cont;
	fw_work->opt_flags = FW_OPT_NOWAIT | FW_OPT_FALLBACK |
	fw_work->opt_flags = FW_OPT_NOWAIT |
		(uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER);

	if (!try_module_get(module)) {