/* Delay before scheduling D0i3 entry */
 #define BXT_D0I3_DELAY 5000
 
-#define BXT_FW_ROM_INIT_RETRY 3
-
 static unsigned int bxt_get_errorcode(struct sst_dsp *ctx)
 {
         return sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE);
 
 {
        struct firmware stripped_fw;
        struct skl_dev *cnl = ctx->thread_context;
-       int ret;
+       int ret, i;
 
        if (!ctx->fw) {
                ret = request_firmware(&ctx->fw, ctx->fw_name, ctx->dev);
        stripped_fw.size = ctx->fw->size;
        skl_dsp_strip_extended_manifest(&stripped_fw);
 
-       ret = cnl_prepare_fw(ctx, stripped_fw.data, stripped_fw.size);
-       if (ret < 0) {
-               dev_err(ctx->dev, "prepare firmware failed: %d\n", ret);
-               goto cnl_load_base_firmware_failed;
+       for (i = 0; i < BXT_FW_ROM_INIT_RETRY; i++) {
+               ret = cnl_prepare_fw(ctx, stripped_fw.data, stripped_fw.size);
+               if (!ret)
+                       break;
+               dev_dbg(ctx->dev, "prepare firmware failed: %d\n", ret);
        }
 
+       if (ret < 0)
+               goto cnl_load_base_firmware_failed;
+
        ret = sst_transfer_fw_host_dma(ctx);
        if (ret < 0) {
                dev_err(ctx->dev, "transfer firmware failed: %d\n", ret);
        return 0;
 
 cnl_load_base_firmware_failed:
+       dev_err(ctx->dev, "firmware load failed: %d\n", ret);
        release_firmware(ctx->fw);
        ctx->fw = NULL;