1 /*
2  * Copyright (c) 2017-2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /*
20  * DOC: contains core scan function definitions
21  */
22 #include <wlan_scan_ucfg_api.h>
23 #include <wlan_scan_utils_api.h>
24 #include "wlan_scan_main.h"
25 
wlan_scan_psoc_created_notification(struct wlan_objmgr_psoc * psoc,void * arg_list)26 QDF_STATUS wlan_scan_psoc_created_notification(struct wlan_objmgr_psoc *psoc,
27 						void *arg_list)
28 {
29 	struct wlan_scan_obj *scan_obj;
30 	QDF_STATUS status = QDF_STATUS_SUCCESS;
31 
32 	scan_obj = qdf_mem_malloc_atomic(sizeof(struct wlan_scan_obj));
33 	if (!scan_obj) {
34 		scm_err("Failed to allocate memory");
35 		return QDF_STATUS_E_NOMEM;
36 	}
37 
38 	/* Attach scan private date to psoc */
39 	status = wlan_objmgr_psoc_component_obj_attach(psoc,
40 		WLAN_UMAC_COMP_SCAN, (void *)scan_obj,
41 		QDF_STATUS_SUCCESS);
42 	if (QDF_IS_STATUS_ERROR(status))
43 		scm_err("Failed to attach psoc scan component");
44 	else
45 		scm_debug("Scan object attach to psoc successful");
46 
47 	return status;
48 }
49 
wlan_scan_psoc_destroyed_notification(struct wlan_objmgr_psoc * psoc,void * arg_list)50 QDF_STATUS wlan_scan_psoc_destroyed_notification(
51 				struct wlan_objmgr_psoc *psoc,
52 				void *arg_list)
53 {
54 	void *scan_obj = NULL;
55 	QDF_STATUS status = QDF_STATUS_SUCCESS;
56 
57 	scan_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc,
58 			WLAN_UMAC_COMP_SCAN);
59 
60 	if (!scan_obj) {
61 		scm_err("Failed to detach scan in psoc ctx");
62 		return QDF_STATUS_E_FAILURE;
63 	}
64 
65 	status = wlan_objmgr_psoc_component_obj_detach(psoc,
66 		WLAN_UMAC_COMP_SCAN, scan_obj);
67 	if (QDF_IS_STATUS_ERROR(status))
68 		scm_err("Failed to detach psoc scan component");
69 
70 	qdf_mem_free(scan_obj);
71 
72 	return status;
73 }
74 
wlan_scan_vdev_created_notification(struct wlan_objmgr_vdev * vdev,void * arg_list)75 QDF_STATUS wlan_scan_vdev_created_notification(struct wlan_objmgr_vdev *vdev,
76 	void *arg_list)
77 {
78 	struct scan_vdev_obj *scan_vdev_obj;
79 	QDF_STATUS status = QDF_STATUS_SUCCESS;
80 
81 	scan_vdev_obj = qdf_mem_malloc_atomic(sizeof(struct scan_vdev_obj));
82 	if (!scan_vdev_obj) {
83 		scm_err("Failed to allocate memory");
84 		return QDF_STATUS_E_NOMEM;
85 	}
86 
87 	/* Attach scan private date to vdev */
88 	status = wlan_objmgr_vdev_component_obj_attach(vdev,
89 		WLAN_UMAC_COMP_SCAN, (void *)scan_vdev_obj,
90 		QDF_STATUS_SUCCESS);
91 	if (QDF_IS_STATUS_ERROR(status)) {
92 		scm_err("Failed to attach vdev scan component");
93 		qdf_mem_free(scan_vdev_obj);
94 	} else {
95 		scm_debug("vdev scan object attach successful");
96 	}
97 
98 	return status;
99 }
100 
wlan_scan_vdev_destroyed_notification(struct wlan_objmgr_vdev * vdev,void * arg_list)101 QDF_STATUS wlan_scan_vdev_destroyed_notification(
102 	struct wlan_objmgr_vdev *vdev,
103 	void *arg_list)
104 {
105 	void *scan_vdev_obj = NULL;
106 	QDF_STATUS status = QDF_STATUS_SUCCESS;
107 
108 	scan_vdev_obj = wlan_objmgr_vdev_get_comp_private_obj(vdev,
109 			WLAN_UMAC_COMP_SCAN);
110 
111 	if (!scan_vdev_obj) {
112 		scm_err("Failed to detach scan in vdev ctx");
113 		return QDF_STATUS_E_FAILURE;
114 	}
115 
116 	status = wlan_objmgr_vdev_component_obj_detach(vdev,
117 		WLAN_UMAC_COMP_SCAN, scan_vdev_obj);
118 	if (QDF_IS_STATUS_ERROR(status))
119 		scm_err("Failed to detach vdev scan component");
120 
121 	qdf_mem_free(scan_vdev_obj);
122 
123 	return status;
124 }
125