arm: socfpga: mailbox: Add mailbox retry support
authorLey Foon Tan <ley.foon.tan@intel.com>
Wed, 12 Aug 2020 01:56:25 +0000 (09:56 +0800)
committerLey Foon Tan <ley.foon.tan@intel.com>
Fri, 9 Oct 2020 09:53:13 +0000 (17:53 +0800)
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>
arch/arm/mach-socfpga/mailbox_s10.c

index a9ec818..18d4492 100644 (file)
@@ -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)