summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CORE/HDD/src/wlan_hdd_ipa.c87
1 files changed, 54 insertions, 33 deletions
diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c
index 6241785f2733..8ab721415eec 100644
--- a/CORE/HDD/src/wlan_hdd_ipa.c
+++ b/CORE/HDD/src/wlan_hdd_ipa.c
@@ -1077,50 +1077,63 @@ static void hdd_ipa_i2w_cb(void *priv, enum ipa_dp_evt_type evt,
struct hdd_ipa_iface_context *iface_context;
adf_nbuf_t skb;
v_U8_t interface_id;
+ hdd_adapter_t *adapter = NULL;
- if (evt == IPA_RECEIVE) {
-
- iface_context = (struct hdd_ipa_iface_context *) priv;
- ipa_tx_desc = (struct ipa_rx_data *)data;
- skb = ipa_tx_desc->skb;
+ if (evt != IPA_RECEIVE) {
+ skb = (adf_nbuf_t) data;
+ dev_kfree_skb_any(skb);
+ return;
+ }
- hdd_ipa = iface_context->hdd_ipa;
+ iface_context = (struct hdd_ipa_iface_context *) priv;
+ ipa_tx_desc = (struct ipa_rx_data *)data;
+ skb = ipa_tx_desc->skb;
- adf_os_mem_set(skb->cb, 0, sizeof(skb->cb));
- NBUF_OWNER_ID(skb) = IPA_NBUF_OWNER_ID;
- NBUF_CALLBACK_FN(skb) = hdd_ipa_nbuf_cb;
- NBUF_MAPPED_PADDR_LO(skb) = ipa_tx_desc->dma_addr;
+ hdd_ipa = iface_context->hdd_ipa;
- NBUF_OWNER_PRIV_DATA(skb) = data;
+ adf_os_mem_set(skb->cb, 0, sizeof(skb->cb));
+ NBUF_OWNER_ID(skb) = IPA_NBUF_OWNER_ID;
+ NBUF_CALLBACK_FN(skb) = hdd_ipa_nbuf_cb;
+ NBUF_MAPPED_PADDR_LO(skb) = ipa_tx_desc->dma_addr;
- HDD_IPA_DBG_DUMP(VOS_TRACE_LEVEL_DEBUG, "i2w", skb->data, 8);
+ NBUF_OWNER_PRIV_DATA(skb) = data;
- hdd_ipa->stats.tx_ipa_recv++;
+ HDD_IPA_DBG_DUMP(VOS_TRACE_LEVEL_DEBUG, "i2w", skb->data, 8);
- adf_os_spin_lock_bh(&iface_context->interface_lock);
- if (!iface_context->adapter) {
- HDD_IPA_LOG(VOS_TRACE_LEVEL_WARN, "Interface Down");
- ipa_free_skb(ipa_tx_desc);
- adf_os_spin_unlock_bh(&iface_context->interface_lock);
- return;
- }
+ hdd_ipa->stats.tx_ipa_recv++;
- interface_id = iface_context->adapter->sessionId;
- ++iface_context->adapter->stats.tx_packets;
- iface_context->adapter->stats.tx_bytes += ipa_tx_desc->skb->len;
+ adf_os_spin_lock_bh(&iface_context->interface_lock);
+ adapter = iface_context->adapter;
+ if (!adapter) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_WARN, "Interface Down");
+ ipa_free_skb(ipa_tx_desc);
+ adf_os_spin_unlock_bh(&iface_context->interface_lock);
+ return;
+ }
+ /*
+ * During CAC period, data packets shouldn't be sent over the air so
+ * drop all the packets here
+ */
+ if (WLAN_HDD_GET_AP_CTX_PTR(adapter)->dfs_cac_block_tx) {
+ ipa_free_skb(ipa_tx_desc);
adf_os_spin_unlock_bh(&iface_context->interface_lock);
+ return;
+ }
- skb = WLANTL_SendIPA_DataFrame(hdd_ipa->hdd_ctx->pvosContext,
- iface_context->tl_context, ipa_tx_desc->skb, interface_id);
- if (skb) {
- HDD_IPA_LOG(VOS_TRACE_LEVEL_DEBUG, "TLSHIM tx fail");
- ipa_free_skb(ipa_tx_desc);
- return;
- }
- } else {
- skb = (adf_nbuf_t) data;
- dev_kfree_skb_any(skb);
+ interface_id = adapter->sessionId;
+ ++adapter->stats.tx_packets;
+ adapter->stats.tx_bytes += ipa_tx_desc->skb->len;
+
+ adf_os_spin_unlock_bh(&iface_context->interface_lock);
+
+ skb = WLANTL_SendIPA_DataFrame(hdd_ipa->hdd_ctx->pvosContext,
+ iface_context->tl_context, ipa_tx_desc->skb,
+ interface_id);
+ if (skb) {
+ HDD_IPA_LOG(VOS_TRACE_LEVEL_DEBUG, "TLSHIM tx fail");
+ ipa_free_skb(ipa_tx_desc);
+ return;
}
}
@@ -1492,6 +1505,14 @@ static int hdd_ipa_setup_iface(struct hdd_ipa_priv *hdd_ipa,
void *tl_context = NULL;
int i, ret = 0;
+ /* Lower layer may send multiple START_BSS_EVENT in DFS mode or during
+ * channel change indication. Since these indications are sent by lower
+ * layer as SAP updates and IPA doesn't have to do anything for these
+ * updates so ignoring!
+ */
+ if (WLAN_HDD_SOFTAP == adapter->device_mode && adapter->ipa_context)
+ return 0;
+
for (i = 0; i < HDD_IPA_MAX_IFACE; i++) {
if (hdd_ipa->iface_context[i].adapter == NULL) {
iface_context = &(hdd_ipa->iface_context[i]);