diff options
author | Roy Pledge <Roy.Pledge@freescale.com> | 2013-10-01 15:06:01 (GMT) |
---|---|---|
committer | J. German Rivera <German.Rivera@freescale.com> | 2013-10-09 15:58:41 (GMT) |
commit | dfd7db444fa8588e37a1ceda7bd291f65ea53109 (patch) | |
tree | bed2e6d9c3183916c8bb7450731580f973fa074e /drivers | |
parent | 06efa4ed966546ff9b779af60f035878d55bb1e4 (diff) | |
download | linux-fsl-qoriq-dfd7db444fa8588e37a1ceda7bd291f65ea53109.tar.xz |
Fix 2 errors in USDPAA cleanup processing
The USPDAA cleanup processing wasn't properly merging DMA memory fragments.
Also if a new portal needed to be allocated for Frame Queue cleanup it
wasn't properly assigned to the array of cleanup portals
Signed-off-by: Roy Pledge <Roy.Pledge@freescale.com>
Change-Id: I616d4bdbf1dd356267231e6b642cce112487ed1b
Reviewed-on: http://git.am.freescale.net:8181/5140
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Vakul Garg <vakul@freescale.com>
Reviewed-by: Wang Haiying-R54964 <Haiying.Wang@freescale.com>
Reviewed-by: Rivera Jose-B46482 <German.Rivera@freescale.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/fsl_qbman/fsl_usdpaa.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/drivers/staging/fsl_qbman/fsl_usdpaa.c b/drivers/staging/fsl_qbman/fsl_usdpaa.c index 39ebf40..b9ae8f0 100644 --- a/drivers/staging/fsl_qbman/fsl_usdpaa.c +++ b/drivers/staging/fsl_qbman/fsl_usdpaa.c @@ -222,6 +222,19 @@ static struct mem_fragment *split_frag(struct mem_fragment *frag) return x[2]; } +__maybe_unused static void dump_frags(void) +{ + struct mem_fragment *frag; + int i = 0; + list_for_each_entry(frag, &mem_list, list) { + pr_info("FRAG %d: base 0x%llx pfn_base 0x%llx len 0x%llx " + "root_len 0x%llx refs %d\n", + i, frag->base, frag->pfn_base, + frag->len, frag->root_len, frag->refs); + ++i; + } +} + /* Walk the list of fragments and adjoin neighbouring segments if possible */ static void compress_frags(void) { @@ -235,7 +248,10 @@ static void compress_frags(void) &next_frag->list != &mem_list) { if (next_frag->refs == 0) { /* Merge with next */ + next_frag->base = frag->base; + next_frag->pfn_base = frag->pfn_base; next_frag->len += frag->len; + next_frag->pfn_len += frag->pfn_len; list_del(&frag->list); } } @@ -441,16 +457,6 @@ static bool check_portal_channel(void *ctx, u32 channel) } -__maybe_unused static void dump_frags(void) -{ - struct mem_fragment *frag; - int i = 0; - list_for_each_entry(frag, &mem_list, list) { - pr_info("FRAG %d: base 0x%llx len 0x%llx root_len 0x%llx refs %d\n", - i, frag->base, frag->len, frag->root_len, frag->refs); - ++i; - } -} static int usdpaa_release(struct inode *inode, struct file *filp) @@ -510,7 +516,8 @@ static int usdpaa_release(struct inode *inode, struct file *filp) if (!qm_cleanup_portal) return -ENOMEM; init_qm_portal(qm_alloced_portal, qm_cleanup_portal); - + portal_array[portal_count] = qm_cleanup_portal; + ++portal_count; } if (!bm_cleanup_portal) { bm_alloced_portal = bm_get_unused_portal(); |