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