summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYun Park <yunp@qca.qualcomm.com>2015-01-20 22:23:47 -0800
committerAnjaneeDevi Kapparapu <c_akappa@qti.qualcomm.com>2015-02-06 15:09:09 +0530
commit37b355d8cc9bdb797b37a86ec2cde8629d9baba2 (patch)
treeda78cdc5d5d9e180effd9438f3a6f0c3f8e04dce
parent7b51e146c8c3fb7198f1c47cca3c24af8100e1c0 (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.c49
-rwxr-xr-xKbuild1
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:
diff --git a/Kbuild b/Kbuild
index c9b55cd54470..d343bdea99a3 100755
--- a/Kbuild
+++ b/Kbuild
@@ -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