Index: dev/sdhci/sdhci.c =================================================================== --- dev/sdhci/sdhci.c (revision 245119) +++ dev/sdhci/sdhci.c (working copy) @@ -248,8 +248,8 @@ } else { /* Version 3.0 divisors are multiples of two up to 1023*2 */ - if (clock > slot->max_clk) - div = 2; + if (clock >= slot->max_clk) + div = 0; else { for (div = 2; div < 1023*2; div += 2) { if ((slot->max_clk / div) <= clock) @@ -1050,8 +1050,10 @@ } if (intmask & SDHCI_INT_TIMEOUT) slot->curcmd->error = MMC_ERR_TIMEOUT; - else if (intmask & SDHCI_INT_CRC) + else if (intmask & SDHCI_INT_CRC) { + printf("CMD CRC error\n"); slot->curcmd->error = MMC_ERR_BADCRC; + } else if (intmask & (SDHCI_INT_END_BIT | SDHCI_INT_INDEX)) slot->curcmd->error = MMC_ERR_FIFO; @@ -1078,8 +1080,14 @@ } if (intmask & SDHCI_INT_DATA_TIMEOUT) slot->curcmd->error = MMC_ERR_TIMEOUT; - else if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_END_BIT)) + else if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_END_BIT)) { + if (intmask & SDHCI_INT_DATA_CRC) { + printf("DATA CRC error\n"); + } + if (intmask & SDHCI_INT_DATA_END_BIT) + printf("DATA END BIT CRC error\n"); slot->curcmd->error = MMC_ERR_BADCRC; + } if (slot->curcmd->data == NULL && (intmask & (SDHCI_INT_DATA_AVAIL | SDHCI_INT_SPACE_AVAIL | SDHCI_INT_DMA_END))) { Index: dev/mmc/mmc.c =================================================================== --- dev/mmc/mmc.c (revision 245755) +++ dev/mmc/mmc.c (working copy) @@ -108,7 +108,7 @@ static SYSCTL_NODE(_hw, OID_AUTO, mmc, CTLFLAG_RD, NULL, "mmc driver"); -static int mmc_debug; +static int mmc_debug = 0; SYSCTL_INT(_hw_mmc, OID_AUTO, debug, CTLFLAG_RW, &mmc_debug, 0, "Debug level"); /* bus entry points */ @@ -603,10 +603,15 @@ mmc_select_card(struct mmc_softc *sc, uint16_t rca) { int flags; + int err; flags = (rca ? MMC_RSP_R1B : MMC_RSP_NONE) | MMC_CMD_AC; - return (mmc_wait_for_command(sc, MMC_SELECT_CARD, (uint32_t)rca << 16, + err = (mmc_wait_for_command(sc, MMC_SELECT_CARD, (uint32_t)rca << 16, flags, NULL, CMD_RETRIES)); + if (err != MMC_ERR_NONE) { + printf("mmc_select_card failed\n"); + } + return (err); } static int @@ -651,6 +656,8 @@ data.flags = MMC_DATA_READ; err = mmc_wait_for_cmd(sc, &cmd, CMD_RETRIES); + if (err != MMC_ERR_NONE) + printf("SWITCH failed!!\n"); return (err); } @@ -1067,7 +1074,8 @@ cmd.flags = MMC_RSP_R2 | MMC_CMD_BCR; cmd.data = NULL; err = mmc_wait_for_cmd(sc, &cmd, 0); - memcpy(rawcsd, cmd.resp, 4 * sizeof(uint32_t)); + if (err == MMC_ERR_NONE) + memcpy(rawcsd, cmd.resp, 4 * sizeof(uint32_t)); return (err); } @@ -1092,8 +1100,11 @@ data.flags = MMC_DATA_READ; err = mmc_wait_for_app_cmd(sc, rca, &cmd, CMD_RETRIES); - rawscr[0] = be32toh(rawscr[0]); - rawscr[1] = be32toh(rawscr[1]); + if (err == MMC_ERR_NONE) { + rawscr[0] = be32toh(rawscr[0]); + rawscr[1] = be32toh(rawscr[1]); + } + return (err); } @@ -1274,7 +1285,11 @@ mmc_send_relative_addr(sc, &resp); ivar->rca = resp >> 16; /* Get card CSD. */ - mmc_send_csd(sc, ivar->rca, ivar->raw_csd); + err = mmc_send_csd(sc, ivar->rca, ivar->raw_csd); + if (err != MMC_ERR_NONE) { + device_printf(sc->dev, "Error reading CSD %d\n", err); + break; + } if (bootverbose || mmc_debug) device_printf(sc->dev, "%sard detected (CSD %08x%08x%08x%08x)\n", @@ -1303,7 +1318,13 @@ /* Get card SCR. Card must be selected to fetch it. */ mmc_select_card(sc, ivar->rca); - mmc_app_send_scr(sc, ivar->rca, ivar->raw_scr); + err = mmc_app_send_scr(sc, ivar->rca, ivar->raw_scr); + if (err != MMC_ERR_NONE) { + device_printf(sc->dev, + "Error reading card SCR %d\n", err); + break; + } + mmc_app_decode_scr(ivar->raw_scr, &ivar->scr); /* Get card switch capabilities (command class 10). */ if ((ivar->scr.sda_vsn >= 1) && @@ -1357,7 +1378,11 @@ ivar->rca = rca++; mmc_set_relative_addr(sc, ivar->rca); /* Get card CSD. */ - mmc_send_csd(sc, ivar->rca, ivar->raw_csd); + err = mmc_send_csd(sc, ivar->rca, ivar->raw_csd); + if (err != MMC_ERR_NONE) { + device_printf(sc->dev, "Error reading CSD %d\n", err); + break; + } if (bootverbose || mmc_debug) device_printf(sc->dev, "%sard detected (CSD %08x%08x%08x%08x)\n", @@ -1590,6 +1615,7 @@ max_timing = ivar->timing; if (ivar->tran_speed < max_dtr) max_dtr = ivar->tran_speed; + if (ivar->hs_tran_speed < max_hs_dtr) max_hs_dtr = ivar->hs_tran_speed; } @@ -1604,7 +1630,8 @@ free(kids, M_TEMP); if (max_timing == bus_timing_hs) max_dtr = max_hs_dtr; - if (bootverbose || mmc_debug) { + + if (1) { device_printf(sc->dev, "setting transfer rate to %d.%03dMHz%s\n", max_dtr / 1000000, (max_dtr / 1000) % 1000,