Lines Matching defs:linecard

33 		struct devlink_linecard *linecard;
35 linecard = devlink_linecard_get_by_index(devlink, linecard_index);
36 if (!linecard)
38 return linecard;
74 struct devlink_linecard *linecard,
90 if (nla_put_u32(msg, DEVLINK_ATTR_LINECARD_INDEX, linecard->index))
92 if (nla_put_u8(msg, DEVLINK_ATTR_LINECARD_STATE, linecard->state))
94 if (linecard->type &&
95 nla_put_string(msg, DEVLINK_ATTR_LINECARD_TYPE, linecard->type))
98 if (linecard->types_count) {
103 for (i = 0; i < linecard->types_count; i++) {
104 linecard_type = &linecard->types[i];
114 if (linecard->nested_devlink &&
115 devlink_nl_put_nested_handle(msg, linecard->nested_devlink))
126 static void devlink_linecard_notify(struct devlink_linecard *linecard,
129 struct devlink *devlink = linecard->devlink;
143 err = devlink_nl_linecard_fill(msg, devlink, linecard, cmd, 0, 0, 0,
156 struct devlink_linecard *linecard;
158 list_for_each_entry(linecard, &devlink->linecard_list, list)
159 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
164 struct devlink_linecard *linecard;
166 list_for_each_entry_reverse(linecard, &devlink->linecard_list, list)
167 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_DEL);
173 struct devlink_linecard *linecard;
177 linecard = devlink_linecard_get_from_info(devlink, info);
178 if (IS_ERR(linecard))
179 return PTR_ERR(linecard);
185 mutex_lock(&linecard->state_lock);
186 err = devlink_nl_linecard_fill(msg, devlink, linecard,
190 mutex_unlock(&linecard->state_lock);
205 struct devlink_linecard *linecard;
209 list_for_each_entry(linecard, &devlink->linecard_list, list) {
214 mutex_lock(&linecard->state_lock);
215 err = devlink_nl_linecard_fill(msg, devlink, linecard,
220 mutex_unlock(&linecard->state_lock);
238 devlink_linecard_type_lookup(struct devlink_linecard *linecard,
244 for (i = 0; i < linecard->types_count; i++) {
245 linecard_type = &linecard->types[i];
252 static int devlink_linecard_type_set(struct devlink_linecard *linecard,
256 const struct devlink_linecard_ops *ops = linecard->ops;
260 mutex_lock(&linecard->state_lock);
261 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING) {
266 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONING) {
272 linecard_type = devlink_linecard_type_lookup(linecard, type);
279 if (linecard->state != DEVLINK_LINECARD_STATE_UNPROVISIONED &&
280 linecard->state != DEVLINK_LINECARD_STATE_PROVISIONING_FAILED) {
288 ops->same_provision(linecard, linecard->priv,
295 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONING;
296 linecard->type = linecard_type->type;
297 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
298 mutex_unlock(&linecard->state_lock);
299 err = ops->provision(linecard, linecard->priv, linecard_type->type,
302 /* Provisioning failed. Assume the linecard is unprovisioned
305 mutex_lock(&linecard->state_lock);
306 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED;
307 linecard->type = NULL;
308 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
309 mutex_unlock(&linecard->state_lock);
314 mutex_unlock(&linecard->state_lock);
318 static int devlink_linecard_type_unset(struct devlink_linecard *linecard,
323 mutex_lock(&linecard->state_lock);
324 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING) {
329 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONING) {
334 if (linecard->state == DEVLINK_LINECARD_STATE_PROVISIONING_FAILED) {
335 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED;
336 linecard->type = NULL;
337 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
342 if (linecard->state == DEVLINK_LINECARD_STATE_UNPROVISIONED) {
347 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONING;
348 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
349 mutex_unlock(&linecard->state_lock);
350 err = linecard->ops->unprovision(linecard, linecard->priv,
353 /* Unprovisioning failed. Assume the linecard is unprovisioned
356 mutex_lock(&linecard->state_lock);
357 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED;
358 linecard->type = NULL;
359 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
360 mutex_unlock(&linecard->state_lock);
365 mutex_unlock(&linecard->state_lock);
374 struct devlink_linecard *linecard;
377 linecard = devlink_linecard_get_from_info(devlink, info);
378 if (IS_ERR(linecard))
379 return PTR_ERR(linecard);
386 err = devlink_linecard_type_set(linecard, type, extack);
390 err = devlink_linecard_type_unset(linecard, extack);
399 static int devlink_linecard_types_init(struct devlink_linecard *linecard)
405 count = linecard->ops->types_count(linecard, linecard->priv);
406 linecard->types = kmalloc_array(count, sizeof(*linecard_type),
408 if (!linecard->types)
410 linecard->types_count = count;
413 linecard_type = &linecard->types[i];
414 linecard->ops->types_get(linecard, linecard->priv, i,
421 static void devlink_linecard_types_fini(struct devlink_linecard *linecard)
423 kfree(linecard->types);
427 * devl_linecard_create - Create devlink linecard
430 * @linecard_index: driver-specific numerical identifier of the linecard
434 * Create devlink linecard instance with provided linecard index.
443 struct devlink_linecard *linecard;
453 linecard = kzalloc(sizeof(*linecard), GFP_KERNEL);
454 if (!linecard)
457 linecard->devlink = devlink;
458 linecard->index = linecard_index;
459 linecard->ops = ops;
460 linecard->priv = priv;
461 linecard->state = DEVLINK_LINECARD_STATE_UNPROVISIONED;
462 mutex_init(&linecard->state_lock);
464 err = devlink_linecard_types_init(linecard);
466 mutex_destroy(&linecard->state_lock);
467 kfree(linecard);
471 list_add_tail(&linecard->list, &devlink->linecard_list);
472 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
473 return linecard;
478 * devl_linecard_destroy - Destroy devlink linecard
480 * @linecard: devlink linecard
482 void devl_linecard_destroy(struct devlink_linecard *linecard)
484 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_DEL);
485 list_del(&linecard->list);
486 devlink_linecard_types_fini(linecard);
487 mutex_destroy(&linecard->state_lock);
488 kfree(linecard);
493 * devlink_linecard_provision_set - Set provisioning on linecard
495 * @linecard: devlink linecard
496 * @type: linecard type
501 void devlink_linecard_provision_set(struct devlink_linecard *linecard,
504 mutex_lock(&linecard->state_lock);
505 WARN_ON(linecard->type && strcmp(linecard->type, type));
506 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED;
507 linecard->type = type;
508 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
509 mutex_unlock(&linecard->state_lock);
514 * devlink_linecard_provision_clear - Clear provisioning on linecard
516 * @linecard: devlink linecard
521 void devlink_linecard_provision_clear(struct devlink_linecard *linecard)
523 mutex_lock(&linecard->state_lock);
524 WARN_ON(linecard->nested_devlink);
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 WARN_ON(linecard->nested_devlink);
544 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONING_FAILED;
545 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
546 mutex_unlock(&linecard->state_lock);
551 * devlink_linecard_activate - Set linecard active
553 * @linecard: devlink linecard
555 void devlink_linecard_activate(struct devlink_linecard *linecard)
557 mutex_lock(&linecard->state_lock);
558 WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_PROVISIONED);
559 linecard->state = DEVLINK_LINECARD_STATE_ACTIVE;
560 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
561 mutex_unlock(&linecard->state_lock);
566 * devlink_linecard_deactivate - Set linecard inactive
568 * @linecard: devlink linecard
570 void devlink_linecard_deactivate(struct devlink_linecard *linecard)
572 mutex_lock(&linecard->state_lock);
573 switch (linecard->state) {
575 linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED;
576 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
587 mutex_unlock(&linecard->state_lock);
593 * instance to linecard.
595 * @linecard: devlink linecard
598 void devlink_linecard_nested_dl_set(struct devlink_linecard *linecard,
601 mutex_lock(&linecard->state_lock);
602 linecard->nested_devlink = nested_devlink;
603 devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
604 mutex_unlock(&linecard->state_lock);