]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
firmware: replace #ifdef over FW_OPT_FALLBACK with function checks
authorLuis R. Rodriguez <mcgrof@kernel.org>
Mon, 20 Nov 2017 18:23:58 +0000 (10:23 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Nov 2017 10:18:43 +0000 (11:18 +0100)
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>
drivers/base/firmware_class.c

index 3169914290321084c23e6a5e25b0c4be32982fd7..43b97a8137f7f3757b9ba4c28e05c54a7bc43595 100644 (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 @@ 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)) {