1 /*
2 * Copyright (c) 2019 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 /**
21 * DOC: wlan_hdd_debugfs_coex.c
22 *
23 * This file currently supports the following debugfs:
24 * Get the following information coex information
25 * COEX STATE
26 * COEX DPWB STATE
27 * COEX TDM STATE
28 * COEX IDRX STATE
29 * COEX ANTENNA SHARING STATE
30 *
31 * Example to read the COEX STATE logging:
32 * sm6150:/ # cat /sys/kernel/debug/wlan/mws_coex_state
33 */
34
35 #include <wlan_hdd_includes.h>
36 #include <wlan_osif_request_manager.h>
37 #include <wlan_hdd_debugfs_coex.h>
38 #include "wmi_unified.h"
39 #include "wmi_unified_param.h"
40 #include "osif_sync.h"
41
42 #define MWS_DEBUGFS_PERMS (QDF_FILE_USR_READ | \
43 QDF_FILE_GRP_READ | \
44 QDF_FILE_OTH_READ)
45
46 /* wait time for mws coex info in milliseconds */
47 #define WLAN_WAIT_TIME_MWS_COEX_INFO 800
48
49 struct mws_coex_state_priv {
50 struct mws_coex_state coex_state;
51 };
52
53 struct mws_coex_dpwb_state_priv {
54 struct mws_coex_dpwb_state dpwb_state;
55 };
56
57 struct mws_coex_tdm_state_priv {
58 struct mws_coex_tdm_state tdm_state;
59 };
60
61 struct mws_coex_idrx_state_priv {
62 struct mws_coex_idrx_state idrx_state;
63 };
64
65 struct mws_antenna_sharing_info_priv {
66 struct mws_antenna_sharing_info antenna_sharing;
67 };
68
hdd_debugfs_mws_coex_info_cb(void * coex_info_data,void * context,wmi_mws_coex_cmd_id cmd_id)69 static void hdd_debugfs_mws_coex_info_cb(void *coex_info_data, void *context,
70 wmi_mws_coex_cmd_id cmd_id)
71 {
72 struct osif_request *request = NULL;
73 struct mws_coex_state_priv *coex_priv;
74 struct mws_coex_dpwb_state_priv *dpwb_priv;
75 struct mws_coex_tdm_state_priv *tdm_priv;
76 struct mws_coex_idrx_state_priv *idrx_priv;
77 struct mws_antenna_sharing_info_priv *antenna_priv;
78
79 if (!coex_info_data) {
80 hdd_err("data is null");
81 return;
82 }
83
84 request = osif_request_get(context);
85 if (!request) {
86 hdd_err("obsolete request");
87 return;
88 }
89
90 switch (cmd_id) {
91 case WMI_MWS_COEX_STATE:
92 coex_priv = osif_request_priv(request);
93 qdf_mem_copy(&coex_priv->coex_state, coex_info_data,
94 sizeof(struct mws_coex_state));
95 break;
96 case WMI_MWS_COEX_DPWB_STATE:
97 dpwb_priv = osif_request_priv(request);
98 qdf_mem_copy(&dpwb_priv->dpwb_state, coex_info_data,
99 sizeof(struct mws_coex_dpwb_state));
100 break;
101 case WMI_MWS_COEX_TDM_STATE:
102 tdm_priv = osif_request_priv(request);
103 qdf_mem_copy(&tdm_priv->tdm_state, coex_info_data,
104 sizeof(struct mws_coex_tdm_state));
105 break;
106 case WMI_MWS_COEX_IDRX_STATE:
107 idrx_priv = osif_request_priv(request);
108 qdf_mem_copy(&idrx_priv->idrx_state, coex_info_data,
109 sizeof(struct mws_coex_idrx_state));
110 break;
111 case WMI_MWS_COEX_ANTENNA_SHARING_STATE:
112 antenna_priv = osif_request_priv(request);
113 qdf_mem_copy(&antenna_priv->antenna_sharing, coex_info_data,
114 sizeof(struct mws_antenna_sharing_info));
115 break;
116 }
117
118 osif_request_complete(request);
119 osif_request_put(request);
120 }
121
__hdd_debugfs_mws_coex_state_read(struct hdd_context * hdd_ctx,qdf_debugfs_file_t file)122 static QDF_STATUS __hdd_debugfs_mws_coex_state_read(struct hdd_context *hdd_ctx,
123 qdf_debugfs_file_t file)
124 {
125 struct hdd_adapter *adapter;
126 QDF_STATUS status;
127 int rc;
128 struct osif_request *request;
129 struct mws_coex_state *coex_state;
130 struct mws_coex_state_priv *priv;
131 static const struct osif_request_params params = {
132 .priv_size = sizeof(*priv),
133 .timeout_ms = WLAN_WAIT_TIME_MWS_COEX_INFO,
134 };
135 void *cookie;
136
137 adapter = hdd_get_first_valid_adapter(hdd_ctx);
138 if (!adapter) {
139 hdd_err("Failed to get adapter");
140 return QDF_STATUS_E_INVAL;
141 }
142
143 if (!test_bit(DEVICE_IFACE_OPENED, &adapter->event_flags)) {
144 hdd_err("Interface is not enabled");
145 return QDF_STATUS_E_INVAL;
146 }
147
148 if (file->index > 0)
149 return QDF_STATUS_SUCCESS;
150
151 request = osif_request_alloc(¶ms);
152 if (!request) {
153 hdd_err("Request allocation failure");
154 return QDF_STATUS_E_NOMEM;
155 }
156
157 cookie = osif_request_cookie(request);
158
159 status = sme_get_mws_coex_info(hdd_ctx->mac_handle,
160 adapter->deflink->vdev_id,
161 WMI_MWS_COEX_STATE,
162 hdd_debugfs_mws_coex_info_cb, cookie);
163
164 if (QDF_IS_STATUS_ERROR(status)) {
165 rc = qdf_status_to_os_return(status);
166 goto exit;
167 }
168
169 rc = osif_request_wait_for_response(request);
170 if (rc) {
171 qdf_debugfs_printf(file, "Timedout while retrieving MWS coex state");
172 rc = -ETIMEDOUT;
173 goto exit;
174 }
175
176 priv = osif_request_priv(request);
177 coex_state = &priv->coex_state;
178
179 qdf_debugfs_printf(file, "vdev_id = %u\n"
180 "coex_scheme_bitmap = %u\n"
181 "active_conflict_count = %u\n"
182 "potential_conflict_count = %u\n"
183 "chavd_group0_bitmap = %u\n"
184 "chavd_group1_bitmap = %u\n"
185 "chavd_group2_bitmap = %u\n"
186 "chavd_group3_bitmap = %u\n",
187 coex_state->vdev_id,
188 coex_state->coex_scheme_bitmap,
189 coex_state->active_conflict_count,
190 coex_state->potential_conflict_count,
191 coex_state->chavd_group0_bitmap,
192 coex_state->chavd_group1_bitmap,
193 coex_state->chavd_group2_bitmap,
194 coex_state->chavd_group3_bitmap);
195
196 exit:
197 osif_request_put(request);
198 return qdf_status_from_os_return(rc);
199 }
200
hdd_debugfs_mws_coex_state_read(qdf_debugfs_file_t file,void * arg)201 static QDF_STATUS hdd_debugfs_mws_coex_state_read(qdf_debugfs_file_t file,
202 void *arg)
203 {
204 struct osif_psoc_sync *psoc_sync;
205 struct hdd_context *hdd_ctx = arg;
206 int ret;
207 QDF_STATUS status;
208
209 ret = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), &psoc_sync);
210 if (ret)
211 return qdf_status_from_os_return(ret);
212
213 status = __hdd_debugfs_mws_coex_state_read(hdd_ctx, file);
214
215 osif_psoc_sync_op_stop(psoc_sync);
216 return qdf_status_from_os_return(ret);
217 }
218
__hdd_debugfs_mws_coex_dpwb_read(struct hdd_context * hdd_ctx,qdf_debugfs_file_t file)219 static QDF_STATUS __hdd_debugfs_mws_coex_dpwb_read(struct hdd_context *hdd_ctx,
220 qdf_debugfs_file_t file)
221 {
222 struct hdd_adapter *adapter;
223 QDF_STATUS status;
224 int rc;
225 struct osif_request *request;
226 struct mws_coex_dpwb_state *dpwb_state;
227 struct mws_coex_dpwb_state_priv *dpwb_priv;
228 static const struct osif_request_params params = {
229 .priv_size = sizeof(*dpwb_priv),
230 .timeout_ms = WLAN_WAIT_TIME_MWS_COEX_INFO,
231 };
232 void *cookie;
233
234 adapter = hdd_get_first_valid_adapter(hdd_ctx);
235 if (!adapter) {
236 hdd_err("Failed to get adapter");
237 return QDF_STATUS_E_INVAL;
238 }
239
240 if (!test_bit(DEVICE_IFACE_OPENED, &adapter->event_flags)) {
241 hdd_err("Interface is not enabled");
242 return QDF_STATUS_E_INVAL;
243 }
244
245 if (file->index > 0)
246 return QDF_STATUS_SUCCESS;
247
248 request = osif_request_alloc(¶ms);
249 if (!request) {
250 hdd_err("Request allocation failure");
251 return QDF_STATUS_E_NOMEM;
252 }
253
254 cookie = osif_request_cookie(request);
255
256 status = sme_get_mws_coex_info(hdd_ctx->mac_handle,
257 adapter->deflink->vdev_id,
258 WMI_MWS_COEX_DPWB_STATE,
259 hdd_debugfs_mws_coex_info_cb, cookie);
260
261 if (QDF_IS_STATUS_ERROR(status)) {
262 rc = qdf_status_to_os_return(status);
263 goto exit;
264 }
265
266 rc = osif_request_wait_for_response(request);
267 if (rc) {
268 qdf_debugfs_printf(file, "Timedout while retrieving MWS coex dpwb state");
269 rc = -ETIMEDOUT;
270 goto exit;
271 }
272
273 dpwb_priv = osif_request_priv(request);
274 dpwb_state = &dpwb_priv->dpwb_state;
275 qdf_debugfs_printf(file, "vdev_id = %u\n"
276 "current_dpwb_state = %d\n"
277 "pnp1_value = %d\n"
278 "lte_dutycycle = %d\n"
279 "sinr_wlan_on = %d\n"
280 "bler_count = %u\n"
281 "block_count = %u\n"
282 "wlan_rssi_level = %u\n"
283 "wlan_rssi = %d\n"
284 "is_tdm_running = %u\n",
285 dpwb_state->vdev_id,
286 dpwb_state->current_dpwb_state,
287 dpwb_state->pnp1_value,
288 dpwb_state->lte_dutycycle,
289 dpwb_state->sinr_wlan_on,
290 dpwb_state->sinr_wlan_off,
291 dpwb_state->bler_count,
292 dpwb_state->block_count,
293 dpwb_state->wlan_rssi_level,
294 dpwb_state->wlan_rssi,
295 dpwb_state->is_tdm_running);
296
297 exit:
298 osif_request_put(request);
299 return qdf_status_from_os_return(rc);
300 }
301
hdd_debugfs_mws_coex_dpwb_read(qdf_debugfs_file_t file,void * arg)302 static QDF_STATUS hdd_debugfs_mws_coex_dpwb_read(qdf_debugfs_file_t file,
303 void *arg)
304 {
305 struct osif_psoc_sync *psoc_sync;
306 struct hdd_context *hdd_ctx = arg;
307 int ret;
308 QDF_STATUS status;
309
310 ret = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), &psoc_sync);
311 if (ret)
312 return qdf_status_from_os_return(ret);
313
314 status = __hdd_debugfs_mws_coex_dpwb_read(hdd_ctx, file);
315
316 osif_psoc_sync_op_stop(psoc_sync);
317 return qdf_status_from_os_return(ret);
318 }
319
__hdd_debugfs_mws_tdm_state_read(struct hdd_context * hdd_ctx,qdf_debugfs_file_t file)320 static QDF_STATUS __hdd_debugfs_mws_tdm_state_read(struct hdd_context *hdd_ctx,
321 qdf_debugfs_file_t file)
322 {
323 struct hdd_adapter *adapter;
324 QDF_STATUS status;
325 int rc;
326 struct mws_coex_tdm_state *tdm_state;
327 struct mws_coex_tdm_state_priv *tdm_priv;
328 struct osif_request *request;
329 static const struct osif_request_params params = {
330 .priv_size = sizeof(*tdm_priv),
331 .timeout_ms = WLAN_WAIT_TIME_MWS_COEX_INFO,
332 };
333 void *cookie;
334
335 adapter = hdd_get_first_valid_adapter(hdd_ctx);
336 if (!adapter) {
337 hdd_err("Failed to get adapter");
338 return QDF_STATUS_E_INVAL;
339 }
340
341 if (!test_bit(DEVICE_IFACE_OPENED, &adapter->event_flags)) {
342 hdd_err("Interface is not enabled");
343 return QDF_STATUS_E_INVAL;
344 }
345
346 if (file->index > 0)
347 return QDF_STATUS_SUCCESS;
348
349 request = osif_request_alloc(¶ms);
350 if (!request) {
351 hdd_err("Request allocation failure");
352 return QDF_STATUS_E_NOMEM;
353 }
354
355 cookie = osif_request_cookie(request);
356
357 status = sme_get_mws_coex_info(hdd_ctx->mac_handle,
358 adapter->deflink->vdev_id,
359 WMI_MWS_COEX_TDM_STATE,
360 hdd_debugfs_mws_coex_info_cb, cookie);
361
362 if (QDF_IS_STATUS_ERROR(status)) {
363 rc = qdf_status_to_os_return(status);
364 goto exit;
365 }
366
367 rc = osif_request_wait_for_response(request);
368 if (rc) {
369 qdf_debugfs_printf(file, "Timedout while retrieving MWS coex tdm state");
370 rc = -ETIMEDOUT;
371 goto exit;
372 }
373
374 tdm_priv = osif_request_priv(request);
375 tdm_state = &tdm_priv->tdm_state;
376
377 qdf_debugfs_printf(file, "vdev_id = %u\n"
378 "tdm_policy_bitmap = %u\n"
379 "tdm_sf_bitmap = %u\n",
380 tdm_state->vdev_id,
381 tdm_state->tdm_policy_bitmap,
382 tdm_state->tdm_sf_bitmap);
383
384 exit:
385 osif_request_put(request);
386 return qdf_status_from_os_return(rc);
387 }
388
hdd_debugfs_mws_tdm_state_read(qdf_debugfs_file_t file,void * arg)389 static QDF_STATUS hdd_debugfs_mws_tdm_state_read(qdf_debugfs_file_t file,
390 void *arg)
391 {
392 struct osif_psoc_sync *psoc_sync;
393 struct hdd_context *hdd_ctx = arg;
394 int ret;
395 QDF_STATUS status;
396
397 ret = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), &psoc_sync);
398 if (ret)
399 return qdf_status_from_os_return(ret);
400
401 status = __hdd_debugfs_mws_tdm_state_read(hdd_ctx, file);
402
403 osif_psoc_sync_op_stop(psoc_sync);
404 return qdf_status_from_os_return(ret);
405 }
406
__hdd_debugfs_mws_coex_idrx_read(struct hdd_context * hdd_ctx,qdf_debugfs_file_t file)407 static QDF_STATUS __hdd_debugfs_mws_coex_idrx_read(struct hdd_context *hdd_ctx,
408 qdf_debugfs_file_t file)
409 {
410 struct hdd_adapter *adapter;
411 QDF_STATUS status;
412 int rc;
413 struct osif_request *request;
414 struct mws_coex_idrx_state_priv *idrx_priv;
415 struct mws_coex_idrx_state *idrx_state;
416 static const struct osif_request_params params = {
417 .priv_size = sizeof(*idrx_priv),
418 .timeout_ms = WLAN_WAIT_TIME_MWS_COEX_INFO,
419 };
420 void *cookie;
421
422 adapter = hdd_get_first_valid_adapter(hdd_ctx);
423 if (!adapter) {
424 hdd_err("Failed to get adapter");
425 return QDF_STATUS_E_INVAL;
426 }
427
428 if (!test_bit(DEVICE_IFACE_OPENED, &adapter->event_flags)) {
429 hdd_err("Interface is not enabled");
430 return QDF_STATUS_E_INVAL;
431 }
432
433 if (file->index > 0)
434 return QDF_STATUS_SUCCESS;
435
436 request = osif_request_alloc(¶ms);
437 if (!request) {
438 hdd_err("Request allocation failure");
439 return QDF_STATUS_E_NOMEM;
440 }
441
442 cookie = osif_request_cookie(request);
443
444 status = sme_get_mws_coex_info(hdd_ctx->mac_handle,
445 adapter->deflink->vdev_id,
446 WMI_MWS_COEX_IDRX_STATE,
447 hdd_debugfs_mws_coex_info_cb, cookie);
448
449 if (QDF_IS_STATUS_ERROR(status)) {
450 rc = qdf_status_to_os_return(status);
451 goto exit;
452 }
453
454 rc = osif_request_wait_for_response(request);
455 if (rc) {
456 qdf_debugfs_printf(file, "Timedout while retrieving MWS coex idrx state");
457 rc = -ETIMEDOUT;
458 goto exit;
459 }
460
461 idrx_priv = osif_request_priv(request);
462 idrx_state = &idrx_priv->idrx_state;
463 qdf_debugfs_printf(file, "vdev_id = %u\n"
464 "sub0_techid = %u\n"
465 "sub0_policy = %u\n"
466 "sub0_is_link_critical = %u\n"
467 "sub0_static_power = %u\n"
468 "sub0_rssi = %d\n"
469 "sub1_techid = %d\n"
470 "sub1_policy = %d\n"
471 "sub1_is_link_critical = %d\n"
472 "sub1_static_power = %u\n"
473 "sub1_rssi = %d\n",
474 idrx_state->vdev_id,
475 idrx_state->sub0_techid,
476 idrx_state->sub0_policy,
477 idrx_state->sub0_is_link_critical,
478 idrx_state->sub0_static_power,
479 idrx_state->sub0_rssi,
480 idrx_state->sub1_techid,
481 idrx_state->sub1_policy,
482 idrx_state->sub1_is_link_critical,
483 idrx_state->sub1_static_power,
484 idrx_state->sub1_rssi);
485
486 exit:
487 osif_request_put(request);
488 return qdf_status_from_os_return(rc);
489 }
490
hdd_debugfs_mws_coex_idrx_read(qdf_debugfs_file_t file,void * arg)491 static QDF_STATUS hdd_debugfs_mws_coex_idrx_read(qdf_debugfs_file_t file,
492 void *arg)
493 {
494 struct osif_psoc_sync *psoc_sync;
495 struct hdd_context *hdd_ctx = arg;
496 int ret;
497 QDF_STATUS status;
498
499 ret = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), &psoc_sync);
500 if (ret)
501 return qdf_status_from_os_return(ret);
502
503 status = __hdd_debugfs_mws_coex_idrx_read(hdd_ctx, file);
504
505 osif_psoc_sync_op_stop(psoc_sync);
506 return qdf_status_from_os_return(ret);
507 }
508
__hdd_debugfs_mws_antenna_sharing_read(struct hdd_context * hdd_ctx,qdf_debugfs_file_t file)509 static QDF_STATUS __hdd_debugfs_mws_antenna_sharing_read(struct hdd_context
510 *hdd_ctx,
511 qdf_debugfs_file_t
512 file)
513 {
514 struct hdd_adapter *adapter;
515 QDF_STATUS status;
516 int rc;
517 struct mws_antenna_sharing_info *antenna_sharing;
518 struct mws_antenna_sharing_info_priv *antenna_priv;
519 struct osif_request *request;
520 static const struct osif_request_params params = {
521 .priv_size = sizeof(*antenna_priv),
522 .timeout_ms = WLAN_WAIT_TIME_MWS_COEX_INFO,
523 };
524 void *cookie;
525
526 adapter = hdd_get_first_valid_adapter(hdd_ctx);
527 if (!adapter) {
528 hdd_err("Failed to get adapter");
529 return QDF_STATUS_E_INVAL;
530 }
531
532 if (!test_bit(DEVICE_IFACE_OPENED, &adapter->event_flags)) {
533 hdd_err("Interface is not enabled");
534 return QDF_STATUS_E_INVAL;
535 }
536
537 if (file->index > 0)
538 return QDF_STATUS_SUCCESS;
539
540 request = osif_request_alloc(¶ms);
541 if (!request) {
542 hdd_err("Request allocation failure");
543 return QDF_STATUS_E_NOMEM;
544 }
545
546 cookie = osif_request_cookie(request);
547
548 status = sme_get_mws_coex_info(hdd_ctx->mac_handle,
549 adapter->deflink->vdev_id,
550 WMI_MWS_COEX_ANTENNA_SHARING_STATE,
551 hdd_debugfs_mws_coex_info_cb, cookie);
552
553 if (QDF_IS_STATUS_ERROR(status)) {
554 rc = qdf_status_to_os_return(status);
555 goto exit;
556 }
557
558 rc = osif_request_wait_for_response(request);
559 if (rc) {
560 qdf_debugfs_printf(file, "Timedout while retrieving MWS coex antenna sharing state");
561 rc = -ETIMEDOUT;
562 goto exit;
563 }
564
565 antenna_priv = osif_request_priv(request);
566 antenna_sharing = &antenna_priv->antenna_sharing;
567 qdf_debugfs_printf(file, "vdev_id = %u\n"
568 "coex_flags = %u\n"
569 "coex_config = %u\n"
570 "tx_chain_mask = %u\n"
571 "rx_chain_mask = %u\n"
572 "rx_nss = %u\n"
573 "force_mrc = %u\n"
574 "rssi_type = %u\n"
575 "chain0_rssi = %d\n"
576 "chain1_rssi = %d\n"
577 "combined_rssi = %d\n"
578 "imbalance = %u\n"
579 "mrc_threshold = %d\n"
580 "grant_duration = %u\n",
581 antenna_sharing->vdev_id,
582 antenna_sharing->coex_flags,
583 antenna_sharing->coex_config,
584 antenna_sharing->tx_chain_mask,
585 antenna_sharing->rx_chain_mask,
586 antenna_sharing->rx_nss,
587 antenna_sharing->force_mrc,
588 antenna_sharing->rssi_type,
589 antenna_sharing->chain0_rssi,
590 antenna_sharing->chain1_rssi,
591 antenna_sharing->combined_rssi,
592 antenna_sharing->imbalance,
593 antenna_sharing->mrc_threshold,
594 antenna_sharing->grant_duration);
595
596 exit:
597 osif_request_put(request);
598 return qdf_status_from_os_return(rc);
599 }
600
hdd_debugfs_mws_antenna_sharing_read(qdf_debugfs_file_t file,void * arg)601 static QDF_STATUS hdd_debugfs_mws_antenna_sharing_read(qdf_debugfs_file_t file,
602 void *arg)
603 {
604 struct osif_psoc_sync *psoc_sync;
605 struct hdd_context *hdd_ctx = arg;
606 int ret;
607 QDF_STATUS status;
608
609 ret = osif_psoc_sync_op_start(wiphy_dev(hdd_ctx->wiphy), &psoc_sync);
610 if (ret)
611 return qdf_status_from_os_return(ret);
612
613 status = __hdd_debugfs_mws_antenna_sharing_read(hdd_ctx, file);
614
615 osif_psoc_sync_op_stop(psoc_sync);
616 return qdf_status_from_os_return(ret);
617 }
618
619 static struct qdf_debugfs_fops hdd_mws_debugfs_coex_state_fops = {
620 .show = hdd_debugfs_mws_coex_state_read,
621 };
622
623 static struct qdf_debugfs_fops hdd_mws_debugfs_fops_coex_dpwb_fops = {
624 .show = hdd_debugfs_mws_coex_dpwb_read,
625 };
626
627 static struct qdf_debugfs_fops hdd_mws_debugfs_tdm_state_fpos = {
628 .show = hdd_debugfs_mws_tdm_state_read,
629 };
630
631 static struct qdf_debugfs_fops hdd_mws_debugfs_idrx_state_fpos = {
632 .show = hdd_debugfs_mws_coex_idrx_read,
633 };
634
635 static struct qdf_debugfs_fops hdd_mws_debugfs_antenna_sharing_fpos = {
636 .show = hdd_debugfs_mws_antenna_sharing_read,
637 };
638
hdd_debugfs_mws_coex_info_init(struct hdd_context * hdd_ctx)639 void hdd_debugfs_mws_coex_info_init(struct hdd_context *hdd_ctx)
640 {
641 hdd_mws_debugfs_coex_state_fops.priv = hdd_ctx;
642 hdd_mws_debugfs_fops_coex_dpwb_fops.priv = hdd_ctx;
643 hdd_mws_debugfs_tdm_state_fpos.priv = hdd_ctx;
644 hdd_mws_debugfs_idrx_state_fpos.priv = hdd_ctx;
645 hdd_mws_debugfs_antenna_sharing_fpos.priv = hdd_ctx;
646 if (!qdf_debugfs_create_file("mws_coex_state", MWS_DEBUGFS_PERMS,
647 NULL, &hdd_mws_debugfs_coex_state_fops))
648 hdd_err("Failed to create the mws coex state file");
649 if (!qdf_debugfs_create_file("mws_coex_dpwb_state", MWS_DEBUGFS_PERMS,
650 NULL,
651 &hdd_mws_debugfs_fops_coex_dpwb_fops))
652 hdd_err("Failed to create the mws coex dpwb file");
653 if (!qdf_debugfs_create_file("mws_coex_tdm_state", MWS_DEBUGFS_PERMS,
654 NULL, &hdd_mws_debugfs_tdm_state_fpos))
655 hdd_err("Failed to create the mws coex tdm file");
656 if (!qdf_debugfs_create_file("mws_coex_idrx", MWS_DEBUGFS_PERMS,
657 NULL, &hdd_mws_debugfs_idrx_state_fpos))
658 hdd_err("Failed to create the mws coex idrx file");
659 if (!qdf_debugfs_create_file("mws_coex_antenna_sharing",
660 MWS_DEBUGFS_PERMS,
661 NULL,
662 &hdd_mws_debugfs_antenna_sharing_fpos))
663 hdd_err("Failed to create the mws coex antenna sharing file");
664 }
665
hdd_debugfs_mws_coex_info_deinit(struct hdd_context * hdd_ctx)666 void hdd_debugfs_mws_coex_info_deinit(struct hdd_context *hdd_ctx)
667 {
668 /**
669 * Coex info doesn't have a directory it is removed as part of qdf remove
670 */
671 }
672