arm: socfpga: mailbox: Add mailbox retry support
Resend mailbox command for 3 times with 2ms interval in between if it receives MBOX_RESP_TIMEOUT and MBOX_RESP_DEVICE_BUSY response code. Add a wrapper function mbox_send_cmd_common_retry() for retry, change all the callers to use this wrapper function. Signed-off-by: Ley Foon Tan <ley.foon.tan@intel.com> Signed-off-by: Chee Hong Ang <chee.hong.ang@intel.com>
This commit is contained in:
parent
6a48f95c6b
commit
de84e2d8c9
1 changed files with 31 additions and 9 deletions
|
@ -296,11 +296,33 @@ static __always_inline int mbox_send_cmd_common(u8 id, u32 cmd, u8 is_indirect,
|
|||
return resp_err;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
static __always_inline int mbox_send_cmd_common_retry(u8 id, u32 cmd,
|
||||
u8 is_indirect,
|
||||
u32 len, u32 *arg,
|
||||
u8 urgent,
|
||||
u32 *resp_buf_len,
|
||||
u32 *resp_buf)
|
||||
{
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
ret = mbox_send_cmd_common(id, cmd, is_indirect, len, arg,
|
||||
urgent, resp_buf_len, resp_buf);
|
||||
if (ret == MBOX_RESP_TIMEOUT || ret == MBOX_RESP_DEVICE_BUSY)
|
||||
udelay(2000); /* wait for 2ms before resend */
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int mbox_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
@ -395,10 +417,10 @@ static __always_inline int mbox_get_fpga_config_status_common(u32 cmd)
|
|||
int ret;
|
||||
|
||||
reconfig_status_resp_len = RECONFIG_STATUS_RESPONSE_LEN;
|
||||
ret = mbox_send_cmd_common(MBOX_ID_UBOOT, cmd,
|
||||
MBOX_CMD_DIRECT, 0, NULL, 0,
|
||||
&reconfig_status_resp_len,
|
||||
reconfig_status_resp);
|
||||
ret = mbox_send_cmd_common_retry(MBOX_ID_UBOOT, cmd,
|
||||
MBOX_CMD_DIRECT, 0, NULL, 0,
|
||||
&reconfig_status_resp_len,
|
||||
reconfig_status_resp);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -438,16 +460,16 @@ int __secure mbox_get_fpga_config_status_psci(u32 cmd)
|
|||
int mbox_send_cmd(u8 id, u32 cmd, u8 is_indirect, u32 len, u32 *arg,
|
||||
u8 urgent, u32 *resp_buf_len, u32 *resp_buf)
|
||||
{
|
||||
return mbox_send_cmd_common(id, cmd, is_indirect, len, arg, urgent,
|
||||
resp_buf_len, resp_buf);
|
||||
return mbox_send_cmd_common_retry(id, cmd, is_indirect, len, arg,
|
||||
urgent, resp_buf_len, resp_buf);
|
||||
}
|
||||
|
||||
int __secure mbox_send_cmd_psci(u8 id, u32 cmd, u8 is_indirect, u32 len,
|
||||
u32 *arg, u8 urgent, u32 *resp_buf_len,
|
||||
u32 *resp_buf)
|
||||
{
|
||||
return mbox_send_cmd_common(id, cmd, is_indirect, len, arg, urgent,
|
||||
resp_buf_len, resp_buf);
|
||||
return mbox_send_cmd_common_retry(id, cmd, is_indirect, len, arg,
|
||||
urgent, resp_buf_len, resp_buf);
|
||||
}
|
||||
|
||||
int mbox_send_cmd_only(u8 id, u32 cmd, u8 is_indirect, u32 len, u32 *arg)
|
||||
|
|
Loading…
Reference in a new issue