From a0083c4cfa601e55137a344398df0e7da3de381c Mon Sep 17 00:00:00 2001 From: "Selvaraj, Sridhar" Date: Wed, 22 Jun 2016 22:15:43 +0530 Subject: [PATCH] qcacld-3.0: Unpause data queue after SAP SSID setting qcacld-2.0 to qcacld-3.0 propagation Client connectivity with SAP fails after Association due to DHCP Timeout. This happens as iwpriv command is issued to change the SSID type to hidden, As part of this command VDEV STOP->VDEV RESTART->VDEV UP are issued to firmware. DHCP frames are stuck in the driver queues as queues are paused as part of VDEV restart sequence done for hidden SSID. VDEV unpause is not done after VDEV up which leads to this issue. This fix unpauses the data queue after the SSID configuration is done. Also, recalibration of Hidden SSID setting is avoided if the required setting(broadcast/hidden SSID) is already configured Git-commit: a14bb2ab3423674c2b6a1a67f7a33232816af7f7 Change-Id: Ic31fc5c7fc8ea7d47358cf701e51fa830eefd2ab CRs-Fixed: 990208 --- .../src/pe/lim/lim_process_sme_req_messages.c | 9 +++++-- core/wma/src/wma_dev_if.c | 26 ++++++++++++++++++- core/wma/src/wma_mgmt.c | 13 ++++++++++ 3 files changed, 45 insertions(+), 3 deletions(-) diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index b976f0ab24aa..ddfe50dca300 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -4194,8 +4194,13 @@ static void __lim_process_sme_hide_ssid(tpAniSirGlobal pMac, uint32_t *pMsgBuf) return; } - /* Update the session entry */ - psessionEntry->ssidHidden = pUpdateParams->ssidHidden; + if (psessionEntry->ssidHidden != pUpdateParams->ssidHidden) { + /* Update the session entry */ + psessionEntry->ssidHidden = pUpdateParams->ssidHidden; + } else { + lim_log(pMac, LOG1, FL("Same config already present!")); + return; + } /* Send vdev restart */ lim_send_vdev_restart(pMac, psessionEntry, pUpdateParams->sessionId); diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index e341ad89cd19..3d7be2431319 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -859,6 +859,8 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, wma->interfaces[resp_event->vdev_id].mac_id); } + iface = &wma->interfaces[resp_event->vdev_id]; + if ((resp_event->vdev_id <= wma->max_bssid) && (qdf_atomic_read (&wma->interfaces[resp_event->vdev_id].vdev_restart_params.hidden_ssid_restart_in_progress)) @@ -880,6 +882,15 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, vdev_restart_params. hidden_ssid_restart_in_progress, 0); wma->interfaces[resp_event->vdev_id].vdev_up = true; + /* + * Unpause TX queue in SAP case while configuring hidden ssid + * enable or disable, else the data path is paused forever + * causing data packets(starting from DHCP offer) to get stuck + */ + ol_txrx_vdev_unpause(iface->handle, + OL_TXQ_PAUSE_REASON_VDEV_STOP); + iface->pause_bitmap &= ~(1 << PAUSE_TYPE_HOST); + } req_msg = wma_find_vdev_req(wma, resp_event->vdev_id, @@ -900,7 +911,6 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info, wma_find_mcc_ap(wma, resp_event->vdev_id, true); #endif /* FEATURE_AP_MCC_CH_AVOIDANCE */ - iface = &wma->interfaces[resp_event->vdev_id]; if (req_msg->msg_type == WMA_CHNL_SWITCH_REQ) { tpSwitchChannelParams params = (tpSwitchChannelParams) req_msg->user_data; @@ -1345,6 +1355,17 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info, && (wma->interfaces[resp_event->vdev_id].sub_type == 0))) { WMA_LOGE("%s: vdev stop event recevied for hidden ssid set using IOCTL ", __func__); + + req_msg = wma_fill_vdev_req(wma, resp_event->vdev_id, + WMA_HIDDEN_SSID_VDEV_RESTART, + WMA_TARGET_REQ_TYPE_VDEV_START, resp_event, + WMA_VDEV_START_REQUEST_TIMEOUT); + if (!req_msg) { + WMA_LOGE("%s: Failed to fill vdev request, vdev_id %d", + __func__, resp_event->vdev_id); + return -EINVAL; + } + wma_hidden_ssid_vdev_restart_on_vdev_stop(wma, resp_event->vdev_id); } @@ -2539,6 +2560,9 @@ error0: iface = &wma->interfaces[tgt_req->vdev_id]; iface->vdev_up = false; wma_ocb_set_config_resp(wma, QDF_STATUS_E_TIMEOUT); + } else if (tgt_req->msg_type == WMA_HIDDEN_SSID_VDEV_RESTART) { + WMA_LOGE("Hidden ssid vdev restart Timed Out; vdev_id: %d, type = %d", + tgt_req->vdev_id, tgt_req->type); } free_tgt_req: qdf_mc_timer_destroy(&tgt_req->event_timeout); diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index d001d5005720..42e9c526ccf8 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -2710,6 +2710,7 @@ void wma_hidden_ssid_vdev_restart(tp_wma_handle wma_handle, tHalHiddenSsidVdevRestart *pReq) { struct wma_txrx_node *intr = wma_handle->interfaces; + struct wma_target_req *msg; if ((pReq->sessionId != intr[pReq->sessionId].vdev_restart_params.vdev_id) @@ -2723,6 +2724,16 @@ void wma_hidden_ssid_vdev_restart(tp_wma_handle wma_handle, qdf_atomic_set(&intr[pReq->sessionId].vdev_restart_params. hidden_ssid_restart_in_progress, 1); + msg = wma_fill_vdev_req(wma_handle, pReq->sessionId, + WMA_HIDDEN_SSID_VDEV_RESTART, + WMA_TARGET_REQ_TYPE_VDEV_STOP, pReq, + WMA_VDEV_STOP_REQUEST_TIMEOUT); + if (!msg) { + WMA_LOGE("%s: Failed to fill vdev restart request for vdev_id %d", + __func__, pReq->sessionId); + return; + } + /* vdev stop -> vdev restart -> vdev up */ WMA_LOGD("%s, vdev_id: %d, pausing tx_ll_queue for VDEV_STOP", __func__, pReq->sessionId); @@ -2734,6 +2745,8 @@ void wma_hidden_ssid_vdev_restart(tp_wma_handle wma_handle, WMA_LOGE("%s: %d Failed to send vdev stop", __func__, __LINE__); qdf_atomic_set(&intr[pReq->sessionId].vdev_restart_params. hidden_ssid_restart_in_progress, 0); + wma_remove_vdev_req(wma_handle, pReq->sessionId, + WMA_TARGET_REQ_TYPE_VDEV_STOP); return; } }