diff options
| author | Yun Park <yunp@qca.qualcomm.com> | 2015-01-20 22:23:47 -0800 |
|---|---|---|
| committer | AnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com> | 2015-02-06 15:09:09 +0530 |
| commit | 37b355d8cc9bdb797b37a86ec2cde8629d9baba2 (patch) | |
| tree | da78cdc5d5d9e180effd9438f3a6f0c3f8e04dce | |
| parent | 7b51e146c8c3fb7198f1c47cca3c24af8100e1c0 (diff) | |
qcacld: IPA uC: Intra-BSS offload - forward non-IP exception packets to Tx
When enabled intra-BSS forwarding offload, non-IP exception packets should
be forwarded to Tx from the WLAN IPA exception callback function.
Change-Id: Ia6385f806527779e74e887d58eb1e349a6677d54
CRs-fixed: 770042
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_ipa.c | 49 | ||||
| -rwxr-xr-x | Kbuild | 1 |
2 files changed, 46 insertions, 4 deletions
diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c index 897c12b36bbc..640c368af776 100644 --- a/CORE/HDD/src/wlan_hdd_ipa.c +++ b/CORE/HDD/src/wlan_hdd_ipa.c @@ -302,6 +302,8 @@ struct hdd_ipa_stats { uint64_t num_freeq_empty; uint64_t num_pri_freeq_empty; uint64_t num_rx_excep; + uint64_t num_tx_bcmc; + uint64_t num_tx_bcmc_err; }; #ifdef IPA_UC_OFFLOAD @@ -1047,12 +1049,16 @@ static void hdd_ipa_uc_op_cb(struct op_msg_type *op_msg, void *usr_ctxt) "IND RING SIZE: %d\n" "IND RING DBELL : 0x%x\n" "PROC DONE IND ADDR : 0x%x\n" - "NUM EXCP PKT : %llu", + "NUM EXCP PKT : %llu\n" + "NUM TX BCMC : %llu\n" + "NUM TX BCMC ERR : %llu", hdd_ctx->rx_rdy_ring_base_paddr, hdd_ctx->rx_rdy_ring_size, hdd_ctx->rx_ready_doorbell_paddr, hdd_ctx->rx_proc_done_idx_paddr, - hdd_ipa->stats.num_rx_excep); + hdd_ipa->stats.num_rx_excep, + hdd_ipa->stats.num_tx_bcmc, + hdd_ipa->stats.num_tx_bcmc_err); VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, "==== IPA_UC WLAN_HOST CONTROL ====\n" "SAP NUM STAs: %d\n" @@ -2163,8 +2169,14 @@ static void hdd_ipa_w2i_cb(void *priv, enum ipa_dp_evt_type evt, struct ipa_tx_data_desc *done_desc_head, *done_desc, *tmp; adf_nbuf_t skb; uint8_t iface_id; + struct hdd_ipa_iface_context *iface_context; #ifdef IPA_UC_OFFLOAD uint8_t session_id; +#ifdef INTRA_BSS_FWD_OFFLOAD + struct ethhdr *eth; + adf_nbuf_t copy; + int ret; +#endif #endif adf_nbuf_t buf; @@ -2197,7 +2209,8 @@ static void hdd_ipa_w2i_cb(void *priv, enum ipa_dp_evt_type evt, return; } - adapter = hdd_ipa->iface_context[iface_id].adapter; + iface_context = &hdd_ipa->iface_context[iface_id]; + adapter = iface_context->adapter; HDD_IPA_DBG_DUMP(VOS_TRACE_LEVEL_DEBUG, "w2i -- skb", skb->data, 8); @@ -2211,7 +2224,35 @@ static void hdd_ipa_w2i_cb(void *priv, enum ipa_dp_evt_type evt, skb_pull(skb, HDD_IPA_WLAN_CLD_HDR_LEN); } - hdd_ipa->iface_context[iface_id].stats.num_rx_ipa_excep++; + iface_context->stats.num_rx_ipa_excep++; + +#if defined(IPA_UC_OFFLOAD) && defined(INTRA_BSS_FWD_OFFLOAD) + eth = (struct ethhdr *)skb->data; + + /* + * When INTRA_BSS_FWD_OFFLOAD is enabled, FW will send all Rx + * packets to IPA uC, which need to be forwarded to other + * interface. + * And, since only IP packets are forwarded through IPA Ethernet + * Bridging, non-IP exception packets should be forwarded to Tx + * here. + */ + if (eth->h_proto != be16_to_cpu(ETH_P_IP)) { + copy = adf_nbuf_copy(skb); + if (copy) { + ret = hdd_softap_hard_start_xmit( + (struct sk_buff *)copy, adapter->dev); + if (ret) { + HDD_IPA_LOG(VOS_TRACE_LEVEL_DEBUG, + "Forward packet tx fail"); + hdd_ipa->stats.num_tx_bcmc_err++; + } else { + hdd_ipa->stats.num_tx_bcmc++; + } + } + } +#endif + hdd_ipa_send_skb_to_network(skb, adapter); break; case IPA_WRITE_DONE: @@ -1203,6 +1203,7 @@ ifeq ($(CONFIG_IPA_UC_OFFLOAD), 1) CDEFINES += -DIPA_UC_OFFLOAD ifeq ($(CONFIG_ARCH_MDM9640), y) CDEFINES += -DIPA_UC_STA_OFFLOAD +CDEFINES += -DINTRA_BSS_FWD_OFFLOAD else CDEFINES += -DQCA_CONFIG_SMP endif |
