]> git.hungrycats.org Git - linux/commitdiff
[PATCH] firmware loader: delay firmware hotplug event
authorAndrew Morton <akpm@osdl.org>
Mon, 1 Mar 2004 15:06:43 +0000 (07:06 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Mon, 1 Mar 2004 15:06:43 +0000 (07:06 -0800)
From: Dmitry Torokhov <dtor_core@ameritech.net>

Do not call hotplug until firmware class device is completely instantiated.

drivers/base/firmware_class.c

index 81609ffbd1d7ddbcf25f741729287714955afb99..696038e7b34c65073dba19bdf2d2e6bee8233b32 100644 (file)
@@ -27,6 +27,7 @@ enum {
        FW_STATUS_LOADING,
        FW_STATUS_DONE,
        FW_STATUS_ABORT,
+       FW_STATUS_READY,
 };
 
 static int loading_timeout = 10;       /* In seconds */
@@ -96,6 +97,9 @@ firmware_class_hotplug(struct class_device *class_dev, char **envp,
        int i = 0;
        char *scratch = buffer;
 
+       if (!test_bit(FW_STATUS_READY, &fw_priv->status))
+               return -ENODEV;
+
        if (buffer_size < (FIRMWARE_NAME_MAX + 10))
                return -ENOMEM;
        if (num_envp < 1)
@@ -362,6 +366,7 @@ fw_setup_class_device(struct firmware *fw, struct class_device **class_dev_p,
                goto error_unreg;
        }
 
+       set_bit(FW_STATUS_READY, &fw_priv->status);
        *class_dev_p = class_dev;
        goto out;
 
@@ -415,6 +420,7 @@ request_firmware(const struct firmware **firmware_p, const char *name,
                add_timer(&fw_priv->timeout);
        }
 
+       kobject_hotplug("add", &class_dev->kobj);
        wait_for_completion(&fw_priv->completion);
        set_bit(FW_STATUS_DONE, &fw_priv->status);