diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index 4742f4c8cc1a..0c7074f074e3 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -2028,6 +2028,10 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, } iface = &wma->interfaces[resp_event->vdev_id]; + + /* vdev in stopped state, no more waiting for key */ + iface->is_waiting_for_key = false; + wma_release_wakelock(&iface->vdev_stop_wakelock); req_msg = wma_find_vdev_req(wma, resp_event->vdev_id, @@ -4181,7 +4185,10 @@ static void wma_add_bss_sta_mode(tp_wma_handle wma, tpAddBssParams add_bss) wma_send_peer_assoc(wma, add_bss->nwType, &add_bss->staContext); /* we just had peer assoc, so install key will be done later */ - iface->is_waiting_for_key = true; + + if (add_bss->staContext.encryptType != eSIR_ED_NONE) + iface->is_waiting_for_key = true; + peer_assoc_sent = true; if (add_bss->rmfEnabled) diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 42f3a678d860..c8e8c190b57c 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -2575,6 +2575,11 @@ static int wma_wake_event_piggybacked( uint32_t pb_event_len; uint32_t wake_reason; uint32_t event_id; + uint8_t *bssid; + uint8_t peer_id; + void *peer, *pdev; + tpDeleteStaContext del_sta_ctx; + void *soc = cds_get_context(QDF_MODULE_ID_SOC); /* * There are "normal" cases where a wake reason that usually contains a @@ -2588,6 +2593,9 @@ static int wma_wake_event_piggybacked( return 0; } + pdev = cds_get_context(QDF_MODULE_ID_TXRX); + bssid = wma->interfaces[event_param->fixed_param->vdev_id].bssid; + peer = cdp_peer_find_by_addr(soc, pdev, bssid, &peer_id); wake_reason = event_param->fixed_param->wake_reason; /* parse piggybacked event from param buffer */ @@ -2710,8 +2718,20 @@ static int wma_wake_event_piggybacked( * programmed. So do not check for cookie. */ WMA_LOGE("WOW_REASON_TIMER_INTR_RECV received, indicating key exchange did not finish. Initiate disconnect"); - errno = wma_peer_sta_kickout_event_handler(wma, pb_event, - pb_event_len); + del_sta_ctx = (tpDeleteStaContext) qdf_mem_malloc( + sizeof(*del_sta_ctx)); + if (!del_sta_ctx) { + WMA_LOGE("%s: mem alloc failed ", __func__); + break; + } + del_sta_ctx->is_tdls = false; + del_sta_ctx->vdev_id = event_param->fixed_param->vdev_id; + del_sta_ctx->staId = peer_id; + qdf_mem_copy(del_sta_ctx->addr2, bssid, IEEE80211_ADDR_LEN); + qdf_mem_copy(del_sta_ctx->bssId, bssid, IEEE80211_ADDR_LEN); + del_sta_ctx->reasonCode = HAL_DEL_STA_REASON_CODE_KEEP_ALIVE; + wma_send_msg(wma, SIR_LIM_DELETE_STA_CONTEXT_IND, del_sta_ctx, + 0); break; default: