Pārlūkot izejas kodu

Merge "qcacmn: Add support for peer create response event"

Linux Build Service Account 4 gadi atpakaļ
vecāks
revīzija
eb9b6ee897

+ 25 - 0
os_if/linux/mlme/inc/osif_cm_util.h

@@ -173,6 +173,31 @@ typedef QDF_STATUS
 	(*osif_cm_netif_queue_ctrl_cb)(struct wlan_objmgr_vdev *vdev,
 				       enum netif_action_type action,
 				       enum netif_reason_type reason);
+
+/**
+ * osif_cm_unlink_bss() - function to unlink bss from kernel and scan database
+ * on connect timeouts reasons
+ * @vdev: vdev pointer
+ * @osif_priv: Pointer to vdev osif priv
+ * @bssid: bssid to flush
+ * @ssid: optional ssid to flush
+ * @ssid_len: optional ssid length
+ *
+ * This function flush the bss from scan db of kernel and driver matching the
+ * bssid. ssid is optional to pass to match the bss.
+ *
+ * Return: void
+ */
+void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev,
+			struct vdev_osif_priv *osif_priv,
+			struct qdf_mac_addr *bssid,
+			uint8_t *ssid, uint8_t ssid_len);
+#else
+static inline
+void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev,
+			struct vdev_osif_priv *osif_priv,
+			struct qdf_mac_addr *bssid,
+			uint8_t *ssid, uint8_t ssid_len) {}
 #endif
 
 /**

+ 19 - 0
os_if/linux/mlme/src/osif_cm_connect_rsp.c

@@ -428,6 +428,18 @@ static void osif_indcate_connect_results(struct wlan_objmgr_vdev *vdev,
 }
 #endif /* CFG80211_CONNECT_BSS */
 
+static inline
+bool osif_cm_is_unlink_bss_required(enum wlan_cm_connect_fail_reason reason)
+{
+	if (reason == CM_NO_CANDIDATE_FOUND ||
+	    reason == CM_JOIN_TIMEOUT ||
+	    reason == CM_AUTH_TIMEOUT ||
+	    reason == CM_ASSOC_TIMEOUT)
+		return true;
+
+	return false;
+}
+
 QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
 				struct wlan_cm_connect_rsp *rsp)
 {
@@ -442,6 +454,10 @@ QDF_STATUS osif_connect_handler(struct wlan_objmgr_vdev *vdev,
 		       rsp->connect_status ? "FAILURE" : "SUCCESS", rsp->cm_id,
 		       rsp->reason, rsp->reason_code);
 
+	if (osif_cm_is_unlink_bss_required(rsp->reason))
+		osif_cm_unlink_bss(vdev, osif_priv, &rsp->bssid, rsp->ssid.ssid,
+				   rsp->ssid.length);
+
 	status = osif_validate_connect_and_reset_src_id(osif_priv, rsp->cm_id);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		osif_cm_connect_comp_ind(vdev, rsp, OSIF_NOT_HANDLED);
@@ -467,5 +483,8 @@ QDF_STATUS osif_failed_candidate_handler(struct wlan_objmgr_vdev *vdev,
 		       rsp->ssid.length, rsp->ssid.ssid, rsp->cm_id,
 		       rsp->reason, rsp->reason_code);
 
+	if (osif_cm_is_unlink_bss_required(rsp->reason))
+		osif_cm_unlink_bss(vdev, osif_priv, &rsp->bssid, rsp->ssid.ssid,
+				   rsp->ssid.length);
 	return QDF_STATUS_SUCCESS;
 }

+ 6 - 0
os_if/linux/mlme/src/osif_cm_disconnect_rsp.c

@@ -139,6 +139,12 @@ QDF_STATUS osif_disconnect_handler(struct wlan_objmgr_vdev *vdev,
 		       osif_priv->cm_info.last_disconnect_reason,
 		       osif_cm_qca_reason_to_str(osif_priv->cm_info.last_disconnect_reason));
 
+	/* Unlink bss if disconnect is from peer or south bound */
+	if (rsp->req.req.source == CM_PEER_DISCONNECT ||
+	    rsp->req.req.source == CM_SB_DISCONNECT)
+		osif_cm_unlink_bss(vdev, osif_priv, &rsp->req.req.bssid,
+				   NULL, 0);
+
 	status = osif_validate_disconnect_and_reset_src_id(osif_priv, rsp);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		osif_cm_disconnect_comp_ind(vdev, rsp, OSIF_NOT_HANDLED);

+ 21 - 0
os_if/linux/mlme/src/osif_cm_util.c

@@ -25,6 +25,7 @@
 #include "wlan_osif_priv.h"
 #include "wlan_cfg80211.h"
 #include "osif_cm_rsp.h"
+#include "wlan_cfg80211_scan.h"
 
 static struct osif_cm_ops *osif_cm_legacy_ops;
 
@@ -220,6 +221,26 @@ osif_cm_disconnect_complete_cb(struct wlan_objmgr_vdev *vdev,
 }
 
 #ifdef CONN_MGR_ADV_FEATURE
+void osif_cm_unlink_bss(struct wlan_objmgr_vdev *vdev,
+			struct vdev_osif_priv *osif_priv,
+			struct qdf_mac_addr *bssid,
+			uint8_t *ssid, uint8_t ssid_len)
+{
+	struct wiphy *wiphy = osif_priv->wdev->wiphy;
+	struct scan_filter *filter;
+
+	__wlan_cfg80211_unlink_bss_list(wiphy, bssid->bytes,
+					ssid_len ? ssid : NULL, ssid_len);
+	filter = qdf_mem_malloc(sizeof(*filter));
+	if (!filter)
+		return;
+
+	filter->num_of_bssid = 1;
+	qdf_copy_macaddr(&filter->bssid_list[0], bssid);
+	ucfg_scan_flush_results(wlan_vdev_get_pdev(vdev), filter);
+	qdf_mem_free(filter);
+}
+
 static QDF_STATUS
 osif_cm_disable_netif_queue(struct wlan_objmgr_vdev *vdev)
 {

+ 1 - 0
spectral/Kbuild

@@ -36,6 +36,7 @@ INCS += -I$(obj)/$(DEPTH)/component_dev/wmi/inc
 INCS += -I$(obj)/$(DEPTH)/pld/inc
 INCS += -I$(obj)/$(DEPTH)/component_dev/dp/inc
 INCS += -I$(obj)/$(DEPTH)/cmn_dev/umac/mlme/connection_mgr/dispatcher/inc
+INCS += -I$(obj)/$(DEPTH)/cmn_dev/umac/thermal/dispatcher/inc
 
 ifeq ($(WLAN_CONV_CRYPTO_SUPPORTED), 1)
 INCS += -I$(obj)/$(DEPTH)/cmn_dev/umac/cmn_services/crypto/inc

+ 17 - 4
umac/mlme/connection_mgr/core/src/wlan_cm_connect.c

@@ -926,6 +926,7 @@ connect_err:
  * @cm_ctx: connection manager context
  * @cm_req: Connect request.
  * @resp: connect resp from previous connection attempt
+ * @same_candidate_used: this will be set if same candidate used
  *
  * This function return a valid candidate to try connection. It return failure
  * if no valid candidate is present or all valid candidate are tried.
@@ -934,7 +935,8 @@ connect_err:
  */
 static QDF_STATUS cm_get_valid_candidate(struct cnx_mgr *cm_ctx,
 					 struct cm_req *cm_req,
-					 struct wlan_cm_connect_rsp *resp)
+					 struct wlan_cm_connect_rsp *resp,
+					 bool *same_candidate_used)
 {
 	struct scan_cache_node *scan_node = NULL;
 	qdf_list_node_t *cur_node = NULL, *next_node = NULL;
@@ -1018,6 +1020,9 @@ flush_single_pmk:
 		cm_delete_pmksa_for_single_pmk_bssid(cm_ctx,
 						&prev_candidate->entry->bssid);
 
+	if (same_candidate_used)
+		*same_candidate_used = use_same_candidate;
+
 	return status;
 }
 
@@ -1088,16 +1093,24 @@ QDF_STATUS cm_try_next_candidate(struct cnx_mgr *cm_ctx,
 {
 	QDF_STATUS status;
 	struct cm_req *cm_req;
+	bool same_candidate_used = false;
 
 	cm_req = cm_get_req_by_cm_id(cm_ctx, resp->cm_id);
 	if (!cm_req)
 		return QDF_STATUS_E_FAILURE;
 
-	status = cm_get_valid_candidate(cm_ctx, cm_req, resp);
+	status = cm_get_valid_candidate(cm_ctx, cm_req, resp,
+					&same_candidate_used);
 	if (QDF_IS_STATUS_ERROR(status))
 		goto connect_err;
 
-	mlme_cm_osif_failed_candidate_ind(cm_ctx->vdev, resp);
+	/*
+	 * Do not indicate to OSIF if same candidate is used again as we are not
+	 * done with this candidate. So inform once we move to next candidate.
+	 * This will also avoid flush for the scan entry.
+	 */
+	if (!same_candidate_used)
+		mlme_cm_osif_failed_candidate_ind(cm_ctx->vdev, resp);
 
 	status = cm_send_bss_select_ind(cm_ctx, &cm_req->connect_req);
 	/*
@@ -1156,7 +1169,7 @@ QDF_STATUS cm_connect_active(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id)
 	wlan_vdev_mlme_set_ssid(cm_ctx->vdev, req->ssid.ssid, req->ssid.length);
 	cm_fill_vdev_crypto_params(cm_ctx, req);
 
-	status = cm_get_valid_candidate(cm_ctx, cm_req, NULL);
+	status = cm_get_valid_candidate(cm_ctx, cm_req, NULL, NULL);
 	if (QDF_IS_STATUS_ERROR(status))
 		goto connect_err;
 

+ 36 - 0
umac/thermal/dispatcher/inc/wlan_thermal_public_struct.h

@@ -0,0 +1,36 @@
+/* Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: declare the thermal public structure
+ */
+#ifndef _WLAN_THERMAL_PUBLIC_STRUCT_H_
+#define _WLAN_THERMAL_PUBLIC_STRUCT_H_
+
+/**
+ * enum thermal_throttle_level - firmware offload throttle level
+ * @THERMAL_FULLPERF: no any throtting
+ * @THERMAL_MITIGATION: throtting tx to do mitigation
+ * @THERMAL_SHUTOFF: shut down the tx completely
+ * @THERMAL_UNKNOWN: unknown level from target.
+ */
+enum thermal_throttle_level {
+	 THERMAL_FULLPERF,
+	 THERMAL_MITIGATION,
+	 THERMAL_SHUTOFF,
+	 THERMAL_UNKNOWN,
+};
+
+#endif /* _WLAN_THERMAL_PUBLIC_STRUCT_H_ */

+ 4 - 2
wmi/inc/wmi_unified_api.h

@@ -32,6 +32,7 @@
 #include "wlan_mgmt_txrx_utils_api.h"
 #include <wlan_dfs_public_struct.h>
 #include <wlan_crypto_global_def.h>
+#include "wlan_thermal_public_struct.h"
 #ifdef WLAN_POWER_MANAGEMENT_OFFLOAD
 #include "wmi_unified_pmo_api.h"
 #endif
@@ -2947,13 +2948,14 @@ wmi_extract_chan_stats(wmi_unified_t wmi_handle, void *evt_buf,
  * @wmi_handle: wmi handle
  * @evt_buf: Pointer to event buffer
  * @temp: Pointer to hold extracted temperature
- * @level: Pointer to hold extracted level
+ * @level: Pointer to hold extracted level in host enum
  * @pdev_id: Pointer to hold extracted pdev_id
  *
  * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE for failure
  */
 QDF_STATUS wmi_extract_thermal_stats(wmi_unified_t wmi_handle, void *evt_buf,
-				     uint32_t *temp, uint32_t *level,
+				     uint32_t *temp,
+				     enum thermal_throttle_level *level,
 				     uint32_t *pdev_id);
 
 /**

+ 25 - 0
wmi/inc/wmi_unified_param.h

@@ -7246,6 +7246,31 @@ struct wmi_host_pdev_qvit_event {
 	uint32_t pdev_id;
 };
 
+/**
+ * enum wmi_peer_create_status - Peer Create response status
+ * @WMI_PEER_CREATE_SUCCESS: Peer creation successful at fw
+ * @WMI_PEER_EXISTS: Peer with same mac exists at fw
+ * @WMI_PEER_CREATE_FAILED: Peer creation failed at fw
+ */
+enum wmi_peer_create_status {
+	WMI_PEER_CREATE_SUCCESS = 0,
+	WMI_PEER_EXISTS = 1,
+	WMI_PEER_CREATE_FAILED = 2,
+};
+
+/**
+ * struct wmi_host_peer_create_response_event - Peer Create response event param
+ * @vdev_id: vdev id
+ * @mac_address: Peer Mac Address
+ * @status: Peer create status
+ *
+ */
+struct wmi_host_peer_create_response_event {
+	uint32_t vdev_id;
+	struct qdf_mac_addr mac_address;
+	uint32_t status;
+};
+
 /**
  * struct wmi_host_peer_delete_response_event - Peer Delete response event param
  * @vdev_id: vdev id

+ 6 - 1
wmi/inc/wmi_unified_priv.h

@@ -1814,7 +1814,7 @@ QDF_STATUS (*extract_mib_stats)(wmi_unified_t wmi_handle, void *evt_buf,
 #endif
 
 QDF_STATUS (*extract_thermal_stats)(wmi_unified_t wmi_handle, void *evt_buf,
-	uint32_t *temp, uint32_t *level, uint32_t *pdev_id);
+	uint32_t *temp, enum thermal_throttle_level *level, uint32_t *pdev_id);
 
 QDF_STATUS (*extract_thermal_level_stats)(wmi_unified_t wmi_handle,
 		void *evt_buf, uint8_t idx, uint32_t *levelcount,
@@ -1990,6 +1990,11 @@ QDF_STATUS (*extract_pdev_qvit_event)(wmi_unified_t wmi_hdl,
 uint16_t (*wmi_set_htc_tx_tag)(wmi_unified_t wmi_handle,
 				wmi_buf_t buf, uint32_t cmd_id);
 
+QDF_STATUS (*extract_peer_create_response_event)(
+			wmi_unified_t wmi_handle,
+			void *evt_buf,
+			struct wmi_host_peer_create_response_event *param);
+
 QDF_STATUS (*extract_peer_delete_response_event)(
 			wmi_unified_t wmi_handle,
 			void *evt_buf,

+ 2 - 1
wmi/src/wmi_unified_api.c

@@ -2227,7 +2227,8 @@ wmi_extract_chan_stats(wmi_unified_t wmi_handle, void *evt_buf,
 }
 
 QDF_STATUS wmi_extract_thermal_stats(wmi_unified_t wmi_handle, void *evt_buf,
-				     uint32_t *temp, uint32_t *level,
+				     uint32_t *temp,
+				     enum thermal_throttle_level *level,
 				     uint32_t *pdev_id)
 {
 	if (wmi_handle->ops->extract_thermal_stats)

+ 28 - 4
wmi/src/wmi_unified_tlv.c

@@ -11375,19 +11375,40 @@ static QDF_STATUS extract_scan_radio_cap_service_ready_ext2_tlv(
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * wmi_tgt_thermal_level_to_host() - Convert target thermal level to host enum
+ * @level: target thermal level from WMI_THERM_THROT_STATS_EVENTID event
+ *
+ * Return: host thermal throt level
+ */
+static enum thermal_throttle_level
+wmi_tgt_thermal_level_to_host(uint32_t level)
+{
+	switch (level) {
+	case WMI_THERMAL_FULLPERF:
+		return THERMAL_FULLPERF;
+	case WMI_THERMAL_MITIGATION:
+		return THERMAL_MITIGATION;
+	case WMI_THERMAL_SHUTOFF:
+		return THERMAL_SHUTOFF;
+	default:
+		return THERMAL_UNKNOWN;
+	}
+}
+
 /**
  * extract_thermal_stats_tlv() - extract thermal stats from event
  * @wmi_handle: wmi handle
  * @param evt_buf: Pointer to event buffer
  * @param temp: Pointer to hold extracted temperature
- * @param level: Pointer to hold extracted level
+ * @param level: Pointer to hold extracted level in host enum
  *
  * Return: 0 for success or error code
  */
 static QDF_STATUS
 extract_thermal_stats_tlv(wmi_unified_t wmi_handle,
 		void *evt_buf, uint32_t *temp,
-		uint32_t *level, uint32_t *pdev_id)
+		enum thermal_throttle_level *level, uint32_t *pdev_id)
 {
 	WMI_THERM_THROT_STATS_EVENTID_param_tlvs *param_buf;
 	wmi_therm_throt_stats_event_fixed_param *tt_stats_event;
@@ -11398,12 +11419,13 @@ extract_thermal_stats_tlv(wmi_unified_t wmi_handle,
 		return QDF_STATUS_E_INVAL;
 
 	tt_stats_event = param_buf->fixed_param;
-
+	wmi_debug("thermal temperature %d level %d",
+		  tt_stats_event->temp, tt_stats_event->level);
 	*pdev_id = wmi_handle->ops->convert_pdev_id_target_to_host(
 						wmi_handle,
 						tt_stats_event->pdev_id);
 	*temp = tt_stats_event->temp;
-	*level = tt_stats_event->level;
+	*level = wmi_tgt_thermal_level_to_host(tt_stats_event->level);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -14386,6 +14408,8 @@ static void populate_tlv_events_id(uint32_t *event_ids)
 	event_ids[wmi_peer_estimated_linkspeed_event_id] =
 				WMI_PEER_ESTIMATED_LINKSPEED_EVENTID;
 	event_ids[wmi_peer_state_event_id] = WMI_PEER_STATE_EVENTID;
+	event_ids[wmi_peer_create_conf_event_id] =
+					WMI_PEER_CREATE_CONF_EVENTID;
 	event_ids[wmi_peer_delete_response_event_id] =
 					WMI_PEER_DELETE_RESP_EVENTID;
 	event_ids[wmi_peer_delete_all_response_event_id] =