Lines Matching refs:linecard
518 struct devlink_linecard *linecard; in devlink_linecard_get_from_attrs() local
521 linecard = devlink_linecard_get_by_index(devlink, linecard_index); in devlink_linecard_get_from_attrs()
522 if (linecard) in devlink_linecard_get_from_attrs()
523 refcount_inc(&linecard->refcount); in devlink_linecard_get_from_attrs()
525 if (!linecard) in devlink_linecard_get_from_attrs()
527 return linecard; in devlink_linecard_get_from_attrs()
538 static void devlink_linecard_put(struct devlink_linecard *linecard) in devlink_linecard_put() argument
540 if (refcount_dec_and_test(&linecard->refcount)) { in devlink_linecard_put()
541 mutex_destroy(&linecard->state_lock); in devlink_linecard_put()
542 kfree(linecard); in devlink_linecard_put()
775 struct devlink_linecard *linecard; in devlink_nl_pre_doit() local
815 linecard = devlink_linecard_get_from_info(devlink, info); in devlink_nl_pre_doit()
816 if (IS_ERR(linecard)) { in devlink_nl_pre_doit()
817 err = PTR_ERR(linecard); in devlink_nl_pre_doit()
820 info->user_ptr[1] = linecard; in devlink_nl_pre_doit()
833 struct devlink_linecard *linecard; in devlink_nl_post_doit() local
838 linecard = info->user_ptr[1]; in devlink_nl_post_doit()
839 devlink_linecard_put(linecard); in devlink_nl_post_doit()
1329 if (devlink_port->linecard && in devlink_nl_port_fill()
1331 devlink_port->linecard->index)) in devlink_nl_port_fill()
2113 struct devlink_linecard *linecard, in devlink_nl_linecard_fill() argument
2129 if (nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX, linecard->index)) in devlink_nl_linecard_fill()
2131 if (nla_put_u8(msg, DEVLINK_ATTR_LINECARD_STATE, linecard->state)) in devlink_nl_linecard_fill()
2133 if (linecard->type && in devlink_nl_linecard_fill()
2134 nla_put_string(msg, DEVLINK_ATTR_LINECARD_TYPE, linecard->type)) in devlink_nl_linecard_fill()
2137 if (linecard->types_count) { in devlink_nl_linecard_fill()
2142 for (i = 0; i < linecard->types_count; i++) { in devlink_nl_linecard_fill()
2143 linecard_type = &linecard->types[i]; in devlink_nl_linecard_fill()
2153 if (linecard->nested_devlink && in devlink_nl_linecard_fill()
2154 devlink_nl_put_nested_handle(msg, linecard->nested_devlink)) in devlink_nl_linecard_fill()
2165 static void devlink_linecard_notify(struct devlink_linecard *linecard, in devlink_linecard_notify() argument
2168 struct devlink *devlink = linecard->devlink; in devlink_linecard_notify()
2182 err = devlink_nl_linecard_fill(msg, devlink, linecard, cmd, 0, 0, 0, in devlink_linecard_notify()
2196 struct devlink_linecard *linecard = info->user_ptr[1]; in devlink_nl_cmd_linecard_get_doit() local
2197 struct devlink *devlink = linecard->devlink; in devlink_nl_cmd_linecard_get_doit()
2205 mutex_lock(&linecard->state_lock); in devlink_nl_cmd_linecard_get_doit()
2206 err = devlink_nl_linecard_fill(msg, devlink, linecard, in devlink_nl_cmd_linecard_get_doit()
2210 mutex_unlock(&linecard->state_lock); in devlink_nl_cmd_linecard_get_doit()
2222 struct devlink_linecard *linecard; in devlink_nl_cmd_linecard_get_dumpit() local
2231 list_for_each_entry(linecard, &devlink->linecard_list, list) { in devlink_nl_cmd_linecard_get_dumpit()
2236 mutex_lock(&linecard->state_lock); in devlink_nl_cmd_linecard_get_dumpit()
2237 err = devlink_nl_linecard_fill(msg, devlink, linecard, in devlink_nl_cmd_linecard_get_dumpit()
2243 mutex_unlock(&linecard->state_lock); in devlink_nl_cmd_linecard_get_dumpit()
2260 devlink_linecard_type_lookup(struct devlink_linecard *linecard, in devlink_linecard_type_lookup() argument
2266 for (i = 0; i < linecard->types_count; i++) { in devlink_linecard_type_lookup()
2267 linecard_type = &linecard->types[i]; in devlink_linecard_type_lookup()
2274 static int devlink_linecard_type_set(struct devlink_linecard *linecard, in devlink_linecard_type_set() argument
2278 const struct devlink_linecard_ops *ops = linecard->ops; in devlink_linecard_type_set()
2282 mutex_lock(&linecard->state_lock); in devlink_linecard_type_set()
2283 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING) { in devlink_linecard_type_set()
2288 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONING) { in devlink_linecard_type_set()
2294 linecard_type = devlink_linecard_type_lookup(linecard, type); in devlink_linecard_type_set()
2301 if (linecard->state != DEVLINK_LINECARD_STATE_UNPROVISIONED && in devlink_linecard_type_set()
2302 linecard->state != DEVLINK_LINECARD_STATE_PROVISIONING_FAILED) { in devlink_linecard_type_set()
2310 ops->same_provision(linecard, linecard->priv, in devlink_linecard_type_set()
2317 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONING; in devlink_linecard_type_set()
2318 linecard->type = linecard_type->type; in devlink_linecard_type_set()
2319 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_set()
2320 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_set()
2321 err = ops->provision(linecard, linecard->priv, linecard_type->type, in devlink_linecard_type_set()
2327 mutex_lock(&linecard->state_lock); in devlink_linecard_type_set()
2328 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_type_set()
2329 linecard->type = NULL; in devlink_linecard_type_set()
2330 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_set()
2331 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_set()
2336 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_set()
2340 static int devlink_linecard_type_unset(struct devlink_linecard *linecard, in devlink_linecard_type_unset() argument
2345 mutex_lock(&linecard->state_lock); in devlink_linecard_type_unset()
2346 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING) { in devlink_linecard_type_unset()
2351 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONING) { in devlink_linecard_type_unset()
2356 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING_FAILED) { in devlink_linecard_type_unset()
2357 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_type_unset()
2358 linecard->type = NULL; in devlink_linecard_type_unset()
2359 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_unset()
2364 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONED) { in devlink_linecard_type_unset()
2369 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONING; in devlink_linecard_type_unset()
2370 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_unset()
2371 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_unset()
2372 err = linecard->ops->unprovision(linecard, linecard->priv, in devlink_linecard_type_unset()
2378 mutex_lock(&linecard->state_lock); in devlink_linecard_type_unset()
2379 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_type_unset()
2380 linecard->type = NULL; in devlink_linecard_type_unset()
2381 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_type_unset()
2382 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_unset()
2387 mutex_unlock(&linecard->state_lock); in devlink_linecard_type_unset()
2394 struct devlink_linecard *linecard = info->user_ptr[1]; in devlink_nl_cmd_linecard_set_doit() local
2403 err = devlink_linecard_type_set(linecard, type, extack); in devlink_nl_cmd_linecard_set_doit()
2407 err = devlink_linecard_type_unset(linecard, extack); in devlink_nl_cmd_linecard_set_doit()
9687 struct devlink_linecard *linecard; in devlink_notify_register() local
9692 list_for_each_entry(linecard, &devlink->linecard_list, list) in devlink_notify_register()
9693 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_notify_register()
10314 struct devlink_linecard *linecard) in devlink_port_linecard_set() argument
10318 devlink_port->linecard = linecard; in devlink_port_linecard_set()
10333 if (devlink_port->linecard) in __devlink_port_phys_port_name_get()
10335 devlink_port->linecard->index); in __devlink_port_phys_port_name_get()
10393 static int devlink_linecard_types_init(struct devlink_linecard *linecard) in devlink_linecard_types_init() argument
10399 count = linecard->ops->types_count(linecard, linecard->priv); in devlink_linecard_types_init()
10400 linecard->types = kmalloc_array(count, sizeof(*linecard_type), in devlink_linecard_types_init()
10402 if (!linecard->types) in devlink_linecard_types_init()
10404 linecard->types_count = count; in devlink_linecard_types_init()
10407 linecard_type = &linecard->types[i]; in devlink_linecard_types_init()
10408 linecard->ops->types_get(linecard, linecard->priv, i, in devlink_linecard_types_init()
10415 static void devlink_linecard_types_fini(struct devlink_linecard *linecard) in devlink_linecard_types_fini() argument
10417 kfree(linecard->types); in devlink_linecard_types_fini()
10437 struct devlink_linecard *linecard; in devlink_linecard_create() local
10450 linecard = kzalloc(sizeof(*linecard), GFP_KERNEL); in devlink_linecard_create()
10451 if (!linecard) { in devlink_linecard_create()
10456 linecard->devlink = devlink; in devlink_linecard_create()
10457 linecard->index = linecard_index; in devlink_linecard_create()
10458 linecard->ops = ops; in devlink_linecard_create()
10459 linecard->priv = priv; in devlink_linecard_create()
10460 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_create()
10461 mutex_init(&linecard->state_lock); in devlink_linecard_create()
10463 err = devlink_linecard_types_init(linecard); in devlink_linecard_create()
10465 mutex_destroy(&linecard->state_lock); in devlink_linecard_create()
10466 kfree(linecard); in devlink_linecard_create()
10471 list_add_tail(&linecard->list, &devlink->linecard_list); in devlink_linecard_create()
10472 refcount_set(&linecard->refcount, 1); in devlink_linecard_create()
10474 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_create()
10475 return linecard; in devlink_linecard_create()
10484 void devlink_linecard_destroy(struct devlink_linecard *linecard) in devlink_linecard_destroy() argument
10486 struct devlink *devlink = linecard->devlink; in devlink_linecard_destroy()
10488 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_DEL); in devlink_linecard_destroy()
10490 list_del(&linecard->list); in devlink_linecard_destroy()
10491 devlink_linecard_types_fini(linecard); in devlink_linecard_destroy()
10493 devlink_linecard_put(linecard); in devlink_linecard_destroy()
10506 void devlink_linecard_provision_set(struct devlink_linecard *linecard, in devlink_linecard_provision_set() argument
10509 mutex_lock(&linecard->state_lock); in devlink_linecard_provision_set()
10510 WARN_ON(linecard->type && strcmp(linecard->type, type)); in devlink_linecard_provision_set()
10511 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED; in devlink_linecard_provision_set()
10512 linecard->type = type; in devlink_linecard_provision_set()
10513 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_provision_set()
10514 mutex_unlock(&linecard->state_lock); in devlink_linecard_provision_set()
10526 void devlink_linecard_provision_clear(struct devlink_linecard *linecard) in devlink_linecard_provision_clear() argument
10528 mutex_lock(&linecard->state_lock); in devlink_linecard_provision_clear()
10529 WARN_ON(linecard->nested_devlink); in devlink_linecard_provision_clear()
10530 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED; in devlink_linecard_provision_clear()
10531 linecard->type = NULL; in devlink_linecard_provision_clear()
10532 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_provision_clear()
10533 mutex_unlock(&linecard->state_lock); in devlink_linecard_provision_clear()
10545 void devlink_linecard_provision_fail(struct devlink_linecard *linecard) in devlink_linecard_provision_fail() argument
10547 mutex_lock(&linecard->state_lock); in devlink_linecard_provision_fail()
10548 WARN_ON(linecard->nested_devlink); in devlink_linecard_provision_fail()
10549 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONING_FAILED; in devlink_linecard_provision_fail()
10550 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_provision_fail()
10551 mutex_unlock(&linecard->state_lock); in devlink_linecard_provision_fail()
10560 void devlink_linecard_activate(struct devlink_linecard *linecard) in devlink_linecard_activate() argument
10562 mutex_lock(&linecard->state_lock); in devlink_linecard_activate()
10563 WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_PROVISIONED); in devlink_linecard_activate()
10564 linecard->state = DEVLINK_LINECARD_STATE_ACTIVE; in devlink_linecard_activate()
10565 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_activate()
10566 mutex_unlock(&linecard->state_lock); in devlink_linecard_activate()
10575 void devlink_linecard_deactivate(struct devlink_linecard *linecard) in devlink_linecard_deactivate() argument
10577 mutex_lock(&linecard->state_lock); in devlink_linecard_deactivate()
10578 switch (linecard->state) { in devlink_linecard_deactivate()
10580 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED; in devlink_linecard_deactivate()
10581 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_deactivate()
10592 mutex_unlock(&linecard->state_lock); in devlink_linecard_deactivate()
10603 void devlink_linecard_nested_dl_set(struct devlink_linecard *linecard, in devlink_linecard_nested_dl_set() argument
10606 mutex_lock(&linecard->state_lock); in devlink_linecard_nested_dl_set()
10607 linecard->nested_devlink = nested_devlink; in devlink_linecard_nested_dl_set()
10608 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); in devlink_linecard_nested_dl_set()
10609 mutex_unlock(&linecard->state_lock); in devlink_linecard_nested_dl_set()