瀏覽代碼

qcacmn: Add new events to the interface manager

Add new events to the interfaces manager for the
following which requires inter vdev co-ordination
	1. ACS
	2. HT40 scan
These event are sent to the MBSS frameworkfor inter VDEV
co-ordination.

Add a string array ro represent interface manage events.
Add API to retrieve string from interface manager events.

Change-Id: I397621a432da70156e34f46f75fd6c0e8d0a7b53
CRs-Fixed: 2963147
Vivek 4 年之前
父節點
當前提交
c893f06069

+ 173 - 2
umac/cmn_services/interface_mgr/inc/wlan_if_mgr_ap.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2020-2021, 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
@@ -81,4 +81,175 @@ QDF_STATUS
 if_mgr_ap_stop_bss_complete(struct wlan_objmgr_vdev *vdev,
 			    struct if_mgr_event_data *event_data);
 
-#endif
+#if defined WLAN_MBSS
+/**
+ * if_mgr_ap_start_acs() - ACS start event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles the ACS start event for interface
+ * manager
+ *
+ * Context: It can run in process/tasklet context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_ap_start_acs(struct wlan_objmgr_vdev *vdev,
+			    struct if_mgr_event_data *event_data);
+
+/**
+ * if_mgr_ap_stop_acs() - ACS stop event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles the ACS stop event for interface
+ * manager
+ *
+ * Context: It can run in process/tasklet context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_ap_stop_acs(struct wlan_objmgr_vdev *vdev,
+			      struct if_mgr_event_data *event_data);
+
+/**
+ * if_mgr_ap_done_acs() - ACS done event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles the ACS stop event for interface
+ * manager
+ *
+ * Context: It can run in process/tasklet context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_ap_done_acs(struct wlan_objmgr_vdev *vdev,
+			      struct if_mgr_event_data *event_data);
+
+/**
+ * if_mgr_ap_cancel_acs() - ACS cancel event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles the ACS cancel event for interface
+ * manager
+ *
+ * Context: It can run in process/tasklet context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_ap_cancel_acs(struct wlan_objmgr_vdev *vdev,
+				struct if_mgr_event_data *event_data);
+
+/**
+ * if_mgr_ap_start_ht40() - HT40 scan start event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles the HT40 scan start event for interface
+ * manager
+ *
+ * Context: It can run in process/tasklet context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_ap_start_ht40(struct wlan_objmgr_vdev *vdev,
+				struct if_mgr_event_data *event_data);
+
+/**
+ * if_mgr_ap_stop_ht40() - HT40 scan stop event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles the HT40 scan stop event for interface
+ * manager
+ *
+ * Context: It can run in process/tasklet context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_ap_stop_ht40(struct wlan_objmgr_vdev *vdev,
+			       struct if_mgr_event_data *event_data);
+
+/**
+ * if_mgr_ap_done_ht40() - HT40 scan done event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles the HT40 scan done event for interface
+ * manager
+ *
+ * Context: It can run in process/tasklet context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_ap_done_ht40(struct wlan_objmgr_vdev *vdev,
+			       struct if_mgr_event_data *event_data);
+
+/**
+ * if_mgr_ap_cancel_ht40() - HT40 scan cancel event handler
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles the HT40 scan cancel event for interface
+ * manager
+ *
+ * Context: It can run in process/tasklet context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_ap_cancel_ht40(struct wlan_objmgr_vdev *vdev,
+				 struct if_mgr_event_data *event_data);
+#else
+static inline QDF_STATUS
+if_mgr_ap_start_acs(struct wlan_objmgr_vdev *vdev,
+		    struct if_mgr_event_data *event_data)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+if_mgr_ap_stop_acs(struct wlan_objmgr_vdev *vdev,
+		   struct if_mgr_event_data *event_data)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+if_mgr_ap_cancel_acs(struct wlan_objmgr_vdev *vdev,
+		     struct if_mgr_event_data *event_data)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+if_mgr_ap_start_ht40(struct wlan_objmgr_vdev *vdev,
+		     struct if_mgr_event_data *event_data)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+if_mgr_ap_stop_ht40(struct wlan_objmgr_vdev *vdev,
+		    struct if_mgr_event_data *event_data)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+if_mgr_ap_done_ht40(struct wlan_objmgr_vdev *vdev,
+		    struct if_mgr_event_data *event_data)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+if_mgr_ap_cancel_ht40(struct wlan_objmgr_vdev *vdev,
+		      struct if_mgr_event_data *event_data)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif /* WLAN_MBSS */
+#endif /* _WLAN_IF_MGR_AP_H_ */
+

+ 27 - 2
umac/cmn_services/interface_mgr/inc/wlan_if_mgr_api.h

@@ -38,14 +38,39 @@
 QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev,
 				enum wlan_if_mgr_evt event,
 				struct if_mgr_event_data *event_data);
+/**
+ * if_mgr_get_event_str() - get event string
+ * @event: interface manager event
+ *
+ * Return: Interface event string
+ */
+const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event);
+
+/**
+ * if_mgr_deliver_mbss_event() - interface mgr MBSS event handler
+ * @vdev: vdev object
+ * @event: interface mangaer event
+ * @event_data: Interface mgr event data
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev,
+				     enum wlan_if_mgr_evt event,
+				     struct if_mgr_event_data *event_data);
+
 #else
 static inline
 QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev,
 				enum wlan_if_mgr_evt event,
 				struct if_mgr_event_data *event_data)
 {
-
 	return QDF_STATUS_SUCCESS;
 }
-#endif
+
+static inline const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event)
+{
+	return "";
+}
+
+#endif /* WLAN_FEATURE_INTERFACE_MGR */
 #endif

+ 19 - 1
umac/cmn_services/interface_mgr/inc/wlan_if_mgr_public_struct.h

@@ -39,6 +39,14 @@
  * @WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE:Event to handle start bss complete
  * @WLAN_IF_MGR_EV_AP_STOP_BSS:Event to handle stop bss request
  * @WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE:Event to stop bss complete
+ * WLAN_IF_MGR_EV_AP_START_ACS: Event to handle ACS start
+ * WLAN_IF_MGR_EV_AP_STOP_ACS: Event to handle ACS stop
+ * WLAN_IF_MGR_EV_AP_DONE_ACS: Event to handle ACS completion
+ * WLAN_IF_MGR_EV_AP_CANCEL_ACS: Event to handle ACS cancel
+ * WLAN_IF_MGR_EV_AP_START_HT40: Event to handle HT40 scan start
+ * WLAN_IF_MGR_EV_AP_STOP_HT40: Event to handle HT40 scan stop
+ * WLAN_IF_MGR_EV_AP_DONE_HT40: Event to handle HT40 scan completion
+ * WLAN_IF_MGR_EV_AP_CANCEL_HT40: Event to handle HT40 scan cancel
  */
 enum wlan_if_mgr_evt {
 	WLAN_IF_MGR_EV_CONNECT_START = 0,
@@ -50,7 +58,15 @@ enum wlan_if_mgr_evt {
 	WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE = 6,
 	WLAN_IF_MGR_EV_AP_STOP_BSS = 7,
 	WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE = 8,
-	WLAN_IF_MGR_EV_MAX = 9,
+	WLAN_IF_MGR_EV_AP_START_ACS = 9,
+	WLAN_IF_MGR_EV_AP_STOP_ACS = 10,
+	WLAN_IF_MGR_EV_AP_DONE_ACS = 11,
+	WLAN_IF_MGR_EV_AP_CANCEL_ACS = 12,
+	WLAN_IF_MGR_EV_AP_START_HT40 = 13,
+	WLAN_IF_MGR_EV_AP_STOP_HT40 = 14,
+	WLAN_IF_MGR_EV_AP_DONE_HT40 = 15,
+	WLAN_IF_MGR_EV_AP_CANCEL_HT40 = 16,
+	WLAN_IF_MGR_EV_MAX = 17,
 };
 
 /**
@@ -70,10 +86,12 @@ struct validate_bss_data {
  * @status: qdf status used to indicate if connect,disconnect,
  *	    start bss,stop bss event is success/failure.
  * @validate_bss_info: struct to hold the validate candidate information
+ * @data: event data
  */
 struct if_mgr_event_data {
 	QDF_STATUS status;
 	struct validate_bss_data validate_bss_info;
+	void *data;
 };
 
 #endif

+ 16 - 1
umac/cmn_services/interface_mgr/inc/wlan_if_mgr_sta.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2020-2021, 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
@@ -78,4 +78,19 @@ QDF_STATUS if_mgr_disconnect_start(struct wlan_objmgr_vdev *vdev,
 QDF_STATUS if_mgr_disconnect_complete(struct wlan_objmgr_vdev *vdev,
 				      struct if_mgr_event_data *event_data);
 
+/**
+ * if_mgr_validate_candidate() - Validate the selected candidate
+ * @vdev: vdev object
+ * @event_data: Interface mgr event data
+ *
+ * This function handles candidate validation as part of connection
+ * manager
+ *
+ * Context: It should run in thread context
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS if_mgr_validate_candidate(struct wlan_objmgr_vdev *vdev,
+				     struct if_mgr_event_data *event_data);
+
 #endif

+ 91 - 5
umac/cmn_services/interface_mgr/src/wlan_if_mgr_core.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2020-2021, 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
@@ -22,7 +22,94 @@
 #include "wlan_if_mgr_sta.h"
 #include "wlan_if_mgr_ap.h"
 #include "wlan_if_mgr_main.h"
+#if !defined WLAN_MBSS
 #include "wlan_if_mgr_roam.h"
+#endif
+
+const char *if_mgr_get_event_str(enum wlan_if_mgr_evt event)
+{
+	if (event > WLAN_IF_MGR_EV_MAX)
+		return "";
+
+	switch (event) {
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_START);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_CONNECT_COMPLETE);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_DISCONNECT_START);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_DISCONNECT_COMPLETE);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_VALIDATE_CANDIDATE);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_BSS);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_BSS_COMPLETE);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_BSS);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_ACS);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_ACS);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_DONE_ACS);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CANCEL_ACS);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_START_HT40);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_STOP_HT40);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_DONE_HT40);
+	CASE_RETURN_STRING(WLAN_IF_MGR_EV_AP_CANCEL_HT40);
+	default:
+		return "Unknown";
+	}
+}
+
+#if defined WLAN_MBSS
+QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev,
+				     enum wlan_if_mgr_evt event,
+				     struct if_mgr_event_data *event_data)
+{
+	QDF_STATUS status;
+
+	switch (event) {
+	case WLAN_IF_MGR_EV_AP_START_ACS:
+		status = if_mgr_ap_start_acs(vdev, event_data);
+		break;
+	case WLAN_IF_MGR_EV_AP_STOP_ACS:
+		status = if_mgr_ap_stop_acs(vdev, event_data);
+		break;
+	case WLAN_IF_MGR_EV_AP_CANCEL_ACS:
+		status = if_mgr_ap_cancel_acs(vdev, event_data);
+		break;
+	case WLAN_IF_MGR_EV_AP_DONE_ACS:
+		status = if_mgr_ap_done_acs(vdev, event_data);
+		break;
+	case WLAN_IF_MGR_EV_AP_START_HT40:
+		status = if_mgr_ap_start_ht40(vdev, event_data);
+		break;
+	case WLAN_IF_MGR_EV_AP_STOP_HT40:
+		status = if_mgr_ap_stop_ht40(vdev, event_data);
+		break;
+	case WLAN_IF_MGR_EV_AP_DONE_HT40:
+		status = if_mgr_ap_done_ht40(vdev, event_data);
+		break;
+	case WLAN_IF_MGR_EV_AP_CANCEL_HT40:
+		status = if_mgr_ap_cancel_ht40(vdev, event_data);
+		break;
+	default:
+		status = QDF_STATUS_E_INVAL;
+		ifmgr_err("Invalid event");
+		break;
+	}
+	return status;
+}
+#else
+QDF_STATUS if_mgr_deliver_mbss_event(struct wlan_objmgr_vdev *vdev,
+				     enum wlan_if_mgr_evt event,
+				     struct if_mgr_event_data *event_data)
+{
+	QDF_STATUS status;
+
+	switch (event) {
+	default:
+		status = QDF_STATUS_E_INVAL;
+		ifmgr_err("Invalid event");
+		break;
+	}
+
+	return status;
+}
+#endif
 
 QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev,
 				enum wlan_if_mgr_evt event,
@@ -35,7 +122,8 @@ QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev,
 	if (!psoc)
 		return QDF_STATUS_E_FAILURE;
 
-	ifmgr_debug("IF MGR event received: %d", event);
+	ifmgr_debug("IF MGR event received: %s(%d)",
+		    if_mgr_get_event_str(event), event);
 
 	switch (event) {
 	case WLAN_IF_MGR_EV_CONNECT_START:
@@ -66,9 +154,7 @@ QDF_STATUS if_mgr_deliver_event(struct wlan_objmgr_vdev *vdev,
 		status = if_mgr_validate_candidate(vdev, event_data);
 		break;
 	default:
-		status = QDF_STATUS_E_INVAL;
-		ifmgr_err("Invalid event");
-		break;
+		status = if_mgr_deliver_mbss_event(vdev, event, event_data);
 	}
 
 	return status;