msm: ipa3: Do not wait for IPA DMA_TASK H/W ACK for GSI
Stop GSI channel for IPA producer endpoint includes sending IPA DMA_TASK immediate command to IPA. If the IPA DL group is in HOLB state, the DMA_TASK will not be processed and ACK on it will not be sent to the driver. In this case, ACK is redundant as the DL data will release the IPA TX and GSI STOP indication will be sent to S/W. CRs-fixed: 1078380 Change-Id: I115524d562b63a8ec76b327207919b6ac9327fe2 Signed-off-by: Ghanim Fodi <gfodi@codeaurora.org>
This commit is contained in:
parent
ff02182ddb
commit
bdb2290087
3 changed files with 41 additions and 4 deletions
|
@ -777,11 +777,29 @@ static void ipa3_transport_irq_cmd_ack(void *user1, int user2)
|
|||
* for this function.
|
||||
*/
|
||||
int ipa3_send_cmd(u16 num_desc, struct ipa3_desc *descr)
|
||||
{
|
||||
return ipa3_send_cmd_timeout(num_desc, descr, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* ipa3_send_cmd_timeout - send immediate commands with limited time
|
||||
* waiting for ACK from IPA HW
|
||||
* @num_desc: number of descriptors within the desc struct
|
||||
* @descr: descriptor structure
|
||||
* @timeout: millisecond to wait till get ACK from IPA HW
|
||||
*
|
||||
* Function will block till command gets ACK from IPA HW or timeout.
|
||||
* Caller needs to free any resources it allocated after function returns
|
||||
* The callback in ipa3_desc should not be set by the caller
|
||||
* for this function.
|
||||
*/
|
||||
int ipa3_send_cmd_timeout(u16 num_desc, struct ipa3_desc *descr, u32 timeout)
|
||||
{
|
||||
struct ipa3_desc *desc;
|
||||
int i, result = 0;
|
||||
struct ipa3_sys_context *sys;
|
||||
int ep_idx;
|
||||
int completed;
|
||||
|
||||
for (i = 0; i < num_desc; i++)
|
||||
IPADBG("sending imm cmd %d\n", descr[i].opcode);
|
||||
|
@ -808,7 +826,14 @@ int ipa3_send_cmd(u16 num_desc, struct ipa3_desc *descr)
|
|||
result = -EFAULT;
|
||||
goto bail;
|
||||
}
|
||||
wait_for_completion(&descr->xfer_done);
|
||||
if (timeout) {
|
||||
completed = wait_for_completion_timeout(
|
||||
&descr->xfer_done, msecs_to_jiffies(timeout));
|
||||
if (!completed)
|
||||
IPADBG("timeout waiting for imm-cmd ACK\n");
|
||||
} else {
|
||||
wait_for_completion(&descr->xfer_done);
|
||||
}
|
||||
} else {
|
||||
desc = &descr[num_desc - 1];
|
||||
init_completion(&desc->xfer_done);
|
||||
|
@ -823,7 +848,15 @@ int ipa3_send_cmd(u16 num_desc, struct ipa3_desc *descr)
|
|||
result = -EFAULT;
|
||||
goto bail;
|
||||
}
|
||||
wait_for_completion(&desc->xfer_done);
|
||||
if (timeout) {
|
||||
completed = wait_for_completion_timeout(
|
||||
&desc->xfer_done, msecs_to_jiffies(timeout));
|
||||
if (!completed)
|
||||
IPADBG("timeout waiting for imm-cmd ACK\n");
|
||||
} else {
|
||||
wait_for_completion(&desc->xfer_done);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bail:
|
||||
|
|
|
@ -1835,6 +1835,7 @@ int ipa3_init_mem_partition(struct device_node *dev_node);
|
|||
int ipa3_controller_static_bind(struct ipa3_controller *controller,
|
||||
enum ipa_hw_type ipa_hw_type);
|
||||
int ipa3_cfg_route(struct ipahal_reg_route *route);
|
||||
int ipa3_send_cmd_timeout(u16 num_desc, struct ipa3_desc *descr, u32 timeout);
|
||||
int ipa3_send_cmd(u16 num_desc, struct ipa3_desc *descr);
|
||||
int ipa3_cfg_filter(u32 disable);
|
||||
int ipa3_pipe_mem_init(u32 start_ofst, u32 size);
|
||||
|
|
|
@ -47,6 +47,8 @@
|
|||
#define IPA_EOT_COAL_GRAN_MIN (1)
|
||||
#define IPA_EOT_COAL_GRAN_MAX (16)
|
||||
|
||||
#define IPA_DMA_TASK_FOR_GSI_TIMEOUT_MSEC (15)
|
||||
|
||||
#define IPA_AGGR_BYTE_LIMIT (\
|
||||
IPA_ENDP_INIT_AGGR_N_AGGR_BYTE_LIMIT_BMSK >> \
|
||||
IPA_ENDP_INIT_AGGR_N_AGGR_BYTE_LIMIT_SHFT)
|
||||
|
@ -101,7 +103,7 @@
|
|||
#define IPA_GROUP_DPL IPA_GROUP_DL
|
||||
#define IPA_GROUP_DIAG (2)
|
||||
#define IPA_GROUP_DMA (3)
|
||||
#define IPA_GROUP_IMM_CMD IPA_GROUP_DMA
|
||||
#define IPA_GROUP_IMM_CMD IPA_GROUP_UL
|
||||
#define IPA_GROUP_Q6ZIP (4)
|
||||
#define IPA_GROUP_Q6ZIP_GENERAL IPA_GROUP_Q6ZIP
|
||||
#define IPA_GROUP_UC_RX_Q (5)
|
||||
|
@ -3470,7 +3472,8 @@ int ipa3_inject_dma_task_for_gsi(void)
|
|||
desc.type = IPA_IMM_CMD_DESC;
|
||||
|
||||
IPADBG("sending 1B packet to IPA\n");
|
||||
if (ipa3_send_cmd(1, &desc)) {
|
||||
if (ipa3_send_cmd_timeout(1, &desc,
|
||||
IPA_DMA_TASK_FOR_GSI_TIMEOUT_MSEC)) {
|
||||
IPAERR("ipa3_send_cmd failed\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue