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

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
...@@ -62,13 +62,9 @@ struct fw_state { ...@@ -62,13 +62,9 @@ struct fw_state {
#define FW_OPT_UEVENT (1U << 0) #define FW_OPT_UEVENT (1U << 0)
#define FW_OPT_NOWAIT (1U << 1) #define FW_OPT_NOWAIT (1U << 1)
#define FW_OPT_USERHELPER (1U << 2) #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_NO_WARN (1U << 3)
#define FW_OPT_NOCACHE (1U << 4) #define FW_OPT_NOCACHE (1U << 4)
#define FW_OPT_NOFALLBACK (1U << 5)
struct firmware_cache { struct firmware_cache {
/* firmware_buf instance will be added into the below list */ /* firmware_buf instance will be added into the below list */
...@@ -1154,12 +1150,34 @@ static int fw_load_from_user_helper(struct firmware *firmware, ...@@ -1154,12 +1150,34 @@ static int fw_load_from_user_helper(struct firmware *firmware,
return ret; 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, static int fw_sysfs_fallback(struct firmware *fw, const char *name,
struct device *device, struct device *device,
unsigned int opt_flags, unsigned int opt_flags,
int ret) int ret)
{ {
if (!(opt_flags & FW_OPT_USERHELPER)) if (!fw_run_sysfs_fallback(opt_flags))
return ret; return ret;
dev_warn(device, "Falling back to user helper\n"); dev_warn(device, "Falling back to user helper\n");
...@@ -1326,7 +1344,7 @@ request_firmware(const struct firmware **firmware_p, const char *name, ...@@ -1326,7 +1344,7 @@ request_firmware(const struct firmware **firmware_p, const char *name,
/* Need to pin this module until return */ /* Need to pin this module until return */
__module_get(THIS_MODULE); __module_get(THIS_MODULE);
ret = _request_firmware(firmware_p, name, device, NULL, 0, ret = _request_firmware(firmware_p, name, device, NULL, 0,
FW_OPT_UEVENT | FW_OPT_FALLBACK); FW_OPT_UEVENT);
module_put(THIS_MODULE); module_put(THIS_MODULE);
return ret; return ret;
} }
...@@ -1350,7 +1368,8 @@ int request_firmware_direct(const struct firmware **firmware_p, ...@@ -1350,7 +1368,8 @@ int request_firmware_direct(const struct firmware **firmware_p,
__module_get(THIS_MODULE); __module_get(THIS_MODULE);
ret = _request_firmware(firmware_p, name, device, NULL, 0, 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); module_put(THIS_MODULE);
return ret; return ret;
} }
...@@ -1379,8 +1398,7 @@ request_firmware_into_buf(const struct firmware **firmware_p, const char *name, ...@@ -1379,8 +1398,7 @@ request_firmware_into_buf(const struct firmware **firmware_p, const char *name,
__module_get(THIS_MODULE); __module_get(THIS_MODULE);
ret = _request_firmware(firmware_p, name, device, buf, size, ret = _request_firmware(firmware_p, name, device, buf, size,
FW_OPT_UEVENT | FW_OPT_FALLBACK | FW_OPT_UEVENT | FW_OPT_NOCACHE);
FW_OPT_NOCACHE);
module_put(THIS_MODULE); module_put(THIS_MODULE);
return ret; return ret;
} }
...@@ -1472,7 +1490,7 @@ request_firmware_nowait( ...@@ -1472,7 +1490,7 @@ request_firmware_nowait(
fw_work->device = device; fw_work->device = device;
fw_work->context = context; fw_work->context = context;
fw_work->cont = cont; 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); (uevent ? FW_OPT_UEVENT : FW_OPT_USERHELPER);
if (!try_module_get(module)) { if (!try_module_get(module)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment