forked from rubenslte/android_kernel_samsung_msm8226
Merge "msm: ipa: don't send TAG command as part of disconnect"
This commit is contained in:
committed by
Gerrit - the friendly Code Review server
commit
b0b2953308
@@ -31,56 +31,17 @@ static void ipa_enable_data_path(u32 clnt_hdl)
|
||||
|
||||
static int ipa_disable_data_path(u32 clnt_hdl)
|
||||
{
|
||||
DECLARE_COMPLETION_ONSTACK(tag_rsp);
|
||||
struct ipa_desc desc = {0};
|
||||
struct ipa_ip_packet_tag cmd;
|
||||
struct ipa_ep_context *ep = &ipa_ctx->ep[clnt_hdl];
|
||||
struct ipa_tree_node *node;
|
||||
int result = 0;
|
||||
|
||||
if (ipa_ctx->ipa_hw_mode == IPA_HW_MODE_VIRTUAL) {
|
||||
/* IPA_HW_MODE_VIRTUAL lacks support for TAG IC & EP suspend */
|
||||
return 0;
|
||||
}
|
||||
|
||||
node = kmem_cache_zalloc(ipa_ctx->tree_node_cache, GFP_KERNEL);
|
||||
if (!node) {
|
||||
IPAERR("failed to alloc tree node object\n");
|
||||
result = -ENOMEM;
|
||||
goto fail_alloc;
|
||||
}
|
||||
|
||||
if (ipa_ctx->ipa_hw_type == IPA_HW_v1_1 && !ep->suspended) {
|
||||
ipa_write_reg(ipa_ctx->mmio,
|
||||
IPA_ENDP_INIT_CTRL_n_OFST(clnt_hdl), 1);
|
||||
|
||||
cmd.tag = (u32) &tag_rsp;
|
||||
|
||||
desc.pyld = &cmd;
|
||||
desc.len = sizeof(struct ipa_ip_packet_tag);
|
||||
desc.type = IPA_IMM_CMD_DESC;
|
||||
desc.opcode = IPA_IP_PACKET_TAG;
|
||||
|
||||
IPADBG("Wait on TAG %p clnt=%d\n", &tag_rsp, clnt_hdl);
|
||||
|
||||
node->hdl = cmd.tag;
|
||||
mutex_lock(&ipa_ctx->lock);
|
||||
if (ipa_insert(&ipa_ctx->tag_tree, node)) {
|
||||
IPAERR("failed to add to tree\n");
|
||||
result = -EINVAL;
|
||||
mutex_unlock(&ipa_ctx->lock);
|
||||
goto fail_insert;
|
||||
}
|
||||
mutex_unlock(&ipa_ctx->lock);
|
||||
|
||||
if (ipa_send_cmd(1, &desc)) {
|
||||
ipa_write_reg(ipa_ctx->mmio,
|
||||
IPA_ENDP_INIT_CTRL_n_OFST(clnt_hdl), 0);
|
||||
IPAERR("fail to send TAG command\n");
|
||||
result = -EPERM;
|
||||
goto fail_send;
|
||||
}
|
||||
wait_for_completion(&tag_rsp);
|
||||
if (IPA_CLIENT_IS_CONS(ep->client) &&
|
||||
ep->cfg.aggr.aggr_en == IPA_ENABLE_AGGR &&
|
||||
ep->cfg.aggr.aggr_time_limit)
|
||||
@@ -89,13 +50,6 @@ static int ipa_disable_data_path(u32 clnt_hdl)
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail_send:
|
||||
rb_erase(&node->node, &ipa_ctx->tag_tree);
|
||||
fail_insert:
|
||||
kmem_cache_free(ipa_ctx->tree_node_cache, node);
|
||||
fail_alloc:
|
||||
return result;
|
||||
}
|
||||
|
||||
static int ipa_connect_configure_sps(const struct ipa_connect_params *in,
|
||||
|
||||
@@ -528,8 +528,6 @@ int ipa_handle_rx_core(bool process_all, bool in_poll_state)
|
||||
struct ipa_sys_context *sys = &ipa_ctx->sys[IPA_A5_LAN_WAN_IN];
|
||||
struct ipa_ep_context *ep;
|
||||
int cnt = 0;
|
||||
struct completion *compl;
|
||||
struct ipa_tree_node *node;
|
||||
unsigned int src_pipe;
|
||||
|
||||
while ((in_poll_state ? atomic_read(&ipa_ctx->curr_polling_state) :
|
||||
@@ -584,35 +582,6 @@ int ipa_handle_rx_core(bool process_all, bool in_poll_state)
|
||||
IPA_STATS_INC_CNT(ipa_ctx->stats.rx_pkts);
|
||||
IPA_STATS_EXCP_CNT(mux_hdr->flags, ipa_ctx->stats.rx_excp_pkts);
|
||||
|
||||
if (unlikely(mux_hdr->flags & IPA_A5_MUX_HDR_EXCP_FLAG_TAG)) {
|
||||
if (ipa_ctx->ipa_hw_mode != IPA_HW_MODE_VIRTUAL) {
|
||||
/* retrieve the compl object from tag value */
|
||||
mux_hdr++;
|
||||
compl = (struct completion *)
|
||||
ntohl(*((u32 *)mux_hdr));
|
||||
IPADBG("%x %x %p\n", *(u32 *)mux_hdr,
|
||||
*((u32 *)mux_hdr + 1), compl);
|
||||
|
||||
mutex_lock(&ipa_ctx->lock);
|
||||
node = ipa_search(&ipa_ctx->tag_tree,
|
||||
(u32)compl);
|
||||
if (node) {
|
||||
complete_all(compl);
|
||||
rb_erase(&node->node,
|
||||
&ipa_ctx->tag_tree);
|
||||
kmem_cache_free(
|
||||
ipa_ctx->tree_node_cache, node);
|
||||
} else {
|
||||
WARN_ON(1);
|
||||
}
|
||||
mutex_unlock(&ipa_ctx->lock);
|
||||
}
|
||||
dev_kfree_skb(rx_skb);
|
||||
ipa_replenish_rx_cache();
|
||||
++cnt;
|
||||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Any packets arriving over AMPDU_TX should be dispatched
|
||||
* to the regular WLAN RX data-path.
|
||||
|
||||
Reference in New Issue
Block a user