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 | with a line card type. | 66 | with a line card type. |
| 67 | * ``provisioning_failed``: Provisioning was not successful. | 67 | * ``provisioning_failed``: Provisioning was not successful. |
| 68 | * ``provisioned``: Line card slot is provisioned with a type. | 68 | * ``provisioned``: Line card slot is provisioned with a type. |
| 69 | * ``active``: Line card is powered-up and active. | ||
| 69 | 70 | ||
| 70 | The following diagram provides a general overview of ``devlink-linecard`` | 71 | The following diagram provides a general overview of ``devlink-linecard`` |
| 71 | state transitions:: | 72 | state transitions:: |
| @@ -85,11 +86,11 @@ state transitions:: · 13 unmodified lines | |||
| 85 | | | | 86 | | | |
| 86 | | +-----------------------------+ | 87 | | +-----------------------------+ |
| 87 | | | | | 88 | | | | |
| 88 | | +------------v------------+ +------------v------------+ | 89 | | +------------v------------+ +------------v------------+ +-------------------------+ |
| 89 | | | | | | | 90 | | | | | ----> | |
| 90 | +----- provisioning_failed | | provisioned | | 91 | +----- provisioning_failed | | provisioned | | active | |
| 91 | | | | | | | 92 | | | | | <---- | |
| 92 | | +------------^------------+ +------------|------------+ | 93 | | +------------^------------+ +------------|------------+ +-------------------------+ |
| 93 | | | | | 94 | | | | |
| 94 | | | | | 95 | | | | |
| 95 | | | +------------v------------+ | 96 | | | +------------v------------+ |
| @@ -1579,6 +1579,8 @@ void devlink_linecard_provision_set(struct devlink_linecard *linecard, · 1578 unmodified lines | |||
| 1579 | const char *type); | 1579 | const char *type); |
| 1580 | void devlink_linecard_provision_clear(struct devlink_linecard *linecard); | 1580 | void devlink_linecard_provision_clear(struct devlink_linecard *linecard); |
| 1581 | void devlink_linecard_provision_fail(struct devlink_linecard *linecard); | 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 | int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, | 1584 | int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, |
| 1583 | u32 size, u16 ingress_pools_count, | 1585 | u32 size, u16 ingress_pools_count, |
| 1584 | u16 egress_pools_count, u16 ingress_tc_count, | 1586 | u16 egress_pools_count, u16 ingress_tc_count, |
| @@ -350,6 +350,7 @@ enum devlink_linecard_state { · 349 unmodified lines | |||
| 350 | DEVLINK_LINECARD_STATE_PROVISIONING, | 350 | DEVLINK_LINECARD_STATE_PROVISIONING, |
| 351 | DEVLINK_LINECARD_STATE_PROVISIONING_FAILED, | 351 | DEVLINK_LINECARD_STATE_PROVISIONING_FAILED, |
| 352 | DEVLINK_LINECARD_STATE_PROVISIONED, | 352 | DEVLINK_LINECARD_STATE_PROVISIONED, |
| 353 | DEVLINK_LINECARD_STATE_ACTIVE, | ||
| 353 | 354 | ||
| 354 | __DEVLINK_LINECARD_STATE_MAX, | 355 | __DEVLINK_LINECARD_STATE_MAX, |
| 355 | DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1 | 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 | EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail); | 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 | int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, | 10375 | int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, |
| 10335 | u32 size, u16 ingress_pools_count, | 10376 | u32 size, u16 ingress_pools_count, |
| 10336 | u16 egress_pools_count, u16 ingress_tc_count, | 10377 | u16 egress_pools_count, u16 ingress_tc_count, |