From a5f620952f42e31c971a25bb2dc733e27f54faad Mon Sep 17 00:00:00 2001 From: Ravi Gummadidala Date: Mon, 25 Mar 2013 15:29:25 -0700 Subject: [PATCH] msm: ipa: don't send TAG command as part of disconnect BAM level ACK is not seen for some TAG immediate commands issued as part of safe pipe disconnect. Due to this, pipe disconnect hangs. This SW workaround for the suspected HW issue does not issue the TAG immediate command. Change-Id: I0baa633a231ae555aa9bb249e7eda864b2786dad Signed-off-by: Ravi Gummadidala --- drivers/platform/msm/ipa/ipa_client.c | 46 --------------------------- drivers/platform/msm/ipa/ipa_dp.c | 31 ------------------ 2 files changed, 77 deletions(-) diff --git a/drivers/platform/msm/ipa/ipa_client.c b/drivers/platform/msm/ipa/ipa_client.c index e954741672e..cfbedfbb6f4 100644 --- a/drivers/platform/msm/ipa/ipa_client.c +++ b/drivers/platform/msm/ipa/ipa_client.c @@ -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, diff --git a/drivers/platform/msm/ipa/ipa_dp.c b/drivers/platform/msm/ipa/ipa_dp.c index dabf86f2880..bd1da2c8895 100644 --- a/drivers/platform/msm/ipa/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_dp.c @@ -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.