mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-20 19:23:57 +08:00
ASoC: Intel: Skylake: Limit large_config_get to single frame
Reply for the very first LARGE_CONFIG_GET request contains total size of payload to be retrieved by host. From then on, each subsequent reply carries buffer offset instead. As looping is not covered by any real-life example, remove it and cleanup the function for followup overhaul. Signed-off-by: Cezary Rojewski <cezary.rojewski@intel.com> Link: https://lore.kernel.org/r/20190808181549.12521-2-cezary.rojewski@intel.com Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
0e4cc44f50
commit
63e45324c2
@ -973,8 +973,7 @@ int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
|
||||
{
|
||||
struct skl_ipc_header header = {0};
|
||||
struct sst_ipc_message request = {0}, reply = {0};
|
||||
int ret = 0;
|
||||
size_t sz_remaining, rx_size, data_offset;
|
||||
int ret;
|
||||
|
||||
header.primary = IPC_MSG_TARGET(IPC_MOD_MSG);
|
||||
header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
|
||||
@ -987,34 +986,12 @@ int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
|
||||
header.extension |= IPC_FINAL_BLOCK(1);
|
||||
header.extension |= IPC_INITIAL_BLOCK(1);
|
||||
|
||||
sz_remaining = msg->param_data_size;
|
||||
data_offset = 0;
|
||||
|
||||
while (sz_remaining != 0) {
|
||||
rx_size = sz_remaining > SKL_ADSP_W1_SZ
|
||||
? SKL_ADSP_W1_SZ : sz_remaining;
|
||||
if (rx_size == sz_remaining)
|
||||
header.extension |= IPC_FINAL_BLOCK(1);
|
||||
|
||||
request.header = *(u64 *)(&header);
|
||||
reply.data = ((char *)param) + data_offset;
|
||||
reply.size = msg->param_data_size;
|
||||
ret = sst_ipc_tx_message_wait(ipc, request, &reply);
|
||||
if (ret < 0) {
|
||||
dev_err(ipc->dev,
|
||||
"ipc: get large config fail, err: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
sz_remaining -= rx_size;
|
||||
data_offset = msg->param_data_size - sz_remaining;
|
||||
|
||||
/* clear the fields */
|
||||
header.extension &= IPC_INITIAL_BLOCK_CLEAR;
|
||||
header.extension &= IPC_DATA_OFFSET_SZ_CLEAR;
|
||||
/* fill the fields */
|
||||
header.extension |= IPC_INITIAL_BLOCK(1);
|
||||
header.extension |= IPC_DATA_OFFSET_SZ(data_offset);
|
||||
}
|
||||
request.header = *(u64 *)(&header);
|
||||
reply.data = param;
|
||||
reply.size = msg->param_data_size;
|
||||
ret = sst_ipc_tx_message_wait(ipc, request, &reply);
|
||||
if (ret < 0)
|
||||
dev_err(ipc->dev, "ipc: get large config fail, err: %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user