1*5113495bSYour Name /*
2*5113495bSYour Name * Copyright (c) 2013-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name *
5*5113495bSYour Name * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name * above copyright notice and this permission notice appear in all
8*5113495bSYour Name * copies.
9*5113495bSYour Name *
10*5113495bSYour Name * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name */
19*5113495bSYour Name
20*5113495bSYour Name #include <osdep.h>
21*5113495bSYour Name #include <wmi.h>
22*5113495bSYour Name #include <wmi_unified_priv.h>
23*5113495bSYour Name #include <wmi_unified_concurrency_api.h>
24*5113495bSYour Name #ifdef WLAN_FEATURE_MCC_QUOTA
25*5113495bSYour Name #include <wlan_p2p_mcc_quota_public_struct.h>
26*5113495bSYour Name #endif
27*5113495bSYour Name
28*5113495bSYour Name /**
29*5113495bSYour Name * send_set_enable_disable_mcc_adaptive_scheduler_cmd_tlv() -enable/disable
30*5113495bSYour Name * mcc scheduler
31*5113495bSYour Name * @wmi_handle: wmi handle
32*5113495bSYour Name * @mcc_adaptive_scheduler: enable/disable
33*5113495bSYour Name * @pdev_id: pdev identifier
34*5113495bSYour Name *
35*5113495bSYour Name * This function enable/disable mcc adaptive scheduler in fw.
36*5113495bSYour Name *
37*5113495bSYour Name * Return: QDF_STATUS_SUCCESS for success or error code
38*5113495bSYour Name */
send_set_enable_disable_mcc_adaptive_scheduler_cmd_tlv(wmi_unified_t wmi_handle,uint32_t mcc_adaptive_scheduler,uint32_t pdev_id)39*5113495bSYour Name static QDF_STATUS send_set_enable_disable_mcc_adaptive_scheduler_cmd_tlv(
40*5113495bSYour Name wmi_unified_t wmi_handle, uint32_t mcc_adaptive_scheduler,
41*5113495bSYour Name uint32_t pdev_id)
42*5113495bSYour Name {
43*5113495bSYour Name QDF_STATUS ret;
44*5113495bSYour Name wmi_buf_t buf = 0;
45*5113495bSYour Name wmi_resmgr_adaptive_ocs_enable_disable_cmd_fixed_param *cmd = NULL;
46*5113495bSYour Name uint16_t len =
47*5113495bSYour Name sizeof(wmi_resmgr_adaptive_ocs_enable_disable_cmd_fixed_param);
48*5113495bSYour Name
49*5113495bSYour Name buf = wmi_buf_alloc(wmi_handle, len);
50*5113495bSYour Name if (!buf) {
51*5113495bSYour Name return QDF_STATUS_E_NOMEM;
52*5113495bSYour Name }
53*5113495bSYour Name cmd = (wmi_resmgr_adaptive_ocs_enable_disable_cmd_fixed_param *)
54*5113495bSYour Name wmi_buf_data(buf);
55*5113495bSYour Name
56*5113495bSYour Name WMITLV_SET_HDR(&cmd->tlv_header,
57*5113495bSYour Name WMITLV_TAG_STRUC_wmi_resmgr_adaptive_ocs_enable_disable_cmd_fixed_param,
58*5113495bSYour Name WMITLV_GET_STRUCT_TLVLEN
59*5113495bSYour Name (wmi_resmgr_adaptive_ocs_enable_disable_cmd_fixed_param));
60*5113495bSYour Name cmd->enable = mcc_adaptive_scheduler;
61*5113495bSYour Name cmd->pdev_id = wmi_handle->ops->convert_pdev_id_host_to_target(
62*5113495bSYour Name wmi_handle,
63*5113495bSYour Name pdev_id);
64*5113495bSYour Name
65*5113495bSYour Name wmi_mtrace(WMI_RESMGR_ADAPTIVE_OCS_ENABLE_DISABLE_CMDID, NO_SESSION, 0);
66*5113495bSYour Name ret = wmi_unified_cmd_send(wmi_handle, buf, len,
67*5113495bSYour Name WMI_RESMGR_ADAPTIVE_OCS_ENABLE_DISABLE_CMDID);
68*5113495bSYour Name if (QDF_IS_STATUS_ERROR(ret)) {
69*5113495bSYour Name wmi_err("Failed to send enable/disable MCC"
70*5113495bSYour Name " adaptive scheduler command");
71*5113495bSYour Name wmi_buf_free(buf);
72*5113495bSYour Name }
73*5113495bSYour Name
74*5113495bSYour Name return ret;
75*5113495bSYour Name }
76*5113495bSYour Name
77*5113495bSYour Name /**
78*5113495bSYour Name * send_set_mcc_channel_time_latency_cmd_tlv() -set MCC channel time latency
79*5113495bSYour Name * @wmi_handle: wmi handle
80*5113495bSYour Name * @mcc_channel_freq: mcc channel frequency in MHz
81*5113495bSYour Name * @mcc_channel_time_latency: MCC channel time latency.
82*5113495bSYour Name *
83*5113495bSYour Name * Currently used to set time latency for an MCC vdev/adapter using operating
84*5113495bSYour Name * channel of it and channel number. The info is provided run time using
85*5113495bSYour Name * iwpriv command: iwpriv <wlan0 | p2p0> setMccLatency <latency in ms>.
86*5113495bSYour Name *
87*5113495bSYour Name * Return: QDF status
88*5113495bSYour Name */
send_set_mcc_channel_time_latency_cmd_tlv(wmi_unified_t wmi_handle,uint32_t mcc_channel_freq,uint32_t mcc_channel_time_latency)89*5113495bSYour Name static QDF_STATUS send_set_mcc_channel_time_latency_cmd_tlv(
90*5113495bSYour Name wmi_unified_t wmi_handle,
91*5113495bSYour Name uint32_t mcc_channel_freq,
92*5113495bSYour Name uint32_t mcc_channel_time_latency)
93*5113495bSYour Name {
94*5113495bSYour Name QDF_STATUS ret;
95*5113495bSYour Name wmi_buf_t buf = 0;
96*5113495bSYour Name wmi_resmgr_set_chan_latency_cmd_fixed_param *cmdTL = NULL;
97*5113495bSYour Name uint16_t len = 0;
98*5113495bSYour Name uint8_t *buf_ptr = NULL;
99*5113495bSYour Name wmi_resmgr_chan_latency chan_latency;
100*5113495bSYour Name /* Note: we only support MCC time latency for a single channel */
101*5113495bSYour Name uint32_t num_channels = 1;
102*5113495bSYour Name uint32_t chan1_freq = mcc_channel_freq;
103*5113495bSYour Name uint32_t latency_chan1 = mcc_channel_time_latency;
104*5113495bSYour Name
105*5113495bSYour Name /* If 0ms latency is provided, then FW will set to a default.
106*5113495bSYour Name * Otherwise, latency must be at least 30ms.
107*5113495bSYour Name */
108*5113495bSYour Name if ((latency_chan1 > 0) &&
109*5113495bSYour Name (latency_chan1 < WMI_MCC_MIN_NON_ZERO_CHANNEL_LATENCY)) {
110*5113495bSYour Name wmi_err("Invalid time latency for Channel #1 = %dms "
111*5113495bSYour Name "Minimum is 30ms (or 0 to use default value by "
112*5113495bSYour Name "firmware)", latency_chan1);
113*5113495bSYour Name return QDF_STATUS_E_INVAL;
114*5113495bSYour Name }
115*5113495bSYour Name
116*5113495bSYour Name /* Set WMI CMD for channel time latency here */
117*5113495bSYour Name len = sizeof(wmi_resmgr_set_chan_latency_cmd_fixed_param) +
118*5113495bSYour Name WMI_TLV_HDR_SIZE + /*Place holder for chan_time_latency array */
119*5113495bSYour Name num_channels * sizeof(wmi_resmgr_chan_latency);
120*5113495bSYour Name buf = wmi_buf_alloc(wmi_handle, len);
121*5113495bSYour Name if (!buf) {
122*5113495bSYour Name return QDF_STATUS_E_NOMEM;
123*5113495bSYour Name }
124*5113495bSYour Name buf_ptr = (uint8_t *) wmi_buf_data(buf);
125*5113495bSYour Name cmdTL = (wmi_resmgr_set_chan_latency_cmd_fixed_param *)
126*5113495bSYour Name wmi_buf_data(buf);
127*5113495bSYour Name WMITLV_SET_HDR(&cmdTL->tlv_header,
128*5113495bSYour Name WMITLV_TAG_STRUC_wmi_resmgr_set_chan_latency_cmd_fixed_param,
129*5113495bSYour Name WMITLV_GET_STRUCT_TLVLEN
130*5113495bSYour Name (wmi_resmgr_set_chan_latency_cmd_fixed_param));
131*5113495bSYour Name cmdTL->num_chans = num_channels;
132*5113495bSYour Name /* Update channel time latency information for home channel(s) */
133*5113495bSYour Name buf_ptr += sizeof(*cmdTL);
134*5113495bSYour Name WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
135*5113495bSYour Name num_channels * sizeof(wmi_resmgr_chan_latency));
136*5113495bSYour Name buf_ptr += WMI_TLV_HDR_SIZE;
137*5113495bSYour Name chan_latency.chan_mhz = chan1_freq;
138*5113495bSYour Name chan_latency.latency = latency_chan1;
139*5113495bSYour Name qdf_mem_copy(buf_ptr, &chan_latency, sizeof(chan_latency));
140*5113495bSYour Name wmi_mtrace(WMI_RESMGR_SET_CHAN_LATENCY_CMDID, NO_SESSION, 0);
141*5113495bSYour Name ret = wmi_unified_cmd_send(wmi_handle, buf, len,
142*5113495bSYour Name WMI_RESMGR_SET_CHAN_LATENCY_CMDID);
143*5113495bSYour Name if (QDF_IS_STATUS_ERROR(ret)) {
144*5113495bSYour Name wmi_err("Failed to send MCC Channel Time Latency command");
145*5113495bSYour Name wmi_buf_free(buf);
146*5113495bSYour Name QDF_ASSERT(0);
147*5113495bSYour Name }
148*5113495bSYour Name
149*5113495bSYour Name return ret;
150*5113495bSYour Name }
151*5113495bSYour Name
152*5113495bSYour Name /**
153*5113495bSYour Name * send_set_mcc_channel_time_quota_cmd_tlv() -set MCC channel time quota
154*5113495bSYour Name * @wmi_handle: wmi handle
155*5113495bSYour Name * @adapter_1_chan_freq: adapter 1 channel frequency in MHz
156*5113495bSYour Name * @adapter_1_quota: adapter 1 quota
157*5113495bSYour Name * @adapter_2_chan_freq: adapter 2 channel frequency in MHz
158*5113495bSYour Name *
159*5113495bSYour Name * Return: QDF status
160*5113495bSYour Name */
send_set_mcc_channel_time_quota_cmd_tlv(wmi_unified_t wmi_handle,uint32_t adapter_1_chan_freq,uint32_t adapter_1_quota,uint32_t adapter_2_chan_freq)161*5113495bSYour Name static QDF_STATUS send_set_mcc_channel_time_quota_cmd_tlv(
162*5113495bSYour Name wmi_unified_t wmi_handle,
163*5113495bSYour Name uint32_t adapter_1_chan_freq,
164*5113495bSYour Name uint32_t adapter_1_quota,
165*5113495bSYour Name uint32_t adapter_2_chan_freq)
166*5113495bSYour Name {
167*5113495bSYour Name QDF_STATUS ret;
168*5113495bSYour Name wmi_buf_t buf = 0;
169*5113495bSYour Name uint16_t len = 0;
170*5113495bSYour Name uint8_t *buf_ptr = NULL;
171*5113495bSYour Name wmi_resmgr_set_chan_time_quota_cmd_fixed_param *cmdTQ = NULL;
172*5113495bSYour Name wmi_resmgr_chan_time_quota chan_quota;
173*5113495bSYour Name uint32_t quota_chan1 = adapter_1_quota;
174*5113495bSYour Name /* Knowing quota of 1st chan., derive quota for 2nd chan. */
175*5113495bSYour Name uint32_t quota_chan2 = 100 - quota_chan1;
176*5113495bSYour Name /* Note: setting time quota for MCC requires info for 2 channels */
177*5113495bSYour Name uint32_t num_channels = 2;
178*5113495bSYour Name uint32_t chan1_freq = adapter_1_chan_freq;
179*5113495bSYour Name uint32_t chan2_freq = adapter_2_chan_freq;
180*5113495bSYour Name
181*5113495bSYour Name wmi_debug("freq1:%dMHz, Quota1:%dms, freq2:%dMHz, Quota2:%dms",
182*5113495bSYour Name chan1_freq, quota_chan1, chan2_freq, quota_chan2);
183*5113495bSYour Name
184*5113495bSYour Name /*
185*5113495bSYour Name * Perform sanity check on time quota values provided.
186*5113495bSYour Name */
187*5113495bSYour Name if (quota_chan1 < WMI_MCC_MIN_CHANNEL_QUOTA ||
188*5113495bSYour Name quota_chan1 > WMI_MCC_MAX_CHANNEL_QUOTA) {
189*5113495bSYour Name wmi_err("Invalid time quota for Chan #1=%dms. Min: %dms, Max: %dms",
190*5113495bSYour Name quota_chan1, WMI_MCC_MIN_CHANNEL_QUOTA,
191*5113495bSYour Name WMI_MCC_MAX_CHANNEL_QUOTA);
192*5113495bSYour Name return QDF_STATUS_E_INVAL;
193*5113495bSYour Name }
194*5113495bSYour Name /* Set WMI CMD for channel time quota here */
195*5113495bSYour Name len = sizeof(wmi_resmgr_set_chan_time_quota_cmd_fixed_param) +
196*5113495bSYour Name WMI_TLV_HDR_SIZE + /* Place holder for chan_time_quota array */
197*5113495bSYour Name num_channels * sizeof(wmi_resmgr_chan_time_quota);
198*5113495bSYour Name buf = wmi_buf_alloc(wmi_handle, len);
199*5113495bSYour Name if (!buf) {
200*5113495bSYour Name return QDF_STATUS_E_NOMEM;
201*5113495bSYour Name }
202*5113495bSYour Name buf_ptr = (uint8_t *) wmi_buf_data(buf);
203*5113495bSYour Name cmdTQ = (wmi_resmgr_set_chan_time_quota_cmd_fixed_param *)
204*5113495bSYour Name wmi_buf_data(buf);
205*5113495bSYour Name WMITLV_SET_HDR(&cmdTQ->tlv_header,
206*5113495bSYour Name WMITLV_TAG_STRUC_wmi_resmgr_set_chan_time_quota_cmd_fixed_param,
207*5113495bSYour Name WMITLV_GET_STRUCT_TLVLEN
208*5113495bSYour Name (wmi_resmgr_set_chan_time_quota_cmd_fixed_param));
209*5113495bSYour Name cmdTQ->num_chans = num_channels;
210*5113495bSYour Name
211*5113495bSYour Name /* Update channel time quota information for home channel(s) */
212*5113495bSYour Name buf_ptr += sizeof(*cmdTQ);
213*5113495bSYour Name WMITLV_SET_HDR(buf_ptr, WMITLV_TAG_ARRAY_BYTE,
214*5113495bSYour Name num_channels * sizeof(wmi_resmgr_chan_time_quota));
215*5113495bSYour Name buf_ptr += WMI_TLV_HDR_SIZE;
216*5113495bSYour Name chan_quota.chan_mhz = chan1_freq;
217*5113495bSYour Name chan_quota.channel_time_quota = quota_chan1;
218*5113495bSYour Name qdf_mem_copy(buf_ptr, &chan_quota, sizeof(chan_quota));
219*5113495bSYour Name /* Construct channel and quota record for the 2nd MCC mode. */
220*5113495bSYour Name buf_ptr += sizeof(chan_quota);
221*5113495bSYour Name chan_quota.chan_mhz = chan2_freq;
222*5113495bSYour Name chan_quota.channel_time_quota = quota_chan2;
223*5113495bSYour Name qdf_mem_copy(buf_ptr, &chan_quota, sizeof(chan_quota));
224*5113495bSYour Name
225*5113495bSYour Name wmi_mtrace(WMI_RESMGR_SET_CHAN_TIME_QUOTA_CMDID, NO_SESSION, 0);
226*5113495bSYour Name ret = wmi_unified_cmd_send(wmi_handle, buf, len,
227*5113495bSYour Name WMI_RESMGR_SET_CHAN_TIME_QUOTA_CMDID);
228*5113495bSYour Name if (QDF_IS_STATUS_ERROR(ret)) {
229*5113495bSYour Name wmi_err("Failed to send MCC Channel Time Quota command");
230*5113495bSYour Name wmi_buf_free(buf);
231*5113495bSYour Name QDF_ASSERT(0);
232*5113495bSYour Name }
233*5113495bSYour Name
234*5113495bSYour Name return ret;
235*5113495bSYour Name }
236*5113495bSYour Name
237*5113495bSYour Name #ifdef WLAN_FEATURE_MCC_QUOTA
238*5113495bSYour Name /**
239*5113495bSYour Name * convert_to_host_quota_type() - convert wmi quota type to host quota type
240*5113495bSYour Name * @quota_type: wmi target quota type
241*5113495bSYour Name *
242*5113495bSYour Name * Return: enum mcc_quota_type
243*5113495bSYour Name */
convert_to_host_quota_type(uint32_t quota_type)244*5113495bSYour Name static enum mcc_quota_type convert_to_host_quota_type(uint32_t quota_type)
245*5113495bSYour Name {
246*5113495bSYour Name switch (quota_type) {
247*5113495bSYour Name case WMI_RESMGR_QUOTA_TYPE_CLEAR:
248*5113495bSYour Name return QUOTA_TYPE_CLEAR;
249*5113495bSYour Name case WMI_RESMGR_QUOTA_TYPE_FIXED:
250*5113495bSYour Name return QUOTA_TYPE_FIXED;
251*5113495bSYour Name case WMI_RESMGR_QUOTA_TYPE_DYNAMIC:
252*5113495bSYour Name return QUOTA_TYPE_DYNAMIC;
253*5113495bSYour Name default:
254*5113495bSYour Name wmi_err("mcc quota unknown quota type %d", quota_type);
255*5113495bSYour Name return QUOTA_TYPE_UNKNOWN;
256*5113495bSYour Name }
257*5113495bSYour Name }
258*5113495bSYour Name
259*5113495bSYour Name /**
260*5113495bSYour Name * extract_mcc_quota_ev_param_tlv() - extract mcc quota information from wmi
261*5113495bSYour Name * event
262*5113495bSYour Name * @wmi_handle: wmi handle
263*5113495bSYour Name * @evt_buf: pointer to event buffer
264*5113495bSYour Name * @param: Pointer to hold mcc quota info
265*5113495bSYour Name *
266*5113495bSYour Name * Return: QDF_STATUS_SUCCESS for success or error code
267*5113495bSYour Name */
268*5113495bSYour Name static QDF_STATUS
extract_mcc_quota_ev_param_tlv(wmi_unified_t wmi_handle,void * evt_buf,struct mcc_quota_info * param)269*5113495bSYour Name extract_mcc_quota_ev_param_tlv(wmi_unified_t wmi_handle,
270*5113495bSYour Name void *evt_buf, struct mcc_quota_info *param)
271*5113495bSYour Name {
272*5113495bSYour Name WMI_RESMGR_CHAN_TIME_QUOTA_CHANGED_EVENTID_param_tlvs *param_tlvs;
273*5113495bSYour Name wmi_resmgr_chan_time_quota_changed_event_fixed_param *fixed_param;
274*5113495bSYour Name uint8_t i;
275*5113495bSYour Name wmi_resmgr_chan_time_quota_tlv *wmi_mcc_quota_info;
276*5113495bSYour Name
277*5113495bSYour Name if (!param) {
278*5113495bSYour Name wmi_err("mcc quota information param is null");
279*5113495bSYour Name return QDF_STATUS_E_INVAL;
280*5113495bSYour Name }
281*5113495bSYour Name
282*5113495bSYour Name param_tlvs = evt_buf;
283*5113495bSYour Name if (!param_tlvs || !param_tlvs->fixed_param) {
284*5113495bSYour Name wmi_err("Invalid mcc quota event buffer");
285*5113495bSYour Name return QDF_STATUS_E_INVAL;
286*5113495bSYour Name }
287*5113495bSYour Name fixed_param = param_tlvs->fixed_param;
288*5113495bSYour Name
289*5113495bSYour Name wmi_debug("mcc quota type %d, num %d",
290*5113495bSYour Name fixed_param->quota_type, param_tlvs->num_chan_quota);
291*5113495bSYour Name
292*5113495bSYour Name param->type = convert_to_host_quota_type(fixed_param->quota_type);
293*5113495bSYour Name if (param->type == QUOTA_TYPE_UNKNOWN)
294*5113495bSYour Name return QDF_STATUS_E_INVAL;
295*5113495bSYour Name
296*5113495bSYour Name if (!param_tlvs->chan_quota) {
297*5113495bSYour Name param->num_chan_quota = 0;
298*5113495bSYour Name return QDF_STATUS_SUCCESS;
299*5113495bSYour Name }
300*5113495bSYour Name
301*5113495bSYour Name if (param_tlvs->num_chan_quota > MAX_MCC_QUOTA_CH_NUM)
302*5113495bSYour Name wmi_warn("mcc quota num %d unexpected",
303*5113495bSYour Name param_tlvs->num_chan_quota);
304*5113495bSYour Name param->num_chan_quota = qdf_min(param_tlvs->num_chan_quota,
305*5113495bSYour Name (uint32_t)MAX_MCC_QUOTA_CH_NUM);
306*5113495bSYour Name wmi_mcc_quota_info = param_tlvs->chan_quota;
307*5113495bSYour Name for (i = 0; i < param->num_chan_quota; i++) {
308*5113495bSYour Name param->chan_quota[i].chan_mhz =
309*5113495bSYour Name wmi_mcc_quota_info[i].chan_time_quota.chan_mhz;
310*5113495bSYour Name param->chan_quota[i].channel_time_quota =
311*5113495bSYour Name wmi_mcc_quota_info[i].chan_time_quota.channel_time_quota;
312*5113495bSYour Name wmi_debug("mcc quota [%d] chan %d, quota %d",
313*5113495bSYour Name i, param->chan_quota[i].chan_mhz,
314*5113495bSYour Name param->chan_quota[i].channel_time_quota);
315*5113495bSYour Name }
316*5113495bSYour Name
317*5113495bSYour Name return QDF_STATUS_SUCCESS;
318*5113495bSYour Name }
319*5113495bSYour Name
wmi_mcc_quota_evt_attach_tlv(wmi_unified_t wmi_handle)320*5113495bSYour Name static void wmi_mcc_quota_evt_attach_tlv(wmi_unified_t wmi_handle)
321*5113495bSYour Name {
322*5113495bSYour Name struct wmi_ops *ops = wmi_handle->ops;
323*5113495bSYour Name
324*5113495bSYour Name ops->extract_mcc_quota_ev_param = extract_mcc_quota_ev_param_tlv;
325*5113495bSYour Name }
326*5113495bSYour Name #else
wmi_mcc_quota_evt_attach_tlv(wmi_unified_t wmi_handle)327*5113495bSYour Name static inline void wmi_mcc_quota_evt_attach_tlv(wmi_unified_t wmi_handle)
328*5113495bSYour Name {
329*5113495bSYour Name }
330*5113495bSYour Name #endif
331*5113495bSYour Name
wmi_concurrency_attach_tlv(wmi_unified_t wmi_handle)332*5113495bSYour Name void wmi_concurrency_attach_tlv(wmi_unified_t wmi_handle)
333*5113495bSYour Name {
334*5113495bSYour Name struct wmi_ops *ops = wmi_handle->ops;
335*5113495bSYour Name
336*5113495bSYour Name ops->send_set_enable_disable_mcc_adaptive_scheduler_cmd =
337*5113495bSYour Name send_set_enable_disable_mcc_adaptive_scheduler_cmd_tlv;
338*5113495bSYour Name ops->send_set_mcc_channel_time_latency_cmd =
339*5113495bSYour Name send_set_mcc_channel_time_latency_cmd_tlv;
340*5113495bSYour Name ops->send_set_mcc_channel_time_quota_cmd =
341*5113495bSYour Name send_set_mcc_channel_time_quota_cmd_tlv;
342*5113495bSYour Name wmi_mcc_quota_evt_attach_tlv(wmi_handle);
343*5113495bSYour Name }
344