diff options
Diffstat (limited to 'lib/test_firmware.c')
| -rw-r--r-- | lib/test_firmware.c | 19 | 
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/test_firmware.c b/lib/test_firmware.c index 91b232ed3161..1d7d480b8eeb 100644 --- a/lib/test_firmware.c +++ b/lib/test_firmware.c @@ -45,6 +45,7 @@ struct test_batched_req {  	bool sent;  	const struct firmware *fw;  	const char *name; +	const char *fw_buf;  	struct completion completion;  	struct task_struct *task;  	struct device *dev; @@ -175,8 +176,14 @@ static void __test_release_all_firmware(void)  	for (i = 0; i < test_fw_config->num_requests; i++) {  		req = &test_fw_config->reqs[i]; -		if (req->fw) +		if (req->fw) { +			if (req->fw_buf) { +				kfree_const(req->fw_buf); +				req->fw_buf = NULL; +			}  			release_firmware(req->fw); +			req->fw = NULL; +		}  	}  	vfree(test_fw_config->reqs); @@ -670,6 +677,8 @@ static ssize_t trigger_request_store(struct device *dev,  	mutex_lock(&test_fw_mutex);  	release_firmware(test_firmware); +	if (test_fw_config->reqs) +		__test_release_all_firmware();  	test_firmware = NULL;  	rc = request_firmware(&test_firmware, name, dev);  	if (rc) { @@ -770,6 +779,8 @@ static ssize_t trigger_async_request_store(struct device *dev,  	mutex_lock(&test_fw_mutex);  	release_firmware(test_firmware);  	test_firmware = NULL; +	if (test_fw_config->reqs) +		__test_release_all_firmware();  	rc = request_firmware_nowait(THIS_MODULE, 1, name, dev, GFP_KERNEL,  				     NULL, trigger_async_request_cb);  	if (rc) { @@ -812,6 +823,8 @@ static ssize_t trigger_custom_fallback_store(struct device *dev,  	mutex_lock(&test_fw_mutex);  	release_firmware(test_firmware); +	if (test_fw_config->reqs) +		__test_release_all_firmware();  	test_firmware = NULL;  	rc = request_firmware_nowait(THIS_MODULE, FW_ACTION_NOUEVENT, name,  				     dev, GFP_KERNEL, NULL, @@ -874,6 +887,8 @@ static int test_fw_run_batch_request(void *data)  						 test_fw_config->buf_size);  		if (!req->fw)  			kfree(test_buf); +		else +			req->fw_buf = test_buf;  	} else {  		req->rc = test_fw_config->req_firmware(&req->fw,  						       req->name, @@ -934,6 +949,7 @@ static ssize_t trigger_batched_requests_store(struct device *dev,  		req->fw = NULL;  		req->idx = i;  		req->name = test_fw_config->name; +		req->fw_buf = NULL;  		req->dev = dev;  		init_completion(&req->completion);  		req->task = kthread_run(test_fw_run_batch_request, req, @@ -1038,6 +1054,7 @@ ssize_t trigger_batched_requests_async_store(struct device *dev,  	for (i = 0; i < test_fw_config->num_requests; i++) {  		req = &test_fw_config->reqs[i];  		req->name = test_fw_config->name; +		req->fw_buf = NULL;  		req->fw = NULL;  		req->idx = i;  		init_completion(&req->completion);  | 
