summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorRoy Pledge <Roy.Pledge@freescale.com>2013-10-01 15:06:01 (GMT)
committerJ. German Rivera <German.Rivera@freescale.com>2013-10-09 15:58:41 (GMT)
commitdfd7db444fa8588e37a1ceda7bd291f65ea53109 (patch)
treebed2e6d9c3183916c8bb7450731580f973fa074e /drivers
parent06efa4ed966546ff9b779af60f035878d55bb1e4 (diff)
downloadlinux-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.c29
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();