Lines Matching defs:linecard

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