diff options
author | Xuelin Shi <b29237@freescale.com> | 2013-06-07 02:53:48 (GMT) |
---|---|---|
committer | Fleming Andrew-AFLEMING <AFLEMING@freescale.com> | 2013-06-07 21:46:54 (GMT) |
commit | 7e953df95c4f5491173e395d26d1bdc143918559 (patch) | |
tree | 5ad28cad01429ec2bfb0880395587de8dceee3cf /drivers/dma | |
parent | 252b622b8058a309d2429a33c2e0de089be896ac (diff) | |
download | linux-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.c | 21 |
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; } |