blob: 73c738bdcb754bd4808091cc5e0dbc93ac0910a0 [file] [log] [blame]
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +05301/*
2** Copyright 2017-present Open Networking Foundation
3**
4** Licensed under the Apache License, Version 2.0 (the "License");
5** you may not use this file except in compliance with the License.
6** You may obtain a copy of the License at
7**
8** http://www.apache.org/licenses/LICENSE-2.0
9**
10** Unless required by applicable law or agreed to in writing, software
11** distributed under the License is distributed on an "AS IS" BASIS,
12** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13** See the License for the specific language governing permissions and
14** limitations under the License.
15*/
16
17#include <stdio.h>
18#include <bal_api.h>
19
20#undef _SYS_QUEUE_H_
21
22/* Includes related to proto buf */
23#include "asfvolt16_driver.h"
24#include "bal_tmsched_hdlr.h"
25
26/********************************************************************\
27 * Function : bal_tm_sched_cfg_set *
28 * Description : Configures the tm scheduler for OLT device *
29 ********************************************************************/
30
31uint32_t bal_tm_sched_cfg_set(BalTmSchedCfg *tm_sched_cfg)
32{
33 bcmos_errno err = BCM_ERR_OK;
34 bcmbal_tm_sched_cfg tm_sched_obj; /**< declare main API struct */
35 bcmbal_tm_sched_key key = { }; /**< declare key */
Kim Kempfafa1ab42017-11-13 09:31:47 -080036
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +053037 if((tm_sched_cfg->key->has_dir) && (tm_sched_cfg->key->has_id))
38 {
39 key.dir = tm_sched_cfg->key->dir;
40 key.id = tm_sched_cfg->key->id;
41 }
42 else
43 {
Kim Kempfafa1ab42017-11-13 09:31:47 -080044 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to configure the tm schedule cfg(OLT): Missing Key values "
45 "Received key values Sched-Dir(%d), Sched-Id(%d)",
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +053046 tm_sched_cfg->key->dir, tm_sched_cfg->key->id);
47 return BAL_ERRNO__BAL_ERR_NOENT;
48 }
49
Kim Kempfafa1ab42017-11-13 09:31:47 -080050 ASFVOLT_LOG(ASFVOLT_DEBUG, "Configuration of OLT(tm Sched) starts");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +053051 /* init the API struct */
52 BCMBAL_CFG_INIT(&tm_sched_obj, tm_sched, key);
53
54 /* decode API parameters from GRPC */
55 /* scheduler owner */
56 BalTmSchedOwner *tmScOwn = (BalTmSchedOwner *)tm_sched_cfg->data->owner;
57 bcmbal_tm_sched_owner valtmScOwn = {};
58 if(tmScOwn->has_type)
59 {
60 valtmScOwn.type = tmScOwn->type;
61 switch(valtmScOwn.type)
62 {
63 case BCMBAL_TM_SCHED_OWNER_TYPE_INTERFACE:
64 if(tmScOwn->interface->has_intf_type)
65 {
66 valtmScOwn.u.interface.intf_type = tmScOwn->interface->intf_type;
67 }
68 if(tmScOwn->interface->has_intf_id)
69 {
70 valtmScOwn.u.interface.intf_id = tmScOwn->interface->intf_id;
71 }
72 break;
73 case BCMBAL_TM_SCHED_OWNER_TYPE_SUB_TERM:
74 if(tmScOwn->sub_term->has_intf_id)
75 {
76 valtmScOwn.u.sub_term.intf_id = tmScOwn->sub_term->intf_id;
77 }
78 if(tmScOwn->sub_term->has_sub_term_id)
79 {
80 valtmScOwn.u.sub_term.sub_term_id = tmScOwn->sub_term->sub_term_id;
81 }
82 break;
83 case BCMBAL_TM_SCHED_OWNER_TYPE_AGG_PORT:
84 if(tmScOwn->agg_port->has_presence_mask)
85 {
86 valtmScOwn.u.agg_port.presence_mask = tmScOwn->agg_port->presence_mask;
87 if(tmScOwn->agg_port->has_intf_id)
88 {
89 valtmScOwn.u.agg_port.intf_id= tmScOwn->agg_port->intf_id;
90 }
91 if(tmScOwn->agg_port->has_sub_term_id)
92 {
93 valtmScOwn.u.agg_port.sub_term_id = tmScOwn->agg_port->sub_term_id;
94 }
95 if(tmScOwn->agg_port->has_agg_port_id)
96 {
97 valtmScOwn.u.agg_port.agg_port_id = tmScOwn->agg_port->agg_port_id;
98 }
99 }
100 break;
101 case BCMBAL_TM_SCHED_OWNER_TYPE_UNI:
102 if(tmScOwn->uni->has_intf_id)
103 {
104 valtmScOwn.u.uni.intf_id = tmScOwn->uni->intf_id;
105 }
106 if(tmScOwn->uni->has_sub_term_id)
107 {
108 valtmScOwn.u.uni.sub_term_id = tmScOwn->uni->sub_term_id;
109 }
110 if(tmScOwn->uni->has_idx)
111 {
112 valtmScOwn.u.uni.idx = tmScOwn->uni->idx;
113 }
114 break;
115 case BCMBAL_TM_SCHED_OWNER_TYPE_VIRTUAL:
116 if(tmScOwn->virtual_->has_idx)
117 {
118 valtmScOwn.u.virtual.idx = tmScOwn->virtual_->idx;
119 }
120 break;
121 default:
122 break;
123 }
124 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, owner, BCMOS_TRUE, valtmScOwn);
125 }
126
Kim Kempfafa1ab42017-11-13 09:31:47 -0800127 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, sched_type,
128 tm_sched_cfg->data->has_sched_type,
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530129 tm_sched_cfg->data->sched_type);
130
131 /* scheduler parent */
132 BalTmSchedParent *schedPar = (BalTmSchedParent *)tm_sched_cfg->data->sched_parent;
133 bcmbal_tm_sched_parent valSchedPar = {};
134 if(schedPar != NULL && schedPar->has_presence_mask)
135 {
136 valSchedPar.presence_mask = schedPar->presence_mask;
137 if(schedPar->has_sched_id)
138 {
139 valSchedPar.sched_id = schedPar->sched_id;
Kim Kempfafa1ab42017-11-13 09:31:47 -0800140 }
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530141 if(schedPar->has_priority)
142 {
143 valSchedPar.priority = schedPar->priority;
Kim Kempfafa1ab42017-11-13 09:31:47 -0800144 }
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530145 if(schedPar->has_weight)
146 {
147 valSchedPar.weight = schedPar->weight;
Kim Kempfafa1ab42017-11-13 09:31:47 -0800148 }
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530149 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, sched_parent, BCMOS_TRUE, valSchedPar);
150 }
Kim Kempfafa1ab42017-11-13 09:31:47 -0800151
152 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, sched_child_type,
153 tm_sched_cfg->data->has_sched_child_type,
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530154 tm_sched_cfg->data->sched_child_type);
Kim Kempfafa1ab42017-11-13 09:31:47 -0800155
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530156 /* rating/shaping */
157 BalTmShaping *balShaping = (BalTmShaping *)tm_sched_cfg->data->rate;
158 bcmbal_tm_shaping val = {};
159 if (balShaping != NULL && balShaping->has_presence_mask)
160 {
161 val.presence_mask = balShaping->presence_mask;
162 if (balShaping->has_cir)
163 {
164 val.cir = balShaping->cir;
165 }
166 if (balShaping->has_pir)
167 {
168 val.pir = balShaping->pir;
169 }
170 if (balShaping->has_burst)
171 {
172 val.burst = balShaping->burst;
173 }
174 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, rate, BCMOS_TRUE, val);
175 }
176
177 /* Extended itu dba parameters */
178 BalExtendedItuDba *tItuDba = (BalExtendedItuDba *)tm_sched_cfg->data->ext_itu_dba;
Kim Kempfafa1ab42017-11-13 09:31:47 -0800179 bcmbal_extended_itu_dba valItuDda = {};
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530180 if (tItuDba != NULL && tItuDba->has_presence_mask)
181 {
182 valItuDda.presence_mask = tItuDba->presence_mask;
183 if(tItuDba->has_extra_bw_elig)
184 {
185 valItuDda.extra_bw_elig = tItuDba->extra_bw_elig;
186 }
187 if (tItuDba->has_nrt_cbr)
188 {
189 valItuDda.nrt_cbr = tItuDba->nrt_cbr;
190 }
191 if (tItuDba->has_rt_cbr)
192 {
193 valItuDda.rt_cbr = tItuDba->rt_cbr;
194 }
195 if (tItuDba->has_nrt_profile)
196 {
197 valItuDda.nrt_profile = tItuDba->nrt_profile;
198 }
199 if (tItuDba->has_rt_profile)
200 {
201 valItuDda.rt_profile = tItuDba->rt_profile;
202 }
203 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, ext_itu_dba, BCMOS_TRUE, valItuDda);
204 }
205
206 /* Creation mode */
Kim Kempfafa1ab42017-11-13 09:31:47 -0800207 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, creation_mode,
208 tm_sched_cfg->data->has_creation_mode,
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530209 tm_sched_cfg->data->creation_mode);
210
211 /* Extended epon dba parameters */
212 BalExtendedEponDba *teponDba = (BalExtendedEponDba*)tm_sched_cfg->data->ext_epon_dba;
Kim Kempfafa1ab42017-11-13 09:31:47 -0800213 bcmbal_extended_epon_dba valeponDda = {};
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530214 if (teponDba != NULL && teponDba->has_presence_mask)
215 {
216 valeponDda.presence_mask = teponDba->presence_mask;
217 if (teponDba->has_polling_interval_us)
218 {
219 valeponDda.polling_interval_us = teponDba->polling_interval_us;
220 }
221 if (teponDba->has_grant_threshold_tq)
222 {
223 valeponDda.grant_threshold_tq = teponDba->grant_threshold_tq;
224 }
225 if (teponDba->has_cir_priority)
226 {
227 valeponDda.cir_priority = teponDba->cir_priority;
228 }
229 if (teponDba->has_cir_weight_tq)
230 {
231 valeponDda.cir_weight_tq = teponDba->cir_weight_tq;
232 }
233 if (teponDba->has_pir_priority)
234 {
235 valeponDda.pir_priority = teponDba->pir_priority;
236 }
237 if (teponDba->has_pir_weight_tq)
238 {
239 valeponDda.pir_weight_tq = teponDba->pir_weight_tq;
240 }
241 if (teponDba->has_tdm_grant_size_tq)
242 {
243 valeponDda.tdm_grant_size_tq = teponDba->tdm_grant_size_tq;
244 }
245 if (teponDba->has_tdm_grant_interval_us)
246 {
247 valeponDda.tdm_grant_interval_us = teponDba->tdm_grant_interval_us;
248 }
249 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, ext_epon_dba, BCMOS_TRUE, valeponDda);
250 }
251
252 /* Subsidiary queues */
253 BalIdList *balQueues = (BalIdList *)tm_sched_cfg->data->queues;
254 bcmbal_tm_queue_id_list_u8 valQueues = {};
255 if(balQueues != NULL && balQueues->n_val)
256 {
257 valQueues.len = balQueues->n_val;
258 valQueues.val = (bcmbal_tm_queue_id *)malloc((valQueues.len)*sizeof(bcmbal_tm_queue_id));
259 if(!valQueues.val)
260 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800261 ASFVOLT_LOG(ASFVOLT_ERROR,
262 "Failed to configure the tm scheduler cfg(OLT): Memory Exhausted");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530263 return BAL_ERRNO__BAL_ERR_NOMEM;
264 }
Kim Kempfafa1ab42017-11-13 09:31:47 -0800265 memcpy((void *)valQueues.val, (const void *)balQueues->val,
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530266 (balQueues->n_val)*sizeof(uint32_t));
Kim Kempfafa1ab42017-11-13 09:31:47 -0800267 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, queues, BCMOS_TRUE, valQueues);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530268 }
269
270 /* Subsidiary schedulers */
271 BalIdList *balSubScheds = (BalIdList *)tm_sched_cfg->data->sub_scheds;
272 bcmbal_tm_sched_id_list_u8 valSubScheds = {};
273 if(balSubScheds != NULL && balSubScheds->n_val)
274 {
275 valSubScheds.len = balSubScheds->n_val;
276 valSubScheds.val = (uint32_t *)malloc((valSubScheds.len)*sizeof(uint32_t));
277 if(!valSubScheds.val)
278 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800279 ASFVOLT_LOG(ASFVOLT_ERROR,
280 "Failed to configure the tm scheduler cfg(OLT): Memory Exhausted");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530281 return BAL_ERRNO__BAL_ERR_NOMEM;
282 }
Kim Kempfafa1ab42017-11-13 09:31:47 -0800283 memcpy((void *)valSubScheds.val, (const void *)balSubScheds->val,
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530284 (balSubScheds->n_val)*sizeof(uint32_t));
Kim Kempfafa1ab42017-11-13 09:31:47 -0800285 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, sub_scheds, BCMOS_TRUE, valSubScheds);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530286 }
287
Kim Kempfafa1ab42017-11-13 09:31:47 -0800288 ASFVOLT_CFG_PROP_SET(tm_sched_obj, tm_sched, num_priorities,
289 tm_sched_cfg->data->has_num_priorities,
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530290 tm_sched_cfg->data->num_priorities);
291
292 err = bcmbal_cfg_set(DEFAULT_ATERM_ID, &(tm_sched_obj.hdr));
293
294 if(BCM_ERR_OK != err)
295 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800296 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to configure the tm scheduler Cfg(OLT)");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530297 return err;
298 }
299
Kim Kempfafa1ab42017-11-13 09:31:47 -0800300 ASFVOLT_LOG(ASFVOLT_INFO, "Set tm scheduler configuration sent to OLT. "
301 "Sched ID(%d) Sched Dir(%d)", key.id, key.dir);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530302 return err;
303}
304
305
306/********************************************************************\
307 * Function : bal_tm_sched_cfg_get *
308 * Description : get the OLT device tm queue configuration *
309 ********************************************************************/
310
311uint32_t bal_tm_sched_cfg_get(BalTmSchedKey *tm_sched_key, BalTmSchedCfg *tm_sched_cfg)
312{
313 bcmos_errno err = BCM_ERR_OK;
314 bcmbal_tm_sched_cfg tm_sched_obj; /**< declare main API struct */
315 bcmbal_tm_sched_key key = { }; /**< declare key */
Kim Kempfafa1ab42017-11-13 09:31:47 -0800316
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530317 if((tm_sched_cfg->key->has_dir) && (tm_sched_cfg->key->has_id))
318 {
319 key.dir = tm_sched_cfg->key->dir;
320 key.id = tm_sched_cfg->key->id;
321 }
322 else
323 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800324 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to get the tm schedule cfg(OLT): Missing Key values "
325 "Received key values Sched-Dir(%d), Sched-Id(%d)",
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530326 tm_sched_cfg->key->dir, tm_sched_cfg->key->id);
327 return BAL_ERRNO__BAL_ERR_NOENT;
328 }
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530329
Kim Kempfafa1ab42017-11-13 09:31:47 -0800330
331 ASFVOLT_LOG(ASFVOLT_DEBUG, "Gem tm scheduler cfg (for OLT) starts");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530332
333 /* init the API struct */
334 BCMBAL_CFG_INIT(&tm_sched_obj, tm_sched, key);
335
336 /* request all properties, include everything */
337 BCMBAL_CFG_PROP_GET(&tm_sched_obj, tm_sched, all_properties);
338
339 err = bcmbal_cfg_get(DEFAULT_ATERM_ID, &tm_sched_obj.hdr);
340
341 if(BCM_ERR_OK != err)
342 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800343 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to get the tm scheduler Cfg(OLT)");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530344 return err;
345 }
346
Kim Kempfafa1ab42017-11-13 09:31:47 -0800347 ASFVOLT_LOG(ASFVOLT_INFO, "Get tm scheduler cfg sent to OLT. "
348 "Sched ID(%d) Sched Dir(%d)", key.id, key.dir);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530349 return err;
350}
351
352
353/********************************************************************\
354 * Function : bal_tm_sched_cfg_clear *
355 * Description : Clears the OLT device tm queue configuration *
356 ********************************************************************/
357
358uint32_t bal_tm_sched_cfg_clear(BalTmSchedKey *tm_sched_key)
359{
360 bcmos_errno err = BCM_ERR_OK;
361 bcmbal_tm_sched_cfg tm_sched_obj; /**< declare main API struct */
362 bcmbal_tm_sched_key key = { }; /**< declare key */
Kim Kempfafa1ab42017-11-13 09:31:47 -0800363
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530364 if((tm_sched_key->has_dir) && (tm_sched_key->has_id))
365 {
366 key.dir = tm_sched_key->dir;
367 key.id = tm_sched_key->id;
368 }
369 else
370 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800371 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to clear the tm schedule cfg(OLT): Missing Key values "
372 "Received key values Sched-Dir(%d), Sched-Id(%d)",
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530373 tm_sched_key->dir, tm_sched_key->id);
374 return BAL_ERRNO__BAL_ERR_NOENT;
375 }
376
Kim Kempfafa1ab42017-11-13 09:31:47 -0800377 ASFVOLT_LOG(ASFVOLT_DEBUG, "Clear tm scheduler cfg(for OLT) starts");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530378
379 /* init the API struct */
380 BCMBAL_CFG_INIT(&tm_sched_obj, tm_sched, key);
381
382 err = bcmbal_cfg_clear(DEFAULT_ATERM_ID, &tm_sched_obj.hdr);
383
384 if(BCM_ERR_OK != err)
385 {
Kim Kempfafa1ab42017-11-13 09:31:47 -0800386 ASFVOLT_LOG(ASFVOLT_ERROR, "Failed to clear the tm scheduler Cfg(OLT)");
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530387 return err;
388 }
389
Kim Kempfafa1ab42017-11-13 09:31:47 -0800390 ASFVOLT_LOG(ASFVOLT_INFO, "Clear tm scheduler clear sent to OLT. "
391 "Sched ID(%d) Sched Dir(%d)", key.id, key.dir);
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530392 return err;
393}
394
395
396/********************************************************************\
397 * Function : bal_tm_sched_indication_cb *
398 * Description : Call back function registered with BAL to handle *
399 * event related to access terminal *
400 ********************************************************************/
401bcmos_errno bal_tm_sched_cfg_indication_cb(bcmbal_obj *obj)
402{
403 bcmos_errno result = BCM_ERR_OK;
Kim Kempfafa1ab42017-11-13 09:31:47 -0800404 ASFVOLT_LOG(ASFVOLT_INFO, "Processing API (%s) IND callback status is (%s)",
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530405 bcmbal_objtype_str(obj->obj_type),
406 bcmos_strerror(obj->status));
Kim Kempfafa1ab42017-11-13 09:31:47 -0800407
Rajeswara Raof6b4e6c2017-08-31 17:26:27 +0530408 return result;
409}
410
411