mirror of
https://github.com/followmsi/android_kernel_google_msm.git
synced 2024-11-06 23:17:41 +00:00
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:
parent
224a365720
commit
2642d88534
1 changed files with 23 additions and 2 deletions
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue