xref: /wlan-driver/qcacld-3.0/components/pmo/core/src/wlan_pmo_hw_filter.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1 /*
2  * Copyright (c) 2017-2020 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: Implements arp offload feature API's
21  */
22 
23 #include "qdf_lock.h"
24 #include "wlan_pmo_hw_filter.h"
25 #include "wlan_pmo_tgt_api.h"
26 #include "wlan_pmo_main.h"
27 #include "wlan_pmo_obj_mgmt_public_struct.h"
28 
pmo_core_enable_hw_filter_in_fwr(struct wlan_objmgr_vdev * vdev)29 QDF_STATUS pmo_core_enable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev)
30 {
31 	QDF_STATUS status;
32 	struct pmo_psoc_priv_obj *psoc_priv;
33 	enum pmo_hw_filter_mode mode_bitmap;
34 	struct pmo_hw_filter_params req = {0};
35 
36 	pmo_enter();
37 
38 	status = pmo_vdev_get_ref(vdev);
39 	if (QDF_IS_STATUS_ERROR(status))
40 		goto exit_with_status;
41 
42 	if (wlan_vdev_is_up(vdev) != QDF_STATUS_SUCCESS) {
43 		status = QDF_STATUS_E_NOSUPPORT;
44 		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
45 		goto exit_with_status;
46 	}
47 
48 	psoc_priv = pmo_vdev_get_psoc_priv(vdev);
49 	qdf_spin_lock_bh(&psoc_priv->lock);
50 	mode_bitmap = psoc_priv->psoc_cfg.hw_filter_mode_bitmap;
51 	qdf_spin_unlock_bh(&psoc_priv->lock);
52 
53 	req.vdev_id = pmo_vdev_get_id(vdev);
54 	req.mode_bitmap = psoc_priv->psoc_cfg.hw_filter_mode_bitmap;
55 	req.enable = true;
56 	status = pmo_tgt_conf_hw_filter(pmo_vdev_get_psoc(vdev), &req);
57 
58 	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
59 
60 exit_with_status:
61 	pmo_exit();
62 
63 	return status;
64 }
65 
pmo_core_disable_hw_filter_in_fwr(struct wlan_objmgr_vdev * vdev)66 QDF_STATUS pmo_core_disable_hw_filter_in_fwr(struct wlan_objmgr_vdev *vdev)
67 {
68 	QDF_STATUS status;
69 	struct pmo_psoc_priv_obj *psoc_priv;
70 	enum pmo_hw_filter_mode mode_bitmap;
71 	struct pmo_hw_filter_params req = {0};
72 
73 	pmo_enter();
74 
75 	status = pmo_vdev_get_ref(vdev);
76 	if (QDF_IS_STATUS_ERROR(status))
77 		goto exit_with_status;
78 
79 	if (wlan_vdev_is_up(vdev) != QDF_STATUS_SUCCESS) {
80 		status = QDF_STATUS_E_NOSUPPORT;
81 		wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
82 		goto exit_with_status;
83 	}
84 
85 	psoc_priv = pmo_vdev_get_psoc_priv(vdev);
86 	qdf_spin_lock_bh(&psoc_priv->lock);
87 	mode_bitmap = psoc_priv->psoc_cfg.hw_filter_mode_bitmap;
88 	qdf_spin_unlock_bh(&psoc_priv->lock);
89 
90 	req.vdev_id = pmo_vdev_get_id(vdev);
91 	req.mode_bitmap = mode_bitmap;
92 	req.enable = false;
93 	status = pmo_tgt_conf_hw_filter(pmo_vdev_get_psoc(vdev), &req);
94 
95 	wlan_objmgr_vdev_release_ref(vdev, WLAN_PMO_ID);
96 
97 exit_with_status:
98 	pmo_exit();
99 
100 	return status;
101 }
102