Date: Tue, 20 May 2014 04:57:09 +0300 From: "Sulev-Madis Silber (ketas)" <madis555@hot.ee> To: "Sulev-Madis Silber (ketas)" <madis555@hot.ee> Cc: freebsd-arm <freebsd-arm@FreeBSD.org> Subject: Re: BBB MMC / SD detection instability with U-Boot 2014.04 (CPU 1GHz) Message-ID: <537AB675.1020006@hot.ee> In-Reply-To: <537AB550.2090401@hot.ee> References: <537A050E.3040804@hot.ee> <537AB550.2090401@hot.ee>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --] On 2014-05-20 04:52, Sulev-Madis Silber (ketas) wrote: > On 2014-05-19 16:20, Sulev-Madis Silber (ketas) wrote: >> Hello. >> >> Although maybe I could write this as reply to some other message, I feel >> like it might deserve separate one. >> >> I use U-Boot 2014.04 which sets CPU frequency to 1GHz, which seems nice. >> Apart from inability to find eMMC in ubldr (SD card is always fine), now >> I get whole different issues here. With 2013.04, I get occasional eMMC >> failure I mentioned earlier. With 2014.04, it's very hard to get SD >> devices detected at all. And I get all sorts of weird errors (megabytes >> of boot logs from serial if anyone wishes to see). I'm aware how HW >> clock changes can affect things like this, but I'm not exactly sure >> where and what happens when this is done. If I boot with 2013.04, it's >> ok again, if I switch to 2014.04 again, it's ok again for a while. It >> really feels like it's overheating. After a while, it gets extremely >> hard to get thing booted up. Both devices sometimes detect and sometimes >> not. I get things like "no compatible cards found on bus" (mmc 0/1), or >> things like "card at relative address x lost". Tried adding delays like >> suggested earlier, but that doesn't help and now the issue seems >> different. I get no other issues. System is very stable once it's booted >> up. There are no hangs, panics... Everything works. I must mention that >> I always use latest CURRENT. I didn't find a way to make kernel reboot >> system when root mount fails, so I manually patched that option in. Last >> time I got 11 failures before it booted up with both SD and eMMC found >> (they don't fail same way every time, sometimes SD is missing, often >> eMMC is missing). >> >> What would somebody else think about such issues? I don't have >> experience in HW dev, I can only guess what goes wrong. And again, if it >> boots, it works. And no component on BBB gets too warm to hold finger >> there for long time, too (if that matters). I have 5V 2.5A PSU powering >> it (but the PMIC should fail if voltage drops too much, etc, I read the >> datasheet for that), I have few LEDs with resistors connected to GPIO >> pins, two ~30cm wires that sit on table for input testing (resistors >> there too, of course) and Nokia DKU-5 data cable for USB-TTL serial >> console. If the board gets any ground, it's via this cable. But I don't >> see how my HW config is related to this issue. And I don't change this >> when I try different U-Boot's?! I don't have USB devices connected to >> host port and nothing to other USB port too. I use old 64MB SD card to >> help with booting (because of ubldr issues), not sure that matters, though. >> >> Thanks. >> > > > Now I have patch too. I feel much better now. It seems to fix > everything. I'm sure that not all of those "delay"'s are needed. I got > tired of failures and just put one into each place that seemed to need > some waiting before continue. The side effect is that mmc detection > doesn't take several seconds now, it's near instant. It also feels like > device read speed is faster but I'm not entirely sure about that. So, > what happened here? Slower CPU acted as some kind of limiter by itself? > What's correct solution here? I'm only guessing but it at least works > now. I don't think I've lost devices after this change, both SD card and > eMMC device are always there. I should disable reboot on rootfs mount > fail to fully confirm it. However that BUSTEST_W still gives error. Now, > only ubldr-no-eMMC fix is needed. And / or U-Boot fix? > Early "Send"... patch: http://ketas.si.pri.ee/mmc-detection-hacks2.diff (and attached) [-- Attachment #2 --] 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);help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?537AB675.1020006>
