Allow driver to mark a line card as active. Expose this state to the userspace over devlink netlink interface with proper notifications. 'active' state means that line card was plugged in after being provisioned.
Unified · Split
| @@ -66,6 +66,7 @@ The ``devlink-linecard`` mechanism supports the following line card states: · 65 unmodified lines | ||
| 66 | 66 | with a line card type. |
| 67 | 67 | * ``provisioning_failed``: Provisioning was not successful. |
| 68 | 68 | * ``provisioned``: Line card slot is provisioned with a type. |
| 69 | + * ``active``: Line card is powered-up and active. | |
| 69 | 70 | |
| 70 | 71 | The following diagram provides a general overview of ``devlink-linecard`` |
| 71 | 72 | state transitions:: |
| @@ -85,11 +86,11 @@ state transitions:: · 13 unmodified lines | ||
| 85 | 86 | | | |
| 86 | 87 | | +-----------------------------+ |
| 87 | 88 | | | | |
| 88 | − | +------------v------------+ +------------v------------+ | |
| 89 | − | | | | | | |
| 90 | − +----- provisioning_failed | | provisioned | | |
| 91 | − | | | | | | |
| 92 | − | +------------^------------+ +------------|------------+ | |
| 89 | + | +------------v------------+ +------------v------------+ +-------------------------+ | |
| 90 | + | | | | ----> | | |
| 91 | + +----- provisioning_failed | | provisioned | | active | | |
| 92 | + | | | | <---- | | |
| 93 | + | +------------^------------+ +------------|------------+ +-------------------------+ | |
| 93 | 94 | | | | |
| 94 | 95 | | | | |
| 95 | 96 | | | +------------v------------+ |
| @@ -1579,6 +1579,8 @@ void devlink_linecard_provision_set(struct devlink_linecard *linecard, · 1578 unmodified lines | ||
| 1579 | 1579 | const char *type); |
| 1580 | 1580 | void devlink_linecard_provision_clear(struct devlink_linecard *linecard); |
| 1581 | 1581 | void devlink_linecard_provision_fail(struct devlink_linecard *linecard); |
| 1582 | +void devlink_linecard_activate(struct devlink_linecard *linecard); | |
| 1583 | +void devlink_linecard_deactivate(struct devlink_linecard *linecard); | |
| 1582 | 1584 | int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, |
| 1583 | 1585 | u32 size, u16 ingress_pools_count, |
| 1584 | 1586 | u16 egress_pools_count, u16 ingress_tc_count, |
| @@ -350,6 +350,7 @@ enum devlink_linecard_state { · 349 unmodified lines | ||
| 350 | 350 | DEVLINK_LINECARD_STATE_PROVISIONING, |
| 351 | 351 | DEVLINK_LINECARD_STATE_PROVISIONING_FAILED, |
| 352 | 352 | DEVLINK_LINECARD_STATE_PROVISIONED, |
| 353 | + DEVLINK_LINECARD_STATE_ACTIVE, | |
| 353 | 354 | |
| 354 | 355 | __DEVLINK_LINECARD_STATE_MAX, |
| 355 | 356 | DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1 |
| @@ -10331,6 +10331,47 @@ void devlink_linecard_provision_fail(struct devlink_linecard *linecard) · 10330 unmodified lines | ||
| 10331 | 10331 | } |
| 10332 | 10332 | EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail); |
| 10333 | 10333 | |
| 10334 | +/** | |
| 10335 | + * devlink_linecard_activate - Set linecard active | |
| 10336 | + * | |
| 10337 | + * @linecard: devlink linecard | |
| 10338 | + */ | |
| 10339 | +void devlink_linecard_activate(struct devlink_linecard *linecard) | |
| 10340 | +{ | |
| 10341 | + mutex_lock(&linecard->state_lock); | |
| 10342 | + WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_PROVISIONED); | |
| 10343 | + linecard->state = DEVLINK_LINECARD_STATE_ACTIVE; | |
| 10344 | + devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); | |
| 10345 | + mutex_unlock(&linecard->state_lock); | |
| 10346 | +} | |
| 10347 | +EXPORT_SYMBOL_GPL(devlink_linecard_activate); | |
| 10348 | + | |
| 10349 | +/** | |
| 10350 | + * devlink_linecard_deactivate - Set linecard inactive | |
| 10351 | + * | |
| 10352 | + * @linecard: devlink linecard | |
| 10353 | + */ | |
| 10354 | +void devlink_linecard_deactivate(struct devlink_linecard *linecard) | |
| 10355 | +{ | |
| 10356 | + mutex_lock(&linecard->state_lock); | |
| 10357 | + switch (linecard->state) { | |
| 10358 | + case DEVLINK_LINECARD_STATE_ACTIVE: | |
| 10359 | + linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED; | |
| 10360 | + devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW); | |
| 10361 | + break; | |
| 10362 | + case DEVLINK_LINECARD_STATE_UNPROVISIONING: | |
| 10363 | + /* Line card is being deactivated as part | |
| 10364 | + * of unprovisioning flow. | |
| 10365 | + */ | |
| 10366 | + break; | |
| 10367 | + default: | |
| 10368 | + WARN_ON(1); | |
| 10369 | + break; | |
| 10370 | + } | |
| 10371 | + mutex_unlock(&linecard->state_lock); | |
| 10372 | +} | |
| 10373 | +EXPORT_SYMBOL_GPL(devlink_linecard_deactivate); | |
| 10374 | + | |
| 10334 | 10375 | int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, |
| 10335 | 10376 | u32 size, u16 ingress_pools_count, |
| 10336 | 10377 | u16 egress_pools_count, u16 ingress_tc_count, |