Explorar el Código

qcacld-3.0: Send beacon template after the vdev restart response

Vdev restart cmd is sent in vdev stop response handler during the
hidden ssid restart process. Lim sends beacon template cmd after it
sends the hidden ssid restart cmd so beacon template is sent to FW
after the vdev stop cmd and before the vdev restart cmd as vdev
restart is sent during vdev stop response handler.

Send the beacon template after vdev restart is successful during
the hidden ssid restart process.

Change-Id: Ia75bde4ce8c564133e2b2a7bd4011089e52808e7
CRs-Fixed: 2039224
Kiran Kumar Lokere hace 8 años
padre
commit
5798bfac82

+ 2 - 0
core/mac/src/include/sir_params.h

@@ -644,6 +644,8 @@ typedef struct sSirMbMsgP2p {
 #endif
 #define SIR_HAL_SET_DBS_SCAN_SEL_PARAMS     (SIR_HAL_ITC_MSG_TYPES_BEGIN + 379)
 
+#define SIR_HAL_HIDDEN_SSID_RESTART_RSP     (SIR_HAL_ITC_MSG_TYPES_BEGIN + 379)
+
 #define SIR_HAL_MSG_TYPES_END               (SIR_HAL_MSG_TYPES_BEGIN + 0x1FF)
 
 /* CFG message types */

+ 3 - 0
core/mac/src/pe/lim/lim_process_message_queue.c

@@ -1682,6 +1682,9 @@ static void lim_process_messages(tpAniSirGlobal mac_ctx,
 	case WMA_ADD_BSS_RSP:
 		lim_process_mlm_add_bss_rsp(mac_ctx, msg);
 		break;
+	case WMA_HIDDEN_SSID_RESTART_RSP:
+		lim_process_mlm_update_hidden_ssid_rsp(mac_ctx, msg);
+		break;
 	case WMA_ADD_STA_RSP:
 		lim_process_add_sta_rsp(mac_ctx, msg);
 		break;

+ 32 - 0
core/mac/src/pe/lim/lim_process_mlm_rsp_messages.c

@@ -2610,6 +2610,38 @@ void lim_process_mlm_add_bss_rsp(tpAniSirGlobal mac_ctx,
 #endif
 }
 
+void lim_process_mlm_update_hidden_ssid_rsp(tpAniSirGlobal mac_ctx,
+	struct scheduler_msg *msg)
+{
+	tpPESession session_entry;
+	tpHalHiddenSsidVdevRestart hidden_ssid_vdev_restart;
+
+	hidden_ssid_vdev_restart = (tpHalHiddenSsidVdevRestart)(msg->bodyptr);
+
+	if (NULL == hidden_ssid_vdev_restart) {
+		pe_err("NULL msg pointer");
+		return;
+	}
+
+	session_entry = pe_find_session_by_session_id(mac_ctx,
+			hidden_ssid_vdev_restart->pe_session_id);
+
+	if (session_entry == NULL) {
+		pe_err("SessionId:%d Session Doesn't exist",
+			hidden_ssid_vdev_restart->pe_session_id);
+		goto free_req;
+	}
+	/* Update beacon */
+	sch_set_fixed_beacon_fields(mac_ctx, session_entry);
+	lim_send_beacon_ind(mac_ctx, session_entry);
+
+free_req:
+	if (NULL != hidden_ssid_vdev_restart) {
+		qdf_mem_free(hidden_ssid_vdev_restart);
+		msg->bodyptr = NULL;
+	}
+}
+
 /**
  * lim_process_mlm_set_sta_key_rsp() - Process STA key response
  *

+ 5 - 8
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -3960,6 +3960,7 @@ lim_send_vdev_restart(tpAniSirGlobal pMac,
 
 	pHalHiddenSsidVdevRestart->ssidHidden = psessionEntry->ssidHidden;
 	pHalHiddenSsidVdevRestart->sessionId = sessionId;
+	pHalHiddenSsidVdevRestart->pe_session_id = psessionEntry->peSessionId;
 
 	msgQ.type = WMA_HIDDEN_SSID_VDEV_RESTART;
 	msgQ.bodyptr = pHalHiddenSsidVdevRestart;
@@ -4036,23 +4037,19 @@ static void __lim_process_roam_scan_offload_req(tpAniSirGlobal mac_ctx,
 static void lim_handle_update_ssid_hidden(tpAniSirGlobal mac_ctx,
 				tpPESession session, uint8_t ssid_hidden)
 {
-	pe_debug("received HIDE_SSID message old HIDE_SSID: %d new HIDE_SSID: %d",
+	pe_debug("rcvd HIDE_SSID message old HIDE_SSID: %d new HIDE_SSID: %d",
 			session->ssidHidden, ssid_hidden);
 
-	if (ssid_hidden != session->ssidHidden)
+	if (ssid_hidden != session->ssidHidden) {
 		session->ssidHidden = ssid_hidden;
-	else {
-		pe_debug("Same config already present!");
+	} else {
+		pe_debug("Dont process HIDE_SSID msg with existing setting");
 		return;
 	}
 
 	/* Send vdev restart */
 	lim_send_vdev_restart(mac_ctx, session, session->smeSessionId);
 
-	/* Update beacon */
-	sch_set_fixed_beacon_fields(mac_ctx, session);
-	lim_send_beacon_ind(mac_ctx, session);
-
 	return;
 }
 

+ 3 - 0
core/mac/src/pe/lim/lim_types.h

@@ -498,6 +498,9 @@ void lim_send_disassoc_mgmt_frame(tpAniSirGlobal, uint16_t, tSirMacAddr,
 void lim_send_deauth_mgmt_frame(tpAniSirGlobal, uint16_t, tSirMacAddr, tpPESession,
 				bool waitForAck);
 
+void lim_process_mlm_update_hidden_ssid_rsp(tpAniSirGlobal mac_ctx,
+		struct scheduler_msg *msg);
+
 tSirResultCodes lim_mlm_add_bss(tpAniSirGlobal, tLimMlmStartReq *,
 				tpPESession psessionEntry);
 

+ 1 - 0
core/wma/inc/wma_if.h

@@ -1395,6 +1395,7 @@ typedef struct sTdlsLinkEstablishParams {
 typedef struct tHalHiddenSsidVdevRestart {
 	uint8_t ssidHidden;
 	uint8_t sessionId;
+	uint16_t pe_session_id;
 } tHalHiddenSsidVdevRestart, *tpHalHiddenSsidVdevRestart;
 
 

+ 1 - 0
core/wma/inc/wma_types.h

@@ -176,6 +176,7 @@
 #define WMA_ENTER_PS_REQ               SIR_HAL_ENTER_PS_REQ
 #define WMA_EXIT_PS_REQ                SIR_HAL_EXIT_PS_REQ
 
+#define WMA_HIDDEN_SSID_RESTART_RSP    SIR_HAL_HIDDEN_SSID_RESTART_RSP
 #define WMA_SWITCH_CHANNEL_RSP         SIR_HAL_SWITCH_CHANNEL_RSP
 #define WMA_P2P_NOA_ATTR_IND           SIR_HAL_P2P_NOA_ATTR_IND
 #define WMA_P2P_NOA_START_IND          SIR_HAL_P2P_NOA_START_IND

+ 30 - 33
core/wma/src/wma_dev_if.c

@@ -914,29 +914,33 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info,
 
 	iface = &wma->interfaces[resp_event->vdev_id];
 
+	req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
+				    WMA_TARGET_REQ_TYPE_VDEV_START);
+
+	if (!req_msg) {
+		WMA_LOGE("%s: Failed to lookup request message for vdev %d",
+			 __func__, resp_event->vdev_id);
+		policy_mgr_set_do_hw_mode_change_flag(wma->psoc, false);
+		return -EINVAL;
+	}
+
 	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))
 	    && (wma_is_vdev_in_ap_mode(wma, resp_event->vdev_id) == true)) {
+		tpHalHiddenSsidVdevRestart hidden_ssid_restart =
+			(tpHalHiddenSsidVdevRestart)req_msg->user_data;
 		WMA_LOGE("%s: vdev restart event recevied for hidden ssid set using IOCTL",
 			__func__);
 
 		param.vdev_id = resp_event->vdev_id;
 		param.assoc_id = 0;
-		if (wmi_unified_vdev_up_send
-			    (wma->wmi_handle,
-			    wma->interfaces[resp_event->vdev_id].bssid,
-				&param) != QDF_STATUS_SUCCESS) {
-			WMA_LOGE("%s : failed to send vdev up", __func__);
-			policy_mgr_set_do_hw_mode_change_flag(
-				wma->psoc, false);
-			return -EEXIST;
-		}
 		qdf_atomic_set(&wma->interfaces[resp_event->vdev_id].
 			       vdev_restart_params.
 			       hidden_ssid_restart_in_progress, 0);
-		wma_vdev_set_mlme_state(wma, resp_event->vdev_id,
-			WLAN_VDEV_S_RUN);
+
+		wma_send_msg(wma, WMA_HIDDEN_SSID_RESTART_RSP,
+				(void *)hidden_ssid_restart, 0);
 		/*
 		 * Unpause TX queue in SAP case while configuring hidden ssid
 		 * enable or disable, else the data path is paused forever
@@ -948,17 +952,6 @@ int wma_vdev_start_resp_handler(void *handle, uint8_t *cmd_param_info,
 		wma_vdev_clear_pause_bit(resp_event->vdev_id, PAUSE_TYPE_HOST);
 	}
 
-	req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
-				    WMA_TARGET_REQ_TYPE_VDEV_START);
-
-	if (!req_msg) {
-		WMA_LOGE("%s: Failed to lookup request message for vdev %d",
-			 __func__, resp_event->vdev_id);
-		policy_mgr_set_do_hw_mode_change_flag(
-			wma->psoc, false);
-		return -EINVAL;
-	}
-
 	qdf_mc_timer_stop(&req_msg->event_timeout);
 
 #ifdef FEATURE_AP_MCC_CH_AVOIDANCE
@@ -1643,7 +1636,7 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
 	tp_wma_handle wma = (tp_wma_handle) handle;
 	WMI_VDEV_STOPPED_EVENTID_param_tlvs *param_buf;
 	wmi_vdev_stopped_event_fixed_param *resp_event;
-	struct wma_target_req *req_msg, *del_req;
+	struct wma_target_req *req_msg, *del_req, *new_req_msg;
 	struct cdp_pdev *pdev;
 	void *peer;
 	uint8_t peer_id;
@@ -1672,6 +1665,14 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
 	}
 	resp_event = param_buf->fixed_param;
 
+	req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
+				    WMA_TARGET_REQ_TYPE_VDEV_STOP);
+	if (!req_msg) {
+		WMA_LOGE("%s: Failed to lookup vdev request for vdev id %d",
+			 __func__, resp_event->vdev_id);
+		return -EINVAL;
+	}
+
 	if ((resp_event->vdev_id <= wma->max_bssid) &&
 	    (qdf_atomic_read
 		     (&wma->interfaces[resp_event->vdev_id].vdev_restart_params.
@@ -1681,11 +1682,14 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
 		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_vdev_set_mlme_state(wma,
+				resp_event->vdev_id, WLAN_VDEV_S_STOP);
+		new_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_TARGET_REQ_TYPE_VDEV_START,
+				req_msg->user_data,
 				WMA_VDEV_START_REQUEST_TIMEOUT);
-		if (!req_msg) {
+		if (!new_req_msg) {
 			WMA_LOGE("%s: Failed to fill vdev request, vdev_id %d",
 					__func__, resp_event->vdev_id);
 			return -EINVAL;
@@ -1695,13 +1699,6 @@ int wma_vdev_stop_resp_handler(void *handle, uint8_t *cmd_param_info,
 							  resp_event->vdev_id);
 	}
 
-	req_msg = wma_find_vdev_req(wma, resp_event->vdev_id,
-				    WMA_TARGET_REQ_TYPE_VDEV_STOP);
-	if (!req_msg) {
-		WMA_LOGE("%s: Failed to lookup vdev request for vdev id %d",
-			 __func__, resp_event->vdev_id);
-		return -EINVAL;
-	}
 	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 	if (!pdev) {
 		WMA_LOGE("%s: pdev is NULL", __func__);

+ 0 - 1
core/wma/src/wma_main.c

@@ -6693,7 +6693,6 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, struct scheduler_msg *msg)
 	case WMA_HIDDEN_SSID_VDEV_RESTART:
 		wma_hidden_ssid_vdev_restart(wma_handle,
 				(tHalHiddenSsidVdevRestart *) msg->bodyptr);
-		qdf_mem_free(msg->bodyptr);
 		break;
 #ifdef WLAN_FEATURE_EXTWOW_SUPPORT
 	case WMA_WLAN_EXT_WOW: