ソースを参照

qcacld-3.0: LFR2.0 Ignore STA kickout when roaming is in progress

If roaming is in progress, then there is a good chance to connect
to a better AP very soon, so ignore the sta kickout event that is
received from the firmware.

CRs-Fixed: 947880
Change-Id: I9197ed09a40d9acb706d1bfa535a4eb292a1af74
Varun Reddy Yeturu 9 年 前
コミット
30bc42cbe8

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

@@ -910,6 +910,7 @@ struct wma_txrx_node {
 	uint32_t rx_streams;
 	uint32_t chain_mask;
 	uint32_t mac_id;
+	bool roaming_in_progress;
 };
 
 #if defined(QCA_WIFI_FTM)

+ 1 - 1
core/wma/inc/wma_internal.h

@@ -253,7 +253,7 @@ QDF_STATUS wma_roam_scan_bmiss_cnt(tp_wma_handle wma_handle,
 QDF_STATUS wma_roam_scan_offload_command(tp_wma_handle wma_handle,
 					 uint32_t command, uint32_t vdev_id);
 
-QDF_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
+QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
 				     tSirRoamOffloadScanReq *roam_req);
 
 QDF_STATUS wma_roam_preauth_chan_set(tp_wma_handle wma_handle,

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

@@ -4804,7 +4804,7 @@ QDF_STATUS wma_mc_process_msg(void *cds_context, cds_msg_t *msg)
 		/*
 		 * Main entry point or roaming directives from CSR.
 		 */
-		wma_process_roam_scan_req(wma_handle,
+		wma_process_roaming_config(wma_handle,
 				(tSirRoamOffloadScanReq *) msg->bodyptr);
 		break;
 

+ 4 - 0
core/wma/src/wma_mgmt.c

@@ -315,6 +315,10 @@ int wma_peer_sta_kickout_event_handler(void *handle, u8 *event, u32 len)
 	WMA_LOGA("%s: PEER:[%pM], ADDR:[%pN], INTERFACE:%d, peer_id:%d, reason:%d",
 		__func__, macaddr, wma->interfaces[vdev_id].addr, vdev_id,
 		 peer_id, kickout_event->reason);
+	if (wma->interfaces[vdev_id].roaming_in_progress) {
+		WMA_LOGE("Ignore STA kick out since roaming is in progress");
+		return -EINVAL;
+	}
 
 	switch (kickout_event->reason) {
 	case WMI_PEER_STA_KICKOUT_REASON_IBSS_DISCONNECT:

+ 8 - 2
core/wma/src/wma_scan_roam.c

@@ -1466,7 +1466,7 @@ QDF_STATUS wma_roam_scan_offload_command(tp_wma_handle wma_handle,
 }
 
 /**
- * wma_process_roam_scan_req() - process roam request
+ * wma_process_roaming_config() - process roam request
  * @wma_handle: wma handle
  * @roam_req: roam request parameters
  *
@@ -1474,7 +1474,7 @@ QDF_STATUS wma_roam_scan_offload_command(tp_wma_handle wma_handle,
  *
  * Return: QDF status
  */
-QDF_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
+QDF_STATUS wma_process_roaming_config(tp_wma_handle wma_handle,
 				     tSirRoamOffloadScanReq *roam_req)
 {
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
@@ -1499,6 +1499,9 @@ QDF_STATUS wma_process_roam_scan_req(tp_wma_handle wma_handle,
 		qdf_mem_free(roam_req);
 		return QDF_STATUS_E_PERM;
 	}
+	WMA_LOGD("%s: roaming in progress set to false for vdev %d",
+			__func__, roam_req->sessionId);
+	wma_handle->interfaces[roam_req->sessionId].roaming_in_progress = false;
 	switch (roam_req->Command) {
 	case ROAM_SCAN_OFFLOAD_START:
 		intr = &wma_handle->interfaces[roam_req->sessionId];
@@ -5317,6 +5320,9 @@ void wma_roam_better_ap_handler(tp_wma_handle wma, uint32_t vdev_id)
 			__func__);
 		return;
 	}
+	WMA_LOGD("%s: roaming in progress for vdev %d",
+			__func__, vdev_id);
+	wma->interfaces[vdev_id].roaming_in_progress = true;
 
 	candidate_ind->messageType = eWNI_SME_CANDIDATE_FOUND_IND;
 	candidate_ind->sessionId = vdev_id;