Dear James, Its not sufficient.In my case, sdio_reset command was submitted to dw_mmc controller before interrupts are enabled. By looking at your log,it seems something wrong with frequency set by your U-boot. Best Regards Yuvaraj On Mon, Nov 19, 2012 at 6:50 PM, James Hogan <james.hogan@xxxxxxxxxx> wrote: > On 19/11/12 13:01, Yuvaraj CD wrote: >> As mmc_start_host is getting called before enabling the dw_mmc controller >> interrupt, there is a problem of missing the SDMMC_INT_CMD_DONE for the >> very first command sent by the sdio_reset. >> This problem occurs only when we disable MMC debugging i.e, MMC_DEBUG [=n]. >> Hence this patch enables the dw_mmc controller interrupt before mmc_start_host. >> >> Signed-off-by: Yuvaraj CD <yuvaraj.cd@xxxxxxxxxxx> > > Hi Yuvaraj, > > I get the following errors after this patch is applied > (2da1d7f2948900cd50d38643db39f790edb3cc96, merged in v3.7-rc5) and the > driver doesn't work as a result. Reverting it fixes the problem. > > mmc0: error -110 whilst initialising SD card > mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 300000Hz, actual 298922HZ div = 167) > mmc0: error -110 whilst initialising SD card > mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 200000Hz, actual 199680HZ div = 250) > mmc0: error -110 whilst initialising SD card > mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 195765Hz, actual 195764HZ div = 255) > mmc0: error -110 whilst initialising SD card > mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 400000Hz, actual 399360HZ div = 125) > mmc0: error -110 whilst initialising SD card > mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 300000Hz, actual 298922HZ div = 167) > mmc0: error -110 whilst initialising SD card > mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 200000Hz, actual 199680HZ div = 250) > mmc0: error -110 whilst initialising SD card > mmc_host mmc0: Bus speed (slot 0) = 99840000Hz (slot req 195765Hz, actual 195764HZ div = 255) > mmc0: error -110 whilst initialising SD card > > The interrupts are already cleared and disabled at the beginning of the > probe function, so is the following sufficient (after reverting your > patch) to fix the problem you've been observing? > > Thanks > James > > diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c > index ec9b5a8..2be9899 100644 > --- a/drivers/mmc/host/dw_mmc.c > +++ b/drivers/mmc/host/dw_mmc.c > @@ -2266,7 +2266,6 @@ int dw_mci_probe(struct dw_mci *host) > * Enable interrupts for command done, data over, data empty, card det, > * receive ready and error such as transmit, receive timeout, crc error > */ > - mci_writel(host, RINTSTS, 0xFFFFFFFF); > mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER | > SDMMC_INT_TXDR | SDMMC_INT_RXDR | > DW_MCI_ERROR_FLAGS | SDMMC_INT_CD); > > >> --- >> drivers/mmc/host/dw_mmc.c | 29 +++++++++++++++-------------- >> 1 file changed, 15 insertions(+), 14 deletions(-) >> >> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c >> index a23af77..729c031 100644 >> --- a/drivers/mmc/host/dw_mmc.c >> +++ b/drivers/mmc/host/dw_mmc.c >> @@ -2233,6 +2233,21 @@ int dw_mci_probe(struct dw_mci *host) >> else >> host->num_slots = ((mci_readl(host, HCON) >> 1) & 0x1F) + 1; >> >> + /* >> + * Enable interrupts for command done, data over, data empty, card det, >> + * receive ready and error such as transmit, receive timeout, crc error >> + */ >> + mci_writel(host, RINTSTS, 0xFFFFFFFF); >> + mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER | >> + SDMMC_INT_TXDR | SDMMC_INT_RXDR | >> + DW_MCI_ERROR_FLAGS | SDMMC_INT_CD); >> + mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci >> interrupt */ >> + >> + dev_info(host->dev, "DW MMC controller at irq %d, " >> + "%d bit host data width, " >> + "%u deep fifo\n", >> + host->irq, width, fifo_size); >> + >> /* We need at least one slot to succeed */ >> for (i = 0; i < host->num_slots; i++) { >> ret = dw_mci_init_slot(host, i); >> @@ -2262,20 +2277,6 @@ int dw_mci_probe(struct dw_mci *host) >> else >> host->data_offset = DATA_240A_OFFSET; >> >> - /* >> - * Enable interrupts for command done, data over, data empty, card det, >> - * receive ready and error such as transmit, receive timeout, crc error >> - */ >> - mci_writel(host, RINTSTS, 0xFFFFFFFF); >> - mci_writel(host, INTMASK, SDMMC_INT_CMD_DONE | SDMMC_INT_DATA_OVER | >> - SDMMC_INT_TXDR | SDMMC_INT_RXDR | >> - DW_MCI_ERROR_FLAGS | SDMMC_INT_CD); >> - mci_writel(host, CTRL, SDMMC_CTRL_INT_ENABLE); /* Enable mci >> interrupt */ >> - >> - dev_info(host->dev, "DW MMC controller at irq %d, " >> - "%d bit host data width, " >> - "%u deep fifo\n", >> - host->irq, width, fifo_size); >> if (host->quirks & DW_MCI_QUIRK_IDMAC_DTO) >> dev_info(host->dev, "Internal DMAC interrupt fix enabled.\n"); >> >> -- >> 1.7.9.5 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> >> >> -- >> James Hogan >> > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html