Browse Source

qcacld-3.0: Register TWT callbacks statically

TWT HDD callbacks are registered dynamically when each TWT
command is received from userspace and unregistered while
sending response. This design was in place considering the
existing TWT commands are synchronous and multiple back to
back TWT commands will not be received. But now the TWT
commands from userspace can be received asynchronously.

So register the TWT callbacks statically during start modules in
wlan_hdd_twt_init().

Change-Id: I7dd9333c330a90fca421a2cc2574b2db76536e96
CRs-Fixed: 2830644
Pragaspathi Thilagaraj 4 years ago
parent
commit
52adb4d599
4 changed files with 63 additions and 101 deletions
  1. 16 22
      core/hdd/src/wlan_hdd_twt.c
  2. 6 23
      core/sme/inc/sme_api.h
  3. 23 0
      core/sme/inc/sme_internal.h
  4. 18 56
      core/sme/src/common/sme_api.c

+ 16 - 22
core/hdd/src/wlan_hdd_twt.c

@@ -2563,29 +2563,26 @@ void hdd_send_twt_role_disable_cmd(struct hdd_context *hdd_ctx,
 void wlan_hdd_twt_init(struct hdd_context *hdd_ctx)
 {
 	QDF_STATUS status;
+	struct twt_callbacks twt_cb;
 
 	hdd_ctx->twt_state = TWT_INIT;
 
 	sme_init_twt_complete_cb(hdd_ctx->mac_handle);
-	status = sme_register_twt_enable_complete_cb(hdd_ctx->mac_handle,
-						     hdd_twt_enable_comp_cb);
-	if (!QDF_IS_STATUS_SUCCESS(status)) {
+	twt_cb.twt_enable_cb = hdd_twt_enable_comp_cb;
+	twt_cb.twt_disable_cb = hdd_twt_disable_comp_cb;
+	twt_cb.twt_add_dialog_cb = hdd_twt_add_dialog_comp_cb;
+	twt_cb.twt_del_dialog_cb = hdd_twt_del_dialog_comp_cb;
+	twt_cb.twt_pause_dialog_cb = hdd_twt_pause_dialog_comp_cb;
+	twt_cb.twt_resume_dialog_cb = hdd_twt_resume_dialog_comp_cb;
+	status = sme_register_twt_callbacks(hdd_ctx->mac_handle, &twt_cb);
+	if (QDF_IS_STATUS_ERROR(status)) {
 		hdd_err("Register twt enable complete failed");
 		return;
 	}
 
-	status = sme_register_twt_disable_complete_cb(hdd_ctx->mac_handle,
-						      hdd_twt_disable_comp_cb);
-	if (!QDF_IS_STATUS_SUCCESS(status)) {
-		sme_deregister_twt_enable_complete_cb(hdd_ctx->mac_handle);
-		hdd_err("Register twt disable complete failed");
-		return;
-	}
-
 	status = qdf_event_create(&hdd_ctx->twt_disable_comp_evt);
-	if (!QDF_IS_STATUS_SUCCESS(status)) {
-		sme_deregister_twt_disable_complete_cb(hdd_ctx->mac_handle);
-		sme_deregister_twt_enable_complete_cb(hdd_ctx->mac_handle);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		sme_deregister_twt_callbacks(hdd_ctx->mac_handle);
 		hdd_err("twt_disable_comp_evt init failed");
 		return;
 	}
@@ -2597,16 +2594,13 @@ void wlan_hdd_twt_deinit(struct hdd_context *hdd_ctx)
 {
 	QDF_STATUS status;
 
-	status  = sme_deregister_twt_disable_complete_cb(hdd_ctx->mac_handle);
+	status = qdf_event_destroy(&hdd_ctx->twt_disable_comp_evt);
+	if (QDF_IS_STATUS_ERROR(status))
+		hdd_err("Failed to destroy twt_disable_comp_evt");
+
+	status  = sme_deregister_twt_callbacks(hdd_ctx->mac_handle);
 	if (!QDF_IS_STATUS_SUCCESS(status))
 		hdd_err("De-register of twt disable cb failed: %d", status);
-	status  = sme_deregister_twt_enable_complete_cb(hdd_ctx->mac_handle);
-	if (!QDF_IS_STATUS_SUCCESS(status))
-		hdd_err("De-register of twt enable cb failed: %d", status);
-
-	if (!QDF_IS_STATUS_SUCCESS(qdf_event_destroy(
-				   &hdd_ctx->twt_disable_comp_evt)))
-		hdd_err("Failed to destroy twt_disable_comp_evt");
 
 	hdd_ctx->twt_state = TWT_CLOSED;
 }

+ 6 - 23
core/sme/inc/sme_api.h

@@ -3706,24 +3706,14 @@ QDF_STATUS sme_test_config_twt_setup(struct wmi_twt_add_dialog_param *params);
 QDF_STATUS sme_init_twt_complete_cb(mac_handle_t mac_handle);
 
 /**
- * sme_register_twt_enable_complete_cb() - TWT enable registrar
+ * sme_register_twt_callbacks() - TWT enable registrar
  * @mac_handle: MAC handle
- * @twt_enable_cb: Function callback to handle enable event
+ * @twt_cb: TWT callbacks
  *
  * Return: QDF Status
  */
-QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
-					       twt_enable_cb twt_enable_cb);
-
-/**
- * sme_register_twt_disable_complete_cb() - TWT disable registrar
- * @mac_handle: MAC handle
- * @twt_disable_cb: Function callback to handle disable event
- *
- * Return: QDF Status
- */
-QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
-						twt_disable_cb twt_disable_cb);
+QDF_STATUS sme_register_twt_callbacks(mac_handle_t mac_handle,
+				      struct twt_callbacks *twt_cb);
 
 /**
  * sme_add_dialog_cmd() - Register callback and send TWT add dialog
@@ -3805,20 +3795,13 @@ sme_resume_dialog_cmd(mac_handle_t mac_handle,
 		      void *context);
 
 /**
- * sme_deregister_twt_enable_complete_cb() - TWT enable deregistrar
+ * sme_deregister_twt_callbacks() - TWT enable deregistrar
  * @mac_handle: Opaque handle to the global MAC context
  *
  * Return: QDF Status
  */
-QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle);
+QDF_STATUS sme_deregister_twt_callbacks(mac_handle_t mac_handle);
 
-/**
- * sme_deregister_twt_disable_complete_cb() - TWT disable deregistrar
- * @mac_handle: Opaque handle to the global MAC context
- *
- * Return: QDF Status
- */
-QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle);
 #else
 
 static inline

+ 23 - 0
core/sme/inc/sme_internal.h

@@ -206,6 +206,29 @@ void (*twt_nudge_dialog_cb)(void *context,
 typedef
 void (*twt_resume_dialog_cb)(void *context,
 			     struct wmi_twt_resume_dialog_complete_event_param *params);
+
+/**
+ * struct twt_callbacks  - TWT response callback pointers
+ * @twt_enable_cb: TWT enable completion callback
+ * @twt_disable_cb: TWT disable completion callback
+ * @twt_add_dialog_cb: TWT add dialog completion callback
+ * @twt_del_dialog_cb: TWT delete dialog completion callback
+ * @twt_pause_dialog_cb: TWT pause dialog completion callback
+ * @twt_resume_dialog_cb: TWT resume dialog completion callback
+ */
+struct twt_callbacks {
+	void (*twt_enable_cb)(hdd_handle_t hdd_handle,
+			      struct wmi_twt_enable_complete_event_param *params);
+	void (*twt_disable_cb)(hdd_handle_t hdd_handle);
+	void (*twt_add_dialog_cb)(hdd_handle_t hdd_handle,
+				  struct twt_add_dialog_complete_event *add_dialog_event);
+	void (*twt_del_dialog_cb)(void *context,
+				  struct wmi_twt_del_dialog_complete_event_param *params);
+	void (*twt_pause_dialog_cb)(void *context,
+				    struct wmi_twt_pause_dialog_complete_event_param *params);
+	void (*twt_resume_dialog_cb)(void *context,
+				     struct wmi_twt_resume_dialog_complete_event_param *params);
+};
 #endif
 
 #ifdef FEATURE_WLAN_APF

+ 18 - 56
core/sme/src/common/sme_api.c

@@ -2094,7 +2094,6 @@ sme_process_twt_add_dialog_event(struct mac_context *mac,
 	twt_add_dialog_cb callback;
 
 	callback = mac->sme.twt_add_dialog_cb;
-	mac->sme.twt_add_dialog_cb = NULL;
 	if (callback)
 		callback(mac->hdd_handle, add_dialog_event);
 }
@@ -2138,7 +2137,6 @@ sme_process_twt_pause_dialog_event(struct mac_context *mac,
 
 	callback = mac->sme.twt_pause_dialog_cb;
 	context = mac->sme.twt_pause_dialog_context;
-	mac->sme.twt_pause_dialog_cb = NULL;
 	if (callback)
 		callback(context, param);
 }
@@ -2182,7 +2180,6 @@ sme_process_twt_resume_dialog_event(struct mac_context *mac,
 
 	callback = mac->sme.twt_resume_dialog_cb;
 	context = mac->sme.twt_resume_dialog_context;
-	mac->sme.twt_resume_dialog_cb = NULL;
 	if (callback)
 		callback(context, param);
 }
@@ -14369,46 +14366,39 @@ QDF_STATUS sme_init_twt_complete_cb(mac_handle_t mac_handle)
 	return status;
 }
 
-QDF_STATUS sme_register_twt_enable_complete_cb(mac_handle_t mac_handle,
-					       twt_enable_cb twt_enable_cb)
+QDF_STATUS sme_register_twt_callbacks(mac_handle_t mac_handle,
+				      struct twt_callbacks *twt_cb)
 {
 	QDF_STATUS status;
 	struct mac_context *mac = MAC_CONTEXT(mac_handle);
 
 	status = sme_acquire_global_lock(&mac->sme);
 	if (QDF_IS_STATUS_SUCCESS(status)) {
-		mac->sme.twt_enable_cb = twt_enable_cb;
+		mac->sme.twt_enable_cb = twt_cb->twt_enable_cb;
+		mac->sme.twt_add_dialog_cb = twt_cb->twt_add_dialog_cb;
+		mac->sme.twt_del_dialog_cb = twt_cb->twt_del_dialog_cb;
+		mac->sme.twt_pause_dialog_cb = twt_cb->twt_pause_dialog_cb;
+		mac->sme.twt_resume_dialog_cb = twt_cb->twt_resume_dialog_cb;
+		mac->sme.twt_disable_cb = twt_cb->twt_disable_cb;
 		sme_release_global_lock(&mac->sme);
-		sme_debug("TWT: enable callback set");
+		sme_debug("TWT: callbacks registered");
 	}
 
 	return status;
 }
 
-QDF_STATUS sme_register_twt_disable_complete_cb(mac_handle_t mac_handle,
-						twt_disable_cb twt_disable_cb)
+QDF_STATUS sme_deregister_twt_callbacks(mac_handle_t mac_handle)
 {
-	QDF_STATUS status;
-	struct mac_context *mac = MAC_CONTEXT(mac_handle);
-
-	status = sme_acquire_global_lock(&mac->sme);
-	if (QDF_IS_STATUS_SUCCESS(status)) {
-		mac->sme.twt_disable_cb = twt_disable_cb;
-		sme_release_global_lock(&mac->sme);
-		sme_debug("TWT: disable callback set");
-	}
+	struct twt_callbacks twt_cb;
 
-	return status;
-}
+	twt_cb.twt_enable_cb = NULL;
+	twt_cb.twt_add_dialog_cb = NULL;
+	twt_cb.twt_del_dialog_cb = NULL;
+	twt_cb.twt_pause_dialog_cb = NULL;
+	twt_cb.twt_resume_dialog_cb = NULL;
+	twt_cb.twt_disable_cb = NULL;
 
-QDF_STATUS sme_deregister_twt_enable_complete_cb(mac_handle_t mac_handle)
-{
-	return sme_register_twt_enable_complete_cb(mac_handle, NULL);
-}
-
-QDF_STATUS sme_deregister_twt_disable_complete_cb(mac_handle_t mac_handle)
-{
-	return sme_register_twt_disable_complete_cb(mac_handle, NULL);
+	return sme_register_twt_callbacks(mac_handle, &twt_cb);
 }
 
 QDF_STATUS sme_add_dialog_cmd(mac_handle_t mac_handle,
@@ -14440,13 +14430,6 @@ QDF_STATUS sme_add_dialog_cmd(mac_handle_t mac_handle,
 		return status;
 	}
 
-	if (mac->sme.twt_add_dialog_cb) {
-		sme_release_global_lock(&mac->sme);
-		qdf_mem_free(cmd_params);
-		sme_err_rl("TWT: Command in progress - STATUS E_BUSY");
-		return QDF_STATUS_E_BUSY;
-	}
-
 	/* Serialize the req through MC thread */
 	mac->sme.twt_add_dialog_cb = twt_add_dialog_cb;
 	twt_msg.bodyptr = cmd_params;
@@ -14497,13 +14480,6 @@ QDF_STATUS sme_del_dialog_cmd(mac_handle_t mac_handle,
 		return status;
 	}
 
-	if (mac->sme.twt_del_dialog_cb) {
-		sme_release_global_lock(&mac->sme);
-		qdf_mem_free(cmd_params);
-		sme_err_rl("TWT: Command in progress - STATUS E_BUSY");
-		return QDF_STATUS_E_BUSY;
-	}
-
 	/* Serialize the req through MC thread */
 	mac->sme.twt_del_dialog_cb = del_dialog_cb;
 	mac->sme.twt_del_dialog_context = context;
@@ -14556,13 +14532,6 @@ sme_pause_dialog_cmd(mac_handle_t mac_handle,
 		return status;
 	}
 
-	if (mac->sme.twt_pause_dialog_cb) {
-		sme_release_global_lock(&mac->sme);
-		qdf_mem_free(cmd_params);
-		sme_err_rl("TWT: Command in progress - STATUS E_BUSY");
-		return QDF_STATUS_E_BUSY;
-	}
-
 	/* Serialize the req through MC thread */
 	mac->sme.twt_pause_dialog_cb = pause_dialog_cb;
 	mac->sme.twt_pause_dialog_context = context;
@@ -14676,13 +14645,6 @@ sme_resume_dialog_cmd(mac_handle_t mac_handle,
 		return status;
 	}
 
-	if (mac->sme.twt_resume_dialog_cb) {
-		sme_release_global_lock(&mac->sme);
-		qdf_mem_free(cmd_params);
-		sme_err_rl("TWT: Command in progress - STATUS E_BUSY");
-		return QDF_STATUS_E_BUSY;
-	}
-
 	/* Serialize the req through MC thread */
 	mac->sme.twt_resume_dialog_cb = resume_dialog_cb;
 	mac->sme.twt_resume_dialog_context = context;