Lines Matching refs:linecard
23 unsigned int devlink_linecard_index(struct devlink_linecard *linecard) in devlink_linecard_index() argument
25 return linecard->index; in devlink_linecard_index()
52 struct devlink_linecard *linecard; in devlink_linecard_get_from_attrs() local
54 linecard = devlink_linecard_get_by_index(devlink, linecard_index); in devlink_linecard_get_from_attrs()
55 if (!linecard) in devlink_linecard_get_from_attrs()
57 return linecard; in devlink_linecard_get_from_attrs()
75 struct devlink_linecard *linecard, in devlink_nl_linecard_fill() argument
91 if (nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX, linecard->index)) in devlink_nl_linecard_fill()
93 if (nla_put_u8(msg, DEVLINK_ATTR_LINECARD_STATE, linecard->state)) in devlink_nl_linecard_fill()
95 if (linecard->type && in devlink_nl_linecard_fill()
96 nla_put_string(msg, DEVLINK_ATTR_LINECARD_TYPE, linecard->type)) in devlink_nl_linecard_fill()
99 if (linecard->types_count) { in devlink_nl_linecard_fill()
104 for (i = 0; i < linecard->types_count; i++) { in devlink_nl_linecard_fill()
105 linecard_type = &linecard->types[i]; in devlink_nl_linecard_fill()
116 linecard->rel_index, in devlink_nl_linecard_fill()
129 static void devlink_linecard_notify(struct devlink_linecard *linecard, in devlink_linecard_notify() argument
132 struct devlink *devlink = linecard->devlink; in devlink_linecard_notify()
146 err = devlink_nl_linecard_fill(msg, devlink, linecard, cmd, 0, 0, 0, in devlink_linecard_notify()
158 struct devlink_linecard *linecard; in devlink_linecards_notify_register() local
160 list_for_each_entry(linecard, &devlink->linecard_list, list) in devlink_linecards_notify_register()
161 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecards_notify_register()
166 struct devlink_linecard *linecard; in devlink_linecards_notify_unregister() local
168 list_for_each_entry_reverse(linecard, &devlink->linecard_list, list) in devlink_linecards_notify_unregister()
169 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_DEL); in devlink_linecards_notify_unregister()
175 struct devlink_linecard *linecard; in devlink_nl_linecard_get_doit() local
179 linecard = devlink_linecard_get_from_info(devlink, info); in devlink_nl_linecard_get_doit()
180 if (IS_ERR(linecard)) in devlink_nl_linecard_get_doit()
181 return PTR_ERR(linecard); in devlink_nl_linecard_get_doit()
187 mutex_lock(&linecard->state_lock); in devlink_nl_linecard_get_doit()
188 err = devlink_nl_linecard_fill(msg, devlink, linecard, in devlink_nl_linecard_get_doit()
192 mutex_unlock(&linecard->state_lock); in devlink_nl_linecard_get_doit()
207 struct devlink_linecard *linecard; in devlink_nl_linecard_get_dump_one() local
211 list_for_each_entry(linecard, &devlink->linecard_list, list) { in devlink_nl_linecard_get_dump_one()
216 mutex_lock(&linecard->state_lock); in devlink_nl_linecard_get_dump_one()
217 err = devlink_nl_linecard_fill(msg, devlink, linecard, in devlink_nl_linecard_get_dump_one()
222 mutex_unlock(&linecard->state_lock); in devlink_nl_linecard_get_dump_one()
240 devlink_linecard_type_lookup(struct devlink_linecard *linecard, in devlink_linecard_type_lookup() argument
246 for (i = 0; i < linecard->types_count; i++) { in devlink_linecard_type_lookup()
247 linecard_type = &linecard->types[i]; in devlink_linecard_type_lookup()
254 static int devlink_linecard_type_set(struct devlink_linecard *linecard, in devlink_linecard_type_set() argument
258 const struct devlink_linecard_ops *ops = linecard->ops; in devlink_linecard_type_set()
262 mutex_lock(&linecard->state_lock); in devlink_linecard_type_set()
263 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING) { in devlink_linecard_type_set()
268 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONING) { in devlink_linecard_type_set()
274 linecard_type = devlink_linecard_type_lookup(linecard, type); in devlink_linecard_type_set()
281 if (linecard->state != DEVLINK_LINECARD_STATE_UNPROVISIONED && in devlink_linecard_type_set()
282 linecard->state != DEVLINK_LINECARD_STATE_PROVISIONING_FAILED) { in devlink_linecard_type_set()
290 ops->same_provision(linecard, linecard->priv, in devlink_linecard_type_set()
297 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONING; in devlink_linecard_type_set()
298 linecard->type = linecard_type->type; in devlink_linecard_type_set()
299 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_set()
300 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_set()
301 err = ops->provision(linecard, linecard->priv, linecard_type->type, in devlink_linecard_type_set()
307 mutex_lock(&linecard->state_lock); in devlink_linecard_type_set()
308 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_type_set()
309 linecard->type = NULL; in devlink_linecard_type_set()
310 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_set()
311 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_set()
316 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_set()
320 static int devlink_linecard_type_unset(struct devlink_linecard *linecard, in devlink_linecard_type_unset() argument
325 mutex_lock(&linecard->state_lock); in devlink_linecard_type_unset()
326 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING) { in devlink_linecard_type_unset()
331 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONING) { in devlink_linecard_type_unset()
336 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING_FAILED) { in devlink_linecard_type_unset()
337 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_type_unset()
338 linecard->type = NULL; in devlink_linecard_type_unset()
339 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_unset()
344 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONED) { in devlink_linecard_type_unset()
349 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONING; in devlink_linecard_type_unset()
350 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_unset()
351 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_unset()
352 err = linecard->ops->unprovision(linecard, linecard->priv, in devlink_linecard_type_unset()
358 mutex_lock(&linecard->state_lock); in devlink_linecard_type_unset()
359 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_type_unset()
360 linecard->type = NULL; in devlink_linecard_type_unset()
361 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_unset()
362 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_unset()
367 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_unset()
375 struct devlink_linecard *linecard; in devlink_nl_linecard_set_doit() local
378 linecard = devlink_linecard_get_from_info(devlink, info); in devlink_nl_linecard_set_doit()
379 if (IS_ERR(linecard)) in devlink_nl_linecard_set_doit()
380 return PTR_ERR(linecard); in devlink_nl_linecard_set_doit()
387 err = devlink_linecard_type_set(linecard, type, extack); in devlink_nl_linecard_set_doit()
391 err = devlink_linecard_type_unset(linecard, extack); in devlink_nl_linecard_set_doit()
400 static int devlink_linecard_types_init(struct devlink_linecard *linecard) in devlink_linecard_types_init() argument
406 count = linecard->ops->types_count(linecard, linecard->priv); in devlink_linecard_types_init()
407 linecard->types = kmalloc_array(count, sizeof(*linecard_type), in devlink_linecard_types_init()
409 if (!linecard->types) in devlink_linecard_types_init()
411 linecard->types_count = count; in devlink_linecard_types_init()
414 linecard_type = &linecard->types[i]; in devlink_linecard_types_init()
415 linecard->ops->types_get(linecard, linecard->priv, i, in devlink_linecard_types_init()
422 static void devlink_linecard_types_fini(struct devlink_linecard *linecard) in devlink_linecard_types_fini() argument
424 kfree(linecard->types); in devlink_linecard_types_fini()
444 struct devlink_linecard *linecard; in devl_linecard_create() local
454 linecard = kzalloc(sizeof(*linecard), GFP_KERNEL); in devl_linecard_create()
455 if (!linecard) in devl_linecard_create()
458 linecard->devlink = devlink; in devl_linecard_create()
459 linecard->index = linecard_index; in devl_linecard_create()
460 linecard->ops = ops; in devl_linecard_create()
461 linecard->priv = priv; in devl_linecard_create()
462 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devl_linecard_create()
463 mutex_init(&linecard->state_lock); in devl_linecard_create()
465 err = devlink_linecard_types_init(linecard); in devl_linecard_create()
467 mutex_destroy(&linecard->state_lock); in devl_linecard_create()
468 kfree(linecard); in devl_linecard_create()
472 list_add_tail(&linecard->list, &devlink->linecard_list); in devl_linecard_create()
473 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devl_linecard_create()
474 return linecard; in devl_linecard_create()
483 void devl_linecard_destroy(struct devlink_linecard *linecard) in devl_linecard_destroy() argument
485 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_DEL); in devl_linecard_destroy()
486 list_del(&linecard->list); in devl_linecard_destroy()
487 devlink_linecard_types_fini(linecard); in devl_linecard_destroy()
488 mutex_destroy(&linecard->state_lock); in devl_linecard_destroy()
489 kfree(linecard); in devl_linecard_destroy()
502 void devlink_linecard_provision_set(struct devlink_linecard *linecard, in devlink_linecard_provision_set() argument
505 mutex_lock(&linecard->state_lock); in devlink_linecard_provision_set()
506 WARN_ON(linecard->type && strcmp(linecard->type, type)); in devlink_linecard_provision_set()
507 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED; in devlink_linecard_provision_set()
508 linecard->type = type; in devlink_linecard_provision_set()
509 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_provision_set()
510 mutex_unlock(&linecard->state_lock); in devlink_linecard_provision_set()
522 void devlink_linecard_provision_clear(struct devlink_linecard *linecard) in devlink_linecard_provision_clear() argument
524 mutex_lock(&linecard->state_lock); in devlink_linecard_provision_clear()
525 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_provision_clear()
526 linecard->type = NULL; in devlink_linecard_provision_clear()
527 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_provision_clear()
528 mutex_unlock(&linecard->state_lock); in devlink_linecard_provision_clear()
540 void devlink_linecard_provision_fail(struct devlink_linecard *linecard) in devlink_linecard_provision_fail() argument
542 mutex_lock(&linecard->state_lock); in devlink_linecard_provision_fail()
543 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONING_FAILED; in devlink_linecard_provision_fail()
544 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_provision_fail()
545 mutex_unlock(&linecard->state_lock); in devlink_linecard_provision_fail()
554 void devlink_linecard_activate(struct devlink_linecard *linecard) in devlink_linecard_activate() argument
556 mutex_lock(&linecard->state_lock); in devlink_linecard_activate()
557 WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_PROVISIONED); in devlink_linecard_activate()
558 linecard->state = DEVLINK_LINECARD_STATE_ACTIVE; in devlink_linecard_activate()
559 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_activate()
560 mutex_unlock(&linecard->state_lock); in devlink_linecard_activate()
569 void devlink_linecard_deactivate(struct devlink_linecard *linecard) in devlink_linecard_deactivate() argument
571 mutex_lock(&linecard->state_lock); in devlink_linecard_deactivate()
572 switch (linecard->state) { in devlink_linecard_deactivate()
574 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED; in devlink_linecard_deactivate()
575 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_deactivate()
586 mutex_unlock(&linecard->state_lock); in devlink_linecard_deactivate()
593 struct devlink_linecard *linecard; in devlink_linecard_rel_notify_cb() local
595 linecard = devlink_linecard_get_by_index(devlink, linecard_index); in devlink_linecard_rel_notify_cb()
596 if (!linecard) in devlink_linecard_rel_notify_cb()
598 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_rel_notify_cb()
604 struct devlink_linecard *linecard; in devlink_linecard_rel_cleanup_cb() local
606 linecard = devlink_linecard_get_by_index(devlink, linecard_index); in devlink_linecard_rel_cleanup_cb()
607 if (linecard && linecard->rel_index == rel_index) in devlink_linecard_rel_cleanup_cb()
608 linecard->rel_index = 0; in devlink_linecard_rel_cleanup_cb()
618 int devlink_linecard_nested_dl_set(struct devlink_linecard *linecard, in devlink_linecard_nested_dl_set() argument
621 return devlink_rel_nested_in_add(&linecard->rel_index, in devlink_linecard_nested_dl_set()
622 linecard->devlink->index, in devlink_linecard_nested_dl_set()
623 linecard->index, in devlink_linecard_nested_dl_set()