Procházet zdrojové kódy

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
Selvaraj, Sridhar před 8 roky
rodič
revize
a0083c4cfa

+ 7 - 2
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);

+ 25 - 1
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);

+ 13 - 0
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;
 	}
 }