Index: sys/dev/mmc/mmc.c =================================================================== --- sys/dev/mmc/mmc.c (revision 266442) +++ sys/dev/mmc/mmc.c (working copy) @@ -414,6 +414,7 @@ int err; do { + mmc_ms_delay(10); memset(&mreq, 0, sizeof(mreq)); memset(cmd->resp, 0, sizeof(cmd->resp)); cmd->retries = 0; /* Retries done here, not in hardware. */ @@ -436,6 +437,7 @@ int err; do { + mmc_ms_delay(10); memset(&appcmd, 0, sizeof(appcmd)); appcmd.opcode = MMC_APP_CMD; appcmd.arg = rca << 16; @@ -465,6 +467,7 @@ struct mmc_command cmd; int err; + mmc_ms_delay(10); memset(&cmd, 0, sizeof(cmd)); cmd.opcode = opcode; cmd.arg = arg; @@ -488,6 +491,7 @@ device_t dev; struct mmc_command cmd; + mmc_ms_delay(10); dev = sc->dev; mmcbr_set_chip_select(dev, cs_high); mmcbr_update_ios(dev); @@ -769,8 +773,15 @@ data.data = p8; data.len = 8; data.flags = MMC_DATA_WRITE; - mmc_wait_for_cmd(sc, &cmd, 0); - + err = mmc_wait_for_cmd(sc, &cmd, 0); + if (err != 0) { + device_printf(sc->dev, "BUSTEST_W err %d\n", err); + mmc_ms_delay(10); + err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES); + if (err != 0) + device_printf(sc->dev, "BUSTEST_W err %d (retried %d times)\n", err, CMD_RETRIES); + } + memset(&cmd, 0, sizeof(cmd)); memset(&data, 0, sizeof(data)); cmd.opcode = MMC_BUSTEST_R; @@ -782,10 +793,19 @@ data.len = 8; data.flags = MMC_DATA_READ; err = mmc_wait_for_cmd(sc, &cmd, 0); - + if (err != 0) { + device_printf(sc->dev, "BUSTEST_R err %d\n", err); + mmc_ms_delay(10); + err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES); + if (err != 0) + device_printf(sc->dev, "BUSTEST_R err %d (retried %d times)\n", err, CMD_RETRIES); + } + + device_printf(sc->dev, "read %02x %02x %02x %02x %02x %02x %02x %02x\n", + buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); + mmcbr_set_bus_width(sc->dev, bus_width_1); mmcbr_update_ios(sc->dev); - if (err == MMC_ERR_NONE && memcmp(buf, p8ok, 8) == 0) return (bus_width_8); } @@ -1264,6 +1284,7 @@ if (bootverbose || mmc_debug) device_printf(sc->dev, "Probing cards\n"); while (1) { + mmc_ms_delay(10); err = mmc_all_send_cid(sc, raw_cid); if (err == MMC_ERR_TIMEOUT) break; @@ -1586,7 +1607,9 @@ (err ? 0 : MMC_OCR_CCS) | mmcbr_get_ocr(dev), NULL); } else mmc_send_op_cond(sc, mmcbr_get_ocr(dev), NULL); + mmc_ms_delay(10); mmc_discover_cards(sc); + mmc_ms_delay(10); mmc_rescan_cards(sc); mmcbr_set_bus_mode(dev, pushpull);