xref: /wlan-driver/qcacld-3.0/components/coex/dispatcher/src/wlan_coex_ucfg_api.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2020, The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for any
6*5113495bSYour Name  * purpose with or without fee is hereby granted, provided that the above
7*5113495bSYour Name  * copyright notice and this permission notice appear in all copies.
8*5113495bSYour Name  *
9*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10*5113495bSYour Name  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11*5113495bSYour Name  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12*5113495bSYour Name  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13*5113495bSYour Name  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14*5113495bSYour Name  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15*5113495bSYour Name  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16*5113495bSYour Name  */
17*5113495bSYour Name 
18*5113495bSYour Name /*
19*5113495bSYour Name  * DOC: contains coex north bound interface definitions
20*5113495bSYour Name  */
21*5113495bSYour Name 
22*5113495bSYour Name #include <wlan_coex_main.h>
23*5113495bSYour Name #include <wlan_coex_ucfg_api.h>
24*5113495bSYour Name #include "wmi_unified.h"
25*5113495bSYour Name #include "wlan_coex_public_structs.h"
26*5113495bSYour Name #include "wlan_coex_tgt_api.h"
27*5113495bSYour Name 
28*5113495bSYour Name QDF_STATUS
ucfg_coex_register_cfg_updated_handler(struct wlan_objmgr_psoc * psoc,enum coex_config_type type,update_coex_cb handler)29*5113495bSYour Name ucfg_coex_register_cfg_updated_handler(struct wlan_objmgr_psoc *psoc,
30*5113495bSYour Name 				       enum coex_config_type type,
31*5113495bSYour Name 				       update_coex_cb handler)
32*5113495bSYour Name {
33*5113495bSYour Name 	struct coex_psoc_obj *coex_obj;
34*5113495bSYour Name 
35*5113495bSYour Name 	if (type >= COEX_CONFIG_TYPE_MAX) {
36*5113495bSYour Name 		coex_err("invalid coex type: %d", type);
37*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
38*5113495bSYour Name 	}
39*5113495bSYour Name 
40*5113495bSYour Name 	coex_obj = wlan_psoc_get_coex_obj(psoc);
41*5113495bSYour Name 	if (!coex_obj)
42*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
43*5113495bSYour Name 
44*5113495bSYour Name 	coex_obj->coex_config_updated[type] = handler;
45*5113495bSYour Name 
46*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
47*5113495bSYour Name }
48*5113495bSYour Name 
49*5113495bSYour Name QDF_STATUS
ucfg_coex_psoc_set_btc_chain_mode(struct wlan_objmgr_psoc * psoc,enum coex_btc_chain_mode val)50*5113495bSYour Name ucfg_coex_psoc_set_btc_chain_mode(struct wlan_objmgr_psoc *psoc,
51*5113495bSYour Name 				  enum coex_btc_chain_mode val)
52*5113495bSYour Name {
53*5113495bSYour Name 	return wlan_coex_psoc_set_btc_chain_mode(psoc, val);
54*5113495bSYour Name }
55*5113495bSYour Name 
56*5113495bSYour Name QDF_STATUS
ucfg_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc * psoc,enum coex_btc_chain_mode * val)57*5113495bSYour Name ucfg_coex_psoc_get_btc_chain_mode(struct wlan_objmgr_psoc *psoc,
58*5113495bSYour Name 				  enum coex_btc_chain_mode *val)
59*5113495bSYour Name {
60*5113495bSYour Name 	return wlan_coex_psoc_get_btc_chain_mode(psoc, val);
61*5113495bSYour Name }
62*5113495bSYour Name 
63*5113495bSYour Name QDF_STATUS
ucfg_coex_send_btc_chain_mode(struct wlan_objmgr_vdev * vdev,enum coex_btc_chain_mode mode)64*5113495bSYour Name ucfg_coex_send_btc_chain_mode(struct wlan_objmgr_vdev *vdev,
65*5113495bSYour Name 			      enum coex_btc_chain_mode mode)
66*5113495bSYour Name {
67*5113495bSYour Name 	struct coex_config_params param = {0};
68*5113495bSYour Name 
69*5113495bSYour Name 	if (mode > WLAN_COEX_BTC_CHAIN_MODE_HYBRID)
70*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
71*5113495bSYour Name 
72*5113495bSYour Name 	param.vdev_id = wlan_vdev_get_id(vdev);
73*5113495bSYour Name 	param.config_type = WMI_COEX_CONFIG_BTCOEX_SEPARATE_CHAIN_MODE;
74*5113495bSYour Name 	param.config_arg1 = mode;
75*5113495bSYour Name 
76*5113495bSYour Name 	coex_debug("send btc chain mode %d for vdev %d", mode, param.vdev_id);
77*5113495bSYour Name 
78*5113495bSYour Name 	return wlan_coex_config_send(vdev, &param);
79*5113495bSYour Name }
80*5113495bSYour Name 
81*5113495bSYour Name QDF_STATUS
ucfg_coex_send_multi_config(struct wlan_objmgr_vdev * vdev,struct coex_multi_config * param)82*5113495bSYour Name ucfg_coex_send_multi_config(struct wlan_objmgr_vdev *vdev,
83*5113495bSYour Name 			    struct coex_multi_config *param)
84*5113495bSYour Name {
85*5113495bSYour Name 	return wlan_coex_multi_config_send(vdev, param);
86*5113495bSYour Name }
87*5113495bSYour Name 
88*5113495bSYour Name #ifdef WLAN_FEATURE_DBAM_CONFIG
89*5113495bSYour Name QDF_STATUS
ucfg_coex_send_dbam_config(struct wlan_objmgr_vdev * vdev,struct coex_dbam_config_params * param,void (* clbk)(void * ctx,enum coex_dbam_comp_status * rsp),void * context)90*5113495bSYour Name ucfg_coex_send_dbam_config(struct wlan_objmgr_vdev *vdev,
91*5113495bSYour Name 			   struct coex_dbam_config_params *param,
92*5113495bSYour Name 			   void (*clbk)(void *ctx,
93*5113495bSYour Name 			   enum coex_dbam_comp_status *rsp),
94*5113495bSYour Name 			   void *context)
95*5113495bSYour Name {
96*5113495bSYour Name 	struct wlan_objmgr_psoc *psoc;
97*5113495bSYour Name 	struct coex_psoc_obj *coex_obj;
98*5113495bSYour Name 	struct wlan_coex_callback *cbk;
99*5113495bSYour Name 
100*5113495bSYour Name 	if (!vdev) {
101*5113495bSYour Name 		coex_err("Null vdev");
102*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
103*5113495bSYour Name 	}
104*5113495bSYour Name 
105*5113495bSYour Name 	psoc = wlan_vdev_get_psoc(vdev);
106*5113495bSYour Name 	if (!psoc) {
107*5113495bSYour Name 		coex_err("psoc is null");
108*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
109*5113495bSYour Name 	}
110*5113495bSYour Name 
111*5113495bSYour Name 	coex_obj = wlan_psoc_get_coex_obj(psoc);
112*5113495bSYour Name 	if (!coex_obj) {
113*5113495bSYour Name 		coex_err("failed to get coex_obj");
114*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
115*5113495bSYour Name 	}
116*5113495bSYour Name 
117*5113495bSYour Name 	cbk = &coex_obj->cb;
118*5113495bSYour Name 	cbk->set_dbam_config_cb = clbk;
119*5113495bSYour Name 	cbk->set_dbam_config_ctx = context;
120*5113495bSYour Name 
121*5113495bSYour Name 	coex_debug("send dbam config mode %d for vdev_id %d",
122*5113495bSYour Name 		   param->dbam_mode, param->vdev_id);
123*5113495bSYour Name 
124*5113495bSYour Name 	return wlan_dbam_config_send(vdev, param);
125*5113495bSYour Name }
126*5113495bSYour Name #endif
127*5113495bSYour Name 
128*5113495bSYour Name #define COEX_CONFIG_ENABLE_CONT_INFO 12
129*5113495bSYour Name 
130*5113495bSYour Name QDF_STATUS
ucfg_coex_send_logging_config(struct wlan_objmgr_psoc * psoc,uint32_t * apps_args)131*5113495bSYour Name ucfg_coex_send_logging_config(struct wlan_objmgr_psoc *psoc,
132*5113495bSYour Name 			      uint32_t *apps_args)
133*5113495bSYour Name {
134*5113495bSYour Name 	struct coex_config_params param = {0};
135*5113495bSYour Name 	struct wlan_objmgr_vdev *vdev;
136*5113495bSYour Name 	QDF_STATUS status;
137*5113495bSYour Name 
138*5113495bSYour Name 	if (apps_args[0] != COEX_CONFIG_ENABLE_CONT_INFO) {
139*5113495bSYour Name 		coex_err("invalid cmd %d", apps_args[0]);
140*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
141*5113495bSYour Name 	}
142*5113495bSYour Name 
143*5113495bSYour Name 	vdev = wlan_objmgr_get_vdev_by_opmode_from_psoc(psoc, QDF_STA_MODE,
144*5113495bSYour Name 							WLAN_COEX_ID);
145*5113495bSYour Name 
146*5113495bSYour Name 	if (!vdev) {
147*5113495bSYour Name 		coex_err("vdev is null");
148*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
149*5113495bSYour Name 	}
150*5113495bSYour Name 
151*5113495bSYour Name 	param.vdev_id = wlan_vdev_get_id(vdev);
152*5113495bSYour Name 	param.config_type = WMI_COEX_CONFIG_ENABLE_CONT_INFO;
153*5113495bSYour Name 	param.config_arg1 = apps_args[1];
154*5113495bSYour Name 	param.config_arg2 = apps_args[2];
155*5113495bSYour Name 	param.config_arg3 = apps_args[3];
156*5113495bSYour Name 	param.config_arg4 = apps_args[4];
157*5113495bSYour Name 	param.config_arg5 = apps_args[5];
158*5113495bSYour Name 	param.config_arg6 = apps_args[6];
159*5113495bSYour Name 
160*5113495bSYour Name 	coex_debug("send logging_config arg: %u for vdev %d", *apps_args,
161*5113495bSYour Name 		   param.vdev_id);
162*5113495bSYour Name 
163*5113495bSYour Name 	status = wlan_coex_config_send(vdev, &param);
164*5113495bSYour Name 	wlan_objmgr_vdev_release_ref(vdev, WLAN_COEX_ID);
165*5113495bSYour Name 
166*5113495bSYour Name 	return status;
167*5113495bSYour Name }
168