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: Luis R. Rodriguez <mcgrof@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Luis R. Rodriguez 2017-11-20 10:23:58 -08:00 committed by Greg Kroah-Hartman
parent 25d3913181
commit 3f72271233
1 changed files with 29 additions and 11 deletions

View File

@ -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 @@ out_unlock:
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)) {