msm: ipa: Add a support to retry uC send command
For the status IPA_HW_2_CPU_WDI_RX_FSM_TRANSITION_ERROR, receive from the uC, add a logic to retry sending the same command for maximum of 10 retires. Change-Id: I4b241311e0699aea0e24b3a279622a8a1aaa737d Acked-by: Mohammed Javid <mjavid@qti.qualcomm.com> Signed-off-by: Utkarsh Saxena <usaxena@codeaurora.org>
This commit is contained in:
parent
c01ba1a5f9
commit
8a834f9977
4 changed files with 59 additions and 43 deletions
|
@ -51,6 +51,7 @@
|
|||
#define IPA_UC_FINISH_MAX 6
|
||||
#define IPA_UC_WAIT_MIN_SLEEP 1000
|
||||
#define IPA_UC_WAII_MAX_SLEEP 1200
|
||||
#define IPA_BAM_STOP_MAX_RETRY 10
|
||||
|
||||
#define IPA_MAX_STATUS_STAT_NUM 30
|
||||
|
||||
|
|
|
@ -590,6 +590,7 @@ int ipa_uc_send_cmd(u32 cmd, u32 opcode, u32 expected_status,
|
|||
{
|
||||
int index;
|
||||
union IpaHwCpuCmdCompletedResponseData_t uc_rsp;
|
||||
int retries = 0;
|
||||
|
||||
mutex_lock(&ipa_ctx->uc_ctx.uc_lock);
|
||||
|
||||
|
@ -599,6 +600,7 @@ int ipa_uc_send_cmd(u32 cmd, u32 opcode, u32 expected_status,
|
|||
return -EBADF;
|
||||
}
|
||||
|
||||
send_cmd:
|
||||
init_completion(&ipa_ctx->uc_ctx.uc_completion);
|
||||
|
||||
ipa_ctx->uc_ctx.uc_sram_mmio->cmdParams = cmd;
|
||||
|
@ -658,6 +660,19 @@ int ipa_uc_send_cmd(u32 cmd, u32 opcode, u32 expected_status,
|
|||
}
|
||||
|
||||
if (ipa_ctx->uc_ctx.uc_status != expected_status) {
|
||||
if (IPA_HW_2_CPU_WDI_RX_FSM_TRANSITION_ERROR ==
|
||||
ipa_ctx->uc_ctx.uc_status) {
|
||||
retries++;
|
||||
if (retries == IPA_BAM_STOP_MAX_RETRY) {
|
||||
IPAERR("Failed after %d tries\n", retries);
|
||||
} else {
|
||||
/* sleep for short period to flush IPA */
|
||||
usleep_range(IPA_UC_WAIT_MIN_SLEEP,
|
||||
IPA_UC_WAII_MAX_SLEEP);
|
||||
goto send_cmd;
|
||||
}
|
||||
}
|
||||
|
||||
IPAERR("Recevied status %u, Expected status %u\n",
|
||||
ipa_ctx->uc_ctx.uc_status, expected_status);
|
||||
ipa_ctx->uc_ctx.pending_cmd = -1;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2016-2017, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -441,7 +441,7 @@ enum ipa_hw_offload_channel_states {
|
|||
|
||||
|
||||
/**
|
||||
* enum ipa_hw_2_cpu_cmd_resp_status - Values that represent
|
||||
* enum ipa_hw_2_cpu_offload_cmd_resp_status - Values that represent
|
||||
* offload related command response status to be sent to CPU.
|
||||
*/
|
||||
enum ipa_hw_2_cpu_offload_cmd_resp_status {
|
||||
|
@ -477,6 +477,47 @@ enum ipa_hw_2_cpu_offload_cmd_resp_status {
|
|||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_OFFLOAD, 14),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ipa_hw_2_cpu_cmd_resp_status - Values that represent WDI related
|
||||
* command response status to be sent to CPU.
|
||||
*/
|
||||
enum ipa_hw_2_cpu_cmd_resp_status {
|
||||
IPA_HW_2_CPU_WDI_CMD_STATUS_SUCCESS =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 0),
|
||||
IPA_HW_2_CPU_MAX_WDI_TX_CHANNELS =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 1),
|
||||
IPA_HW_2_CPU_WDI_CE_RING_OVERRUN_POSSIBILITY =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 2),
|
||||
IPA_HW_2_CPU_WDI_CE_RING_SET_UP_FAILURE =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 3),
|
||||
IPA_HW_2_CPU_WDI_CE_RING_PARAMS_UNALIGNED =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 4),
|
||||
IPA_HW_2_CPU_WDI_COMP_RING_OVERRUN_POSSIBILITY =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 5),
|
||||
IPA_HW_2_CPU_WDI_COMP_RING_SET_UP_FAILURE =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 6),
|
||||
IPA_HW_2_CPU_WDI_COMP_RING_PARAMS_UNALIGNED =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 7),
|
||||
IPA_HW_2_CPU_WDI_UNKNOWN_TX_CHANNEL =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 8),
|
||||
IPA_HW_2_CPU_WDI_TX_INVALID_FSM_TRANSITION =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 9),
|
||||
IPA_HW_2_CPU_WDI_TX_FSM_TRANSITION_ERROR =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 10),
|
||||
IPA_HW_2_CPU_MAX_WDI_RX_CHANNELS =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 11),
|
||||
IPA_HW_2_CPU_WDI_RX_RING_PARAMS_UNALIGNED =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 12),
|
||||
IPA_HW_2_CPU_WDI_RX_RING_SET_UP_FAILURE =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 13),
|
||||
IPA_HW_2_CPU_WDI_UNKNOWN_RX_CHANNEL =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 14),
|
||||
IPA_HW_2_CPU_WDI_RX_INVALID_FSM_TRANSITION =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 15),
|
||||
IPA_HW_2_CPU_WDI_RX_FSM_TRANSITION_ERROR =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 16),
|
||||
};
|
||||
|
||||
/**
|
||||
* struct IpaHwSetUpCmd -
|
||||
*
|
||||
|
|
|
@ -109,47 +109,6 @@ enum ipa_cpu_2_hw_wdi_commands {
|
|||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 7),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ipa_hw_2_cpu_cmd_resp_status - Values that represent WDI related
|
||||
* command response status to be sent to CPU.
|
||||
*/
|
||||
enum ipa_hw_2_cpu_cmd_resp_status {
|
||||
IPA_HW_2_CPU_WDI_CMD_STATUS_SUCCESS =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 0),
|
||||
IPA_HW_2_CPU_MAX_WDI_TX_CHANNELS =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 1),
|
||||
IPA_HW_2_CPU_WDI_CE_RING_OVERRUN_POSSIBILITY =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 2),
|
||||
IPA_HW_2_CPU_WDI_CE_RING_SET_UP_FAILURE =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 3),
|
||||
IPA_HW_2_CPU_WDI_CE_RING_PARAMS_UNALIGNED =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 4),
|
||||
IPA_HW_2_CPU_WDI_COMP_RING_OVERRUN_POSSIBILITY =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 5),
|
||||
IPA_HW_2_CPU_WDI_COMP_RING_SET_UP_FAILURE =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 6),
|
||||
IPA_HW_2_CPU_WDI_COMP_RING_PARAMS_UNALIGNED =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 7),
|
||||
IPA_HW_2_CPU_WDI_UNKNOWN_TX_CHANNEL =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 8),
|
||||
IPA_HW_2_CPU_WDI_TX_INVALID_FSM_TRANSITION =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 9),
|
||||
IPA_HW_2_CPU_WDI_TX_FSM_TRANSITION_ERROR =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 10),
|
||||
IPA_HW_2_CPU_MAX_WDI_RX_CHANNELS =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 11),
|
||||
IPA_HW_2_CPU_WDI_RX_RING_PARAMS_UNALIGNED =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 12),
|
||||
IPA_HW_2_CPU_WDI_RX_RING_SET_UP_FAILURE =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 13),
|
||||
IPA_HW_2_CPU_WDI_UNKNOWN_RX_CHANNEL =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 14),
|
||||
IPA_HW_2_CPU_WDI_RX_INVALID_FSM_TRANSITION =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 15),
|
||||
IPA_HW_2_CPU_WDI_RX_FSM_TRANSITION_ERROR =
|
||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 16),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ipa_hw_wdi_errors - WDI specific error types.
|
||||
* @IPA_HW_WDI_ERROR_NONE : No error persists
|
||||
|
|
Loading…
Add table
Reference in a new issue