1 /*
2 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
3 * Copyright (c) 2021, 2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18 /**
19 * DOC: This file contains packet capture south bound interface definitions
20 */
21
22 #include "wlan_pkt_capture_tgt_api.h"
23
24 QDF_STATUS
tgt_pkt_capture_register_ev_handler(struct wlan_objmgr_vdev * vdev)25 tgt_pkt_capture_register_ev_handler(struct wlan_objmgr_vdev *vdev)
26 {
27 QDF_STATUS status = QDF_STATUS_E_FAILURE;
28 struct pkt_psoc_priv *psoc_priv;
29 struct wlan_pkt_capture_rx_ops *rx_ops;
30 struct wlan_objmgr_psoc *psoc;
31
32 psoc = wlan_vdev_get_psoc(vdev);
33 if (!psoc) {
34 pkt_capture_err("psoc is NULL");
35 return status;
36 }
37
38 psoc_priv = pkt_capture_psoc_get_priv(psoc);
39 if (!psoc_priv) {
40 pkt_capture_err("psoc_priv is NULL");
41 return status;
42 }
43
44 rx_ops = &psoc_priv->rx_ops;
45
46 if (!rx_ops->pkt_capture_register_ev_handlers)
47 return status;
48
49 status = rx_ops->pkt_capture_register_ev_handlers(psoc);
50 if (QDF_IS_STATUS_ERROR(status))
51 pkt_capture_err("Unable to register mgmt offload handler");
52
53 status = rx_ops->pkt_capture_register_smart_monitor_event(psoc);
54 if (QDF_IS_STATUS_ERROR(status))
55 pkt_capture_err("Unable to register smart monitor handler");
56
57 return status;
58 }
59
60 QDF_STATUS
tgt_pkt_capture_unregister_ev_handler(struct wlan_objmgr_vdev * vdev)61 tgt_pkt_capture_unregister_ev_handler(struct wlan_objmgr_vdev *vdev)
62 {
63 QDF_STATUS status = QDF_STATUS_E_FAILURE;
64 struct pkt_psoc_priv *psoc_priv;
65 struct wlan_pkt_capture_rx_ops *rx_ops;
66 struct wlan_objmgr_psoc *psoc;
67
68 psoc = wlan_vdev_get_psoc(vdev);
69 if (!psoc) {
70 pkt_capture_err("psoc is NULL");
71 return status;
72 }
73
74 psoc_priv = pkt_capture_psoc_get_priv(psoc);
75 if (!psoc_priv) {
76 pkt_capture_err("psoc_priv is NULL");
77 return status;
78 }
79
80 rx_ops = &psoc_priv->rx_ops;
81
82 if (!rx_ops->pkt_capture_unregister_ev_handlers)
83 return status;
84
85 status = rx_ops->pkt_capture_unregister_ev_handlers(psoc);
86 if (QDF_IS_STATUS_ERROR(status))
87 pkt_capture_err("Unable to register mgmt offload handler");
88
89 status = rx_ops->pkt_capture_unregister_smart_monitor_event(psoc);
90 if (QDF_IS_STATUS_ERROR(status))
91 pkt_capture_err("Unable to unregister smart monitor handler");
92
93 return status;
94 }
95
96 QDF_STATUS
tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev * vdev,enum pkt_capture_mode mode)97 tgt_pkt_capture_send_mode(struct wlan_objmgr_vdev *vdev,
98 enum pkt_capture_mode mode)
99 {
100 QDF_STATUS status = QDF_STATUS_E_FAILURE;
101 struct pkt_psoc_priv *psoc_priv;
102 struct wlan_pkt_capture_tx_ops *tx_ops;
103 struct wlan_objmgr_psoc *psoc;
104
105 psoc = wlan_vdev_get_psoc(vdev);
106 if (!psoc) {
107 pkt_capture_err("psoc is NULL");
108 return status;
109 }
110
111 psoc_priv = pkt_capture_psoc_get_priv(psoc);
112 if (!psoc_priv) {
113 pkt_capture_err("psoc_priv is NULL");
114 return status;
115 }
116
117 tx_ops = &psoc_priv->tx_ops;
118
119 if (!tx_ops->pkt_capture_send_mode)
120 return status;
121
122 status = tx_ops->pkt_capture_send_mode(psoc, wlan_vdev_get_id(vdev),
123 mode);
124 if (QDF_IS_STATUS_ERROR(status))
125 pkt_capture_err("Unable to send packet capture mode to fw");
126
127 return status;
128 }
129
130 QDF_STATUS
tgt_pkt_capture_send_beacon_interval(struct wlan_objmgr_vdev * vdev,uint32_t nth_value)131 tgt_pkt_capture_send_beacon_interval(struct wlan_objmgr_vdev *vdev,
132 uint32_t nth_value)
133 {
134 QDF_STATUS status = QDF_STATUS_E_FAILURE;
135 struct pkt_psoc_priv *psoc_priv;
136 struct wlan_pkt_capture_tx_ops *tx_ops;
137 struct wlan_objmgr_psoc *psoc;
138
139 psoc = wlan_vdev_get_psoc(vdev);
140 if (!psoc) {
141 pkt_capture_err("psoc is NULL");
142 return status;
143 }
144
145 psoc_priv = pkt_capture_psoc_get_priv(psoc);
146 if (!psoc_priv) {
147 pkt_capture_err("psoc_priv is NULL");
148 return status;
149 }
150
151 tx_ops = &psoc_priv->tx_ops;
152
153 if (!tx_ops->pkt_capture_send_beacon_interval)
154 return status;
155
156 status = tx_ops->pkt_capture_send_beacon_interval
157 (psoc,
158 wlan_vdev_get_id(vdev),
159 nth_value);
160 if (QDF_IS_STATUS_ERROR(status))
161 pkt_capture_err("Unable to send beacon interval to fw");
162
163 return status;
164 }
165
166 QDF_STATUS
tgt_pkt_capture_send_config(struct wlan_objmgr_vdev * vdev,enum pkt_capture_config config)167 tgt_pkt_capture_send_config(struct wlan_objmgr_vdev *vdev,
168 enum pkt_capture_config config)
169 {
170 QDF_STATUS status = QDF_STATUS_E_FAILURE;
171 struct pkt_psoc_priv *psoc_priv;
172 struct wlan_pkt_capture_tx_ops *tx_ops;
173 struct wlan_objmgr_psoc *psoc;
174
175 psoc = wlan_vdev_get_psoc(vdev);
176 if (!psoc) {
177 pkt_capture_err("psoc is NULL");
178 return status;
179 }
180
181 psoc_priv = pkt_capture_psoc_get_priv(psoc);
182 if (!psoc_priv) {
183 pkt_capture_err("psoc_priv is NULL");
184 return status;
185 }
186
187 tx_ops = &psoc_priv->tx_ops;
188
189 if (!tx_ops->pkt_capture_send_config)
190 return status;
191
192 status = tx_ops->pkt_capture_send_config(psoc, wlan_vdev_get_id(vdev),
193 config);
194 if (QDF_IS_STATUS_ERROR(status))
195 pkt_capture_err("Unable to send packet capture config to fw");
196
197 return status;
198 }
199
200 #ifdef WLAN_FEATURE_PKT_CAPTURE_V2
201 QDF_STATUS
tgt_pkt_capture_smu_event(struct wlan_objmgr_psoc * psoc,struct smu_event_params * param)202 tgt_pkt_capture_smu_event(struct wlan_objmgr_psoc *psoc,
203 struct smu_event_params *param)
204 {
205 struct pkt_capture_vdev_priv *vdev_priv;
206 struct wlan_objmgr_vdev *vdev;
207 uint8_t vdev_id;
208
209 vdev_id = param->vdev_id;
210
211 vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
212 WLAN_PKT_CAPTURE_ID);
213 if (!vdev) {
214 pkt_capture_err("failed to get vdev");
215 return QDF_STATUS_E_FAILURE;
216 }
217
218 vdev_priv = pkt_capture_vdev_get_priv(vdev);
219 if (!vdev_priv) {
220 pkt_capture_err("vdev priv is NULL");
221 pkt_capture_vdev_put_ref(vdev);
222 return QDF_STATUS_E_FAILURE;
223 }
224
225 vdev_priv->rx_vht_sgi = param->rx_vht_sgi;
226
227 pkt_capture_vdev_put_ref(vdev);
228
229 return QDF_STATUS_SUCCESS;
230 }
231 #endif
232