Page MenuHomeFreeBSD

D24740.diff
No OneTemporary

D24740.diff

diff --git a/sys/dev/mmc/mmc_subr.c b/sys/dev/mmc/mmc_subr.c
--- a/sys/dev/mmc/mmc_subr.c
+++ b/sys/dev/mmc/mmc_subr.c
@@ -193,7 +193,7 @@
mmc_switch_status(device_t busdev, device_t dev, uint16_t rca, u_int timeout)
{
struct timeval cur, end;
- int err;
+ int err, crc_timeout;
uint32_t status;
KASSERT(timeout != 0, ("%s: no timeout", __func__));
@@ -205,7 +205,19 @@
*/
end.tv_sec = end.tv_usec = 0;
for (;;) {
- err = mmc_send_status(busdev, dev, rca, &status);
+ crc_timeout=0;
+ do {
+ /*
+ * CRC errors indicate that the command wasn't accepted
+ * and executed due to a communications error. Retry
+ * CRC errors a couple of times to cope with transient
+ * failures.
+ *
+ * This is required for some cheap laptops to boot.
+ */
+ err = mmc_send_status(busdev, dev, rca, &status);
+ crc_timeout++;
+ } while (err == MMC_ERR_BADCRC && crc_timeout < 10);
if (err != MMC_ERR_NONE)
break;
if (R1_CURRENT_STATE(status) == R1_STATE_TRAN)

File Metadata

Mime Type
text/plain
Expires
Thu, May 21, 10:34 PM (15 h, 21 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33407407
Default Alt Text
D24740.diff (1000 B)

Event Timeline