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_FINISH_MAX 6
|
||||||
#define IPA_UC_WAIT_MIN_SLEEP 1000
|
#define IPA_UC_WAIT_MIN_SLEEP 1000
|
||||||
#define IPA_UC_WAII_MAX_SLEEP 1200
|
#define IPA_UC_WAII_MAX_SLEEP 1200
|
||||||
|
#define IPA_BAM_STOP_MAX_RETRY 10
|
||||||
|
|
||||||
#define IPA_MAX_STATUS_STAT_NUM 30
|
#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;
|
int index;
|
||||||
union IpaHwCpuCmdCompletedResponseData_t uc_rsp;
|
union IpaHwCpuCmdCompletedResponseData_t uc_rsp;
|
||||||
|
int retries = 0;
|
||||||
|
|
||||||
mutex_lock(&ipa_ctx->uc_ctx.uc_lock);
|
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;
|
return -EBADF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
send_cmd:
|
||||||
init_completion(&ipa_ctx->uc_ctx.uc_completion);
|
init_completion(&ipa_ctx->uc_ctx.uc_completion);
|
||||||
|
|
||||||
ipa_ctx->uc_ctx.uc_sram_mmio->cmdParams = cmd;
|
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_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",
|
IPAERR("Recevied status %u, Expected status %u\n",
|
||||||
ipa_ctx->uc_ctx.uc_status, expected_status);
|
ipa_ctx->uc_ctx.uc_status, expected_status);
|
||||||
ipa_ctx->uc_ctx.pending_cmd = -1;
|
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
|
* 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
|
* 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.
|
* offload related command response status to be sent to CPU.
|
||||||
*/
|
*/
|
||||||
enum ipa_hw_2_cpu_offload_cmd_resp_status {
|
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),
|
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 -
|
* struct IpaHwSetUpCmd -
|
||||||
*
|
*
|
||||||
|
|
|
@ -109,47 +109,6 @@ enum ipa_cpu_2_hw_wdi_commands {
|
||||||
FEATURE_ENUM_VAL(IPA_HW_FEATURE_WDI, 7),
|
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.
|
* enum ipa_hw_wdi_errors - WDI specific error types.
|
||||||
* @IPA_HW_WDI_ERROR_NONE : No error persists
|
* @IPA_HW_WDI_ERROR_NONE : No error persists
|
||||||
|
|
Loading…
Add table
Reference in a new issue