diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c index 15c8f923d4f4..e0868ad83bf4 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c @@ -1249,7 +1249,8 @@ int ipa2_reset_hdr(bool user_only) struct ipa_hdr_offset_entry *off_next; struct ipa_hdr_proc_ctx_offset_entry *ctx_off_entry; struct ipa_hdr_proc_ctx_offset_entry *ctx_off_next; - int i; + int i, end = 0; + bool user_rule = false; /* * issue a reset on the routing module since routing rules point to @@ -1287,6 +1288,9 @@ int ipa2_reset_hdr(bool user_only) return -EFAULT; } + if (entry->ipacm_installed) + user_rule = true; + if (!user_only || entry->ipacm_installed) { if (entry->is_hdr_proc_ctx) { dma_unmap_single(ipa_ctx->pdev, @@ -1296,6 +1300,7 @@ int ipa2_reset_hdr(bool user_only) entry->proc_ctx = NULL; } list_del(&entry->link); + ipa_ctx->hdr_tbl.hdr_cnt--; entry->ref_cnt = 0; entry->cookie = 0; @@ -1321,6 +1326,13 @@ int ipa2_reset_hdr(bool user_only) list_del(&off_entry->link); kmem_cache_free(ipa_ctx->hdr_offset_cache, off_entry); + } else { + if (off_entry->offset + + ipa_hdr_bin_sz[off_entry->bin] > end) { + end = off_entry->offset + + ipa_hdr_bin_sz[off_entry->bin]; + IPADBG("replace end = %d\n", end); + } } } list_for_each_entry_safe(off_entry, off_next, @@ -1335,11 +1347,15 @@ int ipa2_reset_hdr(bool user_only) } } } - /* there is one header of size 8 */ - ipa_ctx->hdr_tbl.end = 8; - ipa_ctx->hdr_tbl.hdr_cnt = 1; + IPADBG("hdr_tbl.end = %d\n", end); + if (user_rule) { + ipa_ctx->hdr_tbl.end = end; + IPADBG("hdr_tbl.end = %d\n", end); + } IPADBG("reset hdr proc ctx\n"); + user_rule = false; + end = 0; list_for_each_entry_safe( ctx_entry, ctx_next, @@ -1352,9 +1368,13 @@ int ipa2_reset_hdr(bool user_only) return -EFAULT; } + if (entry->ipacm_installed) + user_rule = true; + if (!user_only || ctx_entry->ipacm_installed) { list_del(&ctx_entry->link); + ipa_ctx->hdr_proc_ctx_tbl.proc_ctx_cnt--; ctx_entry->ref_cnt = 0; ctx_entry->cookie = 0; @@ -1375,6 +1395,14 @@ int ipa2_reset_hdr(bool user_only) kmem_cache_free( ipa_ctx->hdr_proc_ctx_offset_cache, ctx_off_entry); + } else { + if (ctx_off_entry->offset + + ipa_hdr_bin_sz[ctx_off_entry->bin] + > end) { + end = ctx_off_entry->offset + + ipa_hdr_bin_sz[ctx_off_entry->bin]; + IPADBG("replace hdr_proc as %d\n", end); + } } } list_for_each_entry_safe(ctx_off_entry, ctx_off_next, @@ -1390,8 +1418,12 @@ int ipa2_reset_hdr(bool user_only) } } } - ipa_ctx->hdr_proc_ctx_tbl.end = 0; - ipa_ctx->hdr_proc_ctx_tbl.proc_ctx_cnt = 0; + + IPADBG("hdr_proc_tbl.end = %d\n", end); + if (user_rule) { + ipa_ctx->hdr_proc_ctx_tbl.end = end; + IPADBG("hdr_proc_tbl.end = %d\n", end); + } mutex_unlock(&ipa_ctx->lock); return 0; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c index f71eb952cde2..956546a30648 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c @@ -654,7 +654,6 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, return 0; } - int __ipa3_del_hdr(u32 hdr_hdl, bool by_user) { struct ipa3_hdr_entry *entry; @@ -994,7 +993,8 @@ int ipa3_reset_hdr(bool user_only) struct ipa_hdr_offset_entry *off_next; struct ipa3_hdr_proc_ctx_offset_entry *ctx_off_entry; struct ipa3_hdr_proc_ctx_offset_entry *ctx_off_next; - int i; + int i, end = 0; + bool user_rule = false; /* * issue a reset on the routing module since routing rules point to @@ -1032,6 +1032,9 @@ int ipa3_reset_hdr(bool user_only) return -EFAULT; } + if (entry->ipacm_installed) + user_rule = true; + if (!user_only || entry->ipacm_installed) { if (entry->is_hdr_proc_ctx) { dma_unmap_single(ipa3_ctx->pdev, @@ -1041,6 +1044,7 @@ int ipa3_reset_hdr(bool user_only) entry->proc_ctx = NULL; } list_del(&entry->link); + ipa3_ctx->hdr_tbl.hdr_cnt--; entry->ref_cnt = 0; entry->cookie = 0; @@ -1066,6 +1070,13 @@ int ipa3_reset_hdr(bool user_only) list_del(&off_entry->link); kmem_cache_free(ipa3_ctx->hdr_offset_cache, off_entry); + } else { + if (off_entry->offset + + ipa_hdr_bin_sz[off_entry->bin] > end) { + end = off_entry->offset + + ipa_hdr_bin_sz[off_entry->bin]; + IPADBG("replace end = %d\n", end); + } } } list_for_each_entry_safe(off_entry, off_next, @@ -1080,11 +1091,15 @@ int ipa3_reset_hdr(bool user_only) } } } - /* there is one header of size 8 */ - ipa3_ctx->hdr_tbl.end = 8; - ipa3_ctx->hdr_tbl.hdr_cnt = 1; + IPADBG("hdr_tbl.end = %d\n", end); + if (user_rule) { + ipa3_ctx->hdr_tbl.end = end; + IPADBG("hdr_tbl.end = %d\n", end); + } IPADBG("reset hdr proc ctx\n"); + user_rule = false; + end = 0; list_for_each_entry_safe( ctx_entry, ctx_next, @@ -1097,9 +1112,13 @@ int ipa3_reset_hdr(bool user_only) return -EFAULT; } + if (entry->ipacm_installed) + user_rule = true; + if (!user_only || ctx_entry->ipacm_installed) { list_del(&ctx_entry->link); + ipa3_ctx->hdr_proc_ctx_tbl.proc_ctx_cnt--; ctx_entry->ref_cnt = 0; ctx_entry->cookie = 0; @@ -1120,6 +1139,14 @@ int ipa3_reset_hdr(bool user_only) kmem_cache_free( ipa3_ctx->hdr_proc_ctx_offset_cache, ctx_off_entry); + } else { + if (ctx_off_entry->offset + + ipa_hdr_bin_sz[ctx_off_entry->bin] + > end) { + end = ctx_off_entry->offset + + ipa_hdr_bin_sz[ctx_off_entry->bin]; + IPADBG("replace hdr_proc as %d\n", end); + } } } list_for_each_entry_safe(ctx_off_entry, ctx_off_next, @@ -1135,8 +1162,12 @@ int ipa3_reset_hdr(bool user_only) } } } - ipa3_ctx->hdr_proc_ctx_tbl.end = 0; - ipa3_ctx->hdr_proc_ctx_tbl.proc_ctx_cnt = 0; + + IPADBG("hdr_proc_tbl.end = %d\n", end); + if (user_rule) { + ipa3_ctx->hdr_proc_ctx_tbl.end = end; + IPADBG("hdr_proc_tbl.end = %d\n", end); + } mutex_unlock(&ipa3_ctx->lock); return 0;