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:
Utkarsh Saxena 2017-04-28 19:12:30 +05:30
parent c01ba1a5f9
commit 8a834f9977
4 changed files with 59 additions and 43 deletions

View file

@ -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

View file

@ -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;

View file

@ -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 -
* *

View file

@ -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