Merge "msm: ipa: don't send TAG command as part of disconnect"

This commit is contained in:
Linux Build Service Account
2013-03-26 00:35:54 -07:00
committed by Gerrit - the friendly Code Review server
2 changed files with 0 additions and 77 deletions
-46
View File
@@ -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,
-31
View File
@@ -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.