diff options
author | Luis R. Rodriguez <mcgrof@kernel.org> | 2017-11-20 10:23:58 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-11-29 11:18:43 +0100 |
commit | 3f72271233943c76a1686b3de4c5509e23993770 (patch) | |
tree | b800e56e46281c7c807fb5aac5e5b40152c3632f | |
parent | 25d3913181b3e397549cb6584d7ab1a37709d104 (diff) | |
download | linux-3f72271233943c76a1686b3de4c5509e23993770.tar.gz linux-3f72271233943c76a1686b3de4c5509e23993770.tar.bz2 linux-3f72271233943c76a1686b3de4c5509e23993770.zip |
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>
-rw-r--r-- | drivers/base/firmware_class.c | 40 |
1 files changed, 29 insertions, 11 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 316991429032..43b97a8137f7 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -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)) { |