Merge "msm: ipa: fix IPA driver processing context delete logic"
This commit is contained in:
commit
c3a74e4be7
7 changed files with 44 additions and 17 deletions
|
@ -581,7 +581,8 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bad_len:
|
bad_len:
|
||||||
hdr_entry->ref_cnt--;
|
if (add_ref_hdr)
|
||||||
|
hdr_entry->ref_cnt--;
|
||||||
entry->cookie = 0;
|
entry->cookie = 0;
|
||||||
kmem_cache_free(ipa_ctx->hdr_proc_ctx_cache, entry);
|
kmem_cache_free(ipa_ctx->hdr_proc_ctx_cache, entry);
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
@ -761,7 +762,7 @@ static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (release_hdr)
|
if (release_hdr)
|
||||||
__ipa_release_hdr(entry->hdr->id);
|
__ipa_del_hdr(entry->hdr->id);
|
||||||
|
|
||||||
/* move the offset entry to appropriate free list */
|
/* move the offset entry to appropriate free list */
|
||||||
list_move(&entry->offset_entry->link,
|
list_move(&entry->offset_entry->link,
|
||||||
|
@ -1089,12 +1090,19 @@ int ipa2_reset_hdr(void)
|
||||||
&ipa_ctx->hdr_tbl.head_hdr_entry_list, link) {
|
&ipa_ctx->hdr_tbl.head_hdr_entry_list, link) {
|
||||||
|
|
||||||
/* do not remove the default header */
|
/* do not remove the default header */
|
||||||
if (!strcmp(entry->name, IPA_LAN_RX_HDR_NAME))
|
if (!strcmp(entry->name, IPA_LAN_RX_HDR_NAME)) {
|
||||||
|
if (entry->is_hdr_proc_ctx) {
|
||||||
|
mutex_unlock(&ipa_ctx->lock);
|
||||||
|
WARN_ON(1);
|
||||||
|
IPAERR("default header is proc ctx\n");
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (ipa_id_find(entry->id) == NULL) {
|
if (ipa_id_find(entry->id) == NULL) {
|
||||||
WARN_ON(1);
|
|
||||||
mutex_unlock(&ipa_ctx->lock);
|
mutex_unlock(&ipa_ctx->lock);
|
||||||
|
WARN_ON(1);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
if (entry->is_hdr_proc_ctx) {
|
if (entry->is_hdr_proc_ctx) {
|
||||||
|
@ -1147,8 +1155,8 @@ int ipa2_reset_hdr(void)
|
||||||
link) {
|
link) {
|
||||||
|
|
||||||
if (ipa_id_find(ctx_entry->id) == NULL) {
|
if (ipa_id_find(ctx_entry->id) == NULL) {
|
||||||
WARN_ON(1);
|
|
||||||
mutex_unlock(&ipa_ctx->lock);
|
mutex_unlock(&ipa_ctx->lock);
|
||||||
|
WARN_ON(1);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
list_del(&ctx_entry->link);
|
list_del(&ctx_entry->link);
|
||||||
|
@ -1311,8 +1319,8 @@ int ipa2_put_hdr(u32 hdr_hdl)
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry == NULL || entry->cookie != IPA_COOKIE) {
|
if (entry->cookie != IPA_COOKIE) {
|
||||||
IPAERR("bad params\n");
|
IPAERR("invalid header entry\n");
|
||||||
result = -EINVAL;
|
result = -EINVAL;
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
|
@ -242,7 +242,7 @@ struct ipa_rt_tbl {
|
||||||
* @is_partial: flag indicating if header table entry is partial
|
* @is_partial: flag indicating if header table entry is partial
|
||||||
* @is_hdr_proc_ctx: false - hdr entry resides in hdr table,
|
* @is_hdr_proc_ctx: false - hdr entry resides in hdr table,
|
||||||
* true - hdr entry resides in DDR and pointed to by proc ctx
|
* true - hdr entry resides in DDR and pointed to by proc ctx
|
||||||
* @phys_base: physical address of entry in SRAM when is_hdr_proc_ctx is true,
|
* @phys_base: physical address of entry in DDR when is_hdr_proc_ctx is true,
|
||||||
* else 0
|
* else 0
|
||||||
* @proc_ctx: processing context header
|
* @proc_ctx: processing context header
|
||||||
* @offset_entry: entry's offset
|
* @offset_entry: entry's offset
|
||||||
|
|
|
@ -1008,6 +1008,10 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ipa_insert_failed:
|
ipa_insert_failed:
|
||||||
|
if (entry->hdr)
|
||||||
|
entry->hdr->ref_cnt--;
|
||||||
|
else if (entry->proc_ctx)
|
||||||
|
entry->proc_ctx->ref_cnt--;
|
||||||
list_del(&entry->link);
|
list_del(&entry->link);
|
||||||
kmem_cache_free(ipa_ctx->rt_rule_cache, entry);
|
kmem_cache_free(ipa_ctx->rt_rule_cache, entry);
|
||||||
error:
|
error:
|
||||||
|
|
|
@ -418,7 +418,8 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
bad_len:
|
bad_len:
|
||||||
hdr_entry->ref_cnt--;
|
if (add_ref_hdr)
|
||||||
|
hdr_entry->ref_cnt--;
|
||||||
entry->cookie = 0;
|
entry->cookie = 0;
|
||||||
kmem_cache_free(ipa3_ctx->hdr_proc_ctx_cache, entry);
|
kmem_cache_free(ipa3_ctx->hdr_proc_ctx_cache, entry);
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
@ -589,7 +590,7 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (release_hdr)
|
if (release_hdr)
|
||||||
__ipa3_release_hdr(entry->hdr->id);
|
__ipa3_del_hdr(entry->hdr->id);
|
||||||
|
|
||||||
/* move the offset entry to appropriate free list */
|
/* move the offset entry to appropriate free list */
|
||||||
list_move(&entry->offset_entry->link,
|
list_move(&entry->offset_entry->link,
|
||||||
|
@ -893,12 +894,19 @@ int ipa3_reset_hdr(void)
|
||||||
&ipa3_ctx->hdr_tbl.head_hdr_entry_list, link) {
|
&ipa3_ctx->hdr_tbl.head_hdr_entry_list, link) {
|
||||||
|
|
||||||
/* do not remove the default header */
|
/* do not remove the default header */
|
||||||
if (!strcmp(entry->name, IPA_LAN_RX_HDR_NAME))
|
if (!strcmp(entry->name, IPA_LAN_RX_HDR_NAME)) {
|
||||||
|
if (entry->is_hdr_proc_ctx) {
|
||||||
|
IPAERR("default header is proc ctx\n");
|
||||||
|
mutex_unlock(&ipa3_ctx->lock);
|
||||||
|
WARN_ON(1);
|
||||||
|
return -EFAULT;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (ipa3_id_find(entry->id) == NULL) {
|
if (ipa3_id_find(entry->id) == NULL) {
|
||||||
WARN_ON(1);
|
|
||||||
mutex_unlock(&ipa3_ctx->lock);
|
mutex_unlock(&ipa3_ctx->lock);
|
||||||
|
WARN_ON(1);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
if (entry->is_hdr_proc_ctx) {
|
if (entry->is_hdr_proc_ctx) {
|
||||||
|
@ -951,8 +959,8 @@ int ipa3_reset_hdr(void)
|
||||||
link) {
|
link) {
|
||||||
|
|
||||||
if (ipa3_id_find(ctx_entry->id) == NULL) {
|
if (ipa3_id_find(ctx_entry->id) == NULL) {
|
||||||
WARN_ON(1);
|
|
||||||
mutex_unlock(&ipa3_ctx->lock);
|
mutex_unlock(&ipa3_ctx->lock);
|
||||||
|
WARN_ON(1);
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
list_del(&ctx_entry->link);
|
list_del(&ctx_entry->link);
|
||||||
|
@ -1115,8 +1123,8 @@ int ipa3_put_hdr(u32 hdr_hdl)
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (entry == NULL || entry->cookie != IPA_COOKIE) {
|
if (entry->cookie != IPA_COOKIE) {
|
||||||
IPAERR("bad params\n");
|
IPAERR("invalid header entry\n");
|
||||||
result = -EINVAL;
|
result = -EINVAL;
|
||||||
goto bail;
|
goto bail;
|
||||||
}
|
}
|
||||||
|
|
|
@ -271,7 +271,7 @@ struct ipa3_rt_tbl {
|
||||||
* @is_partial: flag indicating if header table entry is partial
|
* @is_partial: flag indicating if header table entry is partial
|
||||||
* @is_hdr_proc_ctx: false - hdr entry resides in hdr table,
|
* @is_hdr_proc_ctx: false - hdr entry resides in hdr table,
|
||||||
* true - hdr entry resides in DDR and pointed to by proc ctx
|
* true - hdr entry resides in DDR and pointed to by proc ctx
|
||||||
* @phys_base: physical address of entry in SRAM when is_hdr_proc_ctx is true,
|
* @phys_base: physical address of entry in DDR when is_hdr_proc_ctx is true,
|
||||||
* else 0
|
* else 0
|
||||||
* @proc_ctx: processing context header
|
* @proc_ctx: processing context header
|
||||||
* @offset_entry: entry's offset
|
* @offset_entry: entry's offset
|
||||||
|
|
|
@ -957,6 +957,10 @@ static int __ipa_finish_rt_rule_add(struct ipa3_rt_entry *entry, u32 *rule_hdl,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ipa_insert_failed:
|
ipa_insert_failed:
|
||||||
|
if (entry->hdr)
|
||||||
|
entry->hdr->ref_cnt--;
|
||||||
|
else if (entry->proc_ctx)
|
||||||
|
entry->proc_ctx->ref_cnt--;
|
||||||
idr_remove(&tbl->rule_ids, entry->rule_id);
|
idr_remove(&tbl->rule_ids, entry->rule_id);
|
||||||
list_del(&entry->link);
|
list_del(&entry->link);
|
||||||
kmem_cache_free(ipa3_ctx->rt_rule_cache, entry);
|
kmem_cache_free(ipa3_ctx->rt_rule_cache, entry);
|
||||||
|
|
|
@ -1215,7 +1215,10 @@ int ipahal_cp_proc_ctx_to_hw_buff(enum ipa_hdr_proc_type type,
|
||||||
(!phys_base && !hdr_base_addr) ||
|
(!phys_base && !hdr_base_addr) ||
|
||||||
!hdr_base_addr ||
|
!hdr_base_addr ||
|
||||||
((is_hdr_proc_ctx == false) && !offset_entry)) {
|
((is_hdr_proc_ctx == false) && !offset_entry)) {
|
||||||
IPAHAL_ERR("failed on validating params");
|
IPAHAL_ERR(
|
||||||
|
"invalid input: hdr_len:%u phys_base:%pad hdr_base_addr:%u is_hdr_proc_ctx:%d offset_entry:%pK\n"
|
||||||
|
, hdr_len, &phys_base, hdr_base_addr
|
||||||
|
, is_hdr_proc_ctx, offset_entry);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue