Skip to content

Commit

Permalink
mxcmmc: Fix missing return value checking in DMA setup code.
Browse files Browse the repository at this point in the history
Signed-off-by: Martin Fuzzey <mfuzzey@gmail.com>
  • Loading branch information
Martin Fuzzey authored and Pierre Ossman committed Jun 3, 2009
1 parent 18489fa commit 656217d
Showing 1 changed file with 26 additions and 10 deletions.
36 changes: 26 additions & 10 deletions drivers/mmc/host/mxcmmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -162,14 +162,15 @@ static void mxcmci_softreset(struct mxcmci_host *host)
writew(0xff, host->base + MMC_REG_RES_TO);
}

static void mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
static int mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
{
unsigned int nob = data->blocks;
unsigned int blksz = data->blksz;
unsigned int datasize = nob * blksz;
#ifdef HAS_DMA
struct scatterlist *sg;
int i;
int ret;
#endif
if (data->flags & MMC_DATA_STREAM)
nob = 0xffff;
Expand All @@ -185,7 +186,7 @@ static void mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
for_each_sg(data->sg, sg, data->sg_len, i) {
if (sg->offset & 3 || sg->length & 3) {
host->do_dma = 0;
return;
return 0;
}
}

Expand All @@ -194,23 +195,30 @@ static void mxcmci_setup_data(struct mxcmci_host *host, struct mmc_data *data)
host->dma_nents = dma_map_sg(mmc_dev(host->mmc), data->sg,
data->sg_len, host->dma_dir);

imx_dma_setup_sg(host->dma, data->sg, host->dma_nents, datasize,
host->res->start + MMC_REG_BUFFER_ACCESS,
DMA_MODE_READ);
ret = imx_dma_setup_sg(host->dma, data->sg, host->dma_nents,
datasize,
host->res->start + MMC_REG_BUFFER_ACCESS,
DMA_MODE_READ);
} else {
host->dma_dir = DMA_TO_DEVICE;
host->dma_nents = dma_map_sg(mmc_dev(host->mmc), data->sg,
data->sg_len, host->dma_dir);

imx_dma_setup_sg(host->dma, data->sg, host->dma_nents, datasize,
host->res->start + MMC_REG_BUFFER_ACCESS,
DMA_MODE_WRITE);
ret = imx_dma_setup_sg(host->dma, data->sg, host->dma_nents,
datasize,
host->res->start + MMC_REG_BUFFER_ACCESS,
DMA_MODE_WRITE);
}

if (ret) {
dev_err(mmc_dev(host->mmc), "failed to setup DMA : %d\n", ret);
return ret;
}
wmb();

imx_dma_enable(host->dma);
#endif /* HAS_DMA */
return 0;
}

static int mxcmci_start_cmd(struct mxcmci_host *host, struct mmc_command *cmd,
Expand Down Expand Up @@ -536,6 +544,7 @@ static void mxcmci_request(struct mmc_host *mmc, struct mmc_request *req)
{
struct mxcmci_host *host = mmc_priv(mmc);
unsigned int cmdat = host->cmdat;
int error;

WARN_ON(host->req != NULL);

Expand All @@ -545,15 +554,22 @@ static void mxcmci_request(struct mmc_host *mmc, struct mmc_request *req)
host->do_dma = 1;
#endif
if (req->data) {
mxcmci_setup_data(host, req->data);
error = mxcmci_setup_data(host, req->data);
if (error) {
req->cmd->error = error;
goto out;
}


cmdat |= CMD_DAT_CONT_DATA_ENABLE;

if (req->data->flags & MMC_DATA_WRITE)
cmdat |= CMD_DAT_CONT_WRITE;
}

if (mxcmci_start_cmd(host, req->cmd, cmdat))
error = mxcmci_start_cmd(host, req->cmd, cmdat);
out:
if (error)
mxcmci_finish_request(host, req);
}

Expand Down

0 comments on commit 656217d

Please sign in to comment.