Re: mmc: dw_mmc: release hardware lock error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

> 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@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


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux