blob: 21ea246f7c8d7c7dee33999cd636cb99f438787d [file] [log] [blame]
Arun Kumar Khandavallid76b54a2019-08-27 16:39:18 +05301/*
2 * Copyright (c) 2019 The Linux Foundation. All rights reserved.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17/**
18 * DOC: Implements PSOC MLME APIs
19 */
20
21#include <wlan_objmgr_cmn.h>
22#include <wlan_objmgr_global_obj.h>
23#include <wlan_mlme_dbg.h>
24#include <include/wlan_mlme_cmn.h>
25#include <include/wlan_psoc_mlme.h>
26#include <wlan_psoc_mlme_main.h>
27#include <wlan_psoc_mlme_api.h>
28
29static QDF_STATUS mlme_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc,
30 void *arg)
31{
32 struct psoc_mlme_obj *psoc_mlme;
33 QDF_STATUS status = QDF_STATUS_SUCCESS;
34
35 psoc_mlme = qdf_mem_malloc(sizeof(struct psoc_mlme_obj));
36 if (!psoc_mlme) {
37 mlme_err("Failed to allocate PSOS mlme Object");
38 return QDF_STATUS_E_NOMEM;
39 }
40
41 psoc_mlme->psoc = psoc;
42
43 status = mlme_psoc_ops_ext_hdl_create(psoc_mlme);
44 if (QDF_IS_STATUS_ERROR(status)) {
45 mlme_err("Failed to allocate psoc ext handle");
46 goto init_failed;
47 }
48
49 status = wlan_objmgr_psoc_component_obj_attach(psoc,
50 WLAN_UMAC_COMP_MLME,
51 psoc_mlme,
52 QDF_STATUS_SUCCESS);
53 if (QDF_IS_STATUS_ERROR(status)) {
54 mlme_err("Failed to attach psoc_ctx with psoc");
55 goto init_failed;
56 }
57
58 return status;
59init_failed:
60 qdf_mem_free(psoc_mlme);
61
62 return status;
63}
64
65static QDF_STATUS mlme_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc,
66 void *arg)
67{
68 struct psoc_mlme_obj *psoc_mlme;
69
70 psoc_mlme = wlan_objmgr_psoc_get_comp_private_obj(psoc,
71 WLAN_UMAC_COMP_MLME);
72 if (!psoc_mlme) {
73 mlme_err(" PSOC MLME component object is NULL");
74 return QDF_STATUS_E_FAILURE;
75 }
76
77 wlan_objmgr_psoc_component_obj_detach(psoc, WLAN_UMAC_COMP_MLME,
78 psoc_mlme);
79
80 mlme_psoc_ops_ext_hdl_destroy(psoc_mlme);
81
82 qdf_mem_free(psoc_mlme);
83
84 return QDF_STATUS_SUCCESS;
85}
86
87QDF_STATUS wlan_psoc_mlme_init(void)
88{
89 if (wlan_objmgr_register_psoc_create_handler
90 (WLAN_UMAC_COMP_MLME,
91 mlme_psoc_obj_create_handler, NULL)
92 != QDF_STATUS_SUCCESS)
93 return QDF_STATUS_E_FAILURE;
94
95 if (wlan_objmgr_register_psoc_destroy_handler
96 (WLAN_UMAC_COMP_MLME,
97 mlme_psoc_obj_destroy_handler, NULL)
98 != QDF_STATUS_SUCCESS) {
99 if (wlan_objmgr_unregister_psoc_create_handler
100 (WLAN_UMAC_COMP_MLME,
101 mlme_psoc_obj_create_handler, NULL)
102 != QDF_STATUS_SUCCESS)
103 return QDF_STATUS_E_FAILURE;
104
105 return QDF_STATUS_E_FAILURE;
106 }
107
108 return QDF_STATUS_SUCCESS;
109}
110
111QDF_STATUS wlan_psoc_mlme_deinit(void)
112{
113 if (wlan_objmgr_unregister_psoc_create_handler
114 (WLAN_UMAC_COMP_MLME,
115 mlme_psoc_obj_create_handler, NULL)
116 != QDF_STATUS_SUCCESS)
117 return QDF_STATUS_E_FAILURE;
118
119 if (wlan_objmgr_unregister_psoc_destroy_handler
120 (WLAN_UMAC_COMP_MLME,
121 mlme_psoc_obj_destroy_handler, NULL)
122 != QDF_STATUS_SUCCESS)
123 return QDF_STATUS_E_FAILURE;
124
125 return QDF_STATUS_SUCCESS;
126}