From f3628ed854809105b902ed52f024e562bcf6ee27 Mon Sep 17 00:00:00 2001 From: Johannes Berg Date: Mon, 29 Mar 2010 17:57:20 +0200 Subject: [PATCH] --- yaml --- r: 196044 b: refs/heads/master c: e9045f9178f3e3445a3a5b85206f8681b3869562 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/base/firmware_class.c | 16 +++++++++++----- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index fc7d605b21f3..00b088d50fcf 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 1704f47b50b5d9e1b825e43e1baaf2c5897baf03 +refs/heads/master: e9045f9178f3e3445a3a5b85206f8681b3869562 diff --git a/trunk/drivers/base/firmware_class.c b/trunk/drivers/base/firmware_class.c index 8e6c62b4f512..d45d1e1c40a4 100644 --- a/trunk/drivers/base/firmware_class.c +++ b/trunk/drivers/base/firmware_class.c @@ -50,6 +50,7 @@ struct firmware_priv { int page_array_size; const char *vdata; struct timer_list timeout; + bool nowait; }; #ifdef CONFIG_FW_LOADER @@ -112,6 +113,8 @@ static int firmware_uevent(struct device *dev, struct kobj_uevent_env *env) return -ENOMEM; if (add_uevent_var(env, "TIMEOUT=%i", loading_timeout)) return -ENOMEM; + if (add_uevent_var(env, "ASYNC=%d", fw_priv->nowait)) + return -ENOMEM; return 0; } @@ -441,7 +444,7 @@ static int fw_register_device(struct device **dev_p, const char *fw_name, static int fw_setup_device(struct firmware *fw, struct device **dev_p, const char *fw_name, struct device *device, - int uevent) + int uevent, bool nowait) { struct device *f_dev; struct firmware_priv *fw_priv; @@ -457,6 +460,8 @@ static int fw_setup_device(struct firmware *fw, struct device **dev_p, fw_priv = dev_get_drvdata(f_dev); + fw_priv->nowait = nowait; + fw_priv->fw = fw; sysfs_bin_attr_init(&fw_priv->attr_data); retval = sysfs_create_bin_file(&f_dev->kobj, &fw_priv->attr_data); @@ -484,7 +489,7 @@ static int fw_setup_device(struct firmware *fw, struct device **dev_p, static int _request_firmware(const struct firmware **firmware_p, const char *name, - struct device *device, int uevent) + struct device *device, int uevent, bool nowait) { struct device *f_dev; struct firmware_priv *fw_priv; @@ -516,7 +521,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name, if (uevent) dev_dbg(device, "firmware: requesting %s\n", name); - retval = fw_setup_device(firmware, &f_dev, name, device, uevent); + retval = fw_setup_device(firmware, &f_dev, name, device, + uevent, nowait); if (retval) goto error_kfree_fw; @@ -573,7 +579,7 @@ request_firmware(const struct firmware **firmware_p, const char *name, struct device *device) { int uevent = 1; - return _request_firmware(firmware_p, name, device, uevent); + return _request_firmware(firmware_p, name, device, uevent, false); } /** @@ -619,7 +625,7 @@ request_firmware_work_func(void *arg) return 0; } ret = _request_firmware(&fw, fw_work->name, fw_work->device, - fw_work->uevent); + fw_work->uevent, true); fw_work->cont(fw, fw_work->context);