Browse Source

qcacld-3.0: Update host DBS policy manager in roaming operations

Firmware DBS mode is updated during firmware based roaming. Same change
is reflected in the host policy manager. Process hw_mode TLV in roam sync
indication event. Update cds concurrency policy after roaming. Handle
exceptions for ROAM_ABORT and HO_FAIL conditions.

Change-Id: I826c6766f73441256e5946d3167966e645f23430
CRs-Fixed: 1044336
Naveen Rawat 8 years ago
parent
commit
8cc23b0d9a

+ 7 - 6
core/cds/inc/cds_concurrency.h

@@ -635,13 +635,10 @@ static inline void cds_force_sap_on_scc(eCsrRoamResult roam_result,
 #endif /* FEATURE_WLAN_FORCE_SAP_SCC */
 
 #ifdef FEATURE_WLAN_MCC_TO_SCC_SWITCH
-void cds_check_concurrent_intf_and_restart_sap(
-		hdd_station_ctx_t *hdd_sta_ctx,
-		hdd_adapter_t *adapter);
+void cds_check_concurrent_intf_and_restart_sap(hdd_adapter_t *adapter);
 #else
 static inline void cds_check_concurrent_intf_and_restart_sap(
-		hdd_station_ctx_t *hdd_sta_ctx,
-		hdd_adapter_t *adapter)
+						hdd_adapter_t *adapter)
 {
 
 }
@@ -798,7 +795,7 @@ QDF_STATUS qdf_wait_for_connection_update(void);
 QDF_STATUS qdf_reset_connection_update(void);
 QDF_STATUS qdf_set_connection_update(void);
 QDF_STATUS qdf_init_connection_update(void);
-QDF_STATUS cds_stop_start_opportunistic_timer(void);
+QDF_STATUS cds_restart_opportunistic_timer(bool check_state);
 QDF_STATUS cds_modify_sap_pcl_based_on_mandatory_channel(uint8_t *pcl_list_org,
 		uint8_t *weight_list_org,
 		uint32_t *pcl_len_org);
@@ -833,4 +830,8 @@ bool cds_is_hw_mode_change_after_vdev_up(void);
 void cds_dump_connection_status_info(void);
 uint32_t cds_mode_specific_connection_count(enum cds_con_mode mode,
 						uint32_t *list);
+void cds_hw_mode_transition_cb(uint32_t old_hw_mode_index,
+			uint32_t new_hw_mode_index,
+			uint32_t num_vdev_mac_entries,
+			 struct sir_vdev_mac_map *vdev_mac_map);
 #endif /* __CDS_CONCURRENCY_H */

+ 23 - 16
core/cds/src/cds_concurrency.c

@@ -2512,10 +2512,10 @@ static void cds_pdev_set_hw_mode_cb(uint32_t status,
  *
  * Return: None
  */
-static void cds_hw_mode_transition_cb(uint32_t old_hw_mode_index,
-				 uint32_t new_hw_mode_index,
-				 uint32_t num_vdev_mac_entries,
-				 struct sir_vdev_mac_map *vdev_mac_map)
+void cds_hw_mode_transition_cb(uint32_t old_hw_mode_index,
+			uint32_t new_hw_mode_index,
+			uint32_t num_vdev_mac_entries,
+			struct sir_vdev_mac_map *vdev_mac_map)
 {
 	QDF_STATUS status;
 	struct sir_hw_mode_params hw_mode;
@@ -6275,14 +6275,11 @@ QDF_STATUS cds_next_actions(uint32_t session_id,
 		return status;
 	}
 	/**
-	 *  if already in DBS no need to request DBS or if already in
-	 *  non dbs no need request for non dbs again. Might be needed
+	 *  if already in DBS no need to request DBS. Might be needed
 	 *  to extend the logic when multiple dbs HW mode is available
 	 */
 	if ((((CDS_DBS_DOWNGRADE == action) || (CDS_DBS == action))
-		&& hw_mode.dbs_cap) ||
-		(((CDS_SINGLE_MAC_UPGRADE == action) ||
-		(CDS_SINGLE_MAC == action)) && !hw_mode.dbs_cap)) {
+		&& hw_mode.dbs_cap)) {
 		cds_err("driver is already in %s mode, no further action needed",
 				(hw_mode.dbs_cap) ? "dbs" : "non dbs");
 		return QDF_STATUS_E_ALREADY;
@@ -7043,17 +7040,18 @@ static void cds_check_sta_ap_concurrent_ch_intf(void *data)
 	}
 
 }
+
 /**
  * cds_check_concurrent_intf_and_restart_sap() - Check concurrent change intf
- * @hdd_sta_ctx: Pointer to HDD STA context
+ * @adapter: Pointer to HDD adapter
  *
  * Checks the concurrent change interface and restarts SAP
  * Return: None
  */
-void cds_check_concurrent_intf_and_restart_sap(hdd_station_ctx_t *hdd_sta_ctx,
-		hdd_adapter_t *adapter)
+void cds_check_concurrent_intf_and_restart_sap(hdd_adapter_t *adapter)
 {
 	hdd_context_t *hdd_ctx;
+	hdd_station_ctx_t *hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 
 	hdd_ctx = cds_get_context(QDF_MODULE_ID_HDD);
 	if (!hdd_ctx) {
@@ -8199,13 +8197,17 @@ enum cds_conc_next_action cds_get_current_pref_hw_mode(void)
 }
 
 /**
- * cds_stop_start_opportunistic_timer() - Start and stop the opportunistic timer
+ * cds_restart_opportunistic_timer() - Restarts opportunistic timer
+ * @check_state: check timer state if this flag is set, else restart
+ *               irrespective of state
  *
- * Stops and starts the opportunistic timer for DBS_OPPORTUNISTIC_TIME seconds
+ * Restarts opportunistic timer for DBS_OPPORTUNISTIC_TIME seconds.
+ * Check if current state is RUNNING if check_state is set, else
+ * restart the timer irrespective of state.
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS cds_stop_start_opportunistic_timer(void)
+QDF_STATUS cds_restart_opportunistic_timer(bool check_state)
 {
 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
 	p_cds_contextType cds_ctx;
@@ -8216,6 +8218,11 @@ QDF_STATUS cds_stop_start_opportunistic_timer(void)
 		return status;
 	}
 
+	if (check_state &&
+			QDF_TIMER_STATE_RUNNING !=
+			cds_ctx->dbs_opportunistic_timer.state)
+		return status;
+
 	qdf_mc_timer_stop(&cds_ctx->dbs_opportunistic_timer);
 
 	status = qdf_mc_timer_start(
@@ -8852,7 +8859,7 @@ QDF_STATUS cds_set_hw_mode_on_channel_switch(uint8_t session_id)
 	 * as well.
 	 */
 	if (action == CDS_SINGLE_MAC_UPGRADE) {
-		qdf_status = cds_stop_start_opportunistic_timer();
+		qdf_status = cds_restart_opportunistic_timer(false);
 		if (QDF_IS_STATUS_SUCCESS(qdf_status))
 			cds_info("opportunistic timer for MCC upgrade");
 		goto done;

+ 17 - 15
core/hdd/src/wlan_hdd_assoc.c

@@ -2482,8 +2482,7 @@ static QDF_STATUS hdd_association_completion_handler(hdd_adapter_t *pAdapter,
 #endif
 
 		hdd_info("check for SAP restart");
-		cds_check_concurrent_intf_and_restart_sap(pHddStaCtx,
-							  pAdapter);
+		cds_check_concurrent_intf_and_restart_sap(pAdapter);
 
 		DPTRACE(qdf_dp_trace_mgmt_pkt(QDF_DP_TRACE_MGMT_PACKET_RECORD,
 			pAdapter->sessionId,
@@ -4738,19 +4737,6 @@ hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId,
 		       FL("hdd_ReassocScenario set to: %d, due to eCSR_ROAM_FT_START, session: %d"),
 		       pHddStaCtx->hdd_ReassocScenario, pAdapter->sessionId);
 		break;
-	case eCSR_ROAM_DISABLE_QUEUES:
-		hdd_info("Disabling queues");
-		wlan_hdd_netif_queue_control(pAdapter,
-				WLAN_NETIF_TX_DISABLE,
-				WLAN_CONTROL_PATH);
-		break;
-	case eCSR_ROAM_ENABLE_QUEUES:
-		hdd_info("Enabling queues");
-		wlan_hdd_netif_queue_control(pAdapter,
-				WLAN_WAKE_ALL_NETIF_QUEUE,
-				WLAN_CONTROL_PATH);
-		break;
-
 	case eCSR_ROAM_SHOULD_ROAM:
 		/* notify apps that we can't pass traffic anymore */
 		hddLog(LOG1, FL("Disabling queues"));
@@ -5034,6 +5020,22 @@ hdd_sme_roam_callback(void *pContext, tCsrRoamInfo *pRoamInfo, uint32_t roamId,
 		hdd_ndp_event_handler(pAdapter, pRoamInfo, roamId, roamStatus,
 			roamResult);
 		break;
+	case eCSR_ROAM_START:
+		hdd_info("Process ROAM_START from firmware");
+		wlan_hdd_netif_queue_control(pAdapter,
+				WLAN_NETIF_TX_DISABLE,
+				WLAN_CONTROL_PATH);
+		cds_set_connection_in_progress(true);
+		cds_restart_opportunistic_timer(true);
+		break;
+	case eCSR_ROAM_ABORT:
+		hdd_info("Firmware aborted roaming operation, previous connection is still valid");
+		wlan_hdd_netif_queue_control(pAdapter,
+				WLAN_WAKE_ALL_NETIF_QUEUE,
+				WLAN_CONTROL_PATH);
+		cds_set_connection_in_progress(false);
+		break;
+
 	default:
 		break;
 	}

+ 0 - 25
core/hdd/src/wlan_hdd_hostapd.c

@@ -6075,37 +6075,12 @@ int wlan_hdd_set_channel(struct wiphy *wiphy,
 			case NL80211_CHAN_HT20:
 			case NL80211_CHAN_NO_HT:
 				smeConfig.csrConfig.obssEnabled = false;
-				if (channel <= 14)
-					smeConfig.csrConfig.
-						channelBondingMode24GHz =
-					eCSR_INI_SINGLE_CHANNEL_CENTERED;
-				else
-					smeConfig.csrConfig.
-						channelBondingMode5GHz =
-					eCSR_INI_SINGLE_CHANNEL_CENTERED;
 				sap_config->sec_ch = 0;
 				break;
-
 			case NL80211_CHAN_HT40MINUS:
-				if (channel <= 14)
-					smeConfig.csrConfig.
-					channelBondingMode24GHz =
-					eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
-				else
-					smeConfig.csrConfig.
-					channelBondingMode5GHz =
-					eCSR_INI_DOUBLE_CHANNEL_HIGH_PRIMARY;
 				sap_config->sec_ch = sap_config->channel - 4;
 				break;
 			case NL80211_CHAN_HT40PLUS:
-				if (channel <= 14)
-					smeConfig.csrConfig.
-					channelBondingMode24GHz =
-					eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
-				else
-					smeConfig.csrConfig.
-					channelBondingMode5GHz =
-					eCSR_INI_DOUBLE_CHANNEL_LOW_PRIMARY;
 				sap_config->sec_ch = sap_config->channel + 4;
 				break;
 			default:

+ 7 - 4
core/mac/inc/sir_api.h

@@ -193,14 +193,16 @@ typedef enum {
  * enum sir_roam_op_code - Operation to be done by the callback.
  * @SIR_ROAM_SYNCH_PROPAGATION: Propagate the new BSS info after roaming.
  * @SIR_ROAMING_DEREGISTER_STA: Deregister the old STA after roaming.
- * @SIR_ROAMING_TX_QUEUE_DISABLE: Disable the network queues while roaming.
- * @SIR_ROAMING_TX_QUEUE_ENABLE: Enable back the n/w queues in case roam fails.
+ * @SIR_ROAMING_START: Firmware started roaming operation
+ * @SIR_ROAMING_ABORT: Firmware aborted roaming operation, still connected.
+ * @SIR_ROAM_SYNCH_COMPLETE: Roam sync propagation is complete.
  */
 enum sir_roam_op_code {
 	SIR_ROAM_SYNCH_PROPAGATION = 1,
 	SIR_ROAMING_DEREGISTER_STA,
-	SIR_ROAMING_TX_QUEUE_DISABLE,
-	SIR_ROAMING_TX_QUEUE_ENABLE,
+	SIR_ROAMING_START,
+	SIR_ROAMING_ABORT,
+	SIR_ROAM_SYNCH_COMPLETE,
 };
 /**
  * Module ID definitions.
@@ -4153,6 +4155,7 @@ typedef struct sSirSmeRoamOffloadSynchInd {
 	void *add_bss_params;
 	tpSirSmeJoinRsp join_rsp;
 	uint16_t aid;
+	struct sir_hw_mode_trans_ind hw_mode_trans_ind;
 } roam_offload_synch_ind;
 
 #ifdef WLAN_FEATURE_ROAM_OFFLOAD

+ 2 - 2
core/sme/inc/csr_api.h

@@ -505,11 +505,11 @@ typedef enum {
 	/* Channel sw update notification */
 	eCSR_ROAM_DFS_CHAN_SW_NOTIFY,
 	eCSR_ROAM_EXT_CHG_CHNL_IND,
-	eCSR_ROAM_DISABLE_QUEUES,
-	eCSR_ROAM_ENABLE_QUEUES,
 	eCSR_ROAM_STA_CHANNEL_SWITCH,
 	eCSR_ROAM_NDP_STATUS_UPDATE,
 	eCSR_ROAM_UPDATE_SCAN_RESULT,
+	eCSR_ROAM_START,
+	eCSR_ROAM_ABORT,
 } eRoamCmdStatus;
 
 /* comment inside indicates what roaming callback gets */

+ 29 - 4
core/sme/src/csr/csr_api_roam.c

@@ -18778,6 +18778,7 @@ void csr_process_ho_fail_ind(tpAniSirGlobal pMac, void *pMsgBuf)
 			  sessionId);
 		return;
 	}
+	cds_set_connection_in_progress(false);
 	csr_roam_synch_clean_up(pMac, sessionId);
 	csr_roaming_report_diag_event(pMac, NULL,
 			eCSR_REASON_ROAM_HO_FAIL);
@@ -19501,18 +19502,41 @@ void csr_roam_synch_callback(tpAniSirGlobal mac_ctx,
 				eCSR_ROAM_FT_START, eSIR_SME_SUCCESS);
 		sme_release_global_lock(&mac_ctx->sme);
 		return;
-	case SIR_ROAMING_TX_QUEUE_DISABLE:
+	case SIR_ROAMING_START:
 		csr_roam_call_callback(mac_ctx, session_id, NULL, 0,
-				eCSR_ROAM_DISABLE_QUEUES, eSIR_SME_SUCCESS);
+				eCSR_ROAM_START, eSIR_SME_SUCCESS);
 		sme_release_global_lock(&mac_ctx->sme);
 		return;
-	case SIR_ROAMING_TX_QUEUE_ENABLE:
+	case SIR_ROAMING_ABORT:
 		csr_roam_call_callback(mac_ctx, session_id, NULL, 0,
-				eCSR_ROAM_ENABLE_QUEUES, eSIR_SME_SUCCESS);
+				eCSR_ROAM_ABORT, eSIR_SME_SUCCESS);
 		sme_release_global_lock(&mac_ctx->sme);
 		return;
 	case SIR_ROAM_SYNCH_PROPAGATION:
 		break;
+	case SIR_ROAM_SYNCH_COMPLETE:
+		/*
+		 * Following operations need to be done once roam sync
+		 * completion is sent to FW, hence called here:
+		 * 1) Firmware has already updated DBS policy. Update connection
+		 *    table in the host driver.
+		 * 2) Force SCC switch if needed
+		 * 3) Set connection in progress = false
+		 */
+		/* first update connection info from wma interface */
+		cds_update_connection_info(session_id);
+		/* then update remaining parameters from roam sync ctx */
+		sms_log(mac_ctx, LOGE, FL("Update DBS hw mode"));
+		cds_hw_mode_transition_cb(
+			roam_synch_data->hw_mode_trans_ind.old_hw_mode_index,
+			roam_synch_data->hw_mode_trans_ind.new_hw_mode_index,
+			roam_synch_data->hw_mode_trans_ind.num_vdev_mac_entries,
+			roam_synch_data->hw_mode_trans_ind.vdev_mac_map);
+		cds_set_connection_in_progress(false);
+		session->roam_synch_in_progress = false;
+		cds_check_concurrent_intf_and_restart_sap(session->pContext);
+		sme_release_global_lock(&mac_ctx->sme);
+		return;
 	default:
 		sms_log(mac_ctx, LOGE, FL("LFR3: callback reason %d"), reason);
 		sme_release_global_lock(&mac_ctx->sme);
@@ -19737,6 +19761,7 @@ void csr_roam_synch_callback(tpAniSirGlobal mac_ctx,
 				("NO CSR_IS_WAIT_FOR_KEY -> csr_roam_link_up"));
 		csr_roam_link_up(mac_ctx, conn_profile->bssid);
 	}
+
 	session->fRoaming = false;
 	session->roam_synch_in_progress = false;
 	qdf_mem_free(roam_info->pbFrames);

+ 5 - 0
core/wma/inc/wma_api.h

@@ -296,4 +296,9 @@ bool wma_is_p2p_lo_capable(void);
 QDF_STATUS wma_p2p_lo_start(struct sir_p2p_lo_start *params);
 QDF_STATUS wma_p2p_lo_stop(u_int32_t vdev_id);
 QDF_STATUS wma_get_wakelock_stats(struct sir_wake_lock_stats *wake_lock_stats);
+
+void wma_process_pdev_hw_mode_trans_ind(void *wma,
+	wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
+	wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
+	struct sir_hw_mode_trans_ind *hw_mode_trans_ind);
 #endif

+ 62 - 39
core/wma/src/wma_main.c

@@ -2488,6 +2488,66 @@ fail:
 	return QDF_STATUS_E_FAILURE;
 }
 
+/**
+ * wma_process_pdev_hw_mode_trans_ind() - Process HW mode transition info
+ *
+ * @handle: WMA handle
+ * @fixed_param: Event fixed parameters
+ * @vdev_mac_entry - vdev mac entry
+ * @hw_mode_trans_ind - Buffer to store parsed information
+ *
+ * Parses fixed_param, vdev_mac_entry and fills in the information into
+ * hw_mode_trans_ind and wma
+ *
+ * Return: None
+ */
+void wma_process_pdev_hw_mode_trans_ind(void *handle,
+	wmi_pdev_hw_mode_transition_event_fixed_param *fixed_param,
+	wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry,
+	struct sir_hw_mode_trans_ind *hw_mode_trans_ind)
+{
+	uint32_t i;
+	tp_wma_handle wma = (tp_wma_handle) handle;
+
+	hw_mode_trans_ind->old_hw_mode_index = fixed_param->old_hw_mode_index;
+	hw_mode_trans_ind->new_hw_mode_index = fixed_param->new_hw_mode_index;
+	hw_mode_trans_ind->num_vdev_mac_entries =
+					fixed_param->num_vdev_mac_entries;
+	WMA_LOGI("%s: old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
+		__func__, fixed_param->old_hw_mode_index,
+		fixed_param->new_hw_mode_index,
+		fixed_param->num_vdev_mac_entries);
+
+	/* Store the vdev-mac map in WMA and send to policy manager */
+	for (i = 0; i < fixed_param->num_vdev_mac_entries; i++) {
+		uint32_t vdev_id, mac_id, pdev_id;
+		vdev_id = vdev_mac_entry[i].vdev_id;
+		pdev_id = vdev_mac_entry[i].pdev_id;
+
+		if (pdev_id == WMI_PDEV_ID_SOC) {
+			WMA_LOGE("%s: soc level id received for mac id)",
+					__func__);
+			QDF_BUG(0);
+			return;
+		}
+
+		mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
+
+		WMA_LOGI("%s: vdev_id:%d mac_id:%d",
+				__func__, vdev_id, mac_id);
+
+		hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
+		hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
+		wma_update_intf_hw_mode_params(vdev_id, mac_id,
+				fixed_param->new_hw_mode_index);
+	}
+	wma->old_hw_mode_index = fixed_param->old_hw_mode_index;
+	wma->new_hw_mode_index = fixed_param->new_hw_mode_index;
+
+	WMA_LOGI("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
+		__func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
+}
+
 /**
  * wma_pdev_hw_mode_transition_evt_handler() - HW mode transition evt handler
  * @handle: WMI handle
@@ -2505,7 +2565,6 @@ static int wma_pdev_hw_mode_transition_evt_handler(void *handle,
 		uint8_t *event,
 		uint32_t len)
 {
-	uint32_t i;
 	WMI_PDEV_HW_MODE_TRANSITION_EVENTID_param_tlvs *param_buf;
 	wmi_pdev_hw_mode_transition_event_fixed_param *wmi_event;
 	wmi_pdev_set_hw_mode_response_vdev_mac_entry *vdev_mac_entry;
@@ -2532,46 +2591,10 @@ static int wma_pdev_hw_mode_transition_evt_handler(void *handle,
 	}
 
 	wmi_event = param_buf->fixed_param;
-	hw_mode_trans_ind->old_hw_mode_index = wmi_event->old_hw_mode_index;
-	hw_mode_trans_ind->new_hw_mode_index = wmi_event->new_hw_mode_index;
-	hw_mode_trans_ind->num_vdev_mac_entries =
-						wmi_event->num_vdev_mac_entries;
-	WMA_LOGI("%s: old_hw_mode_index:%d new_hw_mode_index:%d entries=%d",
-		__func__, wmi_event->old_hw_mode_index,
-		wmi_event->new_hw_mode_index, wmi_event->num_vdev_mac_entries);
-
 	vdev_mac_entry =
 		param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping;
-
-	/* Store the vdev-mac map in WMA and prepare to send to HDD  */
-	for (i = 0; i < wmi_event->num_vdev_mac_entries; i++) {
-		uint32_t vdev_id, mac_id, pdev_id;
-		vdev_id = vdev_mac_entry[i].vdev_id;
-		pdev_id = vdev_mac_entry[i].pdev_id;
-
-		if (pdev_id == WMI_PDEV_ID_SOC) {
-			WMA_LOGE("%s: soc level id received for mac id)",
-					__func__);
-			QDF_BUG(0);
-			return QDF_STATUS_E_FAILURE;
-		}
-
-		mac_id = WMA_PDEV_TO_MAC_MAP(vdev_mac_entry[i].pdev_id);
-
-		WMA_LOGI("%s: vdev_id:%d mac_id:%d",
-				__func__, vdev_id, mac_id);
-
-		hw_mode_trans_ind->vdev_mac_map[i].vdev_id = vdev_id;
-		hw_mode_trans_ind->vdev_mac_map[i].mac_id = mac_id;
-		wma_update_intf_hw_mode_params(vdev_id, mac_id,
-				wmi_event->new_hw_mode_index);
-	}
-	wma->old_hw_mode_index = wmi_event->old_hw_mode_index;
-	wma->new_hw_mode_index = wmi_event->new_hw_mode_index;
-
-	WMA_LOGI("%s: Updated: old_hw_mode_index:%d new_hw_mode_index:%d",
-		__func__, wma->old_hw_mode_index, wma->new_hw_mode_index);
-
+	wma_process_pdev_hw_mode_trans_ind(wma, wmi_event, vdev_mac_entry,
+		hw_mode_trans_ind);
 	/* Pass the message to PE */
 	wma_send_msg(wma, SIR_HAL_PDEV_HW_MODE_TRANS_IND,
 		     (void *) hw_mode_trans_ind, 0);

+ 20 - 4
core/wma/src/wma_scan_roam.c

@@ -2155,6 +2155,13 @@ void wma_fill_roam_synch_buffer(tp_wma_handle wma,
 		QDF_TRACE_HEX_DUMP(QDF_MODULE_ID_WMA, QDF_TRACE_LEVEL_DEBUG,
 				   key->replay_counter, SIR_REPLAY_CTR_LEN);
 	}
+	if (param_buf->hw_mode_transition_fixed_param)
+		wma_process_pdev_hw_mode_trans_ind(wma,
+		    param_buf->hw_mode_transition_fixed_param,
+		    param_buf->wmi_pdev_set_hw_mode_response_vdev_mac_mapping,
+		    &roam_synch_ind_ptr->hw_mode_trans_ind);
+	else
+		WMA_LOGD(FL("hw_mode transition fixed param is NULL"));
 }
 
 /**
@@ -2284,8 +2291,7 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
 	}
 	qdf_mem_zero(roam_synch_ind_ptr, len);
 	wma_fill_roam_synch_buffer(wma, roam_synch_ind_ptr, param_buf);
-
-	 /* 24 byte MAC header and 12 byte to ssid IE */
+	/* 24 byte MAC header and 12 byte to ssid IE */
 	if (roam_synch_ind_ptr->beaconProbeRespLength >
 			(SIR_MAC_HDR_LEN_3A + SIR_MAC_B_PR_SSID_OFFSET)) {
 		ie_len = roam_synch_ind_ptr->beaconProbeRespLength -
@@ -2308,6 +2314,16 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event,
 	wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
 		roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION);
 	wma_process_roam_synch_complete(wma, synch_event->vdev_id);
+
+	/* update freq and channel width */
+	wma->interfaces[synch_event->vdev_id].mhz =
+		roam_synch_ind_ptr->chan_freq;
+	if (roam_synch_ind_ptr->join_rsp)
+		wma->interfaces[synch_event->vdev_id].chan_width =
+			roam_synch_ind_ptr->join_rsp->vht_channel_width;
+
+	wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context,
+		roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_COMPLETE);
 	wma->interfaces[synch_event->vdev_id].roam_synch_delay =
 		qdf_get_system_timestamp() - roam_synch_received;
 	WMA_LOGD("LFR3: roam_synch_delay:%d",
@@ -5789,9 +5805,9 @@ int wma_roam_event_callback(WMA_HANDLE handle, uint8_t *event_buf,
 			return -ENOMEM;
 		}
 		if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_START)
-			op_code = SIR_ROAMING_TX_QUEUE_DISABLE;
+			op_code = SIR_ROAMING_START;
 		if (wmi_event->notif == WMI_ROAM_NOTIF_ROAM_ABORT)
-			op_code = SIR_ROAMING_TX_QUEUE_ENABLE;
+			op_code = SIR_ROAMING_ABORT;
 		roam_synch_data->roamedVdevId = wmi_event->vdev_id;
 		wma_handle->csr_roam_synch_cb(
 				(tpAniSirGlobal)wma_handle->mac_context,