From 27c57727238586cfc6c2b81e33b441185e981331 Mon Sep 17 00:00:00 2001 From: Dieter Luecking Date: Fri, 5 Oct 2018 16:45:41 +0200 Subject: [PATCH] dsp: Fix wrong payload size in adm_open command Correcting payload length for adm_cmd_device_open_v8 usage if endpoint_id1 and endpoint_id2 are valid and this_adm.num_ec_ref_rx_chans is 0. Change-Id: I82815a2d885cdad5a9427c11eb73224289b158b3 Signed-off-by: Dieter Luecking --- dsp/q6adm.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/dsp/q6adm.c b/dsp/q6adm.c index b39b44922242..9a6d2f888cee 100644 --- a/dsp/q6adm.c +++ b/dsp/q6adm.c @@ -2935,10 +2935,6 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, open_v8.endpoint_id_2 = 0xFFFF; open_v8.endpoint_id_3 = 0xFFFF; - if (this_adm.ec_ref_rx && (path != 1)) { - open_v8.endpoint_id_2 = this_adm.ec_ref_rx; - this_adm.ec_ref_rx = -1; - } open_v8.topology_id = topology; open_v8.reserved = 0; @@ -2966,8 +2962,11 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, + ep1_payload_size; atomic_set(&this_adm.copp.stat[port_idx][copp_idx], -1); - if ((this_adm.num_ec_ref_rx_chans != 0) && (path != 1) + if ((this_adm.num_ec_ref_rx_chans != 0) + && (path != ADM_PATH_PLAYBACK) && (open_v8.endpoint_id_2 != 0xFFFF)) { + open_v8.endpoint_id_2 = this_adm.ec_ref_rx; + this_adm.ec_ref_rx = -1; ep2_payload.dev_num_channel = this_adm.num_ec_ref_rx_chans; this_adm.num_ec_ref_rx_chans = 0; @@ -3004,18 +3003,23 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, param_size += ep2_payload_size; } + open_v8.hdr.pkt_size = param_size; adm_params = kzalloc(param_size, GFP_KERNEL); if (!adm_params) return -ENOMEM; - open_v8.hdr.pkt_size = param_size; memcpy(adm_params, &open_v8, sizeof(open_v8)); memcpy(adm_params + sizeof(open_v8), (void *)&ep1_payload, ep1_payload_size); - memcpy(adm_params + sizeof(open_v8) - + ep1_payload_size, - (void *)&ep2_payload, - ep2_payload_size); + + if ((this_adm.num_ec_ref_rx_chans != 0) + && (path != ADM_PATH_PLAYBACK) + && (open_v8.endpoint_id_2 != 0xFFFF)) { + memcpy(adm_params + sizeof(open_v8) + + ep1_payload_size, + (void *)&ep2_payload, + ep2_payload_size); + } ret = apr_send_pkt(this_adm.apr, (uint32_t *)adm_params);