summaryrefslogtreecommitdiff
path: root/drivers/dma
diff options
context:
space:
mode:
authorXuelin Shi <b29237@freescale.com>2013-06-07 02:53:48 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-06-07 21:46:54 (GMT)
commit7e953df95c4f5491173e395d26d1bdc143918559 (patch)
tree5ad28cad01429ec2bfb0880395587de8dceee3cf /drivers/dma
parent252b622b8058a309d2429a33c2e0de089be896ac (diff)
downloadlinux-fsl-qoriq-7e953df95c4f5491173e395d26d1bdc143918559.tar.xz
Fix RaidEngine error status 3000000 issue.
When multi flows get into fsl_re_jr_dequeue(...), there is race condition issue about the hardware register writing. Move it into the locked area. Signed-off-by: Xuelin Shi <b29237@freescale.com> Change-Id: I8eb019b4433eab05cf96261326f7e4c1790ff6c6 Reviewed-on: http://git.am.freescale.net:8181/2901 Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com> Reviewed-by: Li Yang-R58472 <LeoLi@freescale.com> Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com> Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/dma')
-rw-r--r--drivers/dma/fsl_raid.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/drivers/dma/fsl_raid.c b/drivers/dma/fsl_raid.c
index f6c704f..4c8a296 100644
--- a/drivers/dma/fsl_raid.c
+++ b/drivers/dma/fsl_raid.c
@@ -191,15 +191,17 @@ static void re_jr_dequeue(unsigned long data)
dev = (struct device *)data;
jr = dev_get_drvdata(dev);
- count = RE_JR_OUB_SLOT_FULL(in_be32(&jr->jrregs->oubring_slot_full));
- out_be32(&jr->jrregs->oubring_job_rmvd, RE_JR_OUB_JOB_REMOVE(count));
-
spin_lock_bh(&jr->desc_lock);
- while (count--) {
- jr->oub_count &= RING_SIZE_MASK;
- desc = &jr->descs[jr->oub_count++];
- list_add_tail(&desc->node, &jr->ack_q);
- re_jr_desc_done(desc);
+ count = RE_JR_OUB_SLOT_FULL(in_be32(&jr->jrregs->oubring_slot_full));
+ if (count) {
+ out_be32(&jr->jrregs->oubring_job_rmvd,
+ RE_JR_OUB_JOB_REMOVE(count));
+ while (count--) {
+ jr->oub_count &= RING_SIZE_MASK;
+ desc = &jr->descs[jr->oub_count++];
+ list_add_tail(&desc->node, &jr->ack_q);
+ re_jr_desc_done(desc);
+ }
}
spin_unlock_bh(&jr->desc_lock);
@@ -331,10 +333,9 @@ static struct fsl_re_dma_async_tx_desc *re_jr_alloc_desc(struct re_jr *jr,
re_jr_issue_pending(&jr->chan);
return NULL;
}
- spin_unlock_bh(&jr->desc_lock);
-
desc->state = RE_DESC_ALLOC;
desc->async_tx.flags = flags;
+ spin_unlock_bh(&jr->desc_lock);
return desc;
}