diff options
Diffstat (limited to 'drivers/base/firmware_loader/main.c')
| -rw-r--r-- | drivers/base/firmware_loader/main.c | 35 | 
1 files changed, 22 insertions, 13 deletions
| diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c index 0943e7065e0e..8e9213b36e31 100644 --- a/drivers/base/firmware_loader/main.c +++ b/drivers/base/firmware_loader/main.c @@ -209,22 +209,28 @@ static struct fw_priv *__lookup_fw_priv(const char *fw_name)  static int alloc_lookup_fw_priv(const char *fw_name,  				struct firmware_cache *fwc,  				struct fw_priv **fw_priv, void *dbuf, -				size_t size) +				size_t size, enum fw_opt opt_flags)  {  	struct fw_priv *tmp;  	spin_lock(&fwc->lock); -	tmp = __lookup_fw_priv(fw_name); -	if (tmp) { -		kref_get(&tmp->ref); -		spin_unlock(&fwc->lock); -		*fw_priv = tmp; -		pr_debug("batched request - sharing the same struct fw_priv and lookup for multiple requests\n"); -		return 1; +	if (!(opt_flags & FW_OPT_NOCACHE)) { +		tmp = __lookup_fw_priv(fw_name); +		if (tmp) { +			kref_get(&tmp->ref); +			spin_unlock(&fwc->lock); +			*fw_priv = tmp; +			pr_debug("batched request - sharing the same struct fw_priv and lookup for multiple requests\n"); +			return 1; +		}  	} +  	tmp = __allocate_fw_priv(fw_name, fwc, dbuf, size); -	if (tmp) -		list_add(&tmp->list, &fwc->head); +	if (tmp) { +		INIT_LIST_HEAD(&tmp->list); +		if (!(opt_flags & FW_OPT_NOCACHE)) +			list_add(&tmp->list, &fwc->head); +	}  	spin_unlock(&fwc->lock);  	*fw_priv = tmp; @@ -493,7 +499,8 @@ int assign_fw(struct firmware *fw, struct device *device,   */  static int  _request_firmware_prepare(struct firmware **firmware_p, const char *name, -			  struct device *device, void *dbuf, size_t size) +			  struct device *device, void *dbuf, size_t size, +			  enum fw_opt opt_flags)  {  	struct firmware *firmware;  	struct fw_priv *fw_priv; @@ -511,7 +518,8 @@ _request_firmware_prepare(struct firmware **firmware_p, const char *name,  		return 0; /* assigned */  	} -	ret = alloc_lookup_fw_priv(name, &fw_cache, &fw_priv, dbuf, size); +	ret = alloc_lookup_fw_priv(name, &fw_cache, &fw_priv, dbuf, size, +				  opt_flags);  	/*  	 * bind with 'priv' now to avoid warning in failure path @@ -571,7 +579,8 @@ _request_firmware(const struct firmware **firmware_p, const char *name,  		goto out;  	} -	ret = _request_firmware_prepare(&fw, name, device, buf, size); +	ret = _request_firmware_prepare(&fw, name, device, buf, size, +					opt_flags);  	if (ret <= 0) /* error or already assigned */  		goto out; |