err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
                           EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
-                          card->ext_csd.generic_cmd6_time, 0,
-                          true, false, true);
-       if (!err) {
-               mmc_set_timing(card->host, MMC_TIMING_MMC_HS);
-               err = mmc_switch_status(card);
-       }
-
+                          card->ext_csd.generic_cmd6_time, MMC_TIMING_MMC_HS,
+                          true, true, true);
        if (err)
                pr_warn("%s: switch to high-speed failed, err:%d\n",
                        mmc_hostname(card->host), err);
                goto out_err;
 
        /* Switch card to HS mode */
-       err = mmc_select_hs(card);
-       if (err)
+       err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,
+                          EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS,
+                          card->ext_csd.generic_cmd6_time, 0,
+                          true, false, true);
+       if (err) {
+               pr_err("%s: switch to hs for hs400es failed, err:%d\n",
+                       mmc_hostname(host), err);
                goto out_err;
+       }
 
-       mmc_set_clock(host, card->ext_csd.hs_max_dtr);
-
+       mmc_set_timing(host, MMC_TIMING_MMC_HS);
        err = mmc_switch_status(card);
        if (err)
                goto out_err;
 
+       mmc_set_clock(host, card->ext_csd.hs_max_dtr);
+
        /* Switch card to DDR with strobe bit */
        val = EXT_CSD_DDR_BUS_WIDTH_8 | EXT_CSD_BUS_WIDTH_STROBE;
        err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL,