Browse Source

qcacmn: TWT obj mgr initialization

Initialize TWT object manager.

Change-Id: Ic38fe24d4d6ada0597dabbc2df70d9b32737014a
CRs-Fixed: 3085360
Srinivas Girigowda 3 years ago
parent
commit
415b9134bf
2 changed files with 266 additions and 6 deletions
  1. 137 5
      umac/twt/core/src/wlan_twt_objmgr.c
  2. 129 1
      umac/twt/dispatcher/src/wlan_twt_api.c

+ 137 - 5
umac/twt/core/src/wlan_twt_objmgr.c

@@ -27,36 +27,168 @@
 QDF_STATUS
 wlan_twt_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc, void *arg)
 {
-	return QDF_STATUS_SUCCESS;
+	QDF_STATUS status;
+	struct twt_psoc_priv_obj *twt_psoc_obj;
+
+	twt_psoc_obj = qdf_mem_malloc(sizeof(*twt_psoc_obj));
+	if (!twt_psoc_obj)
+		return QDF_STATUS_E_NOMEM;
+
+	twt_psoc_obj->enable_context.context = NULL;
+	twt_psoc_obj->disable_context.context = NULL;
+
+	status = wlan_objmgr_psoc_component_obj_attach(psoc,
+						       WLAN_UMAC_COMP_TWT,
+						       (void *)twt_psoc_obj,
+						       QDF_STATUS_SUCCESS);
+
+	if (QDF_IS_STATUS_ERROR(status)) {
+		qdf_mem_free(twt_psoc_obj);
+		twt_err("Failed to attach twt psoc priv object");
+		return status;
+	}
+
+	twt_debug("twt psoc priv obj attach successful");
+	return status;
 }
 
 QDF_STATUS
 wlan_twt_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc, void *arg)
 {
-	return QDF_STATUS_SUCCESS;
+	QDF_STATUS status;
+	struct twt_psoc_priv_obj *twt_psoc_obj;
+
+	twt_psoc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
+						WLAN_UMAC_COMP_TWT);
+	if (!twt_psoc_obj) {
+		twt_err("Failed to get twt obj in psoc");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	status = wlan_objmgr_psoc_component_obj_detach(psoc,
+						       WLAN_UMAC_COMP_TWT,
+						       twt_psoc_obj);
+
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_err("Failed to detach twt psoc priv object");
+
+	qdf_mem_free(twt_psoc_obj);
+
+	return status;
 }
 
 QDF_STATUS
 wlan_twt_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev, void *arg)
 {
-	return QDF_STATUS_SUCCESS;
+	QDF_STATUS status;
+	struct twt_vdev_priv_obj *twt_vdev_obj;
+
+	twt_vdev_obj = qdf_mem_malloc(sizeof(*twt_vdev_obj));
+	if (!twt_vdev_obj)
+		return QDF_STATUS_E_NOMEM;
+
+	twt_vdev_obj->twt_wait_for_notify = false;
+
+	status = wlan_objmgr_vdev_component_obj_attach(vdev,
+						       WLAN_UMAC_COMP_TWT,
+						       twt_vdev_obj,
+						       QDF_STATUS_SUCCESS);
+
+	if (QDF_IS_STATUS_ERROR(status)) {
+		qdf_mem_free(twt_vdev_obj);
+		twt_err("Failed to attach twt vdev priv object");
+		return status;
+	}
+
+	twt_debug("twt vdev priv obj attach successful");
+	return status;
 }
 
 QDF_STATUS
 wlan_twt_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev, void *arg)
 {
-	return QDF_STATUS_SUCCESS;
+	QDF_STATUS status;
+	struct twt_vdev_priv_obj *twt_vdev_obj;
+
+	twt_vdev_obj = wlan_objmgr_vdev_get_comp_private_obj(vdev,
+							    WLAN_UMAC_COMP_TWT);
+	if (!twt_vdev_obj) {
+		twt_err("Failed to get twt obj in vdev");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	status = wlan_objmgr_vdev_component_obj_detach(vdev,
+						       WLAN_UMAC_COMP_TWT,
+						       twt_vdev_obj);
+
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_err("Failed to detach twt vdev priv object");
+
+	qdf_mem_free(twt_vdev_obj);
+
+	return status;
 }
 
 QDF_STATUS
 wlan_twt_peer_obj_create_handler(struct wlan_objmgr_peer *peer, void *arg)
 {
-	return QDF_STATUS_SUCCESS;
+	struct twt_peer_priv_obj *twt_peer_obj = NULL;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+
+	if (!peer) {
+		twt_err("peer is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	twt_peer_obj = qdf_mem_malloc(sizeof(*twt_peer_obj));
+	if (!twt_peer_obj)
+		return QDF_STATUS_E_NOMEM;
+
+	qdf_mutex_create(&twt_peer_obj->twt_peer_lock);
+
+	status = wlan_objmgr_peer_component_obj_attach(peer,
+						       WLAN_UMAC_COMP_TWT,
+						       twt_peer_obj,
+						       QDF_STATUS_SUCCESS);
+
+	if (QDF_IS_STATUS_ERROR(status)) {
+		qdf_mutex_destroy(&twt_peer_obj->twt_peer_lock);
+		qdf_mem_free(twt_peer_obj);
+		twt_err("peer twt object attach failed");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	twt_debug("twt peer priv obj attach successful");
+	return status;
 }
 
 QDF_STATUS
 wlan_twt_peer_obj_destroy_handler(struct wlan_objmgr_peer *peer, void *arg)
 {
+	struct twt_peer_priv_obj *twt_peer_obj;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+
+	if (!peer) {
+		twt_err("peer is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	twt_peer_obj = wlan_objmgr_peer_get_comp_private_obj(peer,
+						WLAN_UMAC_COMP_TWT);
+	if (!twt_peer_obj) {
+		twt_err("twt_peer_obj is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	qdf_mutex_destroy(&twt_peer_obj->twt_peer_lock);
+
+	status = wlan_objmgr_peer_component_obj_detach(peer, WLAN_UMAC_COMP_TWT,
+						       twt_peer_obj);
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_warn("Failed to detach twt peer priv object");
+
+	qdf_mem_free(twt_peer_obj);
+	twt_debug("peer twt object detached");
 	return QDF_STATUS_SUCCESS;
 }
 

+ 129 - 1
umac/twt/dispatcher/src/wlan_twt_api.c

@@ -77,12 +77,140 @@ wlan_twt_psoc_get_comp_private_obj(struct wlan_objmgr_psoc *psoc)
 
 QDF_STATUS wlan_twt_init(void)
 {
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+
+	status = wlan_objmgr_register_psoc_create_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_psoc_obj_create_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		twt_err("Failed to register psoc create handler");
+		goto wlan_twt_psoc_init_fail1;
+	}
+
+	status = wlan_objmgr_register_psoc_destroy_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_psoc_obj_destroy_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		twt_err("Failed to register psoc destroy handler");
+		goto wlan_twt_psoc_init_fail2;
+	}
+
+	status = wlan_objmgr_register_vdev_create_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_vdev_obj_create_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		twt_err("Failed to register vdev create handler");
+		goto wlan_twt_vdev_init_fail1;
+	}
+
+	status = wlan_objmgr_register_vdev_destroy_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_vdev_obj_destroy_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		twt_err("Failed to register vdev destroy handler");
+		goto wlan_twt_vdev_init_fail2;
+	}
+
+	status = wlan_objmgr_register_peer_create_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_peer_obj_create_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		twt_err("Failed to register peer create handler");
+		goto wlan_twt_peer_init_fail1;
+	}
+
+	status = wlan_objmgr_register_peer_destroy_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_peer_obj_destroy_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		twt_err("Failed to register peer destroy handler");
+		goto wlan_twt_peer_init_fail2;
+	}
+
 	return QDF_STATUS_SUCCESS;
+
+wlan_twt_peer_init_fail2:
+	wlan_objmgr_unregister_peer_create_handler
+		(WLAN_UMAC_COMP_TWT,
+		 wlan_twt_peer_obj_create_handler,
+		 NULL);
+wlan_twt_peer_init_fail1:
+	wlan_objmgr_unregister_vdev_destroy_handler
+		(WLAN_UMAC_COMP_TWT,
+		wlan_twt_vdev_obj_destroy_handler,
+		NULL);
+wlan_twt_vdev_init_fail2:
+	wlan_objmgr_unregister_vdev_create_handler
+		(WLAN_UMAC_COMP_TWT,
+		wlan_twt_vdev_obj_create_handler,
+		NULL);
+wlan_twt_vdev_init_fail1:
+	wlan_objmgr_unregister_psoc_destroy_handler
+		(WLAN_UMAC_COMP_TWT,
+		 wlan_twt_psoc_obj_destroy_handler,
+		 NULL);
+wlan_twt_psoc_init_fail2:
+	wlan_objmgr_unregister_psoc_create_handler
+		(WLAN_UMAC_COMP_TWT,
+		 wlan_twt_psoc_obj_create_handler,
+		 NULL);
+wlan_twt_psoc_init_fail1:
+	return status;
 }
 
 QDF_STATUS wlan_twt_deinit(void)
 {
-	return QDF_STATUS_SUCCESS;
+	QDF_STATUS status = QDF_STATUS_E_FAILURE;
+
+	status = wlan_objmgr_unregister_psoc_create_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_psoc_obj_create_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_err("Failed to unregister psoc create handler");
+
+	status = wlan_objmgr_unregister_psoc_destroy_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_psoc_obj_destroy_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_err("Failed to unregister psoc destroy handler");
+
+	status = wlan_objmgr_unregister_vdev_create_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_vdev_obj_create_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_err("Failed to unregister vdev create handler");
+
+	status = wlan_objmgr_unregister_vdev_destroy_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_vdev_obj_destroy_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_err("Failed to unregister vdev destroy handler");
+
+	status = wlan_objmgr_unregister_peer_create_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_peer_obj_create_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_err("Failed to unregister peer create handler");
+
+	status = wlan_objmgr_unregister_peer_destroy_handler
+				(WLAN_UMAC_COMP_TWT,
+				 wlan_twt_peer_obj_destroy_handler,
+				 NULL);
+	if (QDF_IS_STATUS_ERROR(status))
+		twt_err("Failed to unregister peer destroy handler");
+
+	return status;
 }
 
 QDF_STATUS twt_psoc_enable(struct wlan_objmgr_psoc *psoc)