diff mbox

[2/4] mmc: pxamci: Enhance error checking

Message ID a8769ce8-2732-1f23-eaca-33591951ee78@tul.cz (mailing list archive)
State New, archived
Headers show

Commit Message

Petr Cvek April 18, 2017, 11:17 p.m. UTC
The pxamci_dma_irq() and pxamci_data_done() should print errors if they
obtains invalid parameters. Make the pxamci_dma_irq() call with
the MMC_DATA_READ flag a fault as the DMA callback is used only for write.

Signed-off-by: Petr Cvek <petr.cvek@tul.cz>
---
 drivers/mmc/host/pxamci.c | 33 ++++++++++++++++++++++++---------
 1 file changed, 24 insertions(+), 9 deletions(-)

Comments

Robert Jarzmik April 19, 2017, 7:12 p.m. UTC | #1
Petr Cvek <petr.cvek@tul.cz> writes:

> The pxamci_dma_irq() and pxamci_data_done() should print errors if they
> obtains invalid parameters. Make the pxamci_dma_irq() call with
> the MMC_DATA_READ flag a fault as the DMA callback is used only for write.
>
> Signed-off-by: Petr Cvek <petr.cvek@tul.cz>
> ---
>  drivers/mmc/host/pxamci.c | 33 ++++++++++++++++++++++++---------
>  1 file changed, 24 insertions(+), 9 deletions(-)
>
> diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
> index 80bc8065b50f..48c26d848e9f 100644
> --- a/drivers/mmc/host/pxamci.c
> +++ b/drivers/mmc/host/pxamci.c
> @@ -354,13 +354,22 @@ static int pxamci_data_done(struct pxamci_host *host, unsigned int stat)
>  	struct mmc_data *data = host->data;
>  	struct dma_chan *chan;
>  
> -	if (!data)
> +	if (!data) {
> +		pr_err("%s: Missing data structure\n",
> +			mmc_hostname(host->mmc));
I'd rather have :
    dev_err(mmc_dev(mmc), ...)

>  		return 0;
> +	}
>  
>  	if (data->flags & MMC_DATA_READ)
>  		chan = host->dma_chan_rx;
> -	else
> +	else if (data->flags & MMC_DATA_WRITE)
>  		chan = host->dma_chan_tx;
> +	else {
> +		pr_err("%s: Unknown data direction, flags=%08x\n",
> +			mmc_hostname(host->mmc), data->flags);
Ditto.

> +	if (!host->data) {
> +		pr_err("%s: Missing data structure\n",
> +			mmc_hostname(host->mmc));
Ditto.

>  		goto out_unlock;
> +	}
>  
> -	if (host->data->flags & MMC_DATA_READ)
> -		chan = host->dma_chan_rx;
> -	else
> -		chan = host->dma_chan_tx;
> +	if (!(host->data->flags & MMC_DATA_WRITE)) {
> +		pr_err("%s: DMA callback is only for tx channel, flags=%x\n",
> +			mmc_hostname(host->mmc), host->data->flags);
Ditto.

> +		goto out_unlock;
> +	}
> +
> +	chan = host->dma_chan_tx;
>  
>  	status = dmaengine_tx_status(chan, host->dma_cookie, &state);
>  
>  	if (likely(status == DMA_COMPLETE)) {
>  		writel(BUF_PART_FULL, host->base + MMC_PRTBUF);
>  	} else {
> -		pr_err("%s: DMA error on %s channel\n", mmc_hostname(host->mmc),
> -			host->data->flags & MMC_DATA_READ ? "rx" : "tx");
> +		pr_err("%s: Invalid DMA status %i\n", mmc_hostname(host->mmc),
> +			status);
Ditto.

Cheers.
diff mbox

Patch

diff --git a/drivers/mmc/host/pxamci.c b/drivers/mmc/host/pxamci.c
index 80bc8065b50f..48c26d848e9f 100644
--- a/drivers/mmc/host/pxamci.c
+++ b/drivers/mmc/host/pxamci.c
@@ -354,13 +354,22 @@  static int pxamci_data_done(struct pxamci_host *host, unsigned int stat)
 	struct mmc_data *data = host->data;
 	struct dma_chan *chan;
 
-	if (!data)
+	if (!data) {
+		pr_err("%s: Missing data structure\n",
+			mmc_hostname(host->mmc));
 		return 0;
+	}
 
 	if (data->flags & MMC_DATA_READ)
 		chan = host->dma_chan_rx;
-	else
+	else if (data->flags & MMC_DATA_WRITE)
 		chan = host->dma_chan_tx;
+	else {
+		pr_err("%s: Unknown data direction, flags=%08x\n",
+			mmc_hostname(host->mmc), data->flags);
+		return 0;
+	}
+
 	dma_unmap_sg(chan->device->dev,
 		     data->sg, data->sg_len, host->dma_dir);
 
@@ -558,21 +567,27 @@  static void pxamci_dma_irq(void *param)
 
 	spin_lock_irqsave(&host->lock, flags);
 
-	if (!host->data)
+	if (!host->data) {
+		pr_err("%s: Missing data structure\n",
+			mmc_hostname(host->mmc));
 		goto out_unlock;
+	}
 
-	if (host->data->flags & MMC_DATA_READ)
-		chan = host->dma_chan_rx;
-	else
-		chan = host->dma_chan_tx;
+	if (!(host->data->flags & MMC_DATA_WRITE)) {
+		pr_err("%s: DMA callback is only for tx channel, flags=%x\n",
+			mmc_hostname(host->mmc), host->data->flags);
+		goto out_unlock;
+	}
+
+	chan = host->dma_chan_tx;
 
 	status = dmaengine_tx_status(chan, host->dma_cookie, &state);
 
 	if (likely(status == DMA_COMPLETE)) {
 		writel(BUF_PART_FULL, host->base + MMC_PRTBUF);
 	} else {
-		pr_err("%s: DMA error on %s channel\n", mmc_hostname(host->mmc),
-			host->data->flags & MMC_DATA_READ ? "rx" : "tx");
+		pr_err("%s: Invalid DMA status %i\n", mmc_hostname(host->mmc),
+			status);
 		host->data->error = -EIO;
 		pxamci_data_done(host, 0);
 	}