ASoC: msm: qdsp6: Fixed the volume command timeout issue.

QDSP6 can send out of sequence response and this breaks
the no wait command tracking logic. It results the wait
command response gets ignored and causes the wait time out.
To resolve the issue, each response needs to be checked
to determine if the response is for no wait or wait command.

CRs-Fixed: 402768
Signed-off-by: Jay Wang <jaywang@codeaurora.org>
(cherry picked from commit 186115970e3a1eb38a183fccce4668500f0a7edf)
(cherry picked from commit 605a4c7f220a135709dbb933a760c356cf082bc8)

Change-Id: Ia364fcbb4f093ba683a29f8f209e9318519c4f6c
Signed-off-by: Sudhir Sharma <sudsha@codeaurora.org>
This commit is contained in:
Jay Wang 2012-10-03 16:17:18 -07:00 committed by Stephen Boyd
parent 224a365720
commit 2642d88534

View file

@ -799,6 +799,25 @@ static int32_t q6asm_mmapcallback(struct apr_client_data *data, void *priv)
return 0;
}
static int32_t is_no_wait_cmd_rsp(uint32_t opcode, uint32_t *cmd_type)
{
if (opcode == APR_BASIC_RSP_RESULT) {
if (cmd_type != NULL) {
switch (cmd_type[0]) {
case ASM_SESSION_CMD_RUN:
case ASM_SESSION_CMD_PAUSE:
case ASM_DATA_CMD_EOS:
return 1;
default:
break;
}
} else
pr_err("%s: null pointer!", __func__);
} else if (opcode == ASM_DATA_CMDRSP_EOS)
return 1;
return 0;
}
static int32_t q6asm_callback(struct apr_client_data *data, void *priv)
{
@ -819,14 +838,16 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv)
ac->session);
return -EINVAL;
}
if (atomic_read(&ac->nowait_cmd_cnt) > 0) {
payload = data->payload;
if ((atomic_read(&ac->nowait_cmd_cnt) > 0) &&
is_no_wait_cmd_rsp(data->opcode, payload)) {
pr_debug("%s: nowait_cmd_cnt %d\n",
__func__,
atomic_read(&ac->nowait_cmd_cnt));
atomic_dec(&ac->nowait_cmd_cnt);
wakeup_flag = 0;
}
payload = data->payload;
if (data->opcode == RESET_EVENTS) {
pr_debug("q6asm_callback: Reset event is received: %d %d apr[%p]\n",