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