Hi Jaehoon, Sorry for the inconvenience, here is the patch line-wrapping fixed. -------------------->8-------------------->8-------------------- diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c index 2f7f5ee..05ccee8 100644 --- a/drivers/mmc/host/dw_mmc.c +++ b/drivers/mmc/host/dw_mmc.c @@ -520,15 +520,33 @@ static void mci_send_cmd(struct dw_mci_slot *slot, struct dw_mci *host = slot->host; unsigned long timeout = jiffies + msecs_to_jiffies(500); unsigned int cmd_status = 0; + u32 ctrl; +resend: mci_writel(host, CMDARG, arg); wmb(); mci_writel(host, CMD, SDMMC_CMD_START | cmd); + while (time_before(jiffies, timeout)) { cmd_status = mci_readl(host, CMD); if (!(cmd_status & SDMMC_CMD_START)) return; + + if (host->cmd_status & SDMMC_INT_HLE) { + dev_err(&slot->mmc->class_dev, + "Hardware locked error (cmd %#x arg %#x)\n", + cmd, arg); + + ctrl = mci_readl(host, CTRL); + ctrl |= SDMMC_CTRL_RESET; + mci_writel(host, CTRL, ctrl); + + host->cmd_status &= ~SDMMC_INT_HLE; + + goto resend; + } } + dev_err(&slot->mmc->class_dev, "Timeout sending command (cmd %#x arg %#x status %#x)\n", cmd, arg, cmd_status); @@ -1429,6 +1447,12 @@ static irqreturn_t dw_mci_interrupt(int irq, void if (!pending) break; + if (pending & SDMMC_INT_HLE) { + mci_writel(host, RINTSTS, SDMMC_INT_HLE); + host->cmd_status = status; + smp_wmb(); + } + if (pending & DW_MCI_CMD_ERROR_FLAGS) { mci_writel(host, RINTSTS, DW_MCI_CMD_ERROR_FLAGS); host->cmd_status = status; -------------------->8-------------------->8-------------------- On Tue, 28 Feb 2012 16:44:08 +0900, Jaehoon Chung wrote: > Hi Dongjin. > > This patch is corrupt due to line-wrapping. > > Best Regards, > Jaehoon Chung > > On 02/28/2012 04:31 PM, Dongjin Kim wrote: > >> Jaehoon Chung <jh80.chung <at> samsung.com> writes: >> >> >>> On 02/28/2012 02:32 PM, Dongjin Kim wrote: >>> >>>> Hello, >>>> >>>> I encountered the problem that my hardware is frozen while switching >>>> clock >> from >>>> 400kHz to others. This is caused that hardware locked error was >>>> triggered >> when >>>> CMD register was written and interrupt was pended. Tested IP version >>>> is >> 2.10a >>>> >>>> >>> Hi Dongjin. >>> >>> It seems like this problem. Can you check this patch? >>> http://www.spinics.net/lists/linux-mmc/msg09895.html >>> >>> Best Regards, >>> Jaehoon Chung >>> >> Hi Jaehoon, >> >> Thank you for your feedback. >> I had tested the patch from the link but the result is same on my >> hardware. >> >> This is the log message what I had before, the hardware hanged after >> this log when mmc card is inserted. >> >> [ 62.450000] end_request: I/O error, dev mmcblk0, sector 7585 [ >> 62.460000] mmcblk0: error -123 sending read/write command, response >> 0x0, card status 0x0 >> [ 62.470000] end_request: I/O error, dev mmcblk0, sector 7586 [ >> 62.470000] mmcblk0: error -123 sending read/write command, response >> 0x0, card status 0x0 >> [ 62.480000] end_request: I/O error, dev mmcblk0, sector 7587 [ >> 62.490000] mmcblk0: error -123 sending read/write command, response >> 0x0, card status 0x0 >> [ 62.490000] end_request: I/O error, dev mmcblk0, sector 7588 [ >> 62.500000] mmcblk0: error -123 sending read/write command, response >> 0x0, card status 0x0 >> [ 62.510000] end_request: I/O error, dev mmcblk0, sector 7589 [ >> 62.510000] Buffer I/O error on device mmcblk0p1, logical block 940 [ >> 63.770000] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req >> 400000Hz, actual 403225HZ div = 62) >> [ 64.270000] mmc_host mmc1: Timeout sending command (cmd 0x202000 arg >> 0x0 status 0x80202000) >> >> In normal case, the log message have to go through as below and usually >> it is, except on certain case. >> >> [ 80.620000] mmcblk0: error -123 sending read/write command, response >> 0x0, card status 0x0 >> [ 80.620000] mmcblk0: error -123 requesting status [ 80.620000] >> end_request: I/O error, dev mmcblk0, sector 7614 [ 82.930000] >> mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req 400000Hz, >> actual 403225HZ div = 62) >> [ 83.730000] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req >> 50000000Hz, actual 25000000HZ div = 1) [ 83.750000] mmc1: new high >> speed SD card at address 0007 [ 83.760000] mmcblk0: mmc1:0007 SD02G >> 1.84 GiB [ 83.780000] mmcblk0: p1 >> >> Below is the log message with my change to reset the bit, Hardware >> Locked Error. This error is not happening always, I was testing the >> driver removing mmc card without unmount. >> >> [ 118.310000] end_request: I/O error, dev mmcblk1, sector 1108 [ >> 118.310000] mmcblk1: error -123 sending read/write command, response >> 0x0, card status 0x0 >> [ 118.310000] end_request: I/O error, dev mmcblk1, sector 1109 [ >> 124.190000] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz (slot req >> 400000Hz, actual 403225HZ div = 62) >> [ 124.690000] mmc_host mmc1: Timeout sending command (cmd 0x202000 arg >> 0x0 status 0x80202000) >> [ 124.690000] mmc_host mmc1: Hardware locked error (cmd 0x202000 arg >> 0x0) [ 125.550000] mmc_host mmc1: Bus speed (slot 0) = 50000000Hz >> (slot req 50000000Hz, actual 25000000HZ div = 1) [ 125.560000] mmc1: >> new high speed SD card at address 0007 [ 125.560000] mmcblk0: >> mmc1:0007 SD02G 1.84 GiB [ 125.570000] mmcblk0: p1 >> >> Cheers, >> Dongjin. >> >>>> Cheers, >>>> Dongjin. >>>> >>>> diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c >>>> index 2f7f5ee..05ccee8 100644 >>>> --- a/drivers/mmc/host/dw_mmc.c >>>> +++ b/drivers/mmc/host/dw_mmc.c >>>> @@ -520,15 +520,33 @@ static void mci_send_cmd(struct dw_mci_slot >>>> *slot, u32 cmd, u32 arg) >>>> struct dw_mci *host = slot->host; >>>> unsigned long timeout = jiffies + msecs_to_jiffies(500); unsigned >>>> int cmd_status = 0; >>>> + u32 ctrl; >>>> >>>> +resend: >>>> mci_writel(host, CMDARG, arg); >>>> wmb(); >>>> mci_writel(host, CMD, SDMMC_CMD_START | cmd); >>>> + >>>> while (time_before(jiffies, timeout)) { >>>> cmd_status = mci_readl(host, CMD); >>>> if (!(cmd_status & SDMMC_CMD_START)) >>>> return; >>>> + >>>> + if (host->cmd_status & SDMMC_INT_HLE) { + >>>> dev_err(&slot->mmc->class_dev, >>>> + "Hardware locked error (cmd %#x arg %#x) \n", + cmd, arg); >>>> + >>>> + ctrl = mci_readl(host, CTRL); >>>> + ctrl |= SDMMC_CTRL_RESET; >>>> + mci_writel(host, CTRL, ctrl); >>>> + >>>> + host->cmd_status &= ~SDMMC_INT_HLE; + >>>> + goto resend; >>>> + } >>>> } >>>> + >>>> dev_err(&slot->mmc->class_dev, >>>> "Timeout sending command (cmd %#x arg %#x status %#x)\n", cmd, >>>> arg, cmd_status); >>>> @@ -1429,6 +1447,12 @@ static irqreturn_t dw_mci_interrupt(int irq, >>>> void *dev_id) >>>> if (!pending) >>>> break; >>>> >>>> + if (pending & SDMMC_INT_HLE) { >>>> + mci_writel(host, RINTSTS, SDMMC_INT_HLE); + host->cmd_status = >>>> status; >>>> + smp_wmb(); >>>> + } >>>> + >>>> if (pending & DW_MCI_CMD_ERROR_FLAGS) { >>>> mci_writel(host, RINTSTS, DW_MCI_CMD_ERROR_FLAGS); >>>> host->cmd_status = status; >>>> >>>> -- >>>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" >>>> in the body of a message to majordomo <at> vger.kernel.org More >>>> majordomo info at http://vger.kernel.org/majordomo-info.html >>>> >>>> >>> -- >>> To unsubscribe from this list: send the line "unsubscribe linux-mmc" >>> in the body of a message to majordomo <at> vger.kernel.org More >>> majordomo info at http://vger.kernel.org/majordomo-info.html >>> >>> >>> >> >> >> >> -- >> 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 >> -- 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