More information ...<br> <br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="gmail_quote"><div>I am pretty sure we need to switch to 1BIT transfer and/or using the <span style="font-family:Verdana,Arial,Helvetica">SDHCI_BROKEN_TIMEOUT_VAL quirk. I'll try to find out if I can add this functionality to barebox, unless you believe there's something else which causes this behaviour.</span></div>


<div><span style="font-family:Verdana,Arial,Helvetica"><br></span></div><div><span style="font-family:Verdana,Arial,Helvetica">I'll keep investigating ...</span></div></div></div></blockquote><div><br></div><div>Added more debugging information, which pretty much pinpoints the culprit from a software point of view: </div>

<div><br></div><div><div>diff --git a/common/block.c b/common/block.c</div><div>index 4253fc4..5e0b50a 100644</div><div>--- a/common/block.c</div><div>+++ b/common/block.c</div><div>@@ -142,6 +142,7 @@ static int block_cache(struct block_device *blk, int block)</div>

<div>        num_blocks = min(blk->rdbufsize, blk->num_blocks - chunk->block_start);</div><div> </div><div>        ret = blk->ops->read(blk, chunk->data, chunk->block_start, num_blocks);</div><div>+       printf("%s: blk->ops->read returned %d\n", __func__, ret);</div>

<div>        if (ret) {</div><div>                list_add_tail(&chunk->list, &blk->idle_blocks);</div><div>                return ret;</div><div>diff --git a/drivers/mci/imx-esdhc.c b/drivers/mci/imx-esdhc.c</div>

<div>index ae3c805..024e18e 100644</div><div>--- a/drivers/mci/imx-esdhc.c</div><div>+++ b/drivers/mci/imx-esdhc.c</div><div>@@ -24,6 +24,9 @@</div><div>  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,</div><div>

  * MA 02111-1307 USA</div><div>  */</div><div>+</div><div>+#define DEBUG</div><div>+</div><div> #include <config.h></div><div> #include <common.h></div><div> #include <driver.h></div><div>@@ -239,6 +242,7 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *data</div>

<div>        struct fsl_esdhc_host *host = to_fsl_esdhc(mci);</div><div>        struct fsl_esdhc *regs = host->regs;</div><div>        int ret;</div><div>+       int loop;</div><div> </div><div>        esdhc_write32(&regs->irqstat, -1);</div>

<div> </div><div>@@ -280,6 +284,18 @@ esdhc_send_cmd(struct mci_host *mci, struct mci_cmd *cmd, struct mci_data *dat</div><div>        /* Wait for the command to complete */</div><div>        ret = wait_on_timeout(100 * MSECOND,</div>

<div>                        esdhc_read32(&regs->irqstat) & IRQSTAT_CC);</div><div>+       loop = 1;</div><div>+       while (ret && loop <=10) {</div><div>+               printf("%s: busy loop %d start\n", __func__, loop);</div>

<div>+               ret = wait_on_timeout(100 * MSECOND,</div><div>+                       esdhc_read32(&regs->irqstat) & IRQSTAT_CC);</div><div>+               printf("%s: busy loop %d end, cap=0x%08x, irqstat=0x%08x, prsstat=0x%08x\n",</div>

<div>+                       __func__, loop,</div><div>+                       esdhc_read32(&host->regs->hostcapblt),</div><div>+                       esdhc_read32(&regs->irqstat),</div><div>+                       esdhc_read32(&regs->prsstat));</div>

<div>+               loop++;</div><div>+       }</div><div>        if (ret) {</div><div>                dev_err(host->dev, "timeout 1\n");</div><div>                return -ETIMEDOUT;</div></div><div><br></div>

<div>It clearly hangs because the IRQSTAT_CC is never set in &regs->irqstat. Now, I am not familiar enough with the quirks of the ESDHC technology to know why the host never receives or sees the IRQ of a command complete, however this behaviour pretty much renders my eSDHC interface unusable. See output below:</div>

<div><br></div><div>sid1-noah:/ mount /dev/disk0.0 fat /mnt</div><div>block_cache: blk->ops->read returned 0</div><div>sid1-noah:/ cp /mnt/conblock_cache: blk->ops->read returned 0</div><div>sole_image.jffs2 /mnt/console_image.jffs2-backup</div>

<div>block_cache: blk->ops->read returned 0</div><div>block_cache: blk->ops->read returned 0</div><div>block_cache: blk->ops->read returned 0</div><div>block_cache: blk->ops->read returned 0</div>
<div>
block_cache: blk->ops->read returned 0</div><div>block_cache: blk->ops->read returned 0</div><div><br></div><div>Data Write Failed in PIO Mode.imx-esdhc@imx-esdhc0: timeout 2</div><div>esdhc_send_cmd: busy loop 1 start</div>

<div>esdhc_send_cmd: busy loop 1 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 2 start</div><div>esdhc_send_cmd: busy loop 2 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 3 start</div><div>esdhc_send_cmd: busy loop 3 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 4 start</div><div>esdhc_send_cmd: busy loop 4 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 5 start</div><div>esdhc_send_cmd: busy loop 5 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 6 start</div><div>esdhc_send_cmd: busy loop 6 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 7 start</div><div>esdhc_send_cmd: busy loop 7 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 8 start</div><div>esdhc_send_cmd: busy loop 8 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 9 start</div><div>esdhc_send_cmd: busy loop 9 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 10 start</div><div>esdhc_send_cmd: busy loop 10 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>imx-esdhc@imx-esdhc0: timeout 1</div><div>esdhc_send_cmd: busy loop 1 start</div><div>esdhc_send_cmd: busy loop 1 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 2 start</div>

<div>esdhc_send_cmd: busy loop 2 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 3 start</div><div>esdhc_send_cmd: busy loop 3 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 4 start</div><div>esdhc_send_cmd: busy loop 4 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 5 start</div><div>esdhc_send_cmd: busy loop 5 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 6 start</div><div>esdhc_send_cmd: busy loop 6 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 7 start</div><div>esdhc_send_cmd: busy loop 7 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 8 start</div><div>esdhc_send_cmd: busy loop 8 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 9 start</div><div>esdhc_send_cmd: busy loop 9 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 10 start</div><div>esdhc_send_cmd: busy loop 10 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>imx-esdhc@imx-esdhc0: timeout 1</div><div>esdhc_send_cmd: busy loop 1 start</div>

<div>esdhc_send_cmd: busy loop 1 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 2 start</div><div>esdhc_send_cmd: busy loop 2 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 3 start</div><div>esdhc_send_cmd: busy loop 3 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 4 start</div><div>esdhc_send_cmd: busy loop 4 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 5 start</div><div>esdhc_send_cmd: busy loop 5 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 6 start</div><div>esdhc_send_cmd: busy loop 6 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 7 start</div><div>esdhc_send_cmd: busy loop 7 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 8 start</div><div>esdhc_send_cmd: busy loop 8 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>esdhc_send_cmd: busy loop 9 start</div><div>esdhc_send_cmd: busy loop 9 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div><div>esdhc_send_cmd: busy loop 10 start</div><div>esdhc_send_cmd: busy loop 10 end, cap=0x07f30000, irqstat=0x00000000, prsstat=0xf7880587</div>

<div>imx-esdhc@imx-esdhc0: timeout 1</div><div>block_cache: blk->ops->read returned -110</div><div>BUG: failure at common/block.c:249/block_put()!</div><div>BUG!</div><div>[<83f349a4>] (unwind_backtrace+0x0/0x9c) from [<83f1c094>] (panic+0x28/0x3c)</div>

<div>[<83f1c094>] (panic+0x28/0x3c) from [<83f05900>] (block_put+0x48/0x8c)</div><div>[<83f05900>] (block_put+0x48/0x8c) from [<83f059ec>] (block_write+0xa8/0x120)</div><div>[<83f059ec>] (block_write+0xa8/0x120) from [<83f2d478>] (cdev_write+0x30/0x34)</div>

<div>[<83f2d478>] (cdev_write+0x30/0x34) from [<83f30970>] (disk_write+0x24/0x30)</div><div>[<83f30970>] (disk_write+0x24/0x30) from [<83f2fabc>] (f_write+0x160/0x27c)</div><div>[<83f2fabc>] (f_write+0x160/0x27c) from [<83f30730>] (fat_write+0x18/0x30)</div>

<div>[<83f30730>] (fat_write+0x18/0x30) from [<83f31220>] (write+0xac/0xd0)</div><div>[<83f31220>] (write+0xac/0xd0) from [<83f21864>] (copy_file+0xec/0x17c)</div><div>[<83f21864>] (copy_file+0xec/0x17c) from [<83f191e0>] (do_cp+0x124/0x158)</div>

<div>[<83f191e0>] (do_cp+0x124/0x158) from [<83f07bb0>] (execute_command+0x38/0x7c)</div><div>[<83f07bb0>] (execute_command+0x38/0x7c) from [<83f03bc8>] (run_list_real+0x8a0/0x998)</div><div>[<83f03bc8>] (run_list_real+0x8a0/0x998) from [<83f03e04>] (parse_stream_outer+0x144/0x240)</div>

<div>[<83f03e04>] (parse_stream_outer+0x144/0x240) from [<83f041fc>] (run_shell+0x3c/0x5c)</div><div>[<83f041fc>] (run_shell+0x3c/0x5c) from [<83f09640>] (start_barebox+0xd4/0x110)</div><div>[<83f09640>] (start_barebox+0xd4/0x110) from [<8010206c>] (0x8010206c)</div>

<div><br></div><div>Removing the loop<=10 limit throws the code into a livelock.</div><div><br></div><div>Any suggestions?</div><div><br></div><div>Cheers</div><div>Roberto</div></div>