diff options
Diffstat (limited to 'drivers/base/firmware_class.c')
| -rw-r--r-- | drivers/base/firmware_class.c | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/drivers/base/firmware_class.c b/drivers/base/firmware_class.c index 55d682e6ece..d7872b96019 100644 --- a/drivers/base/firmware_class.c +++ b/drivers/base/firmware_class.c @@ -884,8 +884,15 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent,  		goto err_del_dev;  	} +	mutex_lock(&fw_lock); +	list_add(&buf->pending_list, &pending_fw_head); +	mutex_unlock(&fw_lock); +  	retval = device_create_file(f_dev, &dev_attr_loading);  	if (retval) { +		mutex_lock(&fw_lock); +		list_del_init(&buf->pending_list); +		mutex_unlock(&fw_lock);  		dev_err(f_dev, "%s: device_create_file failed\n", __func__);  		goto err_del_bin_attr;  	} @@ -899,10 +906,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent,  		kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);  	} -	mutex_lock(&fw_lock); -	list_add(&buf->pending_list, &pending_fw_head); -	mutex_unlock(&fw_lock); -  	wait_for_completion(&buf->completion);  	cancel_delayed_work_sync(&fw_priv->timeout_work);  |