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:
Родитель
25d3913181
Коммит
3f72271233
|
@ -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)) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче