Prechádzať zdrojové kódy

qcacld-3.0: Refactor wlan_hdd_cm_issue_disconnect() API

Pass link info pointer as function argument to initiate
disconnect on the VDEV corresponding to the link info.
Existing callers moved to deflink pointer.

Change-Id: Ia1d0d7a5a7f7d6e7b83d278369c7541d0600a4ff
CRs-Fixed: 3522166
Vinod Kumar Pirla 2 rokov pred
rodič
commit
f08f0dff0c

+ 1 - 1
core/hdd/src/wlan_hdd_assoc.c

@@ -576,7 +576,7 @@ void hdd_abort_ongoing_sta_connection(struct hdd_context *hdd_ctx)
 
 	link_info = hdd_get_sta_connection_in_progress(hdd_ctx);
 	if (link_info)
-		wlan_hdd_cm_issue_disconnect(link_info->adapter,
+		wlan_hdd_cm_issue_disconnect(link_info,
 					     REASON_UNSPEC_FAILURE, false);
 }
 

+ 1 - 1
core/hdd/src/wlan_hdd_btc_chain_mode.c

@@ -109,7 +109,7 @@ wlan_hdd_btc_chain_mode_handler(struct wlan_objmgr_vdev *vdev)
 	switch (adapter->device_mode) {
 	case QDF_STA_MODE:
 	case QDF_P2P_CLIENT_MODE:
-		wlan_hdd_cm_issue_disconnect(adapter,
+		wlan_hdd_cm_issue_disconnect(link_info,
 					     REASON_PREV_AUTH_NOT_VALID, false);
 		break;
 	case QDF_SAP_MODE:

+ 4 - 4
core/hdd/src/wlan_hdd_cm_api.h

@@ -46,7 +46,7 @@ int wlan_hdd_cm_connect(struct wiphy *wiphy,
 
 /**
  * wlan_hdd_cm_issue_disconnect() - initiate disconnect from osif
- * @adapter: Pointer to adapter
+ * @link_info: Link info pointer in HDD adapter
  * @reason: Disconnect reason code
  * @sync: true if wait for disconnect to complete is required. for the
  *        supplicant initiated disconnect or during vdev delete/change interface
@@ -56,9 +56,9 @@ int wlan_hdd_cm_connect(struct wiphy *wiphy,
  *
  * Return: QDF_STATUS
  */
-QDF_STATUS wlan_hdd_cm_issue_disconnect(struct hdd_adapter *adapter,
-					enum wlan_reason_code reason,
-					bool sync);
+QDF_STATUS
+wlan_hdd_cm_issue_disconnect(struct wlan_hdd_link_info *link_info,
+			     enum wlan_reason_code reason, bool sync);
 
 /**
  * wlan_hdd_cm_disconnect() - cfg80211 disconnect api

+ 12 - 10
core/hdd/src/wlan_hdd_cm_disconnect.c

@@ -245,21 +245,22 @@ void reset_mscs_params(struct wlan_hdd_link_info *link_info)
 }
 #endif
 
-QDF_STATUS wlan_hdd_cm_issue_disconnect(struct hdd_adapter *adapter,
-					enum wlan_reason_code reason,
-					bool sync)
+QDF_STATUS
+wlan_hdd_cm_issue_disconnect(struct wlan_hdd_link_info *link_info,
+			     enum wlan_reason_code reason, bool sync)
 {
 	QDF_STATUS status;
 	struct wlan_objmgr_vdev *vdev;
 	struct hdd_station_ctx *sta_ctx;
+	struct hdd_adapter *adapter = link_info->adapter;
 
-	vdev = hdd_objmgr_get_vdev_by_user(adapter->deflink, WLAN_OSIF_CM_ID);
+	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_CM_ID);
 	if (!vdev)
 		return QDF_STATUS_E_INVAL;
 
-	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink);
+	sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
 	hdd_place_marker(adapter, "TRY TO DISCONNECT", NULL);
-	reset_mscs_params(adapter->deflink);
+	reset_mscs_params(link_info);
 	hdd_conn_set_authenticated(adapter, false);
 	wlan_hdd_netif_queue_control(adapter,
 				     WLAN_STOP_ALL_NETIF_QUEUE_N_CARRIER,
@@ -267,7 +268,7 @@ QDF_STATUS wlan_hdd_cm_issue_disconnect(struct hdd_adapter *adapter,
 
 	qdf_rtpm_sync_resume();
 
-	wlan_rec_conn_info(adapter->deflink->vdev_id, DEBUG_CONN_DISCONNECT,
+	wlan_rec_conn_info(link_info->vdev_id, DEBUG_CONN_DISCONNECT,
 			   sta_ctx->conn_info.bssid.bytes, 0, reason);
 
 	if (sync)
@@ -287,6 +288,7 @@ int wlan_hdd_cm_disconnect(struct wiphy *wiphy,
 	struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(adapter);
 	QDF_STATUS status;
 	int ret;
+	struct wlan_hdd_link_info *link_info = adapter->deflink;
 
 	if (QDF_GLOBAL_FTM_MODE == hdd_get_conparam()) {
 		hdd_err("Command not allowed in FTM mode");
@@ -297,7 +299,7 @@ int wlan_hdd_cm_disconnect(struct wiphy *wiphy,
 	if (ret)
 		return ret;
 
-	if (wlan_hdd_validate_vdev_id(adapter->deflink->vdev_id))
+	if (wlan_hdd_validate_vdev_id(link_info->vdev_id))
 		return -EINVAL;
 
 	if (hdd_ctx->is_wiphy_suspended) {
@@ -307,7 +309,7 @@ int wlan_hdd_cm_disconnect(struct wiphy *wiphy,
 
 	qdf_mtrace(QDF_MODULE_ID_HDD, QDF_MODULE_ID_HDD,
 		   TRACE_CODE_HDD_CFG80211_DISCONNECT,
-		   adapter->deflink->vdev_id, reason);
+		   link_info->vdev_id, reason);
 
 	hdd_print_netdev_txq_status(dev);
 
@@ -327,7 +329,7 @@ int wlan_hdd_cm_disconnect(struct wiphy *wiphy,
 	 * Thus we need to wait for disconnect to complete in this case,
 	 * and thus use sync API here.
 	 */
-	status = wlan_hdd_cm_issue_disconnect(adapter, reason, true);
+	status = wlan_hdd_cm_issue_disconnect(link_info, reason, true);
 
 	return qdf_status_to_os_return(status);
 }

+ 3 - 4
core/hdd/src/wlan_hdd_dcs.c

@@ -83,7 +83,7 @@ static QDF_STATUS hdd_dcs_switch_chan_cb(struct wlan_objmgr_vdev *vdev,
 
 	link_info = wlan_hdd_get_link_info_from_objmgr(vdev);
 	if (!link_info) {
-		hdd_err("Invalid adapter");
+		hdd_err("Invalid vdev %d", wlan_vdev_get_id(vdev));
 		return QDF_STATUS_E_INVAL;
 	}
 
@@ -102,7 +102,7 @@ static QDF_STATUS hdd_dcs_switch_chan_cb(struct wlan_objmgr_vdev *vdev,
 				return QDF_STATUS_E_INVAL;
 
 			hdd_dcs_add_bssid_to_reject_list(pdev, bssid);
-			wlan_hdd_cm_issue_disconnect(adapter,
+			wlan_hdd_cm_issue_disconnect(link_info,
 						     REASON_UNSPEC_FAILURE,
 						     true);
 			return QDF_STATUS_SUCCESS;
@@ -116,8 +116,7 @@ static QDF_STATUS hdd_dcs_switch_chan_cb(struct wlan_objmgr_vdev *vdev,
 					    tgt_freq, tgt_width);
 		break;
 	case QDF_SAP_MODE:
-		if (!test_bit(SOFTAP_BSS_STARTED,
-			      &adapter->deflink->link_flags))
+		if (!test_bit(SOFTAP_BSS_STARTED, &link_info->link_flags))
 			return QDF_STATUS_E_INVAL;
 
 		/* stop sap if got invalid freq or width */

+ 1 - 2
core/hdd/src/wlan_hdd_hostapd.c

@@ -5622,9 +5622,8 @@ hdd_check_and_disconnect_sta_on_invalid_channel(struct hdd_context *hdd_ctx,
 		hdd_err("STA adapter does not exist");
 		return;
 	}
-
 	hdd_err("chan %d not valid, issue disconnect", sta_chan_freq);
-	wlan_hdd_cm_issue_disconnect(sta_adapter, reason, false);
+	wlan_hdd_cm_issue_disconnect(sta_adapter->deflink, reason, false);
 }
 
 /**

+ 33 - 38
core/hdd/src/wlan_hdd_main.c

@@ -8587,6 +8587,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 	mac_handle_t mac_handle;
 	struct wlan_objmgr_vdev *vdev;
 	enum wlan_reason_code reason = REASON_IFACE_DOWN;
+	struct wlan_hdd_link_info *link_info = adapter->deflink;
 
 	hdd_enter();
 	hdd_destroy_adapter_sysfs_files(adapter);
@@ -8598,7 +8599,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		hdd_unmap_monitor_interface_vdev(adapter);
 	}
 
-	if (adapter->deflink->vdev_id != WLAN_UMAC_VDEV_ID_MAX)
+	if (link_info->vdev_id != WLAN_UMAC_VDEV_ID_MAX)
 		wlan_hdd_cfg80211_deregister_frames(adapter);
 
 	hdd_stop_tsf_sync(adapter);
@@ -8610,7 +8611,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 				     WLAN_CONTROL_PATH);
 
 	mac_handle = hdd_ctx->mac_handle;
-	vdev = hdd_objmgr_get_vdev_by_user(adapter->deflink, WLAN_OSIF_ID);
+	vdev = hdd_objmgr_get_vdev_by_user(link_info, WLAN_OSIF_ID);
 
 	switch (adapter->device_mode) {
 	case QDF_STA_MODE:
@@ -8618,12 +8619,12 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 	case QDF_P2P_DEVICE_MODE:
 	case QDF_NDI_MODE:
 	case QDF_NAN_DISC_MODE:
-		sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink);
+		sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
 
 		if (adapter->device_mode == QDF_NDI_MODE ||
 		    ((adapter->device_mode == QDF_STA_MODE ||
 		      adapter->device_mode == QDF_P2P_CLIENT_MODE) &&
-		      !hdd_cm_is_disconnected(adapter->deflink))) {
+		      !hdd_cm_is_disconnected(link_info))) {
 			INIT_COMPLETION(adapter->disconnect_comp_var);
 			if (cds_is_driver_recovering())
 				reason = REASON_DEVICE_RECOVERY;
@@ -8633,7 +8634,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 				hdd_ndp_peer_cleanup(hdd_ctx, adapter);
 				status = sme_roam_ndi_stop(
 						mac_handle,
-						adapter->deflink->vdev_id);
+						link_info->vdev_id);
 				if (QDF_IS_STATUS_SUCCESS(status)) {
 					rc = wait_for_completion_timeout(
 						&adapter->disconnect_comp_var,
@@ -8652,7 +8653,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 				 * complete before vdev is moved to logically
 				 * deleted.
 				 */
-				status = wlan_hdd_cm_issue_disconnect(adapter,
+				status = wlan_hdd_cm_issue_disconnect(link_info,
 								      reason,
 								      true);
 				if (QDF_IS_STATUS_ERROR(status) &&
@@ -8678,9 +8679,9 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 			ucfg_disable_nan_discovery(hdd_ctx->psoc, NULL, 0);
 
 		wlan_hdd_scan_abort(adapter);
-		wlan_hdd_cleanup_actionframe(adapter->deflink);
-		wlan_hdd_cleanup_remain_on_channel_ctx(adapter->deflink);
-		status = wlan_hdd_flush_pmksa_cache(adapter->deflink);
+		wlan_hdd_cleanup_actionframe(link_info);
+		wlan_hdd_cleanup_remain_on_channel_ctx(link_info);
+		status = wlan_hdd_flush_pmksa_cache(link_info);
 
 		hdd_deregister_hl_netdev_fc_timer(adapter);
 
@@ -8697,7 +8698,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 
 			ucfg_ipa_flush_pending_vdev_events(
 						hdd_ctx->pdev,
-						adapter->deflink->vdev_id);
+						link_info->vdev_id);
 		}
 		hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
 		hdd_vdev_destroy(adapter);
@@ -8705,16 +8706,14 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 
 	case QDF_MONITOR_MODE:
 		if (wlan_hdd_is_session_type_monitor(adapter->device_mode) &&
-		    adapter->deflink->vdev &&
+		    vdev &&
 		    ucfg_pkt_capture_get_mode(hdd_ctx->psoc) !=
 						PACKET_CAPTURE_MODE_DISABLE) {
 			struct hdd_adapter *sta_adapter;
 
-			ucfg_pkt_capture_deregister_callbacks(
-							adapter->deflink->vdev);
-			hdd_objmgr_put_vdev_by_user(adapter->deflink->vdev,
-						    WLAN_OSIF_ID);
-			adapter->deflink->vdev = NULL;
+			ucfg_pkt_capture_deregister_callbacks(vdev);
+			hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
+			link_info->vdev = NULL;
 
 			sta_adapter = hdd_get_adapter(hdd_ctx, QDF_STA_MODE);
 			if (!sta_adapter) {
@@ -8728,7 +8727,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		    (ucfg_mlme_is_sta_mon_conc_supported(hdd_ctx->psoc) ||
 		     ucfg_dp_is_local_pkt_capture_enabled(hdd_ctx->psoc))) {
 			hdd_info("Release wakelock for STA + monitor mode!");
-			os_if_dp_local_pkt_capture_stop(adapter->deflink->vdev);
+			os_if_dp_local_pkt_capture_stop(vdev);
 			qdf_runtime_pm_allow_suspend(
 				&hdd_ctx->runtime_context.monitor_mode);
 			hdd_lpc_enable_powersave(hdd_ctx);
@@ -8745,7 +8744,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		status = hdd_monitor_mode_vdev_status(adapter);
 		if (QDF_IS_STATUS_ERROR(status))
 			hdd_err_rl("stop failed monitor mode");
-		sme_delete_mon_session(mac_handle, adapter->deflink->vdev_id);
+		sme_delete_mon_session(mac_handle, link_info->vdev_id);
 		hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
 		hdd_vdev_destroy(adapter);
 		break;
@@ -8754,19 +8753,18 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		wlan_hdd_scan_abort(adapter);
 		hdd_abort_ongoing_sta_connection(hdd_ctx);
 		/* Diassociate with all the peers before stop ap post */
-		if (test_bit(SOFTAP_BSS_STARTED,
-			     &adapter->deflink->link_flags)) {
+		if (test_bit(SOFTAP_BSS_STARTED, &link_info->link_flags)) {
 			if (wlan_hdd_del_station(adapter, NULL))
 				hdd_sap_indicate_disconnect_for_sta(adapter);
 		}
-		status = wlan_hdd_flush_pmksa_cache(adapter->deflink);
+		status = wlan_hdd_flush_pmksa_cache(link_info);
 
-		sap_config = &adapter->deflink->session.ap.sap_config;
+		sap_config = &link_info->session.ap.sap_config;
 		wlansap_reset_sap_config_add_ie(sap_config, eUPDATE_IE_ALL);
 
 		ucfg_ipa_flush(hdd_ctx->pdev);
 
-		if (!ucfg_pre_cac_adapter_is_active(adapter->deflink->vdev)) {
+		if (!ucfg_pre_cac_adapter_is_active(vdev)) {
 			ucfg_pre_cac_stop(hdd_ctx->psoc);
 			hdd_close_pre_cac_adapter(hdd_ctx);
 		} else {
@@ -8777,19 +8775,19 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		fallthrough;
 
 	case QDF_P2P_GO_MODE:
-		ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(adapter->deflink);
+		ap_ctx = WLAN_HDD_GET_AP_CTX_PTR(link_info);
 		wlansap_cleanup_cac_timer(ap_ctx->sap_context);
 
 		cds_flush_work(&adapter->sap_stop_bss_work);
 		if (qdf_atomic_read(&ap_ctx->acs_in_progress)) {
 			hdd_info("ACS in progress, wait for complete");
 			qdf_wait_for_event_completion(
-				&adapter->deflink->acs_complete_event,
+				&link_info->acs_complete_event,
 				ACS_COMPLETE_TIMEOUT);
 		}
 
 		if (adapter->device_mode == QDF_P2P_GO_MODE) {
-			wlan_hdd_cleanup_remain_on_channel_ctx(adapter->deflink);
+			wlan_hdd_cleanup_remain_on_channel_ctx(link_info);
 			hdd_abort_ongoing_sta_connection(hdd_ctx);
 		}
 
@@ -8798,10 +8796,9 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		hdd_destroy_acs_timer(adapter);
 
 		mutex_lock(&hdd_ctx->sap_lock);
-		if (test_bit(SOFTAP_BSS_STARTED,
-			     &adapter->deflink->link_flags)) {
+		if (test_bit(SOFTAP_BSS_STARTED, &link_info->link_flags)) {
 			struct hdd_hostapd_state *hostapd_state =
-				WLAN_HDD_GET_HOSTAP_STATE_PTR(adapter->deflink);
+				WLAN_HDD_GET_HOSTAP_STATE_PTR(link_info);
 
 			qdf_event_reset(&hostapd_state->qdf_stop_bss_event);
 			status = wlansap_stop_bss(ap_ctx->sap_context);
@@ -8820,18 +8817,17 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 				hdd_err("failure in wlansap_stop_bss");
 			}
 
-			clear_bit(SOFTAP_BSS_STARTED,
-				  &adapter->deflink->link_flags);
+			clear_bit(SOFTAP_BSS_STARTED, &link_info->link_flags);
 			policy_mgr_decr_session_set_pcl(hdd_ctx->psoc,
 						adapter->device_mode,
-						adapter->deflink->vdev_id);
+						link_info->vdev_id);
 			hdd_green_ap_start_state_mc(hdd_ctx,
 						    adapter->device_mode,
 						    false);
 
 			qdf_copy_macaddr(&update_ie.bssid,
 					 &adapter->mac_addr);
-			update_ie.vdev_id = adapter->deflink->vdev_id;
+			update_ie.vdev_id = link_info->vdev_id;
 			update_ie.ieBufferlength = 0;
 			update_ie.pAdditionIEBuffer = NULL;
 			update_ie.append = false;
@@ -8858,8 +8854,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		 * and is not cleared/freed on purpose in case of SAP SSR
 		 */
 		if (!cds_is_driver_recovering()) {
-			clear_bit(SOFTAP_INIT_DONE,
-				  &adapter->deflink->link_flags);
+			clear_bit(SOFTAP_INIT_DONE, &link_info->link_flags);
 			qdf_mem_free(ap_ctx->beacon);
 			ap_ctx->beacon = NULL;
 		}
@@ -8884,7 +8879,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		if (adapter->device_mode == QDF_SAP_MODE) {
 			ucfg_ipa_flush_pending_vdev_events(
 						hdd_ctx->pdev,
-						adapter->deflink->vdev_id);
+						link_info->vdev_id);
 		}
 		hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID);
 		hdd_vdev_destroy(adapter);
@@ -8892,7 +8887,7 @@ QDF_STATUS hdd_stop_adapter_ext(struct hdd_context *hdd_ctx,
 		mutex_unlock(&hdd_ctx->sap_lock);
 		break;
 	case QDF_OCB_MODE:
-		sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter->deflink);
+		sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(link_info);
 		cdp_clear_peer(cds_get_context(QDF_MODULE_ID_SOC),
 			       OL_TXRX_PDEV_ID,
 			       sta_ctx->conn_info.peer_macaddr[0]);
@@ -20354,7 +20349,7 @@ wlan_hdd_add_monitor_check(struct hdd_context *hdd_ctx,
 
 		if (num_open_session == 1) {
 			/* Try disconnecting if already in connected state */
-			wlan_hdd_cm_issue_disconnect(sta_adapter,
+			wlan_hdd_cm_issue_disconnect(sta_adapter->deflink,
 						     REASON_UNSPEC_FAILURE,
 						     true);
 		}

+ 6 - 5
core/hdd/src/wlan_hdd_nud_tracking.c

@@ -64,20 +64,21 @@ hdd_handle_nud_fail_sta(struct hdd_context *hdd_ctx,
 }
 
 static void
-hdd_handle_nud_fail_non_sta(struct hdd_adapter *adapter)
+hdd_handle_nud_fail_non_sta(struct wlan_hdd_link_info *link_info)
 {
-	wlan_hdd_cm_issue_disconnect(adapter,
+	wlan_hdd_cm_issue_disconnect(link_info,
 				     REASON_GATEWAY_REACHABILITY_FAILURE,
 				     false);
 }
 
 /**
  * __hdd_nud_failure_work() - work for nud event
- * @adapter: Pointer to hdd_adapter
+ * @adapter: HDD adapter
  *
  * Return: None
  */
-static void __hdd_nud_failure_work(struct hdd_adapter *adapter)
+static void
+__hdd_nud_failure_work(struct hdd_adapter *adapter)
 {
 	struct hdd_context *hdd_ctx;
 	int status;
@@ -119,7 +120,7 @@ static void __hdd_nud_failure_work(struct hdd_adapter *adapter)
 		hdd_handle_nud_fail_sta(hdd_ctx, adapter);
 		return;
 	}
-	hdd_handle_nud_fail_non_sta(adapter);
+	hdd_handle_nud_fail_non_sta(adapter->deflink);
 
 	hdd_exit();
 }

+ 1 - 1
core/hdd/src/wlan_hdd_regulatory.c

@@ -1684,7 +1684,7 @@ static void hdd_country_change_update_sta(struct hdd_context *hdd_ctx)
 						  phy_changed, freq_changed,
 						  width_changed);
 					wlan_hdd_cm_issue_disconnect(
-							adapter,
+							adapter->deflink,
 							REASON_UNSPEC_FAILURE,
 							false);
 					sta_ctx->reg_phymode = csr_phy_mode;